@aws-cdk/aws-bedrock-agentcore-alpha
Version:
The CDK Construct Library for Amazon Bedrock
234 lines • 28.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RuntimeNetworkConfiguration = exports.CodeInterpreterNetworkConfiguration = exports.BrowserNetworkConfiguration = exports.NetworkConfiguration = void 0;
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
/* eslint-disable @cdklabs/no-throw-default-error */
const ec2 = require("aws-cdk-lib/aws-ec2");
/**
* Abstract base class for network configuration.
*/
class NetworkConfiguration {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.NetworkConfiguration", version: "2.227.0-alpha.0" };
/**
* The network mode to use.
* Configure the security level for agent
* execution to control access, isolate resources, and protect sensitive data.
*/
networkMode;
/**
* The connections object to the network.
*/
connections;
/**
* The scope to create the resource in.
*/
scope;
/**
* The VPC subnets to use.
*/
vpcSubnets;
/**
* Creates a new network configuration.
* @param mode - the network mode to use for the tool.
*/
constructor(mode, scope, vpcConfig) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_VpcConfigProps(vpcConfig);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, NetworkConfiguration);
}
throw error;
}
this.scope = scope;
this.networkMode = mode;
// Validate vpc config and configure connections
const networkConfig = this._validateAndConfigureVpcConfig(vpcConfig);
this.connections = networkConfig?.connections;
this.vpcSubnets = networkConfig?.vpcSubnets;
}
/**
* Validates the vpc config.
*/
_validateAndConfigureVpcConfig = (vpcConfig) => {
if ((vpcConfig?.securityGroups || vpcConfig?.allowAllOutbound !== undefined) && !vpcConfig?.vpc) {
throw new Error('Cannot configure \'securityGroups\' or \'allowAllOutbound\' without configuring a VPC');
}
if (!vpcConfig?.vpc) {
return undefined;
}
if ((vpcConfig?.securityGroups && vpcConfig?.securityGroups.length > 0) && vpcConfig?.allowAllOutbound !== undefined) {
throw new Error('Configure \'allowAllOutbound\' directly on the supplied SecurityGroups');
}
if (!this.scope) {
throw new Error('Scope is required to create the security group');
}
let securityGroups;
if (vpcConfig.securityGroups && vpcConfig.securityGroups.length > 0) {
securityGroups = vpcConfig.securityGroups;
}
else {
const securityGroup = new ec2.SecurityGroup(this.scope, 'SecurityGroup', {
vpc: vpcConfig.vpc,
allowAllOutbound: vpcConfig.allowAllOutbound ?? true,
});
securityGroups = [securityGroup];
}
const vpcSubnets = vpcConfig.vpcSubnets ? vpcConfig.vpc.selectSubnets(vpcConfig.vpcSubnets) : vpcConfig.vpc.selectSubnets();
return {
connections: new ec2.Connections({ securityGroups: securityGroups }),
vpcSubnets: vpcSubnets,
};
};
}
exports.NetworkConfiguration = NetworkConfiguration;
/**
* Network configuration for the Browser tool.
*/
class BrowserNetworkConfiguration extends NetworkConfiguration {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.BrowserNetworkConfiguration", version: "2.227.0-alpha.0" };
/**
* Creates a public network configuration. PUBLIC is the default network mode.
* @returns A BrowserNetworkConfiguration.
* Run this tool to operate in a public environment with internet access, suitable for less sensitive or open-use scenarios.
*/
static usingPublicNetwork() {
return new BrowserNetworkConfiguration('PUBLIC');
}
/**
* Creates a network configuration from a VPC configuration.
* @param vpcConfig - The VPC configuration.
* @returns A BrowserNetworkConfiguration.
*/
static usingVpc(scope, vpcConfig) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_VpcConfigProps(vpcConfig);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.usingVpc);
}
throw error;
}
return new BrowserNetworkConfiguration('VPC', scope, vpcConfig);
}
/**
* Renders the network configuration as a CloudFormation property.
* @param browserConnections - The connections object to the browser.
* @internal This is an internal core function and should not be called directly.
*/
_render(browserConnections) {
return {
networkMode: this.networkMode,
vpcConfig: (this.networkMode === 'VPC' && browserConnections) ? {
subnets: this.vpcSubnets?.subnets?.map(subnet => subnet.subnetId) ?? [],
securityGroups: browserConnections?.securityGroups?.map(s => s.securityGroupId) ?? [],
} : undefined,
};
}
}
exports.BrowserNetworkConfiguration = BrowserNetworkConfiguration;
/**
* Network configuration for the Code Interpreter tool.
*/
class CodeInterpreterNetworkConfiguration extends NetworkConfiguration {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.CodeInterpreterNetworkConfiguration", version: "2.227.0-alpha.0" };
/**
* Creates a public network configuration.
* @returns A CodeInterpreterNetworkConfiguration.
* Run this tool to operate in a public environment with internet access, suitable for less sensitive or open-use scenarios.
*/
static usingPublicNetwork() {
return new CodeInterpreterNetworkConfiguration('PUBLIC');
}
/**
* Creates a sandbox network configuration.
* @returns A CodeInterpreterNetworkConfiguration.
* Run this tool in a restricted environment with limited Permissions and Encryption to enhance safety and reduce potential risks.
*/
static usingSandboxNetwork() {
return new CodeInterpreterNetworkConfiguration('SANDBOX');
}
/**
* Creates a network configuration from a VPC configuration.
* @param vpcConfig - The VPC configuration.
* @returns A CodeInterpreterNetworkConfiguration.
*/
static usingVpc(scope, vpcConfig) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_VpcConfigProps(vpcConfig);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.usingVpc);
}
throw error;
}
return new CodeInterpreterNetworkConfiguration('VPC', scope, vpcConfig);
}
/**
* Renders the network configuration as a CloudFormation property.
* @param codeInterpreterConnections - The connections object to the code interpreter.
* @internal This is an internal core function and should not be called directly.
*/
_render(codeInterpreterConnections) {
return {
networkMode: this.networkMode,
vpcConfig: (this.networkMode === 'VPC' && codeInterpreterConnections) ? {
subnets: this.vpcSubnets?.subnets?.map(subnet => subnet.subnetId) ?? [],
securityGroups: codeInterpreterConnections?.securityGroups?.map(s => s.securityGroupId) ?? [],
} : undefined,
};
}
}
exports.CodeInterpreterNetworkConfiguration = CodeInterpreterNetworkConfiguration;
/**
* Network configuration for the Runtime.
*/
class RuntimeNetworkConfiguration extends NetworkConfiguration {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.RuntimeNetworkConfiguration", version: "2.227.0-alpha.0" };
/**
* Creates a public network configuration. PUBLIC is the default network mode.
* @returns A RuntimeNetworkConfiguration.
* Run the runtime in a public environment with internet access, suitable for less sensitive or open-use scenarios.
*/
static usingPublicNetwork() {
return new RuntimeNetworkConfiguration('PUBLIC');
}
/**
* Creates a network configuration from a VPC configuration.
* @param scope - The construct scope for creating resources.
* @param vpcConfig - The VPC configuration.
* @returns A RuntimeNetworkConfiguration.
*/
static usingVpc(scope, vpcConfig) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_VpcConfigProps(vpcConfig);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.usingVpc);
}
throw error;
}
return new RuntimeNetworkConfiguration('VPC', scope, vpcConfig);
}
/**
* Renders the network configuration as a CloudFormation property.
* @param runtimeConnections - The connections object to the runtime.
* @internal This is an internal core function and should not be called directly.
*/
_render(_runtimeConnections) {
return {
networkMode: this.networkMode,
networkModeConfig: (this.networkMode == 'VPC' && _runtimeConnections) ? {
subnets: this.vpcSubnets?.subnets?.map(subnet => subnet.subnetId) ?? [],
securityGroups: _runtimeConnections?.securityGroups?.map(s => s.securityGroupId) ?? [],
} : undefined,
};
}
}
exports.RuntimeNetworkConfiguration = RuntimeNetworkConfiguration;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay1jb25maWd1cmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibmV0d29yay1jb25maWd1cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQW9EO0FBQ3BELDJDQUEyQztBQStEM0M7O0dBRUc7QUFDSCxNQUFzQixvQkFBb0I7O0lBQ3hDOzs7O09BSUc7SUFDTSxXQUFXLENBQVM7SUFDN0I7O09BRUc7SUFDTSxXQUFXLENBQThCO0lBQ2xEOztPQUVHO0lBQ00sS0FBSyxDQUF5QjtJQUN2Qzs7T0FFRztJQUNNLFVBQVUsQ0FBdUI7SUFDMUM7OztPQUdHO0lBQ0gsWUFBdUIsSUFBWSxFQUFFLEtBQWlCLEVBQUUsU0FBMEI7Ozs7OzsrQ0F2QjlELG9CQUFvQjs7OztRQXdCdEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFeEIsZ0RBQWdEO1FBQ2hELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsV0FBVyxHQUFHLGFBQWEsRUFBRSxXQUFXLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLEVBQUUsVUFBVSxDQUFDO0tBQzdDO0lBRUQ7O09BRUc7SUFDSyw4QkFBOEIsR0FBRyxDQUFDLFNBQTBCLEVBQTZCLEVBQUU7UUFDakcsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLElBQUksU0FBUyxFQUFFLGdCQUFnQixLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2hHLE1BQU0sSUFBSSxLQUFLLENBQUMsdUZBQXVGLENBQUMsQ0FBQztRQUMzRyxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNwQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQs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QixFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxLQUFLLElBQUksbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtnQkFDdkUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRTthQUN0RixDQUFBLENBQUMsQ0FBQyxTQUFTO1NBQ2IsQ0FBQztLQUNIOztBQWpDSCxrRUFrQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAY2RrbGFicy9uby10aHJvdy1kZWZhdWx0LWVycm9yICovXG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG4vLyBJbnRlcm5hbCBMaWJzXG5pbXBvcnQgeyBDZm5Ccm93c2VyQ3VzdG9tLCBDZm5Db2RlSW50ZXJwcmV0ZXJDdXN0b20sIENmblJ1bnRpbWUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBWUEMgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLlxuICogT25seSB1c2VkIHdoZW4gbmV0d29yayBtb2RlIGlzIFZQQy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcGNDb25maWdQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgVlBDIHRvIGRlcGxveSB0aGUgcmVzb3VyY2UgdG8uXG4gICAqL1xuICByZWFkb25seSB2cGM6IGVjMi5JVnBjO1xuICAvKipcbiAgICogV2hlcmUgdG8gcGxhY2UgdGhlIG5ldHdvcmsgaW50ZXJmYWNlcyB3aXRoaW4gdGhlIFZQQy5cbiAgICpcbiAgICogVGhpcyByZXF1aXJlcyBgdnBjYCB0byBiZSBzcGVjaWZpZWQgaW4gb3JkZXIgZm9yIGludGVyZmFjZXMgdG8gYWN0dWFsbHkgYmVcbiAgICogcGxhY2VkIGluIHRoZSBzdWJuZXRzLiBJZiBgdnBjYCBpcyBub3Qgc3BlY2lmeSwgdGhpcyB3aWxsIHJhaXNlIGFuIGVycm9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBWcGMgZGVmYXVsdCBzdHJhdGVneSBpZiBub3Qgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB2cGNTdWJuZXRzPzogZWMyLlN1Ym5ldFNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHNlY3VyaXR5IGdyb3VwcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcmVzb3VyY2UncyBuZXR3b3JrIGludGVyZmFjZXMuXG4gICAqXG4gICAqIE9ubHkgdXNlZCBpZiAndnBjJyBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB0aGUgcmVzb3VyY2UgaXMgcGxhY2VkIHdpdGhpbiBhIFZQQyBhbmQgYSBzZWN1cml0eSBncm91cCBpc1xuICAgKiBub3Qgc3BlY2lmaWVkIGJ5IHRoaXMgcHJvcCwgYSBkZWRpY2F0ZWQgc2VjdXJpdHlcbiAgICogZ3JvdXAgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHJlc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgdGhlIHJlc291cmNlIHRvIHNlbmQgYWxsIG5ldHdvcmsgdHJhZmZpYyAoZXhjZXB0IGlwdjYpXG4gICAqXG4gICAqIElmIHNldCB0byBmYWxzZSwgeW91IG11c3QgaW5kaXZpZHVhbGx5IGFkZCB0cmFmZmljIHJ1bGVzIHRvIGFsbG93IHRoZVxuICAgKiByZXNvdXJjZSB0byBjb25uZWN0IHRvIG5ldHdvcmsgdGFyZ2V0cy5cbiAgICpcbiAgICogRG8gbm90IHNwZWNpZnkgdGhpcyBwcm9wZXJ0eSBpZiB0aGUgYHNlY3VyaXR5R3JvdXBzYCBwcm9wZXJ0eSBpcyBzZXQuXG4gICAqIEluc3RlYWQsIGNvbmZpZ3VyZSBgYWxsb3dBbGxPdXRib3VuZGAgZGlyZWN0bHkgb24gdGhlIHNlY3VyaXR5IGdyb3VwLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhbGxvd0FsbE91dGJvdW5kPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBWUEMgY29uZmlndXJhdGlvbi5cbiAqIE9ubHkgdXNlZCB3aGVuIG5ldHdvcmsgbW9kZSBpcyBWUEMuXG4gKiBAaW50ZXJuYWxcbiAqL1xuaW50ZXJmYWNlIE5ldHdvcmtDb25maWcge1xuICAvKipcbiAgICogVGhlIGNvbm5lY3Rpb25zIHRvIHRoZSBuZXR3b3JrLlxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbnM6IGVjMi5Db25uZWN0aW9ucyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBWUEMgc3VibmV0cyB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSB2cGNTdWJuZXRzOiBlYzIuU2VsZWN0ZWRTdWJuZXRzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIG5ldHdvcmsgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5ldHdvcmtDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIG1vZGUgdG8gdXNlLlxuICAgKiBDb25maWd1cmUgdGhlIHNlY3VyaXR5IGxldmVsIGZvciBhZ2VudFxuICAgKiBleGVjdXRpb24gdG8gY29udHJvbCBhY2Nlc3MsIGlzb2xhdGUgcmVzb3VyY2VzLCBhbmQgcHJvdGVjdCBzZW5zaXRpdmUgZGF0YS5cbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtNb2RlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbnMgb2JqZWN0IHRvIHRoZSBuZXR3b3JrLlxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbnM6IGVjMi5Db25uZWN0aW9ucyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBzY29wZSB0byBjcmVhdGUgdGhlIHJlc291cmNlIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGU/OiBDb25zdHJ1Y3QgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgVlBDIHN1Ym5ldHMgdG8gdXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjU3VibmV0cz86IGVjMi5TdWJuZXRTZWxlY3Rpb247XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IG5ldHdvcmsgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIG1vZGUgLSB0aGUgbmV0d29yayBtb2RlIHRvIHVzZSBmb3IgdGhlIHRvb2wuXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IgKG1vZGU6IHN0cmluZywgc2NvcGU/OiBDb25zdHJ1Y3QsIHZwY0NvbmZpZz86IFZwY0NvbmZpZ1Byb3BzKSB7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgIHRoaXMubmV0d29ya01vZGUgPSBtb2RlO1xuXG4gICAgLy8gVmFsaWRhdGUgdnBjIGNvbmZpZyBhbmQgY29uZmlndXJlIGNvbm5lY3Rpb25zXG4gICAgY29uc3QgbmV0d29ya0NvbmZpZyA9IHRoaXMuX3ZhbGlkYXRlQW5kQ29uZmlndXJlVnBjQ29uZmlnKHZwY0NvbmZpZyk7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldHdvcmtDb25maWc/LmNvbm5lY3Rpb25zO1xuICAgIHRoaXMudnBjU3VibmV0cyA9IG5ldHdvcmtDb25maWc/LnZwY1N1Ym5ldHM7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSB2cGMgY29uZmlnLlxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRhdGVBbmRDb25maWd1cmVWcGNDb25maWcgPSAodnBjQ29uZmlnPzogVnBjQ29uZmlnUHJvcHMpOiBOZXR3b3JrQ29uZmlnIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAoKHZwY0NvbmZpZz8uc2VjdXJpdHlHcm91cHMgfHwgdnBjQ29uZmlnPy5hbGxvd0FsbE91dGJvdW5kICE9PSB1bmRlZmluZWQpICYmICF2cGNDb25maWc/LnZwYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29uZmlndXJlIFxcJ3NlY3VyaXR5R3JvdXBzXFwnIG9yIFxcJ2FsbG93QWxsT3V0Ym91bmRcXCcgd2l0aG91dCBjb25maWd1cmluZyBhIFZQQycpO1xuICAgIH1cblxuICAgIGlmICghdnBjQ29uZmlnPy52cGMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCh2cGNDb25maWc/LnNlY3VyaXR5R3JvdXBzICYmIHZwY0NvbmZpZz8uc2VjdXJpdHlHcm91cHMubGVuZ3RoID4gMCkgJiYgdnBjQ29uZmlnPy5hbGxvd0FsbE91dGJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmlndXJlIFxcJ2FsbG93QWxsT3V0Ym91bmRcXCcgZGlyZWN0bHkgb24gdGhlIHN1cHBsaWVkIFNlY3VyaXR5R3JvdXBzJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNjb3BlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Njb3BlIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSB0aGUgc2VjdXJpdHkgZ3JvdXAnKTtcbiAgICB9XG5cbiAgICBsZXQgc2VjdXJpdHlHcm91cHM6IGVjMi5JU2VjdXJpdHlHcm91cFtdO1xuICAgIGlmICh2cGNDb25maWcuc2VjdXJpdHlHcm91cHMgJiYgdnBjQ29uZmlnLnNlY3VyaXR5R3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzID0gdnBjQ29uZmlnLnNlY3VyaXR5R3JvdXBzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMuc2NvcGUhLCAnU2VjdXJpdHlHcm91cCcsIHtcbiAgICAgICAgdnBjOiB2cGNDb25maWcudnBjLFxuICAgICAgICBhbGxvd0FsbE91dGJvdW5kOiB2cGNDb25maWcuYWxsb3dBbGxPdXRib3VuZCA/PyB0cnVlLFxuICAgICAgfSk7XG4gICAgICBzZWN1cml0eUdyb3VwcyA9IFtzZWN1cml0eUdyb3VwXTtcbiAgICB9XG5cbiAgICBjb25zdCB2cGNTdWJuZXRzID0gdnBjQ29uZmlnLnZwY1N1Ym5ldHMgPyB2cGNDb25maWcudnBjLnNlbGVjdFN1Ym5ldHModnBjQ29uZmlnLnZwY1N1Ym5ldHMpIDogdnBjQ29uZmlnLnZwYy5zZWxlY3RTdWJuZXRzKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29ubmVjdGlvbnM6IG5ldyBlYzIuQ29ubmVjdGlvbnMoeyBzZWN1cml0eUdyb3Vwczogc2VjdXJpdHlHcm91cHMgfSksXG4gICAgICB2cGNTdWJuZXRzOiB2cGNTdWJuZXRzLFxuICAgIH07XG4gIH07XG59XG5cbi8qKlxuICogTmV0d29yayBjb25maWd1cmF0aW9uIGZvciB0aGUgQnJvd3NlciB0b29sLlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3Nlck5ldHdvcmtDb25maWd1cmF0aW9uIGV4dGVuZHMgTmV0d29ya0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHB1YmxpYyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uIFBVQkxJQyBpcyB0aGUgZGVmYXVsdCBuZXR3b3JrIG1vZGUuXG4gICAqIEByZXR1cm5zIEEgQnJvd3Nlck5ldHdvcmtDb25maWd1cmF0aW9uLlxuICAgKiBSdW4gdGhpcyB0b29sIHRvIG9wZXJhdGUgaW4gYSBwdWJsaWMgZW52aXJvbm1lbnQgd2l0aCBpbnRlcm5ldCBhY2Nlc3MsIHN1aXRhYmxlIGZvciBsZXNzIHNlbnNpdGl2ZSBvciBvcGVuLXVzZSBzY2VuYXJpb3MuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVzaW5nUHVibGljTmV0d29yaygpOiBCcm93c2VyTmV0d29ya0NvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgQnJvd3Nlck5ldHdvcmtDb25maWd1cmF0aW9uKCdQVUJMSUMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV0d29yayBjb25maWd1cmF0aW9uIGZyb20gYSBWUEMgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHZwY0NvbmZpZyAtIFRoZSBWUEMgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMgQSBCcm93c2VyTmV0d29ya0NvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVzaW5nVnBjKHNjb3BlOiBDb25zdHJ1Y3QsIHZwY0NvbmZpZzogVnBjQ29uZmlnUHJvcHMpOiBCcm93c2VyTmV0d29ya0NvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgQnJvd3Nlck5ldHdvcmtDb25maWd1cmF0aW9uKCdWUEMnLCBzY29wZSwgdnBjQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gYXMgYSBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIGJyb3dzZXJDb25uZWN0aW9ucyAtIFRoZSBjb25uZWN0aW9ucyBvYmplY3QgdG8gdGhlIGJyb3dzZXIuXG4gICAqIEBpbnRlcm5hbCBUaGlzIGlzIGFuIGludGVybmFsIGNvcmUgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIF9yZW5kZXIoYnJvd3NlckNvbm5lY3Rpb25zPzogZWMyLkNvbm5lY3Rpb25zKTogQ2ZuQnJvd3NlckN1c3RvbS5Ccm93c2VyTmV0d29ya0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5ldHdvcmtNb2RlOiB0aGlzLm5ldHdvcmtNb2RlLFxuICAgICAgdnBjQ29uZmlnOiAodGhpcy5uZXR3b3JrTW9kZSA9PT0gJ1ZQQycgJiYgYnJvd3NlckNvbm5lY3Rpb25zKSA/IHtcbiAgICAgICAgc3VibmV0czogdGhpcy52cGNTdWJuZXRzPy5zdWJuZXRzPy5tYXAoc3VibmV0ID0+IHN1Ym5ldC5zdWJuZXRJZCkgPz8gW10sXG4gICAgICAgIHNlY3VyaXR5R3JvdXBzOiBicm93c2VyQ29ubmVjdGlvbnM/LnNlY3VyaXR5R3JvdXBzPy5tYXAocyA9PiBzLnNlY3VyaXR5R3JvdXBJZCkgPz8gW10sXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBOZXR3b3JrIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2RlSW50ZXJwcmV0ZXJOZXR3b3JrQ29uZmlndXJhdGlvbiBleHRlbmRzIE5ldHdvcmtDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwdWJsaWMgbmV0d29yayBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIENvZGVJbnRlcnByZXRlck5ldHdvcmtDb25maWd1cmF0aW9uLlxuICAgKiBSdW4gdGhpcyB0b29sIHRvIG9wZXJhdGUgaW4gYSBwdWJsaWMgZW52aXJvbm1lbnQgd2l0aCBpbnRlcm5ldCBhY2Nlc3MsIHN1aXRhYmxlIGZvciBsZXNzIHNlbnNpdGl2ZSBvciBvcGVuLXVzZSBzY2VuYXJpb3MuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVzaW5nUHVibGljTmV0d29yaygpOiBDb2RlSW50ZXJwcmV0ZXJOZXR3b3JrQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBDb2RlSW50ZXJwcmV0ZXJOZXR3b3JrQ29uZmlndXJhdGlvbignUFVCTElDJyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNhbmRib3ggbmV0d29yayBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIENvZGVJbnRlcnByZXRlck5ldHdvcmtDb25maWd1cmF0aW9uLlxuICAgKiBSdW4gdGhpcyB0b29sIGluIGEgcmVzdHJpY3RlZCBlbnZpcm9ubWVudCB3aXRoIGxpbWl0ZWQgUGVybWlzc2lvbnMgYW5kIEVuY3J5cHRpb24gdG8gZW5oYW5jZSBzYWZldHkgYW5kIHJlZHVjZSBwb3RlbnRpYWwgcmlza3MuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVzaW5nU2FuZGJveE5ldHdvcmsoKTogQ29kZUludGVycHJldGVyTmV0d29ya0NvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgQ29kZUludGVycHJldGVyTmV0d29ya0NvbmZpZ3VyYXRpb24oJ1NBTkRCT1gnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV0d29yayBjb25maWd1cmF0aW9uIGZyb20gYSBWUEMgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHZwY0NvbmZpZyAtIFRoZSBWUEMgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMgQSBDb2RlSW50ZXJwcmV0ZXJOZXR3b3JrQ29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXNpbmdWcGMoc2NvcGU6IENvbnN0cnVjdCwgdnBjQ29uZmlnOiBWcGNDb25maWdQcm9wcyk6IENvZGVJbnRlcnByZXRlck5ldHdvcmtDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IENvZGVJbnRlcnByZXRlck5ldHdvcmtDb25maWd1cmF0aW9uKCdWUEMnLCBzY29wZSwgdnBjQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gYXMgYSBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIGNvZGVJbnRlcnByZXRlckNvbm5lY3Rpb25zIC0gVGhlIGNvbm5lY3Rpb25zIG9iamVjdCB0byB0aGUgY29kZSBpbnRlcnByZXRlci5cbiAgICogQGludGVybmFsIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29yZSBmdW5jdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gICAqL1xuICBwdWJsaWMgX3JlbmRlcihjb2RlSW50ZXJwcmV0ZXJDb25uZWN0aW9ucz86IGVjMi5Db25uZWN0aW9ucyk6IENmbkNvZGVJbnRlcnByZXRlckN1c3RvbS5Db2RlSW50ZXJwcmV0ZXJOZXR3b3JrQ29uZmlndXJhdGlvblByb3BlcnR5IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmV0d29ya01vZGU6IHRoaXMubmV0d29ya01vZGUsXG4gICAgICB2cGNDb25maWc6ICh0aGlzLm5ldHdvcmtNb2RlID09PSAnVlBDJyAmJiBjb2RlSW50ZXJwcmV0ZXJDb25uZWN0aW9ucykgPyB7XG4gICAgICAgIHN1Ym5ldHM6IHRoaXMudnBjU3VibmV0cz8uc3VibmV0cz8ubWFwKHN1Ym5ldCA9PiBzdWJuZXQuc3VibmV0SWQpID8/IFtdLFxuICAgICAgICBzZWN1cml0eUdyb3VwczogY29kZUludGVycHJldGVyQ29ubmVjdGlvbnM/LnNlY3VyaXR5R3JvdXBzPy5tYXAocyA9PiBzLnNlY3VyaXR5R3JvdXBJZCkgPz8gW10sXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBOZXR3b3JrIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBSdW50aW1lLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uIGV4dGVuZHMgTmV0d29ya0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHB1YmxpYyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24uIFBVQkxJQyBpcyB0aGUgZGVmYXVsdCBuZXR3b3JrIG1vZGUuXG4gICAqIEByZXR1cm5zIEEgUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uLlxuICAgKiBSdW4gdGhlIHJ1bnRpbWUgaW4gYSBwdWJsaWMgZW52aXJvbm1lbnQgd2l0aCBpbnRlcm5ldCBhY2Nlc3MsIHN1aXRhYmxlIGZvciBsZXNzIHNlbnNpdGl2ZSBvciBvcGVuLXVzZSBzY2VuYXJpb3MuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVzaW5nUHVibGljTmV0d29yaygpOiBSdW50aW1lTmV0d29ya0NvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgUnVudGltZU5ldHdvcmtDb25maWd1cmF0aW9uKCdQVUJMSUMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV0d29yayBjb25maWd1cmF0aW9uIGZyb20gYSBWUEMgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHNjb3BlIC0gVGhlIGNvbnN0cnVjdCBzY29wZSBmb3IgY3JlYXRpbmcgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0gdnBjQ29uZmlnIC0gVGhlIFZQQyBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIFJ1bnRpbWVOZXR3b3JrQ29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXNpbmdWcGMoc2NvcGU6IENvbnN0cnVjdCwgdnBjQ29uZmlnOiBWcGNDb25maWdQcm9wcyk6IFJ1bnRpbWVOZXR3b3JrQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBSdW50aW1lTmV0d29ya0NvbmZpZ3VyYXRpb24oJ1ZQQycsIHNjb3BlLCB2cGNDb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbiBhcyBhIENsb3VkRm9ybWF0aW9uIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gcnVudGltZUNvbm5lY3Rpb25zIC0gVGhlIGNvbm5lY3Rpb25zIG9iamVjdCB0byB0aGUgcnVudGltZS5cbiAgICogQGludGVybmFsIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29yZSBmdW5jdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gICAqL1xuICBwdWJsaWMgX3JlbmRlcihfcnVudGltZUNvbm5lY3Rpb25zPzogZWMyLkNvbm5lY3Rpb25zKTogQ2ZuUnVudGltZS5OZXR3b3JrQ29uZmlndXJhdGlvblByb3BlcnR5IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmV0d29ya01vZGU6IHRoaXMubmV0d29ya01vZGUsXG4gICAgICBuZXR3b3JrTW9kZUNvbmZpZzogKHRoaXMubmV0d29ya01vZGUgPT0gJ1ZQQycgJiYgX3J1bnRpbWVDb25uZWN0aW9ucykgPyB7XG4gICAgICAgIHN1Ym5ldHM6IHRoaXMudnBjU3VibmV0cz8uc3VibmV0cz8ubWFwKHN1Ym5ldCA9PiBzdWJuZXQuc3VibmV0SWQpID8/IFtdLFxuICAgICAgICBzZWN1cml0eUdyb3VwczogX3J1bnRpbWVDb25uZWN0aW9ucz8uc2VjdXJpdHlHcm91cHM/Lm1hcChzPT4gcy5zZWN1cml0eUdyb3VwSWQpID8/IFtdLFxuICAgICAgfTogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==