@aws-cdk/integ-runner 2.202.2 → 2.202.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/lib/cli.d.ts.map +1 -1
  2. package/lib/cli.js +3 -2
  3. package/lib/engines/toolkit-lib.d.ts +1 -1
  4. package/lib/engines/toolkit-lib.d.ts.map +1 -1
  5. package/lib/engines/toolkit-lib.js +11 -11
  6. package/lib/files.d.ts +9 -0
  7. package/lib/files.d.ts.map +1 -0
  8. package/lib/files.js +51 -0
  9. package/lib/index.js +218 -182
  10. package/lib/runner/{cdk-integ-helper.d.ts → cdk-test-app.d.ts} +90 -114
  11. package/lib/runner/cdk-test-app.d.ts.map +1 -0
  12. package/lib/runner/cdk-test-app.js +584 -0
  13. package/lib/runner/engine.d.ts +2 -2
  14. package/lib/runner/engine.d.ts.map +1 -1
  15. package/lib/runner/engine.js +2 -2
  16. package/lib/runner/index.d.ts +1 -1
  17. package/lib/runner/index.d.ts.map +1 -1
  18. package/lib/runner/index.js +2 -2
  19. package/lib/runner/integ-test-runner.d.ts +36 -36
  20. package/lib/runner/integ-test-runner.d.ts.map +1 -1
  21. package/lib/runner/integ-test-runner.js +172 -235
  22. package/lib/runner/integ-test-suite.d.ts +6 -11
  23. package/lib/runner/integ-test-suite.d.ts.map +1 -1
  24. package/lib/runner/integ-test-suite.js +14 -20
  25. package/lib/runner/integration-tests.d.ts +12 -3
  26. package/lib/runner/integration-tests.d.ts.map +1 -1
  27. package/lib/runner/integration-tests.js +32 -8
  28. package/lib/runner/snapshot-test-runner.d.ts +19 -22
  29. package/lib/runner/snapshot-test-runner.d.ts.map +1 -1
  30. package/lib/runner/snapshot-test-runner.js +47 -75
  31. package/lib/workers/extract/extract_worker.d.ts.map +1 -1
  32. package/lib/workers/extract/extract_worker.js +65 -78
  33. package/lib/workers/extract/index.js +226955 -226979
  34. package/lib/workers/integ-test-worker.d.ts.map +1 -1
  35. package/lib/workers/integ-test-worker.js +3 -2
  36. package/package.json +3 -3
  37. package/lib/runner/cdk-integ-helper.d.ts.map +0 -1
  38. package/lib/runner/cdk-integ-helper.js +0 -525
@@ -1,525 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.DEFAULT_SYNTH_OPTIONS = exports.CdkIntegHelper = void 0;
37
- exports.currentlyRecommendedAwsCdkLibFlags = currentlyRecommendedAwsCdkLibFlags;
38
- /* eslint-disable @cdklabs/no-literal-partition */
39
- const path = __importStar(require("path"));
40
- const cloud_assembly_api_1 = require("@aws-cdk/cloud-assembly-api");
41
- const fs = __importStar(require("fs-extra"));
42
- const integ_test_suite_1 = require("./integ-test-suite");
43
- const recommendedFlagsFile = __importStar(require("../recommended-feature-flags.json"));
44
- const utils_1 = require("../utils");
45
- const engine_1 = require("./engine");
46
- const logger = __importStar(require("../logger"));
47
- const cloud_assembly_1 = require("./private/cloud-assembly");
48
- const integ_manifest_1 = require("./private/integ-manifest");
49
- const DESTRUCTIVE_CHANGES = '!!DESTRUCTIVE_CHANGES:';
50
- /**
51
- * Class with some helper routines for running CDK snapshots and integration tests.
52
- *
53
- * A "golden snapshot" is the snapshot that is stored permanently in version
54
- * control, that new runs are compared against (stored in a directory named
55
- * `<test-name>.snapshot`).
56
- *
57
- * This is as opposed to other snapshots, which can be generated for example
58
- * temporarily in a temporary directory, to compare agains the golden snapshot.
59
- */
60
- class CdkIntegHelper {
61
- /**
62
- * Factory method to create an instance of the CdkIntegHelper.
63
- *
64
- * Hiding the constructor to prevent inheritance.
65
- */
66
- static create(options) {
67
- return new CdkIntegHelper(options);
68
- }
69
- /**
70
- * The directory where the golden snapshot will be stored
71
- */
72
- goldenSnapshotDir;
73
- /**
74
- * An instance of the CDK CLI
75
- */
76
- cdk;
77
- /**
78
- * Pretty name of the test
79
- */
80
- testName;
81
- /**
82
- * The value used in the '--app' CLI parameter
83
- *
84
- * Path to the integ test source file, relative to `this.directory`.
85
- */
86
- cdkApp;
87
- /**
88
- * The path where the `cdk.context.json` file
89
- * will be created
90
- */
91
- cdkContextPath;
92
- /**
93
- * The working directory that the integration tests will be
94
- * executed from
95
- */
96
- directory;
97
- /**
98
- * The test to run
99
- */
100
- test;
101
- /**
102
- * Default options to pass to the CDK CLI
103
- */
104
- defaultArgs = {
105
- pathMetadata: false,
106
- assetMetadata: false,
107
- versionReporting: false,
108
- };
109
- /**
110
- * The directory where the CDK will be synthed to
111
- *
112
- * Relative to cwd.
113
- */
114
- temporarySnapshotDir;
115
- /**
116
- * The profile to use for the CDK CLI calls
117
- */
118
- profile;
119
- /**
120
- * Show output from the integ test run.
121
- */
122
- showOutput;
123
- _destructiveChanges;
124
- legacyContext;
125
- _expectedTestSuite;
126
- _actualSnapshot;
127
- _legacyEnableLookups;
128
- deleteSynthDirectories;
129
- /**
130
- * Fields that require an async context to initialize.
131
- */
132
- _asyncMembers;
133
- /**
134
- * Private constructor to prevent inheritance.
135
- */
136
- constructor(options) {
137
- this.test = options.test;
138
- this.directory = this.test.directory;
139
- this.testName = this.test.testName;
140
- this.goldenSnapshotDir = this.test.snapshotDir;
141
- this.cdkContextPath = path.join(this.directory, 'cdk.context.json');
142
- this.profile = options.profile;
143
- this.showOutput = options.showOutput ?? false;
144
- this.cdk = options.cdk ?? (0, engine_1.makeEngine)(options);
145
- this.temporarySnapshotDir = options.integOutDir ?? this.test.temporaryOutputDir;
146
- const testRunCommand = this.test.appCommand;
147
- this.cdkApp = testRunCommand.replace('{filePath}', path.relative(this.directory, this.test.fileName));
148
- this.deleteSynthDirectories = !options.testingUsingMocksLeaveDirectories;
149
- }
150
- /**
151
- * Async initialization; copy information from an async context into variables so we can access them synchronously later.
152
- *
153
- * We call this automatically in all public async members, but if a consumer wants to access this context synchronously
154
- * without calling an async members first, it needs to call this.
155
- */
156
- async asyncInitialize() {
157
- if (this._asyncMembers) {
158
- return;
159
- }
160
- this._asyncMembers = {
161
- testSpecificContext: await this.test.testSpecificContext(),
162
- };
163
- }
164
- get asyncMembers() {
165
- if (!this._asyncMembers) {
166
- throw new Error('Async context not initialized. Call asyncInitialize() first.');
167
- }
168
- return this._asyncMembers;
169
- }
170
- /**
171
- * Configure the legacy enableLookups value to use when generating the actual snapshot.
172
- *
173
- * Must be set before using snapshot methods.
174
- */
175
- configureLegacyEnableLookups(enableLookups) {
176
- this._legacyEnableLookups = enableLookups;
177
- }
178
- /**
179
- * Return the list of actual (i.e. new) test cases for this integration test
180
- */
181
- async actualTests() {
182
- await this.asyncInitialize();
183
- return (await this.actualTestSuite()).testSuite;
184
- }
185
- /**
186
- * Generate a new "actual" snapshot which will be compared to the
187
- * existing "expected" snapshot
188
- * This will synth and then load the integration test manifest
189
- */
190
- async generateActualSnapshot() {
191
- await this.synthActualSnapshot(this.temporarySnapshotDir);
192
- const manifest = await this._loadManifest(this.temporarySnapshotDir);
193
- return {
194
- testDefinition: manifest,
195
- snapshotDirectory: this.temporarySnapshotDir,
196
- };
197
- }
198
- /**
199
- * Synth the actual application to the given directory, for purposes of generating/validating a snapshot
200
- *
201
- * `legacyEnableLookups` is to preserve historical behavior for a while:
202
- * traditionally, the application would only be seeded with context if
203
- * `enableLookups` was true, and this information would come from the test
204
- * definition.
205
- *
206
- * - Since the test definition comes from inside the app, this requires a
207
- * synth just to get the test definition, and then another synth to generate
208
- * the actual snapshot with the correct context, which is time consuming.
209
- * - Given that the context is fixed and fake, it could always have been passed.
210
- *
211
- * However, the snapshot contents themselves depend on the context flag, and changing
212
- * this behavior now invalidates all snapshots everywhere, which is annoying for upgrading.
213
- *
214
- * So we will use the behavior from the GOLDEN SNAPSHOT's test definition to
215
- * determine whether to pass the context, and if the new actual snapshot has a
216
- * different value for `enableLookups`, we will throw away the old snapshot and synth again.
217
- */
218
- async synthActualSnapshot(outputDirectory) {
219
- if (this._legacyEnableLookups === undefined) {
220
- throw new Error('Must call configureLegacyEnableLookups before generating snapshots');
221
- }
222
- const output = path.relative(this.directory, outputDirectory);
223
- // Remove the target directory, so that we don't have stale files from
224
- // previous synths. Also, the runner will re-use a directory that already
225
- // exists and we want force recreation (unless we are unit testing).
226
- if (this.deleteSynthDirectories) {
227
- await fs.rm(output, { recursive: true, force: true });
228
- }
229
- await this.cdk.synth({
230
- app: this.cdkApp,
231
- context: this.getContext(this._legacyEnableLookups !== false ? exports.DEFAULT_SYNTH_OPTIONS.context : {}),
232
- env: exports.DEFAULT_SYNTH_OPTIONS.env,
233
- output,
234
- });
235
- }
236
- actualSynthReproCommand() {
237
- // Show the command necessary to repro this
238
- const envSet = Object.entries(exports.DEFAULT_SYNTH_OPTIONS.env).map(([k, v]) => `${k}='${v}'`);
239
- const envCmd = envSet.length > 0 ? ['env', ...envSet] : [];
240
- return [
241
- ...envCmd,
242
- 'cdk',
243
- 'synth',
244
- '-a',
245
- `'${this.cdkApp}'`,
246
- '-o',
247
- `'${this.temporarySnapshotDir}'`,
248
- ...Object.entries(this.getContext(exports.DEFAULT_SYNTH_OPTIONS.context)).flatMap(([k, v]) => typeof v !== 'object' ? [`-c '${k}=${v}'`] : []),
249
- ];
250
- }
251
- /**
252
- * Returns true if a snapshot already exists for this test
253
- */
254
- hasSnapshot() {
255
- return fs.existsSync(this.goldenSnapshotDir);
256
- }
257
- /**
258
- * The test suite from the existing snapshot
259
- */
260
- async expectedTestSuite() {
261
- await this.asyncInitialize();
262
- if (!this._expectedTestSuite && this.hasSnapshot()) {
263
- this._expectedTestSuite = await this._loadManifest(this.goldenSnapshotDir);
264
- }
265
- return this._expectedTestSuite;
266
- }
267
- async actualSnapshot() {
268
- await this.asyncInitialize();
269
- if (!this._actualSnapshot) {
270
- this._actualSnapshot = await this.generateActualSnapshot();
271
- // Check if the enableLookups value has changed between the golden
272
- // snapshot and the actual snapshot. If it has, we need to re-synth the
273
- // actual snapshot with the new enableLookups value.
274
- //
275
- // See `synthActualSnapshot` for a description of why this is necessary.
276
- const actualEnableLookups = this._actualSnapshot.testDefinition.enableLookups ?? false;
277
- if (actualEnableLookups !== this._legacyEnableLookups && this._legacyEnableLookups !== 'dont-care') {
278
- this.configureLegacyEnableLookups(actualEnableLookups);
279
- this._actualSnapshot = await this.generateActualSnapshot();
280
- }
281
- }
282
- return this._actualSnapshot;
283
- }
284
- /**
285
- * The test suite from the new "actual" snapshot
286
- */
287
- async actualTestSuite() {
288
- return (await this.actualSnapshot()).testDefinition;
289
- }
290
- /**
291
- * Load the integ manifest which contains information
292
- * on how to execute the tests
293
- * First we try and load the manifest from the integ manifest (i.e. integ.json)
294
- * from the cloud assembly. If it doesn't exist, then we fallback to the
295
- * "legacy mode" and create a manifest from pragma
296
- *
297
- * @internal
298
- */
299
- async _loadManifest(dir) {
300
- await this.asyncInitialize();
301
- const manifest = dir;
302
- try {
303
- const testSuite = integ_test_suite_1.IntegTestSuite.fromPath(manifest);
304
- return testSuite;
305
- }
306
- catch (modernError) {
307
- // Only attempt legacy test case if the integ test manifest was not found
308
- // For any other errors, e.g. when parsing the manifest fails, we abort.
309
- if (!(modernError instanceof integ_manifest_1.NoManifestError)) {
310
- throw modernError;
311
- }
312
- if (this.showOutput) {
313
- logger.trace("Failed to load integ test manifest for '%s'. Attempting as deprecated legacy test instead. Error was: %s", manifest, modernError.message ?? String(modernError));
314
- }
315
- const testCases = await integ_test_suite_1.LegacyIntegTestSuite.fromLegacy({
316
- cdk: this.cdk,
317
- testName: this.test.normalizedTestName,
318
- integSourceFilePath: this.test.fileName,
319
- listOptions: {
320
- ...this.defaultArgs,
321
- all: true,
322
- app: this.cdkApp,
323
- profile: this.profile,
324
- output: path.relative(this.directory, this.temporarySnapshotDir),
325
- },
326
- });
327
- this.legacyContext = integ_test_suite_1.LegacyIntegTestSuite.getPragmaContext(this.test.fileName);
328
- return testCases;
329
- }
330
- }
331
- cleanup() {
332
- const cdkOutPath = this.temporarySnapshotDir;
333
- if (fs.existsSync(cdkOutPath)) {
334
- fs.removeSync(cdkOutPath);
335
- }
336
- // Clear cache
337
- this._actualSnapshot = undefined;
338
- }
339
- /**
340
- * If there are any destructive changes to a stack then this will record
341
- * those in the manifest.json file
342
- */
343
- renderTraceData() {
344
- const traceData = new Map();
345
- const destructiveChanges = this._destructiveChanges ?? [];
346
- destructiveChanges.forEach(change => {
347
- const trace = traceData.get(change.stackName);
348
- if (trace) {
349
- trace.set(change.logicalId, `${DESTRUCTIVE_CHANGES} ${change.impact}`);
350
- }
351
- else {
352
- traceData.set(change.stackName, new Map([
353
- [change.logicalId, `${DESTRUCTIVE_CHANGES} ${change.impact}`],
354
- ]));
355
- }
356
- });
357
- return traceData;
358
- }
359
- /**
360
- * In cases where we do not want to retain the assets,
361
- * for example, if the assets are very large.
362
- *
363
- * Since it is possible to disable the update workflow for individual test
364
- * cases, this needs to first get a list of stacks that have the update workflow
365
- * disabled and then delete assets that relate to that stack. It does that
366
- * by reading the asset manifest for the stack and deleting the asset source
367
- */
368
- async removeAssetsFromSnapshot() {
369
- const stacks = (await this.actualTestSuite()).getStacksWithoutUpdateWorkflow() ?? [];
370
- const manifest = cloud_assembly_1.AssemblyManifestReader.fromPath(this.goldenSnapshotDir);
371
- const assets = (0, utils_1.flatten)(stacks.map(stack => {
372
- return manifest.getAssetLocationsForStack(stack) ?? [];
373
- }));
374
- assets.forEach(asset => {
375
- const fileName = path.join(this.goldenSnapshotDir, asset);
376
- if (fs.existsSync(fileName)) {
377
- if (fs.lstatSync(fileName).isDirectory()) {
378
- fs.removeSync(fileName);
379
- }
380
- else {
381
- fs.unlinkSync(fileName);
382
- }
383
- }
384
- });
385
- }
386
- /**
387
- * Remove the asset cache (.cache/) files from the snapshot.
388
- * These are a cache of the asset zips, but we are fine with
389
- * re-zipping on deploy
390
- */
391
- removeAssetsCacheFromSnapshot() {
392
- const files = fs.readdirSync(this.goldenSnapshotDir);
393
- files.forEach(file => {
394
- const fileName = path.join(this.goldenSnapshotDir, file);
395
- if (fs.lstatSync(fileName).isDirectory() && file === '.cache') {
396
- fs.emptyDirSync(fileName);
397
- fs.rmdirSync(fileName);
398
- }
399
- });
400
- }
401
- /**
402
- * Create the new snapshot.
403
- *
404
- * If lookups are enabled, then we need create the snapshot by synth'ing again
405
- * with the dummy context so that each time the test is run on different machines
406
- * (and with different context/env) the diff will not change.
407
- *
408
- * If lookups are disabled (which means the stack is env agnostic) then just copy
409
- * the assembly that was output by the deployment
410
- */
411
- async createSnapshot() {
412
- await this.asyncInitialize();
413
- // TODO: If we're clever, we should be able to reuse the snapshot that was
414
- // generated during the test invalidation check and avoid the below synth.
415
- // But that gets run in a completely different lifecycle and it might not
416
- // exist. We're not dealing with that just yet.
417
- await this.synthActualSnapshot(this.goldenSnapshotDir);
418
- await this.cleanupGoldenSnapshot();
419
- }
420
- /**
421
- * Perform some cleanup steps after the snapshot is created
422
- * Anytime the snapshot needs to be modified after creation
423
- * the logic should live here.
424
- */
425
- async cleanupGoldenSnapshot() {
426
- if (fs.existsSync(this.goldenSnapshotDir)) {
427
- await this.removeAssetsFromSnapshot();
428
- this.removeAssetsCacheFromSnapshot();
429
- const assembly = cloud_assembly_1.AssemblyManifestReader.fromPath(this.goldenSnapshotDir);
430
- assembly.cleanManifest();
431
- assembly.recordTrace(this.renderTraceData());
432
- }
433
- // if this is a legacy test then create an integ manifest
434
- // in the snapshot directory which can be used for the
435
- // update workflow. Save any legacyContext as well so that it can be read
436
- // the next time
437
- const actualTestSuite = await this.actualTestSuite();
438
- if (actualTestSuite.type === 'legacy-test-suite') {
439
- actualTestSuite.saveManifest(this.goldenSnapshotDir, this.legacyContext);
440
- }
441
- }
442
- getContext(additionalContext) {
443
- // Load the test-specific context (from `integ.context.json` or `cdk.json#context`), if any.
444
- // If not found, use the built-in current feature flags (at the risk of newer feature flags changing
445
- // the snapshots).
446
- const featureFlags = this.asyncMembers.testSpecificContext ?? currentlyRecommendedAwsCdkLibFlags();
447
- return {
448
- ...featureFlags,
449
- ...this.legacyContext,
450
- ...additionalContext,
451
- // Don't record creation stack traces in the snapshot, since they just take up space and are never deterministic.
452
- 'aws:cdk:disable-creation-stack-traces': true,
453
- // We originally had PLANNED to set this to ['aws', 'aws-cn'], but due to a programming mistake
454
- // it was set to everything. In this PR, set it to everything to not mess up all the snapshots.
455
- '@aws-cdk/core:target-partitions': undefined,
456
- /* ---------------- THE FUTURE LIVES BELOW----------------------------
457
- // Restricting to these target partitions makes most service principals synthesize to
458
- // `service.${URL_SUFFIX}`, which is technically *incorrect* (it's only `amazonaws.com`
459
- // or `amazonaws.com.cn`, never UrlSuffix for any of the restricted regions) but it's what
460
- // most existing integ tests contain, and we want to disturb as few as possible.
461
- // [TARGET_PARTITIONS]: ['aws', 'aws-cn'],
462
- /* ---------------- END OF THE FUTURE ------------------------------- */
463
- };
464
- }
465
- }
466
- exports.CdkIntegHelper = CdkIntegHelper;
467
- // Default context we run all integ tests with, so they don't depend on the
468
- // account of the exercising user.
469
- exports.DEFAULT_SYNTH_OPTIONS = {
470
- context: {
471
- [cloud_assembly_api_1.AVAILABILITY_ZONE_FALLBACK_CONTEXT_KEY]: ['test-region-1a', 'test-region-1b', 'test-region-1c'],
472
- 'availability-zones:account=12345678:region=test-region': ['test-region-1a', 'test-region-1b', 'test-region-1c'],
473
- 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2:region=test-region': 'ami-1234',
474
- 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2:region=test-region': 'ami-1234',
475
- 'ssm:account=12345678:parameterName=/aws/service/ecs/optimized-ami/amazon-linux/recommended:region=test-region': '{"image_id": "ami-1234"}',
476
- // eslint-disable-next-line @stylistic/max-len
477
- 'ami:account=12345678:filters.image-type.0=machine:filters.name.0=amzn-ami-vpc-nat-*:filters.state.0=available:owners.0=amazon:region=test-region': 'ami-1234',
478
- 'vpc-provider:account=12345678:filter.isDefault=true:region=test-region:returnAsymmetricSubnets=true': {
479
- vpcId: 'vpc-60900905',
480
- subnetGroups: [
481
- {
482
- type: 'Public',
483
- name: 'Public',
484
- subnets: [
485
- {
486
- subnetId: 'subnet-e19455ca',
487
- availabilityZone: 'us-east-1a',
488
- routeTableId: 'rtb-e19455ca',
489
- },
490
- {
491
- subnetId: 'subnet-e0c24797',
492
- availabilityZone: 'us-east-1b',
493
- routeTableId: 'rtb-e0c24797',
494
- },
495
- {
496
- subnetId: 'subnet-ccd77395',
497
- availabilityZone: 'us-east-1c',
498
- routeTableId: 'rtb-ccd77395',
499
- },
500
- ],
501
- },
502
- ],
503
- },
504
- },
505
- env: {
506
- CDK_INTEG_ACCOUNT: '12345678',
507
- CDK_INTEG_REGION: 'test-region',
508
- CDK_INTEG_HOSTED_ZONE_ID: 'Z23ABC4XYZL05B',
509
- CDK_INTEG_HOSTED_ZONE_NAME: 'example.com',
510
- CDK_INTEG_DOMAIN_NAME: '*.example.com',
511
- CDK_INTEG_CERT_ARN: 'arn:aws:acm:test-region:12345678:certificate/86468209-a272-595d-b831-0efb6421265z',
512
- CDK_INTEG_SUBNET_ID: 'subnet-0dff1a399d8f6f92c',
513
- },
514
- };
515
- /**
516
- * Return the currently recommended flags for `aws-cdk-lib`.
517
- *
518
- * These have been built into the CLI at build time. If this ever gets changed
519
- * back to a dynamic load, remember that this source file may be bundled into
520
- * a JavaScript bundle, and `__dirname` might not point where you think it does.
521
- */
522
- function currentlyRecommendedAwsCdkLibFlags() {
523
- return recommendedFlagsFile;
524
- }
525
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWludGVnLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1pbnRlZy1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeW5CQSxnRkFFQztBQTNuQkQsa0RBQWtEO0FBQ2xELDJDQUE2QjtBQUM3QixvRUFBcUY7QUFFckYsNkNBQStCO0FBQy9CLHlEQUEwRTtBQUUxRSx3RkFBMEU7QUFDMUUsb0NBQW1DO0FBQ25DLHFDQUFzQztBQUV0QyxrREFBb0M7QUFFcEMsNkRBQWtFO0FBRWxFLDZEQUEyRDtBQUczRCxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDO0FBc0ZyRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBOEI7UUFDakQsT0FBTyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDYSxpQkFBaUIsQ0FBUztJQUUxQzs7T0FFRztJQUNhLEdBQUcsQ0FBTztJQUUxQjs7T0FFRztJQUNhLFFBQVEsQ0FBUztJQUVqQzs7OztPQUlHO0lBQ2EsTUFBTSxDQUFTO0lBRS9COzs7T0FHRztJQUNhLGNBQWMsQ0FBUztJQUV2Qzs7O09BR0c7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYyxJQUFJLENBQVk7SUFFakM7O09BRUc7SUFDYSxXQUFXLEdBQXNCO1FBQy9DLFlBQVksRUFBRSxLQUFLO1FBQ25CLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLGdCQUFnQixFQUFFLEtBQUs7S0FDeEIsQ0FBQztJQUVGOzs7O09BSUc7SUFDYSxvQkFBb0IsQ0FBUztJQUU3Qzs7T0FFRztJQUNhLE9BQU8sQ0FBVTtJQUVqQzs7T0FFRztJQUNjLFVBQVUsQ0FBVTtJQUU5QixtQkFBbUIsQ0FBdUI7SUFDekMsYUFBYSxDQUF1QjtJQUNwQyxr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QzdCLGdCQUFnQixFQUFFLGFBQWE7UUFDL0Isd0JBQXdCLEVBQUUsZ0JBQWdCO1FBQzFDLDBCQUEwQixFQUFFLGFBQWE7UUFDekMscUJBQXFCLEVBQUUsZUFBZTtRQUN0QyxrQkFBa0IsRUFBRSxtRkFBbUY7UUFDdkcsbUJBQW1CLEVBQUUsMEJBQTBCO0tBQ2hEO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILFNBQWdCLGtDQUFrQztJQUNoRCxPQUFPLG9CQUFvQixDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAY2RrbGFicy9uby1saXRlcmFsLXBhcnRpdGlvbiAqL1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB0eXBlIHsgVGVzdENhc2UsIERlZmF1bHRDZGtPcHRpb25zIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEludGVnVGVzdFN1aXRlLCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSB9IGZyb20gJy4vaW50ZWctdGVzdC1zdWl0ZSc7XG5pbXBvcnQgdHlwZSB7IEludGVnVGVzdCB9IGZyb20gJy4vaW50ZWdyYXRpb24tdGVzdHMnO1xuaW1wb3J0ICogYXMgcmVjb21tZW5kZWRGbGFnc0ZpbGUgZnJvbSAnLi4vcmVjb21tZW5kZWQtZmVhdHVyZS1mbGFncy5qc29uJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBtYWtlRW5naW5lIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBJQ2RrIH0gZnJvbSAnLi4vZW5naW5lcy9jZGstaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdFRyYWNlIH0gZnJvbSAnLi9wcml2YXRlL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB7IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIgfSBmcm9tICcuL3ByaXZhdGUvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBEZXN0cnVjdGl2ZUNoYW5nZSB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcbmltcG9ydCB7IE5vTWFuaWZlc3RFcnJvciB9IGZyb20gJy4vcHJpdmF0ZS9pbnRlZy1tYW5pZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENka0NvbnRleHQgfSBmcm9tICcuL3ByaXZhdGUvdGVzdC1zcGVjaWZpYy1jb250ZXh0JztcblxuY29uc3QgREVTVFJVQ1RJVkVfQ0hBTkdFUyA9ICchIURFU1RSVUNUSVZFX0NIQU5HRVM6JztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBhbiBpbnRlZyBoZWxwZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGtJbnRlZ0hlbHBlck9wdGlvbnMge1xuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHRlc3QgdG8gcnVuXG4gICAqL1xuICByZWFkb25seSB0ZXN0OiBJbnRlZ1Rlc3Q7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gd2hlcmUgdGhlIHRlc3Qgc2hvdWxkIGJlIGRlcGxveWVkXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyBwcm9maWxlIHRvIHVzZSB3aGVuIGludm9raW5nIHRoZSBDREsgQ0xJXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJvZmlsZSBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0IHByb2ZpbGUgaXMgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGF2YWlsYWJsZVxuICAgKiB0byB0aGUgQ0RLIENMSVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICByZWFkb25seSBlbnY/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogdG1wIGNkay5vdXQgZGlyZWN0b3J5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGlyZWN0b3J5IHdpbGwgYmUgYGNkay1pbnRlZy5vdXQuJHt0ZXN0TmFtZX1gXG4gICAqL1xuICByZWFkb25seSBpbnRlZ091dERpcj86IHN0cmluZztcblxuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIENESyBUb29sa2l0IEVuZ2luZSB0byB1c2VcbiAgICpcbiAgICogQGRlZmF1bHQgLSBiYXNlZCBvbiBgZW5naW5lYCBvcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNkaz86IElDZGs7XG5cbiAgLyoqXG4gICAqIFNob3cgb3V0cHV0IGZyb20gcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0c1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd091dHB1dD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgaW5kaWNhdGVkIHByb3h5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJveHlcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIENBIGNlcnRpZmljYXRlIHRvIHVzZSB3aGVuIHZhbGlkYXRpbmcgSFRUUFMgcmVxdWVzdHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIENBIGJ1bmRsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FCdW5kbGVQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbiB1bml0IHRlc3QgbW9kZSwgbGVhdmUgdGhlIHN5bnRoIG91dHB1dCBkaXJlY3RvcmllcywgZG9uJ3QgY2xlYW4gdGhlbS5cbiAgICpcbiAgICogTWFueSBvZiBvdXIgdGVzdHMgdXNlIG1vY2tzIGFuZCBkb24ndCBhY3R1YWxseSBzeW50aCBvdXRwdXQgZGlyZWN0b3JpZXMsIHRoZXkgYXJlXG4gICAqIHN0YXRpYyBhbmQgbXVzdCBub3QgYmUgZGVsZXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRlc3RpbmdVc2luZ01vY2tzTGVhdmVEaXJlY3Rvcmllcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogV2hldGhlciB0byBzeW50aGVzaXplIHRoZSBhY3R1YWwgc25hcHNob3Qgd2l0aCBsb29rdXBzIGVuYWJsZWQgb3Igbm90LlxuICpcbiAqIElmIGVpdGhlciBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2Ugc2VuZCBjb250ZXh0IGluIG9yIG5vdCB3aGlsZSBzeW50aGVzaXppbmcsXG4gKiBhbmQgaWYgdGhlIGdlbmVyYXRlZCBzbmFwc2hvdCB0ZXN0IGRlZmluaXRpb24gcmVxdWVzdHMgYSBkaWZmZXJlbnQgdmFsdWUgd2VcbiAqIHdpbGwgc3ludGggYWdhaW4uXG4gKlxuICogRm9yIGBkb250LWNhcmVgLCB3ZSBkbyBzZW5kIGluIHRoZSBjb250ZXh0IGJ1dCB3ZSBuZXZlciByZXN5bnRoLlxuICovXG5leHBvcnQgdHlwZSBMZWdhY3lFbmFibGVMb29rdXBzID0gdHJ1ZSB8IGZhbHNlIHwgJ2RvbnQtY2FyZSc7XG5cbi8qKlxuICogQ2xhc3Mgd2l0aCBzb21lIGhlbHBlciByb3V0aW5lcyBmb3IgcnVubmluZyBDREsgc25hcHNob3RzIGFuZCBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBBIFwiZ29sZGVuIHNuYXBzaG90XCIgaXMgdGhlIHNuYXBzaG90IHRoYXQgaXMgc3RvcmVkIHBlcm1hbmVudGx5IGluIHZlcnNpb25cbiAqIGNvbnRyb2wsIHRoYXQgbmV3IHJ1bnMgYXJlIGNvbXBhcmVkIGFnYWluc3QgKHN0b3JlZCBpbiBhIGRpcmVjdG9yeSBuYW1lZFxuICogYDx0ZXN0LW5hbWU+LnNuYXBzaG90YCkuXG4gKlxuICogVGhpcyBpcyBhcyBvcHBvc2VkIHRvIG90aGVyIHNuYXBzaG90cywgd2hpY2ggY2FuIGJlIGdlbmVyYXRlZCBmb3IgZXhhbXBsZVxuICogdGVtcG9yYXJpbHkgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCB0byBjb21wYXJlIGFnYWlucyB0aGUgZ29sZGVuIHNuYXBzaG90LlxuICovXG5leHBvcnQgY2xhc3MgQ2RrSW50ZWdIZWxwZXIge1xuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDZGtJbnRlZ0hlbHBlci5cbiAgICpcbiAgICogSGlkaW5nIHRoZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluaGVyaXRhbmNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9uczogQ2RrSW50ZWdIZWxwZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBDZGtJbnRlZ0hlbHBlcihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBnb2xkZW4gc25hcHNob3Qgd2lsbCBiZSBzdG9yZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnb2xkZW5TbmFwc2hvdERpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgQ0RLICBDTElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGs6IElDZGs7XG5cbiAgLyoqXG4gICAqIFByZXR0eSBuYW1lIG9mIHRoZSB0ZXN0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGVzdE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHVzZWQgaW4gdGhlICctLWFwcCcgQ0xJIHBhcmFtZXRlclxuICAgKlxuICAgKiBQYXRoIHRvIHRoZSBpbnRlZyB0ZXN0IHNvdXJjZSBmaWxlLCByZWxhdGl2ZSB0byBgdGhpcy5kaXJlY3RvcnlgLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka0FwcDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB3aGVyZSB0aGUgYGNkay5jb250ZXh0Lmpzb25gIGZpbGVcbiAgICogd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrQ29udGV4dFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRoYXQgdGhlIGludGVncmF0aW9uIHRlc3RzIHdpbGwgYmVcbiAgICogZXhlY3V0ZWQgZnJvbVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVzdCB0byBydW5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdDogSW50ZWdUZXN0O1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgQ0RLIENMSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRBcmdzOiBEZWZhdWx0Q2RrT3B0aW9ucyA9IHtcbiAgICBwYXRoTWV0YWRhdGE6IGZhbHNlLFxuICAgIGFzc2V0TWV0YWRhdGE6IGZhbHNlLFxuICAgIHZlcnNpb25SZXBvcnRpbmc6IGZhbHNlLFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBDREsgd2lsbCBiZSBzeW50aGVkIHRvXG4gICAqXG4gICAqIFJlbGF0aXZlIHRvIGN3ZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0ZW1wb3JhcnlTbmFwc2hvdERpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvZmlsZSB0byB1c2UgZm9yIHRoZSBDREsgQ0xJIGNhbGxzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogU2hvdyBvdXRwdXQgZnJvbSB0aGUgaW50ZWcgdGVzdCBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3dPdXRwdXQ6IGJvb2xlYW47XG5cbiAgcHVibGljIF9kZXN0cnVjdGl2ZUNoYW5nZXM/OiBEZXN0cnVjdGl2ZUNoYW5nZVtdO1xuICBwcml2YXRlIGxlZ2FjeUNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIF9leHBlY3RlZFRlc3RTdWl0ZT86IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG4gIHByaXZhdGUgX2FjdHVhbFNuYXBzaG90PzogU25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBfbGVnYWN5RW5hYmxlTG9va3Vwcz86IExlZ2FjeUVuYWJsZUxvb2t1cHM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVTeW50aERpcmVjdG9yaWVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGaWVsZHMgdGhhdCByZXF1aXJlIGFuIGFzeW5jIGNvbnRleHQgdG8gaW5pdGlhbGl6ZS5cbiAgICovXG4gIHByaXZhdGUgX2FzeW5jTWVtYmVycz86IHtcbiAgICB0ZXN0U3BlY2lmaWNDb250ZXh0PzogQ2RrQ29udGV4dDtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluaGVyaXRhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihvcHRpb25zOiBDZGtJbnRlZ0hlbHBlck9wdGlvbnMpIHtcbiAgICB0aGlzLnRlc3QgPSBvcHRpb25zLnRlc3Q7XG4gICAgdGhpcy5kaXJlY3RvcnkgPSB0aGlzLnRlc3QuZGlyZWN0b3J5O1xuICAgIHRoaXMudGVzdE5hbWUgPSB0aGlzLnRlc3QudGVzdE5hbWU7XG4gICAgdGhpcy5nb2xkZW5TbmFwc2hvdERpciA9IHRoaXMudGVzdC5zbmFwc2hvdERpcjtcbiAgICB0aGlzLmNka0NvbnRleHRQYXRoID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCAnY2RrLmNvbnRleHQuanNvbicpO1xuICAgIHRoaXMucHJvZmlsZSA9IG9wdGlvbnMucHJvZmlsZTtcbiAgICB0aGlzLnNob3dPdXRwdXQgPSBvcHRpb25zLnNob3dPdXRwdXQgPz8gZmFsc2U7XG5cbiAgICB0aGlzLmNkayA9IG9wdGlvbnMuY2RrID8/IG1ha2VFbmdpbmUob3B0aW9ucyk7XG4gICAgdGhpcy50ZW1wb3JhcnlTbmFwc2hvdERpciA9IG9wdGlvbnMuaW50ZWdPdXREaXIgPz8gdGhpcy50ZXN0LnRlbXBvcmFyeU91dHB1dERpcjtcblxuICAgIGNvbnN0IHRlc3RSdW5Db21tYW5kID0gdGhpcy50ZXN0LmFwcENvbW1hbmQ7XG4gICAgdGhpcy5jZGtBcHAgPSB0ZXN0UnVuQ29tbWFuZC5yZXBsYWNlKCd7ZmlsZVBhdGh9JywgcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy50ZXN0LmZpbGVOYW1lKSk7XG5cbiAgICB0aGlzLmRlbGV0ZVN5bnRoRGlyZWN0b3JpZXMgPSAhb3B0aW9ucy50ZXN0aW5nVXNpbmdNb2Nrc0xlYXZlRGlyZWN0b3JpZXM7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmMgaW5pdGlhbGl6YXRpb247IGNvcHkgaW5mb3JtYXRpb24gZnJvbSBhbiBhc3luYyBjb250ZXh0IGludG8gdmFyaWFibGVzIHNvIHdlIGNhbiBhY2Nlc3MgdGhlbSBzeW5jaHJvbm91c2x5IGxhdGVyLlxuICAgKlxuICAgKiBXZSBjYWxsIHRoaXMgYXV0b21hdGljYWxseSBpbiBhbGwgcHVibGljIGFzeW5jIG1lbWJlcnMsIGJ1dCBpZiBhIGNvbnN1bWVyIHdhbnRzIHRvIGFjY2VzcyB0aGlzIGNvbnRleHQgc3luY2hyb25vdXNseVxuICAgKiB3aXRob3V0IGNhbGxpbmcgYW4gYXN5bmMgbWVtYmVycyBmaXJzdCwgaXQgbmVlZHMgdG8gY2FsbCB0aGlzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFzeW5jSW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fYXN5bmNNZW1iZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fYXN5bmNNZW1iZXJzID0ge1xuICAgICAgdGVzdFNwZWNpZmljQ29udGV4dDogYXdhaXQgdGhpcy50ZXN0LnRlc3RTcGVjaWZpY0NvbnRleHQoKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgYXN5bmNNZW1iZXJzKCk6IE5vbk51bGxhYmxlPENka0ludGVnSGVscGVyWydfYXN5bmNNZW1iZXJzJ10+IHtcbiAgICBpZiAoIXRoaXMuX2FzeW5jTWVtYmVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3luYyBjb250ZXh0IG5vdCBpbml0aWFsaXplZC4gQ2FsbCBhc3luY0luaXRpYWxpemUoKSBmaXJzdC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FzeW5jTWVtYmVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIGxlZ2FjeSBlbmFibGVMb29rdXBzIHZhbHVlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIGFjdHVhbCBzbmFwc2hvdC5cbiAgICpcbiAgICogTXVzdCBiZSBzZXQgYmVmb3JlIHVzaW5nIHNuYXBzaG90IG1ldGhvZHMuXG4gICAqL1xuICBwdWJsaWMgY29uZmlndXJlTGVnYWN5RW5hYmxlTG9va3VwcyhlbmFibGVMb29rdXBzOiBMZWdhY3lFbmFibGVMb29rdXBzKTogdm9pZCB7XG4gICAgdGhpcy5fbGVnYWN5RW5hYmxlTG9va3VwcyA9IGVuYWJsZUxvb2t1cHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGFjdHVhbCAoaS5lLiBuZXcpIHRlc3QgY2FzZXMgZm9yIHRoaXMgaW50ZWdyYXRpb24gdGVzdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjdHVhbFRlc3RzKCk6IFByb21pc2U8eyBbdGVzdE5hbWU6IHN0cmluZ106IFRlc3RDYXNlIH0gfCB1bmRlZmluZWQ+IHtcbiAgICBhd2FpdCB0aGlzLmFzeW5jSW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKSkudGVzdFN1aXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgbmV3IFwiYWN0dWFsXCIgc25hcHNob3Qgd2hpY2ggd2lsbCBiZSBjb21wYXJlZCB0byB0aGVcbiAgICogZXhpc3RpbmcgXCJleHBlY3RlZFwiIHNuYXBzaG90XG4gICAqIFRoaXMgd2lsbCBzeW50aCBhbmQgdGhlbiBsb2FkIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IG1hbmlmZXN0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlQWN0dWFsU25hcHNob3QoKTogUHJvbWlzZTxTbmFwc2hvdEFuZFRlc3REZWZpbml0aW9uPiB7XG4gICAgYXdhaXQgdGhpcy5zeW50aEFjdHVhbFNuYXBzaG90KHRoaXMudGVtcG9yYXJ5U25hcHNob3REaXIpO1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgdGhpcy5fbG9hZE1hbmlmZXN0KHRoaXMudGVtcG9yYXJ5U25hcHNob3REaXIpO1xuICAgIHJldHVybiB7XG4gICAgICB0ZXN0RGVmaW5pdGlvbjogbWFuaWZlc3QsXG4gICAgICBzbmFwc2hvdERpcmVjdG9yeTogdGhpcy50ZW1wb3JhcnlTbmFwc2hvdERpcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIHRoZSBhY3R1YWwgYXBwbGljYXRpb24gdG8gdGhlIGdpdmVuIGRpcmVjdG9yeSwgZm9yIHB1cnBvc2VzIG9mIGdlbmVyYXRpbmcvdmFsaWRhdGluZyBhIHNuYXBzaG90XG4gICAqXG4gICAqIGBsZWdhY3lFbmFibGVMb29rdXBzYCBpcyB0byBwcmVzZXJ2ZSBoaXN0b3JpY2FsIGJlaGF2aW9yIGZvciBhIHdoaWxlOlxuICAgKiB0cmFkaXRpb25hbGx5LCB0aGUgYXBwbGljYXRpb24gd291bGQgb25seSBiZSBzZWVkZWQgd2l0aCBjb250ZXh0IGlmXG4gICAqIGBlbmFibGVMb29rdXBzYCB3YXMgdHJ1ZSwgYW5kIHRoaXMgaW5mb3JtYXRpb24gd291bGQgY29tZSBmcm9tIHRoZSB0ZXN0XG4gICAqIGRlZmluaXRpb24uXG4gICAqXG4gICAqIC0gU2luY2UgdGhlIHRlc3QgZGVmaW5pdGlvbiBjb21lcyBmcm9tIGluc2lkZSB0aGUgYXBwLCB0aGlzIHJlcXVpcmVzIGFcbiAgICogICBzeW50aCBqdXN0IHRvIGdldCB0aGUgdGVzdCBkZWZpbml0aW9uLCBhbmQgdGhlbiBhbm90aGVyIHN5bnRoIHRvIGdlbmVyYXRlXG4gICAqICAgdGhlIGFjdHVhbCBzbmFwc2hvdCB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHQsIHdoaWNoIGlzIHRpbWUgY29uc3VtaW5nLlxuICAgKiAtIEdpdmVuIHRoYXQgdGhlIGNvbnRleHQgaXMgZml4ZWQgYW5kIGZha2UsIGl0IGNvdWxkIGFsd2F5cyBoYXZlIGJlZW4gcGFzc2VkLlxuICAgKlxuICAgKiBIb3dldmVyLCB0aGUgc25hcHNob3QgY29udGVudHMgdGhlbXNlbHZlcyBkZXBlbmQgb24gdGhlIGNvbnRleHQgZmxhZywgYW5kIGNoYW5naW5nXG4gICAqIHRoaXMgYmVoYXZpb3Igbm93IGludmFsaWRhdGVzIGFsbCBzbmFwc2hvdHMgZXZlcnl3aGVyZSwgd2hpY2ggaXMgYW5ub3lpbmcgZm9yIHVwZ3JhZGluZy5cbiAgICpcbiAgICogU28gd2Ugd2lsbCB1c2UgdGhlIGJlaGF2aW9yIGZyb20gdGhlIEdPTERFTiBTTkFQU0hPVCdzIHRlc3QgZGVmaW5pdGlvbiB0b1xuICAgKiBkZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIHRoZSBjb250ZXh0LCBhbmQgaWYgdGhlIG5ldyBhY3R1YWwgc25hcHNob3QgaGFzIGFcbiAgICogZGlmZmVyZW50IHZhbHVlIGZvciBgZW5hYmxlTG9va3Vwc2AsIHdlIHdpbGwgdGhyb3cgYXdheSB0aGUgb2xkIHNuYXBzaG90IGFuZCBzeW50aCBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3ludGhBY3R1YWxTbmFwc2hvdChvdXRwdXREaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBjYWxsIGNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMgYmVmb3JlIGdlbmVyYXRpbmcgc25hcHNob3RzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgb3V0cHV0RGlyZWN0b3J5KTtcblxuICAgIC8vIFJlbW92ZSB0aGUgdGFyZ2V0IGRpcmVjdG9yeSwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHN0YWxlIGZpbGVzIGZyb21cbiAgICAvLyBwcmV2aW91cyBzeW50aHMuIEFsc28sIHRoZSBydW5uZXIgd2lsbCByZS11c2UgYSBkaXJlY3RvcnkgdGhhdCBhbHJlYWR5XG4gICAgLy8gZXhpc3RzIGFuZCB3ZSB3YW50IGZvcmNlIHJlY3JlYXRpb24gKHVubGVzcyB3ZSBhcmUgdW5pdCB0ZXN0aW5nKS5cbiAgICBpZiAodGhpcy5kZWxldGVTeW50aERpcmVjdG9yaWVzKSB7XG4gICAgICBhd2FpdCBmcy5ybShvdXRwdXQsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmNkay5zeW50aCh7XG4gICAgICBhcHA6IHRoaXMuY2RrQXBwLFxuICAgICAgY29udGV4dDogdGhpcy5nZXRDb250ZXh0KHRoaXMuX2xlZ2FjeUVuYWJsZUxvb2t1cHMgIT09IGZhbHNlID8gREVGQVVMVF9TWU5USF9PUFRJT05TLmNvbnRleHQgOiB7fSksXG4gICAgICBlbnY6IERFRkFVTFRfU1lOVEhfT1BUSU9OUy5lbnYsXG4gICAgICBvdXRwdXQsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWN0dWFsU3ludGhSZXByb0NvbW1hbmQoKSB7XG4gICAgLy8gU2hvdyB0aGUgY29tbWFuZCBuZWNlc3NhcnkgdG8gcmVwcm8gdGhpc1xuICAgIGNvbnN0IGVudlNldCA9IE9iamVjdC5lbnRyaWVzKERFRkFVTFRfU1lOVEhfT1BUSU9OUy5lbnYpLm1hcCgoW2ssIHZdKSA9PiBgJHtrfT0nJHt2fSdgKTtcbiAgICBjb25zdCBlbnZDbWQgPSBlbnZTZXQubGVuZ3RoID4gMCA/IFsnZW52JywgLi4uZW52U2V0XSA6IFtdO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLmVudkNtZCxcbiAgICAgICdjZGsnLFxuICAgICAgJ3N5bnRoJyxcbiAgICAgICctYScsXG4gICAgICBgJyR7dGhpcy5jZGtBcHB9J2AsXG4gICAgICAnLW8nLFxuICAgICAgYCcke3RoaXMudGVtcG9yYXJ5U25hcHNob3REaXJ9J2AsXG4gICAgICAuLi5PYmplY3QuZW50cmllcyh0aGlzLmdldENvbnRleHQoREVGQVVMVF9TWU5USF9PUFRJT05TLmNvbnRleHQpKS5mbGF0TWFwKChbaywgdl0pID0+IHR5cGVvZiB2ICE9PSAnb2JqZWN0JyA/IFtgLWMgJyR7a309JHt2fSdgXSA6IFtdKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIHNuYXBzaG90IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHRlc3RcbiAgICovXG4gIHB1YmxpYyBoYXNTbmFwc2hvdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyh0aGlzLmdvbGRlblNuYXBzaG90RGlyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGVzdCBzdWl0ZSBmcm9tIHRoZSBleGlzdGluZyBzbmFwc2hvdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4cGVjdGVkVGVzdFN1aXRlKCk6IFByb21pc2U8SW50ZWdUZXN0U3VpdGUgfCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIGF3YWl0IHRoaXMuYXN5bmNJbml0aWFsaXplKCk7XG4gICAgaWYgKCF0aGlzLl9leHBlY3RlZFRlc3RTdWl0ZSAmJiB0aGlzLmhhc1NuYXBzaG90KCkpIHtcbiAgICAgIHRoaXMuX2V4cGVjdGVkVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5fbG9hZE1hbmlmZXN0KHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXhwZWN0ZWRUZXN0U3VpdGU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWN0dWFsU25hcHNob3QoKTogUHJvbWlzZTxTbmFwc2hvdEFuZFRlc3REZWZpbml0aW9uPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICBpZiAoIXRoaXMuX2FjdHVhbFNuYXBzaG90KSB7XG4gICAgICB0aGlzLl9hY3R1YWxTbmFwc2hvdCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVBY3R1YWxTbmFwc2hvdCgpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZW5hYmxlTG9va3VwcyB2YWx1ZSBoYXMgY2hhbmdlZCBiZXR3ZWVuIHRoZSBnb2xkZW5cbiAgICAgIC8vIHNuYXBzaG90IGFuZCB0aGUgYWN0dWFsIHNuYXBzaG90LiBJZiBpdCBoYXMsIHdlIG5lZWQgdG8gcmUtc3ludGggdGhlXG4gICAgICAvLyBhY3R1YWwgc25hcHNob3Qgd2l0aCB0aGUgbmV3IGVuYWJsZUxvb2t1cHMgdmFsdWUuXG4gICAgICAvL1xuICAgICAgLy8gU2VlIGBzeW50aEFjdHVhbFNuYXBzaG90YCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuXG4gICAgICBjb25zdCBhY3R1YWxFbmFibGVMb29rdXBzID0gdGhpcy5fYWN0dWFsU25hcHNob3QudGVzdERlZmluaXRpb24uZW5hYmxlTG9va3VwcyA/PyBmYWxzZTtcbiAgICAgIGlmIChhY3R1YWxFbmFibGVMb29rdXBzICE9PSB0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzICYmIHRoaXMuX2xlZ2FjeUVuYWJsZUxvb2t1cHMgIT09ICdkb250LWNhcmUnKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJlTGVnYWN5RW5hYmxlTG9va3VwcyhhY3R1YWxFbmFibGVMb29rdXBzKTtcbiAgICAgICAgdGhpcy5fYWN0dWFsU25hcHNob3QgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQWN0dWFsU25hcHNob3QoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FjdHVhbFNuYXBzaG90O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHN1aXRlIGZyb20gdGhlIG5ldyBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFjdHVhbFRlc3RTdWl0ZSgpOiBQcm9taXNlPEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWN0dWFsU25hcHNob3QoKSkudGVzdERlZmluaXRpb247XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgaW50ZWcgbWFuaWZlc3Qgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb25cbiAgICogb24gaG93IHRvIGV4ZWN1dGUgdGhlIHRlc3RzXG4gICAqIEZpcnN0IHdlIHRyeSBhbmQgbG9hZCB0aGUgbWFuaWZlc3QgZnJvbSB0aGUgaW50ZWcgbWFuaWZlc3QgKGkuZS4gaW50ZWcuanNvbilcbiAgICogZnJvbSB0aGUgY2xvdWQgYXNzZW1ibHkuIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4gd2UgZmFsbGJhY2sgdG8gdGhlXG4gICAqIFwibGVnYWN5IG1vZGVcIiBhbmQgY3JlYXRlIGEgbWFuaWZlc3QgZnJvbSBwcmFnbWFcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgX2xvYWRNYW5pZmVzdChkaXI6IHN0cmluZyk6IFByb21pc2U8SW50ZWdUZXN0U3VpdGUgfCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZT4ge1xuICAgIGF3YWl0IHRoaXMuYXN5bmNJbml0aWFsaXplKCk7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBkaXI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlc3RTdWl0ZSA9IEludGVnVGVzdFN1aXRlLmZyb21QYXRoKG1hbmlmZXN0KTtcbiAgICAgIHJldHVybiB0ZXN0U3VpdGU7XG4gICAgfSBjYXRjaCAobW9kZXJuRXJyb3I6IGFueSkge1xuICAgICAgLy8gT25seSBhdHRlbXB0IGxlZ2FjeSB0ZXN0IGNhc2UgaWYgdGhlIGludGVnIHRlc3QgbWFuaWZlc3Qgd2FzIG5vdCBmb3VuZFxuICAgICAgLy8gRm9yIGFueSBvdGhlciBlcnJvcnMsIGUuZy4gd2hlbiBwYXJzaW5nIHRoZSBtYW5pZmVzdCBmYWlscywgd2UgYWJvcnQuXG4gICAgICBpZiAoIShtb2Rlcm5FcnJvciBpbnN0YW5jZW9mIE5vTWFuaWZlc3RFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgbW9kZXJuRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNob3dPdXRwdXQpIHtcbiAgICAgICAgbG9nZ2VyLnRyYWNlKFxuICAgICAgICAgIFwiRmFpbGVkIHRvIGxvYWQgaW50ZWcgdGVzdCBtYW5pZmVzdCBmb3IgJyVzJy4gQXR0ZW1wdGluZyBhcyBkZXByZWNhdGVkIGxlZ2FjeSB0ZXN0IGluc3RlYWQuIEVycm9yIHdhczogJXNcIixcbiAgICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgICBtb2Rlcm5FcnJvci5tZXNzYWdlID8/IFN0cmluZyhtb2Rlcm5FcnJvciksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlc3RDYXNlcyA9IGF3YWl0IExlZ2FjeUludGVnVGVzdFN1aXRlLmZyb21MZWdhY3koe1xuICAgICAgICBjZGs6IHRoaXMuY2RrLFxuICAgICAgICB0ZXN0TmFtZTogdGhpcy50ZXN0Lm5vcm1hbGl6ZWRUZXN0TmFtZSxcbiAgICAgICAgaW50ZWdTb3VyY2VGaWxlUGF0aDogdGhpcy50ZXN0LmZpbGVOYW1lLFxuICAgICAgICBsaXN0T3B0aW9uczoge1xuICAgICAgICAgIC4uLnRoaXMuZGVmYXVsdEFyZ3MsXG4gICAgICAgICAgYWxsOiB0cnVlLFxuICAgICAgICAgIGFwcDogdGhpcy5jZGtBcHAsXG4gICAgICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlLFxuICAgICAgICAgIG91dHB1dDogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy50ZW1wb3JhcnlTbmFwc2hvdERpciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMubGVnYWN5Q29udGV4dCA9IExlZ2FjeUludGVnVGVzdFN1aXRlLmdldFByYWdtYUNvbnRleHQodGhpcy50ZXN0LmZpbGVOYW1lKTtcbiAgICAgIHJldHVybiB0ZXN0Q2FzZXM7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFudXAoKTogdm9pZCB7XG4gICAgY29uc3QgY2RrT3V0UGF0aCA9IHRoaXMudGVtcG9yYXJ5U25hcHNob3REaXI7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2RrT3V0UGF0aCkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoY2RrT3V0UGF0aCk7XG4gICAgfVxuICAgIC8vIENsZWFyIGNhY2hlXG4gICAgdGhpcy5fYWN0dWFsU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlcmUgYXJlIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzIHRvIGEgc3RhY2sgdGhlbiB0aGlzIHdpbGwgcmVjb3JkXG4gICAqIHRob3NlIGluIHRoZSBtYW5pZmVzdC5qc29uIGZpbGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyVHJhY2VEYXRhKCk6IE1hbmlmZXN0VHJhY2Uge1xuICAgIGNvbnN0IHRyYWNlRGF0YTogTWFuaWZlc3RUcmFjZSA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkZXN0cnVjdGl2ZUNoYW5nZXMgPSB0aGlzLl9kZXN0cnVjdGl2ZUNoYW5nZXMgPz8gW107XG4gICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgIGNvbnN0IHRyYWNlID0gdHJhY2VEYXRhLmdldChjaGFuZ2Uuc3RhY2tOYW1lKTtcbiAgICAgIGlmICh0cmFjZSkge1xuICAgICAgICB0cmFjZS5zZXQoY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2VEYXRhLnNldChjaGFuZ2Uuc3RhY2tOYW1lLCBuZXcgTWFwKFtcbiAgICAgICAgICBbY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWBdLFxuICAgICAgICBdKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNlRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBjYXNlcyB3aGVyZSB3ZSBkbyBub3Qgd2FudCB0byByZXRhaW4gdGhlIGFzc2V0cyxcbiAgICogZm9yIGV4YW1wbGUsIGlmIHRoZSBhc3NldHMgYXJlIHZlcnkgbGFyZ2UuXG4gICAqXG4gICAqIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIHVwZGF0ZSB3b3JrZmxvdyBmb3IgaW5kaXZpZHVhbCB0ZXN0XG4gICAqIGNhc2VzLCB0aGlzIG5lZWRzIHRvIGZpcnN0IGdldCBhIGxpc3Qgb2Ygc3RhY2tzIHRoYXQgaGF2ZSB0aGUgdXBkYXRlIHdvcmtmbG93XG4gICAqIGRpc2FibGVkIGFuZCB0aGVuIGRlbGV0ZSBhc3NldHMgdGhhdCByZWxhdGUgdG8gdGhhdCBzdGFjay4gSXQgZG9lcyB0aGF0XG4gICAqIGJ5IHJlYWRpbmcgdGhlIGFzc2V0IG1hbmlmZXN0IGZvciB0aGUgc3RhY2sgYW5kIGRlbGV0aW5nIHRoZSBhc3NldCBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlQXNzZXRzRnJvbVNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YWNrcyA9IChhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpKS5nZXRTdGFja3NXaXRob3V0VXBkYXRlV29ya2Zsb3coKSA/PyBbXTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgodGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgY29uc3QgYXNzZXRzID0gZmxhdHRlbihzdGFja3MubWFwKHN0YWNrID0+IHtcbiAgICAgIHJldHVybiBtYW5pZmVzdC5nZXRBc3NldExvY2F0aW9uc0ZvclN0YWNrKHN0YWNrKSA/PyBbXTtcbiAgICB9KSk7XG5cbiAgICBhc3NldHMuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBhc3NldCk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlTmFtZSkpIHtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmaWxlTmFtZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIGZzLnJlbW92ZVN5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLnVubGlua1N5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBhc3NldCBjYWNoZSAoLmNhY2hlLykgZmlsZXMgZnJvbSB0aGUgc25hcHNob3QuXG4gICAqIFRoZXNlIGFyZSBhIGNhY2hlIG9mIHRoZSBhc3NldCB6aXBzLCBidXQgd2UgYXJlIGZpbmUgd2l0aFxuICAgKiByZS16aXBwaW5nIG9uIGRlcGxveVxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVBc3NldHNDYWNoZUZyb21TbmFwc2hvdCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBmaWxlKTtcbiAgICAgIGlmIChmcy5sc3RhdFN5bmMoZmlsZU5hbWUpLmlzRGlyZWN0b3J5KCkgJiYgZmlsZSA9PT0gJy5jYWNoZScpIHtcbiAgICAgICAgZnMuZW1wdHlEaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgICAgZnMucm1kaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIG5ldyBzbmFwc2hvdC5cbiAgICpcbiAgICogSWYgbG9va3VwcyBhcmUgZW5hYmxlZCwgdGhlbiB3ZSBuZWVkIGNyZWF0ZSB0aGUgc25hcHNob3QgYnkgc3ludGgnaW5nIGFnYWluXG4gICAqIHdpdGggdGhlIGR1bW15IGNvbnRleHQgc28gdGhhdCBlYWNoIHRpbWUgdGhlIHRlc3QgaXMgcnVuIG9uIGRpZmZlcmVudCBtYWNoaW5lc1xuICAgKiAoYW5kIHdpdGggZGlmZmVyZW50IGNvbnRleHQvZW52KSB0aGUgZGlmZiB3aWxsIG5vdCBjaGFuZ2UuXG4gICAqXG4gICAqIElmIGxvb2t1cHMgYXJlIGRpc2FibGVkICh3aGljaCBtZWFucyB0aGUgc3RhY2sgaXMgZW52IGFnbm9zdGljKSB0aGVuIGp1c3QgY29weVxuICAgKiB0aGUgYXNzZW1ibHkgdGhhdCB3YXMgb3V0cHV0IGJ5IHRoZSBkZXBsb3ltZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlU25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcblxuICAgIC8vIFRPRE86IElmIHdlJ3JlIGNsZXZlciwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcmV1c2UgdGhlIHNuYXBzaG90IHRoYXQgd2FzXG4gICAgLy8gZ2VuZXJhdGVkIGR1cmluZyB0aGUgdGVzdCBpbnZhbGlkYXRpb24gY2hlY2sgYW5kIGF2b2lkIHRoZSBiZWxvdyBzeW50aC5cbiAgICAvLyBCdXQgdGhhdCBnZXRzIHJ1biBpbiBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGxpZmVjeWNsZSBhbmQgaXQgbWlnaHQgbm90XG4gICAgLy8gZXhpc3QuIFdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggdGhhdCBqdXN0IHlldC5cbiAgICBhd2FpdCB0aGlzLnN5bnRoQWN0dWFsU25hcHNob3QodGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG5cbiAgICBhd2FpdCB0aGlzLmNsZWFudXBHb2xkZW5TbmFwc2hvdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gc29tZSBjbGVhbnVwIHN0ZXBzIGFmdGVyIHRoZSBzbmFwc2hvdCBpcyBjcmVhdGVkXG4gICAqIEFueXRpbWUgdGhlIHNuYXBzaG90IG5lZWRzIHRvIGJlIG1vZGlmaWVkIGFmdGVyIGNyZWF0aW9uXG4gICAqIHRoZSBsb2dpYyBzaG91bGQgbGl2ZSBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwR29sZGVuU25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5nb2xkZW5TbmFwc2hvdERpcikpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQXNzZXRzRnJvbVNuYXBzaG90KCk7XG4gICAgICB0aGlzLnJlbW92ZUFzc2V0c0NhY2hlRnJvbVNuYXBzaG90KCk7XG4gICAgICBjb25zdCBhc3NlbWJseSA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgodGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgICBhc3NlbWJseS5jbGVhbk1hbmlmZXN0KCk7XG4gICAgICBhc3NlbWJseS5yZWNvcmRUcmFjZSh0aGlzLnJlbmRlclRyYWNlRGF0YSgpKTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGlzIGEgbGVnYWN5IHRlc3QgdGhlbiBjcmVhdGUgYW4gaW50ZWcgbWFuaWZlc3RcbiAgICAvLyBpbiB0aGUgc25hcHNob3QgZGlyZWN0b3J5IHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0aGVcbiAgICAvLyB1cGRhdGUgd29ya2Zsb3cuIFNhdmUgYW55IGxlZ2FjeUNvbnRleHQgYXMgd2VsbCBzbyB0aGF0IGl0IGNhbiBiZSByZWFkXG4gICAgLy8gdGhlIG5leHQgdGltZVxuICAgIGNvbnN0IGFjdHVhbFRlc3RTdWl0ZSA9IGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCk7XG4gICAgaWYgKGFjdHVhbFRlc3RTdWl0ZS50eXBlID09PSAnbGVnYWN5LXRlc3Qtc3VpdGUnKSB7XG4gICAgICAoYWN0dWFsVGVzdFN1aXRlIGFzIExlZ2FjeUludGVnVGVzdFN1aXRlKS5zYXZlTWFuaWZlc3QodGhpcy5nb2xkZW5TbmFwc2hvdERpciwgdGhpcy5sZWdhY3lDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29udGV4dChhZGRpdGlvbmFsQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAvLyBMb2FkIHRoZSB0ZXN0LXNwZWNpZmljIGNvbnRleHQgKGZyb20gYGludGVnLmNvbnRleHQuanNvbmAgb3IgYGNkay5qc29uI2NvbnRleHRgKSwgaWYgYW55LlxuICAgIC8vIElmIG5vdCBmb3VuZCwgdXNlIHRoZSBidWlsdC1pbiBjdXJyZW50IGZlYXR1cmUgZmxhZ3MgKGF0IHRoZSByaXNrIG9mIG5ld2VyIGZlYXR1cmUgZmxhZ3MgY2hhbmdpbmdcbiAgICAvLyB0aGUgc25hcHNob3RzKS5cbiAgICBjb25zdCBmZWF0dXJlRmxhZ3MgPSB0aGlzLmFzeW5jTWVtYmVycy50ZXN0U3BlY2lmaWNDb250ZXh0ID8/IGN1cnJlbnRseVJlY29tbWVuZGVkQXdzQ2RrTGliRmxhZ3MoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5mZWF0dXJlRmxhZ3MsXG4gICAgICAuLi50aGlzLmxlZ2FjeUNvbnRleHQsXG4gICAgICAuLi5hZGRpdGlvbmFsQ29udGV4dCxcblxuICAgICAgLy8gRG9uJ3QgcmVjb3JkIGNyZWF0aW9uIHN0YWNrIHRyYWNlcyBpbiB0aGUgc25hcHNob3QsIHNpbmNlIHRoZXkganVzdCB0YWtlIHVwIHNwYWNlIGFuZCBhcmUgbmV2ZXIgZGV0ZXJtaW5pc3RpYy5cbiAgICAgICdhd3M6Y2RrOmRpc2FibGUtY3JlYXRpb24tc3RhY2stdHJhY2VzJzogdHJ1ZSxcblxuICAgICAgLy8gV2Ugb3JpZ2luYWxseSBoYWQgUExBTk5FRCB0byBzZXQgdGhpcyB0byBbJ2F3cycsICdhd3MtY24nXSwgYnV0IGR1ZSB0byBhIHByb2dyYW1taW5nIG1pc3Rha2VcbiAgICAgIC8vIGl0IHdhcyBzZXQgdG8gZXZlcnl0aGluZy4gSW4gdGhpcyBQUiwgc2V0IGl0IHRvIGV2ZXJ5dGhpbmcgdG8gbm90IG1lc3MgdXAgYWxsIHRoZSBzbmFwc2hvdHMuXG4gICAgICAnQGF3cy1jZGsvY29yZTp0YXJnZXQtcGFydGl0aW9ucyc6IHVuZGVmaW5lZCxcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBUSEUgRlVUVVJFIExJVkVTIEJFTE9XLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gUmVzdHJpY3RpbmcgdG8gdGhlc2UgdGFyZ2V0IHBhcnRpdGlvbnMgbWFrZXMgbW9zdCBzZXJ2aWNlIHByaW5jaXBhbHMgc3ludGhlc2l6ZSB0b1xuICAgICAgLy8gYHNlcnZpY2UuJHtVUkxfU1VGRklYfWAsIHdoaWNoIGlzIHRlY2huaWNhbGx5ICppbmNvcnJlY3QqIChpdCdzIG9ubHkgYGFtYXpvbmF3cy5jb21gXG4gICAgICAvLyBvciBgYW1hem9uYXdzLmNvbS5jbmAsIG5ldmVyIFVybFN1ZmZpeCBmb3IgYW55IG9mIHRoZSByZXN0cmljdGVkIHJlZ2lvbnMpIGJ1dCBpdCdzIHdoYXRcbiAgICAgIC8vIG1vc3QgZXhpc3RpbmcgaW50ZWcgdGVzdHMgY29udGFpbiwgYW5kIHdlIHdhbnQgdG8gZGlzdHVyYiBhcyBmZXcgYXMgcG9zc2libGUuXG4gICAgICAvLyBbVEFSR0VUX1BBUlRJVElPTlNdOiBbJ2F3cycsICdhd3MtY24nXSxcbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gRU5EIE9GIFRIRSBGVVRVUkUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgIH07XG4gIH1cbn1cblxuLy8gRGVmYXVsdCBjb250ZXh0IHdlIHJ1biBhbGwgaW50ZWcgdGVzdHMgd2l0aCwgc28gdGhleSBkb24ndCBkZXBlbmQgb24gdGhlXG4vLyBhY2NvdW50IG9mIHRoZSBleGVyY2lzaW5nIHVzZXIuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TWU5USF9PUFRJT05TID0ge1xuICBjb250ZXh0OiB7XG4gICAgW0FWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZXTogWyd0ZXN0LXJlZ2lvbi0xYScsICd0ZXN0LXJlZ2lvbi0xYicsICd0ZXN0LXJlZ2lvbi0xYyddLFxuICAgICdhdmFpbGFiaWxpdHktem9uZXM6YWNjb3VudD0xMjM0NTY3ODpyZWdpb249dGVzdC1yZWdpb24nOiBbJ3Rlc3QtcmVnaW9uLTFhJywgJ3Rlc3QtcmVnaW9uLTFiJywgJ3Rlc3QtcmVnaW9uLTFjJ10sXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4tYW1pLWh2bS14ODZfNjQtZ3AyOnJlZ2lvbj10ZXN0LXJlZ2lvbic6ICdhbWktMTIzNCcsXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4yLWFtaS1odm0teDg2XzY0LWdwMjpyZWdpb249dGVzdC1yZWdpb24nOiAnYW1pLTEyMzQnLFxuICAgICdzc206YWNjb3VudD0xMjM0NTY3ODpwYXJhbWV0ZXJOYW1lPS9hd3Mvc2VydmljZS9lY3Mvb3B0aW1pemVkLWFtaS9hbWF6b24tbGludXgvcmVjb21tZW5kZWQ6cmVnaW9uPXRlc3QtcmVnaW9uJzogJ3tcImltYWdlX2lkXCI6IFwiYW1pLTEyMzRcIn0nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljL21heC1sZW5cbiAgICAnYW1pOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVycy5pbWFnZS10eXBlLjA9bWFjaGluZTpmaWx0ZXJzLm5hbWUuMD1hbXpuLWFtaS12cGMtbmF0LSo6ZmlsdGVycy5zdGF0ZS4wPWF2YWlsYWJsZTpvd25lcnMuMD1hbWF6b246cmVnaW9uPXRlc3QtcmVnaW9uJzogJ2FtaS0xMjM0JyxcbiAgICAndnBjLXByb3ZpZGVyOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVyLmlzRGVmYXVsdD10cnVlOnJlZ2lvbj10ZXN0LXJlZ2lvbjpyZXR1cm5Bc3ltbWV0cmljU3VibmV0cz10cnVlJzoge1xuICAgICAgdnBjSWQ6ICd2cGMtNjA5MDA5MDUnLFxuICAgICAgc3VibmV0R3JvdXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnUHVibGljJyxcbiAgICAgICAgICBuYW1lOiAnUHVibGljJyxcbiAgICAgICAgICBzdWJuZXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN1Ym5ldElkOiAnc3VibmV0LWUxOTQ1NWNhJyxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogJ3VzLWVhc3QtMWEnLFxuICAgICAgICAgICAgICByb3V0ZVRhYmxlSWQ6ICdydGItZTE5NDU1Y2EnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3VibmV0SWQ6ICdzdWJuZXQtZTBjMjQ3OTcnLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiAndXMtZWFzdC0xYicsXG4gICAgICAgICAgICAgIHJvdXRlVGFibGVJZDogJ3J0Yi1lMGMyNDc5NycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdWJuZXRJZDogJ3N1Ym5ldC1jY2Q3NzM5NScsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6ICd1cy1lYXN0LTFjJyxcbiAgICAgICAgICAgICAgcm91dGVUYWJsZUlkOiAncnRiLWNjZDc3Mzk1JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbiAgZW52OiB7XG4gICAgQ0RLX0lOVEVHX0FDQ09VTlQ6ICcxMjM0NTY3OCcsXG4gICAgQ0RLX0lOVEVHX1JFR0lPTjogJ3Rlc3QtcmVnaW9uJyxcbiAgICBDREtfSU5URUdfSE9TVEVEX1pPTkVfSUQ6ICdaMjNBQkM0WFlaTDA1QicsXG4gICAgQ0RLX0lOVEVHX0hPU1RFRF9aT05FX05BTUU6ICdleGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0RPTUFJTl9OQU1FOiAnKi5leGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0NFUlRfQVJOOiAnYXJuOmF3czphY206dGVzdC1yZWdpb246MTIzNDU2Nzg6Y2VydGlmaWNhdGUvODY0NjgyMDktYTI3Mi01OTVkLWI4MzEtMGVmYjY0MjEyNjV6JyxcbiAgICBDREtfSU5URUdfU1VCTkVUX0lEOiAnc3VibmV0LTBkZmYxYTM5OWQ4ZjZmOTJjJyxcbiAgfSxcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBjdXJyZW50bHkgcmVjb21tZW5kZWQgZmxhZ3MgZm9yIGBhd3MtY2RrLWxpYmAuXG4gKlxuICogVGhlc2UgaGF2ZSBiZWVuIGJ1aWx0IGludG8gdGhlIENMSSBhdCBidWlsZCB0aW1lLiBJZiB0aGlzIGV2ZXIgZ2V0cyBjaGFuZ2VkXG4gKiBiYWNrIHRvIGEgZHluYW1pYyBsb2FkLCByZW1lbWJlciB0aGF0IHRoaXMgc291cmNlIGZpbGUgbWF5IGJlIGJ1bmRsZWQgaW50b1xuICogYSBKYXZhU2NyaXB0IGJ1bmRsZSwgYW5kIGBfX2Rpcm5hbWVgIG1pZ2h0IG5vdCBwb2ludCB3aGVyZSB5b3UgdGhpbmsgaXQgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRseVJlY29tbWVuZGVkQXdzQ2RrTGliRmxhZ3MoKSB7XG4gIHJldHVybiByZWNvbW1lbmRlZEZsYWdzRmlsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbmFwc2hvdEFuZFRlc3REZWZpbml0aW9uIHtcbiAgcmVhZG9ubHkgdGVzdERlZmluaXRpb246IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG4gIHJlYWRvbmx5IHNuYXBzaG90RGlyZWN0b3J5OiBzdHJpbmc7XG59XG4iXX0=