@aws-cdk/aws-medialive-alpha 2.268.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/.jsii +60888 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +524 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +1297 -0
- package/grants.json +27 -0
- package/lib/audio-codec-settings.d.ts +901 -0
- package/lib/audio-codec-settings.js +1098 -0
- package/lib/audio-selector.d.ts +170 -0
- package/lib/audio-selector.js +306 -0
- package/lib/avail-settings.d.ts +231 -0
- package/lib/avail-settings.js +226 -0
- package/lib/caption-selector.d.ts +234 -0
- package/lib/caption-selector.js +413 -0
- package/lib/caption-settings.d.ts +349 -0
- package/lib/caption-settings.js +482 -0
- package/lib/channel-features.d.ts +106 -0
- package/lib/channel-features.js +85 -0
- package/lib/channel-placement-group.d.ts +73 -0
- package/lib/channel-placement-group.js +132 -0
- package/lib/channel.d.ts +687 -0
- package/lib/channel.js +1096 -0
- package/lib/cluster.d.ts +129 -0
- package/lib/cluster.js +158 -0
- package/lib/color-correction.d.ts +39 -0
- package/lib/color-correction.js +29 -0
- package/lib/destinations.d.ts +242 -0
- package/lib/destinations.js +455 -0
- package/lib/encode-configuration.d.ts +615 -0
- package/lib/encode-configuration.js +629 -0
- package/lib/enums.d.ts +698 -0
- package/lib/enums.js +1045 -0
- package/lib/file-location.d.ts +65 -0
- package/lib/file-location.js +150 -0
- package/lib/framerate.d.ts +31 -0
- package/lib/framerate.js +71 -0
- package/lib/index.d.ts +26 -0
- package/lib/index.js +43 -0
- package/lib/input-attachment.d.ts +319 -0
- package/lib/input-attachment.js +228 -0
- package/lib/input-security-group.d.ts +51 -0
- package/lib/input-security-group.js +123 -0
- package/lib/input-specification.d.ts +111 -0
- package/lib/input-specification.js +181 -0
- package/lib/input.d.ts +505 -0
- package/lib/input.js +803 -0
- package/lib/m2ts-settings.d.ts +421 -0
- package/lib/m2ts-settings.js +469 -0
- package/lib/m3u8-settings.d.ts +272 -0
- package/lib/m3u8-settings.js +304 -0
- package/lib/medialive-grants.generated.d.ts +30 -0
- package/lib/medialive-grants.generated.js +92 -0
- package/lib/network.d.ts +83 -0
- package/lib/network.js +132 -0
- package/lib/output-group.d.ts +924 -0
- package/lib/output-group.js +941 -0
- package/lib/outputs.d.ts +304 -0
- package/lib/outputs.js +598 -0
- package/lib/sdi-source.d.ts +124 -0
- package/lib/sdi-source.js +180 -0
- package/lib/shared.d.ts +44 -0
- package/lib/shared.js +146 -0
- package/lib/video-codec-settings.d.ts +1500 -0
- package/lib/video-codec-settings.js +1722 -0
- package/lib/video-selection.d.ts +92 -0
- package/lib/video-selection.js +95 -0
- package/package.json +135 -0
- package/rosetta/_generated.ts-fixture +6 -0
- package/rosetta/default.ts-fixture +21 -0
package/lib/channel.js
ADDED
|
@@ -0,0 +1,1096 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
3
|
+
var useValue = arguments.length > 2;
|
|
4
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
5
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
6
|
+
}
|
|
7
|
+
return useValue ? value : void 0;
|
|
8
|
+
};
|
|
9
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
10
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
11
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
12
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
13
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
14
|
+
var _, done = false;
|
|
15
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
16
|
+
var context = {};
|
|
17
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
18
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
19
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
20
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
21
|
+
if (kind === "accessor") {
|
|
22
|
+
if (result === void 0) continue;
|
|
23
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
24
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
25
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
26
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
27
|
+
}
|
|
28
|
+
else if (_ = accept(result)) {
|
|
29
|
+
if (kind === "field") initializers.unshift(_);
|
|
30
|
+
else descriptor[key] = _;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
34
|
+
done = true;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.Ac3CodingMode = exports.Ac3BitstreamMode = exports.Ac3AttenuationControl = exports.AacVbrQuality = exports.AacInputType = exports.AacSpec = exports.AacRawFormat = exports.AacRateControlMode = exports.AacCodingMode = exports.AacProfile = exports.AudioCodecSettings = exports.TimecodeBurninPosition = exports.TimecodeBurninFontSize = exports.H265SceneChangeDetect = exports.H264TemporalAq = exports.H264SpatialAq = exports.H264SceneChangeDetect = exports.Av1TimecodeInsertion = exports.Av1TemporalAq = exports.Av1SpatialAq = exports.Av1SceneChangeDetect = exports.Av1BitDepth = exports.H265TreeblockSize = exports.H265TilePadding = exports.H265MvTemporalPredictor = exports.H265MvOverPictureBoundaries = exports.H265Deblocking = exports.H265AlternativeTransferFunction = exports.H265AdaptiveQuantization = exports.H264QualityLevel = exports.H264Syntax = exports.H264ForceFieldPictures = exports.H264EntropyEncoding = exports.SubgopLength = exports.TimecodeInsertion = exports.LookAheadRateControl = exports.GopBReference = exports.FlickerAq = exports.ScanType = exports.ColorMetadata = exports.AfdSignaling = exports.Av1RateControl = exports.H265RateControl = exports.H265Tier = exports.H265Profile = exports.GopSize = exports.H264AdaptiveQuantization = exports.H264RateControl = exports.H264Profile = exports.VideoCodecSettings = void 0;
|
|
38
|
+
exports.Channel = exports.LinkedChannelSettings = exports.MaintenanceDay = exports.OutputLocking = exports.PipelineLockingMethod = exports.InputLossImageType = exports.OutputTimingSource = exports.InputEndAction = exports.TimecodeSource = exports.LogLevel = exports.ChannelClass = exports.Pipeline = exports.WavCodingMode = exports.Mp2CodingMode = exports.Eac3AtmosDrcRf = exports.Eac3AtmosDrcLine = exports.Eac3AtmosCodingMode = exports.Eac3SurroundMode = exports.Eac3SurroundExMode = exports.Eac3StereoDownmix = exports.Eac3PhaseControl = exports.Eac3PassthroughControl = exports.Eac3MetadataControl = exports.Eac3LfeFilter = exports.Eac3LfeControl = exports.Eac3DrcRf = exports.Eac3DrcLine = exports.Eac3DcFilter = exports.Eac3CodingMode = exports.Eac3BitstreamMode = exports.Eac3AttenuationControl = exports.Ac3MetadataControl = exports.Ac3LfeFilter = exports.Ac3DrcProfile = void 0;
|
|
39
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
40
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
41
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
42
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
43
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
44
|
+
const aws_medialive_1 = require("aws-cdk-lib/aws-medialive");
|
|
45
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
46
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
47
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
48
|
+
const avail_settings_1 = require("./avail-settings");
|
|
49
|
+
const channel_features_1 = require("./channel-features");
|
|
50
|
+
const input_1 = require("./input");
|
|
51
|
+
const input_attachment_1 = require("./input-attachment");
|
|
52
|
+
const input_specification_1 = require("./input-specification");
|
|
53
|
+
const medialive_grants_generated_1 = require("./medialive-grants.generated");
|
|
54
|
+
const output_group_1 = require("./output-group");
|
|
55
|
+
const shared_1 = require("./shared");
|
|
56
|
+
const video_codec_settings_1 = require("./video-codec-settings");
|
|
57
|
+
var video_codec_settings_2 = require("./video-codec-settings");
|
|
58
|
+
Object.defineProperty(exports, "VideoCodecSettings", { enumerable: true, get: function () { return video_codec_settings_2.VideoCodecSettings; } });
|
|
59
|
+
Object.defineProperty(exports, "H264Profile", { enumerable: true, get: function () { return video_codec_settings_2.H264Profile; } });
|
|
60
|
+
Object.defineProperty(exports, "H264RateControl", { enumerable: true, get: function () { return video_codec_settings_2.H264RateControl; } });
|
|
61
|
+
Object.defineProperty(exports, "H264AdaptiveQuantization", { enumerable: true, get: function () { return video_codec_settings_2.H264AdaptiveQuantization; } });
|
|
62
|
+
Object.defineProperty(exports, "GopSize", { enumerable: true, get: function () { return video_codec_settings_2.GopSize; } });
|
|
63
|
+
Object.defineProperty(exports, "H265Profile", { enumerable: true, get: function () { return video_codec_settings_2.H265Profile; } });
|
|
64
|
+
Object.defineProperty(exports, "H265Tier", { enumerable: true, get: function () { return video_codec_settings_2.H265Tier; } });
|
|
65
|
+
Object.defineProperty(exports, "H265RateControl", { enumerable: true, get: function () { return video_codec_settings_2.H265RateControl; } });
|
|
66
|
+
Object.defineProperty(exports, "Av1RateControl", { enumerable: true, get: function () { return video_codec_settings_2.Av1RateControl; } });
|
|
67
|
+
Object.defineProperty(exports, "AfdSignaling", { enumerable: true, get: function () { return video_codec_settings_2.AfdSignaling; } });
|
|
68
|
+
Object.defineProperty(exports, "ColorMetadata", { enumerable: true, get: function () { return video_codec_settings_2.ColorMetadata; } });
|
|
69
|
+
Object.defineProperty(exports, "ScanType", { enumerable: true, get: function () { return video_codec_settings_2.ScanType; } });
|
|
70
|
+
Object.defineProperty(exports, "FlickerAq", { enumerable: true, get: function () { return video_codec_settings_2.FlickerAq; } });
|
|
71
|
+
Object.defineProperty(exports, "GopBReference", { enumerable: true, get: function () { return video_codec_settings_2.GopBReference; } });
|
|
72
|
+
Object.defineProperty(exports, "LookAheadRateControl", { enumerable: true, get: function () { return video_codec_settings_2.LookAheadRateControl; } });
|
|
73
|
+
Object.defineProperty(exports, "TimecodeInsertion", { enumerable: true, get: function () { return video_codec_settings_2.TimecodeInsertion; } });
|
|
74
|
+
Object.defineProperty(exports, "SubgopLength", { enumerable: true, get: function () { return video_codec_settings_2.SubgopLength; } });
|
|
75
|
+
Object.defineProperty(exports, "H264EntropyEncoding", { enumerable: true, get: function () { return video_codec_settings_2.H264EntropyEncoding; } });
|
|
76
|
+
Object.defineProperty(exports, "H264ForceFieldPictures", { enumerable: true, get: function () { return video_codec_settings_2.H264ForceFieldPictures; } });
|
|
77
|
+
Object.defineProperty(exports, "H264Syntax", { enumerable: true, get: function () { return video_codec_settings_2.H264Syntax; } });
|
|
78
|
+
Object.defineProperty(exports, "H264QualityLevel", { enumerable: true, get: function () { return video_codec_settings_2.H264QualityLevel; } });
|
|
79
|
+
Object.defineProperty(exports, "H265AdaptiveQuantization", { enumerable: true, get: function () { return video_codec_settings_2.H265AdaptiveQuantization; } });
|
|
80
|
+
Object.defineProperty(exports, "H265AlternativeTransferFunction", { enumerable: true, get: function () { return video_codec_settings_2.H265AlternativeTransferFunction; } });
|
|
81
|
+
Object.defineProperty(exports, "H265Deblocking", { enumerable: true, get: function () { return video_codec_settings_2.H265Deblocking; } });
|
|
82
|
+
Object.defineProperty(exports, "H265MvOverPictureBoundaries", { enumerable: true, get: function () { return video_codec_settings_2.H265MvOverPictureBoundaries; } });
|
|
83
|
+
Object.defineProperty(exports, "H265MvTemporalPredictor", { enumerable: true, get: function () { return video_codec_settings_2.H265MvTemporalPredictor; } });
|
|
84
|
+
Object.defineProperty(exports, "H265TilePadding", { enumerable: true, get: function () { return video_codec_settings_2.H265TilePadding; } });
|
|
85
|
+
Object.defineProperty(exports, "H265TreeblockSize", { enumerable: true, get: function () { return video_codec_settings_2.H265TreeblockSize; } });
|
|
86
|
+
Object.defineProperty(exports, "Av1BitDepth", { enumerable: true, get: function () { return video_codec_settings_2.Av1BitDepth; } });
|
|
87
|
+
Object.defineProperty(exports, "Av1SceneChangeDetect", { enumerable: true, get: function () { return video_codec_settings_2.Av1SceneChangeDetect; } });
|
|
88
|
+
Object.defineProperty(exports, "Av1SpatialAq", { enumerable: true, get: function () { return video_codec_settings_2.Av1SpatialAq; } });
|
|
89
|
+
Object.defineProperty(exports, "Av1TemporalAq", { enumerable: true, get: function () { return video_codec_settings_2.Av1TemporalAq; } });
|
|
90
|
+
Object.defineProperty(exports, "Av1TimecodeInsertion", { enumerable: true, get: function () { return video_codec_settings_2.Av1TimecodeInsertion; } });
|
|
91
|
+
Object.defineProperty(exports, "H264SceneChangeDetect", { enumerable: true, get: function () { return video_codec_settings_2.H264SceneChangeDetect; } });
|
|
92
|
+
Object.defineProperty(exports, "H264SpatialAq", { enumerable: true, get: function () { return video_codec_settings_2.H264SpatialAq; } });
|
|
93
|
+
Object.defineProperty(exports, "H264TemporalAq", { enumerable: true, get: function () { return video_codec_settings_2.H264TemporalAq; } });
|
|
94
|
+
Object.defineProperty(exports, "H265SceneChangeDetect", { enumerable: true, get: function () { return video_codec_settings_2.H265SceneChangeDetect; } });
|
|
95
|
+
Object.defineProperty(exports, "TimecodeBurninFontSize", { enumerable: true, get: function () { return video_codec_settings_2.TimecodeBurninFontSize; } });
|
|
96
|
+
Object.defineProperty(exports, "TimecodeBurninPosition", { enumerable: true, get: function () { return video_codec_settings_2.TimecodeBurninPosition; } });
|
|
97
|
+
var audio_codec_settings_1 = require("./audio-codec-settings");
|
|
98
|
+
Object.defineProperty(exports, "AudioCodecSettings", { enumerable: true, get: function () { return audio_codec_settings_1.AudioCodecSettings; } });
|
|
99
|
+
Object.defineProperty(exports, "AacProfile", { enumerable: true, get: function () { return audio_codec_settings_1.AacProfile; } });
|
|
100
|
+
Object.defineProperty(exports, "AacCodingMode", { enumerable: true, get: function () { return audio_codec_settings_1.AacCodingMode; } });
|
|
101
|
+
Object.defineProperty(exports, "AacRateControlMode", { enumerable: true, get: function () { return audio_codec_settings_1.AacRateControlMode; } });
|
|
102
|
+
Object.defineProperty(exports, "AacRawFormat", { enumerable: true, get: function () { return audio_codec_settings_1.AacRawFormat; } });
|
|
103
|
+
Object.defineProperty(exports, "AacSpec", { enumerable: true, get: function () { return audio_codec_settings_1.AacSpec; } });
|
|
104
|
+
Object.defineProperty(exports, "AacInputType", { enumerable: true, get: function () { return audio_codec_settings_1.AacInputType; } });
|
|
105
|
+
Object.defineProperty(exports, "AacVbrQuality", { enumerable: true, get: function () { return audio_codec_settings_1.AacVbrQuality; } });
|
|
106
|
+
Object.defineProperty(exports, "Ac3AttenuationControl", { enumerable: true, get: function () { return audio_codec_settings_1.Ac3AttenuationControl; } });
|
|
107
|
+
Object.defineProperty(exports, "Ac3BitstreamMode", { enumerable: true, get: function () { return audio_codec_settings_1.Ac3BitstreamMode; } });
|
|
108
|
+
Object.defineProperty(exports, "Ac3CodingMode", { enumerable: true, get: function () { return audio_codec_settings_1.Ac3CodingMode; } });
|
|
109
|
+
Object.defineProperty(exports, "Ac3DrcProfile", { enumerable: true, get: function () { return audio_codec_settings_1.Ac3DrcProfile; } });
|
|
110
|
+
Object.defineProperty(exports, "Ac3LfeFilter", { enumerable: true, get: function () { return audio_codec_settings_1.Ac3LfeFilter; } });
|
|
111
|
+
Object.defineProperty(exports, "Ac3MetadataControl", { enumerable: true, get: function () { return audio_codec_settings_1.Ac3MetadataControl; } });
|
|
112
|
+
Object.defineProperty(exports, "Eac3AttenuationControl", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3AttenuationControl; } });
|
|
113
|
+
Object.defineProperty(exports, "Eac3BitstreamMode", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3BitstreamMode; } });
|
|
114
|
+
Object.defineProperty(exports, "Eac3CodingMode", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3CodingMode; } });
|
|
115
|
+
Object.defineProperty(exports, "Eac3DcFilter", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3DcFilter; } });
|
|
116
|
+
Object.defineProperty(exports, "Eac3DrcLine", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3DrcLine; } });
|
|
117
|
+
Object.defineProperty(exports, "Eac3DrcRf", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3DrcRf; } });
|
|
118
|
+
Object.defineProperty(exports, "Eac3LfeControl", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3LfeControl; } });
|
|
119
|
+
Object.defineProperty(exports, "Eac3LfeFilter", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3LfeFilter; } });
|
|
120
|
+
Object.defineProperty(exports, "Eac3MetadataControl", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3MetadataControl; } });
|
|
121
|
+
Object.defineProperty(exports, "Eac3PassthroughControl", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3PassthroughControl; } });
|
|
122
|
+
Object.defineProperty(exports, "Eac3PhaseControl", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3PhaseControl; } });
|
|
123
|
+
Object.defineProperty(exports, "Eac3StereoDownmix", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3StereoDownmix; } });
|
|
124
|
+
Object.defineProperty(exports, "Eac3SurroundExMode", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3SurroundExMode; } });
|
|
125
|
+
Object.defineProperty(exports, "Eac3SurroundMode", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3SurroundMode; } });
|
|
126
|
+
Object.defineProperty(exports, "Eac3AtmosCodingMode", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3AtmosCodingMode; } });
|
|
127
|
+
Object.defineProperty(exports, "Eac3AtmosDrcLine", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3AtmosDrcLine; } });
|
|
128
|
+
Object.defineProperty(exports, "Eac3AtmosDrcRf", { enumerable: true, get: function () { return audio_codec_settings_1.Eac3AtmosDrcRf; } });
|
|
129
|
+
Object.defineProperty(exports, "Mp2CodingMode", { enumerable: true, get: function () { return audio_codec_settings_1.Mp2CodingMode; } });
|
|
130
|
+
Object.defineProperty(exports, "WavCodingMode", { enumerable: true, get: function () { return audio_codec_settings_1.WavCodingMode; } });
|
|
131
|
+
/**
|
|
132
|
+
* MediaLive pipeline (channel pipeline 0 or 1).
|
|
133
|
+
*
|
|
134
|
+
* `STANDARD` channels run two redundant pipelines (`PIPELINE_0`, `PIPELINE_1`).
|
|
135
|
+
* `SINGLE_PIPELINE` channels run only `PIPELINE_0`.
|
|
136
|
+
*/
|
|
137
|
+
class Pipeline {
|
|
138
|
+
value;
|
|
139
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.Pipeline", version: "2.268.0-alpha.0" };
|
|
140
|
+
/** Pipeline 0. Always available on every channel. */
|
|
141
|
+
static PIPELINE_0 = new Pipeline('0');
|
|
142
|
+
/** Pipeline 1. Available only on `STANDARD` channels. */
|
|
143
|
+
static PIPELINE_1 = new Pipeline('1');
|
|
144
|
+
constructor(value) {
|
|
145
|
+
this.value = value;
|
|
146
|
+
}
|
|
147
|
+
/** Returns the CloudWatch dimension value for this pipeline (`'0'` or `'1'`). */
|
|
148
|
+
toString() {
|
|
149
|
+
return this.value;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.Pipeline = Pipeline;
|
|
153
|
+
/**
|
|
154
|
+
* The class of the channel. Determines the pipeline redundancy.
|
|
155
|
+
*/
|
|
156
|
+
class ChannelClass {
|
|
157
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.ChannelClass", version: "2.268.0-alpha.0" };
|
|
158
|
+
/** Single pipeline — no redundancy */
|
|
159
|
+
static SINGLE_PIPELINE = new ChannelClass('SINGLE_PIPELINE');
|
|
160
|
+
/** Standard — two pipelines for redundancy */
|
|
161
|
+
static STANDARD = new ChannelClass('STANDARD');
|
|
162
|
+
/** A value not yet modelled by AWS CDK. */
|
|
163
|
+
static of(value) {
|
|
164
|
+
return new ChannelClass(value);
|
|
165
|
+
}
|
|
166
|
+
/** The underlying string value passed to CloudFormation. */
|
|
167
|
+
value;
|
|
168
|
+
constructor(value) {
|
|
169
|
+
this.value = value;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.ChannelClass = ChannelClass;
|
|
173
|
+
/**
|
|
174
|
+
* The log level for the channel.
|
|
175
|
+
*/
|
|
176
|
+
class LogLevel {
|
|
177
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.LogLevel", version: "2.268.0-alpha.0" };
|
|
178
|
+
/** Log errors only */
|
|
179
|
+
static ERROR = new LogLevel('ERROR');
|
|
180
|
+
/** Log warnings and errors */
|
|
181
|
+
static WARNING = new LogLevel('WARNING');
|
|
182
|
+
/** Log info, warnings, and errors */
|
|
183
|
+
static INFO = new LogLevel('INFO');
|
|
184
|
+
/** Log everything */
|
|
185
|
+
static DEBUG = new LogLevel('DEBUG');
|
|
186
|
+
/** Disable logging */
|
|
187
|
+
static DISABLED = new LogLevel('DISABLED');
|
|
188
|
+
/** A value not yet modelled by AWS CDK. */
|
|
189
|
+
static of(value) {
|
|
190
|
+
return new LogLevel(value);
|
|
191
|
+
}
|
|
192
|
+
/** The underlying string value passed to CloudFormation. */
|
|
193
|
+
value;
|
|
194
|
+
constructor(value) {
|
|
195
|
+
this.value = value;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
exports.LogLevel = LogLevel;
|
|
199
|
+
/**
|
|
200
|
+
* The source of timecode for the channel outputs.
|
|
201
|
+
*/
|
|
202
|
+
class TimecodeSource {
|
|
203
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.TimecodeSource", version: "2.268.0-alpha.0" };
|
|
204
|
+
/** Use embedded timecode from the source. Falls back to zero-based if not detected. */
|
|
205
|
+
static EMBEDDED = new TimecodeSource('EMBEDDED');
|
|
206
|
+
/** Use the system clock (UTC). */
|
|
207
|
+
static SYSTEMCLOCK = new TimecodeSource('SYSTEMCLOCK');
|
|
208
|
+
/** Start at 00:00:00:00. */
|
|
209
|
+
static ZEROBASED = new TimecodeSource('ZEROBASED');
|
|
210
|
+
/** A value not yet modelled by AWS CDK. */
|
|
211
|
+
static of(value) {
|
|
212
|
+
return new TimecodeSource(value);
|
|
213
|
+
}
|
|
214
|
+
/** The underlying string value passed to CloudFormation. */
|
|
215
|
+
value;
|
|
216
|
+
constructor(value) {
|
|
217
|
+
this.value = value;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
exports.TimecodeSource = TimecodeSource;
|
|
221
|
+
/**
|
|
222
|
+
* Action to take when the current input completes.
|
|
223
|
+
*/
|
|
224
|
+
class InputEndAction {
|
|
225
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.InputEndAction", version: "2.268.0-alpha.0" };
|
|
226
|
+
/** Restart at the beginning of the first input */
|
|
227
|
+
static SWITCH_AND_LOOP_INPUTS = new InputEndAction('SWITCH_AND_LOOP_INPUTS');
|
|
228
|
+
/** Do nothing — show slate or black until next input switch */
|
|
229
|
+
static NONE = new InputEndAction('NONE');
|
|
230
|
+
/** A value not yet modelled by AWS CDK. */
|
|
231
|
+
static of(value) {
|
|
232
|
+
return new InputEndAction(value);
|
|
233
|
+
}
|
|
234
|
+
/** The underlying string value passed to CloudFormation. */
|
|
235
|
+
value;
|
|
236
|
+
constructor(value) {
|
|
237
|
+
this.value = value;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
exports.InputEndAction = InputEndAction;
|
|
241
|
+
/**
|
|
242
|
+
* How MediaLive pipelines are synchronised. The legacy wire selector; the L2 derives it from
|
|
243
|
+
* the `OutputLocking` configuration.
|
|
244
|
+
*
|
|
245
|
+
* @see https://docs.aws.amazon.com/medialive/latest/ug/plan-redundancy-mode.html
|
|
246
|
+
* @see https://docs.aws.amazon.com/medialive/latest/ug/pipeline-lock.html
|
|
247
|
+
*/
|
|
248
|
+
var OutputLockingMode;
|
|
249
|
+
(function (OutputLockingMode) {
|
|
250
|
+
/** Synchronise pipelines to each other */
|
|
251
|
+
OutputLockingMode["PIPELINE_LOCKING"] = "PIPELINE_LOCKING";
|
|
252
|
+
/** Synchronise pipelines to the Unix epoch */
|
|
253
|
+
OutputLockingMode["EPOCH_LOCKING"] = "EPOCH_LOCKING";
|
|
254
|
+
})(OutputLockingMode || (OutputLockingMode = {}));
|
|
255
|
+
/**
|
|
256
|
+
* Source of output timing.
|
|
257
|
+
*/
|
|
258
|
+
class OutputTimingSource {
|
|
259
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.OutputTimingSource", version: "2.268.0-alpha.0" };
|
|
260
|
+
/** Use the input clock */
|
|
261
|
+
static INPUT_CLOCK = new OutputTimingSource('INPUT_CLOCK');
|
|
262
|
+
/** Use the system clock */
|
|
263
|
+
static SYSTEM_CLOCK = new OutputTimingSource('SYSTEM_CLOCK');
|
|
264
|
+
/** A value not yet modelled by AWS CDK. */
|
|
265
|
+
static of(value) {
|
|
266
|
+
return new OutputTimingSource(value);
|
|
267
|
+
}
|
|
268
|
+
/** The underlying string value passed to CloudFormation. */
|
|
269
|
+
value;
|
|
270
|
+
constructor(value) {
|
|
271
|
+
this.value = value;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
exports.OutputTimingSource = OutputTimingSource;
|
|
275
|
+
/** The image MediaLive substitutes into the output on input loss. */
|
|
276
|
+
class InputLossImageType {
|
|
277
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.InputLossImageType", version: "2.268.0-alpha.0" };
|
|
278
|
+
/** Substitute a solid color. */
|
|
279
|
+
static COLOR = new InputLossImageType('COLOR');
|
|
280
|
+
/** Substitute a slate image. */
|
|
281
|
+
static SLATE = new InputLossImageType('SLATE');
|
|
282
|
+
/** A value not yet modelled by AWS CDK. */
|
|
283
|
+
static of(value) {
|
|
284
|
+
return new InputLossImageType(value);
|
|
285
|
+
}
|
|
286
|
+
/** The underlying string value passed to CloudFormation. */
|
|
287
|
+
value;
|
|
288
|
+
constructor(value) {
|
|
289
|
+
this.value = value;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
exports.InputLossImageType = InputLossImageType;
|
|
293
|
+
/** The method MediaLive uses to synchronise pipelines for pipeline output locking. */
|
|
294
|
+
class PipelineLockingMethod {
|
|
295
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.PipelineLockingMethod", version: "2.268.0-alpha.0" };
|
|
296
|
+
/** Use the timecode in the source (the default). Requires reliable embedded timecodes. */
|
|
297
|
+
static SOURCE_TIMECODE = new PipelineLockingMethod('SOURCE_TIMECODE');
|
|
298
|
+
/**
|
|
299
|
+
* Lock frames the encoder identifies as having matching content (visual signature comparison).
|
|
300
|
+
* Does not require embedded timecodes; existing timecodes are ignored for locking decisions.
|
|
301
|
+
*/
|
|
302
|
+
static VIDEO_ALIGNMENT = new PipelineLockingMethod('VIDEO_ALIGNMENT');
|
|
303
|
+
/** A value not yet modelled by AWS CDK. */
|
|
304
|
+
static of(value) {
|
|
305
|
+
return new PipelineLockingMethod(value);
|
|
306
|
+
}
|
|
307
|
+
/** The underlying string value passed to CloudFormation. */
|
|
308
|
+
value;
|
|
309
|
+
constructor(value) {
|
|
310
|
+
this.value = value;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
exports.PipelineLockingMethod = PipelineLockingMethod;
|
|
314
|
+
/**
|
|
315
|
+
* Output locking synchronises the frames emitted by a channel's two pipelines. Use the static
|
|
316
|
+
* factory methods to select a strategy:
|
|
317
|
+
*
|
|
318
|
+
* - `OutputLocking.pipeline()` — synchronise each pipeline's output to the other.
|
|
319
|
+
* - `OutputLocking.epoch()` — synchronise each pipeline's output to the Unix epoch.
|
|
320
|
+
* - `OutputLocking.disabled()` — do not synchronise pipelines.
|
|
321
|
+
*
|
|
322
|
+
* @see https://docs.aws.amazon.com/medialive/latest/ug/plan-redundancy-mode.html
|
|
323
|
+
* @see https://docs.aws.amazon.com/medialive/latest/ug/pipeline-lock.html
|
|
324
|
+
*/
|
|
325
|
+
class OutputLocking {
|
|
326
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.OutputLocking", version: "2.268.0-alpha.0" };
|
|
327
|
+
/** Disable output locking (optionally with a custom epoch). */
|
|
328
|
+
static disabled(customEpoch) {
|
|
329
|
+
return new DisabledOutputLocking(customEpoch);
|
|
330
|
+
}
|
|
331
|
+
/** Lock outputs to an epoch. */
|
|
332
|
+
static epoch(props = {}) {
|
|
333
|
+
try {
|
|
334
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_EpochOutputLockingProps(props);
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
338
|
+
Error.captureStackTrace(error, this.epoch);
|
|
339
|
+
}
|
|
340
|
+
throw error;
|
|
341
|
+
}
|
|
342
|
+
return new EpochOutputLocking(props);
|
|
343
|
+
}
|
|
344
|
+
/** Lock pipelines to each other. */
|
|
345
|
+
static pipeline(props = {}) {
|
|
346
|
+
try {
|
|
347
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_PipelineOutputLockingProps(props);
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
351
|
+
Error.captureStackTrace(error, this.pipeline);
|
|
352
|
+
}
|
|
353
|
+
throw error;
|
|
354
|
+
}
|
|
355
|
+
return new PipelineOutputLocking(props);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
exports.OutputLocking = OutputLocking;
|
|
359
|
+
/** @internal */
|
|
360
|
+
class DisabledOutputLocking extends OutputLocking {
|
|
361
|
+
customEpoch;
|
|
362
|
+
constructor(customEpoch) {
|
|
363
|
+
super();
|
|
364
|
+
this.customEpoch = customEpoch;
|
|
365
|
+
}
|
|
366
|
+
_bind() {
|
|
367
|
+
return { disabledLockingSettings: { customEpoch: this.customEpoch } };
|
|
368
|
+
}
|
|
369
|
+
_mode() {
|
|
370
|
+
return undefined;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
/** @internal */
|
|
374
|
+
class EpochOutputLocking extends OutputLocking {
|
|
375
|
+
props;
|
|
376
|
+
constructor(props) {
|
|
377
|
+
super();
|
|
378
|
+
this.props = props;
|
|
379
|
+
}
|
|
380
|
+
_bind() {
|
|
381
|
+
return { epochLockingSettings: { customEpoch: this.props.customEpoch, jamSyncTime: this.props.jamSyncTime } };
|
|
382
|
+
}
|
|
383
|
+
_mode() {
|
|
384
|
+
return OutputLockingMode.EPOCH_LOCKING;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
/** @internal */
|
|
388
|
+
class PipelineOutputLocking extends OutputLocking {
|
|
389
|
+
props;
|
|
390
|
+
constructor(props) {
|
|
391
|
+
super();
|
|
392
|
+
this.props = props;
|
|
393
|
+
}
|
|
394
|
+
_bind() {
|
|
395
|
+
return { pipelineLockingSettings: { customEpoch: this.props.customEpoch, pipelineLockingMethod: this.props.method?.value } };
|
|
396
|
+
}
|
|
397
|
+
_mode() {
|
|
398
|
+
return OutputLockingMode.PIPELINE_LOCKING;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Day of the week for maintenance.
|
|
403
|
+
*/
|
|
404
|
+
class MaintenanceDay {
|
|
405
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.MaintenanceDay", version: "2.268.0-alpha.0" };
|
|
406
|
+
/** Monday */
|
|
407
|
+
static MONDAY = new MaintenanceDay('MONDAY');
|
|
408
|
+
/** Tuesday */
|
|
409
|
+
static TUESDAY = new MaintenanceDay('TUESDAY');
|
|
410
|
+
/** Wednesday */
|
|
411
|
+
static WEDNESDAY = new MaintenanceDay('WEDNESDAY');
|
|
412
|
+
/** Thursday */
|
|
413
|
+
static THURSDAY = new MaintenanceDay('THURSDAY');
|
|
414
|
+
/** Friday */
|
|
415
|
+
static FRIDAY = new MaintenanceDay('FRIDAY');
|
|
416
|
+
/** Saturday */
|
|
417
|
+
static SATURDAY = new MaintenanceDay('SATURDAY');
|
|
418
|
+
/** Sunday */
|
|
419
|
+
static SUNDAY = new MaintenanceDay('SUNDAY');
|
|
420
|
+
/** A value not yet modelled by AWS CDK. */
|
|
421
|
+
static of(value) {
|
|
422
|
+
return new MaintenanceDay(value);
|
|
423
|
+
}
|
|
424
|
+
/** The underlying string value passed to CloudFormation. */
|
|
425
|
+
value;
|
|
426
|
+
constructor(value) {
|
|
427
|
+
this.value = value;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
exports.MaintenanceDay = MaintenanceDay;
|
|
431
|
+
/**
|
|
432
|
+
* Linked channel type.
|
|
433
|
+
*/
|
|
434
|
+
var LinkedChannelType;
|
|
435
|
+
(function (LinkedChannelType) {
|
|
436
|
+
/** This channel is the primary */
|
|
437
|
+
LinkedChannelType["PRIMARY"] = "PRIMARY_CHANNEL";
|
|
438
|
+
/** This channel follows a primary */
|
|
439
|
+
LinkedChannelType["FOLLOWER"] = "FOLLOWING_CHANNEL";
|
|
440
|
+
})(LinkedChannelType || (LinkedChannelType = {}));
|
|
441
|
+
/**
|
|
442
|
+
* Linked channel settings for primary/follower channel configurations.
|
|
443
|
+
* Use the static factory methods to create.
|
|
444
|
+
*/
|
|
445
|
+
class LinkedChannelSettings {
|
|
446
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.LinkedChannelSettings", version: "2.268.0-alpha.0" };
|
|
447
|
+
/**
|
|
448
|
+
* Configure this channel as a primary in a linked channel pair.
|
|
449
|
+
*/
|
|
450
|
+
static primary() {
|
|
451
|
+
return new PrimaryLinkedChannelSettings();
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Configure this channel as a follower of a primary channel.
|
|
455
|
+
*
|
|
456
|
+
* @param primaryChannel The primary channel this channel follows. Use a `Channel`
|
|
457
|
+
* instance or import one with `Channel.fromChannelArn()`.
|
|
458
|
+
*/
|
|
459
|
+
static follower(primaryChannel) {
|
|
460
|
+
try {
|
|
461
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_IChannel(primaryChannel);
|
|
462
|
+
}
|
|
463
|
+
catch (error) {
|
|
464
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
465
|
+
Error.captureStackTrace(error, this.follower);
|
|
466
|
+
}
|
|
467
|
+
throw error;
|
|
468
|
+
}
|
|
469
|
+
return new FollowerLinkedChannelSettings(primaryChannel);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
exports.LinkedChannelSettings = LinkedChannelSettings;
|
|
473
|
+
/** @internal */
|
|
474
|
+
class PrimaryLinkedChannelSettings extends LinkedChannelSettings {
|
|
475
|
+
_bind() {
|
|
476
|
+
return {
|
|
477
|
+
primaryChannelSettings: {
|
|
478
|
+
linkedChannelType: LinkedChannelType.PRIMARY,
|
|
479
|
+
},
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
/** @internal */
|
|
484
|
+
class FollowerLinkedChannelSettings extends LinkedChannelSettings {
|
|
485
|
+
primaryChannel;
|
|
486
|
+
constructor(primaryChannel) {
|
|
487
|
+
super();
|
|
488
|
+
this.primaryChannel = primaryChannel;
|
|
489
|
+
}
|
|
490
|
+
_bind() {
|
|
491
|
+
return {
|
|
492
|
+
followerChannelSettings: {
|
|
493
|
+
linkedChannelType: LinkedChannelType.FOLLOWER,
|
|
494
|
+
primaryChannelArn: this.primaryChannel.channelArn,
|
|
495
|
+
},
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Shared metric implementation for both real and imported channels.
|
|
501
|
+
*/
|
|
502
|
+
class ChannelBase extends aws_cdk_lib_1.Resource {
|
|
503
|
+
/** Collection of grant methods for this channel — start, stop, and update its schedule. */
|
|
504
|
+
grants = medialive_grants_generated_1.ChannelGrants.fromChannel(this);
|
|
505
|
+
metric(metricName, pipeline, props) {
|
|
506
|
+
if (pipeline === Pipeline.PIPELINE_1 && this._channelClass?.value === ChannelClass.SINGLE_PIPELINE.value) {
|
|
507
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `SinglePipelineChannelHasNoPipelineOne`, 'Pipeline.PIPELINE_1 is not available on SINGLE_PIPELINE channels. Use Pipeline.PIPELINE_0, or set channelClass: ChannelClass.STANDARD', this);
|
|
508
|
+
}
|
|
509
|
+
return new aws_cloudwatch_1.Metric({
|
|
510
|
+
metricName,
|
|
511
|
+
namespace: 'AWS/MediaLive',
|
|
512
|
+
...props,
|
|
513
|
+
// Required dimensions applied last so a caller's dimensionsMap can't drop ChannelId/Pipeline.
|
|
514
|
+
dimensionsMap: { ...props?.dimensionsMap, ChannelId: this.channelId, Pipeline: pipeline.toString() },
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
metricActiveAlerts(pipeline, props) {
|
|
518
|
+
return this.metric('ActiveAlerts', pipeline, { statistic: 'max', ...props });
|
|
519
|
+
}
|
|
520
|
+
metricNetworkIn(pipeline, props) {
|
|
521
|
+
return this.metric('NetworkIn', pipeline, { statistic: 'avg', ...props });
|
|
522
|
+
}
|
|
523
|
+
metricNetworkOut(pipeline, props) {
|
|
524
|
+
return this.metric('NetworkOut', pipeline, { statistic: 'avg', ...props });
|
|
525
|
+
}
|
|
526
|
+
metricInputVideoFrameRate(pipeline, props) {
|
|
527
|
+
return this.metric('InputVideoFrameRate', pipeline, { statistic: 'max', ...props });
|
|
528
|
+
}
|
|
529
|
+
metricFillMsec(pipeline, props) {
|
|
530
|
+
return this.metric('FillMsec', pipeline, { statistic: 'max', ...props });
|
|
531
|
+
}
|
|
532
|
+
metricInputLossSeconds(pipeline, props) {
|
|
533
|
+
return this.metric('InputLossSeconds', pipeline, { statistic: 'sum', ...props });
|
|
534
|
+
}
|
|
535
|
+
metricDroppedFrames(pipeline, props) {
|
|
536
|
+
return this.metric('DroppedFrames', pipeline, { statistic: 'sum', ...props });
|
|
537
|
+
}
|
|
538
|
+
metricSvqTime(pipeline, props) {
|
|
539
|
+
return this.metric('SvqTime', pipeline, { statistic: 'max', ...props });
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Defines an AWS Elemental MediaLive Channel.
|
|
544
|
+
*/
|
|
545
|
+
let Channel = (() => {
|
|
546
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
547
|
+
let _classDescriptor;
|
|
548
|
+
let _classExtraInitializers = [];
|
|
549
|
+
let _classThis;
|
|
550
|
+
let _classSuper = ChannelBase;
|
|
551
|
+
let _instanceExtraInitializers = [];
|
|
552
|
+
let _addInput_decorators;
|
|
553
|
+
let _addOutputGroup_decorators;
|
|
554
|
+
var Channel = class extends _classSuper {
|
|
555
|
+
static { _classThis = this; }
|
|
556
|
+
static {
|
|
557
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
558
|
+
_addInput_decorators = [(0, metadata_resource_1.MethodMetadata)()];
|
|
559
|
+
_addOutputGroup_decorators = [(0, metadata_resource_1.MethodMetadata)()];
|
|
560
|
+
__esDecorate(this, null, _addInput_decorators, { kind: "method", name: "addInput", static: false, private: false, access: { has: obj => "addInput" in obj, get: obj => obj.addInput }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
561
|
+
__esDecorate(this, null, _addOutputGroup_decorators, { kind: "method", name: "addOutputGroup", static: false, private: false, access: { has: obj => "addOutputGroup" in obj, get: obj => obj.addOutputGroup }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
562
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
563
|
+
Channel = _classThis = _classDescriptor.value;
|
|
564
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
565
|
+
}
|
|
566
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.Channel", version: "2.268.0-alpha.0" };
|
|
567
|
+
/** Uniquely identifies this class. */
|
|
568
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-medialive-alpha.Channel';
|
|
569
|
+
/** Import an existing channel by its ARN. The id is parsed out of the ARN. */
|
|
570
|
+
static fromChannelArn(scope, id, channelArn) {
|
|
571
|
+
const channelId = (0, shared_1.extractResourceId)(channelArn, 'Channel');
|
|
572
|
+
class Import extends ChannelBase {
|
|
573
|
+
channelArn = channelArn;
|
|
574
|
+
channelId = channelId;
|
|
575
|
+
channelInputs = undefined;
|
|
576
|
+
get channelRef() {
|
|
577
|
+
return { channelId: this.channelId, channelArn: this.channelArn };
|
|
578
|
+
}
|
|
579
|
+
// Imported channels are not validated against PIPELINE_1 use because we
|
|
580
|
+
// cannot know how the channel was provisioned.
|
|
581
|
+
_channelClass = undefined;
|
|
582
|
+
}
|
|
583
|
+
return new Import(scope, id);
|
|
584
|
+
}
|
|
585
|
+
channelArn = __runInitializers(this, _instanceExtraInitializers);
|
|
586
|
+
channelId;
|
|
587
|
+
channelInputs;
|
|
588
|
+
/** The IAM role used by this channel. */
|
|
589
|
+
role;
|
|
590
|
+
/** A reference to this Channel resource. */
|
|
591
|
+
get channelRef() {
|
|
592
|
+
return { channelId: this.channelId, channelArn: this.channelArn };
|
|
593
|
+
}
|
|
594
|
+
/** @internal */
|
|
595
|
+
_channelClass;
|
|
596
|
+
inputAttachments = [];
|
|
597
|
+
attachments = [];
|
|
598
|
+
hasAnywhereSettings;
|
|
599
|
+
outputGroups = [];
|
|
600
|
+
/**
|
|
601
|
+
* Whether the caller supplied their own `role`. When true, the channel makes no automatic
|
|
602
|
+
* grants.
|
|
603
|
+
*/
|
|
604
|
+
userProvidedRole;
|
|
605
|
+
usesEpochLocking;
|
|
606
|
+
constructor(scope, id, props) {
|
|
607
|
+
super(scope, id, {
|
|
608
|
+
physicalName: props.channelName ?? aws_cdk_lib_1.Lazy.string({ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 256 }) }),
|
|
609
|
+
});
|
|
610
|
+
try {
|
|
611
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_ChannelProps(props);
|
|
612
|
+
}
|
|
613
|
+
catch (error) {
|
|
614
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
615
|
+
Error.captureStackTrace(error, Channel);
|
|
616
|
+
}
|
|
617
|
+
throw error;
|
|
618
|
+
}
|
|
619
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
620
|
+
if (props.inputs.length < 1) {
|
|
621
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `ChannelMinInputs`, 'A channel must have at least one input.', this);
|
|
622
|
+
}
|
|
623
|
+
if (props.outputGroups.length < 1) {
|
|
624
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `ChannelMinOutputGroups`, 'A channel must have at least one output group.', this);
|
|
625
|
+
}
|
|
626
|
+
props.inputs.forEach(attachment => {
|
|
627
|
+
this.attachments.push(attachment);
|
|
628
|
+
this.inputAttachments.push(this.buildInputAttachment(attachment));
|
|
629
|
+
});
|
|
630
|
+
const usesEpochLocking = props.globalConfiguration?.outputLocking?._mode() === OutputLockingMode.EPOCH_LOCKING;
|
|
631
|
+
props.outputGroups.forEach(config => {
|
|
632
|
+
const outputGroup = new output_group_1.OutputGroup(config);
|
|
633
|
+
if (usesEpochLocking) {
|
|
634
|
+
outputGroup._setEpochLocking(true);
|
|
635
|
+
}
|
|
636
|
+
this.outputGroups.push(outputGroup);
|
|
637
|
+
});
|
|
638
|
+
// A channel may have at most one MediaConnect Router output group. Detected by output-group
|
|
639
|
+
// settings shape rather than an `instanceof` check, per this module's static-type-check
|
|
640
|
+
// convention.
|
|
641
|
+
const mediaConnectRouterGroupCount = props.outputGroups
|
|
642
|
+
.filter(config => config._bind().mediaConnectRouterGroupSettings !== undefined)
|
|
643
|
+
.length;
|
|
644
|
+
if (mediaConnectRouterGroupCount > 1) {
|
|
645
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `MultipleMediaConnectRouterGroups`, `A channel may have at most one MediaConnect Router output group, but ${mediaConnectRouterGroupCount} were provided.`, this);
|
|
646
|
+
}
|
|
647
|
+
const resolvedChannelClass = props.channelClass ?? ChannelClass.SINGLE_PIPELINE;
|
|
648
|
+
this._channelClass = resolvedChannelClass;
|
|
649
|
+
// SRT listener outputs require channel security groups — fail fast at synth.
|
|
650
|
+
const hasSrtListenerOutput = props.outputGroups.some(config => config._hasSrtListenerDestination());
|
|
651
|
+
if (hasSrtListenerOutput && (props.channelSecurityGroups?.length ?? 0) === 0) {
|
|
652
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `SrtListenerRequiresChannelSecurityGroups`, 'an SRT output in listener connection mode requires channelSecurityGroups on the channel', this);
|
|
653
|
+
}
|
|
654
|
+
this.hasAnywhereSettings = props.anywhereSettings !== undefined;
|
|
655
|
+
this.node.addValidation({ validate: () => this.validateInputs() });
|
|
656
|
+
if (props.linkedChannelSettings && resolvedChannelClass.value !== ChannelClass.SINGLE_PIPELINE.value) {
|
|
657
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `LinkedChannelClass`, 'Linked channel settings can only be configured on SINGLE_PIPELINE channels.', this);
|
|
658
|
+
}
|
|
659
|
+
// Epoch locking requires the output timing source to be the input clock. MediaLive rejects any
|
|
660
|
+
// other timing source at deploy, so fail fast at synth.
|
|
661
|
+
if (usesEpochLocking
|
|
662
|
+
&& props.globalConfiguration?.outputTimingSource?.value === OutputTimingSource.SYSTEM_CLOCK.value) {
|
|
663
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `EpochLockingTimingSource`, 'globalConfiguration.outputTimingSource must be INPUT_CLOCK when using epoch output locking.', this);
|
|
664
|
+
}
|
|
665
|
+
// Epoch-locking checks are deferred to synth so they also cover groups added via
|
|
666
|
+
// addOutputGroup()
|
|
667
|
+
this.usesEpochLocking = usesEpochLocking;
|
|
668
|
+
if (usesEpochLocking) {
|
|
669
|
+
this.node.addValidation({ validate: () => this.validateEpochLocking() });
|
|
670
|
+
}
|
|
671
|
+
// Create a default role if not provided. When the caller brings their own role, the channel
|
|
672
|
+
// makes no automatic grants.
|
|
673
|
+
this.userProvidedRole = props.role !== undefined;
|
|
674
|
+
const channelRole = props.role ?? new aws_iam_1.Role(this, 'Role', {
|
|
675
|
+
assumedBy: new aws_iam_1.ServicePrincipal('medialive.amazonaws.com', {
|
|
676
|
+
conditions: {
|
|
677
|
+
// Confused-deputy prevention. SourceArn wildcards the channel ID because it's
|
|
678
|
+
// service-generated (pinning it would create a role → channel → role cycle).
|
|
679
|
+
StringEquals: { 'aws:SourceAccount': aws_cdk_lib_1.Aws.ACCOUNT_ID },
|
|
680
|
+
ArnLike: {
|
|
681
|
+
'aws:SourceArn': aws_cdk_lib_1.Stack.of(this).formatArn({
|
|
682
|
+
service: 'medialive',
|
|
683
|
+
resource: 'channel',
|
|
684
|
+
resourceName: '*',
|
|
685
|
+
arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME,
|
|
686
|
+
}),
|
|
687
|
+
},
|
|
688
|
+
},
|
|
689
|
+
}),
|
|
690
|
+
description: 'Role for MediaLive channel',
|
|
691
|
+
});
|
|
692
|
+
const inputSpec = props.inputSpecification ?? input_specification_1.InputSpecification.standard();
|
|
693
|
+
const resource = new aws_medialive_1.CfnChannel(this, 'Resource', {
|
|
694
|
+
name: this.physicalName,
|
|
695
|
+
channelClass: resolvedChannelClass.value,
|
|
696
|
+
roleArn: channelRole.roleArn,
|
|
697
|
+
logLevel: (props.logLevel ?? LogLevel.DISABLED).value,
|
|
698
|
+
inferenceSettings: props.inferenceFeedArn ? {
|
|
699
|
+
feedArn: props.inferenceFeedArn,
|
|
700
|
+
} : undefined,
|
|
701
|
+
tags: props.tags ? Object.entries(props.tags).map(([key, value]) => ({ key, value })) : undefined,
|
|
702
|
+
maintenance: props.maintenance ? {
|
|
703
|
+
maintenanceDay: props.maintenance.day.value,
|
|
704
|
+
maintenanceStartTime: props.maintenance.time ?? '02:00',
|
|
705
|
+
} : undefined,
|
|
706
|
+
destinations: aws_cdk_lib_1.Lazy.any({
|
|
707
|
+
produce: () => this.outputGroups
|
|
708
|
+
.flatMap(og => og._bindDestination(resolvedChannelClass.value)),
|
|
709
|
+
}, { omitEmptyArray: true }),
|
|
710
|
+
inputAttachments: aws_cdk_lib_1.Lazy.any({ produce: () => this.inputAttachments }, { omitEmptyArray: true }),
|
|
711
|
+
inputSpecification: inputSpec._bindInputSpecification(),
|
|
712
|
+
encoderSettings: {
|
|
713
|
+
timecodeConfig: {
|
|
714
|
+
source: (props.timecodeConfig?.source ?? TimecodeSource.EMBEDDED).value,
|
|
715
|
+
syncThreshold: props.timecodeConfig?.syncThreshold,
|
|
716
|
+
},
|
|
717
|
+
globalConfiguration: props.globalConfiguration ? {
|
|
718
|
+
initialAudioGain: props.globalConfiguration.initialAudioGain,
|
|
719
|
+
inputEndAction: props.globalConfiguration.inputEndAction?.value,
|
|
720
|
+
outputLockingMode: props.globalConfiguration.outputLocking?._mode(),
|
|
721
|
+
outputTimingSource: props.globalConfiguration.outputTimingSource?.value,
|
|
722
|
+
supportLowFramerateInputs: props.globalConfiguration.supportLowFramerateInputs ? 'ENABLED' : 'DISABLED',
|
|
723
|
+
inputLossBehavior: props.globalConfiguration.inputLossBehavior ? {
|
|
724
|
+
blackFrameMsec: props.globalConfiguration.inputLossBehavior.blackFrame?.toMilliseconds(),
|
|
725
|
+
repeatFrameMsec: props.globalConfiguration.inputLossBehavior.repeatFrame?.toMilliseconds(),
|
|
726
|
+
inputLossImageType: props.globalConfiguration.inputLossBehavior.imageType?.value,
|
|
727
|
+
inputLossImageColor: props.globalConfiguration.inputLossBehavior.imageColor,
|
|
728
|
+
inputLossImageSlate: props.globalConfiguration.inputLossBehavior.imageSlate?._bind(),
|
|
729
|
+
} : undefined,
|
|
730
|
+
outputLockingSettings: props.globalConfiguration.outputLocking?._bind(),
|
|
731
|
+
} : undefined,
|
|
732
|
+
availBlanking: props.availBlanking ? {
|
|
733
|
+
state: (props.availBlanking.state
|
|
734
|
+
?? (props.availBlanking.image ? avail_settings_1.AvailBlankingState.ENABLED : avail_settings_1.AvailBlankingState.DISABLED)).value,
|
|
735
|
+
availBlankingImage: props.availBlanking.image?._bind(),
|
|
736
|
+
} : undefined,
|
|
737
|
+
availConfiguration: (props.availSettings || props.scte35SegmentationScope) ? {
|
|
738
|
+
availSettings: props.availSettings?._bind(),
|
|
739
|
+
scte35SegmentationScope: props.scte35SegmentationScope?.value,
|
|
740
|
+
} : undefined,
|
|
741
|
+
featureActivations: props.featureActivations ? {
|
|
742
|
+
inputPrepareScheduleActions: props.featureActivations.inputPrepareScheduleActions?.value,
|
|
743
|
+
outputStaticImageOverlayScheduleActions: props.featureActivations.outputStaticImageOverlayScheduleActions?.value,
|
|
744
|
+
} : undefined,
|
|
745
|
+
motionGraphicsConfiguration: props.motionGraphicsConfiguration ? {
|
|
746
|
+
motionGraphicsInsertion: (props.motionGraphicsConfiguration.motionGraphicsInsertion ?? channel_features_1.MotionGraphicsInsertion.DISABLED).value,
|
|
747
|
+
motionGraphicsSettings: { htmlMotionGraphicsSettings: {} },
|
|
748
|
+
} : undefined,
|
|
749
|
+
nielsenConfiguration: props.nielsenConfiguration ? {
|
|
750
|
+
distributorId: props.nielsenConfiguration.distributorId,
|
|
751
|
+
nielsenPcmToId3Tagging: props.nielsenConfiguration.nielsenPcmToId3Tagging?.value,
|
|
752
|
+
} : undefined,
|
|
753
|
+
thumbnailConfiguration: props.thumbnailConfiguration ? {
|
|
754
|
+
state: (props.thumbnailConfiguration.state ?? channel_features_1.ThumbnailState.AUTO).value,
|
|
755
|
+
} : undefined,
|
|
756
|
+
blackoutSlate: props.blackoutSlate ? {
|
|
757
|
+
state: (props.blackoutSlate.state
|
|
758
|
+
?? (props.blackoutSlate.image ? avail_settings_1.BlackoutSlateState.ENABLED : avail_settings_1.BlackoutSlateState.DISABLED)).value,
|
|
759
|
+
blackoutSlateImage: props.blackoutSlate.image?._bind(),
|
|
760
|
+
networkEndBlackout: (props.blackoutSlate.networkEndBlackout
|
|
761
|
+
?? (props.blackoutSlate.networkEndBlackoutImage ? avail_settings_1.NetworkEndBlackout.ENABLED : avail_settings_1.NetworkEndBlackout.DISABLED)).value,
|
|
762
|
+
networkEndBlackoutImage: props.blackoutSlate.networkEndBlackoutImage?._bind(),
|
|
763
|
+
networkId: props.blackoutSlate.networkId,
|
|
764
|
+
} : undefined,
|
|
765
|
+
colorCorrectionSettings: props.colorCorrections ? {
|
|
766
|
+
globalColorCorrections: props.colorCorrections.map(c => ({
|
|
767
|
+
inputColorSpace: c.inputColorSpace.value,
|
|
768
|
+
outputColorSpace: c.outputColorSpace.value,
|
|
769
|
+
uri: c.lut?._bind(),
|
|
770
|
+
})),
|
|
771
|
+
} : undefined,
|
|
772
|
+
videoDescriptions: aws_cdk_lib_1.Lazy.any({
|
|
773
|
+
produce: () => {
|
|
774
|
+
const result = [];
|
|
775
|
+
this.outputGroups.flatMap(og => og._collectEncodes()).forEach(e => {
|
|
776
|
+
const desc = e._bindVideo();
|
|
777
|
+
if (desc?.name && !result.some(d => d.name === desc.name))
|
|
778
|
+
result.push(desc);
|
|
779
|
+
});
|
|
780
|
+
return result;
|
|
781
|
+
},
|
|
782
|
+
}, { omitEmptyArray: true }),
|
|
783
|
+
audioDescriptions: aws_cdk_lib_1.Lazy.any({
|
|
784
|
+
produce: () => {
|
|
785
|
+
const result = [];
|
|
786
|
+
this.outputGroups.flatMap(og => og._collectEncodes()).forEach(e => {
|
|
787
|
+
const desc = e._bindAudio();
|
|
788
|
+
if (desc?.name && !result.some(d => d.name === desc.name))
|
|
789
|
+
result.push(desc);
|
|
790
|
+
});
|
|
791
|
+
return result;
|
|
792
|
+
},
|
|
793
|
+
}, { omitEmptyArray: true }),
|
|
794
|
+
captionDescriptions: aws_cdk_lib_1.Lazy.any({
|
|
795
|
+
produce: () => {
|
|
796
|
+
const result = [];
|
|
797
|
+
this.outputGroups.flatMap(og => og._collectEncodes()).forEach(e => {
|
|
798
|
+
const desc = e._bindCaption();
|
|
799
|
+
if (desc?.name && !result.some(d => d.name === desc.name))
|
|
800
|
+
result.push(desc);
|
|
801
|
+
});
|
|
802
|
+
return result;
|
|
803
|
+
},
|
|
804
|
+
}, { omitEmptyArray: true }),
|
|
805
|
+
outputGroups: aws_cdk_lib_1.Lazy.any({ produce: () => this.outputGroups.map(og => og._bind()) }, { omitEmptyArray: true }),
|
|
806
|
+
},
|
|
807
|
+
vpc: props.vpc ? {
|
|
808
|
+
subnetIds: props.vpc.subnets.map(s => s.subnetRef.subnetId),
|
|
809
|
+
securityGroupIds: props.vpc.securityGroups?.map(sg => sg.securityGroupRef.securityGroupId),
|
|
810
|
+
publicAddressAllocationIds: props.vpc.publicAddressAllocationIds,
|
|
811
|
+
} : undefined,
|
|
812
|
+
anywhereSettings: props.anywhereSettings ? {
|
|
813
|
+
channelPlacementGroupId: props.anywhereSettings.channelPlacementGroup?.channelPlacementGroupRef.channelPlacementGroupId,
|
|
814
|
+
clusterId: props.anywhereSettings.cluster.clusterRef.clusterId,
|
|
815
|
+
} : undefined,
|
|
816
|
+
channelEngineVersion: props.channelEngineVersion ? {
|
|
817
|
+
version: props.channelEngineVersion,
|
|
818
|
+
} : undefined,
|
|
819
|
+
cdiInputSpecification: inputSpec._bindCdiInputSpecification(),
|
|
820
|
+
linkedChannelSettings: props.linkedChannelSettings?._bind(),
|
|
821
|
+
channelSecurityGroups: props.channelSecurityGroups?.map(sg => sg.inputSecurityGroupRef.inputSecurityGroupId),
|
|
822
|
+
});
|
|
823
|
+
this.channelArn = resource.attrArn;
|
|
824
|
+
this.channelId = resource.ref;
|
|
825
|
+
this.channelInputs = resource.attrInputs;
|
|
826
|
+
this.role = channelRole;
|
|
827
|
+
// Auto-grant permissions only for the channel-managed role. When the caller brings their own
|
|
828
|
+
// role, they define every permission (principal and resource side).
|
|
829
|
+
if (!this.userProvidedRole) {
|
|
830
|
+
// Auto-grant permissions for S3 destinations and S3 input sources
|
|
831
|
+
this.outputGroups.forEach(og => og._grantPermissions(channelRole));
|
|
832
|
+
props.inputs.forEach(attachment => {
|
|
833
|
+
attachment.input._grantPermissions(channelRole);
|
|
834
|
+
attachment.automaticInputFailover?.secondaryInput._grantPermissions(channelRole);
|
|
835
|
+
});
|
|
836
|
+
// Grant the service-role permissions implied by channel-level features (logging, VPC output).
|
|
837
|
+
this.grantServiceRolePermissions(channelRole, props, resource);
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
/**
|
|
841
|
+
* Grant the channel's service role the permissions implied by channel-level features.
|
|
842
|
+
*
|
|
843
|
+
* Mirrors the AWS-documented MediaLive trusted-entity requirements:
|
|
844
|
+
* https://docs.aws.amazon.com/medialive/latest/ug/trusted-entity-requirements.html
|
|
845
|
+
*
|
|
846
|
+
* Resource-level scoping is applied where the service supports it; EC2 `Describe*`
|
|
847
|
+
* actions don't support resource-level permissions, so they require `*`.
|
|
848
|
+
*/
|
|
849
|
+
grantServiceRolePermissions(role, props, resource) {
|
|
850
|
+
const stack = aws_cdk_lib_1.Stack.of(this);
|
|
851
|
+
// Thumbnails — grant unless user explicitly disabled.
|
|
852
|
+
const thumbnailsEnabled = props.thumbnailConfiguration === undefined
|
|
853
|
+
|| props.thumbnailConfiguration.state?.value === channel_features_1.ThumbnailState.AUTO.value;
|
|
854
|
+
if (thumbnailsEnabled) {
|
|
855
|
+
role.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
|
|
856
|
+
actions: ['s3:PutObject'],
|
|
857
|
+
resources: ['*'], // Thumbnail destination can't be scoped
|
|
858
|
+
}));
|
|
859
|
+
}
|
|
860
|
+
// CloudWatch Logs — required when logging is enabled.
|
|
861
|
+
// MediaLive always writes to the fixed log group `ElementalMediaLive`.
|
|
862
|
+
// See https://docs.aws.amazon.com/medialive/latest/ug/working-with-logs.html
|
|
863
|
+
if ((props.logLevel ?? LogLevel.DISABLED).value !== LogLevel.DISABLED.value) {
|
|
864
|
+
const logGroupArn = stack.formatArn({
|
|
865
|
+
service: 'logs',
|
|
866
|
+
resource: 'log-group',
|
|
867
|
+
resourceName: 'ElementalMediaLive',
|
|
868
|
+
arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME,
|
|
869
|
+
});
|
|
870
|
+
aws_iam_1.Grant.addToPrincipal({
|
|
871
|
+
grantee: role,
|
|
872
|
+
actions: [
|
|
873
|
+
'logs:CreateLogGroup',
|
|
874
|
+
'logs:CreateLogStream',
|
|
875
|
+
'logs:PutLogEvents',
|
|
876
|
+
'logs:PutMetricFilter',
|
|
877
|
+
'logs:PutRetentionPolicy',
|
|
878
|
+
'logs:DescribeLogStreams',
|
|
879
|
+
'logs:DescribeLogGroups',
|
|
880
|
+
],
|
|
881
|
+
// The group ARN covers group-level actions; the `:*` variant covers the log streams.
|
|
882
|
+
resourceArns: [logGroupArn, `${logGroupArn}:*`],
|
|
883
|
+
});
|
|
884
|
+
}
|
|
885
|
+
// EC2 — required for VPC output. Uses .applyBefore() because MediaLive validates
|
|
886
|
+
// permissions at channel creation time.
|
|
887
|
+
if (props.vpc) {
|
|
888
|
+
const subnetArns = props.vpc.subnets.map(s => stack.formatArn({ service: 'ec2', resource: 'subnet', resourceName: s.subnetRef.subnetId }));
|
|
889
|
+
const securityGroupArns = (props.vpc.securityGroups ?? []).map(sg => stack.formatArn({ service: 'ec2', resource: 'security-group', resourceName: sg.securityGroupRef.securityGroupId }));
|
|
890
|
+
// ENI IDs are generated at runtime — wildcarded but scoped to region/account.
|
|
891
|
+
const networkInterfaceArn = stack.formatArn({ service: 'ec2', resource: 'network-interface', resourceName: '*' });
|
|
892
|
+
// Create/Delete scope to the ENIs plus the subnets and security groups they attach to.
|
|
893
|
+
aws_iam_1.Grant.addToPrincipal({
|
|
894
|
+
grantee: role,
|
|
895
|
+
actions: [
|
|
896
|
+
'ec2:CreateNetworkInterface',
|
|
897
|
+
'ec2:CreateNetworkInterfacePermission',
|
|
898
|
+
'ec2:DeleteNetworkInterface',
|
|
899
|
+
],
|
|
900
|
+
resourceArns: [networkInterfaceArn, ...subnetArns, ...securityGroupArns],
|
|
901
|
+
}).applyBefore(resource);
|
|
902
|
+
// Describe* actions don't support resource-level permissions — EC2 requires `*`.
|
|
903
|
+
// See https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-ec2-console.html
|
|
904
|
+
aws_iam_1.Grant.addToPrincipal({
|
|
905
|
+
grantee: role,
|
|
906
|
+
actions: [
|
|
907
|
+
'ec2:DescribeNetworkInterfaces',
|
|
908
|
+
'ec2:DescribeSubnets',
|
|
909
|
+
'ec2:DescribeSecurityGroups',
|
|
910
|
+
'ec2:DescribeAddresses',
|
|
911
|
+
],
|
|
912
|
+
resourceArns: ['*'],
|
|
913
|
+
}).applyBefore(resource);
|
|
914
|
+
// Public IP association — ENI target is created at runtime, can't be scoped at synth.
|
|
915
|
+
if (props.vpc.publicAddressAllocationIds !== undefined) {
|
|
916
|
+
aws_iam_1.Grant.addToPrincipal({
|
|
917
|
+
grantee: role,
|
|
918
|
+
actions: ['ec2:AssociateAddress'],
|
|
919
|
+
resourceArns: ['*'],
|
|
920
|
+
}).applyBefore(resource);
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
// ESAM avail mode — grant read access to the POIS password parameter, if configured.
|
|
924
|
+
props.availSettings?._grantPermissions(role);
|
|
925
|
+
// Input-loss slate image — grant read access when the slate is sourced from an S3 bucket.
|
|
926
|
+
props.globalConfiguration?.inputLossBehavior?.imageSlate?._grantRead(role);
|
|
927
|
+
// Avail-blanking and blackout-slate images — grant read access when sourced from S3.
|
|
928
|
+
props.availBlanking?.image?._grantRead(role);
|
|
929
|
+
props.blackoutSlate?.image?._grantRead(role);
|
|
930
|
+
props.blackoutSlate?.networkEndBlackoutImage?._grantRead(role);
|
|
931
|
+
// Color-correction LUT files — grant read access when sourced from an S3 bucket.
|
|
932
|
+
props.colorCorrections?.forEach(c => c.lut?._grantRead(role));
|
|
933
|
+
}
|
|
934
|
+
/**
|
|
935
|
+
* Attach an input to this channel.
|
|
936
|
+
*/
|
|
937
|
+
addInput(attachment) {
|
|
938
|
+
try {
|
|
939
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_InputAttachment(attachment);
|
|
940
|
+
}
|
|
941
|
+
catch (error) {
|
|
942
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
943
|
+
Error.captureStackTrace(error, this.addInput);
|
|
944
|
+
}
|
|
945
|
+
throw error;
|
|
946
|
+
}
|
|
947
|
+
this.attachments.push(attachment);
|
|
948
|
+
this.inputAttachments.push(this.buildInputAttachment(attachment));
|
|
949
|
+
// Skip auto-grants when the caller owns the role.
|
|
950
|
+
if (!this.userProvidedRole) {
|
|
951
|
+
attachment.input._grantPermissions(this.role);
|
|
952
|
+
attachment.automaticInputFailover?.secondaryInput._grantPermissions(this.role);
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
/**
|
|
956
|
+
* Validate automatic-input-failover pairs against MediaLive's create-time rules. The secondary
|
|
957
|
+
* input is rejected by the service at deploy unless it is also attached to the channel, so we
|
|
958
|
+
* fail fast at synth.
|
|
959
|
+
*/
|
|
960
|
+
/**
|
|
961
|
+
* Synth-time input validations, run over all attached inputs (initial + addInput()).
|
|
962
|
+
*/
|
|
963
|
+
validateInputs() {
|
|
964
|
+
const errors = [];
|
|
965
|
+
const anywhereOnlyInputTypes = [input_1.InputType.SDI, input_1.InputType.SMPTE_2110_RECEIVER_GROUP, input_1.InputType.MULTICAST];
|
|
966
|
+
for (const attachment of this.attachments) {
|
|
967
|
+
const inputClass = attachment.input.inputClass;
|
|
968
|
+
if (inputClass && inputClass !== this._channelClass.value) {
|
|
969
|
+
errors.push(`Input '${attachment.input.node.id}' has input class '${inputClass}' which is incompatible`
|
|
970
|
+
+ ` with channel class '${this._channelClass.value}'.`);
|
|
971
|
+
}
|
|
972
|
+
const inputType = attachment.input.inputType;
|
|
973
|
+
if (!this.hasAnywhereSettings && inputType && anywhereOnlyInputTypes.includes(inputType)) {
|
|
974
|
+
errors.push(`Input '${attachment.input.node.id}' has type '${inputType}' which requires anywhereSettings to be configured on the channel.`);
|
|
975
|
+
}
|
|
976
|
+
const failover = attachment.automaticInputFailover;
|
|
977
|
+
if (failover && !this.attachments.some(other => other.input === failover.secondaryInput)) {
|
|
978
|
+
errors.push(`Input '${attachment.input.node.id}' declares automatic input failover to secondary input`
|
|
979
|
+
+ ` '${failover.secondaryInput.node.id}', but that secondary input is not attached to the channel.`
|
|
980
|
+
+ " Add the secondary input to the channel's 'inputs' as its own attachment.");
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
return errors;
|
|
984
|
+
}
|
|
985
|
+
buildInputAttachment(attachment) {
|
|
986
|
+
// Default to LOOP for file-based inputs (MP4, TS) — they're typically used as slates or test content
|
|
987
|
+
const isFileInput = attachment.input.inputType === 'MP4_FILE' || attachment.input.inputType === 'TS_FILE';
|
|
988
|
+
const sourceEndBehavior = attachment.sourceEndBehavior ?? (isFileInput ? input_attachment_1.SourceEndBehavior.LOOP : input_attachment_1.SourceEndBehavior.CONTINUE);
|
|
989
|
+
const failover = attachment.automaticInputFailover;
|
|
990
|
+
if (failover) {
|
|
991
|
+
// The failover pair must share an input class — MediaLive rejects mismatched classes.
|
|
992
|
+
const primaryClass = attachment.input.inputClass;
|
|
993
|
+
const secondaryClass = failover.secondaryInput.inputClass;
|
|
994
|
+
if (primaryClass && secondaryClass && primaryClass !== secondaryClass) {
|
|
995
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FailoverInputClassMismatch`, `Automatic input failover requires the primary and secondary inputs to have the same input class, got '${primaryClass}' and '${secondaryClass}'.`, this);
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
return {
|
|
999
|
+
inputId: attachment.input.inputId,
|
|
1000
|
+
inputAttachmentName: attachment.inputAttachmentName,
|
|
1001
|
+
automaticInputFailoverSettings: failover ? {
|
|
1002
|
+
secondaryInputId: failover.secondaryInput.inputId,
|
|
1003
|
+
inputPreference: failover.inputPreference?.value,
|
|
1004
|
+
errorClearTimeMsec: failover.errorClearTime?.toMilliseconds(),
|
|
1005
|
+
// MediaLive requires at least one failover condition — default to input loss.
|
|
1006
|
+
failoverConditions: (failover.failoverConditions ?? [input_attachment_1.FailoverCondition.inputLoss()]).map(c => c._bind()),
|
|
1007
|
+
} : undefined,
|
|
1008
|
+
inputSettings: {
|
|
1009
|
+
sourceEndBehavior: sourceEndBehavior.value,
|
|
1010
|
+
inputFilter: (attachment.inputFilter ?? input_attachment_1.InputFilter.AUTO).value,
|
|
1011
|
+
filterStrength: attachment.filterStrength ?? 1,
|
|
1012
|
+
deblockFilter: attachment.deblockFilter ? 'ENABLED' : 'DISABLED',
|
|
1013
|
+
denoiseFilter: attachment.denoiseFilter ? 'ENABLED' : 'DISABLED',
|
|
1014
|
+
smpte2038DataPreference: (attachment.smpte2038DataPreference ?? input_attachment_1.Smpte2038DataPreference.IGNORE).value,
|
|
1015
|
+
audioSelectors: attachment.audioSelectors?.map(s => s._bind()),
|
|
1016
|
+
captionSelectors: attachment.captionSelectors?.map(s => s._bind()),
|
|
1017
|
+
scte35Pid: attachment.scte35Pid,
|
|
1018
|
+
videoSelector: attachment.videoSelector ? {
|
|
1019
|
+
colorSpace: attachment.videoSelector.colorSpace?.value,
|
|
1020
|
+
colorSpaceUsage: attachment.videoSelector.colorSpaceUsage?.value,
|
|
1021
|
+
colorSpaceSettings: attachment.videoSelector.hdr10 ? {
|
|
1022
|
+
hdr10Settings: {
|
|
1023
|
+
maxCll: attachment.videoSelector.hdr10.maxContentLightLevel,
|
|
1024
|
+
maxFall: attachment.videoSelector.hdr10.maxFrameAverageLightLevel,
|
|
1025
|
+
},
|
|
1026
|
+
} : undefined,
|
|
1027
|
+
selectorSettings: attachment.videoSelector.selectBy?._bind(),
|
|
1028
|
+
} : undefined,
|
|
1029
|
+
networkInputSettings: attachment.networkInputSettings ? {
|
|
1030
|
+
serverValidation: attachment.networkInputSettings.serverValidation?.value,
|
|
1031
|
+
hlsInputSettings: attachment.networkInputSettings.hlsInputSettings ? {
|
|
1032
|
+
bandwidth: attachment.networkInputSettings.hlsInputSettings.bandwidth?.toBps(),
|
|
1033
|
+
bufferSegments: attachment.networkInputSettings.hlsInputSettings.bufferSegments,
|
|
1034
|
+
retries: attachment.networkInputSettings.hlsInputSettings.retries,
|
|
1035
|
+
retryInterval: attachment.networkInputSettings.hlsInputSettings.retryInterval?.toSeconds(),
|
|
1036
|
+
scte35Source: attachment.networkInputSettings.hlsInputSettings.scte35Source?.value,
|
|
1037
|
+
} : undefined,
|
|
1038
|
+
multicastInputSettings: attachment.networkInputSettings.multicastSourceIp
|
|
1039
|
+
? { sourceIpAddress: attachment.networkInputSettings.multicastSourceIp }
|
|
1040
|
+
: undefined,
|
|
1041
|
+
} : undefined,
|
|
1042
|
+
},
|
|
1043
|
+
logicalInterfaceNames: attachment.logicalInterfaceNames,
|
|
1044
|
+
};
|
|
1045
|
+
}
|
|
1046
|
+
/**
|
|
1047
|
+
* Add an output group to this channel.
|
|
1048
|
+
*
|
|
1049
|
+
* Outputs are declared up front via the `outputs` prop on the group configuration.
|
|
1050
|
+
*/
|
|
1051
|
+
addOutputGroup(config) {
|
|
1052
|
+
try {
|
|
1053
|
+
jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_OutputGroupConfiguration(config);
|
|
1054
|
+
}
|
|
1055
|
+
catch (error) {
|
|
1056
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
1057
|
+
Error.captureStackTrace(error, this.addOutputGroup);
|
|
1058
|
+
}
|
|
1059
|
+
throw error;
|
|
1060
|
+
}
|
|
1061
|
+
const outputGroup = new output_group_1.OutputGroup(config);
|
|
1062
|
+
if (this.usesEpochLocking) {
|
|
1063
|
+
outputGroup._setEpochLocking(true);
|
|
1064
|
+
}
|
|
1065
|
+
this.outputGroups.push(outputGroup);
|
|
1066
|
+
// Skip auto-grants when the caller owns the role.
|
|
1067
|
+
if (!this.userProvidedRole) {
|
|
1068
|
+
outputGroup._grantPermissions(this.role);
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
/** Synth-time epoch-locking checks for configs MediaLive rejects at deploy. */
|
|
1072
|
+
validateEpochLocking() {
|
|
1073
|
+
// An explicit SYSTEM_CLOCK program-date-time clock contradicts epoch locking.
|
|
1074
|
+
const clockError = this.outputGroups.some(og => og._hasExplicitSystemClock())
|
|
1075
|
+
? ['an HLS output group programDateTimeClock must be INITIALIZE_FROM_OUTPUT_TIMECODE when using epoch output locking']
|
|
1076
|
+
: [];
|
|
1077
|
+
// H.264 is the only codec that falls back to INITIALIZE_FROM_SOURCE when framerate is omitted;
|
|
1078
|
+
// epoch locking requires an explicit rate. H.265/AV1/Frame Capture always carry one.
|
|
1079
|
+
const offenders = [...new Set(this.outputGroups
|
|
1080
|
+
.flatMap(og => og._collectEncodes())
|
|
1081
|
+
.filter(encode => encode._videoCodecType() === video_codec_settings_1.VideoCodecType.H264 && !encode._hasExplicitFramerate())
|
|
1082
|
+
.map(encode => encode.name))];
|
|
1083
|
+
const framerateError = offenders.length > 0
|
|
1084
|
+
? ['epoch output locking requires an explicit frame rate on H.264 video encodes '
|
|
1085
|
+
+ `(e.g. Framerate.FPS_30); these encodes follow the source frame rate: ${offenders.join(', ')}`]
|
|
1086
|
+
: [];
|
|
1087
|
+
return [...clockError, ...framerateError];
|
|
1088
|
+
}
|
|
1089
|
+
static {
|
|
1090
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
1091
|
+
}
|
|
1092
|
+
};
|
|
1093
|
+
return Channel = _classThis;
|
|
1094
|
+
})();
|
|
1095
|
+
exports.Channel = Channel;
|
|
1096
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNoYW5uZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDZDQUE0RjtBQUU1RiwrREFBb0Q7QUFJcEQsaURBQXFGO0FBRXJGLDZEQUF1RDtBQUN2RCw0RUFBNEQ7QUFDNUQsOEVBQThGO0FBQzlGLDBFQUEwRTtBQUUxRSxxREFBd0w7QUFDeEwseURBQWdNO0FBR2hNLG1DQUFvQztBQUNwQyx5REFBc0k7QUFDdEksK0RBQTJEO0FBQzNELDZFQUE2RDtBQUU3RCxpREFBNkM7QUFDN0MscUNBQTZDO0FBQzdDLGlFQUF3RDtBQUV4RCwrREF3Q2dDO0FBdkM5QiwwSEFBQSxrQkFBa0IsT0FBQTtBQUNsQixtSEFBQSxXQUFXLE9BQUE7QUFDWCx1SEFBQSxlQUFlLE9BQUE7QUFDZixnSUFBQSx3QkFBd0IsT0FBQTtBQUN4QiwrR0FBQSxPQUFPLE9BQUE7QUFDUCxtSEFBQSxXQUFXLE9BQUE7QUFDWCxnSEFBQSxRQUFRLE9BQUE7QUFDUix1SEFBQSxlQUFlLE9BQUE7QUFDZixzSEFBQSxjQUFjLE9BQUE7QUFDZCxvSEFBQSxZQUFZLE9BQUE7QUFDWixxSEFBQSxhQUFhLE9BQUE7QUFDYixnSEFBQSxRQUFRLE9BQUE7QUFDUixpSEFBQSxTQUFTLE9BQUE7QUFDVCxxSEFBQSxhQUFhLE9BQUE7QUFDYiw0SEFBQSxvQkFBb0IsT0FBQTtBQUNwQix5SEFBQSxpQkFBaUIsT0FBQTtBQUNqQixvSEFBQSxZQUFZLE9BQUE7QUFDWiwySEFBQSxtQkFBbUIsT0FBQTtBQUNuQiw4SEFBQSxzQkFBc0IsT0FBQTtBQUN0QixrSEFBQSxVQUFVLE9BQUE7QUFDVix3SEFBQSxnQkFBZ0IsT0FBQTtBQUNoQixnSUFBQSx3QkFBd0IsT0FBQTtBQUN4Qix1SUFBQSwrQkFBK0IsT0FBQTtBQUMvQixzSEFBQSxjQUFjLE9BQUE7QUFDZCxtSUFB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LFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbkcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVQLE9BQU8sQ0FBQyxHQUFHLFVBQVUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDO1NBQzNDOztZQTlpQlUsdURBQU87Ozs7O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IER1cmF0aW9uLCBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZXNvdXJjZSwgTGF6eSwgTmFtZXMsIEF3cywgQXJuRm9ybWF0LCBTdGFjaywgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNPcHRpb25zIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgTWV0cmljIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHR5cGUgeyBJU3VibmV0UmVmIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgdHlwZSB7IElTZWN1cml0eUdyb3VwUmVmIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVsYXN0aWNhY2hlJztcbmltcG9ydCB0eXBlIHsgSVJvbGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEdyYW50LCBQb2xpY3lTdGF0ZW1lbnQsIFJvbGUsIFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB0eXBlIHsgSUNoYW5uZWxSZWYsIENoYW5uZWxSZWZlcmVuY2UsIElJbnB1dFNlY3VyaXR5R3JvdXBSZWYsIElDbHVzdGVyUmVmLCBJQ2hhbm5lbFBsYWNlbWVudEdyb3VwUmVmIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhbGl2ZSc7XG5pbXBvcnQgeyBDZm5DaGFubmVsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhbGl2ZSc7XG5pbXBvcnQgeyBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhLCBNZXRob2RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQXZhaWxCbGFua2luZ1N0YXRlLCBCbGFja291dFNsYXRlU3RhdGUsIE5ldHdvcmtFbmRCbGFja291dCwgdHlwZSBBdmFpbEJsYW5raW5nLCB0eXBlIEF2YWlsU2V0dGluZ3MsIHR5cGUgU2N0ZTM1U2VnbWVudGF0aW9uU2NvcGUsIHR5cGUgQmxhY2tvdXRTbGF0ZSB9IGZyb20gJy4vYXZhaWwtc2V0dGluZ3MnO1xuaW1wb3J0IHsgVGh1bWJuYWlsU3RhdGUsIE1vdGlvbkdyYXBoaWNzSW5zZXJ0aW9uLCB0eXBlIEZlYXR1cmVBY3RpdmF0aW9ucywgdHlwZSBNb3Rpb25HcmFwaGljc0NvbmZpZ3VyYXRpb24sIHR5cGUgTmllbHNlbkNvbmZpZ3VyYXRpb24sIHR5cGUgVGh1bWJuYWlsQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY2hhbm5lbC1mZWF0dXJlcyc7XG5pbXBvcnQgdHlwZSB7IENvbG9yQ29ycmVjdGlvbiB9IGZyb20gJy4vY29sb3ItY29ycmVjdGlvbic7XG5pbXBvcnQgdHlwZSB7IEZpbGVMb2NhdGlvbiB9IGZyb20gJy4vZmlsZS1sb2NhdGlvbic7XG5pbXBvcnQgeyBJbnB1dFR5cGUgfSBmcm9tICcuL2lucHV0JztcbmltcG9ydCB7IEZhaWxvdmVyQ29uZGl0aW9uLCBTb3VyY2VFbmRCZWhhdmlvciwgSW5wdXRGaWx0ZXIsIFNtcHRlMjAzOERhdGFQcmVmZXJlbmNlLCB0eXBlIElucHV0QXR0YWNobWVudCB9IGZyb20gJy4vaW5wdXQtYXR0YWNobWVudCc7XG5pbXBvcnQgeyBJbnB1dFNwZWNpZmljYXRpb24gfSBmcm9tICcuL2lucHV0LXNwZWNpZmljYXRpb24nO1xuaW1wb3J0IHsgQ2hhbm5lbEdyYW50cyB9IGZyb20gJy4vbWVkaWFsaXZlLWdyYW50cy5nZW5lcmF0ZWQnO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL291dHB1dC1ncm91cCc7XG5pbXBvcnQgeyBPdXRwdXRHcm91cCB9IGZyb20gJy4vb3V0cHV0LWdyb3VwJztcbmltcG9ydCB7IGV4dHJhY3RSZXNvdXJjZUlkIH0gZnJvbSAnLi9zaGFyZWQnO1xuaW1wb3J0IHsgVmlkZW9Db2RlY1R5cGUgfSBmcm9tICcuL3ZpZGVvLWNvZGVjLXNldHRpbmdzJztcblxuZXhwb3J0IHtcbiAgVmlkZW9Db2RlY1NldHRpbmdzLFxuICBIMjY0UHJvZmlsZSxcbiAgSDI2NFJhdGVDb250cm9sLFxuICBIMjY0QWRhcHRpdmVRdWFudGl6YXRpb24sXG4gIEdvcFNpemUsXG4gIEgyNjVQcm9maWxlLFxuICBIMjY1VGllcixcbiAgSDI2NVJhdGVDb250cm9sLFxuICBBdjFSYXRlQ29udHJvbCxcbiAgQWZkU2lnbmFsaW5nLFxuICBDb2xvck1ldGFkYXRhLFxuICBTY2FuVHlwZSxcbiAgRmxpY2tlckFxLFxuICBHb3BCUmVmZXJlbmNlLFxuICBMb29rQWhlYWRSYXRlQ29udHJvbCxcbiAgVGltZWNvZGVJbnNlcnRpb24sXG4gIFN1YmdvcExlbmd0aCxcbiAgSDI2NEVudHJvcHlFbmNvZGluZyxcbiAgSDI2NEZvcmNlRmllbGRQaWN0dXJlcyxcbiAgSDI2NFN5bnRheCxcbiAgSDI2NFF1YWxpdHlMZXZlbCxcbiAgSDI2NUFkYXB0aXZlUXVhbnRpemF0aW9uLFxuICBIMjY1QWx0ZXJuYXRpdmVUcmFuc2ZlckZ1bmN0aW9uLFxuICBIMjY1RGVibG9ja2luZyxcbiAgSDI2NU12T3ZlclBpY3R1cmVCb3VuZGFyaWVzLFxuICBIMjY1TXZUZW1wb3JhbFByZWRpY3RvcixcbiAgSDI2NVRpbGVQYWRkaW5nLFxuICBIMjY1VHJlZWJsb2NrU2l6ZSxcbiAgQXYxQml0RGVwdGgsXG4gIEF2MVNjZW5lQ2hhbmdlRGV0ZWN0LFxuICBBdjFTcGF0aWFsQXEsXG4gIEF2MVRlbXBvcmFsQXEsXG4gIEF2MVRpbWVjb2RlSW5zZXJ0aW9uLFxuICBIMjY0U2NlbmVDaGFuZ2VEZXRlY3QsXG4gIEgyNjRTcGF0aWFsQXEsXG4gIEgyNjRUZW1wb3JhbEFxLFxuICBIMjY1U2NlbmVDaGFuZ2VEZXRlY3QsXG4gIFRpbWVjb2RlQnVybmluRm9udFNpemUsXG4gIFRpbWVjb2RlQnVybmluUG9zaXRpb24sXG59IGZyb20gJy4vdmlkZW8tY29kZWMtc2V0dGluZ3MnO1xuZXhwb3J0IHR5cGUge1xuICBIMjY0U2V0dGluZ3NQcm9wcyxcbiAgSDI2NVNldHRpbmdzUHJvcHMsXG4gIEF2MVNldHRpbmdzUHJvcHMsXG4gIEZyYW1lQ2FwdHVyZVNldHRpbmdzUHJvcHMsXG4gIFRpbWVjb2RlQnVybmluU2V0dGluZ3MsXG59IGZyb20gJy4vdmlkZW8tY29kZWMtc2V0dGluZ3MnO1xuZXhwb3J0IHtcbiAgQXVkaW9Db2RlY1NldHRpbmdzLFxuICBBYWNQcm9maWxlLFxuICBBYWNDb2RpbmdNb2RlLFxuICBBYWNSYXRlQ29udHJvbE1vZGUsXG4gIEFhY1Jhd0Zvcm1hdCxcbiAgQWFjU3BlYyxcbiAgQWFjSW5wdXRUeXBlLFxuICBBYWNWYnJRdWFsaXR5LFxuICBBYzNBdHRlbnVhdGlvbkNvbnRyb2wsXG4gIEFjM0JpdHN0cmVhbU1vZGUsXG4gIEFjM0NvZGluZ01vZGUsXG4gIEFjM0RyY1Byb2ZpbGUsXG4gIEFjM0xmZUZpbHRlcixcbiAgQWMzTWV0YWRhdGFDb250cm9sLFxuICBFYWMzQXR0ZW51YXRpb25Db250cm9sLFxuICBFYWMzQml0c3RyZWFtTW9kZSxcbiAgRWFjM0NvZGluZ01vZGUsXG4gIEVhYzNEY0ZpbHRlcixcbiAgRWFjM0RyY0xpbmUsXG4gIEVhYzNEcmNSZixcbiAgRWFjM0xmZUNvbnRyb2wsXG4gIEVhYzNMZmVGaWx0ZXIsXG4gIEVhYzNNZXRhZGF0YUNvbnRyb2wsXG4gIEVhYzNQYXNzdGhyb3VnaENvbnRyb2wsXG4gIEVhYzNQaGFzZUNvbnRyb2wsXG4gIEVhYzNTdGVyZW9Eb3dubWl4LFxuICBFYWMzU3Vycm91bmRFeE1vZGUsXG4gIEVhYzNTdXJyb3VuZE1vZGUsXG4gIEVhYzNBdG1vc0NvZGluZ01vZGUsXG4gIEVhYzNBdG1vc0RyY0xpbmUsXG4gIEVhYzNBdG1vc0RyY1JmLFxuICBNcDJDb2RpbmdNb2RlLFxuICBXYXZDb2RpbmdNb2RlLFxufSBmcm9tICcuL2F1ZGlvLWNvZGVjLXNldHRpbmdzJztcbmV4cG9ydCB0eXBlIHtcbiAgQWFjU2V0dGluZ3NQcm9wcyxcbiAgQWMzU2V0dGluZ3NQcm9wcyxcbiAgRWFjM1NldHRpbmdzUHJvcHMsXG4gIEVhYzNBdG1vc1NldHRpbmdzUHJvcHMsXG4gIE1wMlNldHRpbmdzUHJvcHMsXG4gIFdhdlNldHRpbmdzUHJvcHMsXG59IGZyb20gJy4vYXVkaW8tY29kZWMtc2V0dGluZ3MnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBNZWRpYUxpdmUgQ2hhbm5lbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ2hhbm5lbCBleHRlbmRzIElSZXNvdXJjZSwgSUNoYW5uZWxSZWYge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY2hhbm5lbC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbEFybjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBjaGFubmVsLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBJRHMgb2YgdGhlIGlucHV0cyBhdHRhY2hlZCB0byB0aGlzIGNoYW5uZWwuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxJbnB1dHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBncmFudCBtZXRob2RzIGZvciB0aGlzIGNoYW5uZWwg4oCUIHN0YXJ0LCBzdG9wLCBhbmQgdXBkYXRlIGl0cyBzY2hlZHVsZS5cbiAgICovXG4gIHJlYWRvbmx5IGdyYW50czogQ2hhbm5lbEdyYW50cztcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRoaXMgY2hhbm5lbCBzY29wZWQgdG8gYSBzcGVjaWZpYyBwaXBlbGluZS5cbiAgICpcbiAgICogQ2hhbm5lbCBtZXRyaWNzIGFyZSBwdWJsaXNoZWQgcGVyLXBpcGVsaW5lLiBgU1RBTkRBUkRgIGNoYW5uZWxzIHJ1biB0d29cbiAgICogcmVkdW5kYW50IHBpcGVsaW5lcyAoYFBJUEVMSU5FXzBgIGFuZCBgUElQRUxJTkVfMWApOyB0byBjb3ZlciBib3RoLCBidWlsZFxuICAgKiBhIG1ldHJpYyBmb3IgZWFjaC4gYFNJTkdMRV9QSVBFTElORWAgY2hhbm5lbHMgb25seSBwdWJsaXNoIG9uIGBQSVBFTElORV8wYC5cbiAgICogU2VlIHRoZVxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhbGl2ZS9sYXRlc3QvdWcvbW9uaXRvcmluZy1lbWwtbWV0cmljcy5odG1sIHwgTWVkaWFMaXZlIG1ldHJpY3MgZG9jc31cbiAgICogZm9yIHRoZSBmdWxsIHNldCBvZiBtZXRyaWMgbmFtZXMgYW5kIHJlY29tbWVuZGVkIHN0YXRpc3RpY3MuXG4gICAqL1xuICBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwaXBlbGluZTogUGlwZWxpbmUsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBhbGVydHMgb24gdGhpcyBjaGFubmVsLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG1heCBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgbWV0cmljQWN0aXZlQWxlcnRzKHBpcGVsaW5lOiBQaXBlbGluZSwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSByYXRlIG9mIGluYm91bmQgbmV0d29yayB0cmFmZmljIHRvIE1lZGlhTGl2ZSBpbiBNYnBzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA1IG1pbnV0ZXNcbiAgICovXG4gIG1ldHJpY05ldHdvcmtJbihwaXBlbGluZTogUGlwZWxpbmUsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcmF0ZSBvZiBvdXRib3VuZCBuZXR3b3JrIHRyYWZmaWMgZnJvbSBNZWRpYUxpdmUgaW4gTWJwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNSBtaW51dGVzXG4gICAqL1xuICBtZXRyaWNOZXR3b3JrT3V0KHBpcGVsaW5lOiBQaXBlbGluZSwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBpbnB1dCB2aWRlbyBmcmFtZSByYXRlIChmcmFtZXMgcGVyIHNlY29uZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbWF4IG92ZXIgNSBtaW51dGVzXG4gICAqL1xuICBtZXRyaWNJbnB1dFZpZGVvRnJhbWVSYXRlKHBpcGVsaW5lOiBQaXBlbGluZSwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIGZpbGwgbWlsbGlzZWNvbmRzIOKAlCB0aGUgdGltZSBNZWRpYUxpdmUgaGFzIGZpbGxlZCB0aGUgdmlkZW8gb3V0cHV0XG4gICAqIHdpdGggZmlsbCBmcmFtZXMgYmVjYXVzZSB0aGUgaW5wdXQgZGlkIG5vdCBkZWxpdmVyIGNvbnRlbnQgd2l0aGluIHRoZVxuICAgKiBleHBlY3RlZCB3aW5kb3cuIEEgbm9uLXplcm8gdmFsdWUgaW5kaWNhdGVzIGFuIHVuaGVhbHRoeSBpbnB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBtYXggb3ZlciA1IG1pbnV0ZXNcbiAgICovXG4gIG1ldHJpY0ZpbGxNc2VjKHBpcGVsaW5lOiBQaXBlbGluZSwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIGlucHV0IGxvc3Mgc2Vjb25kcyAoUlRQIGFuZCBNZWRpYUNvbm5lY3QgaW5wdXRzIG9ubHkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgbWV0cmljSW5wdXRMb3NzU2Vjb25kcyhwaXBlbGluZTogUGlwZWxpbmUsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciBkcm9wcGVkIGZyYW1lcy4gQSBub24temVybyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGVuY29kZXIgY2Fubm90XG4gICAqIGtlZXAgdXAgd2l0aCB0aGUgaW5jb21pbmcgdmlkZW8gaW4gcmVhbCB0aW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDUgbWludXRlc1xuICAgKi9cbiAgbWV0cmljRHJvcHBlZEZyYW1lcyhwaXBlbGluZTogUGlwZWxpbmUsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciBTVlEgdGltZSAoc3BlZWQtdnMtcXVhbGl0eSksIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnQuIEluZGljYXRlc1xuICAgKiB0aGUgc2hhcmUgb2YgdGltZSBNZWRpYUxpdmUgcmVkdWNlZCBxdWFsaXR5IG9wdGltaXNhdGlvbnMgdG8ga2VlcCB1cCB3aXRoXG4gICAqIHJlYWwtdGltZSBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbWF4IG92ZXIgNSBtaW51dGVzXG4gICAqL1xuICBtZXRyaWNTdnFUaW1lKHBpcGVsaW5lOiBQaXBlbGluZSwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xufVxuXG4vKipcbiAqIE1lZGlhTGl2ZSBwaXBlbGluZSAoY2hhbm5lbCBwaXBlbGluZSAwIG9yIDEpLlxuICpcbiAqIGBTVEFOREFSRGAgY2hhbm5lbHMgcnVuIHR3byByZWR1bmRhbnQgcGlwZWxpbmVzIChgUElQRUxJTkVfMGAsIGBQSVBFTElORV8xYCkuXG4gKiBgU0lOR0xFX1BJUEVMSU5FYCBjaGFubmVscyBydW4gb25seSBgUElQRUxJTkVfMGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXBlbGluZSB7XG4gIC8qKiBQaXBlbGluZSAwLiBBbHdheXMgYXZhaWxhYmxlIG9uIGV2ZXJ5IGNoYW5uZWwuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUElQRUxJTkVfMCA9IG5ldyBQaXBlbGluZSgnMCcpO1xuXG4gIC8qKiBQaXBlbGluZSAxLiBBdmFpbGFibGUgb25seSBvbiBgU1RBTkRBUkRgIGNoYW5uZWxzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBJUEVMSU5FXzEgPSBuZXcgUGlwZWxpbmUoJzEnKTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdmFsdWU6IHN0cmluZykge31cblxuICAvKiogUmV0dXJucyB0aGUgQ2xvdWRXYXRjaCBkaW1lbnNpb24gdmFsdWUgZm9yIHRoaXMgcGlwZWxpbmUgKGAnMCdgIG9yIGAnMSdgKS4gKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY2xhc3Mgb2YgdGhlIGNoYW5uZWwuIERldGVybWluZXMgdGhlIHBpcGVsaW5lIHJlZHVuZGFuY3kuXG4gKi9cbmV4cG9ydCBjbGFzcyBDaGFubmVsQ2xhc3Mge1xuICAvKiogU2luZ2xlIHBpcGVsaW5lIOKAlCBubyByZWR1bmRhbmN5ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0lOR0xFX1BJUEVMSU5FID0gbmV3IENoYW5uZWxDbGFzcygnU0lOR0xFX1BJUEVMSU5FJyk7XG4gIC8qKiBTdGFuZGFyZCDigJQgdHdvIHBpcGVsaW5lcyBmb3IgcmVkdW5kYW5jeSAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNUQU5EQVJEID0gbmV3IENoYW5uZWxDbGFzcygnU1RBTkRBUkQnKTtcblxuICAvKiogQSB2YWx1ZSBub3QgeWV0IG1vZGVsbGVkIGJ5IEFXUyBDREsuICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IENoYW5uZWxDbGFzcyB7XG4gICAgcmV0dXJuIG5ldyBDaGFubmVsQ2xhc3ModmFsdWUpO1xuICB9XG5cbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHN0cmluZyB2YWx1ZSBwYXNzZWQgdG8gQ2xvdWRGb3JtYXRpb24uICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsb2cgbGV2ZWwgZm9yIHRoZSBjaGFubmVsLlxuICovXG5leHBvcnQgY2xhc3MgTG9nTGV2ZWwge1xuICAvKiogTG9nIGVycm9ycyBvbmx5ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRVJST1IgPSBuZXcgTG9nTGV2ZWwoJ0VSUk9SJyk7XG4gIC8qKiBMb2cgd2FybmluZ3MgYW5kIGVycm9ycyAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFdBUk5JTkcgPSBuZXcgTG9nTGV2ZWwoJ1dBUk5JTkcnKTtcbiAgLyoqIExvZyBpbmZvLCB3YXJuaW5ncywgYW5kIGVycm9ycyAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElORk8gPSBuZXcgTG9nTGV2ZWwoJ0lORk8nKTtcbiAgLyoqIExvZyBldmVyeXRoaW5nICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVCVUcgPSBuZXcgTG9nTGV2ZWwoJ0RFQlVHJyk7XG4gIC8qKiBEaXNhYmxlIGxvZ2dpbmcgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBESVNBQkxFRCA9IG5ldyBMb2dMZXZlbCgnRElTQUJMRUQnKTtcblxuICAvKiogQSB2YWx1ZSBub3QgeWV0IG1vZGVsbGVkIGJ5IEFXUyBDREsuICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IExvZ0xldmVsIHtcbiAgICByZXR1cm4gbmV3IExvZ0xldmVsKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBUaGUgdW5kZXJseWluZyBzdHJpbmcgdmFsdWUgcGFzc2VkIHRvIENsb3VkRm9ybWF0aW9uLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgc291cmNlIG9mIHRpbWVjb2RlIGZvciB0aGUgY2hhbm5lbCBvdXRwdXRzLlxuICovXG5leHBvcnQgY2xhc3MgVGltZWNvZGVTb3VyY2Uge1xuICAvKiogVXNlIGVtYmVkZGVkIHRpbWVjb2RlIGZyb20gdGhlIHNvdXJjZS4gRmFsbHMgYmFjayB0byB6ZXJvLWJhc2VkIGlmIG5vdCBkZXRlY3RlZC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBFTUJFRERFRCA9IG5ldyBUaW1lY29kZVNvdXJjZSgnRU1CRURERUQnKTtcbiAgLyoqIFVzZSB0aGUgc3lzdGVtIGNsb2NrIChVVEMpLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZU1RFTUNMT0NLID0gbmV3IFRpbWVjb2RlU291cmNlKCdTWVNURU1DTE9DSycpO1xuICAvKiogU3RhcnQgYXQgMDA6MDA6MDA6MDAuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWkVST0JBU0VEID0gbmV3IFRpbWVjb2RlU291cmNlKCdaRVJPQkFTRUQnKTtcblxuICAvKiogQSB2YWx1ZSBub3QgeWV0IG1vZGVsbGVkIGJ5IEFXUyBDREsuICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IFRpbWVjb2RlU291cmNlIHtcbiAgICByZXR1cm4gbmV3IFRpbWVjb2RlU291cmNlKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBUaGUgdW5kZXJseWluZyBzdHJpbmcgdmFsdWUgcGFzc2VkIHRvIENsb3VkRm9ybWF0aW9uLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaW1lY29kZSBjb25maWd1cmF0aW9uIGZvciB0aGUgY2hhbm5lbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lY29kZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIG9mIHRpbWVjb2RlLlxuICAgKiBAZGVmYXVsdCBUaW1lY29kZVNvdXJjZS5FTUJFRERFRFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlPzogVGltZWNvZGVTb3VyY2U7XG4gIC8qKlxuICAgKiBUaGUgdGhyZXNob2xkIGluIGZyYW1lcyBiZXlvbmQgd2hpY2ggb3V0cHV0IHRpbWVjb2RlIGlzIHJlc3luY2hyb25pemVkIHRvIHRoZSBpbnB1dCB0aW1lY29kZS5cbiAgICogQGRlZmF1bHQgLSBubyBzeW5jIHRocmVzaG9sZFxuICAgKi9cbiAgcmVhZG9ubHkgc3luY1RocmVzaG9sZD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIE1lZGlhTGl2ZSBDaGFubmVsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYW5uZWxQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbC5cbiAgICogQGRlZmF1bHQgLSBhdXRvLWdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjbGFzcyBvZiB0aGUgY2hhbm5lbCAoU1RBTkRBUkQgZm9yIHJlZHVuZGFuY3ksIFNJTkdMRV9QSVBFTElORSBmb3IgY29zdCBzYXZpbmdzKS5cbiAgICogQGRlZmF1bHQgQ2hhbm5lbENsYXNzLlNJTkdMRV9QSVBFTElORVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbENsYXNzPzogQ2hhbm5lbENsYXNzO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgZm9yIE1lZGlhTGl2ZSB0byBhc3N1bWUgd2hlbiBydW5uaW5nIHRoaXMgY2hhbm5lbC5cbiAgICpcbiAgICogW2Rpc2FibGUtYXdzbGludDpwcmVmZXItcmVmLWludGVyZmFjZV1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHJvbGUgaXMgYXV0by1jcmVhdGVkIHdpdGggY29uZnVzZWQtZGVwdXR5IHByZXZlbnRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBJUm9sZTtcblxuICAvKipcbiAgICogVGhlIGlucHV0IGF0dGFjaG1lbnRzIGZvciB0aGlzIGNoYW5uZWwuIEF0IGxlYXN0IG9uZSBpcyByZXF1aXJlZC5cbiAgICogQWRkaXRpb25hbCBpbnB1dHMgY2FuIGJlIGFkZGVkIHdpdGggYGFkZElucHV0KClgLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRzOiBJbnB1dEF0dGFjaG1lbnRbXTtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgb3V0cHV0IGdyb3VwcyBmb3IgdGhpcyBjaGFubmVsLiBBdCBsZWFzdCBvbmUgaXMgcmVxdWlyZWQuXG4gICAqIEFkZGl0aW9uYWwgb3V0cHV0IGdyb3VwcyBjYW4gYmUgYWRkZWQgd2l0aCBgYWRkT3V0cHV0R3JvdXAoKWAuXG4gICAqXG4gICAqIEEgc2luZ2xlIGNoYW5uZWwgY2FuIGNvbnRhaW4gbXVsdGlwbGUgb3V0cHV0IGdyb3VwcyB3aXRoIGRpZmZlcmVudCBjb2RlY3NcbiAgICogKGUuZy4gSC4yNjQgYW5kIEguMjY1IGxhZGRlcnMpIHNoYXJpbmcgdGhlIHNhbWUgaW5wdXQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRHcm91cHM6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbltdO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nIGxldmVsIGZvciB0aGUgY2hhbm5lbC5cbiAgICogQGRlZmF1bHQgTG9nTGV2ZWwuRElTQUJMRURcbiAgICovXG4gIHJlYWRvbmx5IGxvZ0xldmVsPzogTG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBzcGVjaWZpY2F0aW9uIGZvciB0aGlzIGNoYW5uZWwuIERlZmluZXMgdGhlIGV4cGVjdGVkIGNvZGVjLCBiaXRyYXRlLCBhbmRcbiAgICogcmVzb2x1dGlvbiBvZiB0aGUgaW5wdXRzLCBhbmQgd2hldGhlciB0aGV5IGFyZSBzdGFuZGFyZCwgQ0RJLCBvciBFbGVtZW50YWwgTGluayBpbnB1dHMuXG4gICAqIEBkZWZhdWx0IC0gSW5wdXRTcGVjaWZpY2F0aW9uLnN0YW5kYXJkKCkgKEFWQyBjb2RlYywgMjAgTWJwcyBtYXgsIEhEIHJlc29sdXRpb24pXG4gICAqL1xuICByZWFkb25seSBpbnB1dFNwZWNpZmljYXRpb24/OiBJbnB1dFNwZWNpZmljYXRpb247XG5cbiAgLyoqXG4gICAqIEdsb2JhbCBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgY2hhbm5lbC5cbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGdsb2JhbCBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBnbG9iYWxDb25maWd1cmF0aW9uPzogR2xvYmFsQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGFncyB0byBhZGQgdG8gdGhlIGNoYW5uZWwuXG4gICAqIEBkZWZhdWx0IC0gbm8gdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIE1haW50ZW5hbmNlIHdpbmRvdyBjb25maWd1cmF0aW9uIGZvciB0aGUgY2hhbm5lbC5cbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IG1haW50ZW5hbmNlIHdpbmRvd1xuICAgKi9cbiAgcmVhZG9ubHkgbWFpbnRlbmFuY2U/OiBNYWludGVuYW5jZVNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBUaW1lY29kZSBjb25maWd1cmF0aW9uIGZvciB0aGUgY2hhbm5lbC5cbiAgICogQGRlZmF1bHQgLSBFTUJFRERFRCBzb3VyY2UsIG5vIHN5bmMgdGhyZXNob2xkXG4gICAqL1xuICByZWFkb25seSB0aW1lY29kZUNvbmZpZz86IFRpbWVjb2RlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBWUEMgb3V0cHV0IHNldHRpbmdzLiBXaGVuIHNldCwgYWxsIG91dHB1dCBlbmRwb2ludHMgYXJlIGNyZWF0ZWQgaW4gdGhlIHNwZWNpZmllZCBWUEMuXG4gICAqIEBkZWZhdWx0IC0gbm8gVlBDIChvdXRwdXRzIHVzZSBwdWJsaWMgZW5kcG9pbnRzKVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogVnBjT3V0cHV0U2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIFNldHRpbmdzIGZvciBibGFua2luZyB2aWRlbywgYXVkaW8sIGFuZCBjYXB0aW9ucyBkdXJpbmcgYWQgYXZhaWxzLlxuICAgKiBAZGVmYXVsdCAtIGF2YWlsIGJsYW5raW5nIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBhdmFpbEJsYW5raW5nPzogQXZhaWxCbGFua2luZztcblxuICAvKipcbiAgICogQWQgYXZhaWwgaGFuZGxpbmcgY29uZmlndXJhdGlvbi4gRGVmaW5lcyBob3cgU0NURS0zNSBtYXJrZXJzIGFyZSBwcm9jZXNzZWQuXG4gICAqIEBkZWZhdWx0IC0gbm8gYXZhaWwgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYXZhaWxTZXR0aW5ncz86IEF2YWlsU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG91dHB1dCBncm91cHMgcmVjZWl2ZSBTQ1RFLTM1IHNlZ21lbnRhdGlvbiBjdWVzLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZTM1U2VnbWVudGF0aW9uU2NvcGU/OiBTY3RlMzVTZWdtZW50YXRpb25TY29wZTtcblxuICAvKipcbiAgICogRmVhdHVyZSBhY3RpdmF0aW9ucyBmb3IgdGhlIGNoYW5uZWwgKGUuZy4gSW5wdXQgUHJlcGFyZSBzY2hlZHVsZSBhY3Rpb25zKS5cbiAgICogQGRlZmF1bHQgLSBhbGwgZmVhdHVyZXMgZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVBY3RpdmF0aW9ucz86IEZlYXR1cmVBY3RpdmF0aW9ucztcblxuICAvKipcbiAgICogTW90aW9uIGdyYXBoaWNzIG92ZXJsYXkgY29uZmlndXJhdGlvbi5cbiAgICogQGRlZmF1bHQgLSBtb3Rpb24gZ3JhcGhpY3MgZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IG1vdGlvbkdyYXBoaWNzQ29uZmlndXJhdGlvbj86IE1vdGlvbkdyYXBoaWNzQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogTmllbHNlbiB3YXRlcm1hcmsgY29uZmlndXJhdGlvbi5cbiAgICogQGRlZmF1bHQgLSBubyBOaWVsc2VuIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IG5pZWxzZW5Db25maWd1cmF0aW9uPzogTmllbHNlbkNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRodW1ibmFpbCBnZW5lcmF0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBkZWZhdWx0IC0gdGh1bWJuYWlscyBkaXNhYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgdGh1bWJuYWlsQ29uZmlndXJhdGlvbj86IFRodW1ibmFpbENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEJsYWNrb3V0IHNsYXRlIGNvbmZpZ3VyYXRpb24uIENvbnRyb2xzIHdoYXQgaXMgZGlzcGxheWVkIGR1cmluZyBibGFja291dCBldmVudHMuXG4gICAqIEBkZWZhdWx0IC0gYmxhY2tvdXQgc2xhdGUgZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGJsYWNrb3V0U2xhdGU/OiBCbGFja291dFNsYXRlO1xuXG4gIC8qKlxuICAgKiBHbG9iYWwgY29sb3IgY29ycmVjdGlvbiBydWxlcyBhcHBsaWVkIHRvIGFsbCBvdXRwdXRzLlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbG9yIGNvcnJlY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBjb2xvckNvcnJlY3Rpb25zPzogQ29sb3JDb3JyZWN0aW9uW107XG5cbiAgLyoqXG4gICAqIEFueXdoZXJlIHNldHRpbmdzIGZvciBydW5uaW5nIHRoZSBjaGFubmVsIG9uIEFXUyBFbGVtZW50YWwgQW55d2hlcmUuXG4gICAqIEBkZWZhdWx0IC0gbm90IGFuIEFueXdoZXJlIGNoYW5uZWxcbiAgICovXG4gIHJlYWRvbmx5IGFueXdoZXJlU2V0dGluZ3M/OiBBbnl3aGVyZVNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5naW5lIHZlcnNpb24gZm9yIHRoZSBjaGFubmVsLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbEVuZ2luZVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpbmtlZCBjaGFubmVsIHNldHRpbmdzIGZvciBwcmltYXJ5L2ZvbGxvd2VyIGNoYW5uZWwgY29uZmlndXJhdGlvbnMuXG4gICAqIEBkZWZhdWx0IC0gbm90IGEgbGlua2VkIGNoYW5uZWxcbiAgICovXG4gIHJlYWRvbmx5IGxpbmtlZENoYW5uZWxTZXR0aW5ncz86IExpbmtlZENoYW5uZWxTZXR0aW5ncztcblxuICAvKipcbiAgICogSW5wdXQgc2VjdXJpdHkgZ3JvdXBzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBjaGFubmVsLiBDb250cm9scyB3aGljaCBJUCBhZGRyZXNzZXMgY2FuIGNvbm5lY3RcbiAgICogdG8gdGhlIGNoYW5uZWwncyBvdXRwdXRzIChwdWxsLXN0eWxlIG91dHB1dHMgd2hlcmUgZG93bnN0cmVhbSBzeXN0ZW1zIGluaXRpYXRlIGNvbm5lY3Rpb25zKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjaGFubmVsIHNlY3VyaXR5IGdyb3Vwc1xuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbFNlY3VyaXR5R3JvdXBzPzogSUlucHV0U2VjdXJpdHlHcm91cFJlZltdO1xuXG4gIC8qKlxuICAgKiBBbiBBV1MgRWxlbWVudGFsIEluZmVyZW5jZSBmZWVkIHRvIHNlbmQgdGhpcyBjaGFubmVsJ3MgbWVkaWEgdG8gZm9yIGluZmVyZW5jZVxuICAgKiBwcm9jZXNzaW5nLlxuICAgKlxuICAgKiBGdXR1cmUgYnJlYWtpbmcgY2hhbmdlOiB0aGlzIHdpbGwgY2hhbmdlIHdoZW4gRWxlbWVudGFsIEluZmVyZW5jZSBpcyByZWxlYXNlZCBhcyBhbiBMMiBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGNoYW5uZWwgaXMgbm90IGFzc29jaWF0ZWQgdG8gYW4gaW5mZXJlbmNlIGZlZWRcbiAgICovXG4gIHJlYWRvbmx5IGluZmVyZW5jZUZlZWRBcm4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWN0aW9uIHRvIHRha2Ugd2hlbiB0aGUgY3VycmVudCBpbnB1dCBjb21wbGV0ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnB1dEVuZEFjdGlvbiB7XG4gIC8qKiBSZXN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IGlucHV0ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1dJVENIX0FORF9MT09QX0lOUFVUUyA9IG5ldyBJbnB1dEVuZEFjdGlvbignU1dJVENIX0FORF9MT09QX0lOUFVUUycpO1xuICAvKiogRG8gbm90aGluZyDigJQgc2hvdyBzbGF0ZSBvciBibGFjayB1bnRpbCBuZXh0IGlucHV0IHN3aXRjaCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5PTkUgPSBuZXcgSW5wdXRFbmRBY3Rpb24oJ05PTkUnKTtcblxuICAvKiogQSB2YWx1ZSBub3QgeWV0IG1vZGVsbGVkIGJ5IEFXUyBDREsuICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IElucHV0RW5kQWN0aW9uIHtcbiAgICByZXR1cm4gbmV3IElucHV0RW5kQWN0aW9uKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBUaGUgdW5kZXJseWluZyBzdHJpbmcgdmFsdWUgcGFzc2VkIHRvIENsb3VkRm9ybWF0aW9uLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBIb3cgTWVkaWFMaXZlIHBpcGVsaW5lcyBhcmUgc3luY2hyb25pc2VkLiBUaGUgbGVnYWN5IHdpcmUgc2VsZWN0b3I7IHRoZSBMMiBkZXJpdmVzIGl0IGZyb21cbiAqIHRoZSBgT3V0cHV0TG9ja2luZ2AgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWxpdmUvbGF0ZXN0L3VnL3BsYW4tcmVkdW5kYW5jeS1tb2RlLmh0bWxcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhbGl2ZS9sYXRlc3QvdWcvcGlwZWxpbmUtbG9jay5odG1sXG4gKi9cbmVudW0gT3V0cHV0TG9ja2luZ01vZGUge1xuICAvKiogU3luY2hyb25pc2UgcGlwZWxpbmVzIHRvIGVhY2ggb3RoZXIgKi9cbiAgUElQRUxJTkVfTE9DS0lORyA9ICdQSVBFTElORV9MT0NLSU5HJyxcbiAgLyoqIFN5bmNocm9uaXNlIHBpcGVsaW5lcyB0byB0aGUgVW5peCBlcG9jaCAqL1xuICBFUE9DSF9MT0NLSU5HID0gJ0VQT0NIX0xPQ0tJTkcnLFxufVxuXG4vKipcbiAqIFNvdXJjZSBvZiBvdXRwdXQgdGltaW5nLlxuICovXG5leHBvcnQgY2xhc3MgT3V0cHV0VGltaW5nU291cmNlIHtcbiAgLyoqIFVzZSB0aGUgaW5wdXQgY2xvY2sgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBJTlBVVF9DTE9DSyA9IG5ldyBPdXRwdXRUaW1pbmdTb3VyY2UoJ0lOUFVUX0NMT0NLJyk7XG4gIC8qKiBVc2UgdGhlIHN5c3RlbSBjbG9jayAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNZU1RFTV9DTE9DSyA9IG5ldyBPdXRwdXRUaW1pbmdTb3VyY2UoJ1NZU1RFTV9DTE9DSycpO1xuXG4gIC8qKiBBIHZhbHVlIG5vdCB5ZXQgbW9kZWxsZWQgYnkgQVdTIENESy4gKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogT3V0cHV0VGltaW5nU291cmNlIHtcbiAgICByZXR1cm4gbmV3IE91dHB1dFRpbWluZ1NvdXJjZSh2YWx1ZSk7XG4gIH1cblxuICAvKiogVGhlIHVuZGVybHlpbmcgc3RyaW5nIHZhbHVlIHBhc3NlZCB0byBDbG91ZEZvcm1hdGlvbi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKiBUaGUgaW1hZ2UgTWVkaWFMaXZlIHN1YnN0aXR1dGVzIGludG8gdGhlIG91dHB1dCBvbiBpbnB1dCBsb3NzLiAqL1xuZXhwb3J0IGNsYXNzIElucHV0TG9zc0ltYWdlVHlwZSB7XG4gIC8qKiBTdWJzdGl0dXRlIGEgc29saWQgY29sb3IuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ09MT1IgPSBuZXcgSW5wdXRMb3NzSW1hZ2VUeXBlKCdDT0xPUicpO1xuICAvKiogU3Vic3RpdHV0ZSBhIHNsYXRlIGltYWdlLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNMQVRFID0gbmV3IElucHV0TG9zc0ltYWdlVHlwZSgnU0xBVEUnKTtcblxuICAvKiogQSB2YWx1ZSBub3QgeWV0IG1vZGVsbGVkIGJ5IEFXUyBDREsuICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IElucHV0TG9zc0ltYWdlVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dExvc3NJbWFnZVR5cGUodmFsdWUpO1xuICB9XG5cbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHN0cmluZyB2YWx1ZSBwYXNzZWQgdG8gQ2xvdWRGb3JtYXRpb24uICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEJlaGF2aW9yIG9uIGlucHV0IGxvc3M6IHN1YnN0aXR1dGUgYmxhY2ssIG9wdGlvbmFsbHkgcmVwZWF0IHRoZSBsYXN0IGZyYW1lLCB0aGVuIHNob3cgYSBzb2xpZFxuICogY29sb3Igb3IgYSBzbGF0ZSBpbWFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dExvc3NCZWhhdmlvciB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byBzdWJzdGl0dXRlIGJsYWNrIGJlZm9yZSBzaG93aW5nIHRoZSBpbnB1dC1sb3NzIGltYWdlICh1cCB0byBEdXJhdGlvbi5zZWNvbmRzKDEwMDApO1xuICAgKiBEdXJhdGlvbi5zZWNvbmRzKDEwMDApIGlzIGludGVycHJldGVkIGFzIGluZmluaXRlKS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGJsYWNrRnJhbWU/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIEhvdyBsb25nIHRvIHJlcGVhdCB0aGUgcHJldmlvdXMgcGljdHVyZSBiZWZvcmUgc3Vic3RpdHV0aW5nIGJsYWNrICh1cCB0byBEdXJhdGlvbi5zZWNvbmRzKDEwMDApO1xuICAgKiBEdXJhdGlvbi5zZWNvbmRzKDEwMDApIGlzIGludGVycHJldGVkIGFzIGluZmluaXRlKS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IHJlcGVhdEZyYW1lPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN1YnN0aXR1dGUgYSBzb2xpZCBjb2xvciBvciBhIHNsYXRlIGltYWdlIGFmdGVyIHRoZSBibGFjayBwZXJpb2QuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBpbWFnZVR5cGU/OiBJbnB1dExvc3NJbWFnZVR5cGU7XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgY29sb3IgYXMgNiBoZXggY2hhcmFjdGVycyAoUkdCKS4gVXNlZCB3aGVuIElucHV0TG9zc0ltYWdlVHlwZS5DT0xPUi5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlQ29sb3I/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2xhdGUgaW1hZ2UgdG8gZGlzcGxheS4gVXNlZCB3aGVuIGBpbWFnZVR5cGVgIGlzIFNMQVRFLiBQcm92aWRlIGEgYEZpbGVMb2NhdGlvbmBcbiAgICogcmVmZXJlbmNpbmcgYW4gUzMgYnVja2V0IChgRmlsZUxvY2F0aW9uLmZyb21CdWNrZXRgLCB3aGljaCBhdXRvLWdyYW50cyByZWFkIGFjY2Vzcykgb3JcbiAgICogYSBVUkwgKGBGaWxlTG9jYXRpb24udXJsYCkuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBpbWFnZVNsYXRlPzogRmlsZUxvY2F0aW9uO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgZXBvY2ggb3V0cHV0IGxvY2tpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIEVwb2NoT3V0cHV0TG9ja2luZ1Byb3BzIHtcbiAgLyoqXG4gICAqIEEgY3VzdG9tIGVwb2NoIChJU08tODYwMSB0aW1lc3RhbXApIHRvIGxvY2sgb3V0cHV0cyB0by5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbUVwb2NoPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBqYW0tc3luYyB0aW1lIChJU08tODYwMSB0aW1lc3RhbXApLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgamFtU3luY1RpbWU/OiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgbWV0aG9kIE1lZGlhTGl2ZSB1c2VzIHRvIHN5bmNocm9uaXNlIHBpcGVsaW5lcyBmb3IgcGlwZWxpbmUgb3V0cHV0IGxvY2tpbmcuICovXG5leHBvcnQgY2xhc3MgUGlwZWxpbmVMb2NraW5nTWV0aG9kIHtcbiAgLyoqIFVzZSB0aGUgdGltZWNvZGUgaW4gdGhlIHNvdXJjZSAodGhlIGRlZmF1bHQpLiBSZXF1aXJlcyByZWxpYWJsZSBlbWJlZGRlZCB0aW1lY29kZXMuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU09VUkNFX1RJTUVDT0RFID0gbmV3IFBpcGVsaW5lTG9ja2luZ01ldGhvZCgnU09VUkNFX1RJTUVDT0RFJyk7XG4gIC8qKlxuICAgKiBMb2NrIGZyYW1lcyB0aGUgZW5jb2RlciBpZGVudGlmaWVzIGFzIGhhdmluZyBtYXRjaGluZyBjb250ZW50ICh2aXN1YWwgc2lnbmF0dXJlIGNvbXBhcmlzb24pLlxuICAgKiBEb2VzIG5vdCByZXF1aXJlIGVtYmVkZGVkIHRpbWVjb2RlczsgZXhpc3RpbmcgdGltZWNvZGVzIGFyZSBpZ25vcmVkIGZvciBsb2NraW5nIGRlY2lzaW9ucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVklERU9fQUxJR05NRU5UID0gbmV3IFBpcGVsaW5lTG9ja2luZ01ldGhvZCgnVklERU9fQUxJR05NRU5UJyk7XG5cbiAgLyoqIEEgdmFsdWUgbm90IHlldCBtb2RlbGxlZCBieSBBV1MgQ0RLLiAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBQaXBlbGluZUxvY2tpbmdNZXRob2Qge1xuICAgIHJldHVybiBuZXcgUGlwZWxpbmVMb2NraW5nTWV0aG9kKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBUaGUgdW5kZXJseWluZyBzdHJpbmcgdmFsdWUgcGFzc2VkIHRvIENsb3VkRm9ybWF0aW9uLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqIFByb3BlcnRpZXMgZm9yIHBpcGVsaW5lIG91dHB1dCBsb2NraW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZU91dHB1dExvY2tpbmdQcm9wcyB7XG4gIC8qKlxuICAgKiBBIGN1c3RvbSBlcG9jaCAoSVNPLTg2MDEgdGltZXN0YW1wKSB0byBsb2NrIG91dHB1dHMgdG8uXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBjdXN0b21FcG9jaD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgTWVkaWFMaXZlIHVzZXMgdG8gc3luY2hyb25pc2UgdGhlIHBpcGVsaW5lcy5cbiAgICogQGRlZmF1bHQgLSBTT1VSQ0VfVElNRUNPREUsIGFwcGxpZWQgYnkgTWVkaWFMaXZlXG4gICAqL1xuICByZWFkb25seSBtZXRob2Q/OiBQaXBlbGluZUxvY2tpbmdNZXRob2Q7XG59XG5cbi8qKlxuICogT3V0cHV0IGxvY2tpbmcgc3luY2hyb25pc2VzIHRoZSBmcmFtZXMgZW1pdHRlZCBieSBhIGNoYW5uZWwncyB0d28gcGlwZWxpbmVzLiBVc2UgdGhlIHN0YXRpY1xuICogZmFjdG9yeSBtZXRob2RzIHRvIHNlbGVjdCBhIHN0cmF0ZWd5OlxuICpcbiAqIC0gYE91dHB1dExvY2tpbmcucGlwZWxpbmUoKWAg4oCUIHN5bmNocm9uaXNlIGVhY2ggcGlwZWxpbmUncyBvdXRwdXQgdG8gdGhlIG90aGVyLlxuICogLSBgT3V0cHV0TG9ja2luZy5lcG9jaCgpYCDigJQgc3luY2hyb25pc2UgZWFjaCBwaXBlbGluZSdzIG91dHB1dCB0byB0aGUgVW5peCBlcG9jaC5cbiAqIC0gYE91dHB1dExvY2tpbmcuZGlzYWJsZWQoKWAg4oCUIGRvIG5vdCBzeW5jaHJvbmlzZSBwaXBlbGluZXMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFsaXZlL2xhdGVzdC91Zy9wbGFuLXJlZHVuZGFuY3ktbW9kZS5odG1sXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWxpdmUvbGF0ZXN0L3VnL3BpcGVsaW5lLWxvY2suaHRtbFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgT3V0cHV0TG9ja2luZyB7XG4gIC8qKiBEaXNhYmxlIG91dHB1dCBsb2NraW5nIChvcHRpb25hbGx5IHdpdGggYSBjdXN0b20gZXBvY2gpLiAqL1xuICBwdWJsaWMgc3RhdGljIGRpc2FibGVkKGN1c3RvbUVwb2NoPzogc3RyaW5nKTogT3V0cHV0TG9ja2luZyB7XG4gICAgcmV0dXJuIG5ldyBEaXNhYmxlZE91dHB1dExvY2tpbmcoY3VzdG9tRXBvY2gpO1xuICB9XG4gIC8qKiBMb2NrIG91dHB1dHMgdG8gYW4gZXBvY2guICovXG4gIHB1YmxpYyBzdGF0aWMgZXBvY2gocHJvcHM6IEVwb2NoT3V0cHV0TG9ja2luZ1Byb3BzID0ge30pOiBPdXRwdXRMb2NraW5nIHtcbiAgICByZXR1cm4gbmV3IEVwb2NoT3V0cHV0TG9ja2luZyhwcm9wcyk7XG4gIH1cbiAgLyoqIExvY2sgcGlwZWxpbmVzIHRvIGVhY2ggb3RoZXIuICovXG4gIHB1YmxpYyBzdGF0aWMgcGlwZWxpbmUocHJvcHM6IFBpcGVsaW5lT3V0cHV0TG9ja2luZ1Byb3BzID0ge30pOiBPdXRwdXRMb2NraW5nIHtcbiAgICByZXR1cm4gbmV3IFBpcGVsaW5lT3V0cHV0TG9ja2luZyhwcm9wcyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dExvY2tpbmdTZXR0aW5nc1Byb3BlcnR5O1xuXG4gIC8qKlxuICAgKiBUaGUgbGVnYWN5IGBPdXRwdXRMb2NraW5nTW9kZWAgd2lyZSB2YWx1ZSBpbXBsaWVkIGJ5IHRoaXMgc3RyYXRlZ3ksIG9yIGB1bmRlZmluZWRgIGZvclxuICAgKiBkaXNhYmxlZCAod2hpY2ggaGFzIG5vIGxlZ2FjeSBtb2RlIHZhbHVlIOKAlCBpdCdzIGV4cHJlc3NlZCBvbmx5IHZpYSB0aGUgc2V0dGluZ3MgYmxvY2spLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfbW9kZSgpOiBPdXRwdXRMb2NraW5nTW9kZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgRGlzYWJsZWRPdXRwdXRMb2NraW5nIGV4dGVuZHMgT3V0cHV0TG9ja2luZyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tRXBvY2g/OiBzdHJpbmcpIHsgc3VwZXIoKTsgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5PdXRwdXRMb2NraW5nU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHsgZGlzYWJsZWRMb2NraW5nU2V0dGluZ3M6IHsgY3VzdG9tRXBvY2g6IHRoaXMuY3VzdG9tRXBvY2ggfSB9O1xuICB9XG4gIHB1YmxpYyBfbW9kZSgpOiBPdXRwdXRMb2NraW5nTW9kZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBFcG9jaE91dHB1dExvY2tpbmcgZXh0ZW5kcyBPdXRwdXRMb2NraW5nIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogRXBvY2hPdXRwdXRMb2NraW5nUHJvcHMpIHsgc3VwZXIoKTsgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5PdXRwdXRMb2NraW5nU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHsgZXBvY2hMb2NraW5nU2V0dGluZ3M6IHsgY3VzdG9tRXBvY2g6IHRoaXMucHJvcHMuY3VzdG9tRXBvY2gsIGphbVN5bmNUaW1lOiB0aGlzLnByb3BzLmphbVN5bmNUaW1lIH0gfTtcbiAgfVxuICBwdWJsaWMgX21vZGUoKTogT3V0cHV0TG9ja2luZ01vZGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBPdXRwdXRMb2NraW5nTW9kZS5FUE9DSF9MT0NLSU5HO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFBpcGVsaW5lT3V0cHV0TG9ja2luZyBleHRlbmRzIE91dHB1dExvY2tpbmcge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBQaXBlbGluZU91dHB1dExvY2tpbmdQcm9wcykgeyBzdXBlcigpOyB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dExvY2tpbmdTZXR0aW5nc1Byb3BlcnR5IHtcbiAgICByZXR1cm4geyBwaXBlbGluZUxvY2tpbmdTZXR0aW5nczogeyBjdXN0b21FcG9jaDogdGhpcy5wcm9wcy5jdXN0b21FcG9jaCwgcGlwZWxpbmVMb2NraW5nTWV0aG9kOiB0aGlzLnByb3BzLm1ldGhvZD8udmFsdWUgfSB9O1xuICB9XG4gIHB1YmxpYyBfbW9kZSgpOiBPdXRwdXRMb2NraW5nTW9kZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIE91dHB1dExvY2tpbmdNb2RlLlBJUEVMSU5FX0xPQ0tJTkc7XG4gIH1cbn1cblxuLyoqXG4gKiBHbG9iYWwgY29uZmlndXJhdGlvbiBzZXR0aW5ncyB0aGF0IGFwcGx5IHRvIHRoZSBlbnRpcmUgY2hhbm5lbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIGF1ZGlvIGdhaW4gZm9yIHRoZSBjaGFubmVsICgtNjAgdG8gNjAgZEIpLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbEF1ZGlvR2Fpbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIEFjdGlvbiB0byB0YWtlIHdoZW4gdGhlIGN1cnJlbnQgaW5wdXQgY29tcGxldGVzLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRFbmRBY3Rpb24/OiBJbnB1dEVuZEFjdGlvbjtcbiAgLyoqXG4gICAqIFNvdXJjZSBvZiBvdXRwdXQgdGltaW5nLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0VGltaW5nU291cmNlPzogT3V0cHV0VGltaW5nU291cmNlO1xuICAvKipcbiAgICogRW5hYmxlIHN1cHBvcnQgZm9yIGxvdyBmcmFtZXJhdGUgaW5wdXRzIChlLmcuIG11c2ljIGNoYW5uZWxzIHdpdGggbGVzcyB0aGFuIDEgZnBzKS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHN1cHBvcnRMb3dGcmFtZXJhdGVJbnB1dHM/OiBib29sZWFuO1xuICAvKipcbiAgICogQmVoYXZpb3Igb24gaW5wdXQgbG9zcyAoc3Vic3RpdHV0ZSBibGFjayAvIHJlcGVhdCBmcmFtZSwgdGhlbiBhIGNvbG9yIG9yIHNsYXRlIGltYWdlKS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TG9zc0JlaGF2aW9yPzogSW5wdXRMb3NzQmVoYXZpb3I7XG4gIC8qKlxuICAgKiBIb3cgTWVkaWFMaXZlIHBpcGVsaW5lcyBhcmUgc3luY2hyb25pc2VkIOKAlCBgT3V0cHV0TG9ja2luZy5waXBlbGluZSgpYCxcbiAgICogYE91dHB1dExvY2tpbmcuZXBvY2goKWAsIG9yIGBPdXRwdXRMb2NraW5nLmRpc2FibGVkKClgLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWxpdmUvbGF0ZXN0L3VnL3BsYW4tcmVkdW5kYW5jeS1tb2RlLmh0bWxcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFsaXZlL2xhdGVzdC91Zy9waXBlbGluZS1sb2NrLmh0bWxcbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dExvY2tpbmc/OiBPdXRwdXRMb2NraW5nO1xufVxuXG4vKipcbiAqIERheSBvZiB0aGUgd2VlayBmb3IgbWFpbnRlbmFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYWludGVuYW5jZURheSB7XG4gIC8qKiBNb25kYXkgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNT05EQVkgPSBuZXcgTWFpbnRlbmFuY2VEYXkoJ01PTkRBWScpO1xuICAvKiogVHVlc2RheSAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRVRVNEQVkgPSBuZXcgTWFpbnRlbmFuY2VEYXkoJ1RVRVNEQVknKTtcbiAgLyoqIFdlZG5lc2RheSAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFdFRE5FU0RBWSA9IG5ldyBNYWludGVuYW5jZURheSgnV0VETkVTREFZJyk7XG4gIC8qKiBUaHVyc2RheSAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRIVVJTREFZID0gbmV3IE1haW50ZW5hbmNlRGF5KCdUSFVSU0RBWScpO1xuICAvKiogRnJpZGF5ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRlJJREFZID0gbmV3IE1haW50ZW5hbmNlRGF5KCdGUklEQVknKTtcbiAgLyoqIFNhdHVyZGF5ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0FUVVJEQVkgPSBuZXcgTWFpbnRlbmFuY2VEYXkoJ1NBVFVSREFZJyk7XG4gIC8qKiBTdW5kYXkgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVU5EQVkgPSBuZXcgTWFpbnRlbmFuY2VEYXkoJ1NVTkRBWScpO1xuXG4gIC8qKiBBIHZhbHVlIG5vdCB5ZXQgbW9kZWxsZWQgYnkgQVdTIENESy4gKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogTWFpbnRlbmFuY2VEYXkge1xuICAgIHJldHVybiBuZXcgTWFpbnRlbmFuY2VEYXkodmFsdWUpO1xuICB9XG5cbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHN0cmluZyB2YWx1ZSBwYXNzZWQgdG8gQ2xvdWRGb3JtYXRpb24uICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIE1haW50ZW5hbmNlIHdpbmRvdyBzZXR0aW5ncyBmb3IgdGhlIGNoYW5uZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFpbnRlbmFuY2VTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBUaGUgZGF5IG9mIHRoZSB3ZWVrIGZvciBtYWludGVuYW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGRheTogTWFpbnRlbmFuY2VEYXk7XG4gIC8qKlxuICAgKiBUaGUgc3RhcnQgdGltZSBmb3IgbWFpbnRlbmFuY2UgaW4gVVRDIChISDpNTSBmb3JtYXQsIGUuZy4gJzAyOjAwJykuXG4gICAqIEBkZWZhdWx0ICcwMjowMCdcbiAgICovXG4gIHJlYWRvbmx5IHRpbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW55d2hlcmUgc2V0dGluZ3MgZm9yIHJ1bm5pbmcgdGhlIGNoYW5uZWwgb24gQVdTIEVsZW1lbnRhbCBBbnl3aGVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbnl3aGVyZVNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFRoZSBjbHVzdGVyIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyOiBJQ2x1c3RlclJlZjtcbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIHBsYWNlbWVudCBncm91cCBmb3IgdGhpcyBjaGFubmVsLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHBsYWNlbWVudCBncm91cFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbFBsYWNlbWVudEdyb3VwPzogSUNoYW5uZWxQbGFjZW1lbnRHcm91cFJlZjtcbn1cblxuLyoqXG4gKiBMaW5rZWQgY2hhbm5lbCB0eXBlLlxuICovXG5lbnVtIExpbmtlZENoYW5uZWxUeXBlIHtcbiAgLyoqIFRoaXMgY2hhbm5lbCBpcyB0aGUgcHJpbWFyeSAqL1xuICBQUklNQVJZID0gJ1BSSU1BUllfQ0hBTk5FTCcsXG4gIC8qKiBUaGlzIGNoYW5uZWwgZm9sbG93cyBhIHByaW1hcnkgKi9cbiAgRk9MTE9XRVIgPSAnRk9MTE9XSU5HX0NIQU5ORUwnLFxufVxuXG4vKipcbiAqIExpbmtlZCBjaGFubmVsIHNldHRpbmdzIGZvciBwcmltYXJ5L2ZvbGxvd2VyIGNoYW5uZWwgY29uZmlndXJhdGlvbnMuXG4gKiBVc2UgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgdG8gY3JlYXRlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGlua2VkQ2hhbm5lbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGlzIGNoYW5uZWwgYXMgYSBwcmltYXJ5IGluIGEgbGlua2VkIGNoYW5uZWwgcGFpci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcHJpbWFyeSgpOiBMaW5rZWRDaGFubmVsU2V0dGluZ3Mge1xuICAgIHJldHVybiBuZXcgUHJpbWFyeUxpbmtlZENoYW5uZWxTZXR0aW5ncygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGlzIGNoYW5uZWwgYXMgYSBmb2xsb3dlciBvZiBhIHByaW1hcnkgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIHByaW1hcnlDaGFubmVsIFRoZSBwcmltYXJ5IGNoYW5uZWwgdGhpcyBjaGFubmVsIGZvbGxvd3MuIFVzZSBhIGBDaGFubmVsYFxuICAgKiBpbnN0YW5jZSBvciBpbXBvcnQgb25lIHdpdGggYENoYW5uZWwuZnJvbUNoYW5uZWxBcm4oKWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZvbGxvd2VyKHByaW1hcnlDaGFubmVsOiBJQ2hhbm5lbCk6IExpbmtlZENoYW5uZWxTZXR0aW5ncyB7XG4gICAgcmV0dXJuIG5ldyBGb2xsb3dlckxpbmtlZENoYW5uZWxTZXR0aW5ncyhwcmltYXJ5Q2hhbm5lbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZCgpOiBDZm5DaGFubmVsLkxpbmtlZENoYW5uZWxTZXR0aW5nc1Byb3BlcnR5O1xufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBQcmltYXJ5TGlua2VkQ2hhbm5lbFNldHRpbmdzIGV4dGVuZHMgTGlua2VkQ2hhbm5lbFNldHRpbmdzIHtcbiAgcHVibGljIF9iaW5kKCk6IENmbkNoYW5uZWwuTGlua2VkQ2hhbm5lbFNldHRpbmdzUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBwcmltYXJ5Q2hhbm5lbFNldHRpbmdzOiB7XG4gICAgICAgIGxpbmtlZENoYW5uZWxUeXBlOiBMaW5rZWRDaGFubmVsVHlwZS5QUklNQVJZLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIEZvbGxvd2VyTGlua2VkQ2hhbm5lbFNldHRpbmdzIGV4dGVuZHMgTGlua2VkQ2hhbm5lbFNldHRpbmdzIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcmltYXJ5Q2hhbm5lbDogSUNoYW5uZWwpIHsgc3VwZXIoKTsgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5MaW5rZWRDaGFubmVsU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvbGxvd2VyQ2hhbm5lbFNldHRpbmdzOiB7XG4gICAgICAgIGxpbmtlZENoYW5uZWxUeXBlOiBMaW5rZWRDaGFubmVsVHlwZS5GT0xMT1dFUixcbiAgICAgICAgcHJpbWFyeUNoYW5uZWxBcm46IHRoaXMucHJpbWFyeUNoYW5uZWwuY2hhbm5lbEFybixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFZQQyBvdXRwdXQgc2V0dGluZ3MgZm9yIHRoZSBjaGFubmVsLlxuICogV2hlbiBjb25maWd1cmVkLCBhbGwgb3V0cHV0IGVuZHBvaW50cyBhcmUgY3JlYXRlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBWUEMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjT3V0cHV0U2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIHN1Ym5ldHMgdG8gdXNlIGZvciB0aGUgY2hhbm5lbCdzIG91dHB1dCBlbmRwb2ludHMuXG4gICAqIEZvciBTVEFOREFSRCBjaGFubmVscywgcHJvdmlkZSBzdWJuZXRzIGluIHR3byBkaWZmZXJlbnQgYXZhaWxhYmlsaXR5IHpvbmVzLlxuICAgKiBGb3IgU0lOR0xFX1BJUEVMSU5FIGNoYW5uZWxzLCBwcm92aWRlIGF0IGxlYXN0IG9uZSBzdWJuZXQuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRzOiBJU3VibmV0UmVmW107XG4gIC8qKlxuICAgKiBUaGUgc2VjdXJpdHkgZ3JvdXBzIHRvIGF0dGFjaCB0byB0aGUgb3V0cHV0IFZQQyBuZXR3b3JrIGludGVyZmFjZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVlBDIGRlZmF1bHQgc2VjdXJpdHkgZ3JvdXBcbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzPzogSVNlY3VyaXR5R3JvdXBSZWZbXTtcbiAgLyoqXG4gICAqIFB1YmxpYyBhZGRyZXNzIGFsbG9jYXRpb24gSURzIHRvIGFzc29jaWF0ZSB3aXRoIEVOSXMgY3JlYXRlZCBpbiB0aGUgb3V0cHV0IFZQQy5cbiAgICogTXVzdCBzcGVjaWZ5IG9uZSBmb3IgU0lOR0xFX1BJUEVMSU5FLCB0d28gZm9yIFNUQU5EQVJEIGNoYW5uZWxzLlxuICAgKiBAZGVmYXVsdCAtIG5vIHB1YmxpYyBhZGRyZXNzZXNcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0FkZHJlc3NBbGxvY2F0aW9uSWRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogU2hhcmVkIG1ldHJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgYm90aCByZWFsIGFuZCBpbXBvcnRlZCBjaGFubmVscy5cbiAqL1xuYWJzdHJhY3QgY2xhc3MgQ2hhbm5lbEJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElDaGFubmVsIHtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNoYW5uZWxBcm46IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNoYW5uZWxJZDogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY2hhbm5lbElucHV0cz86IHN0cmluZ1tdO1xuICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGNoYW5uZWxSZWYoKTogQ2hhbm5lbFJlZmVyZW5jZTtcblxuICAvKiogQ29sbGVjdGlvbiBvZiBncmFudCBtZXRob2RzIGZvciB0aGlzIGNoYW5uZWwg4oCUIHN0YXJ0LCBzdG9wLCBhbmQgdXBkYXRlIGl0cyBzY2hlZHVsZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50czogQ2hhbm5lbEdyYW50cyA9IENoYW5uZWxHcmFudHMuZnJvbUNoYW5uZWwodGhpcyk7XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIGNsYXNzLCBvciBgdW5kZWZpbmVkYCBmb3IgaW1wb3J0ZWQgY2hhbm5lbHMgKHNraXAgcGlwZWxpbmUgdmFsaWRhdGlvbikuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBfY2hhbm5lbENsYXNzKCk6IENoYW5uZWxDbGFzcyB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcGlwZWxpbmU6IFBpcGVsaW5lLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIGlmIChwaXBlbGluZSA9PT0gUGlwZWxpbmUuUElQRUxJTkVfMSAmJiB0aGlzLl9jaGFubmVsQ2xhc3M/LnZhbHVlID09PSBDaGFubmVsQ2xhc3MuU0lOR0xFX1BJUEVMSU5FLnZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgU2luZ2xlUGlwZWxpbmVDaGFubmVsSGFzTm9QaXBlbGluZU9uZWAsXG4gICAgICAgICdQaXBlbGluZS5QSVBFTElORV8xIGlzIG5vdCBhdmFpbGFibGUgb24gU0lOR0xFX1BJUEVMSU5FIGNoYW5uZWxzLiBVc2UgUGlwZWxpbmUuUElQRUxJTkVfMCwgb3Igc2V0IGNoYW5uZWxDbGFzczogQ2hhbm5lbENsYXNzLlNUQU5EQVJEJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTWV0cmljKHtcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBuYW1lc3BhY2U6ICdBV1MvTWVkaWFMaXZlJyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgLy8gUmVxdWlyZWQgZGltZW5zaW9ucyBhcHBsaWVkIGxhc3Qgc28gYSBjYWxsZXIncyBkaW1lbnNpb25zTWFwIGNhbid0IGRyb3AgQ2hhbm5lbElkL1BpcGVsaW5lLlxuICAgICAgZGltZW5zaW9uc01hcDogeyAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCwgQ2hhbm5lbElkOiB0aGlzLmNoYW5uZWxJZCwgUGlwZWxpbmU6IHBpcGVsaW5lLnRvU3RyaW5nKCkgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNBY3RpdmVBbGVydHMocGlwZWxpbmU6IFBpcGVsaW5lLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnQWN0aXZlQWxlcnRzJywgcGlwZWxpbmUsIHsgc3RhdGlzdGljOiAnbWF4JywgLi4ucHJvcHMgfSk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljTmV0d29ya0luKHBpcGVsaW5lOiBQaXBlbGluZSwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ05ldHdvcmtJbicsIHBpcGVsaW5lLCB7IHN0YXRpc3RpYzogJ2F2ZycsIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY05ldHdvcmtPdXQocGlwZWxpbmU6IFBpcGVsaW5lLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnTmV0d29ya091dCcsIHBpcGVsaW5lLCB7IHN0YXRpc3RpYzogJ2F2ZycsIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0lucHV0VmlkZW9GcmFtZVJhdGUocGlwZWxpbmU6IFBpcGVsaW5lLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnSW5wdXRWaWRlb0ZyYW1lUmF0ZScsIHBpcGVsaW5lLCB7IHN0YXRpc3RpYzogJ21heCcsIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0ZpbGxNc2VjKHBpcGVsaW5lOiBQaXBlbGluZSwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0ZpbGxNc2VjJywgcGlwZWxpbmUsIHsgc3RhdGlzdGljOiAnbWF4JywgLi4ucHJvcHMgfSk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljSW5wdXRMb3NzU2Vjb25kcyhwaXBlbGluZTogUGlwZWxpbmUsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdJbnB1dExvc3NTZWNvbmRzJywgcGlwZWxpbmUsIHsgc3RhdGlzdGljOiAnc3VtJywgLi4ucHJvcHMgfSk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljRHJvcHBlZEZyYW1lcyhwaXBlbGluZTogUGlwZWxpbmUsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdEcm9wcGVkRnJhbWVzJywgcGlwZWxpbmUsIHsgc3RhdGlzdGljOiAnc3VtJywgLi4ucHJvcHMgfSk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljU3ZxVGltZShwaXBlbGluZTogUGlwZWxpbmUsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTdnFUaW1lJywgcGlwZWxpbmUsIHsgc3RhdGlzdGljOiAnbWF4JywgLi4ucHJvcHMgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIEFXUyBFbGVtZW50YWwgTWVkaWFMaXZlIENoYW5uZWwuXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBDaGFubmVsIGV4dGVuZHMgQ2hhbm5lbEJhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1tZWRpYWxpdmUtYWxwaGEuQ2hhbm5lbCc7XG5cbiAgLyoqIEltcG9ydCBhbiBleGlzdGluZyBjaGFubmVsIGJ5IGl0cyBBUk4uIFRoZSBpZCBpcyBwYXJzZWQgb3V0IG9mIHRoZSBBUk4uICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNoYW5uZWxBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY2hhbm5lbEFybjogc3RyaW5nKTogSUNoYW5uZWwge1xuICAgIGNvbnN0IGNoYW5uZWxJZCA9IGV4dHJhY3RSZXNvdXJjZUlkKGNoYW5uZWxBcm4sICdDaGFubmVsJyk7XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBDaGFubmVsQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEFybiA9IGNoYW5uZWxBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbElkID0gY2hhbm5lbElkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxJbnB1dHMgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgZ2V0IGNoYW5uZWxSZWYoKTogQ2hhbm5lbFJlZmVyZW5jZSB7XG4gICAgICAgIHJldHVybiB7IGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsIGNoYW5uZWxBcm46IHRoaXMuY2hhbm5lbEFybiB9O1xuICAgICAgfVxuICAgICAgLy8gSW1wb3J0ZWQgY2hhbm5lbHMgYXJlIG5vdCB2YWxpZGF0ZWQgYWdhaW5zdCBQSVBFTElORV8xIHVzZSBiZWNhdXNlIHdlXG4gICAgICAvLyBjYW5ub3Qga25vdyBob3cgdGhlIGNoYW5uZWwgd2FzIHByb3Zpc2lvbmVkLlxuICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jaGFubmVsQ2xhc3MgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbElkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBjaGFubmVsSW5wdXRzPzogc3RyaW5nW107XG5cbiAgLyoqIFRoZSBJQU0gcm9sZSB1c2VkIGJ5IHRoaXMgY2hhbm5lbC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGU6IElSb2xlO1xuXG4gIC8qKiBBIHJlZmVyZW5jZSB0byB0aGlzIENoYW5uZWwgcmVzb3VyY2UuICovXG4gIHB1YmxpYyBnZXQgY2hhbm5lbFJlZigpOiBDaGFubmVsUmVmZXJlbmNlIHtcbiAgICByZXR1cm4geyBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbElkLCBjaGFubmVsQXJuOiB0aGlzLmNoYW5uZWxBcm4gfTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jaGFubmVsQ2xhc3M6IENoYW5uZWxDbGFzcztcblxuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0QXR0YWNobWVudHM6IENmbkNoYW5uZWwuSW5wdXRBdHRhY2htZW50UHJvcGVydHlbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dGFjaG1lbnRzOiBJbnB1dEF0dGFjaG1lbnRbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhc0FueXdoZXJlU2V0dGluZ3M6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0R3JvdXBzOiBPdXRwdXRHcm91cFtdID0gW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNhbGxlciBzdXBwbGllZCB0aGVpciBvd24gYHJvbGVgLiBXaGVuIHRydWUsIHRoZSBjaGFubmVsIG1ha2VzIG5vIGF1dG9tYXRpY1xuICAgKiBncmFudHMuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJQcm92aWRlZFJvbGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlc0Vwb2NoTG9ja2luZzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2hhbm5lbFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLmNoYW5uZWxOYW1lID8/IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiAyNTYgfSkgfSksXG4gICAgfSk7XG5cbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuaW5wdXRzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YENoYW5uZWxNaW5JbnB1dHNgLCAnQSBjaGFubmVsIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgaW5wdXQuJywgdGhpcyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5vdXRwdXRHcm91cHMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgQ2hhbm5lbE1pbk91dHB1dEdyb3Vwc2AsICdBIGNoYW5uZWwgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBvdXRwdXQgZ3JvdXAuJywgdGhpcyk7XG4gICAgfVxuICAgIHByb3BzLmlucHV0cy5mb3JFYWNoKGF0dGFjaG1lbnQgPT4ge1xuICAgICAgdGhpcy5hdHRhY2htZW50cy5wdXNoKGF0dGFjaG1lbnQpO1xuICAgICAgdGhpcy5pbnB1dEF0dGFjaG1lbnRzLnB1c2godGhpcy5idWlsZElucHV0QXR0YWNobWVudChhdHRhY2htZW50KSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VzRXBvY2hMb2NraW5nID0gcHJvcHMuZ2xvYmFsQ29uZmlndXJhdGlvbj8ub3V0cHV0TG9ja2luZz8uX21vZGUoKSA9PT0gT3V0cHV0TG9ja2luZ01vZGUuRVBPQ0hfTE9DS0lORztcbiAgICBwcm9wcy5vdXRwdXRHcm91cHMuZm9yRWFjaChjb25maWcgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0R3JvdXAgPSBuZXcgT3V0cHV0R3JvdXAoY29uZmlnKTtcbiAgICAgIGlmICh1c2VzRXBvY2hMb2NraW5nKSB7XG4gICAgICAgIG91dHB1dEdyb3VwLl9zZXRFcG9jaExvY2tpbmcodHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLm91dHB1dEdyb3Vwcy5wdXNoKG91dHB1dEdyb3VwKTtcbiAgICB9KTtcblxuICAgIC8vIEEgY2hhbm5lbCBtYXkgaGF2ZSBhdCBtb3N0IG9uZSBNZWRpYUNvbm5lY3QgUm91dGVyIG91dHB1dCBncm91cC4gRGV0ZWN0ZWQgYnkgb3V0cHV0LWdyb3VwXG4gICAgLy8gc2V0dGluZ3Mgc2hhcGUgcmF0aGVyIHRoYW4gYW4gYGluc3RhbmNlb2ZgIGNoZWNrLCBwZXIgdGhpcyBtb2R1bGUncyBzdGF0aWMtdHlwZS1jaGVja1xuICAgIC8vIGNvbnZlbnRpb24uXG4gICAgY29uc3QgbWVkaWFDb25uZWN0Um91dGVyR3JvdXBDb3VudCA9IHByb3BzLm91dHB1dEdyb3Vwc1xuICAgICAgLmZpbHRlcihjb25maWcgPT4gY29uZmlnLl9iaW5kKCkubWVkaWFDb25uZWN0Um91dGVyR3JvdXBTZXR0aW5ncyAhPT0gdW5kZWZpbmVkKVxuICAgICAgLmxlbmd0aDtcbiAgICBpZiAobWVkaWFDb25uZWN0Um91dGVyR3JvdXBDb3VudCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBNdWx0aXBsZU1lZGlhQ29ubmVjdFJvdXRlckdyb3Vwc2AsXG4gICAgICAgIGBBIGNoYW5uZWwgbWF5IGhhdmUgYXQgbW9zdCBvbmUgTWVkaWFDb25uZWN0IFJvdXRlciBvdXRwdXQgZ3JvdXAsIGJ1dCAke21lZGlhQ29ubmVjdFJvdXRlckdyb3VwQ291bnR9IHdlcmUgcHJvdmlkZWQuYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRDaGFubmVsQ2xhc3MgPSBwcm9wcy5jaGFubmVsQ2xhc3MgPz8gQ2hhbm5lbENsYXNzLlNJTkdMRV9QSVBFTElORTtcbiAgICB0aGlzLl9jaGFubmVsQ2xhc3MgPSByZXNvbHZlZENoYW5uZWxDbGFzcztcblxuICAgIC8vIFNSVCBsaXN0ZW5lciBvdXRwdXRzIHJlcXVpcmUgY2hhbm5lbCBzZWN1cml0eSBncm91cHMg4oCUIGZhaWwgZmFzdCBhdCBzeW50aC5cbiAgICBjb25zdCBoYXNTcnRMaXN0ZW5lck91dHB1dCA9IHByb3BzLm91dHB1dEdyb3Vwcy5zb21lKGNvbmZpZyA9PiBjb25maWcuX2hhc1NydExpc3RlbmVyRGVzdGluYXRpb24oKSk7XG4gICAgaWYgKGhhc1NydExpc3RlbmVyT3V0cHV0ICYmIChwcm9wcy5jaGFubmVsU2VjdXJpdHlHcm91cHM/Lmxlbmd0aCA/PyAwKSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YFNydExpc3RlbmVyUmVxdWlyZXNDaGFubmVsU2VjdXJpdHlHcm91cHNgLFxuICAgICAgICAnYW4gU1JUIG91dHB1dCBpbiBsaXN0ZW5lciBjb25uZWN0aW9uIG1vZGUgcmVxdWlyZXMgY2hhbm5lbFNlY3VyaXR5R3JvdXBzIG9uIHRoZSBjaGFubmVsJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5oYXNBbnl3aGVyZVNldHRpbmdzID0gcHJvcHMuYW55d2hlcmVTZXR0aW5ncyAhPT0gdW5kZWZpbmVkO1xuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKHsgdmFsaWRhdGU6ICgpID0+IHRoaXMudmFsaWRhdGVJbnB1dHMoKSB9KTtcblxuICAgIGlmIChwcm9wcy5saW5rZWRDaGFubmVsU2V0dGluZ3MgJiYgcmVzb2x2ZWRDaGFubmVsQ2xhc3MudmFsdWUgIT09IENoYW5uZWxDbGFzcy5TSU5HTEVfUElQRUxJTkUudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YExpbmtlZENoYW5uZWxDbGFzc2AsICdMaW5rZWQgY2hhbm5lbCBzZXR0aW5ncyBjYW4gb25seSBiZSBjb25maWd1cmVkIG9uIFNJTkdMRV9QSVBFTElORSBjaGFubmVscy4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBFcG9jaCBsb2NraW5nIHJlcXVpcmVzIHRoZSBvdXRwdXQgdGltaW5nIHNvdXJjZSB0byBiZSB0aGUgaW5wdXQgY2xvY2suIE1lZGlhTGl2ZSByZWplY3RzIGFueVxuICAgIC8vIG90aGVyIHRpbWluZyBzb3VyY2UgYXQgZGVwbG95LCBzbyBmYWlsIGZhc3QgYXQgc3ludGguXG4gICAgaWYgKHVzZXNFcG9jaExvY2tpbmdcbiAgICAgICYmIHByb3BzLmdsb2JhbENvbmZpZ3VyYXRpb24/Lm91dHB1dFRpbWluZ1NvdXJjZT8udmFsdWUgPT09IE91dHB1dFRpbWluZ1NvdXJjZS5TWVNURU1fQ0xPQ0sudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBFcG9jaExvY2tpbmdUaW1pbmdTb3VyY2VgLFxuICAgICAgICAnZ2xvYmFsQ29uZmlndXJhdGlvbi5vdXRwdXRUaW1pbmdTb3VyY2UgbXVzdCBiZSBJTlBVVF9DTE9DSyB3aGVuIHVzaW5nIGVwb2NoIG91dHB1dCBsb2NraW5nLicsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEVwb2NoLWxvY2tpbmcgY2hlY2tzIGFyZSBkZWZlcnJlZCB0byBzeW50aCBzbyB0aGV5IGFsc28gY292ZXIgZ3JvdXBzIGFkZGVkIHZpYVxuICAgIC8vIGFkZE91dHB1dEdyb3VwKClcbiAgICB0aGlzLnVzZXNFcG9jaExvY2tpbmcgPSB1c2VzRXBvY2hMb2NraW5nO1xuICAgIGlmICh1c2VzRXBvY2hMb2NraW5nKSB7XG4gICAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbih7IHZhbGlkYXRlOiAoKSA9PiB0aGlzLnZhbGlkYXRlRXBvY2hMb2NraW5nKCkgfSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgZGVmYXVsdCByb2xlIGlmIG5vdCBwcm92aWRlZC4gV2hlbiB0aGUgY2FsbGVyIGJyaW5ncyB0aGVpciBvd24gcm9sZSwgdGhlIGNoYW5uZWxcbiAgICAvLyBtYWtlcyBubyBhdXRvbWF0aWMgZ3JhbnRzLlxuICAgIHRoaXMudXNlclByb3ZpZGVkUm9sZSA9IHByb3BzLnJvbGUgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjaGFubmVsUm9sZSA9IHByb3BzLnJvbGUgPz8gbmV3IFJvbGUodGhpcywgJ1JvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdtZWRpYWxpdmUuYW1hem9uYXdzLmNvbScsIHtcbiAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgIC8vIENvbmZ1c2VkLWRlcHV0eSBwcmV2ZW50aW9uLiBTb3VyY2VBcm4gd2lsZGNhcmRzIHRoZSBjaGFubmVsIElEIGJlY2F1c2UgaXQnc1xuICAgICAgICAgIC8vIHNlcnZpY2UtZ2VuZXJhdGVkIChwaW5uaW5nIGl0IHdvdWxkIGNyZWF0ZSBhIHJvbGUg4oaSIGNoYW5uZWwg4oaSIHJvbGUgY3ljbGUpLlxuICAgICAgICAgIFN0cmluZ0VxdWFsczogeyAnYXdzOlNvdXJjZUFjY291bnQnOiBBd3MuQUNDT1VOVF9JRCB9LFxuICAgICAgICAgIEFybkxpa2U6IHtcbiAgICAgICAgICAgICdhd3M6U291cmNlQXJuJzogU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgICAgICAgICAgc2VydmljZTogJ21lZGlhbGl2ZScsXG4gICAgICAgICAgICAgIHJlc291cmNlOiAnY2hhbm5lbCcsXG4gICAgICAgICAgICAgIHJlc291cmNlTmFtZTogJyonLFxuICAgICAgICAgICAgICBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgZGVzY3JpcHRpb246ICdSb2xlIGZvciBNZWRpYUxpdmUgY2hhbm5lbCcsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnB1dFNwZWMgPSBwcm9wcy5pbnB1dFNwZWNpZmljYXRpb24gPz8gSW5wdXRTcGVjaWZpY2F0aW9uLnN0YW5kYXJkKCk7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBDZm5DaGFubmVsKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgY2hhbm5lbENsYXNzOiByZXNvbHZlZENoYW5uZWxDbGFzcy52YWx1ZSxcbiAgICAgIHJvbGVBcm46IGNoYW5uZWxSb2xlLnJvbGVBcm4sXG4gICAgICBsb2dMZXZlbDogKHByb3BzLmxvZ0xldmVsID8/IExvZ0xldmVsLkRJU0FCTEVEKS52YWx1ZSxcbiAgICAgIGluZmVyZW5jZVNldHRpbmdzOiBwcm9wcy5pbmZlcmVuY2VGZWVkQXJuID8ge1xuICAgICAgICBmZWVkQXJuOiBwcm9wcy5pbmZlcmVuY2VGZWVkQXJuLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MgPyBPYmplY3QuZW50cmllcyhwcm9wcy50YWdzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsga2V5LCB2YWx1ZSB9KSkgOiB1bmRlZmluZWQsXG4gICAgICBtYWludGVuYW5jZTogcHJvcHMubWFpbnRlbmFuY2UgPyB7XG4gICAgICAgIG1haW50ZW5hbmNlRGF5OiBwcm9wcy5tYWludGVuYW5jZS5kYXkudmFsdWUsXG4gICAgICAgIG1haW50ZW5hbmNlU3RhcnRUaW1lOiBwcm9wcy5tYWludGVuYW5jZS50aW1lID8/ICcwMjowMCcsXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgZGVzdGluYXRpb25zOiBMYXp5LmFueSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMub3V0cHV0R3JvdXBzXG4gICAgICAgICAgLmZsYXRNYXAob2cgPT4gb2cuX2JpbmREZXN0aW5hdGlvbihyZXNvbHZlZENoYW5uZWxDbGFzcy52YWx1ZSkpLFxuICAgICAgfSwgeyBvbWl0RW1wdHlBcnJheTogdHJ1ZSB9KSxcbiAgICAgIGlucHV0QXR0YWNobWVudHM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy5pbnB1dEF0dGFjaG1lbnRzIH0sIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSksXG4gICAgICBpbnB1dFNwZWNpZmljYXRpb246IGlucHV0U3BlYy5fYmluZElucHV0U3BlY2lmaWNhdGlvbigpLFxuICAgICAgZW5jb2RlclNldHRpbmdzOiB7XG4gICAgICAgIHRpbWVjb2RlQ29uZmlnOiB7XG4gICAgICAgICAgc291cmNlOiAocHJvcHMudGltZWNvZGVDb25maWc/LnNvdXJjZSA/PyBUaW1lY29kZVNvdXJjZS5FTUJFRERFRCkudmFsdWUsXG4gICAgICAgICAgc3luY1RocmVzaG9sZDogcHJvcHMudGltZWNvZGVDb25maWc/LnN5bmNUaHJlc2hvbGQsXG4gICAgICAgIH0sXG4gICAgICAgIGdsb2JhbENvbmZpZ3VyYXRpb246IHByb3BzLmdsb2JhbENvbmZpZ3VyYXRpb24gPyB7XG4gICAgICAgICAgaW5pdGlhbEF1ZGlvR2FpbjogcHJvcHMuZ2xvYmFsQ29uZmlndXJhdGlvbi5pbml0aWFsQXVkaW9HYWluLFxuICAgICAgICAgIGlucHV0RW5kQWN0aW9uOiBwcm9wcy5nbG9iYWxDb25maWd1cmF0aW9uLmlucHV0RW5kQWN0aW9uPy52YWx1ZSxcbiAgICAgICAgICBvdXRwdXRMb2NraW5nTW9kZTogcHJvcHMuZ2xvYmFsQ29uZmlndXJhdGlvbi5vdXRwdXRMb2NraW5nPy5fbW9kZSgpLFxuICAgICAgICAgIG91dHB1dFRpbWluZ1NvdXJjZTogcHJvcHMuZ2xvYmFsQ29uZmlndXJhdGlvbi5vdXRwdXRUaW1pbmdTb3VyY2U/LnZhbHVlLFxuICAgICAgICAgIHN1cHBvcnRMb3dGcmFtZXJhdGVJbnB1dHM6IHByb3BzLmdsb2JhbENvbmZpZ3VyYXRpb24uc3VwcG9ydExvd0ZyYW1lcmF0ZUlucHV0cyA/ICdFTkFCTEVEJyA6ICdESVNBQkxFRCcsXG4gICAgICAgICAgaW5wdXRMb3NzQmVoYXZpb3I6IHByb3BzLmdsb2JhbENvbmZpZ3VyYXRpb24uaW5wdXRMb3NzQmVoYXZpb3IgPyB7XG4gICAgICAgICAgICBibGFja0ZyYW1lTXNlYzogcHJvcHMuZ2xvYmFsQ29uZmlndXJhdGlvbi5pbnB1dExvc3NCZWhhdmlvci5ibGFja0ZyYW1lPy50b01pbGxpc2Vjb25kcygpLFxuICAgICAgICAgICAgcmVwZWF0RnJhbWVNc2VjOiBwcm9wcy5nbG9iYWxDb25maWd1cmF0aW9uLmlucHV0TG9zc0JlaGF2aW9yLnJlcGVhdEZyYW1lPy50b01pbGxpc2Vjb25kcygpLFxuICAgICAgICAgICAgaW5wdXRMb3NzSW1hZ2VUeXBlOiBwcm9wcy5nbG9iYWxDb25maWd1cmF0aW9uLmlucHV0TG9zc0JlaGF2aW9yLmltYWdlVHlwZT8udmFsdWUsXG4gICAgICAgICAgICBpbnB1dExvc3NJbWFnZUNvbG9yOiBwcm9wcy5nbG9iYWxDb25maWd1cmF0aW9uLmlucHV0TG9zc0JlaGF2aW9yLmltYWdlQ29sb3IsXG4gICAgICAgICAgICBpbnB1dExvc3NJbWFnZVNsYXRlOiBwcm9wcy5nbG9iYWxDb25maWd1cmF0aW9uLmlucHV0TG9zc0JlaGF2aW9yLmltYWdlU2xhdGU/Ll9iaW5kKCksXG4gICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBvdXRwdXRMb2NraW5nU2V0dGluZ3M6IHByb3BzLmdsb2JhbENvbmZpZ3VyYXRpb24ub3V0cHV0TG9ja2luZz8uX2JpbmQoKSxcbiAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXZhaWxCbGFua2luZzogcHJvcHMuYXZhaWxCbGFua2luZyA/IHtcbiAgICAgICAgICBzdGF0ZTogKHByb3BzLmF2YWlsQmxhbmtpbmcuc3RhdGVcbiAgICAgICAgICAgID8/IChwcm9wcy5hdmFpbEJsYW5raW5nLmltYWdlID8gQXZhaWxCbGFua2luZ1N0YXRlLkVOQUJMRUQgOiBBdmFpbEJsYW5raW5nU3RhdGUuRElTQUJMRUQpKS52YWx1ZSxcbiAgICAgICAgICBhdmFpbEJsYW5raW5nSW1hZ2U6IHByb3BzLmF2YWlsQmxhbmtpbmcuaW1hZ2U/Ll9iaW5kKCksXG4gICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIGF2YWlsQ29uZmlndXJhdGlvbjogKHByb3BzLmF2YWlsU2V0dGluZ3MgfHwgcHJvcHMuc2N0ZTM1U2VnbWVudGF0aW9uU2NvcGUpID8ge1xuICAgICAgICAgIGF2YWlsU2V0dGluZ3M6IHByb3BzLmF2YWlsU2V0dGluZ3M/Ll9iaW5kKCksXG4gICAgICAgICAgc2N0ZTM1U2VnbWVudGF0aW9uU2NvcGU6IHByb3BzLnNjdGUzNVNlZ21lbnRhdGlvblNjb3BlPy52YWx1ZSxcbiAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZmVhdHVyZUFjdGl2YXRpb25zOiBwcm9wcy5mZWF0dXJlQWN0aXZhdGlvbnMgPyB7XG4gICAgICAgICAgaW5wdXRQcmVwYXJlU2NoZWR1bGVBY3Rpb25zOiBwcm9wcy5mZWF0dXJlQWN0aXZhdGlvbnMuaW5wdXRQcmVwYXJlU2NoZWR1bGVBY3Rpb25zPy52YWx1ZSxcbiAgICAgICAgICBvdXRwdXRTdGF0aWNJbWFnZU92ZXJsYXlTY2hlZHVsZUFjdGlvbnM6IHByb3BzLmZlYXR1cmVBY3RpdmF0aW9ucy5vdXRwdXRTdGF0aWNJbWFnZU92ZXJsYXlTY2hlZHVsZUFjdGlvbnM/LnZhbHVlLFxuICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICBtb3Rpb25HcmFwaGljc0NvbmZpZ3VyYXRpb246IHByb3BzLm1vdGlvbkdyYXBoaWNzQ29uZmlndXJhdGlvbiA/IHtcbiAgICAgICAgICBtb3Rpb25HcmFwaGljc0luc2VydGlvbjogKHByb3BzLm1vdGlvbkdyYXBoaWNzQ29uZmlndXJhdGlvbi5tb3Rpb25HcmFwaGljc0luc2VydGlvbiA/PyBNb3Rpb25HcmFwaGljc0luc2VydGlvbi5ESVNBQkxFRCkudmFsdWUsXG4gICAgICAgICAgbW90aW9uR3JhcGhpY3NTZXR0aW5nczogeyBodG1sTW90aW9uR3JhcGhpY3NTZXR0aW5nczoge30gfSxcbiAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmllbHNlbkNvbmZpZ3VyYXRpb246IHByb3BzLm5pZWxzZW5Db25maWd1cmF0aW9uID8ge1xuICAgICAgICAgIGRpc3RyaWJ1dG9ySWQ6IHByb3BzLm5pZWxzZW5Db25maWd1cmF0aW9uLmRpc3RyaWJ1dG9ySWQsXG4gICAgICAgICAgbmllbHNlblBjbVRvSWQzVGFnZ2luZzogcHJvcHMubmllbHNlbkNvbmZpZ3VyYXRpb24ubmllbHNlblBjbVRvSWQzVGFnZ2luZz8udmFsdWUsXG4gICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIHRodW1ibmFpbENvbmZpZ3VyYXRpb246IHByb3BzLnRodW1ibmFpbENvbmZpZ3VyYXRpb24gPyB7XG4gICAgICAgICAgc3RhdGU6IChwcm9wcy50aHVtYm5haWxDb25maWd1cmF0aW9uLnN0YXRlID8/IFRodW1ibmFpbFN0YXRlLkFVVE8pLnZhbHVlLFxuICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICBibGFja291dFNsYXRlOiBwcm9wcy5ibGFja291dFNsYXRlID8ge1xuICAgICAgICAgIHN0YXRlOiAocHJvcHMuYmxhY2tvdXRTbGF0ZS5zdGF0ZVxuICAgICAgICAgICAgPz8gKHByb3BzLmJsYWNrb3V0U2xhdGUuaW1hZ2UgPyBCbGFja291dFNsYXRlU3RhdGUuRU5BQkxFRCA6IEJsYWNrb3V0U2xhdGVTdGF0ZS5ESVNBQkxFRCkpLnZhbHVlLFxuICAgICAgICAgIGJsYWNrb3V0U2xhdGVJbWFnZTogcHJvcHMuYmxhY2tvdXRTbGF0ZS5pbWFnZT8uX2JpbmQoKSxcbiAgICAgICAgICBuZXR3b3JrRW5kQmxhY2tvdXQ6IChwcm9wcy5ibGFja291dFNsYXRlLm5ldHdvcmtFbmRCbGFja291dFxuICAgICAgICAgICAgPz8gKHByb3BzLmJsYWNrb3V0U2xhdGUubmV0d29ya0VuZEJsYWNrb3V0SW1hZ2UgPyBOZXR3b3JrRW5kQmxhY2tvdXQuRU5BQkxFRCA6IE5ldHdvcmtFbmRCbGFja291dC5ESVNBQkxFRCkpLnZhbHVlLFxuICAgICAgICAgIG5ldHdvcmtFbmRCbGFja291dEltYWdlOiBwcm9wcy5ibGFja291dFNsYXRlLm5ldHdvcmtFbmRCbGFja291dEltYWdlPy5fYmluZCgpLFxuICAgICAgICAgIG5ldHdvcmtJZDogcHJvcHMuYmxhY2tvdXRTbGF0ZS5uZXR3b3JrSWQsXG4gICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbG9yQ29ycmVjdGlvblNldHRpbmdzOiBwcm9wcy5jb2xvckNvcnJlY3Rpb25zID8ge1xuICAgICAgICAgIGdsb2JhbENvbG9yQ29ycmVjdGlvbnM6IHByb3BzLmNvbG9yQ29ycmVjdGlvbnMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgIGlucHV0Q29sb3JTcGFjZTogYy5pbnB1dENvbG9yU3BhY2UudmFsdWUsXG4gICAgICAgICAgICBvdXRwdXRDb2xvclNwYWNlOiBjLm91dHB1dENvbG9yU3BhY2UudmFsdWUsXG4gICAgICAgICAgICB1cmk6IGMubHV0Py5fYmluZCgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdmlkZW9EZXNjcmlwdGlvbnM6IExhenkuYW55KHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IENmbkNoYW5uZWwuVmlkZW9EZXNjcmlwdGlvblByb3BlcnR5W10gPSBbXTtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0R3JvdXBzLmZsYXRNYXAob2cgPT4gb2cuX2NvbGxlY3RFbmNvZGVzKCkpLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGRlc2MgPSBlLl9iaW5kVmlkZW8oKTtcbiAgICAgICAgICAgICAgaWYgKGRlc2M/Lm5hbWUgJiYgIXJlc3VsdC5zb21lKGQgPT4gZC5uYW1lID09PSBkZXNjLm5hbWUpKSByZXN1bHQucHVzaChkZXNjKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9LFxuICAgICAgICB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLFxuICAgICAgICBhdWRpb0Rlc2NyaXB0aW9uczogTGF6eS5hbnkoe1xuICAgICAgICAgIHByb2R1Y2U6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogQ2ZuQ2hhbm5lbC5BdWRpb0Rlc2NyaXB0aW9uUHJvcGVydHlbXSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRHcm91cHMuZmxhdE1hcChvZyA9PiBvZy5fY29sbGVjdEVuY29kZXMoKSkuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGVzYyA9IGUuX2JpbmRBdWRpbygpO1xuICAgICAgICAgICAgICBpZiAoZGVzYz8ubmFtZSAmJiAhcmVzdWx0LnNvbWUoZCA9PiBkLm5hbWUgPT09IGRlc2MubmFtZSkpIHJlc3VsdC5wdXNoKGRlc2MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSksXG4gICAgICAgIGNhcHRpb25EZXNjcmlwdGlvbnM6IExhenkuYW55KHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IENmbkNoYW5uZWwuQ2FwdGlvbkRlc2NyaXB0aW9uUHJvcGVydHlbXSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRHcm91cHMuZmxhdE1hcChvZyA9PiBvZy5fY29sbGVjdEVuY29kZXMoKSkuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGVzYyA9IGUuX2JpbmRDYXB0aW9uKCk7XG4gICAgICAgICAgICAgIGlmIChkZXNjPy5uYW1lICYmICFyZXN1bHQuc29tZShkID0+IGQubmFtZSA9PT0gZGVzYy5uYW1lKSkgcmVzdWx0LnB1c2goZGVzYyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSwgeyBvbWl0RW1wdHlBcnJheTogdHJ1ZSB9KSxcbiAgICAgICAgb3V0cHV0R3JvdXBzOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMub3V0cHV0R3JvdXBzLm1hcChvZyA9PiBvZy5fYmluZCgpKSB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLFxuICAgICAgfSxcbiAgICAgIHZwYzogcHJvcHMudnBjID8ge1xuICAgICAgICBzdWJuZXRJZHM6IHByb3BzLnZwYy5zdWJuZXRzLm1hcChzID0+IHMuc3VibmV0UmVmLnN1Ym5ldElkKSxcbiAgICAgICAgc2VjdXJpdHlHcm91cElkczogcHJvcHMudnBjLnNlY3VyaXR5R3JvdXBzPy5tYXAoc2cgPT4gc2cuc2VjdXJpdHlHcm91cFJlZi5zZWN1cml0eUdyb3VwSWQpLFxuICAgICAgICBwdWJsaWNBZGRyZXNzQWxsb2NhdGlvbklkczogcHJvcHMudnBjLnB1YmxpY0FkZHJlc3NBbGxvY2F0aW9uSWRzLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGFueXdoZXJlU2V0dGluZ3M6IHByb3BzLmFueXdoZXJlU2V0dGluZ3MgPyB7XG4gICAgICAgIGNoYW5uZWxQbGFjZW1lbnRHcm91cElkOiBwcm9wcy5hbnl3aGVyZVNldHRpbmdzLmNoYW5uZWxQbGFjZW1lbnRHcm91cD8uY2hhbm5lbFBsYWNlbWVudEdyb3VwUmVmLmNoYW5uZWxQbGFjZW1lbnRHcm91cElkLFxuICAgICAgICBjbHVzdGVySWQ6IHByb3BzLmFueXdoZXJlU2V0dGluZ3MuY2x1c3Rlci5jbHVzdGVyUmVmLmNsdXN0ZXJJZCxcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBjaGFubmVsRW5naW5lVmVyc2lvbjogcHJvcHMuY2hhbm5lbEVuZ2luZVZlcnNpb24gPyB7XG4gICAgICAgIHZlcnNpb246IHByb3BzLmNoYW5uZWxFbmdpbmVWZXJzaW9uLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGNkaUlucHV0U3BlY2lmaWNhdGlvbjogaW5wdXRTcGVjLl9iaW5kQ2RpSW5wdXRTcGVjaWZpY2F0aW9uKCksXG4gICAgICBsaW5rZWRDaGFubmVsU2V0dGluZ3M6IHByb3BzLmxpbmtlZENoYW5uZWxTZXR0aW5ncz8uX2JpbmQoKSxcbiAgICAgIGNoYW5uZWxTZWN1cml0eUdyb3VwczogcHJvcHMuY2hhbm5lbFNlY3VyaXR5R3JvdXBzPy5tYXAoc2cgPT4gc2cuaW5wdXRTZWN1cml0eUdyb3VwUmVmLmlucHV0U2VjdXJpdHlHcm91cElkKSxcbiAgICB9KTtcblxuICAgIHRoaXMuY2hhbm5lbEFybiA9IHJlc291cmNlLmF0dHJBcm47XG4gICAgdGhpcy5jaGFubmVsSWQgPSByZXNvdXJjZS5yZWY7XG4gICAgdGhpcy5jaGFubmVsSW5wdXRzID0gcmVzb3VyY2UuYXR0cklucHV0cztcbiAgICB0aGlzLnJvbGUgPSBjaGFubmVsUm9sZTtcblxuICAgIC8vIEF1dG8tZ3JhbnQgcGVybWlzc2lvbnMgb25seSBmb3IgdGhlIGNoYW5uZWwtbWFuYWdlZCByb2xlLiBXaGVuIHRoZSBjYWxsZXIgYnJpbmdzIHRoZWlyIG93blxuICAgIC8vIHJvbGUsIHRoZXkgZGVmaW5lIGV2ZXJ5IHBlcm1pc3Npb24gKHByaW5jaXBhbCBhbmQgcmVzb3VyY2Ugc2lkZSkuXG4gICAgaWYgKCF0aGlzLnVzZXJQcm92aWRlZFJvbGUpIHtcbiAgICAgIC8vIEF1dG8tZ3JhbnQgcGVybWlzc2lvbnMgZm9yIFMzIGRlc3RpbmF0aW9ucyBhbmQgUzMgaW5wdXQgc291cmNlc1xuICAgICAgdGhpcy5vdXRwdXRHcm91cHMuZm9yRWFjaChvZyA9PiBvZy5fZ3JhbnRQZXJtaXNzaW9ucyhjaGFubmVsUm9sZSkpO1xuICAgICAgcHJvcHMuaW5wdXRzLmZvckVhY2goYXR0YWNobWVudCA9PiB7XG4gICAgICAgIGF0dGFjaG1lbnQuaW5wdXQuX2dyYW50UGVybWlzc2lvbnMoY2hhbm5lbFJvbGUpO1xuICAgICAgICBhdHRhY2htZW50LmF1dG9tYXRpY0lucHV0RmFpbG92ZXI/LnNlY29uZGFyeUlucHV0Ll9ncmFudFBlcm1pc3Npb25zKGNoYW5uZWxSb2xlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gR3JhbnQgdGhlIHNlcnZpY2Utcm9sZSBwZXJtaXNzaW9ucyBpbXBsaWVkIGJ5IGNoYW5uZWwtbGV2ZWwgZmVhdHVyZXMgKGxvZ2dpbmcsIFZQQyBvdXRwdXQpLlxuICAgICAgdGhpcy5ncmFudFNlcnZpY2VSb2xlUGVybWlzc2lvbnMoY2hhbm5lbFJvbGUsIHByb3BzLCByZXNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBjaGFubmVsJ3Mgc2VydmljZSByb2xlIHRoZSBwZXJtaXNzaW9ucyBpbXBsaWVkIGJ5IGNoYW5uZWwtbGV2ZWwgZmVhdHVyZXMuXG4gICAqXG4gICAqIE1pcnJvcnMgdGhlIEFXUy1kb2N1bWVudGVkIE1lZGlhTGl2ZSB0cnVzdGVkLWVudGl0eSByZXF1aXJlbWVudHM6XG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWxpdmUvbGF0ZXN0L3VnL3RydXN0ZWQtZW50aXR5LXJlcXVpcmVtZW50cy5odG1sXG4gICAqXG4gICAqIFJlc291cmNlLWxldmVsIHNjb3BpbmcgaXMgYXBwbGllZCB3aGVyZSB0aGUgc2VydmljZSBzdXBwb3J0cyBpdDsgRUMyIGBEZXNjcmliZSpgXG4gICAqIGFjdGlvbnMgZG9uJ3Qgc3VwcG9ydCByZXNvdXJjZS1sZXZlbCBwZXJtaXNzaW9ucywgc28gdGhleSByZXF1aXJlIGAqYC5cbiAgICovXG4gIHByaXZhdGUgZ3JhbnRTZXJ2aWNlUm9sZVBlcm1pc3Npb25zKHJvbGU6IElSb2xlLCBwcm9wczogQ2hhbm5lbFByb3BzLCByZXNvdXJjZTogQ2ZuQ2hhbm5lbCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YodGhpcyk7XG5cbiAgICAvLyBUaHVtYm5haWxzIOKAlCBncmFudCB1bmxlc3MgdXNlciBleHBsaWNpdGx5IGRpc2FibGVkLlxuICAgIGNvbnN0IHRodW1ibmFpbHNFbmFibGVkID0gcHJvcHMudGh1bWJuYWlsQ29uZmlndXJhdGlvbiA9PT0gdW5kZWZpbmVkXG4gICAgICB8fCBwcm9wcy50aHVtYm5haWxDb25maWd1cmF0aW9uLnN0YXRlPy52YWx1ZSA9PT0gVGh1bWJuYWlsU3RhdGUuQVVUTy52YWx1ZTtcbiAgICBpZiAodGh1bWJuYWlsc0VuYWJsZWQpIHtcbiAgICAgIHJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFsnczM6UHV0T2JqZWN0J10sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sIC8vIFRodW1ibmFpbCBkZXN0aW5hdGlvbiBjYW4ndCBiZSBzY29wZWRcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBDbG91ZFdhdGNoIExvZ3Mg4oCUIHJlcXVpcmVkIHdoZW4gbG9nZ2luZyBpcyBlbmFibGVkLlxuICAgIC8vIE1lZGlhTGl2ZSBhbHdheXMgd3JpdGVzIHRvIHRoZSBmaXhlZCBsb2cgZ3JvdXAgYEVsZW1lbnRhbE1lZGlhTGl2ZWAuXG4gICAgLy8gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWxpdmUvbGF0ZXN0L3VnL3dvcmtpbmctd2l0aC1sb2dzLmh0bWxcbiAgICBpZiAoKHByb3BzLmxvZ0xldmVsID8/IExvZ0xldmVsLkRJU0FCTEVEKS52YWx1ZSAhPT0gTG9nTGV2ZWwuRElTQUJMRUQudmFsdWUpIHtcbiAgICAgIGNvbnN0IGxvZ0dyb3VwQXJuID0gc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogJ2xvZ3MnLFxuICAgICAgICByZXNvdXJjZTogJ2xvZy1ncm91cCcsXG4gICAgICAgIHJlc291cmNlTmFtZTogJ0VsZW1lbnRhbE1lZGlhTGl2ZScsXG4gICAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgICB9KTtcbiAgICAgIEdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgICAgZ3JhbnRlZTogcm9sZSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdsb2dzOkNyZWF0ZUxvZ0dyb3VwJyxcbiAgICAgICAgICAnbG9nczpDcmVhdGVMb2dTdHJlYW0nLFxuICAgICAgICAgICdsb2dzOlB1dExvZ0V2ZW50cycsXG4gICAgICAgICAgJ2xvZ3M6UHV0TWV0cmljRmlsdGVyJyxcbiAgICAgICAgICAnbG9nczpQdXRSZXRlbnRpb25Qb2xpY3knLFxuICAgICAgICAgICdsb2dzOkRlc2NyaWJlTG9nU3RyZWFtcycsXG4gICAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgICBdLFxuICAgICAgICAvLyBUaGUgZ3JvdXAgQVJOIGNvdmVycyBncm91cC1sZXZlbCBhY3Rpb25zOyB0aGUgYDoqYCB2YXJpYW50IGNvdmVycyB0aGUgbG9nIHN0cmVhbXMuXG4gICAgICAgIHJlc291cmNlQXJuczogW2xvZ0dyb3VwQXJuLCBgJHtsb2dHcm91cEFybn06KmBdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRUMyIOKAlCByZXF1aXJlZCBmb3IgVlBDIG91dHB1dC4gVXNlcyAuYXBwbHlCZWZvcmUoKSBiZWNhdXNlIE1lZGlhTGl2ZSB2YWxpZGF0ZXNcbiAgICAvLyBwZXJtaXNzaW9ucyBhdCBjaGFubmVsIGNyZWF0aW9uIHRpbWUuXG4gICAgaWYgKHByb3BzLnZwYykge1xuICAgICAgY29uc3Qgc3VibmV0QXJucyA9IHByb3BzLnZwYy5zdWJuZXRzLm1hcChzID0+IHN0YWNrLmZvcm1hdEFybih7IHNlcnZpY2U6ICdlYzInLCByZXNvdXJjZTogJ3N1Ym5ldCcsIHJlc291cmNlTmFtZTogcy5zdWJuZXRSZWYuc3VibmV0SWQgfSkpO1xuICAgICAgY29uc3Qgc2VjdXJpdHlHcm91cEFybnMgPSAocHJvcHMudnBjLnNlY3VyaXR5R3JvdXBzID8/IFtdKS5tYXAoc2cgPT4gc3RhY2suZm9ybWF0QXJuKHsgc2VydmljZTogJ2VjMicsIHJlc291cmNlOiAnc2VjdXJpdHktZ3JvdXAnLCByZXNvdXJjZU5hbWU6IHNnLnNlY3VyaXR5R3JvdXBSZWYuc2VjdXJpdHlHcm91cElkIH0pKTtcbiAgICAgIC8vIEVOSSBJRHMgYXJlIGdlbmVyYXRlZCBhdCBydW50aW1lIOKAlCB3aWxkY2FyZGVkIGJ1dCBzY29wZWQgdG8gcmVnaW9uL2FjY291bnQuXG4gICAgICBjb25zdCBuZXR3b3JrSW50ZXJmYWNlQXJuID0gc3RhY2suZm9ybWF0QXJuKHsgc2VydmljZTogJ2VjMicsIHJlc291cmNlOiAnbmV0d29yay1pbnRlcmZhY2UnLCByZXNvdXJjZU5hbWU6ICcqJyB9KTtcblxuICAgICAgLy8gQ3JlYXRlL0RlbGV0ZSBzY29wZSB0byB0aGUgRU5JcyBwbHVzIHRoZSBzdWJuZXRzIGFuZCBzZWN1cml0eSBncm91cHMgdGhleSBhdHRhY2ggdG8uXG4gICAgICBHcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICAgIGdyYW50ZWU6IHJvbGUsXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnZWMyOkNyZWF0ZU5ldHdvcmtJbnRlcmZhY2UnLFxuICAgICAgICAgICdlYzI6Q3JlYXRlTmV0d29ya0ludGVyZmFjZVBlcm1pc3Npb24nLFxuICAgICAgICAgICdlYzI6RGVsZXRlTmV0d29ya0ludGVyZmFjZScsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlQXJuczogW25ldHdvcmtJbnRlcmZhY2VBcm4sIC4uLnN1Ym5ldEFybnMsIC4uLnNlY3VyaXR5R3JvdXBBcm5zXSxcbiAgICAgIH0pLmFwcGx5QmVmb3JlKHJlc291cmNlKTtcblxuICAgICAgLy8gRGVzY3JpYmUqIGFjdGlvbnMgZG9uJ3Qgc3VwcG9ydCByZXNvdXJjZS1sZXZlbCBwZXJtaXNzaW9ucyDigJQgRUMyIHJlcXVpcmVzIGAqYC5cbiAgICAgIC8vIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTRUMyL2xhdGVzdC9Vc2VyR3VpZGUvaWFtLXBvbGljaWVzLWVjMi1jb25zb2xlLmh0bWxcbiAgICAgIEdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgICAgZ3JhbnRlZTogcm9sZSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdlYzI6RGVzY3JpYmVOZXR3b3JrSW50ZXJmYWNlcycsXG4gICAgICAgICAgJ2VjMjpEZXNjcmliZVN1Ym5ldHMnLFxuICAgICAgICAgICdlYzI6RGVzY3JpYmVTZWN1cml0eUdyb3VwcycsXG4gICAgICAgICAgJ2VjMjpEZXNjcmliZUFkZHJlc3NlcycsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlQXJuczogWycqJ10sXG4gICAgICB9KS5hcHBseUJlZm9yZShyZXNvdXJjZSk7XG5cbiAgICAgIC8vIFB1YmxpYyBJUCBhc3NvY2lhdGlvbiDigJQgRU5JIHRhcmdldCBpcyBjcmVhdGVkIGF0IHJ1bnRpbWUsIGNhbid0IGJlIHNjb3BlZCBhdCBzeW50aC5cbiAgICAgIGlmIChwcm9wcy52cGMucHVibGljQWRkcmVzc0FsbG9jYXRpb25JZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBHcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICAgICAgZ3JhbnRlZTogcm9sZSxcbiAgICAgICAgICBhY3Rpb25zOiBbJ2VjMjpBc3NvY2lhdGVBZGRyZXNzJ10sXG4gICAgICAgICAgcmVzb3VyY2VBcm5zOiBbJyonXSxcbiAgICAgICAgfSkuYXBwbHlCZWZvcmUocmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVTQU0gYXZhaWwgbW9kZSDigJQgZ3JhbnQgcmVhZCBhY2Nlc3MgdG8gdGhlIFBPSVMgcGFzc3dvcmQgcGFyYW1ldGVyLCBpZiBjb25maWd1cmVkLlxuICAgIHByb3BzLmF2YWlsU2V0dGluZ3M/Ll9ncmFudFBlcm1pc3Npb25zKHJvbGUpO1xuXG4gICAgLy8gSW5wdXQtbG9zcyBzbGF0ZSBpbWFnZSDigJQgZ3JhbnQgcmVhZCBhY2Nlc3Mgd2hlbiB0aGUgc2xhdGUgaXMgc291cmNlZCBmcm9tIGFuIFMzIGJ1Y2tldC5cbiAgICBwcm9wcy5nbG9iYWxDb25maWd1cmF0aW9uPy5pbnB1dExvc3NCZWhhdmlvcj8uaW1hZ2VTbGF0ZT8uX2dyYW50UmVhZChyb2xlKTtcblxuICAgIC8vIEF2YWlsLWJsYW5raW5nIGFuZCBibGFja291dC1zbGF0ZSBpbWFnZXMg4oCUIGdyYW50IHJlYWQgYWNjZXNzIHdoZW4gc291cmNlZCBmcm9tIFMzLlxuICAgIHByb3BzLmF2YWlsQmxhbmtpbmc/LmltYWdlPy5fZ3JhbnRSZWFkKHJvbGUpO1xuICAgIHByb3BzLmJsYWNrb3V0U2xhdGU/LmltYWdlPy5fZ3JhbnRSZWFkKHJvbGUpO1xuICAgIHByb3BzLmJsYWNrb3V0U2xhdGU/Lm5ldHdvcmtFbmRCbGFja291dEltYWdlPy5fZ3JhbnRSZWFkKHJvbGUpO1xuXG4gICAgLy8gQ29sb3ItY29ycmVjdGlvbiBMVVQgZmlsZXMg4oCUIGdyYW50IHJlYWQgYWNjZXNzIHdoZW4gc291cmNlZCBmcm9tIGFuIFMzIGJ1Y2tldC5cbiAgICBwcm9wcy5jb2xvckNvcnJlY3Rpb25zPy5mb3JFYWNoKGMgPT4gYy5sdXQ/Ll9ncmFudFJlYWQocm9sZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhbiBpbnB1dCB0byB0aGlzIGNoYW5uZWwuXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkSW5wdXQoYXR0YWNobWVudDogSW5wdXRBdHRhY2htZW50KTogdm9pZCB7XG4gICAgdGhpcy5hdHRhY2htZW50cy5wdXNoKGF0dGFjaG1lbnQpO1xuICAgIHRoaXMuaW5wdXRBdHRhY2htZW50cy5wdXNoKHRoaXMuYnVpbGRJbnB1dEF0dGFjaG1lbnQoYXR0YWNobWVudCkpO1xuICAgIC8vIFNraXAgYXV0by1ncmFudHMgd2hlbiB0aGUgY2FsbGVyIG93bnMgdGhlIHJvbGUuXG4gICAgaWYgKCF0aGlzLnVzZXJQcm92aWRlZFJvbGUpIHtcbiAgICAgIGF0dGFjaG1lbnQuaW5wdXQuX2dyYW50UGVybWlzc2lvbnModGhpcy5yb2xlKTtcbiAgICAgIGF0dGFjaG1lbnQuYXV0b21hdGljSW5wdXRGYWlsb3Zlcj8uc2Vjb25kYXJ5SW5wdXQuX2dyYW50UGVybWlzc2lvbnModGhpcy5yb2xlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYXV0b21hdGljLWlucHV0LWZhaWxvdmVyIHBhaXJzIGFnYWluc3QgTWVkaWFMaXZlJ3MgY3JlYXRlLXRpbWUgcnVsZXMuIFRoZSBzZWNvbmRhcnlcbiAgICogaW5wdXQgaXMgcmVqZWN0ZWQgYnkgdGhlIHNlcnZpY2UgYXQgZGVwbG95IHVubGVzcyBpdCBpcyBhbHNvIGF0dGFjaGVkIHRvIHRoZSBjaGFubmVsLCBzbyB3ZVxuICAgKiBmYWlsIGZhc3QgYXQgc3ludGguXG4gICAqL1xuICAvKipcbiAgICogU3ludGgtdGltZSBpbnB1dCB2YWxpZGF0aW9ucywgcnVuIG92ZXIgYWxsIGF0dGFjaGVkIGlucHV0cyAoaW5pdGlhbCArIGFkZElucHV0KCkpLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUlucHV0cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGFueXdoZXJlT25seUlucHV0VHlwZXM6IHN0cmluZ1tdID0gW0lucHV0VHlwZS5TREksIElucHV0VHlwZS5TTVBURV8yMTEwX1JFQ0VJVkVSX0dST1VQLCBJbnB1dFR5cGUuTVVMVElDQVNUXTtcblxuICAgIGZvciAoY29uc3QgYXR0YWNobWVudCBvZiB0aGlzLmF0dGFjaG1lbnRzKSB7XG4gICAgICBjb25zdCBpbnB1dENsYXNzID0gYXR0YWNobWVudC5pbnB1dC5pbnB1dENsYXNzO1xuICAgICAgaWYgKGlucHV0Q2xhc3MgJiYgaW5wdXRDbGFzcyAhPT0gdGhpcy5fY2hhbm5lbENsYXNzLnZhbHVlKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBJbnB1dCAnJHthdHRhY2htZW50LmlucHV0Lm5vZGUuaWR9JyBoYXMgaW5wdXQgY2xhc3MgJyR7aW5wdXRDbGFzc30nIHdoaWNoIGlzIGluY29tcGF0aWJsZWBcbiAgICAgICAgICArIGAgd2l0aCBjaGFubmVsIGNsYXNzICcke3RoaXMuX2NoYW5uZWxDbGFzcy52YWx1ZX0nLmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnB1dFR5cGUgPSBhdHRhY2htZW50LmlucHV0LmlucHV0VHlwZTtcbiAgICAgIGlmICghdGhpcy5oYXNBbnl3aGVyZVNldHRpbmdzICYmIGlucHV0VHlwZSAmJiBhbnl3aGVyZU9ubHlJbnB1dFR5cGVzLmluY2x1ZGVzKGlucHV0VHlwZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYElucHV0ICcke2F0dGFjaG1lbnQuaW5wdXQubm9kZS5pZH0nIGhhcyB0eXBlICcke2lucHV0VHlwZX0nIHdoaWNoIHJlcXVpcmVzIGFueXdoZXJlU2V0dGluZ3MgdG8gYmUgY29uZmlndXJlZCBvbiB0aGUgY2hhbm5lbC5gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmFpbG92ZXIgPSBhdHRhY2htZW50LmF1dG9tYXRpY0lucHV0RmFpbG92ZXI7XG4gICAgICBpZiAoZmFpbG92ZXIgJiYgIXRoaXMuYXR0YWNobWVudHMuc29tZShvdGhlciA9PiBvdGhlci5pbnB1dCA9PT0gZmFpbG92ZXIuc2Vjb25kYXJ5SW5wdXQpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBJbnB1dCAnJHthdHRhY2htZW50LmlucHV0Lm5vZGUuaWR9JyBkZWNsYXJlcyBhdXRvbWF0aWMgaW5wdXQgZmFpbG92ZXIgdG8gc2Vjb25kYXJ5IGlucHV0YFxuICAgICAgICAgICsgYCAnJHtmYWlsb3Zlci5zZWNvbmRhcnlJbnB1dC5ub2RlLmlkfScsIGJ1dCB0aGF0IHNlY29uZGFyeSBpbnB1dCBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIGNoYW5uZWwuYFxuICAgICAgICAgICsgXCIgQWRkIHRoZSBzZWNvbmRhcnkgaW5wdXQgdG8gdGhlIGNoYW5uZWwncyAnaW5wdXRzJyBhcyBpdHMgb3duIGF0dGFjaG1lbnQuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSW5wdXRBdHRhY2htZW50KGF0dGFjaG1lbnQ6IElucHV0QXR0YWNobWVudCk6IENmbkNoYW5uZWwuSW5wdXRBdHRhY2htZW50UHJvcGVydHkge1xuICAgIC8vIERlZmF1bHQgdG8gTE9PUCBmb3IgZmlsZS1iYXNlZCBpbnB1dHMgKE1QNCwgVFMpIOKAlCB0aGV5J3JlIHR5cGljYWxseSB1c2VkIGFzIHNsYXRlcyBvciB0ZXN0IGNvbnRlbnRcbiAgICBjb25zdCBpc0ZpbGVJbnB1dCA9IGF0dGFjaG1lbnQuaW5wdXQuaW5wdXRUeXBlID09PSAnTVA0X0ZJTEUnIHx8IGF0dGFjaG1lbnQuaW5wdXQuaW5wdXRUeXBlID09PSAnVFNfRklMRSc7XG4gICAgY29uc3Qgc291cmNlRW5kQmVoYXZpb3IgPSBhdHRhY2htZW50LnNvdXJjZUVuZEJlaGF2aW9yID8/IChpc0ZpbGVJbnB1dCA/IFNvdXJjZUVuZEJlaGF2aW9yLkxPT1AgOiBTb3VyY2VFbmRCZWhhdmlvci5DT05USU5VRSk7XG5cbiAgICBjb25zdCBmYWlsb3ZlciA9IGF0dGFjaG1lbnQuYXV0b21hdGljSW5wdXRGYWlsb3ZlcjtcbiAgICBpZiAoZmFpbG92ZXIpIHtcbiAgICAgIC8vIFRoZSBmYWlsb3ZlciBwYWlyIG11c3Qgc2hhcmUgYW4gaW5wdXQgY2xhc3Mg4oCUIE1lZGlhTGl2ZSByZWplY3RzIG1pc21hdGNoZWQgY2xhc3Nlcy5cbiAgICAgIGNvbnN0IHByaW1hcnlDbGFzcyA9IGF0dGFjaG1lbnQuaW5wdXQuaW5wdXRDbGFzcztcbiAgICAgIGNvbnN0IHNlY29uZGFyeUNsYXNzID0gZmFpbG92ZXIuc2Vjb25kYXJ5SW5wdXQuaW5wdXRDbGFzcztcbiAgICAgIGlmIChwcmltYXJ5Q2xhc3MgJiYgc2Vjb25kYXJ5Q2xhc3MgJiYgcHJpbWFyeUNsYXNzICE9PSBzZWNvbmRhcnlDbGFzcykge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBGYWlsb3ZlcklucHV0Q2xhc3NNaXNtYXRjaGAsXG4gICAgICAgICAgYEF1dG9tYXRpYyBpbnB1dCBmYWlsb3ZlciByZXF1aXJlcyB0aGUgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGlucHV0cyB0byBoYXZlIHRoZSBzYW1lIGlucHV0IGNsYXNzLCBnb3QgJyR7cHJpbWFyeUNsYXNzfScgYW5kICcke3NlY29uZGFyeUNsYXNzfScuYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dElkOiBhdHRhY2htZW50LmlucHV0LmlucHV0SWQsXG4gICAgICBpbnB1dEF0dGFjaG1lbnROYW1lOiBhdHRhY2htZW50LmlucHV0QXR0YWNobWVudE5hbWUsXG4gICAgICBhdXRvbWF0aWNJbnB1dEZhaWxvdmVyU2V0dGluZ3M6IGZhaWxvdmVyID8ge1xuICAgICAgICBzZWNvbmRhcnlJbnB1dElkOiBmYWlsb3Zlci5zZWNvbmRhcnlJbnB1dC5pbnB1dElkLFxuICAgICAgICBpbnB1dFByZWZlcmVuY2U6IGZhaWxvdmVyLmlucHV0UHJlZmVyZW5jZT8udmFsdWUsXG4gICAgICAgIGVycm9yQ2xlYXJUaW1lTXNlYzogZmFpbG92ZXIuZXJyb3JDbGVhclRpbWU/LnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICAgIC8vIE1lZGlhTGl2ZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgZmFpbG92ZXIgY29uZGl0aW9uIOKAlCBkZWZhdWx0IHRvIGlucHV0IGxvc3MuXG4gICAgICAgIGZhaWxvdmVyQ29uZGl0aW9uczogKGZhaWxvdmVyLmZhaWxvdmVyQ29uZGl0aW9ucyA/PyBbRmFpbG92ZXJDb25kaXRpb24uaW5wdXRMb3NzKCldKS5tYXAoYyA9PiBjLl9iaW5kKCkpLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGlucHV0U2V0dGluZ3M6IHtcbiAgICAgICAgc291cmNlRW5kQmVoYXZpb3I6IHNvdXJjZUVuZEJlaGF2aW9yLnZhbHVlLFxuICAgICAgICBpbnB1dEZpbHRlcjogKGF0dGFjaG1lbnQuaW5wdXRGaWx0ZXIgPz8gSW5wdXRGaWx0ZXIuQVVUTykudmFsdWUsXG4gICAgICAgIGZpbHRlclN0cmVuZ3RoOiBhdHRhY2htZW50LmZpbHRlclN0cmVuZ3RoID8/IDEsXG4gICAgICAgIGRlYmxvY2tGaWx0ZXI6IGF0dGFjaG1lbnQuZGVibG9ja0ZpbHRlciA/ICdFTkFCTEVEJyA6ICdESVNBQkxFRCcsXG4gICAgICAgIGRlbm9pc2VGaWx0ZXI6IGF0dGFjaG1lbnQuZGVub2lzZUZpbHRlciA/ICdFTkFCTEVEJyA6ICdESVNBQkxFRCcsXG4gICAgICAgIHNtcHRlMjAzOERhdGFQcmVmZXJlbmNlOiAoYXR0YWNobWVudC5zbXB0ZTIwMzhEYXRhUHJlZmVyZW5jZSA/PyBTbXB0ZTIwMzhEYXRhUHJlZmVyZW5jZS5JR05PUkUpLnZhbHVlLFxuICAgICAgICBhdWRpb1NlbGVjdG9yczogYXR0YWNobWVudC5hdWRpb1NlbGVjdG9ycz8ubWFwKHMgPT4gcy5fYmluZCgpKSxcbiAgICAgICAgY2FwdGlvblNlbGVjdG9yczogYXR0YWNobWVudC5jYXB0aW9uU2VsZWN0b3JzPy5tYXAocyA9PiBzLl9iaW5kKCkpLFxuICAgICAgICBzY3RlMzVQaWQ6IGF0dGFjaG1lbnQuc2N0ZTM1UGlkLFxuICAgICAgICB2aWRlb1NlbGVjdG9yOiBhdHRhY2htZW50LnZpZGVvU2VsZWN0b3IgPyB7XG4gICAgICAgICAgY29sb3JTcGFjZTogYXR0YWNobWVudC52aWRlb1NlbGVjdG9yLmNvbG9yU3BhY2U/LnZhbHVlLFxuICAgICAgICAgIGNvbG9yU3BhY2VVc2FnZTogYXR0YWNobWVudC52aWRlb1NlbGVjdG9yLmNvbG9yU3BhY2VVc2FnZT8udmFsdWUsXG4gICAgICAgICAgY29sb3JTcGFjZVNldHRpbmdzOiBhdHRhY2htZW50LnZpZGVvU2VsZWN0b3IuaGRyMTAgPyB7XG4gICAgICAgICAgICBoZHIxMFNldHRpbmdzOiB7XG4gICAgICAgICAgICAgIG1heENsbDogYXR0YWNobWVudC52aWRlb1NlbGVjdG9yLmhkcjEwLm1heENvbnRlbnRMaWdodExldmVsLFxuICAgICAgICAgICAgICBtYXhGYWxsOiBhdHRhY2htZW50LnZpZGVvU2VsZWN0b3IuaGRyMTAubWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzZWxlY3RvclNldHRpbmdzOiBhdHRhY2htZW50LnZpZGVvU2VsZWN0b3Iuc2VsZWN0Qnk/Ll9iaW5kKCksXG4gICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIG5ldHdvcmtJbnB1dFNldHRpbmdzOiBhdHRhY2htZW50Lm5ldHdvcmtJbnB1dFNldHRpbmdzID8ge1xuICAgICAgICAgIHNlcnZlclZhbGlkYXRpb246IGF0dGFjaG1lbnQubmV0d29ya0lucHV0U2V0dGluZ3Muc2VydmVyVmFsaWRhdGlvbj8udmFsdWUsXG4gICAgICAgICAgaGxzSW5wdXRTZXR0aW5nczogYXR0YWNobWVudC5uZXR3b3JrSW5wdXRTZXR0aW5ncy5obHNJbnB1dFNldHRpbmdzID8ge1xuICAgICAgICAgICAgYmFuZHdpZHRoOiBhdHRhY2htZW50Lm5ldHdvcmtJbnB1dFNldHRpbmdzLmhsc0lucHV0U2V0dGluZ3MuYmFuZHdpZHRoPy50b0JwcygpLFxuICAgICAgICAgICAgYnVmZmVyU2VnbWVudHM6IGF0dGFjaG1lbnQubmV0d29ya0lucHV0U2V0dGluZ3MuaGxzSW5wdXRTZXR0aW5ncy5idWZmZXJTZWdtZW50cyxcbiAgICAgICAgICAgIHJldHJpZXM6IGF0dGFjaG1lbnQubmV0d29ya0lucHV0U2V0dGluZ3MuaGxzSW5wdXRTZXR0aW5ncy5yZXRyaWVzLFxuICAgICAgICAgICAgcmV0cnlJbnRlcnZhbDogYXR0YWNobWVudC5uZXR3b3JrSW5wdXRTZXR0aW5ncy5obHNJbnB1dFNldHRpbmdzLnJldHJ5SW50ZXJ2YWw/LnRvU2Vjb25kcygpLFxuICAgICAgICAgICAgc2N0ZTM1U291cmNlOiBhdHRhY2htZW50Lm5ldHdvcmtJbnB1dFNldHRpbmdzLmhsc0lucHV0U2V0dGluZ3Muc2N0ZTM1U291cmNlPy52YWx1ZSxcbiAgICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgIG11bHRpY2FzdElucHV0U2V0dGluZ3M6IGF0dGFjaG1lbnQubmV0d29ya0lucHV0U2V0dGluZ3MubXVsdGljYXN0U291cmNlSXBcbiAgICAgICAgICAgID8geyBzb3VyY2VJcEFkZHJlc3M6IGF0dGFjaG1lbnQubmV0d29ya0lucHV0U2V0dGluZ3MubXVsdGljYXN0U291cmNlSXAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgbG9naWNhbEludGVyZmFjZU5hbWVzOiBhdHRhY2htZW50LmxvZ2ljYWxJbnRlcmZhY2VOYW1lcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBvdXRwdXQgZ3JvdXAgdG8gdGhpcyBjaGFubmVsLlxuICAgKlxuICAgKiBPdXRwdXRzIGFyZSBkZWNsYXJlZCB1cCBmcm9udCB2aWEgdGhlIGBvdXRwdXRzYCBwcm9wIG9uIHRoZSBncm91cCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFkZE91dHB1dEdyb3VwKGNvbmZpZzogT3V0cHV0R3JvdXBDb25maWd1cmF0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qgb3V0cHV0R3JvdXAgPSBuZXcgT3V0cHV0R3JvdXAoY29uZmlnKTtcbiAgICBpZiAodGhpcy51c2VzRXBvY2hMb2NraW5nKSB7XG4gICAgICBvdXRwdXRHcm91cC5fc2V0RXBvY2hMb2NraW5nKHRydWUpO1xuICAgIH1cbiAgICB0aGlzLm91dHB1dEdyb3Vwcy5wdXNoKG91dHB1dEdyb3VwKTtcbiAgICAvLyBTa2lwIGF1dG8tZ3JhbnRzIHdoZW4gdGhlIGNhbGxlciBvd25zIHRoZSByb2xlLlxuICAgIGlmICghdGhpcy51c2VyUHJvdmlkZWRSb2xlKSB7XG4gICAgICBvdXRwdXRHcm91cC5fZ3JhbnRQZXJtaXNzaW9ucyh0aGlzLnJvbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTeW50aC10aW1lIGVwb2NoLWxvY2tpbmcgY2hlY2tzIGZvciBjb25maWdzIE1lZGlhTGl2ZSByZWplY3RzIGF0IGRlcGxveS4gKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVwb2NoTG9ja2luZygpOiBzdHJpbmdbXSB7XG4gICAgLy8gQW4gZXhwbGljaXQgU1lTVEVNX0NMT0NLIHByb2dyYW0tZGF0ZS10aW1lIGNsb2NrIGNvbnRyYWRpY3RzIGVwb2NoIGxvY2tpbmcuXG4gICAgY29uc3QgY2xvY2tFcnJvciA9IHRoaXMub3V0cHV0R3JvdXBzLnNvbWUob2cgPT4gb2cuX2hhc0V4cGxpY2l0U3lzdGVtQ2xvY2soKSlcbiAgICAgID8gWydhbiBITFMgb3V0cHV0IGdyb3VwIHByb2dyYW1EYXRlVGltZUNsb2NrIG11c3QgYmUgSU5JVElBTElaRV9GUk9NX09VVFBVVF9USU1FQ09ERSB3aGVuIHVzaW5nIGVwb2NoIG91dHB1dCBsb2NraW5nJ11cbiAgICAgIDogW107XG5cbiAgICAvLyBILjI2NCBpcyB0aGUgb25seSBjb2RlYyB0aGF0IGZhbGxzIGJhY2sgdG8gSU5JVElBTElaRV9GUk9NX1NPVVJDRSB3aGVuIGZyYW1lcmF0ZSBpcyBvbWl0dGVkO1xuICAgIC8vIGVwb2NoIGxvY2tpbmcgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmF0ZS4gSC4yNjUvQVYxL0ZyYW1lIENhcHR1cmUgYWx3YXlzIGNhcnJ5IG9uZS5cbiAgICBjb25zdCBvZmZlbmRlcnMgPSBbLi4ubmV3IFNldCh0aGlzLm91dHB1dEdyb3Vwc1xuICAgICAgLmZsYXRNYXAob2cgPT4gb2cuX2NvbGxlY3RFbmNvZGVzKCkpXG4gICAgICAuZmlsdGVyKGVuY29kZSA9PiBlbmNvZGUuX3ZpZGVvQ29kZWNUeXBlKCkgPT09IFZpZGVvQ29kZWNUeXBlLkgyNjQgJiYgIWVuY29kZS5faGFzRXhwbGljaXRGcmFtZXJhdGUoKSlcbiAgICAgIC5tYXAoZW5jb2RlID0+IGVuY29kZS5uYW1lKSldO1xuICAgIGNvbnN0IGZyYW1lcmF0ZUVycm9yID0gb2ZmZW5kZXJzLmxlbmd0aCA+IDBcbiAgICAgID8gWydlcG9jaCBvdXRwdXQgbG9ja2luZyByZXF1aXJlcyBhbiBleHBsaWNpdCBmcmFtZSByYXRlIG9uIEguMjY0IHZpZGVvIGVuY29kZXMgJ1xuICAgICAgICArIGAoZS5nLiBGcmFtZXJhdGUuRlBTXzMwKTsgdGhlc2UgZW5jb2RlcyBmb2xsb3cgdGhlIHNvdXJjZSBmcmFtZSByYXRlOiAke29mZmVuZGVycy5qb2luKCcsICcpfWBdXG4gICAgICA6IFtdO1xuXG4gICAgcmV0dXJuIFsuLi5jbG9ja0Vycm9yLCAuLi5mcmFtZXJhdGVFcnJvcl07XG4gIH1cbn1cbiJdfQ==
|