@aws-cdk/integ-runner
Advanced tools
| import type { TestCase, DefaultCdkOptions } from '@aws-cdk/cloud-assembly-schema'; | ||
| import { IntegTestSuite, LegacyIntegTestSuite } from './integ-test-suite'; | ||
| import type { IntegTest } from './integration-tests'; | ||
| import type { ICdk } from '../engines/cdk-interface'; | ||
| import type { DestructiveChange } from '../workers/common'; | ||
| /** | ||
| * Options for creating an integ helper | ||
| */ | ||
| export interface CdkIntegHelperOptions { | ||
| /** | ||
| * Information about the test to run | ||
| */ | ||
| readonly test: IntegTest; | ||
| /** | ||
| * The region where the test should be deployed | ||
| */ | ||
| readonly region: string; | ||
| /** | ||
| * The AWS profile to use when invoking the CDK CLI | ||
| * | ||
| * @default - no profile is passed, the default profile is used | ||
| */ | ||
| readonly profile?: string; | ||
| /** | ||
| * Additional environment variables that will be available | ||
| * to the CDK CLI | ||
| * | ||
| * @default - no additional environment variables | ||
| */ | ||
| readonly env?: { | ||
| [name: string]: string; | ||
| }; | ||
| /** | ||
| * tmp cdk.out directory | ||
| * | ||
| * @default - directory will be `cdk-integ.out.${testName}` | ||
| */ | ||
| readonly integOutDir?: string; | ||
| /** | ||
| * Instance of the CDK Toolkit Engine to use | ||
| * | ||
| * @default - based on `engine` option | ||
| */ | ||
| readonly cdk?: ICdk; | ||
| /** | ||
| * Show output from running integration tests | ||
| * | ||
| * @default false | ||
| */ | ||
| readonly showOutput?: boolean; | ||
| /** | ||
| * Use the indicated proxy | ||
| * | ||
| * @default - no proxy | ||
| */ | ||
| readonly proxy?: string; | ||
| /** | ||
| * Path to CA certificate to use when validating HTTPS requests | ||
| * | ||
| * @default - no additional CA bundle | ||
| */ | ||
| readonly caBundlePath?: string; | ||
| } | ||
| /** | ||
| * Whether to synthesize the actual snapshot with lookups enabled or not. | ||
| * | ||
| * If either `true` or `false`, we send context in or not while synthesizing, | ||
| * and if the generated snapshot test definition requests a different value we | ||
| * will synth again. | ||
| * | ||
| * For `dont-care`, we do send in the context but we never resynth. | ||
| */ | ||
| export type LegacyEnableLookups = true | false | 'dont-care'; | ||
| /** | ||
| * Class with some helper routines for running CDK snapshots and integration tests. | ||
| * | ||
| * A "golden snapshot" is the snapshot that is stored permanently in version | ||
| * control, that new runs are compared against (stored in a directory named | ||
| * `<test-name>.snapshot`). | ||
| * | ||
| * This is as opposed to other snapshots, which can be generated for example | ||
| * temporarily in a temporary directory, to compare agains the golden snapshot. | ||
| */ | ||
| export declare class CdkIntegHelper { | ||
| /** | ||
| * Factory method to create an instance of the CdkIntegHelper. | ||
| * | ||
| * Hiding the constructor to prevent inheritance. | ||
| */ | ||
| static create(options: CdkIntegHelperOptions): CdkIntegHelper; | ||
| /** | ||
| * The directory where the golden snapshot will be stored | ||
| */ | ||
| readonly goldenSnapshotDir: string; | ||
| /** | ||
| * An instance of the CDK CLI | ||
| */ | ||
| readonly cdk: ICdk; | ||
| /** | ||
| * Pretty name of the test | ||
| */ | ||
| readonly testName: string; | ||
| /** | ||
| * The value used in the '--app' CLI parameter | ||
| * | ||
| * Path to the integ test source file, relative to `this.directory`. | ||
| */ | ||
| readonly cdkApp: string; | ||
| /** | ||
| * The path where the `cdk.context.json` file | ||
| * will be created | ||
| */ | ||
| readonly cdkContextPath: string; | ||
| /** | ||
| * The working directory that the integration tests will be | ||
| * executed from | ||
| */ | ||
| readonly directory: string; | ||
| /** | ||
| * The test to run | ||
| */ | ||
| private readonly test; | ||
| /** | ||
| * Default options to pass to the CDK CLI | ||
| */ | ||
| readonly defaultArgs: DefaultCdkOptions; | ||
| /** | ||
| * The directory where the CDK will be synthed to | ||
| * | ||
| * Relative to cwd. | ||
| */ | ||
| readonly cdkOutDir: string; | ||
| /** | ||
| * The profile to use for the CDK CLI calls | ||
| */ | ||
| readonly profile?: string; | ||
| /** | ||
| * Show output from the integ test run. | ||
| */ | ||
| private readonly showOutput; | ||
| _destructiveChanges?: DestructiveChange[]; | ||
| private legacyContext?; | ||
| private _expectedTestSuite?; | ||
| private _actualSnapshot?; | ||
| private _legacyEnableLookups?; | ||
| /** | ||
| * Private constructor to prevent inheritance. | ||
| */ | ||
| private constructor(); | ||
| /** | ||
| * Configure the legacy enableLookups value to use when generating the actual snapshot. | ||
| * | ||
| * Must be set before using snapshot methods. | ||
| */ | ||
| configureLegacyEnableLookups(enableLookups: LegacyEnableLookups): void; | ||
| /** | ||
| * Return the list of actual (i.e. new) test cases for this integration test | ||
| */ | ||
| actualTests(): Promise<{ | ||
| [testName: string]: TestCase; | ||
| } | undefined>; | ||
| /** | ||
| * Generate a new "actual" snapshot which will be compared to the | ||
| * existing "expected" snapshot | ||
| * This will synth and then load the integration test manifest | ||
| */ | ||
| private generateActualSnapshot; | ||
| /** | ||
| * Synth the actual application to the given directory, for purposes of generating/validating a snapshot | ||
| * | ||
| * `legacyEnableLookups` is to preserve historical behavior for a while: | ||
| * traditionally, the application would only be seeded with context if | ||
| * `enableLookups` was true, and this information would come from the test | ||
| * definition. | ||
| * | ||
| * - Since the test definition comes from inside the app, this requires a | ||
| * synth just to get the test definition, and then another synth to generate | ||
| * the actual snapshot with the correct context, which is time consuming. | ||
| * - Given that the context is fixed and fake, it could always have been passed. | ||
| * | ||
| * However, the snapshot contents themselves depend on the context flag, and changing | ||
| * this behavior now invalidates all snapshots everywhere, which is annoying for upgrading. | ||
| * | ||
| * So we will use the behavior from the GOLDEN SNAPSHOT's test definition to | ||
| * determine whether to pass the context, and if the new actual snapshot has a | ||
| * different value for `enableLookups`, we will throw away the old snapshot and synth again. | ||
| */ | ||
| private synthActualSnapshot; | ||
| actualSynthReproCommand(): string[]; | ||
| /** | ||
| * Returns true if a snapshot already exists for this test | ||
| */ | ||
| hasSnapshot(): boolean; | ||
| /** | ||
| * The test suite from the existing snapshot | ||
| */ | ||
| expectedTestSuite(): Promise<IntegTestSuite | LegacyIntegTestSuite | undefined>; | ||
| actualSnapshot(): Promise<SnapshotAndTestDefinition>; | ||
| /** | ||
| * The test suite from the new "actual" snapshot | ||
| */ | ||
| private actualTestSuite; | ||
| /** | ||
| * Load the integ manifest which contains information | ||
| * on how to execute the tests | ||
| * First we try and load the manifest from the integ manifest (i.e. integ.json) | ||
| * from the cloud assembly. If it doesn't exist, then we fallback to the | ||
| * "legacy mode" and create a manifest from pragma | ||
| */ | ||
| loadManifest(dir?: string): Promise<IntegTestSuite | LegacyIntegTestSuite>; | ||
| cleanup(): void; | ||
| /** | ||
| * If there are any destructive changes to a stack then this will record | ||
| * those in the manifest.json file | ||
| */ | ||
| private renderTraceData; | ||
| /** | ||
| * In cases where we do not want to retain the assets, | ||
| * for example, if the assets are very large. | ||
| * | ||
| * Since it is possible to disable the update workflow for individual test | ||
| * cases, this needs to first get a list of stacks that have the update workflow | ||
| * disabled and then delete assets that relate to that stack. It does that | ||
| * by reading the asset manifest for the stack and deleting the asset source | ||
| */ | ||
| private removeAssetsFromSnapshot; | ||
| /** | ||
| * Remove the asset cache (.cache/) files from the snapshot. | ||
| * These are a cache of the asset zips, but we are fine with | ||
| * re-zipping on deploy | ||
| */ | ||
| private removeAssetsCacheFromSnapshot; | ||
| /** | ||
| * Create the new snapshot. | ||
| * | ||
| * If lookups are enabled, then we need create the snapshot by synth'ing again | ||
| * with the dummy context so that each time the test is run on different machines | ||
| * (and with different context/env) the diff will not change. | ||
| * | ||
| * If lookups are disabled (which means the stack is env agnostic) then just copy | ||
| * the assembly that was output by the deployment | ||
| */ | ||
| createSnapshot(): Promise<void>; | ||
| /** | ||
| * Perform some cleanup steps after the snapshot is created | ||
| * Anytime the snapshot needs to be modified after creation | ||
| * the logic should live here. | ||
| */ | ||
| private cleanupGoldenSnapshot; | ||
| getContext(additionalContext?: Record<string, any>): Record<string, any>; | ||
| } | ||
| export declare const DEFAULT_SYNTH_OPTIONS: { | ||
| context: { | ||
| "aws:cdk:availability-zones:fallback": string[]; | ||
| 'availability-zones:account=12345678:region=test-region': string[]; | ||
| 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2:region=test-region': string; | ||
| 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2:region=test-region': string; | ||
| 'ssm:account=12345678:parameterName=/aws/service/ecs/optimized-ami/amazon-linux/recommended:region=test-region': string; | ||
| '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': string; | ||
| 'vpc-provider:account=12345678:filter.isDefault=true:region=test-region:returnAsymmetricSubnets=true': { | ||
| vpcId: string; | ||
| subnetGroups: { | ||
| type: string; | ||
| name: string; | ||
| subnets: { | ||
| subnetId: string; | ||
| availabilityZone: string; | ||
| routeTableId: string; | ||
| }[]; | ||
| }[]; | ||
| }; | ||
| }; | ||
| env: { | ||
| CDK_INTEG_ACCOUNT: string; | ||
| CDK_INTEG_REGION: string; | ||
| CDK_INTEG_HOSTED_ZONE_ID: string; | ||
| CDK_INTEG_HOSTED_ZONE_NAME: string; | ||
| CDK_INTEG_DOMAIN_NAME: string; | ||
| CDK_INTEG_CERT_ARN: string; | ||
| CDK_INTEG_SUBNET_ID: string; | ||
| }; | ||
| }; | ||
| /** | ||
| * Return the currently recommended flags for `aws-cdk-lib`. | ||
| * | ||
| * These have been built into the CLI at build time. If this ever gets changed | ||
| * back to a dynamic load, remember that this source file may be bundled into | ||
| * a JavaScript bundle, and `__dirname` might not point where you think it does. | ||
| */ | ||
| export declare function currentlyRecommendedAwsCdkLibFlags(): { | ||
| "@aws-cdk/aws-signer:signingProfileNamePassedToCfn": boolean; | ||
| "@aws-cdk/aws-ecs-patterns:secGroupsDisablesImplicitOpenListener": boolean; | ||
| "@aws-cdk/aws-lambda:recognizeLayerVersion": boolean; | ||
| "@aws-cdk/core:checkSecretUsage": boolean; | ||
| "@aws-cdk/core:target-partitions": string[]; | ||
| "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": boolean; | ||
| "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": boolean; | ||
| "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": boolean; | ||
| "@aws-cdk/aws-iam:minimizePolicies": boolean; | ||
| "@aws-cdk/core:validateSnapshotRemovalPolicy": boolean; | ||
| "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": boolean; | ||
| "@aws-cdk/aws-s3:createDefaultLoggingPolicy": boolean; | ||
| "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": boolean; | ||
| "@aws-cdk/aws-apigateway:disableCloudWatchRole": boolean; | ||
| "@aws-cdk/core:enablePartitionLiterals": boolean; | ||
| "@aws-cdk/aws-events:eventsTargetQueueSameAccount": boolean; | ||
| "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": boolean; | ||
| "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": boolean; | ||
| "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": boolean; | ||
| "@aws-cdk/aws-route53-patters:useCertificate": boolean; | ||
| "@aws-cdk/customresources:installLatestAwsSdkDefault": boolean; | ||
| "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": boolean; | ||
| "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": boolean; | ||
| "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": boolean; | ||
| "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": boolean; | ||
| "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": boolean; | ||
| "@aws-cdk/aws-redshift:columnId": boolean; | ||
| "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": boolean; | ||
| "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": boolean; | ||
| "@aws-cdk/aws-apigateway:requestValidatorUniqueId": boolean; | ||
| "@aws-cdk/aws-kms:aliasNameRef": boolean; | ||
| "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": boolean; | ||
| "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": boolean; | ||
| "@aws-cdk/core:includePrefixInUniqueNameGeneration": boolean; | ||
| "@aws-cdk/aws-efs:denyAnonymousAccess": boolean; | ||
| "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": boolean; | ||
| "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": boolean; | ||
| "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": boolean; | ||
| "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": boolean; | ||
| "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": boolean; | ||
| "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": boolean; | ||
| "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": boolean; | ||
| "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": boolean; | ||
| "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": boolean; | ||
| "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": boolean; | ||
| "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": boolean; | ||
| "@aws-cdk/aws-eks:nodegroupNameAttribute": boolean; | ||
| "@aws-cdk/aws-eks:useNativeOidcProvider": boolean; | ||
| "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": boolean; | ||
| "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": boolean; | ||
| "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": boolean; | ||
| "@aws-cdk/aws-s3:keepNotificationInImportedBucket": boolean; | ||
| "@aws-cdk/core:explicitStackTags": boolean; | ||
| "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": boolean; | ||
| "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": boolean; | ||
| "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": boolean; | ||
| "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": boolean; | ||
| "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": boolean; | ||
| "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": boolean; | ||
| "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": boolean; | ||
| "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": boolean; | ||
| "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": boolean; | ||
| "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": boolean; | ||
| "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": boolean; | ||
| "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": boolean; | ||
| "@aws-cdk/core:enableAdditionalMetadataCollection": boolean; | ||
| "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": boolean; | ||
| "@aws-cdk/aws-s3:setUniqueReplicationRoleName": boolean; | ||
| "@aws-cdk/aws-events:requireEventBusPolicySid": boolean; | ||
| "@aws-cdk/core:aspectPrioritiesMutating": boolean; | ||
| "@aws-cdk/aws-dynamodb:retainTableReplica": boolean; | ||
| "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": boolean; | ||
| "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": boolean; | ||
| "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": boolean; | ||
| "@aws-cdk/aws-s3:publicAccessBlockedByDefault": boolean; | ||
| "@aws-cdk/aws-lambda:useCdkManagedLogGroup": boolean; | ||
| "@aws-cdk/aws-elasticloadbalancingv2:networkLoadBalancerWithSecurityGroupByDefault": boolean; | ||
| "@aws-cdk/aws-ecs-patterns:uniqueTargetGroupId": boolean; | ||
| "@aws-cdk/aws-route53-patterns:useDistribution": boolean; | ||
| "@aws-cdk/aws-cloudfront:defaultFunctionRuntimeV2_0": boolean; | ||
| "@aws-cdk/aws-elasticloadbalancingv2:usePostQuantumTlsPolicy": boolean; | ||
| "@aws-cdk/aws-batch:defaultToAL2023": boolean; | ||
| "@aws-cdk/core:annotationsInValidationReport": boolean; | ||
| }; | ||
| export interface SnapshotAndTestDefinition { | ||
| readonly testDefinition: IntegTestSuite | LegacyIntegTestSuite; | ||
| readonly snapshotDirectory: string; | ||
| } | ||
| //# sourceMappingURL=cdk-integ-helper.d.ts.map |
| {"version":3,"file":"cdk-integ-helper.d.ts","sourceRoot":"","sources":["cdk-integ-helper.ts"],"names":[],"mappings":"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"} |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.DEFAULT_SYNTH_OPTIONS = exports.CdkIntegHelper = void 0; | ||
| exports.currentlyRecommendedAwsCdkLibFlags = currentlyRecommendedAwsCdkLibFlags; | ||
| /* eslint-disable @cdklabs/no-literal-partition */ | ||
| const path = require("path"); | ||
| const cloud_assembly_api_1 = require("@aws-cdk/cloud-assembly-api"); | ||
| const fs = require("fs-extra"); | ||
| const integ_test_suite_1 = require("./integ-test-suite"); | ||
| const recommendedFlagsFile = require("../recommended-feature-flags.json"); | ||
| const utils_1 = require("../utils"); | ||
| const engine_1 = require("./engine"); | ||
| const logger = require("../logger"); | ||
| const cloud_assembly_1 = require("./private/cloud-assembly"); | ||
| const integ_manifest_1 = require("./private/integ-manifest"); | ||
| const DESTRUCTIVE_CHANGES = '!!DESTRUCTIVE_CHANGES:'; | ||
| /** | ||
| * Class with some helper routines for running CDK snapshots and integration tests. | ||
| * | ||
| * A "golden snapshot" is the snapshot that is stored permanently in version | ||
| * control, that new runs are compared against (stored in a directory named | ||
| * `<test-name>.snapshot`). | ||
| * | ||
| * This is as opposed to other snapshots, which can be generated for example | ||
| * temporarily in a temporary directory, to compare agains the golden snapshot. | ||
| */ | ||
| class CdkIntegHelper { | ||
| /** | ||
| * Factory method to create an instance of the CdkIntegHelper. | ||
| * | ||
| * Hiding the constructor to prevent inheritance. | ||
| */ | ||
| static create(options) { | ||
| return new CdkIntegHelper(options); | ||
| } | ||
| /** | ||
| * The directory where the golden snapshot will be stored | ||
| */ | ||
| goldenSnapshotDir; | ||
| /** | ||
| * An instance of the CDK CLI | ||
| */ | ||
| cdk; | ||
| /** | ||
| * Pretty name of the test | ||
| */ | ||
| testName; | ||
| /** | ||
| * The value used in the '--app' CLI parameter | ||
| * | ||
| * Path to the integ test source file, relative to `this.directory`. | ||
| */ | ||
| cdkApp; | ||
| /** | ||
| * The path where the `cdk.context.json` file | ||
| * will be created | ||
| */ | ||
| cdkContextPath; | ||
| /** | ||
| * The working directory that the integration tests will be | ||
| * executed from | ||
| */ | ||
| directory; | ||
| /** | ||
| * The test to run | ||
| */ | ||
| test; | ||
| /** | ||
| * Default options to pass to the CDK CLI | ||
| */ | ||
| defaultArgs = { | ||
| pathMetadata: false, | ||
| assetMetadata: false, | ||
| versionReporting: false, | ||
| }; | ||
| /** | ||
| * The directory where the CDK will be synthed to | ||
| * | ||
| * Relative to cwd. | ||
| */ | ||
| cdkOutDir; | ||
| /** | ||
| * The profile to use for the CDK CLI calls | ||
| */ | ||
| profile; | ||
| /** | ||
| * Show output from the integ test run. | ||
| */ | ||
| showOutput; | ||
| _destructiveChanges; | ||
| legacyContext; | ||
| _expectedTestSuite; | ||
| _actualSnapshot; | ||
| _legacyEnableLookups; | ||
| /** | ||
| * Private constructor to prevent inheritance. | ||
| */ | ||
| constructor(options) { | ||
| this.test = options.test; | ||
| this.directory = this.test.directory; | ||
| this.testName = this.test.testName; | ||
| this.goldenSnapshotDir = this.test.snapshotDir; | ||
| this.cdkContextPath = path.join(this.directory, 'cdk.context.json'); | ||
| this.profile = options.profile; | ||
| this.showOutput = options.showOutput ?? false; | ||
| this.cdk = options.cdk ?? (0, engine_1.makeEngine)(options); | ||
| this.cdkOutDir = options.integOutDir ?? this.test.temporaryOutputDir; | ||
| const testRunCommand = this.test.appCommand; | ||
| this.cdkApp = testRunCommand.replace('{filePath}', path.relative(this.directory, this.test.fileName)); | ||
| } | ||
| /** | ||
| * Configure the legacy enableLookups value to use when generating the actual snapshot. | ||
| * | ||
| * Must be set before using snapshot methods. | ||
| */ | ||
| configureLegacyEnableLookups(enableLookups) { | ||
| this._legacyEnableLookups = enableLookups; | ||
| } | ||
| /** | ||
| * Return the list of actual (i.e. new) test cases for this integration test | ||
| */ | ||
| async actualTests() { | ||
| return (await this.actualTestSuite()).testSuite; | ||
| } | ||
| /** | ||
| * Generate a new "actual" snapshot which will be compared to the | ||
| * existing "expected" snapshot | ||
| * This will synth and then load the integration test manifest | ||
| */ | ||
| async generateActualSnapshot() { | ||
| await this.synthActualSnapshot(this.cdkOutDir); | ||
| const manifest = await this.loadManifest(this.cdkOutDir); | ||
| return { | ||
| testDefinition: manifest, | ||
| snapshotDirectory: this.cdkOutDir, | ||
| }; | ||
| } | ||
| /** | ||
| * Synth the actual application to the given directory, for purposes of generating/validating a snapshot | ||
| * | ||
| * `legacyEnableLookups` is to preserve historical behavior for a while: | ||
| * traditionally, the application would only be seeded with context if | ||
| * `enableLookups` was true, and this information would come from the test | ||
| * definition. | ||
| * | ||
| * - Since the test definition comes from inside the app, this requires a | ||
| * synth just to get the test definition, and then another synth to generate | ||
| * the actual snapshot with the correct context, which is time consuming. | ||
| * - Given that the context is fixed and fake, it could always have been passed. | ||
| * | ||
| * However, the snapshot contents themselves depend on the context flag, and changing | ||
| * this behavior now invalidates all snapshots everywhere, which is annoying for upgrading. | ||
| * | ||
| * So we will use the behavior from the GOLDEN SNAPSHOT's test definition to | ||
| * determine whether to pass the context, and if the new actual snapshot has a | ||
| * different value for `enableLookups`, we will throw away the old snapshot and synth again. | ||
| */ | ||
| async synthActualSnapshot(outputDirectory) { | ||
| if (this._legacyEnableLookups === undefined) { | ||
| throw new Error('Must call configureLegacyEnableLookups before generating snapshots'); | ||
| } | ||
| await this.cdk.synth({ | ||
| app: this.cdkApp, | ||
| context: this.getContext(this._legacyEnableLookups !== false ? exports.DEFAULT_SYNTH_OPTIONS.context : {}), | ||
| env: exports.DEFAULT_SYNTH_OPTIONS.env, | ||
| output: path.relative(this.directory, outputDirectory), | ||
| }); | ||
| } | ||
| actualSynthReproCommand() { | ||
| // Show the command necessary to repro this | ||
| const envSet = Object.entries(exports.DEFAULT_SYNTH_OPTIONS.env).map(([k, v]) => `${k}='${v}'`); | ||
| const envCmd = envSet.length > 0 ? ['env', ...envSet] : []; | ||
| return [ | ||
| ...envCmd, | ||
| 'cdk', | ||
| 'synth', | ||
| '-a', | ||
| `'${this.cdkApp}'`, | ||
| '-o', | ||
| `'${this.cdkOutDir}'`, | ||
| ...Object.entries(this.getContext(exports.DEFAULT_SYNTH_OPTIONS.context)).flatMap(([k, v]) => typeof v !== 'object' ? [`-c '${k}=${v}'`] : []), | ||
| ]; | ||
| } | ||
| /** | ||
| * Returns true if a snapshot already exists for this test | ||
| */ | ||
| hasSnapshot() { | ||
| return fs.existsSync(this.goldenSnapshotDir); | ||
| } | ||
| /** | ||
| * The test suite from the existing snapshot | ||
| */ | ||
| async expectedTestSuite() { | ||
| if (!this._expectedTestSuite && this.hasSnapshot()) { | ||
| this._expectedTestSuite = await this.loadManifest(); | ||
| } | ||
| return this._expectedTestSuite; | ||
| } | ||
| async actualSnapshot() { | ||
| if (!this._actualSnapshot) { | ||
| this._actualSnapshot = await this.generateActualSnapshot(); | ||
| // Check if the enableLookups value has changed between the golden | ||
| // snapshot and the actual snapshot. If it has, we need to re-synth the | ||
| // actual snapshot with the new enableLookups value. | ||
| // | ||
| // See `synthActualSnapshot` for a description of why this is necessary. | ||
| const actualEnableLookups = this._actualSnapshot.testDefinition.enableLookups ?? false; | ||
| if (actualEnableLookups !== this._legacyEnableLookups && this._legacyEnableLookups !== 'dont-care') { | ||
| this.configureLegacyEnableLookups(actualEnableLookups); | ||
| this._actualSnapshot = await this.generateActualSnapshot(); | ||
| } | ||
| } | ||
| return this._actualSnapshot; | ||
| } | ||
| /** | ||
| * The test suite from the new "actual" snapshot | ||
| */ | ||
| async actualTestSuite() { | ||
| return (await this.actualSnapshot()).testDefinition; | ||
| } | ||
| /** | ||
| * Load the integ manifest which contains information | ||
| * on how to execute the tests | ||
| * First we try and load the manifest from the integ manifest (i.e. integ.json) | ||
| * from the cloud assembly. If it doesn't exist, then we fallback to the | ||
| * "legacy mode" and create a manifest from pragma | ||
| */ | ||
| async loadManifest(dir) { | ||
| const manifest = dir ?? this.goldenSnapshotDir; | ||
| try { | ||
| const testSuite = integ_test_suite_1.IntegTestSuite.fromPath(manifest); | ||
| return testSuite; | ||
| } | ||
| catch (modernError) { | ||
| // Only attempt legacy test case if the integ test manifest was not found | ||
| // For any other errors, e.g. when parsing the manifest fails, we abort. | ||
| if (!(modernError instanceof integ_manifest_1.NoManifestError)) { | ||
| throw modernError; | ||
| } | ||
| if (this.showOutput) { | ||
| logger.trace("Failed to load integ test manifest for '%s'. Attempting as deprecated legacy test instead. Error was: %s", manifest, modernError.message ?? String(modernError)); | ||
| } | ||
| const testCases = await integ_test_suite_1.LegacyIntegTestSuite.fromLegacy({ | ||
| cdk: this.cdk, | ||
| testName: this.test.normalizedTestName, | ||
| integSourceFilePath: this.test.fileName, | ||
| listOptions: { | ||
| ...this.defaultArgs, | ||
| all: true, | ||
| app: this.cdkApp, | ||
| profile: this.profile, | ||
| output: path.relative(this.directory, this.cdkOutDir), | ||
| }, | ||
| }); | ||
| this.legacyContext = integ_test_suite_1.LegacyIntegTestSuite.getPragmaContext(this.test.fileName); | ||
| return testCases; | ||
| } | ||
| } | ||
| cleanup() { | ||
| const cdkOutPath = this.cdkOutDir; | ||
| if (fs.existsSync(cdkOutPath)) { | ||
| fs.removeSync(cdkOutPath); | ||
| } | ||
| // Clear cache | ||
| this._actualSnapshot = undefined; | ||
| } | ||
| /** | ||
| * If there are any destructive changes to a stack then this will record | ||
| * those in the manifest.json file | ||
| */ | ||
| renderTraceData() { | ||
| const traceData = new Map(); | ||
| const destructiveChanges = this._destructiveChanges ?? []; | ||
| destructiveChanges.forEach(change => { | ||
| const trace = traceData.get(change.stackName); | ||
| if (trace) { | ||
| trace.set(change.logicalId, `${DESTRUCTIVE_CHANGES} ${change.impact}`); | ||
| } | ||
| else { | ||
| traceData.set(change.stackName, new Map([ | ||
| [change.logicalId, `${DESTRUCTIVE_CHANGES} ${change.impact}`], | ||
| ])); | ||
| } | ||
| }); | ||
| return traceData; | ||
| } | ||
| /** | ||
| * In cases where we do not want to retain the assets, | ||
| * for example, if the assets are very large. | ||
| * | ||
| * Since it is possible to disable the update workflow for individual test | ||
| * cases, this needs to first get a list of stacks that have the update workflow | ||
| * disabled and then delete assets that relate to that stack. It does that | ||
| * by reading the asset manifest for the stack and deleting the asset source | ||
| */ | ||
| async removeAssetsFromSnapshot() { | ||
| const stacks = (await this.actualTestSuite()).getStacksWithoutUpdateWorkflow() ?? []; | ||
| const manifest = cloud_assembly_1.AssemblyManifestReader.fromPath(this.goldenSnapshotDir); | ||
| const assets = (0, utils_1.flatten)(stacks.map(stack => { | ||
| return manifest.getAssetLocationsForStack(stack) ?? []; | ||
| })); | ||
| assets.forEach(asset => { | ||
| const fileName = path.join(this.goldenSnapshotDir, asset); | ||
| if (fs.existsSync(fileName)) { | ||
| if (fs.lstatSync(fileName).isDirectory()) { | ||
| fs.removeSync(fileName); | ||
| } | ||
| else { | ||
| fs.unlinkSync(fileName); | ||
| } | ||
| } | ||
| }); | ||
| } | ||
| /** | ||
| * Remove the asset cache (.cache/) files from the snapshot. | ||
| * These are a cache of the asset zips, but we are fine with | ||
| * re-zipping on deploy | ||
| */ | ||
| removeAssetsCacheFromSnapshot() { | ||
| const files = fs.readdirSync(this.goldenSnapshotDir); | ||
| files.forEach(file => { | ||
| const fileName = path.join(this.goldenSnapshotDir, file); | ||
| if (fs.lstatSync(fileName).isDirectory() && file === '.cache') { | ||
| fs.emptyDirSync(fileName); | ||
| fs.rmdirSync(fileName); | ||
| } | ||
| }); | ||
| } | ||
| /** | ||
| * Create the new snapshot. | ||
| * | ||
| * If lookups are enabled, then we need create the snapshot by synth'ing again | ||
| * with the dummy context so that each time the test is run on different machines | ||
| * (and with different context/env) the diff will not change. | ||
| * | ||
| * If lookups are disabled (which means the stack is env agnostic) then just copy | ||
| * the assembly that was output by the deployment | ||
| */ | ||
| async createSnapshot() { | ||
| if (fs.existsSync(this.goldenSnapshotDir)) { | ||
| fs.removeSync(this.goldenSnapshotDir); | ||
| } | ||
| // TODO: If we're clever, we should be able to reuse the snapshot that was | ||
| // generated during the test invalidation check and avoid the below synth. | ||
| // But that gets run in a completely different lifecycle and it might not | ||
| // exist. We're not dealing with that just yet. | ||
| await this.synthActualSnapshot(this.goldenSnapshotDir); | ||
| await this.cleanupGoldenSnapshot(); | ||
| } | ||
| /** | ||
| * Perform some cleanup steps after the snapshot is created | ||
| * Anytime the snapshot needs to be modified after creation | ||
| * the logic should live here. | ||
| */ | ||
| async cleanupGoldenSnapshot() { | ||
| if (fs.existsSync(this.goldenSnapshotDir)) { | ||
| await this.removeAssetsFromSnapshot(); | ||
| this.removeAssetsCacheFromSnapshot(); | ||
| const assembly = cloud_assembly_1.AssemblyManifestReader.fromPath(this.goldenSnapshotDir); | ||
| assembly.cleanManifest(); | ||
| assembly.recordTrace(this.renderTraceData()); | ||
| } | ||
| // if this is a legacy test then create an integ manifest | ||
| // in the snapshot directory which can be used for the | ||
| // update workflow. Save any legacyContext as well so that it can be read | ||
| // the next time | ||
| const actualTestSuite = await this.actualTestSuite(); | ||
| if (actualTestSuite.type === 'legacy-test-suite') { | ||
| actualTestSuite.saveManifest(this.goldenSnapshotDir, this.legacyContext); | ||
| } | ||
| } | ||
| getContext(additionalContext) { | ||
| return { | ||
| ...currentlyRecommendedAwsCdkLibFlags(), | ||
| ...this.legacyContext, | ||
| ...additionalContext, | ||
| // Don't record creation stack traces in the snapshot, since they just take up space and are never deterministic. | ||
| 'aws:cdk:disable-creation-stack-traces': true, | ||
| // We originally had PLANNED to set this to ['aws', 'aws-cn'], but due to a programming mistake | ||
| // it was set to everything. In this PR, set it to everything to not mess up all the snapshots. | ||
| '@aws-cdk/core:target-partitions': undefined, | ||
| /* ---------------- THE FUTURE LIVES BELOW---------------------------- | ||
| // Restricting to these target partitions makes most service principals synthesize to | ||
| // `service.${URL_SUFFIX}`, which is technically *incorrect* (it's only `amazonaws.com` | ||
| // or `amazonaws.com.cn`, never UrlSuffix for any of the restricted regions) but it's what | ||
| // most existing integ tests contain, and we want to disturb as few as possible. | ||
| // [TARGET_PARTITIONS]: ['aws', 'aws-cn'], | ||
| /* ---------------- END OF THE FUTURE ------------------------------- */ | ||
| }; | ||
| } | ||
| } | ||
| exports.CdkIntegHelper = CdkIntegHelper; | ||
| // Default context we run all integ tests with, so they don't depend on the | ||
| // account of the exercising user. | ||
| exports.DEFAULT_SYNTH_OPTIONS = { | ||
| context: { | ||
| [cloud_assembly_api_1.AVAILABILITY_ZONE_FALLBACK_CONTEXT_KEY]: ['test-region-1a', 'test-region-1b', 'test-region-1c'], | ||
| 'availability-zones:account=12345678:region=test-region': ['test-region-1a', 'test-region-1b', 'test-region-1c'], | ||
| 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2:region=test-region': 'ami-1234', | ||
| 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2:region=test-region': 'ami-1234', | ||
| 'ssm:account=12345678:parameterName=/aws/service/ecs/optimized-ami/amazon-linux/recommended:region=test-region': '{"image_id": "ami-1234"}', | ||
| // eslint-disable-next-line @stylistic/max-len | ||
| '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', | ||
| 'vpc-provider:account=12345678:filter.isDefault=true:region=test-region:returnAsymmetricSubnets=true': { | ||
| vpcId: 'vpc-60900905', | ||
| subnetGroups: [ | ||
| { | ||
| type: 'Public', | ||
| name: 'Public', | ||
| subnets: [ | ||
| { | ||
| subnetId: 'subnet-e19455ca', | ||
| availabilityZone: 'us-east-1a', | ||
| routeTableId: 'rtb-e19455ca', | ||
| }, | ||
| { | ||
| subnetId: 'subnet-e0c24797', | ||
| availabilityZone: 'us-east-1b', | ||
| routeTableId: 'rtb-e0c24797', | ||
| }, | ||
| { | ||
| subnetId: 'subnet-ccd77395', | ||
| availabilityZone: 'us-east-1c', | ||
| routeTableId: 'rtb-ccd77395', | ||
| }, | ||
| ], | ||
| }, | ||
| ], | ||
| }, | ||
| }, | ||
| env: { | ||
| CDK_INTEG_ACCOUNT: '12345678', | ||
| CDK_INTEG_REGION: 'test-region', | ||
| CDK_INTEG_HOSTED_ZONE_ID: 'Z23ABC4XYZL05B', | ||
| CDK_INTEG_HOSTED_ZONE_NAME: 'example.com', | ||
| CDK_INTEG_DOMAIN_NAME: '*.example.com', | ||
| CDK_INTEG_CERT_ARN: 'arn:aws:acm:test-region:12345678:certificate/86468209-a272-595d-b831-0efb6421265z', | ||
| CDK_INTEG_SUBNET_ID: 'subnet-0dff1a399d8f6f92c', | ||
| }, | ||
| }; | ||
| /** | ||
| * Return the currently recommended flags for `aws-cdk-lib`. | ||
| * | ||
| * These have been built into the CLI at build time. If this ever gets changed | ||
| * back to a dynamic load, remember that this source file may be bundled into | ||
| * a JavaScript bundle, and `__dirname` might not point where you think it does. | ||
| */ | ||
| function currentlyRecommendedAwsCdkLibFlags() { | ||
| return recommendedFlagsFile; | ||
| } | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWludGVnLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1pbnRlZy1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBNGpCQSxnRkFFQztBQTlqQkQsa0RBQWtEO0FBQ2xELDZCQUE2QjtBQUM3QixvRUFBcUY7QUFFckYsK0JBQStCO0FBQy9CLHlEQUEwRTtBQUUxRSwwRUFBMEU7QUFDMUUsb0NBQW1DO0FBQ25DLHFDQUFzQztBQUV0QyxvQ0FBb0M7QUFFcEMsNkRBQWtFO0FBRWxFLDZEQUEyRDtBQUUzRCxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDO0FBOEVyRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBOEI7UUFDakQsT0FBTyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDYSxpQkFBaUIsQ0FBUztJQUUxQzs7T0FFRztJQUNhLEdBQUcsQ0FBTztJQUUxQjs7T0FFRztJQUNhLFFBQVEsQ0FBUztJQUVqQzs7OztPQUlHO0lBQ2EsTUFBTSxDQUFTO0lBRS9COzs7T0FHRztJQUNhLGNBQWMsQ0FBUztJQUV2Qzs7O09BR0c7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYyxJQUFJLENBQVk7SUFFakM7O09BRUc7SUFDYSxXQUFXLEdBQXNCO1FBQy9DLFlBQVksRUFBRSxLQUFLO1FBQ25CLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLGdCQUFnQixFQUFFLEtBQUs7S0FDeEIsQ0FBQztJQUVGOzs7O09BSUc7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYSxPQUFPLENBQVU7SUFFakM7O09BRUc7SUFDYyxVQUFVLENBQVU7SUFFOUIsbUJBQW1CLENBQXVCO0lBQ3pDLGFBQWEsQ0FBdUI7SUFDcEMsa0JBQWtCLENBQXlDO0lBQzNELGVBQWUsQ0FBNkI7SUFDNUMs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QUNGO0tBQ0Y7SUFDRCxHQUFHLEVBQUU7UUFDSCxpQkFBaUIsRUFBRSxVQUFVO1FBQzdCLGdCQUFnQixFQUFFLGFBQWE7UUFDL0Isd0JBQXdCLEVBQUUsZ0JBQWdCO1FBQzFDLDBCQUEwQixFQUFFLGFBQWE7UUFDekMscUJBQXFCLEVBQUUsZUFBZTtRQUN0QyxrQkFBa0IsRUFBRSxtRkFBbUY7UUFDdkcsbUJBQW1CLEVBQUUsMEJBQTBCO0tBQ2hEO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILFNBQWdCLGtDQUFrQztJQUNoRCxPQUFPLG9CQUFvQixDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAY2RrbGFicy9uby1saXRlcmFsLXBhcnRpdGlvbiAqL1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB0eXBlIHsgVGVzdENhc2UsIERlZmF1bHRDZGtPcHRpb25zIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEludGVnVGVzdFN1aXRlLCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSB9IGZyb20gJy4vaW50ZWctdGVzdC1zdWl0ZSc7XG5pbXBvcnQgdHlwZSB7IEludGVnVGVzdCB9IGZyb20gJy4vaW50ZWdyYXRpb24tdGVzdHMnO1xuaW1wb3J0ICogYXMgcmVjb21tZW5kZWRGbGFnc0ZpbGUgZnJvbSAnLi4vcmVjb21tZW5kZWQtZmVhdHVyZS1mbGFncy5qc29uJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBtYWtlRW5naW5lIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBJQ2RrIH0gZnJvbSAnLi4vZW5naW5lcy9jZGstaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdFRyYWNlIH0gZnJvbSAnLi9wcml2YXRlL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB7IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIgfSBmcm9tICcuL3ByaXZhdGUvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBEZXN0cnVjdGl2ZUNoYW5nZSB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcbmltcG9ydCB7IE5vTWFuaWZlc3RFcnJvciB9IGZyb20gJy4vcHJpdmF0ZS9pbnRlZy1tYW5pZmVzdCc7XG5cbmNvbnN0IERFU1RSVUNUSVZFX0NIQU5HRVMgPSAnISFERVNUUlVDVElWRV9DSEFOR0VTOic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYW4gaW50ZWcgaGVscGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrSW50ZWdIZWxwZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXN0IHRvIHJ1blxuICAgKi9cbiAgcmVhZG9ubHkgdGVzdDogSW50ZWdUZXN0O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIHdoZXJlIHRoZSB0ZXN0IHNob3VsZCBiZSBkZXBsb3llZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgcHJvZmlsZSB0byB1c2Ugd2hlbiBpbnZva2luZyB0aGUgQ0RLIENMSVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb2ZpbGUgaXMgcGFzc2VkLCB0aGUgZGVmYXVsdCBwcm9maWxlIGlzIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBhdmFpbGFibGVcbiAgICogdG8gdGhlIENESyBDTElcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIHRtcCBjZGsub3V0IGRpcmVjdG9yeVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRpcmVjdG9yeSB3aWxsIGJlIGBjZGstaW50ZWcub3V0LiR7dGVzdE5hbWV9YFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZWdPdXREaXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluc3RhbmNlIG9mIHRoZSBDREsgVG9vbGtpdCBFbmdpbmUgdG8gdXNlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYmFzZWQgb24gYGVuZ2luZWAgb3B0aW9uXG4gICAqL1xuICByZWFkb25seSBjZGs/OiBJQ2RrO1xuXG4gIC8qKlxuICAgKiBTaG93IG91dHB1dCBmcm9tIHJ1bm5pbmcgaW50ZWdyYXRpb24gdGVzdHNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNob3dPdXRwdXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGluZGljYXRlZCBwcm94eVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb3h5XG4gICAqL1xuICByZWFkb25seSBwcm94eT86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBDQSBjZXJ0aWZpY2F0ZSB0byB1c2Ugd2hlbiB2YWxpZGF0aW5nIEhUVFBTIHJlcXVlc3RzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBDQSBidW5kbGVcbiAgICovXG4gIHJlYWRvbmx5IGNhQnVuZGxlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRvIHN5bnRoZXNpemUgdGhlIGFjdHVhbCBzbmFwc2hvdCB3aXRoIGxvb2t1cHMgZW5hYmxlZCBvciBub3QuXG4gKlxuICogSWYgZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgLCB3ZSBzZW5kIGNvbnRleHQgaW4gb3Igbm90IHdoaWxlIHN5bnRoZXNpemluZyxcbiAqIGFuZCBpZiB0aGUgZ2VuZXJhdGVkIHNuYXBzaG90IHRlc3QgZGVmaW5pdGlvbiByZXF1ZXN0cyBhIGRpZmZlcmVudCB2YWx1ZSB3ZVxuICogd2lsbCBzeW50aCBhZ2Fpbi5cbiAqXG4gKiBGb3IgYGRvbnQtY2FyZWAsIHdlIGRvIHNlbmQgaW4gdGhlIGNvbnRleHQgYnV0IHdlIG5ldmVyIHJlc3ludGguXG4gKi9cbmV4cG9ydCB0eXBlIExlZ2FjeUVuYWJsZUxvb2t1cHMgPSB0cnVlIHwgZmFsc2UgfCAnZG9udC1jYXJlJztcblxuLyoqXG4gKiBDbGFzcyB3aXRoIHNvbWUgaGVscGVyIHJvdXRpbmVzIGZvciBydW5uaW5nIENESyBzbmFwc2hvdHMgYW5kIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIEEgXCJnb2xkZW4gc25hcHNob3RcIiBpcyB0aGUgc25hcHNob3QgdGhhdCBpcyBzdG9yZWQgcGVybWFuZW50bHkgaW4gdmVyc2lvblxuICogY29udHJvbCwgdGhhdCBuZXcgcnVucyBhcmUgY29tcGFyZWQgYWdhaW5zdCAoc3RvcmVkIGluIGEgZGlyZWN0b3J5IG5hbWVkXG4gKiBgPHRlc3QtbmFtZT4uc25hcHNob3RgKS5cbiAqXG4gKiBUaGlzIGlzIGFzIG9wcG9zZWQgdG8gb3RoZXIgc25hcHNob3RzLCB3aGljaCBjYW4gYmUgZ2VuZXJhdGVkIGZvciBleGFtcGxlXG4gKiB0ZW1wb3JhcmlseSBpbiBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIHRvIGNvbXBhcmUgYWdhaW5zIHRoZSBnb2xkZW4gc25hcHNob3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZGtJbnRlZ0hlbHBlciB7XG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIENka0ludGVnSGVscGVyLlxuICAgKlxuICAgKiBIaWRpbmcgdGhlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5oZXJpdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBDZGtJbnRlZ0hlbHBlck9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IENka0ludGVnSGVscGVyKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGdvbGRlbiBzbmFwc2hvdCB3aWxsIGJlIHN0b3JlZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdvbGRlblNuYXBzaG90RGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIHRoZSBDREsgIENMSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNkazogSUNkaztcblxuICAvKipcbiAgICogUHJldHR5IG5hbWUgb2YgdGhlIHRlc3RcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0ZXN0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdXNlZCBpbiB0aGUgJy0tYXBwJyBDTEkgcGFyYW1ldGVyXG4gICAqXG4gICAqIFBhdGggdG8gdGhlIGludGVnIHRlc3Qgc291cmNlIGZpbGUsIHJlbGF0aXZlIHRvIGB0aGlzLmRpcmVjdG9yeWAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrQXBwOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHdoZXJlIHRoZSBgY2RrLmNvbnRleHQuanNvbmAgZmlsZVxuICAgKiB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGtDb250ZXh0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgdGhhdCB0aGUgaW50ZWdyYXRpb24gdGVzdHMgd2lsbCBiZVxuICAgKiBleGVjdXRlZCBmcm9tXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHRvIHJ1blxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0ZXN0OiBJbnRlZ1Rlc3Q7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBDREsgQ0xJXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdEFyZ3M6IERlZmF1bHRDZGtPcHRpb25zID0ge1xuICAgIHBhdGhNZXRhZGF0YTogZmFsc2UsXG4gICAgYXNzZXRNZXRhZGF0YTogZmFsc2UsXG4gICAgdmVyc2lvblJlcG9ydGluZzogZmFsc2UsXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIENESyB3aWxsIGJlIHN5bnRoZWQgdG9cbiAgICpcbiAgICogUmVsYXRpdmUgdG8gY3dkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka091dERpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvZmlsZSB0byB1c2UgZm9yIHRoZSBDREsgQ0xJIGNhbGxzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogU2hvdyBvdXRwdXQgZnJvbSB0aGUgaW50ZWcgdGVzdCBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3dPdXRwdXQ6IGJvb2xlYW47XG5cbiAgcHVibGljIF9kZXN0cnVjdGl2ZUNoYW5nZXM/OiBEZXN0cnVjdGl2ZUNoYW5nZVtdO1xuICBwcml2YXRlIGxlZ2FjeUNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIF9leHBlY3RlZFRlc3RTdWl0ZT86IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG4gIHByaXZhdGUgX2FjdHVhbFNuYXBzaG90PzogU25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBfbGVnYWN5RW5hYmxlTG9va3Vwcz86IExlZ2FjeUVuYWJsZUxvb2t1cHM7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCBpbmhlcml0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3Iob3B0aW9uczogQ2RrSW50ZWdIZWxwZXJPcHRpb25zKSB7XG4gICAgdGhpcy50ZXN0ID0gb3B0aW9ucy50ZXN0O1xuICAgIHRoaXMuZGlyZWN0b3J5ID0gdGhpcy50ZXN0LmRpcmVjdG9yeTtcbiAgICB0aGlzLnRlc3ROYW1lID0gdGhpcy50ZXN0LnRlc3ROYW1lO1xuICAgIHRoaXMuZ29sZGVuU25hcHNob3REaXIgPSB0aGlzLnRlc3Quc25hcHNob3REaXI7XG4gICAgdGhpcy5jZGtDb250ZXh0UGF0aCA9IHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgJ2Nkay5jb250ZXh0Lmpzb24nKTtcbiAgICB0aGlzLnByb2ZpbGUgPSBvcHRpb25zLnByb2ZpbGU7XG4gICAgdGhpcy5zaG93T3V0cHV0ID0gb3B0aW9ucy5zaG93T3V0cHV0ID8/IGZhbHNlO1xuXG4gICAgdGhpcy5jZGsgPSBvcHRpb25zLmNkayA/PyBtYWtlRW5naW5lKG9wdGlvbnMpO1xuICAgIHRoaXMuY2RrT3V0RGlyID0gb3B0aW9ucy5pbnRlZ091dERpciA/PyB0aGlzLnRlc3QudGVtcG9yYXJ5T3V0cHV0RGlyO1xuXG4gICAgY29uc3QgdGVzdFJ1bkNvbW1hbmQgPSB0aGlzLnRlc3QuYXBwQ29tbWFuZDtcbiAgICB0aGlzLmNka0FwcCA9IHRlc3RSdW5Db21tYW5kLnJlcGxhY2UoJ3tmaWxlUGF0aH0nLCBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLnRlc3QuZmlsZU5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIGxlZ2FjeSBlbmFibGVMb29rdXBzIHZhbHVlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIGFjdHVhbCBzbmFwc2hvdC5cbiAgICpcbiAgICogTXVzdCBiZSBzZXQgYmVmb3JlIHVzaW5nIHNuYXBzaG90IG1ldGhvZHMuXG4gICAqL1xuICBwdWJsaWMgY29uZmlndXJlTGVnYWN5RW5hYmxlTG9va3VwcyhlbmFibGVMb29rdXBzOiBMZWdhY3lFbmFibGVMb29rdXBzKTogdm9pZCB7XG4gICAgdGhpcy5fbGVnYWN5RW5hYmxlTG9va3VwcyA9IGVuYWJsZUxvb2t1cHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGFjdHVhbCAoaS5lLiBuZXcpIHRlc3QgY2FzZXMgZm9yIHRoaXMgaW50ZWdyYXRpb24gdGVzdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjdHVhbFRlc3RzKCk6IFByb21pc2U8eyBbdGVzdE5hbWU6IHN0cmluZ106IFRlc3RDYXNlIH0gfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCkpLnRlc3RTdWl0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyBcImFjdHVhbFwiIHNuYXBzaG90IHdoaWNoIHdpbGwgYmUgY29tcGFyZWQgdG8gdGhlXG4gICAqIGV4aXN0aW5nIFwiZXhwZWN0ZWRcIiBzbmFwc2hvdFxuICAgKiBUaGlzIHdpbGwgc3ludGggYW5kIHRoZW4gbG9hZCB0aGUgaW50ZWdyYXRpb24gdGVzdCBtYW5pZmVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUFjdHVhbFNuYXBzaG90KCk6IFByb21pc2U8U25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbj4ge1xuICAgIGF3YWl0IHRoaXMuc3ludGhBY3R1YWxTbmFwc2hvdCh0aGlzLmNka091dERpcik7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCB0aGlzLmxvYWRNYW5pZmVzdCh0aGlzLmNka091dERpcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlc3REZWZpbml0aW9uOiBtYW5pZmVzdCxcbiAgICAgIHNuYXBzaG90RGlyZWN0b3J5OiB0aGlzLmNka091dERpcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIHRoZSBhY3R1YWwgYXBwbGljYXRpb24gdG8gdGhlIGdpdmVuIGRpcmVjdG9yeSwgZm9yIHB1cnBvc2VzIG9mIGdlbmVyYXRpbmcvdmFsaWRhdGluZyBhIHNuYXBzaG90XG4gICAqXG4gICAqIGBsZWdhY3lFbmFibGVMb29rdXBzYCBpcyB0byBwcmVzZXJ2ZSBoaXN0b3JpY2FsIGJlaGF2aW9yIGZvciBhIHdoaWxlOlxuICAgKiB0cmFkaXRpb25hbGx5LCB0aGUgYXBwbGljYXRpb24gd291bGQgb25seSBiZSBzZWVkZWQgd2l0aCBjb250ZXh0IGlmXG4gICAqIGBlbmFibGVMb29rdXBzYCB3YXMgdHJ1ZSwgYW5kIHRoaXMgaW5mb3JtYXRpb24gd291bGQgY29tZSBmcm9tIHRoZSB0ZXN0XG4gICAqIGRlZmluaXRpb24uXG4gICAqXG4gICAqIC0gU2luY2UgdGhlIHRlc3QgZGVmaW5pdGlvbiBjb21lcyBmcm9tIGluc2lkZSB0aGUgYXBwLCB0aGlzIHJlcXVpcmVzIGFcbiAgICogICBzeW50aCBqdXN0IHRvIGdldCB0aGUgdGVzdCBkZWZpbml0aW9uLCBhbmQgdGhlbiBhbm90aGVyIHN5bnRoIHRvIGdlbmVyYXRlXG4gICAqICAgdGhlIGFjdHVhbCBzbmFwc2hvdCB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHQsIHdoaWNoIGlzIHRpbWUgY29uc3VtaW5nLlxuICAgKiAtIEdpdmVuIHRoYXQgdGhlIGNvbnRleHQgaXMgZml4ZWQgYW5kIGZha2UsIGl0IGNvdWxkIGFsd2F5cyBoYXZlIGJlZW4gcGFzc2VkLlxuICAgKlxuICAgKiBIb3dldmVyLCB0aGUgc25hcHNob3QgY29udGVudHMgdGhlbXNlbHZlcyBkZXBlbmQgb24gdGhlIGNvbnRleHQgZmxhZywgYW5kIGNoYW5naW5nXG4gICAqIHRoaXMgYmVoYXZpb3Igbm93IGludmFsaWRhdGVzIGFsbCBzbmFwc2hvdHMgZXZlcnl3aGVyZSwgd2hpY2ggaXMgYW5ub3lpbmcgZm9yIHVwZ3JhZGluZy5cbiAgICpcbiAgICogU28gd2Ugd2lsbCB1c2UgdGhlIGJlaGF2aW9yIGZyb20gdGhlIEdPTERFTiBTTkFQU0hPVCdzIHRlc3QgZGVmaW5pdGlvbiB0b1xuICAgKiBkZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIHRoZSBjb250ZXh0LCBhbmQgaWYgdGhlIG5ldyBhY3R1YWwgc25hcHNob3QgaGFzIGFcbiAgICogZGlmZmVyZW50IHZhbHVlIGZvciBgZW5hYmxlTG9va3Vwc2AsIHdlIHdpbGwgdGhyb3cgYXdheSB0aGUgb2xkIHNuYXBzaG90IGFuZCBzeW50aCBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3ludGhBY3R1YWxTbmFwc2hvdChvdXRwdXREaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBjYWxsIGNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMgYmVmb3JlIGdlbmVyYXRpbmcgc25hcHNob3RzJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jZGsuc3ludGgoe1xuICAgICAgYXBwOiB0aGlzLmNka0FwcCxcbiAgICAgIGNvbnRleHQ6IHRoaXMuZ2V0Q29udGV4dCh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzICE9PSBmYWxzZSA/IERFRkFVTFRfU1lOVEhfT1BUSU9OUy5jb250ZXh0IDoge30pLFxuICAgICAgZW52OiBERUZBVUxUX1NZTlRIX09QVElPTlMuZW52LFxuICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCBvdXRwdXREaXJlY3RvcnkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdHVhbFN5bnRoUmVwcm9Db21tYW5kKCkge1xuICAgIC8vIFNob3cgdGhlIGNvbW1hbmQgbmVjZXNzYXJ5IHRvIHJlcHJvIHRoaXNcbiAgICBjb25zdCBlbnZTZXQgPSBPYmplY3QuZW50cmllcyhERUZBVUxUX1NZTlRIX09QVElPTlMuZW52KS5tYXAoKFtrLCB2XSkgPT4gYCR7a309JyR7dn0nYCk7XG4gICAgY29uc3QgZW52Q21kID0gZW52U2V0Lmxlbmd0aCA+IDAgPyBbJ2VudicsIC4uLmVudlNldF0gOiBbXTtcblxuICAgIHJldHVybiBbXG4gICAgICAuLi5lbnZDbWQsXG4gICAgICAnY2RrJyxcbiAgICAgICdzeW50aCcsXG4gICAgICAnLWEnLFxuICAgICAgYCcke3RoaXMuY2RrQXBwfSdgLFxuICAgICAgJy1vJyxcbiAgICAgIGAnJHt0aGlzLmNka091dERpcn0nYCxcbiAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHRoaXMuZ2V0Q29udGV4dChERUZBVUxUX1NZTlRIX09QVElPTlMuY29udGV4dCkpLmZsYXRNYXAoKFtrLCB2XSkgPT4gdHlwZW9mIHYgIT09ICdvYmplY3QnID8gW2AtYyAnJHtrfT0ke3Z9J2BdIDogW10pLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgc25hcHNob3QgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdGVzdFxuICAgKi9cbiAgcHVibGljIGhhc1NuYXBzaG90KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHN1aXRlIGZyb20gdGhlIGV4aXN0aW5nIHNuYXBzaG90XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhwZWN0ZWRUZXN0U3VpdGUoKTogUHJvbWlzZTxJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLl9leHBlY3RlZFRlc3RTdWl0ZSAmJiB0aGlzLmhhc1NuYXBzaG90KCkpIHtcbiAgICAgIHRoaXMuX2V4cGVjdGVkVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5sb2FkTWFuaWZlc3QoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V4cGVjdGVkVGVzdFN1aXRlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFjdHVhbFNuYXBzaG90KCk6IFByb21pc2U8U25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbj4ge1xuICAgIGlmICghdGhpcy5fYWN0dWFsU25hcHNob3QpIHtcbiAgICAgIHRoaXMuX2FjdHVhbFNuYXBzaG90ID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUFjdHVhbFNuYXBzaG90KCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbmFibGVMb29rdXBzIHZhbHVlIGhhcyBjaGFuZ2VkIGJldHdlZW4gdGhlIGdvbGRlblxuICAgICAgLy8gc25hcHNob3QgYW5kIHRoZSBhY3R1YWwgc25hcHNob3QuIElmIGl0IGhhcywgd2UgbmVlZCB0byByZS1zeW50aCB0aGVcbiAgICAgIC8vIGFjdHVhbCBzbmFwc2hvdCB3aXRoIHRoZSBuZXcgZW5hYmxlTG9va3VwcyB2YWx1ZS5cbiAgICAgIC8vXG4gICAgICAvLyBTZWUgYHN5bnRoQWN0dWFsU25hcHNob3RgIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS5cbiAgICAgIGNvbnN0IGFjdHVhbEVuYWJsZUxvb2t1cHMgPSB0aGlzLl9hY3R1YWxTbmFwc2hvdC50ZXN0RGVmaW5pdGlvbi5lbmFibGVMb29rdXBzID8/IGZhbHNlO1xuICAgICAgaWYgKGFjdHVhbEVuYWJsZUxvb2t1cHMgIT09IHRoaXMuX2xlZ2FjeUVuYWJsZUxvb2t1cHMgJiYgdGhpcy5fbGVnYWN5RW5hYmxlTG9va3VwcyAhPT0gJ2RvbnQtY2FyZScpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmVMZWdhY3lFbmFibGVMb29rdXBzKGFjdHVhbEVuYWJsZUxvb2t1cHMpO1xuICAgICAgICB0aGlzLl9hY3R1YWxTbmFwc2hvdCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVBY3R1YWxTbmFwc2hvdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWN0dWFsU25hcHNob3Q7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRlc3Qgc3VpdGUgZnJvbSB0aGUgbmV3IFwiYWN0dWFsXCIgc25hcHNob3RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWN0dWFsVGVzdFN1aXRlKCk6IFByb21pc2U8SW50ZWdUZXN0U3VpdGUgfCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hY3R1YWxTbmFwc2hvdCgpKS50ZXN0RGVmaW5pdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnRlZyBtYW5pZmVzdCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvblxuICAgKiBvbiBob3cgdG8gZXhlY3V0ZSB0aGUgdGVzdHNcbiAgICogRmlyc3Qgd2UgdHJ5IGFuZCBsb2FkIHRoZSBtYW5pZmVzdCBmcm9tIHRoZSBpbnRlZyBtYW5pZmVzdCAoaS5lLiBpbnRlZy5qc29uKVxuICAgKiBmcm9tIHRoZSBjbG91ZCBhc3NlbWJseS4gSWYgaXQgZG9lc24ndCBleGlzdCwgdGhlbiB3ZSBmYWxsYmFjayB0byB0aGVcbiAgICogXCJsZWdhY3kgbW9kZVwiIGFuZCBjcmVhdGUgYSBtYW5pZmVzdCBmcm9tIHByYWdtYVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRNYW5pZmVzdChkaXI/OiBzdHJpbmcpOiBQcm9taXNlPEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGRpciA/PyB0aGlzLmdvbGRlblNuYXBzaG90RGlyO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZXN0U3VpdGUgPSBJbnRlZ1Rlc3RTdWl0ZS5mcm9tUGF0aChtYW5pZmVzdCk7XG4gICAgICByZXR1cm4gdGVzdFN1aXRlO1xuICAgIH0gY2F0Y2ggKG1vZGVybkVycm9yOiBhbnkpIHtcbiAgICAgIC8vIE9ubHkgYXR0ZW1wdCBsZWdhY3kgdGVzdCBjYXNlIGlmIHRoZSBpbnRlZyB0ZXN0IG1hbmlmZXN0IHdhcyBub3QgZm91bmRcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgZXJyb3JzLCBlLmcuIHdoZW4gcGFyc2luZyB0aGUgbWFuaWZlc3QgZmFpbHMsIHdlIGFib3J0LlxuICAgICAgaWYgKCEobW9kZXJuRXJyb3IgaW5zdGFuY2VvZiBOb01hbmlmZXN0RXJyb3IpKSB7XG4gICAgICAgIHRocm93IG1vZGVybkVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG93T3V0cHV0KSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcbiAgICAgICAgICBcIkZhaWxlZCB0byBsb2FkIGludGVnIHRlc3QgbWFuaWZlc3QgZm9yICclcycuIEF0dGVtcHRpbmcgYXMgZGVwcmVjYXRlZCBsZWdhY3kgdGVzdCBpbnN0ZWFkLiBFcnJvciB3YXM6ICVzXCIsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgbW9kZXJuRXJyb3IubWVzc2FnZSA/PyBTdHJpbmcobW9kZXJuRXJyb3IpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ZXN0Q2FzZXMgPSBhd2FpdCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZS5mcm9tTGVnYWN5KHtcbiAgICAgICAgY2RrOiB0aGlzLmNkayxcbiAgICAgICAgdGVzdE5hbWU6IHRoaXMudGVzdC5ub3JtYWxpemVkVGVzdE5hbWUsXG4gICAgICAgIGludGVnU291cmNlRmlsZVBhdGg6IHRoaXMudGVzdC5maWxlTmFtZSxcbiAgICAgICAgbGlzdE9wdGlvbnM6IHtcbiAgICAgICAgICAuLi50aGlzLmRlZmF1bHRBcmdzLFxuICAgICAgICAgIGFsbDogdHJ1ZSxcbiAgICAgICAgICBhcHA6IHRoaXMuY2RrQXBwLFxuICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sZWdhY3lDb250ZXh0ID0gTGVnYWN5SW50ZWdUZXN0U3VpdGUuZ2V0UHJhZ21hQ29udGV4dCh0aGlzLnRlc3QuZmlsZU5hbWUpO1xuICAgICAgcmV0dXJuIHRlc3RDYXNlcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICBjb25zdCBjZGtPdXRQYXRoID0gdGhpcy5jZGtPdXREaXI7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2RrT3V0UGF0aCkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoY2RrT3V0UGF0aCk7XG4gICAgfVxuICAgIC8vIENsZWFyIGNhY2hlXG4gICAgdGhpcy5fYWN0dWFsU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlcmUgYXJlIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzIHRvIGEgc3RhY2sgdGhlbiB0aGlzIHdpbGwgcmVjb3JkXG4gICAqIHRob3NlIGluIHRoZSBtYW5pZmVzdC5qc29uIGZpbGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyVHJhY2VEYXRhKCk6IE1hbmlmZXN0VHJhY2Uge1xuICAgIGNvbnN0IHRyYWNlRGF0YTogTWFuaWZlc3RUcmFjZSA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkZXN0cnVjdGl2ZUNoYW5nZXMgPSB0aGlzLl9kZXN0cnVjdGl2ZUNoYW5nZXMgPz8gW107XG4gICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgIGNvbnN0IHRyYWNlID0gdHJhY2VEYXRhLmdldChjaGFuZ2Uuc3RhY2tOYW1lKTtcbiAgICAgIGlmICh0cmFjZSkge1xuICAgICAgICB0cmFjZS5zZXQoY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2VEYXRhLnNldChjaGFuZ2Uuc3RhY2tOYW1lLCBuZXcgTWFwKFtcbiAgICAgICAgICBbY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWBdLFxuICAgICAgICBdKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNlRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBjYXNlcyB3aGVyZSB3ZSBkbyBub3Qgd2FudCB0byByZXRhaW4gdGhlIGFzc2V0cyxcbiAgICogZm9yIGV4YW1wbGUsIGlmIHRoZSBhc3NldHMgYXJlIHZlcnkgbGFyZ2UuXG4gICAqXG4gICAqIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIHVwZGF0ZSB3b3JrZmxvdyBmb3IgaW5kaXZpZHVhbCB0ZXN0XG4gICAqIGNhc2VzLCB0aGlzIG5lZWRzIHRvIGZpcnN0IGdldCBhIGxpc3Qgb2Ygc3RhY2tzIHRoYXQgaGF2ZSB0aGUgdXBkYXRlIHdvcmtmbG93XG4gICAqIGRpc2FibGVkIGFuZCB0aGVuIGRlbGV0ZSBhc3NldHMgdGhhdCByZWxhdGUgdG8gdGhhdCBzdGFjay4gSXQgZG9lcyB0aGF0XG4gICAqIGJ5IHJlYWRpbmcgdGhlIGFzc2V0IG1hbmlmZXN0IGZvciB0aGUgc3RhY2sgYW5kIGRlbGV0aW5nIHRoZSBhc3NldCBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlQXNzZXRzRnJvbVNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YWNrcyA9IChhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpKS5nZXRTdGFja3NXaXRob3V0VXBkYXRlV29ya2Zsb3coKSA/PyBbXTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgodGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgY29uc3QgYXNzZXRzID0gZmxhdHRlbihzdGFja3MubWFwKHN0YWNrID0+IHtcbiAgICAgIHJldHVybiBtYW5pZmVzdC5nZXRBc3NldExvY2F0aW9uc0ZvclN0YWNrKHN0YWNrKSA/PyBbXTtcbiAgICB9KSk7XG5cbiAgICBhc3NldHMuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBhc3NldCk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlTmFtZSkpIHtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmaWxlTmFtZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIGZzLnJlbW92ZVN5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLnVubGlua1N5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBhc3NldCBjYWNoZSAoLmNhY2hlLykgZmlsZXMgZnJvbSB0aGUgc25hcHNob3QuXG4gICAqIFRoZXNlIGFyZSBhIGNhY2hlIG9mIHRoZSBhc3NldCB6aXBzLCBidXQgd2UgYXJlIGZpbmUgd2l0aFxuICAgKiByZS16aXBwaW5nIG9uIGRlcGxveVxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVBc3NldHNDYWNoZUZyb21TbmFwc2hvdCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBmaWxlKTtcbiAgICAgIGlmIChmcy5sc3RhdFN5bmMoZmlsZU5hbWUpLmlzRGlyZWN0b3J5KCkgJiYgZmlsZSA9PT0gJy5jYWNoZScpIHtcbiAgICAgICAgZnMuZW1wdHlEaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgICAgZnMucm1kaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIG5ldyBzbmFwc2hvdC5cbiAgICpcbiAgICogSWYgbG9va3VwcyBhcmUgZW5hYmxlZCwgdGhlbiB3ZSBuZWVkIGNyZWF0ZSB0aGUgc25hcHNob3QgYnkgc3ludGgnaW5nIGFnYWluXG4gICAqIHdpdGggdGhlIGR1bW15IGNvbnRleHQgc28gdGhhdCBlYWNoIHRpbWUgdGhlIHRlc3QgaXMgcnVuIG9uIGRpZmZlcmVudCBtYWNoaW5lc1xuICAgKiAoYW5kIHdpdGggZGlmZmVyZW50IGNvbnRleHQvZW52KSB0aGUgZGlmZiB3aWxsIG5vdCBjaGFuZ2UuXG4gICAqXG4gICAqIElmIGxvb2t1cHMgYXJlIGRpc2FibGVkICh3aGljaCBtZWFucyB0aGUgc3RhY2sgaXMgZW52IGFnbm9zdGljKSB0aGVuIGp1c3QgY29weVxuICAgKiB0aGUgYXNzZW1ibHkgdGhhdCB3YXMgb3V0cHV0IGJ5IHRoZSBkZXBsb3ltZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlU25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5nb2xkZW5TbmFwc2hvdERpcikpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmModGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgY2xldmVyLCB3ZSBzaG91bGQgYmUgYWJsZSB0byByZXVzZSB0aGUgc25hcHNob3QgdGhhdCB3YXNcbiAgICAvLyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSB0ZXN0IGludmFsaWRhdGlvbiBjaGVjayBhbmQgYXZvaWQgdGhlIGJlbG93IHN5bnRoLlxuICAgIC8vIEJ1dCB0aGF0IGdldHMgcnVuIGluIGEgY29tcGxldGVseSBkaWZmZXJlbnQgbGlmZWN5Y2xlIGFuZCBpdCBtaWdodCBub3RcbiAgICAvLyBleGlzdC4gV2UncmUgbm90IGRlYWxpbmcgd2l0aCB0aGF0IGp1c3QgeWV0LlxuICAgIGF3YWl0IHRoaXMuc3ludGhBY3R1YWxTbmFwc2hvdCh0aGlzLmdvbGRlblNuYXBzaG90RGlyKTtcblxuICAgIGF3YWl0IHRoaXMuY2xlYW51cEdvbGRlblNuYXBzaG90KCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBzb21lIGNsZWFudXAgc3RlcHMgYWZ0ZXIgdGhlIHNuYXBzaG90IGlzIGNyZWF0ZWRcbiAgICogQW55dGltZSB0aGUgc25hcHNob3QgbmVlZHMgdG8gYmUgbW9kaWZpZWQgYWZ0ZXIgY3JlYXRpb25cbiAgICogdGhlIGxvZ2ljIHNob3VsZCBsaXZlIGhlcmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNsZWFudXBHb2xkZW5TbmFwc2hvdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmdvbGRlblNuYXBzaG90RGlyKSkge1xuICAgICAgYXdhaXQgdGhpcy5yZW1vdmVBc3NldHNGcm9tU25hcHNob3QoKTtcbiAgICAgIHRoaXMucmVtb3ZlQXNzZXRzQ2FjaGVGcm9tU25hcHNob3QoKTtcbiAgICAgIGNvbnN0IGFzc2VtYmx5ID0gQXNzZW1ibHlNYW5pZmVzdFJlYWRlci5mcm9tUGF0aCh0aGlzLmdvbGRlblNuYXBzaG90RGlyKTtcbiAgICAgIGFzc2VtYmx5LmNsZWFuTWFuaWZlc3QoKTtcbiAgICAgIGFzc2VtYmx5LnJlY29yZFRyYWNlKHRoaXMucmVuZGVyVHJhY2VEYXRhKCkpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoaXMgaXMgYSBsZWdhY3kgdGVzdCB0aGVuIGNyZWF0ZSBhbiBpbnRlZyBtYW5pZmVzdFxuICAgIC8vIGluIHRoZSBzbmFwc2hvdCBkaXJlY3Rvcnkgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRoZVxuICAgIC8vIHVwZGF0ZSB3b3JrZmxvdy4gU2F2ZSBhbnkgbGVnYWN5Q29udGV4dCBhcyB3ZWxsIHNvIHRoYXQgaXQgY2FuIGJlIHJlYWRcbiAgICAvLyB0aGUgbmV4dCB0aW1lXG4gICAgY29uc3QgYWN0dWFsVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKTtcbiAgICBpZiAoYWN0dWFsVGVzdFN1aXRlLnR5cGUgPT09ICdsZWdhY3ktdGVzdC1zdWl0ZScpIHtcbiAgICAgIChhY3R1YWxUZXN0U3VpdGUgYXMgTGVnYWN5SW50ZWdUZXN0U3VpdGUpLnNhdmVNYW5pZmVzdCh0aGlzLmdvbGRlblNuYXBzaG90RGlyLCB0aGlzLmxlZ2FjeUNvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDb250ZXh0KGFkZGl0aW9uYWxDb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jdXJyZW50bHlSZWNvbW1lbmRlZEF3c0Nka0xpYkZsYWdzKCksXG4gICAgICAuLi50aGlzLmxlZ2FjeUNvbnRleHQsXG4gICAgICAuLi5hZGRpdGlvbmFsQ29udGV4dCxcblxuICAgICAgLy8gRG9uJ3QgcmVjb3JkIGNyZWF0aW9uIHN0YWNrIHRyYWNlcyBpbiB0aGUgc25hcHNob3QsIHNpbmNlIHRoZXkganVzdCB0YWtlIHVwIHNwYWNlIGFuZCBhcmUgbmV2ZXIgZGV0ZXJtaW5pc3RpYy5cbiAgICAgICdhd3M6Y2RrOmRpc2FibGUtY3JlYXRpb24tc3RhY2stdHJhY2VzJzogdHJ1ZSxcblxuICAgICAgLy8gV2Ugb3JpZ2luYWxseSBoYWQgUExBTk5FRCB0byBzZXQgdGhpcyB0byBbJ2F3cycsICdhd3MtY24nXSwgYnV0IGR1ZSB0byBhIHByb2dyYW1taW5nIG1pc3Rha2VcbiAgICAgIC8vIGl0IHdhcyBzZXQgdG8gZXZlcnl0aGluZy4gSW4gdGhpcyBQUiwgc2V0IGl0IHRvIGV2ZXJ5dGhpbmcgdG8gbm90IG1lc3MgdXAgYWxsIHRoZSBzbmFwc2hvdHMuXG4gICAgICAnQGF3cy1jZGsvY29yZTp0YXJnZXQtcGFydGl0aW9ucyc6IHVuZGVmaW5lZCxcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBUSEUgRlVUVVJFIExJVkVTIEJFTE9XLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gUmVzdHJpY3RpbmcgdG8gdGhlc2UgdGFyZ2V0IHBhcnRpdGlvbnMgbWFrZXMgbW9zdCBzZXJ2aWNlIHByaW5jaXBhbHMgc3ludGhlc2l6ZSB0b1xuICAgICAgLy8gYHNlcnZpY2UuJHtVUkxfU1VGRklYfWAsIHdoaWNoIGlzIHRlY2huaWNhbGx5ICppbmNvcnJlY3QqIChpdCdzIG9ubHkgYGFtYXpvbmF3cy5jb21gXG4gICAgICAvLyBvciBgYW1hem9uYXdzLmNvbS5jbmAsIG5ldmVyIFVybFN1ZmZpeCBmb3IgYW55IG9mIHRoZSByZXN0cmljdGVkIHJlZ2lvbnMpIGJ1dCBpdCdzIHdoYXRcbiAgICAgIC8vIG1vc3QgZXhpc3RpbmcgaW50ZWcgdGVzdHMgY29udGFpbiwgYW5kIHdlIHdhbnQgdG8gZGlzdHVyYiBhcyBmZXcgYXMgcG9zc2libGUuXG4gICAgICAvLyBbVEFSR0VUX1BBUlRJVElPTlNdOiBbJ2F3cycsICdhd3MtY24nXSxcbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gRU5EIE9GIFRIRSBGVVRVUkUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgIH07XG4gIH1cbn1cblxuLy8gRGVmYXVsdCBjb250ZXh0IHdlIHJ1biBhbGwgaW50ZWcgdGVzdHMgd2l0aCwgc28gdGhleSBkb24ndCBkZXBlbmQgb24gdGhlXG4vLyBhY2NvdW50IG9mIHRoZSBleGVyY2lzaW5nIHVzZXIuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TWU5USF9PUFRJT05TID0ge1xuICBjb250ZXh0OiB7XG4gICAgW0FWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZXTogWyd0ZXN0LXJlZ2lvbi0xYScsICd0ZXN0LXJlZ2lvbi0xYicsICd0ZXN0LXJlZ2lvbi0xYyddLFxuICAgICdhdmFpbGFiaWxpdHktem9uZXM6YWNjb3VudD0xMjM0NTY3ODpyZWdpb249dGVzdC1yZWdpb24nOiBbJ3Rlc3QtcmVnaW9uLTFhJywgJ3Rlc3QtcmVnaW9uLTFiJywgJ3Rlc3QtcmVnaW9uLTFjJ10sXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4tYW1pLWh2bS14ODZfNjQtZ3AyOnJlZ2lvbj10ZXN0LXJlZ2lvbic6ICdhbWktMTIzNCcsXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4yLWFtaS1odm0teDg2XzY0LWdwMjpyZWdpb249dGVzdC1yZWdpb24nOiAnYW1pLTEyMzQnLFxuICAgICdzc206YWNjb3VudD0xMjM0NTY3ODpwYXJhbWV0ZXJOYW1lPS9hd3Mvc2VydmljZS9lY3Mvb3B0aW1pemVkLWFtaS9hbWF6b24tbGludXgvcmVjb21tZW5kZWQ6cmVnaW9uPXRlc3QtcmVnaW9uJzogJ3tcImltYWdlX2lkXCI6IFwiYW1pLTEyMzRcIn0nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljL21heC1sZW5cbiAgICAnYW1pOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVycy5pbWFnZS10eXBlLjA9bWFjaGluZTpmaWx0ZXJzLm5hbWUuMD1hbXpuLWFtaS12cGMtbmF0LSo6ZmlsdGVycy5zdGF0ZS4wPWF2YWlsYWJsZTpvd25lcnMuMD1hbWF6b246cmVnaW9uPXRlc3QtcmVnaW9uJzogJ2FtaS0xMjM0JyxcbiAgICAndnBjLXByb3ZpZGVyOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVyLmlzRGVmYXVsdD10cnVlOnJlZ2lvbj10ZXN0LXJlZ2lvbjpyZXR1cm5Bc3ltbWV0cmljU3VibmV0cz10cnVlJzoge1xuICAgICAgdnBjSWQ6ICd2cGMtNjA5MDA5MDUnLFxuICAgICAgc3VibmV0R3JvdXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnUHVibGljJyxcbiAgICAgICAgICBuYW1lOiAnUHVibGljJyxcbiAgICAgICAgICBzdWJuZXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN1Ym5ldElkOiAnc3VibmV0LWUxOTQ1NWNhJyxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogJ3VzLWVhc3QtMWEnLFxuICAgICAgICAgICAgICByb3V0ZVRhYmxlSWQ6ICdydGItZTE5NDU1Y2EnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3VibmV0SWQ6ICdzdWJuZXQtZTBjMjQ3OTcnLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiAndXMtZWFzdC0xYicsXG4gICAgICAgICAgICAgIHJvdXRlVGFibGVJZDogJ3J0Yi1lMGMyNDc5NycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdWJuZXRJZDogJ3N1Ym5ldC1jY2Q3NzM5NScsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6ICd1cy1lYXN0LTFjJyxcbiAgICAgICAgICAgICAgcm91dGVUYWJsZUlkOiAncnRiLWNjZDc3Mzk1JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbiAgZW52OiB7XG4gICAgQ0RLX0lOVEVHX0FDQ09VTlQ6ICcxMjM0NTY3OCcsXG4gICAgQ0RLX0lOVEVHX1JFR0lPTjogJ3Rlc3QtcmVnaW9uJyxcbiAgICBDREtfSU5URUdfSE9TVEVEX1pPTkVfSUQ6ICdaMjNBQkM0WFlaTDA1QicsXG4gICAgQ0RLX0lOVEVHX0hPU1RFRF9aT05FX05BTUU6ICdleGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0RPTUFJTl9OQU1FOiAnKi5leGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0NFUlRfQVJOOiAnYXJuOmF3czphY206dGVzdC1yZWdpb246MTIzNDU2Nzg6Y2VydGlmaWNhdGUvODY0NjgyMDktYTI3Mi01OTVkLWI4MzEtMGVmYjY0MjEyNjV6JyxcbiAgICBDREtfSU5URUdfU1VCTkVUX0lEOiAnc3VibmV0LTBkZmYxYTM5OWQ4ZjZmOTJjJyxcbiAgfSxcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBjdXJyZW50bHkgcmVjb21tZW5kZWQgZmxhZ3MgZm9yIGBhd3MtY2RrLWxpYmAuXG4gKlxuICogVGhlc2UgaGF2ZSBiZWVuIGJ1aWx0IGludG8gdGhlIENMSSBhdCBidWlsZCB0aW1lLiBJZiB0aGlzIGV2ZXIgZ2V0cyBjaGFuZ2VkXG4gKiBiYWNrIHRvIGEgZHluYW1pYyBsb2FkLCByZW1lbWJlciB0aGF0IHRoaXMgc291cmNlIGZpbGUgbWF5IGJlIGJ1bmRsZWQgaW50b1xuICogYSBKYXZhU2NyaXB0IGJ1bmRsZSwgYW5kIGBfX2Rpcm5hbWVgIG1pZ2h0IG5vdCBwb2ludCB3aGVyZSB5b3UgdGhpbmsgaXQgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRseVJlY29tbWVuZGVkQXdzQ2RrTGliRmxhZ3MoKSB7XG4gIHJldHVybiByZWNvbW1lbmRlZEZsYWdzRmlsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbmFwc2hvdEFuZFRlc3REZWZpbml0aW9uIHtcbiAgcmVhZG9ubHkgdGVzdERlZmluaXRpb246IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG4gIHJlYWRvbmx5IHNuYXBzaG90RGlyZWN0b3J5OiBzdHJpbmc7XG59XG4iXX0= |
@@ -1,2 +0,2 @@ | ||
| import type { IntegRunnerOptions } from './runner-base'; | ||
| import type { CdkIntegHelperOptions } from './cdk-integ-helper'; | ||
| import { ToolkitLibRunnerEngine } from '../engines/toolkit-lib'; | ||
@@ -8,3 +8,4 @@ /** | ||
| */ | ||
| export declare function makeEngine(options: IntegRunnerOptions): ToolkitLibRunnerEngine; | ||
| export declare function makeEngine(options: EngineOptions): ToolkitLibRunnerEngine; | ||
| export type EngineOptions = Pick<CdkIntegHelperOptions, 'test' | 'showOutput' | 'env' | 'region' | 'profile' | 'proxy' | 'caBundlePath'>; | ||
| //# sourceMappingURL=engine.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,sBAAsB,CAU9E"} | ||
| {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,sBAAsB,CAUzE;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,cAAc,CAAC,CAAC"} |
@@ -21,2 +21,2 @@ "use strict"; | ||
| } | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUEsZ0NBVUM7QUFqQkQsd0RBQWdFO0FBRWhFOzs7O0dBSUc7QUFDSCxTQUFnQixVQUFVLENBQUMsT0FBMkI7SUFDcEQsT0FBTyxJQUFJLG9DQUFzQixDQUFDO1FBQ2hDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUztRQUN4QyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7UUFDOUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2hCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtLQUNuQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbnRlZ1J1bm5lck9wdGlvbnMgfSBmcm9tICcuL3J1bm5lci1iYXNlJztcbmltcG9ydCB7IFRvb2xraXRMaWJSdW5uZXJFbmdpbmUgfSBmcm9tICcuLi9lbmdpbmVzL3Rvb2xraXQtbGliJztcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBlbmdpbmUgZm9yIHJ1bm5pbmcgaW50ZWdyYXRpb24gdGVzdHMuXG4gKlxuICogT25seSB0aGUgdG9vbGtpdC1saWIgZW5naW5lIGlzIHN1cHBvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VFbmdpbmUob3B0aW9uczogSW50ZWdSdW5uZXJPcHRpb25zKTogVG9vbGtpdExpYlJ1bm5lckVuZ2luZSB7XG4gIHJldHVybiBuZXcgVG9vbGtpdExpYlJ1bm5lckVuZ2luZSh7XG4gICAgd29ya2luZ0RpcmVjdG9yeTogb3B0aW9ucy50ZXN0LmRpcmVjdG9yeSxcbiAgICBzaG93T3V0cHV0OiBvcHRpb25zLnNob3dPdXRwdXQsXG4gICAgZW52OiBvcHRpb25zLmVudixcbiAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSxcbiAgICBwcm94eTogb3B0aW9ucy5wcm94eSxcbiAgICBjYUJ1bmRsZVBhdGg6IG9wdGlvbnMuY2FCdW5kbGVQYXRoLFxuICB9KTtcbn1cbiJdfQ== | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUEsZ0NBVUM7QUFqQkQsd0RBQWdFO0FBRWhFOzs7O0dBSUc7QUFDSCxTQUFnQixVQUFVLENBQUMsT0FBc0I7SUFDL0MsT0FBTyxJQUFJLG9DQUFzQixDQUFDO1FBQ2hDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUztRQUN4QyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7UUFDOUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2hCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtLQUNuQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDZGtJbnRlZ0hlbHBlck9wdGlvbnMgfSBmcm9tICcuL2Nkay1pbnRlZy1oZWxwZXInO1xuaW1wb3J0IHsgVG9vbGtpdExpYlJ1bm5lckVuZ2luZSB9IGZyb20gJy4uL2VuZ2luZXMvdG9vbGtpdC1saWInO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGVuZ2luZSBmb3IgcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBPbmx5IHRoZSB0b29sa2l0LWxpYiBlbmdpbmUgaXMgc3VwcG9ydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUVuZ2luZShvcHRpb25zOiBFbmdpbmVPcHRpb25zKTogVG9vbGtpdExpYlJ1bm5lckVuZ2luZSB7XG4gIHJldHVybiBuZXcgVG9vbGtpdExpYlJ1bm5lckVuZ2luZSh7XG4gICAgd29ya2luZ0RpcmVjdG9yeTogb3B0aW9ucy50ZXN0LmRpcmVjdG9yeSxcbiAgICBzaG93T3V0cHV0OiBvcHRpb25zLnNob3dPdXRwdXQsXG4gICAgZW52OiBvcHRpb25zLmVudixcbiAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSxcbiAgICBwcm94eTogb3B0aW9ucy5wcm94eSxcbiAgICBjYUJ1bmRsZVBhdGg6IG9wdGlvbnMuY2FCdW5kbGVQYXRoLFxuICB9KTtcbn1cblxuZXhwb3J0IHR5cGUgRW5naW5lT3B0aW9ucyA9IFBpY2s8Q2RrSW50ZWdIZWxwZXJPcHRpb25zLCAndGVzdCcgfCAnc2hvd091dHB1dCcgfCAnZW52JyB8ICdyZWdpb24nIHwgJ3Byb2ZpbGUnIHwgJ3Byb3h5JyB8ICdjYUJ1bmRsZVBhdGgnPjtcbiJdfQ== |
@@ -1,2 +0,2 @@ | ||
| export * from './runner-base'; | ||
| export * from './cdk-integ-helper'; | ||
| export * from './integ-test-suite'; | ||
@@ -3,0 +3,0 @@ export * from './integ-test-runner'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"} |
@@ -17,3 +17,3 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| __exportStar(require("./runner-base"), exports); | ||
| __exportStar(require("./cdk-integ-helper"), exports); | ||
| __exportStar(require("./integ-test-suite"), exports); | ||
@@ -23,2 +23,2 @@ __exportStar(require("./integ-test-runner"), exports); | ||
| __exportStar(require("./integration-tests"), exports); | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQThCO0FBQzlCLHFEQUFtQztBQUNuQyxzREFBb0M7QUFDcEMseURBQXVDO0FBQ3ZDLHNEQUFvQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcnVubmVyLWJhc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlZy10ZXN0LXN1aXRlJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZWctdGVzdC1ydW5uZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zbmFwc2hvdC10ZXN0LXJ1bm5lcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVncmF0aW9uLXRlc3RzJztcbiJdfQ== | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQW1DO0FBQ25DLHFEQUFtQztBQUNuQyxzREFBb0M7QUFDcEMseURBQXVDO0FBQ3ZDLHNEQUFvQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2RrLWludGVnLWhlbHBlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVnLXRlc3Qtc3VpdGUnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlZy10ZXN0LXJ1bm5lcic7XG5leHBvcnQgKiBmcm9tICcuL3NuYXBzaG90LXRlc3QtcnVubmVyJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZWdyYXRpb24tdGVzdHMnO1xuIl19 |
| import type { TestCase } from '@aws-cdk/cloud-assembly-schema'; | ||
| import type { IntegRunnerOptions } from './runner-base'; | ||
| import { IntegRunner } from './runner-base'; | ||
| import type { CdkIntegHelperOptions } from './cdk-integ-helper'; | ||
| import type { DestructiveChange, AssertionResults } from '../workers/common'; | ||
@@ -86,4 +85,13 @@ export interface CommonOptions { | ||
| */ | ||
| export declare class IntegTestRunner extends IntegRunner { | ||
| constructor(options: IntegRunnerOptions, destructiveChanges?: DestructiveChange[]); | ||
| export declare class IntegTestRunner { | ||
| private readonly helper; | ||
| constructor(options: CdkIntegHelperOptions, destructiveChanges?: DestructiveChange[]); | ||
| /** | ||
| * Compatibility shim with old API | ||
| */ | ||
| get testName(): string; | ||
| /** | ||
| * Compatibility shim with old API | ||
| */ | ||
| private actualTestSuite; | ||
| actualTests(): Promise<{ | ||
@@ -90,0 +98,0 @@ [testName: string]: TestCase; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"integ-test-runner.d.ts","sourceRoot":"","sources":["integ-test-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAM/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AAkB9F,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,aAAa;IAC/C;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;OAOG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,WAAW;gBAClC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,EAAE,iBAAiB,EAAE;IAKpE,WAAW,IAAI,OAAO,CAAC;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,GAAG,SAAS,CAAC;IAe1E,oBAAoB,IAAI,IAAI;IAQnC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;OAGG;YACW,cAAc;IAgD5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,gBAAgB;IAgDxB;;;;OAIG;IACU,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjE;;;;;;;;;;OAUG;IACU,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAgEzF;;OAEG;YACW,OAAO;YA6BP,KAAK;IA0InB;;;OAGG;YACW,MAAM;IA8GpB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;OAEG;IACH,OAAO,CAAC,UAAU;CAYnB"} | ||
| {"version":3,"file":"integ-test-runner.d.ts","sourceRoot":"","sources":["integ-test-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAM/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAKhE,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AAkB9F,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,aAAa;IAC/C;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;OAOG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAC5B,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,EAAE,iBAAiB,EAAE;IAepF;;OAEG;IACH,IAAW,QAAQ,WAElB;IAED;;OAEG;YACW,eAAe;IAIhB,WAAW,IAAI,OAAO,CAAC;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,GAAG,SAAS,CAAC;IAe1E,oBAAoB,IAAI,IAAI;IAQnC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;OAGG;YACW,cAAc;IAgD5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,gBAAgB;IAgDxB;;;;OAIG;IACU,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjE;;;;;;;;;;OAUG;IACU,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IA0EzF;;OAEG;YACW,OAAO;YA6BP,KAAK;IA0InB;;;OAGG;YACW,MAAM;IA8GpB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;OAEG;IACH,OAAO,CAAC,UAAU;CAYnB"} |
@@ -1,2 +0,1 @@ | ||
| import { AssetManifest } from '@aws-cdk/cdk-assets-lib'; | ||
| import type { AssemblyManifest } from '@aws-cdk/cloud-assembly-schema'; | ||
@@ -61,3 +60,3 @@ /** | ||
| */ | ||
| getAssetManifestsForStack(stackId: string): AssetManifest[]; | ||
| private getAssetManifestsForStack; | ||
| /** | ||
@@ -64,0 +63,0 @@ * Get a list of assets from the assembly manifest |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"cloud-assembly.d.ts","sourceRoot":"","sources":["cloud-assembly.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAwJ,MAAM,gCAAgC,CAAC;AAI7N;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE7C;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEpD;;GAEG;AACH,qBAAa,sBAAsB;IAsCF,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAoB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IArC7G,gBAAuB,gBAAgB,mBAAmB;IAE1D;;OAEG;WACW,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB;IAShE;;;;OAIG;WACW,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB;IAahE;;OAEG;IACH,SAAgB,SAAS,EAAE,MAAM,CAAC;gBAEtB,SAAS,EAAE,MAAM,EAAmB,QAAQ,EAAE,gBAAgB,EAAmB,gBAAgB,EAAE,MAAM;IAIrH;;;OAGG;IACH,IAAW,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAYvC;IAED;;;OAGG;IACI,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAepE;;OAEG;IACI,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAQ9C;;OAEG;IACI,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAYrD;;OAEG;IACI,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAmB3D;;OAEG;IACI,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE;IAUlE;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAelC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoB/B;;;;OAIG;IACI,aAAa,IAAI,IAAI;IAQ5B,OAAO,CAAC,sBAAsB;IAmC9B,OAAO,CAAC,eAAe;CAcxB"} | ||
| {"version":3,"file":"cloud-assembly.d.ts","sourceRoot":"","sources":["cloud-assembly.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAwJ,MAAM,gCAAgC,CAAC;AAI7N;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE7C;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEpD;;GAEG;AACH,qBAAa,sBAAsB;IAsCF,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAoB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IArC7G,gBAAuB,gBAAgB,mBAAmB;IAE1D;;OAEG;WACW,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB;IAShE;;;;OAIG;WACW,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB;IAahE;;OAEG;IACH,SAAgB,SAAS,EAAE,MAAM,CAAC;gBAEtB,SAAS,EAAE,MAAM,EAAmB,QAAQ,EAAE,gBAAgB,EAAmB,gBAAgB,EAAE,MAAM;IAIrH;;;OAGG;IACH,IAAW,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAYvC;IAED;;;OAGG;IACI,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAepE;;OAEG;IACI,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAQ9C;;OAEG;IACI,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAYrD;;OAEG;IACI,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAmB3D;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAUjC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAelC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoB/B;;;;OAIG;IACI,aAAa,IAAI,IAAI;IAQ5B,OAAO,CAAC,sBAAsB;IAmC9B,OAAO,CAAC,eAAe;CAcxB"} |
@@ -247,2 +247,2 @@ "use strict"; | ||
| exports.AssemblyManifestReader = AssemblyManifestReader; | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQtYXNzZW1ibHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbG91ZC1hc3NlbWJseS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFFN0IsNERBQXdEO0FBQ3hELG9FQUE0RDtBQUU1RCwwRUFBbUc7QUFDbkcsK0JBQStCO0FBZS9COztHQUVHO0FBQ0gsTUFBYSxzQkFBc0I7SUFzQ2U7SUFBNkM7SUFyQ3RGLE1BQU0sQ0FBVSxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7SUFFMUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQ3JDLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLGdDQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEQsT0FBTyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLFFBQVEsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQ3JDLElBQUksRUFBRSxDQUFDO1FBQ1AsSUFBSSxDQUFDO1lBQ0gsRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsUUFBUSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sc0JBQXNC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LENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRU8sZUFBZSxDQUFDLEtBQXFCO1FBQzNDLE1BQU0sWUFBWSxHQUF1QyxFQUFFLENBQUM7UUFDNUQsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNuRixJQUFJLFVBQVUsR0FBMkIsU0FBUyxDQUFDO1lBQ25ELElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxvQ0FBWSxDQUFDLHdCQUF3QixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNyRSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBQ0QsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHO2dCQUN6QixHQUFHLFFBQVE7Z0JBQ1gsUUFBUSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO2FBQzVELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQzs7QUFsUEgsd0RBbVBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgRmlsZU1hbmlmZXN0RW50cnksIERvY2tlckltYWdlTWFuaWZlc3RFbnRyeSB9IGZyb20gJ0Bhd3MtY2RrL2Nkay1hc3NldHMtbGliJztcbmltcG9ydCB7IEFzc2V0TWFuaWZlc3QgfSBmcm9tICdAYXdzLWNkay9jZGstYXNzZXRzLWxpYic7XG5pbXBvcnQgeyBDbG91ZEFydGlmYWN0IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB0eXBlIHsgQXNzZW1ibHlNYW5pZmVzdCwgQXdzQ2xvdWRGb3JtYXRpb25TdGFja1Byb3BlcnRpZXMsIEFydGlmYWN0TWFuaWZlc3QsIE1ldGFkYXRhRW50cnksIEFzc2V0TWFuaWZlc3RQcm9wZXJ0aWVzLCBDb250YWluZXJJbWFnZUFzc2V0TWV0YWRhdGFFbnRyeSwgRmlsZUFzc2V0TWV0YWRhdGFFbnRyeSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgeyBNYW5pZmVzdCwgQXJ0aWZhY3RUeXBlLCBBcnRpZmFjdE1ldGFkYXRhRW50cnlUeXBlIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcblxuLyoqXG4gKiBUcmFjZSBpbmZvcm1hdGlvbiBmb3Igc3RhY2tcbiAqIG1hcCBvZiByZXNvdXJjZSBsb2dpY2FsSWQgdG8gdHJhY2UgbWVzc2FnZVxuICovXG5leHBvcnQgdHlwZSBTdGFja1RyYWNlID0gTWFwPHN0cmluZywgc3RyaW5nPjtcblxuLyoqXG4gKiBUcmFjZSBpbmZvcm1hdGlvbiBmb3IgYSBhc3NlbWJseVxuICpcbiAqIG1hcCBvZiBzdGFja0lkIHRvIFN0YWNrVHJhY2VcbiAqL1xuZXhwb3J0IHR5cGUgTWFuaWZlc3RUcmFjZSA9IE1hcDxzdHJpbmcsIFN0YWNrVHJhY2U+O1xuXG4vKipcbiAqIFJlYWRzIGEgQ2xvdWQgQXNzZW1ibHkgbWFuaWZlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfRklMRU5BTUUgPSAnbWFuaWZlc3QuanNvbic7XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgQ2xvdWQgQXNzZW1ibHkgbWFuaWZlc3QgZnJvbSBhIGZpbGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvYmogPSBNYW5pZmVzdC5sb2FkQXNzZW1ibHlNYW5pZmVzdChmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gbmV3IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIocGF0aC5kaXJuYW1lKGZpbGVOYW1lKSwgb2JqLCBmaWxlTmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGludGVnIG1hbmlmZXN0ICcke2ZpbGVOYW1lfSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIENsb3VkIEFzc2VtYmx5IG1hbmlmZXN0IGZyb20gYSBmaWxlIG9yIGEgZGlyZWN0b3J5XG4gICAqIElmIHRoZSBnaXZlbiBmaWxlUGF0aCBpcyBhIGRpcmVjdG9yeSB0aGVuIGl0IHdpbGwgbG9vayBmb3JcbiAgICogYSBmaWxlIHdpdGhpbiB0aGUgZGlyZWN0b3J5IHdpdGggdGhlIERFRkFVTFRfRklMRU5BTUVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIge1xuICAgIGxldCBzdDtcbiAgICB0cnkge1xuICAgICAgc3QgPSBmcy5zdGF0U3luYyhmaWxlUGF0aCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGludGVnIG1hbmlmZXN0IGF0ICcke2ZpbGVQYXRofSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoc3QuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcmV0dXJuIEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbUZpbGUocGF0aC5qb2luKGZpbGVQYXRoLCBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLkRFRkFVTFRfRklMRU5BTUUpKTtcbiAgICB9XG4gICAgcmV0dXJuIEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbUZpbGUoZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1hbmlmZXN0IHdhcyBmb3VuZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpcmVjdG9yeTogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0OiBBc3NlbWJseU1hbmlmZXN0LCBwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0RmlsZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3RhY2tzIGZyb20gdGhlIG1hbmlmZXN0XG4gICAqIHJldHVybnMgYSBtYXAgb2YgYXJ0aWZhY3RJZCB0byBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZVxuICAgKi9cbiAgcHVibGljIGdldCBzdGFja3MoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3Qgc3RhY2tzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBbYXJ0aWZhY3RJZCwgYXJ0aWZhY3RdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMubWFuaWZlc3QuYXJ0aWZhY3RzID8/IHt9KSkge1xuICAgICAgaWYgKGFydGlmYWN0LnR5cGUgIT09IEFydGlmYWN0VHlwZS5BV1NfQ0xPVURGT1JNQVRJT05fU1RBQ0spIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwcm9wcyA9IGFydGlmYWN0LnByb3BlcnRpZXMgYXMgQXdzQ2xvdWRGb3JtYXRpb25TdGFja1Byb3BlcnRpZXM7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZnMucmVhZEpTT05TeW5jKHBhdGgucmVzb2x2ZSh0aGlzLmRpcmVjdG9yeSwgcHJvcHMudGVtcGxhdGVGaWxlKSk7XG4gICAgICBzdGFja3NbYXJ0aWZhY3RJZF0gPSB0ZW1wbGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5lc3RlZCBzdGFja3MgZm9yIGEgZ2l2ZW4gc3RhY2tcbiAgICogcmV0dXJucyBhIG1hcCBvZiBhcnRpZmFjdElkIHRvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0TmVzdGVkU3RhY2tzRm9yU3RhY2soc3RhY2tJZDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgbmVzdGVkVGVtcGxhdGVzOiBzdHJpbmdbXSA9IHRoaXMuZ2V0QXNzZXRNYW5pZmVzdHNGb3JTdGFjayhzdGFja0lkKS5mbGF0TWFwKFxuICAgICAgbWFuaWZlc3QgPT4gbWFuaWZlc3QuZmlsZXNcbiAgICAgICAgLmZpbHRlcihhc3NldCA9PiBhc3NldC5zb3VyY2UucGF0aD8uZW5kc1dpdGgoJy5uZXN0ZWQudGVtcGxhdGUuanNvbicpKVxuICAgICAgICAubWFwKGFzc2V0ID0+IGFzc2V0LnNvdXJjZS5wYXRoISksXG4gICAgKTtcblxuICAgIGNvbnN0IG5lc3RlZFN0YWNrczogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5mcm9tRW50cmllcyhuZXN0ZWRUZW1wbGF0ZXMubWFwKHRlbXBsYXRlRmlsZSA9PiAoW1xuICAgICAgdGVtcGxhdGVGaWxlLnNwbGl0KCcuJywgMSlbMF0sXG4gICAgICBmcy5yZWFkSlNPTlN5bmMocGF0aC5yZXNvbHZlKHRoaXMuZGlyZWN0b3J5LCB0ZW1wbGF0ZUZpbGUpKSxcbiAgICBdKSkpO1xuXG4gICAgcmV0dXJuIG5lc3RlZFN0YWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSB0cmFjZSBkYXRhIHRvIHRoZSBhc3NlbWJseSBtYW5pZmVzdCBtZXRhZGF0YVxuICAgKi9cbiAgcHVibGljIHJlY29yZFRyYWNlKHRyYWNlOiBNYW5pZmVzdFRyYWNlKTogdm9pZCB7XG4gICAgY29uc3QgbmV3TWFuaWZlc3QgPSB7XG4gICAgICAuLi50aGlzLm1hbmlmZXN0LFxuICAgICAgYXJ0aWZhY3RzOiB0aGlzLnJlbmRlckFydGlmYWN0cyh0cmFjZSksXG4gICAgfTtcbiAgICBNYW5pZmVzdC5zYXZlQXNzZW1ibHlNYW5pZmVzdChuZXdNYW5pZmVzdCwgdGhpcy5tYW5pZmVzdEZpbGVOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFzc2V0cyBmb3IgYSBnaXZlbiBzdGFja1xuICAgKi9cbiAgcHVibGljIGdldEFzc2V0SWRzRm9yU3RhY2soc3RhY2tJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGFzc2V0czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIE9iamVjdC52YWx1ZXModGhpcy5tYW5pZmVzdC5hcnRpZmFjdHMgPz8ge30pKSB7XG4gICAgICBpZiAoYXJ0aWZhY3QudHlwZSA9PT0gQXJ0aWZhY3RUeXBlLkFTU0VUX01BTklGRVNUICYmIChhcnRpZmFjdC5wcm9wZXJ0aWVzIGFzIEFzc2V0TWFuaWZlc3RQcm9wZXJ0aWVzKT8uZmlsZSA9PT0gYCR7c3RhY2tJZH0uYXNzZXRzLmpzb25gKSB7XG4gICAgICAgIGFzc2V0cy5wdXNoKC4uLnRoaXMuYXNzZXRzRnJvbUFzc2V0TWFuaWZlc3QoYXJ0aWZhY3QpLm1hcChhc3NldCA9PiBhc3NldC5pZC5hc3NldElkKSk7XG4gICAgICB9IGVsc2UgaWYgKGFydGlmYWN0LnR5cGUgPT09IEFydGlmYWN0VHlwZS5BV1NfQ0xPVURGT1JNQVRJT05fU1RBQ0spIHtcbiAgICAgICAgYXNzZXRzLnB1c2goLi4udGhpcy5hc3NldHNGcm9tQXNzZW1ibHlNYW5pZmVzdChhcnRpZmFjdCkubWFwKGFzc2V0ID0+IGFzc2V0LmlkKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhc3NldHM7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGEgZ2l2ZW4gc3RhY2tJZCByZXR1cm4gYSBsaXN0IG9mIGFzc2V0cyB0aGF0IGJlbG9uZyB0byB0aGUgc3RhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRBc3NldExvY2F0aW9uc0ZvclN0YWNrKHN0YWNrSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhc3NldHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBPYmplY3QudmFsdWVzKHRoaXMubWFuaWZlc3QuYXJ0aWZhY3RzID8/IHt9KSkge1xuICAgICAgaWYgKGFydGlmYWN0LnR5cGUgPT09IEFydGlmYWN0VHlwZS5BU1NFVF9NQU5JRkVTVCAmJiAoYXJ0aWZhY3QucHJvcGVydGllcyBhcyBBc3NldE1hbmlmZXN0UHJvcGVydGllcyk/LmZpbGUgPT09IGAke3N0YWNrSWR9LmFzc2V0cy5qc29uYCkge1xuICAgICAgICBhc3NldHMucHVzaCguLi50aGlzLmFzc2V0c0Zyb21Bc3NldE1hbmlmZXN0KGFydGlmYWN0KS5mbGF0TWFwKGFzc2V0ID0+IHtcbiAgICAgICAgICBpZiAoYXNzZXQudHlwZSA9PT0gJ2ZpbGUnICYmICFhc3NldC5zb3VyY2UucGF0aD8uZW5kc1dpdGgoJ25lc3RlZC50ZW1wbGF0ZS5qc29uJykpIHtcbiAgICAgICAgICAgIHJldHVybiBhc3NldC5zb3VyY2UucGF0aCE7XG4gICAgICAgICAgfSBlbHNlIGlmIChhc3NldC50eXBlICE9PSAnZmlsZScpIHtcbiAgICAgICAgICAgIHJldHVybiBhc3NldC5zb3VyY2UuZGlyZWN0b3J5ITtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2UgaWYgKGFydGlmYWN0LnR5cGUgPT09IEFydGlmYWN0VHlwZS5BV1NfQ0xPVURGT1JNQVRJT05fU1RBQ0spIHtcbiAgICAgICAgYXNzZXRzLnB1c2goLi4udGhpcy5hc3NldHNGcm9tQXNzZW1ibHlNYW5pZmVzdChhcnRpZmFjdCkubWFwKGFzc2V0ID0+IGFzc2V0LnBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFzc2V0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFzc2V0IGFydGlmYWN0cyBmb3IgYSBnaXZlbiBzdGFja1xuICAgKi9cbiAgcHVibGljIGdldEFzc2V0TWFuaWZlc3RzRm9yU3RhY2soc3RhY2tJZDogc3RyaW5nKTogQXNzZXRNYW5pZmVzdFtdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLm1hbmlmZXN0LmFydGlmYWN0cyA/PyB7fSlcbiAgICAgIC5maWx0ZXIoYXJ0aWZhY3QgPT5cbiAgICAgICAgYXJ0aWZhY3QudHlwZSA9PT0gQXJ0aWZhY3RUeXBlLkFTU0VUX01BTklGRVNUICYmIChhcnRpZmFjdC5wcm9wZXJ0aWVzIGFzIEFzc2V0TWFuaWZlc3RQcm9wZXJ0aWVzKT8uZmlsZSA9PT0gYCR7c3RhY2tJZH0uYXNzZXRzLmpzb25gKVxuICAgICAgLm1hcChhcnRpZmFjdCA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gKGFydGlmYWN0LnByb3BlcnRpZXMgYXMgQXNzZXRNYW5pZmVzdFByb3BlcnRpZXMpLmZpbGU7XG4gICAgICAgIHJldHVybiBBc3NldE1hbmlmZXN0LmZyb21GaWxlKHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgZmlsZU5hbWUpKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGxpc3Qgb2YgYXNzZXRzIGZyb20gdGhlIGFzc2VtYmx5IG1hbmlmZXN0XG4gICAqL1xuICBwcml2YXRlIGFzc2V0c0Zyb21Bc3NlbWJseU1hbmlmZXN0KGFydGlmYWN0OiBBcnRpZmFjdE1hbmlmZXN0KTogKENvbnRhaW5lckltYWdlQXNzZXRNZXRhZGF0YUVudHJ5IHwgRmlsZUFzc2V0TWV0YWRhdGFFbnRyeSlbXSB7XG4gICAgY29uc3QgYXNzZXRzOiAoQ29udGFpbmVySW1hZ2VBc3NldE1ldGFkYXRhRW50cnkgfCBGaWxlQXNzZXRNZXRhZGF0YUVudHJ5KVtdID0gW107XG4gICAgZm9yIChjb25zdCBtZXRhZGF0YSBvZiBPYmplY3QudmFsdWVzKENsb3VkQXJ0aWZhY3QucmVhZE1ldGFkYXRhKHRoaXMuZGlyZWN0b3J5LCBhcnRpZmFjdCkgPz8ge30pKSB7XG4gICAgICBtZXRhZGF0YS5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgICBpZiAoZGF0YS50eXBlID09PSBBcnRpZmFjdE1ldGFkYXRhRW50cnlUeXBlLkFTU0VUKSB7XG4gICAgICAgICAgY29uc3QgYXNzZXQgPSAoZGF0YS5kYXRhIGFzIENvbnRhaW5lckltYWdlQXNzZXRNZXRhZGF0YUVudHJ5IHwgRmlsZUFzc2V0TWV0YWRhdGFFbnRyeSk7XG4gICAgICAgICAgaWYgKGFzc2V0LnBhdGguc3RhcnRzV2l0aCgnYXNzZXQuJykpIHtcbiAgICAgICAgICAgIGFzc2V0cy5wdXNoKGFzc2V0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXNzZXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGxpc3Qgb2YgYXNzZXRzIGZyb20gdGhlIGFzc2V0IG1hbmlmZXN0XG4gICAqL1xuICBwcml2YXRlIGFzc2V0c0Zyb21Bc3NldE1hbmlmZXN0KGFydGlmYWN0OiBBcnRpZmFjdE1hbmlmZXN0KTogKEZpbGVNYW5pZmVzdEVudHJ5IHwgRG9ja2VySW1hZ2VNYW5pZmVzdEVudHJ5KVtdIHtcbiAgICBjb25zdCBhc3NldHM6IChGaWxlTWFuaWZlc3RFbnRyeSB8IERvY2tlckltYWdlTWFuaWZlc3RFbnRyeSlbXSA9IFtdO1xuICAgIGNvbnN0IGZpbGVOYW1lID0gKGFydGlmYWN0LnByb3BlcnRpZXMgYXMgQXNzZXRNYW5pZmVzdFByb3BlcnRpZXMpLmZpbGU7XG4gICAgY29uc3QgYXNzZXRNYW5pZmVzdCA9IEFzc2V0TWFuaWZlc3QuZnJvbUZpbGUocGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBmaWxlTmFtZSkpO1xuICAgIGFzc2V0TWFuaWZlc3QuZW50cmllcy5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgIGlmIChlbnRyeS50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gKGVudHJ5IGFzIEZpbGVNYW5pZmVzdEVudHJ5KS5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2UucGF0aCAmJiAoc291cmNlLnBhdGguc3RhcnRzV2l0aCgnYXNzZXQuJykgfHwgc291cmNlLnBhdGguZW5kc1dpdGgoJ25lc3RlZC50ZW1wbGF0ZS5qc29uJykpKSB7XG4gICAgICAgICAgYXNzZXRzLnB1c2goZW50cnkgYXMgRmlsZU1hbmlmZXN0RW50cnkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LnR5cGUgPT09ICdkb2NrZXItaW1hZ2UnKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IChlbnRyeSBhcyBEb2NrZXJJbWFnZU1hbmlmZXN0RW50cnkpLnNvdXJjZTtcbiAgICAgICAgaWYgKHNvdXJjZS5kaXJlY3RvcnkgJiYgc291cmNlLmRpcmVjdG9yeS5zdGFydHNXaXRoKCdhc3NldC4nKSkge1xuICAgICAgICAgIGFzc2V0cy5wdXNoKGVudHJ5IGFzIERvY2tlckltYWdlTWFuaWZlc3RFbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYXNzZXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHRoZSBtYW5pZmVzdCBvZiBhbnkgdW5uZWNjZXNhcnkgZGF0YS4gQ3VycmVudGx5IHRoYXQgaW5jbHVkZXNcbiAgICogdGhlIG1ldGFkYXRhIHRyYWNlIGluZm9ybWF0aW9uIHNpbmNlIHRoaXMgaW5jbHVkZXMgdHJhY2UgaW5mb3JtYXRpb24gbGlrZVxuICAgKiBmaWxlIHN5c3RlbSBsb2NhdGlvbnMgYW5kIGZpbGUgbGluZXMgdGhhdCB3aWxsIGNoYW5nZSBkZXBlbmRpbmcgb24gd2hhdCBtYWNoaW5lIHRoZSB0ZXN0IGlzIHJ1biBvblxuICAgKi9cbiAgcHVibGljIGNsZWFuTWFuaWZlc3QoKTogdm9pZCB7XG4gICAgY29uc3QgbmV3TWFuaWZlc3QgPSB7XG4gICAgICAuLi50aGlzLm1hbmlmZXN0LFxuICAgICAgYXJ0aWZhY3RzOiB0aGlzLnJlbmRlckFydGlmYWN0cygpLFxuICAgIH07XG4gICAgTWFuaWZlc3Quc2F2ZUFzc2VtYmx5TWFuaWZlc3QobmV3TWFuaWZlc3QsIHRoaXMubWFuaWZlc3RGaWxlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckFydGlmYWN0TWV0YWRhdGEoYXJ0aWZhY3Q6IEFydGlmYWN0TWFuaWZlc3QsIHRyYWNlPzogU3RhY2tUcmFjZSk6IHsgW2lkOiBzdHJpbmddOiBNZXRhZGF0YUVudHJ5W10gfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbmV3TWV0YWRhdGE6IHsgW2lkOiBzdHJpbmddOiBNZXRhZGF0YUVudHJ5W10gfSA9IHt9O1xuICAgIGlmICghYXJ0aWZhY3QubWV0YWRhdGEpIHJldHVybiBhcnRpZmFjdC5tZXRhZGF0YTtcbiAgICBmb3IgKGNvbnN0IFttZXRhZGF0YUlkLCBtZXRhZGF0YUVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhhcnRpZmFjdC5tZXRhZGF0YSA/PyB7fSkpIHtcbiAgICAgIG5ld01ldGFkYXRhW21ldGFkYXRhSWRdID0gbWV0YWRhdGFFbnRyeS5tYXAoKG1ldGE6IE1ldGFkYXRhRW50cnkpID0+IHtcbiAgICAgICAgaWYgKG1ldGEudHlwZSA9PT0gJ2F3czpjZGs6bG9naWNhbElkJyAmJiB0cmFjZSAmJiBtZXRhLmRhdGEpIHtcbiAgICAgICAgICBjb25zdCB0cmFjZURhdGEgPSB0cmFjZS5nZXQobWV0YS5kYXRhLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIGlmICh0cmFjZURhdGEpIHtcbiAgICAgICAgICAgIHRyYWNlLmRlbGV0ZShtZXRhLmRhdGEudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0eXBlOiBtZXRhLnR5cGUsXG4gICAgICAgICAgICAgIGRhdGE6IG1ldGEuZGF0YSxcbiAgICAgICAgICAgICAgdHJhY2U6IFt0cmFjZURhdGFdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmV0dXJuIG1ldGFkYXRhIHdpdGhvdXQgdGhlIHRyYWNlIGRhdGFcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBtZXRhLnR5cGUsXG4gICAgICAgICAgZGF0YTogbWV0YS5kYXRhLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0cmFjZSAmJiB0cmFjZS5zaXplID4gMCkge1xuICAgICAgZm9yIChjb25zdCBbaWQsIGRhdGFdIG9mIHRyYWNlLmVudHJpZXMoKSkge1xuICAgICAgICBuZXdNZXRhZGF0YVtpZF0gPSBbe1xuICAgICAgICAgIHR5cGU6ICdhd3M6Y2RrOmxvZ2ljYWxJZCcsXG4gICAgICAgICAgZGF0YTogaWQsXG4gICAgICAgICAgdHJhY2U6IFtkYXRhXSxcbiAgICAgICAgfV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdNZXRhZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQXJ0aWZhY3RzKHRyYWNlPzogTWFuaWZlc3RUcmFjZSk6IHsgW2lkOiBzdHJpbmddOiBBcnRpZmFjdE1hbmlmZXN0IH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5ld0FydGlmYWN0czogeyBbaWQ6IHN0cmluZ106IEFydGlmYWN0TWFuaWZlc3QgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2FydGlmYWN0SWQsIGFydGlmYWN0XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm1hbmlmZXN0LmFydGlmYWN0cyA/PyB7fSkpIHtcbiAgICAgIGxldCBzdGFja1RyYWNlOiBTdGFja1RyYWNlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKGFydGlmYWN0LnR5cGUgPT09IEFydGlmYWN0VHlwZS5BV1NfQ0xPVURGT1JNQVRJT05fU1RBQ0sgJiYgdHJhY2UpIHtcbiAgICAgICAgc3RhY2tUcmFjZSA9IHRyYWNlLmdldChhcnRpZmFjdElkKTtcbiAgICAgIH1cbiAgICAgIG5ld0FydGlmYWN0c1thcnRpZmFjdElkXSA9IHtcbiAgICAgICAgLi4uYXJ0aWZhY3QsXG4gICAgICAgIG1ldGFkYXRhOiB0aGlzLnJlbmRlckFydGlmYWN0TWV0YWRhdGEoYXJ0aWZhY3QsIHN0YWNrVHJhY2UpLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0FydGlmYWN0cztcbiAgfVxufVxuIl19 | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQtYXNzZW1ibHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbG91ZC1hc3NlbWJseS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFFN0IsNERBQXdEO0FBQ3hELG9FQUE0RDtBQUU1RCwwRUFBbUc7QUFDbkcsK0JBQStCO0FBZS9COztHQUVHO0FBQ0gsTUFBYSxzQkFBc0I7SUFzQ2U7SUFBNkM7SUFyQ3RGLE1BQU0sQ0FBVSxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7SUFFMUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQ3JDLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLGdDQUFRLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEQsT0FBTyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLFFBQVEsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQWdCO1FBQ3JDLElBQUksRUFBRSxDQUFDO1FBQ1AsSUFBSSxDQUFDO1lBQ0gsRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsUUFBUSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFDRCxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sc0JBQXNC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LENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRU8sZUFBZSxDQUFDLEtBQXFCO1FBQzNDLE1BQU0sWUFBWSxHQUF1QyxFQUFFLENBQUM7UUFDNUQsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNuRixJQUFJLFVBQVUsR0FBMkIsU0FBUyxDQUFDO1lBQ25ELElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxvQ0FBWSxDQUFDLHdCQUF3QixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNyRSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBQ0QsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHO2dCQUN6QixHQUFHLFFBQVE7Z0JBQ1gsUUFBUSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO2FBQzVELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQzs7QUFsUEgsd0RBbVBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgRmlsZU1hbmlmZXN0RW50cnksIERvY2tlckltYWdlTWFuaWZlc3RFbnRyeSB9IGZyb20gJ0Bhd3MtY2RrL2Nkay1hc3NldHMtbGliJztcbmltcG9ydCB7IEFzc2V0TWFuaWZlc3QgfSBmcm9tICdAYXdzLWNkay9jZGstYXNzZXRzLWxpYic7XG5pbXBvcnQgeyBDbG91ZEFydGlmYWN0IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB0eXBlIHsgQXNzZW1ibHlNYW5pZmVzdCwgQXdzQ2xvdWRGb3JtYXRpb25TdGFja1Byb3BlcnRpZXMsIEFydGlmYWN0TWFuaWZlc3QsIE1ldGFkYXRhRW50cnksIEFzc2V0TWFuaWZlc3RQcm9wZXJ0aWVzLCBDb250YWluZXJJbWFnZUFzc2V0TWV0YWRhdGFFbnRyeSwgRmlsZUFzc2V0TWV0YWRhdGFFbnRyeSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgeyBNYW5pZmVzdCwgQXJ0aWZhY3RUeXBlLCBBcnRpZmFjdE1ldGFkYXRhRW50cnlUeXBlIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcblxuLyoqXG4gKiBUcmFjZSBpbmZvcm1hdGlvbiBmb3Igc3RhY2tcbiAqIG1hcCBvZiByZXNvdXJjZSBsb2dpY2FsSWQgdG8gdHJhY2UgbWVzc2FnZVxuICovXG5leHBvcnQgdHlwZSBTdGFja1RyYWNlID0gTWFwPHN0cmluZywgc3RyaW5nPjtcblxuLyoqXG4gKiBUcmFjZSBpbmZvcm1hdGlvbiBmb3IgYSBhc3NlbWJseVxuICpcbiAqIG1hcCBvZiBzdGFja0lkIHRvIFN0YWNrVHJhY2VcbiAqL1xuZXhwb3J0IHR5cGUgTWFuaWZlc3RUcmFjZSA9IE1hcDxzdHJpbmcsIFN0YWNrVHJhY2U+O1xuXG4vKipcbiAqIFJlYWRzIGEgQ2xvdWQgQXNzZW1ibHkgbWFuaWZlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfRklMRU5BTUUgPSAnbWFuaWZlc3QuanNvbic7XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgQ2xvdWQgQXNzZW1ibHkgbWFuaWZlc3QgZnJvbSBhIGZpbGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvYmogPSBNYW5pZmVzdC5sb2FkQXNzZW1ibHlNYW5pZmVzdChmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gbmV3IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIocGF0aC5kaXJuYW1lKGZpbGVOYW1lKSwgb2JqLCBmaWxlTmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGludGVnIG1hbmlmZXN0ICcke2ZpbGVOYW1lfSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIENsb3VkIEFzc2VtYmx5IG1hbmlmZXN0IGZyb20gYSBmaWxlIG9yIGEgZGlyZWN0b3J5XG4gICAqIElmIHRoZSBnaXZlbiBmaWxlUGF0aCBpcyBhIGRpcmVjdG9yeSB0aGVuIGl0IHdpbGwgbG9vayBmb3JcbiAgICogYSBmaWxlIHdpdGhpbiB0aGUgZGlyZWN0b3J5IHdpdGggdGhlIERFRkFVTFRfRklMRU5BTUVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIge1xuICAgIGxldCBzdDtcbiAgICB0cnkge1xuICAgICAgc3QgPSBmcy5zdGF0U3luYyhmaWxlUGF0aCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGludGVnIG1hbmlmZXN0IGF0ICcke2ZpbGVQYXRofSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAoc3QuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcmV0dXJuIEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbUZpbGUocGF0aC5qb2luKGZpbGVQYXRoLCBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLkRFRkFVTFRfRklMRU5BTUUpKTtcbiAgICB9XG4gICAgcmV0dXJuIEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbUZpbGUoZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1hbmlmZXN0IHdhcyBmb3VuZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRpcmVjdG9yeTogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0OiBBc3NlbWJseU1hbmlmZXN0LCBwcml2YXRlIHJlYWRvbmx5IG1hbmlmZXN0RmlsZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3RhY2tzIGZyb20gdGhlIG1hbmlmZXN0XG4gICAqIHJldHVybnMgYSBtYXAgb2YgYXJ0aWZhY3RJZCB0byBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZVxuICAgKi9cbiAgcHVibGljIGdldCBzdGFja3MoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3Qgc3RhY2tzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBbYXJ0aWZhY3RJZCwgYXJ0aWZhY3RdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMubWFuaWZlc3QuYXJ0aWZhY3RzID8/IHt9KSkge1xuICAgICAgaWYgKGFydGlmYWN0LnR5cGUgIT09IEFydGlmYWN0VHlwZS5BV1NfQ0xPVURGT1JNQVRJT05fU1RBQ0spIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwcm9wcyA9IGFydGlmYWN0LnByb3BlcnRpZXMgYXMgQXdzQ2xvdWRGb3JtYXRpb25TdGFja1Byb3BlcnRpZXM7XG5cbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZnMucmVhZEpTT05TeW5jKHBhdGgucmVzb2x2ZSh0aGlzLmRpcmVjdG9yeSwgcHJvcHMudGVtcGxhdGVGaWxlKSk7XG4gICAgICBzdGFja3NbYXJ0aWZhY3RJZF0gPSB0ZW1wbGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5lc3RlZCBzdGFja3MgZm9yIGEgZ2l2ZW4gc3RhY2tcbiAgICogcmV0dXJucyBhIG1hcCBvZiBhcnRpZmFjdElkIHRvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0TmVzdGVkU3RhY2tzRm9yU3RhY2soc3RhY2tJZDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgbmVzdGVkVGVtcGxhdGVzOiBzdHJpbmdbXSA9IHRoaXMuZ2V0QXNzZXRNYW5pZmVzdHNGb3JTdGFjayhzdGFja0lkKS5mbGF0TWFwKFxuICAgICAgbWFuaWZlc3QgPT4gbWFuaWZlc3QuZmlsZXNcbiAgICAgICAgLmZpbHRlcihhc3NldCA9PiBhc3NldC5zb3VyY2UucGF0aD8uZW5kc1dpdGgoJy5uZXN0ZWQudGVtcGxhdGUuanNvbicpKVxuICAgICAgICAubWFwKGFzc2V0ID0+IGFzc2V0LnNvdXJjZS5wYXRoISksXG4gICAgKTtcblxuICAgIGNvbnN0IG5lc3RlZFN0YWNrczogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5mcm9tRW50cmllcyhuZXN0ZWRUZW1wbGF0ZXMubWFwKHRlbXBsYXRlRmlsZSA9PiAoW1xuICAgICAgdGVtcGxhdGVGaWxlLnNwbGl0KCcuJywgMSlbMF0sXG4gICAgICBmcy5yZWFkSlNPTlN5bmMocGF0aC5yZXNvbHZlKHRoaXMuZGlyZWN0b3J5LCB0ZW1wbGF0ZUZpbGUpKSxcbiAgICBdKSkpO1xuXG4gICAgcmV0dXJuIG5lc3RlZFN0YWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSB0cmFjZSBkYXRhIHRvIHRoZSBhc3NlbWJseSBtYW5pZmVzdCBtZXRhZGF0YVxuICAgKi9cbiAgcHVibGljIHJlY29yZFRyYWNlKHRyYWNlOiBNYW5pZmVzdFRyYWNlKTogdm9pZCB7XG4gICAgY29uc3QgbmV3TWFuaWZlc3QgPSB7XG4gICAgICAuLi50aGlzLm1hbmlmZXN0LFxuICAgICAgYXJ0aWZhY3RzOiB0aGlzLnJlbmRlckFydGlmYWN0cyh0cmFjZSksXG4gICAgfTtcbiAgICBNYW5pZmVzdC5zYXZlQXNzZW1ibHlNYW5pZmVzdChuZXdNYW5pZmVzdCwgdGhpcy5tYW5pZmVzdEZpbGVOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFzc2V0cyBmb3IgYSBnaXZlbiBzdGFja1xuICAgKi9cbiAgcHVibGljIGdldEFzc2V0SWRzRm9yU3RhY2soc3RhY2tJZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGFzc2V0czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIE9iamVjdC52YWx1ZXModGhpcy5tYW5pZmVzdC5hcnRpZmFjdHMgPz8ge30pKSB7XG4gICAgICBpZiAoYXJ0aWZhY3QudHlwZSA9PT0gQXJ0aWZhY3RUeXBlLkFTU0VUX01BTklGRVNUICYmIChhcnRpZmFjdC5wcm9wZXJ0aWVzIGFzIEFzc2V0TWFuaWZlc3RQcm9wZXJ0aWVzKT8uZmlsZSA9PT0gYCR7c3RhY2tJZH0uYXNzZXRzLmpzb25gKSB7XG4gICAgICAgIGFzc2V0cy5wdXNoKC4uLnRoaXMuYXNzZXRzRnJvbUFzc2V0TWFuaWZlc3QoYXJ0aWZhY3QpLm1hcChhc3NldCA9PiBhc3NldC5pZC5hc3NldElkKSk7XG4gICAgICB9IGVsc2UgaWYgKGFydGlmYWN0LnR5cGUgPT09IEFydGlmYWN0VHlwZS5BV1NfQ0xPVURGT1JNQVRJT05fU1RBQ0spIHtcbiAgICAgICAgYXNzZXRzLnB1c2goLi4udGhpcy5hc3NldHNGcm9tQXNzZW1ibHlNYW5pZmVzdChhcnRpZmFjdCkubWFwKGFzc2V0ID0+IGFzc2V0LmlkKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhc3NldHM7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGEgZ2l2ZW4gc3RhY2tJZCByZXR1cm4gYSBsaXN0IG9mIGFzc2V0cyB0aGF0IGJlbG9uZyB0byB0aGUgc3RhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRBc3NldExvY2F0aW9uc0ZvclN0YWNrKHN0YWNrSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhc3NldHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBPYmplY3QudmFsdWVzKHRoaXMubWFuaWZlc3QuYXJ0aWZhY3RzID8/IHt9KSkge1xuICAgICAgaWYgKGFydGlmYWN0LnR5cGUgPT09IEFydGlmYWN0VHlwZS5BU1NFVF9NQU5JRkVTVCAmJiAoYXJ0aWZhY3QucHJvcGVydGllcyBhcyBBc3NldE1hbmlmZXN0UHJvcGVydGllcyk/LmZpbGUgPT09IGAke3N0YWNrSWR9LmFzc2V0cy5qc29uYCkge1xuICAgICAgICBhc3NldHMucHVzaCguLi50aGlzLmFzc2V0c0Zyb21Bc3NldE1hbmlmZXN0KGFydGlmYWN0KS5mbGF0TWFwKGFzc2V0ID0+IHtcbiAgICAgICAgICBpZiAoYXNzZXQudHlwZSA9PT0gJ2ZpbGUnICYmICFhc3NldC5zb3VyY2UucGF0aD8uZW5kc1dpdGgoJ25lc3RlZC50ZW1wbGF0ZS5qc29uJykpIHtcbiAgICAgICAgICAgIHJldHVybiBhc3NldC5zb3VyY2UucGF0aCE7XG4gICAgICAgICAgfSBlbHNlIGlmIChhc3NldC50eXBlICE9PSAnZmlsZScpIHtcbiAgICAgICAgICAgIHJldHVybiBhc3NldC5zb3VyY2UuZGlyZWN0b3J5ITtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2UgaWYgKGFydGlmYWN0LnR5cGUgPT09IEFydGlmYWN0VHlwZS5BV1NfQ0xPVURGT1JNQVRJT05fU1RBQ0spIHtcbiAgICAgICAgYXNzZXRzLnB1c2goLi4udGhpcy5hc3NldHNGcm9tQXNzZW1ibHlNYW5pZmVzdChhcnRpZmFjdCkubWFwKGFzc2V0ID0+IGFzc2V0LnBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFzc2V0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFzc2V0IGFydGlmYWN0cyBmb3IgYSBnaXZlbiBzdGFja1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRBc3NldE1hbmlmZXN0c0ZvclN0YWNrKHN0YWNrSWQ6IHN0cmluZyk6IEFzc2V0TWFuaWZlc3RbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tYW5pZmVzdC5hcnRpZmFjdHMgPz8ge30pXG4gICAgICAuZmlsdGVyKGFydGlmYWN0ID0+XG4gICAgICAgIGFydGlmYWN0LnR5cGUgPT09IEFydGlmYWN0VHlwZS5BU1NFVF9NQU5JRkVTVCAmJiAoYXJ0aWZhY3QucHJvcGVydGllcyBhcyBBc3NldE1hbmlmZXN0UHJvcGVydGllcyk/LmZpbGUgPT09IGAke3N0YWNrSWR9LmFzc2V0cy5qc29uYClcbiAgICAgIC5tYXAoYXJ0aWZhY3QgPT4ge1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IChhcnRpZmFjdC5wcm9wZXJ0aWVzIGFzIEFzc2V0TWFuaWZlc3RQcm9wZXJ0aWVzKS5maWxlO1xuICAgICAgICByZXR1cm4gQXNzZXRNYW5pZmVzdC5mcm9tRmlsZShwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIGZpbGVOYW1lKSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBsaXN0IG9mIGFzc2V0cyBmcm9tIHRoZSBhc3NlbWJseSBtYW5pZmVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3NldHNGcm9tQXNzZW1ibHlNYW5pZmVzdChhcnRpZmFjdDogQXJ0aWZhY3RNYW5pZmVzdCk6IChDb250YWluZXJJbWFnZUFzc2V0TWV0YWRhdGFFbnRyeSB8IEZpbGVBc3NldE1ldGFkYXRhRW50cnkpW10ge1xuICAgIGNvbnN0IGFzc2V0czogKENvbnRhaW5lckltYWdlQXNzZXRNZXRhZGF0YUVudHJ5IHwgRmlsZUFzc2V0TWV0YWRhdGFFbnRyeSlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbWV0YWRhdGEgb2YgT2JqZWN0LnZhbHVlcyhDbG91ZEFydGlmYWN0LnJlYWRNZXRhZGF0YSh0aGlzLmRpcmVjdG9yeSwgYXJ0aWZhY3QpID8/IHt9KSkge1xuICAgICAgbWV0YWRhdGEuZm9yRWFjaChkYXRhID0+IHtcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gQXJ0aWZhY3RNZXRhZGF0YUVudHJ5VHlwZS5BU1NFVCkge1xuICAgICAgICAgIGNvbnN0IGFzc2V0ID0gKGRhdGEuZGF0YSBhcyBDb250YWluZXJJbWFnZUFzc2V0TWV0YWRhdGFFbnRyeSB8IEZpbGVBc3NldE1ldGFkYXRhRW50cnkpO1xuICAgICAgICAgIGlmIChhc3NldC5wYXRoLnN0YXJ0c1dpdGgoJ2Fzc2V0LicpKSB7XG4gICAgICAgICAgICBhc3NldHMucHVzaChhc3NldCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFzc2V0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBsaXN0IG9mIGFzc2V0cyBmcm9tIHRoZSBhc3NldCBtYW5pZmVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3NldHNGcm9tQXNzZXRNYW5pZmVzdChhcnRpZmFjdDogQXJ0aWZhY3RNYW5pZmVzdCk6IChGaWxlTWFuaWZlc3RFbnRyeSB8IERvY2tlckltYWdlTWFuaWZlc3RFbnRyeSlbXSB7XG4gICAgY29uc3QgYXNzZXRzOiAoRmlsZU1hbmlmZXN0RW50cnkgfCBEb2NrZXJJbWFnZU1hbmlmZXN0RW50cnkpW10gPSBbXTtcbiAgICBjb25zdCBmaWxlTmFtZSA9IChhcnRpZmFjdC5wcm9wZXJ0aWVzIGFzIEFzc2V0TWFuaWZlc3RQcm9wZXJ0aWVzKS5maWxlO1xuICAgIGNvbnN0IGFzc2V0TWFuaWZlc3QgPSBBc3NldE1hbmlmZXN0LmZyb21GaWxlKHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgZmlsZU5hbWUpKTtcbiAgICBhc3NldE1hbmlmZXN0LmVudHJpZXMuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IChlbnRyeSBhcyBGaWxlTWFuaWZlc3RFbnRyeSkuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlLnBhdGggJiYgKHNvdXJjZS5wYXRoLnN0YXJ0c1dpdGgoJ2Fzc2V0LicpIHx8IHNvdXJjZS5wYXRoLmVuZHNXaXRoKCduZXN0ZWQudGVtcGxhdGUuanNvbicpKSkge1xuICAgICAgICAgIGFzc2V0cy5wdXNoKGVudHJ5IGFzIEZpbGVNYW5pZmVzdEVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnZG9ja2VyLWltYWdlJykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSAoZW50cnkgYXMgRG9ja2VySW1hZ2VNYW5pZmVzdEVudHJ5KS5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2UuZGlyZWN0b3J5ICYmIHNvdXJjZS5kaXJlY3Rvcnkuc3RhcnRzV2l0aCgnYXNzZXQuJykpIHtcbiAgICAgICAgICBhc3NldHMucHVzaChlbnRyeSBhcyBEb2NrZXJJbWFnZU1hbmlmZXN0RW50cnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFzc2V0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB0aGUgbWFuaWZlc3Qgb2YgYW55IHVubmVjY2VzYXJ5IGRhdGEuIEN1cnJlbnRseSB0aGF0IGluY2x1ZGVzXG4gICAqIHRoZSBtZXRhZGF0YSB0cmFjZSBpbmZvcm1hdGlvbiBzaW5jZSB0aGlzIGluY2x1ZGVzIHRyYWNlIGluZm9ybWF0aW9uIGxpa2VcbiAgICogZmlsZSBzeXN0ZW0gbG9jYXRpb25zIGFuZCBmaWxlIGxpbmVzIHRoYXQgd2lsbCBjaGFuZ2UgZGVwZW5kaW5nIG9uIHdoYXQgbWFjaGluZSB0aGUgdGVzdCBpcyBydW4gb25cbiAgICovXG4gIHB1YmxpYyBjbGVhbk1hbmlmZXN0KCk6IHZvaWQge1xuICAgIGNvbnN0IG5ld01hbmlmZXN0ID0ge1xuICAgICAgLi4udGhpcy5tYW5pZmVzdCxcbiAgICAgIGFydGlmYWN0czogdGhpcy5yZW5kZXJBcnRpZmFjdHMoKSxcbiAgICB9O1xuICAgIE1hbmlmZXN0LnNhdmVBc3NlbWJseU1hbmlmZXN0KG5ld01hbmlmZXN0LCB0aGlzLm1hbmlmZXN0RmlsZU5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBcnRpZmFjdE1ldGFkYXRhKGFydGlmYWN0OiBBcnRpZmFjdE1hbmlmZXN0LCB0cmFjZT86IFN0YWNrVHJhY2UpOiB7IFtpZDogc3RyaW5nXTogTWV0YWRhdGFFbnRyeVtdIH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5ld01ldGFkYXRhOiB7IFtpZDogc3RyaW5nXTogTWV0YWRhdGFFbnRyeVtdIH0gPSB7fTtcbiAgICBpZiAoIWFydGlmYWN0Lm1ldGFkYXRhKSByZXR1cm4gYXJ0aWZhY3QubWV0YWRhdGE7XG4gICAgZm9yIChjb25zdCBbbWV0YWRhdGFJZCwgbWV0YWRhdGFFbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoYXJ0aWZhY3QubWV0YWRhdGEgPz8ge30pKSB7XG4gICAgICBuZXdNZXRhZGF0YVttZXRhZGF0YUlkXSA9IG1ldGFkYXRhRW50cnkubWFwKChtZXRhOiBNZXRhZGF0YUVudHJ5KSA9PiB7XG4gICAgICAgIGlmIChtZXRhLnR5cGUgPT09ICdhd3M6Y2RrOmxvZ2ljYWxJZCcgJiYgdHJhY2UgJiYgbWV0YS5kYXRhKSB7XG4gICAgICAgICAgY29uc3QgdHJhY2VEYXRhID0gdHJhY2UuZ2V0KG1ldGEuZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgICBpZiAodHJhY2VEYXRhKSB7XG4gICAgICAgICAgICB0cmFjZS5kZWxldGUobWV0YS5kYXRhLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdHlwZTogbWV0YS50eXBlLFxuICAgICAgICAgICAgICBkYXRhOiBtZXRhLmRhdGEsXG4gICAgICAgICAgICAgIHRyYWNlOiBbdHJhY2VEYXRhXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJldHVybiBtZXRhZGF0YSB3aXRob3V0IHRoZSB0cmFjZSBkYXRhXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogbWV0YS50eXBlLFxuICAgICAgICAgIGRhdGE6IG1ldGEuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodHJhY2UgJiYgdHJhY2Uuc2l6ZSA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgW2lkLCBkYXRhXSBvZiB0cmFjZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgbmV3TWV0YWRhdGFbaWRdID0gW3tcbiAgICAgICAgICB0eXBlOiAnYXdzOmNkazpsb2dpY2FsSWQnLFxuICAgICAgICAgIGRhdGE6IGlkLFxuICAgICAgICAgIHRyYWNlOiBbZGF0YV0sXG4gICAgICAgIH1dO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3TWV0YWRhdGE7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckFydGlmYWN0cyh0cmFjZT86IE1hbmlmZXN0VHJhY2UpOiB7IFtpZDogc3RyaW5nXTogQXJ0aWZhY3RNYW5pZmVzdCB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBuZXdBcnRpZmFjdHM6IHsgW2lkOiBzdHJpbmddOiBBcnRpZmFjdE1hbmlmZXN0IH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFthcnRpZmFjdElkLCBhcnRpZmFjdF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5tYW5pZmVzdC5hcnRpZmFjdHMgPz8ge30pKSB7XG4gICAgICBsZXQgc3RhY2tUcmFjZTogU3RhY2tUcmFjZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChhcnRpZmFjdC50eXBlID09PSBBcnRpZmFjdFR5cGUuQVdTX0NMT1VERk9STUFUSU9OX1NUQUNLICYmIHRyYWNlKSB7XG4gICAgICAgIHN0YWNrVHJhY2UgPSB0cmFjZS5nZXQoYXJ0aWZhY3RJZCk7XG4gICAgICB9XG4gICAgICBuZXdBcnRpZmFjdHNbYXJ0aWZhY3RJZF0gPSB7XG4gICAgICAgIC4uLmFydGlmYWN0LFxuICAgICAgICBtZXRhZGF0YTogdGhpcy5yZW5kZXJBcnRpZmFjdE1ldGFkYXRhKGFydGlmYWN0LCBzdGFja1RyYWNlKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBuZXdBcnRpZmFjdHM7XG4gIH1cbn1cbiJdfQ== |
@@ -1,3 +0,2 @@ | ||
| import type { IntegRunnerOptions } from './runner-base'; | ||
| import { IntegRunner } from './runner-base'; | ||
| import type { CdkIntegHelperOptions } from './cdk-integ-helper'; | ||
| import type { Diagnostic, DestructiveChange, SnapshotVerificationOptions } from '../workers/common'; | ||
@@ -8,7 +7,12 @@ /** | ||
| */ | ||
| export declare class IntegSnapshotRunner extends IntegRunner { | ||
| constructor(options: Omit<IntegRunnerOptions, 'region'>); | ||
| export declare class IntegSnapshotRunner { | ||
| private readonly helper; | ||
| constructor(options: Omit<CdkIntegHelperOptions, 'region'>); | ||
| hasSnapshot(): boolean; | ||
| actualTests(): Promise<{ | ||
| [testName: string]: import("@aws-cdk/cloud-assembly-schema").TestCase; | ||
| } | undefined>; | ||
| dontCareAboutLegacyLookupsForTests(): void; | ||
| /** | ||
| * Synth the integration tests and compare the templates | ||
| * to the existing snapshot. | ||
| * Synth the CDK app and compare the templates to the existing snapshot. | ||
| * | ||
@@ -15,0 +19,0 @@ * @returns any diagnostics and any destructive changes |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"snapshot-test-runner.d.ts","sourceRoot":"","sources":["snapshot-test-runner.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,WAAW,EAAyB,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAsBpG;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;gBACtC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC;IAOvD;;;;;OAKG;IACU,YAAY,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC;QAC5E,WAAW,EAAE,UAAU,EAAE,CAAC;QAC1B,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;KACzC,CAAC;IAkEF;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;;;;;OAMG;YACW,8BAA8B;IAS5C;;;;;;OAMG;YACW,YAAY;IAuG1B,OAAO,CAAC,YAAY;IAIpB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;CA4E7B"} | ||
| {"version":3,"file":"snapshot-test-runner.d.ts","sourceRoot":"","sources":["snapshot-test-runner.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAsBpG;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAC5B,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC;IAOnD,WAAW;IAIX,WAAW;;;IAIX,kCAAkC;IAIzC;;;;OAIG;IACU,YAAY,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC;QAC5E,WAAW,EAAE,UAAU,EAAE,CAAC;QAC1B,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;KACzC,CAAC;IAoDF;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;;;;;OAMG;YACW,8BAA8B;IAS5C;;;;;;OAMG;YACW,YAAY;IAuG1B,OAAO,CAAC,YAAY;IAIpB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;CA4E7B"} |
@@ -9,4 +9,4 @@ "use strict"; | ||
| const cloudformation_diff_1 = require("@aws-cdk/cloudformation-diff"); | ||
| const cdk_integ_helper_1 = require("./cdk-integ-helper"); | ||
| const cloud_assembly_1 = require("./private/cloud-assembly"); | ||
| const runner_base_1 = require("./runner-base"); | ||
| const common_1 = require("../workers/common"); | ||
@@ -17,5 +17,6 @@ /** | ||
| */ | ||
| class IntegSnapshotRunner extends runner_base_1.IntegRunner { | ||
| class IntegSnapshotRunner { | ||
| helper; | ||
| constructor(options) { | ||
| super({ | ||
| this.helper = cdk_integ_helper_1.CdkIntegHelper.create({ | ||
| ...options, | ||
@@ -25,5 +26,13 @@ region: cloud_assembly_api_1.UNKNOWN_REGION, | ||
| } | ||
| hasSnapshot() { | ||
| return this.helper.hasSnapshot(); | ||
| } | ||
| actualTests() { | ||
| return this.helper.actualTests(); | ||
| } | ||
| dontCareAboutLegacyLookupsForTests() { | ||
| this.helper.configureLegacyEnableLookups('dont-care'); | ||
| } | ||
| /** | ||
| * Synth the integration tests and compare the templates | ||
| * to the existing snapshot. | ||
| * Synth the CDK app and compare the templates to the existing snapshot. | ||
| * | ||
@@ -35,19 +44,10 @@ * @returns any diagnostics and any destructive changes | ||
| try { | ||
| const expectedTestSuite = await this.expectedTestSuite(); | ||
| const actualTestSuite = await this.actualTestSuite(); | ||
| const expectedSnapshotAssembly = this.getSnapshotAssembly(this.snapshotDir, expectedTestSuite?.stacks); | ||
| // synth the integration test | ||
| // FIXME: ideally we should not need to run this again if | ||
| // the cdkOutDir exists already, but for some reason generateActualSnapshot | ||
| // generates an incorrect snapshot and I have no idea why so synth again here | ||
| // to produce the "correct" snapshot | ||
| const env = runner_base_1.DEFAULT_SYNTH_OPTIONS.env; | ||
| await this.cdk.synth({ | ||
| app: this.cdkApp, | ||
| context: this.getContext(actualTestSuite.enableLookups ? runner_base_1.DEFAULT_SYNTH_OPTIONS.context : {}), | ||
| env, | ||
| output: path.relative(this.directory, this.cdkOutDir), | ||
| }); | ||
| // Read the "expected" snapshot | ||
| const expectedTestSuite = await this.helper.expectedTestSuite(); | ||
| const expectedSnapshotAssembly = this.getSnapshotAssembly(this.helper.goldenSnapshotDir, expectedTestSuite?.stacks); | ||
| // Configure settings from the golden snapshot | ||
| this.helper.configureLegacyEnableLookups(expectedTestSuite?.enableLookups ?? false); | ||
| // read the "actual" snapshot | ||
| const actualSnapshotAssembly = this.getSnapshotAssembly(this.cdkOutDir, actualTestSuite.stacks); | ||
| const actualSnapshot = await this.helper.actualSnapshot(); | ||
| const actualSnapshotAssembly = this.getSnapshotAssembly(this.helper.cdkOutDir, actualSnapshot.testDefinition.stacks); | ||
| // diff the existing snapshot (expected) with the integration test (actual) | ||
@@ -59,10 +59,7 @@ const diagnostics = await this.diffAssembly(expectedSnapshotAssembly, actualSnapshotAssembly); | ||
| if (options.retain) { | ||
| additionalMessages.push(`(Failure retained) Expected: ${path.relative(process.cwd(), this.snapshotDir)}`, ` Actual: ${path.relative(process.cwd(), this.cdkOutDir)}`), | ||
| additionalMessages.push(`(Failure retained) Expected: ${path.relative(process.cwd(), this.helper.goldenSnapshotDir)}`, ` Actual: ${path.relative(process.cwd(), this.helper.cdkOutDir)}`), | ||
| doClean = false; | ||
| } | ||
| if (options.verbose) { | ||
| // Show the command necessary to repro this | ||
| const envSet = Object.entries(env).map(([k, v]) => `${k}='${v}'`); | ||
| const envCmd = envSet.length > 0 ? ['env', ...envSet] : []; | ||
| additionalMessages.push('Repro:', ` ${[...envCmd, 'cdk synth', `-a '${this.cdkApp}'`, `-o '${this.cdkOutDir}'`, ...Object.entries(this.getContext()).flatMap(([k, v]) => typeof v !== 'object' ? [`-c '${k}=${v}'`] : [])].join(' ')}`); | ||
| additionalMessages.push('Repro:', ` ${this.helper.actualSynthReproCommand().join(' ')}`); | ||
| } | ||
@@ -81,3 +78,3 @@ diagnostics.diagnostics[0] = { | ||
| if (doClean) { | ||
| this.cleanup(); | ||
| this.helper.cleanup(); | ||
| } | ||
@@ -121,3 +118,3 @@ } | ||
| async getAllowedDestroyTypesForStack(stackId) { | ||
| for (const testCase of Object.values((await this.actualTests()) ?? {})) { | ||
| for (const testCase of Object.values((await this.helper.actualTests()) ?? {})) { | ||
| if (testCase.stacks.includes(stackId)) { | ||
@@ -145,3 +142,3 @@ return testCase.allowDestroy; | ||
| failures.push({ | ||
| testName: this.testName, | ||
| testName: this.helper.testName, | ||
| stackName: templateId, | ||
@@ -160,3 +157,3 @@ reason: common_1.DiagnosticReason.SNAPSHOT_FAILED, | ||
| failures.push({ | ||
| testName: this.testName, | ||
| testName: this.helper.testName, | ||
| stackName: templateId, | ||
@@ -170,3 +167,3 @@ reason: common_1.DiagnosticReason.SNAPSHOT_FAILED, | ||
| const config = { | ||
| diffAssets: (await this.actualTestSuite()).getOptionsForStack(stackId)?.diffAssets, | ||
| diffAssets: (await this.helper.actualSnapshot()).testDefinition.getOptionsForStack(stackId)?.diffAssets, | ||
| }; | ||
@@ -223,3 +220,3 @@ let actualTemplate = actual[stackId].templates[templateId]; | ||
| stackName: templateId, | ||
| testName: this.testName, | ||
| testName: this.helper.testName, | ||
| config, | ||
@@ -334,2 +331,2 @@ }); | ||
| } | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtdGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzbmFwc2hvdC10ZXN0LXJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFFN0IsbUNBQWtDO0FBQ2xDLG1EQUErQztBQUMvQyxvRUFBNkQ7QUFFN0Qsc0VBQTJGO0FBQzNGLDZEQUFrRTtBQUVsRSwrQ0FBbUU7QUFFbkUsOENBQXFEO0FBcUJyRDs7O0dBR0c7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHlCQUFXO0lBQ2xELFlBQVksT0FBMkM7UUFDckQsS0FBSyxDQUFDO1lBQ0osR0FBRyxPQUFPO1lBQ1YsTUFBTSxFQUFFLG1DQUFjO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBdUMsRUFBRTtRQUlqRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pELE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFdkcsNkJBQTZCO1lBQzdCLHlEQUF5RDtZQUN6RCwyRUFBMkU7WUFDM0UsNkVBQTZFO1lBQzdFLG9DQUFvQztZQUNwQyxNQUFNLEdBQUcsR0FBRyxtQ0FBcUIsQ0FBQyxHQUFHLENBQUM7WUFDdEMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDbkIsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNoQixPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENB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RUQsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7UUFDbkIsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQXdDO1FBQzdDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IFdyaXRhYmxlT3B0aW9ucyB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBXcml0YWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBTdHJpbmdEZWNvZGVyIH0gZnJvbSAnc3RyaW5nX2RlY29kZXInO1xuaW1wb3J0IHsgVU5LTk9XTl9SRUdJT04gfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZURpZmZlcmVuY2UgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCB7IGZ1bGxEaWZmLCBmb3JtYXREaWZmZXJlbmNlcywgUmVzb3VyY2VJbXBhY3QgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCB7IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIgfSBmcm9tICcuL3ByaXZhdGUvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBJbnRlZ1J1bm5lck9wdGlvbnMgfSBmcm9tICcuL3J1bm5lci1iYXNlJztcbmltcG9ydCB7IEludGVnUnVubmVyLCBERUZBVUxUX1NZTlRIX09QVElPTlMgfSBmcm9tICcuL3J1bm5lci1iYXNlJztcbmltcG9ydCB0eXBlIHsgRGlhZ25vc3RpYywgRGVzdHJ1Y3RpdmVDaGFuZ2UsIFNuYXBzaG90VmVyaWZpY2F0aW9uT3B0aW9ucyB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcbmltcG9ydCB7IERpYWdub3N0aWNSZWFzb24gfSBmcm9tICcuLi93b3JrZXJzL2NvbW1vbic7XG5cbmludGVyZmFjZSBTbmFwc2hvdEFzc2VtYmx5IHtcbiAgLyoqXG4gICAqIE1hcCBvZiBzdGFja3MgdGhhdCBhcmUgcGFydCBvZiB0aGlzIGFzc2VtYmx5XG4gICAqL1xuICBbc3RhY2tOYW1lOiBzdHJpbmddOiB7XG4gICAgLyoqXG4gICAgICogQWxsIHRlbXBsYXRlcyBmb3IgdGhpcyBzdGFjaywgaW5jbHVkaW5nIG5lc3RlZCBzdGFja3NcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZXM6IHtcbiAgICAgIFt0ZW1wbGF0ZUlkOiBzdHJpbmddOiBhbnk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgYXNzZXQgSWRzIHRoYXQgYXJlIHVzZWQgYnkgdGhpcyBhc3NlbWJseVxuICAgICAqL1xuICAgIGFzc2V0czogc3RyaW5nW107XG4gIH07XG59XG5cbi8qKlxuICogUnVubmVyIGZvciBzbmFwc2hvdCB0ZXN0cy4gVGhpcyBoYW5kbGVzIG9yY2hlc3RyYXRpbmdcbiAqIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IHNuYXBzaG90c1xuICovXG5leHBvcnQgY2xhc3MgSW50ZWdTbmFwc2hvdFJ1bm5lciBleHRlbmRzIEludGVnUnVubmVyIHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogT21pdDxJbnRlZ1J1bm5lck9wdGlvbnMsICdyZWdpb24nPikge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICByZWdpb246IFVOS05PV05fUkVHSU9OLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0cyBhbmQgY29tcGFyZSB0aGUgdGVtcGxhdGVzXG4gICAqIHRvIHRoZSBleGlzdGluZyBzbmFwc2hvdC5cbiAgICpcbiAgICogQHJldHVybnMgYW55IGRpYWdub3N0aWNzIGFuZCBhbnkgZGVzdHJ1Y3RpdmUgY2hhbmdlc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHRlc3RTbmFwc2hvdChvcHRpb25zOiBTbmFwc2hvdFZlcmlmaWNhdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8e1xuICAgIGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW107XG4gICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzOiBEZXN0cnVjdGl2ZUNoYW5nZVtdO1xuICB9PiB7XG4gICAgbGV0IGRvQ2xlYW4gPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleHBlY3RlZFRlc3RTdWl0ZSA9IGF3YWl0IHRoaXMuZXhwZWN0ZWRUZXN0U3VpdGUoKTtcbiAgICAgIGNvbnN0IGFjdHVhbFRlc3RTdWl0ZSA9IGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCk7XG4gICAgICBjb25zdCBleHBlY3RlZFNuYXBzaG90QXNzZW1ibHkgPSB0aGlzLmdldFNuYXBzaG90QXNzZW1ibHkodGhpcy5zbmFwc2hvdERpciwgZXhwZWN0ZWRUZXN0U3VpdGU/LnN0YWNrcyk7XG5cbiAgICAgIC8vIHN5bnRoIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0XG4gICAgICAvLyBGSVhNRTogaWRlYWxseSB3ZSBzaG91bGQgbm90IG5lZWQgdG8gcnVuIHRoaXMgYWdhaW4gaWZcbiAgICAgIC8vIHRoZSBjZGtPdXREaXIgZXhpc3RzIGFscmVhZHksIGJ1dCBmb3Igc29tZSByZWFzb24gZ2VuZXJhdGVBY3R1YWxTbmFwc2hvdFxuICAgICAgLy8gZ2VuZXJhdGVzIGFuIGluY29ycmVjdCBzbmFwc2hvdCBhbmQgSSBoYXZlIG5vIGlkZWEgd2h5IHNvIHN5bnRoIGFnYWluIGhlcmVcbiAgICAgIC8vIHRvIHByb2R1Y2UgdGhlIFwiY29ycmVjdFwiIHNuYXBzaG90XG4gICAgICBjb25zdCBlbnYgPSBERUZBVUxUX1NZTlRIX09QVElPTlMuZW52O1xuICAgICAgYXdhaXQgdGhpcy5jZGsuc3ludGgoe1xuICAgICAgICBhcHA6IHRoaXMuY2RrQXBwLFxuICAgICAgICBjb250ZXh0OiB0aGlzLmdldENvbnRleHQoYWN0dWFsVGVzdFN1aXRlLmVuYWJsZUxvb2t1cHMgPyBERUZBVUxUX1NZTlRIX09QVElPTlMuY29udGV4dCA6IHt9KSxcbiAgICAgICAgZW52LFxuICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyByZWFkIHRoZSBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAgICBjb25zdCBhY3R1YWxTbmFwc2hvdEFzc2VtYmx5ID0gdGhpcy5nZXRTbmFwc2hvdEFzc2VtYmx5KHRoaXMuY2RrT3V0RGlyLCBhY3R1YWxUZXN0U3VpdGUuc3RhY2tzKTtcblxuICAgICAgLy8gZGlmZiB0aGUgZXhpc3Rpbmcgc25hcHNob3QgKGV4cGVjdGVkKSB3aXRoIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IChhY3R1YWwpXG4gICAgICBjb25zdCBkaWFnbm9zdGljcyA9IGF3YWl0IHRoaXMuZGlmZkFzc2VtYmx5KGV4cGVjdGVkU25hcHNob3RBc3NlbWJseSwgYWN0dWFsU25hcHNob3RBc3NlbWJseSk7XG5cbiAgICAgIGlmIChkaWFnbm9zdGljcy5kaWFnbm9zdGljcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gQXR0YWNoIGFkZGl0aW9uYWwgbWVzc2FnZXMgdG8gdGhlIGZpcnN0IGRpYWdub3N0aWNcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbE1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJldGFpbikge1xuICAgICAgICAgIGFkZGl0aW9uYWxNZXNzYWdlcy5wdXNoKFxuICAgICAgICAgICAgYChGYWlsdXJlIHJldGFpbmVkKSBFeHBlY3RlZDogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHRoaXMuc25hcHNob3REaXIpfWAsXG4gICAgICAgICAgICBgICAgICAgICAgICAgICAgICAgIEFjdHVhbDogICAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgdGhpcy5jZGtPdXREaXIpfWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBkb0NsZWFuID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgLy8gU2hvdyB0aGUgY29tbWFuZCBuZWNlc3NhcnkgdG8gcmVwcm8gdGhpc1xuICAgICAgICAgIGNvbnN0IGVudlNldCA9IE9iamVjdC5lbnRyaWVzKGVudikubWFwKChbaywgdl0pID0+IGAke2t9PScke3Z9J2ApO1xuICAgICAgICAgIGNvbnN0IGVudkNtZCA9IGVudlNldC5sZW5ndGggPiAwID8gWydlbnYnLCAuLi5lbnZTZXRdIDogW107XG5cbiAgICAgICAgICBhZGRpdGlvbmFsTWVzc2FnZXMucHVzaChcbiAgICAgICAgICAgICdSZXBybzonLFxuICAgICAgICAgICAgYCAgJHtbLi4uZW52Q21kLCAnY2RrIHN5bnRoJywgYC1hICcke3RoaXMuY2RrQXBwfSdgLCBgLW8gJyR7dGhpcy5jZGtPdXREaXJ9J2AsIC4uLk9iamVjdC5lbnRyaWVzKHRoaXMuZ2V0Q29udGV4dCgpKS5mbGF0TWFwKChbaywgdl0pID0+IHR5cGVvZiB2ICE9PSAnb2JqZWN0JyA/IFtgLWMgJyR7a309JHt2fSdgXSA6IFtdKV0uam9pbignICcpfWAsXG5cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlhZ25vc3RpY3MuZGlhZ25vc3RpY3NbMF0gPSB7XG4gICAgICAgICAgLi4uZGlhZ25vc3RpY3MuZGlhZ25vc3RpY3NbMF0sXG4gICAgICAgICAgYWRkaXRpb25hbE1lc3NhZ2VzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGRvQ2xlYW4pIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhIGdpdmVuIGNsb3VkIGFzc2VtYmx5IHJldHVybiBhIGNvbGxlY3Rpb24gb2YgYWxsIHRlbXBsYXRlc1xuICAgKiB0aGF0IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBzbmFwc2hvdCBhbmQgYW55IHJlcXVpcmVkIG1ldGEgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIGNsb3VkQXNzZW1ibHlEaXIgLSBUaGUgZGlyZWN0b3J5IG9mIHRoZSBjbG91ZCBhc3NlbWJseSB0byBsb29rIGZvciBzbmFwc2hvdHNcbiAgICogQHBhcmFtIHBpY2tTdGFja3MgLSBQaWNrIG9ubHkgdGhlc2Ugc3RhY2tzIGZyb20gdGhlIGNsb3VkIGFzc2VtYmx5XG4gICAqIEByZXR1cm5zIEEgU25hcHNob3RBc3NlbWJseSwgdGhlIGNvbGxlY3Rpb24gb2YgYWxsIHRlbXBsYXRlcyBpbiB0aGlzIHNuYXBzaG90IGFuZCByZXF1aXJlZCBtZXRhIGRhdGFcbiAgICovXG4gIHByaXZhdGUgZ2V0U25hcHNob3RBc3NlbWJseShjbG91ZEFzc2VtYmx5RGlyOiBzdHJpbmcsIHBpY2tTdGFja3M6IHN0cmluZ1tdID0gW10pOiBTbmFwc2hvdEFzc2VtYmx5IHtcbiAgICBjb25zdCBhc3NlbWJseSA9IHRoaXMucmVhZEFzc2VtYmx5KGNsb3VkQXNzZW1ibHlEaXIpO1xuICAgIGNvbnN0IHN0YWNrcyA9IGFzc2VtYmx5LnN0YWNrcztcbiAgICBjb25zdCBzbmFwc2hvdHM6IFNuYXBzaG90QXNzZW1ibHkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtzdGFja05hbWUsIHN0YWNrVGVtcGxhdGVdIG9mIE9iamVjdC5lbnRyaWVzKHN0YWNrcykpIHtcbiAgICAgIGlmIChwaWNrU3RhY2tzLmluY2x1ZGVzKHN0YWNrTmFtZSkpIHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLmZyb21QYXRoKGNsb3VkQXNzZW1ibHlEaXIpO1xuICAgICAgICBjb25zdCBhc3NldHMgPSBtYW5pZmVzdC5nZXRBc3NldElkc0ZvclN0YWNrKHN0YWNrTmFtZSk7XG5cbiAgICAgICAgc25hcHNob3RzW3N0YWNrTmFtZV0gPSB7XG4gICAgICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgICAgICBbc3RhY2tOYW1lXTogc3RhY2tUZW1wbGF0ZSxcbiAgICAgICAgICAgIC4uLmFzc2VtYmx5LmdldE5lc3RlZFN0YWNrc0ZvclN0YWNrKHN0YWNrTmFtZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhc3NldHMsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgYSBnaXZlbiBzdGFjayByZXR1cm4gYWxsIHJlc291cmNlIHR5cGVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgZGVzdHJveWVkXG4gICAqIGFzIHBhcnQgb2YgYSBzdGFjayB1cGRhdGVcbiAgICpcbiAgICogQHBhcmFtIHN0YWNrSWQgLSB0aGUgc3RhY2sgaWRcbiAgICogQHJldHVybnMgYSBsaXN0IG9mIHJlc291cmNlIHR5cGVzIG9yIHVuZGVmaW5lZCBpZiBub25lIGFyZSBmb3VuZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRBbGxvd2VkRGVzdHJveVR5cGVzRm9yU3RhY2soc3RhY2tJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD4ge1xuICAgIGZvciAoY29uc3QgdGVzdENhc2Ugb2YgT2JqZWN0LnZhbHVlcygoYXdhaXQgdGhpcy5hY3R1YWxUZXN0cygpKSA/PyB7fSkpIHtcbiAgICAgIGlmICh0ZXN0Q2FzZS5zdGFja3MuaW5jbHVkZXMoc3RhY2tJZCkpIHtcbiAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmFsbG93RGVzdHJveTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBleGlzdGluZyBhbmQgZXhwZWN0ZWQgc25hcHNob3RzXG4gICAqXG4gICAqIEBwYXJhbSBleGlzdGluZyAtIHRoZSBleGlzdGluZyAoZXhwZWN0ZWQpIHNuYXBzaG90XG4gICAqIEBwYXJhbSBhY3R1YWwgLSB0aGUgbmV3IChhY3R1YWwpIHNuYXBzaG90XG4gICAqIEByZXR1cm5zIGFueSBkaWFnbm9zdGljcyBhbmQgYW55IGRlc3RydWN0aXZlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlmZkFzc2VtYmx5KFxuICAgIGV4cGVjdGVkOiBTbmFwc2hvdEFzc2VtYmx5LFxuICAgIGFjdHVhbDogU25hcHNob3RBc3NlbWJseSxcbiAgKTogUHJvbWlzZTx7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW107IGRlc3RydWN0aXZlQ2hhbmdlczogRGVzdHJ1Y3RpdmVDaGFuZ2VbXSB9PiB7XG4gICAgY29uc3QgZmFpbHVyZXM6IERpYWdub3N0aWNbXSA9IFtdO1xuICAgIGNvbnN0IGRlc3RydWN0aXZlQ2hhbmdlczogRGVzdHJ1Y3RpdmVDaGFuZ2VbXSA9IFtdO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSBDRk4gdGVtcGxhdGUgaW4gdGhlIGN1cnJlbnQgc25hcHNob3RcbiAgICAvLyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAgZm9yIChjb25zdCBbc3RhY2tJZCwgc3RhY2tdIG9mIE9iamVjdC5lbnRyaWVzKGV4cGVjdGVkKSkge1xuICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZUlkIG9mIE9iamVjdC5rZXlzKHN0YWNrLnRlbXBsYXRlcykpIHtcbiAgICAgICAgaWYgKCFhY3R1YWxbc3RhY2tJZF0/LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkge1xuICAgICAgICAgIGZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgICAgdGVzdE5hbWU6IHRoaXMudGVzdE5hbWUsXG4gICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfRkFJTEVELFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7dGVtcGxhdGVJZH0gZXhpc3RzIGluIHNuYXBzaG90LCBidXQgbm90IGluIGFjdHVhbGAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdGFja0lkLCBzdGFja10gb2YgT2JqZWN0LmVudHJpZXMoYWN0dWFsKSkge1xuICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZUlkIG9mIE9iamVjdC5rZXlzKHN0YWNrLnRlbXBsYXRlcykpIHtcbiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgQ0ZOIHRlbXBsYXRlIGluIHRoZSBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAgICAvLyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IHNuYXBzaG90XG4gICAgICAgIGlmICghZXhwZWN0ZWRbc3RhY2tJZF0/LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkge1xuICAgICAgICAgIGZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgICAgdGVzdE5hbWU6IHRoaXMudGVzdE5hbWUsXG4gICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfRkFJTEVELFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7dGVtcGxhdGVJZH0gZG9lcyBub3QgZXhpc3QgaW4gc25hcHNob3QsIGJ1dCBkb2VzIGluIGFjdHVhbGAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgZGlmZkFzc2V0czogKGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCkpLmdldE9wdGlvbnNGb3JTdGFjayhzdGFja0lkKT8uZGlmZkFzc2V0cyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGxldCBhY3R1YWxUZW1wbGF0ZSA9IGFjdHVhbFtzdGFja0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07XG4gICAgICAgICAgbGV0IGV4cGVjdGVkVGVtcGxhdGUgPSBleHBlY3RlZFtzdGFja0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IHZlcmlmeWluZyBhc3NldCBoYXNoZXMgdGhlbiByZW1vdmUgdGhlIHNwZWNpZmljXG4gICAgICAgICAgLy8gYXNzZXQgaGFzaGVzIGZyb20gdGhlIHRlbXBsYXRlcyBzbyB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGUgZGlmZlxuICAgICAgICAgIC8vIGNvbXBhcmlzb25cbiAgICAgICAgICBpZiAoIWNvbmZpZy5kaWZmQXNzZXRzKSB7XG4gICAgICAgICAgICBhY3R1YWxUZW1wbGF0ZSA9IHRoaXMuY2Fub25pY2FsaXplVGVtcGxhdGUoYWN0dWFsVGVtcGxhdGUsIGFjdHVhbFtzdGFja0lkXS5hc3NldHMpO1xuICAgICAgICAgICAgZXhwZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuY2Fub25pY2FsaXplVGVtcGxhdGUoZXhwZWN0ZWRUZW1wbGF0ZSwgZXhwZWN0ZWRbc3RhY2tJZF0uYXNzZXRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVEaWZmID0gZnVsbERpZmYoZXhwZWN0ZWRUZW1wbGF0ZSwgYWN0dWFsVGVtcGxhdGUpO1xuICAgICAgICAgIGlmICghdGVtcGxhdGVEaWZmLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWREZXN0cm95VHlwZXMgPSAoYXdhaXQgdGhpcy5nZXRBbGxvd2VkRGVzdHJveVR5cGVzRm9yU3RhY2soc3RhY2tJZCkpID8/IFtdO1xuXG4gICAgICAgICAgICAvLyBnbyB0aHJvdWdoIGFsbCB0aGUgcmVzb3VyY2UgZGlmZmVyZW5jZXMgYW5kIGNoZWNrIGZvciBhbnlcbiAgICAgICAgICAgIC8vIFwiZGVzdHJ1Y3RpdmVcIiBjaGFuZ2VzXG4gICAgICAgICAgICB0ZW1wbGF0ZURpZmYucmVzb3VyY2VzLmZvckVhY2hEaWZmZXJlbmNlKChsb2dpY2FsSWQ6IHN0cmluZywgY2hhbmdlOiBSZXNvdXJjZURpZmZlcmVuY2UpID0+IHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjaGFuZ2UgaXMgYSByZW1vdmFsIGl0IHdpbGwgbm90IHNob3cgdXAgYXMgYSAnY2hhbmdlSW1wYWN0J1xuICAgICAgICAgICAgLy8gc28gbmVlZCB0byBjaGVjayBmb3IgaXQgc2VwYXJhdGVseSwgdW5sZXNzIGl0IGlzIGEgcmVzb3VyY2VUeXBlIHRoYXRcbiAgICAgICAgICAgIC8vIGhhcyBiZWVuIFwiYWxsb3dlZFwiIHRvIGJlIGRlc3Ryb3llZFxuICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBjaGFuZ2Uub2xkVmFsdWU/LlR5cGUgPz8gY2hhbmdlLm5ld1ZhbHVlPy5UeXBlO1xuICAgICAgICAgICAgICBpZiAocmVzb3VyY2VUeXBlICYmIGFsbG93ZWREZXN0cm95VHlwZXMuaW5jbHVkZXMocmVzb3VyY2VUeXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY2hhbmdlLmlzUmVtb3ZhbCkge1xuICAgICAgICAgICAgICAgIGRlc3RydWN0aXZlQ2hhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGltcGFjdDogUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZLFxuICAgICAgICAgICAgICAgICAgbG9naWNhbElkLFxuICAgICAgICAgICAgICAgICAgc3RhY2tOYW1lOiB0ZW1wbGF0ZUlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLmNoYW5nZUltcGFjdCkge1xuICAgICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5NQVlfUkVQTEFDRTpcbiAgICAgICAgICAgICAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9PUlBIQU46XG4gICAgICAgICAgICAgICAgICBjYXNlIFJlc291cmNlSW1wYWN0LldJTExfREVTVFJPWTpcbiAgICAgICAgICAgICAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9SRVBMQUNFOlxuICAgICAgICAgICAgICAgICAgICBkZXN0cnVjdGl2ZUNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgaW1wYWN0OiBjaGFuZ2UuY2hhbmdlSW1wYWN0LFxuICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBuZXcgU3RyaW5nV3JpdGFibGUoe30pO1xuICAgICAgICAgICAgZm9ybWF0RGlmZmVyZW5jZXMod3JpdGFibGUsIHRlbXBsYXRlRGlmZik7XG4gICAgICAgICAgICBmYWlsdXJlcy5wdXNoKHtcbiAgICAgICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX0ZBSUxFRCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogd3JpdGFibGUuZGF0YSxcbiAgICAgICAgICAgICAgc3RhY2tOYW1lOiB0ZW1wbGF0ZUlkLFxuICAgICAgICAgICAgICB0ZXN0TmFtZTogdGhpcy50ZXN0TmFtZSxcbiAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpYWdub3N0aWNzOiBmYWlsdXJlcyxcbiAgICAgIGRlc3RydWN0aXZlQ2hhbmdlcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkQXNzZW1ibHkoZGlyOiBzdHJpbmcpOiBBc3NlbWJseU1hbmlmZXN0UmVhZGVyIHtcbiAgICByZXR1cm4gQXNzZW1ibHlNYW5pZmVzdFJlYWRlci5mcm9tUGF0aChkaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHVjZSB0ZW1wbGF0ZSB0byBhIG5vcm1hbCBmb3JtIHdoZXJlIGFzc2V0IHJlZmVyZW5jZXMgaGF2ZSBiZWVuIG5vcm1hbGl6ZWRcbiAgICpcbiAgICogVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBjb21wYXJlIHRlbXBsYXRlcyBpZiBhbGwgdGhhdCdzIGRpZmZlcmVudCBiZXR3ZWVuXG4gICAqIHRoZW0gaXMgdGhlIGhhc2hlcyBvZiB0aGUgYXNzZXQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBjYW5vbmljYWxpemVUZW1wbGF0ZSh0ZW1wbGF0ZTogYW55LCBhc3NldHM6IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBhc3NldHNTZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgc3RyaW5nU3Vic3RpdHV0aW9ucyA9IG5ldyBBcnJheTxbUmVnRXhwLCBzdHJpbmddPigpO1xuXG4gICAgLy8gRmluZCBhc3NldHMgdmlhIHBhcmFtZXRlcnMgKGZvciBMZWdhY3lTdGFja1N5bnRoZXNpemVyKVxuICAgIGNvbnN0IHBhcmFtUmUgPSAvXkFzc2V0UGFyYW1ldGVycyhbYS16QS1aMC05XXs2NH0pKFMzQnVja2V0fFMzVmVyc2lvbktleXxBcnRpZmFjdEhhc2gpKFthLXpBLVowLTldezh9KSQvO1xuICAgIGZvciAoY29uc3QgcGFyYW1OYW1lIG9mIE9iamVjdC5rZXlzKHRlbXBsYXRlPy5QYXJhbWV0ZXJzIHx8IHt9KSkge1xuICAgICAgY29uc3QgbSA9IHBhcmFtUmUuZXhlYyhwYXJhbU5hbWUpO1xuICAgICAgaWYgKCFtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFzc2V0c1NlZW4uaGFzKG1bMV0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBhc3NldHNTZWVuLmFkZChtWzFdKTtcbiAgICAgIGNvbnN0IGl4ID0gYXNzZXRzU2Vlbi5zaXplO1xuXG4gICAgICAvLyBGdWxsIHBhcmFtZXRlciByZWZlcmVuY2VcbiAgICAgIHN0cmluZ1N1YnN0aXR1dGlvbnMucHVzaChbXG4gICAgICAgIG5ldyBSZWdFeHAoYEFzc2V0UGFyYW1ldGVycyR7bVsxXX0oUzNCdWNrZXR8UzNWZXJzaW9uS2V5fEFydGlmYWN0SGFzaCkoW2EtekEtWjAtOV17OH0pYCksXG4gICAgICAgIGBBc3NldCR7aXh9JDFgLFxuICAgICAgXSk7XG4gICAgICAvLyBTdWJzdHJpbmcgYXNzZXQgaGFzaCByZWZlcmVuY2VcbiAgICAgIHN0cmluZ1N1YnN0aXR1dGlvbnMucHVzaChbXG4gICAgICAgIG5ldyBSZWdFeHAoYCR7bVsxXX1gKSxcbiAgICAgICAgYEFzc2V0JHtpeH1IYXNoYCxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIC8vIGZpbmQgYXNzZXRzIGRlZmluZWQgaW4gdGhlIGFzc2V0IG1hbmlmZXN0XG4gICAgdHJ5IHtcbiAgICAgIGFzc2V0cy5mb3JFYWNoKGFzc2V0ID0+IHtcbiAgICAgICAgaWYgKCFhc3NldHNTZWVuLmhhcyhhc3NldCkpIHtcbiAgICAgICAgICBhc3NldHNTZWVuLmFkZChhc3NldCk7XG4gICAgICAgICAgY29uc3QgaXggPSBhc3NldHNTZWVuLnNpemU7XG4gICAgICAgICAgc3RyaW5nU3Vic3RpdHV0aW9ucy5wdXNoKFtcbiAgICAgICAgICAgIG5ldyBSZWdFeHAoYXNzZXQpLFxuICAgICAgICAgICAgYEFzc2V0JHtpeH0kMWAsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gYXNzZXQgbWFuaWZlc3QgdGhhdCBpcyBmaW5lLlxuICAgIH1cblxuICAgIC8vIFN1YnN0aXR1dGUgdGhlbSBvdXRcbiAgICByZXR1cm4gc3Vic3RpdHV0ZSh0ZW1wbGF0ZSk7XG5cbiAgICBmdW5jdGlvbiBzdWJzdGl0dXRlKHdoYXQ6IGFueSk6IGFueSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh3aGF0KSkge1xuICAgICAgICByZXR1cm4gd2hhdC5tYXAoc3Vic3RpdHV0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygd2hhdCA9PT0gJ29iamVjdCcgJiYgd2hhdCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByZXQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh3aGF0KSkge1xuICAgICAgICAgIHJldFtzdHJpbmdTdWIoayldID0gc3Vic3RpdHV0ZSh2KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHdoYXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdTdWIod2hhdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB3aGF0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0cmluZ1N1Yih4OiBzdHJpbmcpIHtcbiAgICAgIGZvciAoY29uc3QgW3JlLCByZXBsYWNlbWVudF0gb2Ygc3RyaW5nU3Vic3RpdHV0aW9ucykge1xuICAgICAgICB4ID0geC5yZXBsYWNlKHJlLCByZXBsYWNlbWVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU3RyaW5nV3JpdGFibGUgZXh0ZW5kcyBXcml0YWJsZSB7XG4gIHB1YmxpYyBkYXRhOiBzdHJpbmc7XG4gIHByaXZhdGUgX2RlY29kZXI6IFN0cmluZ0RlY29kZXI7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFdyaXRhYmxlT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcigpO1xuICAgIHRoaXMuZGF0YSA9ICcnO1xuICB9XG5cbiAgX3dyaXRlKGNodW5rOiBhbnksIGVuY29kaW5nOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICdidWZmZXInKSB7XG4gICAgICBjaHVuayA9IHRoaXMuX2RlY29kZXIud3JpdGUoY2h1bmspO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YSArPSBjaHVuaztcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX2ZpbmFsKGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEgKz0gdGhpcy5fZGVjb2Rlci5lbmQoKTtcbiAgICBjYWxsYmFjaygpO1xuICB9XG59XG4iXX0= | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtdGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzbmFwc2hvdC10ZXN0LXJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFFN0IsbUNBQWtDO0FBQ2xDLG1EQUErQztBQUMvQyxvRUFBNkQ7QUFFN0Qsc0VBQTJGO0FBRTNGLHlEQUFvRDtBQUNwRCw2REFBa0U7QUFFbEUsOENBQXFEO0FBcUJyRDs7O0dBR0c7QUFDSCxNQUFhLG1CQUFtQjtJQUNiLE1BQU0sQ0FBaUI7SUFDeEMsWUFBWSxPQUE4QztRQUN4RCxJQUFJLENBQUMsTUFBTSxHQUFHLGlDQUFjLENBQUMsTUFBTSxDQUFDO1lBQ2xDLEdBQUcsT0FBTztZQUNWLE1BQU0sRUFBRSxtQ0FBYztTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVNLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxrQ0FBa0M7UUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBdUMsRUFBRTtRQUlqRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsK0JBQStCO1lBQy9CLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDaEUsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUVwSCw4Q0FB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TyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBblVELGtEQW1VQztBQUVELE1BQU0sY0FBZSxTQUFRLGlCQUFRO0lBQzVCLElBQUksQ0FBUztJQUNaLFFBQVEsQ0FBZ0I7SUFDaEMsWUFBWSxPQUF3QjtRQUNsQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksOEJBQWEsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBVSxFQUFFLFFBQWdCLEVBQUUsUUFBd0M7UUFDM0UsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDMUIsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztRQUNuQixRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBd0M7UUFDN0MsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLFFBQVEsRUFBRSxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgV3JpdGFibGVPcHRpb25zIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tICdzdHJpbmdfZGVjb2Rlcic7XG5pbXBvcnQgeyBVTktOT1dOX1JFR0lPTiB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlRGlmZmVyZW5jZSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHsgZnVsbERpZmYsIGZvcm1hdERpZmZlcmVuY2VzLCBSZXNvdXJjZUltcGFjdCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHR5cGUgeyBDZGtJbnRlZ0hlbHBlck9wdGlvbnMgfSBmcm9tICcuL2Nkay1pbnRlZy1oZWxwZXInO1xuaW1wb3J0IHsgQ2RrSW50ZWdIZWxwZXIgfSBmcm9tICcuL2Nkay1pbnRlZy1oZWxwZXInO1xuaW1wb3J0IHsgQXNzZW1ibHlNYW5pZmVzdFJlYWRlciB9IGZyb20gJy4vcHJpdmF0ZS9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgdHlwZSB7IERpYWdub3N0aWMsIERlc3RydWN0aXZlQ2hhbmdlLCBTbmFwc2hvdFZlcmlmaWNhdGlvbk9wdGlvbnMgfSBmcm9tICcuLi93b3JrZXJzL2NvbW1vbic7XG5pbXBvcnQgeyBEaWFnbm9zdGljUmVhc29uIH0gZnJvbSAnLi4vd29ya2Vycy9jb21tb24nO1xuXG5pbnRlcmZhY2UgU25hcHNob3RBc3NlbWJseSB7XG4gIC8qKlxuICAgKiBNYXAgb2Ygc3RhY2tzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyBhc3NlbWJseVxuICAgKi9cbiAgW3N0YWNrTmFtZTogc3RyaW5nXToge1xuICAgIC8qKlxuICAgICAqIEFsbCB0ZW1wbGF0ZXMgZm9yIHRoaXMgc3RhY2ssIGluY2x1ZGluZyBuZXN0ZWQgc3RhY2tzXG4gICAgICovXG4gICAgdGVtcGxhdGVzOiB7XG4gICAgICBbdGVtcGxhdGVJZDogc3RyaW5nXTogYW55O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGFzc2V0IElkcyB0aGF0IGFyZSB1c2VkIGJ5IHRoaXMgYXNzZW1ibHlcbiAgICAgKi9cbiAgICBhc3NldHM6IHN0cmluZ1tdO1xuICB9O1xufVxuXG4vKipcbiAqIFJ1bm5lciBmb3Igc25hcHNob3QgdGVzdHMuIFRoaXMgaGFuZGxlcyBvcmNoZXN0cmF0aW5nXG4gKiB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgaW50ZWdyYXRpb24gdGVzdCBzbmFwc2hvdHNcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVnU25hcHNob3RSdW5uZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGhlbHBlcjogQ2RrSW50ZWdIZWxwZXI7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9taXQ8Q2RrSW50ZWdIZWxwZXJPcHRpb25zLCAncmVnaW9uJz4pIHtcbiAgICB0aGlzLmhlbHBlciA9IENka0ludGVnSGVscGVyLmNyZWF0ZSh7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgcmVnaW9uOiBVTktOT1dOX1JFR0lPTixcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNTbmFwc2hvdCgpIHtcbiAgICByZXR1cm4gdGhpcy5oZWxwZXIuaGFzU25hcHNob3QoKTtcbiAgfVxuXG4gIHB1YmxpYyBhY3R1YWxUZXN0cygpIHtcbiAgICByZXR1cm4gdGhpcy5oZWxwZXIuYWN0dWFsVGVzdHMoKTtcbiAgfVxuXG4gIHB1YmxpYyBkb250Q2FyZUFib3V0TGVnYWN5TG9va3Vwc0ZvclRlc3RzKCkge1xuICAgIHRoaXMuaGVscGVyLmNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMoJ2RvbnQtY2FyZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIHRoZSBDREsgYXBwIGFuZCBjb21wYXJlIHRoZSB0ZW1wbGF0ZXMgdG8gdGhlIGV4aXN0aW5nIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcmV0dXJucyBhbnkgZGlhZ25vc3RpY3MgYW5kIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdGVzdFNuYXBzaG90KG9wdGlvbnM6IFNuYXBzaG90VmVyaWZpY2F0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx7XG4gICAgZGlhZ25vc3RpY3M6IERpYWdub3N0aWNbXTtcbiAgICBkZXN0cnVjdGl2ZUNoYW5nZXM6IERlc3RydWN0aXZlQ2hhbmdlW107XG4gIH0+IHtcbiAgICBsZXQgZG9DbGVhbiA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlYWQgdGhlIFwiZXhwZWN0ZWRcIiBzbmFwc2hvdFxuICAgICAgY29uc3QgZXhwZWN0ZWRUZXN0U3VpdGUgPSBhd2FpdCB0aGlzLmhlbHBlci5leHBlY3RlZFRlc3RTdWl0ZSgpO1xuICAgICAgY29uc3QgZXhwZWN0ZWRTbmFwc2hvdEFzc2VtYmx5ID0gdGhpcy5nZXRTbmFwc2hvdEFzc2VtYmx5KHRoaXMuaGVscGVyLmdvbGRlblNuYXBzaG90RGlyLCBleHBlY3RlZFRlc3RTdWl0ZT8uc3RhY2tzKTtcblxuICAgICAgLy8gQ29uZmlndXJlIHNldHRpbmdzIGZyb20gdGhlIGdvbGRlbiBzbmFwc2hvdFxuICAgICAgdGhpcy5oZWxwZXIuY29uZmlndXJlTGVnYWN5RW5hYmxlTG9va3VwcyhleHBlY3RlZFRlc3RTdWl0ZT8uZW5hYmxlTG9va3VwcyA/PyBmYWxzZSk7XG5cbiAgICAgIC8vIHJlYWQgdGhlIFwiYWN0dWFsXCIgc25hcHNob3RcbiAgICAgIGNvbnN0IGFjdHVhbFNuYXBzaG90ID0gYXdhaXQgdGhpcy5oZWxwZXIuYWN0dWFsU25hcHNob3QoKTtcbiAgICAgIGNvbnN0IGFjdHVhbFNuYXBzaG90QXNzZW1ibHkgPSB0aGlzLmdldFNuYXBzaG90QXNzZW1ibHkodGhpcy5oZWxwZXIuY2RrT3V0RGlyLCBhY3R1YWxTbmFwc2hvdC50ZXN0RGVmaW5pdGlvbi5zdGFja3MpO1xuXG4gICAgICAvLyBkaWZmIHRoZSBleGlzdGluZyBzbmFwc2hvdCAoZXhwZWN0ZWQpIHdpdGggdGhlIGludGVncmF0aW9uIHRlc3QgKGFjdHVhbClcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gYXdhaXQgdGhpcy5kaWZmQXNzZW1ibHkoZXhwZWN0ZWRTbmFwc2hvdEFzc2VtYmx5LCBhY3R1YWxTbmFwc2hvdEFzc2VtYmx5KTtcblxuICAgICAgaWYgKGRpYWdub3N0aWNzLmRpYWdub3N0aWNzLmxlbmd0aCkge1xuICAgICAgICAvLyBBdHRhY2ggYWRkaXRpb25hbCBtZXNzYWdlcyB0byB0aGUgZmlyc3QgZGlhZ25vc3RpY1xuICAgICAgICBjb25zdCBhZGRpdGlvbmFsTWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0YWluKSB7XG4gICAgICAgICAgYWRkaXRpb25hbE1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICBgKEZhaWx1cmUgcmV0YWluZWQpIEV4cGVjdGVkOiAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgdGhpcy5oZWxwZXIuZ29sZGVuU25hcHNob3REaXIpfWAsXG4gICAgICAgICAgICBgICAgICAgICAgICAgICAgICAgIEFjdHVhbDogICAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgdGhpcy5oZWxwZXIuY2RrT3V0RGlyKX1gLFxuICAgICAgICAgICksXG4gICAgICAgICAgZG9DbGVhbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIGFkZGl0aW9uYWxNZXNzYWdlcy5wdXNoKFxuICAgICAgICAgICAgJ1JlcHJvOicsXG4gICAgICAgICAgICBgICAke3RoaXMuaGVscGVyLmFjdHVhbFN5bnRoUmVwcm9Db21tYW5kKCkuam9pbignICcpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpYWdub3N0aWNzLmRpYWdub3N0aWNzWzBdID0ge1xuICAgICAgICAgIC4uLmRpYWdub3N0aWNzLmRpYWdub3N0aWNzWzBdLFxuICAgICAgICAgIGFkZGl0aW9uYWxNZXNzYWdlcyxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChkb0NsZWFuKSB7XG4gICAgICAgIHRoaXMuaGVscGVyLmNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9yIGEgZ2l2ZW4gY2xvdWQgYXNzZW1ibHkgcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBhbGwgdGVtcGxhdGVzXG4gICAqIHRoYXQgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIHNuYXBzaG90IGFuZCBhbnkgcmVxdWlyZWQgbWV0YSBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0gY2xvdWRBc3NlbWJseURpciAtIFRoZSBkaXJlY3Rvcnkgb2YgdGhlIGNsb3VkIGFzc2VtYmx5IHRvIGxvb2sgZm9yIHNuYXBzaG90c1xuICAgKiBAcGFyYW0gcGlja1N0YWNrcyAtIFBpY2sgb25seSB0aGVzZSBzdGFja3MgZnJvbSB0aGUgY2xvdWQgYXNzZW1ibHlcbiAgICogQHJldHVybnMgQSBTbmFwc2hvdEFzc2VtYmx5LCB0aGUgY29sbGVjdGlvbiBvZiBhbGwgdGVtcGxhdGVzIGluIHRoaXMgc25hcHNob3QgYW5kIHJlcXVpcmVkIG1ldGEgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTbmFwc2hvdEFzc2VtYmx5KGNsb3VkQXNzZW1ibHlEaXI6IHN0cmluZywgcGlja1N0YWNrczogc3RyaW5nW10gPSBbXSk6IFNuYXBzaG90QXNzZW1ibHkge1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gdGhpcy5yZWFkQXNzZW1ibHkoY2xvdWRBc3NlbWJseURpcik7XG4gICAgY29uc3Qgc3RhY2tzID0gYXNzZW1ibHkuc3RhY2tzO1xuICAgIGNvbnN0IHNuYXBzaG90czogU25hcHNob3RBc3NlbWJseSA9IHt9O1xuICAgIGZvciAoY29uc3QgW3N0YWNrTmFtZSwgc3RhY2tUZW1wbGF0ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhY2tzKSkge1xuICAgICAgaWYgKHBpY2tTdGFja3MuaW5jbHVkZXMoc3RhY2tOYW1lKSkge1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgoY2xvdWRBc3NlbWJseURpcik7XG4gICAgICAgIGNvbnN0IGFzc2V0cyA9IG1hbmlmZXN0LmdldEFzc2V0SWRzRm9yU3RhY2soc3RhY2tOYW1lKTtcblxuICAgICAgICBzbmFwc2hvdHNbc3RhY2tOYW1lXSA9IHtcbiAgICAgICAgICB0ZW1wbGF0ZXM6IHtcbiAgICAgICAgICAgIFtzdGFja05hbWVdOiBzdGFja1RlbXBsYXRlLFxuICAgICAgICAgICAgLi4uYXNzZW1ibHkuZ2V0TmVzdGVkU3RhY2tzRm9yU3RhY2soc3RhY2tOYW1lKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFzc2V0cyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc25hcHNob3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhIGdpdmVuIHN0YWNrIHJldHVybiBhbGwgcmVzb3VyY2UgdHlwZXMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBkZXN0cm95ZWRcbiAgICogYXMgcGFydCBvZiBhIHN0YWNrIHVwZGF0ZVxuICAgKlxuICAgKiBAcGFyYW0gc3RhY2tJZCAtIHRoZSBzdGFjayBpZFxuICAgKiBAcmV0dXJucyBhIGxpc3Qgb2YgcmVzb3VyY2UgdHlwZXMgb3IgdW5kZWZpbmVkIGlmIG5vbmUgYXJlIGZvdW5kXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEFsbG93ZWREZXN0cm95VHlwZXNGb3JTdGFjayhzdGFja0lkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gICAgZm9yIChjb25zdCB0ZXN0Q2FzZSBvZiBPYmplY3QudmFsdWVzKChhd2FpdCB0aGlzLmhlbHBlci5hY3R1YWxUZXN0cygpKSA/PyB7fSkpIHtcbiAgICAgIGlmICh0ZXN0Q2FzZS5zdGFja3MuaW5jbHVkZXMoc3RhY2tJZCkpIHtcbiAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmFsbG93RGVzdHJveTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBleGlzdGluZyBhbmQgZXhwZWN0ZWQgc25hcHNob3RzXG4gICAqXG4gICAqIEBwYXJhbSBleGlzdGluZyAtIHRoZSBleGlzdGluZyAoZXhwZWN0ZWQpIHNuYXBzaG90XG4gICAqIEBwYXJhbSBhY3R1YWwgLSB0aGUgbmV3IChhY3R1YWwpIHNuYXBzaG90XG4gICAqIEByZXR1cm5zIGFueSBkaWFnbm9zdGljcyBhbmQgYW55IGRlc3RydWN0aXZlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlmZkFzc2VtYmx5KFxuICAgIGV4cGVjdGVkOiBTbmFwc2hvdEFzc2VtYmx5LFxuICAgIGFjdHVhbDogU25hcHNob3RBc3NlbWJseSxcbiAgKTogUHJvbWlzZTx7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW107IGRlc3RydWN0aXZlQ2hhbmdlczogRGVzdHJ1Y3RpdmVDaGFuZ2VbXSB9PiB7XG4gICAgY29uc3QgZmFpbHVyZXM6IERpYWdub3N0aWNbXSA9IFtdO1xuICAgIGNvbnN0IGRlc3RydWN0aXZlQ2hhbmdlczogRGVzdHJ1Y3RpdmVDaGFuZ2VbXSA9IFtdO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSBDRk4gdGVtcGxhdGUgaW4gdGhlIGN1cnJlbnQgc25hcHNob3RcbiAgICAvLyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAgZm9yIChjb25zdCBbc3RhY2tJZCwgc3RhY2tdIG9mIE9iamVjdC5lbnRyaWVzKGV4cGVjdGVkKSkge1xuICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZUlkIG9mIE9iamVjdC5rZXlzKHN0YWNrLnRlbXBsYXRlcykpIHtcbiAgICAgICAgaWYgKCFhY3R1YWxbc3RhY2tJZF0/LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkge1xuICAgICAgICAgIGZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgICAgdGVzdE5hbWU6IHRoaXMuaGVscGVyLnRlc3ROYW1lLFxuICAgICAgICAgICAgc3RhY2tOYW1lOiB0ZW1wbGF0ZUlkLFxuICAgICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX0ZBSUxFRCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke3RlbXBsYXRlSWR9IGV4aXN0cyBpbiBzbmFwc2hvdCwgYnV0IG5vdCBpbiBhY3R1YWxgLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3RhY2tJZCwgc3RhY2tdIG9mIE9iamVjdC5lbnRyaWVzKGFjdHVhbCkpIHtcbiAgICAgIGZvciAoY29uc3QgdGVtcGxhdGVJZCBvZiBPYmplY3Qua2V5cyhzdGFjay50ZW1wbGF0ZXMpKSB7XG4gICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIENGTiB0ZW1wbGF0ZSBpbiB0aGUgXCJhY3R1YWxcIiBzbmFwc2hvdFxuICAgICAgLy8gdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY3VycmVudCBzbmFwc2hvdFxuICAgICAgICBpZiAoIWV4cGVjdGVkW3N0YWNrSWRdPy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pIHtcbiAgICAgICAgICBmYWlsdXJlcy5wdXNoKHtcbiAgICAgICAgICAgIHRlc3ROYW1lOiB0aGlzLmhlbHBlci50ZXN0TmFtZSxcbiAgICAgICAgICAgIHN0YWNrTmFtZTogdGVtcGxhdGVJZCxcbiAgICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5TTkFQU0hPVF9GQUlMRUQsXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHt0ZW1wbGF0ZUlkfSBkb2VzIG5vdCBleGlzdCBpbiBzbmFwc2hvdCwgYnV0IGRvZXMgaW4gYWN0dWFsYCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICBkaWZmQXNzZXRzOiAoYXdhaXQgdGhpcy5oZWxwZXIuYWN0dWFsU25hcHNob3QoKSkudGVzdERlZmluaXRpb24uZ2V0T3B0aW9uc0ZvclN0YWNrKHN0YWNrSWQpPy5kaWZmQXNzZXRzLFxuICAgICAgICAgIH07XG4gICAgICAgICAgbGV0IGFjdHVhbFRlbXBsYXRlID0gYWN0dWFsW3N0YWNrSWRdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTtcbiAgICAgICAgICBsZXQgZXhwZWN0ZWRUZW1wbGF0ZSA9IGV4cGVjdGVkW3N0YWNrSWRdLnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXTtcblxuICAgICAgICAgIC8vIGlmIHdlIGFyZSBub3QgdmVyaWZ5aW5nIGFzc2V0IGhhc2hlcyB0aGVuIHJlbW92ZSB0aGUgc3BlY2lmaWNcbiAgICAgICAgICAvLyBhc3NldCBoYXNoZXMgZnJvbSB0aGUgdGVtcGxhdGVzIHNvIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkaWZmXG4gICAgICAgICAgLy8gY29tcGFyaXNvblxuICAgICAgICAgIGlmICghY29uZmlnLmRpZmZBc3NldHMpIHtcbiAgICAgICAgICAgIGFjdHVhbFRlbXBsYXRlID0gdGhpcy5jYW5vbmljYWxpemVUZW1wbGF0ZShhY3R1YWxUZW1wbGF0ZSwgYWN0dWFsW3N0YWNrSWRdLmFzc2V0cyk7XG4gICAgICAgICAgICBleHBlY3RlZFRlbXBsYXRlID0gdGhpcy5jYW5vbmljYWxpemVUZW1wbGF0ZShleHBlY3RlZFRlbXBsYXRlLCBleHBlY3RlZFtzdGFja0lkXS5hc3NldHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZURpZmYgPSBmdWxsRGlmZihleHBlY3RlZFRlbXBsYXRlLCBhY3R1YWxUZW1wbGF0ZSk7XG4gICAgICAgICAgaWYgKCF0ZW1wbGF0ZURpZmYuaXNFbXB0eSkge1xuICAgICAgICAgICAgY29uc3QgYWxsb3dlZERlc3Ryb3lUeXBlcyA9IChhd2FpdCB0aGlzLmdldEFsbG93ZWREZXN0cm95VHlwZXNGb3JTdGFjayhzdGFja0lkKSkgPz8gW107XG5cbiAgICAgICAgICAgIC8vIGdvIHRocm91Z2ggYWxsIHRoZSByZXNvdXJjZSBkaWZmZXJlbmNlcyBhbmQgY2hlY2sgZm9yIGFueVxuICAgICAgICAgICAgLy8gXCJkZXN0cnVjdGl2ZVwiIGNoYW5nZXNcbiAgICAgICAgICAgIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMuZm9yRWFjaERpZmZlcmVuY2UoKGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFJlc291cmNlRGlmZmVyZW5jZSkgPT4ge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGNoYW5nZSBpcyBhIHJlbW92YWwgaXQgd2lsbCBub3Qgc2hvdyB1cCBhcyBhICdjaGFuZ2VJbXBhY3QnXG4gICAgICAgICAgICAvLyBzbyBuZWVkIHRvIGNoZWNrIGZvciBpdCBzZXBhcmF0ZWx5LCB1bmxlc3MgaXQgaXMgYSByZXNvdXJjZVR5cGUgdGhhdFxuICAgICAgICAgICAgLy8gaGFzIGJlZW4gXCJhbGxvd2VkXCIgdG8gYmUgZGVzdHJveWVkXG4gICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGNoYW5nZS5vbGRWYWx1ZT8uVHlwZSA/PyBjaGFuZ2UubmV3VmFsdWU/LlR5cGU7XG4gICAgICAgICAgICAgIGlmIChyZXNvdXJjZVR5cGUgJiYgYWxsb3dlZERlc3Ryb3lUeXBlcy5pbmNsdWRlcyhyZXNvdXJjZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjaGFuZ2UuaXNSZW1vdmFsKSB7XG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgaW1wYWN0OiBSZXNvdXJjZUltcGFjdC5XSUxMX0RFU1RST1ksXG4gICAgICAgICAgICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaGFuZ2UuY2hhbmdlSW1wYWN0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFOlxuICAgICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX09SUEhBTjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZOlxuICAgICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0U6XG4gICAgICAgICAgICAgICAgICAgIGRlc3RydWN0aXZlQ2hhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICBpbXBhY3Q6IGNoYW5nZS5jaGFuZ2VJbXBhY3QsXG4gICAgICAgICAgICAgICAgICAgICAgbG9naWNhbElkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTmFtZTogdGVtcGxhdGVJZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBTdHJpbmdXcml0YWJsZSh7fSk7XG4gICAgICAgICAgICBmb3JtYXREaWZmZXJlbmNlcyh3cml0YWJsZSwgdGVtcGxhdGVEaWZmKTtcbiAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfRkFJTEVELFxuICAgICAgICAgICAgICBtZXNzYWdlOiB3cml0YWJsZS5kYXRhLFxuICAgICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICAgIHRlc3ROYW1lOiB0aGlzLmhlbHBlci50ZXN0TmFtZSxcbiAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpYWdub3N0aWNzOiBmYWlsdXJlcyxcbiAgICAgIGRlc3RydWN0aXZlQ2hhbmdlcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkQXNzZW1ibHkoZGlyOiBzdHJpbmcpOiBBc3NlbWJseU1hbmlmZXN0UmVhZGVyIHtcbiAgICByZXR1cm4gQXNzZW1ibHlNYW5pZmVzdFJlYWRlci5mcm9tUGF0aChkaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHVjZSB0ZW1wbGF0ZSB0byBhIG5vcm1hbCBmb3JtIHdoZXJlIGFzc2V0IHJlZmVyZW5jZXMgaGF2ZSBiZWVuIG5vcm1hbGl6ZWRcbiAgICpcbiAgICogVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBjb21wYXJlIHRlbXBsYXRlcyBpZiBhbGwgdGhhdCdzIGRpZmZlcmVudCBiZXR3ZWVuXG4gICAqIHRoZW0gaXMgdGhlIGhhc2hlcyBvZiB0aGUgYXNzZXQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBjYW5vbmljYWxpemVUZW1wbGF0ZSh0ZW1wbGF0ZTogYW55LCBhc3NldHM6IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBhc3NldHNTZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgc3RyaW5nU3Vic3RpdHV0aW9ucyA9IG5ldyBBcnJheTxbUmVnRXhwLCBzdHJpbmddPigpO1xuXG4gICAgLy8gRmluZCBhc3NldHMgdmlhIHBhcmFtZXRlcnMgKGZvciBMZWdhY3lTdGFja1N5bnRoZXNpemVyKVxuICAgIGNvbnN0IHBhcmFtUmUgPSAvXkFzc2V0UGFyYW1ldGVycyhbYS16QS1aMC05XXs2NH0pKFMzQnVja2V0fFMzVmVyc2lvbktleXxBcnRpZmFjdEhhc2gpKFthLXpBLVowLTldezh9KSQvO1xuICAgIGZvciAoY29uc3QgcGFyYW1OYW1lIG9mIE9iamVjdC5rZXlzKHRlbXBsYXRlPy5QYXJhbWV0ZXJzIHx8IHt9KSkge1xuICAgICAgY29uc3QgbSA9IHBhcmFtUmUuZXhlYyhwYXJhbU5hbWUpO1xuICAgICAgaWYgKCFtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFzc2V0c1NlZW4uaGFzKG1bMV0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBhc3NldHNTZWVuLmFkZChtWzFdKTtcbiAgICAgIGNvbnN0IGl4ID0gYXNzZXRzU2Vlbi5zaXplO1xuXG4gICAgICAvLyBGdWxsIHBhcmFtZXRlciByZWZlcmVuY2VcbiAgICAgIHN0cmluZ1N1YnN0aXR1dGlvbnMucHVzaChbXG4gICAgICAgIG5ldyBSZWdFeHAoYEFzc2V0UGFyYW1ldGVycyR7bVsxXX0oUzNCdWNrZXR8UzNWZXJzaW9uS2V5fEFydGlmYWN0SGFzaCkoW2EtekEtWjAtOV17OH0pYCksXG4gICAgICAgIGBBc3NldCR7aXh9JDFgLFxuICAgICAgXSk7XG4gICAgICAvLyBTdWJzdHJpbmcgYXNzZXQgaGFzaCByZWZlcmVuY2VcbiAgICAgIHN0cmluZ1N1YnN0aXR1dGlvbnMucHVzaChbXG4gICAgICAgIG5ldyBSZWdFeHAoYCR7bVsxXX1gKSxcbiAgICAgICAgYEFzc2V0JHtpeH1IYXNoYCxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIC8vIGZpbmQgYXNzZXRzIGRlZmluZWQgaW4gdGhlIGFzc2V0IG1hbmlmZXN0XG4gICAgdHJ5IHtcbiAgICAgIGFzc2V0cy5mb3JFYWNoKGFzc2V0ID0+IHtcbiAgICAgICAgaWYgKCFhc3NldHNTZWVuLmhhcyhhc3NldCkpIHtcbiAgICAgICAgICBhc3NldHNTZWVuLmFkZChhc3NldCk7XG4gICAgICAgICAgY29uc3QgaXggPSBhc3NldHNTZWVuLnNpemU7XG4gICAgICAgICAgc3RyaW5nU3Vic3RpdHV0aW9ucy5wdXNoKFtcbiAgICAgICAgICAgIG5ldyBSZWdFeHAoYXNzZXQpLFxuICAgICAgICAgICAgYEFzc2V0JHtpeH0kMWAsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gYXNzZXQgbWFuaWZlc3QgdGhhdCBpcyBmaW5lLlxuICAgIH1cblxuICAgIC8vIFN1YnN0aXR1dGUgdGhlbSBvdXRcbiAgICByZXR1cm4gc3Vic3RpdHV0ZSh0ZW1wbGF0ZSk7XG5cbiAgICBmdW5jdGlvbiBzdWJzdGl0dXRlKHdoYXQ6IGFueSk6IGFueSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh3aGF0KSkge1xuICAgICAgICByZXR1cm4gd2hhdC5tYXAoc3Vic3RpdHV0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygd2hhdCA9PT0gJ29iamVjdCcgJiYgd2hhdCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByZXQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh3aGF0KSkge1xuICAgICAgICAgIHJldFtzdHJpbmdTdWIoayldID0gc3Vic3RpdHV0ZSh2KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHdoYXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdTdWIod2hhdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB3aGF0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0cmluZ1N1Yih4OiBzdHJpbmcpIHtcbiAgICAgIGZvciAoY29uc3QgW3JlLCByZXBsYWNlbWVudF0gb2Ygc3RyaW5nU3Vic3RpdHV0aW9ucykge1xuICAgICAgICB4ID0geC5yZXBsYWNlKHJlLCByZXBsYWNlbWVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU3RyaW5nV3JpdGFibGUgZXh0ZW5kcyBXcml0YWJsZSB7XG4gIHB1YmxpYyBkYXRhOiBzdHJpbmc7XG4gIHByaXZhdGUgX2RlY29kZXI6IFN0cmluZ0RlY29kZXI7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFdyaXRhYmxlT3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcigpO1xuICAgIHRoaXMuZGF0YSA9ICcnO1xuICB9XG5cbiAgX3dyaXRlKGNodW5rOiBhbnksIGVuY29kaW5nOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICdidWZmZXInKSB7XG4gICAgICBjaHVuayA9IHRoaXMuX2RlY29kZXIud3JpdGUoY2h1bmspO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YSArPSBjaHVuaztcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX2ZpbmFsKGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEgKz0gdGhpcy5fZGVjb2Rlci5lbmQoKTtcbiAgICBjYWxsYmFjaygpO1xuICB9XG59XG4iXX0= |
+7
-7
@@ -67,9 +67,9 @@ { | ||
| "@aws-cdk/aws-service-spec": "^0.1.185", | ||
| "@aws-cdk/cdk-assets-lib": "1.4.11", | ||
| "@aws-cdk/cloud-assembly-api": "2.2.5", | ||
| "@aws-cdk/cloud-assembly-schema": ">=54.4.0", | ||
| "@aws-cdk/cdk-assets-lib": "1.4.12", | ||
| "@aws-cdk/cloud-assembly-api": "2.2.6", | ||
| "@aws-cdk/cloud-assembly-schema": ">=54.5.0", | ||
| "@aws-cdk/cloudformation-diff": "2.187.1", | ||
| "@aws-cdk/toolkit-lib": "1.29.1", | ||
| "@aws-cdk/toolkit-lib": "1.30.0", | ||
| "@aws-sdk/client-cloudformation": "^3", | ||
| "aws-cdk": "2.1128.0", | ||
| "aws-cdk": "2.1128.1", | ||
| "chalk": "^4", | ||
@@ -84,3 +84,3 @@ "chokidar": "^4", | ||
| "@aws-cdk/aws-service-spec": "0.1.185", | ||
| "aws-cdk": "2.1128.0" | ||
| "aws-cdk": "2.1128.1" | ||
| }, | ||
@@ -107,3 +107,3 @@ "keywords": [ | ||
| }, | ||
| "version": "2.200.1", | ||
| "version": "2.200.2", | ||
| "packageManager": "yarn@4.13.0", | ||
@@ -110,0 +110,0 @@ "types": "lib/index.d.ts", |
| import type { TestCase, DefaultCdkOptions } from '@aws-cdk/cloud-assembly-schema'; | ||
| import { IntegTestSuite, LegacyIntegTestSuite } from './integ-test-suite'; | ||
| import type { IntegTest } from './integration-tests'; | ||
| import type { ICdk } from '../engines/cdk-interface'; | ||
| import type { DestructiveChange } from '../workers/common'; | ||
| /** | ||
| * Options for creating an integration test runner | ||
| */ | ||
| export interface IntegRunnerOptions { | ||
| /** | ||
| * Information about the test to run | ||
| */ | ||
| readonly test: IntegTest; | ||
| /** | ||
| * The region where the test should be deployed | ||
| */ | ||
| readonly region: string; | ||
| /** | ||
| * The AWS profile to use when invoking the CDK CLI | ||
| * | ||
| * @default - no profile is passed, the default profile is used | ||
| */ | ||
| readonly profile?: string; | ||
| /** | ||
| * Additional environment variables that will be available | ||
| * to the CDK CLI | ||
| * | ||
| * @default - no additional environment variables | ||
| */ | ||
| readonly env?: { | ||
| [name: string]: string; | ||
| }; | ||
| /** | ||
| * tmp cdk.out directory | ||
| * | ||
| * @default - directory will be `cdk-integ.out.${testName}` | ||
| */ | ||
| readonly integOutDir?: string; | ||
| /** | ||
| * Instance of the CDK Toolkit Engine to use | ||
| * | ||
| * @default - based on `engine` option | ||
| */ | ||
| readonly cdk?: ICdk; | ||
| /** | ||
| * Show output from running integration tests | ||
| * | ||
| * @default false | ||
| */ | ||
| readonly showOutput?: boolean; | ||
| /** | ||
| * Use the indicated proxy | ||
| * | ||
| * @default - no proxy | ||
| */ | ||
| readonly proxy?: string; | ||
| /** | ||
| * Path to CA certificate to use when validating HTTPS requests | ||
| * | ||
| * @default - no additional CA bundle | ||
| */ | ||
| readonly caBundlePath?: string; | ||
| } | ||
| /** | ||
| * The different components of a test name | ||
| */ | ||
| /** | ||
| * Represents an Integration test runner | ||
| */ | ||
| export declare abstract class IntegRunner { | ||
| /** | ||
| * The directory where the snapshot will be stored | ||
| */ | ||
| readonly snapshotDir: string; | ||
| /** | ||
| * An instance of the CDK CLI | ||
| */ | ||
| readonly cdk: ICdk; | ||
| /** | ||
| * Pretty name of the test | ||
| */ | ||
| readonly testName: string; | ||
| /** | ||
| * The value used in the '--app' CLI parameter | ||
| * | ||
| * Path to the integ test source file, relative to `this.directory`. | ||
| */ | ||
| protected readonly cdkApp: string; | ||
| /** | ||
| * The path where the `cdk.context.json` file | ||
| * will be created | ||
| */ | ||
| protected readonly cdkContextPath: string; | ||
| /** | ||
| * The working directory that the integration tests will be | ||
| * executed from | ||
| */ | ||
| protected readonly directory: string; | ||
| /** | ||
| * The test to run | ||
| */ | ||
| protected readonly test: IntegTest; | ||
| /** | ||
| * Default options to pass to the CDK CLI | ||
| */ | ||
| protected readonly defaultArgs: DefaultCdkOptions; | ||
| /** | ||
| * The directory where the CDK will be synthed to | ||
| * | ||
| * Relative to cwd. | ||
| */ | ||
| protected readonly cdkOutDir: string; | ||
| /** | ||
| * The profile to use for the CDK CLI calls | ||
| */ | ||
| protected readonly profile?: string; | ||
| /** | ||
| * Show output from the integ test run. | ||
| */ | ||
| protected readonly showOutput: boolean; | ||
| protected _destructiveChanges?: DestructiveChange[]; | ||
| private legacyContext?; | ||
| private _expectedTestSuite?; | ||
| private _actualTestSuite?; | ||
| constructor(options: IntegRunnerOptions); | ||
| /** | ||
| * Return the list of expected (i.e. existing) test cases for this integration test | ||
| */ | ||
| expectedTests(): Promise<{ | ||
| [testName: string]: TestCase; | ||
| } | undefined>; | ||
| /** | ||
| * Return the list of actual (i.e. new) test cases for this integration test | ||
| */ | ||
| actualTests(): Promise<{ | ||
| [testName: string]: TestCase; | ||
| } | undefined>; | ||
| /** | ||
| * Generate a new "actual" snapshot which will be compared to the | ||
| * existing "expected" snapshot | ||
| * This will synth and then load the integration test manifest | ||
| */ | ||
| generateActualSnapshot(): Promise<IntegTestSuite | LegacyIntegTestSuite>; | ||
| /** | ||
| * Returns true if a snapshot already exists for this test | ||
| */ | ||
| hasSnapshot(): boolean; | ||
| /** | ||
| * The test suite from the existing snapshot | ||
| */ | ||
| protected expectedTestSuite(): Promise<IntegTestSuite | LegacyIntegTestSuite | undefined>; | ||
| /** | ||
| * The test suite from the new "actual" snapshot | ||
| */ | ||
| protected actualTestSuite(): Promise<IntegTestSuite | LegacyIntegTestSuite>; | ||
| /** | ||
| * Load the integ manifest which contains information | ||
| * on how to execute the tests | ||
| * First we try and load the manifest from the integ manifest (i.e. integ.json) | ||
| * from the cloud assembly. If it doesn't exist, then we fallback to the | ||
| * "legacy mode" and create a manifest from pragma | ||
| */ | ||
| protected loadManifest(dir?: string): Promise<IntegTestSuite | LegacyIntegTestSuite>; | ||
| protected cleanup(): void; | ||
| /** | ||
| * If there are any destructive changes to a stack then this will record | ||
| * those in the manifest.json file | ||
| */ | ||
| private renderTraceData; | ||
| /** | ||
| * In cases where we do not want to retain the assets, | ||
| * for example, if the assets are very large. | ||
| * | ||
| * Since it is possible to disable the update workflow for individual test | ||
| * cases, this needs to first get a list of stacks that have the update workflow | ||
| * disabled and then delete assets that relate to that stack. It does that | ||
| * by reading the asset manifest for the stack and deleting the asset source | ||
| */ | ||
| protected removeAssetsFromSnapshot(): Promise<void>; | ||
| /** | ||
| * Remove the asset cache (.cache/) files from the snapshot. | ||
| * These are a cache of the asset zips, but we are fine with | ||
| * re-zipping on deploy | ||
| */ | ||
| protected removeAssetsCacheFromSnapshot(): void; | ||
| /** | ||
| * Create the new snapshot. | ||
| * | ||
| * If lookups are enabled, then we need create the snapshot by synth'ing again | ||
| * with the dummy context so that each time the test is run on different machines | ||
| * (and with different context/env) the diff will not change. | ||
| * | ||
| * If lookups are disabled (which means the stack is env agnostic) then just copy | ||
| * the assembly that was output by the deployment | ||
| */ | ||
| protected createSnapshot(): Promise<void>; | ||
| /** | ||
| * Perform some cleanup steps after the snapshot is created | ||
| * Anytime the snapshot needs to be modified after creation | ||
| * the logic should live here. | ||
| */ | ||
| private cleanupSnapshot; | ||
| protected getContext(additionalContext?: Record<string, any>): Record<string, any>; | ||
| } | ||
| export declare const DEFAULT_SYNTH_OPTIONS: { | ||
| context: { | ||
| "aws:cdk:availability-zones:fallback": string[]; | ||
| 'availability-zones:account=12345678:region=test-region': string[]; | ||
| 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2:region=test-region': string; | ||
| 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2:region=test-region': string; | ||
| 'ssm:account=12345678:parameterName=/aws/service/ecs/optimized-ami/amazon-linux/recommended:region=test-region': string; | ||
| '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': string; | ||
| 'vpc-provider:account=12345678:filter.isDefault=true:region=test-region:returnAsymmetricSubnets=true': { | ||
| vpcId: string; | ||
| subnetGroups: { | ||
| type: string; | ||
| name: string; | ||
| subnets: { | ||
| subnetId: string; | ||
| availabilityZone: string; | ||
| routeTableId: string; | ||
| }[]; | ||
| }[]; | ||
| }; | ||
| }; | ||
| env: { | ||
| CDK_INTEG_ACCOUNT: string; | ||
| CDK_INTEG_REGION: string; | ||
| CDK_INTEG_HOSTED_ZONE_ID: string; | ||
| CDK_INTEG_HOSTED_ZONE_NAME: string; | ||
| CDK_INTEG_DOMAIN_NAME: string; | ||
| CDK_INTEG_CERT_ARN: string; | ||
| CDK_INTEG_SUBNET_ID: string; | ||
| }; | ||
| }; | ||
| /** | ||
| * Return the currently recommended flags for `aws-cdk-lib`. | ||
| * | ||
| * These have been built into the CLI at build time. If this ever gets changed | ||
| * back to a dynamic load, remember that this source file may be bundled into | ||
| * a JavaScript bundle, and `__dirname` might not point where you think it does. | ||
| */ | ||
| export declare function currentlyRecommendedAwsCdkLibFlags(): { | ||
| "@aws-cdk/aws-signer:signingProfileNamePassedToCfn": boolean; | ||
| "@aws-cdk/aws-ecs-patterns:secGroupsDisablesImplicitOpenListener": boolean; | ||
| "@aws-cdk/aws-lambda:recognizeLayerVersion": boolean; | ||
| "@aws-cdk/core:checkSecretUsage": boolean; | ||
| "@aws-cdk/core:target-partitions": string[]; | ||
| "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": boolean; | ||
| "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": boolean; | ||
| "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": boolean; | ||
| "@aws-cdk/aws-iam:minimizePolicies": boolean; | ||
| "@aws-cdk/core:validateSnapshotRemovalPolicy": boolean; | ||
| "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": boolean; | ||
| "@aws-cdk/aws-s3:createDefaultLoggingPolicy": boolean; | ||
| "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": boolean; | ||
| "@aws-cdk/aws-apigateway:disableCloudWatchRole": boolean; | ||
| "@aws-cdk/core:enablePartitionLiterals": boolean; | ||
| "@aws-cdk/aws-events:eventsTargetQueueSameAccount": boolean; | ||
| "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": boolean; | ||
| "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": boolean; | ||
| "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": boolean; | ||
| "@aws-cdk/aws-route53-patters:useCertificate": boolean; | ||
| "@aws-cdk/customresources:installLatestAwsSdkDefault": boolean; | ||
| "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": boolean; | ||
| "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": boolean; | ||
| "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": boolean; | ||
| "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": boolean; | ||
| "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": boolean; | ||
| "@aws-cdk/aws-redshift:columnId": boolean; | ||
| "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": boolean; | ||
| "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": boolean; | ||
| "@aws-cdk/aws-apigateway:requestValidatorUniqueId": boolean; | ||
| "@aws-cdk/aws-kms:aliasNameRef": boolean; | ||
| "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": boolean; | ||
| "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": boolean; | ||
| "@aws-cdk/core:includePrefixInUniqueNameGeneration": boolean; | ||
| "@aws-cdk/aws-efs:denyAnonymousAccess": boolean; | ||
| "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": boolean; | ||
| "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": boolean; | ||
| "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": boolean; | ||
| "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": boolean; | ||
| "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": boolean; | ||
| "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": boolean; | ||
| "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": boolean; | ||
| "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": boolean; | ||
| "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": boolean; | ||
| "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": boolean; | ||
| "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": boolean; | ||
| "@aws-cdk/aws-eks:nodegroupNameAttribute": boolean; | ||
| "@aws-cdk/aws-eks:useNativeOidcProvider": boolean; | ||
| "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": boolean; | ||
| "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": boolean; | ||
| "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": boolean; | ||
| "@aws-cdk/aws-s3:keepNotificationInImportedBucket": boolean; | ||
| "@aws-cdk/core:explicitStackTags": boolean; | ||
| "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": boolean; | ||
| "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": boolean; | ||
| "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": boolean; | ||
| "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": boolean; | ||
| "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": boolean; | ||
| "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": boolean; | ||
| "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": boolean; | ||
| "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": boolean; | ||
| "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": boolean; | ||
| "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": boolean; | ||
| "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": boolean; | ||
| "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": boolean; | ||
| "@aws-cdk/core:enableAdditionalMetadataCollection": boolean; | ||
| "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": boolean; | ||
| "@aws-cdk/aws-s3:setUniqueReplicationRoleName": boolean; | ||
| "@aws-cdk/aws-events:requireEventBusPolicySid": boolean; | ||
| "@aws-cdk/core:aspectPrioritiesMutating": boolean; | ||
| "@aws-cdk/aws-dynamodb:retainTableReplica": boolean; | ||
| "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": boolean; | ||
| "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": boolean; | ||
| "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": boolean; | ||
| "@aws-cdk/aws-s3:publicAccessBlockedByDefault": boolean; | ||
| "@aws-cdk/aws-lambda:useCdkManagedLogGroup": boolean; | ||
| "@aws-cdk/aws-elasticloadbalancingv2:networkLoadBalancerWithSecurityGroupByDefault": boolean; | ||
| "@aws-cdk/aws-ecs-patterns:uniqueTargetGroupId": boolean; | ||
| "@aws-cdk/aws-route53-patterns:useDistribution": boolean; | ||
| "@aws-cdk/aws-cloudfront:defaultFunctionRuntimeV2_0": boolean; | ||
| "@aws-cdk/aws-elasticloadbalancingv2:usePostQuantumTlsPolicy": boolean; | ||
| "@aws-cdk/aws-batch:defaultToAL2023": boolean; | ||
| "@aws-cdk/core:annotationsInValidationReport": boolean; | ||
| }; | ||
| //# sourceMappingURL=runner-base.d.ts.map |
| {"version":3,"file":"runner-base.d.ts","sourceRoot":"","sources":["runner-base.ts"],"names":[],"mappings":"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"} |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.DEFAULT_SYNTH_OPTIONS = exports.IntegRunner = void 0; | ||
| exports.currentlyRecommendedAwsCdkLibFlags = currentlyRecommendedAwsCdkLibFlags; | ||
| /* eslint-disable @cdklabs/no-literal-partition */ | ||
| const path = require("path"); | ||
| const cloud_assembly_api_1 = require("@aws-cdk/cloud-assembly-api"); | ||
| const fs = require("fs-extra"); | ||
| const integ_test_suite_1 = require("./integ-test-suite"); | ||
| const recommendedFlagsFile = require("../recommended-feature-flags.json"); | ||
| const utils_1 = require("../utils"); | ||
| const engine_1 = require("./engine"); | ||
| const logger = require("../logger"); | ||
| const cloud_assembly_1 = require("./private/cloud-assembly"); | ||
| const integ_manifest_1 = require("./private/integ-manifest"); | ||
| const DESTRUCTIVE_CHANGES = '!!DESTRUCTIVE_CHANGES:'; | ||
| /** | ||
| * The different components of a test name | ||
| */ | ||
| /** | ||
| * Represents an Integration test runner | ||
| */ | ||
| class IntegRunner { | ||
| /** | ||
| * The directory where the snapshot will be stored | ||
| */ | ||
| snapshotDir; | ||
| /** | ||
| * An instance of the CDK CLI | ||
| */ | ||
| cdk; | ||
| /** | ||
| * Pretty name of the test | ||
| */ | ||
| testName; | ||
| /** | ||
| * The value used in the '--app' CLI parameter | ||
| * | ||
| * Path to the integ test source file, relative to `this.directory`. | ||
| */ | ||
| cdkApp; | ||
| /** | ||
| * The path where the `cdk.context.json` file | ||
| * will be created | ||
| */ | ||
| cdkContextPath; | ||
| /** | ||
| * The working directory that the integration tests will be | ||
| * executed from | ||
| */ | ||
| directory; | ||
| /** | ||
| * The test to run | ||
| */ | ||
| test; | ||
| /** | ||
| * Default options to pass to the CDK CLI | ||
| */ | ||
| defaultArgs = { | ||
| pathMetadata: false, | ||
| assetMetadata: false, | ||
| versionReporting: false, | ||
| }; | ||
| /** | ||
| * The directory where the CDK will be synthed to | ||
| * | ||
| * Relative to cwd. | ||
| */ | ||
| cdkOutDir; | ||
| /** | ||
| * The profile to use for the CDK CLI calls | ||
| */ | ||
| profile; | ||
| /** | ||
| * Show output from the integ test run. | ||
| */ | ||
| showOutput; | ||
| _destructiveChanges; | ||
| legacyContext; | ||
| _expectedTestSuite; | ||
| _actualTestSuite; | ||
| constructor(options) { | ||
| this.test = options.test; | ||
| this.directory = this.test.directory; | ||
| this.testName = this.test.testName; | ||
| this.snapshotDir = this.test.snapshotDir; | ||
| this.cdkContextPath = path.join(this.directory, 'cdk.context.json'); | ||
| this.profile = options.profile; | ||
| this.showOutput = options.showOutput ?? false; | ||
| this.cdk = options.cdk ?? (0, engine_1.makeEngine)(options); | ||
| this.cdkOutDir = options.integOutDir ?? this.test.temporaryOutputDir; | ||
| const testRunCommand = this.test.appCommand; | ||
| this.cdkApp = testRunCommand.replace('{filePath}', path.relative(this.directory, this.test.fileName)); | ||
| } | ||
| /** | ||
| * Return the list of expected (i.e. existing) test cases for this integration test | ||
| */ | ||
| async expectedTests() { | ||
| return (await this.expectedTestSuite())?.testSuite; | ||
| } | ||
| /** | ||
| * Return the list of actual (i.e. new) test cases for this integration test | ||
| */ | ||
| async actualTests() { | ||
| return (await this.actualTestSuite()).testSuite; | ||
| } | ||
| /** | ||
| * Generate a new "actual" snapshot which will be compared to the | ||
| * existing "expected" snapshot | ||
| * This will synth and then load the integration test manifest | ||
| */ | ||
| async generateActualSnapshot() { | ||
| await this.cdk.synth({ | ||
| app: this.cdkApp, | ||
| // we don't know the "actual" context yet (this method is what generates it) so just | ||
| // use the "expected" context. This is only run in order to read the manifest | ||
| context: this.getContext((await this.expectedTestSuite())?.synthContext), | ||
| env: exports.DEFAULT_SYNTH_OPTIONS.env, | ||
| output: path.relative(this.directory, this.cdkOutDir), | ||
| }); | ||
| const manifest = await this.loadManifest(this.cdkOutDir); | ||
| // after we load the manifest remove the tmp snapshot | ||
| // so that it doesn't mess up the real snapshot created later | ||
| this.cleanup(); | ||
| return manifest; | ||
| } | ||
| /** | ||
| * Returns true if a snapshot already exists for this test | ||
| */ | ||
| hasSnapshot() { | ||
| return fs.existsSync(this.snapshotDir); | ||
| } | ||
| /** | ||
| * The test suite from the existing snapshot | ||
| */ | ||
| async expectedTestSuite() { | ||
| if (!this._expectedTestSuite && this.hasSnapshot()) { | ||
| this._expectedTestSuite = await this.loadManifest(); | ||
| } | ||
| return this._expectedTestSuite; | ||
| } | ||
| /** | ||
| * The test suite from the new "actual" snapshot | ||
| */ | ||
| async actualTestSuite() { | ||
| if (!this._actualTestSuite) { | ||
| this._actualTestSuite = await this.generateActualSnapshot(); | ||
| } | ||
| return this._actualTestSuite; | ||
| } | ||
| /** | ||
| * Load the integ manifest which contains information | ||
| * on how to execute the tests | ||
| * First we try and load the manifest from the integ manifest (i.e. integ.json) | ||
| * from the cloud assembly. If it doesn't exist, then we fallback to the | ||
| * "legacy mode" and create a manifest from pragma | ||
| */ | ||
| async loadManifest(dir) { | ||
| const manifest = dir ?? this.snapshotDir; | ||
| try { | ||
| const testSuite = integ_test_suite_1.IntegTestSuite.fromPath(manifest); | ||
| return testSuite; | ||
| } | ||
| catch (modernError) { | ||
| // Only attempt legacy test case if the integ test manifest was not found | ||
| // For any other errors, e.g. when parsing the manifest fails, we abort. | ||
| if (!(modernError instanceof integ_manifest_1.NoManifestError)) { | ||
| throw modernError; | ||
| } | ||
| if (this.showOutput) { | ||
| logger.trace("Failed to load integ test manifest for '%s'. Attempting as deprecated legacy test instead. Error was: %s", manifest, modernError.message ?? String(modernError)); | ||
| } | ||
| const testCases = await integ_test_suite_1.LegacyIntegTestSuite.fromLegacy({ | ||
| cdk: this.cdk, | ||
| testName: this.test.normalizedTestName, | ||
| integSourceFilePath: this.test.fileName, | ||
| listOptions: { | ||
| ...this.defaultArgs, | ||
| all: true, | ||
| app: this.cdkApp, | ||
| profile: this.profile, | ||
| output: path.relative(this.directory, this.cdkOutDir), | ||
| }, | ||
| }); | ||
| this.legacyContext = integ_test_suite_1.LegacyIntegTestSuite.getPragmaContext(this.test.fileName); | ||
| return testCases; | ||
| } | ||
| } | ||
| cleanup() { | ||
| const cdkOutPath = this.cdkOutDir; | ||
| if (fs.existsSync(cdkOutPath)) { | ||
| fs.removeSync(cdkOutPath); | ||
| } | ||
| } | ||
| /** | ||
| * If there are any destructive changes to a stack then this will record | ||
| * those in the manifest.json file | ||
| */ | ||
| renderTraceData() { | ||
| const traceData = new Map(); | ||
| const destructiveChanges = this._destructiveChanges ?? []; | ||
| destructiveChanges.forEach(change => { | ||
| const trace = traceData.get(change.stackName); | ||
| if (trace) { | ||
| trace.set(change.logicalId, `${DESTRUCTIVE_CHANGES} ${change.impact}`); | ||
| } | ||
| else { | ||
| traceData.set(change.stackName, new Map([ | ||
| [change.logicalId, `${DESTRUCTIVE_CHANGES} ${change.impact}`], | ||
| ])); | ||
| } | ||
| }); | ||
| return traceData; | ||
| } | ||
| /** | ||
| * In cases where we do not want to retain the assets, | ||
| * for example, if the assets are very large. | ||
| * | ||
| * Since it is possible to disable the update workflow for individual test | ||
| * cases, this needs to first get a list of stacks that have the update workflow | ||
| * disabled and then delete assets that relate to that stack. It does that | ||
| * by reading the asset manifest for the stack and deleting the asset source | ||
| */ | ||
| async removeAssetsFromSnapshot() { | ||
| const stacks = (await this.actualTestSuite()).getStacksWithoutUpdateWorkflow() ?? []; | ||
| const manifest = cloud_assembly_1.AssemblyManifestReader.fromPath(this.snapshotDir); | ||
| const assets = (0, utils_1.flatten)(stacks.map(stack => { | ||
| return manifest.getAssetLocationsForStack(stack) ?? []; | ||
| })); | ||
| assets.forEach(asset => { | ||
| const fileName = path.join(this.snapshotDir, asset); | ||
| if (fs.existsSync(fileName)) { | ||
| if (fs.lstatSync(fileName).isDirectory()) { | ||
| fs.removeSync(fileName); | ||
| } | ||
| else { | ||
| fs.unlinkSync(fileName); | ||
| } | ||
| } | ||
| }); | ||
| } | ||
| /** | ||
| * Remove the asset cache (.cache/) files from the snapshot. | ||
| * These are a cache of the asset zips, but we are fine with | ||
| * re-zipping on deploy | ||
| */ | ||
| removeAssetsCacheFromSnapshot() { | ||
| const files = fs.readdirSync(this.snapshotDir); | ||
| files.forEach(file => { | ||
| const fileName = path.join(this.snapshotDir, file); | ||
| if (fs.lstatSync(fileName).isDirectory() && file === '.cache') { | ||
| fs.emptyDirSync(fileName); | ||
| fs.rmdirSync(fileName); | ||
| } | ||
| }); | ||
| } | ||
| /** | ||
| * Create the new snapshot. | ||
| * | ||
| * If lookups are enabled, then we need create the snapshot by synth'ing again | ||
| * with the dummy context so that each time the test is run on different machines | ||
| * (and with different context/env) the diff will not change. | ||
| * | ||
| * If lookups are disabled (which means the stack is env agnostic) then just copy | ||
| * the assembly that was output by the deployment | ||
| */ | ||
| async createSnapshot() { | ||
| if (fs.existsSync(this.snapshotDir)) { | ||
| fs.removeSync(this.snapshotDir); | ||
| } | ||
| const actualTestSuite = await this.actualTestSuite(); | ||
| // if lookups are enabled then we need to synth again | ||
| // using dummy context and save that as the snapshot | ||
| await this.cdk.synth({ | ||
| app: this.cdkApp, | ||
| context: this.getContext(actualTestSuite.enableLookups ? exports.DEFAULT_SYNTH_OPTIONS.context : {}), | ||
| env: exports.DEFAULT_SYNTH_OPTIONS.env, | ||
| output: path.relative(this.directory, this.snapshotDir), | ||
| }); | ||
| await this.cleanupSnapshot(); | ||
| } | ||
| /** | ||
| * Perform some cleanup steps after the snapshot is created | ||
| * Anytime the snapshot needs to be modified after creation | ||
| * the logic should live here. | ||
| */ | ||
| async cleanupSnapshot() { | ||
| if (fs.existsSync(this.snapshotDir)) { | ||
| await this.removeAssetsFromSnapshot(); | ||
| this.removeAssetsCacheFromSnapshot(); | ||
| const assembly = cloud_assembly_1.AssemblyManifestReader.fromPath(this.snapshotDir); | ||
| assembly.cleanManifest(); | ||
| assembly.recordTrace(this.renderTraceData()); | ||
| } | ||
| // if this is a legacy test then create an integ manifest | ||
| // in the snapshot directory which can be used for the | ||
| // update workflow. Save any legacyContext as well so that it can be read | ||
| // the next time | ||
| const actualTestSuite = await this.actualTestSuite(); | ||
| if (actualTestSuite.type === 'legacy-test-suite') { | ||
| actualTestSuite.saveManifest(this.snapshotDir, this.legacyContext); | ||
| } | ||
| } | ||
| getContext(additionalContext) { | ||
| return { | ||
| ...currentlyRecommendedAwsCdkLibFlags(), | ||
| ...this.legacyContext, | ||
| ...additionalContext, | ||
| // We originally had PLANNED to set this to ['aws', 'aws-cn'], but due to a programming mistake | ||
| // it was set to everything. In this PR, set it to everything to not mess up all the snapshots. | ||
| ['@aws-cdk/core:target-partitions']: undefined, | ||
| /* ---------------- THE FUTURE LIVES BELOW---------------------------- | ||
| // Restricting to these target partitions makes most service principals synthesize to | ||
| // `service.${URL_SUFFIX}`, which is technically *incorrect* (it's only `amazonaws.com` | ||
| // or `amazonaws.com.cn`, never UrlSuffix for any of the restricted regions) but it's what | ||
| // most existing integ tests contain, and we want to disturb as few as possible. | ||
| // [TARGET_PARTITIONS]: ['aws', 'aws-cn'], | ||
| /* ---------------- END OF THE FUTURE ------------------------------- */ | ||
| }; | ||
| } | ||
| } | ||
| exports.IntegRunner = IntegRunner; | ||
| // Default context we run all integ tests with, so they don't depend on the | ||
| // account of the exercising user. | ||
| exports.DEFAULT_SYNTH_OPTIONS = { | ||
| context: { | ||
| [cloud_assembly_api_1.AVAILABILITY_ZONE_FALLBACK_CONTEXT_KEY]: ['test-region-1a', 'test-region-1b', 'test-region-1c'], | ||
| 'availability-zones:account=12345678:region=test-region': ['test-region-1a', 'test-region-1b', 'test-region-1c'], | ||
| 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2:region=test-region': 'ami-1234', | ||
| 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2:region=test-region': 'ami-1234', | ||
| 'ssm:account=12345678:parameterName=/aws/service/ecs/optimized-ami/amazon-linux/recommended:region=test-region': '{"image_id": "ami-1234"}', | ||
| // eslint-disable-next-line @stylistic/max-len | ||
| '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', | ||
| 'vpc-provider:account=12345678:filter.isDefault=true:region=test-region:returnAsymmetricSubnets=true': { | ||
| vpcId: 'vpc-60900905', | ||
| subnetGroups: [ | ||
| { | ||
| type: 'Public', | ||
| name: 'Public', | ||
| subnets: [ | ||
| { | ||
| subnetId: 'subnet-e19455ca', | ||
| availabilityZone: 'us-east-1a', | ||
| routeTableId: 'rtb-e19455ca', | ||
| }, | ||
| { | ||
| subnetId: 'subnet-e0c24797', | ||
| availabilityZone: 'us-east-1b', | ||
| routeTableId: 'rtb-e0c24797', | ||
| }, | ||
| { | ||
| subnetId: 'subnet-ccd77395', | ||
| availabilityZone: 'us-east-1c', | ||
| routeTableId: 'rtb-ccd77395', | ||
| }, | ||
| ], | ||
| }, | ||
| ], | ||
| }, | ||
| }, | ||
| env: { | ||
| CDK_INTEG_ACCOUNT: '12345678', | ||
| CDK_INTEG_REGION: 'test-region', | ||
| CDK_INTEG_HOSTED_ZONE_ID: 'Z23ABC4XYZL05B', | ||
| CDK_INTEG_HOSTED_ZONE_NAME: 'example.com', | ||
| CDK_INTEG_DOMAIN_NAME: '*.example.com', | ||
| CDK_INTEG_CERT_ARN: 'arn:aws:acm:test-region:12345678:certificate/86468209-a272-595d-b831-0efb6421265z', | ||
| CDK_INTEG_SUBNET_ID: 'subnet-0dff1a399d8f6f92c', | ||
| }, | ||
| }; | ||
| /** | ||
| * Return the currently recommended flags for `aws-cdk-lib`. | ||
| * | ||
| * These have been built into the CLI at build time. If this ever gets changed | ||
| * back to a dynamic load, remember that this source file may be bundled into | ||
| * a JavaScript bundle, and `__dirname` might not point where you think it does. | ||
| */ | ||
| function currentlyRecommendedAwsCdkLibFlags() { | ||
| return recommendedFlagsFile; | ||
| } | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJydW5uZXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFvZUEsZ0ZBRUM7QUF0ZUQsa0RBQWtEO0FBQ2xELDZCQUE2QjtBQUM3QixvRUFBcUY7QUFFckYsK0JBQStCO0FBQy9CLHlEQUEwRTtBQUUxRSwwRUFBMEU7QUFDMUUsb0NBQW1DO0FBQ25DLHFDQUFzQztBQUV0QyxvQ0FBb0M7QUFFcEMsNkRBQWtFO0FBRWxFLDZEQUEyRDtBQUUzRCxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDO0FBbUVyRDs7R0FFRztBQUNIOztHQUVHO0FBQ0gsTUFBc0IsV0FBVztJQUMvQjs7T0FFRztJQUNhLFdBQVcsQ0FBUztJQUVwQzs7T0FFRztJQUNhLEdBQUcsQ0FBTztJQUUxQjs7T0FFRztJQUNhLFFBQVEsQ0FBUztJQUVqQzs7OztPQUlHO0lBQ2dCLE1BQU0sQ0FBUztJQUVsQzs7O09BR0c7SUFDZ0IsY0FBYyxDQUFTO0lBRTFDOzs7T0FHRztJQUNnQixTQUFTLENBQVM7SUFFckM7O09BRUc7SUFDZ0IsSUFBSSxDQUFZO0lBRW5DOztPQUVHO0lBQ2dCLFdBQVcsR0FBc0I7UUFDbEQsWUFBWSxFQUFFLEtBQUs7UUFDbkIsYUFBYSxFQUFFLEtBQUs7UUFDcEIsZ0JBQWdCLEVBQUUsS0FBSztLQUN4QixDQUFDO0lBRUY7Ozs7T0FJRztJQUNnQixTQUFTLENBQVM7SUFFckM7O09BRUc7SUFDZ0IsT0FBTyxDQUFVO0lBRXBDOztPQUVHO0lBQ2dCLFVBQVUsQ0FBVTtJQUU3QixtQkFBbUIsQ0FBdUI7SUFDNUMsYUFBYSxDQUF1QjtJQUNwQyxrQkFBa0IsQ0FBeUM7SUFDM0QsZ0JBQWdCLENBQXlDO0lBRWpFLFlBQVksT0FBMkI7UUFDckMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElB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QXdELEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQztRQUNoSCxvSEFBb0gsRUFBRSxVQUFVO1FBQ2hJLHFIQUFxSCxFQUFFLFVBQVU7UUFDakksK0dBQStHLEVBQUUsMEJBQTBCO1FBQzNJLDhDQUE4QztRQUM5QyxrSkFBa0osRUFBRSxVQUFVO1FBQzlKLHFHQUFxRyxFQUFFO1lBQ3JHLEtBQUssRUFBRSxjQUFjO1lBQ3JCLFlBQVksRUFBRTtnQkFDWjtvQkFDRSxJQUFJLEVBQUUsUUFBUTtvQkFDZCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxPQUFPLEVBQUU7d0JBQ1A7NEJBQ0UsUUFBUSxFQUFFLGlCQUFpQjs0QkFDM0IsZ0JBQWdCLEVBQUUsWUFBWTs0QkFDOUIsWUFBWSxFQUFFLGNBQWM7eUJBQzdCO3dCQUNEOzRCQUNFLFFBQVEsRUFBRSxpQkFBaUI7NEJBQzNCLGdCQUFnQixFQUFFLFlBQVk7NEJBQzlCLFlBQVksRUFBRSxjQUFjO3lCQUM3Qjt3QkFDRDs0QkFDRSxRQUFRLEVBQUUsaUJBQWlCOzRCQUMzQixnQkFBZ0IsRUFBRSxZQUFZOzRCQUM5QixZQUFZLEVBQUUsY0FBYzt5QkFDN0I7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0Y7SUFDRCxHQUFHLEVBQUU7UUFDSCxpQkFBaUIsRUFBRSxVQUFVO1FBQzdCLGdCQUFnQixFQUFFLGFBQWE7UUFDL0Isd0JBQXdCLEVBQUUsZ0JBQWdCO1FBQzFDLDBCQUEwQixFQUFFLGFBQWE7UUFDekMscUJBQXFCLEVBQUUsZUFBZTtRQUN0QyxrQkFBa0IsRUFBRSxtRkFBbUY7UUFDdkcsbUJBQW1CLEVBQUUsMEJBQTBCO0tBQ2hEO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILFNBQWdCLGtDQUFrQztJQUNoRCxPQUFPLG9CQUFvQixDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAY2RrbGFicy9uby1saXRlcmFsLXBhcnRpdGlvbiAqL1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB0eXBlIHsgVGVzdENhc2UsIERlZmF1bHRDZGtPcHRpb25zIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEludGVnVGVzdFN1aXRlLCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSB9IGZyb20gJy4vaW50ZWctdGVzdC1zdWl0ZSc7XG5pbXBvcnQgdHlwZSB7IEludGVnVGVzdCB9IGZyb20gJy4vaW50ZWdyYXRpb24tdGVzdHMnO1xuaW1wb3J0ICogYXMgcmVjb21tZW5kZWRGbGFnc0ZpbGUgZnJvbSAnLi4vcmVjb21tZW5kZWQtZmVhdHVyZS1mbGFncy5qc29uJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBtYWtlRW5naW5lIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBJQ2RrIH0gZnJvbSAnLi4vZW5naW5lcy9jZGstaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdFRyYWNlIH0gZnJvbSAnLi9wcml2YXRlL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB7IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIgfSBmcm9tICcuL3ByaXZhdGUvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBEZXN0cnVjdGl2ZUNoYW5nZSB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcbmltcG9ydCB7IE5vTWFuaWZlc3RFcnJvciB9IGZyb20gJy4vcHJpdmF0ZS9pbnRlZy1tYW5pZmVzdCc7XG5cbmNvbnN0IERFU1RSVUNUSVZFX0NIQU5HRVMgPSAnISFERVNUUlVDVElWRV9DSEFOR0VTOic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYW4gaW50ZWdyYXRpb24gdGVzdCBydW5uZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlZ1J1bm5lck9wdGlvbnMge1xuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHRlc3QgdG8gcnVuXG4gICAqL1xuICByZWFkb25seSB0ZXN0OiBJbnRlZ1Rlc3Q7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gd2hlcmUgdGhlIHRlc3Qgc2hvdWxkIGJlIGRlcGxveWVkXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyBwcm9maWxlIHRvIHVzZSB3aGVuIGludm9raW5nIHRoZSBDREsgQ0xJXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJvZmlsZSBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0IHByb2ZpbGUgaXMgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGF2YWlsYWJsZVxuICAgKiB0byB0aGUgQ0RLIENMSVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICByZWFkb25seSBlbnY/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogdG1wIGNkay5vdXQgZGlyZWN0b3J5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGlyZWN0b3J5IHdpbGwgYmUgYGNkay1pbnRlZy5vdXQuJHt0ZXN0TmFtZX1gXG4gICAqL1xuICByZWFkb25seSBpbnRlZ091dERpcj86IHN0cmluZztcblxuICAvKipcbiAgICogSW5zdGFuY2Ugb2YgdGhlIENESyBUb29sa2l0IEVuZ2luZSB0byB1c2VcbiAgICpcbiAgICogQGRlZmF1bHQgLSBiYXNlZCBvbiBgZW5naW5lYCBvcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNkaz86IElDZGs7XG5cbiAgLyoqXG4gICAqIFNob3cgb3V0cHV0IGZyb20gcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0c1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd091dHB1dD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgaW5kaWNhdGVkIHByb3h5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJveHlcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIENBIGNlcnRpZmljYXRlIHRvIHVzZSB3aGVuIHZhbGlkYXRpbmcgSFRUUFMgcmVxdWVzdHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIENBIGJ1bmRsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FCdW5kbGVQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkaWZmZXJlbnQgY29tcG9uZW50cyBvZiBhIHRlc3QgbmFtZVxuICovXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gSW50ZWdyYXRpb24gdGVzdCBydW5uZXJcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEludGVnUnVubmVyIHtcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHNuYXBzaG90IHdpbGwgYmUgc3RvcmVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc25hcHNob3REaXI6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gaW5zdGFuY2Ugb2YgdGhlIENESyAgQ0xJXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrOiBJQ2RrO1xuXG4gIC8qKlxuICAgKiBQcmV0dHkgbmFtZSBvZiB0aGUgdGVzdFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRlc3ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB1c2VkIGluIHRoZSAnLS1hcHAnIENMSSBwYXJhbWV0ZXJcbiAgICpcbiAgICogUGF0aCB0byB0aGUgaW50ZWcgdGVzdCBzb3VyY2UgZmlsZSwgcmVsYXRpdmUgdG8gYHRoaXMuZGlyZWN0b3J5YC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBjZGtBcHA6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggd2hlcmUgdGhlIGBjZGsuY29udGV4dC5qc29uYCBmaWxlXG4gICAqIHdpbGwgYmUgY3JlYXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNka0NvbnRleHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSB0aGF0IHRoZSBpbnRlZ3JhdGlvbiB0ZXN0cyB3aWxsIGJlXG4gICAqIGV4ZWN1dGVkIGZyb21cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBkaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRlc3QgdG8gcnVuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGVzdDogSW50ZWdUZXN0O1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgQ0RLIENMSVxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRBcmdzOiBEZWZhdWx0Q2RrT3B0aW9ucyA9IHtcbiAgICBwYXRoTWV0YWRhdGE6IGZhbHNlLFxuICAgIGFzc2V0TWV0YWRhdGE6IGZhbHNlLFxuICAgIHZlcnNpb25SZXBvcnRpbmc6IGZhbHNlLFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBDREsgd2lsbCBiZSBzeW50aGVkIHRvXG4gICAqXG4gICAqIFJlbGF0aXZlIHRvIGN3ZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBjZGtPdXREaXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb2ZpbGUgdG8gdXNlIGZvciB0aGUgQ0RLIENMSSBjYWxsc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNob3cgb3V0cHV0IGZyb20gdGhlIGludGVnIHRlc3QgcnVuLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dPdXRwdXQ6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIF9kZXN0cnVjdGl2ZUNoYW5nZXM/OiBEZXN0cnVjdGl2ZUNoYW5nZVtdO1xuICBwcml2YXRlIGxlZ2FjeUNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIF9leHBlY3RlZFRlc3RTdWl0ZT86IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG4gIHByaXZhdGUgX2FjdHVhbFRlc3RTdWl0ZT86IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW50ZWdSdW5uZXJPcHRpb25zKSB7XG4gICAgdGhpcy50ZXN0ID0gb3B0aW9ucy50ZXN0O1xuICAgIHRoaXMuZGlyZWN0b3J5ID0gdGhpcy50ZXN0LmRpcmVjdG9yeTtcbiAgICB0aGlzLnRlc3ROYW1lID0gdGhpcy50ZXN0LnRlc3ROYW1lO1xuICAgIHRoaXMuc25hcHNob3REaXIgPSB0aGlzLnRlc3Quc25hcHNob3REaXI7XG4gICAgdGhpcy5jZGtDb250ZXh0UGF0aCA9IHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgJ2Nkay5jb250ZXh0Lmpzb24nKTtcbiAgICB0aGlzLnByb2ZpbGUgPSBvcHRpb25zLnByb2ZpbGU7XG4gICAgdGhpcy5zaG93T3V0cHV0ID0gb3B0aW9ucy5zaG93T3V0cHV0ID8/IGZhbHNlO1xuXG4gICAgdGhpcy5jZGsgPSBvcHRpb25zLmNkayA/PyBtYWtlRW5naW5lKG9wdGlvbnMpO1xuICAgIHRoaXMuY2RrT3V0RGlyID0gb3B0aW9ucy5pbnRlZ091dERpciA/PyB0aGlzLnRlc3QudGVtcG9yYXJ5T3V0cHV0RGlyO1xuXG4gICAgY29uc3QgdGVzdFJ1bkNvbW1hbmQgPSB0aGlzLnRlc3QuYXBwQ29tbWFuZDtcbiAgICB0aGlzLmNka0FwcCA9IHRlc3RSdW5Db21tYW5kLnJlcGxhY2UoJ3tmaWxlUGF0aH0nLCBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLnRlc3QuZmlsZU5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgZXhwZWN0ZWQgKGkuZS4gZXhpc3RpbmcpIHRlc3QgY2FzZXMgZm9yIHRoaXMgaW50ZWdyYXRpb24gdGVzdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4cGVjdGVkVGVzdHMoKTogUHJvbWlzZTx7IFt0ZXN0TmFtZTogc3RyaW5nXTogVGVzdENhc2UgfSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5leHBlY3RlZFRlc3RTdWl0ZSgpKT8udGVzdFN1aXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbGlzdCBvZiBhY3R1YWwgKGkuZS4gbmV3KSB0ZXN0IGNhc2VzIGZvciB0aGlzIGludGVncmF0aW9uIHRlc3RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3R1YWxUZXN0cygpOiBQcm9taXNlPHsgW3Rlc3ROYW1lOiBzdHJpbmddOiBUZXN0Q2FzZSB9IHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpKS50ZXN0U3VpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBuZXcgXCJhY3R1YWxcIiBzbmFwc2hvdCB3aGljaCB3aWxsIGJlIGNvbXBhcmVkIHRvIHRoZVxuICAgKiBleGlzdGluZyBcImV4cGVjdGVkXCIgc25hcHNob3RcbiAgICogVGhpcyB3aWxsIHN5bnRoIGFuZCB0aGVuIGxvYWQgdGhlIGludGVncmF0aW9uIHRlc3QgbWFuaWZlc3RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUFjdHVhbFNuYXBzaG90KCk6IFByb21pc2U8SW50ZWdUZXN0U3VpdGUgfCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZT4ge1xuICAgIGF3YWl0IHRoaXMuY2RrLnN5bnRoKHtcbiAgICAgIGFwcDogdGhpcy5jZGtBcHAsXG4gICAgICAvLyB3ZSBkb24ndCBrbm93IHRoZSBcImFjdHVhbFwiIGNvbnRleHQgeWV0ICh0aGlzIG1ldGhvZCBpcyB3aGF0IGdlbmVyYXRlcyBpdCkgc28ganVzdFxuICAgICAgLy8gdXNlIHRoZSBcImV4cGVjdGVkXCIgY29udGV4dC4gVGhpcyBpcyBvbmx5IHJ1biBpbiBvcmRlciB0byByZWFkIHRoZSBtYW5pZmVzdFxuICAgICAgY29udGV4dDogdGhpcy5nZXRDb250ZXh0KChhd2FpdCB0aGlzLmV4cGVjdGVkVGVzdFN1aXRlKCkpPy5zeW50aENvbnRleHQpLFxuICAgICAgZW52OiBERUZBVUxUX1NZTlRIX09QVElPTlMuZW52LFxuICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLmNka091dERpciksXG4gICAgfSk7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCB0aGlzLmxvYWRNYW5pZmVzdCh0aGlzLmNka091dERpcik7XG4gICAgLy8gYWZ0ZXIgd2UgbG9hZCB0aGUgbWFuaWZlc3QgcmVtb3ZlIHRoZSB0bXAgc25hcHNob3RcbiAgICAvLyBzbyB0aGF0IGl0IGRvZXNuJ3QgbWVzcyB1cCB0aGUgcmVhbCBzbmFwc2hvdCBjcmVhdGVkIGxhdGVyXG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgcmV0dXJuIG1hbmlmZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIHNuYXBzaG90IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHRlc3RcbiAgICovXG4gIHB1YmxpYyBoYXNTbmFwc2hvdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyh0aGlzLnNuYXBzaG90RGlyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGVzdCBzdWl0ZSBmcm9tIHRoZSBleGlzdGluZyBzbmFwc2hvdFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGV4cGVjdGVkVGVzdFN1aXRlKCk6IFByb21pc2U8SW50ZWdUZXN0U3VpdGUgfCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5fZXhwZWN0ZWRUZXN0U3VpdGUgJiYgdGhpcy5oYXNTbmFwc2hvdCgpKSB7XG4gICAgICB0aGlzLl9leHBlY3RlZFRlc3RTdWl0ZSA9IGF3YWl0IHRoaXMubG9hZE1hbmlmZXN0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9leHBlY3RlZFRlc3RTdWl0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGVzdCBzdWl0ZSBmcm9tIHRoZSBuZXcgXCJhY3R1YWxcIiBzbmFwc2hvdFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGFjdHVhbFRlc3RTdWl0ZSgpOiBQcm9taXNlPEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU+IHtcbiAgICBpZiAoIXRoaXMuX2FjdHVhbFRlc3RTdWl0ZSkge1xuICAgICAgdGhpcy5fYWN0dWFsVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUFjdHVhbFNuYXBzaG90KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hY3R1YWxUZXN0U3VpdGU7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgaW50ZWcgbWFuaWZlc3Qgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb25cbiAgICogb24gaG93IHRvIGV4ZWN1dGUgdGhlIHRlc3RzXG4gICAqIEZpcnN0IHdlIHRyeSBhbmQgbG9hZCB0aGUgbWFuaWZlc3QgZnJvbSB0aGUgaW50ZWcgbWFuaWZlc3QgKGkuZS4gaW50ZWcuanNvbilcbiAgICogZnJvbSB0aGUgY2xvdWQgYXNzZW1ibHkuIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4gd2UgZmFsbGJhY2sgdG8gdGhlXG4gICAqIFwibGVnYWN5IG1vZGVcIiBhbmQgY3JlYXRlIGEgbWFuaWZlc3QgZnJvbSBwcmFnbWFcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBsb2FkTWFuaWZlc3QoZGlyPzogc3RyaW5nKTogUHJvbWlzZTxJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlPiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBkaXIgPz8gdGhpcy5zbmFwc2hvdERpcjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGVzdFN1aXRlID0gSW50ZWdUZXN0U3VpdGUuZnJvbVBhdGgobWFuaWZlc3QpO1xuICAgICAgcmV0dXJuIHRlc3RTdWl0ZTtcbiAgICB9IGNhdGNoIChtb2Rlcm5FcnJvcjogYW55KSB7XG4gICAgICAvLyBPbmx5IGF0dGVtcHQgbGVnYWN5IHRlc3QgY2FzZSBpZiB0aGUgaW50ZWcgdGVzdCBtYW5pZmVzdCB3YXMgbm90IGZvdW5kXG4gICAgICAvLyBGb3IgYW55IG90aGVyIGVycm9ycywgZS5nLiB3aGVuIHBhcnNpbmcgdGhlIG1hbmlmZXN0IGZhaWxzLCB3ZSBhYm9ydC5cbiAgICAgIGlmICghKG1vZGVybkVycm9yIGluc3RhbmNlb2YgTm9NYW5pZmVzdEVycm9yKSkge1xuICAgICAgICB0aHJvdyBtb2Rlcm5FcnJvcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2hvd091dHB1dCkge1xuICAgICAgICBsb2dnZXIudHJhY2UoXG4gICAgICAgICAgXCJGYWlsZWQgdG8gbG9hZCBpbnRlZyB0ZXN0IG1hbmlmZXN0IGZvciAnJXMnLiBBdHRlbXB0aW5nIGFzIGRlcHJlY2F0ZWQgbGVnYWN5IHRlc3QgaW5zdGVhZC4gRXJyb3Igd2FzOiAlc1wiLFxuICAgICAgICAgIG1hbmlmZXN0LFxuICAgICAgICAgIG1vZGVybkVycm9yLm1lc3NhZ2UgPz8gU3RyaW5nKG1vZGVybkVycm9yKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGVzdENhc2VzID0gYXdhaXQgTGVnYWN5SW50ZWdUZXN0U3VpdGUuZnJvbUxlZ2FjeSh7XG4gICAgICAgIGNkazogdGhpcy5jZGssXG4gICAgICAgIHRlc3ROYW1lOiB0aGlzLnRlc3Qubm9ybWFsaXplZFRlc3ROYW1lLFxuICAgICAgICBpbnRlZ1NvdXJjZUZpbGVQYXRoOiB0aGlzLnRlc3QuZmlsZU5hbWUsXG4gICAgICAgIGxpc3RPcHRpb25zOiB7XG4gICAgICAgICAgLi4udGhpcy5kZWZhdWx0QXJncyxcbiAgICAgICAgICBhbGw6IHRydWUsXG4gICAgICAgICAgYXBwOiB0aGlzLmNka0FwcCxcbiAgICAgICAgICBwcm9maWxlOiB0aGlzLnByb2ZpbGUsXG4gICAgICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLmNka091dERpciksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMubGVnYWN5Q29udGV4dCA9IExlZ2FjeUludGVnVGVzdFN1aXRlLmdldFByYWdtYUNvbnRleHQodGhpcy50ZXN0LmZpbGVOYW1lKTtcbiAgICAgIHJldHVybiB0ZXN0Q2FzZXM7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFudXAoKTogdm9pZCB7XG4gICAgY29uc3QgY2RrT3V0UGF0aCA9IHRoaXMuY2RrT3V0RGlyO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNka091dFBhdGgpKSB7XG4gICAgICBmcy5yZW1vdmVTeW5jKGNka091dFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGVyZSBhcmUgYW55IGRlc3RydWN0aXZlIGNoYW5nZXMgdG8gYSBzdGFjayB0aGVuIHRoaXMgd2lsbCByZWNvcmRcbiAgICogdGhvc2UgaW4gdGhlIG1hbmlmZXN0Lmpzb24gZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJUcmFjZURhdGEoKTogTWFuaWZlc3RUcmFjZSB7XG4gICAgY29uc3QgdHJhY2VEYXRhOiBNYW5pZmVzdFRyYWNlID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGRlc3RydWN0aXZlQ2hhbmdlcyA9IHRoaXMuX2Rlc3RydWN0aXZlQ2hhbmdlcyA/PyBbXTtcbiAgICBkZXN0cnVjdGl2ZUNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT4ge1xuICAgICAgY29uc3QgdHJhY2UgPSB0cmFjZURhdGEuZ2V0KGNoYW5nZS5zdGFja05hbWUpO1xuICAgICAgaWYgKHRyYWNlKSB7XG4gICAgICAgIHRyYWNlLnNldChjaGFuZ2UubG9naWNhbElkLCBgJHtERVNUUlVDVElWRV9DSEFOR0VTfSAke2NoYW5nZS5pbXBhY3R9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFjZURhdGEuc2V0KGNoYW5nZS5zdGFja05hbWUsIG5ldyBNYXAoW1xuICAgICAgICAgIFtjaGFuZ2UubG9naWNhbElkLCBgJHtERVNUUlVDVElWRV9DSEFOR0VTfSAke2NoYW5nZS5pbXBhY3R9YF0sXG4gICAgICAgIF0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdHJhY2VEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEluIGNhc2VzIHdoZXJlIHdlIGRvIG5vdCB3YW50IHRvIHJldGFpbiB0aGUgYXNzZXRzLFxuICAgKiBmb3IgZXhhbXBsZSwgaWYgdGhlIGFzc2V0cyBhcmUgdmVyeSBsYXJnZS5cbiAgICpcbiAgICogU2luY2UgaXQgaXMgcG9zc2libGUgdG8gZGlzYWJsZSB0aGUgdXBkYXRlIHdvcmtmbG93IGZvciBpbmRpdmlkdWFsIHRlc3RcbiAgICogY2FzZXMsIHRoaXMgbmVlZHMgdG8gZmlyc3QgZ2V0IGEgbGlzdCBvZiBzdGFja3MgdGhhdCBoYXZlIHRoZSB1cGRhdGUgd29ya2Zsb3dcbiAgICogZGlzYWJsZWQgYW5kIHRoZW4gZGVsZXRlIGFzc2V0cyB0aGF0IHJlbGF0ZSB0byB0aGF0IHN0YWNrLiBJdCBkb2VzIHRoYXRcbiAgICogYnkgcmVhZGluZyB0aGUgYXNzZXQgbWFuaWZlc3QgZm9yIHRoZSBzdGFjayBhbmQgZGVsZXRpbmcgdGhlIGFzc2V0IHNvdXJjZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbW92ZUFzc2V0c0Zyb21TbmFwc2hvdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFja3MgPSAoYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKSkuZ2V0U3RhY2tzV2l0aG91dFVwZGF0ZVdvcmtmbG93KCkgPz8gW107XG4gICAgY29uc3QgbWFuaWZlc3QgPSBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLmZyb21QYXRoKHRoaXMuc25hcHNob3REaXIpO1xuICAgIGNvbnN0IGFzc2V0cyA9IGZsYXR0ZW4oc3RhY2tzLm1hcChzdGFjayA9PiB7XG4gICAgICByZXR1cm4gbWFuaWZlc3QuZ2V0QXNzZXRMb2NhdGlvbnNGb3JTdGFjayhzdGFjaykgPz8gW107XG4gICAgfSkpO1xuXG4gICAgYXNzZXRzLmZvckVhY2goYXNzZXQgPT4ge1xuICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmpvaW4odGhpcy5zbmFwc2hvdERpciwgYXNzZXQpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZU5hbWUpKSB7XG4gICAgICAgIGlmIChmcy5sc3RhdFN5bmMoZmlsZU5hbWUpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICBmcy5yZW1vdmVTeW5jKGZpbGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgYXNzZXQgY2FjaGUgKC5jYWNoZS8pIGZpbGVzIGZyb20gdGhlIHNuYXBzaG90LlxuICAgKiBUaGVzZSBhcmUgYSBjYWNoZSBvZiB0aGUgYXNzZXQgemlwcywgYnV0IHdlIGFyZSBmaW5lIHdpdGhcbiAgICogcmUtemlwcGluZyBvbiBkZXBsb3lcbiAgICovXG4gIHByb3RlY3RlZCByZW1vdmVBc3NldHNDYWNoZUZyb21TbmFwc2hvdCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuc25hcHNob3REaXIpO1xuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLnNuYXBzaG90RGlyLCBmaWxlKTtcbiAgICAgIGlmIChmcy5sc3RhdFN5bmMoZmlsZU5hbWUpLmlzRGlyZWN0b3J5KCkgJiYgZmlsZSA9PT0gJy5jYWNoZScpIHtcbiAgICAgICAgZnMuZW1wdHlEaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgICAgZnMucm1kaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIG5ldyBzbmFwc2hvdC5cbiAgICpcbiAgICogSWYgbG9va3VwcyBhcmUgZW5hYmxlZCwgdGhlbiB3ZSBuZWVkIGNyZWF0ZSB0aGUgc25hcHNob3QgYnkgc3ludGgnaW5nIGFnYWluXG4gICAqIHdpdGggdGhlIGR1bW15IGNvbnRleHQgc28gdGhhdCBlYWNoIHRpbWUgdGhlIHRlc3QgaXMgcnVuIG9uIGRpZmZlcmVudCBtYWNoaW5lc1xuICAgKiAoYW5kIHdpdGggZGlmZmVyZW50IGNvbnRleHQvZW52KSB0aGUgZGlmZiB3aWxsIG5vdCBjaGFuZ2UuXG4gICAqXG4gICAqIElmIGxvb2t1cHMgYXJlIGRpc2FibGVkICh3aGljaCBtZWFucyB0aGUgc3RhY2sgaXMgZW52IGFnbm9zdGljKSB0aGVuIGp1c3QgY29weVxuICAgKiB0aGUgYXNzZW1ibHkgdGhhdCB3YXMgb3V0cHV0IGJ5IHRoZSBkZXBsb3ltZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlU25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5zbmFwc2hvdERpcikpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmModGhpcy5zbmFwc2hvdERpcik7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKTtcblxuICAgIC8vIGlmIGxvb2t1cHMgYXJlIGVuYWJsZWQgdGhlbiB3ZSBuZWVkIHRvIHN5bnRoIGFnYWluXG4gICAgLy8gdXNpbmcgZHVtbXkgY29udGV4dCBhbmQgc2F2ZSB0aGF0IGFzIHRoZSBzbmFwc2hvdFxuICAgIGF3YWl0IHRoaXMuY2RrLnN5bnRoKHtcbiAgICAgIGFwcDogdGhpcy5jZGtBcHAsXG4gICAgICBjb250ZXh0OiB0aGlzLmdldENvbnRleHQoYWN0dWFsVGVzdFN1aXRlLmVuYWJsZUxvb2t1cHMgPyBERUZBVUxUX1NZTlRIX09QVElPTlMuY29udGV4dCA6IHt9KSxcbiAgICAgIGVudjogREVGQVVMVF9TWU5USF9PUFRJT05TLmVudixcbiAgICAgIG91dHB1dDogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5zbmFwc2hvdERpciksXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmNsZWFudXBTbmFwc2hvdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gc29tZSBjbGVhbnVwIHN0ZXBzIGFmdGVyIHRoZSBzbmFwc2hvdCBpcyBjcmVhdGVkXG4gICAqIEFueXRpbWUgdGhlIHNuYXBzaG90IG5lZWRzIHRvIGJlIG1vZGlmaWVkIGFmdGVyIGNyZWF0aW9uXG4gICAqIHRoZSBsb2dpYyBzaG91bGQgbGl2ZSBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5zbmFwc2hvdERpcikpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQXNzZXRzRnJvbVNuYXBzaG90KCk7XG4gICAgICB0aGlzLnJlbW92ZUFzc2V0c0NhY2hlRnJvbVNuYXBzaG90KCk7XG4gICAgICBjb25zdCBhc3NlbWJseSA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgodGhpcy5zbmFwc2hvdERpcik7XG4gICAgICBhc3NlbWJseS5jbGVhbk1hbmlmZXN0KCk7XG4gICAgICBhc3NlbWJseS5yZWNvcmRUcmFjZSh0aGlzLnJlbmRlclRyYWNlRGF0YSgpKTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGlzIGEgbGVnYWN5IHRlc3QgdGhlbiBjcmVhdGUgYW4gaW50ZWcgbWFuaWZlc3RcbiAgICAvLyBpbiB0aGUgc25hcHNob3QgZGlyZWN0b3J5IHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0aGVcbiAgICAvLyB1cGRhdGUgd29ya2Zsb3cuIFNhdmUgYW55IGxlZ2FjeUNvbnRleHQgYXMgd2VsbCBzbyB0aGF0IGl0IGNhbiBiZSByZWFkXG4gICAgLy8gdGhlIG5leHQgdGltZVxuICAgIGNvbnN0IGFjdHVhbFRlc3RTdWl0ZSA9IGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCk7XG4gICAgaWYgKGFjdHVhbFRlc3RTdWl0ZS50eXBlID09PSAnbGVnYWN5LXRlc3Qtc3VpdGUnKSB7XG4gICAgICAoYWN0dWFsVGVzdFN1aXRlIGFzIExlZ2FjeUludGVnVGVzdFN1aXRlKS5zYXZlTWFuaWZlc3QodGhpcy5zbmFwc2hvdERpciwgdGhpcy5sZWdhY3lDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q29udGV4dChhZGRpdGlvbmFsQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY3VycmVudGx5UmVjb21tZW5kZWRBd3NDZGtMaWJGbGFncygpLFxuICAgICAgLi4udGhpcy5sZWdhY3lDb250ZXh0LFxuICAgICAgLi4uYWRkaXRpb25hbENvbnRleHQsXG5cbiAgICAgIC8vIFdlIG9yaWdpbmFsbHkgaGFkIFBMQU5ORUQgdG8gc2V0IHRoaXMgdG8gWydhd3MnLCAnYXdzLWNuJ10sIGJ1dCBkdWUgdG8gYSBwcm9ncmFtbWluZyBtaXN0YWtlXG4gICAgICAvLyBpdCB3YXMgc2V0IHRvIGV2ZXJ5dGhpbmcuIEluIHRoaXMgUFIsIHNldCBpdCB0byBldmVyeXRoaW5nIHRvIG5vdCBtZXNzIHVwIGFsbCB0aGUgc25hcHNob3RzLlxuICAgICAgWydAYXdzLWNkay9jb3JlOnRhcmdldC1wYXJ0aXRpb25zJ106IHVuZGVmaW5lZCxcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBUSEUgRlVUVVJFIExJVkVTIEJFTE9XLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gUmVzdHJpY3RpbmcgdG8gdGhlc2UgdGFyZ2V0IHBhcnRpdGlvbnMgbWFrZXMgbW9zdCBzZXJ2aWNlIHByaW5jaXBhbHMgc3ludGhlc2l6ZSB0b1xuICAgICAgLy8gYHNlcnZpY2UuJHtVUkxfU1VGRklYfWAsIHdoaWNoIGlzIHRlY2huaWNhbGx5ICppbmNvcnJlY3QqIChpdCdzIG9ubHkgYGFtYXpvbmF3cy5jb21gXG4gICAgICAvLyBvciBgYW1hem9uYXdzLmNvbS5jbmAsIG5ldmVyIFVybFN1ZmZpeCBmb3IgYW55IG9mIHRoZSByZXN0cmljdGVkIHJlZ2lvbnMpIGJ1dCBpdCdzIHdoYXRcbiAgICAgIC8vIG1vc3QgZXhpc3RpbmcgaW50ZWcgdGVzdHMgY29udGFpbiwgYW5kIHdlIHdhbnQgdG8gZGlzdHVyYiBhcyBmZXcgYXMgcG9zc2libGUuXG4gICAgICAvLyBbVEFSR0VUX1BBUlRJVElPTlNdOiBbJ2F3cycsICdhd3MtY24nXSxcbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gRU5EIE9GIFRIRSBGVVRVUkUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgIH07XG4gIH1cbn1cblxuLy8gRGVmYXVsdCBjb250ZXh0IHdlIHJ1biBhbGwgaW50ZWcgdGVzdHMgd2l0aCwgc28gdGhleSBkb24ndCBkZXBlbmQgb24gdGhlXG4vLyBhY2NvdW50IG9mIHRoZSBleGVyY2lzaW5nIHVzZXIuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TWU5USF9PUFRJT05TID0ge1xuICBjb250ZXh0OiB7XG4gICAgW0FWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZXTogWyd0ZXN0LXJlZ2lvbi0xYScsICd0ZXN0LXJlZ2lvbi0xYicsICd0ZXN0LXJlZ2lvbi0xYyddLFxuICAgICdhdmFpbGFiaWxpdHktem9uZXM6YWNjb3VudD0xMjM0NTY3ODpyZWdpb249dGVzdC1yZWdpb24nOiBbJ3Rlc3QtcmVnaW9uLTFhJywgJ3Rlc3QtcmVnaW9uLTFiJywgJ3Rlc3QtcmVnaW9uLTFjJ10sXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4tYW1pLWh2bS14ODZfNjQtZ3AyOnJlZ2lvbj10ZXN0LXJlZ2lvbic6ICdhbWktMTIzNCcsXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4yLWFtaS1odm0teDg2XzY0LWdwMjpyZWdpb249dGVzdC1yZWdpb24nOiAnYW1pLTEyMzQnLFxuICAgICdzc206YWNjb3VudD0xMjM0NTY3ODpwYXJhbWV0ZXJOYW1lPS9hd3Mvc2VydmljZS9lY3Mvb3B0aW1pemVkLWFtaS9hbWF6b24tbGludXgvcmVjb21tZW5kZWQ6cmVnaW9uPXRlc3QtcmVnaW9uJzogJ3tcImltYWdlX2lkXCI6IFwiYW1pLTEyMzRcIn0nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljL21heC1sZW5cbiAgICAnYW1pOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVycy5pbWFnZS10eXBlLjA9bWFjaGluZTpmaWx0ZXJzLm5hbWUuMD1hbXpuLWFtaS12cGMtbmF0LSo6ZmlsdGVycy5zdGF0ZS4wPWF2YWlsYWJsZTpvd25lcnMuMD1hbWF6b246cmVnaW9uPXRlc3QtcmVnaW9uJzogJ2FtaS0xMjM0JyxcbiAgICAndnBjLXByb3ZpZGVyOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVyLmlzRGVmYXVsdD10cnVlOnJlZ2lvbj10ZXN0LXJlZ2lvbjpyZXR1cm5Bc3ltbWV0cmljU3VibmV0cz10cnVlJzoge1xuICAgICAgdnBjSWQ6ICd2cGMtNjA5MDA5MDUnLFxuICAgICAgc3VibmV0R3JvdXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnUHVibGljJyxcbiAgICAgICAgICBuYW1lOiAnUHVibGljJyxcbiAgICAgICAgICBzdWJuZXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN1Ym5ldElkOiAnc3VibmV0LWUxOTQ1NWNhJyxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogJ3VzLWVhc3QtMWEnLFxuICAgICAgICAgICAgICByb3V0ZVRhYmxlSWQ6ICdydGItZTE5NDU1Y2EnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3VibmV0SWQ6ICdzdWJuZXQtZTBjMjQ3OTcnLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiAndXMtZWFzdC0xYicsXG4gICAgICAgICAgICAgIHJvdXRlVGFibGVJZDogJ3J0Yi1lMGMyNDc5NycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdWJuZXRJZDogJ3N1Ym5ldC1jY2Q3NzM5NScsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6ICd1cy1lYXN0LTFjJyxcbiAgICAgICAgICAgICAgcm91dGVUYWJsZUlkOiAncnRiLWNjZDc3Mzk1JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbiAgZW52OiB7XG4gICAgQ0RLX0lOVEVHX0FDQ09VTlQ6ICcxMjM0NTY3OCcsXG4gICAgQ0RLX0lOVEVHX1JFR0lPTjogJ3Rlc3QtcmVnaW9uJyxcbiAgICBDREtfSU5URUdfSE9TVEVEX1pPTkVfSUQ6ICdaMjNBQkM0WFlaTDA1QicsXG4gICAgQ0RLX0lOVEVHX0hPU1RFRF9aT05FX05BTUU6ICdleGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0RPTUFJTl9OQU1FOiAnKi5leGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0NFUlRfQVJOOiAnYXJuOmF3czphY206dGVzdC1yZWdpb246MTIzNDU2Nzg6Y2VydGlmaWNhdGUvODY0NjgyMDktYTI3Mi01OTVkLWI4MzEtMGVmYjY0MjEyNjV6JyxcbiAgICBDREtfSU5URUdfU1VCTkVUX0lEOiAnc3VibmV0LTBkZmYxYTM5OWQ4ZjZmOTJjJyxcbiAgfSxcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBjdXJyZW50bHkgcmVjb21tZW5kZWQgZmxhZ3MgZm9yIGBhd3MtY2RrLWxpYmAuXG4gKlxuICogVGhlc2UgaGF2ZSBiZWVuIGJ1aWx0IGludG8gdGhlIENMSSBhdCBidWlsZCB0aW1lLiBJZiB0aGlzIGV2ZXIgZ2V0cyBjaGFuZ2VkXG4gKiBiYWNrIHRvIGEgZHluYW1pYyBsb2FkLCByZW1lbWJlciB0aGF0IHRoaXMgc291cmNlIGZpbGUgbWF5IGJlIGJ1bmRsZWQgaW50b1xuICogYSBKYXZhU2NyaXB0IGJ1bmRsZSwgYW5kIGBfX2Rpcm5hbWVgIG1pZ2h0IG5vdCBwb2ludCB3aGVyZSB5b3UgdGhpbmsgaXQgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRseVJlY29tbWVuZGVkQXdzQ2RrTGliRmxhZ3MoKSB7XG4gIHJldHVybiByZWNvbW1lbmRlZEZsYWdzRmlsZTtcbn1cbiJdfQ== |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
17211
0.94%20360138
-6.89%5
25%+ Added
- Removed
Updated