@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.
Files changed (70) hide show
  1. package/.jsii +60888 -0
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +524 -0
  4. package/LICENSE +201 -0
  5. package/NOTICE +2 -0
  6. package/README.md +1297 -0
  7. package/grants.json +27 -0
  8. package/lib/audio-codec-settings.d.ts +901 -0
  9. package/lib/audio-codec-settings.js +1098 -0
  10. package/lib/audio-selector.d.ts +170 -0
  11. package/lib/audio-selector.js +306 -0
  12. package/lib/avail-settings.d.ts +231 -0
  13. package/lib/avail-settings.js +226 -0
  14. package/lib/caption-selector.d.ts +234 -0
  15. package/lib/caption-selector.js +413 -0
  16. package/lib/caption-settings.d.ts +349 -0
  17. package/lib/caption-settings.js +482 -0
  18. package/lib/channel-features.d.ts +106 -0
  19. package/lib/channel-features.js +85 -0
  20. package/lib/channel-placement-group.d.ts +73 -0
  21. package/lib/channel-placement-group.js +132 -0
  22. package/lib/channel.d.ts +687 -0
  23. package/lib/channel.js +1096 -0
  24. package/lib/cluster.d.ts +129 -0
  25. package/lib/cluster.js +158 -0
  26. package/lib/color-correction.d.ts +39 -0
  27. package/lib/color-correction.js +29 -0
  28. package/lib/destinations.d.ts +242 -0
  29. package/lib/destinations.js +455 -0
  30. package/lib/encode-configuration.d.ts +615 -0
  31. package/lib/encode-configuration.js +629 -0
  32. package/lib/enums.d.ts +698 -0
  33. package/lib/enums.js +1045 -0
  34. package/lib/file-location.d.ts +65 -0
  35. package/lib/file-location.js +150 -0
  36. package/lib/framerate.d.ts +31 -0
  37. package/lib/framerate.js +71 -0
  38. package/lib/index.d.ts +26 -0
  39. package/lib/index.js +43 -0
  40. package/lib/input-attachment.d.ts +319 -0
  41. package/lib/input-attachment.js +228 -0
  42. package/lib/input-security-group.d.ts +51 -0
  43. package/lib/input-security-group.js +123 -0
  44. package/lib/input-specification.d.ts +111 -0
  45. package/lib/input-specification.js +181 -0
  46. package/lib/input.d.ts +505 -0
  47. package/lib/input.js +803 -0
  48. package/lib/m2ts-settings.d.ts +421 -0
  49. package/lib/m2ts-settings.js +469 -0
  50. package/lib/m3u8-settings.d.ts +272 -0
  51. package/lib/m3u8-settings.js +304 -0
  52. package/lib/medialive-grants.generated.d.ts +30 -0
  53. package/lib/medialive-grants.generated.js +92 -0
  54. package/lib/network.d.ts +83 -0
  55. package/lib/network.js +132 -0
  56. package/lib/output-group.d.ts +924 -0
  57. package/lib/output-group.js +941 -0
  58. package/lib/outputs.d.ts +304 -0
  59. package/lib/outputs.js +598 -0
  60. package/lib/sdi-source.d.ts +124 -0
  61. package/lib/sdi-source.js +180 -0
  62. package/lib/shared.d.ts +44 -0
  63. package/lib/shared.js +146 -0
  64. package/lib/video-codec-settings.d.ts +1500 -0
  65. package/lib/video-codec-settings.js +1722 -0
  66. package/lib/video-selection.d.ts +92 -0
  67. package/lib/video-selection.js +95 -0
  68. package/package.json +135 -0
  69. package/rosetta/_generated.ts-fixture +6 -0
  70. 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==