discord-player 6.6.3-dev.0 → 6.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -18
- package/dist/index.d.ts +2524 -2466
- package/dist/index.js +1361 -117
- package/dist/index.mjs +4 -0
- package/package.json +7 -5
package/dist/index.js
CHANGED
|
@@ -20,6 +20,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
20
20
|
};
|
|
21
21
|
var __reExport = (target2, mod, secondTarget) => (__copyProps(target2, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
22
22
|
var __toESM = (mod, isNodeMode, target2) => (target2 = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
23
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
24
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
25
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
26
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
23
27
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target2, "default", { value: mod, enumerable: true }) : target2,
|
|
24
28
|
mod
|
|
25
29
|
));
|
|
@@ -42,6 +46,14 @@ var __privateSet = (obj, member, value, setter) => {
|
|
|
42
46
|
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
43
47
|
return value;
|
|
44
48
|
};
|
|
49
|
+
var __privateWrapper = (obj, member, setter, getter) => ({
|
|
50
|
+
set _(value) {
|
|
51
|
+
__privateSet(obj, member, value, setter);
|
|
52
|
+
},
|
|
53
|
+
get _() {
|
|
54
|
+
return __privateGet(obj, member, getter);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
45
57
|
var __privateMethod = (obj, member, method) => {
|
|
46
58
|
__accessCheck(obj, member, "access private method");
|
|
47
59
|
return method;
|
|
@@ -75,6 +87,8 @@ __export(src_exports, {
|
|
|
75
87
|
GuildQueueHistory: () => GuildQueueHistory,
|
|
76
88
|
GuildQueuePlayerNode: () => GuildQueuePlayerNode,
|
|
77
89
|
GuildQueueStatistics: () => GuildQueueStatistics,
|
|
90
|
+
IPBlock: () => IPBlock,
|
|
91
|
+
IPRotator: () => IPRotator,
|
|
78
92
|
PCMAudioFilters: () => import_equalizer3.AudioFilters,
|
|
79
93
|
Player: () => Player,
|
|
80
94
|
PlayerEvent: () => PlayerEvent,
|
|
@@ -119,7 +133,13 @@ var import_utils = require("@discord-player/utils");
|
|
|
119
133
|
var import_promises = require("timers/promises");
|
|
120
134
|
|
|
121
135
|
// src/fabric/Playlist.ts
|
|
122
|
-
var
|
|
136
|
+
var _Playlist = class _Playlist {
|
|
137
|
+
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
138
|
+
/**
|
|
139
|
+
* Playlist constructor
|
|
140
|
+
* @param {Player} player The player
|
|
141
|
+
* @param {PlaylistInitData} data The data
|
|
142
|
+
*/
|
|
123
143
|
constructor(player, data) {
|
|
124
144
|
this.player = player;
|
|
125
145
|
this.tracks = data.tracks ?? [];
|
|
@@ -135,12 +155,23 @@ var Playlist = class {
|
|
|
135
155
|
*[Symbol.iterator]() {
|
|
136
156
|
yield* this.tracks;
|
|
137
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Estimated duration of this playlist
|
|
160
|
+
*/
|
|
138
161
|
get estimatedDuration() {
|
|
139
162
|
return this.tracks.reduce((p, c) => p + c.durationMS, 0);
|
|
140
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Formatted estimated duration of this playlist
|
|
166
|
+
*/
|
|
141
167
|
get durationFormatted() {
|
|
142
168
|
return Util.buildTimeCode(Util.parseMS(this.estimatedDuration));
|
|
143
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* JSON representation of this playlist
|
|
172
|
+
* @param {boolean} [withTracks=true] If it should build json with tracks
|
|
173
|
+
* @returns {PlaylistJSON}
|
|
174
|
+
*/
|
|
144
175
|
toJSON(withTracks = true) {
|
|
145
176
|
const payload = {
|
|
146
177
|
id: this.id,
|
|
@@ -157,16 +188,27 @@ var Playlist = class {
|
|
|
157
188
|
payload.tracks = this.tracks.map((m) => m.toJSON(true));
|
|
158
189
|
return payload;
|
|
159
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Play this playlist to the given voice channel. If queue exists and another track is being played, this playlist will be added to the queue.
|
|
193
|
+
* @param channel Voice channel on which this playlist shall be played
|
|
194
|
+
* @param options Node initialization options
|
|
195
|
+
*/
|
|
160
196
|
async play(channel, options) {
|
|
161
197
|
const fn = this.player.play.bind(this.player);
|
|
162
198
|
return await fn(channel, this, options);
|
|
163
199
|
}
|
|
164
200
|
};
|
|
165
|
-
__name(
|
|
201
|
+
__name(_Playlist, "Playlist");
|
|
202
|
+
var Playlist = _Playlist;
|
|
166
203
|
|
|
167
204
|
// src/fabric/Track.ts
|
|
168
205
|
var import_discord = require("discord.js");
|
|
169
|
-
var
|
|
206
|
+
var _Track = class _Track {
|
|
207
|
+
/**
|
|
208
|
+
* Track constructor
|
|
209
|
+
* @param player The player that instantiated this Track
|
|
210
|
+
* @param data Track data
|
|
211
|
+
*/
|
|
170
212
|
constructor(player, data) {
|
|
171
213
|
this.player = player;
|
|
172
214
|
this.requestedBy = null;
|
|
@@ -191,23 +233,41 @@ var Track = class {
|
|
|
191
233
|
this.__metadata = data.metadata ?? null;
|
|
192
234
|
this.__reqMetadataFn = data.requestMetadata || (() => Promise.resolve(null));
|
|
193
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Request metadata for this track
|
|
238
|
+
*/
|
|
194
239
|
async requestMetadata() {
|
|
195
240
|
const res = await this.__reqMetadataFn();
|
|
196
241
|
this.setMetadata(res);
|
|
197
242
|
return res;
|
|
198
243
|
}
|
|
244
|
+
/**
|
|
245
|
+
* Set metadata for this track
|
|
246
|
+
*/
|
|
199
247
|
setMetadata(m) {
|
|
200
248
|
this.__metadata = m;
|
|
201
249
|
}
|
|
250
|
+
/**
|
|
251
|
+
* Metadata of this track
|
|
252
|
+
*/
|
|
202
253
|
get metadata() {
|
|
203
254
|
return this.__metadata;
|
|
204
255
|
}
|
|
256
|
+
/**
|
|
257
|
+
* If this track has metadata
|
|
258
|
+
*/
|
|
205
259
|
get hasMetadata() {
|
|
206
260
|
return this.metadata != null;
|
|
207
261
|
}
|
|
262
|
+
/**
|
|
263
|
+
* The queue in which this track is located
|
|
264
|
+
*/
|
|
208
265
|
get queue() {
|
|
209
266
|
return this.player.nodes.cache.find((q) => q.tracks.some((ab) => ab.id === this.id));
|
|
210
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* The track duration in millisecond
|
|
270
|
+
*/
|
|
211
271
|
get durationMS() {
|
|
212
272
|
const times = /* @__PURE__ */ __name((n, t) => {
|
|
213
273
|
let tn = 1;
|
|
@@ -217,15 +277,27 @@ var Track = class {
|
|
|
217
277
|
}, "times");
|
|
218
278
|
return this.duration.split(":").reverse().map((m, i) => parseInt(m) * times(60, i)).reduce((a, c) => a + c, 0);
|
|
219
279
|
}
|
|
280
|
+
/**
|
|
281
|
+
* Discord hyperlink representation of this track
|
|
282
|
+
*/
|
|
220
283
|
toHyperlink() {
|
|
221
284
|
return `[${this.title}](${this.url})`;
|
|
222
285
|
}
|
|
286
|
+
/**
|
|
287
|
+
* Returns source of this track
|
|
288
|
+
*/
|
|
223
289
|
get source() {
|
|
224
290
|
return this.raw?.source ?? "arbitrary";
|
|
225
291
|
}
|
|
292
|
+
/**
|
|
293
|
+
* String representation of this track
|
|
294
|
+
*/
|
|
226
295
|
toString() {
|
|
227
296
|
return `${this.title} by ${this.author}`;
|
|
228
297
|
}
|
|
298
|
+
/**
|
|
299
|
+
* Raw JSON representation of this track
|
|
300
|
+
*/
|
|
229
301
|
toJSON(hidePlaylist) {
|
|
230
302
|
return {
|
|
231
303
|
id: this.id,
|
|
@@ -241,16 +313,25 @@ var Track = class {
|
|
|
241
313
|
playlist: hidePlaylist ? null : this.playlist?.toJSON() ?? null
|
|
242
314
|
};
|
|
243
315
|
}
|
|
316
|
+
/**
|
|
317
|
+
* Get belonging queues of this track
|
|
318
|
+
*/
|
|
244
319
|
getBelongingQueues() {
|
|
245
320
|
const nodes = this.player.nodes.cache.filter((node) => node.tracks.some((t) => t.id === this.id));
|
|
246
321
|
return nodes;
|
|
247
322
|
}
|
|
323
|
+
/**
|
|
324
|
+
* Play this track to the given voice channel. If queue exists and another track is being played, this track will be added to the queue.
|
|
325
|
+
* @param channel Voice channel on which this track shall be played
|
|
326
|
+
* @param options Node initialization options
|
|
327
|
+
*/
|
|
248
328
|
async play(channel, options) {
|
|
249
329
|
const fn = this.player.play.bind(this.player);
|
|
250
330
|
return await fn(channel, this, options);
|
|
251
331
|
}
|
|
252
332
|
};
|
|
253
|
-
__name(
|
|
333
|
+
__name(_Track, "Track");
|
|
334
|
+
var Track = _Track;
|
|
254
335
|
|
|
255
336
|
// src/types/types.ts
|
|
256
337
|
var QueryType = {
|
|
@@ -293,7 +374,7 @@ var QueueRepeatMode = /* @__PURE__ */ ((QueueRepeatMode2) => {
|
|
|
293
374
|
})(QueueRepeatMode || {});
|
|
294
375
|
|
|
295
376
|
// src/fabric/SearchResult.ts
|
|
296
|
-
var
|
|
377
|
+
var _SearchResult = class _SearchResult {
|
|
297
378
|
constructor(player, _data) {
|
|
298
379
|
this.player = player;
|
|
299
380
|
this._data = _data;
|
|
@@ -332,39 +413,72 @@ var SearchResult = class {
|
|
|
332
413
|
this._data.playlist = playlist;
|
|
333
414
|
return this;
|
|
334
415
|
}
|
|
416
|
+
/**
|
|
417
|
+
* The search query
|
|
418
|
+
*/
|
|
335
419
|
get query() {
|
|
336
420
|
return this._data.query;
|
|
337
421
|
}
|
|
422
|
+
/**
|
|
423
|
+
* The search query type
|
|
424
|
+
*/
|
|
338
425
|
get queryType() {
|
|
339
426
|
return this._data.queryType || QueryType.AUTO;
|
|
340
427
|
}
|
|
428
|
+
/**
|
|
429
|
+
* The extractor
|
|
430
|
+
*/
|
|
341
431
|
get extractor() {
|
|
342
432
|
return this._data.extractor || null;
|
|
343
433
|
}
|
|
434
|
+
/**
|
|
435
|
+
* Playlist result
|
|
436
|
+
*/
|
|
344
437
|
get playlist() {
|
|
345
438
|
return this._data.playlist;
|
|
346
439
|
}
|
|
440
|
+
/**
|
|
441
|
+
* Tracks result
|
|
442
|
+
*/
|
|
347
443
|
get tracks() {
|
|
348
444
|
return this._data.tracks || [];
|
|
349
445
|
}
|
|
446
|
+
/**
|
|
447
|
+
* Requested by
|
|
448
|
+
*/
|
|
350
449
|
get requestedBy() {
|
|
351
450
|
return this._data.requestedBy || null;
|
|
352
451
|
}
|
|
452
|
+
/**
|
|
453
|
+
* Re-execute this search
|
|
454
|
+
*/
|
|
353
455
|
async execute() {
|
|
354
456
|
return this.player.search(this.query, {
|
|
355
457
|
searchEngine: this.queryType,
|
|
356
458
|
requestedBy: this.requestedBy
|
|
357
459
|
});
|
|
358
460
|
}
|
|
461
|
+
/**
|
|
462
|
+
* If this search result is empty
|
|
463
|
+
*/
|
|
359
464
|
isEmpty() {
|
|
360
465
|
return !this.tracks.length;
|
|
361
466
|
}
|
|
467
|
+
/**
|
|
468
|
+
* If this search result has playlist
|
|
469
|
+
*/
|
|
362
470
|
hasPlaylist() {
|
|
363
471
|
return this.playlist != null;
|
|
364
472
|
}
|
|
473
|
+
/**
|
|
474
|
+
* If this search result has tracks
|
|
475
|
+
*/
|
|
365
476
|
hasTracks() {
|
|
366
477
|
return this.tracks.length > 0;
|
|
367
478
|
}
|
|
479
|
+
/**
|
|
480
|
+
* JSON representation of this search
|
|
481
|
+
*/
|
|
368
482
|
toJSON() {
|
|
369
483
|
return {
|
|
370
484
|
query: this.query,
|
|
@@ -376,11 +490,12 @@ var SearchResult = class {
|
|
|
376
490
|
};
|
|
377
491
|
}
|
|
378
492
|
};
|
|
379
|
-
__name(
|
|
493
|
+
__name(_SearchResult, "SearchResult");
|
|
494
|
+
var SearchResult = _SearchResult;
|
|
380
495
|
|
|
381
496
|
// src/utils/AudioFilters.ts
|
|
382
497
|
var bass = /* @__PURE__ */ __name((g) => `bass=g=${g}:f=110:w=0.3`, "bass");
|
|
383
|
-
var _AudioFilters = class {
|
|
498
|
+
var _AudioFilters = class _AudioFilters {
|
|
384
499
|
constructor() {
|
|
385
500
|
return _AudioFilters;
|
|
386
501
|
}
|
|
@@ -398,27 +513,41 @@ var _AudioFilters = class {
|
|
|
398
513
|
static get names() {
|
|
399
514
|
return Object.keys(this.filters);
|
|
400
515
|
}
|
|
516
|
+
// @ts-ignore
|
|
401
517
|
static get length() {
|
|
402
518
|
return this.names.length;
|
|
403
519
|
}
|
|
404
520
|
static toString() {
|
|
405
521
|
return this.names.map((m) => this[m]).join(",");
|
|
406
522
|
}
|
|
523
|
+
/**
|
|
524
|
+
* Create ffmpeg args from the specified filters name
|
|
525
|
+
* @param filter The filter name
|
|
526
|
+
* @returns
|
|
527
|
+
*/
|
|
407
528
|
static create(filters) {
|
|
408
529
|
if (!filters || !Array.isArray(filters))
|
|
409
530
|
return this.toString();
|
|
410
531
|
return filters.filter((predicate) => typeof predicate === "string").map((m) => this.get(m)).join(",");
|
|
411
532
|
}
|
|
533
|
+
/**
|
|
534
|
+
* Defines audio filter
|
|
535
|
+
* @param filterName The name of the filter
|
|
536
|
+
* @param value The ffmpeg args
|
|
537
|
+
*/
|
|
412
538
|
static define(filterName, value) {
|
|
413
539
|
this.filters[filterName] = value;
|
|
414
540
|
}
|
|
541
|
+
/**
|
|
542
|
+
* Defines multiple audio filters
|
|
543
|
+
* @param filtersArray Array of filters containing the filter name and ffmpeg args
|
|
544
|
+
*/
|
|
415
545
|
static defineBulk(filtersArray) {
|
|
416
546
|
filtersArray.forEach((arr) => this.define(arr.name, arr.value));
|
|
417
547
|
}
|
|
418
548
|
};
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
AudioFilters.filters = {
|
|
549
|
+
__name(_AudioFilters, "AudioFilters");
|
|
550
|
+
_AudioFilters.filters = {
|
|
422
551
|
bassboost_low: bass(15),
|
|
423
552
|
bassboost: bass(20),
|
|
424
553
|
bassboost_high: bass(30),
|
|
@@ -452,8 +581,10 @@ AudioFilters.filters = {
|
|
|
452
581
|
chorus3d: "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3",
|
|
453
582
|
fadein: "afade=t=in:ss=0:d=10",
|
|
454
583
|
dim: `afftfilt="'real=re * (1-clip((b/nb)*b,0,1))':imag='im * (1-clip((b/nb)*b,0,1))'"`,
|
|
455
|
-
earrape: "channelsplit,sidechaingate=level_in=64"
|
|
584
|
+
earrape: "channelsplit,sidechaingate=level_in=64",
|
|
585
|
+
silenceremove: "silenceremove=1:0:-50dB"
|
|
456
586
|
};
|
|
587
|
+
var AudioFilters = _AudioFilters;
|
|
457
588
|
|
|
458
589
|
// src/errors/index.ts
|
|
459
590
|
var DiscordPlayerErrors = {
|
|
@@ -593,12 +724,26 @@ var ErrorCodes = (() => {
|
|
|
593
724
|
var Exceptions = new Proxy(target, handler);
|
|
594
725
|
|
|
595
726
|
// src/utils/Util.ts
|
|
596
|
-
var
|
|
727
|
+
var _Util = class _Util {
|
|
728
|
+
/**
|
|
729
|
+
* Utils
|
|
730
|
+
*/
|
|
597
731
|
constructor() {
|
|
598
732
|
}
|
|
733
|
+
// eslint-disable-line @typescript-eslint/no-empty-function
|
|
734
|
+
/**
|
|
735
|
+
* Creates duration string
|
|
736
|
+
* @param {object} durObj The duration object
|
|
737
|
+
* @returns {string}
|
|
738
|
+
*/
|
|
599
739
|
static durationString(durObj) {
|
|
600
740
|
return Object.values(durObj).map((m) => isNaN(m) ? 0 : m).join(":");
|
|
601
741
|
}
|
|
742
|
+
/**
|
|
743
|
+
* Parses milliseconds to consumable time object
|
|
744
|
+
* @param {number} milliseconds The time in ms
|
|
745
|
+
* @returns {TimeData}
|
|
746
|
+
*/
|
|
602
747
|
static parseMS(milliseconds) {
|
|
603
748
|
if (isNaN(milliseconds))
|
|
604
749
|
milliseconds = 0;
|
|
@@ -610,6 +755,11 @@ var Util = class {
|
|
|
610
755
|
seconds: round(milliseconds / 1e3) % 60
|
|
611
756
|
};
|
|
612
757
|
}
|
|
758
|
+
/**
|
|
759
|
+
* Builds time code
|
|
760
|
+
* @param {TimeData} duration The duration object
|
|
761
|
+
* @returns {string}
|
|
762
|
+
*/
|
|
613
763
|
static buildTimeCode(duration) {
|
|
614
764
|
const items = Object.keys(duration);
|
|
615
765
|
const required = ["days", "hours", "minutes", "seconds"];
|
|
@@ -617,14 +767,30 @@ var Util = class {
|
|
|
617
767
|
const final = parsed.slice(parsed.findIndex((x) => x !== 0)).map((x) => x.toString().padStart(2, "0")).join(":");
|
|
618
768
|
return final.length <= 3 ? `0:${final.padStart(2, "0") || 0}` : final;
|
|
619
769
|
}
|
|
770
|
+
/**
|
|
771
|
+
* Picks last item of the given array
|
|
772
|
+
* @param {any[]} arr The array
|
|
773
|
+
* @returns {any}
|
|
774
|
+
*/
|
|
775
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
620
776
|
static last(arr) {
|
|
621
777
|
if (!Array.isArray(arr))
|
|
622
778
|
return arr;
|
|
623
779
|
return arr[arr.length - 1];
|
|
624
780
|
}
|
|
781
|
+
/**
|
|
782
|
+
* Checks if the voice channel is empty
|
|
783
|
+
* @param {VoiceChannel|StageChannel} channel The voice channel
|
|
784
|
+
* @returns {boolean}
|
|
785
|
+
*/
|
|
625
786
|
static isVoiceEmpty(channel) {
|
|
626
787
|
return channel && channel.members.filter((member) => !member.user.bot).size === 0;
|
|
627
788
|
}
|
|
789
|
+
/**
|
|
790
|
+
* Safer require
|
|
791
|
+
* @param {string} id Node require id
|
|
792
|
+
* @returns {any}
|
|
793
|
+
*/
|
|
628
794
|
static require(id) {
|
|
629
795
|
try {
|
|
630
796
|
return { module: require(id), error: null };
|
|
@@ -640,11 +806,17 @@ var Util = class {
|
|
|
640
806
|
return { module: null, error };
|
|
641
807
|
}
|
|
642
808
|
}
|
|
809
|
+
/**
|
|
810
|
+
* Asynchronous timeout
|
|
811
|
+
* @param {number} time The time in ms to wait
|
|
812
|
+
* @returns {Promise<unknown>}
|
|
813
|
+
*/
|
|
643
814
|
static wait(time) {
|
|
644
815
|
return (0, import_promises.setTimeout)(time, void 0, { ref: false });
|
|
645
816
|
}
|
|
646
817
|
static noop() {
|
|
647
818
|
}
|
|
819
|
+
// eslint-disable-line @typescript-eslint/no-empty-function
|
|
648
820
|
static async getFetch() {
|
|
649
821
|
if ("fetch" in globalThis)
|
|
650
822
|
return globalThis.fetch;
|
|
@@ -671,7 +843,8 @@ var Util = class {
|
|
|
671
843
|
return src[Math.floor(Math.random() * src.length)];
|
|
672
844
|
}
|
|
673
845
|
};
|
|
674
|
-
__name(
|
|
846
|
+
__name(_Util, "Util");
|
|
847
|
+
var Util = _Util;
|
|
675
848
|
var VALIDATE_QUEUE_CAP = /* @__PURE__ */ __name((queue, items) => {
|
|
676
849
|
const tracks = items instanceof Playlist ? items.tracks : Array.isArray(items) ? items : [items];
|
|
677
850
|
if (queue.maxSize < 1 || queue.maxSize === Infinity)
|
|
@@ -683,7 +856,7 @@ var VALIDATE_QUEUE_CAP = /* @__PURE__ */ __name((queue, items) => {
|
|
|
683
856
|
}, "VALIDATE_QUEUE_CAP");
|
|
684
857
|
|
|
685
858
|
// src/utils/PlayerEventsEmitter.ts
|
|
686
|
-
var
|
|
859
|
+
var _PlayerEventsEmitter = class _PlayerEventsEmitter extends import_utils.EventEmitter {
|
|
687
860
|
constructor(requiredEvents = []) {
|
|
688
861
|
super();
|
|
689
862
|
this.requiredEvents = requiredEvents;
|
|
@@ -700,65 +873,134 @@ var PlayerEventsEmitter = class extends import_utils.EventEmitter {
|
|
|
700
873
|
return super.emit(name, ...args);
|
|
701
874
|
}
|
|
702
875
|
};
|
|
703
|
-
__name(
|
|
876
|
+
__name(_PlayerEventsEmitter, "PlayerEventsEmitter");
|
|
877
|
+
var PlayerEventsEmitter = _PlayerEventsEmitter;
|
|
704
878
|
|
|
705
879
|
// src/extractors/BaseExtractor.ts
|
|
706
|
-
var
|
|
880
|
+
var _BaseExtractor = class _BaseExtractor {
|
|
881
|
+
/**
|
|
882
|
+
* Extractor constructor
|
|
883
|
+
* @param context Context that instantiated this extractor
|
|
884
|
+
* @param options Initialization options for this extractor
|
|
885
|
+
*/
|
|
707
886
|
constructor(context, options = {}) {
|
|
708
887
|
this.context = context;
|
|
709
888
|
this.options = options;
|
|
889
|
+
/**
|
|
890
|
+
* Handle bridge query creation
|
|
891
|
+
* @param track The track to build query for
|
|
892
|
+
*/
|
|
710
893
|
this.createBridgeQuery = /* @__PURE__ */ __name((track) => `${track.title} by ${track.author} official audio`, "createBridgeQuery");
|
|
711
894
|
}
|
|
895
|
+
/**
|
|
896
|
+
* Identifier of this extractor
|
|
897
|
+
*/
|
|
712
898
|
get identifier() {
|
|
713
899
|
return this.constructor.identifier;
|
|
714
900
|
}
|
|
901
|
+
/**
|
|
902
|
+
* Reconfigures this extractor
|
|
903
|
+
* @param options The new options to apply
|
|
904
|
+
*/
|
|
715
905
|
async reconfigure(options) {
|
|
716
906
|
this.options = options;
|
|
717
907
|
await this.deactivate();
|
|
718
908
|
await this.activate();
|
|
719
909
|
}
|
|
910
|
+
/**
|
|
911
|
+
* This method will be executed when this extractor is activated
|
|
912
|
+
*/
|
|
720
913
|
async activate() {
|
|
721
914
|
return;
|
|
722
915
|
}
|
|
916
|
+
/**
|
|
917
|
+
* This method will be executed when this extractor is deactivated
|
|
918
|
+
*/
|
|
723
919
|
async deactivate() {
|
|
724
920
|
return;
|
|
725
921
|
}
|
|
922
|
+
/**
|
|
923
|
+
* Validate incoming query
|
|
924
|
+
* @param query The query to validate
|
|
925
|
+
*/
|
|
726
926
|
async validate(query, type) {
|
|
727
927
|
return false;
|
|
728
928
|
}
|
|
929
|
+
/**
|
|
930
|
+
* Stream the given track
|
|
931
|
+
* @param info The track to stream
|
|
932
|
+
*/
|
|
729
933
|
async stream(info) {
|
|
730
934
|
throw Exceptions.ERR_NOT_IMPLEMENTED(`${this.constructor.name}.stream()`);
|
|
731
935
|
}
|
|
936
|
+
/**
|
|
937
|
+
* Handle the given query
|
|
938
|
+
* @param query The query to handle
|
|
939
|
+
*/
|
|
732
940
|
async handle(query, context) {
|
|
733
941
|
throw Exceptions.ERR_NOT_IMPLEMENTED(`${this.constructor.name}.handle()`);
|
|
734
942
|
}
|
|
735
|
-
|
|
943
|
+
/**
|
|
944
|
+
* Get related tracks for the given track
|
|
945
|
+
* @param track The track source
|
|
946
|
+
*/
|
|
947
|
+
async getRelatedTracks(track, history) {
|
|
736
948
|
throw Exceptions.ERR_NOT_IMPLEMENTED(`${this.constructor.name}.getRelatedTracks()`);
|
|
737
949
|
}
|
|
950
|
+
/**
|
|
951
|
+
* A stream middleware to handle streams before passing it to the player
|
|
952
|
+
* @param stream The incoming stream
|
|
953
|
+
* @param next The next function
|
|
954
|
+
*/
|
|
738
955
|
handlePostStream(stream, next) {
|
|
739
956
|
return next(null, stream);
|
|
740
957
|
}
|
|
958
|
+
/**
|
|
959
|
+
* Dispatch an event to the player
|
|
960
|
+
* @param event The event to dispatch
|
|
961
|
+
* @param args The data to dispatch
|
|
962
|
+
*/
|
|
741
963
|
emit(event, ...args) {
|
|
742
964
|
return this.context.player.emit(event, ...args);
|
|
743
965
|
}
|
|
966
|
+
/**
|
|
967
|
+
* Create extractor response
|
|
968
|
+
* @param playlist The playlist
|
|
969
|
+
* @param tracks The track array
|
|
970
|
+
*/
|
|
744
971
|
createResponse(playlist, tracks = playlist?.tracks || []) {
|
|
745
972
|
return { playlist: playlist || null, tracks };
|
|
746
973
|
}
|
|
974
|
+
/**
|
|
975
|
+
* Write debug message
|
|
976
|
+
* @param message The debug message
|
|
977
|
+
*/
|
|
747
978
|
debug(message) {
|
|
748
979
|
return this.context.player.debug(message);
|
|
749
980
|
}
|
|
981
|
+
/**
|
|
982
|
+
* IP rotator instance, if available
|
|
983
|
+
*/
|
|
984
|
+
get routePlanner() {
|
|
985
|
+
return this.context.player.routePlanner;
|
|
986
|
+
}
|
|
750
987
|
};
|
|
751
|
-
__name(
|
|
752
|
-
|
|
988
|
+
__name(_BaseExtractor, "BaseExtractor");
|
|
989
|
+
/**
|
|
990
|
+
* Identifier for this extractor
|
|
991
|
+
*/
|
|
992
|
+
_BaseExtractor.identifier = "com.discord-player.extractor";
|
|
993
|
+
var BaseExtractor = _BaseExtractor;
|
|
753
994
|
|
|
754
995
|
// src/extractors/ExtractorExecutionContext.ts
|
|
755
996
|
var import_utils2 = require("@discord-player/utils");
|
|
756
997
|
|
|
757
998
|
// src/utils/TypeUtil.ts
|
|
758
|
-
var
|
|
999
|
+
var _TypeUtil = class _TypeUtil {
|
|
759
1000
|
constructor() {
|
|
760
|
-
return
|
|
1001
|
+
return _TypeUtil;
|
|
761
1002
|
}
|
|
1003
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
762
1004
|
static isFunction(t) {
|
|
763
1005
|
return typeof t === "function";
|
|
764
1006
|
}
|
|
@@ -781,7 +1023,8 @@ var TypeUtil = class {
|
|
|
781
1023
|
return t instanceof Error;
|
|
782
1024
|
}
|
|
783
1025
|
};
|
|
784
|
-
__name(
|
|
1026
|
+
__name(_TypeUtil, "TypeUtil");
|
|
1027
|
+
var TypeUtil = _TypeUtil;
|
|
785
1028
|
|
|
786
1029
|
// src/extractors/ExtractorExecutionContext.ts
|
|
787
1030
|
var knownExtractorKeys = [
|
|
@@ -794,12 +1037,15 @@ var knownExtractorKeys = [
|
|
|
794
1037
|
"AttachmentExtractor"
|
|
795
1038
|
];
|
|
796
1039
|
var knownExtractorLib = "@discord-player/extractor";
|
|
797
|
-
var
|
|
1040
|
+
var _ExtractorExecutionContext = class _ExtractorExecutionContext extends PlayerEventsEmitter {
|
|
798
1041
|
constructor(player) {
|
|
799
1042
|
super(["error"]);
|
|
800
1043
|
this.player = player;
|
|
801
1044
|
this.store = new import_utils2.Collection();
|
|
802
1045
|
}
|
|
1046
|
+
/**
|
|
1047
|
+
* Load default extractors from `@discord-player/extractor`
|
|
1048
|
+
*/
|
|
803
1049
|
async loadDefault(filter) {
|
|
804
1050
|
const mod = await Util.import(knownExtractorLib);
|
|
805
1051
|
if (mod.error)
|
|
@@ -811,15 +1057,31 @@ var ExtractorExecutionContext = class extends PlayerEventsEmitter {
|
|
|
811
1057
|
});
|
|
812
1058
|
return { success: true, error: null };
|
|
813
1059
|
}
|
|
1060
|
+
/**
|
|
1061
|
+
* Validate if the given extractor is registered
|
|
1062
|
+
* @param identifier The extractor identifier
|
|
1063
|
+
*/
|
|
814
1064
|
isRegistered(identifier) {
|
|
815
1065
|
return this.store.has(identifier);
|
|
816
1066
|
}
|
|
1067
|
+
/**
|
|
1068
|
+
* The size of registered extractors
|
|
1069
|
+
*/
|
|
817
1070
|
get size() {
|
|
818
1071
|
return this.store.size;
|
|
819
1072
|
}
|
|
1073
|
+
/**
|
|
1074
|
+
* Get single extractor
|
|
1075
|
+
* @param identifier The extractor to get
|
|
1076
|
+
*/
|
|
820
1077
|
get(identifier) {
|
|
821
1078
|
return this.store.get(identifier);
|
|
822
1079
|
}
|
|
1080
|
+
/**
|
|
1081
|
+
* Register single extractor
|
|
1082
|
+
* @param _extractor The extractor to register
|
|
1083
|
+
* @param options Options supplied to the extractor
|
|
1084
|
+
*/
|
|
823
1085
|
async register(_extractor, options) {
|
|
824
1086
|
if (typeof _extractor.identifier !== "string" || this.store.has(_extractor.identifier))
|
|
825
1087
|
return null;
|
|
@@ -844,6 +1106,10 @@ var ExtractorExecutionContext = class extends PlayerEventsEmitter {
|
|
|
844
1106
|
return null;
|
|
845
1107
|
}
|
|
846
1108
|
}
|
|
1109
|
+
/**
|
|
1110
|
+
* Unregister single extractor
|
|
1111
|
+
* @param _extractor The extractor to unregister
|
|
1112
|
+
*/
|
|
847
1113
|
async unregister(_extractor) {
|
|
848
1114
|
const extractor = typeof _extractor === "string" ? this.store.get(_extractor) : this.store.find((r) => r === _extractor);
|
|
849
1115
|
if (!extractor)
|
|
@@ -864,12 +1130,20 @@ var ExtractorExecutionContext = class extends PlayerEventsEmitter {
|
|
|
864
1130
|
this.emit("error", this, extractor, e);
|
|
865
1131
|
}
|
|
866
1132
|
}
|
|
1133
|
+
/**
|
|
1134
|
+
* Unregister all extractors
|
|
1135
|
+
*/
|
|
867
1136
|
async unregisterAll() {
|
|
868
1137
|
try {
|
|
869
1138
|
await Promise.all(this.store.map((e) => this.unregister(e)));
|
|
870
1139
|
} catch {
|
|
871
1140
|
}
|
|
872
1141
|
}
|
|
1142
|
+
/**
|
|
1143
|
+
* Run all the extractors
|
|
1144
|
+
* @param fn The runner function
|
|
1145
|
+
* @param filterBlocked Filter blocked extractors
|
|
1146
|
+
*/
|
|
873
1147
|
async run(fn, filterBlocked = true) {
|
|
874
1148
|
const blocked = this.player.options.blockExtractors ?? [];
|
|
875
1149
|
if (!this.store.size) {
|
|
@@ -913,7 +1187,8 @@ var ExtractorExecutionContext = class extends PlayerEventsEmitter {
|
|
|
913
1187
|
};
|
|
914
1188
|
}
|
|
915
1189
|
};
|
|
916
|
-
__name(
|
|
1190
|
+
__name(_ExtractorExecutionContext, "ExtractorExecutionContext");
|
|
1191
|
+
var ExtractorExecutionContext = _ExtractorExecutionContext;
|
|
917
1192
|
|
|
918
1193
|
// src/manager/GuildNodeManager.ts
|
|
919
1194
|
var import_utils7 = require("@discord-player/utils");
|
|
@@ -931,7 +1206,7 @@ var import_equalizer = require("@discord-player/equalizer");
|
|
|
931
1206
|
var import_stream = require("stream");
|
|
932
1207
|
var import_discord_voip = require("discord-voip");
|
|
933
1208
|
var prism = __toESM(require("prism-media"));
|
|
934
|
-
var
|
|
1209
|
+
var _VoiceReceiverNode = class _VoiceReceiverNode {
|
|
935
1210
|
constructor(dispatcher) {
|
|
936
1211
|
this.dispatcher = dispatcher;
|
|
937
1212
|
}
|
|
@@ -953,9 +1228,18 @@ var VoiceReceiverNode = class {
|
|
|
953
1228
|
}
|
|
954
1229
|
});
|
|
955
1230
|
}
|
|
1231
|
+
/**
|
|
1232
|
+
* Merge multiple streams together
|
|
1233
|
+
* @param streams The array of streams to merge
|
|
1234
|
+
*/
|
|
956
1235
|
mergeRecordings(streams) {
|
|
957
1236
|
throw Exceptions.ERR_NOT_IMPLEMENTED(`${this.constructor.name}.mergeRecordings()`);
|
|
958
1237
|
}
|
|
1238
|
+
/**
|
|
1239
|
+
* Record a user in voice channel
|
|
1240
|
+
* @param user The user to record
|
|
1241
|
+
* @param options Recording options
|
|
1242
|
+
*/
|
|
959
1243
|
recordUser(user, options = {
|
|
960
1244
|
end: import_discord_voip.EndBehaviorType.AfterSilence,
|
|
961
1245
|
mode: "pcm",
|
|
@@ -977,6 +1261,7 @@ var VoiceReceiverNode = class {
|
|
|
977
1261
|
setImmediate(async () => {
|
|
978
1262
|
if (options.mode === "pcm") {
|
|
979
1263
|
const pcm = receiveStream.pipe(
|
|
1264
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
980
1265
|
new (prism.opus || prism.default.opus).Decoder({
|
|
981
1266
|
channels: 2,
|
|
982
1267
|
frameSize: 960,
|
|
@@ -993,10 +1278,17 @@ var VoiceReceiverNode = class {
|
|
|
993
1278
|
return passThrough;
|
|
994
1279
|
}
|
|
995
1280
|
};
|
|
996
|
-
__name(
|
|
1281
|
+
__name(_VoiceReceiverNode, "VoiceReceiverNode");
|
|
1282
|
+
var VoiceReceiverNode = _VoiceReceiverNode;
|
|
997
1283
|
|
|
998
1284
|
// src/VoiceInterface/StreamDispatcher.ts
|
|
999
|
-
var
|
|
1285
|
+
var _StreamDispatcher = class _StreamDispatcher extends import_utils3.EventEmitter {
|
|
1286
|
+
/**
|
|
1287
|
+
* Creates new connection object
|
|
1288
|
+
* @param {VoiceConnection} connection The connection
|
|
1289
|
+
* @param {VoiceChannel|StageChannel} channel The connected channel
|
|
1290
|
+
* @private
|
|
1291
|
+
*/
|
|
1000
1292
|
constructor(connection, channel, queue, connectionTimeout = 2e4, audioPlayer) {
|
|
1001
1293
|
super();
|
|
1002
1294
|
this.queue = queue;
|
|
@@ -1077,39 +1369,75 @@ var StreamDispatcher = class extends import_utils3.EventEmitter {
|
|
|
1077
1369
|
});
|
|
1078
1370
|
this.voiceConnection.subscribe(this.audioPlayer);
|
|
1079
1371
|
}
|
|
1372
|
+
/**
|
|
1373
|
+
* Check if the player has been paused manually
|
|
1374
|
+
*/
|
|
1080
1375
|
get paused() {
|
|
1081
1376
|
return this.audioPlayer.state.status === import_discord_voip2.AudioPlayerStatus.Paused;
|
|
1082
1377
|
}
|
|
1083
1378
|
set paused(val) {
|
|
1084
1379
|
val ? this.pause(true) : this.resume();
|
|
1085
1380
|
}
|
|
1381
|
+
/**
|
|
1382
|
+
* Whether or not the player is currently paused automatically or manually.
|
|
1383
|
+
*/
|
|
1086
1384
|
isPaused() {
|
|
1087
1385
|
return this.paused || this.audioPlayer.state.status === import_discord_voip2.AudioPlayerStatus.AutoPaused;
|
|
1088
1386
|
}
|
|
1387
|
+
/**
|
|
1388
|
+
* Whether or not the player is currently buffering
|
|
1389
|
+
*/
|
|
1089
1390
|
isBuffering() {
|
|
1090
1391
|
return this.audioPlayer.state.status === import_discord_voip2.AudioPlayerStatus.Buffering;
|
|
1091
1392
|
}
|
|
1393
|
+
/**
|
|
1394
|
+
* Whether or not the player is currently playing
|
|
1395
|
+
*/
|
|
1092
1396
|
isPlaying() {
|
|
1093
1397
|
return this.audioPlayer.state.status === import_discord_voip2.AudioPlayerStatus.Playing;
|
|
1094
1398
|
}
|
|
1399
|
+
/**
|
|
1400
|
+
* Whether or not the player is currently idle
|
|
1401
|
+
*/
|
|
1095
1402
|
isIdle() {
|
|
1096
1403
|
return this.audioPlayer.state.status === import_discord_voip2.AudioPlayerStatus.Idle;
|
|
1097
1404
|
}
|
|
1405
|
+
/**
|
|
1406
|
+
* Whether or not the voice connection has been destroyed
|
|
1407
|
+
*/
|
|
1098
1408
|
isDestroyed() {
|
|
1099
1409
|
return this.voiceConnection.state.status === import_discord_voip2.VoiceConnectionStatus.Destroyed;
|
|
1100
1410
|
}
|
|
1411
|
+
/**
|
|
1412
|
+
* Whether or not the voice connection has been destroyed
|
|
1413
|
+
*/
|
|
1101
1414
|
isDisconnected() {
|
|
1102
1415
|
return this.voiceConnection.state.status === import_discord_voip2.VoiceConnectionStatus.Disconnected;
|
|
1103
1416
|
}
|
|
1417
|
+
/**
|
|
1418
|
+
* Whether or not the voice connection is ready to play
|
|
1419
|
+
*/
|
|
1104
1420
|
isReady() {
|
|
1105
1421
|
return this.voiceConnection.state.status === import_discord_voip2.VoiceConnectionStatus.Ready;
|
|
1106
1422
|
}
|
|
1423
|
+
/**
|
|
1424
|
+
* Whether or not the voice connection is signalling
|
|
1425
|
+
*/
|
|
1107
1426
|
isSignalling() {
|
|
1108
1427
|
return this.voiceConnection.state.status === import_discord_voip2.VoiceConnectionStatus.Signalling;
|
|
1109
1428
|
}
|
|
1429
|
+
/**
|
|
1430
|
+
* Whether or not the voice connection is connecting
|
|
1431
|
+
*/
|
|
1110
1432
|
isConnecting() {
|
|
1111
1433
|
return this.voiceConnection.state.status === import_discord_voip2.VoiceConnectionStatus.Connecting;
|
|
1112
1434
|
}
|
|
1435
|
+
/**
|
|
1436
|
+
* Creates stream
|
|
1437
|
+
* @param {Readable} src The stream source
|
|
1438
|
+
* @param {object} [ops] Options
|
|
1439
|
+
* @returns {AudioResource}
|
|
1440
|
+
*/
|
|
1113
1441
|
async createStream(src, ops) {
|
|
1114
1442
|
if (!ops?.disableFilters && this.queue.hasDebugger)
|
|
1115
1443
|
this.queue.debug("Initiating DSP filters pipeline...");
|
|
@@ -1148,6 +1476,7 @@ var StreamDispatcher = class extends import_utils3.EventEmitter {
|
|
|
1148
1476
|
this.audioResource = (0, import_discord_voip2.createAudioResource)(postStream?.stream ?? stream, {
|
|
1149
1477
|
inputType: postStream?.type ?? ops?.type ?? import_discord_voip2.StreamType.Arbitrary,
|
|
1150
1478
|
metadata: ops?.data,
|
|
1479
|
+
// volume controls happen from AudioFilter DSP utility
|
|
1151
1480
|
inlineVolume: false
|
|
1152
1481
|
});
|
|
1153
1482
|
return this.audioResource;
|
|
@@ -1164,9 +1493,17 @@ var StreamDispatcher = class extends import_utils3.EventEmitter {
|
|
|
1164
1493
|
get equalizer() {
|
|
1165
1494
|
return this.dsp?.equalizer || null;
|
|
1166
1495
|
}
|
|
1496
|
+
/**
|
|
1497
|
+
* The player status
|
|
1498
|
+
* @type {AudioPlayerStatus}
|
|
1499
|
+
*/
|
|
1167
1500
|
get status() {
|
|
1168
1501
|
return this.audioPlayer.state.status;
|
|
1169
1502
|
}
|
|
1503
|
+
/**
|
|
1504
|
+
* Disconnects from voice
|
|
1505
|
+
* @returns {void}
|
|
1506
|
+
*/
|
|
1170
1507
|
disconnect() {
|
|
1171
1508
|
try {
|
|
1172
1509
|
if (this.audioPlayer)
|
|
@@ -1176,6 +1513,9 @@ var StreamDispatcher = class extends import_utils3.EventEmitter {
|
|
|
1176
1513
|
} catch {
|
|
1177
1514
|
}
|
|
1178
1515
|
}
|
|
1516
|
+
/**
|
|
1517
|
+
* Destroys this dispatcher
|
|
1518
|
+
*/
|
|
1179
1519
|
destroy() {
|
|
1180
1520
|
this.disconnect();
|
|
1181
1521
|
this.audioPlayer.removeAllListeners();
|
|
@@ -1184,6 +1524,10 @@ var StreamDispatcher = class extends import_utils3.EventEmitter {
|
|
|
1184
1524
|
this.audioResource = null;
|
|
1185
1525
|
this.emit("destroyed");
|
|
1186
1526
|
}
|
|
1527
|
+
/**
|
|
1528
|
+
* Stops the player
|
|
1529
|
+
* @returns {void}
|
|
1530
|
+
*/
|
|
1187
1531
|
end() {
|
|
1188
1532
|
try {
|
|
1189
1533
|
this.audioPlayer.stop();
|
|
@@ -1191,14 +1535,28 @@ var StreamDispatcher = class extends import_utils3.EventEmitter {
|
|
|
1191
1535
|
} catch {
|
|
1192
1536
|
}
|
|
1193
1537
|
}
|
|
1538
|
+
/**
|
|
1539
|
+
* Pauses the stream playback
|
|
1540
|
+
* @param {boolean} [interpolateSilence=false] If true, the player will play 5 packets of silence after pausing to prevent audio glitches.
|
|
1541
|
+
* @returns {boolean}
|
|
1542
|
+
*/
|
|
1194
1543
|
pause(interpolateSilence) {
|
|
1195
1544
|
const success = this.audioPlayer.pause(interpolateSilence);
|
|
1196
1545
|
return success;
|
|
1197
1546
|
}
|
|
1547
|
+
/**
|
|
1548
|
+
* Resumes the stream playback
|
|
1549
|
+
* @returns {boolean}
|
|
1550
|
+
*/
|
|
1198
1551
|
resume() {
|
|
1199
1552
|
const success = this.audioPlayer.unpause();
|
|
1200
1553
|
return success;
|
|
1201
1554
|
}
|
|
1555
|
+
/**
|
|
1556
|
+
* Play stream
|
|
1557
|
+
* @param {AudioResource<Track>} [resource=this.audioResource] The audio resource to play
|
|
1558
|
+
* @returns {Promise<StreamDispatcher>}
|
|
1559
|
+
*/
|
|
1202
1560
|
async playStream(resource = this.audioResource) {
|
|
1203
1561
|
if (!resource) {
|
|
1204
1562
|
throw Exceptions.ERR_NO_AUDIO_RESOURCE();
|
|
@@ -1222,55 +1580,91 @@ var StreamDispatcher = class extends import_utils3.EventEmitter {
|
|
|
1222
1580
|
}
|
|
1223
1581
|
return this;
|
|
1224
1582
|
}
|
|
1583
|
+
/**
|
|
1584
|
+
* Sets playback volume
|
|
1585
|
+
* @param {number} value The volume amount
|
|
1586
|
+
* @returns {boolean}
|
|
1587
|
+
*/
|
|
1225
1588
|
setVolume(value) {
|
|
1226
1589
|
if (!this.dsp.volume)
|
|
1227
1590
|
return false;
|
|
1228
1591
|
return this.dsp.volume.setVolume(value);
|
|
1229
1592
|
}
|
|
1593
|
+
/**
|
|
1594
|
+
* The current volume
|
|
1595
|
+
* @type {number}
|
|
1596
|
+
*/
|
|
1230
1597
|
get volume() {
|
|
1231
1598
|
if (!this.dsp.volume)
|
|
1232
1599
|
return 100;
|
|
1233
1600
|
return this.dsp.volume.volume;
|
|
1234
1601
|
}
|
|
1602
|
+
/**
|
|
1603
|
+
* The playback time
|
|
1604
|
+
* @type {number}
|
|
1605
|
+
*/
|
|
1235
1606
|
get streamTime() {
|
|
1236
1607
|
if (!this.audioResource)
|
|
1237
1608
|
return 0;
|
|
1238
1609
|
return this.audioResource.playbackDuration;
|
|
1239
1610
|
}
|
|
1240
1611
|
};
|
|
1241
|
-
__name(
|
|
1612
|
+
__name(_StreamDispatcher, "StreamDispatcher");
|
|
1613
|
+
var StreamDispatcher = _StreamDispatcher;
|
|
1242
1614
|
|
|
1243
1615
|
// src/manager/GuildQueue.ts
|
|
1244
1616
|
var import_discord_voip4 = require("discord-voip");
|
|
1245
1617
|
|
|
1246
1618
|
// src/manager/GuildQueueHistory.ts
|
|
1247
1619
|
var import_utils4 = require("@discord-player/utils");
|
|
1248
|
-
var
|
|
1620
|
+
var _GuildQueueHistory = class _GuildQueueHistory {
|
|
1249
1621
|
constructor(queue) {
|
|
1250
1622
|
this.queue = queue;
|
|
1251
1623
|
this.tracks = new import_utils4.Queue("LIFO");
|
|
1252
1624
|
}
|
|
1625
|
+
/**
|
|
1626
|
+
* Current track in the queue
|
|
1627
|
+
*/
|
|
1253
1628
|
get currentTrack() {
|
|
1254
1629
|
return this.queue.dispatcher?.audioResource?.metadata || this.queue.__current;
|
|
1255
1630
|
}
|
|
1631
|
+
/**
|
|
1632
|
+
* Next track in the queue
|
|
1633
|
+
*/
|
|
1256
1634
|
get nextTrack() {
|
|
1257
1635
|
return this.queue.tracks.at(0) || null;
|
|
1258
1636
|
}
|
|
1637
|
+
/**
|
|
1638
|
+
* Previous track in the queue
|
|
1639
|
+
*/
|
|
1259
1640
|
get previousTrack() {
|
|
1260
1641
|
return this.tracks.at(0) || null;
|
|
1261
1642
|
}
|
|
1643
|
+
/**
|
|
1644
|
+
* If history is disabled
|
|
1645
|
+
*/
|
|
1262
1646
|
get disabled() {
|
|
1263
1647
|
return this.queue.options.disableHistory;
|
|
1264
1648
|
}
|
|
1649
|
+
/**
|
|
1650
|
+
* Gets the size of the queue
|
|
1651
|
+
*/
|
|
1265
1652
|
get size() {
|
|
1266
1653
|
return this.tracks.size;
|
|
1267
1654
|
}
|
|
1268
1655
|
getSize() {
|
|
1269
1656
|
return this.size;
|
|
1270
1657
|
}
|
|
1658
|
+
/**
|
|
1659
|
+
* If history is empty
|
|
1660
|
+
*/
|
|
1271
1661
|
isEmpty() {
|
|
1272
1662
|
return this.tracks.size < 1;
|
|
1273
1663
|
}
|
|
1664
|
+
/**
|
|
1665
|
+
* Add track to track history
|
|
1666
|
+
* @param track The track to add
|
|
1667
|
+
*/
|
|
1274
1668
|
push(track) {
|
|
1275
1669
|
if (this.disabled)
|
|
1276
1670
|
return false;
|
|
@@ -1278,9 +1672,15 @@ var GuildQueueHistory = class {
|
|
|
1278
1672
|
this.resize();
|
|
1279
1673
|
return true;
|
|
1280
1674
|
}
|
|
1675
|
+
/**
|
|
1676
|
+
* Clear history
|
|
1677
|
+
*/
|
|
1281
1678
|
clear() {
|
|
1282
1679
|
this.tracks.clear();
|
|
1283
1680
|
}
|
|
1681
|
+
/**
|
|
1682
|
+
* Play the next track in the queue
|
|
1683
|
+
*/
|
|
1284
1684
|
async next() {
|
|
1285
1685
|
const track = this.nextTrack;
|
|
1286
1686
|
if (!track) {
|
|
@@ -1288,6 +1688,9 @@ var GuildQueueHistory = class {
|
|
|
1288
1688
|
}
|
|
1289
1689
|
this.queue.node.skip();
|
|
1290
1690
|
}
|
|
1691
|
+
/**
|
|
1692
|
+
* Play the previous track in the queue
|
|
1693
|
+
*/
|
|
1291
1694
|
async previous(preserveCurrent = true) {
|
|
1292
1695
|
const track = this.tracks.dispatch();
|
|
1293
1696
|
if (!track) {
|
|
@@ -1298,9 +1701,15 @@ var GuildQueueHistory = class {
|
|
|
1298
1701
|
if (current && preserveCurrent)
|
|
1299
1702
|
this.queue.node.insert(current, 0);
|
|
1300
1703
|
}
|
|
1704
|
+
/**
|
|
1705
|
+
* Alias to [GuildQueueHistory].previous()
|
|
1706
|
+
*/
|
|
1301
1707
|
back(preserveCurrent = true) {
|
|
1302
1708
|
return this.previous(preserveCurrent);
|
|
1303
1709
|
}
|
|
1710
|
+
/**
|
|
1711
|
+
* Resize history store
|
|
1712
|
+
*/
|
|
1304
1713
|
resize() {
|
|
1305
1714
|
if (!Number.isFinite(this.queue.maxHistorySize))
|
|
1306
1715
|
return;
|
|
@@ -1309,7 +1718,8 @@ var GuildQueueHistory = class {
|
|
|
1309
1718
|
this.tracks.store.splice(this.queue.maxHistorySize);
|
|
1310
1719
|
}
|
|
1311
1720
|
};
|
|
1312
|
-
__name(
|
|
1721
|
+
__name(_GuildQueueHistory, "GuildQueueHistory");
|
|
1722
|
+
var GuildQueueHistory = _GuildQueueHistory;
|
|
1313
1723
|
|
|
1314
1724
|
// src/manager/GuildQueuePlayerNode.ts
|
|
1315
1725
|
var import_discord_voip3 = require("discord-voip");
|
|
@@ -1329,9 +1739,21 @@ var soundcloudPlaylistRegex = /^https?:\/\/(m.|www.)?soundcloud.com\/(\w|-)+\/se
|
|
|
1329
1739
|
var youtubePlaylistRegex = /^https?:\/\/(www.)?youtube.com\/playlist\?list=((PL|FL|UU|LL|RD|OL)[a-zA-Z0-9-_]{16,41})$/;
|
|
1330
1740
|
var youtubeVideoURLRegex = /^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w-]+\?v=|embed\/|v\/)?)([\w-]+)(\S+)?$/;
|
|
1331
1741
|
var youtubeVideoIdRegex = /^[a-zA-Z0-9-_]{11}$/;
|
|
1332
|
-
var
|
|
1742
|
+
var DomainsMap = {
|
|
1743
|
+
YouTube: ["youtube.com", "youtu.be", "music.youtube.com", "gaming.youtube.com", "www.youtube.com"],
|
|
1744
|
+
Spotify: ["open.spotify.com", "embed.spotify.com"],
|
|
1745
|
+
Vimeo: ["vimeo.com", "player.vimeo.com"],
|
|
1746
|
+
ReverbNation: ["reverbnation.com"],
|
|
1747
|
+
SoundCloud: ["soundcloud.com"],
|
|
1748
|
+
AppleMusic: ["music.apple.com"]
|
|
1749
|
+
};
|
|
1750
|
+
var _QueryResolver = class _QueryResolver {
|
|
1751
|
+
/**
|
|
1752
|
+
* Query resolver
|
|
1753
|
+
*/
|
|
1333
1754
|
constructor() {
|
|
1334
1755
|
}
|
|
1756
|
+
// eslint-disable-line @typescript-eslint/no-empty-function
|
|
1335
1757
|
static get regex() {
|
|
1336
1758
|
return {
|
|
1337
1759
|
spotifyAlbumRegex,
|
|
@@ -1348,51 +1770,72 @@ var QueryResolver = class {
|
|
|
1348
1770
|
youtubePlaylistRegex
|
|
1349
1771
|
};
|
|
1350
1772
|
}
|
|
1773
|
+
/**
|
|
1774
|
+
* Resolves the given search query
|
|
1775
|
+
* @param {string} query The query
|
|
1776
|
+
*/
|
|
1351
1777
|
static resolve(query, fallbackSearchEngine = QueryType.AUTO_SEARCH) {
|
|
1352
1778
|
if (!TypeUtil.isString(query))
|
|
1353
1779
|
throw Exceptions.ERR_INVALID_ARG_TYPE(query, "string", typeof query);
|
|
1354
1780
|
if (!query.length)
|
|
1355
1781
|
throw Exceptions.ERR_INFO_REQUIRED("query", String(query));
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1782
|
+
const resolver = /* @__PURE__ */ __name((type, query2) => ({ type, query: query2 }), "resolver");
|
|
1783
|
+
try {
|
|
1784
|
+
const url = new URL(query);
|
|
1785
|
+
if (DomainsMap.YouTube.includes(url.host)) {
|
|
1786
|
+
query = query.replace(/(m(usic)?|gaming)\./, "").trim();
|
|
1787
|
+
const playlistId = url.searchParams.get("list");
|
|
1788
|
+
if (playlistId) {
|
|
1789
|
+
return resolver(QueryType.YOUTUBE_PLAYLIST, `https://www.youtube.com/playlist?list=${playlistId}`);
|
|
1790
|
+
}
|
|
1791
|
+
if (_QueryResolver.validateId(query) || _QueryResolver.validateURL(query))
|
|
1792
|
+
return resolver(QueryType.YOUTUBE_VIDEO, query);
|
|
1793
|
+
return resolver(fallbackSearchEngine, query);
|
|
1794
|
+
} else if (DomainsMap.Spotify.includes(url.host)) {
|
|
1795
|
+
query = query.replace(/intl-([a-zA-Z]+)\//, "");
|
|
1796
|
+
if (spotifyPlaylistRegex.test(query))
|
|
1797
|
+
return resolver(QueryType.SPOTIFY_PLAYLIST, query);
|
|
1798
|
+
if (spotifyAlbumRegex.test(query))
|
|
1799
|
+
return resolver(QueryType.SPOTIFY_ALBUM, query);
|
|
1800
|
+
if (spotifySongRegex.test(query))
|
|
1801
|
+
return resolver(QueryType.SPOTIFY_SONG, query);
|
|
1802
|
+
return resolver(fallbackSearchEngine, query);
|
|
1803
|
+
} else if (DomainsMap.Vimeo.includes(url.host)) {
|
|
1804
|
+
if (vimeoRegex.test(query))
|
|
1805
|
+
return resolver(QueryType.VIMEO, query);
|
|
1806
|
+
return resolver(fallbackSearchEngine, query);
|
|
1807
|
+
} else if (DomainsMap.ReverbNation.includes(url.host)) {
|
|
1808
|
+
if (reverbnationRegex.test(query))
|
|
1809
|
+
return resolver(QueryType.REVERBNATION, query);
|
|
1810
|
+
return resolver(fallbackSearchEngine, query);
|
|
1811
|
+
} else if (DomainsMap.SoundCloud.includes(url.host)) {
|
|
1812
|
+
if (soundcloudPlaylistRegex.test(query))
|
|
1813
|
+
return resolver(QueryType.SOUNDCLOUD_PLAYLIST, query);
|
|
1814
|
+
if (soundcloudTrackRegex.test(query))
|
|
1815
|
+
return resolver(QueryType.SOUNDCLOUD_TRACK, query);
|
|
1816
|
+
return resolver(fallbackSearchEngine, query);
|
|
1817
|
+
} else if (DomainsMap.AppleMusic.includes(url.host)) {
|
|
1818
|
+
if (appleMusicAlbumRegex.test(query))
|
|
1819
|
+
return resolver(QueryType.APPLE_MUSIC_ALBUM, query);
|
|
1820
|
+
if (appleMusicPlaylistRegex.test(query))
|
|
1821
|
+
return resolver(QueryType.APPLE_MUSIC_PLAYLIST, query);
|
|
1822
|
+
if (appleMusicSongRegex.test(query))
|
|
1823
|
+
return resolver(QueryType.APPLE_MUSIC_SONG, query);
|
|
1824
|
+
return resolver(fallbackSearchEngine, query);
|
|
1825
|
+
} else {
|
|
1826
|
+
return resolver(QueryType.ARBITRARY, query);
|
|
1827
|
+
}
|
|
1828
|
+
} catch {
|
|
1829
|
+
return resolver(fallbackSearchEngine, query);
|
|
1830
|
+
}
|
|
1393
1831
|
}
|
|
1832
|
+
/**
|
|
1833
|
+
* Parses vimeo id from url
|
|
1834
|
+
* @param {string} query The query
|
|
1835
|
+
* @returns {string}
|
|
1836
|
+
*/
|
|
1394
1837
|
static getVimeoID(query) {
|
|
1395
|
-
return
|
|
1838
|
+
return _QueryResolver.resolve(query).type === QueryType.VIMEO ? query.split("/").filter(Boolean).pop() : null;
|
|
1396
1839
|
}
|
|
1397
1840
|
static validateId(q) {
|
|
1398
1841
|
return youtubeVideoIdRegex.test(q);
|
|
@@ -1401,26 +1844,50 @@ var QueryResolver = class {
|
|
|
1401
1844
|
return youtubeVideoURLRegex.test(q);
|
|
1402
1845
|
}
|
|
1403
1846
|
};
|
|
1404
|
-
__name(
|
|
1847
|
+
__name(_QueryResolver, "QueryResolver");
|
|
1848
|
+
var QueryResolver = _QueryResolver;
|
|
1405
1849
|
|
|
1406
1850
|
// src/manager/GuildQueuePlayerNode.ts
|
|
1407
1851
|
var import_promises2 = require("timers/promises");
|
|
1408
1852
|
|
|
1409
1853
|
// src/utils/AsyncQueue.ts
|
|
1410
1854
|
var import_discord2 = require("discord.js");
|
|
1411
|
-
var
|
|
1855
|
+
var _AsyncQueue = class _AsyncQueue {
|
|
1412
1856
|
constructor() {
|
|
1857
|
+
/**
|
|
1858
|
+
* The queued entries
|
|
1859
|
+
*/
|
|
1413
1860
|
this.entries = [];
|
|
1414
1861
|
}
|
|
1862
|
+
/**
|
|
1863
|
+
* Clear entries queue
|
|
1864
|
+
* @param consume Whether or not to consume all entries before clearing
|
|
1865
|
+
*/
|
|
1415
1866
|
clear(consume = false) {
|
|
1416
1867
|
if (consume) {
|
|
1417
1868
|
this.entries.forEach((entry) => entry.consume());
|
|
1418
1869
|
}
|
|
1419
1870
|
this.entries = [];
|
|
1420
1871
|
}
|
|
1872
|
+
/**
|
|
1873
|
+
* The total number of entries in this queue. Returns `0` if no entries are available.
|
|
1874
|
+
*/
|
|
1421
1875
|
get size() {
|
|
1422
1876
|
return this.entries.length;
|
|
1423
1877
|
}
|
|
1878
|
+
/**
|
|
1879
|
+
* Acquire an entry.
|
|
1880
|
+
*
|
|
1881
|
+
* @example // lock the queue
|
|
1882
|
+
* const entry = asyncQueue.acquire();
|
|
1883
|
+
* // wait until previous task is completed
|
|
1884
|
+
* await entry.getTask();
|
|
1885
|
+
* // do something expensive
|
|
1886
|
+
* await performSomethingExpensive();
|
|
1887
|
+
* // make sure to release the lock once done
|
|
1888
|
+
* asyncQueue.release();
|
|
1889
|
+
*
|
|
1890
|
+
*/
|
|
1424
1891
|
acquire(options) {
|
|
1425
1892
|
const entry = new AsyncQueueEntry(this, options);
|
|
1426
1893
|
if (this.exceptionHandler)
|
|
@@ -1433,15 +1900,25 @@ var AsyncQueue = class {
|
|
|
1433
1900
|
this.entries.push(entry);
|
|
1434
1901
|
return entry;
|
|
1435
1902
|
}
|
|
1903
|
+
/**
|
|
1904
|
+
* Release the current acquisition and move to next entry.
|
|
1905
|
+
*/
|
|
1436
1906
|
release() {
|
|
1437
1907
|
if (!this.entries.length)
|
|
1438
1908
|
return;
|
|
1439
1909
|
this.entries.shift();
|
|
1440
1910
|
this.entries[0]?.consume();
|
|
1441
1911
|
}
|
|
1912
|
+
/**
|
|
1913
|
+
* Cancel all entries
|
|
1914
|
+
*/
|
|
1442
1915
|
cancelAll() {
|
|
1443
1916
|
this.entries.forEach((entry) => entry.cancel());
|
|
1444
1917
|
}
|
|
1918
|
+
/**
|
|
1919
|
+
* Remove the given entry from the queue
|
|
1920
|
+
* @param entry The entry to remove
|
|
1921
|
+
*/
|
|
1445
1922
|
removeEntry(entry) {
|
|
1446
1923
|
const entryIdx = this.entries.indexOf(entry);
|
|
1447
1924
|
if (entryIdx !== -1) {
|
|
@@ -1451,8 +1928,9 @@ var AsyncQueue = class {
|
|
|
1451
1928
|
return false;
|
|
1452
1929
|
}
|
|
1453
1930
|
};
|
|
1454
|
-
__name(
|
|
1455
|
-
var
|
|
1931
|
+
__name(_AsyncQueue, "AsyncQueue");
|
|
1932
|
+
var AsyncQueue = _AsyncQueue;
|
|
1933
|
+
var _AsyncQueueEntry = class _AsyncQueueEntry {
|
|
1456
1934
|
constructor(queue, options) {
|
|
1457
1935
|
this.queue = queue;
|
|
1458
1936
|
this.options = options;
|
|
@@ -1499,12 +1977,13 @@ var AsyncQueueEntry = class {
|
|
|
1499
1977
|
return this.promise;
|
|
1500
1978
|
}
|
|
1501
1979
|
};
|
|
1502
|
-
__name(
|
|
1980
|
+
__name(_AsyncQueueEntry, "AsyncQueueEntry");
|
|
1981
|
+
var AsyncQueueEntry = _AsyncQueueEntry;
|
|
1503
1982
|
|
|
1504
1983
|
// src/manager/GuildQueuePlayerNode.ts
|
|
1505
1984
|
var FFMPEG_SRATE_REGEX = /asetrate=\d+\*(\d(\.\d)?)/;
|
|
1506
1985
|
var _progress, _throw, throw_fn, _performPlay, performPlay_fn, _createGenericStream, createGenericStream_fn, _createFFmpegStream, createFFmpegStream_fn;
|
|
1507
|
-
var
|
|
1986
|
+
var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
|
|
1508
1987
|
constructor(queue) {
|
|
1509
1988
|
this.queue = queue;
|
|
1510
1989
|
__privateAdd(this, _throw);
|
|
@@ -1514,31 +1993,58 @@ var GuildQueuePlayerNode = class {
|
|
|
1514
1993
|
__privateAdd(this, _progress, 0);
|
|
1515
1994
|
this.tasksQueue = new AsyncQueue();
|
|
1516
1995
|
}
|
|
1996
|
+
/**
|
|
1997
|
+
* If the player is currently in idle mode
|
|
1998
|
+
*/
|
|
1517
1999
|
isIdle() {
|
|
1518
2000
|
return !!this.queue.dispatcher?.isIdle();
|
|
1519
2001
|
}
|
|
2002
|
+
/**
|
|
2003
|
+
* If the player is currently buffering the track
|
|
2004
|
+
*/
|
|
1520
2005
|
isBuffering() {
|
|
1521
2006
|
return !!this.queue.dispatcher?.isBuffering();
|
|
1522
2007
|
}
|
|
2008
|
+
/**
|
|
2009
|
+
* If the player is currently playing a track
|
|
2010
|
+
*/
|
|
1523
2011
|
isPlaying() {
|
|
1524
2012
|
return !!this.queue.dispatcher?.isPlaying();
|
|
1525
2013
|
}
|
|
2014
|
+
/**
|
|
2015
|
+
* If the player is currently paused
|
|
2016
|
+
*/
|
|
1526
2017
|
isPaused() {
|
|
1527
2018
|
return !!this.queue.dispatcher?.isPaused();
|
|
1528
2019
|
}
|
|
2020
|
+
/**
|
|
2021
|
+
* Reset progress history
|
|
2022
|
+
*/
|
|
1529
2023
|
resetProgress() {
|
|
1530
2024
|
__privateSet(this, _progress, 0);
|
|
1531
2025
|
}
|
|
2026
|
+
/**
|
|
2027
|
+
* Set player progress
|
|
2028
|
+
*/
|
|
1532
2029
|
setProgress(progress) {
|
|
1533
2030
|
__privateSet(this, _progress, progress);
|
|
1534
2031
|
}
|
|
2032
|
+
/**
|
|
2033
|
+
* The stream time for current session
|
|
2034
|
+
*/
|
|
1535
2035
|
get streamTime() {
|
|
1536
2036
|
return this.queue.dispatcher?.streamTime ?? 0;
|
|
1537
2037
|
}
|
|
2038
|
+
/**
|
|
2039
|
+
* Current playback duration with history included
|
|
2040
|
+
*/
|
|
1538
2041
|
get playbackTime() {
|
|
1539
2042
|
const dur = __privateGet(this, _progress) + this.streamTime;
|
|
1540
2043
|
return dur;
|
|
1541
2044
|
}
|
|
2045
|
+
/**
|
|
2046
|
+
* Get duration multiplier
|
|
2047
|
+
*/
|
|
1542
2048
|
getDurationMultiplier() {
|
|
1543
2049
|
const srateFilters = this.queue.filters.ffmpeg.toArray().filter((ff) => FFMPEG_SRATE_REGEX.test(ff));
|
|
1544
2050
|
const multipliers = srateFilters.map((m) => {
|
|
@@ -1546,14 +2052,23 @@ var GuildQueuePlayerNode = class {
|
|
|
1546
2052
|
}).filter((f) => !isNaN(f));
|
|
1547
2053
|
return !multipliers.length ? 1 : multipliers.reduce((accumulator, current) => current + accumulator);
|
|
1548
2054
|
}
|
|
2055
|
+
/**
|
|
2056
|
+
* Estimated progress of the player
|
|
2057
|
+
*/
|
|
1549
2058
|
get estimatedPlaybackTime() {
|
|
1550
2059
|
const dur = this.playbackTime;
|
|
1551
2060
|
return Math.round(this.getDurationMultiplier() * dur);
|
|
1552
2061
|
}
|
|
2062
|
+
/**
|
|
2063
|
+
* Estimated total duration of the player
|
|
2064
|
+
*/
|
|
1553
2065
|
get estimatedDuration() {
|
|
1554
2066
|
const dur = this.totalDuration;
|
|
1555
2067
|
return Math.round(dur / this.getDurationMultiplier());
|
|
1556
2068
|
}
|
|
2069
|
+
/**
|
|
2070
|
+
* Total duration of the current audio track
|
|
2071
|
+
*/
|
|
1557
2072
|
get totalDuration() {
|
|
1558
2073
|
const prefersBridgedMetadata = this.queue.options.preferBridgedMetadata;
|
|
1559
2074
|
const track = this.queue.currentTrack;
|
|
@@ -1564,6 +2079,10 @@ var GuildQueuePlayerNode = class {
|
|
|
1564
2079
|
}
|
|
1565
2080
|
return track?.durationMS ?? 0;
|
|
1566
2081
|
}
|
|
2082
|
+
/**
|
|
2083
|
+
* Get stream progress
|
|
2084
|
+
* @param ignoreFilters Ignore filters
|
|
2085
|
+
*/
|
|
1567
2086
|
getTimestamp(ignoreFilters = false) {
|
|
1568
2087
|
if (!this.queue.currentTrack)
|
|
1569
2088
|
return null;
|
|
@@ -1581,6 +2100,10 @@ var GuildQueuePlayerNode = class {
|
|
|
1581
2100
|
progress: Math.round(current / total * 100)
|
|
1582
2101
|
};
|
|
1583
2102
|
}
|
|
2103
|
+
/**
|
|
2104
|
+
* Create progress bar for current progress
|
|
2105
|
+
* @param options Progress bar options
|
|
2106
|
+
*/
|
|
1584
2107
|
createProgressBar(options) {
|
|
1585
2108
|
const timestamp = this.getTimestamp();
|
|
1586
2109
|
if (!timestamp)
|
|
@@ -1607,14 +2130,25 @@ var GuildQueuePlayerNode = class {
|
|
|
1607
2130
|
}
|
|
1608
2131
|
}
|
|
1609
2132
|
}
|
|
2133
|
+
/**
|
|
2134
|
+
* Seek the player
|
|
2135
|
+
* @param duration The duration to seek to
|
|
2136
|
+
*/
|
|
1610
2137
|
async seek(duration) {
|
|
1611
2138
|
if (!this.queue.currentTrack)
|
|
1612
2139
|
return false;
|
|
1613
2140
|
return await this.queue.filters.triggerReplay(duration);
|
|
1614
2141
|
}
|
|
2142
|
+
/**
|
|
2143
|
+
* Current volume
|
|
2144
|
+
*/
|
|
1615
2145
|
get volume() {
|
|
1616
2146
|
return this.queue.dispatcher?.volume ?? 100;
|
|
1617
2147
|
}
|
|
2148
|
+
/**
|
|
2149
|
+
* Set volume
|
|
2150
|
+
* @param vol Volume amount to set
|
|
2151
|
+
*/
|
|
1618
2152
|
setVolume(vol) {
|
|
1619
2153
|
if (!this.queue.dispatcher)
|
|
1620
2154
|
return false;
|
|
@@ -1623,20 +2157,37 @@ var GuildQueuePlayerNode = class {
|
|
|
1623
2157
|
this.queue.filters._lastFiltersCache.volume = vol;
|
|
1624
2158
|
return res;
|
|
1625
2159
|
}
|
|
2160
|
+
/**
|
|
2161
|
+
* Set bit rate
|
|
2162
|
+
* @param rate The bit rate to set
|
|
2163
|
+
*/
|
|
1626
2164
|
setBitrate(rate) {
|
|
1627
2165
|
this.queue.dispatcher?.audioResource?.encoder?.setBitrate(rate === "auto" ? this.queue.channel?.bitrate ?? 64e3 : rate);
|
|
1628
2166
|
}
|
|
2167
|
+
/**
|
|
2168
|
+
* Set paused state
|
|
2169
|
+
* @param state The state
|
|
2170
|
+
*/
|
|
1629
2171
|
setPaused(state) {
|
|
1630
2172
|
if (state)
|
|
1631
2173
|
return this.queue.dispatcher?.pause(true) || false;
|
|
1632
2174
|
return this.queue.dispatcher?.resume() || false;
|
|
1633
2175
|
}
|
|
2176
|
+
/**
|
|
2177
|
+
* Pause the playback
|
|
2178
|
+
*/
|
|
1634
2179
|
pause() {
|
|
1635
2180
|
return this.setPaused(true);
|
|
1636
2181
|
}
|
|
2182
|
+
/**
|
|
2183
|
+
* Resume the playback
|
|
2184
|
+
*/
|
|
1637
2185
|
resume() {
|
|
1638
2186
|
return this.setPaused(false);
|
|
1639
2187
|
}
|
|
2188
|
+
/**
|
|
2189
|
+
* Skip current track
|
|
2190
|
+
*/
|
|
1640
2191
|
skip() {
|
|
1641
2192
|
if (!this.queue.dispatcher)
|
|
1642
2193
|
return false;
|
|
@@ -1644,6 +2195,10 @@ var GuildQueuePlayerNode = class {
|
|
|
1644
2195
|
this.queue.dispatcher.end();
|
|
1645
2196
|
return true;
|
|
1646
2197
|
}
|
|
2198
|
+
/**
|
|
2199
|
+
* Remove the given track from queue
|
|
2200
|
+
* @param track The track to remove
|
|
2201
|
+
*/
|
|
1647
2202
|
remove(track) {
|
|
1648
2203
|
const foundTrack = this.queue.tracks.find((t, idx) => {
|
|
1649
2204
|
if (track instanceof Track || typeof track === "string") {
|
|
@@ -1659,6 +2214,10 @@ var GuildQueuePlayerNode = class {
|
|
|
1659
2214
|
this.queue.emit(GuildQueueEvent.audioTrackRemove, this.queue, foundTrack);
|
|
1660
2215
|
return foundTrack;
|
|
1661
2216
|
}
|
|
2217
|
+
/**
|
|
2218
|
+
* Jump to specific track on the queue
|
|
2219
|
+
* @param track The track to jump to without removing other tracks
|
|
2220
|
+
*/
|
|
1662
2221
|
jump(track) {
|
|
1663
2222
|
const removed = this.remove(track);
|
|
1664
2223
|
if (!removed)
|
|
@@ -1666,6 +2225,10 @@ var GuildQueuePlayerNode = class {
|
|
|
1666
2225
|
this.queue.tracks.store.unshift(removed);
|
|
1667
2226
|
return this.skip();
|
|
1668
2227
|
}
|
|
2228
|
+
/**
|
|
2229
|
+
* Get track position
|
|
2230
|
+
* @param track The track
|
|
2231
|
+
*/
|
|
1669
2232
|
getTrackPosition(track) {
|
|
1670
2233
|
return this.queue.tracks.toArray().findIndex((t, idx) => {
|
|
1671
2234
|
if (track instanceof Track || typeof track === "string") {
|
|
@@ -1676,6 +2239,10 @@ var GuildQueuePlayerNode = class {
|
|
|
1676
2239
|
return idx === track;
|
|
1677
2240
|
});
|
|
1678
2241
|
}
|
|
2242
|
+
/**
|
|
2243
|
+
* Skip to the given track, removing others on the way
|
|
2244
|
+
* @param track The track to skip to
|
|
2245
|
+
*/
|
|
1679
2246
|
skipTo(track) {
|
|
1680
2247
|
const idx = this.getTrackPosition(track);
|
|
1681
2248
|
if (idx < 0)
|
|
@@ -1688,6 +2255,11 @@ var GuildQueuePlayerNode = class {
|
|
|
1688
2255
|
this.queue.emit(GuildQueueEvent.audioTracksRemove, this.queue, toRemove);
|
|
1689
2256
|
return this.skip();
|
|
1690
2257
|
}
|
|
2258
|
+
/**
|
|
2259
|
+
* Insert a track on the given position in queue
|
|
2260
|
+
* @param track The track to insert
|
|
2261
|
+
* @param index The position to insert to, defaults to 0.
|
|
2262
|
+
*/
|
|
1691
2263
|
insert(track, index = 0) {
|
|
1692
2264
|
if (!(track instanceof Track))
|
|
1693
2265
|
throw Exceptions.ERR_INVALID_ARG_TYPE("track value", "instance of Track", String(track));
|
|
@@ -1696,6 +2268,11 @@ var GuildQueuePlayerNode = class {
|
|
|
1696
2268
|
if (!this.queue.options.noEmitInsert)
|
|
1697
2269
|
this.queue.emit(GuildQueueEvent.audioTrackAdd, this.queue, track);
|
|
1698
2270
|
}
|
|
2271
|
+
/**
|
|
2272
|
+
* Moves a track in the queue
|
|
2273
|
+
* @param from The track to move
|
|
2274
|
+
* @param to The position to move to
|
|
2275
|
+
*/
|
|
1699
2276
|
move(from, to) {
|
|
1700
2277
|
const removed = this.remove(from);
|
|
1701
2278
|
if (!removed) {
|
|
@@ -1703,6 +2280,11 @@ var GuildQueuePlayerNode = class {
|
|
|
1703
2280
|
}
|
|
1704
2281
|
this.insert(removed, to);
|
|
1705
2282
|
}
|
|
2283
|
+
/**
|
|
2284
|
+
* Copy a track in the queue
|
|
2285
|
+
* @param from The track to clone
|
|
2286
|
+
* @param to The position to clone at
|
|
2287
|
+
*/
|
|
1706
2288
|
copy(from, to) {
|
|
1707
2289
|
const src = this.queue.tracks.at(this.getTrackPosition(from));
|
|
1708
2290
|
if (!src) {
|
|
@@ -1710,6 +2292,11 @@ var GuildQueuePlayerNode = class {
|
|
|
1710
2292
|
}
|
|
1711
2293
|
this.insert(src, to);
|
|
1712
2294
|
}
|
|
2295
|
+
/**
|
|
2296
|
+
* Swap two tracks in the queue
|
|
2297
|
+
* @param first The first track to swap
|
|
2298
|
+
* @param second The second track to swap
|
|
2299
|
+
*/
|
|
1713
2300
|
swap(first, second) {
|
|
1714
2301
|
const src = this.getTrackPosition(first);
|
|
1715
2302
|
if (src < 0)
|
|
@@ -1722,6 +2309,10 @@ var GuildQueuePlayerNode = class {
|
|
|
1722
2309
|
this.queue.tracks.store[src] = destT;
|
|
1723
2310
|
this.queue.tracks.store[dest] = srcT;
|
|
1724
2311
|
}
|
|
2312
|
+
/**
|
|
2313
|
+
* Stop the playback
|
|
2314
|
+
* @param force Whether or not to forcefully stop the playback
|
|
2315
|
+
*/
|
|
1725
2316
|
stop(force = false) {
|
|
1726
2317
|
this.queue.tracks.clear();
|
|
1727
2318
|
this.queue.history.clear();
|
|
@@ -1741,9 +2332,18 @@ var GuildQueuePlayerNode = class {
|
|
|
1741
2332
|
}
|
|
1742
2333
|
return true;
|
|
1743
2334
|
}
|
|
2335
|
+
/**
|
|
2336
|
+
* Play raw audio resource
|
|
2337
|
+
* @param resource The audio resource to play
|
|
2338
|
+
*/
|
|
1744
2339
|
async playRaw(resource) {
|
|
1745
2340
|
await this.queue.dispatcher?.playStream(resource);
|
|
1746
2341
|
}
|
|
2342
|
+
/**
|
|
2343
|
+
* Play the given track
|
|
2344
|
+
* @param res The track to play
|
|
2345
|
+
* @param options Options for playing the track
|
|
2346
|
+
*/
|
|
1747
2347
|
async play(res, options) {
|
|
1748
2348
|
if (!this.queue.dispatcher?.voiceConnection) {
|
|
1749
2349
|
throw Exceptions.ERR_NO_VOICE_CONNECTION();
|
|
@@ -1820,11 +2420,11 @@ var GuildQueuePlayerNode = class {
|
|
|
1820
2420
|
}
|
|
1821
2421
|
const cookies = track.raw?.source === "youtube" ? this.queue.player.options.ytdlOptions?.requestOptions?.headers?.cookie : void 0;
|
|
1822
2422
|
const createStreamConfig = {
|
|
1823
|
-
disableBiquad: this.queue.options.
|
|
1824
|
-
disableEqualizer: this.queue.options.
|
|
1825
|
-
disableVolume: this.queue.options.
|
|
1826
|
-
disableFilters: this.queue.options.
|
|
1827
|
-
disableResampler: this.queue.options.
|
|
2423
|
+
disableBiquad: this.queue.options.disableBiquad,
|
|
2424
|
+
disableEqualizer: this.queue.options.disableEqualizer,
|
|
2425
|
+
disableVolume: this.queue.options.disableVolume,
|
|
2426
|
+
disableFilters: this.queue.options.disableFilterer,
|
|
2427
|
+
disableResampler: this.queue.options.disableResampler,
|
|
1828
2428
|
sampleRate: typeof this.queue.options.resampler === "number" && this.queue.options.resampler > 0 ? this.queue.options.resampler : void 0,
|
|
1829
2429
|
biquadFilter: this.queue.filters._lastFiltersCache.biquad || void 0,
|
|
1830
2430
|
eq: this.queue.filters._lastFiltersCache.equalizer,
|
|
@@ -1842,6 +2442,8 @@ var GuildQueuePlayerNode = class {
|
|
|
1842
2442
|
const success = this.queue.emit(GuildQueueEvent.willPlayTrack, this.queue, track, trackStreamConfig, resolver);
|
|
1843
2443
|
if (!success)
|
|
1844
2444
|
resolver();
|
|
2445
|
+
if (this.queue.hasDebugger)
|
|
2446
|
+
this.queue.debug("Waiting for willPlayTrack event to resolve...");
|
|
1845
2447
|
await donePromise;
|
|
1846
2448
|
const pcmStream = __privateMethod(this, _createFFmpegStream, createFFmpegStream_fn).call(this, streamSrc.stream, track, options.seek ?? 0, cookies);
|
|
1847
2449
|
if (options.transitionMode) {
|
|
@@ -1863,7 +2465,6 @@ var GuildQueuePlayerNode = class {
|
|
|
1863
2465
|
}
|
|
1864
2466
|
}
|
|
1865
2467
|
};
|
|
1866
|
-
__name(GuildQueuePlayerNode, "GuildQueuePlayerNode");
|
|
1867
2468
|
_progress = new WeakMap();
|
|
1868
2469
|
_throw = new WeakSet();
|
|
1869
2470
|
throw_fn = /* @__PURE__ */ __name(function(track, error) {
|
|
@@ -1927,6 +2528,8 @@ createFFmpegStream_fn = /* @__PURE__ */ __name(function(stream, track, seek = 0,
|
|
|
1927
2528
|
});
|
|
1928
2529
|
return ffmpegStream;
|
|
1929
2530
|
}, "#createFFmpegStream");
|
|
2531
|
+
__name(_GuildQueuePlayerNode, "GuildQueuePlayerNode");
|
|
2532
|
+
var GuildQueuePlayerNode = _GuildQueuePlayerNode;
|
|
1930
2533
|
|
|
1931
2534
|
// src/manager/GuildQueueAudioFilters.ts
|
|
1932
2535
|
var import_equalizer2 = require("@discord-player/equalizer");
|
|
@@ -2030,34 +2633,55 @@ var EqualizerConfigurationPreset = Object.freeze({
|
|
|
2030
2633
|
Techno: makeBands([8, 5.6, -111022e-20, -5.6, -4.8, -111022e-20, 8, 9.6, 9.6, 8.8])
|
|
2031
2634
|
});
|
|
2032
2635
|
var _ffmpegFilters, _inputArgs, _setFilters, setFilters_fn;
|
|
2033
|
-
var
|
|
2636
|
+
var _FFmpegFilterer = class _FFmpegFilterer {
|
|
2034
2637
|
constructor(af) {
|
|
2035
2638
|
this.af = af;
|
|
2036
2639
|
__privateAdd(this, _setFilters);
|
|
2037
2640
|
__privateAdd(this, _ffmpegFilters, []);
|
|
2038
2641
|
__privateAdd(this, _inputArgs, []);
|
|
2039
2642
|
}
|
|
2643
|
+
/**
|
|
2644
|
+
* Set input args for FFmpeg
|
|
2645
|
+
*/
|
|
2040
2646
|
setInputArgs(args) {
|
|
2041
2647
|
if (!args.every((arg) => typeof arg === "string"))
|
|
2042
2648
|
throw Exceptions.ERR_INVALID_ARG_TYPE("args", "Array<string>", "invalid item(s)");
|
|
2043
2649
|
__privateSet(this, _inputArgs, args);
|
|
2044
2650
|
}
|
|
2651
|
+
/**
|
|
2652
|
+
* Get input args
|
|
2653
|
+
*/
|
|
2045
2654
|
get inputArgs() {
|
|
2046
2655
|
return __privateGet(this, _inputArgs);
|
|
2047
2656
|
}
|
|
2657
|
+
/**
|
|
2658
|
+
* Get encoder args
|
|
2659
|
+
*/
|
|
2048
2660
|
get encoderArgs() {
|
|
2049
2661
|
if (!this.filters.length)
|
|
2050
2662
|
return [];
|
|
2051
2663
|
return ["-af", this.toString()];
|
|
2052
2664
|
}
|
|
2665
|
+
/**
|
|
2666
|
+
* Get final ffmpeg args
|
|
2667
|
+
*/
|
|
2053
2668
|
get args() {
|
|
2054
2669
|
return this.inputArgs.concat(this.encoderArgs);
|
|
2055
2670
|
}
|
|
2671
|
+
/**
|
|
2672
|
+
* Create ffmpeg stream
|
|
2673
|
+
* @param source The stream source
|
|
2674
|
+
* @param options The stream options
|
|
2675
|
+
*/
|
|
2056
2676
|
createStream(source, options) {
|
|
2057
2677
|
if (__privateGet(this, _inputArgs).length)
|
|
2058
2678
|
options.encoderArgs = [...__privateGet(this, _inputArgs), ...options.encoderArgs || []];
|
|
2059
2679
|
return createFFmpegStream(source, options);
|
|
2060
2680
|
}
|
|
2681
|
+
/**
|
|
2682
|
+
* Set ffmpeg filters
|
|
2683
|
+
* @param filters The filters
|
|
2684
|
+
*/
|
|
2061
2685
|
setFilters(filters) {
|
|
2062
2686
|
let _filters = [];
|
|
2063
2687
|
if (typeof filters === "boolean") {
|
|
@@ -2069,12 +2693,19 @@ var FFmpegFilterer = class {
|
|
|
2069
2693
|
}
|
|
2070
2694
|
return __privateMethod(this, _setFilters, setFilters_fn).call(this, _filters);
|
|
2071
2695
|
}
|
|
2696
|
+
/**
|
|
2697
|
+
* Currently active ffmpeg filters
|
|
2698
|
+
*/
|
|
2072
2699
|
get filters() {
|
|
2073
2700
|
return __privateGet(this, _ffmpegFilters);
|
|
2074
2701
|
}
|
|
2075
2702
|
set filters(filters) {
|
|
2076
2703
|
this.setFilters(filters);
|
|
2077
2704
|
}
|
|
2705
|
+
/**
|
|
2706
|
+
* Toggle given ffmpeg filter(s)
|
|
2707
|
+
* @param filters The filter(s)
|
|
2708
|
+
*/
|
|
2078
2709
|
toggle(filters) {
|
|
2079
2710
|
if (!Array.isArray(filters))
|
|
2080
2711
|
filters = [filters];
|
|
@@ -2086,37 +2717,67 @@ var FFmpegFilterer = class {
|
|
|
2086
2717
|
});
|
|
2087
2718
|
return __privateMethod(this, _setFilters, setFilters_fn).call(this, __privateGet(this, _ffmpegFilters).filter((r) => !filters.includes(r)).concat(fresh));
|
|
2088
2719
|
}
|
|
2720
|
+
/**
|
|
2721
|
+
* Set default filters
|
|
2722
|
+
* @param ff Filters list
|
|
2723
|
+
*/
|
|
2089
2724
|
setDefaults(ff) {
|
|
2090
2725
|
__privateSet(this, _ffmpegFilters, ff);
|
|
2091
2726
|
}
|
|
2727
|
+
/**
|
|
2728
|
+
* Get list of enabled filters
|
|
2729
|
+
*/
|
|
2092
2730
|
getFiltersEnabled() {
|
|
2093
2731
|
return __privateGet(this, _ffmpegFilters);
|
|
2094
2732
|
}
|
|
2733
|
+
/**
|
|
2734
|
+
* Get list of disabled filters
|
|
2735
|
+
*/
|
|
2095
2736
|
getFiltersDisabled() {
|
|
2096
2737
|
return AudioFilters.names.filter((f) => !__privateGet(this, _ffmpegFilters).includes(f));
|
|
2097
2738
|
}
|
|
2739
|
+
/**
|
|
2740
|
+
* Check if the given filter is enabled
|
|
2741
|
+
* @param filter The filter
|
|
2742
|
+
*/
|
|
2098
2743
|
isEnabled(filter) {
|
|
2099
2744
|
return __privateGet(this, _ffmpegFilters).includes(filter);
|
|
2100
2745
|
}
|
|
2746
|
+
/**
|
|
2747
|
+
* Check if the given filter is disabled
|
|
2748
|
+
* @param filter The filter
|
|
2749
|
+
*/
|
|
2101
2750
|
isDisabled(filter) {
|
|
2102
2751
|
return !this.isEnabled(filter);
|
|
2103
2752
|
}
|
|
2753
|
+
/**
|
|
2754
|
+
* Check if the given filter is a valid filter
|
|
2755
|
+
* @param filter The filter to test
|
|
2756
|
+
*/
|
|
2104
2757
|
isValidFilter(filter) {
|
|
2105
2758
|
return AudioFilters.has(filter);
|
|
2106
2759
|
}
|
|
2760
|
+
/**
|
|
2761
|
+
* Convert current filters to array
|
|
2762
|
+
*/
|
|
2107
2763
|
toArray() {
|
|
2108
2764
|
return this.filters.map((filter) => AudioFilters.get(filter));
|
|
2109
2765
|
}
|
|
2766
|
+
/**
|
|
2767
|
+
* Convert current filters to JSON object
|
|
2768
|
+
*/
|
|
2110
2769
|
toJSON() {
|
|
2111
2770
|
const obj = {};
|
|
2112
2771
|
this.filters.forEach((filter) => obj[filter] = AudioFilters.get(filter));
|
|
2113
2772
|
return obj;
|
|
2114
2773
|
}
|
|
2774
|
+
/**
|
|
2775
|
+
* String representation of current filters
|
|
2776
|
+
*/
|
|
2115
2777
|
toString() {
|
|
2116
2778
|
return AudioFilters.create(this.filters);
|
|
2117
2779
|
}
|
|
2118
2780
|
};
|
|
2119
|
-
__name(FFmpegFilterer, "FFmpegFilterer");
|
|
2120
2781
|
_ffmpegFilters = new WeakMap();
|
|
2121
2782
|
_inputArgs = new WeakMap();
|
|
2122
2783
|
_setFilters = new WeakSet();
|
|
@@ -2131,7 +2792,9 @@ setFilters_fn = /* @__PURE__ */ __name(function(filters) {
|
|
|
2131
2792
|
return t;
|
|
2132
2793
|
});
|
|
2133
2794
|
}, "#setFilters");
|
|
2134
|
-
|
|
2795
|
+
__name(_FFmpegFilterer, "FFmpegFilterer");
|
|
2796
|
+
var FFmpegFilterer = _FFmpegFilterer;
|
|
2797
|
+
var _GuildQueueAudioFilters = class _GuildQueueAudioFilters {
|
|
2135
2798
|
constructor(queue) {
|
|
2136
2799
|
this.queue = queue;
|
|
2137
2800
|
this.graph = new AFilterGraph(this);
|
|
@@ -2148,21 +2811,40 @@ var GuildQueueAudioFilters = class {
|
|
|
2148
2811
|
this._lastFiltersCache.volume = this.queue.options.volume;
|
|
2149
2812
|
}
|
|
2150
2813
|
}
|
|
2814
|
+
/**
|
|
2815
|
+
* Volume transformer
|
|
2816
|
+
*/
|
|
2151
2817
|
get volume() {
|
|
2152
2818
|
return this.queue.dispatcher?.dsp?.volume || null;
|
|
2153
2819
|
}
|
|
2820
|
+
/**
|
|
2821
|
+
* 15 Band Equalizer
|
|
2822
|
+
*/
|
|
2154
2823
|
get equalizer() {
|
|
2155
2824
|
return this.queue.dispatcher?.equalizer || null;
|
|
2156
2825
|
}
|
|
2826
|
+
/**
|
|
2827
|
+
* Digital biquad filters
|
|
2828
|
+
*/
|
|
2157
2829
|
get biquad() {
|
|
2158
2830
|
return this.queue.dispatcher?.biquad || null;
|
|
2159
2831
|
}
|
|
2832
|
+
/**
|
|
2833
|
+
* DSP filters
|
|
2834
|
+
*/
|
|
2160
2835
|
get filters() {
|
|
2161
2836
|
return this.queue.dispatcher?.filters || null;
|
|
2162
2837
|
}
|
|
2838
|
+
/**
|
|
2839
|
+
* Audio resampler
|
|
2840
|
+
*/
|
|
2163
2841
|
get resampler() {
|
|
2164
2842
|
return this.queue.dispatcher?.resampler || null;
|
|
2165
2843
|
}
|
|
2844
|
+
/**
|
|
2845
|
+
* Replay current track in transition mode
|
|
2846
|
+
* @param seek The duration to seek to
|
|
2847
|
+
*/
|
|
2166
2848
|
async triggerReplay(seek = 0) {
|
|
2167
2849
|
if (!this.queue.currentTrack)
|
|
2168
2850
|
return false;
|
|
@@ -2182,8 +2864,9 @@ var GuildQueueAudioFilters = class {
|
|
|
2182
2864
|
}
|
|
2183
2865
|
}
|
|
2184
2866
|
};
|
|
2185
|
-
__name(
|
|
2186
|
-
var
|
|
2867
|
+
__name(_GuildQueueAudioFilters, "GuildQueueAudioFilters");
|
|
2868
|
+
var GuildQueueAudioFilters = _GuildQueueAudioFilters;
|
|
2869
|
+
var _AFilterGraph = class _AFilterGraph {
|
|
2187
2870
|
constructor(af) {
|
|
2188
2871
|
this.af = af;
|
|
2189
2872
|
}
|
|
@@ -2219,16 +2902,20 @@ var AFilterGraph = class {
|
|
|
2219
2902
|
};
|
|
2220
2903
|
}
|
|
2221
2904
|
};
|
|
2222
|
-
__name(
|
|
2905
|
+
__name(_AFilterGraph, "AFilterGraph");
|
|
2906
|
+
var AFilterGraph = _AFilterGraph;
|
|
2223
2907
|
|
|
2224
2908
|
// src/manager/GuildQueue.ts
|
|
2225
2909
|
var import_timers = require("timers");
|
|
2226
2910
|
|
|
2227
2911
|
// src/manager/GuildQueueStatistics.ts
|
|
2228
|
-
var
|
|
2912
|
+
var _GuildQueueStatistics = class _GuildQueueStatistics {
|
|
2229
2913
|
constructor(queue) {
|
|
2230
2914
|
this.queue = queue;
|
|
2231
2915
|
}
|
|
2916
|
+
/**
|
|
2917
|
+
* Generate statistics of this queue
|
|
2918
|
+
*/
|
|
2232
2919
|
generate() {
|
|
2233
2920
|
return {
|
|
2234
2921
|
latency: {
|
|
@@ -2248,47 +2935,135 @@ var GuildQueueStatistics = class {
|
|
|
2248
2935
|
memoryUsage: process.memoryUsage(),
|
|
2249
2936
|
versions: {
|
|
2250
2937
|
node: process.version,
|
|
2251
|
-
player: "6.6.
|
|
2938
|
+
player: "6.6.4"
|
|
2252
2939
|
}
|
|
2253
2940
|
};
|
|
2254
2941
|
}
|
|
2255
2942
|
};
|
|
2256
|
-
__name(
|
|
2943
|
+
__name(_GuildQueueStatistics, "GuildQueueStatistics");
|
|
2944
|
+
var GuildQueueStatistics = _GuildQueueStatistics;
|
|
2257
2945
|
|
|
2258
2946
|
// src/manager/GuildQueue.ts
|
|
2259
2947
|
var GuildQueueEvent = {
|
|
2948
|
+
/**
|
|
2949
|
+
* Emitted when audio track is added to the queue
|
|
2950
|
+
*/
|
|
2260
2951
|
audioTrackAdd: "audioTrackAdd",
|
|
2952
|
+
/**
|
|
2953
|
+
* Emitted when audio tracks were added to the queue
|
|
2954
|
+
*/
|
|
2261
2955
|
audioTracksAdd: "audioTracksAdd",
|
|
2956
|
+
/**
|
|
2957
|
+
* Emitted when audio track is removed from the queue
|
|
2958
|
+
*/
|
|
2262
2959
|
audioTrackRemove: "audioTrackRemove",
|
|
2960
|
+
/**
|
|
2961
|
+
* Emitted when audio tracks are removed from the queue
|
|
2962
|
+
*/
|
|
2263
2963
|
audioTracksRemove: "audioTracksRemove",
|
|
2964
|
+
/**
|
|
2965
|
+
* Emitted when a connection is created
|
|
2966
|
+
*/
|
|
2264
2967
|
connection: "connection",
|
|
2968
|
+
/**
|
|
2969
|
+
* Emitted when a voice connection is destroyed
|
|
2970
|
+
*/
|
|
2265
2971
|
connectionDestroyed: "connectionDestroyed",
|
|
2972
|
+
/**
|
|
2973
|
+
* Emitted when the bot is disconnected from the channel
|
|
2974
|
+
*/
|
|
2266
2975
|
disconnect: "disconnect",
|
|
2976
|
+
/**
|
|
2977
|
+
* Emitted when the queue sends a debug info
|
|
2978
|
+
*/
|
|
2267
2979
|
debug: "debug",
|
|
2980
|
+
/**
|
|
2981
|
+
* Emitted when the queue encounters error
|
|
2982
|
+
*/
|
|
2268
2983
|
error: "error",
|
|
2984
|
+
/**
|
|
2985
|
+
* Emitted when the voice channel is empty
|
|
2986
|
+
*/
|
|
2269
2987
|
emptyChannel: "emptyChannel",
|
|
2988
|
+
/**
|
|
2989
|
+
* Emitted when the queue is empty
|
|
2990
|
+
*/
|
|
2270
2991
|
emptyQueue: "emptyQueue",
|
|
2992
|
+
/**
|
|
2993
|
+
* Emitted when the audio player starts streaming audio track
|
|
2994
|
+
*/
|
|
2271
2995
|
playerStart: "playerStart",
|
|
2996
|
+
/**
|
|
2997
|
+
* Emitted when the audio player errors while streaming audio track
|
|
2998
|
+
*/
|
|
2272
2999
|
playerError: "playerError",
|
|
3000
|
+
/**
|
|
3001
|
+
* Emitted when the audio player finishes streaming audio track
|
|
3002
|
+
*/
|
|
2273
3003
|
playerFinish: "playerFinish",
|
|
3004
|
+
/**
|
|
3005
|
+
* Emitted when the audio player skips current track
|
|
3006
|
+
*/
|
|
2274
3007
|
playerSkip: "playerSkip",
|
|
3008
|
+
/**
|
|
3009
|
+
* Emitted when the audio player is triggered
|
|
3010
|
+
*/
|
|
2275
3011
|
playerTrigger: "playerTrigger",
|
|
3012
|
+
/**
|
|
3013
|
+
* Emitted when the voice state is updated. Consuming this event may disable default voice state update handler if `Player.isVoiceStateHandlerLocked()` returns `false`.
|
|
3014
|
+
*/
|
|
2276
3015
|
voiceStateUpdate: "voiceStateUpdate",
|
|
3016
|
+
/**
|
|
3017
|
+
* Emitted when volume is updated
|
|
3018
|
+
*/
|
|
2277
3019
|
volumeChange: "volumeChange",
|
|
3020
|
+
/**
|
|
3021
|
+
* Emitted when player is paused
|
|
3022
|
+
*/
|
|
2278
3023
|
playerPause: "playerPause",
|
|
3024
|
+
/**
|
|
3025
|
+
* Emitted when player is resumed
|
|
3026
|
+
*/
|
|
2279
3027
|
playerResume: "playerResume",
|
|
3028
|
+
/**
|
|
3029
|
+
* Biquad Filters Update
|
|
3030
|
+
*/
|
|
2280
3031
|
biquadFiltersUpdate: "biquadFiltersUpdate",
|
|
3032
|
+
/**
|
|
3033
|
+
* Equalizer Update
|
|
3034
|
+
*/
|
|
2281
3035
|
equalizerUpdate: "equalizerUpdate",
|
|
3036
|
+
/**
|
|
3037
|
+
* DSP update
|
|
3038
|
+
*/
|
|
2282
3039
|
dspUpdate: "dspUpdate",
|
|
3040
|
+
/**
|
|
3041
|
+
* Audio Filters Update
|
|
3042
|
+
*/
|
|
2283
3043
|
audioFiltersUpdate: "audioFiltersUpdate",
|
|
3044
|
+
/**
|
|
3045
|
+
* Audio player will play next track
|
|
3046
|
+
*/
|
|
2284
3047
|
willPlayTrack: "willPlayTrack",
|
|
3048
|
+
/**
|
|
3049
|
+
* Emitted when a voice channel is repopulated
|
|
3050
|
+
*/
|
|
2285
3051
|
channelPopulate: "channelPopulate",
|
|
3052
|
+
/**
|
|
3053
|
+
* Emitted when a queue is successfully created
|
|
3054
|
+
*/
|
|
2286
3055
|
queueCreate: "queueCreate",
|
|
3056
|
+
/**
|
|
3057
|
+
* Emitted when a queue is deleted
|
|
3058
|
+
*/
|
|
2287
3059
|
queueDelete: "queueDelete",
|
|
3060
|
+
/**
|
|
3061
|
+
* Emitted when a queue is trying to add similar track for autoplay
|
|
3062
|
+
*/
|
|
2288
3063
|
willAutoPlay: "willAutoPlay"
|
|
2289
3064
|
};
|
|
2290
3065
|
var _transitioning, _deleted, _attachListeners, attachListeners_fn, _removeListeners, removeListeners_fn, _performStart, performStart_fn, _performFinish, performFinish_fn, _emitEnd, emitEnd_fn, _handleAutoplay, handleAutoplay_fn;
|
|
2291
|
-
var
|
|
3066
|
+
var _GuildQueue = class _GuildQueue {
|
|
2292
3067
|
constructor(player, options) {
|
|
2293
3068
|
this.player = player;
|
|
2294
3069
|
this.options = options;
|
|
@@ -2354,33 +3129,62 @@ var GuildQueue4 = class {
|
|
|
2354
3129
|
this.debug(`GuildQueue initialized for guild ${this.options.guild.name} (ID: ${this.options.guild.id})`);
|
|
2355
3130
|
this.emit(GuildQueueEvent.queueCreate, this);
|
|
2356
3131
|
}
|
|
3132
|
+
/**
|
|
3133
|
+
* Estimated duration of this queue in ms
|
|
3134
|
+
*/
|
|
2357
3135
|
get estimatedDuration() {
|
|
2358
3136
|
return this.tracks.store.reduce((a, c) => a + c.durationMS, 0);
|
|
2359
3137
|
}
|
|
3138
|
+
/**
|
|
3139
|
+
* Formatted duration of this queue
|
|
3140
|
+
*/
|
|
2360
3141
|
get durationFormatted() {
|
|
2361
3142
|
return Util.buildTimeCode(Util.parseMS(this.estimatedDuration));
|
|
2362
3143
|
}
|
|
3144
|
+
/**
|
|
3145
|
+
* The voice receiver for this queue
|
|
3146
|
+
*/
|
|
2363
3147
|
get voiceReceiver() {
|
|
2364
3148
|
return this.dispatcher?.receiver ?? null;
|
|
2365
3149
|
}
|
|
3150
|
+
/**
|
|
3151
|
+
* Write a debug message to this queue
|
|
3152
|
+
* @param m The message to write
|
|
3153
|
+
*/
|
|
2366
3154
|
debug(m) {
|
|
2367
3155
|
this.emit(GuildQueueEvent.debug, this, m);
|
|
2368
3156
|
}
|
|
3157
|
+
/**
|
|
3158
|
+
* The metadata of this queue
|
|
3159
|
+
*/
|
|
2369
3160
|
get metadata() {
|
|
2370
3161
|
return this.options.metadata;
|
|
2371
3162
|
}
|
|
2372
3163
|
set metadata(m) {
|
|
2373
3164
|
this.options.metadata = m;
|
|
2374
3165
|
}
|
|
3166
|
+
/**
|
|
3167
|
+
* Set metadata for this queue
|
|
3168
|
+
* @param m Metadata to set
|
|
3169
|
+
*/
|
|
2375
3170
|
setMetadata(m) {
|
|
2376
3171
|
this.options.metadata = m;
|
|
2377
3172
|
}
|
|
3173
|
+
/**
|
|
3174
|
+
* Indicates current track of this queue
|
|
3175
|
+
*/
|
|
2378
3176
|
get currentTrack() {
|
|
2379
3177
|
return this.dispatcher?.audioResource?.metadata || this.__current;
|
|
2380
3178
|
}
|
|
3179
|
+
/**
|
|
3180
|
+
* Indicates if this queue was deleted previously
|
|
3181
|
+
*/
|
|
2381
3182
|
get deleted() {
|
|
2382
3183
|
return __privateGet(this, _deleted);
|
|
2383
3184
|
}
|
|
3185
|
+
/**
|
|
3186
|
+
* The voice channel of this queue
|
|
3187
|
+
*/
|
|
2384
3188
|
get channel() {
|
|
2385
3189
|
return this.dispatcher?.channel || null;
|
|
2386
3190
|
}
|
|
@@ -2393,42 +3197,84 @@ var GuildQueue4 = class {
|
|
|
2393
3197
|
}
|
|
2394
3198
|
}
|
|
2395
3199
|
}
|
|
3200
|
+
/**
|
|
3201
|
+
* The voice connection of this queue
|
|
3202
|
+
*/
|
|
2396
3203
|
get connection() {
|
|
2397
3204
|
return this.dispatcher?.voiceConnection || null;
|
|
2398
3205
|
}
|
|
3206
|
+
/**
|
|
3207
|
+
* The guild this queue belongs to
|
|
3208
|
+
*/
|
|
2399
3209
|
get guild() {
|
|
2400
3210
|
return this.options.guild;
|
|
2401
3211
|
}
|
|
3212
|
+
/**
|
|
3213
|
+
* The id of this queue
|
|
3214
|
+
*/
|
|
2402
3215
|
get id() {
|
|
2403
3216
|
return this.guild.id;
|
|
2404
3217
|
}
|
|
3218
|
+
/**
|
|
3219
|
+
* Set transition mode for this queue
|
|
3220
|
+
* @param state The state to set
|
|
3221
|
+
*/
|
|
2405
3222
|
setTransitioning(state) {
|
|
2406
3223
|
__privateSet(this, _transitioning, state);
|
|
2407
3224
|
}
|
|
3225
|
+
/**
|
|
3226
|
+
* if this queue is currently under transition mode
|
|
3227
|
+
*/
|
|
2408
3228
|
isTransitioning() {
|
|
2409
3229
|
return __privateGet(this, _transitioning);
|
|
2410
3230
|
}
|
|
3231
|
+
/**
|
|
3232
|
+
* Set repeat mode for this queue
|
|
3233
|
+
* @param mode The repeat mode to apply
|
|
3234
|
+
*/
|
|
2411
3235
|
setRepeatMode(mode) {
|
|
2412
3236
|
this.repeatMode = mode;
|
|
2413
3237
|
}
|
|
3238
|
+
/**
|
|
3239
|
+
* Max size of this queue
|
|
3240
|
+
*/
|
|
2414
3241
|
get maxSize() {
|
|
2415
3242
|
return this.options.maxSize ?? Infinity;
|
|
2416
3243
|
}
|
|
3244
|
+
/**
|
|
3245
|
+
* Max size of this queue
|
|
3246
|
+
*/
|
|
2417
3247
|
getMaxSize() {
|
|
2418
3248
|
return this.maxSize;
|
|
2419
3249
|
}
|
|
3250
|
+
/**
|
|
3251
|
+
* Gets the size of the queue
|
|
3252
|
+
*/
|
|
2420
3253
|
get size() {
|
|
2421
3254
|
return this.tracks.size;
|
|
2422
3255
|
}
|
|
3256
|
+
/**
|
|
3257
|
+
* The size of this queue
|
|
3258
|
+
*/
|
|
2423
3259
|
getSize() {
|
|
2424
3260
|
return this.size;
|
|
2425
3261
|
}
|
|
3262
|
+
/**
|
|
3263
|
+
* Max history size of this queue
|
|
3264
|
+
*/
|
|
2426
3265
|
get maxHistorySize() {
|
|
2427
3266
|
return this.options.maxHistorySize ?? Infinity;
|
|
2428
3267
|
}
|
|
3268
|
+
/**
|
|
3269
|
+
* Max history size of this queue
|
|
3270
|
+
*/
|
|
2429
3271
|
getMaxHistorySize() {
|
|
2430
3272
|
return this.maxHistorySize;
|
|
2431
3273
|
}
|
|
3274
|
+
/**
|
|
3275
|
+
* Set max history size for this queue
|
|
3276
|
+
* @param size The size to set
|
|
3277
|
+
*/
|
|
2432
3278
|
setMaxHistorySize(size) {
|
|
2433
3279
|
if (!TypeUtil.isNumber(size)) {
|
|
2434
3280
|
throw Exceptions.ERR_INVALID_ARG_TYPE("size", "number", typeof size);
|
|
@@ -2437,6 +3283,10 @@ var GuildQueue4 = class {
|
|
|
2437
3283
|
size = Infinity;
|
|
2438
3284
|
this.options.maxHistorySize = size;
|
|
2439
3285
|
}
|
|
3286
|
+
/**
|
|
3287
|
+
* Set max size for this queue
|
|
3288
|
+
* @param size The size to set
|
|
3289
|
+
*/
|
|
2440
3290
|
setMaxSize(size) {
|
|
2441
3291
|
if (!TypeUtil.isNumber(size)) {
|
|
2442
3292
|
throw Exceptions.ERR_INVALID_ARG_TYPE("size", "number", typeof size);
|
|
@@ -2445,25 +3295,44 @@ var GuildQueue4 = class {
|
|
|
2445
3295
|
size = Infinity;
|
|
2446
3296
|
this.options.maxSize = size;
|
|
2447
3297
|
}
|
|
3298
|
+
/**
|
|
3299
|
+
* Clear this queue
|
|
3300
|
+
*/
|
|
2448
3301
|
clear() {
|
|
2449
3302
|
this.tracks.clear();
|
|
2450
3303
|
this.history.clear();
|
|
2451
3304
|
}
|
|
3305
|
+
/**
|
|
3306
|
+
* Check if this queue has no tracks left in it
|
|
3307
|
+
*/
|
|
2452
3308
|
isEmpty() {
|
|
2453
3309
|
return this.tracks.size < 1;
|
|
2454
3310
|
}
|
|
3311
|
+
/**
|
|
3312
|
+
* Check if this queue is full
|
|
3313
|
+
*/
|
|
2455
3314
|
isFull() {
|
|
2456
3315
|
return this.tracks.size >= this.maxSize;
|
|
2457
3316
|
}
|
|
3317
|
+
/**
|
|
3318
|
+
* Get queue capacity
|
|
3319
|
+
*/
|
|
2458
3320
|
getCapacity() {
|
|
2459
3321
|
if (this.isFull())
|
|
2460
3322
|
return 0;
|
|
2461
3323
|
const cap = this.maxSize - this.size;
|
|
2462
3324
|
return cap;
|
|
2463
3325
|
}
|
|
3326
|
+
/**
|
|
3327
|
+
* Check if this queue currently holds active audio resource
|
|
3328
|
+
*/
|
|
2464
3329
|
isPlaying() {
|
|
2465
3330
|
return this.dispatcher?.audioResource != null && !this.dispatcher.audioResource.ended;
|
|
2466
3331
|
}
|
|
3332
|
+
/**
|
|
3333
|
+
* Add track to the queue. This will emit `audioTracksAdd` when multiple tracks are added, otherwise `audioTrackAdd`.
|
|
3334
|
+
* @param track Track or playlist or array of tracks to add
|
|
3335
|
+
*/
|
|
2467
3336
|
addTrack(track) {
|
|
2468
3337
|
const toAdd = track instanceof Playlist ? track.tracks : track;
|
|
2469
3338
|
const isMulti = Array.isArray(toAdd);
|
|
@@ -2475,21 +3344,49 @@ var GuildQueue4 = class {
|
|
|
2475
3344
|
this.emit(GuildQueueEvent.audioTrackAdd, this, toAdd);
|
|
2476
3345
|
}
|
|
2477
3346
|
}
|
|
3347
|
+
/**
|
|
3348
|
+
* Remove a track from queue
|
|
3349
|
+
* @param track The track to remove
|
|
3350
|
+
*/
|
|
2478
3351
|
removeTrack(track) {
|
|
2479
3352
|
return this.node.remove(track);
|
|
2480
3353
|
}
|
|
3354
|
+
/**
|
|
3355
|
+
* Inserts the track to the given index
|
|
3356
|
+
* @param track The track to insert
|
|
3357
|
+
* @param index The index to insert the track at (defaults to 0)
|
|
3358
|
+
*/
|
|
2481
3359
|
insertTrack(track, index = 0) {
|
|
2482
3360
|
return this.node.insert(track, index);
|
|
2483
3361
|
}
|
|
3362
|
+
/**
|
|
3363
|
+
* Moves a track in the queue
|
|
3364
|
+
* @param from The track to move
|
|
3365
|
+
* @param to The position to move to
|
|
3366
|
+
*/
|
|
2484
3367
|
moveTrack(track, index = 0) {
|
|
2485
3368
|
return this.node.move(track, index);
|
|
2486
3369
|
}
|
|
3370
|
+
/**
|
|
3371
|
+
* Copy a track in the queue
|
|
3372
|
+
* @param from The track to clone
|
|
3373
|
+
* @param to The position to clone at
|
|
3374
|
+
*/
|
|
2487
3375
|
copyTrack(track, index = 0) {
|
|
2488
3376
|
return this.node.copy(track, index);
|
|
2489
3377
|
}
|
|
3378
|
+
/**
|
|
3379
|
+
* Swap two tracks in the queue
|
|
3380
|
+
* @param src The first track to swap
|
|
3381
|
+
* @param dest The second track to swap
|
|
3382
|
+
*/
|
|
2490
3383
|
swapTracks(src, dest) {
|
|
2491
3384
|
return this.node.swap(src, dest);
|
|
2492
3385
|
}
|
|
3386
|
+
/**
|
|
3387
|
+
* Create stream dispatcher from the given connection
|
|
3388
|
+
* @param connection The connection to use
|
|
3389
|
+
*/
|
|
2493
3390
|
createDispatcher(connection, options = {}) {
|
|
2494
3391
|
if (connection.state.status === import_discord_voip4.VoiceConnectionStatus.Destroyed) {
|
|
2495
3392
|
throw Exceptions.ERR_VOICE_CONNECTION_DESTROYED();
|
|
@@ -2506,6 +3403,11 @@ var GuildQueue4 = class {
|
|
|
2506
3403
|
}
|
|
2507
3404
|
this.dispatcher = new StreamDispatcher(connection, channel, this, options.timeout ?? this.options.connectionTimeout, options.audioPlayer);
|
|
2508
3405
|
}
|
|
3406
|
+
/**
|
|
3407
|
+
* Connect to a voice channel
|
|
3408
|
+
* @param channelResolvable The voice channel to connect to
|
|
3409
|
+
* @param options Join config
|
|
3410
|
+
*/
|
|
2509
3411
|
async connect(channelResolvable, options = {}) {
|
|
2510
3412
|
const channel = this.player.client.channels.resolve(channelResolvable);
|
|
2511
3413
|
if (!channel || !channel.isVoiceBased()) {
|
|
@@ -2536,9 +3438,15 @@ var GuildQueue4 = class {
|
|
|
2536
3438
|
__privateMethod(this, _attachListeners, attachListeners_fn).call(this, this.dispatcher);
|
|
2537
3439
|
return this;
|
|
2538
3440
|
}
|
|
3441
|
+
/**
|
|
3442
|
+
* The voice connection latency of this queue
|
|
3443
|
+
*/
|
|
2539
3444
|
get ping() {
|
|
2540
3445
|
return this.connection?.ping.udp ?? -1;
|
|
2541
3446
|
}
|
|
3447
|
+
/**
|
|
3448
|
+
* Delete this queue
|
|
3449
|
+
*/
|
|
2542
3450
|
delete() {
|
|
2543
3451
|
if (this.player.nodes.delete(this.id)) {
|
|
2544
3452
|
__privateSet(this, _deleted, true);
|
|
@@ -2547,6 +3455,10 @@ var GuildQueue4 = class {
|
|
|
2547
3455
|
this.tasksQueue.cancelAll();
|
|
2548
3456
|
}
|
|
2549
3457
|
}
|
|
3458
|
+
/**
|
|
3459
|
+
* Revives this queue
|
|
3460
|
+
* @returns
|
|
3461
|
+
*/
|
|
2550
3462
|
revive() {
|
|
2551
3463
|
if (!this.deleted || this.player.nodes.has(this.id))
|
|
2552
3464
|
return;
|
|
@@ -2555,17 +3467,37 @@ var GuildQueue4 = class {
|
|
|
2555
3467
|
this.player.nodes.cache.set(this.id, this);
|
|
2556
3468
|
this.player.events.emit(GuildQueueEvent.queueCreate, this);
|
|
2557
3469
|
}
|
|
3470
|
+
/**
|
|
3471
|
+
* Set self deaf
|
|
3472
|
+
* @param mode On/Off state
|
|
3473
|
+
* @param reason Reason
|
|
3474
|
+
*/
|
|
2558
3475
|
setSelfDeaf(mode, reason) {
|
|
2559
3476
|
return this.guild.members.me.voice.setDeaf(mode, reason);
|
|
2560
3477
|
}
|
|
3478
|
+
/**
|
|
3479
|
+
* Set self mute
|
|
3480
|
+
* @param mode On/Off state
|
|
3481
|
+
* @param reason Reason
|
|
3482
|
+
*/
|
|
2561
3483
|
setSelfMute(mode, reason) {
|
|
2562
3484
|
return this.guild.members.me.voice.setMute(mode, reason);
|
|
2563
3485
|
}
|
|
3486
|
+
/**
|
|
3487
|
+
* Play a track in this queue
|
|
3488
|
+
* @param track The track to be played
|
|
3489
|
+
* @param options Player node initialization options
|
|
3490
|
+
*/
|
|
2564
3491
|
async play(track, options) {
|
|
2565
3492
|
if (!this.channel)
|
|
2566
3493
|
throw Exceptions.ERR_NO_VOICE_CONNECTION();
|
|
2567
3494
|
return this.player.play(this.channel, track, options);
|
|
2568
3495
|
}
|
|
3496
|
+
/**
|
|
3497
|
+
* Emit an event on this queue
|
|
3498
|
+
* @param event The event to emit
|
|
3499
|
+
* @param args The args for the event
|
|
3500
|
+
*/
|
|
2569
3501
|
emit(event, ...args) {
|
|
2570
3502
|
if (this.deleted)
|
|
2571
3503
|
return false;
|
|
@@ -2575,7 +3507,6 @@ var GuildQueue4 = class {
|
|
|
2575
3507
|
return this.player.events.listenerCount(GuildQueueEvent.debug) > 0;
|
|
2576
3508
|
}
|
|
2577
3509
|
};
|
|
2578
|
-
__name(GuildQueue4, "GuildQueue");
|
|
2579
3510
|
_transitioning = new WeakMap();
|
|
2580
3511
|
_deleted = new WeakMap();
|
|
2581
3512
|
_attachListeners = new WeakSet();
|
|
@@ -2701,10 +3632,10 @@ handleAutoplay_fn = /* @__PURE__ */ __name(async function(track) {
|
|
|
2701
3632
|
try {
|
|
2702
3633
|
if (this.hasDebugger)
|
|
2703
3634
|
this.debug(`Autoplay >> Finding related tracks for Track ${track.title} (${track.url}) [ext:${track.extractor?.identifier || "N/A"}]`);
|
|
2704
|
-
const tracks = (await track.extractor?.getRelatedTracks(track))?.tracks || (await this.player.extractors.run(async (ext) => {
|
|
3635
|
+
const tracks = (await track.extractor?.getRelatedTracks(track, this.history))?.tracks || (await this.player.extractors.run(async (ext) => {
|
|
2705
3636
|
if (this.hasDebugger)
|
|
2706
3637
|
this.debug(`Autoplay >> Querying extractor ${ext.identifier}`);
|
|
2707
|
-
const res = await ext.getRelatedTracks(track);
|
|
3638
|
+
const res = await ext.getRelatedTracks(track, this.history);
|
|
2708
3639
|
if (!res.tracks.length) {
|
|
2709
3640
|
if (this.hasDebugger)
|
|
2710
3641
|
this.debug(`Autoplay >> Extractor ${ext.identifier} failed to provide results.`);
|
|
@@ -2740,6 +3671,8 @@ handleAutoplay_fn = /* @__PURE__ */ __name(async function(track) {
|
|
|
2740
3671
|
return __privateMethod(this, _emitEnd, emitEnd_fn).call(this);
|
|
2741
3672
|
}
|
|
2742
3673
|
}, "#handleAutoplay");
|
|
3674
|
+
__name(_GuildQueue, "GuildQueue");
|
|
3675
|
+
var GuildQueue4 = _GuildQueue;
|
|
2743
3676
|
|
|
2744
3677
|
// src/utils/__internal__/_container.ts
|
|
2745
3678
|
var import_utils6 = require("@discord-player/utils");
|
|
@@ -2774,11 +3707,16 @@ function getGlobalRegistry() {
|
|
|
2774
3707
|
__name(getGlobalRegistry, "getGlobalRegistry");
|
|
2775
3708
|
|
|
2776
3709
|
// src/manager/GuildNodeManager.ts
|
|
2777
|
-
var
|
|
3710
|
+
var _GuildNodeManager = class _GuildNodeManager {
|
|
2778
3711
|
constructor(player) {
|
|
2779
3712
|
this.player = player;
|
|
2780
3713
|
this.cache = new import_utils7.Collection();
|
|
2781
3714
|
}
|
|
3715
|
+
/**
|
|
3716
|
+
* Create guild queue if it does not exist
|
|
3717
|
+
* @param guild The guild which will be the owner of the queue
|
|
3718
|
+
* @param options Queue initializer options
|
|
3719
|
+
*/
|
|
2782
3720
|
create(guild, options = {}) {
|
|
2783
3721
|
const server = this.player.client.guilds.resolve(guild);
|
|
2784
3722
|
if (!server) {
|
|
@@ -2807,6 +3745,11 @@ var GuildNodeManager = class {
|
|
|
2807
3745
|
options.maxHistorySize ?? (options.maxHistorySize = Infinity);
|
|
2808
3746
|
options.preferBridgedMetadata ?? (options.preferBridgedMetadata = true);
|
|
2809
3747
|
options.pauseOnEmpty ?? (options.pauseOnEmpty = true);
|
|
3748
|
+
options.disableBiquad ?? (options.disableBiquad = false);
|
|
3749
|
+
options.disableEqualizer ?? (options.disableEqualizer = false);
|
|
3750
|
+
options.disableFilterer ?? (options.disableFilterer = false);
|
|
3751
|
+
options.disableResampler ?? (options.disableResampler = false);
|
|
3752
|
+
options.disableVolume ?? (options.disableVolume = false);
|
|
2810
3753
|
if (getGlobalRegistry().has("@[onBeforeCreateStream]") && !options.onBeforeCreateStream) {
|
|
2811
3754
|
options.onBeforeCreateStream = getGlobalRegistry().get("@[onBeforeCreateStream]");
|
|
2812
3755
|
}
|
|
@@ -2841,21 +3784,38 @@ var GuildNodeManager = class {
|
|
|
2841
3784
|
preferBridgedMetadata: options.preferBridgedMetadata,
|
|
2842
3785
|
maxHistorySize: options.maxHistorySize,
|
|
2843
3786
|
maxSize: options.maxSize,
|
|
2844
|
-
pauseOnEmpty: options.pauseOnEmpty
|
|
3787
|
+
pauseOnEmpty: options.pauseOnEmpty,
|
|
3788
|
+
disableBiquad: options.disableBiquad,
|
|
3789
|
+
disableEqualizer: options.disableEqualizer,
|
|
3790
|
+
disableFilterer: options.disableFilterer,
|
|
3791
|
+
disableResampler: options.disableResampler,
|
|
3792
|
+
disableVolume: options.disableVolume
|
|
2845
3793
|
});
|
|
2846
3794
|
this.cache.set(server.id, queue);
|
|
2847
3795
|
return queue;
|
|
2848
3796
|
}
|
|
3797
|
+
/**
|
|
3798
|
+
* Get existing queue
|
|
3799
|
+
* @param node Queue resolvable
|
|
3800
|
+
*/
|
|
2849
3801
|
get(node) {
|
|
2850
3802
|
const queue = this.resolve(node);
|
|
2851
3803
|
if (!queue)
|
|
2852
3804
|
return null;
|
|
2853
3805
|
return this.cache.get(queue.id) || null;
|
|
2854
3806
|
}
|
|
3807
|
+
/**
|
|
3808
|
+
* Check if a queue exists
|
|
3809
|
+
* @param node Queue resolvable
|
|
3810
|
+
*/
|
|
2855
3811
|
has(node) {
|
|
2856
3812
|
const id = node instanceof GuildQueue4 ? node.id : this.player.client.guilds.resolveId(node);
|
|
2857
3813
|
return this.cache.has(id);
|
|
2858
3814
|
}
|
|
3815
|
+
/**
|
|
3816
|
+
* Delete queue
|
|
3817
|
+
* @param node Queue resolvable
|
|
3818
|
+
*/
|
|
2859
3819
|
delete(node) {
|
|
2860
3820
|
const queue = this.resolve(node);
|
|
2861
3821
|
if (!queue) {
|
|
@@ -2871,27 +3831,51 @@ var GuildNodeManager = class {
|
|
|
2871
3831
|
queue.tracks.clear();
|
|
2872
3832
|
return this.cache.delete(queue.id);
|
|
2873
3833
|
}
|
|
3834
|
+
/**
|
|
3835
|
+
* Resolve queue
|
|
3836
|
+
* @param node Queue resolvable
|
|
3837
|
+
*/
|
|
2874
3838
|
resolve(node) {
|
|
2875
3839
|
if (node instanceof GuildQueue4) {
|
|
2876
3840
|
return node;
|
|
2877
3841
|
}
|
|
2878
3842
|
return this.cache.get(this.player.client.guilds.resolveId(node));
|
|
2879
3843
|
}
|
|
3844
|
+
/**
|
|
3845
|
+
* Resolve queue id
|
|
3846
|
+
* @param node Queue resolvable
|
|
3847
|
+
*/
|
|
2880
3848
|
resolveId(node) {
|
|
2881
3849
|
const q = this.resolve(node);
|
|
2882
3850
|
return q?.id || null;
|
|
2883
3851
|
}
|
|
2884
3852
|
};
|
|
2885
|
-
__name(
|
|
3853
|
+
__name(_GuildNodeManager, "GuildNodeManager");
|
|
3854
|
+
var GuildNodeManager = _GuildNodeManager;
|
|
2886
3855
|
|
|
2887
3856
|
// src/VoiceInterface/VoiceUtils.ts
|
|
2888
3857
|
var import_discord_voip5 = require("discord-voip");
|
|
2889
3858
|
var import_utils8 = require("@discord-player/utils");
|
|
2890
|
-
var
|
|
3859
|
+
var _VoiceUtils = class _VoiceUtils {
|
|
3860
|
+
/**
|
|
3861
|
+
* The voice utils constructor
|
|
3862
|
+
*/
|
|
2891
3863
|
constructor(player) {
|
|
2892
3864
|
this.player = player;
|
|
3865
|
+
/**
|
|
3866
|
+
* Voice connection cache to store voice connections of the Player components.
|
|
3867
|
+
* This property is deprecated and will be removed in the future.
|
|
3868
|
+
* It only exists for compatibility reasons.
|
|
3869
|
+
* @deprecated
|
|
3870
|
+
*/
|
|
2893
3871
|
this.cache = new import_utils8.Collection();
|
|
2894
3872
|
}
|
|
3873
|
+
/**
|
|
3874
|
+
* Joins a voice channel, creating basic stream dispatch manager
|
|
3875
|
+
* @param {StageChannel|VoiceChannel} channel The voice channel
|
|
3876
|
+
* @param {object} [options] Join options
|
|
3877
|
+
* @returns {Promise<StreamDispatcher>}
|
|
3878
|
+
*/
|
|
2895
3879
|
async connect(channel, options) {
|
|
2896
3880
|
if (!options?.queue)
|
|
2897
3881
|
throw Exceptions.ERR_NO_GUILD_QUEUE();
|
|
@@ -2899,6 +3883,12 @@ var VoiceUtils = class {
|
|
|
2899
3883
|
const sub = new StreamDispatcher(conn, channel, options.queue, options.maxTime, options.audioPlayer);
|
|
2900
3884
|
return sub;
|
|
2901
3885
|
}
|
|
3886
|
+
/**
|
|
3887
|
+
* Joins a voice channel
|
|
3888
|
+
* @param {StageChannel|VoiceChannel} [channel] The voice/stage channel to join
|
|
3889
|
+
* @param {object} [options] Join options
|
|
3890
|
+
* @returns {VoiceConnection}
|
|
3891
|
+
*/
|
|
2902
3892
|
async join(channel, options) {
|
|
2903
3893
|
const conn = (0, import_discord_voip5.joinVoiceChannel)({
|
|
2904
3894
|
guildId: channel.guild.id,
|
|
@@ -2910,6 +3900,11 @@ var VoiceUtils = class {
|
|
|
2910
3900
|
});
|
|
2911
3901
|
return conn;
|
|
2912
3902
|
}
|
|
3903
|
+
/**
|
|
3904
|
+
* Disconnects voice connection
|
|
3905
|
+
* @param {VoiceConnection} connection The voice connection
|
|
3906
|
+
* @returns {void}
|
|
3907
|
+
*/
|
|
2913
3908
|
disconnect(connection) {
|
|
2914
3909
|
if (connection instanceof StreamDispatcher)
|
|
2915
3910
|
connection = connection.voiceConnection;
|
|
@@ -2919,16 +3914,22 @@ var VoiceUtils = class {
|
|
|
2919
3914
|
} catch {
|
|
2920
3915
|
}
|
|
2921
3916
|
}
|
|
3917
|
+
/**
|
|
3918
|
+
* Returns Discord Player voice connection
|
|
3919
|
+
* @param {Snowflake} guild The guild id
|
|
3920
|
+
* @returns {StreamDispatcher}
|
|
3921
|
+
*/
|
|
2922
3922
|
getConnection(guild, group) {
|
|
2923
3923
|
return (0, import_discord_voip5.getVoiceConnection)(guild, group);
|
|
2924
3924
|
}
|
|
2925
3925
|
};
|
|
2926
|
-
__name(
|
|
3926
|
+
__name(_VoiceUtils, "VoiceUtils");
|
|
3927
|
+
var VoiceUtils = _VoiceUtils;
|
|
2927
3928
|
|
|
2928
3929
|
// src/utils/QueryCache.ts
|
|
2929
3930
|
var DEFAULT_EXPIRY_TIMEOUT = 18e6;
|
|
2930
3931
|
var _defaultCache;
|
|
2931
|
-
var
|
|
3932
|
+
var _QueryCache = class _QueryCache {
|
|
2932
3933
|
constructor(player, options = {
|
|
2933
3934
|
checkInterval: DEFAULT_EXPIRY_TIMEOUT
|
|
2934
3935
|
}) {
|
|
@@ -2977,9 +3978,10 @@ var QueryCache = class {
|
|
|
2977
3978
|
});
|
|
2978
3979
|
}
|
|
2979
3980
|
};
|
|
2980
|
-
__name(QueryCache, "QueryCache");
|
|
2981
3981
|
_defaultCache = new WeakMap();
|
|
2982
|
-
|
|
3982
|
+
__name(_QueryCache, "QueryCache");
|
|
3983
|
+
var QueryCache = _QueryCache;
|
|
3984
|
+
var _DiscordPlayerQueryResultCache = class _DiscordPlayerQueryResultCache {
|
|
2983
3985
|
constructor(data, expireAfter = DEFAULT_EXPIRY_TIMEOUT) {
|
|
2984
3986
|
this.data = data;
|
|
2985
3987
|
this.expireAfter = DEFAULT_EXPIRY_TIMEOUT;
|
|
@@ -2993,7 +3995,8 @@ var DiscordPlayerQueryResultCache = class {
|
|
|
2993
3995
|
return Date.now() <= this.expireAfter;
|
|
2994
3996
|
}
|
|
2995
3997
|
};
|
|
2996
|
-
__name(
|
|
3998
|
+
__name(_DiscordPlayerQueryResultCache, "DiscordPlayerQueryResultCache");
|
|
3999
|
+
var DiscordPlayerQueryResultCache = _DiscordPlayerQueryResultCache;
|
|
2997
4000
|
|
|
2998
4001
|
// src/index.ts
|
|
2999
4002
|
__reExport(src_exports, require("@discord-player/ffmpeg"), module.exports);
|
|
@@ -3019,12 +4022,17 @@ async function defaultVoiceStateHandler(player, queue, oldState, newState) {
|
|
|
3019
4022
|
const isEmpty = Util.isVoiceEmpty(queue.channel);
|
|
3020
4023
|
if (queue.hasDebugger) {
|
|
3021
4024
|
if (isEmpty) {
|
|
4025
|
+
queue.node.setPaused(true);
|
|
4026
|
+
Reflect.set(queue, "__pausedOnEmpty", true);
|
|
3022
4027
|
queue.debug("Voice channel is empty and options#pauseOnEmpty is true, pausing...");
|
|
3023
4028
|
} else {
|
|
3024
|
-
|
|
4029
|
+
if (Reflect.get(queue, "__pausedOnEmpty")) {
|
|
4030
|
+
queue.node.setPaused(false);
|
|
4031
|
+
Reflect.set(queue, "__pausedOnEmpty", false);
|
|
4032
|
+
queue.debug("Voice channel is not empty and options#pauseOnEmpty is true, resuming...");
|
|
4033
|
+
}
|
|
3025
4034
|
}
|
|
3026
4035
|
}
|
|
3027
|
-
queue.node.setPaused(isEmpty);
|
|
3028
4036
|
}
|
|
3029
4037
|
if (!oldState.channelId && newState.channelId && newState.member?.id === newState.guild.members.me?.id) {
|
|
3030
4038
|
if (newState.serverMute != null && oldState.serverMute !== newState.serverMute) {
|
|
@@ -3112,10 +4120,114 @@ async function defaultVoiceStateHandler(player, queue, oldState, newState) {
|
|
|
3112
4120
|
}
|
|
3113
4121
|
__name(defaultVoiceStateHandler, "defaultVoiceStateHandler");
|
|
3114
4122
|
|
|
4123
|
+
// src/utils/IPRotator.ts
|
|
4124
|
+
var import_ip = __toESM(require("ip"));
|
|
4125
|
+
var _IPBlock = class _IPBlock {
|
|
4126
|
+
constructor(block) {
|
|
4127
|
+
this.block = block;
|
|
4128
|
+
this.usage = 0;
|
|
4129
|
+
if (import_ip.default.isV4Format(block.split("/")[0]) && !block.includes("/")) {
|
|
4130
|
+
block += "/32";
|
|
4131
|
+
} else if (import_ip.default.isV6Format(block.split("/")[0]) && !block.includes("/")) {
|
|
4132
|
+
block += "/128";
|
|
4133
|
+
}
|
|
4134
|
+
this.cidr = import_ip.default.cidr(this.block);
|
|
4135
|
+
this.cidrSize = import_ip.default.cidrSubnet(this.block).subnetMaskLength;
|
|
4136
|
+
}
|
|
4137
|
+
consume() {
|
|
4138
|
+
this.usage++;
|
|
4139
|
+
}
|
|
4140
|
+
};
|
|
4141
|
+
__name(_IPBlock, "IPBlock");
|
|
4142
|
+
var IPBlock = _IPBlock;
|
|
4143
|
+
var _retries;
|
|
4144
|
+
var _IPRotator = class _IPRotator {
|
|
4145
|
+
constructor(config) {
|
|
4146
|
+
this.config = config;
|
|
4147
|
+
this.blocks = [];
|
|
4148
|
+
this.failures = /* @__PURE__ */ new Map();
|
|
4149
|
+
this.MAX_NEXT_RETRIES = 30;
|
|
4150
|
+
__privateAdd(this, _retries, 0);
|
|
4151
|
+
config.exclude ?? (config.exclude = []);
|
|
4152
|
+
this.blocks = config.blocks.map((block) => new IPBlock(block));
|
|
4153
|
+
this.MAX_NEXT_RETRIES = config.maxRetries ?? 10;
|
|
4154
|
+
}
|
|
4155
|
+
getIP() {
|
|
4156
|
+
const block = this.blocks.sort((a, b) => a.usage - b.usage)[0];
|
|
4157
|
+
if (!block) {
|
|
4158
|
+
throw new Error("No IP blocks available");
|
|
4159
|
+
}
|
|
4160
|
+
const random = _IPRotator.getRandomIP(block.cidr, block.cidrSize);
|
|
4161
|
+
if (this.isFailedOrExcluded(random)) {
|
|
4162
|
+
if (__privateWrapper(this, _retries)._++ > this.MAX_NEXT_RETRIES) {
|
|
4163
|
+
__privateSet(this, _retries, 0);
|
|
4164
|
+
throw new Error("Unable to find an IP that is not excluded");
|
|
4165
|
+
}
|
|
4166
|
+
return this.getIP();
|
|
4167
|
+
}
|
|
4168
|
+
__privateSet(this, _retries, 0);
|
|
4169
|
+
block.consume();
|
|
4170
|
+
return { ip: random, family: import_ip.default.isV4Format(random) ? 4 : 6 };
|
|
4171
|
+
}
|
|
4172
|
+
isFailedOrExcluded(ip2) {
|
|
4173
|
+
return this.failures.has(ip2) || !!this.config.exclude?.includes(ip2);
|
|
4174
|
+
}
|
|
4175
|
+
addFailed(ip2) {
|
|
4176
|
+
const lastFailedCount = this.failures.get(ip2) ?? 0;
|
|
4177
|
+
this.failures.set(ip2, lastFailedCount + 1);
|
|
4178
|
+
}
|
|
4179
|
+
static getRandomIP(address, start, end) {
|
|
4180
|
+
const bytes = import_ip.default.toBuffer(address);
|
|
4181
|
+
const ipv6 = bytes.length === 16;
|
|
4182
|
+
const bytesize = 8;
|
|
4183
|
+
start = start || 0;
|
|
4184
|
+
end = typeof end !== "undefined" ? end : bytes.length * bytesize;
|
|
4185
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
4186
|
+
let bit = i * bytesize;
|
|
4187
|
+
if (bit + bytesize < start || bit >= end) {
|
|
4188
|
+
continue;
|
|
4189
|
+
}
|
|
4190
|
+
let b = bytes[i];
|
|
4191
|
+
for (let n = 0; n < bytesize; n++) {
|
|
4192
|
+
if (bit >= start && bit < end) {
|
|
4193
|
+
const bitpos = bytesize - n - 1;
|
|
4194
|
+
const bitmask = 1 << bitpos;
|
|
4195
|
+
if (Math.random() < 0.5) {
|
|
4196
|
+
b |= bitmask;
|
|
4197
|
+
} else {
|
|
4198
|
+
b &= ~bitmask;
|
|
4199
|
+
}
|
|
4200
|
+
}
|
|
4201
|
+
bit++;
|
|
4202
|
+
}
|
|
4203
|
+
bytes[i] = b;
|
|
4204
|
+
}
|
|
4205
|
+
const tets = [];
|
|
4206
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
4207
|
+
if (ipv6) {
|
|
4208
|
+
if (i % 2 === 0) {
|
|
4209
|
+
tets[i >> 1] = (bytes[i] << bytesize | bytes[i + 1]).toString(16);
|
|
4210
|
+
}
|
|
4211
|
+
} else {
|
|
4212
|
+
tets[i] = bytes[i];
|
|
4213
|
+
}
|
|
4214
|
+
}
|
|
4215
|
+
return tets.join(ipv6 ? ":" : ".");
|
|
4216
|
+
}
|
|
4217
|
+
};
|
|
4218
|
+
_retries = new WeakMap();
|
|
4219
|
+
__name(_IPRotator, "IPRotator");
|
|
4220
|
+
var IPRotator = _IPRotator;
|
|
4221
|
+
|
|
3115
4222
|
// src/Player.ts
|
|
3116
4223
|
var kSingleton = Symbol("InstanceDiscordPlayerSingleton");
|
|
3117
4224
|
var _lastLatency, _voiceStateUpdateListener, _lagMonitorTimeout, _lagMonitorInterval, _onVoiceStateUpdate;
|
|
3118
|
-
var _Player = class extends PlayerEventsEmitter {
|
|
4225
|
+
var _Player = class _Player extends PlayerEventsEmitter {
|
|
4226
|
+
/**
|
|
4227
|
+
* Creates new Discord Player
|
|
4228
|
+
* @param {Client} client The Discord Client
|
|
4229
|
+
* @param {PlayerInitOptions} [options] The player init options
|
|
4230
|
+
*/
|
|
3119
4231
|
constructor(client, options = {}) {
|
|
3120
4232
|
if (!options.ignoreInstance && kSingleton in _Player)
|
|
3121
4233
|
return _Player[kSingleton];
|
|
@@ -3130,6 +4242,7 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3130
4242
|
this.voiceUtils = new VoiceUtils(this);
|
|
3131
4243
|
this.extractors = new ExtractorExecutionContext(this);
|
|
3132
4244
|
this.events = new PlayerEventsEmitter(["error", "playerError"]);
|
|
4245
|
+
this.routePlanner = null;
|
|
3133
4246
|
this.client = client;
|
|
3134
4247
|
const ibf = this.client.options.intents instanceof import_discord5.IntentsBitField ? this.client.options.intents : new import_discord5.IntentsBitField(this.client.options.intents);
|
|
3135
4248
|
if (!ibf.has(import_discord5.IntentsBitField.Flags.GuildVoiceStates)) {
|
|
@@ -3140,7 +4253,6 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3140
4253
|
blockExtractors: [],
|
|
3141
4254
|
blockStreamFrom: [],
|
|
3142
4255
|
connectionTimeout: 2e4,
|
|
3143
|
-
smoothVolume: true,
|
|
3144
4256
|
lagMonitor: 3e4,
|
|
3145
4257
|
queryCache: options.queryCache === null ? null : options.queryCache || new QueryCache(this),
|
|
3146
4258
|
useLegacyFFmpeg: false,
|
|
@@ -3161,6 +4273,9 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3161
4273
|
}, 0).unref());
|
|
3162
4274
|
}, this.options.lagMonitor).unref());
|
|
3163
4275
|
}
|
|
4276
|
+
if (this.options.ipconfig) {
|
|
4277
|
+
this.routePlanner = new IPRotator(this.options.ipconfig);
|
|
4278
|
+
}
|
|
3164
4279
|
addPlayer(this);
|
|
3165
4280
|
if (!(kSingleton in _Player)) {
|
|
3166
4281
|
Object.defineProperty(_Player, kSingleton, {
|
|
@@ -3174,39 +4289,91 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3174
4289
|
get hasDebugger() {
|
|
3175
4290
|
return this.listenerCount("debug") > 0;
|
|
3176
4291
|
}
|
|
4292
|
+
/**
|
|
4293
|
+
* Override default voice state update handler
|
|
4294
|
+
* @param handler The handler callback
|
|
4295
|
+
*/
|
|
3177
4296
|
onVoiceStateUpdate(handler2) {
|
|
3178
4297
|
__privateSet(this, _onVoiceStateUpdate, handler2);
|
|
3179
4298
|
}
|
|
3180
4299
|
debug(m) {
|
|
3181
4300
|
return this.emit("debug", m);
|
|
3182
4301
|
}
|
|
4302
|
+
/**
|
|
4303
|
+
* Creates discord-player singleton instance.
|
|
4304
|
+
* @param client The client that instantiated player
|
|
4305
|
+
* @param options Player initializer options
|
|
4306
|
+
*/
|
|
3183
4307
|
static singleton(client, options = {}) {
|
|
3184
4308
|
return new _Player(client, {
|
|
3185
4309
|
...options,
|
|
3186
4310
|
ignoreInstance: false
|
|
3187
4311
|
});
|
|
3188
4312
|
}
|
|
4313
|
+
/**
|
|
4314
|
+
* Creates new discord-player instance.
|
|
4315
|
+
* @param client The client that instantiated player
|
|
4316
|
+
* @param options Player initializer options
|
|
4317
|
+
*/
|
|
3189
4318
|
static create(client, options = {}) {
|
|
3190
4319
|
return new _Player(client, {
|
|
3191
4320
|
...options,
|
|
3192
4321
|
ignoreInstance: true
|
|
3193
4322
|
});
|
|
3194
4323
|
}
|
|
4324
|
+
/**
|
|
4325
|
+
* Get all active master player instances
|
|
4326
|
+
*/
|
|
3195
4327
|
static getAllPlayers() {
|
|
3196
4328
|
return getPlayers();
|
|
3197
4329
|
}
|
|
4330
|
+
/**
|
|
4331
|
+
* Clear all master player instances
|
|
4332
|
+
*/
|
|
3198
4333
|
static clearAllPlayers() {
|
|
3199
4334
|
return instances.clear();
|
|
3200
4335
|
}
|
|
4336
|
+
/**
|
|
4337
|
+
* The current query cache provider in use
|
|
4338
|
+
*/
|
|
3201
4339
|
get queryCache() {
|
|
3202
4340
|
return this.options.queryCache ?? null;
|
|
3203
4341
|
}
|
|
4342
|
+
/**
|
|
4343
|
+
* Alias to `Player.nodes`.
|
|
4344
|
+
*/
|
|
3204
4345
|
get queues() {
|
|
3205
4346
|
return this.nodes;
|
|
3206
4347
|
}
|
|
4348
|
+
/**
|
|
4349
|
+
* Event loop latency in ms. If your bot is laggy and this returns a number above 20ms for example,
|
|
4350
|
+
* some expensive task is being executed on the current thread which is slowing down the event loop.
|
|
4351
|
+
* @type {number}
|
|
4352
|
+
*/
|
|
3207
4353
|
get eventLoopLag() {
|
|
3208
4354
|
return __privateGet(this, _lastLatency);
|
|
3209
4355
|
}
|
|
4356
|
+
/**
|
|
4357
|
+
* Generates statistics that could be useful. Statistics generator is still experimental.
|
|
4358
|
+
* @example ```typescript
|
|
4359
|
+
* const stats = player.generateStatistics();
|
|
4360
|
+
*
|
|
4361
|
+
* console.log(stats);
|
|
4362
|
+
*
|
|
4363
|
+
* // outputs something like
|
|
4364
|
+
* // {
|
|
4365
|
+
* // instances: number,
|
|
4366
|
+
* // queuesCount: number,
|
|
4367
|
+
* // queryCacheEnabled: boolean,
|
|
4368
|
+
* // queues: [
|
|
4369
|
+
* // GuildQueueStatisticsMetadata,
|
|
4370
|
+
* // GuildQueueStatisticsMetadata,
|
|
4371
|
+
* // GuildQueueStatisticsMetadata,
|
|
4372
|
+
* // ...
|
|
4373
|
+
* // ]
|
|
4374
|
+
* // }
|
|
4375
|
+
* ```
|
|
4376
|
+
*/
|
|
3210
4377
|
generateStatistics() {
|
|
3211
4378
|
return {
|
|
3212
4379
|
instances: instances.size,
|
|
@@ -3215,6 +4382,13 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3215
4382
|
queues: this.queues.cache.map((m) => m.stats.generate())
|
|
3216
4383
|
};
|
|
3217
4384
|
}
|
|
4385
|
+
/**
|
|
4386
|
+
* Destroy every single queues managed by this master player instance
|
|
4387
|
+
* @example ```typescript
|
|
4388
|
+
* // use me when you want to immediately terminate every single queues in existence 🔪
|
|
4389
|
+
* await player.destroy();
|
|
4390
|
+
* ```
|
|
4391
|
+
*/
|
|
3218
4392
|
async destroy() {
|
|
3219
4393
|
this.nodes.cache.forEach((node) => node.delete());
|
|
3220
4394
|
this.client.off("voiceStateUpdate", __privateGet(this, _voiceStateUpdateListener));
|
|
@@ -3236,18 +4410,58 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3236
4410
|
return;
|
|
3237
4411
|
return __privateGet(this, _onVoiceStateUpdate).call(this, this, queue, oldState, newState);
|
|
3238
4412
|
}
|
|
4413
|
+
/**
|
|
4414
|
+
* Handles voice state update
|
|
4415
|
+
* @param {VoiceState} oldState The old voice state
|
|
4416
|
+
* @param {VoiceState} newState The new voice state
|
|
4417
|
+
* @returns {void}
|
|
4418
|
+
* @example ```typescript
|
|
4419
|
+
* // passing voice state update data to this method will trigger voice state handler
|
|
4420
|
+
*
|
|
4421
|
+
* client.on('voiceStateUpdate', (oldState, newState) => {
|
|
4422
|
+
* // this is definitely a rocket science, right here
|
|
4423
|
+
* player.handleVoiceState(oldState, newState);
|
|
4424
|
+
* });
|
|
4425
|
+
* ```
|
|
4426
|
+
*/
|
|
3239
4427
|
handleVoiceState(oldState, newState) {
|
|
3240
4428
|
this._handleVoiceState(oldState, newState);
|
|
3241
4429
|
}
|
|
4430
|
+
/**
|
|
4431
|
+
* Lock voice state handler. When this method is called, discord-player will keep using the default voice state update handler, even if custom implementation exists.
|
|
4432
|
+
*/
|
|
3242
4433
|
lockVoiceStateHandler() {
|
|
3243
4434
|
this.options.lockVoiceStateHandler = true;
|
|
3244
4435
|
}
|
|
4436
|
+
/**
|
|
4437
|
+
* Unlock voice state handler. When this method is called, discord-player will stop using the default voice state update handler if custom implementation exists.
|
|
4438
|
+
*/
|
|
3245
4439
|
unlockVoiceStateHandler() {
|
|
3246
4440
|
this.options.lockVoiceStateHandler = false;
|
|
3247
4441
|
}
|
|
4442
|
+
/**
|
|
4443
|
+
* Checks if voice state handler is locked.
|
|
4444
|
+
*/
|
|
3248
4445
|
isVoiceStateHandlerLocked() {
|
|
3249
4446
|
return !!this.options.lockVoiceStateHandler;
|
|
3250
4447
|
}
|
|
4448
|
+
/**
|
|
4449
|
+
* Initiate audio player
|
|
4450
|
+
* @param channel The voice channel on which the music should be played
|
|
4451
|
+
* @param query The track or source to play
|
|
4452
|
+
* @param options Options for player
|
|
4453
|
+
* @example ```typescript
|
|
4454
|
+
* // no need to worry about queue management, just use this method 😄
|
|
4455
|
+
* const query = 'this is my super cool search query that I want to play';
|
|
4456
|
+
*
|
|
4457
|
+
* try {
|
|
4458
|
+
* const { track } = await player.play(voiceChannel, query);
|
|
4459
|
+
* console.log(`🎉 I am playing ${track.title} 🎉`);
|
|
4460
|
+
* } catch(e) {
|
|
4461
|
+
* console.log(`😭 Failed to play error oh no:\n\n${e}`);
|
|
4462
|
+
* }
|
|
4463
|
+
* ```
|
|
4464
|
+
*/
|
|
3251
4465
|
async play(channel, query, options = {}) {
|
|
3252
4466
|
const vc = this.client.channels.resolve(channel);
|
|
3253
4467
|
if (!vc?.isVoiceBased())
|
|
@@ -3290,6 +4504,18 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3290
4504
|
queue
|
|
3291
4505
|
};
|
|
3292
4506
|
}
|
|
4507
|
+
/**
|
|
4508
|
+
* Search tracks
|
|
4509
|
+
* @param {string | Track | Track[] | Playlist | SearchResult} query The search query
|
|
4510
|
+
* @param {SearchOptions} options The search options
|
|
4511
|
+
* @returns {Promise<SearchResult>}
|
|
4512
|
+
* @example ```typescript
|
|
4513
|
+
* const searchQuery = 'pass url or text or discord-player track constructable objects, we got you covered 😎';
|
|
4514
|
+
* const result = await player.search(searchQuery);
|
|
4515
|
+
*
|
|
4516
|
+
* console.log(result); // Logs `SearchResult` object
|
|
4517
|
+
* ```
|
|
4518
|
+
*/
|
|
3293
4519
|
async search(searchQuery, options = {}) {
|
|
3294
4520
|
if (searchQuery instanceof SearchResult)
|
|
3295
4521
|
return searchQuery;
|
|
@@ -3332,8 +4558,9 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3332
4558
|
this.debug(`Searching ${searchQuery}`);
|
|
3333
4559
|
let extractor = null;
|
|
3334
4560
|
options.searchEngine ?? (options.searchEngine = QueryType.AUTO);
|
|
4561
|
+
options.fallbackSearchEngine ?? (options.fallbackSearchEngine = QueryType.AUTO_SEARCH);
|
|
3335
4562
|
if (this.hasDebugger)
|
|
3336
|
-
this.debug(`Search engine set to ${options.searchEngine}`);
|
|
4563
|
+
this.debug(`Search engine set to ${options.searchEngine}, fallback search engine set to ${options.fallbackSearchEngine}`);
|
|
3337
4564
|
const { type: queryType, query } = options.searchEngine === QueryType.AUTO ? QueryResolver.resolve(searchQuery, options.fallbackSearchEngine) : { type: options.searchEngine, query: searchQuery };
|
|
3338
4565
|
if (this.hasDebugger)
|
|
3339
4566
|
this.debug(`Query type identified as ${queryType}`);
|
|
@@ -3385,7 +4612,8 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3385
4612
|
this.debug(`Executing metadata query using ${extractor.identifier} extractor...`);
|
|
3386
4613
|
const res = await extractor.handle(query, {
|
|
3387
4614
|
type: queryType,
|
|
3388
|
-
requestedBy: options.requestedBy
|
|
4615
|
+
requestedBy: options.requestedBy,
|
|
4616
|
+
requestOptions: options.requestOptions
|
|
3389
4617
|
}).catch(() => null);
|
|
3390
4618
|
if (res) {
|
|
3391
4619
|
if (this.hasDebugger)
|
|
@@ -3410,7 +4638,8 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3410
4638
|
const result = await this.extractors.run(
|
|
3411
4639
|
async (ext) => !options.blockExtractors?.includes(ext.identifier) && await ext.validate(query) && ext.handle(query, {
|
|
3412
4640
|
type: queryType,
|
|
3413
|
-
requestedBy: options.requestedBy
|
|
4641
|
+
requestedBy: options.requestedBy,
|
|
4642
|
+
requestOptions: options.requestOptions
|
|
3414
4643
|
})
|
|
3415
4644
|
);
|
|
3416
4645
|
if (!result?.result) {
|
|
@@ -3440,6 +4669,14 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3440
4669
|
}
|
|
3441
4670
|
return data;
|
|
3442
4671
|
}
|
|
4672
|
+
/**
|
|
4673
|
+
* Generates a report of the dependencies used by the `discord-voip` module. Useful for debugging.
|
|
4674
|
+
* @example ```typescript
|
|
4675
|
+
* console.log(player.scanDeps());
|
|
4676
|
+
* // -> logs dependencies report
|
|
4677
|
+
* ```
|
|
4678
|
+
* @returns {string}
|
|
4679
|
+
*/
|
|
3443
4680
|
scanDeps() {
|
|
3444
4681
|
const line = "-".repeat(50);
|
|
3445
4682
|
const runtime = "Bun" in globalThis ? "Bun" : "Deno" in globalThis ? "Deno" : "Node";
|
|
@@ -3472,19 +4709,23 @@ var _Player = class extends PlayerEventsEmitter {
|
|
|
3472
4709
|
*[Symbol.iterator]() {
|
|
3473
4710
|
yield* this.nodes.cache.values();
|
|
3474
4711
|
}
|
|
4712
|
+
/**
|
|
4713
|
+
* Creates `Playlist` instance
|
|
4714
|
+
* @param data The data to initialize a playlist
|
|
4715
|
+
*/
|
|
3475
4716
|
createPlaylist(data) {
|
|
3476
4717
|
return new Playlist(this, data);
|
|
3477
4718
|
}
|
|
3478
4719
|
};
|
|
3479
|
-
var Player = _Player;
|
|
3480
|
-
__name(Player, "Player");
|
|
3481
4720
|
_lastLatency = new WeakMap();
|
|
3482
4721
|
_voiceStateUpdateListener = new WeakMap();
|
|
3483
4722
|
_lagMonitorTimeout = new WeakMap();
|
|
3484
4723
|
_lagMonitorInterval = new WeakMap();
|
|
3485
4724
|
_onVoiceStateUpdate = new WeakMap();
|
|
3486
|
-
|
|
3487
|
-
|
|
4725
|
+
__name(_Player, "Player");
|
|
4726
|
+
_Player.version = "6.6.4";
|
|
4727
|
+
_Player._singletonKey = kSingleton;
|
|
4728
|
+
var Player = _Player;
|
|
3488
4729
|
|
|
3489
4730
|
// src/hooks/common.ts
|
|
3490
4731
|
var getPlayer = /* @__PURE__ */ __name(() => {
|
|
@@ -3626,7 +4867,7 @@ __name(useVolume, "useVolume");
|
|
|
3626
4867
|
// src/index.ts
|
|
3627
4868
|
var import_equalizer3 = require("@discord-player/equalizer");
|
|
3628
4869
|
var import_discord_voip7 = require("discord-voip");
|
|
3629
|
-
var version = "6.6.
|
|
4870
|
+
var version = "6.6.4";
|
|
3630
4871
|
if (!import_discord6.version.startsWith("14")) {
|
|
3631
4872
|
process.emitWarning(`Discord.js v${import_discord6.version} is incompatible with Discord Player v${version}! Please use >=v14.x of Discord.js`);
|
|
3632
4873
|
}
|
|
@@ -3657,6 +4898,8 @@ if (!import_discord6.version.startsWith("14")) {
|
|
|
3657
4898
|
GuildQueueHistory,
|
|
3658
4899
|
GuildQueuePlayerNode,
|
|
3659
4900
|
GuildQueueStatistics,
|
|
4901
|
+
IPBlock,
|
|
4902
|
+
IPRotator,
|
|
3660
4903
|
PCMAudioFilters,
|
|
3661
4904
|
Player,
|
|
3662
4905
|
PlayerEvent,
|
|
@@ -3689,6 +4932,7 @@ if (!import_discord6.version.startsWith("14")) {
|
|
|
3689
4932
|
useQueue,
|
|
3690
4933
|
useTimeline,
|
|
3691
4934
|
useVolume,
|
|
3692
|
-
version
|
|
4935
|
+
version,
|
|
4936
|
+
...require("@discord-player/ffmpeg")
|
|
3693
4937
|
});
|
|
3694
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy91dGlscy9VdGlsLnRzIiwgIi4uL3NyYy9mYWJyaWMvUGxheWxpc3QudHMiLCAiLi4vc3JjL2ZhYnJpYy9UcmFjay50cyIsICIuLi9zcmMvdHlwZXMvdHlwZXMudHMiLCAiLi4vc3JjL2ZhYnJpYy9TZWFyY2hSZXN1bHQudHMiLCAiLi4vc3JjL3V0aWxzL0F1ZGlvRmlsdGVycy50cyIsICIuLi9zcmMvZXJyb3JzL2luZGV4LnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvdXRpbHMvVHlwZVV0aWwudHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGROb2RlTWFuYWdlci50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlLnRzIiwgIi4uL3NyYy9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL1ZvaWNlUmVjZWl2ZXJOb2RlLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVIaXN0b3J5LnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVQbGF5ZXJOb2RlLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy91dGlscy9Bc3luY1F1ZXVlLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlU3RhdGlzdGljcy50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL19jb250YWluZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9hZGRQbGF5ZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9jbGVhclBsYXllci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldFBsYXllcnMudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9nZXRHbG9iYWxSZWdpc3RyeS50cyIsICIuLi9zcmMvVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscy50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlDYWNoZS50cyIsICIuLi9zcmMvUGxheWVyLnRzIiwgIi4uL3NyYy9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIudHMiLCAiLi4vc3JjL2hvb2tzL2NvbW1vbi50cyIsICIuLi9zcmMvaG9va3MvdXNlSGlzdG9yeS50cyIsICIuLi9zcmMvaG9va3MvdXNlUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VRdWV1ZS50cyIsICIuLi9zcmMvaG9va3MvdXNlTWFpblBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlTWV0YWRhdGEudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVRpbWVsaW5lLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25BZnRlckNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQmVmb3JlQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy91c2VWb2x1bWUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWJyaWMnO1xuZXhwb3J0ICogZnJvbSAnLi9tYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscyc7XG5leHBvcnQgKiBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHlwZVV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Bc3luY1F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyJztcbmV4cG9ydCAqIGZyb20gJy4vaG9va3MnO1xuZXhwb3J0IHtcbiAgICBBdWRpb0ZpbHRlcnMgYXMgUENNQXVkaW9GaWx0ZXJzLFxuICAgIHR5cGUgQmlxdWFkRmlsdGVycyxcbiAgICBGaWx0ZXJUeXBlIGFzIEJpcXVhZEZpbHRlclR5cGUsXG4gICAgdHlwZSBQQ01GaWx0ZXJzLFxuICAgIFFfQlVUVEVSV09SVEgsXG4gICAgVm9sdW1lVHJhbnNmb3JtZXIsXG4gICAgQkFTU19FUV9CQU5EUyxcbiAgICBBRl9OSUdIVENPUkVfUkFURSxcbiAgICBBRl9WQVBPUldBVkVfUkFURSxcbiAgICBGaWx0ZXJzQ2hhaW5cbn0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5leHBvcnQgeyBjcmVhdGVBdWRpb1BsYXllciwgQXVkaW9QbGF5ZXIsIHR5cGUgQ3JlYXRlQXVkaW9QbGF5ZXJPcHRpb25zIH0gZnJvbSAnZGlzY29yZC12b2lwJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzXG5leHBvcnQgY29uc3QgdmVyc2lvbjogc3RyaW5nID0gJzYuNi4zLWRldi4wJztcblxuaWYgKCFkanNWZXJzaW9uLnN0YXJ0c1dpdGgoJzE0JykpIHtcbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKGBEaXNjb3JkLmpzIHYke2Rqc1ZlcnNpb259IGlzIGluY29tcGF0aWJsZSB3aXRoIERpc2NvcmQgUGxheWVyIHYke3ZlcnNpb259ISBQbGVhc2UgdXNlID49djE0Lnggb2YgRGlzY29yZC5qc2ApO1xufVxuIiwgImltcG9ydCB7IERlZmF1bHRMaXN0ZW5lciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBMaXN0ZW5lclNpZ25hdHVyZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEwgZXh0ZW5kcyBMaXN0ZW5lclNpZ25hdHVyZTxMPiA9IERlZmF1bHRMaXN0ZW5lcj4gZXh0ZW5kcyBFdmVudEVtaXR0ZXI8TD4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVxdWlyZWRFdmVudHM6IEFycmF5PGtleW9mIEw+ID0gW10pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgLi4uYXJnczogUGFyYW1ldGVyczxMW0tdPikge1xuICAgICAgICBpZiAodGhpcy5yZXF1aXJlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSAmJiAhdGhpcy5ldmVudE5hbWVzKCkuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuICAgICAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICAgICAgIGBObyBldmVudCBsaXN0ZW5lciBmb3VuZCBmb3IgZXZlbnQgXCIke1N0cmluZyhuYW1lKX1cIi4gRXZlbnRzICR7dGhpcy5yZXF1aXJlZEV2ZW50cy5tYXAoKG0pID0+IGBcIiR7U3RyaW5nKG0pfVwiYCkuam9pbignLCAnKX0gbXVzdCBoYXZlIGV2ZW50IGxpc3RlbmVycy5gLFxuICAgICAgICAgICAgICAgICdVbmhhbmRsZWRFdmVudHNXYXJuaW5nJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5lbWl0KG5hbWUsIC4uLmFyZ3MpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgVGltZURhdGEgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IFBsYXlsaXN0LCBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuY2xhc3MgVXRpbCB7XG4gICAgLyoqXG4gICAgICogVXRpbHNcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZHVyYXRpb24gc3RyaW5nXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGR1ck9iaiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZHVyYXRpb25TdHJpbmcoZHVyT2JqOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGR1ck9iailcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IChpc05hTihtKSA/IDAgOiBtKSlcbiAgICAgICAgICAgIC5qb2luKCc6Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIG1pbGxpc2Vjb25kcyB0byBjb25zdW1hYmxlIHRpbWUgb2JqZWN0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyBUaGUgdGltZSBpbiBtc1xuICAgICAqIEByZXR1cm5zIHtUaW1lRGF0YX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyc2VNUyhtaWxsaXNlY29uZHM6IG51bWJlcikge1xuICAgICAgICBpZiAoaXNOYU4obWlsbGlzZWNvbmRzKSkgbWlsbGlzZWNvbmRzID0gMDtcbiAgICAgICAgY29uc3Qgcm91bmQgPSBtaWxsaXNlY29uZHMgPiAwID8gTWF0aC5mbG9vciA6IE1hdGguY2VpbDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF5czogcm91bmQobWlsbGlzZWNvbmRzIC8gODY0MDAwMDApLFxuICAgICAgICAgICAgaG91cnM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDM2MDAwMDApICUgMjQsXG4gICAgICAgICAgICBtaW51dGVzOiByb3VuZChtaWxsaXNlY29uZHMgLyA2MDAwMCkgJSA2MCxcbiAgICAgICAgICAgIHNlY29uZHM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjBcbiAgICAgICAgfSBhcyBUaW1lRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgdGltZSBjb2RlXG4gICAgICogQHBhcmFtIHtUaW1lRGF0YX0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGJ1aWxkVGltZUNvZGUoZHVyYXRpb246IFRpbWVEYXRhKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gT2JqZWN0LmtleXMoZHVyYXRpb24pO1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IFsnZGF5cycsICdob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnXTtcblxuICAgICAgICBjb25zdCBwYXJzZWQgPSBpdGVtcy5maWx0ZXIoKHgpID0+IHJlcXVpcmVkLmluY2x1ZGVzKHgpKS5tYXAoKG0pID0+IGR1cmF0aW9uW20gYXMga2V5b2YgVGltZURhdGFdKTtcbiAgICAgICAgY29uc3QgZmluYWwgPSBwYXJzZWRcbiAgICAgICAgICAgIC5zbGljZShwYXJzZWQuZmluZEluZGV4KCh4KSA9PiB4ICE9PSAwKSlcbiAgICAgICAgICAgIC5tYXAoKHgpID0+IHgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpKVxuICAgICAgICAgICAgLmpvaW4oJzonKTtcblxuICAgICAgICByZXR1cm4gZmluYWwubGVuZ3RoIDw9IDMgPyBgMDoke2ZpbmFsLnBhZFN0YXJ0KDIsICcwJykgfHwgMH1gIDogZmluYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGlja3MgbGFzdCBpdGVtIG9mIHRoZSBnaXZlbiBhcnJheVxuICAgICAqIEBwYXJhbSB7YW55W119IGFyciBUaGUgYXJyYXlcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgc3RhdGljIGxhc3Q8VCA9IGFueT4oYXJyOiBUW10pOiBUIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG4gICAgICAgIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHN0YXRpYyBpc1ZvaWNlRW1wdHkoY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsKSB7XG4gICAgICAgIHJldHVybiBjaGFubmVsICYmIGNoYW5uZWwubWVtYmVycy5maWx0ZXIoKG1lbWJlcikgPT4gIW1lbWJlci51c2VyLmJvdCkuc2l6ZSA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYWZlciByZXF1aXJlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIE5vZGUgcmVxdWlyZSBpZFxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgc3RhdGljIHJlcXVpcmUoaWQ6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiByZXF1aXJlKGlkKSwgZXJyb3I6IG51bGwgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1vZHVsZTogbnVsbCwgZXJyb3IgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBpbXBvcnQoaWQ6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KGlkKTtcbiAgICAgICAgICAgIHJldHVybiB7IG1vZHVsZTogbW9kLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXN5bmNocm9ub3VzIHRpbWVvdXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBUaGUgdGltZSBpbiBtcyB0byB3YWl0XG4gICAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAgICovXG4gICAgc3RhdGljIHdhaXQodGltZTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KHRpbWUsIHVuZGVmaW5lZCwgeyByZWY6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBub29wKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAgIHN0YXRpYyBhc3luYyBnZXRGZXRjaCgpIHtcbiAgICAgICAgaWYgKCdmZXRjaCcgaW4gZ2xvYmFsVGhpcykgcmV0dXJuIGdsb2JhbFRoaXMuZmV0Y2g7XG4gICAgICAgIGZvciAoY29uc3QgbGliIG9mIFsnbm9kZS1mZXRjaCcsICd1bmRpY2knXSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgaW1wb3J0KGxpYikudGhlbigocmVzKSA9PiByZXMuZmV0Y2ggfHwgcmVzLmRlZmF1bHQ/LmZldGNoIHx8IHJlcy5kZWZhdWx0KTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSByZXF1aXJlKGxpYik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXMpIHJldHVybiByZXMuZmV0Y2ggfHwgcmVzLmRlZmF1bHQ/LmZldGNoIHx8IHJlcy5kZWZhdWx0O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAvLyBubz9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIGNvZGUgPSAnRGVwcmVjYXRpb25XYXJuaW5nJywgZGV0YWlsPzogc3RyaW5nKSB7XG4gICAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobWVzc2FnZSwge1xuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIGRldGFpbFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmFuZG9tQ2hvaWNlPFQ+KHNyYzogVFtdKTogVCB7XG4gICAgICAgIHJldHVybiBzcmNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogc3JjLmxlbmd0aCldO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZBTElEQVRFX1FVRVVFX0NBUCA9IChxdWV1ZTogR3VpbGRRdWV1ZSwgaXRlbXM6IFBsYXlsaXN0IHwgVHJhY2sgfCBUcmFja1tdKSA9PiB7XG4gICAgY29uc3QgdHJhY2tzID0gaXRlbXMgaW5zdGFuY2VvZiBQbGF5bGlzdCA/IGl0ZW1zLnRyYWNrcyA6IEFycmF5LmlzQXJyYXkoaXRlbXMpID8gaXRlbXMgOiBbaXRlbXNdO1xuXG4gICAgaWYgKHF1ZXVlLm1heFNpemUgPCAxIHx8IHF1ZXVlLm1heFNpemUgPT09IEluZmluaXR5KSByZXR1cm47XG5cbiAgICBjb25zdCBtYXhDYXAgPSBxdWV1ZS5nZXRDYXBhY2l0eSgpO1xuXG4gICAgaWYgKG1heENhcCA8IHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfT1VUX09GX1NQQUNFKCd0cmFja3MgcXVldWUnLCBtYXhDYXAsIHRyYWNrcy5sZW5ndGgpO1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IFV0aWwgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgUGxheWxpc3RJbml0RGF0YSwgUGxheWxpc3RKU09OLCBUcmFja0pTT04sIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBQbGF5bGlzdCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuICAgIHB1YmxpYyB0cmFja3M6IFRyYWNrW107XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIHB1YmxpYyB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgICBwdWJsaWMgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgICBwdWJsaWMgYXV0aG9yOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfTtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyXG4gICAgICogQHBhcmFtIHtQbGF5bGlzdEluaXREYXRhfSBkYXRhIFRoZSBkYXRhXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5ZXJcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjcGxheWVyXG4gICAgICAgICAqIEB0eXBlIHtQbGF5ZXJ9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0cmFja3MgaW4gdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0cmFja3NcbiAgICAgICAgICogQHR5cGUge1RyYWNrW119XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYWNrcyA9IGRhdGEudHJhY2tzID8/IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXV0aG9yIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjYXV0aG9yXG4gICAgICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjZGVzY3JpcHRpb25cbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdGh1bWJuYWlsIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdGh1bWJuYWlsXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgdHlwZTpcbiAgICAgICAgICogLSBgYWxidW1gXG4gICAgICAgICAqIC0gYHBsYXlsaXN0YFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0eXBlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBzb3VyY2Ugb2YgdGhpcyBwbGF5bGlzdDpcbiAgICAgICAgICogLSBgeW91dHViZWBcbiAgICAgICAgICogLSBgc291bmRjbG91ZGBcbiAgICAgICAgICogLSBgc3BvdGlmeWBcbiAgICAgICAgICogLSBgYXJiaXRyYXJ5YFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNzb3VyY2VcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNpZFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdXJsXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNyYXdQbGF5bGlzdFxuICAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgfVxuXG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCogdGhpcy50cmFja3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MucmVkdWNlKChwLCBjKSA9PiBwICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXR0ZWQgZXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgICAgICByZXR1cm4gVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0aGlzLmVzdGltYXRlZER1cmF0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aFRyYWNrcz10cnVlXSBJZiBpdCBzaG91bGQgYnVpbGQganNvbiB3aXRoIHRyYWNrc1xuICAgICAqIEByZXR1cm5zIHtQbGF5bGlzdEpTT059XG4gICAgICovXG4gICAgdG9KU09OKHdpdGhUcmFja3MgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgICAgICAgdHJhY2tzOiBbXSBhcyBUcmFja0pTT05bXVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh3aXRoVHJhY2tzKSBwYXlsb2FkLnRyYWNrcyA9IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpO1xuXG4gICAgICAgIHJldHVybiBwYXlsb2FkIGFzIFBsYXlsaXN0SlNPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoaXMgcGxheWxpc3QgdG8gdGhlIGdpdmVuIHZvaWNlIGNoYW5uZWwuIElmIHF1ZXVlIGV4aXN0cyBhbmQgYW5vdGhlciB0cmFjayBpcyBiZWluZyBwbGF5ZWQsIHRoaXMgcGxheWxpc3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUuXG4gICAgICogQHBhcmFtIGNoYW5uZWwgVm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGlzIHBsYXlsaXN0IHNoYWxsIGJlIHBsYXllZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIE5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+KTogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICAgICAgY29uc3QgZm4gPSB0aGlzLnBsYXllci5wbGF5LmJpbmQodGhpcy5wbGF5ZXIpO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBmbihjaGFubmVsLCB0aGlzLCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgVXNlciwgZXNjYXBlTWFya2Rvd24sIFNub3dmbGFrZVV0aWwsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUmF3VHJhY2tEYXRhLCBTZWFyY2hRdWVyeVR5cGUsIFRyYWNrSlNPTiB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vbWFuYWdlci9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCB0eXBlIFRyYWNrUmVzb2x2YWJsZSA9IFRyYWNrIHwgc3RyaW5nIHwgbnVtYmVyO1xuXG5leHBvcnQgdHlwZSBXaXRoTWV0YWRhdGE8VCBleHRlbmRzIG9iamVjdCwgTT4gPSBUICYge1xuICAgIG1ldGFkYXRhOiBNO1xuICAgIHJlcXVlc3RNZXRhZGF0YSgpOiBQcm9taXNlPE0+O1xufTtcblxuZXhwb3J0IGNsYXNzIFRyYWNrPFQgPSB1bmtub3duPiB7XG4gICAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIGF1dGhvcjogc3RyaW5nO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgcHVibGljIGR1cmF0aW9uOiBzdHJpbmc7XG4gICAgcHVibGljIHZpZXdzOiBudW1iZXI7XG4gICAgcHVibGljIHJlcXVlc3RlZEJ5OiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gICAgcHVibGljIHF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGw7XG4gICAgcHVibGljIHJhdzogUmF3VHJhY2tEYXRhID0ge1xuICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknXG4gICAgfSBhcyBSYXdUcmFja0RhdGE7XG4gICAgcHVibGljIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHByaXZhdGUgX19tZXRhZGF0YTogVCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX19yZXFNZXRhZGF0YUZuOiAoKSA9PiBQcm9taXNlPFQgfCBudWxsPjtcblxuICAgIC8qKlxuICAgICAqIFRyYWNrIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgVHJhY2tcbiAgICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllciwgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pIHtcbiAgICAgICAgdGhpcy50aXRsZSA9IGVzY2FwZU1hcmtkb3duKGRhdGEudGl0bGUgPz8gJycpO1xuICAgICAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yID8/ICcnO1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgICAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsID8/ICcnO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbiA/PyAnJztcbiAgICAgICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICAgICAgdGhpcy5xdWVyeVR5cGUgPSBkYXRhLnF1ZXJ5VHlwZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ZWRCeSA9IGRhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gICAgICAgIHRoaXMucmF3ID0gT2JqZWN0LmFzc2lnbih7fSwgeyBzb3VyY2U6IGRhdGEucmF3Py5zb3VyY2UgPz8gZGF0YS5zb3VyY2UgfSwgZGF0YS5yYXcgPz8gZGF0YSk7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGEgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPSBkYXRhLnJlcXVlc3RNZXRhZGF0YSB8fCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlPFQgfCBudWxsPihudWxsKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0TWV0YWRhdGEoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICAgICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YSAhPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZSBpbiB3aGljaCB0aGlzIHRyYWNrIGlzIGxvY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT4gcS50cmFja3Muc29tZSgoYWIpID0+IGFiLmlkID09PSB0aGlzLmlkKSkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25NUygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IHRuID0gMTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZHVyYXRpb25cbiAgICAgICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAubWFwKChtLCBpKSA9PiBwYXJzZUludChtKSAqIHRpbWVzKDYwLCBpKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb3JkIGh5cGVybGluayByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHRvSHlwZXJsaW5rKCk6IHN0cmluZyAvKiBub3QgdXNpbmcgYFske3N0cmluZ31dKCR7c3RyaW5nfSlgIHlldCAqLyB7XG4gICAgICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJhdyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKGhpZGVQbGF5bGlzdD86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgICAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgICAgICB9IGFzIFRyYWNrSlNPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmVsb25naW5nIHF1ZXVlcyBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldEJlbG9uZ2luZ1F1ZXVlcygpIHtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5maWx0ZXIoKG5vZGUpID0+IG5vZGUudHJhY2tzLnNvbWUoKHQpID0+IHQuaWQgPT09IHRoaXMuaWQpKTtcblxuICAgICAgICByZXR1cm4gbm9kZXMgYXMgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU8dW5rbm93bj4+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhpcyB0cmFjayB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyB0cmFjayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgdHJhY2sgc2hhbGwgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTbm93Zmxha2UsIFVzZXIsIFVzZXJSZXNvbHZhYmxlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBkb3dubG9hZE9wdGlvbnMgfSBmcm9tICd5dGRsLWNvcmUnO1xuaW1wb3J0IHsgUXVlcnlDYWNoZVByb3ZpZGVyIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlDYWNoZSc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB0eXBlIHsgQnJpZGdlUHJvdmlkZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcblxuZXhwb3J0IHR5cGUgRmlsdGVyc05hbWUgPSBrZXlvZiBRdWV1ZUZpbHRlcnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU2VhcmNoUmVzdWx0IHtcbiAgICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICAgIHRyYWNrczogVHJhY2tbXTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7QXVkaW9GaWx0ZXJzfSBRdWV1ZUZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICAgIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICAgIGJhc3Nib29zdD86IGJvb2xlYW47XG4gICAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAgICc4RCc/OiBib29sZWFuO1xuICAgIHZhcG9yd2F2ZT86IGJvb2xlYW47XG4gICAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgICBwaGFzZXI/OiBib29sZWFuO1xuICAgIHRyZW1vbG8/OiBib29sZWFuO1xuICAgIHZpYnJhdG8/OiBib29sZWFuO1xuICAgIHJldmVyc2U/OiBib29sZWFuO1xuICAgIHRyZWJsZT86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICAgIHN1cnJvdW5kaW5nPzogYm9vbGVhbjtcbiAgICBwdWxzYXRvcj86IGJvb2xlYW47XG4gICAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICAgIGthcmFva2U/OiBib29sZWFuO1xuICAgIGZsYW5nZXI/OiBib29sZWFuO1xuICAgIGdhdGU/OiBib29sZWFuO1xuICAgIGhhYXM/OiBib29sZWFuO1xuICAgIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgICBtb25vPzogYm9vbGVhbjtcbiAgICBtc3Rscj86IGJvb2xlYW47XG4gICAgbXN0cnI/OiBib29sZWFuO1xuICAgIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICAgIGV4cGFuZGVyPzogYm9vbGVhbjtcbiAgICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gICAgY2hvcnVzPzogYm9vbGVhbjtcbiAgICBjaG9ydXMyZD86IGJvb2xlYW47XG4gICAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICAgIGZhZGVpbj86IGJvb2xlYW47XG4gICAgZGltPzogYm9vbGVhbjtcbiAgICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgICBsb2ZpPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IFRyYWNrU291cmNlXG4gKi9cbmV4cG9ydCB0eXBlIFRyYWNrU291cmNlID0gJ3NvdW5kY2xvdWQnIHwgJ3lvdXR1YmUnIHwgJ3Nwb3RpZnknIHwgJ2FwcGxlX211c2ljJyB8ICdhcmJpdHJhcnknO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhd1RyYWNrRGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIFRoZSB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF1dGhvciBUaGUgYXV0aG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGR1cmF0aW9uIFRoZSBkdXJhdGlvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZpZXdzIFRoZSB2aWV3c1xuICogQHByb3BlcnR5IHtVc2VyfSByZXF1ZXN0ZWRCeSBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAqIEBwcm9wZXJ0eSB7UGxheWxpc3R9IFtwbGF5bGlzdF0gVGhlIHBsYXlsaXN0XG4gKiBAcHJvcGVydHkge1RyYWNrU291cmNlfSBbc291cmNlPVwiYXJiaXRyYXJ5XCJdIFRoZSBzb3VyY2VcbiAqIEBwcm9wZXJ0eSB7YW55fSBbZW5naW5lXSBUaGUgZW5naW5lXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsaXZlXSBJZiB0aGlzIHRyYWNrIGlzIGxpdmVcbiAqIEBwcm9wZXJ0eSB7YW55fSBbcmF3XSBUaGUgcmF3IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFja0RhdGEge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBhdXRob3I6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICBkdXJhdGlvbjogc3RyaW5nO1xuICAgIHZpZXdzOiBudW1iZXI7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAgIHNvdXJjZT86IFRyYWNrU291cmNlO1xuICAgIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbGl2ZT86IGJvb2xlYW47XG4gICAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGU7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGltZURhdGFcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXlzIFRpbWUgaW4gZGF5c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGhvdXJzIFRpbWUgaW4gaG91cnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtaW51dGVzIFRpbWUgaW4gbWludXRlc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHNlY29uZHMgVGltZSBpbiBzZWNvbmRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZURhdGEge1xuICAgIGRheXM6IG51bWJlcjtcbiAgICBob3VyczogbnVtYmVyO1xuICAgIG1pbnV0ZXM6IG51bWJlcjtcbiAgICBzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0aW1lY29kZXNdIElmIGl0IHNob3VsZCByZW5kZXIgdGltZSBjb2Rlc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcXVldWVdIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbGVuZ3RoXSBUaGUgYmFyIGxlbmd0aFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtsZWZ0Q2hhcl0gVGhlIGVsYXBzZWQgdGltZSB0cmFja1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyaWdodENoYXJdIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZXBhcmF0b3JdIFRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGltZXN0YW1wIGFuZCBsaW5lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2luZGljYXRvcl0gVGhlIGluZGljYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclByb2dyZXNzYmFyT3B0aW9ucyB7XG4gICAgdGltZWNvZGVzPzogYm9vbGVhbjtcbiAgICBsZW5ndGg/OiBudW1iZXI7XG4gICAgbGVmdENoYXI/OiBzdHJpbmc7XG4gICAgcmlnaHRDaGFyPzogc3RyaW5nO1xuICAgIHNlcGFyYXRvcj86IHN0cmluZztcbiAgICBpbmRpY2F0b3I/OiBzdHJpbmc7XG4gICAgcXVldWU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICogVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBBVVRPXG4gKiAtIFlPVVRVQkVcbiAqIC0gWU9VVFVCRV9QTEFZTElTVFxuICogLSBTT1VORENMT1VEX1RSQUNLXG4gKiAtIFNPVU5EQ0xPVURfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRFxuICogLSBTUE9USUZZX1NPTkdcbiAqIC0gU1BPVElGWV9BTEJVTVxuICogLSBTUE9USUZZX1BMQVlMSVNUXG4gKiAtIFNQT1RJRllfU0VBUkNIXG4gKiAtIEZBQ0VCT09LXG4gKiAtIFZJTUVPXG4gKiAtIEFSQklUUkFSWVxuICogLSBSRVZFUkJOQVRJT05cbiAqIC0gWU9VVFVCRV9TRUFSQ0hcbiAqIC0gWU9VVFVCRV9WSURFT1xuICogLSBTT1VORENMT1VEX1NFQVJDSFxuICogLSBBUFBMRV9NVVNJQ19TT05HXG4gKiAtIEFQUExFX01VU0lDX0FMQlVNXG4gKiAtIEFQUExFX01VU0lDX1BMQVlMSVNUXG4gKiAtIEFQUExFX01VU0lDX1NFQVJDSFxuICogLSBGSUxFXG4gKiAtIEFVVE9fU0VBUkNIXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgICBBVVRPOiAnYXV0bycsXG4gICAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICAgIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICAgIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gICAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gICAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gICAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgICBWSU1FTzogJ3ZpbWVvJyxcbiAgICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICAgIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gICAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICAgIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gICAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICAgIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgICBGSUxFOiAnZmlsZScsXG4gICAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJFdmVudHMge1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWUsIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gYW55O1xufVxuXG5leHBvcnQgZW51bSBQbGF5ZXJFdmVudCB7XG4gICAgZGVidWcgPSAnZGVidWcnLFxuICAgIGVycm9yID0gJ2Vycm9yJyxcbiAgICB2b2ljZVN0YXRlVXBkYXRlID0gJ3ZvaWNlU3RhdGVVcGRhdGUnXG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBsYXlPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmaWx0ZXJzVXBkYXRlPWZhbHNlXSBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtlbmNvZGVyQXJncz1bXV0gRkZtcGVnIGFyZ3MgcGFzc2VkIHRvIGVuY29kZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2Vla10gVGltZSB0byBzZWVrIHRvIGJlZm9yZSBwbGF5aW5nXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpbW1lZGlhdGU9ZmFsc2VdIElmIGl0IHNob3VsZCBzdGFydCBwbGF5aW5nIHRoZSBwcm92aWRlZCB0cmFjayBpbW1lZGlhdGVseVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgICBmaWx0ZXJzVXBkYXRlPzogYm9vbGVhbjtcbiAgICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICAgIHNlZWs/OiBudW1iZXI7XG4gICAgaW1tZWRpYXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlFeHRyYWN0b3JTZWFyY2ggPSBgZXh0OiR7c3RyaW5nfWA7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhcmNoT3B0aW9uc1xuICogQHByb3BlcnR5IHtVc2VyUmVzb2x2YWJsZX0gcmVxdWVzdGVkQnkgVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHNlYXJjaFxuICogQHByb3BlcnR5IHt0eXBlb2YgUXVlcnlUeXBlfHN0cmluZ30gW3NlYXJjaEVuZ2luZT0nYXV0byddIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Jsb2NrRXh0cmFjdG9yc1tdXSBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVDYWNoZV0gSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAqIEBwcm9wZXJ0eSB7U2VhcmNoUXVlcnlUeXBlfSBbZmFsbGJhY2tTZWFyY2hFbmdpbmU9J2F1dG9TZWFyY2gnXSBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlclJlc29sdmFibGU7XG4gICAgc2VhcmNoRW5naW5lPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2g7XG4gICAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gICAgaWdub3JlQ2FjaGU/OiBib29sZWFuO1xuICAgIGZhbGxiYWNrU2VhcmNoRW5naW5lPzogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xufVxuXG4vKipcbiAqIFRoZSBxdWV1ZSByZXBlYXQgbW9kZS4gVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBPRkZcbiAqIC0gVFJBQ0tcbiAqIC0gUVVFVUVcbiAqIC0gQVVUT1BMQVlcbiAqIEB0eXBlZGVmIHtudW1iZXJ9IFF1ZXVlUmVwZWF0TW9kZVxuICovXG5leHBvcnQgZW51bSBRdWV1ZVJlcGVhdE1vZGUge1xuICAgIE9GRiA9IDAsXG4gICAgVFJBQ0sgPSAxLFxuICAgIFFVRVVFID0gMixcbiAgICBBVVRPUExBWSA9IDNcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQbGF5bGlzdEluaXREYXRhXG4gKiBAcHJvcGVydHkge1RyYWNrW119IHRyYWNrcyBUaGUgdHJhY2tzIG9mIHRoaXMgcGxheWxpc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZSBUaGUgcGxheWxpc3QgdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHthbGJ1bXxwbGF5bGlzdH0gdHlwZSBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAqIEBwcm9wZXJ0eSB7VHJhY2tTb3VyY2V9IHNvdXJjZSBUaGUgcGxheWxpc3Qgc291cmNlXG4gKiBAcHJvcGVydHkge29iamVjdH0gYXV0aG9yIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXV0aG9yLm5hbWVdIFRoZSBhdXRob3IgbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthdXRob3IudXJsXSBUaGUgYXV0aG9yIHVybFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBwbGF5bGlzdCBpZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCBUaGUgcGxheWxpc3QgdXJsXG4gKiBAcHJvcGVydHkge2FueX0gW3Jhd1BsYXlsaXN0XSBUaGUgcmF3IHBsYXlsaXN0IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEluaXREYXRhIHtcbiAgICB0cmFja3M6IFRyYWNrW107XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gICAgYXV0aG9yOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfTtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUcmFja0pTT05cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZSBUaGUgdHJhY2sgdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBUaGUgdHJhY2sgZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdXRob3IgVGhlIGF1dGhvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCBUaGUgdXJsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGh1bWJuYWlsIFRoZSB0aHVtYm5haWxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkdXJhdGlvbiBUaGUgZHVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkdXJhdGlvbk1TIFRoZSBkdXJhdGlvbiBpbiBtc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHZpZXdzIFRoZSB2aWV3cyBjb3VudFxuICogQHByb3BlcnR5IHtTbm93Zmxha2V9IHJlcXVlc3RlZEJ5IFRoZSBpZCBvZiB0aGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAqIEBwcm9wZXJ0eSB7UGxheWxpc3RKU09OfSBbcGxheWxpc3RdIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2tKU09OIHtcbiAgICBpZDogU25vd2ZsYWtlO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBhdXRob3I6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICBkdXJhdGlvbjogc3RyaW5nO1xuICAgIGR1cmF0aW9uTVM6IG51bWJlcjtcbiAgICB2aWV3czogbnVtYmVyO1xuICAgIHJlcXVlc3RlZEJ5OiBTbm93Zmxha2U7XG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheWxpc3RKU09OXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgVGhlIHBsYXlsaXN0IGlkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSBwbGF5bGlzdCB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZSBUaGUgcGxheWxpc3QgdGl0bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBUaGUgcGxheWxpc3QgZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHthbGJ1bXxwbGF5bGlzdH0gdHlwZSBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAqIEBwcm9wZXJ0eSB7VHJhY2tTb3VyY2V9IHNvdXJjZSBUaGUgdHJhY2sgc291cmNlXG4gKiBAcHJvcGVydHkge29iamVjdH0gYXV0aG9yIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXV0aG9yLm5hbWVdIFRoZSBhdXRob3IgbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthdXRob3IudXJsXSBUaGUgYXV0aG9yIHVybFxuICogQHByb3BlcnR5IHtUcmFja0pTT05bXX0gdHJhY2tzIFRoZSB0cmFja3MgZGF0YSAoaWYgYW55KVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SlNPTiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gICAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgICBhdXRob3I6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIHRyYWNrczogVHJhY2tKU09OW107XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheWVySW5pdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7WVRETERvd25sb2FkT3B0aW9uc30gW3l0ZGxPcHRpb25zXSBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gYHl0ZGwtY29yZWBcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY29ubmVjdGlvblRpbWVvdXQ9MjAwMDBdIFRoZSB2b2ljZSBjb25uZWN0aW9uIHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xhZ01vbml0b3I9MzAwMDBdIFRpbWUgaW4gbXMgdG8gcmUtbW9uaXRvciBldmVudCBsb29wIGxhZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9ja1ZvaWNlU3RhdGVIYW5kbGVyXSBQcmV2ZW50IHZvaWNlIHN0YXRlIGhhbmRsZXIgZnJvbSBiZWluZyBvdmVycmlkZGVuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYmxvY2tFeHRyYWN0b3JzXSBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBxdWVyeWluZyBtZXRhZGF0YSBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYmxvY2tTdHJlYW1Gcm9tXSBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBzdHJlYW1pbmcgZnJvbVxuICogQHByb3BlcnR5IHtRdWVyeUNhY2hlIHwgbnVsbH0gW3F1ZXJ5Q2FjaGVdIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVJbnN0YW5jZV0gSWdub3JlIHBsYXllciBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlTGVnYWN5RkZtcGVnXSBVc2UgbGVnYWN5IHZlcnNpb24gb2YgZmZtcGVnXG4gKiBAcHJvcGVydHkge0JyaWRnZVByb3ZpZGVyfSBbYnJpZGdlUHJvdmlkZXJdIFNldCBicmlkZ2UgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gICAgeXRkbE9wdGlvbnM/OiBkb3dubG9hZE9wdGlvbnM7XG4gICAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gICAgbGFnTW9uaXRvcj86IG51bWJlcjtcbiAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAgIGJsb2NrRXh0cmFjdG9ycz86IHN0cmluZ1tdO1xuICAgIGJsb2NrU3RyZWFtRnJvbT86IHN0cmluZ1tdO1xuICAgIHF1ZXJ5Q2FjaGU/OiBRdWVyeUNhY2hlUHJvdmlkZXI8YW55PiB8IG51bGw7XG4gICAgaWdub3JlSW5zdGFuY2U/OiBib29sZWFuO1xuICAgIHVzZUxlZ2FjeUZGbXBlZz86IGJvb2xlYW47XG4gICAgYnJpZGdlUHJvdmlkZXI/OiBCcmlkZ2VQcm92aWRlcjtcbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBRdWVyeUV4dHJhY3RvclNlYXJjaCwgUXVlcnlUeXBlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHREYXRhIHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgICBleHRyYWN0b3I/OiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M/OiBUcmFja1tdO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHByaXZhdGUgX2RhdGE6IFNlYXJjaFJlc3VsdERhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFF1ZXJ5VHlwZSh0eXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCkge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZXF1ZXN0ZWRCeSh1c2VyOiBVc2VyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IHJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWNrcyByZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRyYWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RlZCBieVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmUtZXhlY3V0ZSB0aGlzIHNlYXJjaFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgICAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9GaWx0ZXJzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgICAgIGJhc3Nib29zdF9sb3c6IGJhc3MoMTUpLFxuICAgICAgICBiYXNzYm9vc3Q6IGJhc3MoMjApLFxuICAgICAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgICAgICc4RCc6ICdhcHVsc2F0b3I9aHo9MC4wOScsXG4gICAgICAgIHZhcG9yd2F2ZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjgnLFxuICAgICAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgICAgIGxvZmk6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC45LGV4dHJhc3RlcmVvPW09Mi41OmM9ZGlzYWJsZWQnLFxuICAgICAgICBwaGFzZXI6ICdhcGhhc2VyPWluX2dhaW49MC40JyxcbiAgICAgICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgICAgICB2aWJyYXRvOiAndmlicmF0bz1mPTYuNScsXG4gICAgICAgIHJldmVyc2U6ICdhcmV2ZXJzZScsXG4gICAgICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgICAgICBub3JtYWxpemVyMjogJ2R5bmF1ZG5vcm09Zz0xMDEnLFxuICAgICAgICBub3JtYWxpemVyOiAnYWNvbXByZXNzb3InLFxuICAgICAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICAgICAgcHVsc2F0b3I6ICdhcHVsc2F0b3I9aHo9MScsXG4gICAgICAgIHN1YmJvb3N0OiAnYXN1YmJvb3N0JyxcbiAgICAgICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgICAgIGZsYW5nZXI6ICdmbGFuZ2VyJyxcbiAgICAgICAgZ2F0ZTogJ2FnYXRlJyxcbiAgICAgICAgaGFhczogJ2hhYXMnLFxuICAgICAgICBtY29tcGFuZDogJ21jb21wYW5kJyxcbiAgICAgICAgbW9ubzogJ3Bhbj1tb25vfGMwPS41KmMwKy41KmMxJyxcbiAgICAgICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICAgICAgbXN0cnI6ICdzdGVyZW90b29scz1tb2RlPW1zPnJyJyxcbiAgICAgICAgY29tcHJlc3NvcjogJ2NvbXBhbmQ9cG9pbnRzPS04MC8tMTA1fC02Mi8tODB8LTE1LjQvLTE1LjR8MC8tMTJ8MjAvLTcuNicsXG4gICAgICAgIGV4cGFuZGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tMTY5fC01NC8tODB8LTQ5LjUvLTY0LjZ8LTQxLjEvLTQxLjF8LTI1LjgvLTE1fC0xMC44Ly00LjV8MC8wfDIwLzguMycsXG4gICAgICAgIHNvZnRsaW1pdGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgICAgICBjaG9ydXM6ICdjaG9ydXM9MC43OjAuOTo1NTowLjQ6MC4yNToyJyxcbiAgICAgICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgICAgICBmYWRlaW46ICdhZmFkZT10PWluOnNzPTA6ZD0xMCcsXG4gICAgICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgICAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnXG4gICAgfTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXM8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihuYW1lOiBLKSB7XG4gICAgICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHsgbmFtZTogRmlsdGVyc05hbWU7IHZhbHVlOiBzdHJpbmcgfT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpbHRlcnMpKSB7XG4gICAgICAgICAgICB5aWVsZCB7IG5hbWU6IGsgYXMgRmlsdGVyc05hbWUsIHZhbHVlOiB2IGFzIHN0cmluZyB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgbmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpIGFzIEZpbHRlcnNOYW1lW107XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBBdWRpb0ZpbHRlcnMubGVuZ3RoXG4gICAgcHVibGljIHN0YXRpYyBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXMubWFwKChtKSA9PiAodGhpcyBhcyBhbnkpW21dKS5qb2luKCcsJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBmZm1wZWcgYXJncyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsdGVycyBuYW1lXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIG5hbWVcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4oZmlsdGVycz86IEtbXSkge1xuICAgICAgICBpZiAoIWZpbHRlcnMgfHwgIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzXG4gICAgICAgICAgICAuZmlsdGVyKChwcmVkaWNhdGUpID0+IHR5cGVvZiBwcmVkaWNhdGUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgLm1hcCgobSkgPT4gdGhpcy5nZXQobSkpXG4gICAgICAgICAgICAuam9pbignLCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYXVkaW8gZmlsdGVyXG4gICAgICogQHBhcmFtIGZpbHRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbHRlclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgZmZtcGVnIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZShmaWx0ZXJOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJzW2ZpbHRlck5hbWUgYXMgRmlsdGVyc05hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBtdWx0aXBsZSBhdWRpbyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnNBcnJheSBBcnJheSBvZiBmaWx0ZXJzIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBuYW1lIGFuZCBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lQnVsayhmaWx0ZXJzQXJyYXk6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSkge1xuICAgICAgICBmaWx0ZXJzQXJyYXkuZm9yRWFjaCgoYXJyKSA9PiB0aGlzLmRlZmluZShhcnIubmFtZSwgYXJyLnZhbHVlKSk7XG4gICAgfVxufVxuIiwgImNvbnN0IERpc2NvcmRQbGF5ZXJFcnJvcnMgPSB7XG4gICAgRVJSX09VVF9PRl9TUEFDRToge1xuICAgICAgICBuYW1lOiAnRVJSX09VVF9PRl9TUEFDRScsXG4gICAgICAgIHR5cGU6IFJhbmdlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBjYXBhY2l0eTogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gYE1heCBjYXBhY2l0eSByZWFjaGVkIGZvciAke3RhcmdldH0gKENhcGFjaXR5ICR7Y2FwYWNpdHl9L1RvdGFsICR7dG90YWx9KWA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9JTlZBTElEX0FSR19UWVBFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfSU5WQUxJRF9BUkdfVFlQRScsXG4gICAgICAgIHR5cGU6IFR5cGVFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGV4cGVjdGF0aW9uOiBzdHJpbmcsIGZvdW5kOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgRXhwZWN0ZWQgJHt0YXJnZXR9IHRvIGJlIFwiJHtleHBlY3RhdGlvbn1cIiwgcmVjZWl2ZWQgXCIke2ZvdW5kfVwiYDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX1JFU1VMVDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX1JFU1VMVCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9UX0lNUExFTUVOVEVEOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9UX0lNUExFTUVOVEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGFyZ2V0fSBpcyBub3QgeWV0IGltcGxlbWVudGVkYDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PVF9FWElTVElORzoge1xuICAgICAgICBuYW1lOiAnRVJSX05PVF9FWElTVElORycsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RhcmdldH0gZG9lcyBub3QgZXhpc3RgO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfT1VUX09GX1JBTkdFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfT1VUX09GX1JBTkdFJyxcbiAgICAgICAgdHlwZTogUmFuZ2VFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG1pbmltdW06IHN0cmluZywgbWF4aW11bTogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGFyZ2V0fSBpcyBvdXQgb2YgcmFuZ2UgKEV4cGVjdGVkIG1pbmltdW0gJHttYXhpbXVtfSBhbmQgbWF4aW11bSAke21heGltdW19LCBnb3QgJHt2YWx1ZX0pYDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT046IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19WT0lDRV9DT05ORUNUSU9OJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlIHx8ICdObyB2b2ljZSBjb25uZWN0aW9uIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/JztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0Nhbm5vdCB1c2UgZGVzdHJveWVkIHZvaWNlIGNvbm5lY3Rpb24nO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fVk9JQ0VfQ0hBTk5FTDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX1ZPSUNFX0NIQU5ORUwnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IoKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuICdFeHBlY3RlZCBhIHZvaWNlIGNoYW5uZWwnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fUkVDRUlWRVI6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19SRUNFSVZFUicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZSB8fCAnTm8gdm9pY2UgcmVjZWl2ZXIgaXMgYXZhaWxhYmxlLCBtYXliZSBjb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbCBmaXJzdD8nO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfRkZNUEVHX0xPQ0FUT1I6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9GRk1QRUdfTE9DQVRPUicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fQVVESU9fUkVTT1VSQ0U6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19BVURJT19SRVNPVVJDRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYW4gYXVkaW8gcmVzb3VyY2UnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTERfUVVFVUU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRF9RVUVVRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCBxdWV1ZSc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19HVUlMRDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX0dVSUxEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0lORk9fUkVRVUlSRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTkZPX1JFUVVJUkVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBhY3R1YWw6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBFeHBlY3RlZCAke3RhcmdldH0sIGZvdW5kIFwiJHthY3R1YWx9XCJgO1xuICAgICAgICB9XG4gICAgfVxufSBhcyBjb25zdDtcblxudHlwZSBGaW5hbEV4Y2VwdGlvbjxPIGV4dGVuZHMgKHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc10+ID0ge1xuICAgIG5hbWU6IE9bJ25hbWUnXTtcbn0gJiBJbnN0YW5jZVR5cGU8T1sndHlwZSddPjtcblxudHlwZSBEaXNjb3JkUGxheWVyRXhjZXB0aW9uID0ge1xuICAgIFtLIGluIGtleW9mIHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzXTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8KHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtLXVsnY3JlYXRlRXJyb3InXT4pID0+IEZpbmFsRXhjZXB0aW9uPCh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS10+O1xufTtcblxuY29uc3QgdGFyZ2V0ID0ge30gYXMgRGlzY29yZFBsYXllckV4Y2VwdGlvbjtcblxuY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPHR5cGVvZiB0YXJnZXQ+ID0ge1xuICAgIGdldCh0YXJnZXQsIHA6IGtleW9mIHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzLCByZWNlaXZlcikge1xuICAgICAgICBjb25zdCBlcnIgPSBEaXNjb3JkUGxheWVyRXJyb3JzW3BdO1xuXG4gICAgICAgIGlmICghZXJyKSByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG5cbiAgICAgICAgcmV0dXJuICguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgZXJyKVsnY3JlYXRlRXJyb3InXT4pID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IG5ldyBlcnIudHlwZShlcnIuY3JlYXRlRXJyb3IoLi4uYXJncykpO1xuICAgICAgICAgICAgZXhjZXB0aW9uLm5hbWUgPSBlcnIubmFtZTtcblxuICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjtcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgRXJyb3JDb2RlcyA9ICgoKSA9PiB7XG4gICAgdHlwZSBFcnJDb2RlcyA9IHtcbiAgICAgICAgLXJlYWRvbmx5IFtLIGluIGtleW9mIHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzXTogKHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtLXVsnbmFtZSddO1xuICAgIH07XG5cbiAgICBjb25zdCBkaWN0ID0ge30gYXMgRXJyQ29kZXM7XG5cbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gRGlzY29yZFBsYXllckVycm9ycykge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGRpY3RbcHJvcF0gPSBwcm9wO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGRpY3QpO1xufSkoKTtcbmV4cG9ydCBjb25zdCBFeGNlcHRpb25zID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7XG4iLCAiaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICdodHRwJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgY2xhc3MgQmFzZUV4dHJhY3RvcjxUIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PiB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBmb3IgdGhpcyBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlkZW50aWZpZXIgPSAnY29tLmRpc2NvcmQtcGxheWVyLmV4dHJhY3Rvcic7XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgYnJpZGdlIHF1ZXJ5IGNyZWF0aW9uXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlQnJpZGdlUXVlcnkgPSAodHJhY2s6IFRyYWNrKSA9PiBgJHt0cmFjay50aXRsZX0gYnkgJHt0cmFjay5hdXRob3J9IG9mZmljaWFsIGF1ZGlvYDtcblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RvciBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgcHVibGljIG9wdGlvbnM6IFQgPSA8VD57fSkge31cblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhpcyBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlkZW50aWZpZXIoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQmFzZUV4dHJhY3RvcikuaWRlbnRpZmllcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNvbmZpZ3VyZXMgdGhpcyBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgbmV3IG9wdGlvbnMgdG8gYXBwbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVjb25maWd1cmUob3B0aW9uczogVCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBhd2FpdCB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKSB7XG4gICAgICAgIC8vIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVhY3RpdmF0ZSgpIHtcbiAgICAgICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgaW5jb21pbmcgcXVlcnlcbiAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHZhbGlkYXRlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHZhbGlkYXRlKHF1ZXJ5OiBzdHJpbmcsIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHZvaWQgdHlwZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0cmVhbSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICAgKiBAcGFyYW0gaW5mbyBUaGUgdHJhY2sgdG8gc3RyZWFtXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHN0cmVhbShpbmZvOiBUcmFjayk6IFByb21pc2U8UmVhZGFibGUgfCBzdHJpbmc+IHtcbiAgICAgICAgdm9pZCBpbmZvO1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zdHJlYW0oKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0aGUgZ2l2ZW4gcXVlcnlcbiAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIGhhbmRsZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBoYW5kbGUocXVlcnk6IHN0cmluZywgY29udGV4dDogRXh0cmFjdG9yU2VhcmNoQ29udGV4dCk6IFByb21pc2U8RXh0cmFjdG9ySW5mbz4ge1xuICAgICAgICB2b2lkIGNvbnRleHQ7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PVF9JTVBMRU1FTlRFRChgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmhhbmRsZSgpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHJlbGF0ZWQgdHJhY2tzIGZvciB0aGUgZ2l2ZW4gdHJhY2tcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHNvdXJjZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBnZXRSZWxhdGVkVHJhY2tzKHRyYWNrOiBUcmFjayk6IFByb21pc2U8RXh0cmFjdG9ySW5mbz4ge1xuICAgICAgICB2b2lkIHRyYWNrO1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5nZXRSZWxhdGVkVHJhY2tzKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHN0cmVhbSBtaWRkbGV3YXJlIHRvIGhhbmRsZSBzdHJlYW1zIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbmNvbWluZyBzdHJlYW1cbiAgICAgKiBAcGFyYW0gbmV4dCBUaGUgbmV4dCBmdW5jdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVQb3N0U3RyZWFtKHN0cmVhbTogUmVhZGFibGUsIG5leHQ6IE5leHRGdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gbmV4dChudWxsLCBzdHJlYW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGFuIGV2ZW50IHRvIHRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoXG4gICAgICogQHBhcmFtIGFyZ3MgVGhlIGRhdGEgdG8gZGlzcGF0Y2hcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgUGxheWVyRXZlbnRzPihldmVudDogSywgLi4uYXJnczogUGFyYW1ldGVyczxQbGF5ZXJFdmVudHNbS10+KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBleHRyYWN0b3IgcmVzcG9uc2VcbiAgICAgKiBAcGFyYW0gcGxheWxpc3QgVGhlIHBsYXlsaXN0XG4gICAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2sgYXJyYXlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUmVzcG9uc2UocGxheWxpc3Q/OiBQbGF5bGlzdCB8IG51bGwsIHRyYWNrczogVHJhY2tbXSA9IHBsYXlsaXN0Py50cmFja3MgfHwgW10pOiBFeHRyYWN0b3JJbmZvIHtcbiAgICAgICAgcmV0dXJuIHsgcGxheWxpc3Q6IHBsYXlsaXN0IHx8IG51bGwsIHRyYWNrcyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlIGRlYnVnIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZGVidWcobWVzc2FnZSk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXh0RnVuY3Rpb24gPSAoZXJyb3I/OiBFcnJvciB8IG51bGwsIHN0cmVhbT86IFJlYWRhYmxlKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckluZm8ge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICAgIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IGtub3duRXh0cmFjdG9yS2V5cyA9IFtcbiAgICAnU3BvdGlmeUV4dHJhY3RvcicsXG4gICAgJ0FwcGxlTXVzaWNFeHRyYWN0b3InLFxuICAgICdTb3VuZENsb3VkRXh0cmFjdG9yJyxcbiAgICAnWW91VHViZUV4dHJhY3RvcicsXG4gICAgJ1ZpbWVvRXh0cmFjdG9yJyxcbiAgICAnUmV2ZXJibmF0aW9uRXh0cmFjdG9yJyxcbiAgICAnQXR0YWNobWVudEV4dHJhY3Rvcidcbl0gYXMgY29uc3Q7XG5jb25zdCBrbm93bkV4dHJhY3RvckxpYiA9ICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25FdmVudHMge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICByZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyB1bnJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyB1bnJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICB1bnJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIGFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZGVhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgZmFpbHMgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZXJyb3I6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAgIHB1YmxpYyBzdG9yZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgQmFzZUV4dHJhY3Rvcj4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7XG4gICAgICAgIHN1cGVyKFsnZXJyb3InXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBkZWZhdWx0IGV4dHJhY3RvcnMgZnJvbSBgQGRpc2NvcmQtcGxheWVyL2V4dHJhY3RvcmBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbG9hZERlZmF1bHQoZmlsdGVyPzogKGV4dDogKHR5cGVvZiBrbm93bkV4dHJhY3RvcktleXMpW251bWJlcl0pID0+IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgVXRpbC5pbXBvcnQoa25vd25FeHRyYWN0b3JMaWIpO1xuICAgICAgICBpZiAobW9kLmVycm9yKSByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1vZC5lcnJvciBhcyBFcnJvciB9O1xuXG4gICAgICAgIChmaWx0ZXIgPyBrbm93bkV4dHJhY3RvcktleXMuZmlsdGVyKGZpbHRlcikgOiBrbm93bkV4dHJhY3RvcktleXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFtb2QubW9kdWxlW2tleV0pIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoPHR5cGVvZiBCYXNlRXh0cmFjdG9yPm1vZC5tb2R1bGVba2V5XSwge30pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGlmIHRoZSBnaXZlbiBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlZ2lzdGVyZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byByZWdpc3RlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcjxPIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgdHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4+KF9leHRyYWN0b3I6IFQsIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKTogUHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPiB7XG4gICAgICAgIGlmICh0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fCB0aGlzLnN0b3JlLmhhcyhfZXh0cmFjdG9yLmlkZW50aWZpZXIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IF9leHRyYWN0b3IodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXIub3B0aW9ucy5icmlkZ2VQcm92aWRlcikgb3B0aW9ucy5icmlkZ2VQcm92aWRlciA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5icmlkZ2VQcm92aWRlcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXQoX2V4dHJhY3Rvci5pZGVudGlmaWVyLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGFjdGl2YXRlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RvciBhcyB1bmtub3duIGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGFjdGl2YXRlISBFcnJvcjogJHtlfWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gdW5yZWdpc3RlclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyPEsgZXh0ZW5kcyBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yPihfZXh0cmFjdG9yOiBLKSB7XG4gICAgICAgIGNvbnN0IGV4dHJhY3RvciA9IHR5cGVvZiBfZXh0cmFjdG9yID09PSAnc3RyaW5nJyA/IHRoaXMuc3RvcmUuZ2V0KF9leHRyYWN0b3IpIDogdGhpcy5zdG9yZS5maW5kKChyKSA9PiByID09PSBfZXh0cmFjdG9yKTtcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHJldHVybjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgdGhpcy5zdG9yZS5maW5kS2V5KChlKSA9PiBlID09PSBleHRyYWN0b3IpITtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGlzYWJsZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3VucmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICBhd2FpdCBleHRyYWN0b3IuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBkZWFjdGl2YXRlIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVyIGFsbCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJBbGwoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnN0b3JlLm1hcCgoZSkgPT4gdGhpcy51bnJlZ2lzdGVyKGUpKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVuIGFsbCB0aGUgZXh0cmFjdG9yc1xuICAgICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIGZpbHRlckJsb2NrZWQgRmlsdGVyIGJsb2NrZWQgZXh0cmFjdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KGZuOiBFeHRyYWN0b3JFeGVjdXRpb25GTjxUPiwgZmlsdGVyQmxvY2tlZCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/IFtdO1xuXG4gICAgICAgIGlmICghdGhpcy5zdG9yZS5zaXplKSB7XG4gICAgICAgICAgICBVdGlsLndhcm4oJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLCAnTm9FeHRyYWN0b3JzJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXJyOiBFcnJvciB8IG51bGwgPSBudWxsLFxuICAgICAgICAgICAgbGFzdEV4dDogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXh0IG9mIHRoaXMuc3RvcmUudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJCbG9ja2VkICYmIGJsb2NrZWQuc29tZSgoZSkgPT4gZSA9PT0gZXh0LmlkZW50aWZpZXIpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0uLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGV4dCkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZmFpbGVkIHdpdGggZXJyb3I6ICR7ZX1gKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHlwZVV0aWwuaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoYCR7ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsYXN0RXh0ID0gZXh0O1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmICFUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBleHQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUPjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgZXJyID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBsYXN0RXh0ISxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogZmFsc2VcbiAgICAgICAgICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PGZhbHNlPjtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yO1xuICAgIGVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiBQcm9taXNlPFQgfCBib29sZWFuPjtcbiIsICJleHBvcnQgY2xhc3MgVHlwZVV0aWwge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBUeXBlVXRpbDtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIHB1YmxpYyBzdGF0aWMgaXNGdW5jdGlvbih0OiB1bmtub3duKTogdCBpcyBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHQ6IHVua25vd24pOiB0IGlzIG51bWJlciB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnc3RyaW5nJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQm9vbGVhbih0OiB1bmtub3duKTogdCBpcyBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc051bGxpc2godDogdW5rbm93bik6IHQgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0ID09IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNFcnJvcih0OiB1bmtub3duKTogdCBpcyBFcnJvciB7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMsIEJpcXVhZEZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVSZXBlYXRNb2RlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gdW5rbm93bj4ge1xuICAgIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgICB2b2x1bWU/OiBudW1iZXIgfCBib29sZWFuO1xuICAgIGVxdWFsaXplcj86IEVxdWFsaXplckJhbmRbXSB8IGJvb2xlYW47XG4gICAgYV9maWx0ZXI/OiBQQ01GaWx0ZXJzW10gfCBib29sZWFuO1xuICAgIGJpcXVhZD86IEJpcXVhZEZpbHRlcnMgfCBib29sZWFuO1xuICAgIHJlc2FtcGxlcj86IG51bWJlciB8IGJvb2xlYW47XG4gICAgZGlzYWJsZUhpc3Rvcnk/OiBib29sZWFuO1xuICAgIHNraXBPbk5vU3RyZWFtPzogYm9vbGVhbjtcbiAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtPzogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICAgIGxlYXZlT25FbXB0eT86IGJvb2xlYW47XG4gICAgbGVhdmVPbkVtcHR5Q29vbGRvd24/OiBudW1iZXI7XG4gICAgbGVhdmVPbkVuZD86IGJvb2xlYW47XG4gICAgbGVhdmVPbkVuZENvb2xkb3duPzogbnVtYmVyO1xuICAgIGxlYXZlT25TdG9wPzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uU3RvcENvb2xkb3duPzogbnVtYmVyO1xuICAgIG1ldGFkYXRhPzogVCB8IG51bGw7XG4gICAgc2VsZkRlYWY/OiBib29sZWFuO1xuICAgIGNvbm5lY3Rpb25UaW1lb3V0PzogbnVtYmVyO1xuICAgIGRlZmF1bHRGRm1wZWdGaWx0ZXJzPzogRmlsdGVyc05hbWVbXTtcbiAgICBidWZmZXJpbmdUaW1lb3V0PzogbnVtYmVyO1xuICAgIG5vRW1pdEluc2VydD86IGJvb2xlYW47XG4gICAgbWF4U2l6ZT86IG51bWJlcjtcbiAgICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBOb2RlUmVzb2x2YWJsZSA9IEd1aWxkUXVldWUgfCBHdWlsZFJlc29sdmFibGU7XG5cbmV4cG9ydCBjbGFzcyBHdWlsZE5vZGVNYW5hZ2VyPE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGNhY2hlID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBHdWlsZFF1ZXVlPigpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZ3VpbGQgcXVldWUgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICAgKiBAcGFyYW0gZ3VpbGQgVGhlIGd1aWxkIHdoaWNoIHdpbGwgYmUgdGhlIG93bmVyIG9mIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFF1ZXVlIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlPFQgPSBNZXRhPihndWlsZDogR3VpbGRSZXNvbHZhYmxlLCBvcHRpb25zOiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+ID0ge30pOiBHdWlsZFF1ZXVlPFQ+IHtcbiAgICAgICAgY29uc3Qgc2VydmVyID0gdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlKGd1aWxkKTtcbiAgICAgICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0dVSUxEKCdJbnZhbGlkIG9yIHVua25vd24gZ3VpbGQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhzZXJ2ZXIuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoc2VydmVyLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5zdHJhdGVneSA/Pz0gJ0ZJRk8nO1xuICAgICAgICBvcHRpb25zLnZvbHVtZSA/Pz0gMTAwO1xuICAgICAgICBvcHRpb25zLmVxdWFsaXplciA/Pz0gW107XG4gICAgICAgIG9wdGlvbnMuYV9maWx0ZXIgPz89IFtdO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVIaXN0b3J5ID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5za2lwT25Ob1N0cmVhbSA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbmQgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMucmVzYW1wbGVyID8/PSA0ODAwMDtcbiAgICAgICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dDtcbiAgICAgICAgb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0ID8/PSAxMDAwO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuXG4gICAgICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nKSAmJiAhb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgYXMgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICBndWlsZDogc2VydmVyLFxuICAgICAgICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgICAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICAgICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICAgICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgICAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgICAgICAgc2tpcE9uTm9TdHJlYW06IG9wdGlvbnMuc2tpcE9uTm9TdHJlYW0sXG4gICAgICAgICAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSxcbiAgICAgICAgICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSxcbiAgICAgICAgICAgIHJlcGVhdE1vZGU6IG9wdGlvbnMucmVwZWF0TW9kZSxcbiAgICAgICAgICAgIGxlYXZlT25FbXB0eTogb3B0aW9ucy5sZWF2ZU9uRW1wdHksXG4gICAgICAgICAgICBsZWF2ZU9uRW1wdHlDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93bixcbiAgICAgICAgICAgIGxlYXZlT25FbmQ6IG9wdGlvbnMubGVhdmVPbkVuZCxcbiAgICAgICAgICAgIGxlYXZlT25FbmRDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24sXG4gICAgICAgICAgICBsZWF2ZU9uU3RvcDogb3B0aW9ucy5sZWF2ZU9uU3RvcCxcbiAgICAgICAgICAgIGxlYXZlT25TdG9wQ29vbGRvd246IG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bixcbiAgICAgICAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IG9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgICAgICAgIHNlbGZEZWFmOiBvcHRpb25zLnNlbGZEZWFmLFxuICAgICAgICAgICAgZmZtcGVnRmlsdGVyczogb3B0aW9ucy5kZWZhdWx0RkZtcGVnRmlsdGVycyA/PyBbXSxcbiAgICAgICAgICAgIGJ1ZmZlcmluZ1RpbWVvdXQ6IG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCxcbiAgICAgICAgICAgIG5vRW1pdEluc2VydDogb3B0aW9ucy5ub0VtaXRJbnNlcnQgPz8gZmFsc2UsXG4gICAgICAgICAgICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE6IG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhLFxuICAgICAgICAgICAgbWF4SGlzdG9yeVNpemU6IG9wdGlvbnMubWF4SGlzdG9yeVNpemUsXG4gICAgICAgICAgICBtYXhTaXplOiBvcHRpb25zLm1heFNpemUsXG4gICAgICAgICAgICBwYXVzZU9uRW1wdHk6IG9wdGlvbnMucGF1c2VPbkVtcHR5XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KHNlcnZlci5pZCwgcXVldWUpO1xuXG4gICAgICAgIHJldHVybiBxdWV1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZXhpc3RpbmcgcXVldWVcbiAgICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAgICovXG4gICAgcHVibGljIGdldDxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiAodGhpcy5jYWNoZS5nZXQocXVldWUuaWQpIGFzIEd1aWxkUXVldWU8VD4pIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBxdWV1ZSBleGlzdHNcbiAgICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAgICovXG4gICAgcHVibGljIGhhcyhub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBpZCA9IG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlID8gbm9kZS5pZCA6IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpITtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuaGFzKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgcXVldWVcbiAgICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZShub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICAgICAgaWYgKCFxdWV1ZSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fR1VJTERfUVVFVUUoJ0Nhbm5vdCBkZWxldGUgbm9uLWV4aXN0aW5nIHF1ZXVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKHRydWUpO1xuICAgICAgICBxdWV1ZS5ub2RlLnN0b3AodHJ1ZSk7XG4gICAgICAgIHF1ZXVlLmNvbm5lY3Rpb24/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICBxdWV1ZS5kaXNwYXRjaGVyPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcXVldWUuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgICBxdWV1ZS50aW1lb3V0cy5mb3JFYWNoKCh0bSkgPT4gY2xlYXJUaW1lb3V0KHRtKSk7XG4gICAgICAgIHF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICAgICAgcXVldWUudHJhY2tzLmNsZWFyKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZGVsZXRlKHF1ZXVlLmlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlPFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpISkgYXMgR3VpbGRRdWV1ZTxUPiB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHF1ZXVlIGlkXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlSWQobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICAgICAgcmV0dXJuIHE/LmlkIHx8IG51bGw7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucywgVHJhY2tMaWtlIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENoYW5uZWxUeXBlLCBHdWlsZCwgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBWb2ljZUJhc2VkQ2hhbm5lbCwgVm9pY2VTdGF0ZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWUsIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmlxdWFkRmlsdGVycywgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyB0eXBlIEF1ZGlvUGxheWVyLCBBdWRpb1Jlc291cmNlLCBTdHJlYW1UeXBlLCBWb2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cyB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi9HdWlsZFF1ZXVlSGlzdG9yeSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlUGxheWVyTm9kZSwgU3RyZWFtQ29uZmlnIH0gZnJvbSAnLi9HdWlsZFF1ZXVlUGxheWVyTm9kZSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZVJlcGVhdE1vZGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVN0YXRpc3RpY3MgfSBmcm9tICcuL0d1aWxkUXVldWVTdGF0aXN0aWNzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlSW5pdDxNZXRhID0gdW5rbm93bj4ge1xuICAgIGd1aWxkOiBHdWlsZDtcbiAgICBxdWV1ZVN0cmF0ZWd5OiBRdWV1ZVN0cmF0ZWd5O1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdIHwgYm9vbGVhbjtcbiAgICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gICAgYmlxdWFkOiBCaXF1YWRGaWx0ZXJzIHwgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICByZXNhbXBsZXI6IG51bWJlciB8IGJvb2xlYW47XG4gICAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gICAgZmZtcGVnRmlsdGVyczogRmlsdGVyc05hbWVbXTtcbiAgICBkaXNhYmxlSGlzdG9yeTogYm9vbGVhbjtcbiAgICBza2lwT25Ob1N0cmVhbTogYm9vbGVhbjtcbiAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtPzogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgICBsZWF2ZU9uRW1wdHk6IGJvb2xlYW47XG4gICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG51bWJlcjtcbiAgICBsZWF2ZU9uRW5kOiBib29sZWFuO1xuICAgIGxlYXZlT25FbmRDb29sZG93bjogbnVtYmVyO1xuICAgIGxlYXZlT25TdG9wOiBib29sZWFuO1xuICAgIGxlYXZlT25TdG9wQ29vbGRvd246IG51bWJlcjtcbiAgICBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyO1xuICAgIHNlbGZEZWFmPzogYm9vbGVhbjtcbiAgICBtZXRhZGF0YT86IE1ldGEgfCBudWxsO1xuICAgIGJ1ZmZlcmluZ1RpbWVvdXQ6IG51bWJlcjtcbiAgICBub0VtaXRJbnNlcnQ6IGJvb2xlYW47XG4gICAgbWF4U2l6ZT86IG51bWJlcjtcbiAgICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE6IGJvb2xlYW47XG4gICAgcGF1c2VPbkVtcHR5PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUNvbm5lY3RDb25maWcge1xuICAgIGRlYWY/OiBib29sZWFuO1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZ3JvdXA/OiBzdHJpbmc7XG4gICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3N0UHJvY2Vzc2VkUmVzdWx0IHtcbiAgICBzdHJlYW06IFJlYWRhYmxlO1xuICAgIHR5cGU6IFN0cmVhbVR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9ICh0cmFjazogVHJhY2ssIHF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlLCBxdWV1ZTogR3VpbGRRdWV1ZSkgPT4gUHJvbWlzZTxSZWFkYWJsZSB8IG51bGw+O1xuZXhwb3J0IHR5cGUgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgPSAoc3RyZWFtOiBSZWFkYWJsZSwgcXVldWU6IEd1aWxkUXVldWUpID0+IFByb21pc2U8UG9zdFByb2Nlc3NlZFJlc3VsdCB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24gPSAnZmlsdGVycycgfCAnbm9ybWFsJztcblxuZXhwb3J0IGNvbnN0IEd1aWxkUXVldWVFdmVudCA9IHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja0FkZDogJ2F1ZGlvVHJhY2tBZGQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc0FkZDogJ2F1ZGlvVHJhY2tzQWRkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tSZW1vdmU6ICdhdWRpb1RyYWNrUmVtb3ZlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja3NSZW1vdmU6ICdhdWRpb1RyYWNrc1JlbW92ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAgICovXG4gICAgY29ubmVjdGlvbjogJ2Nvbm5lY3Rpb24nLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNvbm5lY3Rpb24gaXMgZGVzdHJveWVkXG4gICAgICovXG4gICAgY29ubmVjdGlvbkRlc3Ryb3llZDogJ2Nvbm5lY3Rpb25EZXN0cm95ZWQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYm90IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBjaGFubmVsXG4gICAgICovXG4gICAgZGlzY29ubmVjdDogJ2Rpc2Nvbm5lY3QnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAgICovXG4gICAgZGVidWc6ICdkZWJ1ZycsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBlbmNvdW50ZXJzIGVycm9yXG4gICAgICovXG4gICAgZXJyb3I6ICdlcnJvcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICovXG4gICAgZW1wdHlDaGFubmVsOiAnZW1wdHlDaGFubmVsJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAgICovXG4gICAgZW1wdHlRdWV1ZTogJ2VtcHR5UXVldWUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHN0YXJ0cyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJTdGFydDogJ3BsYXllclN0YXJ0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBlcnJvcnMgd2hpbGUgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcGxheWVyRXJyb3I6ICdwbGF5ZXJFcnJvcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcGxheWVyRmluaXNoOiAncGxheWVyRmluaXNoJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBza2lwcyBjdXJyZW50IHRyYWNrXG4gICAgICovXG4gICAgcGxheWVyU2tpcDogJ3BsYXllclNraXAnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgICAqL1xuICAgIHBsYXllclRyaWdnZXI6ICdwbGF5ZXJUcmlnZ2VyJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKi9cbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAndm9pY2VTdGF0ZVVwZGF0ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHZvbHVtZSBpcyB1cGRhdGVkXG4gICAgICovXG4gICAgdm9sdW1lQ2hhbmdlOiAndm9sdW1lQ2hhbmdlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHBhdXNlZFxuICAgICAqL1xuICAgIHBsYXllclBhdXNlOiAncGxheWVyUGF1c2UnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgICAqL1xuICAgIHBsYXllclJlc3VtZTogJ3BsYXllclJlc3VtZScsXG4gICAgLyoqXG4gICAgICogQmlxdWFkIEZpbHRlcnMgVXBkYXRlXG4gICAgICovXG4gICAgYmlxdWFkRmlsdGVyc1VwZGF0ZTogJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEVxdWFsaXplciBVcGRhdGVcbiAgICAgKi9cbiAgICBlcXVhbGl6ZXJVcGRhdGU6ICdlcXVhbGl6ZXJVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIERTUCB1cGRhdGVcbiAgICAgKi9cbiAgICBkc3BVcGRhdGU6ICdkc3BVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEF1ZGlvIEZpbHRlcnMgVXBkYXRlXG4gICAgICovXG4gICAgYXVkaW9GaWx0ZXJzVXBkYXRlOiAnYXVkaW9GaWx0ZXJzVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBBdWRpbyBwbGF5ZXIgd2lsbCBwbGF5IG5leHQgdHJhY2tcbiAgICAgKi9cbiAgICB3aWxsUGxheVRyYWNrOiAnd2lsbFBsYXlUcmFjaycsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyByZXBvcHVsYXRlZFxuICAgICAqL1xuICAgIGNoYW5uZWxQb3B1bGF0ZTogJ2NoYW5uZWxQb3B1bGF0ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICAgKi9cbiAgICBxdWV1ZUNyZWF0ZTogJ3F1ZXVlQ3JlYXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBkZWxldGVkXG4gICAgICovXG4gICAgcXVldWVEZWxldGU6ICdxdWV1ZURlbGV0ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgICAqL1xuICAgIHdpbGxBdXRvUGxheTogJ3dpbGxBdXRvUGxheSdcbn0gYXMgY29uc3Q7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVFdmVudHM8TWV0YSA9IGFueT4ge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAgICovXG4gICAgYXVkaW9UcmFja0FkZDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrcyBhcnJheVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzQWRkOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tSZW1vdmU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAgICovXG4gICAgYXVkaW9UcmFja3NSZW1vdmU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgY29ubmVjdGlvbjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgZGVzdHJveWVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgY29ubmVjdGlvbkRlc3Ryb3llZDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYm90IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBjaGFubmVsXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgZGlzY29ubmVjdDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBkZWJ1ZzogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBtZXNzYWdlOiBzdHJpbmcpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBlbmNvdW50ZXJzIGVycm9yXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgICAqL1xuICAgIGVycm9yOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBlbXB0eUNoYW5uZWw6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgZW1wdHlRdWV1ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHN0YXJ0cyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgaXMgYmVpbmcgc3RyZWFtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJTdGFydDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgaXMgYmVpbmcgc3RyZWFtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJFcnJvcjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IsIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBmaW5pc2hlcyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2FzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyRmluaXNoOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBza2lwcyBjdXJyZW50IHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBza2lwcGVkXG4gICAgICovXG4gICAgcGxheWVyU2tpcDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB3aGljaCB3YXMgcGxheWVkIGluIHRoaXMgZXZlbnRcbiAgICAgKi9cbiAgICBwbGF5ZXJUcmlnZ2VyOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaywgcmVhc29uOiBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZFN0YXRlIFRoZSBvbGQgdm9pY2Ugc3RhdGVcbiAgICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgICAqL1xuICAgIHZvaWNlU3RhdGVVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIgaXMgcGF1c2VkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgcGxheWVyUGF1c2U6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHJlc3VtZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJSZXN1bWU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyJ3Mgdm9sdW1lIGlzIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkVm9sdW1lIFRoZSBvbGQgdm9sdW1lXG4gICAgICogQHBhcmFtIG5ld1ZvbHVtZSBUaGUgdXBkYXRlZCB2b2x1bWVcbiAgICAgKi9cbiAgICB2b2x1bWVDaGFuZ2U6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkVm9sdW1lOiBudW1iZXIsIG5ld1ZvbHVtZTogbnVtYmVyKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBlcXVhbGl6ZXIgY29uZmlnIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgZXF1YWxpemVyVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSwgbmV3RmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBiaXF1YWQgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGJpcXVhZEZpbHRlcnNVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwsIG5ld0ZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBkc3AgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGRzcFVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBQQ01GaWx0ZXJzW10sIG5ld0ZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZmZtcGVnIGF1ZGlvIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBhdWRpb0ZpbHRlcnNVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogRmlsdGVyc05hbWVbXSwgbmV3RmlsdGVyczogRmlsdGVyc05hbWVbXSkgPT4gdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHN0cmVhbWluZyBhbiBhdWRpbyB0cmFjay4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgc3RyZWFtIGNvbmZpZyBiZWZvcmUgcGxheWluZyBhIHRyYWNrLlxuICAgICAqIExpc3RlbmluZyB0byB0aGlzIGV2ZW50IHdpbGwgcGF1c2UgdGhlIGV4ZWN1dGlvbiBvZiBhdWRpbyBwbGF5ZXIgdW50aWwgYGRvbmUoKWAgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2lsbCBiZSBzdHJlYW1lZFxuICAgICAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbnMgZm9yIHN0cmVhbWluZ1xuICAgICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICAgKi9cbiAgICB3aWxsUGxheVRyYWNrOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjazx1bmtub3duPiwgY29uZmlnOiBTdHJlYW1Db25maWcsIGRvbmU6ICgpID0+IHZvaWQpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyBwb3B1bGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBjaGFubmVsUG9wdWxhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHF1ZXVlQ3JlYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBxdWV1ZURlbGV0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHRyeWluZyB0byBhZGQgc2ltaWxhciB0cmFjayBmb3IgYXV0b3BsYXlcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSBzaW1pbGFyIHRyYWNrcyB0aGF0IHdlcmUgZm91bmRcbiAgICAgKiBAcGFyYW0gZG9uZSBEb25lIGNhbGxiYWNrXG4gICAgICovXG4gICAgd2lsbEF1dG9QbGF5OiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrczogVHJhY2tbXSwgZG9uZTogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQpID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlPE1ldGEgPSB1bmtub3duPiB7XG4gICAgI3RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAjZGVsZXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX19jdXJyZW50OiBUcmFjayB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyB0cmFja3M6IFF1ZXVlPFRyYWNrPjtcbiAgICBwdWJsaWMgaGlzdG9yeSA9IG5ldyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBub2RlID0gbmV3IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmaWx0ZXJzID0gbmV3IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoKSA9PiBudWxsO1xuICAgIHB1YmxpYyBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jIChzdHJlYW0pID0+ICh7XG4gICAgICAgIHN0cmVhbSxcbiAgICAgICAgdHlwZTogU3RyZWFtVHlwZS5SYXdcbiAgICB9KTtcbiAgICBwdWJsaWMgcmVwZWF0TW9kZSA9IFF1ZXVlUmVwZWF0TW9kZS5PRkY7XG4gICAgcHVibGljIHRpbWVvdXRzID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBOb2RlSlMuVGltZW91dD4oKTtcbiAgICBwdWJsaWMgc3RhdHMgPSBuZXcgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHVibGljIG9wdGlvbnM6IEd1aWxkTm9kZUluaXQ8TWV0YT4pIHtcbiAgICAgICAgdGhpcy50cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KG9wdGlvbnMucXVldWVTdHJhdGVneSk7XG4gICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pKSB0aGlzLm9uQmVmb3JlQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbTtcbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtKSkgdGhpcy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtO1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaChvcHRpb25zLnJlcGVhdE1vZGUpKSB0aGlzLnJlcGVhdE1vZGUgPSBvcHRpb25zLnJlcGVhdE1vZGU7XG5cbiAgICAgICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5tYXhTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuXG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKHRoaXMub3B0aW9ucy5iaXF1YWQpICYmICFUeXBlVXRpbC5pc0Jvb2xlYW4odGhpcy5vcHRpb25zLmJpcXVhZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSB0aGlzLm9wdGlvbnMuYmlxdWFkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmVxdWFsaXplcikpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSB0aGlzLm9wdGlvbnMuZXF1YWxpemVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmZpbHRlcmVyKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMgPSB0aGlzLm9wdGlvbnMuZmlsdGVyZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIodGhpcy5vcHRpb25zLnJlc2FtcGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gdGhpcy5vcHRpb25zLnJlc2FtcGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChUeXBlVXRpbC5pc0FycmF5KHRoaXMub3B0aW9ucy5mZm1wZWdGaWx0ZXJzKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLmZmbXBlZy5zZXREZWZhdWx0cyh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKG9wdGlvbnMubWF4U2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ1tHdWlsZE5vZGVJbml0Lm1heFNpemVdJywgJ251bWJlcicsIHR5cGVvZiBvcHRpb25zLm1heFNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heEhpc3RvcnlTaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnW0d1aWxkTm9kZUluaXQubWF4SGlzdG9yeVNpemVdJywgJ251bWJlcicsIHR5cGVvZiBvcHRpb25zLm1heEhpc3RvcnlTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm1heFNpemUgPCAxKSBvcHRpb25zLm1heFNpemUgPSBJbmZpbml0eTtcbiAgICAgICAgaWYgKG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPCAxKSBvcHRpb25zLm1heEhpc3RvcnlTaXplID0gSW5maW5pdHk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEd1aWxkUXVldWUgaW5pdGlhbGl6ZWQgZm9yIGd1aWxkICR7dGhpcy5vcHRpb25zLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLm9wdGlvbnMuZ3VpbGQuaWR9KWApO1xuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnF1ZXVlQ3JlYXRlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBxdWV1ZSBpbiBtc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zdG9yZS5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLmR1cmF0aW9uTVMsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBkdXJhdGlvbkZvcm1hdHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSByZWNlaXZlciBmb3IgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdm9pY2VSZWNlaXZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8ucmVjZWl2ZXIgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGRlYnVnIG1lc3NhZ2UgdG8gdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBtIFRoZSBtZXNzYWdlIHRvIHdyaXRlXG4gICAgICovXG4gICAgcHVibGljIGRlYnVnKG06IHN0cmluZykge1xuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRlYnVnLCB0aGlzLCBtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0YWRhdGEgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWV0YWRhdGEhO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgbWV0YWRhdGEobTogTWV0YSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBtIE1ldGFkYXRhIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGN1cnJlbnQgdHJhY2sgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLl9fY3VycmVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBxdWV1ZSB3YXMgZGVsZXRlZCBwcmV2aW91c2x5XG4gICAgICovXG4gICAgcHVibGljIGdldCBkZWxldGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVsZXRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY2hhbm5lbCBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjaGFubmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5jaGFubmVsIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjaGFubmVsKGM6IFZvaWNlQmFzZWRDaGFubmVsIHwgbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICAgICAgICBpZiAoYykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsID0gYztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LnZvaWNlQ29ubmVjdGlvbiB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBndWlsZCB0aGlzIHF1ZXVlIGJlbG9uZ3MgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGd1aWxkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmd1aWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGQuaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRyYW5zaXRpb24gbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldFRyYW5zaXRpb25pbmcoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy4jdHJhbnNpdGlvbmluZyA9IHN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGlmIHRoaXMgcXVldWUgaXMgY3VycmVudGx5IHVuZGVyIHRyYW5zaXRpb24gbW9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1RyYW5zaXRpb25pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0cmFuc2l0aW9uaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCByZXBlYXQgbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSByZXBlYXQgbW9kZSB0byBhcHBseVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXBlYXRNb2RlKG1vZGU6IFF1ZXVlUmVwZWF0TW9kZSkge1xuICAgICAgICB0aGlzLnJlcGVhdE1vZGUgPSBtb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1heFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4U2l6ZSA/PyBJbmZpbml0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldE1heFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heFNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1heEhpc3RvcnlTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID8/IEluZmluaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBoaXN0b3J5IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYXhIaXN0b3J5U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4SGlzdG9yeVNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1heCBoaXN0b3J5IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWF4SGlzdG9yeVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWF4IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWF4U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2l6ZSA8IDEpIHNpemUgPSBJbmZpbml0eTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBoYXMgbm8gdHJhY2tzIGxlZnQgaW4gaXRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPCAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaXMgZnVsbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Z1bGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplID49IHRoaXMubWF4U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcXVldWUgY2FwYWNpdHlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2FwYWNpdHkoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVsbCgpKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5tYXhTaXplIC0gdGhpcy5zaXplO1xuICAgICAgICByZXR1cm4gY2FwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgcXVldWUgY3VycmVudGx5IGhvbGRzIGFjdGl2ZSBhdWRpbyByZXNvdXJjZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2UgIT0gbnVsbCAmJiAhdGhpcy5kaXNwYXRjaGVyLmF1ZGlvUmVzb3VyY2UuZW5kZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHRyYWNrIHRvIHRoZSBxdWV1ZS4gVGhpcyB3aWxsIGVtaXQgYGF1ZGlvVHJhY2tzQWRkYCB3aGVuIG11bHRpcGxlIHRyYWNrcyBhcmUgYWRkZWQsIG90aGVyd2lzZSBgYXVkaW9UcmFja0FkZGAuXG4gICAgICogQHBhcmFtIHRyYWNrIFRyYWNrIG9yIHBsYXlsaXN0IG9yIGFycmF5IG9mIHRyYWNrcyB0byBhZGRcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkVHJhY2sodHJhY2s6IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0KSB7XG4gICAgICAgIGNvbnN0IHRvQWRkID0gdHJhY2sgaW5zdGFuY2VvZiBQbGF5bGlzdCA/IHRyYWNrLnRyYWNrcyA6IHRyYWNrO1xuICAgICAgICBjb25zdCBpc011bHRpID0gQXJyYXkuaXNBcnJheSh0b0FkZCk7XG5cbiAgICAgICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMsIHRvQWRkKTtcblxuICAgICAgICB0aGlzLnRyYWNrcy5hZGQodG9BZGQpO1xuXG4gICAgICAgIGlmIChpc011bHRpKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvVHJhY2tBZGQsIHRoaXMsIHRvQWRkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUucmVtb3ZlKHRyYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSB0cmFjayB0byB0aGUgZ2l2ZW4gaW5kZXhcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMClcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zZXJ0VHJhY2sodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRvXG4gICAgICovXG4gICAgcHVibGljIG1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5tb3ZlKHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29weVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmNvcHkodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHNyYyBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgICAqIEBwYXJhbSBkZXN0IFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgICAqL1xuICAgIHB1YmxpYyBzd2FwVHJhY2tzKHNyYzogVHJhY2tSZXNvbHZhYmxlLCBkZXN0OiBUcmFja1Jlc29sdmFibGUpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5zd2FwKHNyYywgZGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHN0cmVhbSBkaXNwYXRjaGVyIGZyb20gdGhlIGdpdmVuIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byB1c2VcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRGlzcGF0Y2hlcihjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sIG9wdGlvbnM6IFBpY2s8Vm9pY2VDb25uZWN0Q29uZmlnLCAnYXVkaW9QbGF5ZXInIHwgJ3RpbWVvdXQnPiA9IHt9KSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMuY2FjaGUuZ2V0KGNvbm5lY3Rpb24uam9pbkNvbmZpZy5jaGFubmVsSWQhKTtcbiAgICAgICAgaWYgKCFjaGFubmVsKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DSEFOTkVMKCk7XG4gICAgICAgIGlmICghY2hhbm5lbC5pc1ZvaWNlQmFzZWQoKSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2hhbm5lbCcsIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLCBTdHJpbmcoY2hhbm5lbD8udHlwZSkpO1xuXG4gICAgICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgICAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihjb25uZWN0aW9uLCBjaGFubmVsLCB0aGlzLCBvcHRpb25zLnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0LCBvcHRpb25zLmF1ZGlvUGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBjaGFubmVsUmVzb2x2YWJsZSBUaGUgdm9pY2UgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAgICogQHBhcmFtIG9wdGlvbnMgSm9pbiBjb25maWdcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgY29ubmVjdChjaGFubmVsUmVzb2x2YWJsZTogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zOiBWb2ljZUNvbm5lY3RDb25maWcgPSB7fSkge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5wbGF5ZXIuY2xpZW50LmNoYW5uZWxzLnJlc29sdmUoY2hhbm5lbFJlc29sdmFibGUpO1xuICAgICAgICBpZiAoIWNoYW5uZWwgfHwgIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NoYW5uZWwnLCBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCwgU3RyaW5nKGNoYW5uZWw/LnR5cGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDb25uZWN0aW5nIHRvICR7Y2hhbm5lbC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgPyAnc3RhZ2UnIDogJ3ZvaWNlJ30gY2hhbm5lbCAke2NoYW5uZWwubmFtZX0gKElEOiAke2NoYW5uZWwuaWR9KWApO1xuXG4gICAgICAgIGlmICh0aGlzLmRpc3BhdGNoZXIgJiYgY2hhbm5lbC5pZCAhPT0gdGhpcy5kaXNwYXRjaGVyLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdEZXN0cm95aW5nIG9sZCBjb25uZWN0aW9uJyk7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gYXdhaXQgdGhpcy5wbGF5ZXIudm9pY2VVdGlscy5jb25uZWN0KGNoYW5uZWwsIHtcbiAgICAgICAgICAgIGRlYWY6IG9wdGlvbnMuZGVhZiA/PyB0aGlzLm9wdGlvbnMuc2VsZkRlYWYgPz8gdHJ1ZSxcbiAgICAgICAgICAgIG1heFRpbWU6IG9wdGlvbnM/LnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICAgICAgICBxdWV1ZTogdGhpcyxcbiAgICAgICAgICAgIGF1ZGlvUGxheWVyOiBvcHRpb25zPy5hdWRpb1BsYXllcixcbiAgICAgICAgICAgIGdyb3VwOiBvcHRpb25zLmdyb3VwID8/IHRoaXMucGxheWVyLmNsaWVudC51c2VyPy5pZFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNvbm5lY3Rpb24sIHRoaXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmNoYW5uZWwhLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRTdXBwcmVzc2VkKGZhbHNlKS5jYXRjaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jYXR0YWNoTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gbGF0ZW5jeSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5ub2Rlcy5kZWxldGUodGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI2RlbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnF1ZXVlRGVsZXRlLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgICAgICAgICAgdGhpcy50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmV2aXZlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGVsZXRlZCB8fCB0aGlzLnBsYXllci5ub2Rlcy5oYXModGhpcy5pZCkpIHJldHVybjtcbiAgICAgICAgdGhpcy4jZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgICAgICB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5zZXQodGhpcy5pZCwgdGhpcyk7XG4gICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHNlbGYgZGVhZlxuICAgICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGZEZWFmKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0RGVhZihtb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzZWxmIG11dGVcbiAgICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxmTXV0ZShtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldE11dGUobW9kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IGEgdHJhY2sgaW4gdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIG5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KHRyYWNrOiBUcmFja0xpa2UsIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPE1ldGE+KSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFubmVsKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DT05ORUNUSU9OKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLnBsYXkodGhpcy5jaGFubmVsLCB0cmFjaywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdCBhbiBldmVudCBvbiB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBlbWl0XG4gICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgZm9yIHRoZSBldmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+PihldmVudDogSywgLi4uYXJnczogUGFyYW1ldGVyczxHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+W0tdPik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5kZWxldGVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgI2F0dGFjaExpc3RlbmVycyhkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2Vycm9yJywgKGUpID0+IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZXJyb3IsIHRoaXMsIGUpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZGVidWcnLCAobSkgPT4gdGhpcy5oYXNEZWJ1Z2dlciAmJiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRlYnVnLCB0aGlzLCBtKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2ZpbmlzaCcsIChyKSA9PiB0aGlzLiNwZXJmb3JtRmluaXNoKHIpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignc3RhcnQnLCAocikgPT4gdGhpcy4jcGVyZm9ybVN0YXJ0KHIpKTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZGVzdHJveWVkJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKGRpc3BhdGNoZXIpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2RzcCcsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5pcyh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRzcFVwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignYmlxdWFkJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkICE9PSBmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5iaXF1YWRGaWx0ZXJzVXBkYXRlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbignZXFCYW5kcycsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5pcyhmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZXF1YWxpemVyVXBkYXRlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSBmO1xuICAgICAgICB9KTtcbiAgICAgICAgZGlzcGF0Y2hlci5vbigndm9sdW1lJywgKGYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lICE9PSBmKSB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnZvbHVtZUNoYW5nZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSwgZik7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gZjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNEZWJ1Z2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5saXN0ZW5lckNvdW50KEd1aWxkUXVldWVFdmVudC5kZWJ1ZykgPiAwO1xuICAgIH1cblxuICAgICNyZW1vdmVMaXN0ZW5lcnM8VCBleHRlbmRzIHsgcmVtb3ZlQWxsTGlzdGVuZXJzOiAoKSA9PiB1bmtub3duIH0+KHRhcmdldDogVCkge1xuICAgICAgICB0YXJnZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgI3BlcmZvcm1TdGFydChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuY3VycmVudFRyYWNrO1xuICAgICAgICBjb25zdCByZWFzb24gPSB0aGlzLmlzVHJhbnNpdGlvbmluZygpID8gJ2ZpbHRlcnMnIDogJ25vcm1hbCc7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBQbGF5ZXIgdHJpZ2dlcmVkIGZvciBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRyYWNrPy50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICAgICAgfSl9YFxuICAgICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclRyaWdnZXIsIHRoaXMsIHRyYWNrISwgcmVhc29uKTtcbiAgICAgICAgaWYgKHRyYWNrICYmICF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclN0YXJ0LCB0aGlzLCB0cmFjayk7XG4gICAgICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG4gICAgfVxuXG4gICAgI3BlcmZvcm1GaW5pc2gocmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgICAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICAgICAgICAgICAgfSl9IHdhcyBtYXJrZWQgYXMgZmluaXNoZWRgXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0FkZGluZyB0cmFjayB0byBoaXN0b3J5IGFuZCBlbWl0dGluZyBmaW5pc2ggZXZlbnQgc2luY2UgdHJhbnNpdGlvbiBtb2RlIGlzIGRpc2FibGVkLi4uJyk7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh0cmFjayk7XG4gICAgICAgICAgICB0aGlzLm5vZGUucmVzZXRQcm9ncmVzcygpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJGaW5pc2gsIHRoaXMsIHRyYWNrKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNkZWxldGVkKSByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdObyBtb3JlIHRyYWNrcyBsZWZ0IGluIHRoZSBxdWV1ZSB0byBwbGF5IGFuZCByZXBlYXQgbW9kZSBpcyBvZmYsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlRSQUNLKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gdHJhY2ssIHJlcGVhdGluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUucGxheSh0aGlzLl9fY3VycmVudCEsIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuUVVFVUUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBxdWV1ZSwgbW92aW5nIGxhc3QgdHJhY2sgZnJvbSB0aGUgaGlzdG9yeSB0byBjdXJyZW50IHF1ZXVlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhY2tzLmFkZCh0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLkFVVE9QTEFZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIGF1dG9wbGF5LCBpbml0aWF0aW5nIGF1dG9wbGF5IGhhbmRsZXIuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdJbml0aWFsaXppbmcgbmV4dCB0cmFjayBvZiB0aGUgcXVldWUuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpITtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjZW1pdEVuZCgpIHtcbiAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVtcHR5UXVldWUsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxlYXZlT25FbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRtKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24pLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyAjaGFuZGxlQXV0b3BsYXkodHJhY2s6IFRyYWNrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRmluZGluZyByZWxhdGVkIHRyYWNrcyBmb3IgVHJhY2sgJHt0cmFjay50aXRsZX0gKCR7dHJhY2sudXJsfSkgW2V4dDoke3RyYWNrLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ31dYCk7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgICAgICAgICAgIChhd2FpdCB0cmFjay5leHRyYWN0b3I/LmdldFJlbGF0ZWRUcmFja3ModHJhY2spKT8udHJhY2tzIHx8XG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gUXVlcnlpbmcgZXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBleHQuZ2V0UmVsYXRlZFRyYWNrcyh0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy50cmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgdG8gcHJvdmlkZSByZXN1bHRzLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgcmVzdWx0cy5gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy50cmFja3M7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8ucmVzdWx0IHx8XG4gICAgICAgICAgICAgICAgW107XG5cbiAgICAgICAgICAgIGxldCByZXNvbHZlcjogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICAgICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRyYWNrIHwgbnVsbD4oKHJlc29sdmUpID0+IChyZXNvbHZlciA9IHJlc29sdmUpKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQud2lsbEF1dG9QbGF5LCB0aGlzLCB0cmFja3MsIHJlc29sdmVyISk7XG5cbiAgICAgICAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIoXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZSA9IHRyYWNrcy5maWx0ZXIoKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlPy5bMF0gPz8gVXRpbC5yYW5kb21DaG9pY2UodHJhY2tzLnNsaWNlKDAsIDUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV4dFRyYWNrID0gYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgICAgICAgIGlmICghbmV4dFRyYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0F1dG9wbGF5ID4+IE5vIHRyYWNrIHdhcyBmb3VuZCwgaW5pdGlhdGluZyAjZW1pdEVuZCgpJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgJ05vIHRyYWNrIHdhcyBmb3VuZCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubm9kZS5wbGF5KG5leHRUcmFjaywge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrOiAwLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIEF1ZGlvUGxheWVyLFxuICAgIEF1ZGlvUGxheWVyRXJyb3IsXG4gICAgQXVkaW9QbGF5ZXJTdGF0dXMsXG4gICAgQXVkaW9SZXNvdXJjZSxcbiAgICBjcmVhdGVBdWRpb1BsYXllcixcbiAgICBjcmVhdGVBdWRpb1Jlc291cmNlLFxuICAgIGVudGVyc1N0YXRlLFxuICAgIFN0cmVhbVR5cGUsXG4gICAgVm9pY2VDb25uZWN0aW9uLFxuICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cyxcbiAgICBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uXG59IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgQmlxdWFkRmlsdGVycywgUENNRmlsdGVycywgRmlsdGVyc0NoYWluIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFBvc3RQcm9jZXNzZWRSZXN1bHQgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IFZvaWNlUmVjZWl2ZXJOb2RlIH0gZnJvbSAnLi4vbWFuYWdlci9Wb2ljZVJlY2VpdmVyTm9kZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTdHJlYW1PcHMge1xuICAgIHR5cGU/OiBTdHJlYW1UeXBlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YT86IGFueTtcbiAgICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlRXF1YWxpemVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWRGaWx0ZXI/OiBCaXF1YWRGaWx0ZXJzO1xuICAgIGRpc2FibGVGaWx0ZXJzPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgICB2b2x1bWU/OiBudW1iZXI7XG4gICAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gICAgc2FtcGxlUmF0ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUV2ZW50cyB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICAgIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgICBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gYW55O1xuICAgIHN0YXJ0OiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gICAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gICAgZHNwOiAoZmlsdGVyczogUENNRmlsdGVyc1tdKSA9PiBhbnk7XG4gICAgZXFCYW5kczogKGZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSkgPT4gYW55O1xuICAgIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBudW1iZXIpID0+IGFueTtcbiAgICBiaXF1YWQ6IChmaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzKSA9PiBhbnk7XG4gICAgdm9sdW1lOiAodm9sdW1lOiBudW1iZXIpID0+IGFueTtcbiAgICBkZXN0cm95ZWQ6ICgpID0+IGFueTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbn1cblxuY2xhc3MgU3RyZWFtRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxWb2ljZUV2ZW50cz4ge1xuICAgIHB1YmxpYyB2b2ljZUNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbjtcbiAgICBwdWJsaWMgYXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyO1xuICAgIHB1YmxpYyByZWNlaXZlciA9IG5ldyBWb2ljZVJlY2VpdmVyTm9kZSh0aGlzKTtcbiAgICBwdWJsaWMgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsO1xuICAgIHB1YmxpYyBhdWRpb1Jlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4gfCBudWxsO1xuICAgIHB1YmxpYyBkc3AgPSBuZXcgRmlsdGVyc0NoYWluKCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBjb25uZWN0aW9uIG9iamVjdFxuICAgICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSBjb25uZWN0ZWQgY2hhbm5lbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLCBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsIHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZSwgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXIgPSAyMDAwMCwgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcikge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgICAgICAgKiBAdHlwZSB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXVkaW8gcGxheWVyXG4gICAgICAgICAqIEB0eXBlIHtBdWRpb1BsYXllcn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIgPVxuICAgICAgICAgICAgYXVkaW9QbGF5ZXIgfHxcbiAgICAgICAgICAgIGNyZWF0ZUF1ZGlvUGxheWVyKHtcbiAgICAgICAgICAgICAgICBkZWJ1ZzogdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlclxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICAgICAqIEB0eXBlIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcblxuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yIGFzIEF1ZGlvUGxheWVyRXJyb3IpKTtcbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpKTtcblxuICAgICAgICB0aGlzLmRzcC5vblVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kc3ApIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKSB0aGlzLmVtaXQoJ2RzcCcsIHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVyKSB0aGlzLmVtaXQoJ2JpcXVhZCcsIHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5lcXVhbGl6ZXIpIHRoaXMuZW1pdCgnZXFCYW5kcycsIHRoaXMuZHNwLmVxdWFsaXplci5nZXRFUSgpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC52b2x1bWUpIHRoaXMuZW1pdCgndm9sdW1lJywgdGhpcy5kc3Audm9sdW1lLnZvbHVtZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AucmVzYW1wbGVyKSB0aGlzLmVtaXQoJ3NhbXBsZVJhdGUnLCB0aGlzLmRzcC5yZXNhbXBsZXIudGFyZ2V0U2FtcGxlUmF0ZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kc3Aub25FcnJvciA9IChlKSA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZSBhcyBBdWRpb1BsYXllckVycm9yKTtcblxuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvblxuICAgICAgICAgICAgLm9uKFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQsIGFzeW5jIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLk1hbnVhbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uV2ViU29ja2V0Q2xvc2UgJiYgbmV3U3RhdGUuY2xvc2VDb2RlID09PSA0MDE0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZSh0aGlzLnZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcsIHRoaXMuY29ubmVjdGlvblRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgVXRpbC53YWl0KCh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyArIDEpICogNTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNvbm5lY3Rpb25EZXN0cm95ZWQsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignc3RhdGVDaGFuZ2UnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiYgbmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclBhdXNlLCB0aGlzLnF1ZXVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJSZXN1bWUsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSB8fCBvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkJ1ZmZlcmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdzdGFydCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlICYmIG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgICAgICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgICAqL1xuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkO1xuICAgIH1cblxuICAgIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHZhbCA/IHRoaXMucGF1c2UodHJ1ZSkgOiB0aGlzLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5LlxuICAgICAqL1xuICAgIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXVzZWQgfHwgdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkF1dG9QYXVzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nXG4gICAgICovXG4gICAgaXNCdWZmZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICAgKi9cbiAgICBpc1BsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpZGxlXG4gICAgICovXG4gICAgaXNJZGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEZXN0cm95ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gcGxheVxuICAgICAqL1xuICAgIGlzUmVhZHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBzaWduYWxsaW5nXG4gICAgICovXG4gICAgaXNTaWduYWxsaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBjb25uZWN0aW5nXG4gICAgICovXG4gICAgaXNDb25uZWN0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHN0cmVhbVxuICAgICAqIEBwYXJhbSB7UmVhZGFibGV9IHNyYyBUaGUgc3RyZWFtIHNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3BzXSBPcHRpb25zXG4gICAgICogQHJldHVybnMge0F1ZGlvUmVzb3VyY2V9XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlU3RyZWFtKHNyYzogUmVhZGFibGUsIG9wcz86IENyZWF0ZVN0cmVhbU9wcykge1xuICAgICAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhdGluZyBEU1AgZmlsdGVycyBwaXBlbGluZS4uLicpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSAhb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgICAgICAgPyB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICAgICAgICAgICAgICBkc3A6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBvcHM/LmRlZmF1bHRGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVGaWx0ZXJzXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgYmlxdWFkOiBvcHM/LmJpcXVhZEZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogb3BzLmJpcXVhZEZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlQmlxdWFkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICByZXNhbXBsZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTYW1wbGVSYXRlOiBvcHM/LnNhbXBsZVJhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVJlc2FtcGxlclxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVxdWFsaXplcjoge1xuICAgICAgICAgICAgICAgICAgICAgIGJhbmRNdWx0aXBsaWVyOiBvcHM/LmVxLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVFcXVhbGl6ZXJcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB2b2x1bWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IG9wcz8udm9sdW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVWb2x1bWVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogc3JjO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdFeGVjdXRpbmcgb25BZnRlckNyZWF0ZVN0cmVhbSBob29rLi4uJyk7XG4gICAgICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLm9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUpLmNhdGNoKFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5XG4gICAgICAgICAgICAgICAgfSBhcyBQb3N0UHJvY2Vzc2VkUmVzdWx0KVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdQcmVwYXJpbmcgQXVkaW9SZXNvdXJjZS4uLicpO1xuICAgICAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBjcmVhdGVBdWRpb1Jlc291cmNlKHBvc3RTdHJlYW0/LnN0cmVhbSA/PyBzdHJlYW0sIHtcbiAgICAgICAgICAgIGlucHV0VHlwZTogcG9zdFN0cmVhbT8udHlwZSA/PyBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnksXG4gICAgICAgICAgICBtZXRhZGF0YTogb3BzPy5kYXRhLFxuICAgICAgICAgICAgLy8gdm9sdW1lIGNvbnRyb2xzIGhhcHBlbiBmcm9tIEF1ZGlvRmlsdGVyIERTUCB1dGlsaXR5XG4gICAgICAgICAgICBpbmxpbmVWb2x1bWU6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8ucmVzYW1wbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5maWx0ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmJpcXVhZCB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmVxdWFsaXplciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5ZXIgc3RhdHVzXG4gICAgICogQHR5cGUge0F1ZGlvUGxheWVyU3RhdHVzfVxuICAgICAqL1xuICAgIGdldCBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyBmcm9tIHZvaWNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1ZGlvUGxheWVyKSB0aGlzLmF1ZGlvUGxheWVyLnN0b3AodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLnZvaWNlQ29ubmVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2gge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgZGlzcGF0Y2hlclxuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95ZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyB0aGUgcGxheWVyXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZW5kKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1BsYXllci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhdXNlcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJwb2xhdGVTaWxlbmNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgcGxheWVyIHdpbGwgcGxheSA1IHBhY2tldHMgb2Ygc2lsZW5jZSBhZnRlciBwYXVzaW5nIHRvIHByZXZlbnQgYXVkaW8gZ2xpdGNoZXMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgcGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci5wYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2UpO1xuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWVzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnVucGF1c2UoKTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSBzdHJlYW1cbiAgICAgKiBAcGFyYW0ge0F1ZGlvUmVzb3VyY2U8VHJhY2s+fSBbcmVzb3VyY2U9dGhpcy5hdWRpb1Jlc291cmNlXSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19BVURJT19SRVNPVVJDRSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvdXJjZS5lbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KCdmaW5pc2gnLCByZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSwgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIHZvbHVtZSBhbW91bnRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzZXRWb2x1bWUodmFsdWU6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2UucGxheWJhY2tEdXJhdGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgYXMgU3RyZWFtRGlzcGF0Y2hlciB9O1xuIiwgImltcG9ydCB7IFVzZXJSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCwgdHlwZSBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBFbmRCZWhhdmlvclR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0ICogYXMgcHJpc20gZnJvbSAncHJpc20tbWVkaWEnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgUmF3VHJhY2tEYXRhIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VSZWNlaXZlck9wdGlvbnMge1xuICAgIG1vZGU/OiAnb3B1cycgfCAncGNtJztcbiAgICBlbmQ/OiBFbmRCZWhhdmlvclR5cGU7XG4gICAgc2lsZW5jZUR1cmF0aW9uPzogbnVtYmVyO1xuICAgIGNyYz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFJhd1RyYWNrSW5pdCA9IFBhcnRpYWw8T21pdDxSYXdUcmFja0RhdGEsICdhdXRob3InIHwgJ3BsYXlsaXN0JyB8ICdzb3VyY2UnIHwgJ2VuZ2luZScgfCAncmF3JyB8ICdxdWVyeVR5cGUnIHwgJ2Rlc2NyaXB0aW9uJyB8ICd2aWV3cyc+PjtcblxuZXhwb3J0IGNsYXNzIFZvaWNlUmVjZWl2ZXJOb2RlIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHt9XG5cbiAgICBwdWJsaWMgY3JlYXRlUmF3VHJhY2soc3RyZWFtOiBSZWFkYWJsZSwgZGF0YTogUmF3VHJhY2tJbml0ID0ge30pIHtcbiAgICAgICAgZGF0YS50aXRsZSA/Pz0gYFJlY29yZGluZyAke0RhdGUubm93KCl9YDtcblxuICAgICAgICByZXR1cm4gbmV3IFRyYWNrKHRoaXMuZGlzcGF0Y2hlci5xdWV1ZS5wbGF5ZXIsIHtcbiAgICAgICAgICAgIGF1dGhvcjogJ0Rpc2NvcmQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGRhdGEudGl0bGUsXG4gICAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkYXRhLmR1cmF0aW9uIHx8ICcwOjAwJyxcbiAgICAgICAgICAgIHZpZXdzOiAwLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGRhdGEucmVxdWVzdGVkQnksXG4gICAgICAgICAgICB0aHVtYm5haWw6IGRhdGEudGh1bWJuYWlsIHx8ICdodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9lbWJlZC9hdmF0YXJzLzAucG5nJyxcbiAgICAgICAgICAgIHVybDogZGF0YS51cmwgfHwgJ2h0dHBzOi8vZGlzY29yZC5jb20nLFxuICAgICAgICAgICAgc291cmNlOiAnYXJiaXRyYXJ5JyxcbiAgICAgICAgICAgIHJhdzoge1xuICAgICAgICAgICAgICAgIGVuZ2luZTogc3RyZWFtLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ2FyYml0cmFyeSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2UgbXVsdGlwbGUgc3RyZWFtcyB0b2dldGhlclxuICAgICAqIEBwYXJhbSBzdHJlYW1zIFRoZSBhcnJheSBvZiBzdHJlYW1zIHRvIG1lcmdlXG4gICAgICovXG4gICAgcHVibGljIG1lcmdlUmVjb3JkaW5ncyhzdHJlYW1zOiBSZWFkYWJsZVtdKSB7XG4gICAgICAgIC8vIFRPRE9cbiAgICAgICAgdm9pZCBzdHJlYW1zO1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5tZXJnZVJlY29yZGluZ3MoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY29yZCBhIHVzZXIgaW4gdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIHRvIHJlY29yZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFJlY29yZGluZyBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHJlY29yZFVzZXIoXG4gICAgICAgIHVzZXI6IFVzZXJSZXNvbHZhYmxlLFxuICAgICAgICBvcHRpb25zOiBWb2ljZVJlY2VpdmVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGVuZDogRW5kQmVoYXZpb3JUeXBlLkFmdGVyU2lsZW5jZSxcbiAgICAgICAgICAgIG1vZGU6ICdwY20nLFxuICAgICAgICAgICAgc2lsZW5jZUR1cmF0aW9uOiAxMDAwXG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgY29uc3QgX3VzZXIgPSB0aGlzLmRpc3BhdGNoZXIucXVldWUucGxheWVyLmNsaWVudC51c2Vycy5yZXNvbHZlSWQodXNlcik7XG5cbiAgICAgICAgY29uc3QgcGFzc1Rocm91Z2ggPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgICAgY29uc3QgcmVjZWl2ZXIgPSB0aGlzLmRpc3BhdGNoZXIudm9pY2VDb25uZWN0aW9uLnJlY2VpdmVyO1xuXG4gICAgICAgIGlmICghcmVjZWl2ZXIpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFQ0VJVkVSKCk7XG5cbiAgICAgICAgcmVjZWl2ZXIuc3BlYWtpbmcub24oJ3N0YXJ0JywgKHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHVzZXJJZCA9PT0gX3VzZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWNlaXZlU3RyZWFtID0gcmVjZWl2ZXIuc3Vic2NyaWJlKF91c2VyLCB7XG4gICAgICAgICAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IG9wdGlvbnMuZW5kIHx8IEVuZEJlaGF2aW9yVHlwZS5BZnRlclNpbGVuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogb3B0aW9ucy5zaWxlbmNlRHVyYXRpb24gPz8gMTAwMFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09PSAncGNtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGNtID0gcmVjZWl2ZVN0cmVhbS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IChwcmlzbS5vcHVzIHx8ICg8YW55PnByaXNtKS5kZWZhdWx0Lm9wdXMpLkRlY29kZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsczogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplOiA5NjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGU6IDQ4MDAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGNtLnBpcGUocGFzc1Rocm91Z2gpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVTdHJlYW0ucGlwZShwYXNzVGhyb3VnaCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2ggYXMgUmVhZGFibGU7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyB0cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KCdMSUZPJyk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge31cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/Lm1ldGFkYXRhIHx8ICgodGhpcy5xdWV1ZSBhcyBhbnkpLl9fY3VycmVudCBhcyBUcmFjayB8IG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBuZXh0VHJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcHJldmlvdXNUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgaGlzdG9yeSBpcyBkaXNhYmxlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUhpc3Rvcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGhpc3RvcnkgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPCAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0cmFjayB0byB0cmFjayBoaXN0b3J5XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBhZGRcbiAgICAgKi9cbiAgICBwdWJsaWMgcHVzaCh0cmFjazogVHJhY2sgfCBUcmFja1tdKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudHJhY2tzLmFkZCh0cmFjayk7XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBoaXN0b3J5XG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnRyYWNrcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy5uZXh0VHJhY2s7XG4gICAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnTm8gbmV4dCB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVldWUubm9kZS5za2lwKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHByZXZpb3VzKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ05vIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgcHJlc2VydmVDdXJyZW50KSB0aGlzLnF1ZXVlLm5vZGUuaW5zZXJ0KGN1cnJlbnQsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsaWFzIHRvIFtHdWlsZFF1ZXVlSGlzdG9yeV0ucHJldmlvdXMoKVxuICAgICAqL1xuICAgIHB1YmxpYyBiYWNrKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXMocHJlc2VydmVDdXJyZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemUgaGlzdG9yeSBzdG9yZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNpemUoKSB7XG4gICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnRyYWNrcy5zdG9yZS5sZW5ndGggPCB0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSByZXR1cm47XG4gICAgICAgIHRoaXMudHJhY2tzLnN0b3JlLnNwbGljZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSwgU3RyZWFtVHlwZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyB3YWl0Rm9yIH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBDcmVhdGVTdHJlYW1PcHMgfSBmcm9tICcuLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcblxuZXhwb3J0IGNvbnN0IEZGTVBFR19TUkFURV9SRUdFWCA9IC9hc2V0cmF0ZT1cXGQrXFwqKFxcZChcXC5cXGQpPykvO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUGxheU9wdGlvbnMge1xuICAgIHF1ZXVlPzogYm9vbGVhbjtcbiAgICBzZWVrPzogbnVtYmVyO1xuICAgIHRyYW5zaXRpb25Nb2RlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJUaW1lc3RhbXAge1xuICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHRvdGFsOiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgfTtcbiAgICBwcm9ncmVzczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbUNvbmZpZyB7XG4gICAgZGlzcGF0Y2hlckNvbmZpZzogQ3JlYXRlU3RyZWFtT3BzO1xuICAgIHBsYXllckNvbmZpZzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGEgPSB1bmtub3duPiB7XG4gICAgI3Byb2dyZXNzID0gMDtcbiAgICBwdWJsaWMgdGFza3NRdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge31cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGluIGlkbGUgbW9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0lkbGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNJZGxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nIHRoZSB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBpc0J1ZmZlcmluZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0J1ZmZlcmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmcgYSB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQbGF5aW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkXG4gICAgICovXG4gICAgcHVibGljIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGF1c2VkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgcHJvZ3Jlc3MgaGlzdG9yeVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldFByb2dyZXNzKCkge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHBsYXllciBwcm9ncmVzc1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQcm9ncmVzcyhwcm9ncmVzczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gcHJvZ3Jlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVhbSB0aW1lIGZvciBjdXJyZW50IHNlc3Npb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnN0cmVhbVRpbWUgPz8gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHBsYXliYWNrIGR1cmF0aW9uIHdpdGggaGlzdG9yeSBpbmNsdWRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWJhY2tUaW1lKCkge1xuICAgICAgICBjb25zdCBkdXIgPSB0aGlzLiNwcm9ncmVzcyArIHRoaXMuc3RyZWFtVGltZTtcblxuICAgICAgICByZXR1cm4gZHVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBkdXJhdGlvbiBtdWx0aXBsaWVyXG4gICAgICovXG4gICAgcHVibGljIGdldER1cmF0aW9uTXVsdGlwbGllcigpIHtcbiAgICAgICAgY29uc3Qgc3JhdGVGaWx0ZXJzID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy50b0FycmF5KCkuZmlsdGVyKChmZikgPT4gRkZNUEVHX1NSQVRFX1JFR0VYLnRlc3QoZmYpKTtcbiAgICAgICAgY29uc3QgbXVsdGlwbGllcnMgPSBzcmF0ZUZpbHRlcnNcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChGRk1QRUdfU1JBVEVfUkVHRVguZXhlYyhtKT8uWzFdIGFzIHN0cmluZyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoZikgPT4gIWlzTmFOKGYpKTtcblxuICAgICAgICByZXR1cm4gIW11bHRpcGxpZXJzLmxlbmd0aCA/IDEgOiBtdWx0aXBsaWVycy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBjdXJyZW50ICsgYWNjdW11bGF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCBwcm9ncmVzcyBvZiB0aGUgcGxheWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWRQbGF5YmFja1RpbWUoKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IHRoaXMucGxheWJhY2tUaW1lO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLmdldER1cmF0aW9uTXVsdGlwbGllcigpICogZHVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgdG90YWwgZHVyYXRpb24gb2YgdGhlIHBsYXllclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IHRoaXMudG90YWxEdXJhdGlvbjtcblxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkdXIgLyB0aGlzLmdldER1cmF0aW9uTXVsdGlwbGllcigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxEdXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgcHJlZmVyc0JyaWRnZWRNZXRhZGF0YSA9IHRoaXMucXVldWUub3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGE7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG5cbiAgICAgICAgaWYgKHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEgJiYgdHJhY2s/Lm1ldGFkYXRhICE9IG51bGwgJiYgdHlwZW9mIHRyYWNrLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJiAnYnJpZGdlJyBpbiB0cmFjay5tZXRhZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSAoXG4gICAgICAgICAgICAgICAgdHJhY2sgYXMgVHJhY2s8e1xuICAgICAgICAgICAgICAgICAgICBicmlkZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICkubWV0YWRhdGE/LmJyaWRnZS5kdXJhdGlvbjtcblxuICAgICAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKGR1cmF0aW9uKSkgcmV0dXJuIGR1cmF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRyYWNrPy5kdXJhdGlvbk1TID8/IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHN0cmVhbSBwcm9ncmVzc1xuICAgICAqIEBwYXJhbSBpZ25vcmVGaWx0ZXJzIElnbm9yZSBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldFRpbWVzdGFtcChpZ25vcmVGaWx0ZXJzID0gZmFsc2UpOiBQbGF5ZXJUaW1lc3RhbXAgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IGlnbm9yZUZpbHRlcnMgPyB0aGlzLnBsYXliYWNrVGltZSA6IHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lO1xuICAgICAgICBjb25zdCB0b3RhbCA9IGlnbm9yZUZpbHRlcnMgPyB0aGlzLnRvdGFsRHVyYXRpb24gOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjdXJyZW50OiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVMoY3VycmVudCkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjdXJyZW50XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdG90YWw6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0b3RhbCkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0b3RhbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb2dyZXNzOiBNYXRoLnJvdW5kKChjdXJyZW50IC8gdG90YWwpICogMTAwKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBwcm9ncmVzcyBiYXIgZm9yIGN1cnJlbnQgcHJvZ3Jlc3NcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQcm9ncmVzcyBiYXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQcm9ncmVzc0JhcihvcHRpb25zPzogUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuZ2V0VGltZXN0YW1wKCk7XG4gICAgICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBpbmRpY2F0b3IgPSAnXFx1ezFGNTE4fScsIGxlZnRDaGFyID0gJ1xcdTI1QUMnLCByaWdodENoYXIgPSAnXFx1MjVBQycsIGxlbmd0aCA9IDE1LCB0aW1lY29kZXMgPSB0cnVlLCBzZXBhcmF0b3IgPSAnXFx1MjUwMycgfSA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpIHx8IGxlbmd0aCA8IDAgfHwgIU51bWJlci5pc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfUkFOR0UoJ1tQbGF5ZXJQcm9ncmVzc0Jhck9wdGlvbnMubGVuZ3RoXScsIFN0cmluZyhsZW5ndGgpLCAnMCcsICdGaW5pdGUgTnVtYmVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKCh0aW1lc3RhbXAuY3VycmVudC52YWx1ZSAvIHRpbWVzdGFtcC50b3RhbC52YWx1ZSkgKiBsZW5ndGgpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMSAmJiBpbmRleCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhciA9IGxlZnRDaGFyLnJlcGVhdChpbmRleCAtIDEpLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIGJhci5wdXNoKGluZGljYXRvcik7XG4gICAgICAgICAgICBiYXIucHVzaChyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIGluZGV4KSk7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtiYXIuam9pbignJyl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YmFyLmpvaW4oJycpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIDEpfSAke3NlcGFyYXRvcn0gJHt0aW1lc3RhbXAudG90YWwubGFiZWx9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2luZGljYXRvcn0ke3JpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gMSl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlZWsgdGhlIHBsYXllclxuICAgICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZWVrKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWV1ZS5maWx0ZXJzLnRyaWdnZXJSZXBsYXkoZHVyYXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdm9sdW1lXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnZvbHVtZSA/PyAxMDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHZvbHVtZVxuICAgICAqIEBwYXJhbSB2b2wgVm9sdW1lIGFtb3VudCB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMucXVldWUuZGlzcGF0Y2hlci5zZXRWb2x1bWUodm9sKTtcbiAgICAgICAgaWYgKHJlcykgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHZvbDtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYml0IHJhdGVcbiAgICAgKiBAcGFyYW0gcmF0ZSBUaGUgYml0IHJhdGUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldEJpdHJhdGUocmF0ZTogbnVtYmVyIHwgJ2F1dG8nKSB7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8uZW5jb2Rlcj8uc2V0Qml0cmF0ZShyYXRlID09PSAnYXV0bycgPyB0aGlzLnF1ZXVlLmNoYW5uZWw/LmJpdHJhdGUgPz8gNjQwMDAgOiByYXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcGF1c2VkIHN0YXRlXG4gICAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQYXVzZWQoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHN0YXRlKSByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5wYXVzZSh0cnVlKSB8fCBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzdW1lKCkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHBhdXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBwbGF5YmFja1xuICAgICAqL1xuICAgIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFBhdXNlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCBjdXJyZW50IHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNraXAoKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBnaXZlbiB0cmFjayBmcm9tIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgZm91bmRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmZpbmQoKHQsIGlkeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2sgfHwgdHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgICAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFmb3VuZFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHQuaWQgPT09IGZvdW5kVHJhY2suaWQpO1xuXG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja1JlbW92ZSwgdGhpcy5xdWV1ZSwgZm91bmRUcmFjayk7XG5cbiAgICAgICAgcmV0dXJuIGZvdW5kVHJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSnVtcCB0byBzcGVjaWZpYyB0cmFjayBvbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGp1bXAgdG8gd2l0aG91dCByZW1vdmluZyBvdGhlciB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMganVtcCh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZSh0cmFjayk7XG4gICAgICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS51bnNoaWZ0KHJlbW92ZWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lwKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRyYWNrIHBvc2l0aW9uXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUcmFja1Bvc2l0aW9uKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MudG9BcnJheSgpLmZpbmRJbmRleCgodCwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNraXAgdG8gdGhlIGdpdmVuIHRyYWNrLCByZW1vdmluZyBvdGhlcnMgb24gdGhlIHdheVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gc2tpcCB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBza2lwVG8odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLmdldFRyYWNrUG9zaXRpb24odHJhY2spO1xuICAgICAgICBpZiAoaWR4IDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoaWR4KTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuZmlsdGVyKChfLCBpKSA9PiBpIDw9IGlkeCk7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZSgwLCBpZHgsIHJlbW92ZWQpO1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvVHJhY2tzUmVtb3ZlLCB0aGlzLnF1ZXVlLCB0b1JlbW92ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSB0cmFjayBvbiB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRvLCBkZWZhdWx0cyB0byAwLlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnNlcnQodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApIHtcbiAgICAgICAgaWYgKCEodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3RyYWNrIHZhbHVlJywgJ2luc3RhbmNlIG9mIFRyYWNrJywgU3RyaW5nKHRyYWNrKSk7XG4gICAgICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja0FkZCwgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGZyb20pO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCB0cmFjayB0byBtb3ZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNlcnQocmVtb3ZlZCwgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAgICovXG4gICAgcHVibGljIGNvcHkoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMucXVldWUudHJhY2tzLmF0KHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmcm9tKSk7XG4gICAgICAgIGlmICghc3JjKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgdHJhY2sgdG8gY29weScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zZXJ0KHNyYywgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgICAqL1xuICAgIHB1YmxpYyBzd2FwKGZpcnN0OiBUcmFja1Jlc29sdmFibGUsIHNlY29uZDogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmaXJzdCk7XG4gICAgICAgIGlmIChzcmMgPCAwKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgICAgICBjb25zdCBkZXN0ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHNlY29uZCk7XG4gICAgICAgIGlmIChkZXN0IDwgMCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdpbnZhbGlkIGRlc3QgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgICAgIGNvbnN0IHNyY1QgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdO1xuICAgICAgICBjb25zdCBkZXN0VCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY10gPSBkZXN0VDtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF0gPSBzcmNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3AgdGhlIHBsYXliYWNrXG4gICAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgb3Igbm90IHRvIGZvcmNlZnVsbHkgc3RvcCB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpIHx8IHRoaXMucXVldWUudHJhY2tzLnNpemUpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZGVzdHJveSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24pLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSByYXcgYXVkaW8gcmVzb3VyY2VcbiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheVJhdyhyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBsYXlTdHJlYW0ocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIHJlcyBUaGUgdHJhY2sgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXlpbmcgdGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXkocmVzPzogVHJhY2sgfCBudWxsLCBvcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DT05ORUNUSU9OKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgUmVjZWl2ZWQgcGxheSByZXF1ZXN0IGZyb20gZ3VpbGQgJHt0aGlzLnF1ZXVlLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLnF1ZXVlLmd1aWxkLmlkfSlgKTtcblxuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjayAhPSBudWxsLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrOiAwXG4gICAgICAgICAgICB9IGFzIFJlc291cmNlUGxheU9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICkhO1xuXG4gICAgICAgIGlmIChyZXMgJiYgb3B0aW9ucy5xdWV1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcXVldWUgdGhlIHRyYWNrLCBhZGRpbmcgdGhlIGdpdmVuIHRyYWNrIHRvIHF1ZXVlIGluc3RlYWQuLi4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFjayA9IHJlcyB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLnNraXBPbk5vU3RyZWFtKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcGxheSB0aGUgdHJhY2ssIGluaXRpYWxpemluZy4uLicpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgSW5pdGlhdGluZyBzdHJlYW0gZXh0cmFjdGlvbiBwcm9jZXNzLi4uYCk7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSB0cmFjay5yYXc/LnNvdXJjZSB8fCB0cmFjay5zb3VyY2U7XG4gICAgICAgICAgICBjb25zdCBxdDogU2VhcmNoUXVlcnlUeXBlID0gdHJhY2sucXVlcnlUeXBlIHx8IChzcmMgPT09ICdzcG90aWZ5JyA/ICdzcG90aWZ5U29uZycgOiBzcmMgPT09ICdhcHBsZV9tdXNpYycgPyAnYXBwbGVNdXNpY1NvbmcnIDogc3JjKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gKTtcblxuICAgICAgICAgICAgY29uc3Qgc3RyZWFtU3JjID0ge1xuICAgICAgICAgICAgICAgIGVycm9yOiBudWxsIGFzIEVycm9yIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBzdHJlYW06IG51bGwgYXMgUmVhZGFibGUgfCBudWxsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm9uQmVmb3JlQ3JlYXRlU3RyZWFtPy4odHJhY2ssIHF0IHx8ICdhcmJpdHJhcnknLCB0aGlzLnF1ZXVlKS50aGVuKFxuICAgICAgICAgICAgICAgIChzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGU6IEVycm9yKSA9PiAoc3RyZWFtU3JjLmVycm9yID0gZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgICAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdGYWlsZWQgdG8gZ2V0IHN0cmVhbSBmcm9tIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIScpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2spLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgIChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocj8ucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IDxSZWFkYWJsZT5yLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyPy5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5lcnJvciA9IHIuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKGU6IEVycm9yKSA9PiAoc3RyZWFtU3JjLmVycm9yID0gZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHJldHVybiB0aGlzLiN0aHJvdyh0cmFjaywgc3RyZWFtU3JjLmVycm9yKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNlZWsgPT09ICdudW1iZXInICYmIG9wdGlvbnMuc2VlayA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBvcHRpb25zLnNlZWs7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIGNvbnN0IGNvb2tpZXMgPSB0cmFjay5yYXc/LnNvdXJjZSA9PT0gJ3lvdXR1YmUnID8gKDxhbnk+dGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy55dGRsT3B0aW9ucz8ucmVxdWVzdE9wdGlvbnMpPy5oZWFkZXJzPy5jb29raWUgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVTdHJlYW1Db25maWcgPSB7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUJpcXVhZDogdGhpcy5xdWV1ZS5vcHRpb25zLmJpcXVhZCA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgZGlzYWJsZUVxdWFsaXplcjogdGhpcy5xdWV1ZS5vcHRpb25zLmVxdWFsaXplciA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgZGlzYWJsZVZvbHVtZTogdGhpcy5xdWV1ZS5vcHRpb25zLnZvbHVtZSA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgZGlzYWJsZUZpbHRlcnM6IHRoaXMucXVldWUub3B0aW9ucy5maWx0ZXJlciA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgZGlzYWJsZVJlc2FtcGxlcjogdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA9PT0gZmFsc2UsXG4gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTogdHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPT09ICdudW1iZXInICYmIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPiAwID8gdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBiaXF1YWRGaWx0ZXI6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVxOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyxcbiAgICAgICAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgZGF0YTogdHJhY2ssXG4gICAgICAgICAgICAgICAgdHlwZTogU3RyZWFtVHlwZS5SYXdcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYWNrU3RyZWFtQ29uZmlnOiBTdHJlYW1Db25maWcgPSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hlckNvbmZpZzogY3JlYXRlU3RyZWFtQ29uZmlnLFxuICAgICAgICAgICAgICAgIHBsYXllckNvbmZpZzogb3B0aW9uc1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IHJlc29sdmVyOiAoKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gKHJlc29sdmVyID0gcmVzb2x2ZSkpO1xuXG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC53aWxsUGxheVRyYWNrLCB0aGlzLnF1ZXVlLCB0cmFjaywgdHJhY2tTdHJlYW1Db25maWcsIHJlc29sdmVyISk7XG5cbiAgICAgICAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSByZXNvbHZlcigpO1xuXG4gICAgICAgICAgICBhd2FpdCBkb25lUHJvbWlzZTtcblxuICAgICAgICAgICAgY29uc3QgcGNtU3RyZWFtID0gdGhpcy4jY3JlYXRlRkZtcGVnU3RyZWFtKHN0cmVhbVNyYy5zdHJlYW0sIHRyYWNrLCBvcHRpb25zLnNlZWsgPz8gMCwgY29va2llcyk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25Nb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFRyYW5zaXRpb24gbW9kZSBkZXRlY3RlZCwgcGxheWVyIHdpbGwgd2FpdCBmb3IgYnVmZmVyaW5nIHRpbWVvdXQgdG8gZXhwaXJlIChUaW1lb3V0OiAke3RoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0fW1zKWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhaXRGb3IodGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdCdWZmZXJpbmcgdGltZW91dCBoYXMgZXhwaXJlZCEnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFByZXBhcmluZyBmaW5hbCBzdHJlYW0gY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KHRyYWNrU3RyZWFtQ29uZmlnLCBudWxsLCAyKX1gKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuY3JlYXRlU3RyZWFtKHBjbVN0cmVhbSwgY3JlYXRlU3RyZWFtQ29uZmlnKTtcblxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKCEhb3B0aW9ucy50cmFuc2l0aW9uTW9kZSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3BlcmZvcm1QbGF5KHJlc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEZhaWxlZCB0byBpbml0aWFsaXplIGF1ZGlvIHBsYXllcjogJHtlfWApO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICN0aHJvdyh0cmFjazogVHJhY2ssIGVycm9yPzogRXJyb3IgfCBudWxsKSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjb25zdCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQgPSAoXG4gICAgICAgICAgICBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoYENvdWxkIG5vdCBleHRyYWN0IHN0cmVhbSBmb3IgdGhpcyB0cmFjayR7ZXJyb3IgPyBgXFxuXFxuJHtlcnJvci5zdGFjayB8fCBlcnJvcn1gIDogJyd9YClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLnNraXBPbk5vU3RyZWFtKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclNraXAsIHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyRXJyb3IsIHRoaXMucXVldWUsIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCwgdHJhY2spO1xuICAgICAgICAgICAgY29uc3QgbmV4dFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgICAgIGlmIChuZXh0VHJhY2spIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0O1xuICAgIH1cblxuICAgIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYWxpemluZyBhdWRpbyBwbGF5ZXIuLi4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyIS5wbGF5U3RyZWFtKHJlc291cmNlKTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc3BhdGNoaW5nIGF1ZGlvLi4uJyk7XG4gICAgfVxuXG4gICAgYXN5bmMgI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZSgoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY2FuU3RyZWFtID0gYXdhaXQgZXh0cmFjdG9yLnZhbGlkYXRlKHRyYWNrLnVybCwgdHJhY2sucXVlcnlUeXBlIHx8IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZSh0cmFjay51cmwpLnR5cGUpO1xuICAgICAgICAgICAgaWYgKCFjYW5TdHJlYW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKHRyYWNrKTtcbiAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8ucmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgKTtcbiAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYFN0cmVhbSBleHRyYWN0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSAoRXh0cmFjdG9yOiAke3N0cmVhbUluZm8uZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnfSlgKTtcblxuICAgICAgICByZXR1cm4gc3RyZWFtSW5mbztcbiAgICB9XG5cbiAgICAjY3JlYXRlRkZtcGVnU3RyZWFtKHN0cmVhbTogUmVhZGFibGUgfCBzdHJpbmcsIHRyYWNrOiBUcmFjaywgc2VlayA9IDAsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmZtcGVnU3RyZWFtID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZ1xuICAgICAgICAgICAgLmNyZWF0ZVN0cmVhbShzdHJlYW0sIHtcbiAgICAgICAgICAgICAgICBlbmNvZGVyQXJnczogdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5hcmdzLFxuICAgICAgICAgICAgICAgIHNlZWs6IHNlZWsgLyAxMDAwLFxuICAgICAgICAgICAgICAgIGZtdDogJ3MxNmxlJyxcbiAgICAgICAgICAgICAgICBjb29raWVzLFxuICAgICAgICAgICAgICAgIHVzZUxlZ2FjeUZGbXBlZzogISF0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnVzZUxlZ2FjeUZGbXBlZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbSA9IGAke2Vycn1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgU3RyZWFtIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IgZnJvbSBGRm1wZWcgc3RyZWFtOiAke2Vyci5zdGFjayB8fCBlcnIubWVzc2FnZSB8fCBlcnJ9YCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobS5pbmNsdWRlcygncHJlbWF0dXJlIGNsb3NlJykgfHwgbS5pbmNsdWRlcygnZXBpcGUnKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJFcnJvciwgdGhpcy5xdWV1ZSwgZXJyLCB0cmFjayk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmZtcGVnU3RyZWFtO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8vICNyZWdpb24gc2NhcnkgdGhpbmdzIGJlbG93ICpzaWdoKlxuY29uc3Qgc3BvdGlmeVNvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86dHJhY2tcXC98XFw/dXJpPXNwb3RpZnk6dHJhY2s6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeVBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnBsYXlsaXN0XFwvfFxcP3VyaT1zcG90aWZ5OnBsYXlsaXN0OikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlBbGJ1bVJlZ2V4ID0gL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzphbGJ1bVxcL3xcXD91cmk9c3BvdGlmeTphbGJ1bTopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCB2aW1lb1JlZ2V4ID0gL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9IC9eaHR0cHM6XFwvXFwvKHd3dy4pP3JldmVyYm5hdGlvbi5jb21cXC8oLispXFwvc29uZ1xcLyguKykkLztcbmNvbnN0IGF0dGFjaG1lbnRSZWdleCA9IC9eaHR0cHM/OlxcL1xcLy4rJC87XG5jb25zdCBhcHBsZU11c2ljU29uZ1JlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcLyhzb25nfGFsYnVtKVxcLy4rPyhcXC8uKz9cXD9pPXxcXC8pKFswLTldKykkLztcbmNvbnN0IGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LSk/W2EtekEtWjAtOV0rJC87XG5jb25zdCBhcHBsZU11c2ljQWxidW1SZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC9hbGJ1bVxcLy4rXFwvKFswLTldKykkLztcbmNvbnN0IHNvdW5kY2xvdWRUcmFja1JlZ2V4ID0gL15odHRwcz86XFwvXFwvKG0ufHd3dy4pP3NvdW5kY2xvdWQuY29tXFwvKFxcd3wtKStcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvc2V0c1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHlvdXR1YmVQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvKHd3dy4pP3lvdXR1YmUuY29tXFwvcGxheWxpc3RcXD9saXN0PSgoUEx8Rkx8VVV8TEx8UkR8T0wpW2EtekEtWjAtOS1fXXsxNiw0MX0pJC87XG5jb25zdCB5b3V0dWJlVmlkZW9VUkxSZWdleCA9IC9eKCg/Omh0dHBzPzopP1xcL1xcLyk/KCg/Ond3d3xtKVxcLik/KCg/OnlvdXR1YmVcXC5jb218eW91dHUuYmUpKShcXC8oPzpbXFx3LV0rXFw/dj18ZW1iZWRcXC98dlxcLyk/KShbXFx3LV0rKShcXFMrKT8kLztcbmNvbnN0IHlvdXR1YmVWaWRlb0lkUmVnZXggPSAvXlthLXpBLVowLTktX117MTF9JC87XG4vLyAjZW5kcmVnaW9uIHNjYXJ5IHRoaW5ncyBhYm92ZSAqc2lnaCpcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFF1ZXJ5IHtcbiAgICB0eXBlOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG4gICAgcXVlcnk6IHN0cmluZztcbn1cblxuY2xhc3MgUXVlcnlSZXNvbHZlciB7XG4gICAgLyoqXG4gICAgICogUXVlcnkgcmVzb2x2ZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAgIHN0YXRpYyBnZXQgcmVnZXgoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcG90aWZ5QWxidW1SZWdleCxcbiAgICAgICAgICAgIHNwb3RpZnlQbGF5bGlzdFJlZ2V4LFxuICAgICAgICAgICAgc3BvdGlmeVNvbmdSZWdleCxcbiAgICAgICAgICAgIHZpbWVvUmVnZXgsXG4gICAgICAgICAgICByZXZlcmJuYXRpb25SZWdleCxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRSZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljU29uZ1JlZ2V4LFxuICAgICAgICAgICAgc291bmRjbG91ZFRyYWNrUmVnZXgsXG4gICAgICAgICAgICBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIHlvdXR1YmVQbGF5bGlzdFJlZ2V4XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIGdpdmVuIHNlYXJjaCBxdWVyeVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZShxdWVyeTogc3RyaW5nLCBmYWxsYmFja1NlYXJjaEVuZ2luZTogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdID0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIKTogUmVzb2x2ZWRRdWVyeSB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcbiAgICAgICAgaWYgKCFxdWVyeS5sZW5ndGgpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lORk9fUkVRVUlSRUQoJ3F1ZXJ5JywgU3RyaW5nKHF1ZXJ5KSk7XG5cbiAgICAgICAgLy8gc2FuaXRpemUgcXVlcnlcbiAgICAgICAgaWYgKHF1ZXJ5LmluY2x1ZGVzKCd5b3V0dWJlLmNvbScpKSBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoLyhtKHVzaWMpP3xnYW1pbmcpXFwuLywgJycpLnRyaW0oKTtcbiAgICAgICAgaWYgKHF1ZXJ5LmluY2x1ZGVzKCdzcG90aWZ5LmNvbScpKSBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoL2ludGwtKFthLXpBLVpdKylcXC8vLCAnJyk7XG4gICAgICAgIGlmIChxdWVyeS5pbmNsdWRlcygneW91dHViZS5jb20nKSAmJiBxdWVyeS5pbmNsdWRlcygnJmxpc3Q9JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gcXVlcnkuc3BsaXQoJyZsaXN0PScpWzFdPy5zcGxpdCgnJicpPy5bMF07XG4gICAgICAgICAgICBpZiAoaWQpIHF1ZXJ5ID0gYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9JHtpZH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSAodHlwZTogdHlwZW9mIGZhbGxiYWNrU2VhcmNoRW5naW5lKSA9PiAoeyB0eXBlLCBxdWVyeSB9KTtcblxuICAgICAgICBpZiAoc291bmRjbG91ZFBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9QTEFZTElTVCk7XG4gICAgICAgIGlmIChzb3VuZGNsb3VkVHJhY2tSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TT1VORENMT1VEX1RSQUNLKTtcbiAgICAgICAgaWYgKHNwb3RpZnlQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfUExBWUxJU1QpO1xuICAgICAgICBpZiAoc3BvdGlmeUFsYnVtUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9BTEJVTSk7XG4gICAgICAgIGlmIChzcG90aWZ5U29uZ1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfU09ORyk7XG4gICAgICAgIGlmICh5b3V0dWJlUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNUKTtcbiAgICAgICAgaWYgKFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVJZChxdWVyeSkgfHwgUXVlcnlSZXNvbHZlci52YWxpZGF0ZVVSTChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuWU9VVFVCRV9WSURFTyk7XG4gICAgICAgIGlmICh2aW1lb1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlZJTUVPKTtcbiAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlJFVkVSQk5BVElPTik7XG4gICAgICAgIGlmIChhcHBsZU11c2ljQWxidW1SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19BTEJVTSk7XG4gICAgICAgIGlmIChhcHBsZU11c2ljUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19QTEFZTElTVCk7XG4gICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkcpO1xuICAgICAgICBpZiAoYXR0YWNobWVudFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFSQklUUkFSWSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdmltZW8gaWQgZnJvbSB1cmxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBRdWVyeVJlc29sdmVyLnJlc29sdmUocXVlcnkpLnR5cGUgPT09IFF1ZXJ5VHlwZS5WSU1FT1xuICAgICAgICAgICAgPyBxdWVyeVxuICAgICAgICAgICAgICAgICAgLnNwbGl0KCcvJylcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+ICEheClcbiAgICAgICAgICAgICAgICAgIC5wb3AoKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyB2YWxpZGF0ZUlkKHE6IHN0cmluZykge1xuICAgICAgICByZXR1cm4geW91dHViZVZpZGVvSWRSZWdleC50ZXN0KHEpO1xuICAgIH1cblxuICAgIHN0YXRpYyB2YWxpZGF0ZVVSTChxOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHlvdXR1YmVWaWRlb1VSTFJlZ2V4LnRlc3QocSk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBRdWVyeVJlc29sdmVyIH07XG4iLCAiaW1wb3J0IHsgU25vd2ZsYWtlVXRpbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFib3J0U2lnbmFsIHRvIGNhbmNlbCB0aGlzIGVudHJ5XG4gICAgICovXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmV4cG9ydCB0eXBlIEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyID0gKGV4Y2VwdGlvbjogRXJyb3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcXVldWVkIGVudHJpZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZW50cmllczogQXJyYXk8QXN5bmNRdWV1ZUVudHJ5PiA9IFtdO1xuXG4gICAgcHVibGljIGV4Y2VwdGlvbkhhbmRsZXI/OiBBc3luY1F1ZXVlRXhjZXB0aW9uSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGVudHJpZXMgcXVldWVcbiAgICAgKiBAcGFyYW0gY29uc3VtZSBXaGV0aGVyIG9yIG5vdCB0byBjb25zdW1lIGFsbCBlbnRyaWVzIGJlZm9yZSBjbGVhcmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcihjb25zdW1lID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGNvbnN1bWUpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY29uc3VtZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHF1ZXVlLiBSZXR1cm5zIGAwYCBpZiBubyBlbnRyaWVzIGFyZSBhdmFpbGFibGUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBY3F1aXJlIGFuIGVudHJ5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgLy8gbG9jayB0aGUgcXVldWVcbiAgICAgKiBjb25zdCBlbnRyeSA9IGFzeW5jUXVldWUuYWNxdWlyZSgpO1xuICAgICAqIC8vIHdhaXQgdW50aWwgcHJldmlvdXMgdGFzayBpcyBjb21wbGV0ZWRcbiAgICAgKiBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICogLy8gZG8gc29tZXRoaW5nIGV4cGVuc2l2ZVxuICAgICAqIGF3YWl0IHBlcmZvcm1Tb21ldGhpbmdFeHBlbnNpdmUoKTtcbiAgICAgKiAvLyBtYWtlIHN1cmUgdG8gcmVsZWFzZSB0aGUgbG9jayBvbmNlIGRvbmVcbiAgICAgKiBhc3luY1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgKlxuICAgICAqL1xuICAgIHB1YmxpYyBhY3F1aXJlKG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IEFzeW5jUXVldWVFbnRyeSh0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodGhpcy5leGNlcHRpb25IYW5kbGVyKSBlbnRyeS5nZXRUYXNrKCkuY2F0Y2godGhpcy5leGNlcHRpb25IYW5kbGVyKTtcblxuICAgICAgICBpZiAodGhpcy5lbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgZW50cnkuY29uc3VtZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZSB0aGUgY3VycmVudCBhY3F1aXNpdGlvbiBhbmQgbW92ZSB0byBuZXh0IGVudHJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2hpZnQoKTtcbiAgICAgICAgdGhpcy5lbnRyaWVzWzBdPy5jb25zdW1lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIGFsbCBlbnRyaWVzXG4gICAgICovXG4gICAgcHVibGljIGNhbmNlbEFsbCgpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jYW5jZWwoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBnaXZlbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUVudHJ5KGVudHJ5OiBBc3luY1F1ZXVlRW50cnkpIHtcbiAgICAgICAgY29uc3QgZW50cnlJZHggPSB0aGlzLmVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG5cbiAgICAgICAgaWYgKGVudHJ5SWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShlbnRyeUlkeCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlRW50cnkge1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgICBwdWJsaWMgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvbkFib3J0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHJlc29sdmUhOiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgcmVqZWN0ITogKGVycjogRXJyb3IpID0+IHZvaWQ7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBBc3luY1F1ZXVlLCBwdWJsaWMgb3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zPy5zaWduYWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWJvcnRTaWduYWwodGhpcy5vcHRpb25zLnNpZ25hbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWJvcnRTaWduYWwoc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5zaWduYWwgPSBzaWduYWw7XG4gICAgICAgIHRoaXMub25BYm9ydCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVldWUucmVtb3ZlRW50cnkodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3VtZSgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIHRoaXMucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWxlYXNlKCkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcignQ2FuY2VsbGVkJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbnVwKCkge1xuICAgICAgICBpZiAodGhpcy5vbkFib3J0KSB0aGlzLnNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IG51bGw7XG4gICAgICAgIHRoaXMub25BYm9ydCA9IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRhc2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZUZpbHRlcnMgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBBdWRpb0ZpbHRlcnMgfSBmcm9tICcuLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplciwgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgRkZtcGVnU3RyZWFtT3B0aW9ucywgY3JlYXRlRkZtcGVnU3RyZWFtIH0gZnJvbSAnLi4vdXRpbHMvRkZtcGVnU3RyZWFtJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG50eXBlIEZpbHRlcnMgPSBrZXlvZiB0eXBlb2YgQXVkaW9GaWx0ZXJzLmZpbHRlcnM7XG5cbmNvbnN0IG1ha2VCYW5kcyA9IChhcnI6IG51bWJlcltdKSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxlbmd0aDogRXF1YWxpemVyLkJBTkRfQ09VTlRcbiAgICAgICAgfSxcbiAgICAgICAgKF8sIGkpID0+ICh7XG4gICAgICAgICAgICBiYW5kOiBpLFxuICAgICAgICAgICAgZ2FpbjogYXJyW2ldID8gYXJyW2ldIC8gMzAgOiAwXG4gICAgICAgIH0pXG4gICAgKSBhcyBFcXVhbGl6ZXJCYW5kW107XG59O1xuXG50eXBlIEVRUHJlc2V0ID0ge1xuICAgIEZsYXQ6IEVxdWFsaXplckJhbmRbXTtcbiAgICBDbGFzc2ljYWw6IEVxdWFsaXplckJhbmRbXTtcbiAgICBDbHViOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgRGFuY2U6IEVxdWFsaXplckJhbmRbXTtcbiAgICBGdWxsQmFzczogRXF1YWxpemVyQmFuZFtdO1xuICAgIEZ1bGxCYXNzVHJlYmxlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgRnVsbFRyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIEhlYWRwaG9uZXM6IEVxdWFsaXplckJhbmRbXTtcbiAgICBMYXJnZUhhbGw6IEVxdWFsaXplckJhbmRbXTtcbiAgICBMaXZlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgUGFydHk6IEVxdWFsaXplckJhbmRbXTtcbiAgICBQb3A6IEVxdWFsaXplckJhbmRbXTtcbiAgICBSZWdnYWU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBSb2NrOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgU2thOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgU29mdDogRXF1YWxpemVyQmFuZFtdO1xuICAgIFNvZnRSb2NrOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgVGVjaG5vOiBFcXVhbGl6ZXJCYW5kW107XG59O1xuXG5leHBvcnQgY29uc3QgRXF1YWxpemVyQ29uZmlndXJhdGlvblByZXNldDogUmVhZG9ubHk8RVFQcmVzZXQ+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgICBDbGFzc2ljYWw6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTcuMiwgLTcuMiwgLTcuMiwgLTkuNl0pLFxuICAgIENsdWI6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIDguMCwgNS42LCA1LjYsIDUuNiwgMy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgRGFuY2U6IG1ha2VCYW5kcyhbOS42LCA3LjIsIDIuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC03LjIsIC03LjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgRnVsbEJhc3M6IG1ha2VCYW5kcyhbLTguMCwgOS42LCA5LjYsIDUuNiwgMS42LCAtNC4wLCAtOC4wLCAtMTAuNCwgLTExLjIsIC0xMS4yXSksXG4gICAgRnVsbEJhc3NUcmVibGU6IG1ha2VCYW5kcyhbNy4yLCA1LjYsIC0xLjExMDIyZS0xNSwgLTcuMiwgLTQuOCwgMS42LCA4LjAsIDExLjIsIDEyLjAsIDEyLjBdKSxcbiAgICBGdWxsVHJlYmxlOiBtYWtlQmFuZHMoWy05LjYsIC05LjYsIC05LjYsIC00LjAsIDIuNCwgMTEuMiwgMTYuMCwgMTYuMCwgMTYuMCwgMTYuOF0pLFxuICAgIEhlYWRwaG9uZXM6IG1ha2VCYW5kcyhbNC44LCAxMS4yLCA1LjYsIC0zLjIsIC0yLjQsIDEuNiwgNC44LCA5LjYsIDEyLjgsIDE0LjRdKSxcbiAgICBMYXJnZUhhbGw6IG1ha2VCYW5kcyhbMTAuNCwgMTAuNCwgNS42LCA1LjYsIC0xLjExMDIyZS0xNSwgLTQuOCwgLTQuOCwgLTQuOCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBMaXZlOiBtYWtlQmFuZHMoWy00LjgsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDUuNiwgNS42LCA0LjAsIDIuNCwgMi40LCAyLjRdKSxcbiAgICBQYXJ0eTogbWFrZUJhbmRzKFs3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjJdKSxcbiAgICBQb3A6IG1ha2VCYW5kcyhbLTEuNiwgNC44LCA3LjIsIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0yLjQsIC0xLjYsIC0xLjZdKSxcbiAgICBSZWdnYWU6IG1ha2VCYW5kcyhbLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIFJvY2s6IG1ha2VCYW5kcyhbOC4wLCA0LjgsIC01LjYsIC04LjAsIC0zLjIsIDQuMCwgOC44LCAxMS4yLCAxMS4yLCAxMS4yXSksXG4gICAgU2thOiBtYWtlQmFuZHMoWy0yLjQsIC00LjgsIC00LjAsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDguOCwgOS42LCAxMS4yLCA5LjZdKSxcbiAgICBTb2Z0OiBtYWtlQmFuZHMoWzQuOCwgMS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0xLjExMDIyZS0xNSwgNC4wLCA4LjAsIDkuNiwgMTEuMiwgMTIuMF0pLFxuICAgIFNvZnRSb2NrOiBtYWtlQmFuZHMoWzQuMCwgNC4wLCAyLjQsIC0xLjExMDIyZS0xNSwgLTQuMCwgLTUuNiwgLTMuMiwgLTEuMTEwMjJlLTE1LCAyLjQsIDguOF0pLFxuICAgIFRlY2hubzogbWFrZUJhbmRzKFs4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNC44LCAtMS4xMTAyMmUtMTUsIDguMCwgOS42LCA5LjYsIDguOF0pXG59KTtcblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSB1bmtub3duPiB7XG4gICAgI2ZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAgICNpbnB1dEFyZ3M6IHN0cmluZ1tdID0gW107XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAgICNzZXRGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlIH0gPSB0aGlzLmFmO1xuICAgICAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgICAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJiAhZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJyk7XG4gICAgICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IFsuLi5uZXcgU2V0KGZpbHRlcnMpXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICAgICAgICBxdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb0ZpbHRlcnNVcGRhdGUsIHF1ZXVlLCBwcmV2LCB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBpbnB1dCBhcmdzIGZvciBGRm1wZWdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SW5wdXRBcmdzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICAgICAgdGhpcy4jaW5wdXRBcmdzID0gYXJncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW5wdXQgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5wdXRBcmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVuY29kZXJBcmdzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVycy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYXJncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRBcmdzLmNvbmNhdCh0aGlzLmVuY29kZXJBcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmZtcGVnIHN0cmVhbVxuICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU3RyZWFtKHNvdXJjZTogc3RyaW5nIHwgUmVhZGFibGUsIG9wdGlvbnM6IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuI2lucHV0QXJncy5sZW5ndGgpIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbLi4udGhpcy4jaW5wdXRBcmdzLCAuLi4ob3B0aW9ucy5lbmNvZGVyQXJncyB8fCBbXSldO1xuICAgICAgICByZXR1cm4gY3JlYXRlRkZtcGVnU3RyZWFtKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGZmbXBlZyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBib29sZWFuKSB7XG4gICAgICAgIGxldCBfZmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID8gW10gOiAoT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhmaWx0ZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSBmaWx0ZXJzID0gW2ZpbHRlcnNdO1xuICAgICAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICAgICAgICBmcmVzaC5wdXNoKGYpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyh0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmYgRmlsdGVycyBsaXN0XG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IGZmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGVuYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMubmFtZXMuZmlsdGVyKChmKSA9PiAhdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBlbmFibGVkXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRW5hYmxlZChmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSB2YWxpZCBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogc3RyaW5nKTogZmlsdGVyIGlzIEZpbHRlcnNOYW1lIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5oYXMoZmlsdGVyIGFzIEZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gSlNPTiBvYmplY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IChvYmpbZmlsdGVyXSA9IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSkpO1xuXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUge1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmZm1wZWcgPSBuZXcgRkZtcGVnRmlsdGVyZXI8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICAgIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgICAgIGJpcXVhZDogbnVsbCxcbiAgICAgICAgZXF1YWxpemVyOiBbXSxcbiAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgIHZvbHVtZTogMTAwLFxuICAgICAgICBzYW1wbGVSYXRlOiAtMVxuICAgIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaWdpdGFsIGJpcXVhZCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERTUCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJlc2FtcGxlciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxheSBjdXJyZW50IHRyYWNrIGluIHRyYW5zaXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBzZWVrIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHRyaWdnZXJSZXBsYXkoc2VlayA9IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRoaXMucXVldWUuY3VycmVudFRyYWNrLCB7XG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWssXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAgIHB1YmxpYyBnZXQgZmZtcGVnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5mZm1wZWcuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFmLmVxdWFsaXplcj8uYmFuZE11bHRpcGxpZXJzIHx8IFtdKS5tYXAoKG0sIGkpID0+ICh7XG4gICAgICAgICAgICBiYW5kOiBpLFxuICAgICAgICAgICAgZ2FpbjogbVxuICAgICAgICB9KSkgYXMgRXF1YWxpemVyQmFuZFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gcmV0dXJuICh0aGlzLmFmLmJpcXVhZD8uZ2V0RmlsdGVyTmFtZSgpIGFzIEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGwpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5maWx0ZXJzPy5maWx0ZXJzIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi52b2x1bWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFmLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZHVtcCgpOiBGaWx0ZXJHcmFwaCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmZm1wZWc6IHRoaXMuZmZtcGVnLFxuICAgICAgICAgICAgZXF1YWxpemVyOiB0aGlzLmVxdWFsaXplcixcbiAgICAgICAgICAgIGJpcXVhZDogdGhpcy5iaXF1YWQsXG4gICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICAgICAgICBzYW1wbGVSYXRlOiB0aGlzLnJlc2FtcGxlcj8udGFyZ2V0U2FtcGxlUmF0ZSB8fCB0aGlzLnJlc2FtcGxlcj8uc2FtcGxlUmF0ZSB8fCA0ODAwMCxcbiAgICAgICAgICAgIHZvbHVtZTogdGhpcy52b2x1bWU/LnZvbHVtZSA/PyAxMDBcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JhcGgge1xuICAgIGZmbXBlZzogRmlsdGVyc1tdO1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogRXhjbHVkZTxCaXF1YWRGaWx0ZXJzLCBudW1iZXI+IHwgbnVsbDtcbiAgICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gICAgdm9sdW1lOiBudW1iZXI7XG4gICAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgKiBhcyBwcmlzbSBmcm9tICdwcmlzbS1tZWRpYSc7XG5pbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcblxuZXhwb3J0IGludGVyZmFjZSBGRm1wZWdTdHJlYW1PcHRpb25zIHtcbiAgICBmbXQ/OiBzdHJpbmc7XG4gICAgZW5jb2RlckFyZ3M/OiBzdHJpbmdbXTtcbiAgICBzZWVrPzogbnVtYmVyO1xuICAgIHNraXA/OiBib29sZWFuO1xuICAgIGNvb2tpZXM/OiBzdHJpbmc7XG4gICAgdXNlTGVnYWN5RkZtcGVnPzogYm9vbGVhbjtcbn1cblxuY29uc3QgZ2V0RkZtcGVnUHJvdmlkZXIgPSAobGVnYWN5ID0gZmFsc2UpID0+IChsZWdhY3kgPyAocHJpc20gYXMgdHlwZW9mIHByaXNtICYgeyBkZWZhdWx0OiB0eXBlb2YgcHJpc20gfSkuZGVmYXVsdD8uRkZtcGVnIHx8IHByaXNtLkZGbXBlZyA6IEZGbXBlZyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtOiBzdHJpbmcsIGZtdD86IHN0cmluZywgY29va2llcz86IHN0cmluZykge1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAgIFwiLXJlY29ubmVjdFwiLCBcIjFcIixcbiAgICAgICAgXCItcmVjb25uZWN0X3N0cmVhbWVkXCIsIFwiMVwiLFxuICAgICAgICBcIi1yZWNvbm5lY3RfZGVsYXlfbWF4XCIsIFwiNVwiLFxuICAgICAgICBcIi1pXCIsIHN0cmVhbSxcbiAgICAgICAgXCItYW5hbHl6ZWR1cmF0aW9uXCIsIFwiMFwiLFxuICAgICAgICBcIi1sb2dsZXZlbFwiLCBcIjBcIixcbiAgICAgICAgXCItZlwiLCBgJHt0eXBlb2YgZm10ID09PSBcInN0cmluZ1wiID8gZm10IDogXCJzMTZsZVwifWAsXG4gICAgICAgIFwiLWFyXCIsIFwiNDgwMDBcIixcbiAgICAgICAgXCItYWNcIiwgXCIyXCJcbiAgICBdO1xuXG4gICAgaWYgKHR5cGVvZiBjb29raWVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBodHRwczovL2ZmbXBlZy5vcmcvZmZtcGVnLXByb3RvY29scy5odG1sI0hUVFAtQ29va2llc1xuICAgICAgICBhcmdzLnB1c2goJy1jb29raWVzJywgY29va2llcy5zdGFydHNXaXRoKCdcIicpID8gY29va2llcyA6IGBcIiR7Y29va2llc31cImApO1xuICAgIH1cblxuICAgIHJldHVybiBhcmdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfUElQRUQoZm10Pzogc3RyaW5nKSB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgcmV0dXJuIFtcbiAgICAgICAgXCItYW5hbHl6ZWR1cmF0aW9uXCIsIFwiMFwiLFxuICAgICAgICBcIi1sb2dsZXZlbFwiLCBcIjBcIixcbiAgICAgICAgXCItZlwiLCBgJHt0eXBlb2YgZm10ID09PSBcInN0cmluZ1wiID8gZm10IDogXCJzMTZsZVwifWAsXG4gICAgICAgIFwiLWFyXCIsIFwiNDgwMDBcIixcbiAgICAgICAgXCItYWNcIiwgXCIyXCJcbiAgICBdO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgRkZtcGVnIHN0cmVhbVxuICogQHBhcmFtIHN0cmVhbSBUaGUgc291cmNlIHN0cmVhbVxuICogQHBhcmFtIG9wdGlvbnMgRkZtcGVnIHN0cmVhbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZywgb3B0aW9ucz86IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucz8uc2tpcCAmJiB0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykgcmV0dXJuIHN0cmVhbTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBjb25zdCBhcmdzID0gdHlwZW9mIHN0cmVhbSA9PT0gJ3N0cmluZycgPyBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtLCBvcHRpb25zLmZtdCwgb3B0aW9ucy5jb29raWVzKSA6IEZGTVBFR19BUkdTX1BJUEVEKG9wdGlvbnMuZm10KTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKG9wdGlvbnMuc2VlaykpIGFyZ3MudW5zaGlmdCgnLXNzJywgU3RyaW5nKG9wdGlvbnMuc2VlaykpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgICBjb25zdCBGRk1QRUcgPSBnZXRGRm1wZWdQcm92aWRlcighIW9wdGlvbnMudXNlTGVnYWN5RkZtcGVnKTtcblxuICAgIGNvbnN0IHRyYW5zY29kZXIgPSBuZXcgRkZNUEVHKHsgc2hlbGw6IGZhbHNlLCBhcmdzIH0pO1xuXG4gICAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgICBpZiAodHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAgICAgc3RyZWFtLnBpcGUodHJhbnNjb2Rlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zY29kZXI7XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSB7XG4gICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IG51bWJlcjtcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiBib29sZWFuO1xuICAgICAgICBwbGF5aW5nOiBib29sZWFuO1xuICAgICAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgICAgIGlkbGU6IGJvb2xlYW47XG4gICAgfTtcbiAgICB0cmFja3NDb3VudDogbnVtYmVyO1xuICAgIGhpc3RvcnlTaXplOiBudW1iZXI7XG4gICAgZXh0cmFjdG9yczogbnVtYmVyO1xuICAgIGxpc3RlbmVyczogbnVtYmVyO1xuICAgIG1lbW9yeVVzYWdlOiBOb2RlSlMuTWVtb3J5VXNhZ2U7XG4gICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogc3RyaW5nO1xuICAgICAgICBwbGF5ZXI6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgc3RhdGlzdGljcyBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF0ZW5jeToge1xuICAgICAgICAgICAgICAgIGV2ZW50TG9vcDogdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRMb29wTGFnLFxuICAgICAgICAgICAgICAgIHZvaWNlQ29ubmVjdGlvbjogdGhpcy5xdWV1ZS5waW5nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgICAgICAgICBwbGF5aW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNQbGF5aW5nKCksXG4gICAgICAgICAgICAgICAgcGF1c2VkOiB0aGlzLnF1ZXVlLm5vZGUuaXNQYXVzZWQoKSxcbiAgICAgICAgICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgICAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICAgICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICAgICAgICBsaXN0ZW5lcnM6IHRoaXMucXVldWUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2UuY2hhbm5lbD8ubWVtYmVycy5maWx0ZXIoKG0pID0+ICFtLnVzZXIuYm90KS5zaXplIHx8IDAsXG4gICAgICAgICAgICBtZW1vcnlVc2FnZTogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLFxuICAgICAgICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgcGxheWVyOiAnNi42LjMtZGV2LjAnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBpbnN0YW5jZXMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIFBsYXllcj4oKTtcbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgdW5rbm93bj4oKTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFBsYXllcihwbGF5ZXI6IFBsYXllcikge1xuICAgIGlmIChpbnN0YW5jZXMuaGFzKHBsYXllci5pZCkpIHJldHVybiB0cnVlO1xuXG4gICAgaW5zdGFuY2VzLnNldChwbGF5ZXIuaWQsIHBsYXllcik7XG5cbiAgICByZXR1cm4gaW5zdGFuY2VzLmhhcyhwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uLy4uL1BsYXllcic7XG5pbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJQbGF5ZXIocGxheWVyOiBQbGF5ZXIpIHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmRlbGV0ZShwbGF5ZXIuaWQpO1xufVxuIiwgImltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQbGF5ZXJzKCkge1xuICAgIHJldHVybiBpbnN0YW5jZXMuYXJyYXkoKTtcbn1cbiIsICJpbXBvcnQgeyBnbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxSZWdpc3RyeSgpIHtcbiAgICByZXR1cm4gZ2xvYmFsUmVnaXN0cnk7XG59XG4iLCAiaW1wb3J0IHsgVm9pY2VDaGFubmVsLCBTdGFnZUNoYW5uZWwsIFNub3dmbGFrZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciwgam9pblZvaWNlQ2hhbm5lbCwgVm9pY2VDb25uZWN0aW9uLCBnZXRWb2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cywgQXVkaW9QbGF5ZXIgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5jbGFzcyBWb2ljZVV0aWxzIHtcbiAgICAvKipcbiAgICAgKiBWb2ljZSBjb25uZWN0aW9uIGNhY2hlIHRvIHN0b3JlIHZvaWNlIGNvbm5lY3Rpb25zIG9mIHRoZSBQbGF5ZXIgY29tcG9uZW50cy5cbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLlxuICAgICAqIEl0IG9ubHkgZXhpc3RzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FjaGU6IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPiA9IG5ldyBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSB1dGlscyBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAgIC8qKlxuICAgICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbCwgY3JlYXRpbmcgYmFzaWMgc3RyZWFtIGRpc3BhdGNoIG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgICAgICBxdWV1ZTogR3VpbGRRdWV1ZTtcbiAgICAgICAgICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG4gICAgICAgICAgICBncm91cD86IHN0cmluZztcbiAgICAgICAgfVxuICAgICk6IFByb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj4ge1xuICAgICAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRF9RVUVVRSgpO1xuICAgICAgICBjb25zdCBjb25uID0gYXdhaXQgdGhpcy5qb2luKGNoYW5uZWwsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdWIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihjb25uLCBjaGFubmVsLCBvcHRpb25zLnF1ZXVlLCBvcHRpb25zLm1heFRpbWUsIG9wdGlvbnMuYXVkaW9QbGF5ZXIpO1xuICAgICAgICByZXR1cm4gc3ViO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gW2NoYW5uZWxdIFRoZSB2b2ljZS9zdGFnZSBjaGFubmVsIHRvIGpvaW5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtWb2ljZUNvbm5lY3Rpb259XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGpvaW4oXG4gICAgICAgIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIGRlYWY/OiBib29sZWFuO1xuICAgICAgICAgICAgbWF4VGltZT86IG51bWJlcjtcbiAgICAgICAgICAgIGdyb3VwPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbm4gPSBqb2luVm9pY2VDaGFubmVsKHtcbiAgICAgICAgICAgIGd1aWxkSWQ6IGNoYW5uZWwuZ3VpbGQuaWQsXG4gICAgICAgICAgICBjaGFubmVsSWQ6IGNoYW5uZWwuaWQsXG4gICAgICAgICAgICBhZGFwdGVyQ3JlYXRvcjogY2hhbm5lbC5ndWlsZC52b2ljZUFkYXB0ZXJDcmVhdG9yIGFzIHVua25vd24gYXMgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvcixcbiAgICAgICAgICAgIHNlbGZEZWFmOiBCb29sZWFuKG9wdGlvbnM/LmRlYWYpLFxuICAgICAgICAgICAgZGVidWc6IHRoaXMucGxheWVyLmV2ZW50cy5saXN0ZW5lckNvdW50KCdkZWJ1ZycpID4gMCxcbiAgICAgICAgICAgIGdyb3VwOiBvcHRpb25zPy5ncm91cFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29ubjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzY29ubmVjdChjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24gfCBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgU3RyZWFtRGlzcGF0Y2hlcikgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBEaXNjb3JkIFBsYXllciB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgICAqIEByZXR1cm5zIHtTdHJlYW1EaXNwYXRjaGVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UsIGdyb3VwPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBnZXRWb2ljZUNvbm5lY3Rpb24oZ3VpbGQsIGdyb3VwKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFZvaWNlVXRpbHMgfTtcbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vZmFicmljL1NlYXJjaFJlc3VsdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZU9wdGlvbnMge1xuICAgIGNoZWNrSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbi8vIDVoXG5jb25zdCBERUZBVUxUX0VYUElSWV9USU1FT1VUID0gMThfMDAwXzAwMDtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUHJvdmlkZXI8VD4ge1xuICAgIGdldERhdGEoKTogUHJvbWlzZTxEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUPltdPjtcbiAgICBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCk6IFByb21pc2U8dm9pZD47XG4gICAgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlDYWNoZSBpbXBsZW1lbnRzIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUcmFjaz4ge1xuICAgICNkZWZhdWx0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VHJhY2s+PigpO1xuICAgIHB1YmxpYyB0aW1lcjogTm9kZUpTLlRpbWVyO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICAgICAgICBwdWJsaWMgb3B0aW9uczogUXVlcnlDYWNoZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjaGVja0ludGVydmFsOiBERUZBVUxUX0VYUElSWV9USU1FT1VUXG4gICAgICAgIH1cbiAgICApIHtcbiAgICAgICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKHRoaXMuY2xlYW51cC5iaW5kKHRoaXMpLCB0aGlzLmNoZWNrSW50ZXJ2YWwpLnVucmVmKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjaGVja0ludGVydmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNoZWNrSW50ZXJ2YWwgPz8gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiB0aGlzLiNkZWZhdWx0Q2FjaGUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5oYXNFeHBpcmVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldERhdGEoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy4jZGVmYXVsdENhY2hlLnZhbHVlcygpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpIHtcbiAgICAgICAgZGF0YS50cmFja3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2RlZmF1bHRDYWNoZS5oYXMoZC51cmwpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuc2V0KGQudXJsLCBuZXcgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGUoZCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2RlZmF1bHRDYWNoZS5nZXQoY29udGV4dC5xdWVyeSk7XG4gICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICAgICAgICB0cmFja3M6IFtyZXN1bHQuZGF0YV0sXG4gICAgICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBleHBpcmVBZnRlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBULCBleHBpcmVBZnRlcjogbnVtYmVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVCkge1xuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZUFmdGVyID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5leHBpcmVBZnRlciA9IERhdGUubm93KCkgKyBleHBpcmVBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNFeHBpcmVkKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZXhwaXJlQWZ0ZXIgIT09ICdudW1iZXInIHx8IGlzTmFOKHRoaXMuZXhwaXJlQWZ0ZXIpIHx8IHRoaXMuZXhwaXJlQWZ0ZXIgPCAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpIDw9IHRoaXMuZXhwaXJlQWZ0ZXI7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQge1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IGBleHQ6JHtzdHJpbmd9YDtcbn1cbiIsICJpbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmltcG9ydCB7IENsaWVudCwgU25vd2ZsYWtlVXRpbCwgVm9pY2VTdGF0ZSwgSW50ZW50c0JpdEZpZWxkLCBVc2VyLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIHZlcnNpb24gYXMgZGpzVmVyc2lvbiB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrLCBTZWFyY2hSZXN1bHQgfSBmcm9tICcuL2ZhYnJpYyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlRXZlbnRzLCBWb2ljZUNvbm5lY3RDb25maWcsIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnMsIEd1aWxkTm9kZU1hbmFnZXIsIEd1aWxkUXVldWUsIFJlc291cmNlUGxheU9wdGlvbnMsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vbWFuYWdlcic7XG5pbXBvcnQgeyBWb2ljZVV0aWxzIH0gZnJvbSAnLi9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzJztcbmltcG9ydCB7IFBsYXllckV2ZW50cywgUXVlcnlUeXBlLCBTZWFyY2hPcHRpb25zLCBQbGF5ZXJJbml0T3B0aW9ucywgUGxheWxpc3RJbml0RGF0YSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyLCBSZXNvbHZlZFF1ZXJ5IH0gZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEZXBlbmRlbmN5UmVwb3J0LCB2ZXJzaW9uIGFzIGRWb2ljZVZlcnNpb24gfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgKiBhcyBfaW50ZXJuYWxzIGZyb20gJy4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyIH0gZnJvbSAnLi9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXInO1xuXG5jb25zdCBrU2luZ2xldG9uID0gU3ltYm9sKCdJbnN0YW5jZURpc2NvcmRQbGF5ZXJTaW5nbGV0b24nKTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VCA9IHVua25vd24+IHtcbiAgICB0cmFjazogVHJhY2s7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBzZWFyY2hSZXN1bHQ6IFNlYXJjaFJlc3VsdDtcbiAgICBxdWV1ZTogR3VpbGRRdWV1ZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tMaWtlID0gc3RyaW5nIHwgVHJhY2sgfCBTZWFyY2hSZXN1bHQgfCBUcmFja1tdIHwgUGxheWxpc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiBleHRlbmRzIFNlYXJjaE9wdGlvbnMge1xuICAgIG5vZGVPcHRpb25zPzogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPjtcbiAgICBjb25uZWN0aW9uT3B0aW9ucz86IFZvaWNlQ29ubmVjdENvbmZpZztcbiAgICBhdWRpb1BsYXllck9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgIGFmdGVyU2VhcmNoPzogKHJlc3VsdDogU2VhcmNoUmVzdWx0KSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCB0eXBlIFZvaWNlU3RhdGVIYW5kbGVyID0gKHBsYXllcjogUGxheWVyLCBxdWV1ZTogR3VpbGRRdWV1ZSwgb2xkVm9pY2VTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3Vm9pY2VTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gQXdhaXRlZDx2b2lkPjtcblxuZXhwb3J0IGNsYXNzIFBsYXllciBleHRlbmRzIFBsYXllckV2ZW50c0VtaXR0ZXI8UGxheWVyRXZlbnRzPiB7XG4gICAgI2xhc3RMYXRlbmN5ID0gLTE7XG4gICAgI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lciA9IHRoaXMuaGFuZGxlVm9pY2VTdGF0ZS5iaW5kKHRoaXMpO1xuICAgICNsYWdNb25pdG9yVGltZW91dCE6IE5vZGVKUy5UaW1lb3V0O1xuICAgICNsYWdNb25pdG9ySW50ZXJ2YWwhOiBOb2RlSlMuVGltZXI7XG4gICAgI29uVm9pY2VTdGF0ZVVwZGF0ZTogVm9pY2VTdGF0ZUhhbmRsZXIgPSBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXI7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgPSAnNi42LjMtZGV2LjAnO1xuICAgIHB1YmxpYyBzdGF0aWMgX3NpbmdsZXRvbktleSA9IGtTaW5nbGV0b247XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHVibGljIHJlYWRvbmx5IGNsaWVudCE6IENsaWVudDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyE6IFBsYXllckluaXRPcHRpb25zO1xuICAgIHB1YmxpYyBub2RlcyA9IG5ldyBHdWlsZE5vZGVNYW5hZ2VyKHRoaXMpO1xuICAgIHB1YmxpYyByZWFkb25seSB2b2ljZVV0aWxzID0gbmV3IFZvaWNlVXRpbHModGhpcyk7XG4gICAgcHVibGljIGV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCh0aGlzKTtcbiAgICBwdWJsaWMgZXZlbnRzID0gbmV3IFBsYXllckV2ZW50c0VtaXR0ZXI8R3VpbGRRdWV1ZUV2ZW50cz4oWydlcnJvcicsICdwbGF5ZXJFcnJvciddKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IERpc2NvcmQgUGxheWVyXG4gICAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBUaGUgRGlzY29yZCBDbGllbnRcbiAgICAgKiBAcGFyYW0ge1BsYXllckluaXRPcHRpb25zfSBbb3B0aW9uc10gVGhlIHBsYXllciBpbml0IG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUluc3RhbmNlICYmIGtTaW5nbGV0b24gaW4gUGxheWVyKSByZXR1cm4gKDxhbnk+UGxheWVyKVtrU2luZ2xldG9uXSBhcyBQbGF5ZXI7XG5cbiAgICAgICAgc3VwZXIoWydlcnJvciddKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpc2NvcmQuanMgY2xpZW50XG4gICAgICAgICAqIEB0eXBlIHtDbGllbnR9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcblxuICAgICAgICBjb25zdCBpYmYgPSB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMgaW5zdGFuY2VvZiBJbnRlbnRzQml0RmllbGQgPyB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMgOiBuZXcgSW50ZW50c0JpdEZpZWxkKHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyk7XG5cbiAgICAgICAgaWYgKCFpYmYuaGFzKEludGVudHNCaXRGaWVsZC5GbGFncy5HdWlsZFZvaWNlU3RhdGVzKSkge1xuICAgICAgICAgICAgVXRpbC53YXJuKCdjbGllbnQgaXMgbWlzc2luZyBcIkd1aWxkVm9pY2VTdGF0ZXNcIiBpbnRlbnQnLCAnSW52YWxpZEludGVudHNCaXRGaWVsZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICAgICAgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyOiBmYWxzZSxcbiAgICAgICAgICAgIGJsb2NrRXh0cmFjdG9yczogW10sXG4gICAgICAgICAgICBibG9ja1N0cmVhbUZyb206IFtdLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IDIwMDAwLFxuICAgICAgICAgICAgc21vb3RoVm9sdW1lOiB0cnVlLFxuICAgICAgICAgICAgbGFnTW9uaXRvcjogMzAwMDAsXG4gICAgICAgICAgICBxdWVyeUNhY2hlOiBvcHRpb25zLnF1ZXJ5Q2FjaGUgPT09IG51bGwgPyBudWxsIDogb3B0aW9ucy5xdWVyeUNhY2hlIHx8IG5ldyBRdWVyeUNhY2hlKHRoaXMpLFxuICAgICAgICAgICAgdXNlTGVnYWN5RkZtcGVnOiBmYWxzZSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB5dGRsT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGhpZ2hXYXRlck1hcms6IDEgPDwgMjUsXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucy55dGRsT3B0aW9uc1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIFBsYXllckluaXRPcHRpb25zO1xuXG4gICAgICAgIHRoaXMuY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID09PSAnbnVtYmVyJyAmJiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2xhc3RMYXRlbmN5ID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtMYWcgTW9uaXRvcl0gRXZlbnQgbG9vcCBsYXRlbmN5OiAke3RoaXMuI2xhc3RMYXRlbmN5fW1zYCk7XG4gICAgICAgICAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2ludGVybmFscy5hZGRQbGF5ZXIodGhpcyk7XG5cbiAgICAgICAgaWYgKCEoa1NpbmdsZXRvbiBpbiBQbGF5ZXIpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGxheWVyLCBrU2luZ2xldG9uLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJykgPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkaXNjb3JkLXBsYXllciBzaW5nbGV0b24gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHBsYXllclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaW5nbGV0b24oY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IE9taXQ8UGxheWVySW5pdE9wdGlvbnMsICdpZ25vcmVJbnN0YW5jZSc+ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgaWdub3JlSW5zdGFuY2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGRpc2NvcmQtcGxheWVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBPbWl0PFBsYXllckluaXRPcHRpb25zLCAnaWdub3JlSW5zdGFuY2UnPiA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWVyKGNsaWVudCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIGlnbm9yZUluc3RhbmNlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgYWN0aXZlIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxQbGF5ZXJzKCkge1xuICAgICAgICByZXR1cm4gX2ludGVybmFscy5nZXRQbGF5ZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckFsbFBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiBfaW50ZXJuYWxzLmluc3RhbmNlcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhY2hlIHByb3ZpZGVyIGluIHVzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5xdWVyeUNhY2hlID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgdG8gYFBsYXllci5ub2Rlc2AuXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWV1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgICAqIHNvbWUgZXhwZW5zaXZlIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHdoaWNoIGlzIHNsb3dpbmcgZG93biB0aGUgZXZlbnQgbG9vcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXZlbnRMb29wTGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc3RhdHMgPSBwbGF5ZXIuZ2VuZXJhdGVTdGF0aXN0aWNzKCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhzdGF0cyk7XG4gICAgICpcbiAgICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAgICogLy8ge1xuICAgICAqIC8vICAgaW5zdGFuY2VzOiBudW1iZXIsXG4gICAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgICAqIC8vICAgcXVlcnlDYWNoZUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgICogLy8gICBxdWV1ZXM6IFtcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIC4uLlxuICAgICAqIC8vICAgXVxuICAgICAqIC8vIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVTdGF0aXN0aWNzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5zdGFuY2VzOiBfaW50ZXJuYWxzLmluc3RhbmNlcy5zaXplLFxuICAgICAgICAgICAgcXVldWVzQ291bnQ6IHRoaXMucXVldWVzLmNhY2hlLnNpemUsXG4gICAgICAgICAgICBxdWVyeUNhY2hlRW5hYmxlZDogdGhpcy5xdWVyeUNhY2hlICE9IG51bGwsXG4gICAgICAgICAgICBxdWV1ZXM6IHRoaXMucXVldWVzLmNhY2hlLm1hcCgobSkgPT4gbS5zdGF0cy5nZW5lcmF0ZSgpKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgZXZlcnkgc2luZ2xlIHF1ZXVlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFzdGVyIHBsYXllciBpbnN0YW5jZVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAgICogYXdhaXQgcGxheWVyLmRlc3Ryb3koKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcbiAgICAgICAgdGhpcy5jbGllbnQub2ZmKCd2b2ljZVN0YXRlVXBkYXRlJywgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5ldmVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICAgICAgaWYgKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KSBjbGVhckludGVydmFsKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KTtcbiAgICAgICAgX2ludGVybmFscy5jbGVhclBsYXllcih0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICAgICAgaWYgKCFxdWV1ZSB8fCAhcXVldWUuY29ubmVjdGlvbiB8fCAhcXVldWUuY2hhbm5lbCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGRpc3BhdGNoIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQudm9pY2VTdGF0ZVVwZGF0ZSwgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSh0aGlzLCBxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBwYXNzaW5nIHZvaWNlIHN0YXRlIHVwZGF0ZSBkYXRhIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB2b2ljZSBzdGF0ZSBoYW5kbGVyXG4gICAgICpcbiAgICAgKiBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICogICAvLyB0aGlzIGlzIGRlZmluaXRlbHkgYSByb2NrZXQgc2NpZW5jZSwgcmlnaHQgaGVyZVxuICAgICAqICAgcGxheWVyLmhhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2sgdm9pY2Ugc3RhdGUgaGFuZGxlci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIHdpbGwga2VlcCB1c2luZyB0aGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciwgZXZlbiBpZiBjdXN0b20gaW1wbGVtZW50YXRpb24gZXhpc3RzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVubG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBzdG9wIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIHVubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHZvaWNlIHN0YXRlIGhhbmRsZXIgaXMgbG9ja2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYXRlIGF1ZGlvIHBsYXllclxuICAgICAqIEBwYXJhbSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBtdXNpYyBzaG91bGQgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSB0cmFjayBvciBzb3VyY2UgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXllclxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHF1ZXVlIG1hbmFnZW1lbnQsIGp1c3QgdXNlIHRoaXMgbWV0aG9kIFx1RDgzRFx1REUwNFxuICAgICAqIGNvbnN0IHF1ZXJ5ID0gJ3RoaXMgaXMgbXkgc3VwZXIgY29vbCBzZWFyY2ggcXVlcnkgdGhhdCBJIHdhbnQgdG8gcGxheSc7XG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgIGNvbnN0IHsgdHJhY2sgfSA9IGF3YWl0IHBsYXllci5wbGF5KHZvaWNlQ2hhbm5lbCwgcXVlcnkpO1xuICAgICAqICAgY29uc29sZS5sb2coYFx1RDgzQ1x1REY4OSBJIGFtIHBsYXlpbmcgJHt0cmFjay50aXRsZX0gXHVEODNDXHVERjg5YCk7XG4gICAgICogfSBjYXRjaChlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgXHVEODNEXHVERTJEIEZhaWxlZCB0byBwbGF5IGVycm9yIG9oIG5vOlxcblxcbiR7ZX1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgcXVlcnk6IFRyYWNrTGlrZSwgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9KTogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICAgICAgY29uc3QgdmMgPSB0aGlzLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWwpO1xuICAgICAgICBpZiAoIXZjPy5pc1ZvaWNlQmFzZWQoKSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2hhbm5lbCcsICdWb2ljZUJhc2VkQ2hhbm5lbCcsICF2YyA/ICd1bmRlZmluZWQnIDogYGNoYW5uZWwgdHlwZSAke3ZjLnR5cGV9YCk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPSBxdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCA/IHF1ZXJ5IDogYXdhaXQgdGhpcy5zZWFyY2gocXVlcnksIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoYE5vIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtxdWVyeX1cIiAoRXh0cmFjdG9yOiAke3Jlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLm5vZGVzLmNyZWF0ZSh2Yy5ndWlsZCwgb3B0aW9ucy5ub2RlT3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoeyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBXYWl0aW5nIGZvciB0aGUgcXVldWUgdG8gcmVzb2x2ZS4uLmApO1xuICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gRW50cnkgJHtlbnRyeS5pZH0gd2FzIHJlc29sdmVkIWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC50cmFja3NbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQucGxheWxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFxdWV1ZS5pc1BsYXlpbmcoKSkgYXdhaXQgcXVldWUubm9kZS5wbGF5KG51bGwsIG9wdGlvbnMuYXVkaW9QbGF5ZXJPcHRpb25zKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gUmVsZWFzaW5nIGFuIGVudHJ5IGZyb20gdGhlIHF1ZXVlLi4uYCk7XG4gICAgICAgICAgICBxdWV1ZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFjazogcmVzdWx0LnRyYWNrc1swXSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdDogcmVzdWx0LFxuICAgICAgICAgICAgcXVldWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2ggdHJhY2tzXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCB8IFNlYXJjaFJlc3VsdH0gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeVxuICAgICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZWFyY2hSZXN1bHQ+fVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGxheWVyLnNlYXJjaChzZWFyY2hRdWVyeSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZWFyY2goc2VhcmNoUXVlcnk6IHN0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0LCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgICAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHJldHVybiBzZWFyY2hRdWVyeTtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0ZWRCeSAhPSBudWxsKSBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG4gICAgICAgIG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/PSB0aGlzLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IFtzZWFyY2hRdWVyeV0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICAgICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogc2VhcmNoUXVlcnkucXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LFxuICAgICAgICAgICAgICAgIHRyYWNrczogc2VhcmNoUXVlcnkudHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LnRyYWNrc1swXT8uZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoUXVlcnkpKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPSBzZWFyY2hRdWVyeS5maWx0ZXIoKHQpID0+IHQgaW5zdGFuY2VvZiBUcmFjayk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiAnQEAjJXt7VXNlckxvYWRlZENvbnRlbnR9fSUjQEAnLFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogbnVsbCxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgICAgICBsZXQgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuc2VhcmNoRW5naW5lfWApO1xuXG4gICAgICAgIGNvbnN0IHsgdHlwZTogcXVlcnlUeXBlLCBxdWVyeSB9ID1cbiAgICAgICAgICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID09PSBRdWVyeVR5cGUuQVVUTyA/IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShzZWFyY2hRdWVyeSwgb3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZSkgOiAoeyB0eXBlOiBvcHRpb25zLnNlYXJjaEVuZ2luZSwgcXVlcnk6IHNlYXJjaFF1ZXJ5IH0gYXMgUmVzb2x2ZWRRdWVyeSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFF1ZXJ5IHR5cGUgaWRlbnRpZmllZCBhcyAke3F1ZXJ5VHlwZX1gKTtcblxuICAgICAgICAvLyBmb3JjZSBwYXJ0aWN1bGFyIGV4dHJhY3RvclxuICAgICAgICBpZiAob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3RhcnRzV2l0aCgnZXh0OicpKSB7XG4gICAgICAgICAgICBleHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuZ2V0KG9wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KSkhO1xuICAgICAgICAgICAgaWYgKCFleHRyYWN0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBxdWVyeSBhbGwgZXh0cmFjdG9yc1xuICAgICAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgICAgICAgLy8gY2FjaGUgdmFsaWRhdGlvblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENoZWNraW5nIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBjYWNoZSBoaXRcbiAgICAgICAgICAgICAgICBpZiAocmVzPy5oYXNUcmFja3MoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgaGl0IGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBtaXNzIGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvcnMuLi5gKTtcblxuICAgICAgICAgICAgLy8gY2FjaGUgbWlzc1xuICAgICAgICAgICAgZXh0cmFjdG9yID1cbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHQudmFsaWRhdGUocXVlcnksIHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk/LmV4dHJhY3RvciB8fCBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm8gZXh0cmFjdG9ycyBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdGYWlsZWQgdG8gZmluZCBhcHByb3ByaWF0ZSBleHRyYWN0b3InKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0cmFjdG9yXG4gICAgICAgICAgICAuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSBhcyBVc2VyXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpO1xuXG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCEnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogcmVzLnBsYXlsaXN0LFxuICAgICAgICAgICAgICAgIHRyYWNrczogcmVzLnRyYWNrcyxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQWRkaW5nIGRhdGEgdG8gY2FjaGUuLi5gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEocmVzdWx0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdGYWlsZWQgdG8gZmluZCByZXN1bHQgdXNpbmcgYXBwcm9wcmlhdGUgZXh0cmFjdG9yLiBRdWVyeWluZyBhbGwgZXh0cmFjdG9ycy4uLicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKFxuICAgICAgICAgICAgYXN5bmMgKGV4dCkgPT5cbiAgICAgICAgICAgICAgICAhb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICAgICAgIChhd2FpdCBleHQudmFsaWRhdGUocXVlcnkpKSAmJlxuICAgICAgICAgICAgICAgIGV4dC5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlclxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtyZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0Py5leHRyYWN0b3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYE1ldGFkYXRhIHF1ZXJ5IHdhcyBzdWNjZXNzZnVsIHVzaW5nICR7cmVzdWx0LmV4dHJhY3Rvci5pZGVudGlmaWVyfSFgKTtcblxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiByZXN1bHQucmVzdWx0LnBsYXlsaXN0LFxuICAgICAgICAgICAgdHJhY2tzOiByZXN1bHQucmVzdWx0LnRyYWNrcyxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgZGlzY29yZC12b2lwYCBtb2R1bGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zb2xlLmxvZyhwbGF5ZXIuc2NhbkRlcHMoKSk7XG4gICAgICogLy8gLT4gbG9ncyBkZXBlbmRlbmNpZXMgcmVwb3J0XG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBwdWJsaWMgc2NhbkRlcHMoKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcbiAgICAgICAgY29uc3QgcnVudGltZSA9ICdCdW4nIGluIGdsb2JhbFRoaXMgPyAnQnVuJyA6ICdEZW5vJyBpbiBnbG9iYWxUaGlzID8gJ0Rlbm8nIDogJ05vZGUnO1xuICAgICAgICBjb25zdCBkZXBzUmVwb3J0ID0gW1xuICAgICAgICAgICAgJ0Rpc2NvcmQgUGxheWVyJyxcbiAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICBgLSBkaXNjb3JkLXBsYXllcjogJHtQbGF5ZXIudmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gZGlzY29yZC12b2lwOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICAgICAgICAgIGAtIGRpc2NvcmQuanM6ICR7ZGpzVmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gTm9kZSB2ZXJzaW9uOiAke3Byb2Nlc3MudmVyc2lvbn0gKERldGVjdGVkIFJ1bnRpbWU6ICR7cnVudGltZX0pYCxcbiAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VMZWdhY3lGRm1wZWcpIHJldHVybiAnLSBmZm1wZWc6IE4vQSAodXNpbmcgbGVnYWN5IGZmbXBlZyknO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBGRm1wZWcubG9jYXRlU2FmZSgpO1xuICAgICAgICAgICAgICAgIGlmICghaW5mbykgcmV0dXJuICdGRm1wZWcvQXZjb252IG5vdCBmb3VuZCc7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gW2AtIGZmbXBlZzogJHtpbmZvLnZlcnNpb259YCwgYC0gY29tbWFuZDogJHtpbmZvLmNvbW1hbmR9YCwgYC0gc3RhdGljOiAke2luZm8uaXNTdGF0aWN9YCwgYC0gbGlib3B1czogJHtpbmZvLm1ldGFkYXRhIS5pbmNsdWRlcygnLS1lbmFibGUtbGlib3B1cycpfWBdLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgICdcXG4nLFxuICAgICAgICAgICAgJ0xvYWRlZCBFeHRyYWN0b3JzOicsXG4gICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlXG4gICAgICAgICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5pZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpIHx8ICdOL0EnLFxuICAgICAgICAgICAgJ1xcblxcbmRpc2NvcmQtdm9pcCcsXG4gICAgICAgICAgICBnZW5lcmF0ZURlcGVuZGVuY3lSZXBvcnQoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiBkZXBzUmVwb3J0LmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLm5vZGVzLmNhY2hlLnZhbHVlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYFBsYXlsaXN0YCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQbGF5bGlzdChkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWxpc3QodGhpcywgZGF0YSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IENoYW5uZWxUeXBlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL21hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi9QbGF5ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vdXRpbHMvVXRpbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIocGxheWVyOiBQbGF5ZXIsIHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmICFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIG5vb3AgKi9cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdm9pZCBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRpc2Nvbm5lY3QsIHF1ZXVlKTtcbiAgICB9XG5cbiAgICBpZiAocXVldWUub3B0aW9ucy5wYXVzZU9uRW1wdHkpIHtcbiAgICAgICAgY29uc3QgaXNFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpO1xuXG4gICAgICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5kZWJ1ZygnVm9pY2UgY2hhbm5lbCBpcyBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcGF1c2luZy4uLicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5kZWJ1ZygnVm9pY2UgY2hhbm5lbCBpcyBub3QgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHJlc3VtaW5nLi4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChpc0VtcHR5KTtcbiAgICB9XG5cbiAgICBpZiAoIW9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKSB7XG4gICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zZXJ2ZXJNdXRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiYgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zdXBwcmVzcyAhPT0gbmV3U3RhdGUuc3VwcHJlc3MpIHtcbiAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnN1cHByZXNzKTtcbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHRydWUpLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgIH1cblxuICAgIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgICAgIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgIGlmICghY2hhbm5lbEVtcHR5ICYmIGVtcHR5VGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgICAgICBpZiAocXVldWUuY29ubmVjdGlvbiAmJiBuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkgcXVldWUuY2hhbm5lbCA9IG5ld1N0YXRlLmNoYW5uZWwhO1xuICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5jaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUuY29ubmVjdGlvbiAmJiAhVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGxheWVyLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAhPT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGxheWVyLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpO1xuICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbEVtcHR5ICYmIGVtcHR5VGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuZXhwb3J0IGNvbnN0IGdldFBsYXllciA9ICgpID0+IHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmZpcnN0KCkgfHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRRdWV1ZSA9IDxUID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpID0+IHtcbiAgICBjb25zdCBwbGF5ZXIgPSBnZXRQbGF5ZXIoKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gKHBsYXllci5ub2Rlcy5yZXNvbHZlKG5vZGUpIGFzIEd1aWxkUXVldWU8VD4pIHx8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tEZWNsYXJhdGlvbkNvbnRleHQge1xuICAgIGdldFF1ZXVlOiB0eXBlb2YgZ2V0UXVldWU7XG4gICAgZ2V0UGxheWVyOiB0eXBlb2YgZ2V0UGxheWVyO1xuICAgIGluc3RhbmNlczogdHlwZW9mIGluc3RhbmNlcztcbn1cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IHR5cGUgSG9va0RlY2xhcmF0aW9uPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4gPSAoY29udGV4dDogSG9va0RlY2xhcmF0aW9uQ29udGV4dCkgPT4gVDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2s8VCBleHRlbmRzIEhvb2tEZWNsYXJhdGlvbjwoLi4uYXJnczogYW55W10pID0+IGFueT4+KGhvb2s6IFQpOiBSZXR1cm5UeXBlPFQ+IHtcbiAgICByZXR1cm4gaG9vayh7XG4gICAgICAgIGdldFF1ZXVlLFxuICAgICAgICBnZXRQbGF5ZXIsXG4gICAgICAgIGluc3RhbmNlc1xuICAgIH0pIGFzIFJldHVyblR5cGU8VD47XG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBoaXN0b3J5XG4gKiBAcGFyYW0gbm9kZSBndWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZS5oaXN0b3J5O1xufVxuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBwbGF5ZXIgbm9kZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZS5ub2RlO1xufVxuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlPE1ldGE+KG5vZGUpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHF1ZXVlO1xufVxuIiwgImltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IGdldFBsYXllciB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBtYWluIHBsYXllciBpbnN0YW5jZVxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1hc3RlclBsYXllcigpIHtcbiAgICBVdGlsLndhcm4oJ3VzZU1hc3RlclBsYXllcigpIGhvb2sgaXMgZGVwcmVjYXRlZCwgdXNlIHVzZU1haW5QbGF5ZXIoKSBpbnN0ZWFkLicsICdEZXByZWNhdGlvbldhcm5pbmcnKTtcbiAgICByZXR1cm4gZ2V0UGxheWVyKCk7XG59XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1haW5QbGF5ZXIoKSB7XG4gICAgcmV0dXJuIGdldFBsYXllcigpO1xufVxuIiwgImltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG50eXBlIFNldHRlckZOPFQsIFA+ID0gKHByZXZpb3VzOiBQKSA9PiBUO1xuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgZ3VpbGQgcXVldWUgbWV0YWRhdGFcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxUPihub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSkgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKHF1ZXVlLm1ldGFkYXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5tZXRhZGF0YSBhcyBUO1xuICAgIH07XG5cbiAgICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn1cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucyB7XG4gICAgaWdub3JlRmlsdGVyczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIGN1cnJlbnQgdHJhY2tcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGltZWxpbmUgZGlzcGF0Y2hlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVGltZWxpbmUobm9kZTogTm9kZVJlc29sdmFibGUsIG9wdGlvbnM/OiBQYXJ0aWFsPFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnM+KSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZShub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgICAgICBnZXQgdGltZXN0YW1wKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuZ2V0VGltZXN0YW1wKG9wdGlvbnM/Lmlnbm9yZUZpbHRlcnMpITtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmlzUGF1c2VkKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB0cmFjaygpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5jdXJyZW50VHJhY2s7XG4gICAgICAgIH0sXG4gICAgICAgIHBhdXNlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucmVzdW1lKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFZvbHVtZSh2b2w6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQWZ0ZXJDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufVxuIiwgImltcG9ydCB7IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBoYW5kbGVyXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25CZWZvcmVDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59XG4iLCAiaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbnR5cGUgU2V0dGVyRk4gPSAocHJldmlvdXM6IG51bWJlcikgPT4gbnVtYmVyO1xuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgcGxheWVyIHZvbHVtZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlKG5vZGUpO1xuICAgIGNvbnN0IHNldHRlciA9ICh2b2x1bWU6IG51bWJlciB8IFNldHRlckZOKSA9PiB7XG4gICAgICAgIGlmIChxdWV1ZSkge1xuICAgICAgICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24odm9sdW1lKSkgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZShxdWV1ZS5ub2RlLnZvbHVtZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0dGVyID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gcXVldWU/Lm5vZGUudm9sdW1lIGFzIG51bWJlcjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtnZXR0ZXIsIHNldHRlcl0g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QztBQUFBLEVBQy9FLGdCQUFnQixVQUFVLENBQUMsS0FBSyxLQUFLLGFBQWMsTUFBTSxNQUFNLEtBQUssR0FBSyxNQUFNLElBQU0sRUFBSSxDQUFDO0FBQUEsRUFDMUYsWUFBWSxVQUFVLENBQUMsTUFBTSxNQUFNLE1BQU0sSUFBTSxLQUFLLE1BQU0sSUFBTSxJQUFNLElBQU0sSUFBSSxDQUFDO0FBQUEsRUFDakYsWUFBWSxVQUFVLENBQUMsS0FBSyxNQUFNLEtBQUssTUFBTSxNQUFNLEtBQUssS0FBSyxLQUFLLE1BQU0sSUFBSSxDQUFDO0FBQUEsRUFDN0UsV0FBVyxVQUFVLENBQUMsTUFBTSxNQUFNLEtBQUssS0FBSyxhQUFjLE1BQU0sTUFBTSxNQUFNLGFBQWMsV0FBWSxDQUFDO0FBQUEsRUFDdkcsTUFBTSxVQUFVLENBQUMsTUFBTSxhQUFjLEdBQUssS0FBSyxLQUFLLEtBQUssR0FBSyxLQUFLLEtBQUssR0FBRyxDQUFDO0FBQUEsRUFDNUUsT0FBTyxVQUFVLENBQUMsS0FBSyxLQUFLLGFBQWMsYUFBYyxhQUFjLGFBQWMsYUFBYyxhQUFjLEtBQUssR0FBRyxDQUFDO0FBQUEsRUFDekgsS0FBSyxVQUFVLENBQUMsTUFBTSxLQUFLLEtBQUssR0FBSyxLQUFLLGFBQWMsTUFBTSxNQUFNLE1BQU0sSUFBSSxDQUFDO0FBQUEsRUFDL0UsUUFBUSxVQUFVLENBQUMsYUFBYyxhQUFjLGFBQWMsTUFBTSxhQUFjLEtBQUssS0FBSyxhQUFjLGFBQWMsV0FBWSxDQUFDO0FBQUEsRUFDcEksTUFBTSxVQUFVLENBQUMsR0FBSyxLQUFLLE1BQU0sSUFBTSxNQUFNLEdBQUssS0FBSyxNQUFNLE1BQU0sSUFBSSxDQUFDO0FBQUEsRUFDeEUsS0FBSyxVQUFVLENBQUMsTUFBTSxNQUFNLElBQU0sYUFBYyxHQUFLLEtBQUssS0FBSyxLQUFLLE1BQU0sR0FBRyxDQUFDO0FBQUEsRUFDOUUsTUFBTSxVQUFVLENBQUMsS0FBSyxLQUFLLGFBQWMsTUFBTSxhQUFjLEdBQUssR0FBSyxLQUFLLE1BQU0sRUFBSSxDQUFDO0FBQUEs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QUssVUFBVSxPQUFPLE1BQU0sS0FBSyxNQUFNLENBQUM7QUFDdEYsYUFBTyxNQUFNLEtBQUssVUFBVSxNQUFNO0FBQUEsSUFDdEM7QUFBQSxFQUNKLEdBTGU7QUFPZixRQUFNLFNBQVMsNkJBQU07QUFDakIsV0FBTyxPQUFPLEtBQUs7QUFBQSxFQUN2QixHQUZlO0FBSWYsU0FBTyxDQUFDLFFBQVEsTUFBTTtBQUMxQjtBQWRnQjs7O0F6Q1VoQixJQUFBQyxvQkFXTztBQUNQLElBQUFDLHVCQUE4RTtBQUd2RSxJQUFNLFVBQWtCO0FBRS9CLElBQUksQ0FBQyxnQkFBQUMsUUFBVyxXQUFXLElBQUksR0FBRztBQUM5QixVQUFRLFlBQVksZUFBZSxnQkFBQUEsZ0RBQW1ELDJDQUEyQztBQUNySTsiLAogICJuYW1lcyI6IFsiR3VpbGRRdWV1ZSIsICJpbXBvcnRfZGlzY29yZCIsICJQbGF5ZXJFdmVudCIsICJRdWV1ZVJlcGVhdE1vZGUiLCAidGFyZ2V0IiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3Byb21pc2VzIiwgImltcG9ydF9kaXNjb3JkIiwgIndhaXRGb3IiLCAiaW1wb3J0X2VxdWFsaXplciIsICJwcmlzbSIsICJHdWlsZFF1ZXVlIiwgInRhcmdldCIsICJpbXBvcnRfdXRpbHMiLCAiR3VpbGRRdWV1ZSIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZmZtcGVnIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaGFuZGxlciIsICJyZXMiLCAicmVzdWx0IiwgImRWb2ljZVZlcnNpb24iLCAiZGpzVmVyc2lvbiIsICJoYW5kbGVyIiwgImhhbmRsZXIiLCAiaW1wb3J0X2VxdWFsaXplciIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImRqc1ZlcnNpb24iXQp9Cg==
|
|
4938
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy91dGlscy9VdGlsLnRzIiwgIi4uL3NyYy9mYWJyaWMvUGxheWxpc3QudHMiLCAiLi4vc3JjL2ZhYnJpYy9UcmFjay50cyIsICIuLi9zcmMvdHlwZXMvdHlwZXMudHMiLCAiLi4vc3JjL2ZhYnJpYy9TZWFyY2hSZXN1bHQudHMiLCAiLi4vc3JjL3V0aWxzL0F1ZGlvRmlsdGVycy50cyIsICIuLi9zcmMvZXJyb3JzL2luZGV4LnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvdXRpbHMvVHlwZVV0aWwudHMiLCAiLi4vc3JjL21hbmFnZXIvR3VpbGROb2RlTWFuYWdlci50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlLnRzIiwgIi4uL3NyYy9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL1ZvaWNlUmVjZWl2ZXJOb2RlLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVIaXN0b3J5LnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVQbGF5ZXJOb2RlLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy91dGlscy9Bc3luY1F1ZXVlLnRzIiwgIi4uL3NyYy9tYW5hZ2VyL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvbWFuYWdlci9HdWlsZFF1ZXVlU3RhdGlzdGljcy50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL19jb250YWluZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9hZGRQbGF5ZXIudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9jbGVhclBsYXllci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldFBsYXllcnMudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9nZXRHbG9iYWxSZWdpc3RyeS50cyIsICIuLi9zcmMvVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscy50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlDYWNoZS50cyIsICIuLi9zcmMvUGxheWVyLnRzIiwgIi4uL3NyYy9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIudHMiLCAiLi4vc3JjL3V0aWxzL0lQUm90YXRvci50cyIsICIuLi9zcmMvaG9va3MvY29tbW9uLnRzIiwgIi4uL3NyYy9ob29rcy91c2VIaXN0b3J5LnRzIiwgIi4uL3NyYy9ob29rcy91c2VQbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVF1ZXVlLnRzIiwgIi4uL3NyYy9ob29rcy91c2VNYWluUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VNZXRhZGF0YS50cyIsICIuLi9zcmMvaG9va3MvdXNlVGltZWxpbmUudHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkFmdGVyQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25CZWZvcmVDcmVhdGVTdHJlYW0udHMiLCAiLi4vc3JjL2hvb2tzL3VzZVZvbHVtZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgdmVyc2lvbiBhcyBkanNWZXJzaW9uIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5leHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2ZhYnJpYyc7XG5leHBvcnQgKiBmcm9tICcuL21hbmFnZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UeXBlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0FzeW5jUXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0ZGbXBlZ1N0cmVhbSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmV4cG9ydCAqIGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuZXhwb3J0ICogZnJvbSAnLi9QbGF5ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9ob29rcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0lQUm90YXRvcic7XG5leHBvcnQge1xuICAgIEF1ZGlvRmlsdGVycyBhcyBQQ01BdWRpb0ZpbHRlcnMsXG4gICAgdHlwZSBCaXF1YWRGaWx0ZXJzLFxuICAgIEZpbHRlclR5cGUgYXMgQmlxdWFkRmlsdGVyVHlwZSxcbiAgICB0eXBlIFBDTUZpbHRlcnMsXG4gICAgUV9CVVRURVJXT1JUSCxcbiAgICBWb2x1bWVUcmFuc2Zvcm1lcixcbiAgICBCQVNTX0VRX0JBTkRTLFxuICAgIEFGX05JR0hUQ09SRV9SQVRFLFxuICAgIEFGX1ZBUE9SV0FWRV9SQVRFLFxuICAgIEZpbHRlcnNDaGFpblxufSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmV4cG9ydCB7IGNyZWF0ZUF1ZGlvUGxheWVyLCBBdWRpb1BsYXllciwgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbmV4cG9ydCBjb25zdCB2ZXJzaW9uOiBzdHJpbmcgPSAnNi42LjQnO1xuXG5pZiAoIWRqc1ZlcnNpb24uc3RhcnRzV2l0aCgnMTQnKSkge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoYERpc2NvcmQuanMgdiR7ZGpzVmVyc2lvbn0gaXMgaW5jb21wYXRpYmxlIHdpdGggRGlzY29yZCBQbGF5ZXIgdiR7dmVyc2lvbn0hIFBsZWFzZSB1c2UgPj12MTQueCBvZiBEaXNjb3JkLmpzYCk7XG59XG4iLCAiaW1wb3J0IHsgRGVmYXVsdExpc3RlbmVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IExpc3RlbmVyU2lnbmF0dXJlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIFBsYXllckV2ZW50c0VtaXR0ZXI8TCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzIEV2ZW50RW1pdHRlcjxMPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPExbS10+KSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKG5hbWUpfVwiLiBFdmVudHMgJHt0aGlzLnJlcXVpcmVkRXZlbnRzLm1hcCgobSkgPT4gYFwiJHtTdHJpbmcobSl9XCJgKS5qb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICAgICAgICAgJ1VuaGFuZGxlZEV2ZW50c1dhcm5pbmcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmVtaXQobmFtZSwgLi4uYXJncyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBUaW1lRGF0YSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5jbGFzcyBVdGlsIHtcbiAgICAvKipcbiAgICAgKiBVdGlsc1xuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZHVyT2JqIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBkdXJhdGlvblN0cmluZyhkdXJPYmo6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKVxuICAgICAgICAgICAgLm1hcCgobSkgPT4gKGlzTmFOKG0pID8gMCA6IG0pKVxuICAgICAgICAgICAgLmpvaW4oJzonKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIFRoZSB0aW1lIGluIG1zXG4gICAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZU1TKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgICAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlzOiByb3VuZChtaWxsaXNlY29uZHMgLyA4NjQwMDAwMCksXG4gICAgICAgICAgICBob3Vyczogcm91bmQobWlsbGlzZWNvbmRzIC8gMzYwMDAwMCkgJSAyNCxcbiAgICAgICAgICAgIG1pbnV0ZXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDYwMDAwKSAlIDYwLFxuICAgICAgICAgICAgc2Vjb25kczogcm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCkgJSA2MFxuICAgICAgICB9IGFzIFRpbWVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICAgKiBAcGFyYW0ge1RpbWVEYXRhfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRUaW1lQ29kZShkdXJhdGlvbjogVGltZURhdGEpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGl0ZW1zLmZpbHRlcigoeCkgPT4gcmVxdWlyZWQuaW5jbHVkZXMoeCkpLm1hcCgobSkgPT4gZHVyYXRpb25bbSBhcyBrZXlvZiBUaW1lRGF0YV0pO1xuICAgICAgICBjb25zdCBmaW5hbCA9IHBhcnNlZFxuICAgICAgICAgICAgLnNsaWNlKHBhcnNlZC5maW5kSW5kZXgoKHgpID0+IHggIT09IDApKVxuICAgICAgICAgICAgLm1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpO1xuXG4gICAgICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyBsYXN0IGl0ZW0gb2YgdGhlIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgbGFzdDxUID0gYW55PihhcnI6IFRbXSk6IFQge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICAgICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWwgJiYgY2hhbm5lbC5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiAhbWVtYmVyLnVzZXIuYm90KS5zaXplID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhZmVyIHJlcXVpcmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgTm9kZSByZXF1aXJlIGlkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVxdWlyZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGluIG1zIHRvIHdhaXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgICAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgWydub2RlLWZldGNoJywgJ3VuZGljaSddKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vP1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgZGV0YWlsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICAgICAgcmV0dXJuIHNyY1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzcmMubGVuZ3RoKV07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgVkFMSURBVEVfUVVFVUVfQ0FQID0gKHF1ZXVlOiBHdWlsZFF1ZXVlLCBpdGVtczogUGxheWxpc3QgfCBUcmFjayB8IFRyYWNrW10pID0+IHtcbiAgICBjb25zdCB0cmFja3MgPSBpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gaXRlbXMudHJhY2tzIDogQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtpdGVtc107XG5cbiAgICBpZiAocXVldWUubWF4U2l6ZSA8IDEgfHwgcXVldWUubWF4U2l6ZSA9PT0gSW5maW5pdHkpIHJldHVybjtcblxuICAgIGNvbnN0IG1heENhcCA9IHF1ZXVlLmdldENhcGFjaXR5KCk7XG5cbiAgICBpZiAobWF4Q2FwIDwgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfU1BBQ0UoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzLmxlbmd0aCk7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgVXRpbCB9O1xuIiwgImltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBQbGF5bGlzdEluaXREYXRhLCBQbGF5bGlzdEpTT04sIFRyYWNrSlNPTiwgVHJhY2tTb3VyY2UgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcblxuZXhwb3J0IGNsYXNzIFBsYXlsaXN0IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG4gICAgcHVibGljIHRyYWNrczogVHJhY2tbXTtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgcHVibGljIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAgIHB1YmxpYyBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIHB1YmxpYyBhdXRob3I6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIHB1YmxpYyBpZDogc3RyaW5nO1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG4gICAgLyoqXG4gICAgICogUGxheWxpc3QgY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0ge1BsYXlsaXN0SW5pdERhdGF9IGRhdGEgVGhlIGRhdGFcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXllclxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNwbGF5ZXJcbiAgICAgICAgICogQHR5cGUge1BsYXllcn1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRyYWNrcyBpbiB0aGlzIHBsYXlsaXN0XG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3RyYWNrc1xuICAgICAgICAgKiBAdHlwZSB7VHJhY2tbXX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHJhY2tzID0gZGF0YS50cmFja3MgPz8gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3Igb2YgdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNhdXRob3JcbiAgICAgICAgICogQHR5cGUge29iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXV0aG9yID0gZGF0YS5hdXRob3I7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCNkZXNjcmlwdGlvblxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aHVtYm5haWwgb2YgdGhpcyBwbGF5bGlzdFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN0aHVtYm5haWxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOlxuICAgICAgICAgKiAtIGBhbGJ1bWBcbiAgICAgICAgICogLSBgcGxheWxpc3RgXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3R5cGVcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudHlwZSA9IGRhdGEudHlwZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHNvdXJjZSBvZiB0aGlzIHBsYXlsaXN0OlxuICAgICAgICAgKiAtIGB5b3V0dWJlYFxuICAgICAgICAgKiAtIGBzb3VuZGNsb3VkYFxuICAgICAgICAgKiAtIGBzcG90aWZ5YFxuICAgICAgICAgKiAtIGBhcmJpdHJhcnlgXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3NvdXJjZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I2lkXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5pZDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgICAgICAgKiBAbmFtZSBQbGF5bGlzdCN1cmxcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3Jhd1BsYXlsaXN0XG4gICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAgKi9cbiAgICB9XG5cbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLnRyYWNrcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5yZWR1Y2UoKHAsIGMpID0+IHAgKyBjLmR1cmF0aW9uTVMsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCBlc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoVHJhY2tzPXRydWVdIElmIGl0IHNob3VsZCBidWlsZCBqc29uIHdpdGggdHJhY2tzXG4gICAgICogQHJldHVybnMge1BsYXlsaXN0SlNPTn1cbiAgICAgKi9cbiAgICB0b0pTT04od2l0aFRyYWNrcyA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB0cmFja3M6IFtdIGFzIFRyYWNrSlNPTltdXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHdpdGhUcmFja3MpIHBheWxvYWQudHJhY2tzID0gdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSk7XG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhpcyBwbGF5bGlzdCB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyBwbGF5bGlzdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgcGxheWxpc3Qgc2hhbGwgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBVc2VyLCBlc2NhcGVNYXJrZG93biwgU25vd2ZsYWtlVXRpbCwgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBSYXdUcmFja0RhdGEsIFNlYXJjaFF1ZXJ5VHlwZSwgVHJhY2tKU09OIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgVHJhY2tSZXNvbHZhYmxlID0gVHJhY2sgfCBzdHJpbmcgfCBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIFdpdGhNZXRhZGF0YTxUIGV4dGVuZHMgb2JqZWN0LCBNPiA9IFQgJiB7XG4gICAgbWV0YWRhdGE6IE07XG4gICAgcmVxdWVzdE1ldGFkYXRhKCk6IFByb21pc2U8TT47XG59O1xuXG5leHBvcnQgY2xhc3MgVHJhY2s8VCA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgYXV0aG9yOiBzdHJpbmc7XG4gICAgcHVibGljIHVybDogc3RyaW5nO1xuICAgIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgICBwdWJsaWMgZHVyYXRpb246IHN0cmluZztcbiAgICBwdWJsaWMgdmlld3M6IG51bWJlcjtcbiAgICBwdWJsaWMgcmVxdWVzdGVkQnk6IFVzZXIgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgICBwdWJsaWMgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcbiAgICBwdWJsaWMgcmF3OiBSYXdUcmFja0RhdGEgPSB7XG4gICAgICAgIHNvdXJjZTogJ2FyYml0cmFyeSdcbiAgICB9IGFzIFJhd1RyYWNrRGF0YTtcbiAgICBwdWJsaWMgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHJpdmF0ZSBfX21ldGFkYXRhOiBUIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfX3JlcU1ldGFkYXRhRm46ICgpID0+IFByb21pc2U8VCB8IG51bGw+O1xuXG4gICAgLyoqXG4gICAgICogVHJhY2sgY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBUcmFja1xuICAgICAqIEBwYXJhbSBkYXRhIFRyYWNrIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyLCBkYXRhOiBQYXJ0aWFsPFdpdGhNZXRhZGF0YTxSYXdUcmFja0RhdGEsIFQ+Pikge1xuICAgICAgICB0aGlzLnRpdGxlID0gZXNjYXBlTWFya2Rvd24oZGF0YS50aXRsZSA/PyAnJyk7XG4gICAgICAgIHRoaXMuYXV0aG9yID0gZGF0YS5hdXRob3IgPz8gJyc7XG4gICAgICAgIHRoaXMudXJsID0gZGF0YS51cmwgPz8gJyc7XG4gICAgICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWwgPz8gJyc7XG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkYXRhLmR1cmF0aW9uID8/ICcnO1xuICAgICAgICB0aGlzLnZpZXdzID0gZGF0YS52aWV3cyA/PyAwO1xuICAgICAgICB0aGlzLnF1ZXJ5VHlwZSA9IGRhdGEucXVlcnlUeXBlO1xuICAgICAgICB0aGlzLnJlcXVlc3RlZEJ5ID0gZGF0YS5yZXF1ZXN0ZWRCeSB8fCBudWxsO1xuICAgICAgICB0aGlzLnBsYXlsaXN0ID0gZGF0YS5wbGF5bGlzdDtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgICAgICAgdGhpcy5yYXcgPSBPYmplY3QuYXNzaWduKHt9LCB7IHNvdXJjZTogZGF0YS5yYXc/LnNvdXJjZSA/PyBkYXRhLnNvdXJjZSB9LCBkYXRhLnJhdyA/PyBkYXRhKTtcbiAgICAgICAgdGhpcy5fX21ldGFkYXRhID0gZGF0YS5tZXRhZGF0YSA/PyBudWxsO1xuICAgICAgICB0aGlzLl9fcmVxTWV0YWRhdGFGbiA9IGRhdGEucmVxdWVzdE1ldGFkYXRhIHx8ICgoKSA9PiBQcm9taXNlLnJlc29sdmU8VCB8IG51bGw+KG51bGwpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3RNZXRhZGF0YSgpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fX3JlcU1ldGFkYXRhRm4oKTtcblxuICAgICAgICB0aGlzLnNldE1ldGFkYXRhKHJlcyk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWV0YWRhdGEobTogVCB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fX21ldGFkYXRhID0gbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRhZGF0YSBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19tZXRhZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIHRyYWNrIGhhcyBtZXRhZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzTWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXVlIGluIHdoaWNoIHRoaXMgdHJhY2sgaXMgbG9jYXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVldWUoKTogR3VpbGRRdWV1ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5maW5kKChxKSA9PiBxLnRyYWNrcy5zb21lKChhYikgPT4gYWIuaWQgPT09IHRoaXMuaWQpKSE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kXG4gICAgICovXG4gICAgcHVibGljIGdldCBkdXJhdGlvbk1TKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRpbWVzID0gKG46IG51bWJlciwgdDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBsZXQgdG4gPSAxO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0OyBpKyspIHRuICo9IG47XG4gICAgICAgICAgICByZXR1cm4gdCA8PSAwID8gMTAwMCA6IHRuICogMTAwMDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5kdXJhdGlvblxuICAgICAgICAgICAgLnNwbGl0KCc6JylcbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC5tYXAoKG0sIGkpID0+IHBhcnNlSW50KG0pICogdGltZXMoNjAsIGkpKVxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYykgPT4gYSArIGMsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2NvcmQgaHlwZXJsaW5rIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9IeXBlcmxpbmsoKTogc3RyaW5nIC8qIG5vdCB1c2luZyBgWyR7c3RyaW5nfV0oJHtzdHJpbmd9KWAgeWV0ICovIHtcbiAgICAgICAgcmV0dXJuIGBbJHt0aGlzLnRpdGxlfV0oJHt0aGlzLnVybH0pYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHNvdXJjZSBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldCBzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhdz8uc291cmNlID8/ICdhcmJpdHJhcnknO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmF3IEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyB0b0pTT04oaGlkZVBsYXlsaXN0PzogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICAgICAgICBkdXJhdGlvbk1TOiB0aGlzLmR1cmF0aW9uTVMsXG4gICAgICAgICAgICB2aWV3czogdGhpcy52aWV3cyxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5Py5pZCB8fCBudWxsLFxuICAgICAgICAgICAgcGxheWxpc3Q6IGhpZGVQbGF5bGlzdCA/IG51bGwgOiB0aGlzLnBsYXlsaXN0Py50b0pTT04oKSA/PyBudWxsXG4gICAgICAgIH0gYXMgVHJhY2tKU09OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiZWxvbmdpbmcgcXVldWVzIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmVsb25naW5nUXVldWVzKCkge1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT4gbm9kZS50cmFja3Muc29tZSgodCkgPT4gdC5pZCA9PT0gdGhpcy5pZCkpO1xuXG4gICAgICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyB0cmFjayBzaGFsbCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPik6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFNub3dmbGFrZSwgVXNlciwgVXNlclJlc29sdmFibGUsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IGRvd25sb2FkT3B0aW9ucyB9IGZyb20gJ3l0ZGwtY29yZSc7XG5pbXBvcnQgeyBRdWVyeUNhY2hlUHJvdmlkZXIgfSBmcm9tICcuLi91dGlscy9RdWVyeUNhY2hlJztcbmltcG9ydCB0eXBlIHsgSVBSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL3V0aWxzL0lQUm90YXRvcic7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB0eXBlIHsgQnJpZGdlUHJvdmlkZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcblxuZXhwb3J0IHR5cGUgRmlsdGVyc05hbWUgPSBrZXlvZiBRdWV1ZUZpbHRlcnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU2VhcmNoUmVzdWx0IHtcbiAgICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICAgIHRyYWNrczogVHJhY2tbXTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7QXVkaW9GaWx0ZXJzfSBRdWV1ZUZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICAgIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICAgIGJhc3Nib29zdD86IGJvb2xlYW47XG4gICAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAgICc4RCc/OiBib29sZWFuO1xuICAgIHZhcG9yd2F2ZT86IGJvb2xlYW47XG4gICAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgICBwaGFzZXI/OiBib29sZWFuO1xuICAgIHRyZW1vbG8/OiBib29sZWFuO1xuICAgIHZpYnJhdG8/OiBib29sZWFuO1xuICAgIHJldmVyc2U/OiBib29sZWFuO1xuICAgIHRyZWJsZT86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICAgIHN1cnJvdW5kaW5nPzogYm9vbGVhbjtcbiAgICBwdWxzYXRvcj86IGJvb2xlYW47XG4gICAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICAgIGthcmFva2U/OiBib29sZWFuO1xuICAgIGZsYW5nZXI/OiBib29sZWFuO1xuICAgIGdhdGU/OiBib29sZWFuO1xuICAgIGhhYXM/OiBib29sZWFuO1xuICAgIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgICBtb25vPzogYm9vbGVhbjtcbiAgICBtc3Rscj86IGJvb2xlYW47XG4gICAgbXN0cnI/OiBib29sZWFuO1xuICAgIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICAgIGV4cGFuZGVyPzogYm9vbGVhbjtcbiAgICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gICAgY2hvcnVzPzogYm9vbGVhbjtcbiAgICBjaG9ydXMyZD86IGJvb2xlYW47XG4gICAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICAgIGZhZGVpbj86IGJvb2xlYW47XG4gICAgZGltPzogYm9vbGVhbjtcbiAgICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgICBsb2ZpPzogYm9vbGVhbjtcbiAgICBzaWxlbmNlcmVtb3ZlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IFRyYWNrU291cmNlXG4gKi9cbmV4cG9ydCB0eXBlIFRyYWNrU291cmNlID0gJ3NvdW5kY2xvdWQnIHwgJ3lvdXR1YmUnIHwgJ3Nwb3RpZnknIHwgJ2FwcGxlX211c2ljJyB8ICdhcmJpdHJhcnknO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhd1RyYWNrRGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIFRoZSB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF1dGhvciBUaGUgYXV0aG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGR1cmF0aW9uIFRoZSBkdXJhdGlvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZpZXdzIFRoZSB2aWV3c1xuICogQHByb3BlcnR5IHtVc2VyfSByZXF1ZXN0ZWRCeSBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAqIEBwcm9wZXJ0eSB7UGxheWxpc3R9IFtwbGF5bGlzdF0gVGhlIHBsYXlsaXN0XG4gKiBAcHJvcGVydHkge1RyYWNrU291cmNlfSBbc291cmNlPVwiYXJiaXRyYXJ5XCJdIFRoZSBzb3VyY2VcbiAqIEBwcm9wZXJ0eSB7YW55fSBbZW5naW5lXSBUaGUgZW5naW5lXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsaXZlXSBJZiB0aGlzIHRyYWNrIGlzIGxpdmVcbiAqIEBwcm9wZXJ0eSB7YW55fSBbcmF3XSBUaGUgcmF3IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFja0RhdGEge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBhdXRob3I6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICBkdXJhdGlvbjogc3RyaW5nO1xuICAgIHZpZXdzOiBudW1iZXI7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAgIHNvdXJjZT86IFRyYWNrU291cmNlO1xuICAgIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbGl2ZT86IGJvb2xlYW47XG4gICAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGU7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGltZURhdGFcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkYXlzIFRpbWUgaW4gZGF5c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGhvdXJzIFRpbWUgaW4gaG91cnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtaW51dGVzIFRpbWUgaW4gbWludXRlc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHNlY29uZHMgVGltZSBpbiBzZWNvbmRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZURhdGEge1xuICAgIGRheXM6IG51bWJlcjtcbiAgICBob3VyczogbnVtYmVyO1xuICAgIG1pbnV0ZXM6IG51bWJlcjtcbiAgICBzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0aW1lY29kZXNdIElmIGl0IHNob3VsZCByZW5kZXIgdGltZSBjb2Rlc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcXVldWVdIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbGVuZ3RoXSBUaGUgYmFyIGxlbmd0aFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtsZWZ0Q2hhcl0gVGhlIGVsYXBzZWQgdGltZSB0cmFja1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyaWdodENoYXJdIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZXBhcmF0b3JdIFRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGltZXN0YW1wIGFuZCBsaW5lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2luZGljYXRvcl0gVGhlIGluZGljYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclByb2dyZXNzYmFyT3B0aW9ucyB7XG4gICAgdGltZWNvZGVzPzogYm9vbGVhbjtcbiAgICBsZW5ndGg/OiBudW1iZXI7XG4gICAgbGVmdENoYXI/OiBzdHJpbmc7XG4gICAgcmlnaHRDaGFyPzogc3RyaW5nO1xuICAgIHNlcGFyYXRvcj86IHN0cmluZztcbiAgICBpbmRpY2F0b3I/OiBzdHJpbmc7XG4gICAgcXVldWU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICogVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBBVVRPXG4gKiAtIFlPVVRVQkVcbiAqIC0gWU9VVFVCRV9QTEFZTElTVFxuICogLSBTT1VORENMT1VEX1RSQUNLXG4gKiAtIFNPVU5EQ0xPVURfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRFxuICogLSBTUE9USUZZX1NPTkdcbiAqIC0gU1BPVElGWV9BTEJVTVxuICogLSBTUE9USUZZX1BMQVlMSVNUXG4gKiAtIFNQT1RJRllfU0VBUkNIXG4gKiAtIEZBQ0VCT09LXG4gKiAtIFZJTUVPXG4gKiAtIEFSQklUUkFSWVxuICogLSBSRVZFUkJOQVRJT05cbiAqIC0gWU9VVFVCRV9TRUFSQ0hcbiAqIC0gWU9VVFVCRV9WSURFT1xuICogLSBTT1VORENMT1VEX1NFQVJDSFxuICogLSBBUFBMRV9NVVNJQ19TT05HXG4gKiAtIEFQUExFX01VU0lDX0FMQlVNXG4gKiAtIEFQUExFX01VU0lDX1BMQVlMSVNUXG4gKiAtIEFQUExFX01VU0lDX1NFQVJDSFxuICogLSBGSUxFXG4gKiAtIEFVVE9fU0VBUkNIXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgICBBVVRPOiAnYXV0bycsXG4gICAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICAgIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICAgIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gICAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gICAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gICAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgICBWSU1FTzogJ3ZpbWVvJyxcbiAgICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICAgIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gICAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICAgIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gICAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICAgIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgICBGSUxFOiAnZmlsZScsXG4gICAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJFdmVudHMge1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWUsIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gYW55O1xufVxuXG5leHBvcnQgZW51bSBQbGF5ZXJFdmVudCB7XG4gICAgZGVidWcgPSAnZGVidWcnLFxuICAgIGVycm9yID0gJ2Vycm9yJyxcbiAgICB2b2ljZVN0YXRlVXBkYXRlID0gJ3ZvaWNlU3RhdGVVcGRhdGUnXG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBsYXlPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmaWx0ZXJzVXBkYXRlPWZhbHNlXSBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtlbmNvZGVyQXJncz1bXV0gRkZtcGVnIGFyZ3MgcGFzc2VkIHRvIGVuY29kZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2Vla10gVGltZSB0byBzZWVrIHRvIGJlZm9yZSBwbGF5aW5nXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpbW1lZGlhdGU9ZmFsc2VdIElmIGl0IHNob3VsZCBzdGFydCBwbGF5aW5nIHRoZSBwcm92aWRlZCB0cmFjayBpbW1lZGlhdGVseVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgICBmaWx0ZXJzVXBkYXRlPzogYm9vbGVhbjtcbiAgICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICAgIHNlZWs/OiBudW1iZXI7XG4gICAgaW1tZWRpYXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlFeHRyYWN0b3JTZWFyY2ggPSBgZXh0OiR7c3RyaW5nfWA7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhcmNoT3B0aW9uc1xuICogQHByb3BlcnR5IHtVc2VyUmVzb2x2YWJsZX0gcmVxdWVzdGVkQnkgVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHNlYXJjaFxuICogQHByb3BlcnR5IHt0eXBlb2YgUXVlcnlUeXBlfHN0cmluZ30gW3NlYXJjaEVuZ2luZT0nYXV0byddIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Jsb2NrRXh0cmFjdG9yc1tdXSBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVDYWNoZV0gSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAqIEBwcm9wZXJ0eSB7U2VhcmNoUXVlcnlUeXBlfSBbZmFsbGJhY2tTZWFyY2hFbmdpbmU9J2F1dG9TZWFyY2gnXSBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICogQHByb3BlcnR5IHthbnl9IFtyZXF1ZXN0T3B0aW9uc10gVGhlIHJlcXVlc3Qgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlclJlc29sdmFibGU7XG4gICAgc2VhcmNoRW5naW5lPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2g7XG4gICAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gICAgaWdub3JlQ2FjaGU/OiBib29sZWFuO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmVxdWVzdE9wdGlvbnM/OiBhbnk7XG4gICAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbi8qKlxuICogVGhlIHF1ZXVlIHJlcGVhdCBtb2RlLiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIE9GRlxuICogLSBUUkFDS1xuICogLSBRVUVVRVxuICogLSBBVVRPUExBWVxuICogQHR5cGVkZWYge251bWJlcn0gUXVldWVSZXBlYXRNb2RlXG4gKi9cbmV4cG9ydCBlbnVtIFF1ZXVlUmVwZWF0TW9kZSB7XG4gICAgT0ZGID0gMCxcbiAgICBUUkFDSyA9IDEsXG4gICAgUVVFVUUgPSAyLFxuICAgIEFVVE9QTEFZID0gM1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBsYXlsaXN0SW5pdERhdGFcbiAqIEBwcm9wZXJ0eSB7VHJhY2tbXX0gdHJhY2tzIFRoZSB0cmFja3Mgb2YgdGhpcyBwbGF5bGlzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIFRoZSBwbGF5bGlzdCB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRodW1ibmFpbCBUaGUgdGh1bWJuYWlsXG4gKiBAcHJvcGVydHkge2FsYnVtfHBsYXlsaXN0fSB0eXBlIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICogQHByb3BlcnR5IHtUcmFja1NvdXJjZX0gc291cmNlIFRoZSBwbGF5bGlzdCBzb3VyY2VcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBhdXRob3IgVGhlIHBsYXlsaXN0IGF1dGhvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthdXRob3IubmFtZV0gVGhlIGF1dGhvciBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2F1dGhvci51cmxdIFRoZSBhdXRob3IgdXJsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgVGhlIHBsYXlsaXN0IGlkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSBwbGF5bGlzdCB1cmxcbiAqIEBwcm9wZXJ0eSB7YW55fSBbcmF3UGxheWxpc3RdIFRoZSByYXcgcGxheWxpc3QgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SW5pdERhdGEge1xuICAgIHRyYWNrczogVHJhY2tbXTtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gICAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgICBhdXRob3I6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRyYWNrSlNPTlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIFRoZSB0cmFjayB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uIFRoZSB0cmFjayBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF1dGhvciBUaGUgYXV0aG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSB1cmxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aHVtYm5haWwgVGhlIHRodW1ibmFpbFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGR1cmF0aW9uIFRoZSBkdXJhdGlvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IGR1cmF0aW9uTVMgVGhlIGR1cmF0aW9uIGluIG1zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmlld3MgVGhlIHZpZXdzIGNvdW50XG4gKiBAcHJvcGVydHkge1Nub3dmbGFrZX0gcmVxdWVzdGVkQnkgVGhlIGlkIG9mIHRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICogQHByb3BlcnR5IHtQbGF5bGlzdEpTT059IFtwbGF5bGlzdF0gVGhlIHBsYXlsaXN0IGluZm8gKGlmIGFueSlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFja0pTT04ge1xuICAgIGlkOiBTbm93Zmxha2U7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIGR1cmF0aW9uOiBzdHJpbmc7XG4gICAgZHVyYXRpb25NUzogbnVtYmVyO1xuICAgIHZpZXdzOiBudW1iZXI7XG4gICAgcmVxdWVzdGVkQnk6IFNub3dmbGFrZTtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0SlNPTjtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQbGF5bGlzdEpTT05cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCBUaGUgcGxheWxpc3QgaWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgVGhlIHBsYXlsaXN0IHVybFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlIFRoZSBwbGF5bGlzdCB0aXRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uIFRoZSBwbGF5bGlzdCBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRodW1ibmFpbCBUaGUgdGh1bWJuYWlsXG4gKiBAcHJvcGVydHkge2FsYnVtfHBsYXlsaXN0fSB0eXBlIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICogQHByb3BlcnR5IHtUcmFja1NvdXJjZX0gc291cmNlIFRoZSB0cmFjayBzb3VyY2VcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBhdXRob3IgVGhlIHBsYXlsaXN0IGF1dGhvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthdXRob3IubmFtZV0gVGhlIGF1dGhvciBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2F1dGhvci51cmxdIFRoZSBhdXRob3IgdXJsXG4gKiBAcHJvcGVydHkge1RyYWNrSlNPTltdfSB0cmFja3MgVGhlIHRyYWNrcyBkYXRhIChpZiBhbnkpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RKU09OIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAgIGF1dGhvcjoge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgdHJhY2tzOiBUcmFja0pTT05bXTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQbGF5ZXJJbml0T3B0aW9uc1xuICogQHByb3BlcnR5IHtZVERMRG93bmxvYWRPcHRpb25zfSBbeXRkbE9wdGlvbnNdIFRoZSBvcHRpb25zIHBhc3NlZCB0byBgeXRkbC1jb3JlYFxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjb25uZWN0aW9uVGltZW91dD0yMDAwMF0gVGhlIHZvaWNlIGNvbm5lY3Rpb24gdGltZW91dFxuICogQHByb3BlcnR5IHtib29sZWFufSBbbGFnTW9uaXRvcj0zMDAwMF0gVGltZSBpbiBtcyB0byByZS1tb25pdG9yIGV2ZW50IGxvb3AgbGFnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2NrVm9pY2VTdGF0ZUhhbmRsZXJdIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtibG9ja0V4dHJhY3RvcnNdIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHF1ZXJ5aW5nIG1ldGFkYXRhIGZyb21cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtibG9ja1N0cmVhbUZyb21dIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHN0cmVhbWluZyBmcm9tXG4gKiBAcHJvcGVydHkge1F1ZXJ5Q2FjaGUgfCBudWxsfSBbcXVlcnlDYWNoZV0gUXVlcnkgY2FjaGUgcHJvdmlkZXJcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZUluc3RhbmNlXSBJZ25vcmUgcGxheWVyIGluc3RhbmNlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VMZWdhY3lGRm1wZWddIFVzZSBsZWdhY3kgdmVyc2lvbiBvZiBmZm1wZWdcbiAqIEBwcm9wZXJ0eSB7QnJpZGdlUHJvdmlkZXJ9IFticmlkZ2VQcm92aWRlcl0gU2V0IGJyaWRnZSBwcm92aWRlclxuICogQHByb3BlcnR5IHtvYmplY3R9IFtpcGNvbmZpZ10gSVAgcm90YXRvciBjb25maWdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gICAgeXRkbE9wdGlvbnM/OiBkb3dubG9hZE9wdGlvbnM7XG4gICAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gICAgbGFnTW9uaXRvcj86IG51bWJlcjtcbiAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAgIGJsb2NrRXh0cmFjdG9ycz86IHN0cmluZ1tdO1xuICAgIGJsb2NrU3RyZWFtRnJvbT86IHN0cmluZ1tdO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcXVlcnlDYWNoZT86IFF1ZXJ5Q2FjaGVQcm92aWRlcjxhbnk+IHwgbnVsbDtcbiAgICBpZ25vcmVJbnN0YW5jZT86IGJvb2xlYW47XG4gICAgdXNlTGVnYWN5RkZtcGVnPzogYm9vbGVhbjtcbiAgICBicmlkZ2VQcm92aWRlcj86IEJyaWRnZVByb3ZpZGVyO1xuICAgIGlwY29uZmlnPzogSVBSb3RhdGlvbkNvbmZpZztcbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBRdWVyeUV4dHJhY3RvclNlYXJjaCwgUXVlcnlUeXBlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHREYXRhIHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgICBleHRyYWN0b3I/OiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M/OiBUcmFja1tdO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHByaXZhdGUgX2RhdGE6IFNlYXJjaFJlc3VsdERhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFF1ZXJ5VHlwZSh0eXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCkge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZXF1ZXN0ZWRCeSh1c2VyOiBVc2VyKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWVyeVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXlsaXN0IHJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWNrcyByZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRyYWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RlZCBieVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmUtZXhlY3V0ZSB0aGlzIHNlYXJjaFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgICAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9GaWx0ZXJzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgICAgIGJhc3Nib29zdF9sb3c6IGJhc3MoMTUpLFxuICAgICAgICBiYXNzYm9vc3Q6IGJhc3MoMjApLFxuICAgICAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgICAgICc4RCc6ICdhcHVsc2F0b3I9aHo9MC4wOScsXG4gICAgICAgIHZhcG9yd2F2ZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjgnLFxuICAgICAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgICAgIGxvZmk6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC45LGV4dHJhc3RlcmVvPW09Mi41OmM9ZGlzYWJsZWQnLFxuICAgICAgICBwaGFzZXI6ICdhcGhhc2VyPWluX2dhaW49MC40JyxcbiAgICAgICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgICAgICB2aWJyYXRvOiAndmlicmF0bz1mPTYuNScsXG4gICAgICAgIHJldmVyc2U6ICdhcmV2ZXJzZScsXG4gICAgICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgICAgICBub3JtYWxpemVyMjogJ2R5bmF1ZG5vcm09Zz0xMDEnLFxuICAgICAgICBub3JtYWxpemVyOiAnYWNvbXByZXNzb3InLFxuICAgICAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICAgICAgcHVsc2F0b3I6ICdhcHVsc2F0b3I9aHo9MScsXG4gICAgICAgIHN1YmJvb3N0OiAnYXN1YmJvb3N0JyxcbiAgICAgICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgICAgIGZsYW5nZXI6ICdmbGFuZ2VyJyxcbiAgICAgICAgZ2F0ZTogJ2FnYXRlJyxcbiAgICAgICAgaGFhczogJ2hhYXMnLFxuICAgICAgICBtY29tcGFuZDogJ21jb21wYW5kJyxcbiAgICAgICAgbW9ubzogJ3Bhbj1tb25vfGMwPS41KmMwKy41KmMxJyxcbiAgICAgICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICAgICAgbXN0cnI6ICdzdGVyZW90b29scz1tb2RlPW1zPnJyJyxcbiAgICAgICAgY29tcHJlc3NvcjogJ2NvbXBhbmQ9cG9pbnRzPS04MC8tMTA1fC02Mi8tODB8LTE1LjQvLTE1LjR8MC8tMTJ8MjAvLTcuNicsXG4gICAgICAgIGV4cGFuZGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tMTY5fC01NC8tODB8LTQ5LjUvLTY0LjZ8LTQxLjEvLTQxLjF8LTI1LjgvLTE1fC0xMC44Ly00LjV8MC8wfDIwLzguMycsXG4gICAgICAgIHNvZnRsaW1pdGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgICAgICBjaG9ydXM6ICdjaG9ydXM9MC43OjAuOTo1NTowLjQ6MC4yNToyJyxcbiAgICAgICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgICAgICBmYWRlaW46ICdhZmFkZT10PWluOnNzPTA6ZD0xMCcsXG4gICAgICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgICAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnLFxuICAgICAgICBzaWxlbmNlcmVtb3ZlOiAnc2lsZW5jZXJlbW92ZT0xOjA6LTUwZEInXG4gICAgfTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXM8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihuYW1lOiBLKSB7XG4gICAgICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHsgbmFtZTogRmlsdGVyc05hbWU7IHZhbHVlOiBzdHJpbmcgfT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpbHRlcnMpKSB7XG4gICAgICAgICAgICB5aWVsZCB7IG5hbWU6IGsgYXMgRmlsdGVyc05hbWUsIHZhbHVlOiB2IGFzIHN0cmluZyB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXQgbmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpIGFzIEZpbHRlcnNOYW1lW107XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzLm1hcCgobSkgPT4gKHRoaXMgYXMgYW55KVttXSkuam9pbignLCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmZtcGVnIGFyZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbHRlcnMgbmFtZVxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciBuYW1lXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KGZpbHRlcnM/OiBLW10pIHtcbiAgICAgICAgaWYgKCFmaWx0ZXJzIHx8ICFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gZmlsdGVyc1xuICAgICAgICAgICAgLmZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IHRoaXMuZ2V0KG0pKVxuICAgICAgICAgICAgLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGF1ZGlvIGZpbHRlclxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZmbXBlZyBhcmdzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmUoZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyc1tmaWx0ZXJOYW1lIGFzIEZpbHRlcnNOYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbXVsdGlwbGUgYXVkaW8gZmlsdGVyc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJzQXJyYXkgQXJyYXkgb2YgZmlsdGVycyBjb250YWluaW5nIHRoZSBmaWx0ZXIgbmFtZSBhbmQgZmZtcGVnIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZUJ1bGsoZmlsdGVyc0FycmF5OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pIHtcbiAgICAgICAgZmlsdGVyc0FycmF5LmZvckVhY2goKGFycikgPT4gdGhpcy5kZWZpbmUoYXJyLm5hbWUsIGFyci52YWx1ZSkpO1xuICAgIH1cbn1cbiIsICJjb25zdCBEaXNjb3JkUGxheWVyRXJyb3JzID0ge1xuICAgIEVSUl9PVVRfT0ZfU1BBQ0U6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9PVVRfT0ZfU1BBQ0UnLFxuICAgICAgICB0eXBlOiBSYW5nZUVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgY2FwYWNpdHk6IG51bWJlciwgdG90YWw6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIGBNYXggY2FwYWNpdHkgcmVhY2hlZCBmb3IgJHt0YXJnZXR9IChDYXBhY2l0eSAke2NhcGFjaXR5fS9Ub3RhbCAke3RvdGFsfSlgO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5WQUxJRF9BUkdfVFlQRToge1xuICAgICAgICBuYW1lOiAnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICAgICAgICB0eXBlOiBUeXBlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBleHBlY3RhdGlvbjogc3RyaW5nLCBmb3VuZDogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYEV4cGVjdGVkICR7dGFyZ2V0fSB0byBiZSBcIiR7ZXhwZWN0YXRpb259XCIsIHJlY2VpdmVkIFwiJHtmb3VuZH1cImA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19SRVNVTFQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19SRVNVTFQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PVF9JTVBMRU1FTlRFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT1RfRVhJU1RJTkc6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHt0YXJnZXR9IGRvZXMgbm90IGV4aXN0YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX09VVF9PRl9SQU5HRToge1xuICAgICAgICBuYW1lOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gICAgICAgIHR5cGU6IFJhbmdlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtaW5pbXVtOiBzdHJpbmcsIG1heGltdW06IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWF4aW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZSB8fCAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0Pyc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuICdDYW5ub3QgdXNlIGRlc3Ryb3llZCB2b2ljZSBjb25uZWN0aW9uJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuICdDb3VsZCBub3QgZ2V0IHRoZSB2b2ljZSBjaGFubmVsJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTDoge1xuICAgICAgICBuYW1lOiAnRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcigpIHtcbiAgICAgICAgICAgIHJldHVybiAnRXhwZWN0ZWQgYSB2b2ljZSBjaGFubmVsJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX1JFQ0VJVkVSOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fUkVDRUlWRVInLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IobWVzc2FnZT86IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UgfHwgJ05vIHZvaWNlIHJlY2VpdmVyIGlzIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/JztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0ZGTVBFR19MT0NBVE9SOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfRkZNUEVHX0xPQ0FUT1InLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX0FVRElPX1JFU09VUkNFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fQVVESU9fUkVTT1VSQ0UnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IobWVzc2FnZT86IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGFuIGF1ZGlvIHJlc291cmNlJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX0dVSUxEX1FVRVVFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fR1VJTERfUVVFVUUnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IobWVzc2FnZT86IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQgcXVldWUnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTEQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9JTkZPX1JFUVVJUkVEOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfSU5GT19SRVFVSVJFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgYWN0dWFsOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgRXhwZWN0ZWQgJHt0YXJnZXR9LCBmb3VuZCBcIiR7YWN0dWFsfVwiYDtcbiAgICAgICAgfVxuICAgIH1cbn0gYXMgY29uc3Q7XG5cbnR5cGUgRmluYWxFeGNlcHRpb248TyBleHRlbmRzICh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylba2V5b2YgdHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnNdPiA9IHtcbiAgICBuYW1lOiBPWyduYW1lJ107XG59ICYgSW5zdGFuY2VUeXBlPE9bJ3R5cGUnXT47XG5cbnR5cGUgRGlzY29yZFBsYXllckV4Y2VwdGlvbiA9IHtcbiAgICBbSyBpbiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc106ICguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS11bJ2NyZWF0ZUVycm9yJ10+KSA9PiBGaW5hbEV4Y2VwdGlvbjwodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW0tdPjtcbn07XG5cbmNvbnN0IHRhcmdldCA9IHt9IGFzIERpc2NvcmRQbGF5ZXJFeGNlcHRpb247XG5cbmNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjx0eXBlb2YgdGFyZ2V0PiA9IHtcbiAgICBnZXQodGFyZ2V0LCBwOiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycywgcmVjZWl2ZXIpIHtcbiAgICAgICAgY29uc3QgZXJyID0gRGlzY29yZFBsYXllckVycm9yc1twXTtcblxuICAgICAgICBpZiAoIWVycikgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuXG4gICAgICAgIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIGVycilbJ2NyZWF0ZUVycm9yJ10+KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgZXJyLnR5cGUoZXJyLmNyZWF0ZUVycm9yKC4uLmFyZ3MpKTtcbiAgICAgICAgICAgIGV4Y2VwdGlvbi5uYW1lID0gZXJyLm5hbWU7XG5cbiAgICAgICAgICAgIHJldHVybiBleGNlcHRpb247XG4gICAgICAgIH07XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IEVycm9yQ29kZXMgPSAoKCkgPT4ge1xuICAgIHR5cGUgRXJyQ29kZXMgPSB7XG4gICAgICAgIC1yZWFkb25seSBbSyBpbiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc106ICh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS11bJ25hbWUnXTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGljdCA9IHt9IGFzIEVyckNvZGVzO1xuXG4gICAgZm9yIChjb25zdCBwcm9wIGluIERpc2NvcmRQbGF5ZXJFcnJvcnMpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBkaWN0W3Byb3BdID0gcHJvcDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShkaWN0KTtcbn0pKCk7XG5leHBvcnQgY29uc3QgRXhjZXB0aW9ucyA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpO1xuIiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFBsYXllckV2ZW50cywgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuLi9tYW5hZ2VyJztcblxuZXhwb3J0IGNsYXNzIEJhc2VFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpZGVudGlmaWVyID0gJ2NvbS5kaXNjb3JkLXBsYXllci5leHRyYWN0b3InO1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGJyaWRnZSBxdWVyeSBjcmVhdGlvblxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYnVpbGQgcXVlcnkgZm9yXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUJyaWRnZVF1ZXJ5ID0gKHRyYWNrOiBUcmFjaykgPT4gYCR7dHJhY2sudGl0bGV9IGJ5ICR7dHJhY2suYXV0aG9yfSBvZmZpY2lhbCBhdWRpb2A7XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0b3IgY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIG9wdGlvbnMgSW5pdGlhbGl6YXRpb24gb3B0aW9ucyBmb3IgdGhpcyBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIHB1YmxpYyBvcHRpb25zOiBUID0gPFQ+e30pIHt9XG5cbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGdldCBpZGVudGlmaWVyKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIEJhc2VFeHRyYWN0b3IpLmlkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjb25maWd1cmVzIHRoaXMgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG5ldyBvcHRpb25zIHRvIGFwcGx5XG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJlY29uZmlndXJlKG9wdGlvbnM6IFQpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgYXdhaXQgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGFjdGl2YXRlKCkge1xuICAgICAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGRlYWN0aXZhdGUoKSB7XG4gICAgICAgIC8vIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGluY29taW5nIHF1ZXJ5XG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byB2YWxpZGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB2YWxpZGF0ZShxdWVyeTogc3RyaW5nLCB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB2b2lkIHR5cGU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJlYW0gdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIGluZm8gVGhlIHRyYWNrIHRvIHN0cmVhbVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzdHJlYW0oaW5mbzogVHJhY2spOiBQcm9taXNlPFJlYWRhYmxlIHwgc3RyaW5nPiB7XG4gICAgICAgIHZvaWQgaW5mbztcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uc3RyZWFtKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIGdpdmVuIHF1ZXJ5XG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKHF1ZXJ5OiBzdHJpbmcsIGNvbnRleHQ6IEV4dHJhY3RvclNlYXJjaENvbnRleHQpOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICAgICAgdm9pZCBjb250ZXh0O1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5oYW5kbGUoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGVkIHRyYWNrcyBmb3IgdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayBzb3VyY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRlZFRyYWNrcyh0cmFjazogVHJhY2ssIGhpc3Rvcnk6IEd1aWxkUXVldWVIaXN0b3J5KTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgdHJhY2s7XG4gICAgICAgIHZvaWQgaGlzdG9yeTtcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZ2V0UmVsYXRlZFRyYWNrcygpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzdHJlYW0gbWlkZGxld2FyZSB0byBoYW5kbGUgc3RyZWFtcyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW5jb21pbmcgc3RyZWFtXG4gICAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlUG9zdFN0cmVhbShzdHJlYW06IFJlYWRhYmxlLCBuZXh0OiBOZXh0RnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5leHQobnVsbCwgc3RyZWFtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBkaXNwYXRjaFxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAgICovXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIFBsYXllckV2ZW50cz4oZXZlbnQ6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZXh0cmFjdG9yIHJlc3BvbnNlXG4gICAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsLCB0cmFja3M6IFRyYWNrW10gPSBwbGF5bGlzdD8udHJhY2tzIHx8IFtdKTogRXh0cmFjdG9ySW5mbyB7XG4gICAgICAgIHJldHVybiB7IHBsYXlsaXN0OiBwbGF5bGlzdCB8fCBudWxsLCB0cmFja3MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElQIHJvdGF0b3IgaW5zdGFuY2UsIGlmIGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm91dGVQbGFubmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5yb3V0ZVBsYW5uZXI7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXh0RnVuY3Rpb24gPSAoZXJyb3I/OiBFcnJvciB8IG51bGwsIHN0cmVhbT86IFJlYWRhYmxlKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckluZm8ge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICAgIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IGtub3duRXh0cmFjdG9yS2V5cyA9IFtcbiAgICAnU3BvdGlmeUV4dHJhY3RvcicsXG4gICAgJ0FwcGxlTXVzaWNFeHRyYWN0b3InLFxuICAgICdTb3VuZENsb3VkRXh0cmFjdG9yJyxcbiAgICAnWW91VHViZUV4dHJhY3RvcicsXG4gICAgJ1ZpbWVvRXh0cmFjdG9yJyxcbiAgICAnUmV2ZXJibmF0aW9uRXh0cmFjdG9yJyxcbiAgICAnQXR0YWNobWVudEV4dHJhY3Rvcidcbl0gYXMgY29uc3Q7XG5jb25zdCBrbm93bkV4dHJhY3RvckxpYiA9ICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25FdmVudHMge1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyByZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICByZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyB1bnJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyB1bnJlZ2lzdGVyZWRcbiAgICAgKi9cbiAgICB1bnJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIGFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZGVhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgZmFpbHMgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAgICovXG4gICAgZXJyb3I6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAgIHB1YmxpYyBzdG9yZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgQmFzZUV4dHJhY3Rvcj4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7XG4gICAgICAgIHN1cGVyKFsnZXJyb3InXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBkZWZhdWx0IGV4dHJhY3RvcnMgZnJvbSBgQGRpc2NvcmQtcGxheWVyL2V4dHJhY3RvcmBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbG9hZERlZmF1bHQoZmlsdGVyPzogKGV4dDogKHR5cGVvZiBrbm93bkV4dHJhY3RvcktleXMpW251bWJlcl0pID0+IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgVXRpbC5pbXBvcnQoa25vd25FeHRyYWN0b3JMaWIpO1xuICAgICAgICBpZiAobW9kLmVycm9yKSByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6IG1vZC5lcnJvciBhcyBFcnJvciB9O1xuXG4gICAgICAgIChmaWx0ZXIgPyBrbm93bkV4dHJhY3RvcktleXMuZmlsdGVyKGZpbHRlcikgOiBrbm93bkV4dHJhY3RvcktleXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFtb2QubW9kdWxlW2tleV0pIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoPHR5cGVvZiBCYXNlRXh0cmFjdG9yPm1vZC5tb2R1bGVba2V5XSwge30pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGlmIHRoZSBnaXZlbiBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlZ2lzdGVyZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byByZWdpc3RlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcjxPIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgdHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4+KF9leHRyYWN0b3I6IFQsIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKTogUHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPiB7XG4gICAgICAgIGlmICh0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fCB0aGlzLnN0b3JlLmhhcyhfZXh0cmFjdG9yLmlkZW50aWZpZXIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IF9leHRyYWN0b3IodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5wbGF5ZXIub3B0aW9ucy5icmlkZ2VQcm92aWRlcikgb3B0aW9ucy5icmlkZ2VQcm92aWRlciA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5icmlkZ2VQcm92aWRlcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXQoX2V4dHJhY3Rvci5pZGVudGlmaWVyLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGFjdGl2YXRlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RvciBhcyB1bmtub3duIGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGFjdGl2YXRlISBFcnJvcjogJHtlfWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gdW5yZWdpc3RlclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyPEsgZXh0ZW5kcyBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yPihfZXh0cmFjdG9yOiBLKSB7XG4gICAgICAgIGNvbnN0IGV4dHJhY3RvciA9IHR5cGVvZiBfZXh0cmFjdG9yID09PSAnc3RyaW5nJyA/IHRoaXMuc3RvcmUuZ2V0KF9leHRyYWN0b3IpIDogdGhpcy5zdG9yZS5maW5kKChyKSA9PiByID09PSBfZXh0cmFjdG9yKTtcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHJldHVybjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgdGhpcy5zdG9yZS5maW5kS2V5KChlKSA9PiBlID09PSBleHRyYWN0b3IpITtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGlzYWJsZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3VucmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICBhd2FpdCBleHRyYWN0b3IuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBkZWFjdGl2YXRlIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVyIGFsbCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJBbGwoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnN0b3JlLm1hcCgoZSkgPT4gdGhpcy51bnJlZ2lzdGVyKGUpKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVuIGFsbCB0aGUgZXh0cmFjdG9yc1xuICAgICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIGZpbHRlckJsb2NrZWQgRmlsdGVyIGJsb2NrZWQgZXh0cmFjdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KGZuOiBFeHRyYWN0b3JFeGVjdXRpb25GTjxUPiwgZmlsdGVyQmxvY2tlZCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/IFtdO1xuXG4gICAgICAgIGlmICghdGhpcy5zdG9yZS5zaXplKSB7XG4gICAgICAgICAgICBVdGlsLndhcm4oJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLCAnTm9FeHRyYWN0b3JzJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXJyOiBFcnJvciB8IG51bGwgPSBudWxsLFxuICAgICAgICAgICAgbGFzdEV4dDogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXh0IG9mIHRoaXMuc3RvcmUudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJCbG9ja2VkICYmIGJsb2NrZWQuc29tZSgoZSkgPT4gZSA9PT0gZXh0LmlkZW50aWZpZXIpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0uLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGV4dCkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZmFpbGVkIHdpdGggZXJyb3I6ICR7ZX1gKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHlwZVV0aWwuaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoYCR7ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsYXN0RXh0ID0gZXh0O1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmICFUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBleHQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUPjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgZXJyID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBsYXN0RXh0ISxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogZmFsc2VcbiAgICAgICAgICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PGZhbHNlPjtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yO1xuICAgIGVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiBQcm9taXNlPFQgfCBib29sZWFuPjtcbiIsICJleHBvcnQgY2xhc3MgVHlwZVV0aWwge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBUeXBlVXRpbDtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIHB1YmxpYyBzdGF0aWMgaXNGdW5jdGlvbih0OiB1bmtub3duKTogdCBpcyBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHQ6IHVua25vd24pOiB0IGlzIG51bWJlciB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnc3RyaW5nJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQm9vbGVhbih0OiB1bmtub3duKTogdCBpcyBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc051bGxpc2godDogdW5rbm93bik6IHQgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0ID09IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNFcnJvcih0OiB1bmtub3duKTogdCBpcyBFcnJvciB7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMsIEJpcXVhZEZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVSZXBlYXRNb2RlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gdW5rbm93bj4ge1xuICAgIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgICB2b2x1bWU/OiBudW1iZXI7XG4gICAgZXF1YWxpemVyPzogRXF1YWxpemVyQmFuZFtdO1xuICAgIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdO1xuICAgIGJpcXVhZD86IEJpcXVhZEZpbHRlcnM7XG4gICAgcmVzYW1wbGVyPzogbnVtYmVyO1xuICAgIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgICBza2lwT25Ob1N0cmVhbT86IGJvb2xlYW47XG4gICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gICAgcGF1c2VPbkVtcHR5PzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHk/OiBib29sZWFuO1xuICAgIGxlYXZlT25FbXB0eUNvb2xkb3duPzogbnVtYmVyO1xuICAgIGxlYXZlT25FbmQ/OiBib29sZWFuO1xuICAgIGxlYXZlT25FbmRDb29sZG93bj86IG51bWJlcjtcbiAgICBsZWF2ZU9uU3RvcD86IGJvb2xlYW47XG4gICAgbGVhdmVPblN0b3BDb29sZG93bj86IG51bWJlcjtcbiAgICBtZXRhZGF0YT86IFQgfCBudWxsO1xuICAgIHNlbGZEZWFmPzogYm9vbGVhbjtcbiAgICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgICBkZWZhdWx0RkZtcGVnRmlsdGVycz86IEZpbHRlcnNOYW1lW107XG4gICAgYnVmZmVyaW5nVGltZW91dD86IG51bWJlcjtcbiAgICBub0VtaXRJbnNlcnQ/OiBib29sZWFuO1xuICAgIG1heFNpemU/OiBudW1iZXI7XG4gICAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlRXF1YWxpemVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlRmlsdGVyZXI/OiBib29sZWFuO1xuICAgIGRpc2FibGVCaXF1YWQ/OiBib29sZWFuO1xuICAgIGRpc2FibGVSZXNhbXBsZXI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBOb2RlUmVzb2x2YWJsZSA9IEd1aWxkUXVldWUgfCBHdWlsZFJlc29sdmFibGU7XG5cbmV4cG9ydCBjbGFzcyBHdWlsZE5vZGVNYW5hZ2VyPE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGNhY2hlID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBHdWlsZFF1ZXVlPigpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZ3VpbGQgcXVldWUgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICAgKiBAcGFyYW0gZ3VpbGQgVGhlIGd1aWxkIHdoaWNoIHdpbGwgYmUgdGhlIG93bmVyIG9mIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFF1ZXVlIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlPFQgPSBNZXRhPihndWlsZDogR3VpbGRSZXNvbHZhYmxlLCBvcHRpb25zOiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+ID0ge30pOiBHdWlsZFF1ZXVlPFQ+IHtcbiAgICAgICAgY29uc3Qgc2VydmVyID0gdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlKGd1aWxkKTtcbiAgICAgICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0dVSUxEKCdJbnZhbGlkIG9yIHVua25vd24gZ3VpbGQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNhY2hlLmhhcyhzZXJ2ZXIuaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoc2VydmVyLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5zdHJhdGVneSA/Pz0gJ0ZJRk8nO1xuICAgICAgICBvcHRpb25zLnZvbHVtZSA/Pz0gMTAwO1xuICAgICAgICBvcHRpb25zLmVxdWFsaXplciA/Pz0gW107XG4gICAgICAgIG9wdGlvbnMuYV9maWx0ZXIgPz89IFtdO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVIaXN0b3J5ID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5za2lwT25Ob1N0cmVhbSA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbmQgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMucmVzYW1wbGVyID8/PSA0ODAwMDtcbiAgICAgICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dDtcbiAgICAgICAgb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0ID8/PSAxMDAwO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICAvLyB0b2RvKHR3bGl0ZSk6IG1heWJlIGRpc2FibGUgdGhlc2UgYnkgZGVmYXVsdD9cbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlQmlxdWFkID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVWb2x1bWUgPz89IGZhbHNlO1xuXG4gICAgICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nKSAmJiAhb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgYXMgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICBndWlsZDogc2VydmVyLFxuICAgICAgICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgICAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICAgICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICAgICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgICAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgICAgICAgc2tpcE9uTm9TdHJlYW06IG9wdGlvbnMuc2tpcE9uTm9TdHJlYW0sXG4gICAgICAgICAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSxcbiAgICAgICAgICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSxcbiAgICAgICAgICAgIHJlcGVhdE1vZGU6IG9wdGlvbnMucmVwZWF0TW9kZSxcbiAgICAgICAgICAgIGxlYXZlT25FbXB0eTogb3B0aW9ucy5sZWF2ZU9uRW1wdHksXG4gICAgICAgICAgICBsZWF2ZU9uRW1wdHlDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93bixcbiAgICAgICAgICAgIGxlYXZlT25FbmQ6IG9wdGlvbnMubGVhdmVPbkVuZCxcbiAgICAgICAgICAgIGxlYXZlT25FbmRDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24sXG4gICAgICAgICAgICBsZWF2ZU9uU3RvcDogb3B0aW9ucy5sZWF2ZU9uU3RvcCxcbiAgICAgICAgICAgIGxlYXZlT25TdG9wQ29vbGRvd246IG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bixcbiAgICAgICAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IG9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgICAgICAgIHNlbGZEZWFmOiBvcHRpb25zLnNlbGZEZWFmLFxuICAgICAgICAgICAgZmZtcGVnRmlsdGVyczogb3B0aW9ucy5kZWZhdWx0RkZtcGVnRmlsdGVycyA/PyBbXSxcbiAgICAgICAgICAgIGJ1ZmZlcmluZ1RpbWVvdXQ6IG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCxcbiAgICAgICAgICAgIG5vRW1pdEluc2VydDogb3B0aW9ucy5ub0VtaXRJbnNlcnQgPz8gZmFsc2UsXG4gICAgICAgICAgICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE6IG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhLFxuICAgICAgICAgICAgbWF4SGlzdG9yeVNpemU6IG9wdGlvbnMubWF4SGlzdG9yeVNpemUsXG4gICAgICAgICAgICBtYXhTaXplOiBvcHRpb25zLm1heFNpemUsXG4gICAgICAgICAgICBwYXVzZU9uRW1wdHk6IG9wdGlvbnMucGF1c2VPbkVtcHR5LFxuICAgICAgICAgICAgZGlzYWJsZUJpcXVhZDogb3B0aW9ucy5kaXNhYmxlQmlxdWFkLFxuICAgICAgICAgICAgZGlzYWJsZUVxdWFsaXplcjogb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgICAgICAgZGlzYWJsZUZpbHRlcmVyOiBvcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgICAgICAgIGRpc2FibGVSZXNhbXBsZXI6IG9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICAgIGRpc2FibGVWb2x1bWU6IG9wdGlvbnMuZGlzYWJsZVZvbHVtZVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhY2hlLnNldChzZXJ2ZXIuaWQsIHF1ZXVlKTtcblxuICAgICAgICByZXR1cm4gcXVldWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGV4aXN0aW5nIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQ8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gKHRoaXMuY2FjaGUuZ2V0KHF1ZXVlLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+KSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgcXVldWUgZXhpc3RzXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXMobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgaWQgPSBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/IG5vZGUuaWQgOiB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIGlmICghcXVldWUpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0dVSUxEX1FVRVVFKCdDYW5ub3QgZGVsZXRlIG5vbi1leGlzdGluZyBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcbiAgICAgICAgcXVldWUubm9kZS5zdG9wKHRydWUpO1xuICAgICAgICBxdWV1ZS5jb25uZWN0aW9uPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcXVldWUuZGlzcGF0Y2hlcj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHF1ZXVlLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcXVldWUudGltZW91dHMuZm9yRWFjaCgodG0pID0+IGNsZWFyVGltZW91dCh0bSkpO1xuICAgICAgICBxdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgICAgIHF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmRlbGV0ZShxdWV1ZS5pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZTxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldCh0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSEpIGFzIEd1aWxkUXVldWU8VD4gfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBxdWV1ZSBpZFxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZUlkKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHEgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIHJldHVybiBxPy5pZCB8fCBudWxsO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMsIFRyYWNrTGlrZSB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR3VpbGQsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgVm9pY2VCYXNlZENoYW5uZWwsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgdHlwZSBBdWRpb1BsYXllciwgQXVkaW9SZXNvdXJjZSwgU3RyZWFtVHlwZSwgVm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSB9IGZyb20gJy4vR3VpbGRRdWV1ZUhpc3RvcnknO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUsIFN0cmVhbUNvbmZpZyB9IGZyb20gJy4vR3VpbGRRdWV1ZVBsYXllck5vZGUnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyB9IGZyb20gJy4vR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVSZXBlYXRNb2RlLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWVTdGF0aXN0aWNzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkTm9kZUluaXQ8TWV0YSA9IHVua25vd24+IHtcbiAgICBndWlsZDogR3VpbGQ7XG4gICAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXSB8IGJvb2xlYW47XG4gICAgdm9sdW1lOiBudW1iZXIgfCBib29sZWFuO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgcmVzYW1wbGVyOiBudW1iZXIgfCBib29sZWFuO1xuICAgIGZpbHRlcmVyOiBQQ01GaWx0ZXJzW10gfCBib29sZWFuO1xuICAgIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gICAgZGlzYWJsZUhpc3Rvcnk6IGJvb2xlYW47XG4gICAgc2tpcE9uTm9TdHJlYW06IGJvb2xlYW47XG4gICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gICAgbGVhdmVPbkVtcHR5OiBib29sZWFuO1xuICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBudW1iZXI7XG4gICAgbGVhdmVPbkVuZDogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG51bWJlcjtcbiAgICBsZWF2ZU9uU3RvcDogYm9vbGVhbjtcbiAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBudW1iZXI7XG4gICAgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlcjtcbiAgICBzZWxmRGVhZj86IGJvb2xlYW47XG4gICAgbWV0YWRhdGE/OiBNZXRhIHwgbnVsbDtcbiAgICBidWZmZXJpbmdUaW1lb3V0OiBudW1iZXI7XG4gICAgbm9FbWl0SW5zZXJ0OiBib29sZWFuO1xuICAgIG1heFNpemU/OiBudW1iZXI7XG4gICAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBib29sZWFuO1xuICAgIHBhdXNlT25FbXB0eT86IGJvb2xlYW47XG4gICAgZGlzYWJsZVZvbHVtZTogYm9vbGVhbjtcbiAgICBkaXNhYmxlRXF1YWxpemVyOiBib29sZWFuO1xuICAgIGRpc2FibGVGaWx0ZXJlcjogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkOiBib29sZWFuO1xuICAgIGRpc2FibGVSZXNhbXBsZXI6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VDb25uZWN0Q29uZmlnIHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIGdyb3VwPzogc3RyaW5nO1xuICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gICAgc3RyZWFtOiBSZWFkYWJsZTtcbiAgICB0eXBlOiBTdHJlYW1UeXBlO1xufVxuXG5leHBvcnQgdHlwZSBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSAodHJhY2s6IFRyYWNrLCBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSwgcXVldWU6IEd1aWxkUXVldWUpID0+IFByb21pc2U8UmVhZGFibGUgfCBudWxsPjtcbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gKHN0cmVhbTogUmVhZGFibGUsIHF1ZXVlOiBHdWlsZFF1ZXVlKSA9PiBQcm9taXNlPFBvc3RQcm9jZXNzZWRSZXN1bHQgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHJpZ2dlcmVkUmVhc29uID0gJ2ZpbHRlcnMnIHwgJ25vcm1hbCc7XG5cbmV4cG9ydCBjb25zdCBHdWlsZFF1ZXVlRXZlbnQgPSB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja3NBZGQ6ICdhdWRpb1RyYWNrc0FkZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrUmVtb3ZlOiAnYXVkaW9UcmFja1JlbW92ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlOiAnYXVkaW9UcmFja3NSZW1vdmUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb246ICdjb25uZWN0aW9uJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25EZXN0cm95ZWQ6ICdjb25uZWN0aW9uRGVzdHJveWVkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqL1xuICAgIGRlYnVnOiAnZGVidWcnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqL1xuICAgIGVycm9yOiAnZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgICAqL1xuICAgIGVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqL1xuICAgIGVtcHR5UXVldWU6ICdlbXB0eVF1ZXVlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcGxheWVyU3RhcnQ6ICdwbGF5ZXJTdGFydCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllckVycm9yOiAncGxheWVyRXJyb3InLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllckZpbmlzaDogJ3BsYXllckZpbmlzaCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqL1xuICAgIHBsYXllclNraXA6ICdwbGF5ZXJTa2lwJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgICAqL1xuICAgIHZvbHVtZUNoYW5nZTogJ3ZvbHVtZUNoYW5nZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyBwYXVzZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHJlc3VtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJSZXN1bWU6ICdwbGF5ZXJSZXN1bWUnLFxuICAgIC8qKlxuICAgICAqIEJpcXVhZCBGaWx0ZXJzIFVwZGF0ZVxuICAgICAqL1xuICAgIGJpcXVhZEZpbHRlcnNVcGRhdGU6ICdiaXF1YWRGaWx0ZXJzVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBFcXVhbGl6ZXIgVXBkYXRlXG4gICAgICovXG4gICAgZXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBEU1AgdXBkYXRlXG4gICAgICovXG4gICAgZHNwVXBkYXRlOiAnZHNwVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgICAqL1xuICAgIGF1ZGlvRmlsdGVyc1VwZGF0ZTogJ2F1ZGlvRmlsdGVyc1VwZGF0ZScsXG4gICAgLyoqXG4gICAgICogQXVkaW8gcGxheWVyIHdpbGwgcGxheSBuZXh0IHRyYWNrXG4gICAgICovXG4gICAgd2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcmVwb3B1bGF0ZWRcbiAgICAgKi9cbiAgICBjaGFubmVsUG9wdWxhdGU6ICdjaGFubmVsUG9wdWxhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAgICovXG4gICAgcXVldWVDcmVhdGU6ICdxdWV1ZUNyZWF0ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgZGVsZXRlZFxuICAgICAqL1xuICAgIHF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHRyeWluZyB0byBhZGQgc2ltaWxhciB0cmFjayBmb3IgYXV0b3BsYXlcbiAgICAgKi9cbiAgICB3aWxsQXV0b1BsYXk6ICd3aWxsQXV0b1BsYXknXG59IGFzIGNvbnN0O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSBhbnk+IHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFja3MgYXJyYXlcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc0FkZDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzUmVtb3ZlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb246IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25EZXN0cm95ZWQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3Q6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICovXG4gICAgZGVidWc6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgbWVzc2FnZTogc3RyaW5nKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgZW1wdHlDaGFubmVsOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIGVtcHR5UXVldWU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyU3RhcnQ6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgcGxheWVyRXJyb3I6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yLCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIHBsYXllckZpbmlzaDogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgc2tpcHBlZFxuICAgICAqL1xuICAgIHBsYXllclNraXA6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgd2hpY2ggd2FzIHBsYXllZCBpbiB0aGlzIGV2ZW50XG4gICAgICovXG4gICAgcGxheWVyVHJpZ2dlcjogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2ssIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2Ugc3RhdGUgaXMgdXBkYXRlZC4gQ29uc3VtaW5nIHRoaXMgZXZlbnQgbWF5IGRpc2FibGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBgUGxheWVyLmlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKWAgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAgICogQHBhcmFtIG5ld1N0YXRlIFRoZSBuZXcgdm9pY2Ugc3RhdGVcbiAgICAgKi9cbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHBhdXNlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIHBsYXllclBhdXNlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyByZXN1bWVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgcGxheWVyUmVzdW1lOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllcidzIHZvbHVtZSBpcyBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZFZvbHVtZSBUaGUgb2xkIHZvbHVtZVxuICAgICAqIEBwYXJhbSBuZXdWb2x1bWUgVGhlIHVwZGF0ZWQgdm9sdW1lXG4gICAgICovXG4gICAgdm9sdW1lQ2hhbmdlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZFZvbHVtZTogbnVtYmVyLCBuZXdWb2x1bWU6IG51bWJlcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZXF1YWxpemVyIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIGVxdWFsaXplclVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10sIG5ld0ZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYmlxdWFkIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBiaXF1YWRGaWx0ZXJzVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsLCBuZXdGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZHNwIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBkc3BVcGRhdGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogUENNRmlsdGVyc1tdLCBuZXdGaWx0ZXJzOiBQQ01GaWx0ZXJzW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGZmbXBlZyBhdWRpbyBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgYXVkaW9GaWx0ZXJzVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IEZpbHRlcnNOYW1lW10sIG5ld0ZpbHRlcnM6IEZpbHRlcnNOYW1lW10pID0+IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBzdHJlYW1pbmcgYW4gYXVkaW8gdHJhY2suIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHN0cmVhbSBjb25maWcgYmVmb3JlIHBsYXlpbmcgYSB0cmFjay5cbiAgICAgKiBMaXN0ZW5pbmcgdG8gdGhpcyBldmVudCB3aWxsIHBhdXNlIHRoZSBleGVjdXRpb24gb2YgYXVkaW8gcGxheWVyIHVudGlsIGBkb25lKClgIGlzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdpbGwgYmUgc3RyZWFtZWRcbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb25zIGZvciBzdHJlYW1pbmdcbiAgICAgKiBAcGFyYW0gZG9uZSBEb25lIGNhbGxiYWNrXG4gICAgICovXG4gICAgd2lsbFBsYXlUcmFjazogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2s8dW5rbm93bj4sIGNvbmZpZzogU3RyZWFtQ29uZmlnLCBkb25lOiAoKSA9PiB2b2lkKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcG9wdWxhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgY2hhbm5lbFBvcHVsYXRlOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBxdWV1ZUNyZWF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBkZWxldGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgcXVldWVEZWxldGU6IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyB0cnlpbmcgdG8gYWRkIHNpbWlsYXIgdHJhY2sgZm9yIGF1dG9wbGF5XG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrcyBUaGUgc2ltaWxhciB0cmFja3MgdGhhdCB3ZXJlIGZvdW5kXG4gICAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgICAqL1xuICAgIHdpbGxBdXRvUGxheTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFja3M6IFRyYWNrW10sIGRvbmU6ICh0cmFjazogVHJhY2sgfCBudWxsKSA9PiB2b2lkKSA9PiB1bmtub3duO1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZTxNZXRhID0gdW5rbm93bj4ge1xuICAgICN0cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgI2RlbGV0ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9fY3VycmVudDogVHJhY2sgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgdHJhY2tzOiBRdWV1ZTxUcmFjaz47XG4gICAgcHVibGljIGhpc3RvcnkgPSBuZXcgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgbm9kZSA9IG5ldyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgZmlsdGVycyA9IG5ldyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKCkgPT4gbnVsbDtcbiAgICBwdWJsaWMgb25BZnRlckNyZWF0ZVN0cmVhbTogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoc3RyZWFtKSA9PiAoe1xuICAgICAgICBzdHJlYW0sXG4gICAgICAgIHR5cGU6IFN0cmVhbVR5cGUuUmF3XG4gICAgfSk7XG4gICAgcHVibGljIHJlcGVhdE1vZGUgPSBRdWV1ZVJlcGVhdE1vZGUuT0ZGO1xuICAgIHB1YmxpYyB0aW1lb3V0cyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgTm9kZUpTLlRpbWVvdXQ+KCk7XG4gICAgcHVibGljIHN0YXRzID0gbmV3IEd1aWxkUXVldWVTdGF0aXN0aWNzPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHB1YmxpYyBvcHRpb25zOiBHdWlsZE5vZGVJbml0PE1ldGE+KSB7XG4gICAgICAgIHRoaXMudHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPihvcHRpb25zLnF1ZXVlU3RyYXRlZ3kpO1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSkgdGhpcy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW07XG4gICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkpIHRoaXMub25BZnRlckNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbTtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bGxpc2gob3B0aW9ucy5yZXBlYXRNb2RlKSkgdGhpcy5yZXBlYXRNb2RlID0gb3B0aW9ucy5yZXBlYXRNb2RlO1xuXG4gICAgICAgIG9wdGlvbnMuc2VsZkRlYWYgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubWF4U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLnBhdXNlT25FbXB0eSA/Pz0gdHJ1ZTtcblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJiAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gdGhpcy5vcHRpb25zLmJpcXVhZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5maWx0ZXJlcikpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5yZXNhbXBsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA9IHRoaXMub3B0aW9ucy5yZXNhbXBsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heFNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdbR3VpbGROb2RlSW5pdC5tYXhTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ1tHdWlsZE5vZGVJbml0Lm1heEhpc3RvcnlTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5tYXhTaXplIDwgMSkgb3B0aW9ucy5tYXhTaXplID0gSW5maW5pdHk7XG4gICAgICAgIGlmIChvcHRpb25zLm1heEhpc3RvcnlTaXplIDwgMSkgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBHdWlsZFF1ZXVlIGluaXRpYWxpemVkIGZvciBndWlsZCAke3RoaXMub3B0aW9ucy5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5vcHRpb25zLmd1aWxkLmlkfSlgKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWUgaW4gbXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc3RvcmUucmVkdWNlKChhLCBjKSA9PiBhICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXR0ZWQgZHVyYXRpb24gb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgcmVjZWl2ZXIgZm9yIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvaWNlUmVjZWl2ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LnJlY2VpdmVyID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBkZWJ1ZyBtZXNzYWdlIHRvIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBUaGUgbWVzc2FnZSB0byB3cml0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kZWJ1ZywgdGhpcywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1ldGFkYXRhITtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWV0YWRhdGEobTogTWV0YSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBjdXJyZW50IHRyYWNrIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5fX2N1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoaXMgcXVldWUgd2FzIGRlbGV0ZWQgcHJldmlvdXNseVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVsZXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2hhbm5lbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uY2hhbm5lbCB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ3VpbGQgdGhpcyBxdWV1ZSBiZWxvbmdzIHRvXG4gICAgICovXG4gICAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5ndWlsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zaXRpb25pbmcgPSBzdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBpZiB0aGlzIHF1ZXVlIGlzIGN1cnJlbnRseSB1bmRlciB0cmFuc2l0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUcmFuc2l0aW9uaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgcmVwZWF0IG1vZGUgdG8gYXBwbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICAgICAgdGhpcy5yZXBlYXRNb2RlID0gbW9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFNpemUgPz8gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYXhTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhIaXN0b3J5U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/PyBJbmZpbml0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4SGlzdG9yeVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heEhpc3RvcnlTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtYXggaGlzdG9yeSBzaXplIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1heEhpc3RvcnlTaXplKHNpemU6IG51bWJlcikge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1heCBzaXplIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1heFNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLm1heFNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaGFzIG5vIHRyYWNrcyBsZWZ0IGluIGl0XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGlzIGZ1bGxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGdWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA+PSB0aGlzLm1heFNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHF1ZXVlIGNhcGFjaXR5XG4gICAgICovXG4gICAgcHVibGljIGdldENhcGFjaXR5KCkge1xuICAgICAgICBpZiAodGhpcy5pc0Z1bGwoKSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMubWF4U2l6ZSAtIHRoaXMuc2l6ZTtcbiAgICAgICAgcmV0dXJuIGNhcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlICE9IG51bGwgJiYgIXRoaXMuZGlzcGF0Y2hlci5hdWRpb1Jlc291cmNlLmVuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0cmFjayB0byB0aGUgcXVldWUuIFRoaXMgd2lsbCBlbWl0IGBhdWRpb1RyYWNrc0FkZGAgd2hlbiBtdWx0aXBsZSB0cmFja3MgYXJlIGFkZGVkLCBvdGhlcndpc2UgYGF1ZGlvVHJhY2tBZGRgLlxuICAgICAqIEBwYXJhbSB0cmFjayBUcmFjayBvciBwbGF5bGlzdCBvciBhcnJheSBvZiB0cmFja3MgdG8gYWRkXG4gICAgICovXG4gICAgcHVibGljIGFkZFRyYWNrKHRyYWNrOiBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCkge1xuICAgICAgICBjb25zdCB0b0FkZCA9IHRyYWNrIGluc3RhbmNlb2YgUGxheWxpc3QgPyB0cmFjay50cmFja3MgOiB0cmFjaztcbiAgICAgICAgY29uc3QgaXNNdWx0aSA9IEFycmF5LmlzQXJyYXkodG9BZGQpO1xuXG4gICAgICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLCB0b0FkZCk7XG5cbiAgICAgICAgdGhpcy50cmFja3MuYWRkKHRvQWRkKTtcblxuICAgICAgICBpZiAoaXNNdWx0aSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrc0FkZCwgdGhpcywgdG9BZGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSB0cmFjayBmcm9tIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnJlbW92ZSh0cmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgdHJhY2sgdG8gdGhlIGdpdmVuIGluZGV4XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApXG4gICAgICovXG4gICAgcHVibGljIGluc2VydFRyYWNrKHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuaW5zZXJ0KHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUubW92ZSh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAgICovXG4gICAgcHVibGljIGNvcHlUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5jb3B5KHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBzcmMgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICAgKiBAcGFyYW0gZGVzdCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3dhcFRyYWNrcyhzcmM6IFRyYWNrUmVzb2x2YWJsZSwgZGVzdDogVHJhY2tSZXNvbHZhYmxlKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuc3dhcChzcmMsIGRlc3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBzdHJlYW0gZGlzcGF0Y2hlciBmcm9tIHRoZSBnaXZlbiBjb25uZWN0aW9uXG4gICAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gdXNlXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZURpc3BhdGNoZXIoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLCBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSkge1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5wbGF5ZXIuY2xpZW50LmNoYW5uZWxzLmNhY2hlLmdldChjb25uZWN0aW9uLmpvaW5Db25maWcuY2hhbm5lbElkISk7XG4gICAgICAgIGlmICghY2hhbm5lbCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fVk9JQ0VfQ0hBTk5FTCgpO1xuICAgICAgICBpZiAoIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2NoYW5uZWwnLCBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCwgU3RyaW5nKGNoYW5uZWw/LnR5cGUpKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoY29ubmVjdGlvbiwgY2hhbm5lbCwgdGhpcywgb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCwgb3B0aW9ucy5hdWRpb1BsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gY2hhbm5lbFJlc29sdmFibGUgVGhlIHZvaWNlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgICAqIEBwYXJhbSBvcHRpb25zIEpvaW4gY29uZmlnXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoY2hhbm5lbFJlc29sdmFibGU6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgb3B0aW9uczogVm9pY2VDb25uZWN0Q29uZmlnID0ge30pIHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWxSZXNvbHZhYmxlKTtcbiAgICAgICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdjaGFubmVsJywgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsIFN0cmluZyhjaGFubmVsPy50eXBlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ29ubmVjdGluZyB0byAke2NoYW5uZWwudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlID8gJ3N0YWdlJyA6ICd2b2ljZSd9IGNoYW5uZWwgJHtjaGFubmVsLm5hbWV9IChJRDogJHtjaGFubmVsLmlkfSlgKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsLmlkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGF3YWl0IHRoaXMucGxheWVyLnZvaWNlVXRpbHMuY29ubmVjdChjaGFubmVsLCB7XG4gICAgICAgICAgICBkZWFmOiBvcHRpb25zLmRlYWYgPz8gdGhpcy5vcHRpb25zLnNlbGZEZWFmID8/IHRydWUsXG4gICAgICAgICAgICBtYXhUaW1lOiBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgICAgICAgcXVldWU6IHRoaXMsXG4gICAgICAgICAgICBhdWRpb1BsYXllcjogb3B0aW9ucz8uYXVkaW9QbGF5ZXIsXG4gICAgICAgICAgICBncm91cDogb3B0aW9ucy5ncm91cCA/PyB0aGlzLnBsYXllci5jbGllbnQudXNlcj8uaWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5jb25uZWN0aW9uLCB0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5jaGFubmVsIS50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0U3VwcHJlc3NlZChmYWxzZSkuY2F0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHRydWUpLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI2F0dGFjaExpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIGxhdGVuY3kgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbj8ucGluZy51ZHAgPz8gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlKCkge1xuICAgICAgICBpZiAodGhpcy5wbGF5ZXIubm9kZXMuZGVsZXRlKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLiNkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZURlbGV0ZSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLm5vZGUudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgICAgICAgIHRoaXMudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldml2ZXMgdGhpcyBxdWV1ZVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHVibGljIHJldml2ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlbGV0ZWQgfHwgdGhpcy5wbGF5ZXIubm9kZXMuaGFzKHRoaXMuaWQpKSByZXR1cm47XG4gICAgICAgIHRoaXMuI2RlbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuc2V0KHRoaXMuaWQsIHRoaXMpO1xuICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucXVldWVDcmVhdGUsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzZWxmIGRlYWZcbiAgICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxmRGVhZihtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldERlYWYobW9kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgc2VsZiBtdXRlXG4gICAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAgICogQHBhcmFtIHJlYXNvbiBSZWFzb25cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2VsZk11dGUobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRNdXRlKG1vZGUsIHJlYXNvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSBhIHRyYWNrIGluIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJlIHBsYXllZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBub2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheSh0cmFjazogVHJhY2tMaWtlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxNZXRhPikge1xuICAgICAgICBpZiAoIXRoaXMuY2hhbm5lbCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fVk9JQ0VfQ09OTkVDVElPTigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5wbGF5KHRoaXMuY2hhbm5lbCwgdHJhY2ssIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXQgYW4gZXZlbnQgb24gdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZW1pdFxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmdzIGZvciB0aGUgZXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgR3VpbGRRdWV1ZUV2ZW50czxNZXRhPj4oZXZlbnQ6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8R3VpbGRRdWV1ZUV2ZW50czxNZXRhPltLXT4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgICNhdHRhY2hMaXN0ZW5lcnMoZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdlcnJvcicsIChlKSA9PiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVycm9yLCB0aGlzLCBlKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2RlYnVnJywgKG0pID0+IHRoaXMuaGFzRGVidWdnZXIgJiYgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kZWJ1ZywgdGhpcywgbSkpO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdmaW5pc2gnLCAocikgPT4gdGhpcy4jcGVyZm9ybUZpbmlzaChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ3N0YXJ0JywgKHIpID0+IHRoaXMuI3BlcmZvcm1TdGFydChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2Rlc3Ryb3llZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyhkaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdkc3AnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QuaXModGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kc3BVcGRhdGUsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2JpcXVhZCcsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCAhPT0gZikge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYmlxdWFkRmlsdGVyc1VwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2VxQmFuZHMnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QuaXMoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVxdWFsaXplclVwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ3ZvbHVtZScsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSAhPT0gZikgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC52b2x1bWVDaGFuZ2UsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsIGYpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IGY7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMubGlzdGVuZXJDb3VudChHdWlsZFF1ZXVlRXZlbnQuZGVidWcpID4gMDtcbiAgICB9XG5cbiAgICAjcmVtb3ZlTGlzdGVuZXJzPFQgZXh0ZW5kcyB7IHJlbW92ZUFsbExpc3RlbmVyczogKCkgPT4gdW5rbm93biB9Pih0YXJnZXQ6IFQpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cblxuICAgICNwZXJmb3JtU3RhcnQocmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgICAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcbiAgICAgICAgY29uc3QgcmVhc29uID0gdGhpcy5pc1RyYW5zaXRpb25pbmcoKSA/ICdmaWx0ZXJzJyA6ICdub3JtYWwnO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgUGxheWVyIHRyaWdnZXJlZCBmb3IgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICAgIH0pfWBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJUcmlnZ2VyLCB0aGlzLCB0cmFjayEsIHJlYXNvbik7XG4gICAgICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJTdGFydCwgdGhpcywgdHJhY2spO1xuICAgICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIH1cblxuICAgICNwZXJmb3JtRmluaXNoKHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRyYWNrPy50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2l0aW9uTW9kZTogdGhpcy5pc1RyYW5zaXRpb25pbmcoKVxuICAgICAgICAgICAgICAgIH0pfSB3YXMgbWFya2VkIGFzIGZpbmlzaGVkYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICBpZiAodHJhY2sgJiYgIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdBZGRpbmcgdHJhY2sgdG8gaGlzdG9yeSBhbmQgZW1pdHRpbmcgZmluaXNoIGV2ZW50IHNpbmNlIHRyYW5zaXRpb24gbW9kZSBpcyBkaXNhYmxlZC4uLicpO1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2godHJhY2spO1xuICAgICAgICAgICAgdGhpcy5ub2RlLnJlc2V0UHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyRmluaXNoLCB0aGlzLCB0cmFjayk7XG4gICAgICAgICAgICBpZiAodGhpcy4jZGVsZXRlZCkgcmV0dXJuIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrcy5zaXplIDwgMSAmJiB0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5PRkYpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTm8gbW9yZSB0cmFja3MgbGVmdCBpbiB0aGUgcXVldWUgdG8gcGxheSBhbmQgcmVwZWF0IG1vZGUgaXMgb2ZmLCBpbml0aWF0aW5nICNlbWl0RW5kKCknKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5UUkFDSykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy5oaXN0b3J5LnRyYWNrcy5kaXNwYXRjaCgpIHx8IHRyYWNrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQhLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gcXVldWUsIG1vdmluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkgdG8gY3VycmVudCBxdWV1ZS4uLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNrcy5hZGQodGhpcy5oaXN0b3J5LnRyYWNrcy5kaXNwYXRjaCgpIHx8IHRyYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRyYWNrcy5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5BVVRPUExBWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBhdXRvcGxheSwgaW5pdGlhdGluZyBhdXRvcGxheSBoYW5kbGVyLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNoYW5kbGVBdXRvcGxheSh0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy50cmFja3MuZGlzcGF0Y2goKSE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgI2VtaXRFbmQoKSB7XG4gICAgICAgIHRoaXMuX19jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eVF1ZXVlLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kKSB7XG4gICAgICAgICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcoKSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duKS51bnJlZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgI2hhbmRsZUF1dG9wbGF5KHRyYWNrOiBUcmFjaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEZpbmRpbmcgcmVsYXRlZCB0cmFja3MgZm9yIFRyYWNrICR7dHJhY2sudGl0bGV9ICgke3RyYWNrLnVybH0pIFtleHQ6JHt0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWApO1xuICAgICAgICAgICAgY29uc3QgdHJhY2tzID1cbiAgICAgICAgICAgICAgICAoYXdhaXQgdHJhY2suZXh0cmFjdG9yPy5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrLCB0aGlzLmhpc3RvcnkpKT8udHJhY2tzIHx8XG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gUXVlcnlpbmcgZXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBleHQuZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB0byBwcm92aWRlIHJlc3VsdHMuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IHN1Y2Nlc3NmdWxseSByZXR1cm5lZCByZXN1bHRzLmApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzLnRyYWNrcztcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApPy5yZXN1bHQgfHxcbiAgICAgICAgICAgICAgICBbXTtcblxuICAgICAgICAgICAgbGV0IHJlc29sdmVyOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZCA9IFV0aWwubm9vcDtcbiAgICAgICAgICAgIGNvbnN0IGRvbmVQcm9taXNlID0gbmV3IFByb21pc2U8VHJhY2sgfCBudWxsPigocmVzb2x2ZSkgPT4gKHJlc29sdmVyID0gcmVzb2x2ZSkpO1xuXG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC53aWxsQXV0b1BsYXksIHRoaXMsIHRyYWNrcywgcmVzb2x2ZXIhKTtcblxuICAgICAgICAgICAgLy8gcHJldmVudCBkYW5nbGluZyBwcm9taXNlXG4gICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlcihcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlID0gdHJhY2tzLmZpbHRlcigodHIpID0+ICF0aGlzLmhpc3RvcnkudHJhY2tzLmZpbmQoKHQpID0+IHQudXJsID09PSB0ci51cmwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmlxdWU/LlswXSA/PyBVdGlsLnJhbmRvbUNob2ljZSh0cmFja3Muc2xpY2UoMCwgNSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXh0VHJhY2sgPSBhd2FpdCBkb25lUHJvbWlzZTtcblxuICAgICAgICAgICAgaWYgKCFuZXh0VHJhY2spIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnQXV0b3BsYXkgPj4gTm8gdHJhY2sgd2FzIGZvdW5kLCBpbml0aWF0aW5nICNlbWl0RW5kKCknKTtcbiAgICAgICAgICAgICAgICB0aHJvdyAnTm8gdHJhY2sgd2FzIGZvdW5kJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5ub2RlLnBsYXkobmV4dFRyYWNrLCB7XG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWs6IDAsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgQXVkaW9QbGF5ZXIsXG4gICAgQXVkaW9QbGF5ZXJFcnJvcixcbiAgICBBdWRpb1BsYXllclN0YXR1cyxcbiAgICBBdWRpb1Jlc291cmNlLFxuICAgIGNyZWF0ZUF1ZGlvUGxheWVyLFxuICAgIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gICAgZW50ZXJzU3RhdGUsXG4gICAgU3RyZWFtVHlwZSxcbiAgICBWb2ljZUNvbm5lY3Rpb24sXG4gICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICAgIFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb25cbn0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBFcXVhbGl6ZXJCYW5kLCBCaXF1YWRGaWx0ZXJzLCBQQ01GaWx0ZXJzLCBGaWx0ZXJzQ2hhaW4gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgUG9zdFByb2Nlc3NlZFJlc3VsdCB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgVm9pY2VSZWNlaXZlck5vZGUgfSBmcm9tICcuLi9tYW5hZ2VyL1ZvaWNlUmVjZWl2ZXJOb2RlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVN0cmVhbU9wcyB7XG4gICAgdHlwZT86IFN0cmVhbVR5cGU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhPzogYW55O1xuICAgIGRpc2FibGVWb2x1bWU/OiBib29sZWFuO1xuICAgIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICAgIGRpc2FibGVCaXF1YWQ/OiBib29sZWFuO1xuICAgIGVxPzogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZEZpbHRlcj86IEJpcXVhZEZpbHRlcnM7XG4gICAgZGlzYWJsZUZpbHRlcnM/OiBib29sZWFuO1xuICAgIGRlZmF1bHRGaWx0ZXJzPzogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZT86IG51bWJlcjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgICBzYW1wbGVSYXRlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlRXZlbnRzIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gICAgZXJyb3I6IChlcnJvcjogQXVkaW9QbGF5ZXJFcnJvcikgPT4gYW55O1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgc3RhcnQ6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgICBmaW5pc2g6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgICBkc3A6IChmaWx0ZXJzOiBQQ01GaWx0ZXJzW10pID0+IGFueTtcbiAgICBlcUJhbmRzOiAoZmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiBhbnk7XG4gICAgc2FtcGxlUmF0ZTogKGZpbHRlcnM6IG51bWJlcikgPT4gYW55O1xuICAgIGJpcXVhZDogKGZpbHRlcnM6IEJpcXVhZEZpbHRlcnMpID0+IGFueTtcbiAgICB2b2x1bWU6ICh2b2x1bWU6IG51bWJlcikgPT4gYW55O1xuICAgIGRlc3Ryb3llZDogKCkgPT4gYW55O1xuICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xufVxuXG5jbGFzcyBTdHJlYW1EaXNwYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPFZvaWNlRXZlbnRzPiB7XG4gICAgcHVibGljIHZvaWNlQ29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uO1xuICAgIHB1YmxpYyBhdWRpb1BsYXllcjogQXVkaW9QbGF5ZXI7XG4gICAgcHVibGljIHJlY2VpdmVyID0gbmV3IFZvaWNlUmVjZWl2ZXJOb2RlKHRoaXMpO1xuICAgIHB1YmxpYyBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWw7XG4gICAgcHVibGljIGF1ZGlvUmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGw7XG4gICAgcHVibGljIGRzcCA9IG5ldyBGaWx0ZXJzQ2hhaW4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGNvbm5lY3Rpb24gb2JqZWN0XG4gICAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9IGNoYW5uZWwgVGhlIGNvbm5lY3RlZCBjaGFubmVsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCwgcHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlLCBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlciA9IDIwMDAwLCBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAgICAgICAqIEB0eXBlIHtWb2ljZUNvbm5lY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdWRpbyBwbGF5ZXJcbiAgICAgICAgICogQHR5cGUge0F1ZGlvUGxheWVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdWRpb1BsYXllciA9XG4gICAgICAgICAgICBhdWRpb1BsYXllciB8fFxuICAgICAgICAgICAgY3JlYXRlQXVkaW9QbGF5ZXIoe1xuICAgICAgICAgICAgICAgIGRlYnVnOiB0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgICAgICogQHR5cGUge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdlcnJvcicsIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IgYXMgQXVkaW9QbGF5ZXJFcnJvcikpO1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgICAgIHRoaXMuZHNwLm9uVXBkYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRzcCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpIHRoaXMuZW1pdCgnZHNwJywgdGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycyk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuYmlxdWFkPy5maWx0ZXIpIHRoaXMuZW1pdCgnYmlxdWFkJywgdGhpcy5kc3AuYmlxdWFkPy5maWx0ZXIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmVxdWFsaXplcikgdGhpcy5lbWl0KCdlcUJhbmRzJywgdGhpcy5kc3AuZXF1YWxpemVyLmdldEVRKCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLnZvbHVtZSkgdGhpcy5lbWl0KCd2b2x1bWUnLCB0aGlzLmRzcC52b2x1bWUudm9sdW1lKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5yZXNhbXBsZXIpIHRoaXMuZW1pdCgnc2FtcGxlUmF0ZScsIHRoaXMuZHNwLnJlc2FtcGxlci50YXJnZXRTYW1wbGVSYXRlKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRzcC5vbkVycm9yID0gKGUpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uXG4gICAgICAgICAgICAub24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZCwgYXN5bmMgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uTWFudWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5XZWJTb2NrZXRDbG9zZSAmJiBuZXdTdGF0ZS5jbG9zZUNvZGUgPT09IDQwMTQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKHRoaXMudm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZywgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBVdGlsLndhaXQoKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzICsgMSkgKiA1MDAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY29ubmVjdGlvbkRlc3Ryb3llZCwgdGhpcy5xdWV1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdzdGF0ZUNoYW5nZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCAmJiBuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyUGF1c2UsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiYgbmV3U3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclJlc3VtZSwgdGhpcy5xdWV1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlIHx8IG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3N0YXJ0JywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgJiYgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdmaW5pc2gnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3Vic2NyaWJlKHRoaXMuYXVkaW9QbGF5ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIGJlZW4gcGF1c2VkIG1hbnVhbGx5XG4gICAgICovXG4gICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQ7XG4gICAgfVxuXG4gICAgc2V0IHBhdXNlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdmFsID8gdGhpcy5wYXVzZSh0cnVlKSA6IHRoaXMucmVzdW1lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkuXG4gICAgICovXG4gICAgaXNQYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdXNlZCB8fCB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQXV0b1BhdXNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmdcbiAgICAgKi9cbiAgICBpc0J1ZmZlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZ1xuICAgICAqL1xuICAgIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGlkbGVcbiAgICAgKi9cbiAgICBpc0lkbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBpc0Rlc3Ryb3llZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBpc0Rpc2Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyByZWFkeSB0byBwbGF5XG4gICAgICovXG4gICAgaXNSZWFkeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHNpZ25hbGxpbmdcbiAgICAgKi9cbiAgICBpc1NpZ25hbGxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5TaWduYWxsaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RpbmdcbiAgICAgKi9cbiAgICBpc0Nvbm5lY3RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgc3RyZWFtXG4gICAgICogQHBhcmFtIHtSZWFkYWJsZX0gc3JjIFRoZSBzdHJlYW0gc291cmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHNdIE9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7QXVkaW9SZXNvdXJjZX1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTdHJlYW0oc3JjOiBSZWFkYWJsZSwgb3BzPzogQ3JlYXRlU3RyZWFtT3BzKSB7XG4gICAgICAgIGlmICghb3BzPy5kaXNhYmxlRmlsdGVycyAmJiB0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdJbml0aWF0aW5nIERTUCBmaWx0ZXJzIHBpcGVsaW5lLi4uJyk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9ICFvcHM/LmRpc2FibGVGaWx0ZXJzXG4gICAgICAgICAgICA/IHRoaXMuZHNwLmNyZWF0ZShzcmMsIHtcbiAgICAgICAgICAgICAgICAgIGRzcDoge1xuICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IG9wcz8uZGVmYXVsdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBiaXF1YWQ6IG9wcz8uYmlxdWFkRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBvcHMuYmlxdWFkRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVCaXF1YWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHJlc2FtcGxlcjoge1xuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFNhbXBsZVJhdGU6IG9wcz8uc2FtcGxlUmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlUmVzYW1wbGVyXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZXF1YWxpemVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgYmFuZE11bHRpcGxpZXI6IG9wcz8uZXEsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUVxdWFsaXplclxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHZvbHVtZToge1xuICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZTogb3BzPy52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVZvbHVtZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBzcmM7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0V4ZWN1dGluZyBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhvb2suLi4nKTtcbiAgICAgICAgY29uc3QgcG9zdFN0cmVhbSA9IGF3YWl0IHRoaXMucXVldWUub25BZnRlckNyZWF0ZVN0cmVhbT8uKHN0cmVhbSwgdGhpcy5xdWV1ZSkuY2F0Y2goXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbTogc3RyZWFtLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnlcbiAgICAgICAgICAgICAgICB9IGFzIFBvc3RQcm9jZXNzZWRSZXN1bHQpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1ByZXBhcmluZyBBdWRpb1Jlc291cmNlLi4uJyk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IGNyZWF0ZUF1ZGlvUmVzb3VyY2UocG9zdFN0cmVhbT8uc3RyZWFtID8/IHN0cmVhbSwge1xuICAgICAgICAgICAgaW5wdXRUeXBlOiBwb3N0U3RyZWFtPy50eXBlID8/IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBvcHM/LmRhdGEsXG4gICAgICAgICAgICAvLyB2b2x1bWUgY29udHJvbHMgaGFwcGVuIGZyb20gQXVkaW9GaWx0ZXIgRFNQIHV0aWxpdHlcbiAgICAgICAgICAgIGlubGluZVZvbHVtZTogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5yZXNhbXBsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uYmlxdWFkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uZXF1YWxpemVyIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllciBzdGF0dXNcbiAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9QbGF5ZXIpIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhpcyBkaXNwYXRjaGVyXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBudWxsO1xuICAgICAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3BzIHRoZSBwbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBlbmQoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbnRlcnBvbGF0ZVNpbGVuY2U9ZmFsc2VdIElmIHRydWUsIHRoZSBwbGF5ZXIgd2lsbCBwbGF5IDUgcGFja2V0cyBvZiBzaWxlbmNlIGFmdGVyIHBhdXNpbmcgdG8gcHJldmVudCBhdWRpbyBnbGl0Y2hlcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBwYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2U/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnBhdXNlKGludGVycG9sYXRlU2lsZW5jZSk7XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3VtZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHJlc3VtZSgpIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuYXVkaW9QbGF5ZXIudW5wYXVzZSgpO1xuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHN0cmVhbVxuICAgICAqIEBwYXJhbSB7QXVkaW9SZXNvdXJjZTxUcmFjaz59IFtyZXNvdXJjZT10aGlzLmF1ZGlvUmVzb3VyY2VdIFRoZSBhdWRpbyByZXNvdXJjZSB0byBwbGF5XG4gICAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAgICovXG4gICAgYXN5bmMgcGxheVN0cmVhbShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4gPSB0aGlzLmF1ZGlvUmVzb3VyY2UhKSB7XG4gICAgICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0FVRElPX1JFU09VUkNFKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc291cmNlLmVuZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHJlc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgdGhpcy5hdWRpb1Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZSh0aGlzLnZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5LCB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1BsYXllci5wbGF5KHJlc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHBsYXliYWNrIHZvbHVtZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdm9sdW1lIGFtb3VudFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHNldFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUuc2V0Vm9sdW1lKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2b2x1bWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gMTAwO1xuICAgICAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnZvbHVtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWJhY2sgdGltZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5hdWRpb1Jlc291cmNlKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZS5wbGF5YmFja0R1cmF0aW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciBhcyBTdHJlYW1EaXNwYXRjaGVyIH07XG4iLCAiaW1wb3J0IHsgVXNlclJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBhc3NUaHJvdWdoLCB0eXBlIFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEVuZEJlaGF2aW9yVHlwZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgKiBhcyBwcmlzbSBmcm9tICdwcmlzbS1tZWRpYSc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBSYXdUcmFja0RhdGEgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZVJlY2VpdmVyT3B0aW9ucyB7XG4gICAgbW9kZT86ICdvcHVzJyB8ICdwY20nO1xuICAgIGVuZD86IEVuZEJlaGF2aW9yVHlwZTtcbiAgICBzaWxlbmNlRHVyYXRpb24/OiBudW1iZXI7XG4gICAgY3JjPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUmF3VHJhY2tJbml0ID0gUGFydGlhbDxPbWl0PFJhd1RyYWNrRGF0YSwgJ2F1dGhvcicgfCAncGxheWxpc3QnIHwgJ3NvdXJjZScgfCAnZW5naW5lJyB8ICdyYXcnIHwgJ3F1ZXJ5VHlwZScgfCAnZGVzY3JpcHRpb24nIHwgJ3ZpZXdzJz4+O1xuXG5leHBvcnQgY2xhc3MgVm9pY2VSZWNlaXZlck5vZGUge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge31cblxuICAgIHB1YmxpYyBjcmVhdGVSYXdUcmFjayhzdHJlYW06IFJlYWRhYmxlLCBkYXRhOiBSYXdUcmFja0luaXQgPSB7fSkge1xuICAgICAgICBkYXRhLnRpdGxlID8/PSBgUmVjb3JkaW5nICR7RGF0ZS5ub3coKX1gO1xuXG4gICAgICAgIHJldHVybiBuZXcgVHJhY2sodGhpcy5kaXNwYXRjaGVyLnF1ZXVlLnBsYXllciwge1xuICAgICAgICAgICAgYXV0aG9yOiAnRGlzY29yZCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS50aXRsZSxcbiAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLFxuICAgICAgICAgICAgZHVyYXRpb246IGRhdGEuZHVyYXRpb24gfHwgJzA6MDAnLFxuICAgICAgICAgICAgdmlld3M6IDAsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogZGF0YS5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgICAgIHRodW1ibmFpbDogZGF0YS50aHVtYm5haWwgfHwgJ2h0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2VtYmVkL2F2YXRhcnMvMC5wbmcnLFxuICAgICAgICAgICAgdXJsOiBkYXRhLnVybCB8fCAnaHR0cHM6Ly9kaXNjb3JkLmNvbScsXG4gICAgICAgICAgICBzb3VyY2U6ICdhcmJpdHJhcnknLFxuICAgICAgICAgICAgcmF3OiB7XG4gICAgICAgICAgICAgICAgZW5naW5lOiBzdHJlYW0sXG4gICAgICAgICAgICAgICAgc291cmNlOiAnYXJiaXRyYXJ5J1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZSBtdWx0aXBsZSBzdHJlYW1zIHRvZ2V0aGVyXG4gICAgICogQHBhcmFtIHN0cmVhbXMgVGhlIGFycmF5IG9mIHN0cmVhbXMgdG8gbWVyZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbWVyZ2VSZWNvcmRpbmdzKHN0cmVhbXM6IFJlYWRhYmxlW10pIHtcbiAgICAgICAgLy8gVE9ET1xuICAgICAgICB2b2lkIHN0cmVhbXM7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PVF9JTVBMRU1FTlRFRChgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9Lm1lcmdlUmVjb3JkaW5ncygpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjb3JkIGEgdXNlciBpbiB2b2ljZSBjaGFubmVsXG4gICAgICogQHBhcmFtIHVzZXIgVGhlIHVzZXIgdG8gcmVjb3JkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUmVjb3JkaW5nIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVjb3JkVXNlcihcbiAgICAgICAgdXNlcjogVXNlclJlc29sdmFibGUsXG4gICAgICAgIG9wdGlvbnM6IFZvaWNlUmVjZWl2ZXJPcHRpb25zID0ge1xuICAgICAgICAgICAgZW5kOiBFbmRCZWhhdmlvclR5cGUuQWZ0ZXJTaWxlbmNlLFxuICAgICAgICAgICAgbW9kZTogJ3BjbScsXG4gICAgICAgICAgICBzaWxlbmNlRHVyYXRpb246IDEwMDBcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICBjb25zdCBfdXNlciA9IHRoaXMuZGlzcGF0Y2hlci5xdWV1ZS5wbGF5ZXIuY2xpZW50LnVzZXJzLnJlc29sdmVJZCh1c2VyKTtcblxuICAgICAgICBjb25zdCBwYXNzVGhyb3VnaCA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICAgICAgICBjb25zdCByZWNlaXZlciA9IHRoaXMuZGlzcGF0Y2hlci52b2ljZUNvbm5lY3Rpb24ucmVjZWl2ZXI7XG5cbiAgICAgICAgaWYgKCFyZWNlaXZlcikgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVDRUlWRVIoKTtcblxuICAgICAgICByZWNlaXZlci5zcGVha2luZy5vbignc3RhcnQnLCAodXNlcklkKSA9PiB7XG4gICAgICAgICAgICBpZiAodXNlcklkID09PSBfdXNlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY2VpdmVTdHJlYW0gPSByZWNlaXZlci5zdWJzY3JpYmUoX3VzZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogb3B0aW9ucy5lbmQgfHwgRW5kQmVoYXZpb3JUeXBlLkFmdGVyU2lsZW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBvcHRpb25zLnNpbGVuY2VEdXJhdGlvbiA/PyAxMDAwXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm1vZGUgPT09ICdwY20nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwY20gPSByZWNlaXZlU3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgKHByaXNtLm9wdXMgfHwgKDxhbnk+cHJpc20pLmRlZmF1bHQub3B1cykuRGVjb2Rlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemU6IDk2MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwY20ucGlwZShwYXNzVGhyb3VnaCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVjZWl2ZVN0cmVhbS5waXBlKHBhc3NUaHJvdWdoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLnVucmVmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwYXNzVGhyb3VnaCBhcyBSZWFkYWJsZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUXVldWUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVIaXN0b3J5PE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIHRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4oJ0xJRk8nKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgKCh0aGlzLnF1ZXVlIGFzIGFueSkuX19jdXJyZW50IGFzIFRyYWNrIHwgbnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5leHRUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwcmV2aW91c1RyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBoaXN0b3J5IGlzIGRpc2FibGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlSGlzdG9yeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgaGlzdG9yeSBpcyBlbXB0eVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHRyYWNrIHRvIHRyYWNrIGhpc3RvcnlcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGFkZFxuICAgICAqL1xuICAgIHB1YmxpYyBwdXNoKHRyYWNrOiBUcmFjayB8IFRyYWNrW10pIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy50cmFja3MuYWRkKHRyYWNrKTtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGhpc3RvcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgbmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLm5leHRUcmFjaztcbiAgICAgICAgaWYgKCF0cmFjaykge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdObyBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnNraXAoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoZSBwcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcHJldmlvdXMocHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnTm8gcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5ub2RlLnBsYXkodHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICBpZiAoY3VycmVudCAmJiBwcmVzZXJ2ZUN1cnJlbnQpIHRoaXMucXVldWUubm9kZS5pbnNlcnQoY3VycmVudCwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgdG8gW0d1aWxkUXVldWVIaXN0b3J5XS5wcmV2aW91cygpXG4gICAgICovXG4gICAgcHVibGljIGJhY2socHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSBoaXN0b3J5IHN0b3JlXG4gICAgICovXG4gICAgcHVibGljIHJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMudHJhY2tzLnN0b3JlLmxlbmd0aCA8IHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpIHJldHVybjtcbiAgICAgICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBBdWRpb1Jlc291cmNlLCBTdHJlYW1UeXBlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXllclByb2dyZXNzYmFyT3B0aW9ucywgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHdhaXRGb3IgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IENyZWF0ZVN0cmVhbU9wcyB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuXG5leHBvcnQgY29uc3QgRkZNUEVHX1NSQVRFX1JFR0VYID0gL2FzZXRyYXRlPVxcZCtcXCooXFxkKFxcLlxcZCk/KS87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQbGF5T3B0aW9ucyB7XG4gICAgcXVldWU/OiBib29sZWFuO1xuICAgIHNlZWs/OiBudW1iZXI7XG4gICAgdHJhbnNpdGlvbk1vZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclRpbWVzdGFtcCB7XG4gICAgY3VycmVudDoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgIH07XG4gICAgdG90YWw6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHByb2dyZXNzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtQ29uZmlnIHtcbiAgICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gICAgcGxheWVyQ29uZmlnOiBSZXNvdXJjZVBsYXlPcHRpb25zO1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjcHJvZ3Jlc3MgPSAwO1xuICAgIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaW4gaWRsZSBtb2RlXG4gICAgICovXG4gICAgcHVibGljIGlzSWRsZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0lkbGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgdGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGlzQnVmZmVyaW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzQnVmZmVyaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZyBhIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BsYXlpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwYXVzZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQYXVzZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBwcm9ncmVzcyBoaXN0b3J5XG4gICAgICovXG4gICAgcHVibGljIHJlc2V0UHJvZ3Jlc3MoKSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcGxheWVyIHByb2dyZXNzXG4gICAgICovXG4gICAgcHVibGljIHNldFByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWFtIHRpbWUgZm9yIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc3RyZWFtVGltZSA/PyAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgcGxheWJhY2sgZHVyYXRpb24gd2l0aCBoaXN0b3J5IGluY2x1ZGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBwbGF5YmFja1RpbWUoKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IHRoaXMuI3Byb2dyZXNzICsgdGhpcy5zdHJlYW1UaW1lO1xuXG4gICAgICAgIHJldHVybiBkdXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGR1cmF0aW9uIG11bHRpcGxpZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkge1xuICAgICAgICBjb25zdCBzcmF0ZUZpbHRlcnMgPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLnRvQXJyYXkoKS5maWx0ZXIoKGZmKSA9PiBGRk1QRUdfU1JBVEVfUkVHRVgudGVzdChmZikpO1xuICAgICAgICBjb25zdCBtdWx0aXBsaWVycyA9IHNyYXRlRmlsdGVyc1xuICAgICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KEZGTVBFR19TUkFURV9SRUdFWC5leGVjKG0pPy5bMV0gYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKChmKSA9PiAhaXNOYU4oZikpO1xuXG4gICAgICAgIHJldHVybiAhbXVsdGlwbGllcnMubGVuZ3RoID8gMSA6IG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZFBsYXliYWNrVGltZSgpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy5wbGF5YmFja1RpbWU7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy50b3RhbER1cmF0aW9uO1xuXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGR1ciAvIHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldCB0b3RhbER1cmF0aW9uKCkge1xuICAgICAgICBjb25zdCBwcmVmZXJzQnJpZGdlZE1ldGFkYXRhID0gdGhpcy5xdWV1ZS5vcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YTtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcblxuICAgICAgICBpZiAocHJlZmVyc0JyaWRnZWRNZXRhZGF0YSAmJiB0cmFjaz8ubWV0YWRhdGEgIT0gbnVsbCAmJiB0eXBlb2YgdHJhY2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmICdicmlkZ2UnIGluIHRyYWNrLm1ldGFkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChcbiAgICAgICAgICAgICAgICB0cmFjayBhcyBUcmFjazx7XG4gICAgICAgICAgICAgICAgICAgIGJyaWRnZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgKS5tZXRhZGF0YT8uYnJpZGdlLmR1cmF0aW9uO1xuXG4gICAgICAgICAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIoZHVyYXRpb24pKSByZXR1cm4gZHVyYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhY2s/LmR1cmF0aW9uTVMgPz8gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RyZWFtIHByb2dyZXNzXG4gICAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IFBsYXllclRpbWVzdGFtcCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/IHRoaXMucGxheWJhY2tUaW1lIDogdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWU7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gaWdub3JlRmlsdGVycyA/IHRoaXMudG90YWxEdXJhdGlvbiA6IHRoaXMuZXN0aW1hdGVkRHVyYXRpb247XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyhjdXJyZW50KSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGN1cnJlbnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0b3RhbDoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRvdGFsKSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRvdGFsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJvZ3Jlc3M6IE1hdGgucm91bmQoKGN1cnJlbnQgLyB0b3RhbCkgKiAxMDApXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHByb2dyZXNzIGJhciBmb3IgY3VycmVudCBwcm9ncmVzc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFByb2dyZXNzIGJhciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVByb2dyZXNzQmFyKG9wdGlvbnM/OiBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5nZXRUaW1lc3RhbXAoKTtcbiAgICAgICAgaWYgKCF0aW1lc3RhbXApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IGluZGljYXRvciA9ICdcXHV7MUY1MTh9JywgbGVmdENoYXIgPSAnXFx1MjVBQycsIHJpZ2h0Q2hhciA9ICdcXHUyNUFDJywgbGVuZ3RoID0gMTUsIHRpbWVjb2RlcyA9IHRydWUsIHNlcGFyYXRvciA9ICdcXHUyNTAzJyB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkgfHwgbGVuZ3RoIDwgMCB8fCAhTnVtYmVyLmlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX09VVF9PRl9SQU5HRSgnW1BsYXllclByb2dyZXNzQmFyT3B0aW9ucy5sZW5ndGhdJywgU3RyaW5nKGxlbmd0aCksICcwJywgJ0Zpbml0ZSBOdW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoKHRpbWVzdGFtcC5jdXJyZW50LnZhbHVlIC8gdGltZXN0YW1wLnRvdGFsLnZhbHVlKSAqIGxlbmd0aCk7XG4gICAgICAgIGlmIChpbmRleCA+PSAxICYmIGluZGV4IDw9IGxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgYmFyID0gbGVmdENoYXIucmVwZWF0KGluZGV4IC0gMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgYmFyLnB1c2goaW5kaWNhdG9yKTtcbiAgICAgICAgICAgIGJhci5wdXNoKHJpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gaW5kZXgpKTtcbiAgICAgICAgICAgIGlmICh0aW1lY29kZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7c2VwYXJhdG9yfSAke2Jhci5qb2luKCcnKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtiYXIuam9pbignJyl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aW1lY29kZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7c2VwYXJhdG9yfSAke2luZGljYXRvcn0ke3JpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gMSl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSAxKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlayB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlZWsoZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXVlLmZpbHRlcnMudHJpZ2dlclJlcGxheShkdXJhdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB2b2x1bWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9sdW1lID8/IDEwMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdm9sdW1lXG4gICAgICogQHBhcmFtIHZvbCBWb2x1bWUgYW1vdW50IHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnNldFZvbHVtZSh2b2wpO1xuICAgICAgICBpZiAocmVzKSB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gdm9sO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBiaXQgcmF0ZVxuICAgICAqIEBwYXJhbSByYXRlIFRoZSBiaXQgcmF0ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Qml0cmF0ZShyYXRlOiBudW1iZXIgfCAnYXV0bycpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5lbmNvZGVyPy5zZXRCaXRyYXRlKHJhdGUgPT09ICdhdXRvJyA/IHRoaXMucXVldWUuY2hhbm5lbD8uYml0cmF0ZSA/PyA2NDAwMCA6IHJhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBwYXVzZWQgc3RhdGVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICovXG4gICAgcHVibGljIHNldFBhdXNlZChzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3RhdGUpIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBhdXNlKHRydWUpIHx8IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXN1bWUoKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFBhdXNlZCh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHJlc3VtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTa2lwIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc2tpcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmUodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBmb3VuZFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZmluZCgodCwgaWR4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZvdW5kVHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4gdC5pZCA9PT0gZm91bmRUcmFjay5pZCk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrUmVtb3ZlLCB0aGlzLnF1ZXVlLCBmb3VuZFRyYWNrKTtcblxuICAgICAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8ganVtcCB0byB3aXRob3V0IHJlbW92aW5nIG90aGVyIHRyYWNrc1xuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKHRyYWNrKTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnVuc2hpZnQocmVtb3ZlZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdHJhY2sgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldFRyYWNrUG9zaXRpb24odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICAgICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBza2lwIHRvXG4gICAgICovXG4gICAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbih0cmFjayk7XG4gICAgICAgIGlmIChpZHggPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5maWx0ZXIoKF8sIGkpID0+IGkgPD0gaWR4KTtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja3NSZW1vdmUsIHRoaXMucXVldWUsIHRvUmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhIHRyYWNrIG9uIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdG8sIGRlZmF1bHRzIHRvIDAuXG4gICAgICovXG4gICAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgICAgICBpZiAoISh0cmFjayBpbnN0YW5jZW9mIFRyYWNrKSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgndHJhY2sgdmFsdWUnLCAnaW5zdGFuY2Ugb2YgVHJhY2snLCBTdHJpbmcodHJhY2spKTtcbiAgICAgICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKGluZGV4LCAwLCB0cmFjayk7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLm5vRW1pdEluc2VydCkgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrQWRkLCB0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlKGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoZnJvbSk7XG4gICAgICAgIGlmICghcmVtb3ZlZCkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdpbnZhbGlkIHRyYWNrIHRvIG1vdmUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluc2VydChyZW1vdmVkLCB0byk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29weShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3Qgc3JjID0gdGhpcy5xdWV1ZS50cmFja3MuYXQodGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZyb20pKTtcbiAgICAgICAgaWYgKCFzcmMpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCB0cmFjayB0byBjb3B5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNlcnQoc3JjLCB0byk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgICAqIEBwYXJhbSBzZWNvbmQgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAgICovXG4gICAgcHVibGljIHN3YXAoZmlyc3Q6IFRyYWNrUmVzb2x2YWJsZSwgc2Vjb25kOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3Qgc3JjID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZpcnN0KTtcbiAgICAgICAgaWYgKHNyYyA8IDApIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCBzcmMgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgICAgIGNvbnN0IGRlc3QgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oc2Vjb25kKTtcbiAgICAgICAgaWYgKGRlc3QgPCAwKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgZGVzdCB0cmFjayB0byBzd2FwJyk7XG5cbiAgICAgICAgY29uc3Qgc3JjVCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY107XG4gICAgICAgIGNvbnN0IGRlc3RUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF07XG5cbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXSA9IGRlc3RUO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XSA9IHNyY1Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcCB0aGUgcGxheWJhY2tcbiAgICAgKiBAcGFyYW0gZm9yY2UgV2hldGhlciBvciBub3QgdG8gZm9yY2VmdWxseSBzdG9wIHRoZSBwbGF5YmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBzdG9wKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3MuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcCkge1xuICAgICAgICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkgfHwgdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5kZXN0cm95KCk7XG4gICAgICAgICAgICB9LCB0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bikudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHJhdyBhdWRpbyByZXNvdXJjZVxuICAgICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5UmF3KHJlc291cmNlOiBBdWRpb1Jlc291cmNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucGxheVN0cmVhbShyZXNvdXJjZSBhcyBBdWRpb1Jlc291cmNlPFRyYWNrPik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICAgKiBAcGFyYW0gcmVzIFRoZSB0cmFjayB0byBwbGF5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWluZyB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheShyZXM/OiBUcmFjayB8IG51bGwsIG9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBSZWNlaXZlZCBwbGF5IHJlcXVlc3QgZnJvbSBndWlsZCAke3RoaXMucXVldWUuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMucXVldWUuZ3VpbGQuaWR9KWApO1xuXG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcXVldWU6IHRoaXMucXVldWUuY3VycmVudFRyYWNrICE9IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWs6IDBcbiAgICAgICAgICAgIH0gYXMgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKSE7XG5cbiAgICAgICAgaWYgKHJlcyAmJiBvcHRpb25zLnF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBxdWV1ZSB0aGUgdHJhY2ssIGFkZGluZyB0aGUgZ2l2ZW4gdHJhY2sgdG8gcXVldWUgaW5zdGVhZC4uLicpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuYWRkVHJhY2socmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyYWNrID0gcmVzIHx8IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgICAgIGlmICghdHJhY2spIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLm9wdGlvbnMuc2tpcE9uTm9TdHJlYW0pIHJldHVybjtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnUGxheSByZXF1ZXN0IHJlY2VpdmVkIGJ1dCB0cmFjayB3YXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBwbGF5IHRoZSB0cmFjaywgaW5pdGlhbGl6aW5nLi4uJyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBJbml0aWF0aW5nIHN0cmVhbSBleHRyYWN0aW9uIHByb2Nlc3MuLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IHRyYWNrLnJhdz8uc291cmNlIHx8IHRyYWNrLnNvdXJjZTtcbiAgICAgICAgICAgIGNvbnN0IHF0OiBTZWFyY2hRdWVyeVR5cGUgPSB0cmFjay5xdWVyeVR5cGUgfHwgKHNyYyA9PT0gJ3Nwb3RpZnknID8gJ3Nwb3RpZnlTb25nJyA6IHNyYyA9PT0gJ2FwcGxlX211c2ljJyA/ICdhcHBsZU11c2ljU29uZycgOiBzcmMpO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEV4ZWN1dGluZyBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBob29rIChRdWVyeVR5cGU6ICR7cXR9KS4uLmApO1xuXG4gICAgICAgICAgICBjb25zdCBzdHJlYW1TcmMgPSB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG51bGwgYXMgRXJyb3IgfCBudWxsLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogbnVsbCBhcyBSZWFkYWJsZSB8IG51bGxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUub25CZWZvcmVDcmVhdGVTdHJlYW0/Lih0cmFjaywgcXQgfHwgJ2FyYml0cmFyeScsIHRoaXMucXVldWUpLnRoZW4oXG4gICAgICAgICAgICAgICAgKHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSBzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZTogRXJyb3IpID0+IChzdHJlYW1TcmMuZXJyb3IgPSBlKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gdGhyb3cgaWYgJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBwYW5pY3NcbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSAmJiBzdHJlYW1TcmMuZXJyb3IpIHJldHVybiB0aGlzLiN0aHJvdyh0cmFjaywgc3RyZWFtU3JjLmVycm9yKTtcblxuICAgICAgICAgICAgLy8gZGVmYXVsdCBiZWhhdmlvciB3aGVuICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgZGlkIG5vdCBwYW5pY1xuICAgICAgICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0ZhaWxlZCB0byBnZXQgc3RyZWFtIGZyb20gb25CZWZvcmVDcmVhdGVTdHJlYW0hJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjaykudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyPy5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gPFJlYWRhYmxlPnIucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHI/LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSBzdHJlYW1TcmMuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZTogRXJyb3IpID0+IChzdHJlYW1TcmMuZXJyb3IgPSBlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VlayA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5zZWVrID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IG9wdGlvbnMuc2VlaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29uc3QgY29va2llcyA9IHRyYWNrLnJhdz8uc291cmNlID09PSAneW91dHViZScgPyAoPGFueT50aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnl0ZGxPcHRpb25zPy5yZXF1ZXN0T3B0aW9ucyk/LmhlYWRlcnM/LmNvb2tpZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZVN0cmVhbUNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlQmlxdWFkOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVZvbHVtZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRmlsdGVyczogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgICAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiB0eXBlb2YgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA9PT0gJ251bWJlcicgJiYgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA+IDAgPyB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGJpcXVhZEZpbHRlcjogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXE6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgICAgICAgIHZvbHVtZTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgICAgICAgICBkYXRhOiB0cmFjayxcbiAgICAgICAgICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgdHJhY2tTdHJlYW1Db25maWc6IFN0cmVhbUNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaGVyQ29uZmlnOiBjcmVhdGVTdHJlYW1Db25maWcsXG4gICAgICAgICAgICAgICAgcGxheWVyQ29uZmlnOiBvcHRpb25zXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgcmVzb2x2ZXI6ICgpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICAgICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAocmVzb2x2ZXIgPSByZXNvbHZlKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LndpbGxQbGF5VHJhY2ssIHRoaXMucXVldWUsIHRyYWNrLCB0cmFja1N0cmVhbUNvbmZpZywgcmVzb2x2ZXIhKTtcblxuICAgICAgICAgICAgLy8gcHJldmVudCBkYW5nbGluZyBwcm9taXNlXG4gICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHJlc29sdmVyKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdXYWl0aW5nIGZvciB3aWxsUGxheVRyYWNrIGV2ZW50IHRvIHJlc29sdmUuLi4nKTtcblxuICAgICAgICAgICAgYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IHBjbVN0cmVhbSA9IHRoaXMuI2NyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW1TcmMuc3RyZWFtLCB0cmFjaywgb3B0aW9ucy5zZWVrID8/IDAsIGNvb2tpZXMpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTW9kZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBUcmFuc2l0aW9uIG1vZGUgZGV0ZWN0ZWQsIHBsYXllciB3aWxsIHdhaXQgZm9yIGJ1ZmZlcmluZyB0aW1lb3V0IHRvIGV4cGlyZSAoVGltZW91dDogJHt0aGlzLnF1ZXVlLm9wdGlvbnMuYnVmZmVyaW5nVGltZW91dH1tcylgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3YWl0Rm9yKHRoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnQnVmZmVyaW5nIHRpbWVvdXQgaGFzIGV4cGlyZWQhJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBQcmVwYXJpbmcgZmluYWwgc3RyZWFtIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeSh0cmFja1N0cmVhbUNvbmZpZywgbnVsbCwgMil9YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmNyZWF0ZVN0cmVhbShwY21TdHJlYW0sIGNyZWF0ZVN0cmVhbUNvbmZpZyk7XG5cbiAgICAgICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyghIW9wdGlvbnMudHJhbnNpdGlvbk1vZGUpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwZXJmb3JtUGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhdWRpbyBwbGF5ZXI6ICR7ZX1gKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjdGhyb3codHJhY2s6IFRyYWNrLCBlcnJvcj86IEVycm9yIHwgbnVsbCkge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY29uc3Qgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0ID0gKFxuICAgICAgICAgICAgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKGBDb3VsZCBub3QgZXh0cmFjdCBzdHJlYW0gZm9yIHRoaXMgdHJhY2ske2Vycm9yID8gYFxcblxcbiR7ZXJyb3Iuc3RhY2sgfHwgZXJyb3J9YCA6ICcnfWApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUub3B0aW9ucy5za2lwT25Ob1N0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJTa2lwLCB0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllckVycm9yLCB0aGlzLnF1ZXVlLCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQsIHRyYWNrKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgICAgICAgICBpZiAobmV4dFRyYWNrKSB0aGlzLnBsYXkobmV4dFRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdDtcbiAgICB9XG5cbiAgICBhc3luYyAjcGVyZm9ybVBsYXkocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdJbml0aWFsaXppbmcgYXVkaW8gcGxheWVyLi4uJyk7XG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlciEucGxheVN0cmVhbShyZXNvdXJjZSk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNwYXRjaGluZyBhdWRpby4uLicpO1xuICAgIH1cblxuICAgIGFzeW5jICNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrOiBUcmFjaykge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbUluZm8gPSBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGNhblN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZSh0cmFjay51cmwsIHRyYWNrLnF1ZXJ5VHlwZSB8fCBRdWVyeVJlc29sdmVyLnJlc29sdmUodHJhY2sudXJsKS50eXBlKTtcbiAgICAgICAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdG9yLnN0cmVhbSh0cmFjayk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLnJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYCk7XG4gICAgICAgICAgICByZXR1cm4gc3RyZWFtSW5mbyB8fCBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBTdHJlYW0gZXh0cmFjdGlvbiB3YXMgc3VjY2Vzc2Z1bCBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gKEV4dHJhY3RvcjogJHtzdHJlYW1JbmZvLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYCk7XG5cbiAgICAgICAgcmV0dXJuIHN0cmVhbUluZm87XG4gICAgfVxuXG4gICAgI2NyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW06IFJlYWRhYmxlIHwgc3RyaW5nLCB0cmFjazogVHJhY2ssIHNlZWsgPSAwLCBjb29raWVzPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZmbXBlZ1N0cmVhbSA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWdcbiAgICAgICAgICAgIC5jcmVhdGVTdHJlYW0oc3RyZWFtLCB7XG4gICAgICAgICAgICAgICAgZW5jb2RlckFyZ3M6IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuYXJncyxcbiAgICAgICAgICAgICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgICAgICAgICAgICBmbXQ6ICdzMTZsZScsXG4gICAgICAgICAgICAgICAgY29va2llcyxcbiAgICAgICAgICAgICAgICB1c2VMZWdhY3lGRm1wZWc6ICEhdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy51c2VMZWdhY3lGRm1wZWdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBgJHtlcnJ9YC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFN0cmVhbSBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIGZyb20gRkZtcGVnIHN0cmVhbTogJHtlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UgfHwgZXJyfWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKG0uaW5jbHVkZXMoJ3ByZW1hdHVyZSBjbG9zZScpIHx8IG0uaW5jbHVkZXMoJ2VwaXBlJykpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyRXJyb3IsIHRoaXMucXVldWUsIGVyciwgdHJhY2spO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZmbXBlZ1N0cmVhbTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vLyAjcmVnaW9uIHNjYXJ5IHRoaW5ncyBiZWxvdyAqc2lnaCpcbmNvbnN0IHNwb3RpZnlTb25nUmVnZXggPSAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnRyYWNrXFwvfFxcP3VyaT1zcG90aWZ5OnRyYWNrOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzpwbGF5bGlzdFxcL3xcXD91cmk9c3BvdGlmeTpwbGF5bGlzdDopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5QWxidW1SZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86YWxidW1cXC98XFw/dXJpPXNwb3RpZnk6YWxidW06KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3QgdmltZW9SZWdleCA9IC9eKGh0dHB8aHR0cHMpPzpcXC9cXC8od3d3XFwufHBsYXllclxcLik/dmltZW9cXC5jb21cXC8oPzpjaGFubmVsc1xcLyg/OlxcdytcXC8pP3xncm91cHNcXC8oW14vXSopXFwvdmlkZW9zXFwvfHZpZGVvXFwvfCkoXFxkKykoPzp8XFwvXFw/KSQvO1xuY29uc3QgcmV2ZXJibmF0aW9uUmVnZXggPSAvXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC8oc29uZ3xhbGJ1bSlcXC8uKz8oXFwvLis/XFw/aT18XFwvKShbMC05XSspJC87XG5jb25zdCBhcHBsZU11c2ljUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC9wbGF5bGlzdFxcLy4rXFwvcGxcXC4odS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPSAvXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvYWxidW1cXC8uK1xcLyhbMC05XSspJC87XG5jb25zdCBzb3VuZGNsb3VkVHJhY2tSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvKFxcd3wtKSsoLispPyQvO1xuY29uc3Qgc291bmRjbG91ZFBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyh3d3cuKT95b3V0dWJlLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD0oKFBMfEZMfFVVfExMfFJEfE9MKVthLXpBLVowLTktX117MTYsNDF9KSQvO1xuY29uc3QgeW91dHViZVZpZGVvVVJMUmVnZXggPSAvXigoPzpodHRwcz86KT9cXC9cXC8pPygoPzp3d3d8bSlcXC4pPygoPzp5b3V0dWJlXFwuY29tfHlvdXR1LmJlKSkoXFwvKD86W1xcdy1dK1xcP3Y9fGVtYmVkXFwvfHZcXC8pPykoW1xcdy1dKykoXFxTKyk/JC87XG5jb25zdCB5b3V0dWJlVmlkZW9JZFJlZ2V4ID0gL15bYS16QS1aMC05LV9dezExfSQvO1xuLy8gI2VuZHJlZ2lvbiBzY2FyeSB0aGluZ3MgYWJvdmUgKnNpZ2gqXG5cbmNvbnN0IERvbWFpbnNNYXAgPSB7XG4gICAgWW91VHViZTogWyd5b3V0dWJlLmNvbScsICd5b3V0dS5iZScsICdtdXNpYy55b3V0dWJlLmNvbScsICdnYW1pbmcueW91dHViZS5jb20nLCAnd3d3LnlvdXR1YmUuY29tJ10sXG4gICAgU3BvdGlmeTogWydvcGVuLnNwb3RpZnkuY29tJywgJ2VtYmVkLnNwb3RpZnkuY29tJ10sXG4gICAgVmltZW86IFsndmltZW8uY29tJywgJ3BsYXllci52aW1lby5jb20nXSxcbiAgICBSZXZlcmJOYXRpb246IFsncmV2ZXJibmF0aW9uLmNvbSddLFxuICAgIFNvdW5kQ2xvdWQ6IFsnc291bmRjbG91ZC5jb20nXSxcbiAgICBBcHBsZU11c2ljOiBbJ211c2ljLmFwcGxlLmNvbSddXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUXVlcnkge1xuICAgIHR5cGU6ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcbiAgICBxdWVyeTogc3RyaW5nO1xufVxuXG5jbGFzcyBRdWVyeVJlc29sdmVyIHtcbiAgICAvKipcbiAgICAgKiBRdWVyeSByZXNvbHZlclxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGdldCByZWdleCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNwb3RpZnlBbGJ1bVJlZ2V4LFxuICAgICAgICAgICAgc3BvdGlmeVBsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICBzcG90aWZ5U29uZ1JlZ2V4LFxuICAgICAgICAgICAgdmltZW9SZWdleCxcbiAgICAgICAgICAgIHJldmVyYm5hdGlvblJlZ2V4LFxuICAgICAgICAgICAgYXR0YWNobWVudFJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY0FsYnVtUmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljUGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNTb25nUmVnZXgsXG4gICAgICAgICAgICBzb3VuZGNsb3VkVHJhY2tSZWdleCxcbiAgICAgICAgICAgIHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LFxuICAgICAgICAgICAgeW91dHViZVBsYXlsaXN0UmVnZXhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gpOiBSZXNvbHZlZFF1ZXJ5IHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuICAgICAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5GT19SRVFVSVJFRCgncXVlcnknLCBTdHJpbmcocXVlcnkpKTtcblxuICAgICAgICBjb25zdCByZXNvbHZlciA9ICh0eXBlOiB0eXBlb2YgZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5OiBzdHJpbmcpID0+ICh7IHR5cGUsIHF1ZXJ5IH0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHF1ZXJ5KTtcblxuICAgICAgICAgICAgaWYgKERvbWFpbnNNYXAuWW91VHViZS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoLyhtKHVzaWMpP3xnYW1pbmcpXFwuLywgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGF5bGlzdElkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ2xpc3QnKTtcbiAgICAgICAgICAgICAgICBpZiAocGxheWxpc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsIGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9wbGF5bGlzdD9saXN0PSR7cGxheWxpc3RJZH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVJZChxdWVyeSkgfHwgUXVlcnlSZXNvbHZlci52YWxpZGF0ZVVSTChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuWU9VVFVCRV9WSURFTywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlNwb3RpZnkuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9pbnRsLShbYS16QS1aXSspXFwvLywgJycpO1xuICAgICAgICAgICAgICAgIGlmIChzcG90aWZ5UGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKHNwb3RpZnlBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoc3BvdGlmeVNvbmdSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5WaW1lby5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodmltZW9SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5WSU1FTywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlJldmVyYk5hdGlvbi5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAocmV2ZXJibmF0aW9uUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuUkVWRVJCTkFUSU9OLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuU291bmRDbG91ZC5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc291bmRjbG91ZFBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChzb3VuZGNsb3VkVHJhY2tSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TT1VORENMT1VEX1RSQUNLLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuQXBwbGVNdXNpYy5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXBwbGVNdXNpY0FsYnVtUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoYXBwbGVNdXNpY1NvbmdSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19TT05HLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVJCSVRSQVJZLCBxdWVyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgdmltZW8gaWQgZnJvbSB1cmxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBRdWVyeVJlc29sdmVyLnJlc29sdmUocXVlcnkpLnR5cGUgPT09IFF1ZXJ5VHlwZS5WSU1FTyA/IHF1ZXJ5LnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pLnBvcCgpIDogbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVJZChxOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHlvdXR1YmVWaWRlb0lkUmVnZXgudGVzdChxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB5b3V0dWJlVmlkZW9VUkxSZWdleC50ZXN0KHEpO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9O1xuIiwgImltcG9ydCB7IFNub3dmbGFrZVV0aWwgfSBmcm9tICdkaXNjb3JkLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBYm9ydFNpZ25hbCB0byBjYW5jZWwgdGhpcyBlbnRyeVxuICAgICAqL1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5leHBvcnQgdHlwZSBBc3luY1F1ZXVlRXhjZXB0aW9uSGFuZGxlciA9IChleGNlcHRpb246IEVycm9yKSA9PiB2b2lkO1xuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXVlZCBlbnRyaWVzXG4gICAgICovXG4gICAgcHVibGljIGVudHJpZXM6IEFycmF5PEFzeW5jUXVldWVFbnRyeT4gPSBbXTtcblxuICAgIHB1YmxpYyBleGNlcHRpb25IYW5kbGVyPzogQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBlbnRyaWVzIHF1ZXVlXG4gICAgICogQHBhcmFtIGNvbnN1bWUgV2hldGhlciBvciBub3QgdG8gY29uc3VtZSBhbGwgZW50cmllcyBiZWZvcmUgY2xlYXJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoY29uc3VtZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChjb25zdW1lKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNvbnN1bWUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBxdWV1ZS4gUmV0dXJucyBgMGAgaWYgbm8gZW50cmllcyBhcmUgYXZhaWxhYmxlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWNxdWlyZSBhbiBlbnRyeS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIC8vIGxvY2sgdGhlIHF1ZXVlXG4gICAgICogY29uc3QgZW50cnkgPSBhc3luY1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgKiAvLyB3YWl0IHVudGlsIHByZXZpb3VzIHRhc2sgaXMgY29tcGxldGVkXG4gICAgICogYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgICAqIC8vIGRvIHNvbWV0aGluZyBleHBlbnNpdmVcbiAgICAgKiBhd2FpdCBwZXJmb3JtU29tZXRoaW5nRXhwZW5zaXZlKCk7XG4gICAgICogLy8gbWFrZSBzdXJlIHRvIHJlbGVhc2UgdGhlIGxvY2sgb25jZSBkb25lXG4gICAgICogYXN5bmNRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICpcbiAgICAgKi9cbiAgICBwdWJsaWMgYWNxdWlyZShvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCBlbnRyeSA9IG5ldyBBc3luY1F1ZXVlRW50cnkodGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZXhjZXB0aW9uSGFuZGxlcikgZW50cnkuZ2V0VGFzaygpLmNhdGNoKHRoaXMuZXhjZXB0aW9uSGFuZGxlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIGVudHJ5LmNvbnN1bWUoKTtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbGVhc2UgdGhlIGN1cnJlbnQgYWNxdWlzaXRpb24gYW5kIG1vdmUgdG8gbmV4dCBlbnRyeS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNoaWZ0KCk7XG4gICAgICAgIHRoaXMuZW50cmllc1swXT8uY29uc3VtZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbmNlbCBhbGwgZW50cmllc1xuICAgICAqL1xuICAgIHB1YmxpYyBjYW5jZWxBbGwoKSB7XG4gICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY2FuY2VsKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZW50cnkgVGhlIGVudHJ5IHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVFbnRyeShlbnRyeTogQXN5bmNRdWV1ZUVudHJ5KSB7XG4gICAgICAgIGNvbnN0IGVudHJ5SWR4ID0gdGhpcy5lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuXG4gICAgICAgIGlmIChlbnRyeUlkeCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zcGxpY2UoZW50cnlJZHgsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZUVudHJ5IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8dm9pZD47XG4gICAgcHVibGljIHNpZ25hbDogQWJvcnRTaWduYWwgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgb25BYm9ydDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZXNvbHZlITogKCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIHJlamVjdCE6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogQXN5bmNRdWV1ZSwgcHVibGljIG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKSB7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucz8uc2lnbmFsKSB7XG4gICAgICAgICAgICB0aGlzLnNldEFib3J0U2lnbmFsKHRoaXMub3B0aW9ucy5zaWduYWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldEFib3J0U2lnbmFsKHNpZ25hbDogQWJvcnRTaWduYWwpIHtcbiAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2lnbmFsID0gc2lnbmFsO1xuICAgICAgICB0aGlzLm9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnJlbW92ZUVudHJ5KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN1bWUoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICB0aGlzLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVsZWFzZSgpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKCk7XG4gICAgICAgIHRoaXMucXVldWUucmVsZWFzZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICB0aGlzLnJlamVjdChuZXcgRXJyb3IoJ0NhbmNlbGxlZCcpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW51cCgpIHtcbiAgICAgICAgaWYgKHRoaXMub25BYm9ydCkgdGhpcy5zaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICAgICAgdGhpcy5zaWduYWwgPSBudWxsO1xuICAgICAgICB0aGlzLm9uQWJvcnQgPSBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUYXNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVGaWx0ZXJzIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgQXVkaW9GaWx0ZXJzIH0gZnJvbSAnLi4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBCaXF1YWRGaWx0ZXJzLCBFcXVhbGl6ZXIsIEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEZGbXBlZ1N0cmVhbU9wdGlvbnMsIGNyZWF0ZUZGbXBlZ1N0cmVhbSB9IGZyb20gJy4uL3V0aWxzL0ZGbXBlZ1N0cmVhbSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgICB7XG4gICAgICAgICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5UXG4gICAgICAgIH0sXG4gICAgICAgIChfLCBpKSA9PiAoe1xuICAgICAgICAgICAgYmFuZDogaSxcbiAgICAgICAgICAgIGdhaW46IGFycltpXSA/IGFycltpXSAvIDMwIDogMFxuICAgICAgICB9KVxuICAgICkgYXMgRXF1YWxpemVyQmFuZFtdO1xufTtcblxudHlwZSBFUVByZXNldCA9IHtcbiAgICBGbGF0OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgQ2xhc3NpY2FsOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgQ2x1YjogRXF1YWxpemVyQmFuZFtdO1xuICAgIERhbmNlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgRnVsbEJhc3M6IEVxdWFsaXplckJhbmRbXTtcbiAgICBGdWxsQmFzc1RyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIEZ1bGxUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBIZWFkcGhvbmVzOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgTGFyZ2VIYWxsOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgTGl2ZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFBhcnR5OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgUG9wOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgUmVnZ2FlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgUm9jazogRXF1YWxpemVyQmFuZFtdO1xuICAgIFNrYTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFNvZnQ6IEVxdWFsaXplckJhbmRbXTtcbiAgICBTb2Z0Um9jazogRXF1YWxpemVyQmFuZFtdO1xuICAgIFRlY2hubzogRXF1YWxpemVyQmFuZFtdO1xufTtcblxuZXhwb3J0IGNvbnN0IEVxdWFsaXplckNvbmZpZ3VyYXRpb25QcmVzZXQ6IFJlYWRvbmx5PEVRUHJlc2V0PiA9IE9iamVjdC5mcmVlemUoe1xuICAgIEZsYXQ6IG1ha2VCYW5kcyhbXSksXG4gICAgQ2xhc3NpY2FsOiBtYWtlQmFuZHMoWy0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC03LjIsIC03LjIsIC03LjIsIC05LjZdKSxcbiAgICBDbHViOiBtYWtlQmFuZHMoWy0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA4LjAsIDUuNiwgNS42LCA1LjYsIDMuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIERhbmNlOiBtYWtlQmFuZHMoWzkuNiwgNy4yLCAyLjQsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNy4yLCAtNy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIEZ1bGxCYXNzOiBtYWtlQmFuZHMoWy04LjAsIDkuNiwgOS42LCA1LjYsIDEuNiwgLTQuMCwgLTguMCwgLTEwLjQsIC0xMS4yLCAtMTEuMl0pLFxuICAgIEZ1bGxCYXNzVHJlYmxlOiBtYWtlQmFuZHMoWzcuMiwgNS42LCAtMS4xMTAyMmUtMTUsIC03LjIsIC00LjgsIDEuNiwgOC4wLCAxMS4yLCAxMi4wLCAxMi4wXSksXG4gICAgRnVsbFRyZWJsZTogbWFrZUJhbmRzKFstOS42LCAtOS42LCAtOS42LCAtNC4wLCAyLjQsIDExLjIsIDE2LjAsIDE2LjAsIDE2LjAsIDE2LjhdKSxcbiAgICBIZWFkcGhvbmVzOiBtYWtlQmFuZHMoWzQuOCwgMTEuMiwgNS42LCAtMy4yLCAtMi40LCAxLjYsIDQuOCwgOS42LCAxMi44LCAxNC40XSksXG4gICAgTGFyZ2VIYWxsOiBtYWtlQmFuZHMoWzEwLjQsIDEwLjQsIDUuNiwgNS42LCAtMS4xMTAyMmUtMTUsIC00LjgsIC00LjgsIC00LjgsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgTGl2ZTogbWFrZUJhbmRzKFstNC44LCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA1LjYsIDUuNiwgNC4wLCAyLjQsIDIuNCwgMi40XSksXG4gICAgUGFydHk6IG1ha2VCYW5kcyhbNy4yLCA3LjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIDcuMiwgNy4yXSksXG4gICAgUG9wOiBtYWtlQmFuZHMoWy0xLjYsIDQuOCwgNy4yLCA4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMi40LCAtMS42LCAtMS42XSksXG4gICAgUmVnZ2FlOiBtYWtlQmFuZHMoWy0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC0xLjExMDIyZS0xNSwgNi40LCA2LjQsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBSb2NrOiBtYWtlQmFuZHMoWzguMCwgNC44LCAtNS42LCAtOC4wLCAtMy4yLCA0LjAsIDguOCwgMTEuMiwgMTEuMiwgMTEuMl0pLFxuICAgIFNrYTogbWFrZUJhbmRzKFstMi40LCAtNC44LCAtNC4wLCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA4LjgsIDkuNiwgMTEuMiwgOS42XSksXG4gICAgU29mdDogbWFrZUJhbmRzKFs0LjgsIDEuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMS4xMTAyMmUtMTUsIDQuMCwgOC4wLCA5LjYsIDExLjIsIDEyLjBdKSxcbiAgICBTb2Z0Um9jazogbWFrZUJhbmRzKFs0LjAsIDQuMCwgMi40LCAtMS4xMTAyMmUtMTUsIC00LjAsIC01LjYsIC0zLjIsIC0xLjExMDIyZS0xNSwgMi40LCA4LjhdKSxcbiAgICBUZWNobm86IG1ha2VCYW5kcyhbOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTQuOCwgLTEuMTEwMjJlLTE1LCA4LjAsIDkuNiwgOS42LCA4LjhdKVxufSk7XG5cbmV4cG9ydCBjbGFzcyBGRm1wZWdGaWx0ZXJlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgICNmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgICAjaW5wdXRBcmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgICAjc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgY29uc3QgeyBxdWV1ZSB9ID0gdGhpcy5hZjtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKTtcbiAgICAgICAgY29uc3QgaWdub3JlRmlsdGVycyA9IHRoaXMuZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJykgJiYgIWZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpO1xuICAgICAgICBjb25zdCBzZWVrVGltZSA9IHF1ZXVlLm5vZGUuZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMpPy5jdXJyZW50LnZhbHVlIHx8IDA7XG4gICAgICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMgPSBbLi4ubmV3IFNldChmaWx0ZXJzKV07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWYudHJpZ2dlclJlcGxheShzZWVrVGltZSkudGhlbigodCkgPT4ge1xuICAgICAgICAgICAgcXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9GaWx0ZXJzVXBkYXRlLCBxdWV1ZSwgcHJldiwgdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgaW5wdXQgYXJncyBmb3IgRkZtcGVnXG4gICAgICovXG4gICAgcHVibGljIHNldElucHV0QXJncyhhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIWFyZ3MuZXZlcnkoKGFyZykgPT4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdhcmdzJywgJ0FycmF5PHN0cmluZz4nLCAnaW52YWxpZCBpdGVtKHMpJyk7XG4gICAgICAgIHRoaXMuI2lucHV0QXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGlucHV0IGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlucHV0QXJncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lucHV0QXJncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZW5jb2RlciBhcmdzXG4gICAgICovXG4gICAgcHVibGljIGdldCBlbmNvZGVyQXJncygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlcnMubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICAgICAgcmV0dXJuIFsnLWFmJywgdGhpcy50b1N0cmluZygpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZmluYWwgZmZtcGVnIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGFyZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0QXJncy5jb25jYXQodGhpcy5lbmNvZGVyQXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGZmbXBlZyBzdHJlYW1cbiAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBzdHJlYW0gc291cmNlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHN0cmVhbSBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVN0cmVhbShzb3VyY2U6IHN0cmluZyB8IFJlYWRhYmxlLCBvcHRpb25zOiBGRm1wZWdTdHJlYW1PcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLiNpbnB1dEFyZ3MubGVuZ3RoKSBvcHRpb25zLmVuY29kZXJBcmdzID0gWy4uLnRoaXMuI2lucHV0QXJncywgLi4uKG9wdGlvbnMuZW5jb2RlckFyZ3MgfHwgW10pXTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZGbXBlZ1N0cmVhbShzb3VyY2UsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBmZm1wZWcgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIHNldEZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdIHwgUmVjb3JkPEZpbHRlcnMsIGJvb2xlYW4+IHwgYm9vbGVhbikge1xuICAgICAgICBsZXQgX2ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGZpbHRlcnMgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSAhZmlsdGVycyA/IFtdIDogKE9iamVjdC5rZXlzKEF1ZGlvRmlsdGVycy5maWx0ZXJzKSBhcyBGaWx0ZXJzW10pO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVycykpIHtcbiAgICAgICAgICAgIF9maWx0ZXJzID0gZmlsdGVycztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9maWx0ZXJzID0gT2JqZWN0LmVudHJpZXMoZmlsdGVycylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChyZXMpID0+IHJlc1sxXSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAubWFwKChtKSA9PiBtWzBdKSBhcyBGaWx0ZXJzW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyhfZmlsdGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudGx5IGFjdGl2ZSBmZm1wZWcgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgICAgICB0aGlzLnNldEZpbHRlcnMoZmlsdGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlIGdpdmVuIGZmbXBlZyBmaWx0ZXIocylcbiAgICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyKHMpXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZShmaWx0ZXJzOiBGaWx0ZXJzW10gfCBGaWx0ZXJzKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgZmlsdGVycyA9IFtmaWx0ZXJzXTtcbiAgICAgICAgY29uc3QgZnJlc2g6IEZpbHRlcnNbXSA9IFtdO1xuXG4gICAgICAgIGZpbHRlcnMuZm9yRWFjaCgoZikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycy5pbmNsdWRlcyhmKSkgcmV0dXJuO1xuICAgICAgICAgICAgZnJlc2gucHVzaChmKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI3NldEZpbHRlcnModGhpcy4jZmZtcGVnRmlsdGVycy5maWx0ZXIoKHIpID0+ICFmaWx0ZXJzLmluY2x1ZGVzKHIpKS5jb25jYXQoZnJlc2gpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZGVmYXVsdCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZmIEZpbHRlcnMgbGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXREZWZhdWx0cyhmZjogRmlsdGVyc1tdKSB7XG4gICAgICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMgPSBmZjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbGlzdCBvZiBlbmFibGVkIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmlsdGVyc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGRpc2FibGVkIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmlsdGVyc0Rpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLm5hbWVzLmZpbHRlcigoZikgPT4gIXRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VuYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZGlzYWJsZWRcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNEaXNhYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0VuYWJsZWQoZmlsdGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmlsdGVyIGlzIGEgdmFsaWQgZmlsdGVyXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIHRlc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNWYWxpZEZpbHRlcihmaWx0ZXI6IHN0cmluZyk6IGZpbHRlciBpcyBGaWx0ZXJzTmFtZSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuaGFzKGZpbHRlciBhcyBGaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBhcnJheVxuICAgICAqL1xuICAgIHB1YmxpYyB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzLm1hcCgoZmlsdGVyKSA9PiBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIEpTT04gb2JqZWN0XG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3Qgb2JqID0ge30gYXMgUmVjb3JkPGtleW9mIFF1ZXVlRmlsdGVycywgc3RyaW5nPjtcblxuICAgICAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKSA9PiAob2JqW2ZpbHRlcl0gPSBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpKTtcblxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBjdXJyZW50IGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuY3JlYXRlKHRoaXMuZmlsdGVycyk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlIHtcbiAgICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWQ6IEJpcXVhZEZpbHRlcnMgfCBudWxsO1xuICAgIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgICB2b2x1bWU6IG51bWJlcjtcbiAgICBzYW1wbGVSYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGdyYXBoID0gbmV3IEFGaWx0ZXJHcmFwaDxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBlcXVhbGl6ZXJQcmVzZXRzID0gRXF1YWxpemVyQ29uZmlndXJhdGlvblByZXNldDtcbiAgICBwdWJsaWMgX2xhc3RGaWx0ZXJzQ2FjaGU6IEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlID0ge1xuICAgICAgICBiaXF1YWQ6IG51bGwsXG4gICAgICAgIGVxdWFsaXplcjogW10sXG4gICAgICAgIGZpbHRlcnM6IFtdLFxuICAgICAgICB2b2x1bWU6IDEwMCxcbiAgICAgICAgc2FtcGxlUmF0ZTogLTFcbiAgICB9O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVm9sdW1lIHRyYW5zZm9ybWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRzcD8udm9sdW1lIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMTUgQmFuZCBFcXVhbGl6ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZXF1YWxpemVyIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlnaXRhbCBiaXF1YWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5iaXF1YWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEU1AgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZmlsdGVycyB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF1ZGlvIHJlc2FtcGxlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXNhbXBsZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYXkgY3VycmVudCB0cmFjayBpbiB0cmFuc2l0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gc2VlayBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB0cmlnZ2VyUmVwbGF5KHNlZWsgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaywge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFGaWx0ZXJHcmFwaDxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgICBwdWJsaWMgZ2V0IGZmbXBlZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYuZmZtcGVnLmZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hZi5lcXVhbGl6ZXI/LmJhbmRNdWx0aXBsaWVycyB8fCBbXSkubWFwKChtLCBpKSA9PiAoe1xuICAgICAgICAgICAgYmFuZDogaSxcbiAgICAgICAgICAgIGdhaW46IG1cbiAgICAgICAgfSkpIGFzIEVxdWFsaXplckJhbmRbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIHJldHVybiAodGhpcy5hZi5iaXF1YWQ/LmdldEZpbHRlck5hbWUoKSBhcyBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsKSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYuZmlsdGVycz8uZmlsdGVycyB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYudm9sdW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5yZXNhbXBsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGR1bXAoKTogRmlsdGVyR3JhcGgge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmZtcGVnOiB0aGlzLmZmbXBlZyxcbiAgICAgICAgICAgIGVxdWFsaXplcjogdGhpcy5lcXVhbGl6ZXIsXG4gICAgICAgICAgICBiaXF1YWQ6IHRoaXMuYmlxdWFkLFxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAgICAgICAgc2FtcGxlUmF0ZTogdGhpcy5yZXNhbXBsZXI/LnRhcmdldFNhbXBsZVJhdGUgfHwgdGhpcy5yZXNhbXBsZXI/LnNhbXBsZVJhdGUgfHwgNDgwMDAsXG4gICAgICAgICAgICB2b2x1bWU6IHRoaXMudm9sdW1lPy52b2x1bWUgPz8gMTAwXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckdyYXBoIHtcbiAgICBmZm1wZWc6IEZpbHRlcnNbXTtcbiAgICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWQ6IEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IER1cGxleCwgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0ICogYXMgcHJpc20gZnJvbSAncHJpc20tbWVkaWEnO1xuaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRkZtcGVnU3RyZWFtT3B0aW9ucyB7XG4gICAgZm10Pzogc3RyaW5nO1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICBza2lwPzogYm9vbGVhbjtcbiAgICBjb29raWVzPzogc3RyaW5nO1xuICAgIHVzZUxlZ2FjeUZGbXBlZz86IGJvb2xlYW47XG59XG5cbmNvbnN0IGdldEZGbXBlZ1Byb3ZpZGVyID0gKGxlZ2FjeSA9IGZhbHNlKSA9PiAobGVnYWN5ID8gKHByaXNtIGFzIHR5cGVvZiBwcmlzbSAmIHsgZGVmYXVsdDogdHlwZW9mIHByaXNtIH0pLmRlZmF1bHQ/LkZGbXBlZyB8fCBwcmlzbS5GRm1wZWcgOiBGRm1wZWcpO1xuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbTogc3RyaW5nLCBmbXQ/OiBzdHJpbmcsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgICBcIi1yZWNvbm5lY3RcIiwgXCIxXCIsXG4gICAgICAgIFwiLXJlY29ubmVjdF9zdHJlYW1lZFwiLCBcIjFcIixcbiAgICAgICAgXCItcmVjb25uZWN0X2RlbGF5X21heFwiLCBcIjVcIixcbiAgICAgICAgXCItaVwiLCBzdHJlYW0sXG4gICAgICAgIFwiLWFuYWx5emVkdXJhdGlvblwiLCBcIjBcIixcbiAgICAgICAgXCItbG9nbGV2ZWxcIiwgXCIwXCIsXG4gICAgICAgIFwiLWZcIiwgYCR7dHlwZW9mIGZtdCA9PT0gXCJzdHJpbmdcIiA/IGZtdCA6IFwiczE2bGVcIn1gLFxuICAgICAgICBcIi1hclwiLCBcIjQ4MDAwXCIsXG4gICAgICAgIFwiLWFjXCIsIFwiMlwiXG4gICAgXTtcblxuICAgIGlmICh0eXBlb2YgY29va2llcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9mZm1wZWcub3JnL2ZmbXBlZy1wcm90b2NvbHMuaHRtbCNIVFRQLUNvb2tpZXNcbiAgICAgICAgYXJncy5wdXNoKCctY29va2llcycsIGNvb2tpZXMuc3RhcnRzV2l0aCgnXCInKSA/IGNvb2tpZXMgOiBgXCIke2Nvb2tpZXN9XCJgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIHJldHVybiBbXG4gICAgICAgIFwiLWFuYWx5emVkdXJhdGlvblwiLCBcIjBcIixcbiAgICAgICAgXCItbG9nbGV2ZWxcIiwgXCIwXCIsXG4gICAgICAgIFwiLWZcIiwgYCR7dHlwZW9mIGZtdCA9PT0gXCJzdHJpbmdcIiA/IGZtdCA6IFwiczE2bGVcIn1gLFxuICAgICAgICBcIi1hclwiLCBcIjQ4MDAwXCIsXG4gICAgICAgIFwiLWFjXCIsIFwiMlwiXG4gICAgXTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEZGbXBlZyBzdHJlYW1cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIHNvdXJjZSBzdHJlYW1cbiAqIEBwYXJhbSBvcHRpb25zIEZGbXBlZyBzdHJlYW0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRkZtcGVnU3RyZWFtKHN0cmVhbTogUmVhZGFibGUgfCBEdXBsZXggfCBzdHJpbmcsIG9wdGlvbnM/OiBGRm1wZWdTdHJlYW1PcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnM/LnNraXAgJiYgdHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHJldHVybiBzdHJlYW07XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgY29uc3QgYXJncyA9IHR5cGVvZiBzdHJlYW0gPT09ICdzdHJpbmcnID8gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbSwgb3B0aW9ucy5mbXQsIG9wdGlvbnMuY29va2llcykgOiBGRk1QRUdfQVJHU19QSVBFRChvcHRpb25zLmZtdCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihvcHRpb25zLnNlZWspKSBhcmdzLnVuc2hpZnQoJy1zcycsIFN0cmluZyhvcHRpb25zLnNlZWspKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmVuY29kZXJBcmdzKSkgYXJncy5wdXNoKC4uLm9wdGlvbnMuZW5jb2RlckFyZ3MpO1xuXG4gICAgY29uc3QgRkZNUEVHID0gZ2V0RkZtcGVnUHJvdmlkZXIoISFvcHRpb25zLnVzZUxlZ2FjeUZGbXBlZyk7XG5cbiAgICBjb25zdCB0cmFuc2NvZGVyID0gbmV3IEZGTVBFRyh7IHNoZWxsOiBmYWxzZSwgYXJncyB9KTtcblxuICAgIHRyYW5zY29kZXIub24oJ2Nsb3NlJywgKCkgPT4gdHJhbnNjb2Rlci5kZXN0cm95KCkpO1xuXG4gICAgaWYgKHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0cmVhbS5vbignZXJyb3InLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG4gICAgICAgIHN0cmVhbS5waXBlKHRyYW5zY29kZXIpO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2NvZGVyO1xufVxuIiwgImltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEge1xuICAgIGxhdGVuY3k6IHtcbiAgICAgICAgZXZlbnRMb29wOiBudW1iZXI7XG4gICAgICAgIHZvaWNlQ29ubmVjdGlvbjogbnVtYmVyO1xuICAgIH07XG4gICAgc3RhdHVzOiB7XG4gICAgICAgIGJ1ZmZlcmluZzogYm9vbGVhbjtcbiAgICAgICAgcGxheWluZzogYm9vbGVhbjtcbiAgICAgICAgcGF1c2VkOiBib29sZWFuO1xuICAgICAgICBpZGxlOiBib29sZWFuO1xuICAgIH07XG4gICAgdHJhY2tzQ291bnQ6IG51bWJlcjtcbiAgICBoaXN0b3J5U2l6ZTogbnVtYmVyO1xuICAgIGV4dHJhY3RvcnM6IG51bWJlcjtcbiAgICBsaXN0ZW5lcnM6IG51bWJlcjtcbiAgICBtZW1vcnlVc2FnZTogTm9kZUpTLk1lbW9yeVVzYWdlO1xuICAgIHZlcnNpb25zOiB7XG4gICAgICAgIG5vZGU6IHN0cmluZztcbiAgICAgICAgcGxheWVyOiBzdHJpbmc7XG4gICAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVTdGF0aXN0aWNzPE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge31cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIHN0YXRpc3RpY3Mgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhdGVuY3k6IHtcbiAgICAgICAgICAgICAgICBldmVudExvb3A6IHRoaXMucXVldWUucGxheWVyLmV2ZW50TG9vcExhZyxcbiAgICAgICAgICAgICAgICB2b2ljZUNvbm5lY3Rpb246IHRoaXMucXVldWUucGluZ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXR1czoge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcmluZzogdGhpcy5xdWV1ZS5ub2RlLmlzQnVmZmVyaW5nKCksXG4gICAgICAgICAgICAgICAgcGxheWluZzogdGhpcy5xdWV1ZS5ub2RlLmlzUGxheWluZygpLFxuICAgICAgICAgICAgICAgIHBhdXNlZDogdGhpcy5xdWV1ZS5ub2RlLmlzUGF1c2VkKCksXG4gICAgICAgICAgICAgICAgaWRsZTogdGhpcy5xdWV1ZS5ub2RlLmlzSWRsZSgpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJhY2tzQ291bnQ6IHRoaXMucXVldWUudHJhY2tzLnNpemUsXG4gICAgICAgICAgICBoaXN0b3J5U2l6ZTogdGhpcy5xdWV1ZS5oaXN0b3J5LnRyYWNrcy5zaXplLFxuICAgICAgICAgICAgZXh0cmFjdG9yczogdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5zaXplLFxuICAgICAgICAgICAgbGlzdGVuZXJzOiB0aGlzLnF1ZXVlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLmNoYW5uZWw/Lm1lbWJlcnMuZmlsdGVyKChtKSA9PiAhbS51c2VyLmJvdCkuc2l6ZSB8fCAwLFxuICAgICAgICAgICAgbWVtb3J5VXNhZ2U6IHByb2Nlc3MubWVtb3J5VXNhZ2UoKSxcbiAgICAgICAgICAgIHZlcnNpb25zOiB7XG4gICAgICAgICAgICAgICAgbm9kZTogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgICAgICAgICAgIHBsYXllcjogJzYuNi40J1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGE7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vLi4vUGxheWVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgaW5zdGFuY2VzID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBQbGF5ZXI+KCk7XG5leHBvcnQgY29uc3QgZ2xvYmFsUmVnaXN0cnkgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIHVua25vd24+KCk7XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vLi4vUGxheWVyJztcbmltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRQbGF5ZXIocGxheWVyOiBQbGF5ZXIpIHtcbiAgICBpZiAoaW5zdGFuY2VzLmhhcyhwbGF5ZXIuaWQpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGluc3RhbmNlcy5zZXQocGxheWVyLmlkLCBwbGF5ZXIpO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlcy5oYXMocGxheWVyLmlkKTtcbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyUGxheWVyKHBsYXllcjogUGxheWVyKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlcy5kZWxldGUocGxheWVyLmlkKTtcbn1cbiIsICJpbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGxheWVycygpIHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmFycmF5KCk7XG59XG4iLCAiaW1wb3J0IHsgZ2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsUmVnaXN0cnkoKSB7XG4gICAgcmV0dXJuIGdsb2JhbFJlZ2lzdHJ5O1xufVxuIiwgImltcG9ydCB7IFZvaWNlQ2hhbm5lbCwgU3RhZ2VDaGFubmVsLCBTbm93Zmxha2UgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsIGpvaW5Wb2ljZUNoYW5uZWwsIFZvaWNlQ29ubmVjdGlvbiwgZ2V0Vm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsIEF1ZGlvUGxheWVyIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuY2xhc3MgVm9pY2VVdGlscyB7XG4gICAgLyoqXG4gICAgICogVm9pY2UgY29ubmVjdGlvbiBjYWNoZSB0byBzdG9yZSB2b2ljZSBjb25uZWN0aW9ucyBvZiB0aGUgUGxheWVyIGNvbXBvbmVudHMuXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKiBJdCBvbmx5IGV4aXN0cyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHVibGljIGNhY2hlOiBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj4gPSBuZXcgQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgdXRpbHMgY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgICAvKipcbiAgICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWwsIGNyZWF0aW5nIGJhc2ljIHN0cmVhbSBkaXNwYXRjaCBtYW5hZ2VyXG4gICAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgY29ubmVjdChcbiAgICAgICAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgZGVhZj86IGJvb2xlYW47XG4gICAgICAgICAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgICAgICAgICAgcXVldWU6IEd1aWxkUXVldWU7XG4gICAgICAgICAgICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyO1xuICAgICAgICAgICAgZ3JvdXA/OiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICApOiBQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+IHtcbiAgICAgICAgaWYgKCFvcHRpb25zPy5xdWV1ZSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fR1VJTERfUVVFVUUoKTtcbiAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMuam9pbihjaGFubmVsLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoY29ubiwgY2hhbm5lbCwgb3B0aW9ucy5xdWV1ZSwgb3B0aW9ucy5tYXhUaW1lLCBvcHRpb25zLmF1ZGlvUGxheWVyKTtcbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IFtjaGFubmVsXSBUaGUgdm9pY2Uvc3RhZ2UgY2hhbm5lbCB0byBqb2luXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBqb2luKFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgICAgICBncm91cD86IHN0cmluZztcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICBjb25zdCBjb25uID0gam9pblZvaWNlQ2hhbm5lbCh7XG4gICAgICAgICAgICBndWlsZElkOiBjaGFubmVsLmd1aWxkLmlkLFxuICAgICAgICAgICAgY2hhbm5lbElkOiBjaGFubmVsLmlkLFxuICAgICAgICAgICAgYWRhcHRlckNyZWF0b3I6IGNoYW5uZWwuZ3VpbGQudm9pY2VBZGFwdGVyQ3JlYXRvciBhcyB1bmtub3duIGFzIERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsXG4gICAgICAgICAgICBzZWxmRGVhZjogQm9vbGVhbihvcHRpb25zPy5kZWFmKSxcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLnBsYXllci5ldmVudHMubGlzdGVuZXJDb3VudCgnZGVidWcnKSA+IDAsXG4gICAgICAgICAgICBncm91cDogb3B0aW9ucz8uZ3JvdXBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdHMgdm9pY2UgY29ubmVjdGlvblxuICAgICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uIHwgU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgICAgICBpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIFN0cmVhbURpc3BhdGNoZXIpIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLnZvaWNlQ29ubmVjdGlvbjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSByZXR1cm4gY29ubmVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgRGlzY29yZCBQbGF5ZXIgdm9pY2UgY29ubmVjdGlvblxuICAgICAqIEBwYXJhbSB7U25vd2ZsYWtlfSBndWlsZCBUaGUgZ3VpbGQgaWRcbiAgICAgKiBAcmV0dXJucyB7U3RyZWFtRGlzcGF0Y2hlcn1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29ubmVjdGlvbihndWlsZDogU25vd2ZsYWtlLCBncm91cD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gZ2V0Vm9pY2VDb25uZWN0aW9uKGd1aWxkLCBncm91cCk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBWb2ljZVV0aWxzIH07XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2ZhYnJpYy9TZWFyY2hSZXN1bHQnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVPcHRpb25zIHtcbiAgICBjaGVja0ludGVydmFsPzogbnVtYmVyO1xufVxuXG4vLyA1aFxuY29uc3QgREVGQVVMVF9FWFBJUllfVElNRU9VVCA9IDE4XzAwMF8wMDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZVByb3ZpZGVyPFQ+IHtcbiAgICBnZXREYXRhKCk6IFByb21pc2U8RGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VD5bXT47XG4gICAgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHJlc29sdmUoY29udGV4dDogUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCk6IFByb21pc2U8U2VhcmNoUmVzdWx0Pjtcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5Q2FjaGUgaW1wbGVtZW50cyBRdWVyeUNhY2hlUHJvdmlkZXI8VHJhY2s+IHtcbiAgICAjZGVmYXVsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFRyYWNrPj4oKTtcbiAgICBwdWJsaWMgdGltZXI6IE5vZGVKUy5UaW1lcjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwbGF5ZXI6IFBsYXllcixcbiAgICAgICAgcHVibGljIG9wdGlvbnM6IFF1ZXJ5Q2FjaGVPcHRpb25zID0ge1xuICAgICAgICAgICAgY2hlY2tJbnRlcnZhbDogREVGQVVMVF9FWFBJUllfVElNRU9VVFxuICAgICAgICB9XG4gICAgKSB7XG4gICAgICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCh0aGlzLmNsZWFudXAuYmluZCh0aGlzKSwgdGhpcy5jaGVja0ludGVydmFsKS51bnJlZigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2hlY2tJbnRlcnZhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jaGVja0ludGVydmFsID8/IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFudXAoKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2lkLCB2YWx1ZV0gb2YgdGhpcy4jZGVmYXVsdENhY2hlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUuaGFzRXhwaXJlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXREYXRhKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuI2RlZmF1bHRDYWNoZS52YWx1ZXMoKV07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KSB7XG4gICAgICAgIGRhdGEudHJhY2tzLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNkZWZhdWx0Q2FjaGUuaGFzKGQudXJsKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLnNldChkLnVybCwgbmV3IERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlKGQpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlc29sdmUoY29udGV4dDogUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNkZWZhdWx0Q2FjaGUuZ2V0KGNvbnRleHQucXVlcnkpO1xuICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBjb250ZXh0LnF1ZXJ5LFxuICAgICAgICAgICAgdHJhY2tzOiBbcmVzdWx0LmRhdGFdLFxuICAgICAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VCA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZXhwaXJlQWZ0ZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZGF0YTogVCwgZXhwaXJlQWZ0ZXI6IG51bWJlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBleHBpcmVBZnRlciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwaXJlQWZ0ZXIgPSBEYXRlLm5vdygpICsgZXhwaXJlQWZ0ZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzRXhwaXJlZCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmV4cGlyZUFmdGVyICE9PSAnbnVtYmVyJyB8fCBpc05hTih0aGlzLmV4cGlyZUFmdGVyKSB8fCB0aGlzLmV4cGlyZUFmdGVyIDwgMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3coKSA8PSB0aGlzLmV4cGlyZUFmdGVyO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0IHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlcjtcbiAgICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBgZXh0OiR7c3RyaW5nfWA7XG59XG4iLCAiaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5pbXBvcnQgeyBDbGllbnQsIFNub3dmbGFrZVV0aWwsIFZvaWNlU3RhdGUsIEludGVudHNCaXRGaWVsZCwgVXNlciwgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCB2ZXJzaW9uIGFzIGRqc1ZlcnNpb24gfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXlsaXN0LCBUcmFjaywgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi9mYWJyaWMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUV2ZW50cywgVm9pY2VDb25uZWN0Q29uZmlnLCBHdWlsZE5vZGVDcmVhdGVPcHRpb25zLCBHdWlsZE5vZGVNYW5hZ2VyLCBHdWlsZFF1ZXVlLCBSZXNvdXJjZVBsYXlPcHRpb25zLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL21hbmFnZXInO1xuaW1wb3J0IHsgVm9pY2VVdGlscyB9IGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscyc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMsIFF1ZXJ5VHlwZSwgU2VhcmNoT3B0aW9ucywgUGxheWVySW5pdE9wdGlvbnMsIFBsYXlsaXN0SW5pdERhdGEsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciwgUmVzb2x2ZWRRdWVyeSB9IGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi91dGlscy9VdGlsJztcbmltcG9ydCB7IGdlbmVyYXRlRGVwZW5kZW5jeVJlcG9ydCwgdmVyc2lvbiBhcyBkVm9pY2VWZXJzaW9uIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0ICogYXMgX2ludGVybmFscyBmcm9tICcuL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBRdWVyeUNhY2hlIH0gZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlciB9IGZyb20gJy4vRGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyJztcbmltcG9ydCB7IElQUm90YXRvciB9IGZyb20gJy4vdXRpbHMvSVBSb3RhdG9yJztcblxuY29uc3Qga1NpbmdsZXRvbiA9IFN5bWJvbCgnSW5zdGFuY2VEaXNjb3JkUGxheWVyU2luZ2xldG9uJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gICAgdHJhY2s6IFRyYWNrO1xuICAgIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gICAgc2VhcmNoUmVzdWx0OiBTZWFyY2hSZXN1bHQ7XG4gICAgcXVldWU6IEd1aWxkUXVldWU8VD47XG59XG5cbmV4cG9ydCB0eXBlIFRyYWNrTGlrZSA9IHN0cmluZyB8IFRyYWNrIHwgU2VhcmNoUmVzdWx0IHwgVHJhY2tbXSB8IFBsYXlsaXN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gZXh0ZW5kcyBTZWFyY2hPcHRpb25zIHtcbiAgICBub2RlT3B0aW9ucz86IEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnM8VD47XG4gICAgY29ubmVjdGlvbk9wdGlvbnM/OiBWb2ljZUNvbm5lY3RDb25maWc7XG4gICAgYXVkaW9QbGF5ZXJPcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgICBhZnRlclNlYXJjaD86IChyZXN1bHQ6IFNlYXJjaFJlc3VsdCkgPT4gUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgdHlwZSBWb2ljZVN0YXRlSGFuZGxlciA9IChwbGF5ZXI6IFBsYXllciwgcXVldWU6IEd1aWxkUXVldWUsIG9sZFZvaWNlU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1ZvaWNlU3RhdGU6IFZvaWNlU3RhdGUpID0+IEF3YWl0ZWQ8dm9pZD47XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPFBsYXllckV2ZW50cz4ge1xuICAgICNsYXN0TGF0ZW5jeSA9IC0xO1xuICAgICN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIgPSB0aGlzLmhhbmRsZVZvaWNlU3RhdGUuYmluZCh0aGlzKTtcbiAgICAjbGFnTW9uaXRvclRpbWVvdXQhOiBOb2RlSlMuVGltZW91dDtcbiAgICAjbGFnTW9uaXRvckludGVydmFsITogTm9kZUpTLlRpbWVyO1xuICAgICNvblZvaWNlU3RhdGVVcGRhdGU6IFZvaWNlU3RhdGVIYW5kbGVyID0gZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nID0gJzYuNi40JztcbiAgICBwdWJsaWMgc3RhdGljIF9zaW5nbGV0b25LZXkgPSBrU2luZ2xldG9uO1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHB1YmxpYyByZWFkb25seSBjbGllbnQhOiBDbGllbnQ7XG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMhOiBQbGF5ZXJJbml0T3B0aW9ucztcbiAgICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VVdGlscyA9IG5ldyBWb2ljZVV0aWxzKHRoaXMpO1xuICAgIHB1YmxpYyBleHRyYWN0b3JzID0gbmV3IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQodGhpcyk7XG4gICAgcHVibGljIGV2ZW50cyA9IG5ldyBQbGF5ZXJFdmVudHNFbWl0dGVyPEd1aWxkUXVldWVFdmVudHM+KFsnZXJyb3InLCAncGxheWVyRXJyb3InXSk7XG4gICAgcHVibGljIHJvdXRlUGxhbm5lcjogSVBSb3RhdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBEaXNjb3JkIFBsYXllclxuICAgICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgVGhlIERpc2NvcmQgQ2xpZW50XG4gICAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVJbnN0YW5jZSAmJiBrU2luZ2xldG9uIGluIFBsYXllcikgcmV0dXJuICg8YW55PlBsYXllcilba1NpbmdsZXRvbl0gYXMgUGxheWVyO1xuXG4gICAgICAgIHN1cGVyKFsnZXJyb3InXSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaXNjb3JkLmpzIGNsaWVudFxuICAgICAgICAgKiBAdHlwZSB7Q2xpZW50fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG5cbiAgICAgICAgY29uc3QgaWJmID0gdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIGluc3RhbmNlb2YgSW50ZW50c0JpdEZpZWxkID8gdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIDogbmV3IEludGVudHNCaXRGaWVsZCh0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMpO1xuXG4gICAgICAgIGlmICghaWJmLmhhcyhJbnRlbnRzQml0RmllbGQuRmxhZ3MuR3VpbGRWb2ljZVN0YXRlcykpIHtcbiAgICAgICAgICAgIFV0aWwud2FybignY2xpZW50IGlzIG1pc3NpbmcgXCJHdWlsZFZvaWNlU3RhdGVzXCIgaW50ZW50JywgJ0ludmFsaWRJbnRlbnRzQml0RmllbGQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGxvY2tWb2ljZVN0YXRlSGFuZGxlcjogZmFsc2UsXG4gICAgICAgICAgICBibG9ja0V4dHJhY3RvcnM6IFtdLFxuICAgICAgICAgICAgYmxvY2tTdHJlYW1Gcm9tOiBbXSxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiAyMDAwMCxcbiAgICAgICAgICAgIGxhZ01vbml0b3I6IDMwMDAwLFxuICAgICAgICAgICAgcXVlcnlDYWNoZTogb3B0aW9ucy5xdWVyeUNhY2hlID09PSBudWxsID8gbnVsbCA6IG9wdGlvbnMucXVlcnlDYWNoZSB8fCBuZXcgUXVlcnlDYWNoZSh0aGlzKSxcbiAgICAgICAgICAgIHVzZUxlZ2FjeUZGbXBlZzogZmFsc2UsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgeXRkbE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBoaWdoV2F0ZXJNYXJrOiAxIDw8IDI1LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMueXRkbE9wdGlvbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBQbGF5ZXJJbml0T3B0aW9ucztcblxuICAgICAgICB0aGlzLmNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA9PT0gJ251bWJlcicgJiYgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbTGFnIE1vbml0b3JdIEV2ZW50IGxvb3AgbGF0ZW5jeTogJHt0aGlzLiNsYXN0TGF0ZW5jeX1tc2ApO1xuICAgICAgICAgICAgICAgIH0sIDApLnVucmVmKCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMubGFnTW9uaXRvcikudW5yZWYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaXBjb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVQbGFubmVyID0gbmV3IElQUm90YXRvcih0aGlzLm9wdGlvbnMuaXBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2ludGVybmFscy5hZGRQbGF5ZXIodGhpcyk7XG5cbiAgICAgICAgaWYgKCEoa1NpbmdsZXRvbiBpbiBQbGF5ZXIpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGxheWVyLCBrU2luZ2xldG9uLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJykgPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkaXNjb3JkLXBsYXllciBzaW5nbGV0b24gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHBsYXllclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaW5nbGV0b24oY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IE9taXQ8UGxheWVySW5pdE9wdGlvbnMsICdpZ25vcmVJbnN0YW5jZSc+ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgaWdub3JlSW5zdGFuY2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGRpc2NvcmQtcGxheWVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBPbWl0PFBsYXllckluaXRPcHRpb25zLCAnaWdub3JlSW5zdGFuY2UnPiA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWVyKGNsaWVudCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIGlnbm9yZUluc3RhbmNlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgYWN0aXZlIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxQbGF5ZXJzKCkge1xuICAgICAgICByZXR1cm4gX2ludGVybmFscy5nZXRQbGF5ZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckFsbFBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiBfaW50ZXJuYWxzLmluc3RhbmNlcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhY2hlIHByb3ZpZGVyIGluIHVzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5xdWVyeUNhY2hlID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgdG8gYFBsYXllci5ub2Rlc2AuXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWV1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgICAqIHNvbWUgZXhwZW5zaXZlIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHdoaWNoIGlzIHNsb3dpbmcgZG93biB0aGUgZXZlbnQgbG9vcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXZlbnRMb29wTGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc3RhdHMgPSBwbGF5ZXIuZ2VuZXJhdGVTdGF0aXN0aWNzKCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhzdGF0cyk7XG4gICAgICpcbiAgICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAgICogLy8ge1xuICAgICAqIC8vICAgaW5zdGFuY2VzOiBudW1iZXIsXG4gICAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgICAqIC8vICAgcXVlcnlDYWNoZUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgICogLy8gICBxdWV1ZXM6IFtcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIC4uLlxuICAgICAqIC8vICAgXVxuICAgICAqIC8vIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVTdGF0aXN0aWNzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5zdGFuY2VzOiBfaW50ZXJuYWxzLmluc3RhbmNlcy5zaXplLFxuICAgICAgICAgICAgcXVldWVzQ291bnQ6IHRoaXMucXVldWVzLmNhY2hlLnNpemUsXG4gICAgICAgICAgICBxdWVyeUNhY2hlRW5hYmxlZDogdGhpcy5xdWVyeUNhY2hlICE9IG51bGwsXG4gICAgICAgICAgICBxdWV1ZXM6IHRoaXMucXVldWVzLmNhY2hlLm1hcCgobSkgPT4gbS5zdGF0cy5nZW5lcmF0ZSgpKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgZXZlcnkgc2luZ2xlIHF1ZXVlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFzdGVyIHBsYXllciBpbnN0YW5jZVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAgICogYXdhaXQgcGxheWVyLmRlc3Ryb3koKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcbiAgICAgICAgdGhpcy5jbGllbnQub2ZmKCd2b2ljZVN0YXRlVXBkYXRlJywgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5ldmVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICAgICAgaWYgKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KSBjbGVhckludGVydmFsKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KTtcbiAgICAgICAgX2ludGVybmFscy5jbGVhclBsYXllcih0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICAgICAgaWYgKCFxdWV1ZSB8fCAhcXVldWUuY29ubmVjdGlvbiB8fCAhcXVldWUuY2hhbm5lbCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGRpc3BhdGNoIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQudm9pY2VTdGF0ZVVwZGF0ZSwgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSh0aGlzLCBxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBwYXNzaW5nIHZvaWNlIHN0YXRlIHVwZGF0ZSBkYXRhIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB2b2ljZSBzdGF0ZSBoYW5kbGVyXG4gICAgICpcbiAgICAgKiBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICogICAvLyB0aGlzIGlzIGRlZmluaXRlbHkgYSByb2NrZXQgc2NpZW5jZSwgcmlnaHQgaGVyZVxuICAgICAqICAgcGxheWVyLmhhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2sgdm9pY2Ugc3RhdGUgaGFuZGxlci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIHdpbGwga2VlcCB1c2luZyB0aGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciwgZXZlbiBpZiBjdXN0b20gaW1wbGVtZW50YXRpb24gZXhpc3RzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVubG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBzdG9wIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIHVubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHZvaWNlIHN0YXRlIGhhbmRsZXIgaXMgbG9ja2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYXRlIGF1ZGlvIHBsYXllclxuICAgICAqIEBwYXJhbSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBtdXNpYyBzaG91bGQgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSB0cmFjayBvciBzb3VyY2UgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXllclxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHF1ZXVlIG1hbmFnZW1lbnQsIGp1c3QgdXNlIHRoaXMgbWV0aG9kIFx1RDgzRFx1REUwNFxuICAgICAqIGNvbnN0IHF1ZXJ5ID0gJ3RoaXMgaXMgbXkgc3VwZXIgY29vbCBzZWFyY2ggcXVlcnkgdGhhdCBJIHdhbnQgdG8gcGxheSc7XG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgIGNvbnN0IHsgdHJhY2sgfSA9IGF3YWl0IHBsYXllci5wbGF5KHZvaWNlQ2hhbm5lbCwgcXVlcnkpO1xuICAgICAqICAgY29uc29sZS5sb2coYFx1RDgzQ1x1REY4OSBJIGFtIHBsYXlpbmcgJHt0cmFjay50aXRsZX0gXHVEODNDXHVERjg5YCk7XG4gICAgICogfSBjYXRjaChlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgXHVEODNEXHVERTJEIEZhaWxlZCB0byBwbGF5IGVycm9yIG9oIG5vOlxcblxcbiR7ZX1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgcXVlcnk6IFRyYWNrTGlrZSwgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9KTogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICAgICAgY29uc3QgdmMgPSB0aGlzLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWwpO1xuICAgICAgICBpZiAoIXZjPy5pc1ZvaWNlQmFzZWQoKSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2hhbm5lbCcsICdWb2ljZUJhc2VkQ2hhbm5lbCcsICF2YyA/ICd1bmRlZmluZWQnIDogYGNoYW5uZWwgdHlwZSAke3ZjLnR5cGV9YCk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPSBxdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCA/IHF1ZXJ5IDogYXdhaXQgdGhpcy5zZWFyY2gocXVlcnksIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoYE5vIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtxdWVyeX1cIiAoRXh0cmFjdG9yOiAke3Jlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLm5vZGVzLmNyZWF0ZSh2Yy5ndWlsZCwgb3B0aW9ucy5ub2RlT3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoeyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBXYWl0aW5nIGZvciB0aGUgcXVldWUgdG8gcmVzb2x2ZS4uLmApO1xuICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gRW50cnkgJHtlbnRyeS5pZH0gd2FzIHJlc29sdmVkIWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC50cmFja3NbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQucGxheWxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFxdWV1ZS5pc1BsYXlpbmcoKSkgYXdhaXQgcXVldWUubm9kZS5wbGF5KG51bGwsIG9wdGlvbnMuYXVkaW9QbGF5ZXJPcHRpb25zKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gUmVsZWFzaW5nIGFuIGVudHJ5IGZyb20gdGhlIHF1ZXVlLi4uYCk7XG4gICAgICAgICAgICBxdWV1ZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFjazogcmVzdWx0LnRyYWNrc1swXSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdDogcmVzdWx0LFxuICAgICAgICAgICAgcXVldWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2ggdHJhY2tzXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCB8IFNlYXJjaFJlc3VsdH0gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeVxuICAgICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZWFyY2hSZXN1bHQ+fVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGxheWVyLnNlYXJjaChzZWFyY2hRdWVyeSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZWFyY2goc2VhcmNoUXVlcnk6IHN0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0LCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgICAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHJldHVybiBzZWFyY2hRdWVyeTtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0ZWRCeSAhPSBudWxsKSBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG4gICAgICAgIG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/PSB0aGlzLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IFtzZWFyY2hRdWVyeV0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICAgICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogc2VhcmNoUXVlcnkucXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LFxuICAgICAgICAgICAgICAgIHRyYWNrczogc2VhcmNoUXVlcnkudHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LnRyYWNrc1swXT8uZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoUXVlcnkpKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPSBzZWFyY2hRdWVyeS5maWx0ZXIoKHQpID0+IHQgaW5zdGFuY2VvZiBUcmFjayk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiAnQEAjJXt7VXNlckxvYWRlZENvbnRlbnR9fSUjQEAnLFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogbnVsbCxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgICAgICBsZXQgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9LCBmYWxsYmFjayBzZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmV9YCk7XG5cbiAgICAgICAgY29uc3QgeyB0eXBlOiBxdWVyeVR5cGUsIHF1ZXJ5IH0gPVxuICAgICAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPT09IFF1ZXJ5VHlwZS5BVVRPID8gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHNlYXJjaFF1ZXJ5LCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6ICh7IHR5cGU6IG9wdGlvbnMuc2VhcmNoRW5naW5lLCBxdWVyeTogc2VhcmNoUXVlcnkgfSBhcyBSZXNvbHZlZFF1ZXJ5KTtcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgUXVlcnkgdHlwZSBpZGVudGlmaWVkIGFzICR7cXVlcnlUeXBlfWApO1xuXG4gICAgICAgIC8vIGZvcmNlIHBhcnRpY3VsYXIgZXh0cmFjdG9yXG4gICAgICAgIGlmIChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdGFydHNXaXRoKCdleHQ6JykpIHtcbiAgICAgICAgICAgIGV4dHJhY3RvciA9IHRoaXMuZXh0cmFjdG9ycy5nZXQob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3Vic3RyaW5nKDQpKSE7XG4gICAgICAgICAgICBpZiAoIWV4dHJhY3RvcilcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHF1ZXJ5IGFsbCBleHRyYWN0b3JzXG4gICAgICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAgICAgICAvLyBjYWNoZSB2YWxpZGF0aW9uXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2hlY2tpbmcgY2FjaGUuLi5gKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LnJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGNhY2hlIGhpdFxuICAgICAgICAgICAgICAgIGlmIChyZXM/Lmhhc1RyYWNrcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBoaXQgZm9yIHF1ZXJ5ICR7cXVlcnl9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENhY2hlIG1pc3MgZm9yIHF1ZXJ5ICR7cXVlcnl9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBFeGVjdXRpbmcgZXh0cmFjdG9ycy4uLmApO1xuXG4gICAgICAgICAgICAvLyBjYWNoZSBtaXNzXG4gICAgICAgICAgICBleHRyYWN0b3IgPVxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dC52YWxpZGF0ZShxdWVyeSwgcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8uZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBubyBleHRyYWN0b3JzIGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0ZhaWxlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGV4dHJhY3RvcicpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgRXhlY3V0aW5nIG1ldGFkYXRhIHF1ZXJ5IHVzaW5nICR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3Rvci4uLmApO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBleHRyYWN0b3JcbiAgICAgICAgICAgIC5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IG9wdGlvbnMucmVxdWVzdE9wdGlvbnNcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbCk7XG5cbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ01ldGFkYXRhIHF1ZXJ5IHdhcyBzdWNjZXNzZnVsIScpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiByZXMucGxheWxpc3QsXG4gICAgICAgICAgICAgICAgdHJhY2tzOiByZXMudHJhY2tzLFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0ZhaWxlZCB0byBmaW5kIHJlc3VsdCB1c2luZyBhcHByb3ByaWF0ZSBleHRyYWN0b3IuIFF1ZXJ5aW5nIGFsbCBleHRyYWN0b3JzLi4uJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXh0cmFjdG9ycy5ydW4oXG4gICAgICAgICAgICBhc3luYyAoZXh0KSA9PlxuICAgICAgICAgICAgICAgICFvcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoZXh0LmlkZW50aWZpZXIpICYmXG4gICAgICAgICAgICAgICAgKGF3YWl0IGV4dC52YWxpZGF0ZShxdWVyeSkpICYmXG4gICAgICAgICAgICAgICAgZXh0LmhhbmRsZShxdWVyeSwge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSBhcyBVc2VyLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9uc1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtyZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0Py5leHRyYWN0b3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYE1ldGFkYXRhIHF1ZXJ5IHdhcyBzdWNjZXNzZnVsIHVzaW5nICR7cmVzdWx0LmV4dHJhY3Rvci5pZGVudGlmaWVyfSFgKTtcblxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiByZXN1bHQucmVzdWx0LnBsYXlsaXN0LFxuICAgICAgICAgICAgdHJhY2tzOiByZXN1bHQucmVzdWx0LnRyYWNrcyxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgZGlzY29yZC12b2lwYCBtb2R1bGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zb2xlLmxvZyhwbGF5ZXIuc2NhbkRlcHMoKSk7XG4gICAgICogLy8gLT4gbG9ncyBkZXBlbmRlbmNpZXMgcmVwb3J0XG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBwdWJsaWMgc2NhbkRlcHMoKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcbiAgICAgICAgY29uc3QgcnVudGltZSA9ICdCdW4nIGluIGdsb2JhbFRoaXMgPyAnQnVuJyA6ICdEZW5vJyBpbiBnbG9iYWxUaGlzID8gJ0Rlbm8nIDogJ05vZGUnO1xuICAgICAgICBjb25zdCBkZXBzUmVwb3J0ID0gW1xuICAgICAgICAgICAgJ0Rpc2NvcmQgUGxheWVyJyxcbiAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICBgLSBkaXNjb3JkLXBsYXllcjogJHtQbGF5ZXIudmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gZGlzY29yZC12b2lwOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICAgICAgICAgIGAtIGRpc2NvcmQuanM6ICR7ZGpzVmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gTm9kZSB2ZXJzaW9uOiAke3Byb2Nlc3MudmVyc2lvbn0gKERldGVjdGVkIFJ1bnRpbWU6ICR7cnVudGltZX0pYCxcbiAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VMZWdhY3lGRm1wZWcpIHJldHVybiAnLSBmZm1wZWc6IE4vQSAodXNpbmcgbGVnYWN5IGZmbXBlZyknO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBGRm1wZWcubG9jYXRlU2FmZSgpO1xuICAgICAgICAgICAgICAgIGlmICghaW5mbykgcmV0dXJuICdGRm1wZWcvQXZjb252IG5vdCBmb3VuZCc7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gW2AtIGZmbXBlZzogJHtpbmZvLnZlcnNpb259YCwgYC0gY29tbWFuZDogJHtpbmZvLmNvbW1hbmR9YCwgYC0gc3RhdGljOiAke2luZm8uaXNTdGF0aWN9YCwgYC0gbGlib3B1czogJHtpbmZvLm1ldGFkYXRhIS5pbmNsdWRlcygnLS1lbmFibGUtbGlib3B1cycpfWBdLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgICdcXG4nLFxuICAgICAgICAgICAgJ0xvYWRlZCBFeHRyYWN0b3JzOicsXG4gICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlXG4gICAgICAgICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5pZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpIHx8ICdOL0EnLFxuICAgICAgICAgICAgJ1xcblxcbmRpc2NvcmQtdm9pcCcsXG4gICAgICAgICAgICBnZW5lcmF0ZURlcGVuZGVuY3lSZXBvcnQoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiBkZXBzUmVwb3J0LmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLm5vZGVzLmNhY2hlLnZhbHVlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYFBsYXlsaXN0YCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQbGF5bGlzdChkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWxpc3QodGhpcywgZGF0YSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IENoYW5uZWxUeXBlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL21hbmFnZXInO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi9QbGF5ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vdXRpbHMvVXRpbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIocGxheWVyOiBQbGF5ZXIsIHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmICFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIG5vb3AgKi9cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdm9pZCBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRpc2Nvbm5lY3QsIHF1ZXVlKTtcbiAgICB9XG5cbiAgICBpZiAocXVldWUub3B0aW9ucy5wYXVzZU9uRW1wdHkpIHtcbiAgICAgICAgY29uc3QgaXNFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpO1xuXG4gICAgICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIHRydWUpO1xuICAgICAgICAgICAgICAgIHF1ZXVlLmRlYnVnKCdWb2ljZSBjaGFubmVsIGlzIGVtcHR5IGFuZCBvcHRpb25zI3BhdXNlT25FbXB0eSBpcyB0cnVlLCBwYXVzaW5nLi4uJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChSZWZsZWN0LmdldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5zZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLmRlYnVnKCdWb2ljZSBjaGFubmVsIGlzIG5vdCBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcmVzdW1pbmcuLi4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKSB7XG4gICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zZXJ2ZXJNdXRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiYgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zdXBwcmVzcyAhPT0gbmV3U3RhdGUuc3VwcHJlc3MpIHtcbiAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnN1cHByZXNzKTtcbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgICAgICAgICAgIG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHRydWUpLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgIH1cblxuICAgIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgICAgIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgIGlmICghY2hhbm5lbEVtcHR5ICYmIGVtcHR5VGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSB7XG4gICAgICAgICAgICBpZiAocXVldWUuY29ubmVjdGlvbiAmJiBuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkgcXVldWUuY2hhbm5lbCA9IG5ld1N0YXRlLmNoYW5uZWwhO1xuICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG4gICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5jaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUuY29ubmVjdGlvbiAmJiAhVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGxheWVyLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAhPT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGxheWVyLm5vZGVzLmhhcyhxdWV1ZS5ndWlsZC5pZCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWAsIHRpbWVvdXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpO1xuICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbEVtcHR5ICYmIGVtcHR5VGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgaXAgZnJvbSAnaXAnO1xuXG5leHBvcnQgY2xhc3MgSVBCbG9jayB7XG4gICAgcHVibGljIHVzYWdlID0gMDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2lkcjogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBjaWRyU2l6ZTogbnVtYmVyO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBibG9jazogc3RyaW5nKSB7XG4gICAgICAgIGlmIChpcC5pc1Y0Rm9ybWF0KGJsb2NrLnNwbGl0KCcvJylbMF0pICYmICFibG9jay5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgICBibG9jayArPSAnLzMyJztcbiAgICAgICAgfSBlbHNlIGlmIChpcC5pc1Y2Rm9ybWF0KGJsb2NrLnNwbGl0KCcvJylbMF0pICYmICFibG9jay5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgICBibG9jayArPSAnLzEyOCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNpZHIgPSBpcC5jaWRyKHRoaXMuYmxvY2spO1xuICAgICAgICB0aGlzLmNpZHJTaXplID0gaXAuY2lkclN1Ym5ldCh0aGlzLmJsb2NrKS5zdWJuZXRNYXNrTGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdW1lKCkge1xuICAgICAgICB0aGlzLnVzYWdlKys7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQUm90YXRpb25Db25maWcge1xuICAgIC8qKlxuICAgICAqIElQIGJsb2NrcyB0byB1c2VcbiAgICAgKi9cbiAgICBibG9ja3M6IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIElQcyB0byBleGNsdWRlXG4gICAgICovXG4gICAgZXhjbHVkZT86IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIE1heCByZXRyaWVzIHRvIGZpbmQgYW4gSVAgdGhhdCBpcyBub3QgZXhjbHVkZWRcbiAgICAgKi9cbiAgICBtYXhSZXRyaWVzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgSVBSb3RhdG9yIHtcbiAgICBwdWJsaWMgYmxvY2tzOiBJUEJsb2NrW10gPSBbXTtcbiAgICBwdWJsaWMgZmFpbHVyZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIHB1YmxpYyBNQVhfTkVYVF9SRVRSSUVTID0gMzA7XG4gICAgI3JldHJpZXMgPSAwO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb25maWc6IElQUm90YXRpb25Db25maWcpIHtcbiAgICAgICAgY29uZmlnLmV4Y2x1ZGUgPz89IFtdO1xuICAgICAgICB0aGlzLmJsb2NrcyA9IGNvbmZpZy5ibG9ja3MubWFwKChibG9jaykgPT4gbmV3IElQQmxvY2soYmxvY2spKTtcbiAgICAgICAgdGhpcy5NQVhfTkVYVF9SRVRSSUVTID0gY29uZmlnLm1heFJldHJpZXMgPz8gMTA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldElQKCk6IHsgaXA6IHN0cmluZzsgZmFtaWx5OiA0IHwgNiB9IHtcbiAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmJsb2Nrcy5zb3J0KChhLCBiKSA9PiBhLnVzYWdlIC0gYi51c2FnZSlbMF07XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gSVAgYmxvY2tzIGF2YWlsYWJsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFuZG9tID0gSVBSb3RhdG9yLmdldFJhbmRvbUlQKGJsb2NrLmNpZHIsIGJsb2NrLmNpZHJTaXplKTtcblxuICAgICAgICBpZiAodGhpcy5pc0ZhaWxlZE9yRXhjbHVkZWQocmFuZG9tKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI3JldHJpZXMrKyA+IHRoaXMuTUFYX05FWFRfUkVUUklFUykge1xuICAgICAgICAgICAgICAgIHRoaXMuI3JldHJpZXMgPSAwO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgYW4gSVAgdGhhdCBpcyBub3QgZXhjbHVkZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SVAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI3JldHJpZXMgPSAwO1xuICAgICAgICBibG9jay5jb25zdW1lKCk7XG4gICAgICAgIHJldHVybiB7IGlwOiByYW5kb20sIGZhbWlseTogaXAuaXNWNEZvcm1hdChyYW5kb20pID8gNCA6IDYgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNGYWlsZWRPckV4Y2x1ZGVkKGlwOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZXMuaGFzKGlwKSB8fCAhIXRoaXMuY29uZmlnLmV4Y2x1ZGU/LmluY2x1ZGVzKGlwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmFpbGVkKGlwOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbGFzdEZhaWxlZENvdW50ID0gdGhpcy5mYWlsdXJlcy5nZXQoaXApID8/IDA7XG5cbiAgICAgICAgdGhpcy5mYWlsdXJlcy5zZXQoaXAsIGxhc3RGYWlsZWRDb3VudCArIDEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmFuZG9tSVAoYWRkcmVzczogc3RyaW5nLCBzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKSB7XG4gICAgICAgIC8vIEF1dGhvcjogSmVzc2UgVGFuZSA8amVzc2UudGFuZUBnbWFpbC5jb20+XG4gICAgICAgIC8vIE5QTUpTOiBodHRwczovL25wbWpzLm9yZy9yYW5kb20taXBcblxuICAgICAgICBjb25zdCBieXRlcyA9IGlwLnRvQnVmZmVyKGFkZHJlc3MpO1xuICAgICAgICBjb25zdCBpcHY2ID0gYnl0ZXMubGVuZ3RoID09PSAxNjtcbiAgICAgICAgY29uc3QgYnl0ZXNpemUgPSA4O1xuXG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICAgICAgZW5kID0gdHlwZW9mIGVuZCAhPT0gJ3VuZGVmaW5lZCcgPyBlbmQgOiBieXRlcy5sZW5ndGggKiBieXRlc2l6ZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYml0ID0gaSAqIGJ5dGVzaXplO1xuXG4gICAgICAgICAgICBpZiAoYml0ICsgYnl0ZXNpemUgPCBzdGFydCB8fCBiaXQgPj0gZW5kKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBiID0gYnl0ZXNbaV07XG5cbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgYnl0ZXNpemU7IG4rKykge1xuICAgICAgICAgICAgICAgIGlmIChiaXQgPj0gc3RhcnQgJiYgYml0IDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpdHBvcyA9IGJ5dGVzaXplIC0gbiAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpdG1hc2sgPSAxIDw8IGJpdHBvcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCAwLjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGIgfD0gYml0bWFzaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGIgJj0gfmJpdG1hc2s7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYml0Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJ5dGVzW2ldID0gYjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRldHMgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXB2Nikge1xuICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXRzW2kgPj4gMV0gPSAoKGJ5dGVzW2ldIDw8IGJ5dGVzaXplKSB8IGJ5dGVzW2kgKyAxXSkudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGV0c1tpXSA9IGJ5dGVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRldHMuam9pbihpcHY2ID8gJzonIDogJy4nKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBjb25zdCBnZXRQbGF5ZXIgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGluc3RhbmNlcy5maXJzdCgpIHx8IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UXVldWUgPSA8VCA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSA9PiB7XG4gICAgY29uc3QgcGxheWVyID0gZ2V0UGxheWVyKCk7XG4gICAgaWYgKCFwbGF5ZXIpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIChwbGF5ZXIubm9kZXMucmVzb2x2ZShub2RlKSBhcyBHdWlsZFF1ZXVlPFQ+KSB8fCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBIb29rRGVjbGFyYXRpb25Db250ZXh0IHtcbiAgICBnZXRRdWV1ZTogdHlwZW9mIGdldFF1ZXVlO1xuICAgIGdldFBsYXllcjogdHlwZW9mIGdldFBsYXllcjtcbiAgICBpbnN0YW5jZXM6IHR5cGVvZiBpbnN0YW5jZXM7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmV4cG9ydCB0eXBlIEhvb2tEZWNsYXJhdGlvbjxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+ID0gKGNvbnRleHQ6IEhvb2tEZWNsYXJhdGlvbkNvbnRleHQpID0+IFQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIb29rPFQgZXh0ZW5kcyBIb29rRGVjbGFyYXRpb248KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+Pihob29rOiBUKTogUmV0dXJuVHlwZTxUPiB7XG4gICAgcmV0dXJuIGhvb2soe1xuICAgICAgICBnZXRRdWV1ZSxcbiAgICAgICAgZ2V0UGxheWVyLFxuICAgICAgICBpbnN0YW5jZXNcbiAgICB9KSBhcyBSZXR1cm5UeXBlPFQ+O1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgaGlzdG9yeVxuICogQHBhcmFtIG5vZGUgZ3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8TWV0YT4obm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWUuaGlzdG9yeTtcbn1cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgcGxheWVyIG5vZGVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUGxheWVyPE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8TWV0YT4obm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWUubm9kZTtcbn1cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0UXVldWUgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZTtcbn1cbiIsICJpbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBnZXRQbGF5ZXIgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYXN0ZXJQbGF5ZXIoKSB7XG4gICAgVXRpbC53YXJuKCd1c2VNYXN0ZXJQbGF5ZXIoKSBob29rIGlzIGRlcHJlY2F0ZWQsIHVzZSB1c2VNYWluUGxheWVyKCkgaW5zdGVhZC4nLCAnRGVwcmVjYXRpb25XYXJuaW5nJyk7XG4gICAgcmV0dXJuIGdldFBsYXllcigpO1xufVxuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYWluUGxheWVyKCkge1xuICAgIHJldHVybiBnZXRQbGF5ZXIoKTtcbn1cbiIsICJpbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRRdWV1ZSB9IGZyb20gJy4vY29tbW9uJztcblxudHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIGd1aWxkIHF1ZXVlIG1ldGFkYXRhXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8VD4obm9kZSk7XG4gICAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICAgICAgaWYgKHF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihtZXRhZGF0YSkpIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtnZXR0ZXIsIHNldHRlcl0gYXMgY29uc3Q7XG59XG4iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnMge1xuICAgIGlnbm9yZUZpbHRlcnM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBjdXJyZW50IHRyYWNrXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRpbWVsaW5lIGRpc3BhdGNoZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG5vZGU6IE5vZGVSZXNvbHZhYmxlLCBvcHRpb25zPzogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPikge1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHtcbiAgICAgICAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmdldFRpbWVzdGFtcChvcHRpb25zPy5pZ25vcmVGaWx0ZXJzKSE7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS52b2x1bWU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgdHJhY2soKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUuY3VycmVudFRyYWNrO1xuICAgICAgICB9LFxuICAgICAgICBwYXVzZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnBhdXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2wpO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzZXRQb3NpdGlvbih0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNlZWsodGltZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL21hbmFnZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFmdGVyQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn1cbiIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25CZWZvcmVDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQmVmb3JlQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufVxuIiwgImltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9tYW5hZ2VyJztcbmltcG9ydCB7IGdldFF1ZXVlIH0gZnJvbSAnLi9jb21tb24nO1xuXG50eXBlIFNldHRlckZOID0gKHByZXZpb3VzOiBudW1iZXIpID0+IG51bWJlcjtcblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIHBsYXllciB2b2x1bWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZShub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKHZvbHVtZSkpIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUocXVldWUubm9kZS52b2x1bWUpKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5ub2RlLnZvbHVtZSBhcyBudW1iZXI7XG4gICAgfTtcblxuICAgIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQUFDLGtCQUFzQzs7O0FDRXRDLG1CQUE2Qjs7O0FDQTdCLHNCQUEyQjs7O0FDSXBCLElBQU0sWUFBTixNQUFNLFVBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXFCbEIsWUFBWSxRQUFnQixNQUF3QjtBQU9oRCxTQUFLLFNBQVM7QUFPZCxTQUFLLFNBQVMsS0FBSyxVQUFVLENBQUM7QUFPOUIsU0FBSyxTQUFTLEtBQUs7QUFPbkIsU0FBSyxjQUFjLEtBQUs7QUFPeEIsU0FBSyxZQUFZLEtBQUs7QUFTdEIsU0FBSyxPQUFPLEtBQUs7QUFXakIsU0FBSyxTQUFTLEtBQUs7QUFPbkIsU0FBSyxLQUFLLEtBQUs7QUFPZixTQUFLLE1BQU0sS0FBSztBQU1oQixTQUFLLFFBQVEsS0FBSztBQUFBLEVB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LEtBQUssS0FBSyxhQUFjLE1BQU0sTUFBTSxLQUFLLEdBQUssTUFBTSxJQUFNLEVBQUksQ0FBQztBQUFBLEVBQzFGLFlBQVksVUFBVSxDQUFDLE1BQU0sTUFBTSxNQUFNLElBQU0sS0FBSyxNQUFNLElBQU0sSUFBTSxJQUFNLElBQUksQ0FBQztBQUFBLEVBQ2pGLFlBQVksVUFBVSxDQUFDLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLEtBQUssS0FBSyxNQUFNLElBQUksQ0FBQztBQUFBLEVBQzdFLFdBQVcsVUFBVSxDQUFDLE1BQU0sTUFBTSxLQUFLLEtBQUssYUFBYyxNQUFNLE1BQU0sTUFBTSxhQUFjLFdBQVksQ0FBQztBQUFBLEVBQ3ZHLE1BQU0sVUFBVSxDQUFDLE1BQU0sYUFBYyxHQUFLLEtBQUssS0FBSyxLQUFLLEdBQUssS0FBSyxLQUFLLEdBQUcsQ0FBQztBQUFBLEVBQzVFLE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxhQUFjLGFBQWMsYUFBYyxhQUFjLGFBQWMsYUFBYyxLQUFLLEdBQUcsQ0FBQztBQUFBLEVBQ3pILEtBQUssVUFBVSxDQUFDLE1BQU0sS0FBSyxLQUFLLEdBQUssS0FBSyxhQUFjLE1BQU0sTUFBTSxNQUFNLElBQUksQ0FBQztBQUFBLEVBQy9FLFFBQVEsVUFBVSxDQUFDLGFBQWMsYUFBYyxhQUFjLE1BQU0sYUFBYyxLQUFLLEtBQUssYUFBYyxhQUFjLFdBQVksQ0FBQztBQUFBLEVBQ3BJLE1BQU0sVUFBVSxDQUFDLEdBQUssS0FBSyxNQUFNLElBQU0sTUFBTSxHQUFLLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUFBLEVBQ3hFLEtBQUssVUFBVSxDQUFDLE1BQU0sTUFBTSxJQUFNLGFBQWMsR0FBSyxLQUFLLEtBQUssS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBLEVBQzlFLE1BQU0sVUFBVSxDQUFDLEtBQUssS0FBSyxhQUFjLE1BQU0sYUFBYyxHQUFLLEdBQUssS0FBSyxNQUFNLEVBQUksQ0FBQztBQUFBLEVBQ3ZGLFVBQVUsVUFBVSxDQUFDLEdBQUssR0FB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RXZlbnQiLCAiUXVldWVSZXBlYXRNb2RlIiwgInRhcmdldCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgInF1ZXJ5IiwgImltcG9ydF9wcm9taXNlcyIsICJpbXBvcnRfZGlzY29yZCIsICJ3YWl0Rm9yIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAicHJpc20iLCAidGFyZ2V0IiwgIkd1aWxkUXVldWUiLCAiaW1wb3J0X3V0aWxzIiwgIkd1aWxkUXVldWUiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2ZmbXBlZyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF9kaXNjb3JkIiwgImlwIiwgImhhbmRsZXIiLCAicmVzIiwgInJlc3VsdCIsICJkVm9pY2VWZXJzaW9uIiwgImRqc1ZlcnNpb24iLCAiaGFuZGxlciIsICJoYW5kbGVyIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJkanNWZXJzaW9uIl0KfQo=
|