UNPKG

@aws-cdk/aws-ivs-alpha

Version:

The CDK Construct Library for AWS::IVS

277 lines 34.1 kB
"use strict"; 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; }; 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; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Channel = exports.Policy = exports.MaximumResolution = exports.Preset = exports.ChannelType = exports.LatencyMode = exports.ContainerFormat = void 0; const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_ivs_1 = require("aws-cdk-lib/aws-ivs"); const core = require("aws-cdk-lib/core"); const core_1 = require("aws-cdk-lib/core"); 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 stream_key_1 = require("./stream-key"); /** * Reference to a new or existing IVS Channel */ class ChannelBase extends core.Resource { addStreamKey(id) { return new stream_key_1.StreamKey(this, id, { channel: this, }); } } /** * Container Format */ var ContainerFormat; (function (ContainerFormat) { /** * Use MPEG-TS. */ ContainerFormat["TS"] = "TS"; /** * Use fMP4. */ ContainerFormat["FRAGMENTED_MP4"] = "FRAGMENTED_MP4"; })(ContainerFormat || (exports.ContainerFormat = ContainerFormat = {})); /** * Channel latency mode */ var LatencyMode; (function (LatencyMode) { /** * Use LOW to minimize broadcaster-to-viewer latency for interactive broadcasts. */ LatencyMode["LOW"] = "LOW"; /** * Use NORMAL for broadcasts that do not require viewer interaction. */ LatencyMode["NORMAL"] = "NORMAL"; })(LatencyMode || (exports.LatencyMode = LatencyMode = {})); /** * The channel type, which determines the allowable resolution and bitrate. * If you exceed the allowable resolution or bitrate, the stream probably will disconnect immediately. * * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html */ var ChannelType; (function (ChannelType) { /** * Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions. * Transcoding allows higher playback quality across a range of download speeds. Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps. * Audio is transcoded only for renditions 360p and below; above that, audio is passed through. */ ChannelType["STANDARD"] = "STANDARD"; /** * Delivers the original input to viewers. The viewer’s video-quality choice is limited to the original input. */ ChannelType["BASIC"] = "BASIC"; /** * Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions. * Input resolution can be up to 1080p and bitrate can be up to 8.5 Mbps; output is capped at SD quality (480p). * Audio for all renditions is transcoded, and an audio-only rendition is available. */ ChannelType["ADVANCED_SD"] = "ADVANCED_SD"; /** * Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions. * Input resolution can be up to 1080p and bitrate can be up to 8.5 Mbps; output is capped at HD quality (720p). * Audio for all renditions is transcoded, and an audio-only rendition is available. */ ChannelType["ADVANCED_HD"] = "ADVANCED_HD"; })(ChannelType || (exports.ChannelType = ChannelType = {})); /** * An optional transcode preset for the channel. This is selectable only for ADVANCED_HD and ADVANCED_SD channel types. * * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html */ var Preset; (function (Preset) { /** * Use a lower bitrate than STANDARD for each quality level. Use it if you have low download bandwidth and/or simple video content (e.g., talking heads). */ Preset["CONSTRAINED_BANDWIDTH_DELIVERY"] = "CONSTRAINED_BANDWIDTH_DELIVERY"; /** * Use a higher bitrate for each quality level. Use it if you have high download bandwidth and/or complex video content (e.g., flashes and quick scene changes). */ Preset["HIGHER_BANDWIDTH_DELIVERY"] = "HIGHER_BANDWIDTH_DELIVERY"; })(Preset || (exports.Preset = Preset = {})); /** * Maximum resolution for multitrack input. */ var MaximumResolution; (function (MaximumResolution) { /** * Full HD (1080p) */ MaximumResolution["FULL_HD"] = "FULL_HD"; /** * HD (720p) */ MaximumResolution["HD"] = "HD"; /** * SD (480p) */ MaximumResolution["SD"] = "SD"; })(MaximumResolution || (exports.MaximumResolution = MaximumResolution = {})); /** * Whether multitrack input is allowed or required. */ var Policy; (function (Policy) { /** * Multitrack input is allowed. */ Policy["ALLOW"] = "ALLOW"; /** * Multitrack input is required. */ Policy["REQUIRE"] = "REQUIRE"; })(Policy || (exports.Policy = Policy = {})); /** A new IVS channel */ let Channel = (() => { let _classDecorators = [prop_injectable_1.propertyInjectable]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; let _classSuper = ChannelBase; var Channel = class extends _classSuper { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0; __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); Channel = _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-ivs-alpha.Channel", version: "2.257.0-alpha.0" }; /** Uniquely identifies this class. */ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ivs-alpha.Channel'; /** * Import an existing channel */ static fromChannelArn(scope, id, channelArn) { // This will throw an error if the arn cannot be parsed let arnComponents = core.Arn.split(channelArn, core.ArnFormat.SLASH_RESOURCE_NAME); if (!core.Token.isUnresolved(arnComponents.service) && arnComponents.service !== 'ivs') { throw new Error(`Invalid service, expected 'ivs', got '${arnComponents.service}'`); } if (!core.Token.isUnresolved(arnComponents.resource) && arnComponents.resource !== 'channel') { throw new Error(`Invalid resource, expected 'channel', got '${arnComponents.resource}'`); } class Import extends ChannelBase { channelArn = channelArn; } return new Import(scope, id); } channelArn; /** * Channel ingest endpoint, part of the definition of an ingest server, used when you set up streaming software. * For example: a1b2c3d4e5f6.global-contribute.live-video.net * @attribute */ channelIngestEndpoint; /** * Channel playback URL. For example: * https://a1b2c3d4e5f6.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.abcdEFGH.m3u8 * @attribute */ channelPlaybackUrl; constructor(scope, id, props = {}) { super(scope, id, { physicalName: props.channelName ?? core_1.Lazy.string({ produce: () => core_1.Names.uniqueResourceName(this, { maxLength: 128, allowedSpecialCharacters: '-_' }), }), }); try { jsiiDeprecationWarnings._aws_cdk_aws_ivs_alpha_ChannelProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, Channel); } throw error; } // Enhanced CDK Analytics Telemetry (0, metadata_resource_1.addConstructMetadata)(this, props); if (this.physicalName && !core.Token.isUnresolved(this.physicalName) && !/^[a-zA-Z0-9-_]*$/.test(this.physicalName)) { throw new Error(`channelName must contain only numbers, letters, hyphens and underscores, got: '${this.physicalName}'`); } let preset; if (props.type && [ChannelType.STANDARD, ChannelType.BASIC].includes(props.type) && props.preset) { preset = ''; } else { preset = props.preset; } if (props.multitrackInputConfiguration !== undefined) { if (props.type !== undefined && props.type !== ChannelType.STANDARD) { throw new Error(`\`multitrackInputConfiguration\` is only supported for \`ChannelType.STANDARD\`, got: ${props.type}.`); } if (props.containerFormat !== undefined && props.containerFormat !== ContainerFormat.FRAGMENTED_MP4) { throw new Error(`\`containerFormat\` must be set to \`ContainerFormat.FRAGMENTED_MP4\` when \`multitrackInputConfiguration\` is specified, got: ${props.containerFormat}.`); } } const resource = new aws_ivs_1.CfnChannel(this, 'Resource', { authorized: props.authorized, insecureIngest: props.insecureIngest, latencyMode: props.latencyMode, name: this.physicalName, type: props.type, preset, recordingConfigurationArn: props.recordingConfiguration?.recordingConfigurationArn, containerFormat: props.containerFormat ?? (props.multitrackInputConfiguration ? ContainerFormat.FRAGMENTED_MP4 : undefined), multitrackInputConfiguration: props.multitrackInputConfiguration ? { enabled: true, maximumResolution: props.multitrackInputConfiguration.maximumResolution, policy: props.multitrackInputConfiguration.policy, } : undefined, }); this.channelArn = resource.attrArn; this.channelIngestEndpoint = resource.attrIngestEndpoint; this.channelPlaybackUrl = resource.attrPlaybackUrl; } static { __runInitializers(_classThis, _classExtraInitializers); } }; return Channel = _classThis; })(); exports.Channel = Channel; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNoYW5uZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQWlEO0FBQ2pELHlDQUF5QztBQUN6QywyQ0FBK0M7QUFDL0MsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUcxRSw2Q0FBeUM7QUFvQnpDOztHQUVHO0FBQ0gsTUFBZSxXQUFZLFNBQVEsSUFBSSxDQUFDLFFBQVE7SUFHdkMsWUFBWSxDQUFDLEVBQVU7UUFDNUIsT0FBTyxJQUFJLHNCQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUM3QixPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztLQUNKO0NBQ0Y7QUFFRDs7R0FFRztBQUNILElBQVksZUFVWDtBQVZELFdBQVksZUFBZTtJQUN6Qjs7T0FFRztJQUNILDRCQUFTLENBQUE7SUFFVDs7T0FFRztJQUNILG9EQUFpQyxDQUFBO0FBQ25DLENBQUMsRUFWVyxlQUFlLCtCQUFmLGVBQWUsUUFVMUI7QUFFRDs7R0FFRztBQUNILElBQVksV0FVWDtBQVZELFdBQVksV0FBVztJQUNyQjs7T0FFRztJQUNILDBCQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILGdDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFWVyxXQUFXLDJCQUFYLFdBQVcsUUFVdEI7QUFFRDs7Ozs7R0FLRztBQUNILElBQVksV0EwQlg7QUExQkQsV0FBWSxXQUFXO0lBQ3JCOzs7O09BSUc7SUFDSCxvQ0FBcUIsQ0FBQTtJQUVyQjs7T0FFRztJQUNILDhCQUFlLENBQUE7SUFFZjs7OztPQUlHO0lBQ0gsMENBQTJCLENBQUE7SUFFM0I7Ozs7T0FJRztJQUNILDBDQUEyQixDQUFBO0FBQzdCLENBQUMsRUExQlcsV0FBVywyQkFBWCxXQUFXLFFBMEJ0QjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLE1BV1g7QUFYRCxXQUFZLE1BQU07SUFDaEI7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QUNoQixNQUFNO2dCQUNOLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSx5QkFBeUI7Z0JBQ2xGLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtvQkFDcEMsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDbkYsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7b0JBQ2hFO3dCQUNFLE9BQU8sRUFBRSxJQUFJO3dCQUNiLGlCQUFpQixFQUFFLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBaUI7d0JBQ3ZFLE1BQU0sRUFBRSxLQUFLLENBQUMsNEJBQTRCLENBQUMsTUFBTTtxQkFDbEQ7b0JBQ0QsQ0FBQyxDQUFDLFNBQVM7YUFDZCxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDbkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztZQUN6RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztTQUNwRDs7WUEvRlUsdURBQU87Ozs7O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5DaGFubmVsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWl2cyc7XG5pbXBvcnQgKiBhcyBjb3JlIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgTGF6eSwgTmFtZXMgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IElSZWNvcmRpbmdDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9yZWNvcmRpbmctY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBTdHJlYW1LZXkgfSBmcm9tICcuL3N0cmVhbS1rZXknO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gSVZTIENoYW5uZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ2hhbm5lbCBleHRlbmRzIGNvcmUuSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIEFSTi4gRm9yIGV4YW1wbGU6IGFybjphd3M6aXZzOnVzLXdlc3QtMjoxMjM0NTY3ODkwMTI6Y2hhbm5lbC9hYmNkQUJDRGVmZ2hcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RyZWFtIGtleSBmb3IgdGhpcyBJVlMgQ2hhbm5lbC5cbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBJRFxuICAgKi9cbiAgYWRkU3RyZWFtS2V5KGlkOiBzdHJpbmcpOiBTdHJlYW1LZXk7XG59XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIGEgbmV3IG9yIGV4aXN0aW5nIElWUyBDaGFubmVsXG4gKi9cbmFic3RyYWN0IGNsYXNzIENoYW5uZWxCYXNlIGV4dGVuZHMgY29yZS5SZXNvdXJjZSBpbXBsZW1lbnRzIElDaGFubmVsIHtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNoYW5uZWxBcm46IHN0cmluZztcblxuICBwdWJsaWMgYWRkU3RyZWFtS2V5KGlkOiBzdHJpbmcpOiBTdHJlYW1LZXkge1xuICAgIHJldHVybiBuZXcgU3RyZWFtS2V5KHRoaXMsIGlkLCB7XG4gICAgICBjaGFubmVsOiB0aGlzLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbmVyIEZvcm1hdFxuICovXG5leHBvcnQgZW51bSBDb250YWluZXJGb3JtYXQge1xuICAvKipcbiAgICogVXNlIE1QRUctVFMuXG4gICAqL1xuICBUUyA9ICdUUycsXG5cbiAgLyoqXG4gICAqIFVzZSBmTVA0LlxuICAgKi9cbiAgRlJBR01FTlRFRF9NUDQgPSAnRlJBR01FTlRFRF9NUDQnLFxufVxuXG4vKipcbiAqIENoYW5uZWwgbGF0ZW5jeSBtb2RlXG4gKi9cbmV4cG9ydCBlbnVtIExhdGVuY3lNb2RlIHtcbiAgLyoqXG4gICAqIFVzZSBMT1cgdG8gbWluaW1pemUgYnJvYWRjYXN0ZXItdG8tdmlld2VyIGxhdGVuY3kgZm9yIGludGVyYWN0aXZlIGJyb2FkY2FzdHMuXG4gICAqL1xuICBMT1cgPSAnTE9XJyxcblxuICAvKipcbiAgICogVXNlIE5PUk1BTCBmb3IgYnJvYWRjYXN0cyB0aGF0IGRvIG5vdCByZXF1aXJlIHZpZXdlciBpbnRlcmFjdGlvbi5cbiAgICovXG4gIE5PUk1BTCA9ICdOT1JNQUwnLFxufVxuXG4vKipcbiAqIFRoZSBjaGFubmVsIHR5cGUsIHdoaWNoIGRldGVybWluZXMgdGhlIGFsbG93YWJsZSByZXNvbHV0aW9uIGFuZCBiaXRyYXRlLlxuICogSWYgeW91IGV4Y2VlZCB0aGUgYWxsb3dhYmxlIHJlc29sdXRpb24gb3IgYml0cmF0ZSwgdGhlIHN0cmVhbSBwcm9iYWJseSB3aWxsIGRpc2Nvbm5lY3QgaW1tZWRpYXRlbHkuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtaXZzLWNoYW5uZWwuaHRtbFxuICovXG5leHBvcnQgZW51bSBDaGFubmVsVHlwZSB7XG4gIC8qKlxuICAgKiBNdWx0aXBsZSBxdWFsaXRpZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBpbnB1dCwgdG8gYXV0b21hdGljYWxseSBnaXZlIHZpZXdlcnMgdGhlIGJlc3QgZXhwZXJpZW5jZSBmb3IgdGhlaXIgZGV2aWNlcyBhbmQgbmV0d29yayBjb25kaXRpb25zLlxuICAgKiBUcmFuc2NvZGluZyBhbGxvd3MgaGlnaGVyIHBsYXliYWNrIHF1YWxpdHkgYWNyb3NzIGEgcmFuZ2Ugb2YgZG93bmxvYWQgc3BlZWRzLiBSZXNvbHV0aW9uIGNhbiBiZSB1cCB0byAxMDgwcCBhbmQgYml0cmF0ZSBjYW4gYmUgdXAgdG8gOC41IE1icHMuXG4gICAqIEF1ZGlvIGlzIHRyYW5zY29kZWQgb25seSBmb3IgcmVuZGl0aW9ucyAzNjBwIGFuZCBiZWxvdzsgYWJvdmUgdGhhdCwgYXVkaW8gaXMgcGFzc2VkIHRocm91Z2guXG4gICAqL1xuICBTVEFOREFSRCA9ICdTVEFOREFSRCcsXG5cbiAgLyoqXG4gICAqIERlbGl2ZXJzIHRoZSBvcmlnaW5hbCBpbnB1dCB0byB2aWV3ZXJzLiBUaGUgdmlld2Vy4oCZcyB2aWRlby1xdWFsaXR5IGNob2ljZSBpcyBsaW1pdGVkIHRvIHRoZSBvcmlnaW5hbCBpbnB1dC5cbiAgICovXG4gIEJBU0lDID0gJ0JBU0lDJyxcblxuICAvKipcbiAgICogTXVsdGlwbGUgcXVhbGl0aWVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgaW5wdXQsIHRvIGF1dG9tYXRpY2FsbHkgZ2l2ZSB2aWV3ZXJzIHRoZSBiZXN0IGV4cGVyaWVuY2UgZm9yIHRoZWlyIGRldmljZXMgYW5kIG5ldHdvcmsgY29uZGl0aW9ucy5cbiAgICogSW5wdXQgcmVzb2x1dGlvbiBjYW4gYmUgdXAgdG8gMTA4MHAgYW5kIGJpdHJhdGUgY2FuIGJlIHVwIHRvIDguNSBNYnBzOyBvdXRwdXQgaXMgY2FwcGVkIGF0IFNEIHF1YWxpdHkgKDQ4MHApLlxuICAgKiBBdWRpbyBmb3IgYWxsIHJlbmRpdGlvbnMgaXMgdHJhbnNjb2RlZCwgYW5kIGFuIGF1ZGlvLW9ubHkgcmVuZGl0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIEFEVkFOQ0VEX1NEID0gJ0FEVkFOQ0VEX1NEJyxcblxuICAvKipcbiAgICogTXVsdGlwbGUgcXVhbGl0aWVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgaW5wdXQsIHRvIGF1dG9tYXRpY2FsbHkgZ2l2ZSB2aWV3ZXJzIHRoZSBiZXN0IGV4cGVyaWVuY2UgZm9yIHRoZWlyIGRldmljZXMgYW5kIG5ldHdvcmsgY29uZGl0aW9ucy5cbiAgICogSW5wdXQgcmVzb2x1dGlvbiBjYW4gYmUgdXAgdG8gMTA4MHAgYW5kIGJpdHJhdGUgY2FuIGJlIHVwIHRvIDguNSBNYnBzOyBvdXRwdXQgaXMgY2FwcGVkIGF0IEhEIHF1YWxpdHkgKDcyMHApLlxuICAgKiBBdWRpbyBmb3IgYWxsIHJlbmRpdGlvbnMgaXMgdHJhbnNjb2RlZCwgYW5kIGFuIGF1ZGlvLW9ubHkgcmVuZGl0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIEFEVkFOQ0VEX0hEID0gJ0FEVkFOQ0VEX0hEJyxcbn1cblxuLyoqXG4gKiBBbiBvcHRpb25hbCB0cmFuc2NvZGUgcHJlc2V0IGZvciB0aGUgY2hhbm5lbC4gVGhpcyBpcyBzZWxlY3RhYmxlIG9ubHkgZm9yIEFEVkFOQ0VEX0hEIGFuZCBBRFZBTkNFRF9TRCBjaGFubmVsIHR5cGVzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWl2cy1jaGFubmVsLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gUHJlc2V0IHtcbiAgLyoqXG4gICAqIFVzZSBhIGxvd2VyIGJpdHJhdGUgdGhhbiBTVEFOREFSRCBmb3IgZWFjaCBxdWFsaXR5IGxldmVsLiBVc2UgaXQgaWYgeW91IGhhdmUgbG93IGRvd25sb2FkIGJhbmR3aWR0aCBhbmQvb3Igc2ltcGxlIHZpZGVvIGNvbnRlbnQgKGUuZy4sIHRhbGtpbmcgaGVhZHMpLlxuICAgKi9cbiAgQ09OU1RSQUlORURfQkFORFdJRFRIX0RFTElWRVJZID0gJ0NPTlNUUkFJTkVEX0JBTkRXSURUSF9ERUxJVkVSWScsXG5cbiAgLyoqXG4gICAqIFVzZSBhIGhpZ2hlciBiaXRyYXRlIGZvciBlYWNoIHF1YWxpdHkgbGV2ZWwuIFVzZSBpdCBpZiB5b3UgaGF2ZSBoaWdoIGRvd25sb2FkIGJhbmR3aWR0aCBhbmQvb3IgY29tcGxleCB2aWRlbyBjb250ZW50IChlLmcuLCBmbGFzaGVzIGFuZCBxdWljayBzY2VuZSBjaGFuZ2VzKS5cbiAgICovXG4gIEhJR0hFUl9CQU5EV0lEVEhfREVMSVZFUlkgPSAnSElHSEVSX0JBTkRXSURUSF9ERUxJVkVSWScsXG5cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIG5ldyBDaGFubmVsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbm5lbFByb3BzIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNoYW5uZWwgaXMgYXV0aG9yaXplZC5cbiAgICpcbiAgICogSWYgeW91IHdpc2ggdG8gbWFrZSBhbiBhdXRob3JpemVkIGNoYW5uZWwsIHlvdSB3aWxsIG5lZWQgdG8gZW5zdXJlIHRoYXRcbiAgICogYSBQbGF5YmFja0tleVBhaXIgaGFzIGJlZW4gdXBsb2FkZWQgdG8geW91ciBhY2NvdW50IGFzIHRoaXMgaXMgdXNlZCB0b1xuICAgKiB2YWxpZGF0ZSB0aGUgc2lnbmVkIEpXVCB0aGF0IGlzIHJlcXVpcmVkIGZvciBhdXRob3JpemF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhdXRob3JpemVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoaWNoIGNvbnRlbnQtcGFja2FnaW5nIGZvcm1hdCBpcyB1c2VkIChNUEVHLVRTIG9yIGZNUDQpLlxuICAgKlxuICAgKiBJZiBgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbmAgaXMgc3BlY2lmaWVkLCBvbmx5IGZNUDQgY2FuIGJlIHVzZWQuXG4gICAqIE90aGVyd2lzZSwgYGNvbnRhaW5lckZvcm1hdGAgbWF5IGJlIHNldCB0byBgQ29udGFpbmVyRm9ybWF0LlRTYCBvciBgQ29udGFpbmVyRm9ybWF0LkZSQUdNRU5URURfTVA0YC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgQ29udGFpbmVyRm9ybWF0LkZSQUdNRU5URURfTVA0YCBpcyBhdXRvbWF0aWNhbGx5IHNldCB3aGVuIHRoZSBgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbmAgaXMgc3BlY2lmaWVkLiBJZiBub3Qgc3BlY2lmaWVkLCBpdCByZW1haW5zIHVuZGVmaW5lZCBhbmQgdXNlcyB0aGUgSVZTIGRlZmF1bHQgc2V0dGluZyAoVFMpLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyRm9ybWF0PzogQ29udGFpbmVyRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjaGFubmVsIGFsbG93cyBpbnNlY3VyZSBSVE1QIGluZ2VzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGluc2VjdXJlSW5nZXN0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2hhbm5lbCBsYXRlbmN5IG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IExhdGVuY3lNb2RlLkxPV1xuICAgKi9cbiAgcmVhZG9ubHkgbGF0ZW5jeU1vZGU/OiBMYXRlbmN5TW9kZTtcblxuICAvKipcbiAgICogQSBuYW1lIGZvciB0aGUgY2hhbm5lbC5cbiAgICpcbiAgICogQGRlZmF1bHQgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9iamVjdCBzcGVjaWZ5aW5nIG11bHRpdHJhY2sgaW5wdXQgY29uZmlndXJhdGlvbi5cbiAgICogWW91IG11c3Qgc3BlY2lmeSBgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbmAgaWYgeW91IHdhbnQgdG8gdXNlIE11bHRpVHJhY2sgVmlkZW8uXG4gICAqXG4gICAqIGBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uYCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgYENoYW5uZWxUeXBlLlNUQU5EQVJEYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gSVZTIGRlZmF1bHQgc2V0dGluZyBpcyBub3QgdXNlIE11bHRpVHJhY2sgVmlkZW8uXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2l2cy9sYXRlc3QvTG93TGF0ZW5jeVVzZXJHdWlkZS9tdWx0aXRyYWNrLXZpZGVvLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24/OiBNdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hhbm5lbCB0eXBlLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBhbGxvd2FibGUgcmVzb2x1dGlvbiBhbmQgYml0cmF0ZS5cbiAgICogSWYgeW91IGV4Y2VlZCB0aGUgYWxsb3dhYmxlIHJlc29sdXRpb24gb3IgYml0cmF0ZSwgdGhlIHN0cmVhbSB3aWxsIGRpc2Nvbm5lY3QgaW1tZWRpYXRlbHlcbiAgICpcbiAgICogQGRlZmF1bHQgQ2hhbm5lbFR5cGUuU1RBTkRBUkRcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBDaGFubmVsVHlwZTtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgdHJhbnNjb2RlIHByZXNldCBmb3IgdGhlIGNoYW5uZWwuIENhbiBiZSB1c2VkIGZvciBBRFZBTkNFRF9IRCBhbmQgQURWQU5DRURfU0QgY2hhbm5lbCB0eXBlcy5cbiAgICogV2hlbiBMT1cgb3IgU1RBTkRBUkQgaXMgdXNlZCwgdGhlIHByZXNldCB3aWxsIGJlIG92ZXJyaWRkZW4gYW5kIHNldCB0byBub25lIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFByZXNldC5ISUdIRVJfQkFORFdJRFRIX0RFTElWRVJZIGlmIGNoYW5uZWxUeXBlIGlzIEFEVkFOQ0VEX1NEIG9yIEFEVkFOQ0VEX0hELCBub25lIG90aGVyd2lzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJlc2V0PzogUHJlc2V0O1xuXG4gIC8qKlxuICAgKiBBIHJlY29yZGluZyBjb25maWd1cmF0aW9uIGZvciB0aGUgY2hhbm5lbC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSByZWNvcmRpbmcgaXMgZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlY29yZGluZ0NvbmZpZ3VyYXRpb24/OiBJUmVjb3JkaW5nQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBNYXhpbXVtIHJlc29sdXRpb24gZm9yIG11bHRpdHJhY2sgaW5wdXQuXG4gKi9cbmV4cG9ydCBlbnVtIE1heGltdW1SZXNvbHV0aW9uIHtcbiAgLyoqXG4gICAqIEZ1bGwgSEQgKDEwODBwKVxuICAgKi9cbiAgRlVMTF9IRCA9ICdGVUxMX0hEJyxcblxuICAvKipcbiAgICogSEQgKDcyMHApXG4gICAqL1xuICBIRCA9ICdIRCcsXG5cbiAgLyoqXG4gICAqIFNEICg0ODBwKVxuICAgKi9cbiAgU0QgPSAnU0QnLFxufVxuXG4vKipcbiAqIFdoZXRoZXIgbXVsdGl0cmFjayBpbnB1dCBpcyBhbGxvd2VkIG9yIHJlcXVpcmVkLlxuICovXG5leHBvcnQgZW51bSBQb2xpY3kge1xuICAvKipcbiAgICogTXVsdGl0cmFjayBpbnB1dCBpcyBhbGxvd2VkLlxuICAgKi9cbiAgQUxMT1cgPSAnQUxMT1cnLFxuXG4gIC8qKlxuICAgKiBNdWx0aXRyYWNrIGlucHV0IGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgUkVRVUlSRSA9ICdSRVFVSVJFJyxcbn1cblxuLyoqXG4gKiBBIGNvbXBsZXggdHlwZSB0aGF0IHNwZWNpZmllcyBtdWx0aXRyYWNrIGlucHV0IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIHJlc29sdXRpb24gZm9yIG11bHRpdHJhY2sgaW5wdXQuXG4gICAqL1xuICByZWFkb25seSBtYXhpbXVtUmVzb2x1dGlvbjogTWF4aW11bVJlc29sdXRpb247XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIG11bHRpdHJhY2sgaW5wdXQgaXMgYWxsb3dlZCBvciByZXF1aXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBvbGljeTogUG9saWN5O1xufVxuXG4vKipcbiAgQSBuZXcgSVZTIGNoYW5uZWxcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIENoYW5uZWwgZXh0ZW5kcyBDaGFubmVsQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWl2cy1hbHBoYS5DaGFubmVsJztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIGNoYW5uZWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNoYW5uZWxBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY2hhbm5lbEFybjogc3RyaW5nKTogSUNoYW5uZWwge1xuICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYXJuIGNhbm5vdCBiZSBwYXJzZWRcbiAgICBsZXQgYXJuQ29tcG9uZW50cyA9IGNvcmUuQXJuLnNwbGl0KGNoYW5uZWxBcm4sIGNvcmUuQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpO1xuXG4gICAgaWYgKCFjb3JlLlRva2VuLmlzVW5yZXNvbHZlZChhcm5Db21wb25lbnRzLnNlcnZpY2UpICYmIGFybkNvbXBvbmVudHMuc2VydmljZSAhPT0gJ2l2cycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZXJ2aWNlLCBleHBlY3RlZCAnaXZzJywgZ290ICcke2FybkNvbXBvbmVudHMuc2VydmljZX0nYCk7XG4gICAgfVxuXG4gICAgaWYgKCFjb3JlLlRva2VuLmlzVW5yZXNvbHZlZChhcm5Db21wb25lbnRzLnJlc291cmNlKSAmJiBhcm5Db21wb25lbnRzLnJlc291cmNlICE9PSAnY2hhbm5lbCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXNvdXJjZSwgZXhwZWN0ZWQgJ2NoYW5uZWwnLCBnb3QgJyR7YXJuQ29tcG9uZW50cy5yZXNvdXJjZX0nYCk7XG4gICAgfVxuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQ2hhbm5lbEJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxBcm4gPSBjaGFubmVsQXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGFubmVsIGluZ2VzdCBlbmRwb2ludCwgcGFydCBvZiB0aGUgZGVmaW5pdGlvbiBvZiBhbiBpbmdlc3Qgc2VydmVyLCB1c2VkIHdoZW4geW91IHNldCB1cCBzdHJlYW1pbmcgc29mdHdhcmUuXG4gICAqIEZvciBleGFtcGxlOiBhMWIyYzNkNGU1ZjYuZ2xvYmFsLWNvbnRyaWJ1dGUubGl2ZS12aWRlby5uZXRcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxJbmdlc3RFbmRwb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGFubmVsIHBsYXliYWNrIFVSTC4gRm9yIGV4YW1wbGU6XG4gICAqIGh0dHBzOi8vYTFiMmMzZDRlNWY2LnVzLXdlc3QtMi5wbGF5YmFjay5saXZlLXZpZGVvLm5ldC9hcGkvdmlkZW8vdjEvdXMtd2VzdC0yLjEyMzQ1Njc4OTAxMi5jaGFubmVsLmFiY2RFRkdILm0zdThcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxQbGF5YmFja1VybDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDaGFubmVsUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5jaGFubmVsTmFtZSA/PyBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogMTI4LCBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6ICctXycgfSksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZSAmJiAhY29yZS5Ub2tlbi5pc1VucmVzb2x2ZWQodGhpcy5waHlzaWNhbE5hbWUpICYmICEvXlthLXpBLVowLTktX10qJC8udGVzdCh0aGlzLnBoeXNpY2FsTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2hhbm5lbE5hbWUgbXVzdCBjb250YWluIG9ubHkgbnVtYmVycywgbGV0dGVycywgaHlwaGVucyBhbmQgdW5kZXJzY29yZXMsIGdvdDogJyR7dGhpcy5waHlzaWNhbE5hbWV9J2ApO1xuICAgIH1cblxuICAgIGxldCBwcmVzZXQ7XG5cbiAgICBpZiAocHJvcHMudHlwZSAmJiBbQ2hhbm5lbFR5cGUuU1RBTkRBUkQsIENoYW5uZWxUeXBlLkJBU0lDXS5pbmNsdWRlcyhwcm9wcy50eXBlKSAmJiBwcm9wcy5wcmVzZXQpIHtcbiAgICAgIHByZXNldCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVzZXQgPSBwcm9wcy5wcmVzZXQ7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHByb3BzLnR5cGUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy50eXBlICE9PSBDaGFubmVsVHlwZS5TVEFOREFSRCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb25cXGAgaXMgb25seSBzdXBwb3J0ZWQgZm9yIFxcYENoYW5uZWxUeXBlLlNUQU5EQVJEXFxgLCBnb3Q6ICR7cHJvcHMudHlwZX0uYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5jb250YWluZXJGb3JtYXQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5jb250YWluZXJGb3JtYXQgIT09IENvbnRhaW5lckZvcm1hdC5GUkFHTUVOVEVEX01QNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGNvbnRhaW5lckZvcm1hdFxcYCBtdXN0IGJlIHNldCB0byBcXGBDb250YWluZXJGb3JtYXQuRlJBR01FTlRFRF9NUDRcXGAgd2hlbiBcXGBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uXFxgIGlzIHNwZWNpZmllZCwgZ290OiAke3Byb3BzLmNvbnRhaW5lckZvcm1hdH0uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgQ2ZuQ2hhbm5lbCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBhdXRob3JpemVkOiBwcm9wcy5hdXRob3JpemVkLFxuICAgICAgaW5zZWN1cmVJbmdlc3Q6IHByb3BzLmluc2VjdXJlSW5nZXN0LFxuICAgICAgbGF0ZW5jeU1vZGU6IHByb3BzLmxhdGVuY3lNb2RlLFxuICAgICAgbmFtZTogdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgICB0eXBlOiBwcm9wcy50eXBlLFxuICAgICAgcHJlc2V0LFxuICAgICAgcmVjb3JkaW5nQ29uZmlndXJhdGlvbkFybjogcHJvcHMucmVjb3JkaW5nQ29uZmlndXJhdGlvbj8ucmVjb3JkaW5nQ29uZmlndXJhdGlvbkFybixcbiAgICAgIGNvbnRhaW5lckZvcm1hdDogcHJvcHMuY29udGFpbmVyRm9ybWF0ID8/XG4gICAgICAgIChwcm9wcy5tdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uID8gQ29udGFpbmVyRm9ybWF0LkZSQUdNRU5URURfTVA0IDogdW5kZWZpbmVkKSxcbiAgICAgIG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb246IHByb3BzLm11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24gP1xuICAgICAgICB7XG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBtYXhpbXVtUmVzb2x1dGlvbjogcHJvcHMubXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbi5tYXhpbXVtUmVzb2x1dGlvbixcbiAgICAgICAgICBwb2xpY3k6IHByb3BzLm11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24ucG9saWN5LFxuICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jaGFubmVsQXJuID0gcmVzb3VyY2UuYXR0ckFybjtcbiAgICB0aGlzLmNoYW5uZWxJbmdlc3RFbmRwb2ludCA9IHJlc291cmNlLmF0dHJJbmdlc3RFbmRwb2ludDtcbiAgICB0aGlzLmNoYW5uZWxQbGF5YmFja1VybCA9IHJlc291cmNlLmF0dHJQbGF5YmFja1VybDtcbiAgfVxufVxuIl19