@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
@@ -0,0 +1,941 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.OutputGroup = exports.HlsCdnSettings = exports.HlsKeyProviderSettings = exports.OutputGroupConfiguration = void 0;
18
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
19
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
20
+ __exportStar(require("./destinations"), exports);
21
+ __exportStar(require("./enums"), exports);
22
+ __exportStar(require("./outputs"), exports);
23
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
24
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
25
+ const destinations_1 = require("./destinations");
26
+ const enums_1 = require("./enums");
27
+ const outputs_1 = require("./outputs");
28
+ /** @internal */
29
+ function validateDestinationCount(groupName, channelClass, destinationCount, additionalCount, allowAdditional) {
30
+ const isStandard = channelClass === 'STANDARD';
31
+ const requiredPrimary = isStandard ? 2 : 1;
32
+ if (destinationCount !== requiredPrimary) {
33
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `DestinationCount`, `Output group '${groupName}' requires exactly ${requiredPrimary}`
34
+ + ` primary destination(s) for a ${channelClass} channel, but ${destinationCount} provided.`);
35
+ }
36
+ if (additionalCount > 0 && !allowAdditional) {
37
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `AdditionalDestinations`, `Output group '${groupName}' does not support additional destinations.`);
38
+ }
39
+ const maxAdditional = isStandard ? 2 : 1;
40
+ if (additionalCount > maxAdditional) {
41
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `AdditionalDestinationCount`, `Output group '${groupName}' allows at most ${maxAdditional}`
42
+ + ` additional destination(s) for a ${channelClass} channel, but ${additionalCount} provided.`);
43
+ }
44
+ }
45
+ // =============================================================================
46
+ // OutputGroupConfiguration (abstract base + subclasses)
47
+ // =============================================================================
48
+ /**
49
+ * Configuration for an output group. Use the static factory methods to create.
50
+ */
51
+ class OutputGroupConfiguration {
52
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.OutputGroupConfiguration", version: "2.268.0-alpha.0" };
53
+ /**
54
+ * Create a MediaPackage V2 output group that delivers to a single channel, auto-mapping each
55
+ * pipeline to a MediaPackage ingest endpoint based on the channel class.
56
+ */
57
+ static mediaPackageV2(props) {
58
+ try {
59
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaPackageV2OutputGroupProps(props);
60
+ }
61
+ catch (error) {
62
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
63
+ Error.captureStackTrace(error, this.mediaPackageV2);
64
+ }
65
+ throw error;
66
+ }
67
+ return new MediaPackageV2OutputGroupConfiguration(props, props.channel, undefined);
68
+ }
69
+ /**
70
+ * Create a MediaPackage V2 output group with explicit per-pipeline destinations (channel +
71
+ * endpoint per pipeline). Use for cross-region delivery or pinning a pipeline to an endpoint.
72
+ */
73
+ static mediaPackageV2PerPipeline(props) {
74
+ try {
75
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaPackageV2PerPipelineOutputGroupProps(props);
76
+ }
77
+ catch (error) {
78
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
79
+ Error.captureStackTrace(error, this.mediaPackageV2PerPipeline);
80
+ }
81
+ throw error;
82
+ }
83
+ return new MediaPackageV2OutputGroupConfiguration(props, undefined, props.destinations);
84
+ }
85
+ /**
86
+ * Create a MediaConnect Router output group, delivering each channel pipeline to a MediaConnect
87
+ * Router. Transit encryption defaults to AUTOMATIC; override per pipeline via `routerSettings`.
88
+ *
89
+ * The downstream wiring (which router input each pipeline feeds) is configured on the
90
+ * MediaConnect side, referencing this output group by `name` and the pipeline id.
91
+ */
92
+ static mediaConnectRouter(props) {
93
+ try {
94
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MediaConnectRouterOutputGroupProps(props);
95
+ }
96
+ catch (error) {
97
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
98
+ Error.captureStackTrace(error, this.mediaConnectRouter);
99
+ }
100
+ throw error;
101
+ }
102
+ return new MediaConnectRouterOutputGroupConfiguration(props);
103
+ }
104
+ /** Create an HLS output group configuration. */
105
+ static hls(props) {
106
+ try {
107
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsOutputGroupProps(props);
108
+ }
109
+ catch (error) {
110
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
111
+ Error.captureStackTrace(error, this.hls);
112
+ }
113
+ throw error;
114
+ }
115
+ return new HlsOutputGroupConfiguration(props);
116
+ }
117
+ /** Create a UDP output group configuration. */
118
+ static udp(props) {
119
+ try {
120
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_UdpOutputGroupProps(props);
121
+ }
122
+ catch (error) {
123
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
124
+ Error.captureStackTrace(error, this.udp);
125
+ }
126
+ throw error;
127
+ }
128
+ return new UdpOutputGroupConfiguration(props);
129
+ }
130
+ /** Create an Archive (S3) output group configuration. */
131
+ static archive(props) {
132
+ try {
133
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_ArchiveOutputGroupProps(props);
134
+ }
135
+ catch (error) {
136
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
137
+ Error.captureStackTrace(error, this.archive);
138
+ }
139
+ throw error;
140
+ }
141
+ return new ArchiveOutputGroupConfiguration(props);
142
+ }
143
+ /** Create an RTMP output group configuration. */
144
+ static rtmp(props) {
145
+ try {
146
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_RtmpOutputGroupProps(props);
147
+ }
148
+ catch (error) {
149
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
150
+ Error.captureStackTrace(error, this.rtmp);
151
+ }
152
+ throw error;
153
+ }
154
+ return new RtmpOutputGroupConfiguration(props);
155
+ }
156
+ /** Create an SRT output group configuration. */
157
+ static srt(props) {
158
+ try {
159
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_SrtOutputGroupProps(props);
160
+ }
161
+ catch (error) {
162
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
163
+ Error.captureStackTrace(error, this.srt);
164
+ }
165
+ throw error;
166
+ }
167
+ return new SrtOutputGroupConfiguration(props);
168
+ }
169
+ /** Create a CMAF Ingest output group configuration. */
170
+ static cmafIngest(props) {
171
+ try {
172
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_CmafIngestOutputGroupProps(props);
173
+ }
174
+ catch (error) {
175
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
176
+ Error.captureStackTrace(error, this.cmafIngest);
177
+ }
178
+ throw error;
179
+ }
180
+ return new CmafIngestOutputGroupConfiguration(props);
181
+ }
182
+ /**
183
+ * Create a Frame Capture output group configuration.
184
+ *
185
+ * A channel that includes a Frame Capture output group must also include
186
+ * a separate video output group (e.g. Archive, HLS, UDP). Frame Capture
187
+ * cannot be the channel's only output group.
188
+ */
189
+ static frameCapture(props) {
190
+ try {
191
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_FrameCaptureOutputGroupProps(props);
192
+ }
193
+ catch (error) {
194
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
195
+ Error.captureStackTrace(error, this.frameCapture);
196
+ }
197
+ throw error;
198
+ }
199
+ return new FrameCaptureOutputGroupConfiguration(props);
200
+ }
201
+ /** Create an MS Smooth output group configuration. */
202
+ static msSmooth(props) {
203
+ try {
204
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_MsSmoothOutputGroupProps(props);
205
+ }
206
+ catch (error) {
207
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
208
+ Error.captureStackTrace(error, this.msSmooth);
209
+ }
210
+ throw error;
211
+ }
212
+ return new MsSmoothOutputGroupConfiguration(props);
213
+ }
214
+ /** @internal - Grant permissions to the channel role for resources referenced by destinations. */
215
+ _grantPermissions(_role) { }
216
+ /**
217
+ * Whether any output in this group has an SRT listener-mode destination. Used by the channel to
218
+ * decide whether channel security groups are required, without triggering destination binding.
219
+ * @internal
220
+ */
221
+ _hasSrtListenerDestination() { return false; }
222
+ /**
223
+ * HLS uses this to select a compatible default program-date-time clock
224
+ * (the service requires INITIALIZE_FROM_OUTPUT_TIMECODE for epoch locking).
225
+ * @internal
226
+ */
227
+ _setEpochLocking(_active) { }
228
+ /**
229
+ * Whether this group explicitly requests an HLS program date time clock of SYSTEM_CLOCK, which
230
+ * is incompatible with epoch output locking. Only HLS groups can return true.
231
+ * @internal
232
+ */
233
+ _hasExplicitSystemClock() { return false; }
234
+ }
235
+ exports.OutputGroupConfiguration = OutputGroupConfiguration;
236
+ /**
237
+ * Key provider settings for HLS encryption.
238
+ */
239
+ class HlsKeyProviderSettings {
240
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.HlsKeyProviderSettings", version: "2.268.0-alpha.0" };
241
+ /** Use a static key for HLS encryption. */
242
+ static staticKey(props) {
243
+ try {
244
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsStaticKeyProps(props);
245
+ }
246
+ catch (error) {
247
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
248
+ Error.captureStackTrace(error, this.staticKey);
249
+ }
250
+ throw error;
251
+ }
252
+ return new HlsKeyProviderSettings({
253
+ staticKeySettings: {
254
+ keyProviderServer: { uri: props.keyProviderServerUrl },
255
+ staticKeyValue: props.staticKeyValue.unsafeUnwrap(), // Safe usage: rendered as CFN dynamic reference
256
+ },
257
+ });
258
+ }
259
+ config;
260
+ constructor(config) { this.config = config; }
261
+ /** @internal */
262
+ _bind() { return this.config; }
263
+ }
264
+ exports.HlsKeyProviderSettings = HlsKeyProviderSettings;
265
+ /**
266
+ * CDN settings for HLS output groups.
267
+ */
268
+ class HlsCdnSettings {
269
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.HlsCdnSettings", version: "2.268.0-alpha.0" };
270
+ /** Use Amazon S3 as the CDN for HLS output. */
271
+ static s3(props) {
272
+ try {
273
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsS3CdnProps(props);
274
+ }
275
+ catch (error) {
276
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
277
+ Error.captureStackTrace(error, this.s3);
278
+ }
279
+ throw error;
280
+ }
281
+ return new HlsCdnSettings({ hlsS3Settings: { cannedAcl: props?.cannedAcl?.value } });
282
+ }
283
+ /** Use a basic HTTP PUT for HLS output. */
284
+ static basicPut(props) {
285
+ try {
286
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsBasicPutCdnProps(props);
287
+ }
288
+ catch (error) {
289
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
290
+ Error.captureStackTrace(error, this.basicPut);
291
+ }
292
+ throw error;
293
+ }
294
+ return new HlsCdnSettings({
295
+ hlsBasicPutSettings: {
296
+ connectionRetryInterval: props?.connectionRetryInterval ?? 1,
297
+ filecacheDuration: props?.filecacheDuration?.toSeconds() ?? 300,
298
+ numRetries: props?.numRetries ?? 10,
299
+ restartDelay: props?.restartDelay ?? 1,
300
+ },
301
+ });
302
+ }
303
+ /** Use Akamai as the CDN for HLS output. */
304
+ static akamai(props) {
305
+ try {
306
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsAkamaiCdnProps(props);
307
+ }
308
+ catch (error) {
309
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
310
+ Error.captureStackTrace(error, this.akamai);
311
+ }
312
+ throw error;
313
+ }
314
+ return new HlsCdnSettings({
315
+ hlsAkamaiSettings: {
316
+ connectionRetryInterval: props?.connectionRetryInterval ?? 1,
317
+ filecacheDuration: props?.filecacheDuration?.toSeconds() ?? 300,
318
+ numRetries: props?.numRetries ?? 10,
319
+ restartDelay: props?.restartDelay ?? 1,
320
+ httpTransferMode: (props?.httpTransferMode ?? enums_1.HttpTransferMode.NON_CHUNKED).value,
321
+ salt: props?.salt,
322
+ token: props?.token,
323
+ },
324
+ });
325
+ }
326
+ /** Use WebDAV as the CDN for HLS output. */
327
+ static webdav(props) {
328
+ try {
329
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsWebdavCdnProps(props);
330
+ }
331
+ catch (error) {
332
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
333
+ Error.captureStackTrace(error, this.webdav);
334
+ }
335
+ throw error;
336
+ }
337
+ return new HlsCdnSettings({
338
+ hlsWebdavSettings: {
339
+ connectionRetryInterval: props?.connectionRetryInterval ?? 1,
340
+ filecacheDuration: props?.filecacheDuration?.toSeconds() ?? 300,
341
+ numRetries: props?.numRetries ?? 10,
342
+ restartDelay: props?.restartDelay ?? 1,
343
+ httpTransferMode: (props?.httpTransferMode ?? enums_1.HttpTransferMode.NON_CHUNKED).value,
344
+ },
345
+ });
346
+ }
347
+ config;
348
+ constructor(config) { this.config = config; }
349
+ /** @internal */
350
+ _bind() { return this.config; }
351
+ }
352
+ exports.HlsCdnSettings = HlsCdnSettings;
353
+ // =============================================================================
354
+ // OutputGroupConfiguration subclasses
355
+ // =============================================================================
356
+ /** @internal */
357
+ class MediaPackageV2OutputGroupConfiguration extends OutputGroupConfiguration {
358
+ props;
359
+ autoChannel;
360
+ explicitDestinations;
361
+ _name;
362
+ constructor(props, autoChannel, explicitDestinations) {
363
+ super();
364
+ this.props = props;
365
+ this.autoChannel = autoChannel;
366
+ this.explicitDestinations = explicitDestinations;
367
+ this._name = props.name;
368
+ }
369
+ /**
370
+ * The primary destinations. For the auto variant they are derived from the channel class
371
+ * (one per pipeline, each with its endpoint); for the custom variant they are user-supplied.
372
+ */
373
+ primaryDestinations(channelClass) {
374
+ if (this.autoChannel) {
375
+ return channelClass === 'STANDARD'
376
+ ? [
377
+ destinations_1.MediaPackageV2Destination.channel(this.autoChannel, destinations_1.MediaPackageV2EndpointId.ENDPOINT_1),
378
+ destinations_1.MediaPackageV2Destination.channel(this.autoChannel, destinations_1.MediaPackageV2EndpointId.ENDPOINT_2),
379
+ ]
380
+ : [destinations_1.MediaPackageV2Destination.channel(this.autoChannel, destinations_1.MediaPackageV2EndpointId.ENDPOINT_1)];
381
+ }
382
+ return this.explicitDestinations ?? [];
383
+ }
384
+ _createInitialOutputs() {
385
+ return this.props.outputs.map(def => new outputs_1.MediaPackageV2Output(def, this._name));
386
+ }
387
+ _bind() {
388
+ const additional = this.props.additionalDestinations ?? [];
389
+ return {
390
+ mediaPackageGroupSettings: {
391
+ destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
392
+ mediapackageV2GroupSettings: {
393
+ additionalDestinations: additional.length > 0
394
+ ? additional.map((_dest, i) => ({
395
+ destination: { destinationRefId: `${(0, outputs_1.toDestinationId)(this.props.name)}-additional-${i}` },
396
+ }))
397
+ : undefined,
398
+ segmentLength: this.props.segment?._length() ?? 1,
399
+ segmentLengthUnits: this.props.segment?._units() ?? enums_1.SegmentLengthUnits.SECONDS,
400
+ id3Behavior: (this.props.id3Behavior ?? enums_1.Id3Behavior.DISABLED).value,
401
+ klvBehavior: (this.props.klvBehavior ?? enums_1.KlvBehavior.NO_PASSTHROUGH).value,
402
+ nielsenId3Behavior: (this.props.nielsenId3Behavior ?? enums_1.NielsenId3Behavior.NO_PASSTHROUGH).value,
403
+ scte35Type: (this.props.scte35Type ?? enums_1.Scte35Type.SCTE_35_WITHOUT_SEGMENTATION).value,
404
+ timedMetadataId3Frame: (this.props.timedMetadataId3Frame ?? enums_1.TimedMetadataId3Frame.NONE).value,
405
+ timedMetadataId3Period: this.props.timedMetadataId3Period?.toSeconds() ?? 10,
406
+ timedMetadataPassthrough: (this.props.timedMetadataPassthrough ?? enums_1.TimedMetadataPassthrough.DISABLED).value,
407
+ captionLanguageMappings: this.props.captionLanguageMappings,
408
+ },
409
+ },
410
+ };
411
+ }
412
+ _bindDestination(_channelClass) {
413
+ const additional = this.props.additionalDestinations ?? [];
414
+ const primaries = this.primaryDestinations(_channelClass);
415
+ // For the auto variant the primary count is correct by construction; for the custom variant
416
+ // this enforces the per-pipeline count the user supplied.
417
+ validateDestinationCount(this._name, _channelClass, primaries.length, additional.length, true);
418
+ // Primary destinations share the output group's destination ID
419
+ const primarySettings = primaries.map(dest => dest._bind());
420
+ const result = [
421
+ { id: (0, outputs_1.toDestinationId)(this.props.name), mediaPackageSettings: primarySettings },
422
+ ];
423
+ // Each additional destination is a separate top-level Destinations entry
424
+ additional.forEach((dest, i) => {
425
+ result.push({
426
+ id: `${(0, outputs_1.toDestinationId)(this.props.name)}-additional-${i}`,
427
+ mediaPackageSettings: [dest._bind()],
428
+ });
429
+ });
430
+ return result;
431
+ }
432
+ _grantPermissions(role) {
433
+ const primaries = this.autoChannel
434
+ ? [destinations_1.MediaPackageV2Destination.channel(this.autoChannel)]
435
+ : (this.explicitDestinations ?? []);
436
+ [...primaries, ...(this.props.additionalDestinations ?? [])].forEach(d => d._grantPermissions(role));
437
+ }
438
+ }
439
+ /** @internal */
440
+ class MediaConnectRouterOutputGroupConfiguration extends OutputGroupConfiguration {
441
+ props;
442
+ _name;
443
+ constructor(props) {
444
+ super();
445
+ this.props = props;
446
+ this._name = props.name;
447
+ if (props.outputs.length > 1) {
448
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MediaConnectRouterSingleOutput`, `MediaConnect Router output group '${props.name}' may contain at most one output, but ${props.outputs.length} were provided`);
449
+ }
450
+ }
451
+ _createInitialOutputs() {
452
+ return this.props.outputs.map(def => new outputs_1.MediaConnectRouterOutput(def, this._name));
453
+ }
454
+ _bind() {
455
+ return {
456
+ mediaConnectRouterGroupSettings: {
457
+ availabilityZones: this.props.availabilityZones,
458
+ },
459
+ };
460
+ }
461
+ _bindDestination(channelClass) {
462
+ const pipelineCount = channelClass === 'STANDARD' ? 2 : 1;
463
+ const azCount = this.props.availabilityZones.length;
464
+ if (azCount !== pipelineCount) {
465
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MediaConnectRouterAvailabilityZones`, `MediaConnect Router output group '${this._name}' requires exactly ${pipelineCount} availabilityZone(s)`
466
+ + ` for a ${channelClass} channel, but ${azCount} provided`);
467
+ }
468
+ const settings = this.props.routerSettings ?? destinations_1.MediaConnectRouterSettings.shared();
469
+ return [
470
+ { id: (0, outputs_1.toDestinationId)(this._name), mediaConnectRouterSettings: settings._bind(pipelineCount) },
471
+ ];
472
+ }
473
+ _grantPermissions(role) {
474
+ this.props.routerSettings?._secrets().forEach(secret => secret.grantRead(role));
475
+ }
476
+ }
477
+ /** @internal */
478
+ class HlsOutputGroupConfiguration extends OutputGroupConfiguration {
479
+ props;
480
+ _name;
481
+ epochLocking = false;
482
+ constructor(props) {
483
+ super();
484
+ this.props = props;
485
+ this._name = props.name;
486
+ }
487
+ _setEpochLocking(active) {
488
+ this.epochLocking = active;
489
+ }
490
+ /**
491
+ * The default program date time clock. Epoch output locking requires
492
+ * INITIALIZE_FROM_OUTPUT_TIMECODE; otherwise SYSTEM_CLOCK.
493
+ */
494
+ _defaultProgramDateTimeClock() {
495
+ return this.epochLocking
496
+ ? enums_1.HlsProgramDateTimeClock.INITIALIZE_FROM_OUTPUT_TIMECODE
497
+ : enums_1.HlsProgramDateTimeClock.SYSTEM_CLOCK;
498
+ }
499
+ /** Whether the user explicitly set an incompatible SYSTEM_CLOCK program-date-time clock. @internal */
500
+ _hasExplicitSystemClock() {
501
+ return this.props.programDateTimeClock?.value === enums_1.HlsProgramDateTimeClock.SYSTEM_CLOCK.value;
502
+ }
503
+ _createInitialOutputs() {
504
+ return (this.props.outputs ?? []).map(def => new outputs_1.HlsOutput(def));
505
+ }
506
+ _bind() {
507
+ return {
508
+ hlsGroupSettings: {
509
+ destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
510
+ segmentLength: this.props.segment?._toSeconds() ?? 2,
511
+ keepSegments: this.props.keepSegments ?? 21,
512
+ indexNSegments: this.props.indexNSegments ?? 10,
513
+ mode: (this.props.mode ?? enums_1.HlsMode.LIVE).value,
514
+ minSegmentLength: this.props.minSegment?._toSeconds(),
515
+ inputLossAction: (this.props.inputLossAction ?? enums_1.HlsInputLossAction.EMIT_OUTPUT).value,
516
+ adMarkers: this.props.adMarkers?.map(m => m.value),
517
+ baseUrlContent: this.props.baseUrlContent,
518
+ baseUrlContent1: this.props.baseUrlContent1,
519
+ baseUrlManifest: this.props.baseUrlManifest,
520
+ baseUrlManifest1: this.props.baseUrlManifest1,
521
+ captionLanguageMappings: this.props.captionLanguageMappings,
522
+ captionLanguageSetting: this.props.captionLanguageSetting?.value,
523
+ clientCache: (this.props.clientCache ?? enums_1.HlsClientCache.ENABLED).value,
524
+ codecSpecification: (this.props.codecSpecification ?? enums_1.HlsCodecSpecification.RFC_4281).value,
525
+ constantIv: this.props.constantIv,
526
+ directoryStructure: (this.props.directoryStructure ?? enums_1.HlsDirectoryStructure.SINGLE_DIRECTORY).value,
527
+ discontinuityTags: (this.props.discontinuityTags ?? enums_1.HlsDiscontinuityTags.INSERT).value,
528
+ encryptionType: this.props.encryptionType?.value,
529
+ hlsCdnSettings: this.props.hlsCdnSettings?._bind(),
530
+ hlsId3SegmentTagging: (this.props.hlsId3SegmentTagging ?? enums_1.HlsId3SegmentTaggingState.DISABLED).value,
531
+ iFrameOnlyPlaylists: (this.props.iFrameOnlyPlaylists ?? enums_1.HlsIFrameOnlyPlaylists.DISABLED).value,
532
+ incompleteSegmentBehavior: (this.props.incompleteSegmentBehavior ?? enums_1.HlsIncompleteSegmentBehavior.AUTO).value,
533
+ ivInManifest: this.props.ivInManifest?.value,
534
+ ivSource: this.props.ivSource?.value,
535
+ keyFormat: this.props.keyFormat,
536
+ keyFormatVersions: this.props.keyFormatVersions,
537
+ keyProviderSettings: this.props.keyProviderSettings?._bind(),
538
+ manifestCompression: (this.props.manifestCompression ?? enums_1.HlsManifestCompression.NONE).value,
539
+ manifestDurationFormat: (this.props.manifestDurationFormat ?? enums_1.HlsManifestDurationFormat.FLOATING_POINT).value,
540
+ outputSelection: (this.props.outputSelection ?? enums_1.HlsOutputSelection.MANIFESTS_AND_SEGMENTS).value,
541
+ programDateTime: (this.props.programDateTime ?? enums_1.HlsProgramDateTime.INCLUDE).value,
542
+ programDateTimeClock: (this.props.programDateTimeClock ?? this._defaultProgramDateTimeClock()).value,
543
+ programDateTimePeriod: this.props.programDateTimePeriod?.toSeconds() ?? 600,
544
+ redundantManifest: (this.props.redundantManifest ?? enums_1.HlsRedundantManifest.DISABLED).value,
545
+ segmentationMode: (this.props.segmentationMode ?? enums_1.HlsSegmentationMode.USE_SEGMENT_DURATION).value,
546
+ segmentsPerSubdirectory: this.props.segmentsPerSubdirectory ?? 10_000,
547
+ streamInfResolution: (this.props.streamInfResolution ?? enums_1.HlsStreamInfResolution.INCLUDE).value,
548
+ timedMetadataId3Frame: (this.props.timedMetadataId3Frame ?? enums_1.HlsTimedMetadataId3Frame.PRIV).value,
549
+ timedMetadataId3Period: this.props.timedMetadataId3Period?.toSeconds() ?? 10,
550
+ timestampDeltaMilliseconds: this.props.timestampDelta?.toMilliseconds(),
551
+ tsFileMode: (this.props.tsFileMode ?? enums_1.HlsTsFileMode.SEGMENTED_FILES).value,
552
+ },
553
+ };
554
+ }
555
+ _bindDestination(_channelClass) {
556
+ validateDestinationCount(this._name, _channelClass, this.props.destinations.length, 0, false);
557
+ const settings = this.props.destinations.map(d => {
558
+ const bound = d._bind();
559
+ if (bound.url && !aws_cdk_lib_1.Token.isUnresolved(bound.url) && bound.url.endsWith('/')) {
560
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `HlsDestinationTrailingSlash`, `HLS output group '${this._name}' destination URL must be a file prefix, not a folder (got '${bound.url}'). Remove the trailing slash.`);
561
+ }
562
+ // An https destination pushes to a CDN/web server, which requires hlsCdnSettings.
563
+ if (bound.url && !aws_cdk_lib_1.Token.isUnresolved(bound.url) && bound.url.startsWith('https://')
564
+ && this.props.hlsCdnSettings === undefined) {
565
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `HlsHttpsDestinationRequiresCdnSettings`, `HLS output group '${this._name}' uses an https destination URL, which requires hlsCdnSettings to be set (e.g. HlsCdnSettings.basicPut(), .akamai(), or .webdav()).`);
566
+ }
567
+ return bound;
568
+ });
569
+ return [{ id: (0, outputs_1.toDestinationId)(this.props.name), settings }];
570
+ }
571
+ _grantPermissions(role) {
572
+ this.props.destinations.forEach(d => d._grantPermissions(role));
573
+ }
574
+ }
575
+ /** @internal */
576
+ class UdpOutputGroupConfiguration extends OutputGroupConfiguration {
577
+ props;
578
+ _name;
579
+ constructor(props) {
580
+ super();
581
+ this.props = props;
582
+ this._name = props.name;
583
+ }
584
+ _createInitialOutputs() {
585
+ return (this.props.outputs ?? []).map(def => new outputs_1.UdpOutput(def, this.props));
586
+ }
587
+ _bind() {
588
+ return {
589
+ udpGroupSettings: {
590
+ inputLossAction: (this.props.inputLossAction ?? enums_1.UdpInputLossAction.EMIT_PROGRAM).value,
591
+ timedMetadataId3Frame: (this.props.timedMetadataId3Frame ?? enums_1.UdpTimedMetadataId3Frame.PRIV).value,
592
+ timedMetadataId3Period: this.props.timedMetadataId3Period?.toSeconds() ?? 10,
593
+ },
594
+ };
595
+ }
596
+ _bindDestination(_channelClass) {
597
+ validateDestinationCount(this._name, _channelClass, this.props.destinations.length, 0, false);
598
+ const settings = this.props.destinations.map(d => d._bind());
599
+ return [{ id: (0, outputs_1.toDestinationId)(this.props.name), settings }];
600
+ }
601
+ _grantPermissions(role) {
602
+ this.props.destinations.forEach(d => d._grantPermissions(role));
603
+ }
604
+ }
605
+ /** @internal */
606
+ class ArchiveOutputGroupConfiguration extends OutputGroupConfiguration {
607
+ props;
608
+ _name;
609
+ constructor(props) {
610
+ super();
611
+ this.props = props;
612
+ this._name = props.name;
613
+ // An archive group must contain at least one output with a video encode (raw-container
614
+ // outputs are audio-only, so a group of only raw outputs is rejected by the service).
615
+ const outputs = props.outputs ?? [];
616
+ if (outputs.length > 0 && !outputs.some(o => o.encodes.some(e => e._bindVideo() !== undefined))) {
617
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `ArchiveGroupRequiresVideo`, `Archive output group '${props.name}' must contain at least one output with a video encode`);
618
+ }
619
+ }
620
+ _createInitialOutputs() {
621
+ return (this.props.outputs ?? []).map(def => new outputs_1.ArchiveOutput(def));
622
+ }
623
+ _bind() {
624
+ return {
625
+ archiveGroupSettings: {
626
+ destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
627
+ rolloverInterval: this.props.rolloverInterval?.toSeconds() ?? 300,
628
+ archiveCdnSettings: this.props.archiveS3CannedAcl ? {
629
+ archiveS3Settings: { cannedAcl: this.props.archiveS3CannedAcl.value },
630
+ } : undefined,
631
+ },
632
+ };
633
+ }
634
+ _bindDestination(_channelClass) {
635
+ validateDestinationCount(this._name, _channelClass, this.props.destinations.length, 0, false);
636
+ const settings = this.props.destinations.map(d => d._bind());
637
+ return [{ id: (0, outputs_1.toDestinationId)(this.props.name), settings }];
638
+ }
639
+ _grantPermissions(role) {
640
+ this.props.destinations.forEach(d => d._grantPermissions(role));
641
+ }
642
+ }
643
+ /** @internal */
644
+ class RtmpOutputGroupConfiguration extends OutputGroupConfiguration {
645
+ props;
646
+ _name;
647
+ constructor(props) {
648
+ super();
649
+ this.props = props;
650
+ this._name = props.name;
651
+ }
652
+ _createInitialOutputs() {
653
+ return this.props.outputs.map(def => new outputs_1.RtmpOutput(def, this._name));
654
+ }
655
+ _bind() {
656
+ return {
657
+ rtmpGroupSettings: {
658
+ authenticationScheme: (this.props.authenticationScheme ?? enums_1.RtmpAuthenticationScheme.COMMON).value,
659
+ restartDelay: this.props.restartDelay?.toSeconds() ?? 1,
660
+ adMarkers: this.props.adMarkers?.map(m => m.value),
661
+ cacheFullBehavior: this.props.cacheFullBehavior?.value,
662
+ cacheLength: this.props.cacheLength?.toSeconds(),
663
+ captionData: this.props.captionData?.value,
664
+ includeFillerNalUnits: this.props.includeFillerNalUnits?.value,
665
+ inputLossAction: this.props.inputLossAction?.value,
666
+ },
667
+ };
668
+ }
669
+ _bindDestination(channelClass) {
670
+ const expected = channelClass === 'STANDARD' ? 2 : 1;
671
+ const seenIds = new Set();
672
+ return this.props.outputs.map((def) => {
673
+ if (def.destinations.length !== expected) {
674
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `RtmpDestinationCount`, `RTMP output '${def.outputName}' in group '${this._name}' requires exactly ${expected} destination(s) (one per pipeline) for a ${channelClass} channel, got ${def.destinations.length}`);
675
+ }
676
+ const id = (0, outputs_1.toDestinationId)(def.outputName);
677
+ if (id === '') {
678
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `RtmpDestinationIdEmpty`, `RTMP output in group '${this._name}' outputName must contain at least one alphanumeric character`);
679
+ }
680
+ if (seenIds.has(id)) {
681
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `RtmpDestinationIdCollision`, `RTMP outputs in group '${this._name}' produce the same destination id '${id}' after sanitising output names; rename the outputs so they differ by more than '_' vs '-'`);
682
+ }
683
+ seenIds.add(id);
684
+ return { id, settings: def.destinations.map(d => d._bind()) };
685
+ });
686
+ }
687
+ _grantPermissions(role) {
688
+ this.props.outputs.forEach(o => o.destinations.forEach(d => d._grantPermissions(role)));
689
+ }
690
+ }
691
+ /** @internal */
692
+ class SrtOutputGroupConfiguration extends OutputGroupConfiguration {
693
+ props;
694
+ _name;
695
+ _outputs;
696
+ constructor(props) {
697
+ super();
698
+ this.props = props;
699
+ this._name = props.name;
700
+ this._outputs = props.outputs.map(def => new outputs_1.SrtOutput(def, this._name));
701
+ }
702
+ _createInitialOutputs() {
703
+ return this._outputs;
704
+ }
705
+ _bind() {
706
+ return {
707
+ srtGroupSettings: {
708
+ inputLossAction: (this.props.inputLossAction ?? enums_1.SrtInputLossAction.EMIT_PROGRAM).value,
709
+ },
710
+ };
711
+ }
712
+ _bindDestination(channelClass) {
713
+ const expected = channelClass === 'STANDARD' ? 2 : 1;
714
+ const seenIds = new Set();
715
+ return this.props.outputs.map((def) => {
716
+ if (def.destinations.length !== expected) {
717
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `SrtDestinationCount`, `SRT output '${def.outputName}' in group '${this._name}' requires exactly ${expected} destination(s) (one per pipeline) for a ${channelClass} channel, got ${def.destinations.length}`);
718
+ }
719
+ const id = (0, outputs_1.toDestinationId)(def.outputName);
720
+ if (id === '') {
721
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `SrtDestinationIdEmpty`, `SRT output in group '${this._name}' outputName must contain at least one alphanumeric character`);
722
+ }
723
+ if (seenIds.has(id)) {
724
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `SrtDestinationIdCollision`, `SRT outputs in group '${this._name}' produce the same destination id '${id}' after sanitising output names; rename the outputs so they differ by more than '_' vs '-'`);
725
+ }
726
+ seenIds.add(id);
727
+ return { id, srtSettings: def.destinations.map(d => d._bind()) };
728
+ });
729
+ }
730
+ _grantPermissions(role) {
731
+ this.props.outputs.forEach(o => o.destinations.forEach(d => d._grantPermissions(role)));
732
+ }
733
+ _hasSrtListenerDestination() {
734
+ return this.props.outputs.some(o => o.destinations.some(d => d._bind().connectionMode === 'LISTENER'));
735
+ }
736
+ }
737
+ /** @internal */
738
+ class CmafIngestOutputGroupConfiguration extends OutputGroupConfiguration {
739
+ props;
740
+ _name;
741
+ constructor(props) {
742
+ super();
743
+ this.props = props;
744
+ this._name = props.name;
745
+ // Eagerly reject destination URLs that don't end with '/' — this is API misuse that always
746
+ // fails at deploy, so fail fast at construction rather than at synth.
747
+ [...props.destinations, ...(props.additionalDestinations ?? [])].forEach(d => {
748
+ const { url } = d._bind();
749
+ if (url && !aws_cdk_lib_1.Token.isUnresolved(url) && !url.endsWith('/')) {
750
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `CmafIngestDestinationTrailingSlash`, `CMAF Ingest output group '${this._name}' destination URL path must end with '/' (got '${url}').`);
751
+ }
752
+ });
753
+ }
754
+ _createInitialOutputs() {
755
+ return this.props.outputs.map(def => new outputs_1.CmafIngestOutput(def));
756
+ }
757
+ _bind() {
758
+ return {
759
+ cmafIngestGroupSettings: {
760
+ destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
761
+ segmentLength: this.props.segment?._length() ?? 1,
762
+ segmentLengthUnits: this.props.segment?._units() ?? enums_1.SegmentLengthUnits.SECONDS,
763
+ id3Behavior: (this.props.id3Behavior ?? enums_1.Id3Behavior.DISABLED).value,
764
+ id3NameModifier: this.props.id3NameModifier,
765
+ klvBehavior: (this.props.klvBehavior ?? enums_1.KlvBehavior.NO_PASSTHROUGH).value,
766
+ klvNameModifier: this.props.klvNameModifier,
767
+ nielsenId3Behavior: (this.props.nielsenId3Behavior ?? enums_1.NielsenId3Behavior.NO_PASSTHROUGH).value,
768
+ nielsenId3NameModifier: this.props.nielsenId3NameModifier,
769
+ scte35NameModifier: this.props.scte35NameModifier,
770
+ scte35Type: (this.props.scte35Type ?? enums_1.Scte35Type.SCTE_35_WITHOUT_SEGMENTATION).value,
771
+ sendDelayMs: this.props.sendDelayMs,
772
+ timedMetadataId3Frame: (this.props.timedMetadataId3Frame ?? enums_1.TimedMetadataId3Frame.NONE).value,
773
+ timedMetadataId3Period: this.props.timedMetadataId3Period?.toSeconds() ?? 10,
774
+ timedMetadataPassthrough: (this.props.timedMetadataPassthrough ?? enums_1.TimedMetadataPassthrough.DISABLED).value,
775
+ captionLanguageMappings: this.props.captionLanguageMappings,
776
+ },
777
+ };
778
+ }
779
+ _bindDestination(_channelClass) {
780
+ const additional = this.props.additionalDestinations ?? [];
781
+ validateDestinationCount(this._name, _channelClass, this.props.destinations.length, additional.length, true);
782
+ const primarySettings = this.props.destinations.map(d => d._bind());
783
+ const result = [
784
+ { id: (0, outputs_1.toDestinationId)(this.props.name), settings: primarySettings },
785
+ ];
786
+ additional.forEach((dest, i) => {
787
+ result.push({
788
+ id: `${(0, outputs_1.toDestinationId)(this.props.name)}-additional-${i}`,
789
+ settings: [dest._bind()],
790
+ });
791
+ });
792
+ return result;
793
+ }
794
+ _grantPermissions(role) {
795
+ [...this.props.destinations, ...(this.props.additionalDestinations ?? [])].forEach(d => d._grantPermissions(role));
796
+ }
797
+ }
798
+ /** @internal */
799
+ class FrameCaptureOutputGroupConfiguration extends OutputGroupConfiguration {
800
+ props;
801
+ _name;
802
+ constructor(props) {
803
+ super();
804
+ this.props = props;
805
+ this._name = props.name;
806
+ }
807
+ _createInitialOutputs() {
808
+ return (this.props.outputs ?? []).map(def => new outputs_1.FrameCaptureOutput(def));
809
+ }
810
+ _bind() {
811
+ return {
812
+ frameCaptureGroupSettings: {
813
+ destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
814
+ frameCaptureCdnSettings: this.props.frameCaptureS3CannedAcl ? {
815
+ frameCaptureS3Settings: { cannedAcl: this.props.frameCaptureS3CannedAcl.value },
816
+ } : undefined,
817
+ },
818
+ };
819
+ }
820
+ _bindDestination(_channelClass) {
821
+ validateDestinationCount(this._name, _channelClass, this.props.destinations.length, 0, false);
822
+ const settings = this.props.destinations.map(d => d._bind());
823
+ return [{ id: (0, outputs_1.toDestinationId)(this.props.name), settings }];
824
+ }
825
+ _grantPermissions(role) {
826
+ this.props.destinations.forEach(d => d._grantPermissions(role));
827
+ }
828
+ }
829
+ /** @internal */
830
+ class MsSmoothOutputGroupConfiguration extends OutputGroupConfiguration {
831
+ props;
832
+ _name;
833
+ constructor(props) {
834
+ super();
835
+ this.props = props;
836
+ this._name = props.name;
837
+ // All outputs in an MS Smooth group share the group's single destination, so MediaLive
838
+ // distinguishes them by nameModifier alone — it must be set and unique across outputs.
839
+ // Otherwise this fails at deploy with "Outputs must have unique destinations".
840
+ const outputs = props.outputs ?? [];
841
+ if (outputs.length > 1) {
842
+ const seenModifiers = new Set();
843
+ outputs.forEach(def => {
844
+ if (!def.nameModifier) {
845
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MsSmoothNameModifierRequired`, `MS Smooth output group '${this._name}' has multiple outputs sharing one destination;`
846
+ + ` output '${def.outputName}' must set a unique 'nameModifier'.`);
847
+ }
848
+ if (seenModifiers.has(def.nameModifier)) {
849
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `MsSmoothNameModifierCollision`, `MS Smooth output group '${this._name}' has more than one output with nameModifier`
850
+ + ` '${def.nameModifier}'; each output's nameModifier must be unique within the group.`);
851
+ }
852
+ seenModifiers.add(def.nameModifier);
853
+ });
854
+ }
855
+ }
856
+ _createInitialOutputs() {
857
+ return (this.props.outputs ?? []).map(def => new outputs_1.MsSmoothOutput(def));
858
+ }
859
+ _bind() {
860
+ return {
861
+ msSmoothGroupSettings: {
862
+ destination: { destinationRefId: (0, outputs_1.toDestinationId)(this.props.name) },
863
+ acquisitionPointId: this.props.acquisitionPointId,
864
+ audioOnlyTimecodeControl: this.props.audioOnlyTimecodeControl?.value,
865
+ certificateMode: this.props.certificateMode?.value,
866
+ connectionRetryInterval: this.props.connectionRetryInterval?.toSeconds(),
867
+ eventId: this.props.eventId,
868
+ eventIdMode: this.props.eventIdMode?.value,
869
+ eventStopBehavior: this.props.eventStopBehavior?.value,
870
+ filecacheDuration: this.props.filecacheDuration?.toSeconds(),
871
+ fragmentLength: this.props.fragmentLength?.toSeconds(),
872
+ inputLossAction: this.props.inputLossAction?.value,
873
+ numRetries: this.props.numRetries ?? 10,
874
+ restartDelay: this.props.restartDelay?.toSeconds() ?? 1,
875
+ segmentationMode: this.props.segmentationMode?.value,
876
+ sendDelayMs: this.props.sendDelayMs,
877
+ sparseTrackType: this.props.sparseTrackType?.value,
878
+ streamManifestBehavior: this.props.streamManifestBehavior?.value,
879
+ timestampOffset: this.props.timestampOffset,
880
+ timestampOffsetMode: this.props.timestampOffsetMode?.value,
881
+ },
882
+ };
883
+ }
884
+ _bindDestination(_channelClass) {
885
+ validateDestinationCount(this._name, _channelClass, this.props.destinations.length, 0, false);
886
+ const settings = this.props.destinations.map(d => d._bind());
887
+ return [{ id: (0, outputs_1.toDestinationId)(this.props.name), settings }];
888
+ }
889
+ _grantPermissions(role) {
890
+ this.props.destinations.forEach(d => d._grantPermissions(role));
891
+ }
892
+ }
893
+ // =============================================================================
894
+ // OutputGroup (orchestrates outputs within a group)
895
+ // =============================================================================
896
+ /**
897
+ * An output group within a MediaLive channel.
898
+ *
899
+ * @internal
900
+ */
901
+ class OutputGroup {
902
+ config;
903
+ outputs = [];
904
+ constructor(config) {
905
+ this.config = config;
906
+ this.outputs.push(...config._createInitialOutputs());
907
+ }
908
+ /** @internal */
909
+ _bind() {
910
+ return {
911
+ name: this.config._name,
912
+ outputGroupSettings: this.config._bind(),
913
+ outputs: this.outputs.map(o => o._bind()),
914
+ };
915
+ }
916
+ /** @internal */
917
+ _bindDestination(channelClass) {
918
+ return this.config._bindDestination(channelClass);
919
+ }
920
+ /** @internal */
921
+ _collectEncodes() {
922
+ return this.outputs.flatMap(o => o._getEncodes());
923
+ }
924
+ /** @internal - Propagate epoch-locking state to the underlying config. */
925
+ _setEpochLocking(active) {
926
+ this.config._setEpochLocking(active);
927
+ }
928
+ /** @internal - Whether the underlying config explicitly requests an incompatible SYSTEM_CLOCK. */
929
+ _hasExplicitSystemClock() {
930
+ return this.config._hasExplicitSystemClock();
931
+ }
932
+ /** @internal */
933
+ _grantPermissions(role) {
934
+ this.config._grantPermissions(role);
935
+ // Grant read access to any external files referenced by the outputs (burn-in caption fonts,
936
+ // audio-only cover-art images) sourced from S3 buckets.
937
+ this.outputs.forEach(o => o._grantPermissions(role));
938
+ }
939
+ }
940
+ exports.OutputGroup = OutputGroup;
941
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LWdyb3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsib3V0cHV0LWdyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBK0I7QUFDL0IsMENBQXdCO0FBQ3hCLDRDQUEwQjtBQUkxQiw2Q0FBNkQ7QUFHN0QsNEVBQTREO0FBSzVELGlEQUFpSDtBQUVqSCxtQ0FnQ2lCO0FBY2pCLHVDQUltQjtBQVluQixnQkFBZ0I7QUFDaEIsU0FBUyx3QkFBd0IsQ0FDL0IsU0FBaUIsRUFDakIsWUFBb0IsRUFDcEIsZ0JBQXdCLEVBQ3hCLGVBQXVCLEVBQ3ZCLGVBQXdCO0lBRXhCLE1BQU0sVUFBVSxHQUFHLFlBQVksS0FBSyxVQUFVLENBQUM7SUFDL0MsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxJQUFJLGdCQUFnQixLQUFLLGVBQWUsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLGtCQUFrQixFQUNyQixpQkFBaUIsU0FBUyxzQkFBc0IsZUFBZSxFQUFFO2NBQy9ELGlDQUFpQyxZQUFZLGlCQUFpQixnQkFBZ0IsWUFBWSxDQUM3RixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLHdCQUF3QixFQUMzQixpQkFBaUIsU0FBUyw2Q0FBNkMsQ0FDeEUsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLElBQUksZUFBZSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLDRCQUE0QixFQUMvQixpQkFBaUIsU0FBUyxvQkFBb0IsYUFBYSxFQUFFO2NBQzNELG9DQUFvQyxZQUFZLGlCQUFpQixlQUFlLFlBQVksQ0FDL0YsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLHdEQUF3RDtBQUN4RCxnRkFBZ0Y7QUFFaEY7O0dBRUc7QUFDSCxNQUFzQix3QkFBd0I7O0lBQzVDOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBcUM7Ozs7Ozs7Ozs7UUFDaEUsT0FBTyxJQUFJLHNDQUFzQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ3BGO0lBQ0Q7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLHlCQUF5QixDQUFDLEtBQWdEOzs7Ozs7Ozs7O1FBQ3RGLE9BQU8sSUFBSSxzQ0FBc0MsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUN6RjtJQUNEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUF5Qzs7Ozs7Ozs7OztRQUN4RSxPQUFPLElBQUksMENBQTBDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDOUQ7SUFDRCxnREFBZ0Q7SUFDekMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUEwQjs7Ozs7Ozs7OztRQUMxQyxPQUFPLElBQUksMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDL0M7SUFDRCwrQ0FBK0M7SUFDeEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUEwQjs7Ozs7Ozs7OztRQUMxQyxPQUFPLElBQUksMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDL0M7SUFDRCx5REFBeUQ7SUFDbEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUE4Qjs7Ozs7Ozs7OztRQUNsRCxPQUFPLElBQUksK0JBQStCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDbkQ7SUFDRCxpREFBaUQ7SUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUEyQjs7Ozs7Ozs7OztRQUM1QyxPQUFPLElBQUksNEJBQTRCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDaEQ7SUFDRCxnREFBZ0Q7SUFDekMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUEwQjs7Ozs7Ozs7OztRQUMxQyxPQUFPLElBQUksMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDL0M7SUFDRCx1REFBdUQ7SUFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFpQzs7Ozs7Ozs7OztRQUN4RCxPQUFPLElBQUksa0NBQWtDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDdEQ7SUFDRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQW1DOzs7Ozs7Ozs7O1FBQzVELE9BQU8sSUFBSSxvQ0FBb0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4RDtJQUNELHNEQUFzRDtJQUMvQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQStCOzs7Ozs7Ozs7O1FBQ3BELE9BQU8sSUFBSSxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNwRDtJQVlELGtHQUFrRztJQUMzRixpQkFBaUIsQ0FBQyxLQUFlLEtBQVU7SUFHbEQ7Ozs7T0FJRztJQUNJLDBCQUEwQixLQUFjLE9BQU8sS0FBSyxDQUFDLEVBQUU7SUFDOUQ7Ozs7T0FJRztJQUNJLGdCQUFnQixDQUFDLE9BQWdCLEtBQVU7SUFDbEQ7Ozs7T0FJRztJQUNJLHVCQUF1QixLQUFjLE9BQU8sS0FBSyxDQUFDLEVBQUU7O0FBL0Y3RCw0REFnR0M7QUE2RkQ7O0dBRUc7QUFDSCxNQUFhLHNCQUFzQjs7SUFDakMsMkNBQTJDO0lBQ3BDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBd0I7Ozs7Ozs7Ozs7UUFDOUMsT0FBTyxJQUFJLHNCQUFzQixDQUFDO1lBQ2hDLGlCQUFpQixFQUFFO2dCQUNqQixpQkFBaUIsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ3RELGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxFQUFFLGdEQUFnRDthQUN0RztTQUNGLENBQUMsQ0FBQztLQUNKO0lBRWdCLE1BQU0sQ0FBeUM7SUFDaEUsWUFBb0IsTUFBOEMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxFQUFFO0lBRTdGLGdCQUFnQjtJQUNULEtBQUssS0FBNkMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7O0FBZmhGLHdEQWdCQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxjQUFjOztJQUN6QiwrQ0FBK0M7SUFDeEMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFxQjs7Ozs7Ozs7OztRQUNwQyxPQUFPLElBQUksY0FBYyxDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ3RGO0lBQ0QsMkNBQTJDO0lBQ3BDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBMkI7Ozs7Ozs7Ozs7UUFDaEQsT0FBTyxJQUFJLGNBQWMsQ0FBQztZQUN4QixtQkFBbUIsRUFBRTtnQkFDbkIsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixJQUFJLENBQUM7Z0JBQzVELGlCQUFpQixFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsSUFBSSxHQUFHO2dCQUMvRCxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsSUFBSSxFQUFFO2dCQUNuQyxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksSUFBSSxDQUFDO2FBQ3ZDO1NBQ0YsQ0FBQyxDQUFDO0tBQ0o7SUFDRCw0Q0FBNEM7SUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUF5Qjs7Ozs7Ozs7OztRQUM1QyxPQUFPLElBQUksY0FBYyxDQUFDO1lBQ3hCLGlCQUFpQixFQUFFO2dCQUNqQix1QkFBdUIsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLElBQUksQ0FBQztnQkFDNUQsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLEdBQUc7Z0JBQy9ELFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxJQUFJLEVBQUU7Z0JBQ25DLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxJQUFJLENBQUM7Z0JBQ3RDLGdCQUFnQixFQUFFLENBQUMsS0FBSyxFQUFFLGdCQUFnQixJQUFJLHdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2pGLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSTtnQkFDakIsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLO2FBQ3BCO1NBQ0YsQ0FBQyxDQUFDO0tBQ0o7SUFDRCw0Q0FBNEM7SUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUF5Qjs7Ozs7Ozs7OztRQUM1QyxPQUFPLElBQUksY0FBYyxDQUFDO1lBQ3hCLGlCQUFpQixFQUFFO2dCQUNqQix1QkFBdUIsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLElBQUksQ0FBQztnQkFDNUQsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLEdBQUc7Z0JBQy9ELFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxJQUFJLEVBQUU7Z0JBQ25DLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxJQUFJLENBQUM7Z0JBQ3RDLGdCQUFnQixFQUFFLENBQUMsS0FBSyxFQUFFLGdCQUFnQixJQUFJLHdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUs7YUFDbEY7U0FDRixDQUFDLENBQUM7S0FDSjtJQUVnQixNQUFNLENBQW9DO0lBQzNELFlBQW9CLE1BQXlDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBRTtJQUV4RixnQkFBZ0I7SUFDVCxLQUFLLEtBQXdDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFOztBQS9DM0Usd0NBZ0RDO0FBMHdCRCxnRkFBZ0Y7QUFDaEYsc0NBQXNDO0FBQ3RDLGdGQUFnRjtBQUVoRixnQkFBZ0I7QUFDaEIsTUFBTSxzQ0FBdUMsU0FBUSx3QkFBd0I7SUFHeEQ7SUFDQTtJQUNBO0lBSk0sS0FBSyxDQUFTO0lBQ3ZDLFlBQ21CLEtBQXlDLEVBQ3pDLFdBQW9DLEVBQ3BDLG9CQUFrRDtRQUVuRSxLQUFLLEVBQUUsQ0FBQztRQUpTLFVBQUssR0FBTCxLQUFLLENBQW9DO1FBQ3pDLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQUNwQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQThCO1FBR25FLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztLQUN6QjtJQUVEOzs7T0FHRztJQUNLLG1CQUFtQixDQUFDLFlBQW9CO1FBQzlDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sWUFBWSxLQUFLLFVBQVU7Z0JBQ2hDLENBQUMsQ0FBQztvQkFDQSx3Q0FBeUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSx1Q0FBd0IsQ0FBQyxVQUFVLENBQUM7b0JBQ3hGLHdDQUF5QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHVDQUF3QixDQUFDLFVBQVUsQ0FBQztpQkFDekY7Z0JBQ0QsQ0FBQyxDQUFDLENBQUMsd0NBQXlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsdUNBQXdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNqRyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDO0tBQ3hDO0lBRU0scUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSw4QkFBb0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDakY7SUFDTSxLQUFLO1FBQ1YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxFQUFFLENBQUM7UUFDM0QsT0FBTztZQUNMLHlCQUF5QixFQUFFO2dCQUN6QixXQUFXLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFBLHlCQUFlLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkUsMkJBQTJCLEVBQUU7b0JBQzNCLHNCQUFzQixFQUFFLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDM0MsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzRCQUM5QixXQUFXLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLElBQUEseUJBQWUsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFO3lCQUN6RixDQUFDLENBQUM7d0JBQ0gsQ0FBQyxDQUFDLFNBQVM7b0JBQ2IsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUM7b0JBQ2pELGtCQUFrQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLDBCQUFrQixDQUFDLE9BQU87b0JBQzlFLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLG1CQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSztvQkFDbkUsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksbUJBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLO29CQUN6RSxrQkFBa0IsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLElBQUksMEJBQWtCLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSztvQkFDOUYsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksa0JBQVUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLEtBQUs7b0JBQ3BGLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSw2QkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLO29CQUM3RixzQkFBc0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7b0JBQzVFLHdCQUF3QixFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxnQ0FBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLO29CQUMxRyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QjtpQkFDNUQ7YUFDRjtTQUNGLENBQUM7S0FDSDtJQUNNLGdCQUFnQixDQUFDLGFBQXFCO1FBQzNDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksRUFBRSxDQUFDO1FBQzNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRCw0RkFBNEY7UUFDNUYsMERBQTBEO1FBQzFELHdCQUF3QixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUvRiwrREFBK0Q7UUFDL0QsTUFBTSxlQUFlLEdBQ25CLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBMkM7WUFDckQsRUFBRSxFQUFFLEVBQUUsSUFBQSx5QkFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFO1NBQ2hGLENBQUM7UUFFRix5RUFBeUU7UUFDekUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLEVBQUUsRUFBRSxHQUFHLElBQUEseUJBQWUsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDekQsb0JBQW9CLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDckMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBQ2UsaUJBQWlCLENBQUMsSUFBVztRQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVztZQUNoQyxDQUFDLENBQUMsQ0FBQyx3Q0FBeUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDLEdBQUcsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDdEc7Q0FDRjtBQUVELGdCQUFnQjtBQUNoQixNQUFNLDBDQUEyQyxTQUFRLHdCQUF3QjtJQUVsRDtJQURKLEtBQUssQ0FBUztJQUN2QyxZQUE2QixLQUF5QztRQUNwRSxLQUFLLEVBQUUsQ0FBQztRQURtQixVQUFLLEdBQUwsS0FBSyxDQUFvQztRQUVwRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSxnQ0FBZ0MsRUFDbkMscUNBQXFDLEtBQUssQ0FBQyxJQUFJLHlDQUF5QyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sZ0JBQWdCLENBQzdILENBQUM7UUFDSixDQUFDO0tBQ0Y7SUFFTSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGtDQUF3QixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNyRjtJQUVNLEtBQUs7UUFDVixPQUFPO1lBQ0wsK0JBQStCLEVBQUU7Z0JBQy9CLGlCQUFpQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCO2FBQ2hEO1NBQ0YsQ0FBQztLQUNIO0lBRU0sZ0JBQWdCLENBQUMsWUFBb0I7UUFDMUMsTUFBTSxhQUFhLEdBQUcsWUFBWSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDcEQsSUFBSSxPQUFPLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLHFDQUF1QixDQUMvQixJQUFBLHNCQUFHLEVBQUEscUNBQXFDLEVBQ3hDLHFDQUFxQyxJQUFJLENBQUMsS0FBSyxzQkFBc0IsYUFBYSxzQkFBc0I7a0JBQ3RHLFVBQVUsWUFBWSxpQkFBaUIsT0FBTyxXQUFXLENBQzVELENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLElBQUkseUNBQTBCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEYsT0FBTztZQUNMLEVBQUUsRUFBRSxFQUFFLElBQUEseUJBQWUsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsMEJBQTBCLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRTtTQUMvRixDQUFDO0tBQ0g7SUFFZSxpQkFBaUIsQ0FBQyxJQUFXO1FBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUNqRjtDQUNGO0FBRUQsZ0JBQWdCO0FBQ2hCLE1BQU0sMkJBQTRCLFNBQVEsd0JBQXdCO0lBR25DO0lBRkosS0FBSyxDQUFTO0lBQy9CLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDN0IsWUFBNkIsS0FBMEI7UUFDckQsS0FBSyxFQUFFLENBQUM7UUFEbUIsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFFckQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0tBQ3pCO0lBQ2UsZ0JBQWdCLENBQUMsTUFBZTtRQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztLQUM1QjtJQUNEOzs7T0FHRztJQUNLLDRCQUE0QjtRQUNsQyxPQUFPLElBQUksQ0FBQyxZQUFZO1lBQ3RCLENBQUMsQ0FBQywrQkFBdUIsQ0FBQywrQkFBK0I7WUFDekQsQ0FBQyxDQUFDLCtCQUF1QixDQUFDLFlBQVksQ0FBQztLQUMxQztJQUNELHNHQUFzRztJQUMvRix1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEtBQUssS0FBSywrQkFBdUIsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO0tBQzlGO0lBQ00scUJBQXFCO1FBQzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLG1CQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUNsRTtJQUNNLEtBQUs7UUFDVixPQUFPO1lBQ0wsZ0JBQWdCLEVBQUU7Z0JBQ2hCLFdBQVcsRUFBRSxFQUFFLGdCQUFnQixFQUFFLElBQUEseUJBQWUsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNuRSxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQztnQkFDcEQsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUU7Z0JBQzNDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxFQUFFO2dCQUMvQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxlQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSztnQkFDN0MsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFO2dCQUNyRCxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsSUFBSSwwQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLO2dCQUNyRixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDbEQsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYztnQkFDekMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZTtnQkFDM0MsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZTtnQkFDM0MsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7Z0JBQzdDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCO2dCQUMzRCxzQkFBc0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLEtBQUs7Z0JBQ2hFLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLHNCQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSztnQkFDckUsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixJQUFJLDZCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUs7Z0JBQzNGLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7Z0JBQ2pDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSw2QkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUs7Z0JBQ25HLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSw0QkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLO2dCQUN0RixjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsS0FBSztnQkFDaEQsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRTtnQkFDbEQsb0JBQW9CLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixJQUFJLGlDQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUs7Z0JBQ25HLG1CQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSw4QkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLO2dCQUM5Rix5QkFBeUIsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLElBQUksb0NBQTRCLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSztnQkFDNUcsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEtBQUs7Z0JBQzVDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLO2dCQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTO2dCQUMvQixpQkFBaUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQjtnQkFDL0MsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUU7Z0JBQzVELG1CQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSw4QkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLO2dCQUMxRixzQkFBc0IsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksaUNBQXlCLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSztnQkFDN0csZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLElBQUksMEJBQWtCLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxLQUFLO2dCQUNoRyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsSUFBSSwwQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLO2dCQUNqRixvQkFBb0IsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxLQUFLO2dCQUNwRyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxJQUFJLEdBQUc7Z0JBQzNFLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSw0QkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLO2dCQUN4RixnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLElBQUksMkJBQW1CLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxLQUFLO2dCQUNqRyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixJQUFJLE1BQU07Z0JBQ3JFLG1CQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSw4QkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLO2dCQUM3RixxQkFBcUIsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLElBQUksZ0NBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSztnQkFDaEcsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO2dCQUM1RSwwQkFBMEIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUU7Z0JBQ3ZFLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLHFCQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSzthQUMzRTtTQUNGLENBQUM7S0FDSDtJQUNNLGdCQUFnQixDQUFDLGFBQXFCO1FBQzNDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9DLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QixJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0UsTUFBTSxJQUFJLHFDQUF1QixDQUMvQixJQUFBLHNCQUFHLEVBQUEsNkJBQTZCLEVBQ2hDLHFCQUFxQixJQUFJLENBQUMsS0FBSywrREFBK0QsS0FBSyxDQUFDLEdBQUcsZ0NBQWdDLENBQ3hJLENBQUM7WUFDSixDQUFDO1lBQ0Qsa0ZBQWtGO1lBQ2xGLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7bUJBQzlFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSx3Q0FBd0MsRUFDM0MscUJBQXFCLElBQUksQ0FBQyxLQUFLLHFJQUFxSSxDQUNySyxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBQSx5QkFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUM3RDtJQUNlLGlCQUFpQixDQUFDLElBQVc7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDakU7Q0FDRjtBQUVELGdCQUFnQjtBQUNoQixNQUFNLDJCQUE0QixTQUFRLHdCQUF3QjtJQUVuQztJQURKLEtBQUssQ0FBUztJQUN2QyxZQUE2QixLQUEwQjtRQUNyRCxLQUFLLEVBQUUsQ0FBQztRQURtQixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUVyRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7S0FDekI7SUFDTSxxQkFBcUI7UUFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksbUJBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDOUU7SUFDTSxLQUFLO1FBQ1YsT0FBTztZQUNMLGdCQUFnQixFQUFFO2dCQUNoQixlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsSUFBSSwwQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLO2dCQUN0RixxQkFBcUIsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLElBQUksZ0NBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSztnQkFDaEcsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO2FBQzdFO1NBQ0YsQ0FBQztLQUNIO0lBQ00sZ0JBQWdCLENBQUMsYUFBcUI7UUFDM0Msd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RCxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBQSx5QkFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUM3RDtJQUNlLGlCQUFpQixDQUFDLElBQVc7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDakU7Q0FDRjtBQUVELGdCQUFnQjtBQUNoQixNQUFNLCtCQUFnQyxTQUFRLHdCQUF3QjtJQUV2QztJQURKLEtBQUssQ0FBUztJQUN2QyxZQUE2QixLQUE4QjtRQUN6RCxLQUFLLEVBQUUsQ0FBQztRQURtQixVQUFLLEdBQUwsS0FBSyxDQUF5QjtRQUV6RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDeEIsdUZBQXVGO1FBQ3ZGLHNGQUFzRjtRQUN0RixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoRyxNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSwyQkFBMkIsRUFDOUIseUJBQXlCLEtBQUssQ0FBQyxJQUFJLHdEQUF3RCxDQUM1RixDQUFDO1FBQ0osQ0FBQztLQUNGO0lBQ00scUJBQXFCO1FBQzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLHVCQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUN0RTtJQUNNLEtBQUs7UUFDVixPQUFPO1lBQ0wsb0JBQW9CLEVBQUU7Z0JBQ3BCLFdBQVcsRUFBRSxFQUFFLGdCQUFnQixFQUFFLElBQUEseUJBQWUsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNuRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxJQUFJLEdBQUc7Z0JBQ2pFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxpQkFBaUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRTtpQkFDdEUsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUNkO1NBQ0YsQ0FBQztLQUNIO0lBQ00sZ0JBQWdCLENBQUMsYUFBcUI7UUFDM0Msd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RCxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBQSx5QkFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUM3RDtJQUNlLGlCQUFpQixDQUFDLElBQVc7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDakU7Q0FDRjtBQUVELGdCQUFnQjtBQUNoQixNQUFNLDRCQUE2QixTQUFRLHdCQUF3QjtJQUVwQztJQURKLEtBQUssQ0FBUztJQUN2QyxZQUE2QixLQUEyQjtRQUN0RCxLQUFLLEVBQUUsQ0FBQztRQURtQixVQUFLLEdBQUwsS0FBSyxDQUFzQjtRQUV0RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7S0FDekI7SUFDTSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLG9CQUFVLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ00sS0FBSztRQUNWLE9BQU87WUFDTCxpQkFBaUIsRUFBRTtnQkFDakIsb0JBQW9CLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixJQUFJLGdDQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUs7Z0JBQ2hHLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDO2dCQUN2RCxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDbEQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLO2dCQUN0RCxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFO2dCQUNoRCxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSztnQkFDMUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxLQUFLO2dCQUM5RCxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsS0FBSzthQUNuRDtTQUNGLENBQUM7S0FDSDtJQUNNLGdCQUFnQixDQUFDLFlBQW9CO1FBQzFDLE1BQU0sUUFBUSxHQUFHLFlBQVksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNwQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSxzQkFBc0IsRUFDekIsZ0JBQWdCLEdBQUcsQ0FBQyxVQUFVLGVBQWUsSUFBSSxDQUFDLEtBQUssc0JBQXNCLFFBQVEsNENBQTRDLFlBQVksaUJBQWlCLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQ3hMLENBQUM7WUFDSixDQUFDO1lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBQSx5QkFBZSxFQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDZCxNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSx3QkFBd0IsRUFDM0IseUJBQXlCLElBQUksQ0FBQyxLQUFLLCtEQUErRCxDQUNuRyxDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNwQixNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSw0QkFBNEIsRUFDL0IsMEJBQTBCLElBQUksQ0FBQyxLQUFLLHNDQUFzQyxFQUFFLDRGQUE0RixDQUN6SyxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEIsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFDZSxpQkFBaUIsQ0FBQyxJQUFXO1FBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6RjtDQUNGO0FBRUQsZ0JBQWdCO0FBQ2hCLE1BQU0sMkJBQTRCLFNBQVEsd0JBQXdCO0lBR25DO0lBRkosS0FBSyxDQUFTO0lBQ3RCLFFBQVEsQ0FBYztJQUN2QyxZQUE2QixLQUEwQjtRQUNyRCxLQUFLLEVBQUUsQ0FBQztRQURtQixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUVyRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksbUJBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDMUU7SUFDTSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0tBQ3RCO0lBQ00sS0FBSztRQUNWLE9BQU87WUFDTCxnQkFBZ0IsRUFBRTtnQkFDaEIsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLElBQUksMEJBQWtCLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSzthQUN2RjtTQUNGLENBQUM7S0FDSDtJQUNNLGdCQUFnQixDQUFDLFlBQW9CO1FBQzFDLE1BQU0sUUFBUSxHQUFHLFlBQVksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNwQyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSxxQkFBcUIsRUFDeEIsZUFBZSxHQUFHLENBQUMsVUFBVSxlQUFlLElBQUksQ0FBQyxLQUFLLHNCQUFzQixRQUFRLDRDQUE0QyxZQUFZLGlCQUFpQixHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUN2TCxDQUFDO1lBQ0osQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFHLElBQUEseUJBQWUsRUFBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDM0MsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLHFDQUF1QixDQUMvQixJQUFBLHNCQUFHLEVBQUEsdUJBQXVCLEVBQzFCLHdCQUF3QixJQUFJLENBQUMsS0FBSywrREFBK0QsQ0FDbEcsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLHFDQUF1QixDQUMvQixJQUFBLHNCQUFHLEVBQUEsMkJBQTJCLEVBQzlCLHlCQUF5QixJQUFJLENBQUMsS0FBSyxzQ0FBc0MsRUFBRSw0RkFBNEYsQ0FDeEssQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztLQUNKO0lBQ2UsaUJBQWlCLENBQUMsSUFBVztRQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDekY7SUFDZSwwQkFBMEI7UUFDeEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxjQUFjLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztLQUN4RztDQUNGO0FBRUQsZ0JBQWdCO0FBQ2hCLE1BQU0sa0NBQW1DLFNBQVEsd0JBQXdCO0lBRTFDO0lBREosS0FBSyxDQUFTO0lBQ3ZDLFlBQTZCLEtBQWlDO1FBQzVELEtBQUssRUFBRSxDQUFDO1FBRG1CLFVBQUssR0FBTCxLQUFLLENBQTRCO1FBRTVELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN4QiwyRkFBMkY7UUFDM0Ysc0VBQXNFO1FBQ3RFLENBQUMsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDM0UsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxQixJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSxvQ0FBb0MsRUFDdkMsNkJBQTZCLElBQUksQ0FBQyxLQUFLLGtEQUFrRCxHQUFHLEtBQUssQ0FDbEcsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztLQUNKO0lBQ00scUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSwwQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ2pFO0lBQ00sS0FBSztRQUNWLE9BQU87WUFDTCx1QkFBdUIsRUFBRTtnQkFDdkIsV0FBVyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsSUFBQSx5QkFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25FLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDO2dCQUNqRCxrQkFBa0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSwwQkFBa0IsQ0FBQyxPQUFPO2dCQUM5RSxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxtQkFBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUs7Z0JBQ25FLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWU7Z0JBQzNDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLG1CQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSztnQkFDekUsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZTtnQkFDM0Msa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixJQUFJLDBCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUs7Z0JBQzlGLHNCQUFzQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCO2dCQUN6RCxrQkFBa0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQjtnQkFDakQsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksa0JBQVUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLEtBQUs7Z0JBQ3BGLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7Z0JBQ25DLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSw2QkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLO2dCQUM3RixzQkFBc0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7Z0JBQzVFLHdCQUF3QixFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxnQ0FBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLO2dCQUMxRyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QjthQUM1RDtTQUNGLENBQUM7S0FDSDtJQUNNLGdCQUFnQixDQUFDLGFBQXFCO1FBQzNDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksRUFBRSxDQUFDO1FBQzNELHdCQUF3QixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTdHLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sTUFBTSxHQUEyQztZQUNyRCxFQUFFLEVBQUUsRUFBRSxJQUFBLHlCQUFlLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFO1NBQ3BFLENBQUM7UUFFRixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsRUFBRSxFQUFFLEdBQUcsSUFBQSx5QkFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUN6RCxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDekIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBQ2UsaUJBQWlCLENBQUMsSUFBVztRQUMzQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUNwSDtDQUNGO0FBRUQsZ0JBQWdCO0FBQ2hCLE1BQU0sb0NBQXFDLFNBQVEsd0JBQXdCO0lBRTVDO0lBREosS0FBSyxDQUFTO0lBQ3ZDLFlBQTZCLEtBQW1DO1FBQzlELEtBQUssRUFBRSxDQUFDO1FBRG1CLFVBQUssR0FBTCxLQUFLLENBQThCO1FBRTlELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztLQUN6QjtJQUNNLHFCQUFxQjtRQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSw0QkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQzNFO0lBQ00sS0FBSztRQUNWLE9BQU87WUFDTCx5QkFBeUIsRUFBRTtnQkFDekIsV0FBVyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsSUFBQSx5QkFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25FLHVCQUF1QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO29CQUM1RCxzQkFBc0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRTtpQkFDaEYsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUNkO1NBQ0YsQ0FBQztLQUNIO0lBQ00sZ0JBQWdCLENBQUMsYUFBcUI7UUFDM0Msd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RCxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBQSx5QkFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUM3RDtJQUNlLGlCQUFpQixDQUFDLElBQVc7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDakU7Q0FDRjtBQUVELGdCQUFnQjtBQUNoQixNQUFNLGdDQUFpQyxTQUFRLHdCQUF3QjtJQUV4QztJQURKLEtBQUssQ0FBUztJQUN2QyxZQUE2QixLQUErQjtRQUMxRCxLQUFLLEVBQUUsQ0FBQztRQURtQixVQUFLLEdBQUwsS0FBSyxDQUEwQjtRQUUxRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFFeEIsdUZBQXVGO1FBQ3ZGLHVGQUF1RjtRQUN2RiwrRUFBK0U7UUFDL0UsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDcEMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7WUFDeEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDdEIsTUFBTSxJQUFJLHFDQUF1QixDQUMvQixJQUFBLHNCQUFHLEVBQUEsOEJBQThCLEVBQ2pDLDJCQUEyQixJQUFJLENBQUMsS0FBSyxpREFBaUQ7MEJBQ3BGLFlBQVksR0FBRyxDQUFDLFVBQVUscUNBQXFDLENBQ2xFLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7b0JBQ3hDLE1BQU0sSUFBSSxxQ0FBdUIsQ0FDL0IsSUFBQSxzQkFBRyxFQUFBLCtCQUErQixFQUNsQywyQkFBMkIsSUFBSSxDQUFDLEtBQUssOENBQThDOzBCQUNqRixLQUFLLEdBQUcsQ0FBQyxZQUFZLGdFQUFnRSxDQUN4RixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0Y7SUFDTSxxQkFBcUI7UUFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksd0JBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ00sS0FBSztRQUNWLE9BQU87WUFDTCxxQkFBcUIsRUFBRTtnQkFDckIsV0FBVyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsSUFBQSx5QkFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25FLGtCQUFrQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCO2dCQUNqRCx3QkFBd0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEtBQUs7Z0JBQ3BFLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLO2dCQUNsRCx1QkFBdUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRTtnQkFDeEUsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTztnQkFDM0IsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUs7Z0JBQzFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSztnQkFDdEQsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLEVBQUU7Z0JBQzVELGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUU7Z0JBQ3RELGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLO2dCQUNsRCxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksRUFBRTtnQkFDdkMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUM7Z0JBQ3ZELGdCQUFnQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsS0FBSztnQkFDcEQsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVztnQkFDbkMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUs7Z0JBQ2xELHNCQUFzQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsS0FBSztnQkFDaEUsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZTtnQkFDM0MsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxLQUFLO2FBQzNEO1NBQ0YsQ0FBQztLQUNIO0lBQ00sZ0JBQWdCLENBQUMsYUFBcUI7UUFDM0Msd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3RCxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBQSx5QkFBZSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUM3RDtJQUNlLGlCQUFpQixDQUFDLElBQVc7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDakU7Q0FDRjtBQUVELGdGQUFnRjtBQUNoRixvREFBb0Q7QUFDcEQsZ0ZBQWdGO0FBRWhGOzs7O0dBSUc7QUFDSCxNQUFhLFdBQVc7SUFHTztJQUZaLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFFeEMsWUFBNkIsTUFBZ0M7UUFBaEMsV0FBTSxHQUFOLE1BQU0sQ0FBMEI7UUFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO0tBQ3REO0lBRUQsZ0JBQWdCO0lBQ1QsS0FBSztRQUNWLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ3ZCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ3hDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUMxQyxDQUFDO0tBQ0g7SUFFRCxnQkFBZ0I7SUFDVCxnQkFBZ0IsQ0FBQyxZQUFvQjtRQUMxQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDbkQ7SUFFRCxnQkFBZ0I7SUFDVCxlQUFlO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztLQUNuRDtJQUVELDBFQUEwRTtJQUNuRSxnQkFBZ0IsQ0FBQyxNQUFlO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDdEM7SUFFRCxrR0FBa0c7SUFDM0YsdUJBQXVCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0tBQzlDO0lBRUQsZ0JBQWdCO0lBQ1QsaUJBQWlCLENBQUMsSUFBYztRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLDRGQUE0RjtRQUM1Rix3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUN0RDtDQUNGO0FBM0NELGtDQTJDQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGVzdGluYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9vdXRwdXRzJztcblxuaW1wb3J0IHR5cGUgeyBJQ2hhbm5lbCBhcyBJTWVkaWFQYWNrYWdlVjJDaGFubmVsIH0gZnJvbSAnQGF3cy1jZGsvYXdzLW1lZGlhcGFja2FnZXYyLWFscGhhJztcbmltcG9ydCB0eXBlIHsgRHVyYXRpb24sIFNlY3JldFZhbHVlIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgeyBJUm9sZSwgSVJvbGVSZWYgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB0eXBlIHsgQ2ZuQ2hhbm5lbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWxpdmUnO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgdHlwZSB7XG4gIE91dHB1dERlc3RpbmF0aW9uLCBTM091dHB1dERlc3RpbmF0aW9uLFxuICBVZHBPdXRwdXREZXN0aW5hdGlvbixcbn0gZnJvbSAnLi9kZXN0aW5hdGlvbnMnO1xuaW1wb3J0IHsgTWVkaWFQYWNrYWdlVjJEZXN0aW5hdGlvbiwgTWVkaWFQYWNrYWdlVjJFbmRwb2ludElkLCBNZWRpYUNvbm5lY3RSb3V0ZXJTZXR0aW5ncyB9IGZyb20gJy4vZGVzdGluYXRpb25zJztcbmltcG9ydCB0eXBlIHsgRW5jb2RlQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vZW5jb2RlLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHtcbiAgSGxzTW9kZSxcbiAgSGxzSW5wdXRMb3NzQWN0aW9uLFxuICBSdG1wQXV0aGVudGljYXRpb25TY2hlbWUsXG4gIEhsc0NsaWVudENhY2hlLFxuICBIbHNDb2RlY1NwZWNpZmljYXRpb24sXG4gIEhsc0RpcmVjdG9yeVN0cnVjdHVyZSxcbiAgSGxzRGlzY29udGludWl0eVRhZ3MsXG4gIEhsc0lkM1NlZ21lbnRUYWdnaW5nU3RhdGUsXG4gIEhsc0lGcmFtZU9ubHlQbGF5bGlzdHMsXG4gIEhsc0luY29tcGxldGVTZWdtZW50QmVoYXZpb3IsXG4gIEhsc01hbmlmZXN0Q29tcHJlc3Npb24sXG4gIEhsc01hbmlmZXN0RHVyYXRpb25Gb3JtYXQsXG4gIEhsc091dHB1dFNlbGVjdGlvbixcbiAgSGxzUHJvZ3JhbURhdGVUaW1lLFxuICBIbHNQcm9ncmFtRGF0ZVRpbWVDbG9jayxcbiAgSGxzUmVkdW5kYW50TWFuaWZlc3QsXG4gIEhsc1NlZ21lbnRhdGlvbk1vZGUsXG4gIEhsc1N0cmVhbUluZlJlc29sdXRpb24sXG4gIEhsc1RzRmlsZU1vZGUsXG4gIEh0dHBUcmFuc2Zlck1vZGUsXG4gIEhsc1RpbWVkTWV0YWRhdGFJZDNGcmFtZSxcbiAgVWRwSW5wdXRMb3NzQWN0aW9uLFxuICBTZWdtZW50TGVuZ3RoVW5pdHMsXG4gIElkM0JlaGF2aW9yLFxuICBLbHZCZWhhdmlvcixcbiAgTmllbHNlbklkM0JlaGF2aW9yLFxuICBTY3RlMzVUeXBlLFxuICBUaW1lZE1ldGFkYXRhSWQzRnJhbWUsXG4gIFRpbWVkTWV0YWRhdGFQYXNzdGhyb3VnaCxcbiAgVWRwVGltZWRNZXRhZGF0YUlkM0ZyYW1lLFxuICBTcnRJbnB1dExvc3NBY3Rpb24sXG59IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHR5cGUge1xuICBTM0Nhbm5lZEFjbCxcbiAgSGxzRW5jcnlwdGlvblR5cGUsIEhsc0l2SW5NYW5pZmVzdCwgSGxzSXZTb3VyY2UsXG4gIEhsc0NhcHRpb25MYW5ndWFnZVNldHRpbmcsXG4gIFJ0bXBDYWNoZUZ1bGxCZWhhdmlvciwgUnRtcENhcHRpb25EYXRhLCBSdG1wSW5wdXRMb3NzQWN0aW9uLFxuICBSdG1wSW5jbHVkZUZpbGxlck5hbFVuaXRzLFxuICBNc1Ntb290aEF1ZGlvT25seVRpbWVjb2RlQ29udHJvbCwgTXNTbW9vdGhDZXJ0aWZpY2F0ZU1vZGUsXG4gIE1zU21vb3RoRXZlbnRJZE1vZGUsIE1zU21vb3RoRXZlbnRTdG9wQmVoYXZpb3IsXG4gIE1zU21vb3RoSW5wdXRMb3NzQWN0aW9uLCBNc1Ntb290aFNlZ21lbnRhdGlvbk1vZGUsXG4gIE1zU21vb3RoU3BhcnNlVHJhY2tUeXBlLCBNc1Ntb290aFN0cmVhbU1hbmlmZXN0QmVoYXZpb3IsXG4gIE1zU21vb3RoVGltZXN0YW1wT2Zmc2V0TW9kZSxcbiAgSGxzQWRNYXJrZXJzLCBSdG1wQWRNYXJrZXJzLFxufSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7XG4gIE1lZGlhUGFja2FnZVYyT3V0cHV0LCBIbHNPdXRwdXQsIFVkcE91dHB1dCwgQXJjaGl2ZU91dHB1dCxcbiAgUnRtcE91dHB1dCwgU3J0T3V0cHV0LCBDbWFmSW5nZXN0T3V0cHV0LCBGcmFtZUNhcHR1cmVPdXRwdXQsXG4gIE1zU21vb3RoT3V0cHV0LCBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXQsIHRvRGVzdGluYXRpb25JZCxcbn0gZnJvbSAnLi9vdXRwdXRzJztcbmltcG9ydCB0eXBlIHtcbiAgT3V0cHV0LFxuICBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXREZWZpbml0aW9uLFxuICBNZWRpYVBhY2thZ2VWMk91dHB1dERlZmluaXRpb24sIEhsc091dHB1dERlZmluaXRpb24sXG4gIFVkcE91dHB1dERlZmluaXRpb24sIEFyY2hpdmVPdXRwdXREZWZpbml0aW9uLFxuICBSdG1wT3V0cHV0RGVmaW5pdGlvbiwgU3J0T3V0cHV0RGVmaW5pdGlvbixcbiAgQ21hZkluZ2VzdE91dHB1dERlZmluaXRpb24sIEZyYW1lQ2FwdHVyZU91dHB1dERlZmluaXRpb24sXG4gIE1zU21vb3RoT3V0cHV0RGVmaW5pdGlvbixcbn0gZnJvbSAnLi9vdXRwdXRzJztcbmltcG9ydCB0eXBlIHsgU2VnbWVudCB9IGZyb20gJy4vc2hhcmVkJztcblxuLyoqIEBpbnRlcm5hbCAqL1xuZnVuY3Rpb24gdmFsaWRhdGVEZXN0aW5hdGlvbkNvdW50KFxuICBncm91cE5hbWU6IHN0cmluZyxcbiAgY2hhbm5lbENsYXNzOiBzdHJpbmcsXG4gIGRlc3RpbmF0aW9uQ291bnQ6IG51bWJlcixcbiAgYWRkaXRpb25hbENvdW50OiBudW1iZXIsXG4gIGFsbG93QWRkaXRpb25hbDogYm9vbGVhbixcbik6IHZvaWQge1xuICBjb25zdCBpc1N0YW5kYXJkID0gY2hhbm5lbENsYXNzID09PSAnU1RBTkRBUkQnO1xuICBjb25zdCByZXF1aXJlZFByaW1hcnkgPSBpc1N0YW5kYXJkID8gMiA6IDE7XG4gIGlmIChkZXN0aW5hdGlvbkNvdW50ICE9PSByZXF1aXJlZFByaW1hcnkpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBsaXRgRGVzdGluYXRpb25Db3VudGAsXG4gICAgICBgT3V0cHV0IGdyb3VwICcke2dyb3VwTmFtZX0nIHJlcXVpcmVzIGV4YWN0bHkgJHtyZXF1aXJlZFByaW1hcnl9YFxuICAgICAgKyBgIHByaW1hcnkgZGVzdGluYXRpb24ocykgZm9yIGEgJHtjaGFubmVsQ2xhc3N9IGNoYW5uZWwsIGJ1dCAke2Rlc3RpbmF0aW9uQ291bnR9IHByb3ZpZGVkLmAsXG4gICAgKTtcbiAgfVxuICBpZiAoYWRkaXRpb25hbENvdW50ID4gMCAmJiAhYWxsb3dBZGRpdGlvbmFsKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgbGl0YEFkZGl0aW9uYWxEZXN0aW5hdGlvbnNgLFxuICAgICAgYE91dHB1dCBncm91cCAnJHtncm91cE5hbWV9JyBkb2VzIG5vdCBzdXBwb3J0IGFkZGl0aW9uYWwgZGVzdGluYXRpb25zLmAsXG4gICAgKTtcbiAgfVxuICBjb25zdCBtYXhBZGRpdGlvbmFsID0gaXNTdGFuZGFyZCA/IDIgOiAxO1xuICBpZiAoYWRkaXRpb25hbENvdW50ID4gbWF4QWRkaXRpb25hbCkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgIGxpdGBBZGRpdGlvbmFsRGVzdGluYXRpb25Db3VudGAsXG4gICAgICBgT3V0cHV0IGdyb3VwICcke2dyb3VwTmFtZX0nIGFsbG93cyBhdCBtb3N0ICR7bWF4QWRkaXRpb25hbH1gXG4gICAgICArIGAgYWRkaXRpb25hbCBkZXN0aW5hdGlvbihzKSBmb3IgYSAke2NoYW5uZWxDbGFzc30gY2hhbm5lbCwgYnV0ICR7YWRkaXRpb25hbENvdW50fSBwcm92aWRlZC5gLFxuICAgICk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiAoYWJzdHJhY3QgYmFzZSArIHN1YmNsYXNzZXMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGFuIG91dHB1dCBncm91cC4gVXNlIHRoZSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIHRvIGNyZWF0ZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBNZWRpYVBhY2thZ2UgVjIgb3V0cHV0IGdyb3VwIHRoYXQgZGVsaXZlcnMgdG8gYSBzaW5nbGUgY2hhbm5lbCwgYXV0by1tYXBwaW5nIGVhY2hcbiAgICogcGlwZWxpbmUgdG8gYSBNZWRpYVBhY2thZ2UgaW5nZXN0IGVuZHBvaW50IGJhc2VkIG9uIHRoZSBjaGFubmVsIGNsYXNzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtZWRpYVBhY2thZ2VWMihwcm9wczogTWVkaWFQYWNrYWdlVjJPdXRwdXRHcm91cFByb3BzKTogT3V0cHV0R3JvdXBDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE1lZGlhUGFja2FnZVYyT3V0cHV0R3JvdXBDb25maWd1cmF0aW9uKHByb3BzLCBwcm9wcy5jaGFubmVsLCB1bmRlZmluZWQpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBNZWRpYVBhY2thZ2UgVjIgb3V0cHV0IGdyb3VwIHdpdGggZXhwbGljaXQgcGVyLXBpcGVsaW5lIGRlc3RpbmF0aW9ucyAoY2hhbm5lbCArXG4gICAqIGVuZHBvaW50IHBlciBwaXBlbGluZSkuIFVzZSBmb3IgY3Jvc3MtcmVnaW9uIGRlbGl2ZXJ5IG9yIHBpbm5pbmcgYSBwaXBlbGluZSB0byBhbiBlbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWVkaWFQYWNrYWdlVjJQZXJQaXBlbGluZShwcm9wczogTWVkaWFQYWNrYWdlVjJQZXJQaXBlbGluZU91dHB1dEdyb3VwUHJvcHMpOiBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgTWVkaWFQYWNrYWdlVjJPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMsIHVuZGVmaW5lZCwgcHJvcHMuZGVzdGluYXRpb25zKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgTWVkaWFDb25uZWN0IFJvdXRlciBvdXRwdXQgZ3JvdXAsIGRlbGl2ZXJpbmcgZWFjaCBjaGFubmVsIHBpcGVsaW5lIHRvIGEgTWVkaWFDb25uZWN0XG4gICAqIFJvdXRlci4gVHJhbnNpdCBlbmNyeXB0aW9uIGRlZmF1bHRzIHRvIEFVVE9NQVRJQzsgb3ZlcnJpZGUgcGVyIHBpcGVsaW5lIHZpYSBgcm91dGVyU2V0dGluZ3NgLlxuICAgKlxuICAgKiBUaGUgZG93bnN0cmVhbSB3aXJpbmcgKHdoaWNoIHJvdXRlciBpbnB1dCBlYWNoIHBpcGVsaW5lIGZlZWRzKSBpcyBjb25maWd1cmVkIG9uIHRoZVxuICAgKiBNZWRpYUNvbm5lY3Qgc2lkZSwgcmVmZXJlbmNpbmcgdGhpcyBvdXRwdXQgZ3JvdXAgYnkgYG5hbWVgIGFuZCB0aGUgcGlwZWxpbmUgaWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1lZGlhQ29ubmVjdFJvdXRlcihwcm9wczogTWVkaWFDb25uZWN0Um91dGVyT3V0cHV0R3JvdXBQcm9wcyk6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG4gIC8qKiBDcmVhdGUgYW4gSExTIG91dHB1dCBncm91cCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgc3RhdGljIGhscyhwcm9wczogSGxzT3V0cHV0R3JvdXBQcm9wcyk6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBIbHNPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG4gIC8qKiBDcmVhdGUgYSBVRFAgb3V0cHV0IGdyb3VwIGNvbmZpZ3VyYXRpb24uICovXG4gIHB1YmxpYyBzdGF0aWMgdWRwKHByb3BzOiBVZHBPdXRwdXRHcm91cFByb3BzKTogT3V0cHV0R3JvdXBDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IFVkcE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbihwcm9wcyk7XG4gIH1cbiAgLyoqIENyZWF0ZSBhbiBBcmNoaXZlIChTMykgb3V0cHV0IGdyb3VwIGNvbmZpZ3VyYXRpb24uICovXG4gIHB1YmxpYyBzdGF0aWMgYXJjaGl2ZShwcm9wczogQXJjaGl2ZU91dHB1dEdyb3VwUHJvcHMpOiBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZU91dHB1dEdyb3VwQ29uZmlndXJhdGlvbihwcm9wcyk7XG4gIH1cbiAgLyoqIENyZWF0ZSBhbiBSVE1QIG91dHB1dCBncm91cCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgc3RhdGljIHJ0bXAocHJvcHM6IFJ0bXBPdXRwdXRHcm91cFByb3BzKTogT3V0cHV0R3JvdXBDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IFJ0bXBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG4gIC8qKiBDcmVhdGUgYW4gU1JUIG91dHB1dCBncm91cCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgc3RhdGljIHNydChwcm9wczogU3J0T3V0cHV0R3JvdXBQcm9wcyk6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBTcnRPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG4gIC8qKiBDcmVhdGUgYSBDTUFGIEluZ2VzdCBvdXRwdXQgZ3JvdXAgY29uZmlndXJhdGlvbi4gKi9cbiAgcHVibGljIHN0YXRpYyBjbWFmSW5nZXN0KHByb3BzOiBDbWFmSW5nZXN0T3V0cHV0R3JvdXBQcm9wcyk6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBDbWFmSW5nZXN0T3V0cHV0R3JvdXBDb25maWd1cmF0aW9uKHByb3BzKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgRnJhbWUgQ2FwdHVyZSBvdXRwdXQgZ3JvdXAgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQSBjaGFubmVsIHRoYXQgaW5jbHVkZXMgYSBGcmFtZSBDYXB0dXJlIG91dHB1dCBncm91cCBtdXN0IGFsc28gaW5jbHVkZVxuICAgKiBhIHNlcGFyYXRlIHZpZGVvIG91dHB1dCBncm91cCAoZS5nLiBBcmNoaXZlLCBITFMsIFVEUCkuIEZyYW1lIENhcHR1cmVcbiAgICogY2Fubm90IGJlIHRoZSBjaGFubmVsJ3Mgb25seSBvdXRwdXQgZ3JvdXAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyYW1lQ2FwdHVyZShwcm9wczogRnJhbWVDYXB0dXJlT3V0cHV0R3JvdXBQcm9wcyk6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBGcmFtZUNhcHR1cmVPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG4gIC8qKiBDcmVhdGUgYW4gTVMgU21vb3RoIG91dHB1dCBncm91cCBjb25maWd1cmF0aW9uLiAqL1xuICBwdWJsaWMgc3RhdGljIG1zU21vb3RoKHByb3BzOiBNc1Ntb290aE91dHB1dEdyb3VwUHJvcHMpOiBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgTXNTbW9vdGhPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIGFic3RyYWN0IF9iaW5kKCk6IENmbkNoYW5uZWwuT3V0cHV0R3JvdXBTZXR0aW5nc1Byb3BlcnR5O1xuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZERlc3RpbmF0aW9uKGNoYW5uZWxDbGFzczogc3RyaW5nKTogQ2ZuQ2hhbm5lbC5PdXRwdXREZXN0aW5hdGlvblByb3BlcnR5W107XG4gIC8qKiBAaW50ZXJuYWwgLSBHcmFudCBwZXJtaXNzaW9ucyB0byB0aGUgY2hhbm5lbCByb2xlIGZvciByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSBkZXN0aW5hdGlvbnMuICovXG4gIHB1YmxpYyBfZ3JhbnRQZXJtaXNzaW9ucyhfcm9sZTogSVJvbGVSZWYpOiB2b2lkIHt9XG4gIC8qKiBAaW50ZXJuYWwgLSBDcmVhdGUgdGhlIGluaXRpYWwgT3V0cHV0IGluc3RhbmNlcyBmcm9tIHRoZSBjb25maWcncyBvdXRwdXQgZGVmaW5pdGlvbnMuICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfY3JlYXRlSW5pdGlhbE91dHB1dHMoKTogT3V0cHV0W107XG4gIC8qKlxuICAgKiBXaGV0aGVyIGFueSBvdXRwdXQgaW4gdGhpcyBncm91cCBoYXMgYW4gU1JUIGxpc3RlbmVyLW1vZGUgZGVzdGluYXRpb24uIFVzZWQgYnkgdGhlIGNoYW5uZWwgdG9cbiAgICogZGVjaWRlIHdoZXRoZXIgY2hhbm5lbCBzZWN1cml0eSBncm91cHMgYXJlIHJlcXVpcmVkLCB3aXRob3V0IHRyaWdnZXJpbmcgZGVzdGluYXRpb24gYmluZGluZy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2hhc1NydExpc3RlbmVyRGVzdGluYXRpb24oKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxuICAvKipcbiAgICogSExTIHVzZXMgdGhpcyB0byBzZWxlY3QgYSBjb21wYXRpYmxlIGRlZmF1bHQgcHJvZ3JhbS1kYXRlLXRpbWUgY2xvY2tcbiAgICogKHRoZSBzZXJ2aWNlIHJlcXVpcmVzIElOSVRJQUxJWkVfRlJPTV9PVVRQVVRfVElNRUNPREUgZm9yIGVwb2NoIGxvY2tpbmcpLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfc2V0RXBvY2hMb2NraW5nKF9hY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHt9XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZ3JvdXAgZXhwbGljaXRseSByZXF1ZXN0cyBhbiBITFMgcHJvZ3JhbSBkYXRlIHRpbWUgY2xvY2sgb2YgU1lTVEVNX0NMT0NLLCB3aGljaFxuICAgKiBpcyBpbmNvbXBhdGlibGUgd2l0aCBlcG9jaCBvdXRwdXQgbG9ja2luZy4gT25seSBITFMgZ3JvdXBzIGNhbiByZXR1cm4gdHJ1ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2hhc0V4cGxpY2l0U3lzdGVtQ2xvY2soKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT3V0cHV0IGdyb3VwIHByb3BzIGludGVyZmFjZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogTWFwcyBhIGNhcHRpb25zIGNoYW5uZWwgdG8gYW4gSVNPIDY5My0yIGxhbmd1YWdlIGNvZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwdGlvbkxhbmd1YWdlTWFwcGluZyB7XG4gIC8qKiBUaGUgY2xvc2VkIGNhcHRpb24gY2hhbm5lbCBudW1iZXIgKDEtNCkuICovXG4gIHJlYWRvbmx5IGNhcHRpb25DaGFubmVsOiBudW1iZXI7XG4gIC8qKiBBIHRocmVlLWNoYXJhY3RlciBJU08gNjM5LTIgbGFuZ3VhZ2UgY29kZS4gKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XG4gIC8qKiBUaGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGFuZ3VhZ2UuICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlRGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBNYXBzIGEgY2FwdGlvbnMgY2hhbm5lbCB0byBhbiBJU08gNjM5LTIgbGFuZ3VhZ2UgY29kZSBmb3IgYSBDTUFGIEluZ2VzdCBvdXRwdXQgZ3JvdXAuXG4gKlxuICogVW5saWtlIGBDYXB0aW9uTGFuZ3VhZ2VNYXBwaW5nYCwgdGhlIENNQUYgSW5nZXN0IHZhcmlhbnQgaGFzIG5vIGxhbmd1YWdlIGRlc2NyaXB0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENtYWZDYXB0aW9uTGFuZ3VhZ2VNYXBwaW5nIHtcbiAgLyoqIFRoZSBjbG9zZWQgY2FwdGlvbiBjaGFubmVsIG51bWJlciAoMS00KS4gKi9cbiAgcmVhZG9ubHkgY2FwdGlvbkNoYW5uZWw6IG51bWJlcjtcbiAgLyoqIEEgdGhyZWUtY2hhcmFjdGVyIElTTyA2MzktMiBsYW5ndWFnZSBjb2RlLiAqL1xuICByZWFkb25seSBsYW5ndWFnZUNvZGU6IHN0cmluZztcbn1cblxuLyoqIFByb3BlcnRpZXMgZm9yIEhMUyBzdGF0aWMga2V5IGVuY3J5cHRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEhsc1N0YXRpY0tleVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhlIGxpY2Vuc2Ugc2VydmVyIHRoYXQgc2VydmVzIHRoZSBzdGF0aWMga2V5LlxuICAgKlxuICAgKiBSZXF1aXJlZCDigJQgTWVkaWFMaXZlIHJlamVjdHMgdGhpcyB3aXRob3V0IGEgc2VydmVyIFVSTCwgZXZlbiB0aG91Z2ggdGhlIHVuZGVybHlpbmdcbiAgICogQ2xvdWRGb3JtYXRpb24gcHJvcGVydHkgaXMgdHlwZWQgYXMgb3B0aW9uYWwuXG4gICAqL1xuICByZWFkb25seSBrZXlQcm92aWRlclNlcnZlclVybDogc3RyaW5nO1xuICAvKiogVGhlIHN0YXRpYyBrZXkgdmFsdWUgYXMgYSAzMi1jaGFyYWN0ZXIgaGV4YWRlY2ltYWwgc3RyaW5nLiAqL1xuICByZWFkb25seSBzdGF0aWNLZXlWYWx1ZTogU2VjcmV0VmFsdWU7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBITFMgUzMgQ0ROIHNldHRpbmdzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIbHNTM0NkblByb3BzIHtcbiAgLyoqIFRoZSBTMyBjYW5uZWQgQUNMIHRvIGFwcGx5IHRvIGVhY2ggb3V0cHV0LiBAZGVmYXVsdCAtIG5vIGNhbm5lZCBBQ0wgKi9cbiAgcmVhZG9ubHkgY2FubmVkQWNsPzogUzNDYW5uZWRBY2w7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBITFMgQmFzaWMgUFVUIENETiBzZXR0aW5ncy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGxzQmFzaWNQdXRDZG5Qcm9wcyB7XG4gIC8qKiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgYSBjb25uZWN0aW9uIHRvIHRoZSBDRE4uIEBkZWZhdWx0IDEgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvblJldHJ5SW50ZXJ2YWw/OiBudW1iZXI7XG4gIC8qKiBUaGUgc2l6ZSBvZiB0aGUgZmlsZSBjYWNoZSBmb3Igc3RyZWFtaW5nIG91dHB1dHMuIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoMzAwKSAqL1xuICByZWFkb25seSBmaWxlY2FjaGVEdXJhdGlvbj86IER1cmF0aW9uO1xuICAvKiogVGhlIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cy4gQGRlZmF1bHQgMTAgKi9cbiAgcmVhZG9ubHkgbnVtUmV0cmllcz86IG51bWJlcjtcbiAgLyoqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXN0YXJ0aW5nIGFmdGVyIGEgZmFpbHVyZS4gQGRlZmF1bHQgMSAqL1xuICByZWFkb25seSByZXN0YXJ0RGVsYXk/OiBudW1iZXI7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIGZvciBITFMgQWthbWFpIENETiBzZXR0aW5ncy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGxzQWthbWFpQ2RuUHJvcHMge1xuICAvKiogVGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGEgY29ubmVjdGlvbiB0byB0aGUgQ0ROLiBAZGVmYXVsdCAxICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25SZXRyeUludGVydmFsPzogbnVtYmVyO1xuICAvKiogVGhlIHNpemUgb2YgdGhlIGZpbGUgY2FjaGUgZm9yIHN0cmVhbWluZyBvdXRwdXRzLiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMwMCkgKi9cbiAgcmVhZG9ubHkgZmlsZWNhY2hlRHVyYXRpb24/OiBEdXJhdGlvbjtcbiAgLyoqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLiBAZGVmYXVsdCBIdHRwVHJhbnNmZXJNb2RlLk5PTl9DSFVOS0VEICovXG4gIHJlYWRvbmx5IGh0dHBUcmFuc2Zlck1vZGU/OiBIdHRwVHJhbnNmZXJNb2RlO1xuICAvKiogVGhlIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cy4gQGRlZmF1bHQgMTAgKi9cbiAgcmVhZG9ubHkgbnVtUmV0cmllcz86IG51bWJlcjtcbiAgLyoqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXN0YXJ0aW5nIGFmdGVyIGEgZmFpbHVyZS4gQGRlZmF1bHQgMSAqL1xuICByZWFkb25seSByZXN0YXJ0RGVsYXk/OiBudW1iZXI7XG4gIC8qKiBUaGUgc2FsdCBmb3IgQWthbWFpIGF1dGhlbnRpY2F0aW9uLiBAZGVmYXVsdCAtIG5vIHNhbHQgKi9cbiAgcmVhZG9ubHkgc2FsdD86IHN0cmluZztcbiAgLyoqIFRoZSB0b2tlbiBmb3IgQWthbWFpIGF1dGhlbnRpY2F0aW9uLiBAZGVmYXVsdCAtIG5vIHRva2VuICovXG4gIHJlYWRvbmx5IHRva2VuPzogc3RyaW5nO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgSExTIFdlYkRBViBDRE4gc2V0dGluZ3MuICovXG5leHBvcnQgaW50ZXJmYWNlIEhsc1dlYmRhdkNkblByb3BzIHtcbiAgLyoqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXRyeWluZyBhIGNvbm5lY3Rpb24gdG8gdGhlIENETi4gQGRlZmF1bHQgMSAqL1xuICByZWFkb25seSBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbD86IG51bWJlcjtcbiAgLyoqIFRoZSBzaXplIG9mIHRoZSBmaWxlIGNhY2hlIGZvciBzdHJlYW1pbmcgb3V0cHV0cy4gQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzMDApICovXG4gIHJlYWRvbmx5IGZpbGVjYWNoZUR1cmF0aW9uPzogRHVyYXRpb247XG4gIC8qKiBTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZy4gQGRlZmF1bHQgSHR0cFRyYW5zZmVyTW9kZS5OT05fQ0hVTktFRCAqL1xuICByZWFkb25seSBodHRwVHJhbnNmZXJNb2RlPzogSHR0cFRyYW5zZmVyTW9kZTtcbiAgLyoqIFRoZSBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMuIEBkZWZhdWx0IDEwICovXG4gIHJlYWRvbmx5IG51bVJldHJpZXM/OiBudW1iZXI7XG4gIC8qKiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmVzdGFydGluZyBhZnRlciBhIGZhaWx1cmUuIEBkZWZhdWx0IDEgKi9cbiAgcmVhZG9ubHkgcmVzdGFydERlbGF5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEtleSBwcm92aWRlciBzZXR0aW5ncyBmb3IgSExTIGVuY3J5cHRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBIbHNLZXlQcm92aWRlclNldHRpbmdzIHtcbiAgLyoqIFVzZSBhIHN0YXRpYyBrZXkgZm9yIEhMUyBlbmNyeXB0aW9uLiAqL1xuICBwdWJsaWMgc3RhdGljIHN0YXRpY0tleShwcm9wczogSGxzU3RhdGljS2V5UHJvcHMpOiBIbHNLZXlQcm92aWRlclNldHRpbmdzIHtcbiAgICByZXR1cm4gbmV3IEhsc0tleVByb3ZpZGVyU2V0dGluZ3Moe1xuICAgICAgc3RhdGljS2V5U2V0dGluZ3M6IHtcbiAgICAgICAga2V5UHJvdmlkZXJTZXJ2ZXI6IHsgdXJpOiBwcm9wcy5rZXlQcm92aWRlclNlcnZlclVybCB9LFxuICAgICAgICBzdGF0aWNLZXlWYWx1ZTogcHJvcHMuc3RhdGljS2V5VmFsdWUudW5zYWZlVW53cmFwKCksIC8vIFNhZmUgdXNhZ2U6IHJlbmRlcmVkIGFzIENGTiBkeW5hbWljIHJlZmVyZW5jZVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBDZm5DaGFubmVsLktleVByb3ZpZGVyU2V0dGluZ3NQcm9wZXJ0eTtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihjb25maWc6IENmbkNoYW5uZWwuS2V5UHJvdmlkZXJTZXR0aW5nc1Byb3BlcnR5KSB7IHRoaXMuY29uZmlnID0gY29uZmlnOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5LZXlQcm92aWRlclNldHRpbmdzUHJvcGVydHkgeyByZXR1cm4gdGhpcy5jb25maWc7IH1cbn1cblxuLyoqXG4gKiBDRE4gc2V0dGluZ3MgZm9yIEhMUyBvdXRwdXQgZ3JvdXBzLlxuICovXG5leHBvcnQgY2xhc3MgSGxzQ2RuU2V0dGluZ3Mge1xuICAvKiogVXNlIEFtYXpvbiBTMyBhcyB0aGUgQ0ROIGZvciBITFMgb3V0cHV0LiAqL1xuICBwdWJsaWMgc3RhdGljIHMzKHByb3BzPzogSGxzUzNDZG5Qcm9wcyk6IEhsc0NkblNldHRpbmdzIHtcbiAgICByZXR1cm4gbmV3IEhsc0NkblNldHRpbmdzKHsgaGxzUzNTZXR0aW5nczogeyBjYW5uZWRBY2w6IHByb3BzPy5jYW5uZWRBY2w/LnZhbHVlIH0gfSk7XG4gIH1cbiAgLyoqIFVzZSBhIGJhc2ljIEhUVFAgUFVUIGZvciBITFMgb3V0cHV0LiAqL1xuICBwdWJsaWMgc3RhdGljIGJhc2ljUHV0KHByb3BzPzogSGxzQmFzaWNQdXRDZG5Qcm9wcyk6IEhsc0NkblNldHRpbmdzIHtcbiAgICByZXR1cm4gbmV3IEhsc0NkblNldHRpbmdzKHtcbiAgICAgIGhsc0Jhc2ljUHV0U2V0dGluZ3M6IHtcbiAgICAgICAgY29ubmVjdGlvblJldHJ5SW50ZXJ2YWw6IHByb3BzPy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCA/PyAxLFxuICAgICAgICBmaWxlY2FjaGVEdXJhdGlvbjogcHJvcHM/LmZpbGVjYWNoZUR1cmF0aW9uPy50b1NlY29uZHMoKSA/PyAzMDAsXG4gICAgICAgIG51bVJldHJpZXM6IHByb3BzPy5udW1SZXRyaWVzID8/IDEwLFxuICAgICAgICByZXN0YXJ0RGVsYXk6IHByb3BzPy5yZXN0YXJ0RGVsYXkgPz8gMSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgLyoqIFVzZSBBa2FtYWkgYXMgdGhlIENETiBmb3IgSExTIG91dHB1dC4gKi9cbiAgcHVibGljIHN0YXRpYyBha2FtYWkocHJvcHM/OiBIbHNBa2FtYWlDZG5Qcm9wcyk6IEhsc0NkblNldHRpbmdzIHtcbiAgICByZXR1cm4gbmV3IEhsc0NkblNldHRpbmdzKHtcbiAgICAgIGhsc0FrYW1haVNldHRpbmdzOiB7XG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUludGVydmFsOiBwcm9wcz8uY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwgPz8gMSxcbiAgICAgICAgZmlsZWNhY2hlRHVyYXRpb246IHByb3BzPy5maWxlY2FjaGVEdXJhdGlvbj8udG9TZWNvbmRzKCkgPz8gMzAwLFxuICAgICAgICBudW1SZXRyaWVzOiBwcm9wcz8ubnVtUmV0cmllcyA/PyAxMCxcbiAgICAgICAgcmVzdGFydERlbGF5OiBwcm9wcz8ucmVzdGFydERlbGF5ID8/IDEsXG4gICAgICAgIGh0dHBUcmFuc2Zlck1vZGU6IChwcm9wcz8uaHR0cFRyYW5zZmVyTW9kZSA/PyBIdHRwVHJhbnNmZXJNb2RlLk5PTl9DSFVOS0VEKS52YWx1ZSxcbiAgICAgICAgc2FsdDogcHJvcHM/LnNhbHQsXG4gICAgICAgIHRva2VuOiBwcm9wcz8udG9rZW4sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIC8qKiBVc2UgV2ViREFWIGFzIHRoZSBDRE4gZm9yIEhMUyBvdXRwdXQuICovXG4gIHB1YmxpYyBzdGF0aWMgd2ViZGF2KHByb3BzPzogSGxzV2ViZGF2Q2RuUHJvcHMpOiBIbHNDZG5TZXR0aW5ncyB7XG4gICAgcmV0dXJuIG5ldyBIbHNDZG5TZXR0aW5ncyh7XG4gICAgICBobHNXZWJkYXZTZXR0aW5nczoge1xuICAgICAgICBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbDogcHJvcHM/LmNvbm5lY3Rpb25SZXRyeUludGVydmFsID8/IDEsXG4gICAgICAgIGZpbGVjYWNoZUR1cmF0aW9uOiBwcm9wcz8uZmlsZWNhY2hlRHVyYXRpb24/LnRvU2Vjb25kcygpID8/IDMwMCxcbiAgICAgICAgbnVtUmV0cmllczogcHJvcHM/Lm51bVJldHJpZXMgPz8gMTAsXG4gICAgICAgIHJlc3RhcnREZWxheTogcHJvcHM/LnJlc3RhcnREZWxheSA/PyAxLFxuICAgICAgICBodHRwVHJhbnNmZXJNb2RlOiAocHJvcHM/Lmh0dHBUcmFuc2Zlck1vZGUgPz8gSHR0cFRyYW5zZmVyTW9kZS5OT05fQ0hVTktFRCkudmFsdWUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IENmbkNoYW5uZWwuSGxzQ2RuU2V0dGluZ3NQcm9wZXJ0eTtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihjb25maWc6IENmbkNoYW5uZWwuSGxzQ2RuU2V0dGluZ3NQcm9wZXJ0eSkgeyB0aGlzLmNvbmZpZyA9IGNvbmZpZzsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9iaW5kKCk6IENmbkNoYW5uZWwuSGxzQ2RuU2V0dGluZ3NQcm9wZXJ0eSB7IHJldHVybiB0aGlzLmNvbmZpZzsgfVxufVxuXG4vKipcbiAqIENvbW1vbiBwcm9wZXJ0aWVzIHNoYXJlZCBieSB0aGUgTWVkaWFQYWNrYWdlIFYyIG91dHB1dCBncm91cCB2YXJpYW50cy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWxpdmUvbGF0ZXN0L3VnL2NyZWF0aW5nLW1lZGlhcGFja2FnZS1vdXRwdXQtZ3JvdXAuaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhUGFja2FnZVYyT3V0cHV0R3JvdXBCYXNlUHJvcHMge1xuICAvKiogVGhlIG5hbWUgb2YgdGhpcyBvdXRwdXQgZ3JvdXAuIFVzZWQgYXMgdGhlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBJRC4gVW5kZXJzY29yZXMgYXJlIG5vcm1hbGlzZWQgdG8gaHlwaGVucyBpbnRlcm5hbGx5LiAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb25maWd1cmUgYWRkaXRpb25hbCBkZXN0aW5hdGlvbnMgdG8gZmFuIG91dCB0aGUgb3V0cHV0IHRvIGV4dHJhIE1lZGlhUGFja2FnZSBWMlxuICAgKiBjaGFubmVscywgZm9yIGV4YW1wbGUgZm9yIGNyb3NzLXJlZ2lvbiBkZWxpdmVyeSBvciBiYWNrdXAgcGFja2FnaW5nLlxuICAgKiBUaGVzZSBjb3JyZXNwb25kIHRvIERlc3RpbmF0aW9uIDMvNCBpbiB0aGUgQVdTIGNvbnNvbGUuIEVhY2ggYWRkaXRpb25hbCBkZXN0aW5hdGlvbiBpcyBhXG4gICAqIHNpbmdsZSwgZXhwbGljaXQgZW50cnkgKGNoYW5uZWwgKyBlbmRwb2ludCksIGluZGVwZW5kZW50IG9mIHRoZSBjaGFubmVsIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWxpdmUvbGF0ZXN0L3VnL2NyZWF0aW5nLW1lZGlhcGFja2FnZS1vdXRwdXQtZ3JvdXAuaHRtbFxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgZGVzdGluYXRpb25zXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsRGVzdGluYXRpb25zPzogTWVkaWFQYWNrYWdlVjJEZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogVGhlIGxlbmd0aCBvZiBlYWNoIG1lZGlhIHNlZ21lbnQuXG4gICAqIEBkZWZhdWx0IC0gU2VnbWVudC5zZWNvbmRzKDEpXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50PzogU2VnbWVudDtcbiAgLyoqXG4gICAqIFRoZSBJRDMgYmVoYXZpb3IuXG4gICAqIEBkZWZhdWx0IElkM0JlaGF2aW9yLkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSBpZDNCZWhhdmlvcj86IElkM0JlaGF2aW9yO1xuICAvKipcbiAgICogVGhlIEtMViBiZWhhdmlvci5cbiAgICogQGRlZmF1bHQgS2x2QmVoYXZpb3IuTk9fUEFTU1RIUk9VR0hcbiAgICovXG4gIHJlYWRvbmx5IGtsdkJlaGF2aW9yPzogS2x2QmVoYXZpb3I7XG4gIC8qKlxuICAgKiBUaGUgTmllbHNlbiBJRDMgYmVoYXZpb3IuXG4gICAqIEBkZWZhdWx0IE5pZWxzZW5JZDNCZWhhdmlvci5OT19QQVNTVEhST1VHSFxuICAgKi9cbiAgcmVhZG9ubHkgbmllbHNlbklkM0JlaGF2aW9yPzogTmllbHNlbklkM0JlaGF2aW9yO1xuICAvKipcbiAgICogVGhlIFNDVEUtMzUgdHlwZS5cbiAgICogQGRlZmF1bHQgU2N0ZTM1VHlwZS5TQ1RFXzM1X1dJVEhPVVRfU0VHTUVOVEFUSU9OXG4gICAqL1xuICByZWFkb25seSBzY3RlMzVUeXBlPzogU2N0ZTM1VHlwZTtcbiAgLyoqXG4gICAqIFRoZSB0aW1lZCBtZXRhZGF0YSBJRDMgZnJhbWUuXG4gICAqIEBkZWZhdWx0IFRpbWVkTWV0YWRhdGFJZDNGcmFtZS5OT05FXG4gICAqL1xuICByZWFkb25seSB0aW1lZE1ldGFkYXRhSWQzRnJhbWU/OiBUaW1lZE1ldGFkYXRhSWQzRnJhbWU7XG4gIC8qKlxuICAgKiBUaGUgdGltZWQgbWV0YWRhdGEgaW50ZXJ2YWwuXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoMTApXG4gICAqL1xuICByZWFkb25seSB0aW1lZE1ldGFkYXRhSWQzUGVyaW9kPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRpbWVkIG1ldGFkYXRhIGlzIHBhc3NlZCB0aHJvdWdoLlxuICAgKiBAZGVmYXVsdCBUaW1lZE1ldGFkYXRhUGFzc3Rocm91Z2guRElTQUJMRURcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVkTWV0YWRhdGFQYXNzdGhyb3VnaD86IFRpbWVkTWV0YWRhdGFQYXNzdGhyb3VnaDtcbiAgLyoqXG4gICAqIENhcHRpb24gbGFuZ3VhZ2UgbWFwcGluZ3MgZm9yIHRoZSBNZWRpYVBhY2thZ2UgVjIgb3V0cHV0LlxuICAgKiBAZGVmYXVsdCAtIG5vIGNhcHRpb24gbGFuZ3VhZ2UgbWFwcGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGNhcHRpb25MYW5ndWFnZU1hcHBpbmdzPzogQ2FwdGlvbkxhbmd1YWdlTWFwcGluZ1tdO1xuICAvKipcbiAgICogVGhlIG91dHB1dHMgZm9yIHRoaXMgb3V0cHV0IGdyb3VwLlxuICAgKlxuICAgKiBNZWRpYVBhY2thZ2UgVjIgdXNlcyBDTUFGIGluZ2VzdCB3aGljaCByZXF1aXJlcyBvbmUgdHJhY2sgcGVyIG91dHB1dC5cbiAgICogQ3JlYXRlIGEgc2VwYXJhdGUgb3V0cHV0IGZvciBlYWNoIGVuY29kZSAoZS5nLiBvbmUgZm9yIEhEIHZpZGVvLCBvbmUgZm9yIFNEIHZpZGVvLCBvbmUgZm9yIGF1ZGlvKS5cbiAgICogRG8gTk9UIHB1dCBtdWx0aXBsZSBlbmNvZGVzIGluIGEgc2luZ2xlIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dHM6IE1lZGlhUGFja2FnZVYyT3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGEgTWVkaWFQYWNrYWdlIFYyIG91dHB1dCBncm91cC5cbiAqXG4gKiBSZWZlcmVuY2UgYSBzaW5nbGUgTWVkaWFQYWNrYWdlIFYyIGNoYW5uZWw7IE1lZGlhTGl2ZSB3aXJlcyBlYWNoIGNoYW5uZWwgcGlwZWxpbmUgdG8gYVxuICogTWVkaWFQYWNrYWdlIGluZ2VzdCBlbmRwb2ludCBhdXRvbWF0aWNhbGx5IChvbmUgZm9yIFNJTkdMRV9QSVBFTElORSwgYm90aCBmb3IgU1RBTkRBUkQpLiBGb3JcbiAqIHBlci1waXBlbGluZSBjb250cm9sIOKAlCBmb3IgZXhhbXBsZSBzZW5kaW5nIHBpcGVsaW5lIDAgdG8gYSBzcGVjaWZpYyBlbmRwb2ludCBvZiBhIGNoYW5uZWwgaW5cbiAqIGFub3RoZXIgcmVnaW9uIOKAlCB1c2UgYE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbi5tZWRpYVBhY2thZ2VWMlBlclBpcGVsaW5lKClgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFQYWNrYWdlVjJPdXRwdXRHcm91cFByb3BzIGV4dGVuZHMgTWVkaWFQYWNrYWdlVjJPdXRwdXRHcm91cEJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgTWVkaWFQYWNrYWdlIFYyIGNoYW5uZWwgdG8gZGVsaXZlciB0by4gTWVkaWFMaXZlIG1hcHMgdGhlIGNoYW5uZWwgcGlwZWxpbmVzIHRvIHRoZVxuICAgKiBjaGFubmVsJ3MgaW5nZXN0IGVuZHBvaW50cyBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBjaGFubmVsIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbDogSU1lZGlhUGFja2FnZVYyQ2hhbm5lbDtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIE1lZGlhUGFja2FnZSBWMiBvdXRwdXQgZ3JvdXAgd2l0aCBleHBsaWNpdCBwZXItcGlwZWxpbmUgZGVzdGluYXRpb25zLlxuICpcbiAqIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgdG8gY29udHJvbCB0aGUgY2hhbm5lbCBhbmQgZW5kcG9pbnQgZWFjaCBwaXBlbGluZSBkZWxpdmVycyB0byDigJQgZm9yXG4gKiBleGFtcGxlIGNyb3NzLXJlZ2lvbiBkZWxpdmVyeSwgb3IgcGlubmluZyBwaXBlbGluZSAwIHRvIGEgc3BlY2lmaWMgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFQYWNrYWdlVjJQZXJQaXBlbGluZU91dHB1dEdyb3VwUHJvcHMgZXh0ZW5kcyBNZWRpYVBhY2thZ2VWMk91dHB1dEdyb3VwQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBwcmltYXJ5IE1lZGlhUGFja2FnZSBWMiBkZXN0aW5hdGlvbnMg4oCUIG9uZSBwZXIgcGlwZWxpbmUuXG4gICAqXG4gICAqIEFycmF5IHBvc2l0aW9uIGRldGVybWluZXMgdGhlIHBpcGVsaW5lIG1hcHBpbmc6XG4gICAqIC0gYGRlc3RpbmF0aW9uc1swXWAg4oaSIFBpcGVsaW5lIDBcbiAgICogLSBgZGVzdGluYXRpb25zWzFdYCDihpIgUGlwZWxpbmUgMSAoU1RBTkRBUkQgY2hhbm5lbHMgb25seSlcbiAgICpcbiAgICogRm9yIGEgU0lOR0xFX1BJUEVMSU5FIGNoYW5uZWwsIHByb3ZpZGUgZXhhY3RseSAxIGRlc3RpbmF0aW9uLlxuICAgKiBGb3IgYSBTVEFOREFSRCBjaGFubmVsLCBwcm92aWRlIGV4YWN0bHkgMiBkZXN0aW5hdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbnM6IE1lZGlhUGFja2FnZVYyRGVzdGluYXRpb25bXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIE1lZGlhQ29ubmVjdCBSb3V0ZXIgb3V0cHV0IGdyb3VwLlxuICpcbiAqIERlbGl2ZXJzIGVhY2ggY2hhbm5lbCBwaXBlbGluZSB0byBhIE1lZGlhQ29ubmVjdCBSb3V0ZXIuIFRoZSBkb3duc3RyZWFtIHJvdXRpbmcgKHdoaWNoIHJvdXRlclxuICogaW5wdXQgZWFjaCBwaXBlbGluZSBmZWVkcykgaXMgY29uZmlndXJlZCBvbiB0aGUgTWVkaWFDb25uZWN0IHNpZGUsIHJlZmVyZW5jaW5nIHRoaXMgZ3JvdXAgYnlcbiAqIGBuYW1lYCBhbmQgcGlwZWxpbmUgaWQuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1tZWRpYWxpdmUtY2hhbm5lbC1tZWRpYWNvbm5lY3Ryb3V0ZXJncm91cHNldHRpbmdzLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXRHcm91cFByb3BzIHtcbiAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLiBVc2VkIGFzIHRoZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgSUQuIFVuZGVyc2NvcmVzIGFyZSBub3JtYWxpc2VkIHRvIGh5cGhlbnMgaW50ZXJuYWxseS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIEF2YWlsYWJpbGl0eSBab25lcyBpbiB3aGljaCB0byB3cml0ZSBvdXRwdXQgdG8gdGhlIE1lZGlhQ29ubmVjdCBSb3V0ZXIuIFByb3ZpZGUgZXhhY3RseVxuICAgKiBvbmUgQVogZm9yIGEgYFNJTkdMRV9QSVBFTElORWAgY2hhbm5lbCwgb3IgdHdvIChvbmUgcGVyIHBpcGVsaW5lKSBmb3IgYSBgU1RBTkRBUkRgIGNoYW5uZWwuXG4gICAqL1xuICByZWFkb25seSBhdmFpbGFiaWxpdHlab25lczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUcmFuc2l0LWVuY3J5cHRpb24gc2V0dGluZ3MsIGFwcGxpZWQgcGVyIGNoYW5uZWwgcGlwZWxpbmUuXG4gICAqIEBkZWZhdWx0IC0gQVVUT01BVElDIChzZXJ2aWNlLW1hbmFnZWQpIHRyYW5zaXQgZW5jcnlwdGlvbiBvbiBldmVyeSBwaXBlbGluZVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyU2V0dGluZ3M/OiBNZWRpYUNvbm5lY3RSb3V0ZXJTZXR0aW5ncztcbiAgLyoqXG4gICAqIFRoZSBvdXRwdXRzIGZvciB0aGlzIG91dHB1dCBncm91cC5cbiAgICpcbiAgICogTWVkaWFDb25uZWN0IFJvdXRlciBvdXRwdXRzIHVzZSBhbiBNUEVHLVRTIGNvbnRhaW5lciwgc28gZWFjaCBvdXRwdXQgbWF5IG11bHRpcGxleCBvbmUgdmlkZW9cbiAgICogZW5jb2RlIGFuZCBvbmUgb3IgbW9yZSBhdWRpbyBlbmNvZGVzIChhcyB3aXRoIFVEUCkuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRzOiBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXREZWZpbml0aW9uW107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYW4gSExTIG91dHB1dCBncm91cC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIbHNPdXRwdXRHcm91cFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLiBVc2VkIGFzIHRoZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgSUQuIFVuZGVyc2NvcmVzIGFyZSBub3JtYWxpc2VkIHRvIGh5cGhlbnMgaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkZXN0aW5hdGlvbnMgZm9yIHRoaXMgb3V0cHV0IGdyb3VwIOKAlCBvbmUgcGVyIHBpcGVsaW5lLlxuICAgKlxuICAgKiBBcnJheSBwb3NpdGlvbiBkZXRlcm1pbmVzIHRoZSBwaXBlbGluZSBtYXBwaW5nOlxuICAgKiAtIGBkZXN0aW5hdGlvbnNbMF1gIOKGkiBQaXBlbGluZSAwXG4gICAqIC0gYGRlc3RpbmF0aW9uc1sxXWAg4oaSIFBpcGVsaW5lIDEgKFNUQU5EQVJEIGNoYW5uZWxzIG9ubHkpXG4gICAqXG4gICAqIEZvciBhIFNJTkdMRV9QSVBFTElORSBjaGFubmVsLCBwcm92aWRlIGV4YWN0bHkgMSBkZXN0aW5hdGlvbi5cbiAgICogRm9yIGEgU1RBTkRBUkQgY2hhbm5lbCwgcHJvdmlkZSBleGFjdGx5IDIgZGVzdGluYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb25zOiBPdXRwdXREZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogVGhlIGxlbmd0aCBvZiBlYWNoIG1lZGlhIHNlZ21lbnQuIEhMUyBzdXBwb3J0cyB3aG9sZS1zZWNvbmQgc2VnbWVudHMgb25seS5cbiAgICogQGRlZmF1bHQgLSBTZWdtZW50LnNlY29uZHMoMilcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnQ/OiBTZWdtZW50O1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBzZWdtZW50cyB0byByZXRhaW4gaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSAoTElWRSBtb2RlIG9ubHkpLlxuICAgKiBAZGVmYXVsdCAyMVxuICAgKi9cbiAgcmVhZG9ubHkga2VlcFNlZ21lbnRzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoZSBtZWRpYSBtYW5pZmVzdCAoTElWRSBtb2RlIG9ubHkpLlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXhOU2VnbWVudHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0IG1vZGUg4oCUIExJVkUgb3IgVk9ELlxuICAgKiBAZGVmYXVsdCBIbHNNb2RlLkxJVkVcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBIbHNNb2RlO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gc2VnbWVudCBsZW5ndGguIEhMUyBzdXBwb3J0cyB3aG9sZS1zZWNvbmQgc2VnbWVudHMgb25seS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IG1pblNlZ21lbnQ/OiBTZWdtZW50O1xuICAvKipcbiAgICogQWN0aW9uIHRvIHRha2Ugd2hlbiB0aGUgaW5wdXQgaXMgbG9zdC5cbiAgICogQGRlZmF1bHQgSGxzSW5wdXRMb3NzQWN0aW9uLkVNSVRfT1VUUFVUXG4gICAqL1xuICByZWFkb25seSBpbnB1dExvc3NBY3Rpb24/OiBIbHNJbnB1dExvc3NBY3Rpb247XG4gIC8qKlxuICAgKiBDaG9vc2VzIG9uZSBvciBtb3JlIGFkIG1hcmtlciB0eXBlcyB0byBwYXNzIFNDVEUzNSBzaWduYWxzIHRocm91Z2ggdG8gdGhpcyBncm91cCBvZiBBcHBsZSBITFMgb3V0cHV0cy5cbiAgICogQGRlZmF1bHQgLSBubyBhZCBtYXJrZXJzXG4gICAqL1xuICByZWFkb25seSBhZE1hcmtlcnM/OiBIbHNBZE1hcmtlcnNbXTtcbiAgLyoqXG4gICAqIEEgcGFydGlhbCBVUkkgcHJlZml4IHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gZWFjaCBvdXRwdXQgaW4gdGhlIG1lZGlhIC5tM3U4IGZpbGUuXG4gICAqIEBkZWZhdWx0IC0gbm8gYmFzZSBVUkwgY29udGVudCBwcmVmaXhcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VVcmxDb250ZW50Pzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgYmFzZSBVUkwgY29udGVudCBmb3IgcGlwZWxpbmUgMSBpZiBkaWZmZXJlbnQgZnJvbSBwaXBlbGluZSAwLlxuICAgKiBAZGVmYXVsdCAtIG5vIGJhc2UgVVJMIGNvbnRlbnQgMVxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVVybENvbnRlbnQxPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBwYXJ0aWFsIFVSSSBwcmVmaXggdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byBlYWNoIG91dHB1dCBpbiB0aGUgbWVkaWEgLm0zdTggZmlsZSBmb3IgdGhlIG1hbmlmZXN0LlxuICAgKiBAZGVmYXVsdCAtIG5vIGJhc2UgVVJMIG1hbmlmZXN0IHByZWZpeFxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVVybE1hbmlmZXN0Pzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgYmFzZSBVUkwgbWFuaWZlc3QgZm9yIHBpcGVsaW5lIDEgaWYgZGlmZmVyZW50IGZyb20gcGlwZWxpbmUgMC5cbiAgICogQGRlZmF1bHQgLSBubyBiYXNlIFVSTCBtYW5pZmVzdCAxXG4gICAqL1xuICByZWFkb25seSBiYXNlVXJsTWFuaWZlc3QxPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBtYXBwaW5nIG9mIHVwIHRvIDQgY2FwdGlvbnMgY2hhbm5lbHMgdG8gY2FwdGlvbnMgbGFuZ3VhZ2VzLlxuICAgKiBNZWFuaW5nZnVsIG9ubHkgaWYgY2FwdGlvbkxhbmd1YWdlU2V0dGluZyBpcyBzZXQgdG8gSU5TRVJULlxuICAgKiBAZGVmYXVsdCAtIG5vIGNhcHRpb24gbGFuZ3VhZ2UgbWFwcGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGNhcHRpb25MYW5ndWFnZU1hcHBpbmdzPzogQ2FwdGlvbkxhbmd1YWdlTWFwcGluZ1tdO1xuICAvKipcbiAgICogQXBwbGllcyBvbmx5IHRvIDYwOCBlbWJlZGRlZCBvdXRwdXQgY2FwdGlvbnMuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uTGFuZ3VhZ2VTZXR0aW5nPzogSGxzQ2FwdGlvbkxhbmd1YWdlU2V0dGluZztcbiAgLyoqXG4gICAqIFdoZW4gc2V0IHRvIERJU0FCTEVELCBzZXRzIHRoZSAjRVhULVgtQUxMT1ctQ0FDSEU6bm8gdGFnIGluIHRoZSBtYW5pZmVzdC5cbiAgICogQGRlZmF1bHQgSGxzQ2xpZW50Q2FjaGUuRU5BQkxFRFxuICAgKi9cbiAgcmVhZG9ubHkgY2xpZW50Q2FjaGU/OiBIbHNDbGllbnRDYWNoZTtcbiAgLyoqXG4gICAqIFRoZSBzcGVjaWZpY2F0aW9uIHRvIHVzZSAoUkZDLTYzODEgb3IgdGhlIGRlZmF1bHQgUkZDLTQyODEpIGR1cmluZyBtM3U4IHBsYXlsaXN0IGdlbmVyYXRpb24uXG4gICAqIEBkZWZhdWx0IEhsc0NvZGVjU3BlY2lmaWNhdGlvbi5SRkNfNDI4MVxuICAgKi9cbiAgcmVhZG9ubHkgY29kZWNTcGVjaWZpY2F0aW9uPzogSGxzQ29kZWNTcGVjaWZpY2F0aW9uO1xuICAvKipcbiAgICogQSAxMjgtYml0LCAxNi1ieXRlIGhleCB2YWx1ZSByZXByZXNlbnRlZCBieSBhIDMyLWNoYXJhY3RlciB0ZXh0IHN0cmluZyB1c2VkIGFzIHRoZSBJViBmb3IgZW5jcnlwdGlvbi5cbiAgICogVXNlZCB3aXRoIGVuY3J5cHRpb25UeXBlIHdoZW4gaXZTb3VyY2UgaXMgc2V0IHRvIEVYUExJQ0lULlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbnN0YW50IElWXG4gICAqL1xuICByZWFkb25seSBjb25zdGFudEl2Pzogc3RyaW5nO1xuICAvKipcbiAgICogUGxhY2VzIHNlZ21lbnRzIGluIHN1YmRpcmVjdG9yaWVzLlxuICAgKiBAZGVmYXVsdCBIbHNEaXJlY3RvcnlTdHJ1Y3R1cmUuU0lOR0xFX0RJUkVDVE9SWVxuICAgKi9cbiAgcmVhZG9ubHkgZGlyZWN0b3J5U3RydWN0dXJlPzogSGxzRGlyZWN0b3J5U3RydWN0dXJlO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gaW5zZXJ0IEVYVC1YLURJU0NPTlRJTlVJVFkgdGFncyBpbiB0aGUgSExTIGNoaWxkIG1hbmlmZXN0cy5cbiAgICogQGRlZmF1bHQgSGxzRGlzY29udGludWl0eVRhZ3MuSU5TRVJUXG4gICAqL1xuICByZWFkb25seSBkaXNjb250aW51aXR5VGFncz86IEhsc0Rpc2NvbnRpbnVpdHlUYWdzO1xuICAvKipcbiAgICogRW5jcnlwdHMgdGhlIHNlZ21lbnRzIHdpdGggdGhlIHNwZWNpZmllZCBlbmNyeXB0aW9uIHNjaGVtZS5cbiAgICogQGRlZmF1bHQgLSBubyBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uVHlwZT86IEhsc0VuY3J5cHRpb25UeXBlO1xuICAvKipcbiAgICogU2V0dGluZ3MgdG8gY29uZmlndXJlIHRoZSBDRE4gZm9yIHRoZSBITFMgb3V0cHV0LlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgaGxzQ2RuU2V0dGluZ3M/OiBIbHNDZG5TZXR0aW5ncztcbiAgLyoqXG4gICAqIFN0YXRlIG9mIEhMUyBJRDMgU2VnbWVudCBUYWdnaW5nLlxuICAgKiBAZGVmYXVsdCBIbHNJZDNTZWdtZW50VGFnZ2luZ1N0YXRlLkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSBobHNJZDNTZWdtZW50VGFnZ2luZz86IEhsc0lkM1NlZ21lbnRUYWdnaW5nU3RhdGU7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNyZWF0ZSBhbiBJLWZyYW1lLW9ubHkgbWFuaWZlc3QuXG4gICAqIEBkZWZhdWx0IEhsc0lGcmFtZU9ubHlQbGF5bGlzdHMuRElTQUJMRURcbiAgICovXG4gIHJlYWRvbmx5IGlGcmFtZU9ubHlQbGF5bGlzdHM/OiBIbHNJRnJhbWVPbmx5UGxheWxpc3RzO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZmluYWwgKGluY29tcGxldGUpIHNlZ21lbnQgaW4gdGhlIG1lZGlhIG91dHB1dC5cbiAgICogQGRlZmF1bHQgSGxzSW5jb21wbGV0ZVNlZ21lbnRCZWhhdmlvci5BVVRPXG4gICAqL1xuICByZWFkb25seSBpbmNvbXBsZXRlU2VnbWVudEJlaGF2aW9yPzogSGxzSW5jb21wbGV0ZVNlZ21lbnRCZWhhdmlvcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIElWIGlzIGxpc3RlZCBpbiB0aGUgbWFuaWZlc3QuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBpdkluTWFuaWZlc3Q/OiBIbHNJdkluTWFuaWZlc3Q7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBJViBmb2xsb3dzIHRoZSBzZWdtZW50IG51bWJlciBvciBpcyBleHBsaWNpdC5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGl2U291cmNlPzogSGxzSXZTb3VyY2U7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRoZSBrZXkgaXMgcmVwcmVzZW50ZWQgaW4gdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhlIFVSSS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGtleUZvcm1hdD86IHN0cmluZztcbiAgLyoqXG4gICAqIEVpdGhlciBhIHNpbmdsZSBwb3NpdGl2ZSBpbnRlZ2VyIHZlcnNpb24gdmFsdWUgb3IgYSBzbGFzaC1kZWxpbWl0ZWQgbGlzdCBvZiB2ZXJzaW9uIHZhbHVlcyAoMS8yLzMpLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkga2V5Rm9ybWF0VmVyc2lvbnM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUga2V5IHByb3ZpZGVyIHNldHRpbmdzIGZvciBITFMgZW5jcnlwdGlvbi5cbiAgICogQGRlZmF1bHQgLSBubyBrZXkgcHJvdmlkZXIgc2V0dGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGtleVByb3ZpZGVyU2V0dGluZ3M/OiBIbHNLZXlQcm92aWRlclNldHRpbmdzO1xuICAvKipcbiAgICogV2hlbiBzZXQgdG8gR1pJUCwgY29tcHJlc3NlcyBITFMgcGxheWxpc3QuXG4gICAqIEBkZWZhdWx0IEhsc01hbmlmZXN0Q29tcHJlc3Npb24uTk9ORVxuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3RDb21wcmVzc2lvbj86IEhsc01hbmlmZXN0Q29tcHJlc3Npb247XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb3V0cHV0IG1hbmlmZXN0IHNob3VsZCB1c2UgZmxvYXRpbmcgcG9pbnQgb3IgaW50ZWdlciB2YWx1ZXMgZm9yIHNlZ21lbnQgZHVyYXRpb24uXG4gICAqIEBkZWZhdWx0IEhsc01hbmlmZXN0RHVyYXRpb25Gb3JtYXQuRkxPQVRJTkdfUE9JTlRcbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0RHVyYXRpb25Gb3JtYXQ/OiBIbHNNYW5pZmVzdER1cmF0aW9uRm9ybWF0O1xuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggbWFuaWZlc3RzIGFuZCBzZWdtZW50cyBhcmUgZ2VuZXJhdGVkLlxuICAgKiBAZGVmYXVsdCBIbHNPdXRwdXRTZWxlY3Rpb24uTUFOSUZFU1RTX0FORF9TRUdNRU5UU1xuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0U2VsZWN0aW9uPzogSGxzT3V0cHV0U2VsZWN0aW9uO1xuICAvKipcbiAgICogSW5jbHVkZXMgb3IgZXhjbHVkZXMgdGhlIEVYVC1YLVBST0dSQU0tREFURS1USU1FIHRhZyBpbiAubTN1OCBtYW5pZmVzdCBmaWxlcy5cbiAgICogQGRlZmF1bHQgSGxzUHJvZ3JhbURhdGVUaW1lLklOQ0xVREVcbiAgICovXG4gIHJlYWRvbmx5IHByb2dyYW1EYXRlVGltZT86IEhsc1Byb2dyYW1EYXRlVGltZTtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgYWxnb3JpdGhtIHVzZWQgdG8gZHJpdmUgdGhlIEhMUyBFWFQtWC1QUk9HUkFNLURBVEUtVElNRSBjbG9jay5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBIbHNQcm9ncmFtRGF0ZVRpbWVDbG9jay5TWVNURU1fQ0xPQ0ssIG9yIElOSVRJQUxJWkVfRlJPTV9PVVRQVVRfVElNRUNPREUgd2l0aCBlcG9jaCBsb2NraW5nXG4gICAqL1xuICByZWFkb25seSBwcm9ncmFtRGF0ZVRpbWVDbG9jaz86IEhsc1Byb2dyYW1EYXRlVGltZUNsb2NrO1xuICAvKipcbiAgICogVGhlIHBlcmlvZCBvZiBpbnNlcnRpb24gb2YgdGhlIEVYVC1YLVBST0dSQU0tREFURS1USU1FIGVudHJ5LlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDEwKVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZ3JhbURhdGVUaW1lUGVyaW9kPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBtYXN0ZXIgbWFuaWZlc3QgaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQgYm90aCBwaXBlbGluZXMuXG4gICAqIEBkZWZhdWx0IEhsc1JlZHVuZGFudE1hbmlmZXN0LkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSByZWR1bmRhbnRNYW5pZmVzdD86IEhsc1JlZHVuZGFudE1hbmlmZXN0O1xuICAvKipcbiAgICogVGhlIHNlZ21lbnRhdGlvbiBtb2RlLlxuICAgKiBAZGVmYXVsdCBIbHNTZWdtZW50YXRpb25Nb2RlLlVTRV9TRUdNRU5UX0RVUkFUSU9OXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50YXRpb25Nb2RlPzogSGxzU2VnbWVudGF0aW9uTW9kZTtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMgdG8gd3JpdGUgdG8gYSBzdWJkaXJlY3RvcnkgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IG9uZS5cbiAgICogQGRlZmF1bHQgMTAwMDBcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnRzUGVyU3ViZGlyZWN0b3J5PzogbnVtYmVyO1xuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgdGhlIFJFU09MVVRJT04gYXR0cmlidXRlIGZvciBhIHZpZGVvIGluIHRoZSBFWFQtWC1TVFJFQU0tSU5GIHRhZy5cbiAgICogQGRlZmF1bHQgSGxzU3RyZWFtSW5mUmVzb2x1dGlvbi5JTkNMVURFXG4gICAqL1xuICByZWFkb25seSBzdHJlYW1JbmZSZXNvbHV0aW9uPzogSGxzU3RyZWFtSW5mUmVzb2x1dGlvbjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgSUQzIGZyYW1lIHRoYXQgaGFzIHRoZSB0aW1lY29kZS5cbiAgICogQGRlZmF1bHQgSGxzVGltZWRNZXRhZGF0YUlkM0ZyYW1lLlBSSVZcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVkTWV0YWRhdGFJZDNGcmFtZT86IEhsc1RpbWVkTWV0YWRhdGFJZDNGcmFtZTtcbiAgLyoqXG4gICAqIFRoZSB0aW1lZCBtZXRhZGF0YSBpbnRlcnZhbC5cbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygxMClcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVkTWV0YWRhdGFJZDNQZXJpb2Q/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFuIGV4dHJhIGRlbHRhIG9mZnNldCB0byBmaW5lIHR1bmUgdGhlIHRpbWVzdGFtcHMuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSB0aW1lc3RhbXBEZWx0YT86IER1cmF0aW9uO1xuICAvKipcbiAgICogV2hldGhlciB0byBlbWl0IHNlZ21lbnRlZCBmaWxlcyBvciBhIHNpbmdsZSBmaWxlLlxuICAgKiBAZGVmYXVsdCBIbHNUc0ZpbGVNb2RlLlNFR01FTlRFRF9GSUxFU1xuICAgKi9cbiAgcmVhZG9ubHkgdHNGaWxlTW9kZT86IEhsc1RzRmlsZU1vZGU7XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0cyBmb3IgdGhpcyBITFMgb3V0cHV0IGdyb3VwLlxuICAgKiBAZGVmYXVsdCAtIG5vIGluaXRpYWwgb3V0cHV0c1xuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0cz86IEhsc091dHB1dERlZmluaXRpb25bXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIFVEUCBvdXRwdXQgZ3JvdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVWRwT3V0cHV0R3JvdXBQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGlzIG91dHB1dCBncm91cC4gVXNlZCBhcyB0aGUgZGVzdGluYXRpb24gcmVmZXJlbmNlIElELiBVbmRlcnNjb3JlcyBhcmUgbm9ybWFsaXNlZCB0byBoeXBoZW5zIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzdGluYXRpb25zIGZvciB0aGlzIG91dHB1dCBncm91cCDigJQgb25lIHBlciBwaXBlbGluZS5cbiAgICpcbiAgICogQXJyYXkgcG9zaXRpb24gZGV0ZXJtaW5lcyB0aGUgcGlwZWxpbmUgbWFwcGluZzpcbiAgICogLSBgZGVzdGluYXRpb25zWzBdYCDihpIgUGlwZWxpbmUgMFxuICAgKiAtIGBkZXN0aW5hdGlvbnNbMV1gIOKGkiBQaXBlbGluZSAxIChTVEFOREFSRCBjaGFubmVscyBvbmx5KVxuICAgKlxuICAgKiBGb3IgYSBTSU5HTEVfUElQRUxJTkUgY2hhbm5lbCwgcHJvdmlkZSBleGFjdGx5IDEgZGVzdGluYXRpb24uXG4gICAqIEZvciBhIFNUQU5EQVJEIGNoYW5uZWwsIHByb3ZpZGUgZXhhY3RseSAyIGRlc3RpbmF0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uczogVWRwT3V0cHV0RGVzdGluYXRpb25bXTtcbiAgLyoqXG4gICAqIFRoZSBvdXRwdXQgYnVmZmVyaW5nLiBBcHBsaWVkIGF0IG1pbGxpc2Vjb25kIGdyYW51bGFyaXR5LlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgYnVmZmVyPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBBY3Rpb24gdG8gdGFrZSB3aGVuIHRoZSBpbnB1dCBpcyBsb3N0LlxuICAgKiBAZGVmYXVsdCBVZHBJbnB1dExvc3NBY3Rpb24uRU1JVF9QUk9HUkFNXG4gICAqL1xuICByZWFkb25seSBpbnB1dExvc3NBY3Rpb24/OiBVZHBJbnB1dExvc3NBY3Rpb247XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIElEMyBmcmFtZSB0aGF0IGhhcyB0aGUgdGltZWNvZGUuXG4gICAqIEBkZWZhdWx0IFVkcFRpbWVkTWV0YWRhdGFJZDNGcmFtZS5QUklWXG4gICAqL1xuICByZWFkb25seSB0aW1lZE1ldGFkYXRhSWQzRnJhbWU/OiBVZHBUaW1lZE1ldGFkYXRhSWQzRnJhbWU7XG4gIC8qKlxuICAgKiBUaGUgdGltZWQgbWV0YWRhdGEgaW50ZXJ2YWwuXG4gICAqIEBkZWZhdWx0IC0gRHVyYXRpb24uc2Vjb25kcygxMClcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVkTWV0YWRhdGFJZDNQZXJpb2Q/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBvdXRwdXRzIGZvciB0aGlzIFVEUCBvdXRwdXQgZ3JvdXAuXG4gICAqIEBkZWZhdWx0IC0gbm8gaW5pdGlhbCBvdXRwdXRzXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRzPzogVWRwT3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYW4gQXJjaGl2ZSAoUzMpIG91dHB1dCBncm91cC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJjaGl2ZU91dHB1dEdyb3VwUHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyBvdXRwdXQgZ3JvdXAuIFVzZWQgYXMgdGhlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBJRC4gVW5kZXJzY29yZXMgYXJlIG5vcm1hbGlzZWQgdG8gaHlwaGVucyBpbnRlcm5hbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc3RpbmF0aW9ucyBmb3IgdGhpcyBvdXRwdXQgZ3JvdXAg4oCUIG9uZSBwZXIgcGlwZWxpbmUuXG4gICAqXG4gICAqIEFycmF5IHBvc2l0aW9uIGRldGVybWluZXMgdGhlIHBpcGVsaW5lIG1hcHBpbmc6XG4gICAqIC0gYGRlc3RpbmF0aW9uc1swXWAg4oaSIFBpcGVsaW5lIDBcbiAgICogLSBgZGVzdGluYXRpb25zWzFdYCDihpIgUGlwZWxpbmUgMSAoU1RBTkRBUkQgY2hhbm5lbHMgb25seSlcbiAgICpcbiAgICogRm9yIGEgU0lOR0xFX1BJUEVMSU5FIGNoYW5uZWwsIHByb3ZpZGUgZXhhY3RseSAxIGRlc3RpbmF0aW9uLlxuICAgKiBGb3IgYSBTVEFOREFSRCBjaGFubmVsLCBwcm92aWRlIGV4YWN0bHkgMiBkZXN0aW5hdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbnM6IFMzT3V0cHV0RGVzdGluYXRpb25bXTtcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiBlYWNoIGFyY2hpdmUgZmlsZSAocm9sbG92ZXIgaW50ZXJ2YWwpLlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMwMClcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxvdmVySW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBTMyBjYW5uZWQgQUNMIHRvIGFwcGx5IHRvIGVhY2ggYXJjaGl2ZSBvdXRwdXQuXG4gICAqIEBkZWZhdWx0IC0gbm8gY2FubmVkIEFDTFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl2ZVMzQ2FubmVkQWNsPzogUzNDYW5uZWRBY2w7XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0cyBmb3IgdGhpcyBBcmNoaXZlIG91dHB1dCBncm91cC5cbiAgICogQGRlZmF1bHQgLSBubyBpbml0aWFsIG91dHB1dHNcbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dHM/OiBBcmNoaXZlT3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYW4gUlRNUCBvdXRwdXQgZ3JvdXAuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ0bXBPdXRwdXRHcm91cFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSBmb3IgdGhlIFJUTVAgY29ubmVjdGlvbi5cbiAgICogQGRlZmF1bHQgUnRtcEF1dGhlbnRpY2F0aW9uU2NoZW1lLkNPTU1PTlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aGVudGljYXRpb25TY2hlbWU/OiBSdG1wQXV0aGVudGljYXRpb25TY2hlbWU7XG4gIC8qKlxuICAgKiBUaGUgZGVsYXkgYmVmb3JlIHJlc3RhcnRpbmcgYWZ0ZXIgYSBzdHJlYW1pbmcgb3V0cHV0IGZhaWx1cmUuIEEgdmFsdWUgb2ZcbiAgICogYER1cmF0aW9uLnNlY29uZHMoMClgIG1lYW5zIG5ldmVyIHJlc3RhcnQuXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoMSlcbiAgICovXG4gIHJlYWRvbmx5IHJlc3RhcnREZWxheT86IER1cmF0aW9uO1xuICAvKipcbiAgICogQ2hvb3NlIHRoZSBhZCBtYXJrZXIgdHlwZSBmb3IgdGhpcyBvdXRwdXQgZ3JvdXAuXG4gICAqIEBkZWZhdWx0IC0gbm8gYWQgbWFya2Vyc1xuICAgKi9cbiAgcmVhZG9ubHkgYWRNYXJrZXJzPzogUnRtcEFkTWFya2Vyc1tdO1xuICAvKipcbiAgICogQ29udHJvbHMgYmVoYXZpb3Igd2hlbiB0aGUgY29udGVudCBjYWNoZSBmaWxscyB1cC5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRnVsbEJlaGF2aW9yPzogUnRtcENhY2hlRnVsbEJlaGF2aW9yO1xuICAvKipcbiAgICogVGhlIGNhY2hlIGxlbmd0aCwgaW4gc2Vjb25kcywgdGhhdCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBidWZmZXIgc2l6ZS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlTGVuZ3RoPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgdHlwZXMgb2YgZGF0YSB0aGF0IHBhc3MgdG8gb25DYXB0aW9uSW5mbyBvdXRwdXRzLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgY2FwdGlvbkRhdGE/OiBSdG1wQ2FwdGlvbkRhdGE7XG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIGZpbGxlciBOQUwgdW5pdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlRmlsbGVyTmFsVW5pdHM/OiBSdG1wSW5jbHVkZUZpbGxlck5hbFVuaXRzO1xuICAvKipcbiAgICogQ29udHJvbHMgdGhlIGJlaGF2aW9yIG9mIHRoaXMgUlRNUCBncm91cCBpZiB0aGUgaW5wdXQgYmVjb21lcyB1bmF2YWlsYWJsZS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TG9zc0FjdGlvbj86IFJ0bXBJbnB1dExvc3NBY3Rpb247XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0cyBmb3IgdGhpcyBSVE1QIG91dHB1dCBncm91cC4gRWFjaCBvdXRwdXQgaW5jbHVkZXMgaXRzIG93biBSVE1QIGRlc3RpbmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0czogUnRtcE91dHB1dERlZmluaXRpb25bXTtcbn1cblxuLyoqIFByb3BlcnRpZXMgZm9yIGFuIFNSVCBvdXRwdXQgZ3JvdXAuICovXG5leHBvcnQgaW50ZXJmYWNlIFNydE91dHB1dEdyb3VwUHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyBvdXRwdXQgZ3JvdXAuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgYmVoYXZpb3Igb2YgdGhpcyBTUlQgZ3JvdXAgaWYgdGhlIGlucHV0IGJlY29tZXMgdW5hdmFpbGFibGUuXG4gICAqIEBkZWZhdWx0IFNydElucHV0TG9zc0FjdGlvbi5FTUlUX1BST0dSQU1cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TG9zc0FjdGlvbj86IFNydElucHV0TG9zc0FjdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBvdXRwdXRzIGZvciB0aGlzIFNSVCBvdXRwdXQgZ3JvdXAuIEVhY2ggb3V0cHV0IGluY2x1ZGVzIGl0cyBvd24gU1JUIGRlc3RpbmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0czogU3J0T3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYSBDTUFGIEluZ2VzdCBvdXRwdXQgZ3JvdXAuICovXG5leHBvcnQgaW50ZXJmYWNlIENtYWZJbmdlc3RPdXRwdXRHcm91cFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLiBVc2VkIGFzIHRoZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgSUQuIFVuZGVyc2NvcmVzIGFyZSBub3JtYWxpc2VkIHRvIGh5cGhlbnMgaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwcmltYXJ5IENNQUYgaW5nZXN0IGRlc3RpbmF0aW9ucyDigJQgb25lIHBlciBwaXBlbGluZS5cbiAgICpcbiAgICogQXJyYXkgcG9zaXRpb24gZGV0ZXJtaW5lcyB0aGUgcGlwZWxpbmUgbWFwcGluZzpcbiAgICogLSBgZGVzdGluYXRpb25zWzBdYCDihpIgUGlwZWxpbmUgMFxuICAgKiAtIGBkZXN0aW5hdGlvbnNbMV1gIOKGkiBQaXBlbGluZSAxIChTVEFOREFSRCBjaGFubmVscyBvbmx5KVxuICAgKlxuICAgKiBGb3IgYSBTSU5HTEVfUElQRUxJTkUgY2hhbm5lbCwgcHJvdmlkZSBleGFjdGx5IDEgZGVzdGluYXRpb24uXG4gICAqIEZvciBhIFNUQU5EQVJEIGNoYW5uZWwsIHByb3ZpZGUgZXhhY3RseSAyIGRlc3RpbmF0aW9ucyB0byB1dGlsaXNlIGJvdGhcbiAgICogcGlwZWxpbmVzIGZvciByZWR1bmRhbmN5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb25zOiBPdXRwdXREZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogQ29uZmlndXJlIGFkZGl0aW9uYWwgZGVzdGluYXRpb25zIHRvIGZhbiBvdXQgdGhlIENNQUYgaW5nZXN0IG91dHB1dCB0byBleHRyYVxuICAgKiBlbmRwb2ludHMsIGZvciBleGFtcGxlIGZvciBjcm9zcy1yZWdpb24gZGVsaXZlcnkgb3IgYmFja3VwIHBhY2thZ2luZy5cbiAgICpcbiAgICogU3RhbmRhcmQgY2hhbm5lbHMgc3VwcG9ydCB1cCB0byAyIGFkZGl0aW9uYWwgZGVzdGluYXRpb25zLlxuICAgKiBTaW5nbGUgcGlwZWxpbmUgY2hhbm5lbHMgc3VwcG9ydCAxIGFkZGl0aW9uYWwgZGVzdGluYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBkZXN0aW5hdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxEZXN0aW5hdGlvbnM/OiBPdXRwdXREZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogVGhlIGxlbmd0aCBvZiBlYWNoIG1lZGlhIHNlZ21lbnQuXG4gICAqIEBkZWZhdWx0IC0gU2VnbWVudC5zZWNvbmRzKDEpXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50PzogU2VnbWVudDtcbiAgLyoqXG4gICAqIFRoZSBJRDMgYmVoYXZpb3IgZm9yIHRoZSBDTUFGIGluZ2VzdCBvdXRwdXQuXG4gICAqIEBkZWZhdWx0IElkM0JlaGF2aW9yLkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSBpZDNCZWhhdmlvcj86IElkM0JlaGF2aW9yO1xuICAvKipcbiAgICogVGhlIG5hbWUgbW9kaWZpZXIgZm9yIElEMyBtZXRhZGF0YS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGlkM05hbWVNb2RpZmllcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBLTFYgYmVoYXZpb3IgZm9yIHRoZSBDTUFGIGluZ2VzdCBvdXRwdXQuXG4gICAqIEBkZWZhdWx0IEtsdkJlaGF2aW9yLk5PX1BBU1NUSFJPVUdIXG4gICAqL1xuICByZWFkb25seSBrbHZCZWhhdmlvcj86IEtsdkJlaGF2aW9yO1xuICAvKipcbiAgICogVGhlIG5hbWUgbW9kaWZpZXIgZm9yIEtMViBtZXRhZGF0YS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGtsdk5hbWVNb2RpZmllcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBOaWVsc2VuIElEMyBiZWhhdmlvciBmb3IgdGhlIENNQUYgaW5nZXN0IG91dHB1dC5cbiAgICogQGRlZmF1bHQgTmllbHNlbklkM0JlaGF2aW9yLk5PX1BBU1NUSFJPVUdIXG4gICAqL1xuICByZWFkb25seSBuaWVsc2VuSWQzQmVoYXZpb3I/OiBOaWVsc2VuSWQzQmVoYXZpb3I7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBtb2RpZmllciBmb3IgTmllbHNlbiBJRDMgbWV0YWRhdGEuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBuaWVsc2VuSWQzTmFtZU1vZGlmaWVyPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgbW9kaWZpZXIgZm9yIFNDVEUtMzUgbWVzc2FnZXMuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBzY3RlMzVOYW1lTW9kaWZpZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgU0NURS0zNSB0eXBlIGZvciB0aGUgQ01BRiBpbmdlc3Qgb3V0cHV0LlxuICAgKiBAZGVmYXVsdCBTY3RlMzVUeXBlLlNDVEVfMzVfV0lUSE9VVF9TRUdNRU5UQVRJT05cbiAgICovXG4gIHJlYWRvbmx5IHNjdGUzNVR5cGU/OiBTY3RlMzVUeXBlO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgdGhlIG91dHB1dCBmcm9tIHRoZSBzZWNvbmQgcGlwZWxpbmUuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBzZW5kRGVsYXlNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgSUQzIGZyYW1lIHRoYXQgaGFzIHRoZSB0aW1lY29kZS5cbiAgICogQGRlZmF1bHQgVGltZWRNZXRhZGF0YUlkM0ZyYW1lLk5PTkVcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVkTWV0YWRhdGFJZDNGcmFtZT86IFRpbWVkTWV0YWRhdGFJZDNGcmFtZTtcbiAgLyoqXG4gICAqIFRoZSB0aW1lZCBtZXRhZGF0YSBpbnRlcnZhbC5cbiAgICogQGRlZmF1bHQgLSBEdXJhdGlvbi5zZWNvbmRzKDEwKVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZWRNZXRhZGF0YUlkM1BlcmlvZD86IER1cmF0aW9uO1xuICAvKipcbiAgICogV2hldGhlciB0aW1lZCBtZXRhZGF0YSBpcyBwYXNzZWQgdGhyb3VnaC5cbiAgICogQGRlZmF1bHQgVGltZWRNZXRhZGF0YVBhc3N0aHJvdWdoLkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSB0aW1lZE1ldGFkYXRhUGFzc3Rocm91Z2g/OiBUaW1lZE1ldGFkYXRhUGFzc3Rocm91Z2g7XG4gIC8qKlxuICAgKiBNYXBzIGNhcHRpb25zIGNoYW5uZWxzIHRvIGxhbmd1YWdlcyBmb3IgdGhpcyBDTUFGIEluZ2VzdCBvdXRwdXQgZ3JvdXAuXG4gICAqIEBkZWZhdWx0IC0gbm8gY2FwdGlvbiBsYW5ndWFnZSBtYXBwaW5nc1xuICAgKi9cbiAgcmVhZG9ubHkgY2FwdGlvbkxhbmd1YWdlTWFwcGluZ3M/OiBDbWFmQ2FwdGlvbkxhbmd1YWdlTWFwcGluZ1tdO1xuICAvKipcbiAgICogVGhlIG91dHB1dHMgZm9yIHRoaXMgQ01BRiBJbmdlc3Qgb3V0cHV0IGdyb3VwLiBFYWNoIG91dHB1dCBzaG91bGQgY29udGFpbiBhIHNpbmdsZSBlbmNvZGUuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRzOiBDbWFmSW5nZXN0T3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYSBGcmFtZSBDYXB0dXJlIG91dHB1dCBncm91cC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnJhbWVDYXB0dXJlT3V0cHV0R3JvdXBQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGlzIG91dHB1dCBncm91cC4gVXNlZCBhcyB0aGUgZGVzdGluYXRpb24gcmVmZXJlbmNlIElELiBVbmRlcnNjb3JlcyBhcmUgbm9ybWFsaXNlZCB0byBoeXBoZW5zIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzdGluYXRpb25zIGZvciB0aGlzIG91dHB1dCBncm91cCDigJQgb25lIHBlciBwaXBlbGluZS5cbiAgICpcbiAgICogQXJyYXkgcG9zaXRpb24gZGV0ZXJtaW5lcyB0aGUgcGlwZWxpbmUgbWFwcGluZzpcbiAgICogLSBgZGVzdGluYXRpb25zWzBdYCDihpIgUGlwZWxpbmUgMFxuICAgKiAtIGBkZXN0aW5hdGlvbnNbMV1gIOKGkiBQaXBlbGluZSAxIChTVEFOREFSRCBjaGFubmVscyBvbmx5KVxuICAgKlxuICAgKiBGb3IgYSBTSU5HTEVfUElQRUxJTkUgY2hhbm5lbCwgcHJvdmlkZSBleGFjdGx5IDEgZGVzdGluYXRpb24uXG4gICAqIEZvciBhIFNUQU5EQVJEIGNoYW5uZWwsIHByb3ZpZGUgZXhhY3RseSAyIGRlc3RpbmF0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uczogUzNPdXRwdXREZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogVGhlIFMzIGNhbm5lZCBBQ0wgdG8gYXBwbHkgdG8gZWFjaCBmcmFtZSBjYXB0dXJlIG91dHB1dC5cbiAgICogQGRlZmF1bHQgLSBubyBjYW5uZWQgQUNMXG4gICAqL1xuICByZWFkb25seSBmcmFtZUNhcHR1cmVTM0Nhbm5lZEFjbD86IFMzQ2FubmVkQWNsO1xuICAvKipcbiAgICogVGhlIG91dHB1dHMgZm9yIHRoaXMgRnJhbWUgQ2FwdHVyZSBvdXRwdXQgZ3JvdXAuXG4gICAqIEBkZWZhdWx0IC0gbm8gaW5pdGlhbCBvdXRwdXRzXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRzPzogRnJhbWVDYXB0dXJlT3V0cHV0RGVmaW5pdGlvbltdO1xufVxuXG4vKiogUHJvcGVydGllcyBmb3IgYW4gTVMgU21vb3RoIG91dHB1dCBncm91cC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTXNTbW9vdGhPdXRwdXRHcm91cFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgb3V0cHV0IGdyb3VwLiBVc2VkIGFzIHRoZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgSUQuIFVuZGVyc2NvcmVzIGFyZSBub3JtYWxpc2VkIHRvIGh5cGhlbnMgaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkZXN0aW5hdGlvbnMgZm9yIHRoaXMgb3V0cHV0IGdyb3VwIOKAlCBvbmUgcGVyIHBpcGVsaW5lLlxuICAgKlxuICAgKiBBcnJheSBwb3NpdGlvbiBkZXRlcm1pbmVzIHRoZSBwaXBlbGluZSBtYXBwaW5nOlxuICAgKiAtIGBkZXN0aW5hdGlvbnNbMF1gIOKGkiBQaXBlbGluZSAwXG4gICAqIC0gYGRlc3RpbmF0aW9uc1sxXWAg4oaSIFBpcGVsaW5lIDEgKFNUQU5EQVJEIGNoYW5uZWxzIG9ubHkpXG4gICAqXG4gICAqIEZvciBhIFNJTkdMRV9QSVBFTElORSBjaGFubmVsLCBwcm92aWRlIGV4YWN0bHkgMSBkZXN0aW5hdGlvbi5cbiAgICogRm9yIGEgU1RBTkRBUkQgY2hhbm5lbCwgcHJvdmlkZSBleGFjdGx5IDIgZGVzdGluYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb25zOiBPdXRwdXREZXN0aW5hdGlvbltdO1xuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBBY3F1aXNpdGlvbiBQb2ludCBJZGVudGl0eSBlbGVtZW50IHVzZWQgaW4gZWFjaCBtZXNzYWdlIHBsYWNlZCBpbiB0aGUgc3BhcnNlIHRyYWNrLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgYWNxdWlzaXRpb25Qb2ludElkPzogc3RyaW5nO1xuICAvKipcbiAgICogSWYgc2V0IHRvIHBhc3N0aHJvdWdoIGZvciBhbiBhdWRpby1vbmx5IG91dHB1dCwgdGhlIGZyYWdtZW50IGFic29sdXRlIHRpbWUgaXMgc2V0IHRvIHRoZSBjdXJyZW50IHRpbWVjb2RlLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgYXVkaW9Pbmx5VGltZWNvZGVDb250cm9sPzogTXNTbW9vdGhBdWRpb09ubHlUaW1lY29kZUNvbnRyb2w7XG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gVkVSSUZZX0FVVEhFTlRJQ0lUWSwgdmVyaWZpZXMgdGhlIEhUVFBTIGNlcnRpZmljYXRlIGNoYWluIHRvIGEgdHJ1c3RlZCBDQS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlTW9kZT86IE1zU21vb3RoQ2VydGlmaWNhdGVNb2RlO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBJSVMgc2VydmVyIGlmIHRoZSBjb25uZWN0aW9uIGlzIGxvc3QuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbD86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIE1pY3Jvc29mdCBTbW9vdGggY2hhbm5lbCBJRCB0aGF0IGlzIHNlbnQgdG8gdGhlIElJUyBzZXJ2ZXIuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBldmVudElkPzogc3RyaW5nO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gc2VuZCBhIGNoYW5uZWwgSUQgdG8gdGhlIElJUyBzZXJ2ZXIuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBldmVudElkTW9kZT86IE1zU21vb3RoRXZlbnRJZE1vZGU7XG4gIC8qKlxuICAgKiBXaGVuIHNldCB0byBTRU5EX0VPUywgc2VuZHMgYW4gRU9TIHNpZ25hbCB0byBhbiBJSVMgc2VydmVyIHdoZW4gc3RvcHBpbmcgdGhlIGNoYW5uZWwuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBldmVudFN0b3BCZWhhdmlvcj86IE1zU21vb3RoRXZlbnRTdG9wQmVoYXZpb3I7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSwgaW4gc2Vjb25kcywgb2YgdGhlIGZpbGUgY2FjaGUgZm9yIHN0cmVhbWluZyBvdXRwdXRzLlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZWNhY2hlRHVyYXRpb24/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBsZW5ndGgsIGluIHNlY29uZHMsIG9mIG1wNCBmcmFnbWVudHMgdG8gZ2VuZXJhdGUuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBmcmFnbWVudExlbmd0aD86IER1cmF0aW9uO1xuICAvKipcbiAgICogQSBwYXJhbWV0ZXIgdGhhdCBjb250cm9scyBvdXRwdXQgZ3JvdXAgYmVoYXZpb3Igb24gYW4gaW5wdXQgbG9zcy5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TG9zc0FjdGlvbj86IE1zU21vb3RoSW5wdXRMb3NzQWN0aW9uO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByZXRyeSBhdHRlbXB0cy5cbiAgICogQGRlZmF1bHQgMTBcbiAgICovXG4gIHJlYWRvbmx5IG51bVJldHJpZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIGluaXRpYXRpbmcgYSByZXN0YXJ0IGR1ZSB0byBvdXRwdXQgZmFpbHVyZS5cbiAgICogQGRlZmF1bHQgLSBEdXJhdGlvbi5zZWNvbmRzKDEpXG4gICAqL1xuICByZWFkb25seSByZXN0YXJ0RGVsYXk/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBzZWdtZW50YXRpb24gbW9kZS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnRhdGlvbk1vZGU/OiBNc1Ntb290aFNlZ21lbnRhdGlvbk1vZGU7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSB0aGUgb3V0cHV0IGZyb20gdGhlIHNlY29uZCBwaXBlbGluZS5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IHNlbmREZWxheU1zPzogbnVtYmVyO1xuICAvKipcbiAgICogSWYgc2V0IHRvIFNDVEVfMzUsIHVzZXMgaW5jb21pbmcgU0NURS0zNSBtZXNzYWdlcyB0byBnZW5lcmF0ZSBhIHNwYXJzZSB0cmFjay5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IHNwYXJzZVRyYWNrVHlwZT86IE1zU21vb3RoU3BhcnNlVHJhY2tUeXBlO1xuICAvKipcbiAgICogV2hlbiBzZXQgdG8gU0VORCwgc2VuZHMgYSBzdHJlYW0gbWFuaWZlc3Qgc28gdGhhdCB0aGUgcHVibGlzaGluZyBwb2ludCBkb2Vzbid0IHN0YXJ0IHVudGlsIGFsbCBzdHJlYW1zIHN0YXJ0LlxuICAgKiBAZGVmYXVsdCAtIHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgc3RyZWFtTWFuaWZlc3RCZWhhdmlvcj86IE1zU21vb3RoU3RyZWFtTWFuaWZlc3RCZWhhdmlvcjtcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2Zmc2V0IGZvciB0aGUgY2hhbm5lbC4gVXNlZCBvbmx5IGlmIHRpbWVzdGFtcE9mZnNldE1vZGUgaXMgc2V0IHRvIFVTRV9DT05GSUdVUkVEX09GRlNFVC5cbiAgICogQGRlZmF1bHQgLSBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVzdGFtcE9mZnNldD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRpbWVzdGFtcCBkYXRlIG9mZnNldCB0byB1c2UuXG4gICAqIEBkZWZhdWx0IC0gc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSB0aW1lc3RhbXBPZmZzZXRNb2RlPzogTXNTbW9vdGhUaW1lc3RhbXBPZmZzZXRNb2RlO1xuICAvKipcbiAgICogVGhlIG91dHB1dHMgZm9yIHRoaXMgTVMgU21vb3RoIG91dHB1dCBncm91cC5cbiAgICogQGRlZmF1bHQgLSBubyBpbml0aWFsIG91dHB1dHNcbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dHM/OiBNc1Ntb290aE91dHB1dERlZmluaXRpb25bXTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBzdWJjbGFzc2VzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBNZWRpYVBhY2thZ2VWMk91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBNZWRpYVBhY2thZ2VWMk91dHB1dEdyb3VwQmFzZVByb3BzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0b0NoYW5uZWw/OiBJTWVkaWFQYWNrYWdlVjJDaGFubmVsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXhwbGljaXREZXN0aW5hdGlvbnM/OiBNZWRpYVBhY2thZ2VWMkRlc3RpbmF0aW9uW10sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fbmFtZSA9IHByb3BzLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHByaW1hcnkgZGVzdGluYXRpb25zLiBGb3IgdGhlIGF1dG8gdmFyaWFudCB0aGV5IGFyZSBkZXJpdmVkIGZyb20gdGhlIGNoYW5uZWwgY2xhc3NcbiAgICogKG9uZSBwZXIgcGlwZWxpbmUsIGVhY2ggd2l0aCBpdHMgZW5kcG9pbnQpOyBmb3IgdGhlIGN1c3RvbSB2YXJpYW50IHRoZXkgYXJlIHVzZXItc3VwcGxpZWQuXG4gICAqL1xuICBwcml2YXRlIHByaW1hcnlEZXN0aW5hdGlvbnMoY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBNZWRpYVBhY2thZ2VWMkRlc3RpbmF0aW9uW10ge1xuICAgIGlmICh0aGlzLmF1dG9DaGFubmVsKSB7XG4gICAgICByZXR1cm4gY2hhbm5lbENsYXNzID09PSAnU1RBTkRBUkQnXG4gICAgICAgID8gW1xuICAgICAgICAgIE1lZGlhUGFja2FnZVYyRGVzdGluYXRpb24uY2hhbm5lbCh0aGlzLmF1dG9DaGFubmVsLCBNZWRpYVBhY2thZ2VWMkVuZHBvaW50SWQuRU5EUE9JTlRfMSksXG4gICAgICAgICAgTWVkaWFQYWNrYWdlVjJEZXN0aW5hdGlvbi5jaGFubmVsKHRoaXMuYXV0b0NoYW5uZWwsIE1lZGlhUGFja2FnZVYyRW5kcG9pbnRJZC5FTkRQT0lOVF8yKSxcbiAgICAgICAgXVxuICAgICAgICA6IFtNZWRpYVBhY2thZ2VWMkRlc3RpbmF0aW9uLmNoYW5uZWwodGhpcy5hdXRvQ2hhbm5lbCwgTWVkaWFQYWNrYWdlVjJFbmRwb2ludElkLkVORFBPSU5UXzEpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhwbGljaXREZXN0aW5hdGlvbnMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgX2NyZWF0ZUluaXRpYWxPdXRwdXRzKCk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5vdXRwdXRzLm1hcChkZWYgPT4gbmV3IE1lZGlhUGFja2FnZVYyT3V0cHV0KGRlZiwgdGhpcy5fbmFtZSkpO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgY29uc3QgYWRkaXRpb25hbCA9IHRoaXMucHJvcHMuYWRkaXRpb25hbERlc3RpbmF0aW9ucyA/PyBbXTtcbiAgICByZXR1cm4ge1xuICAgICAgbWVkaWFQYWNrYWdlR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSB9LFxuICAgICAgICBtZWRpYXBhY2thZ2VWMkdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgICBhZGRpdGlvbmFsRGVzdGluYXRpb25zOiBhZGRpdGlvbmFsLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gYWRkaXRpb25hbC5tYXAoKF9kZXN0LCBpKSA9PiAoe1xuICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiBgJHt0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKX0tYWRkaXRpb25hbC0ke2l9YCB9LFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzZWdtZW50TGVuZ3RoOiB0aGlzLnByb3BzLnNlZ21lbnQ/Ll9sZW5ndGgoKSA/PyAxLFxuICAgICAgICAgIHNlZ21lbnRMZW5ndGhVbml0czogdGhpcy5wcm9wcy5zZWdtZW50Py5fdW5pdHMoKSA/PyBTZWdtZW50TGVuZ3RoVW5pdHMuU0VDT05EUyxcbiAgICAgICAgICBpZDNCZWhhdmlvcjogKHRoaXMucHJvcHMuaWQzQmVoYXZpb3IgPz8gSWQzQmVoYXZpb3IuRElTQUJMRUQpLnZhbHVlLFxuICAgICAgICAgIGtsdkJlaGF2aW9yOiAodGhpcy5wcm9wcy5rbHZCZWhhdmlvciA/PyBLbHZCZWhhdmlvci5OT19QQVNTVEhST1VHSCkudmFsdWUsXG4gICAgICAgICAgbmllbHNlbklkM0JlaGF2aW9yOiAodGhpcy5wcm9wcy5uaWVsc2VuSWQzQmVoYXZpb3IgPz8gTmllbHNlbklkM0JlaGF2aW9yLk5PX1BBU1NUSFJPVUdIKS52YWx1ZSxcbiAgICAgICAgICBzY3RlMzVUeXBlOiAodGhpcy5wcm9wcy5zY3RlMzVUeXBlID8/IFNjdGUzNVR5cGUuU0NURV8zNV9XSVRIT1VUX1NFR01FTlRBVElPTikudmFsdWUsXG4gICAgICAgICAgdGltZWRNZXRhZGF0YUlkM0ZyYW1lOiAodGhpcy5wcm9wcy50aW1lZE1ldGFkYXRhSWQzRnJhbWUgPz8gVGltZWRNZXRhZGF0YUlkM0ZyYW1lLk5PTkUpLnZhbHVlLFxuICAgICAgICAgIHRpbWVkTWV0YWRhdGFJZDNQZXJpb2Q6IHRoaXMucHJvcHMudGltZWRNZXRhZGF0YUlkM1BlcmlvZD8udG9TZWNvbmRzKCkgPz8gMTAsXG4gICAgICAgICAgdGltZWRNZXRhZGF0YVBhc3N0aHJvdWdoOiAodGhpcy5wcm9wcy50aW1lZE1ldGFkYXRhUGFzc3Rocm91Z2ggPz8gVGltZWRNZXRhZGF0YVBhc3N0aHJvdWdoLkRJU0FCTEVEKS52YWx1ZSxcbiAgICAgICAgICBjYXB0aW9uTGFuZ3VhZ2VNYXBwaW5nczogdGhpcy5wcm9wcy5jYXB0aW9uTGFuZ3VhZ2VNYXBwaW5ncyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihfY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgY29uc3QgYWRkaXRpb25hbCA9IHRoaXMucHJvcHMuYWRkaXRpb25hbERlc3RpbmF0aW9ucyA/PyBbXTtcbiAgICBjb25zdCBwcmltYXJpZXMgPSB0aGlzLnByaW1hcnlEZXN0aW5hdGlvbnMoX2NoYW5uZWxDbGFzcyk7XG4gICAgLy8gRm9yIHRoZSBhdXRvIHZhcmlhbnQgdGhlIHByaW1hcnkgY291bnQgaXMgY29ycmVjdCBieSBjb25zdHJ1Y3Rpb247IGZvciB0aGUgY3VzdG9tIHZhcmlhbnRcbiAgICAvLyB0aGlzIGVuZm9yY2VzIHRoZSBwZXItcGlwZWxpbmUgY291bnQgdGhlIHVzZXIgc3VwcGxpZWQuXG4gICAgdmFsaWRhdGVEZXN0aW5hdGlvbkNvdW50KHRoaXMuX25hbWUsIF9jaGFubmVsQ2xhc3MsIHByaW1hcmllcy5sZW5ndGgsIGFkZGl0aW9uYWwubGVuZ3RoLCB0cnVlKTtcblxuICAgIC8vIFByaW1hcnkgZGVzdGluYXRpb25zIHNoYXJlIHRoZSBvdXRwdXQgZ3JvdXAncyBkZXN0aW5hdGlvbiBJRFxuICAgIGNvbnN0IHByaW1hcnlTZXR0aW5nczogQ2ZuQ2hhbm5lbC5NZWRpYVBhY2thZ2VPdXRwdXREZXN0aW5hdGlvblNldHRpbmdzUHJvcGVydHlbXSA9XG4gICAgICBwcmltYXJpZXMubWFwKGRlc3QgPT4gZGVzdC5fYmluZCgpKTtcbiAgICBjb25zdCByZXN1bHQ6IENmbkNoYW5uZWwuT3V0cHV0RGVzdGluYXRpb25Qcm9wZXJ0eVtdID0gW1xuICAgICAgeyBpZDogdG9EZXN0aW5hdGlvbklkKHRoaXMucHJvcHMubmFtZSksIG1lZGlhUGFja2FnZVNldHRpbmdzOiBwcmltYXJ5U2V0dGluZ3MgfSxcbiAgICBdO1xuXG4gICAgLy8gRWFjaCBhZGRpdGlvbmFsIGRlc3RpbmF0aW9uIGlzIGEgc2VwYXJhdGUgdG9wLWxldmVsIERlc3RpbmF0aW9ucyBlbnRyeVxuICAgIGFkZGl0aW9uYWwuZm9yRWFjaCgoZGVzdCwgaSkgPT4ge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBpZDogYCR7dG9EZXN0aW5hdGlvbklkKHRoaXMucHJvcHMubmFtZSl9LWFkZGl0aW9uYWwtJHtpfWAsXG4gICAgICAgIG1lZGlhUGFja2FnZVNldHRpbmdzOiBbZGVzdC5fYmluZCgpXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgX2dyYW50UGVybWlzc2lvbnMocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICBjb25zdCBwcmltYXJpZXMgPSB0aGlzLmF1dG9DaGFubmVsXG4gICAgICA/IFtNZWRpYVBhY2thZ2VWMkRlc3RpbmF0aW9uLmNoYW5uZWwodGhpcy5hdXRvQ2hhbm5lbCldXG4gICAgICA6ICh0aGlzLmV4cGxpY2l0RGVzdGluYXRpb25zID8/IFtdKTtcbiAgICBbLi4ucHJpbWFyaWVzLCAuLi4odGhpcy5wcm9wcy5hZGRpdGlvbmFsRGVzdGluYXRpb25zID8/IFtdKV0uZm9yRWFjaChkID0+IGQuX2dyYW50UGVybWlzc2lvbnMocm9sZSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIE1lZGlhQ29ubmVjdFJvdXRlck91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBNZWRpYUNvbm5lY3RSb3V0ZXJPdXRwdXRHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9uYW1lID0gcHJvcHMubmFtZTtcbiAgICBpZiAocHJvcHMub3V0cHV0cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBNZWRpYUNvbm5lY3RSb3V0ZXJTaW5nbGVPdXRwdXRgLFxuICAgICAgICBgTWVkaWFDb25uZWN0IFJvdXRlciBvdXRwdXQgZ3JvdXAgJyR7cHJvcHMubmFtZX0nIG1heSBjb250YWluIGF0IG1vc3Qgb25lIG91dHB1dCwgYnV0ICR7cHJvcHMub3V0cHV0cy5sZW5ndGh9IHdlcmUgcHJvdmlkZWRgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgX2NyZWF0ZUluaXRpYWxPdXRwdXRzKCk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5vdXRwdXRzLm1hcChkZWYgPT4gbmV3IE1lZGlhQ29ubmVjdFJvdXRlck91dHB1dChkZWYsIHRoaXMuX25hbWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lZGlhQ29ubmVjdFJvdXRlckdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZXM6IHRoaXMucHJvcHMuYXZhaWxhYmlsaXR5Wm9uZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihjaGFubmVsQ2xhc3M6IHN0cmluZyk6IENmbkNoYW5uZWwuT3V0cHV0RGVzdGluYXRpb25Qcm9wZXJ0eVtdIHtcbiAgICBjb25zdCBwaXBlbGluZUNvdW50ID0gY2hhbm5lbENsYXNzID09PSAnU1RBTkRBUkQnID8gMiA6IDE7XG4gICAgY29uc3QgYXpDb3VudCA9IHRoaXMucHJvcHMuYXZhaWxhYmlsaXR5Wm9uZXMubGVuZ3RoO1xuICAgIGlmIChhekNvdW50ICE9PSBwaXBlbGluZUNvdW50KSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBNZWRpYUNvbm5lY3RSb3V0ZXJBdmFpbGFiaWxpdHlab25lc2AsXG4gICAgICAgIGBNZWRpYUNvbm5lY3QgUm91dGVyIG91dHB1dCBncm91cCAnJHt0aGlzLl9uYW1lfScgcmVxdWlyZXMgZXhhY3RseSAke3BpcGVsaW5lQ291bnR9IGF2YWlsYWJpbGl0eVpvbmUocylgXG4gICAgICAgICsgYCBmb3IgYSAke2NoYW5uZWxDbGFzc30gY2hhbm5lbCwgYnV0ICR7YXpDb3VudH0gcHJvdmlkZWRgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnByb3BzLnJvdXRlclNldHRpbmdzID8/IE1lZGlhQ29ubmVjdFJvdXRlclNldHRpbmdzLnNoYXJlZCgpO1xuICAgIHJldHVybiBbXG4gICAgICB7IGlkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5fbmFtZSksIG1lZGlhQ29ubmVjdFJvdXRlclNldHRpbmdzOiBzZXR0aW5ncy5fYmluZChwaXBlbGluZUNvdW50KSB9LFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgX2dyYW50UGVybWlzc2lvbnMocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BzLnJvdXRlclNldHRpbmdzPy5fc2VjcmV0cygpLmZvckVhY2goc2VjcmV0ID0+IHNlY3JldC5ncmFudFJlYWQocm9sZSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIEhsc091dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGVwb2NoTG9ja2luZyA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBIbHNPdXRwdXRHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9uYW1lID0gcHJvcHMubmFtZTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgX3NldEVwb2NoTG9ja2luZyhhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmVwb2NoTG9ja2luZyA9IGFjdGl2ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgcHJvZ3JhbSBkYXRlIHRpbWUgY2xvY2suIEVwb2NoIG91dHB1dCBsb2NraW5nIHJlcXVpcmVzXG4gICAqIElOSVRJQUxJWkVfRlJPTV9PVVRQVVRfVElNRUNPREU7IG90aGVyd2lzZSBTWVNURU1fQ0xPQ0suXG4gICAqL1xuICBwcml2YXRlIF9kZWZhdWx0UHJvZ3JhbURhdGVUaW1lQ2xvY2soKTogSGxzUHJvZ3JhbURhdGVUaW1lQ2xvY2sge1xuICAgIHJldHVybiB0aGlzLmVwb2NoTG9ja2luZ1xuICAgICAgPyBIbHNQcm9ncmFtRGF0ZVRpbWVDbG9jay5JTklUSUFMSVpFX0ZST01fT1VUUFVUX1RJTUVDT0RFXG4gICAgICA6IEhsc1Byb2dyYW1EYXRlVGltZUNsb2NrLlNZU1RFTV9DTE9DSztcbiAgfVxuICAvKiogV2hldGhlciB0aGUgdXNlciBleHBsaWNpdGx5IHNldCBhbiBpbmNvbXBhdGlibGUgU1lTVEVNX0NMT0NLIHByb2dyYW0tZGF0ZS10aW1lIGNsb2NrLiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9oYXNFeHBsaWNpdFN5c3RlbUNsb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnByb2dyYW1EYXRlVGltZUNsb2NrPy52YWx1ZSA9PT0gSGxzUHJvZ3JhbURhdGVUaW1lQ2xvY2suU1lTVEVNX0NMT0NLLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBfY3JlYXRlSW5pdGlhbE91dHB1dHMoKTogT3V0cHV0W10ge1xuICAgIHJldHVybiAodGhpcy5wcm9wcy5vdXRwdXRzID8/IFtdKS5tYXAoZGVmID0+IG5ldyBIbHNPdXRwdXQoZGVmKSk7XG4gIH1cbiAgcHVibGljIF9iaW5kKCk6IENmbkNoYW5uZWwuT3V0cHV0R3JvdXBTZXR0aW5nc1Byb3BlcnR5IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGxzR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSB9LFxuICAgICAgICBzZWdtZW50TGVuZ3RoOiB0aGlzLnByb3BzLnNlZ21lbnQ/Ll90b1NlY29uZHMoKSA/PyAyLFxuICAgICAgICBrZWVwU2VnbWVudHM6IHRoaXMucHJvcHMua2VlcFNlZ21lbnRzID8/IDIxLFxuICAgICAgICBpbmRleE5TZWdtZW50czogdGhpcy5wcm9wcy5pbmRleE5TZWdtZW50cyA/PyAxMCxcbiAgICAgICAgbW9kZTogKHRoaXMucHJvcHMubW9kZSA/PyBIbHNNb2RlLkxJVkUpLnZhbHVlLFxuICAgICAgICBtaW5TZWdtZW50TGVuZ3RoOiB0aGlzLnByb3BzLm1pblNlZ21lbnQ/Ll90b1NlY29uZHMoKSxcbiAgICAgICAgaW5wdXRMb3NzQWN0aW9uOiAodGhpcy5wcm9wcy5pbnB1dExvc3NBY3Rpb24gPz8gSGxzSW5wdXRMb3NzQWN0aW9uLkVNSVRfT1VUUFVUKS52YWx1ZSxcbiAgICAgICAgYWRNYXJrZXJzOiB0aGlzLnByb3BzLmFkTWFya2Vycz8ubWFwKG0gPT4gbS52YWx1ZSksXG4gICAgICAgIGJhc2VVcmxDb250ZW50OiB0aGlzLnByb3BzLmJhc2VVcmxDb250ZW50LFxuICAgICAgICBiYXNlVXJsQ29udGVudDE6IHRoaXMucHJvcHMuYmFzZVVybENvbnRlbnQxLFxuICAgICAgICBiYXNlVXJsTWFuaWZlc3Q6IHRoaXMucHJvcHMuYmFzZVVybE1hbmlmZXN0LFxuICAgICAgICBiYXNlVXJsTWFuaWZlc3QxOiB0aGlzLnByb3BzLmJhc2VVcmxNYW5pZmVzdDEsXG4gICAgICAgIGNhcHRpb25MYW5ndWFnZU1hcHBpbmdzOiB0aGlzLnByb3BzLmNhcHRpb25MYW5ndWFnZU1hcHBpbmdzLFxuICAgICAgICBjYXB0aW9uTGFuZ3VhZ2VTZXR0aW5nOiB0aGlzLnByb3BzLmNhcHRpb25MYW5ndWFnZVNldHRpbmc/LnZhbHVlLFxuICAgICAgICBjbGllbnRDYWNoZTogKHRoaXMucHJvcHMuY2xpZW50Q2FjaGUgPz8gSGxzQ2xpZW50Q2FjaGUuRU5BQkxFRCkudmFsdWUsXG4gICAgICAgIGNvZGVjU3BlY2lmaWNhdGlvbjogKHRoaXMucHJvcHMuY29kZWNTcGVjaWZpY2F0aW9uID8/IEhsc0NvZGVjU3BlY2lmaWNhdGlvbi5SRkNfNDI4MSkudmFsdWUsXG4gICAgICAgIGNvbnN0YW50SXY6IHRoaXMucHJvcHMuY29uc3RhbnRJdixcbiAgICAgICAgZGlyZWN0b3J5U3RydWN0dXJlOiAodGhpcy5wcm9wcy5kaXJlY3RvcnlTdHJ1Y3R1cmUgPz8gSGxzRGlyZWN0b3J5U3RydWN0dXJlLlNJTkdMRV9ESVJFQ1RPUlkpLnZhbHVlLFxuICAgICAgICBkaXNjb250aW51aXR5VGFnczogKHRoaXMucHJvcHMuZGlzY29udGludWl0eVRhZ3MgPz8gSGxzRGlzY29udGludWl0eVRhZ3MuSU5TRVJUKS52YWx1ZSxcbiAgICAgICAgZW5jcnlwdGlvblR5cGU6IHRoaXMucHJvcHMuZW5jcnlwdGlvblR5cGU/LnZhbHVlLFxuICAgICAgICBobHNDZG5TZXR0aW5nczogdGhpcy5wcm9wcy5obHNDZG5TZXR0aW5ncz8uX2JpbmQoKSxcbiAgICAgICAgaGxzSWQzU2VnbWVudFRhZ2dpbmc6ICh0aGlzLnByb3BzLmhsc0lkM1NlZ21lbnRUYWdnaW5nID8/IEhsc0lkM1NlZ21lbnRUYWdnaW5nU3RhdGUuRElTQUJMRUQpLnZhbHVlLFxuICAgICAgICBpRnJhbWVPbmx5UGxheWxpc3RzOiAodGhpcy5wcm9wcy5pRnJhbWVPbmx5UGxheWxpc3RzID8/IEhsc0lGcmFtZU9ubHlQbGF5bGlzdHMuRElTQUJMRUQpLnZhbHVlLFxuICAgICAgICBpbmNvbXBsZXRlU2VnbWVudEJlaGF2aW9yOiAodGhpcy5wcm9wcy5pbmNvbXBsZXRlU2VnbWVudEJlaGF2aW9yID8/IEhsc0luY29tcGxldGVTZWdtZW50QmVoYXZpb3IuQVVUTykudmFsdWUsXG4gICAgICAgIGl2SW5NYW5pZmVzdDogdGhpcy5wcm9wcy5pdkluTWFuaWZlc3Q/LnZhbHVlLFxuICAgICAgICBpdlNvdXJjZTogdGhpcy5wcm9wcy5pdlNvdXJjZT8udmFsdWUsXG4gICAgICAgIGtleUZvcm1hdDogdGhpcy5wcm9wcy5rZXlGb3JtYXQsXG4gICAgICAgIGtleUZvcm1hdFZlcnNpb25zOiB0aGlzLnByb3BzLmtleUZvcm1hdFZlcnNpb25zLFxuICAgICAgICBrZXlQcm92aWRlclNldHRpbmdzOiB0aGlzLnByb3BzLmtleVByb3ZpZGVyU2V0dGluZ3M/Ll9iaW5kKCksXG4gICAgICAgIG1hbmlmZXN0Q29tcHJlc3Npb246ICh0aGlzLnByb3BzLm1hbmlmZXN0Q29tcHJlc3Npb24gPz8gSGxzTWFuaWZlc3RDb21wcmVzc2lvbi5OT05FKS52YWx1ZSxcbiAgICAgICAgbWFuaWZlc3REdXJhdGlvbkZvcm1hdDogKHRoaXMucHJvcHMubWFuaWZlc3REdXJhdGlvbkZvcm1hdCA/PyBIbHNNYW5pZmVzdER1cmF0aW9uRm9ybWF0LkZMT0FUSU5HX1BPSU5UKS52YWx1ZSxcbiAgICAgICAgb3V0cHV0U2VsZWN0aW9uOiAodGhpcy5wcm9wcy5vdXRwdXRTZWxlY3Rpb24gPz8gSGxzT3V0cHV0U2VsZWN0aW9uLk1BTklGRVNUU19BTkRfU0VHTUVOVFMpLnZhbHVlLFxuICAgICAgICBwcm9ncmFtRGF0ZVRpbWU6ICh0aGlzLnByb3BzLnByb2dyYW1EYXRlVGltZSA/PyBIbHNQcm9ncmFtRGF0ZVRpbWUuSU5DTFVERSkudmFsdWUsXG4gICAgICAgIHByb2dyYW1EYXRlVGltZUNsb2NrOiAodGhpcy5wcm9wcy5wcm9ncmFtRGF0ZVRpbWVDbG9jayA/PyB0aGlzLl9kZWZhdWx0UHJvZ3JhbURhdGVUaW1lQ2xvY2soKSkudmFsdWUsXG4gICAgICAgIHByb2dyYW1EYXRlVGltZVBlcmlvZDogdGhpcy5wcm9wcy5wcm9ncmFtRGF0ZVRpbWVQZXJpb2Q/LnRvU2Vjb25kcygpID8/IDYwMCxcbiAgICAgICAgcmVkdW5kYW50TWFuaWZlc3Q6ICh0aGlzLnByb3BzLnJlZHVuZGFudE1hbmlmZXN0ID8/IEhsc1JlZHVuZGFudE1hbmlmZXN0LkRJU0FCTEVEKS52YWx1ZSxcbiAgICAgICAgc2VnbWVudGF0aW9uTW9kZTogKHRoaXMucHJvcHMuc2VnbWVudGF0aW9uTW9kZSA/PyBIbHNTZWdtZW50YXRpb25Nb2RlLlVTRV9TRUdNRU5UX0RVUkFUSU9OKS52YWx1ZSxcbiAgICAgICAgc2VnbWVudHNQZXJTdWJkaXJlY3Rvcnk6IHRoaXMucHJvcHMuc2VnbWVudHNQZXJTdWJkaXJlY3RvcnkgPz8gMTBfMDAwLFxuICAgICAgICBzdHJlYW1JbmZSZXNvbHV0aW9uOiAodGhpcy5wcm9wcy5zdHJlYW1JbmZSZXNvbHV0aW9uID8/IEhsc1N0cmVhbUluZlJlc29sdXRpb24uSU5DTFVERSkudmFsdWUsXG4gICAgICAgIHRpbWVkTWV0YWRhdGFJZDNGcmFtZTogKHRoaXMucHJvcHMudGltZWRNZXRhZGF0YUlkM0ZyYW1lID8/IEhsc1RpbWVkTWV0YWRhdGFJZDNGcmFtZS5QUklWKS52YWx1ZSxcbiAgICAgICAgdGltZWRNZXRhZGF0YUlkM1BlcmlvZDogdGhpcy5wcm9wcy50aW1lZE1ldGFkYXRhSWQzUGVyaW9kPy50b1NlY29uZHMoKSA/PyAxMCxcbiAgICAgICAgdGltZXN0YW1wRGVsdGFNaWxsaXNlY29uZHM6IHRoaXMucHJvcHMudGltZXN0YW1wRGVsdGE/LnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICAgIHRzRmlsZU1vZGU6ICh0aGlzLnByb3BzLnRzRmlsZU1vZGUgPz8gSGxzVHNGaWxlTW9kZS5TRUdNRU5URURfRklMRVMpLnZhbHVlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBfYmluZERlc3RpbmF0aW9uKF9jaGFubmVsQ2xhc3M6IHN0cmluZyk6IENmbkNoYW5uZWwuT3V0cHV0RGVzdGluYXRpb25Qcm9wZXJ0eVtdIHtcbiAgICB2YWxpZGF0ZURlc3RpbmF0aW9uQ291bnQodGhpcy5fbmFtZSwgX2NoYW5uZWxDbGFzcywgdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMubGVuZ3RoLCAwLCBmYWxzZSk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5tYXAoZCA9PiB7XG4gICAgICBjb25zdCBib3VuZCA9IGQuX2JpbmQoKTtcbiAgICAgIGlmIChib3VuZC51cmwgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChib3VuZC51cmwpICYmIGJvdW5kLnVybC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgSGxzRGVzdGluYXRpb25UcmFpbGluZ1NsYXNoYCxcbiAgICAgICAgICBgSExTIG91dHB1dCBncm91cCAnJHt0aGlzLl9uYW1lfScgZGVzdGluYXRpb24gVVJMIG11c3QgYmUgYSBmaWxlIHByZWZpeCwgbm90IGEgZm9sZGVyIChnb3QgJyR7Ym91bmQudXJsfScpLiBSZW1vdmUgdGhlIHRyYWlsaW5nIHNsYXNoLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBBbiBodHRwcyBkZXN0aW5hdGlvbiBwdXNoZXMgdG8gYSBDRE4vd2ViIHNlcnZlciwgd2hpY2ggcmVxdWlyZXMgaGxzQ2RuU2V0dGluZ3MuXG4gICAgICBpZiAoYm91bmQudXJsICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoYm91bmQudXJsKSAmJiBib3VuZC51cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKVxuICAgICAgICAmJiB0aGlzLnByb3BzLmhsc0NkblNldHRpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBIbHNIdHRwc0Rlc3RpbmF0aW9uUmVxdWlyZXNDZG5TZXR0aW5nc2AsXG4gICAgICAgICAgYEhMUyBvdXRwdXQgZ3JvdXAgJyR7dGhpcy5fbmFtZX0nIHVzZXMgYW4gaHR0cHMgZGVzdGluYXRpb24gVVJMLCB3aGljaCByZXF1aXJlcyBobHNDZG5TZXR0aW5ncyB0byBiZSBzZXQgKGUuZy4gSGxzQ2RuU2V0dGluZ3MuYmFzaWNQdXQoKSwgLmFrYW1haSgpLCBvciAud2ViZGF2KCkpLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYm91bmQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFt7IGlkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSwgc2V0dGluZ3MgfV07XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMuZm9yRWFjaChkID0+IGQuX2dyYW50UGVybWlzc2lvbnMocm9sZSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFVkcE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBVZHBPdXRwdXRHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9uYW1lID0gcHJvcHMubmFtZTtcbiAgfVxuICBwdWJsaWMgX2NyZWF0ZUluaXRpYWxPdXRwdXRzKCk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gKHRoaXMucHJvcHMub3V0cHV0cyA/PyBbXSkubWFwKGRlZiA9PiBuZXcgVWRwT3V0cHV0KGRlZiwgdGhpcy5wcm9wcykpO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVkcEdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgaW5wdXRMb3NzQWN0aW9uOiAodGhpcy5wcm9wcy5pbnB1dExvc3NBY3Rpb24gPz8gVWRwSW5wdXRMb3NzQWN0aW9uLkVNSVRfUFJPR1JBTSkudmFsdWUsXG4gICAgICAgIHRpbWVkTWV0YWRhdGFJZDNGcmFtZTogKHRoaXMucHJvcHMudGltZWRNZXRhZGF0YUlkM0ZyYW1lID8/IFVkcFRpbWVkTWV0YWRhdGFJZDNGcmFtZS5QUklWKS52YWx1ZSxcbiAgICAgICAgdGltZWRNZXRhZGF0YUlkM1BlcmlvZDogdGhpcy5wcm9wcy50aW1lZE1ldGFkYXRhSWQzUGVyaW9kPy50b1NlY29uZHMoKSA/PyAxMCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihfY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgdmFsaWRhdGVEZXN0aW5hdGlvbkNvdW50KHRoaXMuX25hbWUsIF9jaGFubmVsQ2xhc3MsIHRoaXMucHJvcHMuZGVzdGluYXRpb25zLmxlbmd0aCwgMCwgZmFsc2UpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMubWFwKGQgPT4gZC5fYmluZCgpKTtcbiAgICByZXR1cm4gW3sgaWQ6IHRvRGVzdGluYXRpb25JZCh0aGlzLnByb3BzLm5hbWUpLCBzZXR0aW5ncyB9XTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgX2dyYW50UGVybWlzc2lvbnMocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5mb3JFYWNoKGQgPT4gZC5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSk7XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgQXJjaGl2ZU91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBBcmNoaXZlT3V0cHV0R3JvdXBQcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fbmFtZSA9IHByb3BzLm5hbWU7XG4gICAgLy8gQW4gYXJjaGl2ZSBncm91cCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIG91dHB1dCB3aXRoIGEgdmlkZW8gZW5jb2RlIChyYXctY29udGFpbmVyXG4gICAgLy8gb3V0cHV0cyBhcmUgYXVkaW8tb25seSwgc28gYSBncm91cCBvZiBvbmx5IHJhdyBvdXRwdXRzIGlzIHJlamVjdGVkIGJ5IHRoZSBzZXJ2aWNlKS5cbiAgICBjb25zdCBvdXRwdXRzID0gcHJvcHMub3V0cHV0cyA/PyBbXTtcbiAgICBpZiAob3V0cHV0cy5sZW5ndGggPiAwICYmICFvdXRwdXRzLnNvbWUobyA9PiBvLmVuY29kZXMuc29tZShlID0+IGUuX2JpbmRWaWRlbygpICE9PSB1bmRlZmluZWQpKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgQXJjaGl2ZUdyb3VwUmVxdWlyZXNWaWRlb2AsXG4gICAgICAgIGBBcmNoaXZlIG91dHB1dCBncm91cCAnJHtwcm9wcy5uYW1lfScgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBvdXRwdXQgd2l0aCBhIHZpZGVvIGVuY29kZWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgX2NyZWF0ZUluaXRpYWxPdXRwdXRzKCk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gKHRoaXMucHJvcHMub3V0cHV0cyA/PyBbXSkubWFwKGRlZiA9PiBuZXcgQXJjaGl2ZU91dHB1dChkZWYpKTtcbiAgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5PdXRwdXRHcm91cFNldHRpbmdzUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBhcmNoaXZlR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSB9LFxuICAgICAgICByb2xsb3ZlckludGVydmFsOiB0aGlzLnByb3BzLnJvbGxvdmVySW50ZXJ2YWw/LnRvU2Vjb25kcygpID8/IDMwMCxcbiAgICAgICAgYXJjaGl2ZUNkblNldHRpbmdzOiB0aGlzLnByb3BzLmFyY2hpdmVTM0Nhbm5lZEFjbCA/IHtcbiAgICAgICAgICBhcmNoaXZlUzNTZXR0aW5nczogeyBjYW5uZWRBY2w6IHRoaXMucHJvcHMuYXJjaGl2ZVMzQ2FubmVkQWNsLnZhbHVlIH0sXG4gICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcHVibGljIF9iaW5kRGVzdGluYXRpb24oX2NoYW5uZWxDbGFzczogc3RyaW5nKTogQ2ZuQ2hhbm5lbC5PdXRwdXREZXN0aW5hdGlvblByb3BlcnR5W10ge1xuICAgIHZhbGlkYXRlRGVzdGluYXRpb25Db3VudCh0aGlzLl9uYW1lLCBfY2hhbm5lbENsYXNzLCB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5sZW5ndGgsIDAsIGZhbHNlKTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMucHJvcHMuZGVzdGluYXRpb25zLm1hcChkID0+IGQuX2JpbmQoKSk7XG4gICAgcmV0dXJuIFt7IGlkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSwgc2V0dGluZ3MgfV07XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMuZm9yRWFjaChkID0+IGQuX2dyYW50UGVybWlzc2lvbnMocm9sZSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFJ0bXBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgX25hbWU6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogUnRtcE91dHB1dEdyb3VwUHJvcHMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX25hbWUgPSBwcm9wcy5uYW1lO1xuICB9XG4gIHB1YmxpYyBfY3JlYXRlSW5pdGlhbE91dHB1dHMoKTogT3V0cHV0W10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLm91dHB1dHMubWFwKGRlZiA9PiBuZXcgUnRtcE91dHB1dChkZWYsIHRoaXMuX25hbWUpKTtcbiAgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5PdXRwdXRHcm91cFNldHRpbmdzUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBydG1wR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBhdXRoZW50aWNhdGlvblNjaGVtZTogKHRoaXMucHJvcHMuYXV0aGVudGljYXRpb25TY2hlbWUgPz8gUnRtcEF1dGhlbnRpY2F0aW9uU2NoZW1lLkNPTU1PTikudmFsdWUsXG4gICAgICAgIHJlc3RhcnREZWxheTogdGhpcy5wcm9wcy5yZXN0YXJ0RGVsYXk/LnRvU2Vjb25kcygpID8/IDEsXG4gICAgICAgIGFkTWFya2VyczogdGhpcy5wcm9wcy5hZE1hcmtlcnM/Lm1hcChtID0+IG0udmFsdWUpLFxuICAgICAgICBjYWNoZUZ1bGxCZWhhdmlvcjogdGhpcy5wcm9wcy5jYWNoZUZ1bGxCZWhhdmlvcj8udmFsdWUsXG4gICAgICAgIGNhY2hlTGVuZ3RoOiB0aGlzLnByb3BzLmNhY2hlTGVuZ3RoPy50b1NlY29uZHMoKSxcbiAgICAgICAgY2FwdGlvbkRhdGE6IHRoaXMucHJvcHMuY2FwdGlvbkRhdGE/LnZhbHVlLFxuICAgICAgICBpbmNsdWRlRmlsbGVyTmFsVW5pdHM6IHRoaXMucHJvcHMuaW5jbHVkZUZpbGxlck5hbFVuaXRzPy52YWx1ZSxcbiAgICAgICAgaW5wdXRMb3NzQWN0aW9uOiB0aGlzLnByb3BzLmlucHV0TG9zc0FjdGlvbj8udmFsdWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcHVibGljIF9iaW5kRGVzdGluYXRpb24oY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBjaGFubmVsQ2xhc3MgPT09ICdTVEFOREFSRCcgPyAyIDogMTtcbiAgICBjb25zdCBzZWVuSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMub3V0cHV0cy5tYXAoKGRlZikgPT4ge1xuICAgICAgaWYgKGRlZi5kZXN0aW5hdGlvbnMubGVuZ3RoICE9PSBleHBlY3RlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFJ0bXBEZXN0aW5hdGlvbkNvdW50YCxcbiAgICAgICAgICBgUlRNUCBvdXRwdXQgJyR7ZGVmLm91dHB1dE5hbWV9JyBpbiBncm91cCAnJHt0aGlzLl9uYW1lfScgcmVxdWlyZXMgZXhhY3RseSAke2V4cGVjdGVkfSBkZXN0aW5hdGlvbihzKSAob25lIHBlciBwaXBlbGluZSkgZm9yIGEgJHtjaGFubmVsQ2xhc3N9IGNoYW5uZWwsIGdvdCAke2RlZi5kZXN0aW5hdGlvbnMubGVuZ3RofWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBpZCA9IHRvRGVzdGluYXRpb25JZChkZWYub3V0cHV0TmFtZSk7XG4gICAgICBpZiAoaWQgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUnRtcERlc3RpbmF0aW9uSWRFbXB0eWAsXG4gICAgICAgICAgYFJUTVAgb3V0cHV0IGluIGdyb3VwICcke3RoaXMuX25hbWV9JyBvdXRwdXROYW1lIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgYWxwaGFudW1lcmljIGNoYXJhY3RlcmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc2Vlbklkcy5oYXMoaWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUnRtcERlc3RpbmF0aW9uSWRDb2xsaXNpb25gLFxuICAgICAgICAgIGBSVE1QIG91dHB1dHMgaW4gZ3JvdXAgJyR7dGhpcy5fbmFtZX0nIHByb2R1Y2UgdGhlIHNhbWUgZGVzdGluYXRpb24gaWQgJyR7aWR9JyBhZnRlciBzYW5pdGlzaW5nIG91dHB1dCBuYW1lczsgcmVuYW1lIHRoZSBvdXRwdXRzIHNvIHRoZXkgZGlmZmVyIGJ5IG1vcmUgdGhhbiAnXycgdnMgJy0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHNlZW5JZHMuYWRkKGlkKTtcbiAgICAgIHJldHVybiB7IGlkLCBzZXR0aW5nczogZGVmLmRlc3RpbmF0aW9ucy5tYXAoZCA9PiBkLl9iaW5kKCkpIH07XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5wcm9wcy5vdXRwdXRzLmZvckVhY2gobyA9PiBvLmRlc3RpbmF0aW9ucy5mb3JFYWNoKGQgPT4gZC5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFNydE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vdXRwdXRzOiBTcnRPdXRwdXRbXTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogU3J0T3V0cHV0R3JvdXBQcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fbmFtZSA9IHByb3BzLm5hbWU7XG4gICAgdGhpcy5fb3V0cHV0cyA9IHByb3BzLm91dHB1dHMubWFwKGRlZiA9PiBuZXcgU3J0T3V0cHV0KGRlZiwgdGhpcy5fbmFtZSkpO1xuICB9XG4gIHB1YmxpYyBfY3JlYXRlSW5pdGlhbE91dHB1dHMoKTogT3V0cHV0W10ge1xuICAgIHJldHVybiB0aGlzLl9vdXRwdXRzO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNydEdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgaW5wdXRMb3NzQWN0aW9uOiAodGhpcy5wcm9wcy5pbnB1dExvc3NBY3Rpb24gPz8gU3J0SW5wdXRMb3NzQWN0aW9uLkVNSVRfUFJPR1JBTSkudmFsdWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcHVibGljIF9iaW5kRGVzdGluYXRpb24oY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSBjaGFubmVsQ2xhc3MgPT09ICdTVEFOREFSRCcgPyAyIDogMTtcbiAgICBjb25zdCBzZWVuSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMub3V0cHV0cy5tYXAoKGRlZikgPT4ge1xuICAgICAgaWYgKGRlZi5kZXN0aW5hdGlvbnMubGVuZ3RoICE9PSBleHBlY3RlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFNydERlc3RpbmF0aW9uQ291bnRgLFxuICAgICAgICAgIGBTUlQgb3V0cHV0ICcke2RlZi5vdXRwdXROYW1lfScgaW4gZ3JvdXAgJyR7dGhpcy5fbmFtZX0nIHJlcXVpcmVzIGV4YWN0bHkgJHtleHBlY3RlZH0gZGVzdGluYXRpb24ocykgKG9uZSBwZXIgcGlwZWxpbmUpIGZvciBhICR7Y2hhbm5lbENsYXNzfSBjaGFubmVsLCBnb3QgJHtkZWYuZGVzdGluYXRpb25zLmxlbmd0aH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgaWQgPSB0b0Rlc3RpbmF0aW9uSWQoZGVmLm91dHB1dE5hbWUpO1xuICAgICAgaWYgKGlkID09PSAnJykge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFNydERlc3RpbmF0aW9uSWRFbXB0eWAsXG4gICAgICAgICAgYFNSVCBvdXRwdXQgaW4gZ3JvdXAgJyR7dGhpcy5fbmFtZX0nIG91dHB1dE5hbWUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVyYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWVuSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBTcnREZXN0aW5hdGlvbklkQ29sbGlzaW9uYCxcbiAgICAgICAgICBgU1JUIG91dHB1dHMgaW4gZ3JvdXAgJyR7dGhpcy5fbmFtZX0nIHByb2R1Y2UgdGhlIHNhbWUgZGVzdGluYXRpb24gaWQgJyR7aWR9JyBhZnRlciBzYW5pdGlzaW5nIG91dHB1dCBuYW1lczsgcmVuYW1lIHRoZSBvdXRwdXRzIHNvIHRoZXkgZGlmZmVyIGJ5IG1vcmUgdGhhbiAnXycgdnMgJy0nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHNlZW5JZHMuYWRkKGlkKTtcbiAgICAgIHJldHVybiB7IGlkLCBzcnRTZXR0aW5nczogZGVmLmRlc3RpbmF0aW9ucy5tYXAoZCA9PiBkLl9iaW5kKCkpIH07XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgdGhpcy5wcm9wcy5vdXRwdXRzLmZvckVhY2gobyA9PiBvLmRlc3RpbmF0aW9ucy5mb3JFYWNoKGQgPT4gZC5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSkpO1xuICB9XG4gIHB1YmxpYyBvdmVycmlkZSBfaGFzU3J0TGlzdGVuZXJEZXN0aW5hdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5vdXRwdXRzLnNvbWUobyA9PiBvLmRlc3RpbmF0aW9ucy5zb21lKGQgPT4gZC5fYmluZCgpLmNvbm5lY3Rpb25Nb2RlID09PSAnTElTVEVORVInKSk7XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgQ21hZkluZ2VzdE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBDbWFmSW5nZXN0T3V0cHV0R3JvdXBQcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fbmFtZSA9IHByb3BzLm5hbWU7XG4gICAgLy8gRWFnZXJseSByZWplY3QgZGVzdGluYXRpb24gVVJMcyB0aGF0IGRvbid0IGVuZCB3aXRoICcvJyDigJQgdGhpcyBpcyBBUEkgbWlzdXNlIHRoYXQgYWx3YXlzXG4gICAgLy8gZmFpbHMgYXQgZGVwbG95LCBzbyBmYWlsIGZhc3QgYXQgY29uc3RydWN0aW9uIHJhdGhlciB0aGFuIGF0IHN5bnRoLlxuICAgIFsuLi5wcm9wcy5kZXN0aW5hdGlvbnMsIC4uLihwcm9wcy5hZGRpdGlvbmFsRGVzdGluYXRpb25zID8/IFtdKV0uZm9yRWFjaChkID0+IHtcbiAgICAgIGNvbnN0IHsgdXJsIH0gPSBkLl9iaW5kKCk7XG4gICAgICBpZiAodXJsICYmICFUb2tlbi5pc1VucmVzb2x2ZWQodXJsKSAmJiAhdXJsLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBDbWFmSW5nZXN0RGVzdGluYXRpb25UcmFpbGluZ1NsYXNoYCxcbiAgICAgICAgICBgQ01BRiBJbmdlc3Qgb3V0cHV0IGdyb3VwICcke3RoaXMuX25hbWV9JyBkZXN0aW5hdGlvbiBVUkwgcGF0aCBtdXN0IGVuZCB3aXRoICcvJyAoZ290ICcke3VybH0nKS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBfY3JlYXRlSW5pdGlhbE91dHB1dHMoKTogT3V0cHV0W10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLm91dHB1dHMubWFwKGRlZiA9PiBuZXcgQ21hZkluZ2VzdE91dHB1dChkZWYpKTtcbiAgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5PdXRwdXRHcm91cFNldHRpbmdzUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBjbWFmSW5nZXN0R3JvdXBTZXR0aW5nczoge1xuICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSB9LFxuICAgICAgICBzZWdtZW50TGVuZ3RoOiB0aGlzLnByb3BzLnNlZ21lbnQ/Ll9sZW5ndGgoKSA/PyAxLFxuICAgICAgICBzZWdtZW50TGVuZ3RoVW5pdHM6IHRoaXMucHJvcHMuc2VnbWVudD8uX3VuaXRzKCkgPz8gU2VnbWVudExlbmd0aFVuaXRzLlNFQ09ORFMsXG4gICAgICAgIGlkM0JlaGF2aW9yOiAodGhpcy5wcm9wcy5pZDNCZWhhdmlvciA/PyBJZDNCZWhhdmlvci5ESVNBQkxFRCkudmFsdWUsXG4gICAgICAgIGlkM05hbWVNb2RpZmllcjogdGhpcy5wcm9wcy5pZDNOYW1lTW9kaWZpZXIsXG4gICAgICAgIGtsdkJlaGF2aW9yOiAodGhpcy5wcm9wcy5rbHZCZWhhdmlvciA/PyBLbHZCZWhhdmlvci5OT19QQVNTVEhST1VHSCkudmFsdWUsXG4gICAgICAgIGtsdk5hbWVNb2RpZmllcjogdGhpcy5wcm9wcy5rbHZOYW1lTW9kaWZpZXIsXG4gICAgICAgIG5pZWxzZW5JZDNCZWhhdmlvcjogKHRoaXMucHJvcHMubmllbHNlbklkM0JlaGF2aW9yID8/IE5pZWxzZW5JZDNCZWhhdmlvci5OT19QQVNTVEhST1VHSCkudmFsdWUsXG4gICAgICAgIG5pZWxzZW5JZDNOYW1lTW9kaWZpZXI6IHRoaXMucHJvcHMubmllbHNlbklkM05hbWVNb2RpZmllcixcbiAgICAgICAgc2N0ZTM1TmFtZU1vZGlmaWVyOiB0aGlzLnByb3BzLnNjdGUzNU5hbWVNb2RpZmllcixcbiAgICAgICAgc2N0ZTM1VHlwZTogKHRoaXMucHJvcHMuc2N0ZTM1VHlwZSA/PyBTY3RlMzVUeXBlLlNDVEVfMzVfV0lUSE9VVF9TRUdNRU5UQVRJT04pLnZhbHVlLFxuICAgICAgICBzZW5kRGVsYXlNczogdGhpcy5wcm9wcy5zZW5kRGVsYXlNcyxcbiAgICAgICAgdGltZWRNZXRhZGF0YUlkM0ZyYW1lOiAodGhpcy5wcm9wcy50aW1lZE1ldGFkYXRhSWQzRnJhbWUgPz8gVGltZWRNZXRhZGF0YUlkM0ZyYW1lLk5PTkUpLnZhbHVlLFxuICAgICAgICB0aW1lZE1ldGFkYXRhSWQzUGVyaW9kOiB0aGlzLnByb3BzLnRpbWVkTWV0YWRhdGFJZDNQZXJpb2Q/LnRvU2Vjb25kcygpID8/IDEwLFxuICAgICAgICB0aW1lZE1ldGFkYXRhUGFzc3Rocm91Z2g6ICh0aGlzLnByb3BzLnRpbWVkTWV0YWRhdGFQYXNzdGhyb3VnaCA/PyBUaW1lZE1ldGFkYXRhUGFzc3Rocm91Z2guRElTQUJMRUQpLnZhbHVlLFxuICAgICAgICBjYXB0aW9uTGFuZ3VhZ2VNYXBwaW5nczogdGhpcy5wcm9wcy5jYXB0aW9uTGFuZ3VhZ2VNYXBwaW5ncyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihfY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgY29uc3QgYWRkaXRpb25hbCA9IHRoaXMucHJvcHMuYWRkaXRpb25hbERlc3RpbmF0aW9ucyA/PyBbXTtcbiAgICB2YWxpZGF0ZURlc3RpbmF0aW9uQ291bnQodGhpcy5fbmFtZSwgX2NoYW5uZWxDbGFzcywgdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMubGVuZ3RoLCBhZGRpdGlvbmFsLmxlbmd0aCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBwcmltYXJ5U2V0dGluZ3MgPSB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5tYXAoZCA9PiBkLl9iaW5kKCkpO1xuICAgIGNvbnN0IHJlc3VsdDogQ2ZuQ2hhbm5lbC5PdXRwdXREZXN0aW5hdGlvblByb3BlcnR5W10gPSBbXG4gICAgICB7IGlkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSwgc2V0dGluZ3M6IHByaW1hcnlTZXR0aW5ncyB9LFxuICAgIF07XG5cbiAgICBhZGRpdGlvbmFsLmZvckVhY2goKGRlc3QsIGkpID0+IHtcbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgaWQ6IGAke3RvRGVzdGluYXRpb25JZCh0aGlzLnByb3BzLm5hbWUpfS1hZGRpdGlvbmFsLSR7aX1gLFxuICAgICAgICBzZXR0aW5nczogW2Rlc3QuX2JpbmQoKV0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlKTogdm9pZCB7XG4gICAgWy4uLnRoaXMucHJvcHMuZGVzdGluYXRpb25zLCAuLi4odGhpcy5wcm9wcy5hZGRpdGlvbmFsRGVzdGluYXRpb25zID8/IFtdKV0uZm9yRWFjaChkID0+IGQuX2dyYW50UGVybWlzc2lvbnMocm9sZSkpO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIEZyYW1lQ2FwdHVyZU91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiBleHRlbmRzIE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBGcmFtZUNhcHR1cmVPdXRwdXRHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9uYW1lID0gcHJvcHMubmFtZTtcbiAgfVxuICBwdWJsaWMgX2NyZWF0ZUluaXRpYWxPdXRwdXRzKCk6IE91dHB1dFtdIHtcbiAgICByZXR1cm4gKHRoaXMucHJvcHMub3V0cHV0cyA/PyBbXSkubWFwKGRlZiA9PiBuZXcgRnJhbWVDYXB0dXJlT3V0cHV0KGRlZikpO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyYW1lQ2FwdHVyZUdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgZGVzdGluYXRpb246IHsgZGVzdGluYXRpb25SZWZJZDogdG9EZXN0aW5hdGlvbklkKHRoaXMucHJvcHMubmFtZSkgfSxcbiAgICAgICAgZnJhbWVDYXB0dXJlQ2RuU2V0dGluZ3M6IHRoaXMucHJvcHMuZnJhbWVDYXB0dXJlUzNDYW5uZWRBY2wgPyB7XG4gICAgICAgICAgZnJhbWVDYXB0dXJlUzNTZXR0aW5nczogeyBjYW5uZWRBY2w6IHRoaXMucHJvcHMuZnJhbWVDYXB0dXJlUzNDYW5uZWRBY2wudmFsdWUgfSxcbiAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihfY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgdmFsaWRhdGVEZXN0aW5hdGlvbkNvdW50KHRoaXMuX25hbWUsIF9jaGFubmVsQ2xhc3MsIHRoaXMucHJvcHMuZGVzdGluYXRpb25zLmxlbmd0aCwgMCwgZmFsc2UpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMubWFwKGQgPT4gZC5fYmluZCgpKTtcbiAgICByZXR1cm4gW3sgaWQ6IHRvRGVzdGluYXRpb25JZCh0aGlzLnByb3BzLm5hbWUpLCBzZXR0aW5ncyB9XTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgX2dyYW50UGVybWlzc2lvbnMocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5mb3JFYWNoKGQgPT4gZC5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSk7XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgTXNTbW9vdGhPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBPdXRwdXRHcm91cENvbmZpZ3VyYXRpb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgX25hbWU6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogTXNTbW9vdGhPdXRwdXRHcm91cFByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9uYW1lID0gcHJvcHMubmFtZTtcblxuICAgIC8vIEFsbCBvdXRwdXRzIGluIGFuIE1TIFNtb290aCBncm91cCBzaGFyZSB0aGUgZ3JvdXAncyBzaW5nbGUgZGVzdGluYXRpb24sIHNvIE1lZGlhTGl2ZVxuICAgIC8vIGRpc3Rpbmd1aXNoZXMgdGhlbSBieSBuYW1lTW9kaWZpZXIgYWxvbmUg4oCUIGl0IG11c3QgYmUgc2V0IGFuZCB1bmlxdWUgYWNyb3NzIG91dHB1dHMuXG4gICAgLy8gT3RoZXJ3aXNlIHRoaXMgZmFpbHMgYXQgZGVwbG95IHdpdGggXCJPdXRwdXRzIG11c3QgaGF2ZSB1bmlxdWUgZGVzdGluYXRpb25zXCIuXG4gICAgY29uc3Qgb3V0cHV0cyA9IHByb3BzLm91dHB1dHMgPz8gW107XG4gICAgaWYgKG91dHB1dHMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3Qgc2Vlbk1vZGlmaWVycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgb3V0cHV0cy5mb3JFYWNoKGRlZiA9PiB7XG4gICAgICAgIGlmICghZGVmLm5hbWVNb2RpZmllcikge1xuICAgICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGxpdGBNc1Ntb290aE5hbWVNb2RpZmllclJlcXVpcmVkYCxcbiAgICAgICAgICAgIGBNUyBTbW9vdGggb3V0cHV0IGdyb3VwICcke3RoaXMuX25hbWV9JyBoYXMgbXVsdGlwbGUgb3V0cHV0cyBzaGFyaW5nIG9uZSBkZXN0aW5hdGlvbjtgXG4gICAgICAgICAgICArIGAgb3V0cHV0ICcke2RlZi5vdXRwdXROYW1lfScgbXVzdCBzZXQgYSB1bmlxdWUgJ25hbWVNb2RpZmllcicuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWVuTW9kaWZpZXJzLmhhcyhkZWYubmFtZU1vZGlmaWVyKSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGxpdGBNc1Ntb290aE5hbWVNb2RpZmllckNvbGxpc2lvbmAsXG4gICAgICAgICAgICBgTVMgU21vb3RoIG91dHB1dCBncm91cCAnJHt0aGlzLl9uYW1lfScgaGFzIG1vcmUgdGhhbiBvbmUgb3V0cHV0IHdpdGggbmFtZU1vZGlmaWVyYFxuICAgICAgICAgICAgKyBgICcke2RlZi5uYW1lTW9kaWZpZXJ9JzsgZWFjaCBvdXRwdXQncyBuYW1lTW9kaWZpZXIgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBncm91cC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbk1vZGlmaWVycy5hZGQoZGVmLm5hbWVNb2RpZmllcik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHVibGljIF9jcmVhdGVJbml0aWFsT3V0cHV0cygpOiBPdXRwdXRbXSB7XG4gICAgcmV0dXJuICh0aGlzLnByb3BzLm91dHB1dHMgPz8gW10pLm1hcChkZWYgPT4gbmV3IE1zU21vb3RoT3V0cHV0KGRlZikpO1xuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1zU21vb3RoR3JvdXBTZXR0aW5nczoge1xuICAgICAgICBkZXN0aW5hdGlvbjogeyBkZXN0aW5hdGlvblJlZklkOiB0b0Rlc3RpbmF0aW9uSWQodGhpcy5wcm9wcy5uYW1lKSB9LFxuICAgICAgICBhY3F1aXNpdGlvblBvaW50SWQ6IHRoaXMucHJvcHMuYWNxdWlzaXRpb25Qb2ludElkLFxuICAgICAgICBhdWRpb09ubHlUaW1lY29kZUNvbnRyb2w6IHRoaXMucHJvcHMuYXVkaW9Pbmx5VGltZWNvZGVDb250cm9sPy52YWx1ZSxcbiAgICAgICAgY2VydGlmaWNhdGVNb2RlOiB0aGlzLnByb3BzLmNlcnRpZmljYXRlTW9kZT8udmFsdWUsXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUludGVydmFsOiB0aGlzLnByb3BzLmNvbm5lY3Rpb25SZXRyeUludGVydmFsPy50b1NlY29uZHMoKSxcbiAgICAgICAgZXZlbnRJZDogdGhpcy5wcm9wcy5ldmVudElkLFxuICAgICAgICBldmVudElkTW9kZTogdGhpcy5wcm9wcy5ldmVudElkTW9kZT8udmFsdWUsXG4gICAgICAgIGV2ZW50U3RvcEJlaGF2aW9yOiB0aGlzLnByb3BzLmV2ZW50U3RvcEJlaGF2aW9yPy52YWx1ZSxcbiAgICAgICAgZmlsZWNhY2hlRHVyYXRpb246IHRoaXMucHJvcHMuZmlsZWNhY2hlRHVyYXRpb24/LnRvU2Vjb25kcygpLFxuICAgICAgICBmcmFnbWVudExlbmd0aDogdGhpcy5wcm9wcy5mcmFnbWVudExlbmd0aD8udG9TZWNvbmRzKCksXG4gICAgICAgIGlucHV0TG9zc0FjdGlvbjogdGhpcy5wcm9wcy5pbnB1dExvc3NBY3Rpb24/LnZhbHVlLFxuICAgICAgICBudW1SZXRyaWVzOiB0aGlzLnByb3BzLm51bVJldHJpZXMgPz8gMTAsXG4gICAgICAgIHJlc3RhcnREZWxheTogdGhpcy5wcm9wcy5yZXN0YXJ0RGVsYXk/LnRvU2Vjb25kcygpID8/IDEsXG4gICAgICAgIHNlZ21lbnRhdGlvbk1vZGU6IHRoaXMucHJvcHMuc2VnbWVudGF0aW9uTW9kZT8udmFsdWUsXG4gICAgICAgIHNlbmREZWxheU1zOiB0aGlzLnByb3BzLnNlbmREZWxheU1zLFxuICAgICAgICBzcGFyc2VUcmFja1R5cGU6IHRoaXMucHJvcHMuc3BhcnNlVHJhY2tUeXBlPy52YWx1ZSxcbiAgICAgICAgc3RyZWFtTWFuaWZlc3RCZWhhdmlvcjogdGhpcy5wcm9wcy5zdHJlYW1NYW5pZmVzdEJlaGF2aW9yPy52YWx1ZSxcbiAgICAgICAgdGltZXN0YW1wT2Zmc2V0OiB0aGlzLnByb3BzLnRpbWVzdGFtcE9mZnNldCxcbiAgICAgICAgdGltZXN0YW1wT2Zmc2V0TW9kZTogdGhpcy5wcm9wcy50aW1lc3RhbXBPZmZzZXRNb2RlPy52YWx1ZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihfY2hhbm5lbENsYXNzOiBzdHJpbmcpOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXSB7XG4gICAgdmFsaWRhdGVEZXN0aW5hdGlvbkNvdW50KHRoaXMuX25hbWUsIF9jaGFubmVsQ2xhc3MsIHRoaXMucHJvcHMuZGVzdGluYXRpb25zLmxlbmd0aCwgMCwgZmFsc2UpO1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5wcm9wcy5kZXN0aW5hdGlvbnMubWFwKGQgPT4gZC5fYmluZCgpKTtcbiAgICByZXR1cm4gW3sgaWQ6IHRvRGVzdGluYXRpb25JZCh0aGlzLnByb3BzLm5hbWUpLCBzZXR0aW5ncyB9XTtcbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgX2dyYW50UGVybWlzc2lvbnMocm9sZTogSVJvbGUpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BzLmRlc3RpbmF0aW9ucy5mb3JFYWNoKGQgPT4gZC5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE91dHB1dEdyb3VwIChvcmNoZXN0cmF0ZXMgb3V0cHV0cyB3aXRoaW4gYSBncm91cClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQW4gb3V0cHV0IGdyb3VwIHdpdGhpbiBhIE1lZGlhTGl2ZSBjaGFubmVsLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgT3V0cHV0R3JvdXAge1xuICBwcml2YXRlIHJlYWRvbmx5IG91dHB1dHM6IE91dHB1dFtdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb25maWc6IE91dHB1dEdyb3VwQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMub3V0cHV0cy5wdXNoKC4uLmNvbmZpZy5fY3JlYXRlSW5pdGlhbE91dHB1dHMoKSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLk91dHB1dEdyb3VwUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLmNvbmZpZy5fbmFtZSxcbiAgICAgIG91dHB1dEdyb3VwU2V0dGluZ3M6IHRoaXMuY29uZmlnLl9iaW5kKCksXG4gICAgICBvdXRwdXRzOiB0aGlzLm91dHB1dHMubWFwKG8gPT4gby5fYmluZCgpKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2JpbmREZXN0aW5hdGlvbihjaGFubmVsQ2xhc3M6IHN0cmluZyk6IENmbkNoYW5uZWwuT3V0cHV0RGVzdGluYXRpb25Qcm9wZXJ0eVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuX2JpbmREZXN0aW5hdGlvbihjaGFubmVsQ2xhc3MpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2NvbGxlY3RFbmNvZGVzKCk6IEVuY29kZUNvbmZpZ3VyYXRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0cy5mbGF0TWFwKG8gPT4gby5fZ2V0RW5jb2RlcygpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgLSBQcm9wYWdhdGUgZXBvY2gtbG9ja2luZyBzdGF0ZSB0byB0aGUgdW5kZXJseWluZyBjb25maWcuICovXG4gIHB1YmxpYyBfc2V0RXBvY2hMb2NraW5nKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLl9zZXRFcG9jaExvY2tpbmcoYWN0aXZlKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgLSBXaGV0aGVyIHRoZSB1bmRlcmx5aW5nIGNvbmZpZyBleHBsaWNpdGx5IHJlcXVlc3RzIGFuIGluY29tcGF0aWJsZSBTWVNURU1fQ0xPQ0suICovXG4gIHB1YmxpYyBfaGFzRXhwbGljaXRTeXN0ZW1DbG9jaygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuX2hhc0V4cGxpY2l0U3lzdGVtQ2xvY2soKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9ncmFudFBlcm1pc3Npb25zKHJvbGU6IElSb2xlUmVmKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuX2dyYW50UGVybWlzc2lvbnMocm9sZSk7XG4gICAgLy8gR3JhbnQgcmVhZCBhY2Nlc3MgdG8gYW55IGV4dGVybmFsIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIG91dHB1dHMgKGJ1cm4taW4gY2FwdGlvbiBmb250cyxcbiAgICAvLyBhdWRpby1vbmx5IGNvdmVyLWFydCBpbWFnZXMpIHNvdXJjZWQgZnJvbSBTMyBidWNrZXRzLlxuICAgIHRoaXMub3V0cHV0cy5mb3JFYWNoKG8gPT4gby5fZ3JhbnRQZXJtaXNzaW9ucyhyb2xlKSk7XG4gIH1cbn1cbiJdfQ==