UNPKG

@cdklabs/cdk-amazonmq

Version:
366 lines 55.6 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.ActiveMqBrokerDeploymentBase = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); /* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const aws_ec2_1 = require("aws-cdk-lib/aws-ec2"); // import { ActiveMqAuthenticationStrategy } from './activemq-authentication-strategy'; const activemq_broker_configuration_1 = require("./activemq-broker-configuration"); const broker_deployment_1 = require("../broker-deployment"); const ldap_metadata_validator_1 = require("./validators/ldap-metadata-validator"); class ActiveMqBrokerDeploymentBase extends broker_deployment_1.BrokerDeploymentBase { /** * * @internal */ static _buildActiveMqBroker(imported, suffix = "") { return { endpoints: { amqp: { url: `amqp+ssl://${imported.id}${suffix}.mq.${aws_cdk_lib_1.Aws.REGION}.${aws_cdk_lib_1.Aws.URL_SUFFIX}:5671`, port: 5671, }, stomp: { url: `stomp+ssl://${imported.id}${suffix}.mq.${aws_cdk_lib_1.Aws.REGION}.${aws_cdk_lib_1.Aws.URL_SUFFIX}:61614`, port: 61614, }, openWire: { url: `ssl://${imported.id}${suffix}.mq.${aws_cdk_lib_1.Aws.REGION}.${aws_cdk_lib_1.Aws.URL_SUFFIX}:61617`, port: 61617, }, mqtt: { url: `mqtt+ssl://${imported.id}${suffix}.mq.${aws_cdk_lib_1.Aws.REGION}.${aws_cdk_lib_1.Aws.URL_SUFFIX}:8883`, port: 8883, }, wss: { url: `wss://${imported.id}${suffix}.mq.${aws_cdk_lib_1.Aws.REGION}.${aws_cdk_lib_1.Aws.URL_SUFFIX}:61619`, port: 61619, }, console: { url: `https://${imported.id}${suffix}.mq.${aws_cdk_lib_1.Aws.REGION}.${aws_cdk_lib_1.Aws.URL_SUFFIX}:8162`, port: 8162, }, }, }; } /** * * @internal */ static _fromActiveMqBrokerDeploymentAttributes(scope, logicalId, arn, name, id, securityGroups) { if ((name === undefined || id === undefined) && arn === undefined) { throw new Error("Either the pair 'name' and 'id', or 'arn' needs to be defined"); } class Import extends aws_cdk_lib_1.Resource { constructor() { super(scope, logicalId); this.connections = securityGroups ? new aws_ec2_1.Connections({ securityGroups }) : undefined; this._engineVersion = "UNKNOWN"; this.arn = arn ? arn : aws_cdk_lib_1.Stack.of(this).formatArn({ service: "mq", resource: "broker", resourceName: `${name}:${id}`, arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME, }); this.name = name ? name : aws_cdk_lib_1.Arn.split(arn, aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME).resourceName.split(":")[0]; this.id = id ? id : aws_cdk_lib_1.Arn.split(arn, aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME).resourceName.split(":")[1]; } metric(metricName, options) { return new aws_cloudwatch_1.Metric({ namespace: "AWS/AmazonMQ", metricName, dimensionsMap: { Broker: this.id, }, ...options, }); } metricAmqpMaximumConnections(props) { return this.metric("AmqpMaximumConnections", props); } metricBurstBalance(props) { return this.metric("BurstBalance", props); } metricCpuCreditBalance(props) { return this.metric("CpuCreditBalance", props); } metricCpuUtilization(props) { return this.metric("CpuUtilization", props); } metricCurrentConnectionsCount(props) { return this.metric("CurrentConnectionsCount", props); } metricEstablishedConnectionsCount(props) { return this.metric("EstablishedConnectionsCount", props); } metricHeapUsage(props) { return this.metric("HeapUsage", props); } metricInactiveDurableTopicSubscribersCount(props) { return this.metric("InactiveDurableTopicSubscribersCount", props); } metricJobSchedulerStorePercentUsage(props) { return this.metric("JobSchedulerStorePercentUsage", props); } metricJournalFilesForFastRecovery(props) { return this.metric("JobSchedulerStorePercentUsage", props); } metricJournalFilesForFullRecovery(props) { return this.metric("JournalFilesForFullRecovery", props); } metricMqttMaximumConnections(props) { return this.metric("MqttMaximumConnections", props); } metricNetworkConnectorConnectionCount(props) { return this.metric("NetworkConnectorConnectionCount", props); } metricNetworkIn(props) { return this.metric("NetworkIn", props); } metricNetworkOut(props) { return this.metric("NetworkOut", props); } metricOpenTransactionCount(props) { return this.metric("OpenTransactionCount", props); } metricOpenwireMaximumConnections(props) { return this.metric("OpenwireMaximumConnections", props); } metricStompMaximumConnections(props) { return this.metric("StompMaximumConnections", props); } metricStorePercentUsage(props) { return this.metric("StorePercentUsage", props); } metricTempPercentUsage(props) { return this.metric("TempPercentUsage", props); } metricTotalConsumerCount(props) { return this.metric("TotalConsumerCount", props); } metricTotalMessageCount(props) { return this.metric("TotalMessageCount", props); } metricTotalProducerCount(props) { return this.metric("TotalProducerCount", props); } metricVolumeReadOps(props) { return this.metric("VolumeReadOps", props); } metricVolumeWriteOps(props) { return this.metric("VolumeWriteOps", props); } metricWsMaximumConnections(props) { return this.metric("WsMaximumConnections", props); } metricConsumerCount(props) { return this.metric("ConsumerCount", props); } metricEnqueueCount(props) { return this.metric("EnqueueCount", props); } metricEnqueueTime(props) { return this.metric("EnqueueTime", props); } metricExpiredCount(props) { return this.metric("ExpiredCount", props); } metricDispatchCount(props) { return this.metric("DispatchCount", props); } metricDequeueCount(props) { return this.metric("DequeueCount", props); } metricInFlightCount(props) { return this.metric("InFlightCount", props); } metricReceiveCount(props) { return this.metric("ReceiveCount", props); } metricMemoryUsage(props) { return this.metric("MemoryUsage", props); } metricProducerCount(props) { return this.metric("ProducerCount", props); } metricQueueSize(props) { return this.metric("QueueSize", props); } metricTotalEnqueueCount(props) { return this.metric("TotalEnqueueCount", props); } metricTotalDequeueCount(props) { return this.metric("TotalDequeueCount", props); } } return new Import(); } get configuration() { return this._configuration; } constructor(scope, id, props) { const renderedUserManagement = props.userManagement.render(); super(scope, id, { ...renderedUserManagement, ...props, version: props.version.toString(), engine: broker_deployment_1.BrokerEngine.ACTIVEMQ, }); if (renderedUserManagement.ldapServerMetadata) { // validate ldap server metadata if present this.node.addValidation(new ldap_metadata_validator_1.ActiveMqLdapValidation({ config: renderedUserManagement.ldapServerMetadata, })); } this._configuration = props.configuration ?? activemq_broker_configuration_1.ActiveMqBrokerConfiguration.fromAttributes(this, "Configuration", { id: this._resource.attrConfigurationId, revision: this._resource.attrConfigurationRevision, }); } // public withConfiguration(id: string, options: ActiveMqBrokerConfigurationOptions): IActiveMqBrokerConfiguration { // const configuration = new ActiveMqBrokerConfiguration(this.node.scope!, id, { // engineVersion: this.engineVersion, // authenticationStrategy: this.authenticationStrategy, // ...options, // }); // this._attachConfiguration(configuration); // return configuration; // } metricAmqpMaximumConnections(props) { return this.metric("AmqpMaximumConnections", props); } metricBurstBalance(props) { return this.metric("BurstBalance", props); } metricCpuCreditBalance(props) { return this.metric("CpuCreditBalance", props); } metricCpuUtilization(props) { return this.metric("CpuUtilization", props); } metricCurrentConnectionsCount(props) { return this.metric("CurrentConnectionsCount", props); } metricEstablishedConnectionsCount(props) { return this.metric("EstablishedConnectionsCount", props); } metricHeapUsage(props) { return this.metric("HeapUsage", props); } metricInactiveDurableTopicSubscribersCount(props) { return this.metric("InactiveDurableTopicSubscribersCount", props); } metricJobSchedulerStorePercentUsage(props) { return this.metric("JobSchedulerStorePercentUsage", props); } metricJournalFilesForFastRecovery(props) { return this.metric("JobSchedulerStorePercentUsage", props); } metricJournalFilesForFullRecovery(props) { return this.metric("JournalFilesForFullRecovery", props); } metricMqttMaximumConnections(props) { return this.metric("MqttMaximumConnections", props); } metricNetworkConnectorConnectionCount(props) { return this.metric("NetworkConnectorConnectionCount", props); } metricNetworkIn(props) { return this.metric("NetworkIn", props); } metricNetworkOut(props) { return this.metric("NetworkOut", props); } metricOpenTransactionCount(props) { return this.metric("OpenTransactionCount", props); } metricOpenwireMaximumConnections(props) { return this.metric("OpenwireMaximumConnections", props); } metricStompMaximumConnections(props) { return this.metric("StompMaximumConnections", props); } metricStorePercentUsage(props) { return this.metric("StorePercentUsage", props); } metricTempPercentUsage(props) { return this.metric("TempPercentUsage", props); } metricTotalConsumerCount(props) { return this.metric("TotalConsumerCount", props); } metricTotalMessageCount(props) { return this.metric("TotalMessageCount", props); } metricTotalProducerCount(props) { return this.metric("TotalProducerCount", props); } metricVolumeReadOps(props) { return this.metric("VolumeReadOps", props); } metricVolumeWriteOps(props) { return this.metric("VolumeWriteOps", props); } metricWsMaximumConnections(props) { return this.metric("WsMaximumConnections", props); } metricConsumerCount(props) { return this.metric("ConsumerCount", props); } metricEnqueueCount(props) { return this.metric("EnqueueCount", props); } metricEnqueueTime(props) { return this.metric("EnqueueTime", props); } metricExpiredCount(props) { return this.metric("ExpiredCount", props); } metricDispatchCount(props) { return this.metric("DispatchCount", props); } metricDequeueCount(props) { return this.metric("DequeueCount", props); } metricInFlightCount(props) { return this.metric("InFlightCount", props); } metricReceiveCount(props) { return this.metric("ReceiveCount", props); } metricMemoryUsage(props) { return this.metric("MemoryUsage", props); } metricProducerCount(props) { return this.metric("ProducerCount", props); } metricQueueSize(props) { return this.metric("QueueSize", props); } metricTotalEnqueueCount(props) { return this.metric("TotalEnqueueCount", props); } metricTotalDequeueCount(props) { return this.metric("TotalDequeueCount", props); } } exports.ActiveMqBrokerDeploymentBase = ActiveMqBrokerDeploymentBase; _a = JSII_RTTI_SYMBOL_1; ActiveMqBrokerDeploymentBase[_a] = { fqn: "@cdklabs/cdk-amazonmq.ActiveMqBrokerDeploymentBase", version: "0.1.6" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlbXEtYnJva2VyLWRlcGxveW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWN0aXZlbXEvYWN0aXZlbXEtYnJva2VyLWRlcGxveW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7O0VBR0U7QUFDRiw2Q0FBbUU7QUFDbkUsK0RBQW1FO0FBQ25FLGlEQUFrRTtBQUVsRSx1RkFBdUY7QUFDdkYsbUZBR3lDO0FBRXpDLDREQUs4QjtBQUk5QixrRkFBOEU7QUFzSTlFLE1BQXNCLDRCQUNwQixTQUFRLHdDQUFvQjtJQUc1Qjs7O09BR0c7SUFDTyxNQUFNLENBQUMsb0JBQW9CLENBQ25DLFFBQW1DLEVBQ25DLFNBQWlCLEVBQUU7UUFFbkIsT0FBTztZQUNMLFNBQVMsRUFBRTtnQkFDVCxJQUFJLEVBQUU7b0JBQ0osR0FBRyxFQUFFLGNBQWMsUUFBUSxDQUFDLEVBQUUsR0FBRyxNQUFNLE9BQU8saUJBQUcsQ0FBQyxNQUFNLElBQUksaUJBQUcsQ0FBQyxVQUFVLE9BQU87b0JBQ2pGLElBQUksRUFBRSxJQUFJO2lCQUNYO2dCQUNELEtBQUssRUFBRTtvQkFDTCxHQUFHLEVBQUUsZUFBZSxRQUFRLENBQUMsRUFBRSxHQUFHLE1BQU0sT0FBTyxpQkFBRyxDQUFDLE1BQU0sSUFBSSxpQkFBRyxDQUFDLFVBQVUsUUFBUTtvQkFDbkYsSUFBSSxFQUFFLEtBQUs7aUJBQ1o7Z0JBQ0QsUUFBUSxFQUFFO29CQUNSLEdBQUcsRUFBRSxTQUFTLFFBQVEsQ0FBQyxFQUFFLEdBQUcsTUFBTSxPQUFPLGlCQUFHLENBQUMsTUFBTSxJQUFJLGlCQUFHLENBQUMsVUFBVSxRQUFRO29CQUM3RSxJQUFJLEVBQUUsS0FBSztpQkFDWjtnQkFDRCxJQUFJLEVBQUU7b0JBQ0osR0FBRyxFQUFFLGNBQWMsUUFBUSxDQUFDLEVBQUUsR0FBRyxNQUFNLE9BQU8saUJBQUcsQ0FBQyxNQUFNLElBQUksaUJBQUcsQ0FBQyxVQUFVLE9B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ZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxLQUFxQjtRQUM3QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxLQUFxQjtRQUM1QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxLQUFxQjtRQUM5QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTSxlQUFlLENBQUMsS0FBcUI7UUFDMUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU0sdUJBQXVCLENBQUMsS0FBcUI7UUFDbEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxLQUFxQjtRQUNsRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQzs7QUF6ZEgsb0VBMGRDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiovXG5pbXBvcnQgeyBBcm4sIEFybkZvcm1hdCwgQXdzLCBSZXNvdXJjZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IE1ldHJpYywgTWV0cmljT3B0aW9ucyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbnMsIElTZWN1cml0eUdyb3VwIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG4vLyBpbXBvcnQgeyBBY3RpdmVNcUF1dGhlbnRpY2F0aW9uU3RyYXRlZ3kgfSBmcm9tICcuL2FjdGl2ZW1xLWF1dGhlbnRpY2F0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7XG4gIEFjdGl2ZU1xQnJva2VyQ29uZmlndXJhdGlvbixcbiAgSUFjdGl2ZU1xQnJva2VyQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcIi4vYWN0aXZlbXEtYnJva2VyLWNvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IEFjdGl2ZU1xQnJva2VyRW5naW5lVmVyc2lvbiB9IGZyb20gXCIuL2FjdGl2ZW1xLWJyb2tlci1lbmdpbmUtdmVyc2lvblwiO1xuaW1wb3J0IHtcbiAgQnJva2VyRGVwbG95bWVudEJhc2UsXG4gIEJyb2tlckVuZ2luZSxcbiAgQnJva2VyRGVwbG95bWVudFByb3BzLFxuICBJQnJva2VyRGVwbG95bWVudCxcbn0gZnJvbSBcIi4uL2Jyb2tlci1kZXBsb3ltZW50XCI7XG5pbXBvcnQgeyBCcm9rZXJEZXBsb3ltZW50TW9kZSB9IGZyb20gXCIuLi9icm9rZXItZGVwbG95bWVudC1tb2RlXCI7XG5pbXBvcnQgeyBJQWN0aXZlTXFCcm9rZXIgfSBmcm9tIFwiLi9hY3RpdmVtcS1icm9rZXJcIjtcbmltcG9ydCB7IElBY3RpdmVNcUJyb2tlclVzZXJNYW5hZ2VtZW50IH0gZnJvbSBcIi4vdXNlcm1hbmFnZW1lbnQvYWN0aXZlbXEtYnJva2VyLXVzZXItbWFuYWdlbWVudFwiO1xuaW1wb3J0IHsgQWN0aXZlTXFMZGFwVmFsaWRhdGlvbiB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvbGRhcC1tZXRhZGF0YS12YWxpZGF0b3JcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVNcUNsb3Vkd2F0Y2hMb2dzRXhwb3J0cyB7XG4gIC8qKlxuICAgKiBFeHBvcnQgZ2VuZXJhbCBsb2dzIHRvIENsb3VkV2F0Y2guXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkOyBkbyBub3QgZXhwb3J0IGdlbmVyYWwgbG9ncy5cbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyYWw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHBvcnQgYXVkaXQgbG9ncyB0byBDbG91ZFdhdGNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZDsgZG8gbm90IGV4cG9ydCBhdWRpdCBsb2dzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXVkaXQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2ZU1xQnJva2VyRGVwbG95bWVudFByb3BzIGV4dGVuZHMgQnJva2VyRGVwbG95bWVudFByb3BzIHtcbiAgLyoqXG4gICAqIFNldHMgdGhlIFVzZXIgTWFuYWdlbWVudCBvcHRpb24gZm9yIHRoZSBBbWF6b24gTVEgZm9yIEFjdGl2ZU1RIGJyb2tlclxuICAgKi9cbiAgcmVhZG9ubHkgdXNlck1hbmFnZW1lbnQ6IElBY3RpdmVNcUJyb2tlclVzZXJNYW5hZ2VtZW50O1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2ZXJzaW9uIG9mIHRoZSBBbWF6b24gTVEgZm9yIEFjdGl2ZU1RIGJyb2tlciBlbmdpbmUuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBBY3RpdmVNcUJyb2tlckVuZ2luZVZlcnNpb247XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG51bWJlciBvZiBkYXlzIHRvIHJldGFpbiBsb2dzIGZvciB0aGUgQW1hem9uIE1RIGZvciBBY3RpdmVNUSBicm9rZXIuXG4gICAqL1xuICByZWFkb25seSBsb2dzUmV0ZW50aW9uRGF5cz86IG51bWJlcjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgQ2xvdWRXYXRjaCBMb2dzIGV4cG9ydHMgZm9yIHRoZSBBbWF6b24gTVEgZm9yIEFjdGl2ZU1RIGJyb2tlci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQ7IE5vIGxvZ3MgYXJlIGV4cG9ydGVkIHRvIENsb3VkV2F0Y2guXG4gICAqL1xuICByZWFkb25seSBjbG91ZHdhdGNoTG9nc0V4cG9ydHM/OiBBY3RpdmVNcUNsb3Vkd2F0Y2hMb2dzRXhwb3J0cztcblxuICAvKipcbiAgICogU2V0cyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgQW1hem9uIE1RIGZvciBBY3RpdmVNUSBicm9rZXIuXG4gICAqL1xuICByZWFkb25seSBjb25maWd1cmF0aW9uPzogSUFjdGl2ZU1xQnJva2VyQ29uZmlndXJhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVNcUJyb2tlckRlcGxveW1lbnRCYXNlUHJvcHNcbiAgZXh0ZW5kcyBBY3RpdmVNcUJyb2tlckRlcGxveW1lbnRQcm9wcyB7XG4gIHJlYWRvbmx5IGRlcGxveW1lbnRNb2RlOiBCcm9rZXJEZXBsb3ltZW50TW9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQWN0aXZlTXFCcm9rZXJEZXBsb3ltZW50IGV4dGVuZHMgSUJyb2tlckRlcGxveW1lbnQge1xuICBtZXRyaWNBbXFwTWF4aW11bUNvbm5lY3Rpb25zKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNCdXJzdEJhbGFuY2UocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY0NwdUNyZWRpdEJhbGFuY2UocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY0NwdVV0aWxpemF0aW9uKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNDdXJyZW50Q29ubmVjdGlvbnNDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljRXN0YWJsaXNoZWRDb25uZWN0aW9uc0NvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNIZWFwVXNhZ2UocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY0luYWN0aXZlRHVyYWJsZVRvcGljU3Vic2NyaWJlcnNDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljSm9iU2NoZWR1bGVyU3RvcmVQZXJjZW50VXNhZ2UocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY0pvdXJuYWxGaWxlc0ZvckZhc3RSZWNvdmVyeShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljSm91cm5hbEZpbGVzRm9yRnVsbFJlY292ZXJ5KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNNcXR0TWF4aW11bUNvbm5lY3Rpb25zKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNOZXR3b3JrQ29ubmVjdG9yQ29ubmVjdGlvbkNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNOZXR3b3JrSW4ocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY05ldHdvcmtPdXQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY09wZW5UcmFuc2FjdGlvbkNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNPcGVud2lyZU1heGltdW1Db25uZWN0aW9ucyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljU3RvbXBNYXhpbXVtQ29ubmVjdGlvbnMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1N0b3JlUGVyY2VudFVzYWdlKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNUZW1wUGVyY2VudFVzYWdlKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNUb3RhbENvbnN1bWVyQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1RvdGFsTWVzc2FnZUNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNUb3RhbFByb2R1Y2VyQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1ZvbHVtZVJlYWRPcHMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1ZvbHVtZVdyaXRlT3BzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNXc01heGltdW1Db25uZWN0aW9ucyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljQ29uc3VtZXJDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljRW5xdWV1ZUNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNFbnF1ZXVlVGltZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljRXhwaXJlZENvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNEaXNwYXRjaENvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICBtZXRyaWNEZXF1ZXVlQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY0luRmxpZ2h0Q291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1JlY2VpdmVDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljTWVtb3J5VXNhZ2UocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1Byb2R1Y2VyQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1F1ZXVlU2l6ZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgbWV0cmljVG90YWxFbnF1ZXVlQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIG1ldHJpY1RvdGFsRGVxdWV1ZUNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvLyB3aXRoQ29uZmlndXJhdGlvbihpZDogc3RyaW5nLCBvcHRpb25zOiBBY3RpdmVNcUJyb2tlckNvbmZpZ3VyYXRpb25PcHRpb25zKTogSUFjdGl2ZU1xQnJva2VyQ29uZmlndXJhdGlvbjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFjdGl2ZU1xQnJva2VyRGVwbG95bWVudEJhc2VcbiAgZXh0ZW5kcyBCcm9rZXJEZXBsb3ltZW50QmFzZVxuICBpbXBsZW1lbnRzIElBY3RpdmVNcUJyb2tlckRlcGxveW1lbnRcbntcbiAgLyoqXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBfYnVpbGRBY3RpdmVNcUJyb2tlcihcbiAgICBpbXBvcnRlZDogSUFjdGl2ZU1xQnJva2VyRGVwbG95bWVudCxcbiAgICBzdWZmaXg6IHN0cmluZyA9IFwiXCIsXG4gICk6IElBY3RpdmVNcUJyb2tlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuZHBvaW50czoge1xuICAgICAgICBhbXFwOiB7XG4gICAgICAgICAgdXJsOiBgYW1xcCtzc2w6Ly8ke2ltcG9ydGVkLmlkfSR7c3VmZml4fS5tcS4ke0F3cy5SRUdJT059LiR7QXdzLlVSTF9TVUZGSVh9OjU2NzFgLFxuICAgICAgICAgIHBvcnQ6IDU2NzEsXG4gICAgICAgIH0sXG4gICAgICAgIHN0b21wOiB7XG4gICAgICAgICAgdXJsOiBgc3RvbXArc3NsOi8vJHtpbXBvcnRlZC5pZH0ke3N1ZmZpeH0ubXEuJHtBd3MuUkVHSU9OfS4ke0F3cy5VUkxfU1VGRklYfTo2MTYxNGAsXG4gICAgICAgICAgcG9ydDogNjE2MTQsXG4gICAgICAgIH0sXG4gICAgICAgIG9wZW5XaXJlOiB7XG4gICAgICAgICAgdXJsOiBgc3NsOi8vJHtpbXBvcnRlZC5pZH0ke3N1ZmZpeH0ubXEuJHtBd3MuUkVHSU9OfS4ke0F3cy5VUkxfU1VGRklYfTo2MTYxN2AsXG4gICAgICAgICAgcG9ydDogNjE2MTcsXG4gICAgICAgIH0sXG4gICAgICAgIG1xdHQ6IHtcbiAgICAgICAgICB1cmw6IGBtcXR0K3NzbDovLyR7aW1wb3J0ZWQuaWR9JHtzdWZmaXh9Lm1xLiR7QXdzLlJFR0lPTn0uJHtBd3MuVVJMX1NVRkZJWH06ODg4M2AsXG4gICAgICAgICAgcG9ydDogODg4MyxcbiAgICAgICAgfSxcbiAgICAgICAgd3NzOiB7XG4gICAgICAgICAgdXJsOiBgd3NzOi8vJHtpbXBvcnRlZC5pZH0ke3N1ZmZpeH0ubXEuJHtBd3MuUkVHSU9OfS4ke0F3cy5VUkxfU1VGRklYfTo2MTYxOWAsXG4gICAgICAgICAgcG9ydDogNjE2MTksXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnNvbGU6IHtcbiAgICAgICAgICB1cmw6IGBodHRwczovLyR7aW1wb3J0ZWQuaWR9JHtzdWZmaXh9Lm1xLiR7QXdzLlJFR0lPTn0uJHtBd3MuVVJMX1NVRkZJWH06ODE2MmAsXG4gICAgICAgICAgcG9ydDogODE2MixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSBhcyBJQWN0aXZlTXFCcm9rZXI7XG4gIH1cbiAgLyoqXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBfZnJvbUFjdGl2ZU1xQnJva2VyRGVwbG95bWVudEF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgICBhcm4/OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBpZD86IHN0cmluZyxcbiAgICBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwW10sXG4gICk6IElBY3RpdmVNcUJyb2tlckRlcGxveW1lbnQge1xuICAgIGlmICgobmFtZSA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSB1bmRlZmluZWQpICYmIGFybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRWl0aGVyIHRoZSBwYWlyICduYW1lJyBhbmQgJ2lkJywgb3IgJ2FybicgbmVlZHMgdG8gYmUgZGVmaW5lZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElBY3RpdmVNcUJyb2tlckRlcGxveW1lbnQge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgICBjb25uZWN0aW9uczogQ29ubmVjdGlvbnMgfCB1bmRlZmluZWQgPSBzZWN1cml0eUdyb3Vwc1xuICAgICAgICA/IG5ldyBDb25uZWN0aW9ucyh7IHNlY3VyaXR5R3JvdXBzIH0pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgX2F1dGhlbnRpY2F0aW9uU3RyYXRlZ3k/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBfZW5naW5lVmVyc2lvbjogc3RyaW5nID0gXCJVTktOT1dOXCI7XG5cbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihzY29wZSwgbG9naWNhbElkKTtcbiAgICAgICAgdGhpcy5hcm4gPSBhcm5cbiAgICAgICAgICA/IGFyblxuICAgICAgICAgIDogU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgICAgICAgICAgc2VydmljZTogXCJtcVwiLFxuICAgICAgICAgICAgICByZXNvdXJjZTogXCJicm9rZXJcIixcbiAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lOiBgJHtuYW1lfToke2lkfWAsXG4gICAgICAgICAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgICAgICAgPyBuYW1lXG4gICAgICAgICAgOiBBcm4uc3BsaXQoYXJuISwgQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUpLnJlc291cmNlTmFtZSEuc3BsaXQoXG4gICAgICAgICAgICAgIFwiOlwiLFxuICAgICAgICAgICAgKVswXTtcbiAgICAgICAgdGhpcy5pZCA9IGlkXG4gICAgICAgICAgPyBpZFxuICAgICAgICAgIDogQXJuLnNwbGl0KGFybiEsIEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhLnNwbGl0KFxuICAgICAgICAgICAgICBcIjpcIixcbiAgICAgICAgICAgIClbMV07XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBvcHRpb25zPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiBuZXcgTWV0cmljKHtcbiAgICAgICAgICBuYW1lc3BhY2U6IFwiQVdTL0FtYXpvbk1RXCIsXG4gICAgICAgICAgbWV0cmljTmFtZSxcbiAgICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgICBCcm9rZXI6IHRoaXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0FtcXBNYXhpbXVtQ29ubmVjdGlvbnMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQW1xcE1heGltdW1Db25uZWN0aW9uc1wiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNCdXJzdEJhbGFuY2UocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQnVyc3RCYWxhbmNlXCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0NwdUNyZWRpdEJhbGFuY2UocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQ3B1Q3JlZGl0QmFsYW5jZVwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNDcHVVdGlsaXphdGlvbihwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJDcHVVdGlsaXphdGlvblwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNDdXJyZW50Q29ubmVjdGlvbnNDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJDdXJyZW50Q29ubmVjdGlvbnNDb3VudFwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNFc3RhYmxpc2hlZENvbm5lY3Rpb25zQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiRXN0YWJsaXNoZWRDb25uZWN0aW9uc0NvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0hlYXBVc2FnZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJIZWFwVXNhZ2VcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljSW5hY3RpdmVEdXJhYmxlVG9waWNTdWJzY3JpYmVyc0NvdW50KFxuICAgICAgICBwcm9wcz86IE1ldHJpY09wdGlvbnMsXG4gICAgICApOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJJbmFjdGl2ZUR1cmFibGVUb3BpY1N1YnNjcmliZXJzQ291bnRcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljSm9iU2NoZWR1bGVyU3RvcmVQZXJjZW50VXNhZ2UoXG4gICAgICAgIHByb3BzPzogTWV0cmljT3B0aW9ucyxcbiAgICAgICk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkpvYlNjaGVkdWxlclN0b3JlUGVyY2VudFVzYWdlXCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0pvdXJuYWxGaWxlc0ZvckZhc3RSZWNvdmVyeShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJKb2JTY2hlZHVsZXJTdG9yZVBlcmNlbnRVc2FnZVwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNKb3VybmFsRmlsZXNGb3JGdWxsUmVjb3ZlcnkocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiSm91cm5hbEZpbGVzRm9yRnVsbFJlY292ZXJ5XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY01xdHRNYXhpbXVtQ29ubmVjdGlvbnMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiTXF0dE1heGltdW1Db25uZWN0aW9uc1wiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNOZXR3b3JrQ29ubmVjdG9yQ29ubmVjdGlvbkNvdW50KFxuICAgICAgICBwcm9wcz86IE1ldHJpY09wdGlvbnMsXG4gICAgICApOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJOZXR3b3JrQ29ubmVjdG9yQ29ubmVjdGlvbkNvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY05ldHdvcmtJbihwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJOZXR3b3JrSW5cIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljTmV0d29ya091dChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJOZXR3b3JrT3V0XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY09wZW5UcmFuc2FjdGlvbkNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIk9wZW5UcmFuc2FjdGlvbkNvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY09wZW53aXJlTWF4aW11bUNvbm5lY3Rpb25zKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIk9wZW53aXJlTWF4aW11bUNvbm5lY3Rpb25zXCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY1N0b21wTWF4aW11bUNvbm5lY3Rpb25zKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlN0b21wTWF4aW11bUNvbm5lY3Rpb25zXCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY1N0b3JlUGVyY2VudFVzYWdlKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlN0b3JlUGVyY2VudFVzYWdlXCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY1RlbXBQZXJjZW50VXNhZ2UocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiVGVtcFBlcmNlbnRVc2FnZVwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNUb3RhbENvbnN1bWVyQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiVG90YWxDb25zdW1lckNvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY1RvdGFsTWVzc2FnZUNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlRvdGFsTWVzc2FnZUNvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY1RvdGFsUHJvZHVjZXJDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJUb3RhbFByb2R1Y2VyQ291bnRcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljVm9sdW1lUmVhZE9wcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJWb2x1bWVSZWFkT3BzXCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY1ZvbHVtZVdyaXRlT3BzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIlZvbHVtZVdyaXRlT3BzXCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY1dzTWF4aW11bUNvbm5lY3Rpb25zKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIldzTWF4aW11bUNvbm5lY3Rpb25zXCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0NvbnN1bWVyQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQ29uc3VtZXJDb3VudFwiLCBwcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBtZXRyaWNFbnF1ZXVlQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiRW5xdWV1ZUNvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0VucXVldWVUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkVucXVldWVUaW1lXCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0V4cGlyZWRDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJFeHBpcmVkQ291bnRcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljRGlzcGF0Y2hDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJEaXNwYXRjaENvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY0RlcXVldWVDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJEZXF1ZXVlQ291bnRcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljSW5GbGlnaHRDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJJbkZsaWdodENvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY1JlY2VpdmVDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJSZWNlaXZlQ291bnRcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljTWVtb3J5VXNhZ2UocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiTWVtb3J5VXNhZ2VcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljUHJvZHVjZXJDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJQcm9kdWNlckNvdW50XCIsIHByb3BzKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIG1ldHJpY1F1ZXVlU2l6ZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJRdWV1ZVNpemVcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljVG90YWxFbnF1ZXVlQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiVG90YWxFbnF1ZXVlQ291bnRcIiwgcHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgbWV0cmljVG90YWxEZXF1ZXVlQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljKFwiVG90YWxEZXF1ZXVlQ291bnRcIiwgcHJvcHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRpb24gYXMgSUFjdGl2ZU1xQnJva2VyQ29uZmlndXJhdGlvbjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQWN0aXZlTXFCcm9rZXJEZXBsb3ltZW50QmFzZVByb3BzLFxuICApIHtcbiAgICBjb25zdCByZW5kZXJlZFVzZXJNYW5hZ2VtZW50ID0gcHJvcHMudXNlck1hbmFnZW1lbnQucmVuZGVyKCk7XG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnJlbmRlcmVkVXNlck1hbmFnZW1lbnQsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHZlcnNpb246IHByb3BzLnZlcnNpb24udG9TdHJpbmcoKSxcbiAgICAgIGVuZ2luZTogQnJva2VyRW5naW5lLkFDVElWRU1RLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlbmRlcmVkVXNlck1hbmFnZW1lbnQubGRhcFNlcnZlck1ldGFkYXRhKSB7XG4gICAgICAvLyB2YWxpZGF0ZSBsZGFwIHNlcnZlciBtZXRhZGF0YSBpZiBwcmVzZW50XG4gICAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbihcbiAgICAgICAgbmV3IEFjdGl2ZU1xTGRhcFZhbGlkYXRpb24oe1xuICAgICAgICAgIGNvbmZpZzogcmVuZGVyZWRVc2VyTWFuYWdlbWVudC5sZGFwU2VydmVyTWV0YWRhdGEsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jb25maWd1cmF0aW9uID1cbiAgICAgIHByb3BzLmNvbmZpZ3VyYXRpb24gPz9cbiAgICAgIEFjdGl2ZU1xQnJva2VyQ29uZmlndXJhdGlvbi5mcm9tQXR0cmlidXRlcyh0aGlzLCBcIkNvbmZpZ3VyYXRpb25cIiwge1xuICAgICAgICBpZDogdGhpcy5fcmVzb3VyY2UuYXR0ckNvbmZpZ3VyYXRpb25JZCxcbiAgICAgICAgcmV2aXNpb246IHRoaXMuX3Jlc291cmNlLmF0dHJDb25maWd1cmF0aW9uUmV2aXNpb24sXG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIHB1YmxpYyB3aXRoQ29uZmlndXJhdGlvbihpZDogc3RyaW5nLCBvcHRpb25zOiBBY3RpdmVNcUJyb2tlckNvbmZpZ3VyYXRpb25PcHRpb25zKTogSUFjdGl2ZU1xQnJva2VyQ29uZmlndXJhdGlvbiB7XG4gIC8vICAgY29uc3QgY29uZmlndXJhdGlvbiA9IG5ldyBBY3RpdmVNcUJyb2tlckNvbmZpZ3VyYXRpb24odGhpcy5ub2RlLnNjb3BlISwgaWQsIHtcbiAgLy8gICAgIGVuZ2luZVZlcnNpb246IHRoaXMuZW5naW5lVmVyc2lvbixcbiAgLy8gICAgIGF1dGhlbnRpY2F0aW9uU3RyYXRlZ3k6IHRoaXMuYXV0aGVudGljYXRpb25TdHJhdGVneSxcbiAgLy8gICAgIC4uLm9wdGlvbnMsXG4gIC8vICAgfSk7XG5cbiAgLy8gICB0aGlzLl9hdHRhY2hDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pO1xuXG4gIC8vICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247XG4gIC8vIH1cblxuICBwdWJsaWMgbWV0cmljQW1xcE1heGltdW1Db25uZWN0aW9ucyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkFtcXBNYXhpbXVtQ29ubmVjdGlvbnNcIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0J1cnN0QmFsYW5jZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkJ1cnN0QmFsYW5jZVwiLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljQ3B1Q3JlZGl0QmFsYW5jZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkNwdUNyZWRpdEJhbGFuY2VcIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0NwdVV0aWxpemF0aW9uKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQ3B1VXRpbGl6YXRpb25cIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0N1cnJlbnRDb25uZWN0aW9uc0NvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQ3VycmVudENvbm5lY3Rpb25zQ291bnRcIiwgcHJvcHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0VzdGFibGlzaGVkQ29ubmVjdGlvbnNDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIkVzdGFibGlzaGVkQ29ubmVjdGlvbnNDb3VudFwiLCBwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljSGVhcFVzYWdlKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiSGVhcFVzYWdlXCIsIHByb3BzKTtcbiAgf