UNPKG

@aws-cdk/aws-eks-v2-alpha

Version:

This module is deprecated. All constructs are now available under aws-cdk-lib/aws-eks-v2

531 lines 76.8 kB
"use strict"; var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) { var useValue = arguments.length > 2; for (var i = 0; i < initializers.length; i++) { value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); } return useValue ? value : void 0; }; var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); var _, done = false; for (var i = decorators.length - 1; i >= 0; i--) { var context = {}; for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; for (var p in contextIn.access) context.access[p] = contextIn.access[p]; context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); if (kind === "accessor") { if (result === void 0) continue; if (result === null || typeof result !== "object") throw new TypeError("Object expected"); if (_ = accept(result.get)) descriptor.get = _; if (_ = accept(result.set)) descriptor.set = _; if (_ = accept(result.init)) initializers.unshift(_); } else if (_ = accept(result)) { if (kind === "field") initializers.unshift(_); else descriptor[key] = _; } } if (target) Object.defineProperty(target, contextIn.name, descriptor); done = true; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Nodegroup = exports.TaintEffect = exports.CapacityType = exports.NodegroupAmiType = void 0; const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_ec2_1 = require("aws-cdk-lib/aws-ec2"); const aws_eks_1 = require("aws-cdk-lib/aws-eks"); const aws_iam_1 = require("aws-cdk-lib/aws-iam"); const core_1 = require("aws-cdk-lib/core"); const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal"); const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource"); const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable"); const cxapi = require("aws-cdk-lib/cx-api"); const constructs_1 = require("constructs"); const cluster_1 = require("./cluster"); const nodegroup_1 = require("./private/nodegroup"); /** * The AMI type for your node group. * * GPU instance types should use the `AL2_x86_64_GPU` AMI type, which uses the * Amazon EKS-optimized Linux AMI with GPU support or the `BOTTLEROCKET_ARM_64_NVIDIA` or `BOTTLEROCKET_X86_64_NVIDIA` * AMI types, which uses the Amazon EKS-optimized Linux AMI with Nvidia-GPU support. * * Non-GPU instances should use the `AL2_x86_64` AMI type, which uses the Amazon EKS-optimized Linux AMI. */ var NodegroupAmiType; (function (NodegroupAmiType) { /** * Amazon Linux 2 (x86-64) */ NodegroupAmiType["AL2_X86_64"] = "AL2_x86_64"; /** * Amazon Linux 2 with GPU support */ NodegroupAmiType["AL2_X86_64_GPU"] = "AL2_x86_64_GPU"; /** * Amazon Linux 2 (ARM-64) */ NodegroupAmiType["AL2_ARM_64"] = "AL2_ARM_64"; /** * Bottlerocket Linux (ARM-64) */ NodegroupAmiType["BOTTLEROCKET_ARM_64"] = "BOTTLEROCKET_ARM_64"; /** * Bottlerocket (x86-64) */ NodegroupAmiType["BOTTLEROCKET_X86_64"] = "BOTTLEROCKET_x86_64"; /** * Bottlerocket Linux with Nvidia-GPU support (ARM-64) */ NodegroupAmiType["BOTTLEROCKET_ARM_64_NVIDIA"] = "BOTTLEROCKET_ARM_64_NVIDIA"; /** * Bottlerocket with Nvidia-GPU support (x86-64) */ NodegroupAmiType["BOTTLEROCKET_X86_64_NVIDIA"] = "BOTTLEROCKET_x86_64_NVIDIA"; /** * Bottlerocket Linux (ARM-64) with FIPS enabled */ NodegroupAmiType["BOTTLEROCKET_ARM_64_FIPS"] = "BOTTLEROCKET_ARM_64_FIPS"; /** * Bottlerocket (x86-64) with FIPS enabled */ NodegroupAmiType["BOTTLEROCKET_X86_64_FIPS"] = "BOTTLEROCKET_x86_64_FIPS"; /** * Windows Core 2019 (x86-64) */ NodegroupAmiType["WINDOWS_CORE_2019_X86_64"] = "WINDOWS_CORE_2019_x86_64"; /** * Windows Core 2022 (x86-64) */ NodegroupAmiType["WINDOWS_CORE_2022_X86_64"] = "WINDOWS_CORE_2022_x86_64"; /** * Windows Full 2019 (x86-64) */ NodegroupAmiType["WINDOWS_FULL_2019_X86_64"] = "WINDOWS_FULL_2019_x86_64"; /** * Windows Full 2022 (x86-64) */ NodegroupAmiType["WINDOWS_FULL_2022_X86_64"] = "WINDOWS_FULL_2022_x86_64"; /** * Amazon Linux 2023 (x86-64) */ NodegroupAmiType["AL2023_X86_64_STANDARD"] = "AL2023_x86_64_STANDARD"; /** * Amazon Linux 2023 with AWS Neuron drivers (x86-64) */ NodegroupAmiType["AL2023_X86_64_NEURON"] = "AL2023_x86_64_NEURON"; /** * Amazon Linux 2023 with NVIDIA drivers (x86-64) */ NodegroupAmiType["AL2023_X86_64_NVIDIA"] = "AL2023_x86_64_NVIDIA"; /** * Amazon Linux 2023 with NVIDIA drivers (ARM-64) */ NodegroupAmiType["AL2023_ARM_64_NVIDIA"] = "AL2023_ARM_64_NVIDIA"; /** * Amazon Linux 2023 (ARM-64) */ NodegroupAmiType["AL2023_ARM_64_STANDARD"] = "AL2023_ARM_64_STANDARD"; })(NodegroupAmiType || (exports.NodegroupAmiType = NodegroupAmiType = {})); /** * Capacity type of the managed node group */ var CapacityType; (function (CapacityType) { /** * spot instances */ CapacityType["SPOT"] = "SPOT"; /** * on-demand instances */ CapacityType["ON_DEMAND"] = "ON_DEMAND"; /** * capacity block instances */ CapacityType["CAPACITY_BLOCK"] = "CAPACITY_BLOCK"; })(CapacityType || (exports.CapacityType = CapacityType = {})); /** * Effect types of kubernetes node taint. * * Note: These values are specifically for AWS EKS NodeGroups and use the AWS API format. * When using AWS CLI or API, taint effects must be NO_SCHEDULE, PREFER_NO_SCHEDULE, or NO_EXECUTE. * When using Kubernetes directly or kubectl, taint effects must be NoSchedule, PreferNoSchedule, or NoExecute. * * For Kubernetes manifests (like Karpenter NodePools), use string literals with PascalCase format: * - 'NoSchedule' instead of TaintEffect.NO_SCHEDULE * - 'PreferNoSchedule' instead of TaintEffect.PREFER_NO_SCHEDULE * - 'NoExecute' instead of TaintEffect.NO_EXECUTE * * @see https://docs.aws.amazon.com/eks/latest/userguide/node-taints-managed-node-groups.html */ var TaintEffect; (function (TaintEffect) { /** * NoSchedule */ TaintEffect["NO_SCHEDULE"] = "NO_SCHEDULE"; /** * PreferNoSchedule */ TaintEffect["PREFER_NO_SCHEDULE"] = "PREFER_NO_SCHEDULE"; /** * NoExecute */ TaintEffect["NO_EXECUTE"] = "NO_EXECUTE"; })(TaintEffect || (exports.TaintEffect = TaintEffect = {})); /** * The Nodegroup resource class * @resource AWS::EKS::Nodegroup */ let Nodegroup = (() => { let _classDecorators = [prop_injectable_1.propertyInjectable]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; let _classSuper = core_1.Resource; let _instanceExtraInitializers = []; let _get_nodegroupArn_decorators; let _get_nodegroupName_decorators; var Nodegroup = class extends _classSuper { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0; _get_nodegroupArn_decorators = [helpers_internal_1.memoizedGetter]; _get_nodegroupName_decorators = [helpers_internal_1.memoizedGetter]; __esDecorate(this, null, _get_nodegroupArn_decorators, { kind: "getter", name: "nodegroupArn", static: false, private: false, access: { has: obj => "nodegroupArn" in obj, get: obj => obj.nodegroupArn }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _get_nodegroupName_decorators, { kind: "getter", name: "nodegroupName", static: false, private: false, access: { has: obj => "nodegroupName" in obj, get: obj => obj.nodegroupName }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); Nodegroup = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); } static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-eks-v2-alpha.Nodegroup", version: "2.240.0-alpha.0" }; /** Uniquely identifies this class. */ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-eks-v2-alpha.Nodegroup'; /** * Import the Nodegroup from attributes */ static fromNodegroupName(scope, id, nodegroupName) { try { jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.Nodegroup#fromNodegroupName", ""); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromNodegroupName); } throw error; } class Import extends core_1.Resource { nodegroupName = nodegroupName; } return new Import(scope, id); } /** * the Amazon EKS cluster resource * * @attribute ClusterName */ cluster = __runInitializers(this, _instanceExtraInitializers); /** * IAM role of the instance profile for the nodegroup */ role; resource; desiredSize; maxSize; minSize; constructor(scope, id, props) { super(scope, id, { physicalName: props.nodegroupName, }); try { jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.Nodegroup", ""); jsiiDeprecationWarnings._aws_cdk_aws_eks_v2_alpha_NodegroupProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, Nodegroup); } throw error; } // Enhanced CDK Analytics Telemetry (0, metadata_resource_1.addConstructMetadata)(this, props); this.cluster = props.cluster; this.desiredSize = props.desiredSize ?? props.minSize ?? 2; this.maxSize = props.maxSize ?? this.desiredSize; this.minSize = props.minSize ?? 1; (0, core_1.withResolved)(this.desiredSize, this.maxSize, (desired, max) => { if (desired === undefined) { return; } if (desired > max) { throw new core_1.ValidationError(`Desired capacity ${desired} can't be greater than max size ${max}`, this); } }); (0, core_1.withResolved)(this.desiredSize, this.minSize, (desired, min) => { if (desired === undefined) { return; } if (desired < min) { throw new core_1.ValidationError(`Minimum capacity ${min} can't be greater than desired size ${desired}`, this); } }); if (props.launchTemplateSpec && props.diskSize) { // see - https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html // and https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-disksize throw new core_1.ValidationError('diskSize must be specified within the launch template', this); } if (props.instanceType && props.instanceTypes) { throw new core_1.ValidationError('"instanceType is deprecated, please use "instanceTypes" only.', this); } if (props.instanceType) { core_1.Annotations.of(this).addWarningV2('@aws-cdk/aws-eks:managedNodeGroupDeprecatedInstanceType', '"instanceType" is deprecated and will be removed in the next major version. please use "instanceTypes" instead'); } const instanceTypes = props.instanceTypes ?? (props.instanceType ? [props.instanceType] : undefined); let possibleAmiTypes = []; if (instanceTypes && instanceTypes.length > 0) { /** * if the user explicitly configured instance types, we can't caculate the expected ami type as we support * Amazon Linux 2, Bottlerocket, and Windows now. However we can check: * * 1. instance types of different CPU architectures are not mixed(e.g. X86 with ARM). * 2. user-specified amiType should be included in `possibleAmiTypes`. */ possibleAmiTypes = getPossibleAmiTypes(instanceTypes); // if the user explicitly configured an ami type, make sure it's included in the possibleAmiTypes if (props.amiType && !possibleAmiTypes.includes(props.amiType)) { throw new core_1.ValidationError(`The specified AMI does not match the instance types architecture, either specify one of ${possibleAmiTypes.join(', ').toUpperCase()} or don't specify any`, this); } // if the user explicitly configured a Windows ami type, make sure the instanceType is allowed if (props.amiType && windowsAmiTypes.includes(props.amiType) && instanceTypes.filter(isWindowsSupportedInstanceType).length < instanceTypes.length) { throw new core_1.ValidationError('The specified instanceType does not support Windows workloads. ' + 'Amazon EC2 instance types C3, C4, D2, I2, M4 (excluding m4.16xlarge), M6a.x, and ' + 'R3 instances aren\'t supported for Windows workloads.', this); } } if (!props.nodeRole) { const ngRole = new aws_iam_1.Role(this, 'NodeGroupRole', { assumedBy: new aws_iam_1.ServicePrincipal('ec2.amazonaws.com'), }); ngRole.addManagedPolicy(aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName('AmazonEKSWorkerNodePolicy')); ngRole.addManagedPolicy(aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName('AmazonEKS_CNI_Policy')); ngRole.addManagedPolicy(aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName('AmazonEC2ContainerRegistryReadOnly')); // Grant additional IPv6 networking permissions if running in IPv6 // https://docs.aws.amazon.com/eks/latest/userguide/cni-iam-role.html if (props.cluster.ipFamily == cluster_1.IpFamily.IP_V6) { ngRole.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({ // eslint-disable-next-line @cdklabs/no-literal-partition resources: ['arn:aws:ec2:*:*:network-interface/*'], actions: [ 'ec2:AssignIpv6Addresses', 'ec2:UnassignIpv6Addresses', ], })); } this.role = ngRole; } else { this.role = props.nodeRole; } this.validateUpdateConfig(props.maxUnavailable, props.maxUnavailablePercentage); this.resource = new aws_eks_1.CfnNodegroup(this, 'Resource', { clusterName: this.cluster.clusterName, nodegroupName: props.nodegroupName, nodeRole: this.role.roleArn, subnets: this.cluster.vpc.selectSubnets(props.subnets).subnetIds, /** * Case 1: If launchTemplate is explicitly specified with custom AMI, we cannot specify amiType, or the node group deployment will fail. * As we don't know if the custom AMI is specified in the lauchTemplate, we just use props.amiType. * * Case 2: If launchTemplate is not specified, we try to determine amiType from the instanceTypes and it could be either AL2 or Bottlerocket. * To avoid breaking changes, we use possibleAmiTypes[0] if amiType is undefined and make sure AL2 is always the first element in possibleAmiTypes * as AL2 is previously the `expectedAmi` and this avoids breaking changes. * * That being said, users now either have to explicitly specify correct amiType or just leave it undefined. */ amiType: props.launchTemplateSpec ? props.amiType : (props.amiType ?? possibleAmiTypes[0]), capacityType: props.capacityType ? props.capacityType.valueOf() : undefined, diskSize: props.diskSize, forceUpdateEnabled: props.forceUpdate ?? true, // note that we don't check if a launch template is configured here (even though it might configure instance types as well) // because this doesn't have a default value, meaning the user had to explicitly configure this. instanceTypes: instanceTypes?.map(t => t.toString()), labels: props.labels, taints: props.taints, launchTemplate: props.launchTemplateSpec, releaseVersion: props.releaseVersion, remoteAccess: props.remoteAccess ? { ec2SshKey: props.remoteAccess.sshKeyName, sourceSecurityGroups: props.remoteAccess.sourceSecurityGroups ? props.remoteAccess.sourceSecurityGroups.map(m => m.securityGroupId) : undefined, } : undefined, scalingConfig: { desiredSize: this.desiredSize, maxSize: this.maxSize, minSize: this.minSize, }, tags: props.tags, updateConfig: props.maxUnavailable || props.maxUnavailablePercentage ? { maxUnavailable: props.maxUnavailable, maxUnavailablePercentage: props.maxUnavailablePercentage, } : undefined, nodeRepairConfig: props.enableNodeAutoRepair ? { enabled: props.enableNodeAutoRepair, } : undefined, }); if (this.cluster instanceof cluster_1.Cluster) { // the controller runs on the worker nodes so they cannot // be deleted before the controller. if (this.cluster.albController) { constructs_1.Node.of(this.cluster.albController).addDependency(this); } } if (props.removalPolicy) { core_1.RemovalPolicies.of(this).apply(props.removalPolicy); } } /** * ARN of the nodegroup * * @attribute */ get nodegroupArn() { try { jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.Nodegroup#nodegroupArn", ""); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, jsiiDeprecationWarnings.getPropertyDescriptor(this, "nodegroupArn").get); } throw error; } return this.getResourceArnAttribute(this.resource.attrArn, { service: 'eks', resource: 'nodegroup', resourceName: this.physicalName, }); } /** * Nodegroup name * * @attribute */ get nodegroupName() { try { jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.Nodegroup#nodegroupName", ""); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, jsiiDeprecationWarnings.getPropertyDescriptor(this, "nodegroupName").get); } throw error; } if (core_1.FeatureFlags.of(this).isEnabled(cxapi.EKS_NODEGROUP_NAME)) { return this.getResourceNameAttribute(this.resource.attrNodegroupName); } else { return this.getResourceNameAttribute(this.resource.ref); } } validateUpdateConfig(maxUnavailable, maxUnavailablePercentage) { if (!maxUnavailable && !maxUnavailablePercentage) return; if (maxUnavailable && maxUnavailablePercentage) { throw new core_1.ValidationError('maxUnavailable and maxUnavailablePercentage are not allowed to be defined together', this); } if (maxUnavailablePercentage && (maxUnavailablePercentage < 1 || maxUnavailablePercentage > 100)) { throw new core_1.ValidationError(`maxUnavailablePercentage must be between 1 and 100, got ${maxUnavailablePercentage}`, this); } if (maxUnavailable) { if (maxUnavailable > this.maxSize) { throw new core_1.ValidationError(`maxUnavailable must be lower than maxSize (${this.maxSize}), got ${maxUnavailable}`, this); } if (maxUnavailable < 1 || maxUnavailable > 100) { throw new core_1.ValidationError(`maxUnavailable must be between 1 and 100, got ${maxUnavailable}`, this); } } } static { __runInitializers(_classThis, _classExtraInitializers); } }; return Nodegroup = _classThis; })(); exports.Nodegroup = Nodegroup; /** * AMI types of different architectures. Make sure AL2 is always the first element, which will be the default * AmiType if amiType and launchTemplateSpec are both undefined. */ const arm64AmiTypes = [ NodegroupAmiType.AL2_ARM_64, NodegroupAmiType.AL2023_ARM_64_STANDARD, NodegroupAmiType.BOTTLEROCKET_ARM_64, ]; const x8664AmiTypes = [ NodegroupAmiType.AL2_X86_64, NodegroupAmiType.AL2023_X86_64_STANDARD, NodegroupAmiType.BOTTLEROCKET_X86_64, NodegroupAmiType.WINDOWS_CORE_2019_X86_64, NodegroupAmiType.WINDOWS_CORE_2022_X86_64, NodegroupAmiType.WINDOWS_FULL_2019_X86_64, NodegroupAmiType.WINDOWS_FULL_2022_X86_64, ]; const windowsAmiTypes = [ NodegroupAmiType.WINDOWS_CORE_2019_X86_64, NodegroupAmiType.WINDOWS_CORE_2022_X86_64, NodegroupAmiType.WINDOWS_FULL_2019_X86_64, NodegroupAmiType.WINDOWS_FULL_2022_X86_64, ]; const gpuAmiTypes = [ NodegroupAmiType.AL2_X86_64_GPU, NodegroupAmiType.AL2023_X86_64_NEURON, NodegroupAmiType.AL2023_X86_64_NVIDIA, NodegroupAmiType.AL2023_ARM_64_NVIDIA, NodegroupAmiType.BOTTLEROCKET_X86_64_NVIDIA, NodegroupAmiType.BOTTLEROCKET_ARM_64_NVIDIA, ]; /** * This function check if the instanceType is supported by Windows AMI. * https://docs.aws.amazon.com/eks/latest/userguide/windows-support.html * @param instanceType The EC2 instance type */ function isWindowsSupportedInstanceType(instanceType) { // compare instanceType to forbidden InstanceTypes for Windows. Add exception for m6a.16xlarge. // NOTE: i2 instance class is not present in the InstanceClass enum. const forbiddenInstanceClasses = [aws_ec2_1.InstanceClass.C3, aws_ec2_1.InstanceClass.C4, aws_ec2_1.InstanceClass.D2, aws_ec2_1.InstanceClass.M4, aws_ec2_1.InstanceClass.M6A, aws_ec2_1.InstanceClass.R3]; return instanceType.toString() === aws_ec2_1.InstanceType.of(aws_ec2_1.InstanceClass.M4, aws_ec2_1.InstanceSize.XLARGE16).toString() || forbiddenInstanceClasses.every((c) => !instanceType.sameInstanceClassAs(aws_ec2_1.InstanceType.of(c, aws_ec2_1.InstanceSize.LARGE)) && !instanceType.toString().match(/^i2/)); } /** * This function examines the CPU architecture of every instance type and determines * what AMI types are compatible for all of them. it either throws or produces an array of possible AMI types because * instance types of different CPU architectures are not supported. * @param instanceTypes The instance types * @returns NodegroupAmiType[] */ function getPossibleAmiTypes(instanceTypes) { function typeToArch(instanceType) { return (0, nodegroup_1.isGpuInstanceType)(instanceType) ? 'GPU' : instanceType.architecture; } const archAmiMap = new Map([ [aws_ec2_1.InstanceArchitecture.ARM_64, arm64AmiTypes], [aws_ec2_1.InstanceArchitecture.X86_64, x8664AmiTypes], ['GPU', gpuAmiTypes], ]); const architectures = new Set(instanceTypes.map(typeToArch)); if (architectures.size === 0) { // protective code, the current implementation will never result in this. throw new core_1.UnscopedValidationError(`Cannot determine any ami type compatible with instance types: ${instanceTypes.map(i => i.toString()).join(', ')}`); } if (architectures.size > 1) { throw new core_1.UnscopedValidationError('instanceTypes of different architectures is not allowed'); } return archAmiMap.get(Array.from(architectures)[0]); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC1ub2RlZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYW5hZ2VkLW5vZGVncm91cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxpREFBc0c7QUFDdEcsaURBQW1EO0FBRW5ELGlEQUE2RjtBQUU3RiwyQ0FBZ0o7QUFDaEosNEVBQXVFO0FBQ3ZFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsNENBQTRDO0FBRTVDLDJDQUFrQztBQUVsQyx1Q0FBOEM7QUFDOUMsbURBQXdEO0FBYXhEOzs7Ozs7OztHQVFHO0FBQ0gsSUFBWSxnQkF5RVg7QUF6RUQsV0FBWSxnQkFBZ0I7SUFDMUI7O09BRUc7SUFDSCw2Q0FBeUIsQ0FBQTtJQUN6Qjs7T0FFRztJQUNILHFEQUFpQyxDQUFBO0lBQ2pDOztPQUVHO0lBQ0gsNkNBQXlCLENBQUE7SUFDekI7O09BRUc7SUFDSCwrREFBMkMsQ0FBQTtJQUMzQzs7T0FFRztJQUNILCtEQUEyQyxDQUFBO0lBQzNDOztPQUVHO0lBQ0gsNkVBQXlELENBQUE7SUFDekQ7O09BRUc7SUFDSCw2RUFBeUQsQ0FBQTtJQUN6RDs7T0FFRztJQUNILHlFQUFxRCxDQUFBO0lBQ3JEOztPQUVHO0lBQ0gseUVBQXFELENBQUE7SUFDckQ7O09BRUc7SUFDSCx5RUFBcUQsQ0FBQTtJQUNyRDs7T0FFRztJQUNILHlFQUFxRCxDQUFBO0lBQ3JEOztPQUVHO0lBQ0gseUVBQXFELENBQUE7SUFDckQ7O09BRUc7SUFDSCx5RUFBcUQsQ0FBQTtJQUNyRDs7T0FFRztJQUNILHFFQUFpRCxDQUFBO0lBQ2pEOztPQUVHO0lBQ0gsaUVBQTZDLENBQUE7SUFDN0M7O09BRUc7SUFDSCxpRUFBNkMsQ0FBQTtJQUM3Qzs7T0FFRztJQUNILGlFQUE2QyxDQUFBO0lBQzdDOztPQUVHO0lBQ0gscUVBQWlELENBQUE7QUFDbkQsQ0FBQyxFQXpFVyxnQkFBZ0IsZ0NB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Q0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSVNlY3VyaXR5R3JvdXAsIFN1Ym5ldFNlbGVjdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgSW5zdGFuY2VUeXBlLCBJbnN0YW5jZUFyY2hpdGVjdHVyZSwgSW5zdGFuY2VDbGFzcywgSW5zdGFuY2VTaXplIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBDZm5Ob2RlZ3JvdXAgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWtzJztcbmltcG9ydCB0eXBlIHsgSVJvbGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IE1hbmFnZWRQb2xpY3ksIFBvbGljeVN0YXRlbWVudCwgUm9sZSwgU2VydmljZVByaW5jaXBhbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2UsIFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IFJlc291cmNlLCBBbm5vdGF0aW9ucywgd2l0aFJlc29sdmVkLCBGZWF0dXJlRmxhZ3MsIFZhbGlkYXRpb25FcnJvciwgUmVtb3ZhbFBvbGljaWVzLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgbWVtb2l6ZWRHZXR0ZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ2F3cy1jZGstbGliL2N4LWFwaSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBJQ2x1c3RlciB9IGZyb20gJy4vY2x1c3Rlcic7XG5pbXBvcnQgeyBDbHVzdGVyLCBJcEZhbWlseSB9IGZyb20gJy4vY2x1c3Rlcic7XG5pbXBvcnQgeyBpc0dwdUluc3RhbmNlVHlwZSB9IGZyb20gJy4vcHJpdmF0ZS9ub2RlZ3JvdXAnO1xuXG4vKipcbiAqIE5vZGVHcm91cCBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTm9kZWdyb3VwIGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIG5vZGVncm91cFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBub2RlZ3JvdXBOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIEFNSSB0eXBlIGZvciB5b3VyIG5vZGUgZ3JvdXAuXG4gKlxuICogR1BVIGluc3RhbmNlIHR5cGVzIHNob3VsZCB1c2UgdGhlIGBBTDJfeDg2XzY0X0dQVWAgQU1JIHR5cGUsIHdoaWNoIHVzZXMgdGhlXG4gKiBBbWF6b24gRUtTLW9wdGltaXplZCBMaW51eCBBTUkgd2l0aCBHUFUgc3VwcG9ydCBvciB0aGUgYEJPVFRMRVJPQ0tFVF9BUk1fNjRfTlZJRElBYCBvciBgQk9UVExFUk9DS0VUX1g4Nl82NF9OVklESUFgXG4gKiBBTUkgdHlwZXMsIHdoaWNoIHVzZXMgdGhlIEFtYXpvbiBFS1Mtb3B0aW1pemVkIExpbnV4IEFNSSB3aXRoIE52aWRpYS1HUFUgc3VwcG9ydC5cbiAqXG4gKiBOb24tR1BVIGluc3RhbmNlcyBzaG91bGQgdXNlIHRoZSBgQUwyX3g4Nl82NGAgQU1JIHR5cGUsIHdoaWNoIHVzZXMgdGhlIEFtYXpvbiBFS1Mtb3B0aW1pemVkIExpbnV4IEFNSS5cbiAqL1xuZXhwb3J0IGVudW0gTm9kZWdyb3VwQW1pVHlwZSB7XG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMiAoeDg2LTY0KVxuICAgKi9cbiAgQUwyX1g4Nl82NCA9ICdBTDJfeDg2XzY0JyxcbiAgLyoqXG4gICAqIEFtYXpvbiBMaW51eCAyIHdpdGggR1BVIHN1cHBvcnRcbiAgICovXG4gIEFMMl9YODZfNjRfR1BVID0gJ0FMMl94ODZfNjRfR1BVJyxcbiAgLyoqXG4gICAqIEFtYXpvbiBMaW51eCAyIChBUk0tNjQpXG4gICAqL1xuICBBTDJfQVJNXzY0ID0gJ0FMMl9BUk1fNjQnLFxuICAvKipcbiAgICogIEJvdHRsZXJvY2tldCBMaW51eCAoQVJNLTY0KVxuICAgKi9cbiAgQk9UVExFUk9DS0VUX0FSTV82NCA9ICdCT1RUTEVST0NLRVRfQVJNXzY0JyxcbiAgLyoqXG4gICAqIEJvdHRsZXJvY2tldCAoeDg2LTY0KVxuICAgKi9cbiAgQk9UVExFUk9DS0VUX1g4Nl82NCA9ICdCT1RUTEVST0NLRVRfeDg2XzY0JyxcbiAgLyoqXG4gICAqICBCb3R0bGVyb2NrZXQgTGludXggd2l0aCBOdmlkaWEtR1BVIHN1cHBvcnQgKEFSTS02NClcbiAgICovXG4gIEJPVFRMRVJPQ0tFVF9BUk1fNjRfTlZJRElBID0gJ0JPVFRMRVJPQ0tFVF9BUk1fNjRfTlZJRElBJyxcbiAgLyoqXG4gICAqIEJvdHRsZXJvY2tldCB3aXRoIE52aWRpYS1HUFUgc3VwcG9ydCAoeDg2LTY0KVxuICAgKi9cbiAgQk9UVExFUk9DS0VUX1g4Nl82NF9OVklESUEgPSAnQk9UVExFUk9DS0VUX3g4Nl82NF9OVklESUEnLFxuICAvKipcbiAgICogQm90dGxlcm9ja2V0IExpbnV4IChBUk0tNjQpIHdpdGggRklQUyBlbmFibGVkXG4gICAqL1xuICBCT1RUTEVST0NLRVRfQVJNXzY0X0ZJUFMgPSAnQk9UVExFUk9DS0VUX0FSTV82NF9GSVBTJyxcbiAgLyoqXG4gICAqIEJvdHRsZXJvY2tldCAoeDg2LTY0KSB3aXRoIEZJUFMgZW5hYmxlZFxuICAgKi9cbiAgQk9UVExFUk9DS0VUX1g4Nl82NF9GSVBTID0gJ0JPVFRMRVJPQ0tFVF94ODZfNjRfRklQUycsXG4gIC8qKlxuICAgKiBXaW5kb3dzIENvcmUgMjAxOSAoeDg2LTY0KVxuICAgKi9cbiAgV0lORE9XU19DT1JFXzIwMTlfWDg2XzY0ID0gJ1dJTkRPV1NfQ09SRV8yMDE5X3g4Nl82NCcsXG4gIC8qKlxuICAgKiBXaW5kb3dzIENvcmUgMjAyMiAoeDg2LTY0KVxuICAgKi9cbiAgV0lORE9XU19DT1JFXzIwMjJfWDg2XzY0ID0gJ1dJTkRPV1NfQ09SRV8yMDIyX3g4Nl82NCcsXG4gIC8qKlxuICAgKiBXaW5kb3dzIEZ1bGwgMjAxOSAoeDg2LTY0KVxuICAgKi9cbiAgV0lORE9XU19GVUxMXzIwMTlfWDg2XzY0ID0gJ1dJTkRPV1NfRlVMTF8yMDE5X3g4Nl82NCcsXG4gIC8qKlxuICAgKiBXaW5kb3dzIEZ1bGwgMjAyMiAoeDg2LTY0KVxuICAgKi9cbiAgV0lORE9XU19GVUxMXzIwMjJfWDg2XzY0ID0gJ1dJTkRPV1NfRlVMTF8yMDIyX3g4Nl82NCcsXG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMjAyMyAoeDg2LTY0KVxuICAgKi9cbiAgQUwyMDIzX1g4Nl82NF9TVEFOREFSRCA9ICdBTDIwMjNfeDg2XzY0X1NUQU5EQVJEJyxcbiAgLyoqXG4gICAqIEFtYXpvbiBMaW51eCAyMDIzIHdpdGggQVdTIE5ldXJvbiBkcml2ZXJzICh4ODYtNjQpXG4gICAqL1xuICBBTDIwMjNfWDg2XzY0X05FVVJPTiA9ICdBTDIwMjNfeDg2XzY0X05FVVJPTicsXG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMjAyMyB3aXRoIE5WSURJQSBkcml2ZXJzICh4ODYtNjQpXG4gICAqL1xuICBBTDIwMjNfWDg2XzY0X05WSURJQSA9ICdBTDIwMjNfeDg2XzY0X05WSURJQScsXG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMjAyMyB3aXRoIE5WSURJQSBkcml2ZXJzIChBUk0tNjQpXG4gICAqL1xuICBBTDIwMjNfQVJNXzY0X05WSURJQSA9ICdBTDIwMjNfQVJNXzY0X05WSURJQScsXG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMjAyMyAoQVJNLTY0KVxuICAgKi9cbiAgQUwyMDIzX0FSTV82NF9TVEFOREFSRCA9ICdBTDIwMjNfQVJNXzY0X1NUQU5EQVJEJyxcbn1cblxuLyoqXG4gKiBDYXBhY2l0eSB0eXBlIG9mIHRoZSBtYW5hZ2VkIG5vZGUgZ3JvdXBcbiAqL1xuZXhwb3J0IGVudW0gQ2FwYWNpdHlUeXBlIHtcbiAgLyoqXG4gICAqIHNwb3QgaW5zdGFuY2VzXG4gICAqL1xuICBTUE9UID0gJ1NQT1QnLFxuICAvKipcbiAgICogb24tZGVtYW5kIGluc3RhbmNlc1xuICAgKi9cbiAgT05fREVNQU5EID0gJ09OX0RFTUFORCcsXG4gIC8qKlxuICAgKiBjYXBhY2l0eSBibG9jayBpbnN0YW5jZXNcbiAgICovXG4gIENBUEFDSVRZX0JMT0NLID0gJ0NBUEFDSVRZX0JMT0NLJyxcbn1cblxuLyoqXG4gKiBUaGUgcmVtb3RlIGFjY2VzcyAoU1NIKSBjb25maWd1cmF0aW9uIHRvIHVzZSB3aXRoIHlvdXIgbm9kZSBncm91cC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWVrcy1ub2RlZ3JvdXAtcmVtb3RlYWNjZXNzLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb2RlZ3JvdXBSZW1vdGVBY2Nlc3Mge1xuICAvKipcbiAgICogVGhlIEFtYXpvbiBFQzIgU1NIIGtleSB0aGF0IHByb3ZpZGVzIGFjY2VzcyBmb3IgU1NIIGNvbW11bmljYXRpb24gd2l0aCB0aGUgd29ya2VyIG5vZGVzIGluIHRoZSBtYW5hZ2VkIG5vZGUgZ3JvdXAuXG4gICAqL1xuICByZWFkb25seSBzc2hLZXlOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2VjdXJpdHkgZ3JvdXBzIHRoYXQgYXJlIGFsbG93ZWQgU1NIIGFjY2VzcyAocG9ydCAyMikgdG8gdGhlIHdvcmtlciBub2Rlcy4gSWYgeW91IHNwZWNpZnkgYW4gQW1hem9uIEVDMiBTU0hcbiAgICoga2V5IGJ1dCBkbyBub3Qgc3BlY2lmeSBhIHNvdXJjZSBzZWN1cml0eSBncm91cCB3aGVuIHlvdSBjcmVhdGUgYSBtYW5hZ2VkIG5vZGUgZ3JvdXAsIHRoZW4gcG9ydCAyMiBvbiB0aGUgd29ya2VyXG4gICAqIG5vZGVzIGlzIG9wZW5lZCB0byB0aGUgaW50ZXJuZXQgKDAuMC4wLjAvMCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcG9ydCAyMiBvbiB0aGUgd29ya2VyIG5vZGVzIGlzIG9wZW5lZCB0byB0aGUgaW50ZXJuZXQgKDAuMC4wLjAvMClcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVNlY3VyaXR5R3JvdXBzPzogSVNlY3VyaXR5R3JvdXBbXTtcbn1cblxuLyoqXG4gKiBMYXVuY2ggdGVtcGxhdGUgcHJvcGVydHkgc3BlY2lmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhdW5jaFRlbXBsYXRlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgTGF1bmNoIHRlbXBsYXRlIElEXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGxhdW5jaCB0ZW1wbGF0ZSB2ZXJzaW9uIHRvIGJlIHVzZWQgKG9wdGlvbmFsKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgZGVmYXVsdCB2ZXJzaW9uIG9mIHRoZSBsYXVuY2ggdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRWZmZWN0IHR5cGVzIG9mIGt1YmVybmV0ZXMgbm9kZSB0YWludC5cbiAqXG4gKiBOb3RlOiBUaGVzZSB2YWx1ZXMgYXJlIHNwZWNpZmljYWxseSBmb3IgQVdTIEVLUyBOb2RlR3JvdXBzIGFuZCB1c2UgdGhlIEFXUyBBUEkgZm9ybWF0LlxuICogV2hlbiB1c2luZyBBV1MgQ0xJIG9yIEFQSSwgdGFpbnQgZWZmZWN0cyBtdXN0IGJlIE5PX1NDSEVEVUxFLCBQUkVGRVJfTk9fU0NIRURVTEUsIG9yIE5PX0VYRUNVVEUuXG4gKiBXaGVuIHVzaW5nIEt1YmVybmV0ZXMgZGlyZWN0bHkgb3Iga3ViZWN0bCwgdGFpbnQgZWZmZWN0cyBtdXN0IGJlIE5vU2NoZWR1bGUsIFByZWZlck5vU2NoZWR1bGUsIG9yIE5vRXhlY3V0ZS5cbiAqXG4gKiBGb3IgS3ViZXJuZXRlcyBtYW5pZmVzdHMgKGxpa2UgS2FycGVudGVyIE5vZGVQb29scyksIHVzZSBzdHJpbmcgbGl0ZXJhbHMgd2l0aCBQYXNjYWxDYXNlIGZvcm1hdDpcbiAqIC0gJ05vU2NoZWR1bGUnIGluc3RlYWQgb2YgVGFpbnRFZmZlY3QuTk9fU0NIRURVTEVcbiAqIC0gJ1ByZWZlck5vU2NoZWR1bGUnIGluc3RlYWQgb2YgVGFpbnRFZmZlY3QuUFJFRkVSX05PX1NDSEVEVUxFXG4gKiAtICdOb0V4ZWN1dGUnIGluc3RlYWQgb2YgVGFpbnRFZmZlY3QuTk9fRVhFQ1VURVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Vrcy9sYXRlc3QvdXNlcmd1aWRlL25vZGUtdGFpbnRzLW1hbmFnZWQtbm9kZS1ncm91cHMuaHRtbFxuICovXG5leHBvcnQgZW51bSBUYWludEVmZmVjdCB7XG4gIC8qKlxuICAgKiBOb1NjaGVkdWxlXG4gICAqL1xuICBOT19TQ0hFRFVMRSA9ICdOT19TQ0hFRFVMRScsXG4gIC8qKlxuICAgKiBQcmVmZXJOb1NjaGVkdWxlXG4gICAqL1xuICBQUkVGRVJfTk9fU0NIRURVTEUgPSAnUFJFRkVSX05PX1NDSEVEVUxFJyxcbiAgLyoqXG4gICAqIE5vRXhlY3V0ZVxuICAgKi9cbiAgTk9fRVhFQ1VURSA9ICdOT19FWEVDVVRFJyxcbn1cblxuLyoqXG4gKiBUYWludCBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWludFNwZWMge1xuICAvKipcbiAgICogRWZmZWN0IHR5cGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBlZmZlY3Q/OiBUYWludEVmZmVjdDtcbiAgLyoqXG4gICAqIFRhaW50IGtleVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGtleT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRhaW50IHZhbHVlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIE5vZGVncm91cCBPcHRpb25zIGZvciBhZGROb2RlR3JvdXAoKSBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb2RlZ3JvdXBPcHRpb25zIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIE5vZGVncm91cFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHJlc291cmNlIElEXG4gICAqL1xuICByZWFkb25seSBub2RlZ3JvdXBOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN1Ym5ldHMgdG8gdXNlIGZvciB0aGUgQXV0byBTY2FsaW5nIGdyb3VwIHRoYXQgaXMgY3JlYXRlZCBmb3IgeW91ciBub2RlIGdyb3VwLiBCeSBzcGVjaWZ5aW5nIHRoZVxuICAgKiBTdWJuZXRTZWxlY3Rpb24sIHRoZSBzZWxlY3RlZCBzdWJuZXRzIHdpbGwgYXV0b21hdGljYWxseSBhcHBseSByZXF1aXJlZCB0YWdzIGkuZS5cbiAgICogYGt1YmVybmV0ZXMuaW8vY2x1c3Rlci9DTFVTVEVSX05BTUVgIHdpdGggYSB2YWx1ZSBvZiBgc2hhcmVkYCwgd2hlcmUgYENMVVNURVJfTkFNRWAgaXMgcmVwbGFjZWQgd2l0aFxuICAgKiB0aGUgbmFtZSBvZiB5b3VyIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJpdmF0ZSBzdWJuZXRzXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRzPzogU3VibmV0U2VsZWN0aW9uO1xuICAvKipcbiAgICogVGhlIEFNSSB0eXBlIGZvciB5b3VyIG5vZGUgZ3JvdXAuIElmIHlvdSBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIGxhdW5jaFRlbXBsYXRlIHdpdGggY3VzdG9tIEFNSSwgZG8gbm90IHNwZWNpZnkgdGhpcyBwcm9wZXJ0eSwgb3JcbiAgICogdGhlIG5vZGUgZ3JvdXAgZGVwbG95bWVudCB3aWxsIGZhaWwuIEluIG90aGVyIGNhc2VzLCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgY29ycmVjdCBhbWlUeXBlIGZvciB0aGUgbm9kZWdyb3VwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF1dG8tZGV0ZXJtaW5lZCBmcm9tIHRoZSBpbnN0YW5jZVR5cGVzIHByb3BlcnR5IHdoZW4gbGF1bmNoVGVtcGxhdGVTcGVjIHByb3BlcnR5IGlzIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGFtaVR5cGU/OiBOb2RlZ3JvdXBBbWlUeXBlO1xuICAvKipcbiAgICogVGhlIHJvb3QgZGV2aWNlIGRpc2sgc2l6ZSAoaW4gR2lCKSBmb3IgeW91ciBub2RlIGdyb3VwIGluc3RhbmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgMjBcbiAgICovXG4gIHJlYWRvbmx5IGRpc2tTaXplPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHdvcmtlciBub2RlcyB0aGF0IHRoZSBtYW5hZ2VkIG5vZG