@aws-cdk/aws-mediaconnect-alpha 2.263.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/bridge.js ADDED
@@ -0,0 +1,490 @@
1
+ "use strict";
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.Bridge = exports.BridgeConfiguration = exports.BridgeFailoverConfig = exports.BridgeOutputConfiguration = exports.BridgeType = void 0;
38
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
41
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
42
+ const aws_mediaconnect_1 = require("aws-cdk-lib/aws-mediaconnect");
43
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
44
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
45
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
46
+ const bridge_output_1 = require("./bridge-output");
47
+ const shared_1 = require("./shared");
48
+ /**
49
+ * Configuration of bridge type
50
+ */
51
+ class BridgeType {
52
+ value;
53
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.BridgeType", version: "2.263.0-alpha.0" };
54
+ /**
55
+ * Ingress Bridge
56
+ */
57
+ static INGRESS_BRIDGE = new BridgeType('ingress_bridge');
58
+ /**
59
+ * Egress Bridge
60
+ */
61
+ static EGRESS_BRIDGE = new BridgeType('egress_bridge');
62
+ /**
63
+ * Use a custom bridge type value
64
+ * @param value The bridge type string value
65
+ */
66
+ static of(value) {
67
+ return new BridgeType(value);
68
+ }
69
+ /** @param value The bridge type string value */
70
+ constructor(value) {
71
+ this.value = value;
72
+ }
73
+ /** Returns the string value */
74
+ toString() {
75
+ return this.value;
76
+ }
77
+ }
78
+ exports.BridgeType = BridgeType;
79
+ /**
80
+ * Configuration for a bridge output.
81
+ */
82
+ class BridgeOutputConfiguration {
83
+ _network;
84
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.BridgeOutputConfiguration", version: "2.263.0-alpha.0" };
85
+ /**
86
+ * Create a network output configuration for a bridge.
87
+ */
88
+ static network(props) {
89
+ try {
90
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_BridgeNetworkOutputProps(props);
91
+ }
92
+ catch (error) {
93
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
94
+ Error.captureStackTrace(error, this.network);
95
+ }
96
+ throw error;
97
+ }
98
+ if (!aws_cdk_lib_1.Token.isUnresolved(props.ttl) && (props.ttl < 1 || props.ttl > 255)) {
99
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeOutputTtlRange`, `TTL must be between 1 and 255 hops, got ${props.ttl}`);
100
+ }
101
+ return new BridgeOutputConfiguration(props);
102
+ }
103
+ constructor(_network) {
104
+ this._network = _network;
105
+ }
106
+ /**
107
+ * @internal
108
+ */
109
+ _bind() {
110
+ return {
111
+ ipAddress: this._network.ipAddress,
112
+ networkName: this._network.network.name,
113
+ port: this._network.port,
114
+ protocol: this._network.protocol.value,
115
+ ttl: this._network.ttl,
116
+ };
117
+ }
118
+ }
119
+ exports.BridgeOutputConfiguration = BridgeOutputConfiguration;
120
+ /**
121
+ * Source failover configuration for a bridge.
122
+ *
123
+ * Bridges only support `FAILOVER` (switchover) mode — the `MERGE` mode available on
124
+ * `Flow.sourceFailoverConfig` is not allowed on bridges by the service. Use
125
+ * {@link BridgeFailoverConfig.failover} to construct the configuration.
126
+ */
127
+ class BridgeFailoverConfig {
128
+ _state;
129
+ _primarySource;
130
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.BridgeFailoverConfig", version: "2.263.0-alpha.0" };
131
+ /**
132
+ * Configure switchover-mode failover. The bridge swaps to the backup source when
133
+ * the primary source stops receiving data.
134
+ */
135
+ static failover(options = {}) {
136
+ try {
137
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_BridgeFailoverOptions(options);
138
+ }
139
+ catch (error) {
140
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
141
+ Error.captureStackTrace(error, this.failover);
142
+ }
143
+ throw error;
144
+ }
145
+ return new BridgeFailoverConfig(options.state ?? shared_1.State.ENABLED, options.primarySource);
146
+ }
147
+ constructor(_state, _primarySource) {
148
+ this._state = _state;
149
+ this._primarySource = _primarySource;
150
+ }
151
+ /**
152
+ * Whether this configuration has failover enabled.
153
+ * @internal
154
+ */
155
+ get _isEnabled() {
156
+ return this._state === shared_1.State.ENABLED;
157
+ }
158
+ /**
159
+ * Called when the configuration is bound to a Bridge.
160
+ * @internal
161
+ */
162
+ _bind() {
163
+ return {
164
+ failoverMode: shared_1.FailoverMode.FAILOVER.value,
165
+ state: this._state,
166
+ sourcePriority: this._primarySource ? { primarySource: this._primarySource } : undefined,
167
+ };
168
+ }
169
+ }
170
+ exports.BridgeFailoverConfig = BridgeFailoverConfig;
171
+ /**
172
+ * Bridge configuration to set ingress and egress options on the bridge
173
+ */
174
+ class BridgeConfiguration {
175
+ _bridgeType;
176
+ _ingressConfig;
177
+ _egressConfig;
178
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.BridgeConfiguration", version: "2.263.0-alpha.0" };
179
+ /**
180
+ * An ingress bridge is a ground-to-cloud bridge. The content originates at your premises and is delivered to the cloud.
181
+ */
182
+ static ingress(config) {
183
+ try {
184
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_IngressBridgeConfiguration(config);
185
+ }
186
+ catch (error) {
187
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
188
+ Error.captureStackTrace(error, this.ingress);
189
+ }
190
+ throw error;
191
+ }
192
+ if (!config.maxBitrate.isUnresolved()) {
193
+ const bitrateBps = config.maxBitrate.toBps();
194
+ if (bitrateBps < 1000000 || bitrateBps > 100000000) {
195
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeIngressBitrateRange`, `Bridge ingress max bitrate must be between 1,000,000 and 100,000,000 bps, got ${bitrateBps}`);
196
+ }
197
+ }
198
+ if (!aws_cdk_lib_1.Token.isUnresolved(config.networkSources) && config.networkSources.length > 2) {
199
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeMaxNetworkSources`, `A bridge supports a maximum of 2 network sources, got ${config.networkSources.length}`);
200
+ }
201
+ return new BridgeConfiguration(BridgeType.INGRESS_BRIDGE, config, undefined);
202
+ }
203
+ /**
204
+ * An egress bridge is a cloud-to-ground bridge. The content comes from an existing MediaConnect flow and is delivered to your premises.
205
+ */
206
+ static egress(config) {
207
+ try {
208
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_EgressBridgeConfiguration(config);
209
+ }
210
+ catch (error) {
211
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
212
+ Error.captureStackTrace(error, this.egress);
213
+ }
214
+ throw error;
215
+ }
216
+ if (!config.maxBitrate.isUnresolved()) {
217
+ const bitrateBps = config.maxBitrate.toBps();
218
+ if (bitrateBps < 1000000 || bitrateBps > 100000000) {
219
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeEgressBitrateRange`, `Bridge egress max bitrate must be between 1,000,000 and 100,000,000 bps, got ${bitrateBps}`);
220
+ }
221
+ }
222
+ if (!aws_cdk_lib_1.Token.isUnresolved(config.flowSources) && config.flowSources.length > 2) {
223
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeMaxFlowSources`, `A bridge supports a maximum of 2 flow sources, got ${config.flowSources.length}`);
224
+ }
225
+ if (!aws_cdk_lib_1.Token.isUnresolved(config.networkOutputs) && config.networkOutputs.length > 2) {
226
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeMaxNetworkOutputs`, `A bridge supports a maximum of 2 network outputs, got ${config.networkOutputs.length}`);
227
+ }
228
+ return new BridgeConfiguration(BridgeType.EGRESS_BRIDGE, undefined, config);
229
+ }
230
+ constructor(_bridgeType, _ingressConfig, _egressConfig) {
231
+ this._bridgeType = _bridgeType;
232
+ this._ingressConfig = _ingressConfig;
233
+ this._egressConfig = _egressConfig;
234
+ }
235
+ /**
236
+ * Called when the bridge configuration is bound to a Bridge.
237
+ * @internal
238
+ */
239
+ _bind() {
240
+ return {
241
+ bridgeType: this._bridgeType,
242
+ ingressConfig: this._ingressConfig,
243
+ egressConfig: this._egressConfig,
244
+ };
245
+ }
246
+ }
247
+ exports.BridgeConfiguration = BridgeConfiguration;
248
+ class BridgeBase extends aws_cdk_lib_1.Resource {
249
+ /**
250
+ * Creates a Bridge construct that represents an external (imported) Bridge.
251
+ */
252
+ static fromBridgeAttributes(scope, id, attrs) {
253
+ class Import extends BridgeBase {
254
+ bridgeArn = attrs.bridgeArn;
255
+ bridgeState = undefined;
256
+ get bridgeName() {
257
+ if (attrs.bridgeName)
258
+ return attrs.bridgeName;
259
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `BridgeNameNotProvided`, `'bridgeName' was not provided when importing Bridge ${this.node.path}; provide it in fromBridgeAttributes()`, this);
260
+ }
261
+ get bridgeType() {
262
+ if (attrs.bridgeType)
263
+ return attrs.bridgeType;
264
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `BridgeTypeNotProvided`, `'bridgeType' was not provided when importing Bridge ${this.node.path}; provide it in fromBridgeAttributes()`, this);
265
+ }
266
+ // Imported bridges default to `false`. Pass `isFailoverEnabled: true` in the
267
+ // attributes when the real service-side bridge has failover enabled and you
268
+ // need to add a BridgeSource.
269
+ isFailoverEnabled = attrs.isFailoverEnabled ?? false;
270
+ }
271
+ return new Import(scope, id);
272
+ }
273
+ /**
274
+ * Import an existing Bridge from its ARN.
275
+ *
276
+ * Use `fromBridgeAttributes()` instead if you need access to `bridgeName`, `bridgeType`
277
+ * (required for `addOutput()`), or `isFailoverEnabled`.
278
+ */
279
+ static fromBridgeArn(scope, id, bridgeArn) {
280
+ return Bridge.fromBridgeAttributes(scope, id, { bridgeArn });
281
+ }
282
+ /** A reference to this Bridge resource. */
283
+ get bridgeRef() {
284
+ return { bridgeArn: this.bridgeArn };
285
+ }
286
+ /**
287
+ * Create a CloudWatch metric for this bridge.
288
+ */
289
+ metric(metricName, props) {
290
+ return new aws_cloudwatch_1.Metric({
291
+ metricName,
292
+ namespace: 'AWS/MediaConnect',
293
+ ...props,
294
+ dimensionsMap: {
295
+ BridgeARN: this.bridgeArn,
296
+ ...props?.dimensionsMap,
297
+ },
298
+ }).attachTo(this);
299
+ }
300
+ /**
301
+ * Metric for the bitrate of a specific bridge source.
302
+ */
303
+ metricSourceBitrate(bridgeSourceName, props) {
304
+ const metricName = this.bridgeType.value === BridgeType.EGRESS_BRIDGE.value
305
+ ? 'EgressBridgeSourceBitRate'
306
+ : 'IngressBridgeSourceBitRate';
307
+ return new aws_cloudwatch_1.Metric({
308
+ metricName,
309
+ namespace: 'AWS/MediaConnect',
310
+ statistic: 'avg',
311
+ period: aws_cdk_lib_1.Duration.seconds(60),
312
+ unit: aws_cloudwatch_1.Unit.BITS_PER_SECOND,
313
+ ...props,
314
+ dimensionsMap: {
315
+ BridgeARN: this.bridgeArn,
316
+ BridgeSourceName: bridgeSourceName,
317
+ ...props?.dimensionsMap,
318
+ },
319
+ }).attachTo(this);
320
+ }
321
+ /**
322
+ * Metric for the percentage of packets lost on a specific bridge source.
323
+ */
324
+ metricSourcePacketLossPercent(bridgeSourceName, props) {
325
+ const metricName = this.bridgeType.value === BridgeType.EGRESS_BRIDGE.value
326
+ ? 'EgressBridgeSourcePacketLossPercent'
327
+ : 'IngressBridgeSourcePacketLossPercent';
328
+ return new aws_cloudwatch_1.Metric({
329
+ metricName,
330
+ namespace: 'AWS/MediaConnect',
331
+ statistic: 'avg',
332
+ period: aws_cdk_lib_1.Duration.seconds(60),
333
+ unit: aws_cloudwatch_1.Unit.PERCENT,
334
+ ...props,
335
+ dimensionsMap: {
336
+ BridgeARN: this.bridgeArn,
337
+ BridgeSourceName: bridgeSourceName,
338
+ ...props?.dimensionsMap,
339
+ },
340
+ }).attachTo(this);
341
+ }
342
+ /**
343
+ * Metric for the total number of times the bridge switches between sources
344
+ * when using the `FAILOVER` failover mode.
345
+ */
346
+ metricFailoverSwitches(props) {
347
+ const metricName = this.bridgeType.value === BridgeType.EGRESS_BRIDGE.value
348
+ ? 'EgressBridgeFailoverSwitches'
349
+ : 'IngressBridgeFailoverSwitches';
350
+ return this.metric(metricName, {
351
+ statistic: 'sum',
352
+ period: aws_cdk_lib_1.Duration.seconds(60),
353
+ unit: aws_cloudwatch_1.Unit.COUNT,
354
+ ...props,
355
+ });
356
+ }
357
+ /**
358
+ * Add a network output to this bridge (for egress bridges only).
359
+ *
360
+ * @param id Construct id for the new BridgeOutput
361
+ * @param networkOutput The named output to add. The `name` is the output's identity on the bridge and must be unique among outputs.
362
+ */
363
+ addOutput(id, networkOutput) {
364
+ if (this.bridgeType.value !== BridgeType.EGRESS_BRIDGE.value) {
365
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `BridgeEgressOnly`, `addOutput can only be called on egress bridges, got '${this.bridgeType.value}'`, this);
366
+ }
367
+ return new bridge_output_1.BridgeOutput(this, id, {
368
+ bridgeOutputName: networkOutput.name,
369
+ bridge: this,
370
+ output: networkOutput.output,
371
+ });
372
+ }
373
+ }
374
+ /**
375
+ * Defines a AWS Elemental MediaConnect Bridge
376
+ */
377
+ let Bridge = (() => {
378
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
379
+ let _classDescriptor;
380
+ let _classExtraInitializers = [];
381
+ let _classThis;
382
+ let _classSuper = BridgeBase;
383
+ var Bridge = class extends _classSuper {
384
+ static { _classThis = this; }
385
+ static {
386
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
387
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
388
+ Bridge = _classThis = _classDescriptor.value;
389
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
390
+ }
391
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.Bridge", version: "2.263.0-alpha.0" };
392
+ /** Uniquely identifies this class. */
393
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-mediaconnect-alpha.Bridge';
394
+ bridgeArn;
395
+ bridgeName;
396
+ bridgeType;
397
+ bridgeState;
398
+ isFailoverEnabled = false;
399
+ constructor(scope, id, props) {
400
+ super(scope, id, {
401
+ physicalName: props?.bridgeName ?? aws_cdk_lib_1.Lazy.string({ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 64 }) }),
402
+ });
403
+ try {
404
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_BridgeProps(props);
405
+ }
406
+ catch (error) {
407
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
408
+ Error.captureStackTrace(error, Bridge);
409
+ }
410
+ throw error;
411
+ }
412
+ // Validate bridge name if provided
413
+ if (props.bridgeName != null && props.bridgeName !== '' && !aws_cdk_lib_1.Token.isUnresolved(props.bridgeName)) {
414
+ if (props.bridgeName.length > 64) {
415
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `BridgeNameLength`, `Bridge name must be between 1 and 64 characters, got ${props.bridgeName.length}`, this);
416
+ }
417
+ if (!/^[a-zA-Z0-9-]+$/.test(props.bridgeName)) {
418
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `BridgeNameFormat`, `Bridge name must contain only alphanumeric characters and hyphens, got '${props.bridgeName}'`, this);
419
+ }
420
+ }
421
+ // Enhanced CDK Analytics Telemetry
422
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
423
+ this.isFailoverEnabled = props.sourceFailoverConfig?._isEnabled ?? false;
424
+ const config = props.config;
425
+ const configBind = config._bind();
426
+ const ingress = configBind.ingressConfig ? {
427
+ ingressGatewayBridge: {
428
+ maxBitrate: configBind.ingressConfig.maxBitrate.toBps(),
429
+ maxOutputs: configBind.ingressConfig.maxOutputs,
430
+ },
431
+ sources: configBind.ingressConfig.networkSources.map(input => {
432
+ return {
433
+ networkSource: {
434
+ name: input.name,
435
+ multicastIp: input.source.multicastIp,
436
+ networkName: input.source.network.name,
437
+ port: input.source.port,
438
+ protocol: input.source.protocol.value,
439
+ multicastSourceSettings: {
440
+ multicastSourceIp: input.source.multicastSourceIp,
441
+ },
442
+ },
443
+ };
444
+ }),
445
+ } : undefined;
446
+ const egress = configBind.egressConfig ? {
447
+ egressGatewayBridge: {
448
+ maxBitrate: configBind.egressConfig.maxBitrate.toBps(),
449
+ },
450
+ sources: configBind.egressConfig.flowSources.map(input => this.formatBridgeFlowSource(input)),
451
+ outputs: configBind.egressConfig.networkOutputs.map(no => ({
452
+ networkOutput: { name: no.name, ...no.output._bind() },
453
+ })),
454
+ } : undefined;
455
+ const bridge = new aws_mediaconnect_1.CfnBridge(this, 'Resource', {
456
+ name: this.physicalName,
457
+ placementArn: props.gateway.gatewayArn,
458
+ ingressGatewayBridge: ingress?.ingressGatewayBridge,
459
+ egressGatewayBridge: egress?.egressGatewayBridge,
460
+ sources: ingress?.sources ?? egress?.sources ?? [],
461
+ outputs: egress?.outputs,
462
+ sourceFailoverConfig: props.sourceFailoverConfig?._bind(),
463
+ });
464
+ this.bridgeArn = bridge.attrBridgeArn;
465
+ this.bridgeName = this.physicalName;
466
+ this.bridgeState = bridge.attrBridgeState;
467
+ this.bridgeType = configBind.bridgeType;
468
+ }
469
+ /**
470
+ * Format bridge flow source into BridgeSourceProperty format
471
+ */
472
+ formatBridgeFlowSource(input) {
473
+ return {
474
+ flowSource: {
475
+ flowArn: input.source.flow.flowArn,
476
+ name: input.name,
477
+ flowVpcInterfaceAttachment: input.source.vpcInterface ? {
478
+ vpcInterfaceName: input.source.vpcInterface.name,
479
+ } : undefined,
480
+ },
481
+ };
482
+ }
483
+ static {
484
+ __runInitializers(_classThis, _classExtraInitializers);
485
+ }
486
+ };
487
+ return Bridge = _classThis;
488
+ })();
489
+ exports.Bridge = Bridge;
490
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJpZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYnJpZGdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDZDQUErRztBQUUvRywrREFBMEQ7QUFDMUQsbUVBQXlEO0FBRXpELDRFQUE0RDtBQUM1RCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBRzFFLG1EQUErQztBQUkvQyxxQ0FBK0M7QUFnRC9DOztHQUVHO0FBQ0gsTUFBYSxVQUFVO0lBbUJlOztJQWxCcEM7O09BRUc7SUFDSSxNQUFNLENBQVUsY0FBYyxHQUFHLElBQUksVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDekU7O09BRUc7SUFDSSxNQUFNLENBQVUsYUFBYSxHQUFHLElBQUksVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRXZFOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBYTtRQUM1QixPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzlCO0lBRUQsZ0RBQWdEO0lBQ2hELFlBQW9DLEtBQWE7UUFBYixVQUFLLEdBQUwsS0FBSyxDQUFRO0tBQUk7SUFFckQsK0JBQStCO0lBQ3hCLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDbkI7O0FBeEJILGdDQXlCQztBQWtMRDs7R0FFRztBQUNILE1BQWEseUJBQXlCO0lBV0M7O0lBVnJDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUErQjs7Ozs7Ozs7OztRQUNuRCxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE1BQU0sSUFBSSxxQ0FBdUIsQ0FBQyxJQUFBLHNCQUFHLEVBQUEs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Ozs7O0FBQU4sd0JBQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJpdHJhdGUsIElSZXNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IER1cmF0aW9uLCBSZXNvdXJjZSwgTGF6eSwgTmFtZXMsIFRva2VuLCBWYWxpZGF0aW9uRXJyb3IsIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNPcHRpb25zIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgTWV0cmljLCBVbml0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgQ2ZuQnJpZGdlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgdHlwZSB7IElCcmlkZ2VSZWYsIEJyaWRnZVJlZmVyZW5jZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWNvbm5lY3QnO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBJQnJpZGdlT3V0cHV0IH0gZnJvbSAnLi9icmlkZ2Utb3V0cHV0JztcbmltcG9ydCB7IEJyaWRnZU91dHB1dCB9IGZyb20gJy4vYnJpZGdlLW91dHB1dCc7XG5pbXBvcnQgdHlwZSB7IElGbG93IH0gZnJvbSAnLi9mbG93JztcbmltcG9ydCB0eXBlIHsgSUdhdGV3YXkgfSBmcm9tICcuL2dhdGV3YXknO1xuaW1wb3J0IHR5cGUgeyBCcmlkZ2VQcm90b2NvbCwgQnJpZGdlTmV0d29ya1NvdXJjZSwgR2F0ZXdheU5ldHdvcmssIFZwY0ludGVyZmFjZUNvbmZpZyB9IGZyb20gJy4vc2hhcmVkJztcbmltcG9ydCB7IEZhaWxvdmVyTW9kZSwgU3RhdGUgfSBmcm9tICcuL3NoYXJlZCc7XG5cbi8qKlxuICogVGhlIHNvdXJjZSBvZiB0aGUgYnJpZGdlLiBBIGZsb3cgc291cmNlIG9yaWdpbmF0ZXMgaW4gTWVkaWFDb25uZWN0IGFzIGFuIGV4aXN0aW5nIGNsb3VkIGZsb3cuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlRmxvd1NvdXJjZSB7XG4gIC8qKlxuICAgKiBUaGUgY2xvdWQgZmxvdyB1c2VkIGFzIGEgc291cmNlIG9mIHRoaXMgYnJpZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmxvdzogSUZsb3c7XG4gIC8qKlxuICAgKiBUaGUgVlBDIGludGVyZmFjZSBhdHRhY2htZW50IHRvIHVzZSBmb3IgdGhpcyBzb3VyY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gVlBDIGludGVyZmFjZVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjSW50ZXJmYWNlPzogVnBjSW50ZXJmYWNlQ29uZmlnO1xufVxuXG4vKipcbiAqIEEgbmFtZWQgZmxvdyBzb3VyY2UgZm9yIGFuIGVncmVzcyBicmlkZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlRmxvd0lucHV0IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmbG93IHNvdXJjZS4gTXVzdCBiZSB1bmlxdWUgYW1vbmcgc291cmNlcyBvbiB0aGUgYnJpZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmxvdyBzb3VyY2UgY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIHdoZXJlIHRoZSBicmlkZ2UgY29uc3VtZXMgY29udGVudCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlOiBCcmlkZ2VGbG93U291cmNlO1xufVxuXG4vKipcbiAqIEEgbmFtZWQgbmV0d29yayBzb3VyY2UgZm9yIGFuIGluZ3Jlc3MgYnJpZGdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZU5ldHdvcmtJbnB1dCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbmV0d29yayBzb3VyY2UuIE11c3QgYmUgdW5pcXVlIGFtb25nIHNvdXJjZXMgb24gdGhlIGJyaWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgc291cmNlIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyB0aGUgbXVsdGljYXN0IGVuZHBvaW50IHRoZSBicmlkZ2UgbGlzdGVucyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZTogQnJpZGdlTmV0d29ya1NvdXJjZTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9mIGJyaWRnZSB0eXBlXG4gKi9cbmV4cG9ydCBjbGFzcyBCcmlkZ2VUeXBlIHtcbiAgLyoqXG4gICAqIEluZ3Jlc3MgQnJpZGdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElOR1JFU1NfQlJJREdFID0gbmV3IEJyaWRnZVR5cGUoJ2luZ3Jlc3NfYnJpZGdlJyk7XG4gIC8qKlxuICAgKiBFZ3Jlc3MgQnJpZGdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVHUkVTU19CUklER0UgPSBuZXcgQnJpZGdlVHlwZSgnZWdyZXNzX2JyaWRnZScpO1xuXG4gIC8qKlxuICAgKiBVc2UgYSBjdXN0b20gYnJpZGdlIHR5cGUgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBicmlkZ2UgdHlwZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IEJyaWRnZVR5cGUge1xuICAgIHJldHVybiBuZXcgQnJpZGdlVHlwZSh2YWx1ZSk7XG4gIH1cblxuICAvKiogQHBhcmFtIHZhbHVlIFRoZSBicmlkZ2UgdHlwZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZykge31cblxuICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBicmlkZ2UgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzXG4gKi9cbmludGVyZmFjZSBCcmlkZ2VDb25maWd1cmF0aW9uQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBleHBlY3RlZCBiaXRyYXRlIChpbiBicHMpIG9mIHRoZSBicmlkZ2UuXG4gICAqL1xuICByZWFkb25seSBtYXhCaXRyYXRlOiBCaXRyYXRlO1xufVxuXG4vKipcbiAqIEluZ3Jlc3MgYnJpZGdlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdyZXNzQnJpZGdlQ29uZmlndXJhdGlvbiBleHRlbmRzIEJyaWRnZUNvbmZpZ3VyYXRpb25CYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXRzIG9uIHRoZSBpbmdyZXNzIGJyaWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IG1heE91dHB1dHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIHNvdXJjZXMgZm9yIHRoZSBpbmdyZXNzIGJyaWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtTb3VyY2VzOiBCcmlkZ2VOZXR3b3JrSW5wdXRbXTtcbn1cblxuLyoqXG4gKiBFZ3Jlc3MgYnJpZGdlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZ3Jlc3NCcmlkZ2VDb25maWd1cmF0aW9uIGV4dGVuZHMgQnJpZGdlQ29uZmlndXJhdGlvbkJhc2Uge1xuICAvKipcbiAgICogVGhlIGZsb3cgc291cmNlcyBmb3IgdGhlIGVncmVzcyBicmlkZ2UuXG4gICAqL1xuICByZWFkb25seSBmbG93U291cmNlczogQnJpZGdlRmxvd0lucHV0W107XG4gIC8qKlxuICAgKiBUaGUgbmV0d29yayBvdXRwdXRzIGZvciB0aGUgZWdyZXNzIGJyaWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtPdXRwdXRzOiBCcmlkZ2VOZXR3b3JrT3V0cHV0W107XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBCcmlkZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQnJpZGdlIGV4dGVuZHMgSVJlc291cmNlLCBJQnJpZGdlUmVmIHtcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBicmlkZ2UuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGJyaWRnZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYnJpZGdlLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBicmlkZ2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGJyaWRnZSAoaW5ncmVzcyBvciBlZ3Jlc3MpLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBicmlkZ2VUeXBlOiBCcmlkZ2VUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYnJpZGdlLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBicmlkZ2VTdGF0ZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmFpbG92ZXIgQ29uZmlndXJhdGlvbiBmb3IgQnJpZGdlXG4gICAqL1xuICByZWFkb25seSBpc0ZhaWxvdmVyRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldHdvcmsgb3V0cHV0IHRvIHRoaXMgYnJpZGdlIChmb3IgZWdyZXNzIGJyaWRnZXMgb25seSkuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBDb25zdHJ1Y3QgaWQgZm9yIHRoZSBuZXcgQnJpZGdlT3V0cHV0XG4gICAqIEBwYXJhbSBuZXR3b3JrT3V0cHV0IFRoZSBuYW1lZCBvdXRwdXQgdG8gYWRkLiBUaGUgYG5hbWVgIGlzIHRoZSBvdXRwdXQncyBpZGVudGl0eSBvbiB0aGUgYnJpZGdlIGFuZCBtdXN0IGJlIHVuaXF1ZSBhbW9uZyBvdXRwdXRzLlxuICAgKi9cbiAgYWRkT3V0cHV0KGlkOiBzdHJpbmcsIG5ldHdvcmtPdXRwdXQ6IEJyaWRnZU5ldHdvcmtPdXRwdXQpOiBJQnJpZGdlT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdGhpcyBicmlkZ2UuXG4gICAqXG4gICAqIEJyaWRnZSBtZXRyaWNzIGFyZSBkaW1lbnNpb25lZCBieSBgQnJpZGdlQVJOYC4gU2VlIHRoZSBNZWRpYUNvbm5lY3RcbiAgICogZG9jdW1lbnRhdGlvbiBmb3IgYXZhaWxhYmxlIG1ldHJpYyBuYW1lcyAoZS5nLiBgSW5ncmVzc0JyaWRnZUJpdFJhdGVgLFxuICAgKiBgRWdyZXNzQnJpZGdlQml0UmF0ZWAsIGBJbmdyZXNzQnJpZGdlUGFja2V0TG9zc1BlcmNlbnRgKS5cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgYml0cmF0ZSBvZiBhIHNwZWNpZmljIGJyaWRnZSBzb3VyY2UuXG4gICAqXG4gICAqIFVzZXMgYEluZ3Jlc3NCcmlkZ2VTb3VyY2VCaXRSYXRlYCBmb3IgaW5ncmVzcyBicmlkZ2VzIGFuZFxuICAgKiBgRWdyZXNzQnJpZGdlU291cmNlQml0UmF0ZWAgZm9yIGVncmVzcyBicmlkZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gYnJpZGdlU291cmNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYnJpZGdlIHNvdXJjZVxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNTb3VyY2VCaXRyYXRlKGJyaWRnZVNvdXJjZU5hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBwZXJjZW50YWdlIG9mIHBhY2tldHMgbG9zdCBvbiBhIHNwZWNpZmljIGJyaWRnZSBzb3VyY2UuXG4gICAqXG4gICAqIFVzZXMgYEluZ3Jlc3NCcmlkZ2VTb3VyY2VQYWNrZXRMb3NzUGVyY2VudGAgZm9yIGluZ3Jlc3MgYnJpZGdlcyBhbmRcbiAgICogYEVncmVzc0JyaWRnZVNvdXJjZVBhY2tldExvc3NQZXJjZW50YCBmb3IgZWdyZXNzIGJyaWRnZXMuXG4gICAqXG4gICAqIEBwYXJhbSBicmlkZ2VTb3VyY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBicmlkZ2Ugc291cmNlXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY1NvdXJjZVBhY2tldExvc3NQZXJjZW50KGJyaWRnZVNvdXJjZU5hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGJyaWRnZSBzd2l0Y2hlcyBiZXR3ZWVuIHNvdXJjZXNcbiAgICogd2hlbiB1c2luZyB0aGUgYEZBSUxPVkVSYCBmYWlsb3ZlciBtb2RlLlxuICAgKlxuICAgKiBVc2VzIGBJbmdyZXNzQnJpZGdlRmFpbG92ZXJTd2l0Y2hlc2AgZm9yIGluZ3Jlc3MgYnJpZGdlcyBhbmRcbiAgICogYEVncmVzc0JyaWRnZUZhaWxvdmVyU3dpdGNoZXNgIGZvciBlZ3Jlc3MgYnJpZGdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNGYWlsb3ZlclN3aXRjaGVzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIGJyaWRnZSBuZXR3b3JrIG91dHB1dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VOZXR3b3JrT3V0cHV0UHJvcHMge1xuICAvKipcbiAgICogVGhlIElQIGFkZHJlc3Mgd2hlcmUgdGhlIG91dHB1dCB3aWxsIHNlbmQgY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IGlwQWRkcmVzczogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBvcnQgdG8gdXNlIGZvciB0aGUgb3V0cHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGdhdGV3YXkgbmV0d29yayB0aGlzIG91dHB1dCBzZW5kcyBjb250ZW50IG91dCBvZi5cbiAgICpcbiAgICogVXNlIHtAbGluayBHYXRld2F5TmV0d29yay5kZWZpbmV9IHRvIGNyZWF0ZSB0aGUgbmV0d29yayBhbmQgcGFzcyB0aGUgc2FtZVxuICAgKiBpbnN0YW5jZSB0byB0aGUgZ2F0ZXdheSBhbmQgdG8gZWFjaCBvdXRwdXQgdGhhdCB1c2VzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29yazogR2F0ZXdheU5ldHdvcms7XG4gIC8qKlxuICAgKiBUaGUgcHJvdG9jb2wgdG8gdXNlIGZvciB0aGUgb3V0cHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2w6IEJyaWRnZVByb3RvY29sO1xuICAvKipcbiAgICogVGltZSB0byBsaXZlIChUVEwpIGZvciB0aGUgb3V0cHV0IHBhY2tldHMgaW4gaG9wcyAoMS0yNTUpLlxuICAgKlxuICAgKiBUVEwgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmV0d29yayBob3BzIGEgcGFja2V0IGNhbiB0cmF2ZXJzZVxuICAgKiBiZWZvcmUgYmVpbmcgZGlzY2FyZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHRsOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBuYW1lZCBuZXR3b3JrIG91dHB1dCBmb3IgYW4gZWdyZXNzIGJyaWRnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VOZXR3b3JrT3V0cHV0IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrIG91dHB1dC4gTXVzdCBiZSB1bmlxdWUgYW1vbmcgb3V0cHV0cyBvbiB0aGUgYnJpZGdlLlxuICAgKlxuICAgKiBVc2VkIGFzIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSB1bmRlcmx5aW5nIENGTiByZXNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIHdoZXJlIHRoaXMgb3V0cHV0IHNlbmRzIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IEJyaWRnZU91dHB1dENvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBicmlkZ2Ugb3V0cHV0LlxuICovXG5leHBvcnQgY2xhc3MgQnJpZGdlT3V0cHV0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXR3b3JrIG91dHB1dCBjb25maWd1cmF0aW9uIGZvciBhIGJyaWRnZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbmV0d29yayhwcm9wczogQnJpZGdlTmV0d29ya091dHB1dFByb3BzKTogQnJpZGdlT3V0cHV0Q29uZmlndXJhdGlvbiB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMudHRsKSAmJiAocHJvcHMudHRsIDwgMSB8fCBwcm9wcy50dGwgPiAyNTUpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEJyaWRnZU91dHB1dFR0bFJhbmdlYCwgYFRUTCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU1IGhvcHMsIGdvdCAke3Byb3BzLnR0bH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBCcmlkZ2VPdXRwdXRDb25maWd1cmF0aW9uKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfbmV0d29yazogQnJpZGdlTmV0d29ya091dHB1dFByb3BzKSB7fVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYmluZCgpOiB7IGlwQWRkcmVzczogc3RyaW5nOyBuZXR3b3JrTmFtZTogc3RyaW5nOyBwb3J0OiBudW1iZXI7IHByb3RvY29sOiBzdHJpbmc7IHR0bDogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBpcEFkZHJlc3M6IHRoaXMuX25ldHdvcmsuaXBBZGRyZXNzLFxuICAgICAgbmV0d29ya05hbWU6IHRoaXMuX25ldHdvcmsubmV0d29yay5uYW1lLFxuICAgICAgcG9ydDogdGhpcy5fbmV0d29yay5wb3J0LFxuICAgICAgcHJvdG9jb2w6IHRoaXMuX25ldHdvcmsucHJvdG9jb2wudmFsdWUsXG4gICAgICB0dGw6IHRoaXMuX25ldHdvcmsudHRsLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBicmlkZ2Ugc291cmNlIGZhaWxvdmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZUZhaWxvdmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGZhaWxvdmVyIGlzIGVuYWJsZWQuIFNldCB0byBgU3RhdGUuRElTQUJMRURgIHRvIGtlZXAgdGhlIGNvbmZpZ3VyYXRpb25cbiAgICogb24gdGhlIGJyaWRnZSB3aXRob3V0IHN3aXRjaGluZyBmYWlsb3ZlciBvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RhdGUuRU5BQkxFRFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGU/OiBTdGF0ZTtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgeW91IHdhbnQgdG8gdHJlYXQgYXMgcHJpbWFyeS4gSWYgc2V0LCBNZWRpYUNvbm5lY3QgYWx3YXlzXG4gICAqIHVzZXMgdGhpcyBzb3VyY2Ugd2hlbiBpdCBpcyBhdmFpbGFibGUuIFdoZW4gdW5zZXQsIGJvdGggc291cmNlcyBhcmUgdHJlYXRlZCB3aXRoXG4gICAqIGVxdWFsIHByaW9yaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGJvdGggc291cmNlcyBhcmUgZXF1YWwgcHJpb3JpdHlcbiAgICovXG4gIHJlYWRvbmx5IHByaW1hcnlTb3VyY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU291cmNlIGZhaWxvdmVyIGNvbmZpZ3VyYXRpb24gZm9yIGEgYnJpZGdlLlxuICpcbiAqIEJyaWRnZXMgb25seSBzdXBwb3J0IGBGQUlMT1ZFUmAgKHN3aXRjaG92ZXIpIG1vZGUg4oCUIHRoZSBgTUVSR0VgIG1vZGUgYXZhaWxhYmxlIG9uXG4gKiBgRmxvdy5zb3VyY2VGYWlsb3ZlckNvbmZpZ2AgaXMgbm90IGFsbG93ZWQgb24gYnJpZGdlcyBieSB0aGUgc2VydmljZS4gVXNlXG4gKiB7QGxpbmsgQnJpZGdlRmFpbG92ZXJDb25maWcuZmFpbG92ZXJ9IHRvIGNvbnN0cnVjdCB0aGUgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEJyaWRnZUZhaWxvdmVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBzd2l0Y2hvdmVyLW1vZGUgZmFpbG92ZXIuIFRoZSBicmlkZ2Ugc3dhcHMgdG8gdGhlIGJhY2t1cCBzb3VyY2Ugd2hlblxuICAgKiB0aGUgcHJpbWFyeSBzb3VyY2Ugc3RvcHMgcmVjZWl2aW5nIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZhaWxvdmVyKG9wdGlvbnM6IEJyaWRnZUZhaWxvdmVyT3B0aW9ucyA9IHt9KTogQnJpZGdlRmFpbG92ZXJDb25maWcge1xuICAgIHJldHVybiBuZXcgQnJpZGdlRmFpbG92ZXJDb25maWcob3B0aW9ucy5zdGF0ZSA/PyBTdGF0ZS5FTkFCTEVELCBvcHRpb25zLnByaW1hcnlTb3VyY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0ZTogU3RhdGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcHJpbWFyeVNvdXJjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBmYWlsb3ZlciBlbmFibGVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgX2lzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09IFN0YXRlLkVOQUJMRUQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgYm91bmQgdG8gYSBCcmlkZ2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9iaW5kKCk6IENmbkJyaWRnZS5GYWlsb3ZlckNvbmZpZ1Byb3BlcnR5IHtcbiAgICByZXR1cm4ge1xuICAgICAgZmFpbG92ZXJNb2RlOiBGYWlsb3Zlck1vZGUuRkFJTE9WRVIudmFsdWUsXG4gICAgICBzdGF0ZTogdGhpcy5fc3RhdGUsXG4gICAgICBzb3VyY2VQcmlvcml0eTogdGhpcy5fcHJpbWFyeVNvdXJjZSA/IHsgcHJpbWFyeVNvdXJjZTogdGhpcy5fcHJpbWFyeVNvdXJjZSB9IDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBCcmlkZ2UgY29uZmlndXJhdGlvbiB0byBzZXQgaW5ncmVzcyBhbmQgZWdyZXNzIG9wdGlvbnMgb24gdGhlIGJyaWRnZVxuICovXG5leHBvcnQgY2xhc3MgQnJpZGdlQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBBbiBpbmdyZXNzIGJyaWRnZSBpcyBhIGdyb3VuZC10by1jbG91ZCBicmlkZ2UuIFRoZSBjb250ZW50IG9yaWdpbmF0ZXMgYXQgeW91ciBwcmVtaXNlcyBhbmQgaXMgZGVsaXZlcmVkIHRvIHRoZSBjbG91ZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW5ncmVzcyhjb25maWc6IEluZ3Jlc3NCcmlkZ2VDb25maWd1cmF0aW9uKTogQnJpZGdlQ29uZmlndXJhdGlvbiB7XG4gICAgaWYgKCFjb25maWcubWF4Qml0cmF0ZS5pc1VucmVzb2x2ZWQoKSkge1xuICAgICAgY29uc3QgYml0cmF0ZUJwcyA9IGNvbmZpZy5tYXhCaXRyYXRlLnRvQnBzKCk7XG4gICAgICBpZiAoYml0cmF0ZUJwcyA8IDEwMDAwMDAgfHwgYml0cmF0ZUJwcyA+IDEwMDAwMDAwMCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEJyaWRnZUluZ3Jlc3NCaXRyYXRlUmFuZ2VgLCBgQnJpZGdlIGluZ3Jlc3MgbWF4IGJpdHJhdGUgbXVzdCBiZSBiZXR3ZWVuIDEsMDAwLDAwMCBhbmQgMTAwLDAwMCwwMDAgYnBzLCBnb3QgJHtiaXRyYXRlQnBzfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGNvbmZpZy5uZXR3b3JrU291cmNlcykgJiYgY29uZmlnLm5ldHdvcmtTb3VyY2VzLmxlbmd0aCA+IDIpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEJyaWRnZU1heE5ldHdvcmtTb3VyY2VzYCxcbiAgICAgICAgYEEgYnJpZGdlIHN1cHBvcnRzIGEgbWF4aW11bSBvZiAyIG5ldHdvcmsgc291cmNlcywgZ290ICR7Y29uZmlnLm5ldHdvcmtTb3VyY2VzLmxlbmd0aH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEJyaWRnZUNvbmZpZ3VyYXRpb24oQnJpZGdlVHlwZS5JTkdSRVNTX0JSSURHRSwgY29uZmlnLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVncmVzcyBicmlkZ2UgaXMgYSBjbG91ZC10by1ncm91bmQgYnJpZGdlLiBUaGUgY29udGVudCBjb21lcyBmcm9tIGFuIGV4aXN0aW5nIE1lZGlhQ29ubmVjdCBmbG93IGFuZCBpcyBkZWxpdmVyZWQgdG8geW91ciBwcmVtaXNlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZWdyZXNzKGNvbmZpZzogRWdyZXNzQnJpZGdlQ29uZmlndXJhdGlvbik6IEJyaWRnZUNvbmZpZ3VyYXRpb24ge1xuICAgIGlmICghY29uZmlnLm1heEJpdHJhdGUuaXNVbnJlc29sdmVkKCkpIHtcbiAgICAgIGNvbnN0IGJpdHJhdGVCcHMgPSBjb25maWcubWF4Qml0cmF0ZS50b0JwcygpO1xuICAgICAgaWYgKGJpdHJhdGVCcHMgPCAxMDAwMDAwIHx8IGJpdHJhdGVCcHMgPiAxMDAwMDAwMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBCcmlkZ2VFZ3Jlc3NCaXRyYXRlUmFuZ2VgLCBgQnJpZGdlIGVncmVzcyBtYXggYml0cmF0ZSBtdXN0IGJlIGJldHdlZW4gMSwwMDAsMDAwIGFuZCAxMDAsMDAwLDAwMCBicHMsIGdvdCAke2JpdHJhdGVCcHN9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoY29uZmlnLmZsb3dTb3VyY2VzKSAmJiBjb25maWcuZmxvd1NvdXJjZXMubGVuZ3RoID4gMikge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgQnJpZGdlTWF4Rmxvd1NvdXJjZXNgLFxuICAgICAgICBgQSBicmlkZ2Ugc3VwcG9ydHMgYSBtYXhpbXVtIG9mIDIgZmxvdyBzb3VyY2VzLCBnb3QgJHtjb25maWcuZmxvd1NvdXJjZXMubGVuZ3RofWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGNvbmZpZy5uZXR3b3JrT3V0cHV0cykgJiYgY29uZmlnLm5ldHdvcmtPdXRwdXRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEJyaWRnZU1heE5ldHdvcmtPdXRwdXRzYCxcbiAgICAgICAgYEEgYnJpZGdlIHN1cHBvcnRzIGEgbWF4aW11bSBvZiAyIG5ldHdvcmsgb3V0cHV0cywgZ290ICR7Y29uZmlnLm5ldHdvcmtPdXRwdXRzLmxlbmd0aH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEJyaWRnZUNvbmZpZ3VyYXRpb24oQnJpZGdlVHlwZS5FR1JFU1NfQlJJREdFLCB1bmRlZmluZWQsIGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2JyaWRnZVR5cGU6IEJyaWRnZVR5cGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5ncmVzc0NvbmZpZz86IEluZ3Jlc3NCcmlkZ2VDb25maWd1cmF0aW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VncmVzc0NvbmZpZz86IEVncmVzc0JyaWRnZUNvbmZpZ3VyYXRpb24sXG4gICkge31cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJyaWRnZSBjb25maWd1cmF0aW9uIGlzIGJvdW5kIHRvIGEgQnJpZGdlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYmluZCgpOiB7IGJyaWRnZVR5cGU6IEJyaWRnZVR5cGU7IGluZ3Jlc3NDb25maWc/OiBJbmdyZXNzQnJpZGdlQ29uZmlndXJhdGlvbjsgZWdyZXNzQ29uZmlnPzogRWdyZXNzQnJpZGdlQ29uZmlndXJhdGlvbiB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgYnJpZGdlVHlwZTogdGhpcy5fYnJpZGdlVHlwZSxcbiAgICAgIGluZ3Jlc3NDb25maWc6IHRoaXMuX2luZ3Jlc3NDb25maWcsXG4gICAgICBlZ3Jlc3NDb25maWc6IHRoaXMuX2VncmVzc0NvbmZpZyxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIEJyaWRnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBicmlkZ2UuIENhbm5vdCBiZSBtb2RpZmllZCBhZnRlciB0aGUgYnJpZGdlIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0b2dlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgYnJpZGdlTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBicmlkZ2UgY29uZmlndXJhdGlvbiBzcGVjaWZ5aW5nIGluZ3Jlc3Mgb3IgZWdyZXNzIHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBCcmlkZ2VDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIGdhdGV3YXkgdGhhdCB0aGUgYnJpZGdlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICovXG4gIHJlYWRvbmx5IGdhdGV3YXk6IElHYXRld2F5O1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBmYWlsb3ZlciBjb25maWd1cmF0aW9uIGZvciB0aGUgYnJpZGdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGZhaWxvdmVyIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUZhaWxvdmVyQ29uZmlnPzogQnJpZGdlRmFpbG92ZXJDb25maWc7XG5cbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBpbXBvcnRpbmcgYW4gZXhpc3RpbmcgQnJpZGdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZUF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYnJpZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgYnJpZGdlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBicmlkZ2UuXG4gICAqXG4gICAqIE5vdCBlbmNvZGVkIGluIHRoZSBicmlkZ2UgQVJOLCBzbyBtdXN0IGJlIHByb3ZpZGVkIGV4cGxpY2l0bHkgaWYgdGhlIGltcG9ydGVkXG4gICAqIGJyaWRnZSBuZWVkcyB0byBleHBvc2UgYGJyaWRnZU5hbWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGJyaWRnZU5hbWUgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgaW1wb3J0ZWQgY29uc3RydWN0XG4gICAqL1xuICByZWFkb25seSBicmlkZ2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hhdCB0eXBlIG9mIGJyaWRnZSBpcyBpbXBvcnRlZC5cbiAgICpcbiAgICogTm90IGVuY29kZWQgaW4gdGhlIGJyaWRnZSBBUk4sIHNvIG11c3QgYmUgcHJvdmlkZWQgZXhwbGljaXRseSBpZiB0aGUgaW1wb3J0ZWRcbiAgICogYnJpZGdlIGlzIHVzZWQgd2l0aCBgYWRkT3V0cHV0KClgIG9yIG90aGVyIG1ldGhvZHMgdGhhdCBuZWVkIHRoZSBicmlkZ2UgdHlwZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBicmlkZ2VUeXBlIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGltcG9ydGVkIGNvbnN0cnVjdFxuICAgKi9cbiAgcmVhZG9ubHkgYnJpZGdlVHlwZT86IEJyaWRnZVR5cGU7XG5cbiAgLyoqXG4gICAqIEZhaWxvdmVyIENvbmZpZ3VyYXRpb24gZm9yIEJyaWRnZVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaXNGYWlsb3ZlckVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCcmlkZ2VCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJQnJpZGdlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBCcmlkZ2UgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCAoaW1wb3J0ZWQpIEJyaWRnZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUJyaWRnZUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IEJyaWRnZUF0dHJpYnV0ZXMpOiBJQnJpZGdlIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBCcmlkZ2VCYXNlIGltcGxlbWVudHMgSUJyaWRnZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYnJpZGdlQXJuID0gYXR0cnMuYnJpZGdlQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJyaWRnZVN0YXRlID0gdW5kZWZpbmVkO1xuXG4gICAgICBwdWJsaWMgZ2V0IGJyaWRnZU5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLmJyaWRnZU5hbWUpIHJldHVybiBhdHRycy5icmlkZ2VOYW1lO1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBCcmlkZ2VOYW1lTm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAnYnJpZGdlTmFtZScgd2FzIG5vdCBwcm92aWRlZCB3aGVuIGltcG9ydGluZyBCcmlkZ2UgJHt0aGlzLm5vZGUucGF0aH07IHByb3ZpZGUgaXQgaW4gZnJvbUJyaWRnZUF0dHJpYnV0ZXMoKWAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIGdldCBicmlkZ2VUeXBlKCk6IEJyaWRnZVR5cGUge1xuICAgICAgICBpZiAoYXR0cnMuYnJpZGdlVHlwZSkgcmV0dXJuIGF0dHJzLmJyaWRnZVR5cGU7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEJyaWRnZVR5cGVOb3RQcm92aWRlZGAsXG4gICAgICAgICAgYCdicmlkZ2VUeXBlJyB3YXMgbm90IHByb3ZpZGVkIHdoZW4gaW1wb3J0aW5nIEJyaWRnZSAke3RoaXMubm9kZS5wYXRofTsgcHJvdmlkZSBpdCBpbiBmcm9tQnJpZGdlQXR0cmlidXRlcygpYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJbXBvcnRlZCBicmlkZ2VzIGRlZmF1bHQgdG8gYGZhbHNlYC4gUGFzcyBgaXNGYWlsb3ZlckVuYWJsZWQ6IHRydWVgIGluIHRoZVxuICAgICAgLy8gYXR0cmlidXRlcyB3aGVuIHRoZSByZWFsIHNlcnZpY2Utc2lkZSBicmlkZ2UgaGFzIGZhaWxvdmVyIGVuYWJsZWQgYW5kIHlvdVxuICAgICAgLy8gbmVlZCB0byBhZGQgYSBCcmlkZ2VTb3VyY2UuXG4gICAgICBwdWJsaWMgaXNGYWlsb3ZlckVuYWJsZWQ/OiBib29sZWFuID0gYXR0cnMuaXNGYWlsb3ZlckVuYWJsZWQgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgQnJpZGdlIGZyb20gaXRzIEFSTi5cbiAgICpcbiAgICogVXNlIGBmcm9tQnJpZGdlQXR0cmlidXRlcygpYCBpbnN0ZWFkIGlmIHlvdSBuZWVkIGFjY2VzcyB0byBgYnJpZGdlTmFtZWAsIGBicmlkZ2VUeXBlYFxuICAgKiAocmVxdWlyZWQgZm9yIGBhZGRPdXRwdXQoKWApLCBvciBgaXNGYWlsb3ZlckVuYWJsZWRgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQnJpZGdlQXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGJyaWRnZUFybjogc3RyaW5nKTogSUJyaWRnZSB7XG4gICAgcmV0dXJuIEJyaWRnZS5mcm9tQnJpZGdlQXR0cmlidXRlcyhzY29wZSwgaWQsIHsgYnJpZGdlQXJuIH0pO1xuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJyaWRnZUFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYnJpZGdlTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYnJpZGdlVHlwZTogQnJpZGdlVHlwZTtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJyaWRnZVN0YXRlPzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaXNGYWlsb3ZlckVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKiBBIHJlZmVyZW5jZSB0byB0aGlzIEJyaWRnZSByZXNvdXJjZS4gKi9cbiAgcHVibGljIGdldCBicmlkZ2VSZWYoKTogQnJpZGdlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4geyBicmlkZ2VBcm46IHRoaXMuYnJpZGdlQXJuIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRoaXMgYnJpZGdlLlxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9NZWRpYUNvbm5lY3QnLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIEJyaWRnZUFSTjogdGhpcy5icmlkZ2VBcm4sXG4gICAgICAgIC4uLnByb3BzPy5kaW1lbnNpb25zTWFwLFxuICAgICAgfSxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBiaXRyYXRlIG9mIGEgc3BlY2lmaWMgYnJpZGdlIHNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNTb3VyY2VCaXRyYXRlKGJyaWRnZVNvdXJjZU5hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICBjb25zdCBtZXRyaWNOYW1lID0gdGhpcy5icmlkZ2VUeXBlLnZhbHVlID09PSBCcmlkZ2VUeXBlLkVHUkVTU19CUklER0UudmFsdWVcbiAgICAgID8gJ0VncmVzc0JyaWRnZVNvdXJjZUJpdFJhdGUnXG4gICAgICA6ICdJbmdyZXNzQnJpZGdlU291cmNlQml0UmF0ZSc7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9NZWRpYUNvbm5lY3QnLFxuICAgICAgc3RhdGlzdGljOiAnYXZnJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkJJVFNfUEVSX1NFQ09ORCxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBCcmlkZ2VBUk46IHRoaXMuYnJpZGdlQXJuLFxuICAgICAgICBCcmlkZ2VTb3VyY2VOYW1lOiBicmlkZ2VTb3VyY2VOYW1lLFxuICAgICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICAgIH0sXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcGVyY2VudGFnZSBvZiBwYWNrZXRzIGxvc3Qgb24gYSBzcGVjaWZpYyBicmlkZ2Ugc291cmNlLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZVBhY2tldExvc3NQZXJjZW50KGJyaWRnZVNvdXJjZU5hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICBjb25zdCBtZXRyaWNOYW1lID0gdGhpcy5icmlkZ2VUeXBlLnZhbHVlID09PSBCcmlkZ2VUeXBlLkVHUkVTU19CUklER0UudmFsdWVcbiAgICAgID8gJ0VncmVzc0JyaWRnZVNvdXJjZVBhY2tldExvc3NQZXJjZW50J1xuICAgICAgOiAnSW5ncmVzc0JyaWRnZVNvdXJjZVBhY2tldExvc3NQZXJjZW50JztcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgbmFtZXNwYWNlOiAnQVdTL01lZGlhQ29ubmVjdCcsXG4gICAgICBzdGF0aXN0aWM6ICdhdmcnLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuUEVSQ0VOVCxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBCcmlkZ2VBUk46IHRoaXMuYnJpZGdlQXJuLFxuICAgICAgICBCcmlkZ2VTb3VyY2VOYW1lOiBicmlkZ2VTb3VyY2VOYW1lLFxuICAgICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICAgIH0sXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBicmlkZ2Ugc3dpdGNoZXMgYmV0d2VlbiBzb3VyY2VzXG4gICAqIHdoZW4gdXNpbmcgdGhlIGBGQUlMT1ZFUmAgZmFpbG92ZXIgbW9kZS5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNGYWlsb3ZlclN3aXRjaGVzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgY29uc3QgbWV0cmljTmFtZSA9IHRoaXMuYnJpZGdlVHlwZS52YWx1ZSA9PT0gQnJpZGdlVHlwZS5FR1JFU1NfQlJJREdFLnZhbHVlXG4gICAgICA/ICdFZ3Jlc3NCcmlkZ2VGYWlsb3ZlclN3aXRjaGVzJ1xuICAgICAgOiAnSW5ncmVzc0JyaWRnZUZhaWxvdmVyU3dpdGNoZXMnO1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhtZXRyaWNOYW1lLCB7XG4gICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXR3b3JrIG91dHB1dCB0byB0aGlzIGJyaWRnZSAoZm9yIGVncmVzcyBicmlkZ2VzIG9ubHkpLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgQ29uc3RydWN0IGlkIGZvciB0aGUgbmV3IEJyaWRnZU91dHB1dFxuICAgKiBAcGFyYW0gbmV0d29ya091dHB1dCBUaGUgbmFtZWQgb3V0cHV0IHRvIGFkZC4gVGhlIGBuYW1lYCBpcyB0aGUgb3V0cHV0J3MgaWRlbnRpdHkgb24gdGhlIGJyaWRnZSBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmcgb3V0cHV0cy5cbiAgICovXG4gIHB1YmxpYyBhZGRPdXRwdXQoaWQ6IHN0cmluZywgbmV0d29ya091dHB1dDogQnJpZGdlTmV0d29ya091dHB1dCk6IElCcmlkZ2VPdXRwdXQge1xuICAgIGlmICh0aGlzLmJyaWRnZVR5cGUudmFsdWUgIT09IEJyaWRnZVR5cGUuRUdSRVNTX0JSSURHRS52YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEJyaWRnZUVncmVzc09ubHlgLFxuICAgICAgICBgYWRkT3V0cHV0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBlZ3Jlc3MgYnJpZGdlcywgZ290ICcke3RoaXMuYnJpZGdlVHlwZS52YWx1ZX0nYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBCcmlkZ2VPdXRwdXQodGhpcywgaWQsIHtcbiAgICAgIGJyaWRnZU91dHB1dE5hbWU6IG5ldHdvcmtPdXRwdXQubmFtZSxcbiAgICAgIGJyaWRnZTogdGhpcyxcbiAgICAgIG91dHB1dDogbmV0d29ya091dHB1dC5vdXRwdXQsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGEgQVdTIEVsZW1lbnRhbCBNZWRpYUNvbm5lY3QgQnJpZGdlXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBCcmlkZ2VCYXNlIGltcGxlbWVudHMgSUJyaWRnZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLW1lZGlhY29ubmVjdC1hbHBoYS5CcmlkZ2UnO1xuXG4gIHB1YmxpYyByZWFkb25seSBicmlkZ2VBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJyaWRnZU5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJyaWRnZVR5cGU6IEJyaWRnZVR5cGU7XG4gIHB1YmxpYyByZWFkb25seSBicmlkZ2VTdGF0ZT86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGlzRmFpbG92ZXJFbmFibGVkPzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCcmlkZ2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcz8uYnJpZGdlTmFtZSA/PyBMYXp5LnN0cmluZyh7IHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNjQgfSkgfSksXG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBicmlkZ2UgbmFtZSBpZiBwcm92aWRlZFxuICAgIGlmIChwcm9wcy5icmlkZ2VOYW1lICE9IG51bGwgJiYgcHJvcHMuYnJpZGdlTmFtZSAhPT0gJycgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5icmlkZ2VOYW1lKSkge1xuICAgICAgaWYgKHByb3BzLmJyaWRnZU5hbWUubGVuZ3RoID4gNjQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgQnJpZGdlTmFtZUxlbmd0aGAsIGBCcmlkZ2UgbmFtZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNjQgY2hhcmFjdGVycywgZ290ICR7cHJvcHMuYnJpZGdlTmFtZS5sZW5ndGh9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAoIS9eW2EtekEtWjAtOS1dKyQvLnRlc3QocHJvcHMuYnJpZGdlTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgQnJpZGdlTmFtZUZvcm1hdGAsIGBCcmlkZ2UgbmFtZSBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVucywgZ290ICcke3Byb3BzLmJyaWRnZU5hbWV9J2AsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5pc0ZhaWxvdmVyRW5hYmxlZCA9IHByb3BzLnNvdXJjZUZhaWxvdmVyQ29uZmlnPy5faXNFbmFibGVkID8/IGZhbHNlO1xuXG4gICAgY29uc3QgY29uZmlnID0gcHJvcHMuY29uZmlnO1xuICAgIGNvbnN0IGNvbmZpZ0JpbmQgPSBjb25maWcuX2JpbmQoKTtcbiAgICBjb25zdCBpbmdyZXNzID0gY29uZmlnQmluZC5pbmdyZXNzQ29uZmlnID8ge1xuICAgICAgaW5ncmVzc0dhdGV3YXlCcmlkZ2U6IHtcbiAgICAgICAgbWF4Qml0cmF0ZTogY29uZmlnQmluZC5pbmdyZXNzQ29uZmlnLm1heEJpdHJhdGUudG9CcHMoKSxcbiAgICAgICAgbWF4T3V0cHV0czogY29uZmlnQmluZC5pbmdyZXNzQ29uZmlnLm1heE91dHB1dHMsXG4gICAgICB9LFxuICAgICAgc291cmNlczogY29uZmlnQmluZC5pbmdyZXNzQ29uZmlnLm5ldHdvcmtTb3VyY2VzLm1hcChpbnB1dCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV0d29ya1NvdXJjZToge1xuICAgICAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgICAgIG11bHRpY2FzdElwOiBpbnB1dC5zb3VyY2UubXVsdGljYXN0SXAsXG4gICAgICAgICAgICBuZXR3b3JrTmFtZTogaW5wdXQuc291cmNlLm5ldHdvcmsubmFtZSxcbiAgICAgICAgICAgIHBvcnQ6IGlucHV0LnNvdXJjZS5wb3J0LFxuICAgICAgICAgICAgcHJvdG9jb2w6IGlucHV0LnNvdXJjZS5wcm90b2NvbC52YWx1ZSxcbiAgICAgICAgICAgIG11bHRpY2FzdFNvdXJjZVNldHRpbmdzOiB7XG4gICAgICAgICAgICAgIG11bHRpY2FzdFNvdXJjZUlwOiBpbnB1dC5zb3VyY2UubXVsdGljYXN0U291cmNlSXAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVncmVzcyA9IGNvbmZpZ0JpbmQuZWdyZXNzQ29uZmlnID8ge1xuICAgICAgZWdyZXNzR2F0ZXdheUJyaWRnZToge1xuICAgICAgICBtYXhCaXRyYXRlOiBjb25maWdCaW5kLmVncmVzc0NvbmZpZy5tYXhCaXRyYXRlLnRvQnBzKCksXG4gICAgICB9LFxuICAgICAgc291cmNlczogY29uZmlnQmluZC5lZ3Jlc3NDb25maWcuZmxvd1NvdXJjZXMubWFwKGlucHV0ID0+IHRoaXMuZm9ybWF0QnJpZGdlRmxvd1NvdXJjZShpbnB1dCkpLFxuICAgICAgb3V0cHV0czogY29uZmlnQmluZC5lZ3Jlc3NDb25maWcubmV0d29ya091dHB1dHMubWFwKG5vID0+ICh7XG4gICAgICAgIG5ldHdvcmtPdXRwdXQ6IHsgbmFtZTogbm8ubmFtZSwgLi4ubm8ub3V0cHV0Ll9iaW5kKCkgfSxcbiAgICAgIH0pKSxcbiAgICB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgYnJpZGdlID0gbmV3IENmbkJyaWRnZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIHBsYWNlbWVudEFybjogcHJvcHMuZ2F0ZXdheS5nYXRld2F5QXJuLFxuICAgICAgaW5ncmVzc0dhdGV3YXlCcmlkZ2U6IGluZ3Jlc3M/LmluZ3Jlc3NHYXRld2F5QnJpZGdlLFxuICAgICAgZWdyZXNzR2F0ZXdheUJyaWRnZTogZWdyZXNzPy5lZ3Jlc3NHYXRld2F5QnJpZGdlLFxuICAgICAgc291cmNlczogaW5ncmVzcz8uc291cmNlcyA/PyBlZ3Jlc3M/LnNvdXJjZXMgPz8gW10sXG4gICAgICBvdXRwdXRzOiBlZ3Jlc3M/Lm91dHB1dHMsXG4gICAgICBzb3VyY2VGYWlsb3ZlckNvbmZpZzogcHJvcHMuc291cmNlRmFpbG92ZXJDb25maWc/Ll9iaW5kKCksXG4gICAgfSk7XG5cbiAgICB0aGlzLmJyaWRnZUFybiA9IGJyaWRnZS5hdHRyQnJpZGdlQXJuO1xuICAgIHRoaXMuYnJpZGdlTmFtZSA9IHRoaXMucGh5c2ljYWxOYW1lO1xuICAgIHRoaXMuYnJpZGdlU3RhdGUgPSBicmlkZ2UuYXR0ckJyaWRnZVN0YXRlO1xuICAgIHRoaXMuYnJpZGdlVHlwZSA9IGNvbmZpZ0JpbmQuYnJpZGdlVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYnJpZGdlIGZsb3cgc291cmNlIGludG8gQnJpZGdlU291cmNlUHJvcGVydHkgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGZvcm1hdEJyaWRnZUZsb3dTb3VyY2UoaW5wdXQ6IEJyaWRnZUZsb3dJbnB1dCk6IENmbkJyaWRnZS5CcmlkZ2VTb3VyY2VQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZsb3dTb3VyY2U6IHtcbiAgICAgICAgZmxvd0FybjogaW5wdXQuc291cmNlLmZsb3cuZmxvd0FybixcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgZmxvd1ZwY0ludGVyZmFjZUF0dGFjaG1lbnQ6IGlucHV0LnNvdXJjZS52cGNJbnRlcmZhY2UgPyB7XG4gICAgICAgICAgdnBjSW50ZXJmYWNlTmFtZTogaW5wdXQuc291cmNlLnZwY0ludGVyZmFjZS5uYW1lLFxuICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iXX0=