discord-player 7.0.0 → 7.1.1-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -59,11 +59,13 @@ __export(src_exports, {
59
59
  GuildQueueHistory: () => GuildQueueHistory,
60
60
  GuildQueuePlayerNode: () => GuildQueuePlayerNode,
61
61
  GuildQueueStatistics: () => GuildQueueStatistics,
62
+ InterceptedStream: () => InterceptedStream,
62
63
  LrcLib: () => LrcLib,
63
64
  PCMAudioFilters: () => import_equalizer3.AudioFilters,
64
65
  Player: () => Player,
65
66
  PlayerEvent: () => PlayerEvent,
66
67
  PlayerEventsEmitter: () => PlayerEventsEmitter,
68
+ PlayerStreamInterceptor: () => PlayerStreamInterceptor,
67
69
  Playlist: () => Playlist,
68
70
  Q_BUTTERWORTH: () => import_equalizer3.Q_BUTTERWORTH,
69
71
  QueryCache: () => QueryCache,
@@ -74,6 +76,7 @@ __export(src_exports, {
74
76
  SequentialBucket: () => SequentialBucket,
75
77
  SerializedType: () => SerializedType,
76
78
  StreamDispatcher: () => StreamDispatcher,
79
+ StreamType: () => import_discord_voip6.StreamType,
77
80
  Track: () => Track,
78
81
  TrackSkipReason: () => TrackSkipReason,
79
82
  TypeUtil: () => TypeUtil,
@@ -82,6 +85,7 @@ __export(src_exports, {
82
85
  VoiceUtils: () => VoiceUtils,
83
86
  VolumeTransformer: () => import_equalizer3.VolumeTransformer,
84
87
  createAudioPlayer: () => import_discord_voip6.createAudioPlayer,
88
+ createAudioResource: () => import_discord_voip6.createAudioResource,
85
89
  createContext: () => createContext,
86
90
  createErisCompat: () => createErisCompat,
87
91
  createFFmpegStream: () => createFFmpegStream,
@@ -142,14 +146,20 @@ __name(_DiscordPlayerError, "DiscordPlayerError");
142
146
  var DiscordPlayerError = _DiscordPlayerError;
143
147
  var _OutOfSpaceError = class _OutOfSpaceError extends DiscordPlayerError {
144
148
  constructor(target, capacity, total) {
145
- super(ErrorCodes.ERR_OUT_OF_SPACE, `Max capacity reached for ${target} (Capacity ${capacity}/Total ${total})`);
149
+ super(
150
+ ErrorCodes.ERR_OUT_OF_SPACE,
151
+ `Max capacity reached for ${target} (Capacity ${capacity}/Total ${total})`
152
+ );
146
153
  }
147
154
  };
148
155
  __name(_OutOfSpaceError, "OutOfSpaceError");
149
156
  var OutOfSpaceError = _OutOfSpaceError;
150
157
  var _InvalidArgTypeError = class _InvalidArgTypeError extends DiscordPlayerError {
151
158
  constructor(target, expectation, found) {
152
- super(ErrorCodes.ERR_INVALID_ARG_TYPE, `Expected ${target} to be "${expectation}", received "${found}"`);
159
+ super(
160
+ ErrorCodes.ERR_INVALID_ARG_TYPE,
161
+ `Expected ${target} to be "${expectation}", received "${found}"`
162
+ );
153
163
  }
154
164
  };
155
165
  __name(_InvalidArgTypeError, "InvalidArgTypeError");
@@ -197,7 +207,10 @@ __name(_NoVoiceConnectionError, "NoVoiceConnectionError");
197
207
  var NoVoiceConnectionError = _NoVoiceConnectionError;
198
208
  var _VoiceConnectionDestroyedError = class _VoiceConnectionDestroyedError extends DiscordPlayerError {
199
209
  constructor() {
200
- super(ErrorCodes.ERR_VOICE_CONNECTION_DESTROYED, "Cannot use destroyed voice connection");
210
+ super(
211
+ ErrorCodes.ERR_VOICE_CONNECTION_DESTROYED,
212
+ "Cannot use destroyed voice connection"
213
+ );
201
214
  }
202
215
  };
203
216
  __name(_VoiceConnectionDestroyedError, "VoiceConnectionDestroyedError");
@@ -211,7 +224,10 @@ __name(_NoVoiceChannelError, "NoVoiceChannelError");
211
224
  var NoVoiceChannelError = _NoVoiceChannelError;
212
225
  var _NoAudioResourceError = class _NoAudioResourceError extends DiscordPlayerError {
213
226
  constructor(message) {
214
- super(ErrorCodes.ERR_NO_AUDIO_RESOURCE, message || "Expected an audio resource");
227
+ super(
228
+ ErrorCodes.ERR_NO_AUDIO_RESOURCE,
229
+ message || "Expected an audio resource"
230
+ );
215
231
  }
216
232
  };
217
233
  __name(_NoAudioResourceError, "NoAudioResourceError");
@@ -232,21 +248,30 @@ __name(_NoGuildError, "NoGuildError");
232
248
  var NoGuildError = _NoGuildError;
233
249
  var _InfoRequiredError = class _InfoRequiredError extends DiscordPlayerError {
234
250
  constructor(target, actual) {
235
- super(ErrorCodes.ERR_INFO_REQUIRED, `Expected ${target}, found "${actual}"`);
251
+ super(
252
+ ErrorCodes.ERR_INFO_REQUIRED,
253
+ `Expected ${target}, found "${actual}"`
254
+ );
236
255
  }
237
256
  };
238
257
  __name(_InfoRequiredError, "InfoRequiredError");
239
258
  var InfoRequiredError = _InfoRequiredError;
240
259
  var _SerializationError = class _SerializationError extends DiscordPlayerError {
241
260
  constructor() {
242
- super(ErrorCodes.ERR_SERIALIZATION_FAILED, "Don't know how to serialize this data");
261
+ super(
262
+ ErrorCodes.ERR_SERIALIZATION_FAILED,
263
+ "Don't know how to serialize this data"
264
+ );
243
265
  }
244
266
  };
245
267
  __name(_SerializationError, "SerializationError");
246
268
  var SerializationError = _SerializationError;
247
269
  var _DeserializationError = class _DeserializationError extends DiscordPlayerError {
248
270
  constructor() {
249
- super(ErrorCodes.ERR_DESERIALIZATION_FAILED, "Don't know how to deserialize this data");
271
+ super(
272
+ ErrorCodes.ERR_DESERIALIZATION_FAILED,
273
+ "Don't know how to deserialize this data"
274
+ );
250
275
  }
251
276
  };
252
277
  __name(_DeserializationError, "DeserializationError");
@@ -421,7 +446,11 @@ var _Track = class _Track {
421
446
  this.requestedBy = data.requestedBy || null;
422
447
  this.playlist = data.playlist;
423
448
  this.description = `${this.title} by ${this.author}`;
424
- this.raw = Object.assign({}, { source: data.raw?.source ?? data.source }, data.raw ?? data);
449
+ this.raw = Object.assign(
450
+ {},
451
+ { source: data.raw?.source ?? data.source },
452
+ data.raw ?? data
453
+ );
425
454
  this.__metadata = data.metadata ?? null;
426
455
  this.__reqMetadataFn = data.requestMetadata || (() => Promise.resolve(null));
427
456
  this.cleanTitle = data.cleanTitle ?? Util.cleanTitle(this.title, this.source);
@@ -476,7 +505,9 @@ var _Track = class _Track {
476
505
  * The queue in which this track is located
477
506
  */
478
507
  get queue() {
479
- return this.player.nodes.cache.find((q) => q.tracks.some((ab) => ab.id === this.id));
508
+ return this.player.nodes.cache.find(
509
+ (q) => q.tracks.some((ab) => ab.id === this.id)
510
+ );
480
511
  }
481
512
  /**
482
513
  * The track duration in millisecond
@@ -553,7 +584,12 @@ var _Track = class _Track {
553
584
  * @param data Serialized data
554
585
  */
555
586
  static fromSerialized(player, data) {
556
- if (data.$type !== "track" /* Track */) throw new InvalidArgTypeError("data", "SerializedTrack", "malformed data");
587
+ if (data.$type !== "track" /* Track */)
588
+ throw new InvalidArgTypeError(
589
+ "data",
590
+ "SerializedTrack",
591
+ "malformed data"
592
+ );
557
593
  const track = new _Track(player, {
558
594
  ...data,
559
595
  requestedBy: data.requested_by ? (() => {
@@ -561,7 +597,8 @@ var _Track = class _Track {
561
597
  try {
562
598
  const resolved = player.client.users.resolve(res.id);
563
599
  if (resolved) return resolved;
564
- if (player.client.users.cache.has(res.id)) return player.client.users.cache.get(res.id);
600
+ if (player.client.users.cache.has(res.id))
601
+ return player.client.users.cache.get(res.id);
565
602
  const user = new import_discord.User(player.client, res);
566
603
  return user;
567
604
  } catch {
@@ -577,7 +614,9 @@ var _Track = class _Track {
577
614
  * Get belonging queues of this track
578
615
  */
579
616
  getBelongingQueues() {
580
- const nodes = this.player.nodes.cache.filter((node) => node.tracks.some((t) => t.id === this.id));
617
+ const nodes = this.player.nodes.cache.filter(
618
+ (node) => node.tracks.some((t) => t.id === this.id)
619
+ );
581
620
  return nodes;
582
621
  }
583
622
  /**
@@ -685,7 +724,11 @@ var _Playlist = class _Playlist {
685
724
  */
686
725
  static fromSerialized(player, data) {
687
726
  if (data.$type !== "playlist" /* Playlist */)
688
- throw new InvalidArgTypeError("data", "SerializedPlaylist", "malformed data");
727
+ throw new InvalidArgTypeError(
728
+ "data",
729
+ "SerializedPlaylist",
730
+ "malformed data"
731
+ );
689
732
  return new _Playlist(player, {
690
733
  ...data,
691
734
  tracks: data.tracks.map((m) => Track.fromSerialized(player, m))
@@ -723,7 +766,14 @@ var youtubeVideoIdRegex = /^[a-zA-Z0-9-_]{11}$/;
723
766
  var discordPlayerBlobRegex = /^discord-player:\/\/blob\/\d+$/;
724
767
  var DomainsMap = {
725
768
  DiscordPlayer: ["discord-player"],
726
- YouTube: ["youtube.com", "youtu.be", "music.youtube.com", "gaming.youtube.com", "www.youtube.com", "m.youtube.com"],
769
+ YouTube: [
770
+ "youtube.com",
771
+ "youtu.be",
772
+ "music.youtube.com",
773
+ "gaming.youtube.com",
774
+ "www.youtube.com",
775
+ "m.youtube.com"
776
+ ],
727
777
  Spotify: ["open.spotify.com", "embed.spotify.com"],
728
778
  Vimeo: ["vimeo.com", "player.vimeo.com"],
729
779
  ReverbNation: ["reverbnation.com"],
@@ -790,7 +840,8 @@ var _QueryResolver = class _QueryResolver {
790
840
  * Pre-resolve redirect urls
791
841
  */
792
842
  static async preResolve(query, maxDepth = 5) {
793
- if (!TypeUtil.isString(query)) throw new InvalidArgTypeError(query, "string", typeof query);
843
+ if (!TypeUtil.isString(query))
844
+ throw new InvalidArgTypeError(query, "string", typeof query);
794
845
  for (const domain of redirectDomains) {
795
846
  if (domain.test(query)) {
796
847
  try {
@@ -818,10 +869,15 @@ var _QueryResolver = class _QueryResolver {
818
869
  * @param {string} query The query
819
870
  */
820
871
  static resolve(query, fallbackSearchEngine = QueryType.AUTO_SEARCH) {
821
- if (!TypeUtil.isString(query)) throw new InvalidArgTypeError(query, "string", typeof query);
872
+ if (!TypeUtil.isString(query))
873
+ throw new InvalidArgTypeError(query, "string", typeof query);
822
874
  if (!query.length) throw new InfoRequiredError("query", String(query));
823
- const resolver = /* @__PURE__ */ __name((type, query2) => ({ type, query: query2 }), "resolver");
824
- if (discordPlayerBlobRegex.test(query)) return resolver(QueryType.DISCORD_PLAYER_BLOB, query);
875
+ const resolver = /* @__PURE__ */ __name((type, query2) => ({
876
+ type,
877
+ query: query2
878
+ }), "resolver");
879
+ if (discordPlayerBlobRegex.test(query))
880
+ return resolver(QueryType.DISCORD_PLAYER_BLOB, query);
825
881
  try {
826
882
  const url = new URL(query);
827
883
  if (DomainsMap.YouTube.includes(url.host)) {
@@ -834,31 +890,43 @@ var _QueryResolver = class _QueryResolver {
834
890
  QueryType.YOUTUBE_PLAYLIST,
835
891
  `https://www.youtube.com/watch?v=${videoId}&list=${playlistId}`
836
892
  );
837
- return resolver(QueryType.YOUTUBE_PLAYLIST, `https://www.youtube.com/playlist?list=${playlistId}`);
893
+ return resolver(
894
+ QueryType.YOUTUBE_PLAYLIST,
895
+ `https://www.youtube.com/playlist?list=${playlistId}`
896
+ );
838
897
  }
839
898
  if (_QueryResolver.validateId(query) || _QueryResolver.validateURL(query))
840
899
  return resolver(QueryType.YOUTUBE_VIDEO, query);
841
900
  return resolver(fallbackSearchEngine, query);
842
901
  } else if (DomainsMap.Spotify.includes(url.host)) {
843
902
  query = query.replace(/intl-([a-zA-Z]+)\//, "");
844
- if (spotifyPlaylistRegex.test(query)) return resolver(QueryType.SPOTIFY_PLAYLIST, query);
845
- if (spotifyAlbumRegex.test(query)) return resolver(QueryType.SPOTIFY_ALBUM, query);
846
- if (spotifySongRegex.test(query)) return resolver(QueryType.SPOTIFY_SONG, query);
903
+ if (spotifyPlaylistRegex.test(query))
904
+ return resolver(QueryType.SPOTIFY_PLAYLIST, query);
905
+ if (spotifyAlbumRegex.test(query))
906
+ return resolver(QueryType.SPOTIFY_ALBUM, query);
907
+ if (spotifySongRegex.test(query))
908
+ return resolver(QueryType.SPOTIFY_SONG, query);
847
909
  return resolver(fallbackSearchEngine, query);
848
910
  } else if (DomainsMap.Vimeo.includes(url.host)) {
849
911
  if (vimeoRegex.test(query)) return resolver(QueryType.VIMEO, query);
850
912
  return resolver(fallbackSearchEngine, query);
851
913
  } else if (DomainsMap.ReverbNation.includes(url.host)) {
852
- if (reverbnationRegex.test(query)) return resolver(QueryType.REVERBNATION, query);
914
+ if (reverbnationRegex.test(query))
915
+ return resolver(QueryType.REVERBNATION, query);
853
916
  return resolver(fallbackSearchEngine, query);
854
917
  } else if (DomainsMap.SoundCloud.includes(url.host)) {
855
- if (soundcloudPlaylistRegex.test(query)) return resolver(QueryType.SOUNDCLOUD_PLAYLIST, query);
856
- if (soundcloudTrackRegex.test(query)) return resolver(QueryType.SOUNDCLOUD_TRACK, query);
918
+ if (soundcloudPlaylistRegex.test(query))
919
+ return resolver(QueryType.SOUNDCLOUD_PLAYLIST, query);
920
+ if (soundcloudTrackRegex.test(query))
921
+ return resolver(QueryType.SOUNDCLOUD_TRACK, query);
857
922
  return resolver(fallbackSearchEngine, query);
858
923
  } else if (DomainsMap.AppleMusic.includes(url.host)) {
859
- if (appleMusicAlbumRegex.test(query)) return resolver(QueryType.APPLE_MUSIC_ALBUM, query);
860
- if (appleMusicPlaylistRegex.test(query)) return resolver(QueryType.APPLE_MUSIC_PLAYLIST, query);
861
- if (appleMusicSongRegex.test(query)) return resolver(QueryType.APPLE_MUSIC_SONG, query);
924
+ if (appleMusicAlbumRegex.test(query))
925
+ return resolver(QueryType.APPLE_MUSIC_ALBUM, query);
926
+ if (appleMusicPlaylistRegex.test(query))
927
+ return resolver(QueryType.APPLE_MUSIC_PLAYLIST, query);
928
+ if (appleMusicSongRegex.test(query))
929
+ return resolver(QueryType.APPLE_MUSIC_SONG, query);
862
930
  return resolver(fallbackSearchEngine, query);
863
931
  } else {
864
932
  return resolver(QueryType.ARBITRARY, query);
@@ -1112,9 +1180,14 @@ var _Util = class _Util {
1112
1180
  */
1113
1181
  static getRuntime() {
1114
1182
  const version2 = typeof navigator !== "undefined" ? navigator.userAgent : null;
1115
- if (typeof Deno !== "undefined" && Deno.version) return { name: "deno", version: Deno.version.deno };
1116
- if (typeof Bun !== "undefined" && Bun.version) return { name: "bun", version: Bun.version };
1117
- if (typeof process !== "undefined" && process.version) return { name: "node", version: process.version };
1183
+ if (typeof Deno !== "undefined" && Deno.version) {
1184
+ return { name: "deno", version: Deno.version.deno };
1185
+ }
1186
+ if (typeof Bun !== "undefined" && Bun.version) {
1187
+ return { name: "bun", version: Bun.version };
1188
+ }
1189
+ if (typeof process !== "undefined" && process.version)
1190
+ return { name: "node", version: process.version };
1118
1191
  return { name: "unknown", version: version2 ?? "unknown" };
1119
1192
  }
1120
1193
  /**
@@ -1247,7 +1320,9 @@ var _Util = class _Util {
1247
1320
  if ("fetch" in globalThis) return globalThis.fetch;
1248
1321
  for (const lib of ["node-fetch", "undici"]) {
1249
1322
  try {
1250
- return await import(lib).then((res) => res.fetch || res.default?.fetch || res.default);
1323
+ return await import(lib).then(
1324
+ (res) => res.fetch || res.default?.fetch || res.default
1325
+ );
1251
1326
  } catch {
1252
1327
  try {
1253
1328
  const res = require(lib);
@@ -1279,11 +1354,11 @@ var _Util = class _Util {
1279
1354
  __name(_Util, "Util");
1280
1355
  var Util = _Util;
1281
1356
  var VALIDATE_QUEUE_CAP = /* @__PURE__ */ __name((queue, items) => {
1282
- const tracks = items instanceof Playlist ? items.tracks : Array.isArray(items) ? items : [items];
1283
1357
  if (queue.maxSize < 1 || queue.maxSize === Infinity) return;
1358
+ const tracks = typeof items === "number" ? items : (items instanceof Playlist ? items.tracks : Array.isArray(items) ? items : [items]).length;
1284
1359
  const maxCap = queue.getCapacity();
1285
- if (maxCap < tracks.length) {
1286
- throw new OutOfSpaceError("tracks queue", maxCap, tracks.length);
1360
+ if (maxCap < tracks) {
1361
+ throw new OutOfSpaceError("tracks queue", maxCap, tracks);
1287
1362
  }
1288
1363
  }, "VALIDATE_QUEUE_CAP");
1289
1364
 
@@ -1358,7 +1433,9 @@ function erisVoiceStateUpdateProxy(client, proxy, handler) {
1358
1433
  }
1359
1434
  };
1360
1435
  const me = member.guild.members.get(client.user.id);
1361
- const resolvedChannel = member.guild.channels.get(member.voiceState.channelID);
1436
+ const resolvedChannel = member.guild.channels.get(
1437
+ member.voiceState.channelID
1438
+ );
1362
1439
  const proxiedNewState = {
1363
1440
  channelId: member.voiceState.channelID,
1364
1441
  serverMute: member.voiceState.mute,
@@ -1436,7 +1513,10 @@ function erisChannelsProxy(client, eris) {
1436
1513
  },
1437
1514
  resolve(resolvable) {
1438
1515
  if (typeof resolvable === "string") {
1439
- return erisResolvedChannelProxy(this.client.getChannel(resolvable), client);
1516
+ return erisResolvedChannelProxy(
1517
+ this.client.getChannel(resolvable),
1518
+ client
1519
+ );
1440
1520
  }
1441
1521
  if (resolvable instanceof eris.GuildChannel) {
1442
1522
  return erisResolvedChannelProxy(resolvable, client);
@@ -1612,7 +1692,9 @@ var _PlayerEventsEmitter = class _PlayerEventsEmitter extends import_utils.Event
1612
1692
  if (this.requiredEvents.includes(name) && !this.eventNames().includes(name)) {
1613
1693
  console.error(...args);
1614
1694
  Util.warn(
1615
- `No event listener found for event "${String(name)}". Events ${this.requiredEvents.map((m) => `"${String(m)}"`).join(", ")} must have event listeners.`,
1695
+ `No event listener found for event "${String(
1696
+ name
1697
+ )}". Events ${this.requiredEvents.map((m) => `"${String(m)}"`).join(", ")} must have event listeners.`,
1616
1698
  "UnhandledEventsWarning"
1617
1699
  );
1618
1700
  return false;
@@ -1704,7 +1786,9 @@ var _BaseExtractor = class _BaseExtractor {
1704
1786
  * @param track The track source
1705
1787
  */
1706
1788
  async getRelatedTracks(track, history) {
1707
- throw new NotImplementedError(`${this.constructor.name}.getRelatedTracks()`);
1789
+ throw new NotImplementedError(
1790
+ `${this.constructor.name}.getRelatedTracks()`
1791
+ );
1708
1792
  }
1709
1793
  /**
1710
1794
  * A stream middleware to handle streams before passing it to the player
@@ -1786,7 +1870,8 @@ var _Context = class _Context {
1786
1870
  */
1787
1871
  consume() {
1788
1872
  const data = this.storage.getStore();
1789
- if (data === void 0 && this.defaultValue !== void 0) return this.defaultValue;
1873
+ if (data === void 0 && this.defaultValue !== void 0)
1874
+ return this.defaultValue;
1790
1875
  return data;
1791
1876
  }
1792
1877
  /**
@@ -1903,7 +1988,8 @@ function useMetadata(node) {
1903
1988
  const queue = player.queues.get(node ?? context.guild.id);
1904
1989
  const setter = /* @__PURE__ */ __name((metadata) => {
1905
1990
  if (queue) {
1906
- if (TypeUtil.isFunction(metadata)) return queue.setMetadata(metadata(queue.metadata));
1991
+ if (TypeUtil.isFunction(metadata))
1992
+ return queue.setMetadata(metadata(queue.metadata));
1907
1993
  return queue.setMetadata(metadata);
1908
1994
  }
1909
1995
  }, "setter");
@@ -1967,7 +2053,8 @@ function useVolume(node) {
1967
2053
  const queue = player.queues.get(node ?? context.guild.id);
1968
2054
  const setter = /* @__PURE__ */ __name((volume) => {
1969
2055
  if (queue) {
1970
- if (TypeUtil.isFunction(volume)) return queue.node.setVolume(volume(queue.node.volume));
2056
+ if (TypeUtil.isFunction(volume))
2057
+ return queue.node.setVolume(volume(queue.node.volume));
1971
2058
  return queue.node.setVolume(volume);
1972
2059
  }
1973
2060
  }, "setter");
@@ -2048,20 +2135,25 @@ ${sample}
2048
2135
  * @param options Options supplied to the extractor
2049
2136
  */
2050
2137
  async register(_extractor, options) {
2051
- if (typeof _extractor.identifier !== "string" || this.store.has(_extractor.identifier)) return null;
2138
+ if (typeof _extractor.identifier !== "string" || this.store.has(_extractor.identifier))
2139
+ return null;
2052
2140
  const extractor = new _extractor(this, options);
2053
2141
  try {
2054
2142
  this.store.set(_extractor.identifier, extractor);
2055
- if (this.player.hasDebugger) this.player.debug(`${_extractor.identifier} extractor loaded!`);
2143
+ if (this.player.hasDebugger)
2144
+ this.player.debug(`${_extractor.identifier} extractor loaded!`);
2056
2145
  this.emit("registered", this, extractor);
2057
2146
  await extractor.activate();
2058
- if (this.player.hasDebugger) this.player.debug(`${_extractor.identifier} extractor activated!`);
2147
+ if (this.player.hasDebugger)
2148
+ this.player.debug(`${_extractor.identifier} extractor activated!`);
2059
2149
  this.emit("activate", this, extractor);
2060
2150
  return extractor;
2061
2151
  } catch (e) {
2062
2152
  this.store.delete(_extractor.identifier);
2063
2153
  if (this.player.hasDebugger)
2064
- this.player.debug(`${_extractor.identifier} extractor failed to activate! Error: ${e}`);
2154
+ this.player.debug(
2155
+ `${_extractor.identifier} extractor failed to activate! Error: ${e}`
2156
+ );
2065
2157
  this.emit("error", this, extractor, e);
2066
2158
  return null;
2067
2159
  }
@@ -2076,13 +2168,18 @@ ${sample}
2076
2168
  try {
2077
2169
  const key = extractor.identifier || this.store.findKey((e) => e === extractor);
2078
2170
  this.store.delete(key);
2079
- if (this.player.hasDebugger) this.player.debug(`${extractor.identifier} extractor disabled!`);
2171
+ if (this.player.hasDebugger)
2172
+ this.player.debug(`${extractor.identifier} extractor disabled!`);
2080
2173
  this.emit("unregistered", this, extractor);
2081
2174
  await extractor.deactivate();
2082
- if (this.player.hasDebugger) this.player.debug(`${extractor.identifier} extractor deactivated!`);
2175
+ if (this.player.hasDebugger)
2176
+ this.player.debug(`${extractor.identifier} extractor deactivated!`);
2083
2177
  this.emit("deactivate", this, extractor);
2084
2178
  } catch (e) {
2085
- if (this.player.hasDebugger) this.player.debug(`${extractor.identifier} extractor failed to deactivate!`);
2179
+ if (this.player.hasDebugger)
2180
+ this.player.debug(
2181
+ `${extractor.identifier} extractor failed to deactivate!`
2182
+ );
2086
2183
  this.emit("error", this, extractor, e);
2087
2184
  }
2088
2185
  }
@@ -2103,26 +2200,36 @@ ${sample}
2103
2200
  async run(fn, filterBlocked = true) {
2104
2201
  const blocked = this.player.options.blockExtractors ?? [];
2105
2202
  if (!this.store.size) {
2106
- Util.warn("Skipping extractors execution since zero extractors were registered", "NoExtractors");
2203
+ Util.warn(
2204
+ "Skipping extractors execution since zero extractors were registered",
2205
+ "NoExtractors"
2206
+ );
2107
2207
  return;
2108
2208
  }
2109
2209
  const extractors = this.store.sort((a, b) => b.priority - a.priority);
2110
2210
  let err = null, lastExt = null;
2111
2211
  for (const ext of extractors.values()) {
2112
2212
  if (filterBlocked && blocked.some((e) => e === ext.identifier)) continue;
2113
- if (this.player.hasDebugger) this.player.debug(`Executing extractor ${ext.identifier}...`);
2213
+ if (this.player.hasDebugger)
2214
+ this.player.debug(`Executing extractor ${ext.identifier}...`);
2114
2215
  const result = await fn(ext).then(
2115
2216
  (res) => {
2116
2217
  return res;
2117
2218
  },
2118
2219
  (e) => {
2119
- if (this.player.hasDebugger) this.player.debug(`Extractor ${ext.identifier} failed with error: ${e}`);
2220
+ if (this.player.hasDebugger)
2221
+ this.player.debug(
2222
+ `Extractor ${ext.identifier} failed with error: ${e}`
2223
+ );
2120
2224
  return TypeUtil.isError(e) ? e : new Error(`${e}`);
2121
2225
  }
2122
2226
  );
2123
2227
  lastExt = ext;
2124
2228
  if (result && !TypeUtil.isError(result)) {
2125
- if (this.player.hasDebugger) this.player.debug(`Extractor ${ext.identifier} executed successfully!`);
2229
+ if (this.player.hasDebugger)
2230
+ this.player.debug(
2231
+ `Extractor ${ext.identifier} executed successfully!`
2232
+ );
2126
2233
  return {
2127
2234
  extractor: ext,
2128
2235
  error: null,
@@ -2147,7 +2254,8 @@ ${sample}
2147
2254
  async requestBridge(track, sourceExtractor = track.extractor) {
2148
2255
  const previouslyAttempted = this.getContext()?.bridgeAttemptedExtractors ?? /* @__PURE__ */ new Set();
2149
2256
  const result = await this.run(async (ext) => {
2150
- if (sourceExtractor && ext.identifier === sourceExtractor.identifier) return false;
2257
+ if (sourceExtractor && ext.identifier === sourceExtractor.identifier)
2258
+ return false;
2151
2259
  if (previouslyAttempted.has(ext.identifier)) return false;
2152
2260
  previouslyAttempted.add(ext.identifier);
2153
2261
  const result2 = await ext.bridge(track, sourceExtractor);
@@ -2212,6 +2320,66 @@ var import_utils6 = require("@discord-player/utils");
2212
2320
  var import_discord_voip = require("discord-voip");
2213
2321
  var import_utils4 = require("@discord-player/utils");
2214
2322
  var import_equalizer = require("@discord-player/equalizer");
2323
+
2324
+ // src/stream/InterceptedStream.ts
2325
+ var import_node_stream = require("stream");
2326
+ var _intercepting;
2327
+ var _InterceptedStream = class _InterceptedStream extends import_node_stream.Transform {
2328
+ constructor() {
2329
+ super(...arguments);
2330
+ __publicField(this, "interceptors", /* @__PURE__ */ new Set());
2331
+ __privateAdd(this, _intercepting, true);
2332
+ }
2333
+ /**
2334
+ * Start intercepting the stream. This is the default state of InterceptedStream.
2335
+ */
2336
+ startIntercepting() {
2337
+ __privateSet(this, _intercepting, true);
2338
+ }
2339
+ /**
2340
+ * Stop intercepting the stream. This will prevent the stream from being consumed by the interceptors.
2341
+ * This can be useful when you want to temporarily stop the interception. The stopped state can be resumed by calling startIntercepting again.
2342
+ */
2343
+ stopIntercepting() {
2344
+ __privateSet(this, _intercepting, false);
2345
+ }
2346
+ /**
2347
+ * Whether the stream is being intercepted
2348
+ */
2349
+ isIntercepting() {
2350
+ return __privateGet(this, _intercepting);
2351
+ }
2352
+ _transform(chunk, encoding, callback) {
2353
+ this.push(chunk, encoding);
2354
+ if (__privateGet(this, _intercepting) && this.interceptors.size > 0) {
2355
+ for (const consumer of this.interceptors) {
2356
+ consumer.write(chunk, encoding);
2357
+ }
2358
+ }
2359
+ callback();
2360
+ }
2361
+ _final(callback) {
2362
+ for (const consumer of this.interceptors) {
2363
+ consumer.end();
2364
+ }
2365
+ callback();
2366
+ }
2367
+ _destroy(error, callback) {
2368
+ const ignoreError = String(error).includes("ERR_STREAM_PREMATURE_CLOSE");
2369
+ const err = ignoreError ? void 0 : error;
2370
+ for (const consumer of this.interceptors) {
2371
+ consumer.destroy(err);
2372
+ }
2373
+ this.interceptors.clear();
2374
+ callback(err);
2375
+ }
2376
+ };
2377
+ _intercepting = new WeakMap();
2378
+ __name(_InterceptedStream, "InterceptedStream");
2379
+ var InterceptedStream = _InterceptedStream;
2380
+
2381
+ // src/stream/StreamDispatcher.ts
2382
+ var _interceptor;
2215
2383
  var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitter {
2216
2384
  /**
2217
2385
  * Creates new connection object
@@ -2228,22 +2396,29 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2228
2396
  __publicField(this, "channel");
2229
2397
  __publicField(this, "audioResource");
2230
2398
  __publicField(this, "dsp", new import_equalizer.FiltersChain());
2399
+ __privateAdd(this, _interceptor, null);
2231
2400
  this.voiceConnection = connection;
2232
2401
  this.audioPlayer = audioPlayer || (0, import_discord_voip.createAudioPlayer)({
2233
2402
  debug: this.queue.hasDebugger
2234
2403
  });
2235
2404
  this.channel = channel;
2236
2405
  this.voiceConnection.on("debug", (m) => void this.emit("debug", m));
2237
- this.voiceConnection.on("error", (error) => void this.emit("error", error));
2406
+ this.voiceConnection.on(
2407
+ "error",
2408
+ (error) => void this.emit("error", error)
2409
+ );
2238
2410
  this.audioPlayer.on("debug", (m) => void this.emit("debug", m));
2239
2411
  this.audioPlayer.on("error", (error) => void this.emit("error", error));
2240
2412
  this.dsp.onUpdate = () => {
2241
2413
  if (!this.dsp) return;
2242
- if (this.dsp.filters?.filters) this.emit("dsp", this.dsp.filters?.filters);
2243
- if (this.dsp.biquad?.filters) this.emit("biquad", this.dsp.biquad?.filters);
2414
+ if (this.dsp.filters?.filters)
2415
+ this.emit("dsp", this.dsp.filters?.filters);
2416
+ if (this.dsp.biquad?.filters)
2417
+ this.emit("biquad", this.dsp.biquad?.filters);
2244
2418
  if (this.dsp.equalizer) this.emit("eqBands", this.dsp.equalizer.getEQ());
2245
2419
  if (this.dsp.volume) this.emit("volume", this.dsp.volume.volume);
2246
- if (this.dsp.resampler) this.emit("sampleRate", this.dsp.resampler.targetSampleRate);
2420
+ if (this.dsp.resampler)
2421
+ this.emit("sampleRate", this.dsp.resampler.sampleRate);
2247
2422
  };
2248
2423
  this.dsp.onError = (e) => this.emit("error", e);
2249
2424
  this.voiceConnection.on(import_discord_voip.VoiceConnectionStatus.Disconnected, async (oldState, newState) => {
@@ -2253,10 +2428,15 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2253
2428
  }
2254
2429
  if (newState.reason === import_discord_voip.VoiceConnectionDisconnectReason.WebSocketClose && newState.closeCode === 4014) {
2255
2430
  try {
2256
- await (0, import_discord_voip.entersState)(this.voiceConnection, import_discord_voip.VoiceConnectionStatus.Connecting, this.connectionTimeout);
2431
+ await (0, import_discord_voip.entersState)(
2432
+ this.voiceConnection,
2433
+ import_discord_voip.VoiceConnectionStatus.Connecting,
2434
+ this.connectionTimeout
2435
+ );
2257
2436
  } catch {
2258
2437
  try {
2259
- if (this.voiceConnection.state.status !== import_discord_voip.VoiceConnectionStatus.Destroyed) this.destroy();
2438
+ if (this.voiceConnection.state.status !== import_discord_voip.VoiceConnectionStatus.Destroyed)
2439
+ this.destroy();
2260
2440
  } catch (err) {
2261
2441
  this.emit("error", err);
2262
2442
  }
@@ -2266,7 +2446,8 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2266
2446
  this.voiceConnection.rejoin();
2267
2447
  } else {
2268
2448
  try {
2269
- if (this.voiceConnection.state.status !== import_discord_voip.VoiceConnectionStatus.Destroyed) this.destroy();
2449
+ if (this.voiceConnection.state.status !== import_discord_voip.VoiceConnectionStatus.Destroyed)
2450
+ this.destroy();
2270
2451
  } catch (err) {
2271
2452
  this.emit("error", err);
2272
2453
  }
@@ -2364,7 +2545,8 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2364
2545
  * @returns {AudioResource}
2365
2546
  */
2366
2547
  async createStream(src, ops) {
2367
- if (!ops?.disableFilters && this.queue.hasDebugger) this.queue.debug("Initiating DSP filters pipeline...");
2548
+ if (!ops?.disableFilters && this.queue.hasDebugger)
2549
+ this.queue.debug("Initiating DSP filters pipeline...");
2368
2550
  const stream = !ops?.disableFilters ? this.dsp.create(src, {
2369
2551
  dsp: {
2370
2552
  filters: ops?.defaultFilters,
@@ -2374,10 +2556,11 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2374
2556
  filter: ops.biquadFilter,
2375
2557
  disabled: ops?.disableBiquad
2376
2558
  } : void 0,
2377
- resampler: {
2559
+ resampler: ops?.sampleRate ? {
2560
+ inputSampleRate: 48e3,
2378
2561
  targetSampleRate: ops?.sampleRate,
2379
2562
  disabled: ops?.disableResampler
2380
- },
2563
+ } : void 0,
2381
2564
  equalizer: {
2382
2565
  bandMultiplier: ops?.eq,
2383
2566
  disabled: ops?.disableEqualizer
@@ -2387,16 +2570,33 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2387
2570
  disabled: ops?.disableVolume
2388
2571
  }
2389
2572
  }) : src;
2390
- if (this.queue.hasDebugger) this.queue.debug("Executing onAfterCreateStream hook...");
2391
- const postStream = await this.queue.onAfterCreateStream?.(stream, this.queue).catch(
2573
+ if (this.queue.hasDebugger) {
2574
+ this.queue.debug("Executing onAfterCreateStream hook...");
2575
+ }
2576
+ const postStream = await this.queue.onAfterCreateStream?.(stream, this.queue, ops?.data).catch(
2392
2577
  () => ({
2393
2578
  stream,
2394
2579
  type: ops?.type ?? import_discord_voip.StreamType.Arbitrary
2395
2580
  })
2396
2581
  );
2397
2582
  if (this.queue.hasDebugger) this.queue.debug("Preparing AudioResource...");
2398
- this.audioResource = (0, import_discord_voip.createAudioResource)(postStream?.stream ?? stream, {
2399
- inputType: postStream?.type ?? ops?.type ?? import_discord_voip.StreamType.Arbitrary,
2583
+ const format = postStream?.type ?? ops?.type ?? import_discord_voip.StreamType.Arbitrary;
2584
+ let _stream;
2585
+ if (this.queue.canIntercept()) {
2586
+ __privateSet(this, _interceptor, new InterceptedStream());
2587
+ (postStream?.stream ?? stream).pipe(__privateGet(this, _interceptor));
2588
+ _stream = __privateGet(this, _interceptor);
2589
+ await this.queue.player.handleInterceptingStream(
2590
+ this.queue,
2591
+ ops?.data,
2592
+ format,
2593
+ __privateGet(this, _interceptor)
2594
+ );
2595
+ } else {
2596
+ _stream = postStream?.stream ?? stream;
2597
+ }
2598
+ this.audioResource = (0, import_discord_voip.createAudioResource)(_stream, {
2599
+ inputType: format,
2400
2600
  metadata: ops?.data,
2401
2601
  // volume controls happen from AudioFilter DSP utility
2402
2602
  inlineVolume: false
@@ -2429,7 +2629,8 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2429
2629
  disconnect() {
2430
2630
  try {
2431
2631
  if (this.audioPlayer) this.audioPlayer.stop(true);
2432
- if (this.voiceConnection.state.status !== import_discord_voip.VoiceConnectionStatus.Destroyed) this.voiceConnection.destroy();
2632
+ if (this.voiceConnection.state.status !== import_discord_voip.VoiceConnectionStatus.Destroyed)
2633
+ this.voiceConnection.destroy();
2433
2634
  } catch {
2434
2635
  }
2435
2636
  }
@@ -2488,7 +2689,11 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2488
2689
  if (!this.audioResource) this.audioResource = resource;
2489
2690
  if (this.voiceConnection.state.status !== import_discord_voip.VoiceConnectionStatus.Ready) {
2490
2691
  try {
2491
- await (0, import_discord_voip.entersState)(this.voiceConnection, import_discord_voip.VoiceConnectionStatus.Ready, this.connectionTimeout);
2692
+ await (0, import_discord_voip.entersState)(
2693
+ this.voiceConnection,
2694
+ import_discord_voip.VoiceConnectionStatus.Ready,
2695
+ this.connectionTimeout
2696
+ );
2492
2697
  } catch (err) {
2493
2698
  return void this.emit("error", err);
2494
2699
  }
@@ -2526,6 +2731,7 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2526
2731
  return this.audioResource.playbackDuration;
2527
2732
  }
2528
2733
  };
2734
+ _interceptor = new WeakMap();
2529
2735
  __name(_StreamDispatcher, "StreamDispatcher");
2530
2736
  var StreamDispatcher = _StreamDispatcher;
2531
2737
 
@@ -2543,7 +2749,8 @@ var _GuildQueueHistory = class _GuildQueueHistory {
2543
2749
  * Current track in the queue
2544
2750
  */
2545
2751
  get currentTrack() {
2546
- return this.queue.dispatcher?.audioResource?.metadata || this.queue.__current;
2752
+ return this.queue.dispatcher?.audioResource?.metadata || // eslint-disable-next-line @typescript-eslint/no-explicit-any
2753
+ this.queue.__current;
2547
2754
  }
2548
2755
  /**
2549
2756
  * Next track in the queue
@@ -2783,7 +2990,9 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
2783
2990
  __privateAdd(this, _progress, 0);
2784
2991
  __privateAdd(this, _hasFFmpegOptimization, false);
2785
2992
  __publicField(this, "tasksQueue", new AsyncQueue());
2786
- __privateSet(this, _hasFFmpegOptimization, /libopus: (yes|true)/.test(this.queue.player.scanDeps()));
2993
+ __privateSet(this, _hasFFmpegOptimization, /libopus: (yes|true)/.test(
2994
+ this.queue.player.scanDeps()
2995
+ ));
2787
2996
  }
2788
2997
  /**
2789
2998
  * If the player is currently in idle mode
@@ -2849,14 +3058,26 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
2849
3058
  */
2850
3059
  get estimatedPlaybackTime() {
2851
3060
  const dur = this.playbackTime;
2852
- return Math.round(this.getDurationMultiplier() * dur);
3061
+ const val = this.getDurationMultiplier() * dur;
3062
+ if (this.queue.filters.resampler) {
3063
+ const ratio = this.queue.filters.resampler.getRatio();
3064
+ if (ratio <= 0) return val;
3065
+ return val * ratio;
3066
+ }
3067
+ return val;
2853
3068
  }
2854
3069
  /**
2855
3070
  * Estimated total duration of the player
2856
3071
  */
2857
3072
  get estimatedDuration() {
2858
3073
  const dur = this.totalDuration;
2859
- return Math.round(dur / this.getDurationMultiplier());
3074
+ const val = Math.round(dur / this.getDurationMultiplier());
3075
+ if (this.queue.filters.resampler) {
3076
+ const ratio = this.queue.filters.resampler.getRatio();
3077
+ if (ratio <= 0) return val;
3078
+ return Math.round(val / ratio);
3079
+ }
3080
+ return val;
2860
3081
  }
2861
3082
  /**
2862
3083
  * Total duration of the current audio track
@@ -2910,21 +3131,32 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
2910
3131
  separator = "\u2503"
2911
3132
  } = options || {};
2912
3133
  if (isNaN(length) || length < 0 || !Number.isFinite(length)) {
2913
- throw new OutOfRangeError("[PlayerProgressBarOptions.length]", String(length), "0", "Finite Number");
3134
+ throw new OutOfRangeError(
3135
+ "[PlayerProgressBarOptions.length]",
3136
+ String(length),
3137
+ "0",
3138
+ "Finite Number"
3139
+ );
2914
3140
  }
2915
- const index = Math.round(timestamp.current.value / timestamp.total.value * length);
3141
+ const index = Math.round(
3142
+ timestamp.current.value / timestamp.total.value * length
3143
+ );
2916
3144
  if (index >= 1 && index <= length) {
2917
3145
  const bar = leftChar.repeat(index - 1).split("");
2918
3146
  bar.push(indicator);
2919
3147
  bar.push(rightChar.repeat(length - index));
2920
3148
  if (timecodes) {
2921
- return `${timestamp.current.label} ${separator} ${bar.join("")} ${separator} ${timestamp.total.label}`;
3149
+ return `${timestamp.current.label} ${separator} ${bar.join(
3150
+ ""
3151
+ )} ${separator} ${timestamp.total.label}`;
2922
3152
  } else {
2923
3153
  return `${bar.join("")}`;
2924
3154
  }
2925
3155
  } else {
2926
3156
  if (timecodes) {
2927
- return `${timestamp.current.label} ${separator} ${indicator}${rightChar.repeat(length - 1)} ${separator} ${timestamp.total.label}`;
3157
+ return `${timestamp.current.label} ${separator} ${indicator}${rightChar.repeat(
3158
+ length - 1
3159
+ )} ${separator} ${timestamp.total.label}`;
2928
3160
  } else {
2929
3161
  return `${indicator}${rightChar.repeat(length - 1)}`;
2930
3162
  }
@@ -2940,11 +3172,16 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
2940
3172
  if (duration > this.totalDuration) {
2941
3173
  return this.skip({
2942
3174
  reason: "SEEK_OVER_THRESHOLD" /* SEEK_OVER_THRESHOLD */,
2943
- description: new OutOfRangeError("[duration]", String(duration), "0", String(this.totalDuration)).message
3175
+ description: new OutOfRangeError(
3176
+ "[duration]",
3177
+ String(duration),
3178
+ "0",
3179
+ String(this.totalDuration)
3180
+ ).message
2944
3181
  });
2945
3182
  }
2946
3183
  if (duration < 0) duration = 0;
2947
- return await this.queue.filters.triggerReplay(duration);
3184
+ return this.queue.filters.triggerReplay(duration);
2948
3185
  }
2949
3186
  /**
2950
3187
  * Current volume
@@ -3004,7 +3241,13 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3004
3241
  reason: "MANUAL" /* Manual */,
3005
3242
  description: "The track was skipped manually"
3006
3243
  };
3007
- this.queue.emit(GuildQueueEvent.PlayerSkip, this.queue, track, reason, description);
3244
+ this.queue.emit(
3245
+ GuildQueueEvent.PlayerSkip,
3246
+ this.queue,
3247
+ track,
3248
+ reason,
3249
+ description
3250
+ );
3008
3251
  return true;
3009
3252
  }
3010
3253
  /**
@@ -3022,7 +3265,8 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3022
3265
  });
3023
3266
  if (!foundTrack) return null;
3024
3267
  this.queue.tracks.removeOne((t) => t.id === foundTrack.id);
3025
- if (emitEvent) this.queue.emit(GuildQueueEvent.AudioTrackRemove, this.queue, foundTrack);
3268
+ if (emitEvent)
3269
+ this.queue.emit(GuildQueueEvent.AudioTrackRemove, this.queue, foundTrack);
3026
3270
  return foundTrack;
3027
3271
  }
3028
3272
  /**
@@ -3074,10 +3318,17 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3074
3318
  * @param index The position to insert to, defaults to 0.
3075
3319
  */
3076
3320
  insert(track, index = 0) {
3077
- if (!(track instanceof Track)) throw new InvalidArgTypeError("track value", "instance of Track", String(track));
3321
+ if (!(track instanceof Track))
3322
+ throw new InvalidArgTypeError(
3323
+ "track value",
3324
+ "instance of Track",
3325
+ String(track)
3326
+ );
3078
3327
  VALIDATE_QUEUE_CAP(this.queue, track);
3079
3328
  this.queue.tracks.store.splice(index, 0, track);
3080
- if (!this.queue.options.noEmitInsert) this.queue.emit(GuildQueueEvent.AudioTrackAdd, this.queue, track);
3329
+ if (!this.queue.options.noEmitInsert) {
3330
+ this.queue.emit(GuildQueueEvent.AudioTrackAdd, this.queue, track);
3331
+ }
3081
3332
  }
3082
3333
  /**
3083
3334
  * Moves a track in the queue
@@ -3149,7 +3400,9 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3149
3400
  throw new NoVoiceConnectionError();
3150
3401
  }
3151
3402
  if (this.queue.hasDebugger)
3152
- this.queue.debug(`Received play request from guild ${this.queue.guild.name} (ID: ${this.queue.guild.id})`);
3403
+ this.queue.debug(
3404
+ `Received play request from guild ${this.queue.guild.name} (ID: ${this.queue.guild.id})`
3405
+ );
3153
3406
  options = Object.assign(
3154
3407
  {},
3155
3408
  {
@@ -3161,28 +3414,41 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3161
3414
  );
3162
3415
  if (res && options.queue) {
3163
3416
  if (this.queue.hasDebugger)
3164
- this.queue.debug("Requested option requires to queue the track, adding the given track to queue instead...");
3417
+ this.queue.debug(
3418
+ "Requested option requires to queue the track, adding the given track to queue instead..."
3419
+ );
3165
3420
  return this.queue.addTrack(res);
3166
3421
  }
3167
3422
  const track = res || this.queue.tracks.dispatch();
3168
3423
  if (!track) {
3169
- const error = new NoResultError("Play request received but track was not provided");
3424
+ const error = new NoResultError(
3425
+ "Play request received but track was not provided"
3426
+ );
3170
3427
  this.queue.emit(GuildQueueEvent.Error, this.queue, error);
3171
3428
  return;
3172
3429
  }
3173
- if (this.queue.hasDebugger) this.queue.debug("Requested option requires to play the track, initializing...");
3430
+ if (this.queue.hasDebugger)
3431
+ this.queue.debug(
3432
+ "Requested option requires to play the track, initializing..."
3433
+ );
3174
3434
  try {
3175
3435
  const assignedResource = track.resource;
3176
3436
  if (assignedResource) {
3177
3437
  if (this.queue.hasDebugger)
3178
- this.queue.debug("Track has an audio resource assigned, player will now play the resource directly...");
3438
+ this.queue.debug(
3439
+ "Track has an audio resource assigned, player will now play the resource directly..."
3440
+ );
3179
3441
  this.queue.setTransitioning(!!options.transitionMode);
3180
3442
  return __privateMethod(this, _GuildQueuePlayerNode_instances, performPlay_fn).call(this, assignedResource);
3181
3443
  }
3182
- if (this.queue.hasDebugger) this.queue.debug(`Initiating stream extraction process...`);
3444
+ if (this.queue.hasDebugger)
3445
+ this.queue.debug(`Initiating stream extraction process...`);
3183
3446
  const src = track.raw?.source || track.source;
3184
3447
  const qt = track.queryType || (src === "spotify" ? "spotifySong" : src === "apple_music" ? "appleMusicSong" : src);
3185
- if (this.queue.hasDebugger) this.queue.debug(`Executing onBeforeCreateStream hook (QueryType: ${qt})...`);
3448
+ if (this.queue.hasDebugger)
3449
+ this.queue.debug(
3450
+ `Executing onBeforeCreateStream hook (QueryType: ${qt})...`
3451
+ );
3186
3452
  const streamSrc = {
3187
3453
  error: null,
3188
3454
  stream: null
@@ -3195,9 +3461,13 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3195
3461
  },
3196
3462
  (e) => streamSrc.error = e
3197
3463
  );
3198
- if (!streamSrc.stream && streamSrc.error) return __privateMethod(this, _GuildQueuePlayerNode_instances, throw_fn).call(this, track, streamSrc.error);
3464
+ if (!streamSrc.stream && streamSrc.error)
3465
+ return __privateMethod(this, _GuildQueuePlayerNode_instances, throw_fn).call(this, track, streamSrc.error);
3199
3466
  if (!streamSrc.stream) {
3200
- if (this.queue.hasDebugger) this.queue.debug("Failed to get stream from onBeforeCreateStream!");
3467
+ if (this.queue.hasDebugger)
3468
+ this.queue.debug(
3469
+ "Failed to get stream from onBeforeCreateStream, attempting to extract stream using extractors..."
3470
+ );
3201
3471
  await this.queue.player.extractors.context.provide(
3202
3472
  {
3203
3473
  id: crypto.randomUUID(),
@@ -3233,7 +3503,7 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3233
3503
  disableVolume: this.queue.options.disableVolume,
3234
3504
  disableFilters: this.queue.options.disableFilterer,
3235
3505
  disableResampler: this.queue.options.disableResampler,
3236
- sampleRate: typeof this.queue.options.resampler === "number" && this.queue.options.resampler > 0 ? this.queue.options.resampler : void 0,
3506
+ sampleRate: this.queue.filters._lastFiltersCache.sampleRate ?? (typeof this.queue.options.resampler === "number" && this.queue.options.resampler > 0 ? this.queue.options.resampler : void 0),
3237
3507
  biquadFilter: this.queue.filters._lastFiltersCache.biquad || void 0,
3238
3508
  eq: this.queue.filters._lastFiltersCache.equalizer,
3239
3509
  defaultFilters: this.queue.filters._lastFiltersCache.filters,
@@ -3246,9 +3516,16 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3246
3516
  };
3247
3517
  let resolver = Util.noop;
3248
3518
  const donePromise = new Promise((resolve2) => resolver = resolve2);
3249
- const success = this.queue.emit(GuildQueueEvent.WillPlayTrack, this.queue, track, trackStreamConfig, resolver);
3519
+ const success = this.queue.emit(
3520
+ GuildQueueEvent.WillPlayTrack,
3521
+ this.queue,
3522
+ track,
3523
+ trackStreamConfig,
3524
+ resolver
3525
+ );
3250
3526
  if (!success) resolver();
3251
- if (this.queue.hasDebugger) this.queue.debug("Waiting for willPlayTrack event to resolve...");
3527
+ if (this.queue.hasDebugger)
3528
+ this.queue.debug("Waiting for willPlayTrack event to resolve...");
3252
3529
  await donePromise;
3253
3530
  const daspDisabled = [
3254
3531
  trackStreamConfig.dispatcherConfig.disableBiquad,
@@ -3260,7 +3537,9 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3260
3537
  const needsFilters = !!trackStreamConfig.playerConfig.seek || !!this.queue.filters.ffmpeg.args.length;
3261
3538
  const shouldSkipFFmpeg = !!trackStreamConfig.dispatcherConfig.skipFFmpeg && !needsFilters;
3262
3539
  let finalStream;
3263
- const demuxable = /* @__PURE__ */ __name((fmt) => [import_discord_voip2.StreamType.Opus, import_discord_voip2.StreamType.WebmOpus, import_discord_voip2.StreamType.OggOpus].includes(fmt), "demuxable");
3540
+ const demuxable = /* @__PURE__ */ __name((fmt) => [import_discord_voip2.StreamType.Opus, import_discord_voip2.StreamType.WebmOpus, import_discord_voip2.StreamType.OggOpus].includes(
3541
+ fmt
3542
+ ), "demuxable");
3264
3543
  if (shouldSkipFFmpeg && !(streamSrc.stream instanceof import_stream.Readable) && typeof streamSrc.stream !== "string" && demuxable(streamSrc.stream.$fmt)) {
3265
3544
  const { $fmt, stream } = streamSrc.stream;
3266
3545
  const shouldPCM = !daspDisabled;
@@ -3298,10 +3577,17 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3298
3577
  `Transition mode detected, player will wait for buffering timeout to expire (Timeout: ${this.queue.options.bufferingTimeout}ms)`
3299
3578
  );
3300
3579
  await (0, import_promises2.setTimeout)(this.queue.options.bufferingTimeout);
3301
- if (this.queue.hasDebugger) this.queue.debug("Buffering timeout has expired!");
3580
+ if (this.queue.hasDebugger)
3581
+ this.queue.debug("Buffering timeout has expired!");
3302
3582
  }
3303
3583
  if (this.queue.hasDebugger)
3304
- this.queue.debug(`Preparing final stream config: ${JSON.stringify(trackStreamConfig, null, 2)}`);
3584
+ this.queue.debug(
3585
+ `Preparing final stream config: ${JSON.stringify(
3586
+ trackStreamConfig,
3587
+ null,
3588
+ 2
3589
+ )}`
3590
+ );
3305
3591
  const dispatcher = this.queue.dispatcher;
3306
3592
  if (!dispatcher) {
3307
3593
  if (this.queue.hasDebugger) {
@@ -3311,12 +3597,16 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3311
3597
  }
3312
3598
  finalStream.destroy();
3313
3599
  } else {
3314
- const resource = await dispatcher.createStream(finalStream, trackStreamConfig.dispatcherConfig);
3600
+ const resource = await dispatcher.createStream(
3601
+ finalStream,
3602
+ trackStreamConfig.dispatcherConfig
3603
+ );
3315
3604
  this.queue.setTransitioning(!!options.transitionMode);
3316
3605
  await __privateMethod(this, _GuildQueuePlayerNode_instances, performPlay_fn).call(this, resource);
3317
3606
  }
3318
3607
  } catch (e) {
3319
- if (this.queue.hasDebugger) this.queue.debug(`Failed to initialize audio player: ${e}`);
3608
+ if (this.queue.hasDebugger)
3609
+ this.queue.debug(`Failed to initialize audio player: ${e}`);
3320
3610
  throw e;
3321
3611
  }
3322
3612
  }
@@ -3353,7 +3643,8 @@ performPlay_fn = /* @__PURE__ */ __name(async function(resource) {
3353
3643
  );
3354
3644
  }
3355
3645
  } else {
3356
- if (this.queue.hasDebugger) this.queue.debug("Initializing audio player...");
3646
+ if (this.queue.hasDebugger)
3647
+ this.queue.debug("Initializing audio player...");
3357
3648
  await this.queue.dispatcher.playStream(resource);
3358
3649
  if (this.queue.hasDebugger) this.queue.debug("Dispatching audio...");
3359
3650
  }
@@ -3364,14 +3655,23 @@ createGenericStream_fn = /* @__PURE__ */ __name(async function(track) {
3364
3655
  `Attempting to extract stream for Track { title: ${track.title}, url: ${track.url} } using registered extractors`
3365
3656
  );
3366
3657
  const attemptedExtractors = this.queue.player.extractors.getContext()?.attemptedExtractors || /* @__PURE__ */ new Set();
3367
- const streamInfo = await this.queue.player.extractors.run(async (extractor) => {
3368
- if (this.queue.player.options.blockStreamFrom?.some((ext) => ext === extractor.identifier)) return false;
3369
- if (attemptedExtractors.has(extractor.identifier)) return false;
3370
- attemptedExtractors.add(extractor.identifier);
3371
- const canStream = await extractor.validate(track.url, track.queryType || QueryResolver.resolve(track.url).type);
3372
- if (!canStream) return false;
3373
- return await extractor.stream(track);
3374
- }, false);
3658
+ const streamInfo = await this.queue.player.extractors.run(
3659
+ async (extractor) => {
3660
+ if (this.queue.player.options.blockStreamFrom?.some(
3661
+ (ext) => ext === extractor.identifier
3662
+ ))
3663
+ return false;
3664
+ if (attemptedExtractors.has(extractor.identifier)) return false;
3665
+ attemptedExtractors.add(extractor.identifier);
3666
+ const canStream = await extractor.validate(
3667
+ track.url,
3668
+ track.queryType || QueryResolver.resolve(track.url).type
3669
+ );
3670
+ if (!canStream) return false;
3671
+ return await extractor.stream(track);
3672
+ },
3673
+ false
3674
+ );
3375
3675
  if (!streamInfo || !streamInfo.result) {
3376
3676
  if (this.queue.hasDebugger) {
3377
3677
  this.queue.debug(
@@ -3380,7 +3680,9 @@ createGenericStream_fn = /* @__PURE__ */ __name(async function(track) {
3380
3680
  }
3381
3681
  if (!this.queue.options.disableFallbackStream) {
3382
3682
  if (this.queue.hasDebugger)
3383
- this.queue.debug(`Generic stream extraction failed and fallback stream extraction is enabled`);
3683
+ this.queue.debug(
3684
+ `Generic stream extraction failed and fallback stream extraction is enabled`
3685
+ );
3384
3686
  return __privateMethod(this, _GuildQueuePlayerNode_instances, createFallbackStream_fn).call(this, track);
3385
3687
  }
3386
3688
  return streamInfo || null;
@@ -3396,20 +3698,51 @@ createFallbackStream_fn = /* @__PURE__ */ __name(async function(track) {
3396
3698
  this.queue.debug(
3397
3699
  `Attempting to extract stream for Track { title: ${track.title}, url: ${track.url} } using fallback streaming method...`
3398
3700
  );
3399
- const fallbackStream = await this.queue.player.extractors.run(async (extractor) => {
3400
- if (extractor.identifier === track.extractor?.identifier) return false;
3401
- if (this.queue.player.options.blockStreamFrom?.some((ext) => ext === extractor.identifier)) return false;
3402
- const query = `${track.title} ${track.author}`;
3403
- const fallbackTracks = await extractor.handle(query, {
3404
- requestedBy: track.requestedBy
3405
- });
3406
- const fallbackTrack = fallbackTracks.tracks[0];
3407
- if (!fallbackTrack) return false;
3408
- const stream = await extractor.stream(fallbackTrack);
3409
- if (!stream) return false;
3410
- track.bridgedTrack = fallbackTrack;
3411
- return stream;
3412
- }, true);
3701
+ const verifyFallbackStream = this.queue.options.verifyFallbackStream;
3702
+ const fallbackStream = await this.queue.player.extractors.run(
3703
+ async (extractor) => {
3704
+ if (extractor.identifier === track.extractor?.identifier) return false;
3705
+ if (this.queue.player.options.blockStreamFrom?.some(
3706
+ (ext) => ext === extractor.identifier
3707
+ )) {
3708
+ return false;
3709
+ }
3710
+ const query = `${track.title} ${track.author}`;
3711
+ if (verifyFallbackStream) {
3712
+ if (this.queue.hasDebugger) {
3713
+ this.queue.debug(
3714
+ `Fallback stream verification is enabled, validating query for Track { title: ${track.title}, url: ${track.url} } using ${extractor.identifier}...`
3715
+ );
3716
+ }
3717
+ const shouldProceed = await extractor.validate(
3718
+ query,
3719
+ track.queryType || track.source
3720
+ );
3721
+ if (!shouldProceed) {
3722
+ if (this.queue.hasDebugger)
3723
+ this.queue.debug(
3724
+ `Failed to validate query for Track { title: ${track.title}, url: ${track.url} } using ${extractor.identifier}`
3725
+ );
3726
+ return false;
3727
+ } else {
3728
+ if (this.queue.hasDebugger)
3729
+ this.queue.debug(
3730
+ `Query for Track { title: ${track.title}, url: ${track.url} } was validated using ${extractor.identifier}. Proceeding with extraction...`
3731
+ );
3732
+ }
3733
+ }
3734
+ const fallbackTracks = await extractor.handle(query, {
3735
+ requestedBy: track.requestedBy
3736
+ });
3737
+ const fallbackTrack = fallbackTracks.tracks[0];
3738
+ if (!fallbackTrack) return false;
3739
+ const stream = await extractor.stream(fallbackTrack);
3740
+ if (!stream) return false;
3741
+ track.bridgedTrack = fallbackTrack;
3742
+ return stream;
3743
+ },
3744
+ true
3745
+ );
3413
3746
  if (!fallbackStream || !fallbackStream.result) {
3414
3747
  if (this.queue.hasDebugger)
3415
3748
  this.queue.debug(
@@ -3428,7 +3761,9 @@ createFFmpegStream_fn = /* @__PURE__ */ __name(function(stream, track, seek = 0,
3428
3761
  }).on("error", (err) => {
3429
3762
  const m = `${err}`.toLowerCase();
3430
3763
  if (this.queue.hasDebugger)
3431
- this.queue.debug(`Stream closed due to an error from FFmpeg stream: ${err.stack || err.message || err}`);
3764
+ this.queue.debug(
3765
+ `Stream closed due to an error from FFmpeg stream: ${err.stack || err.message || err}`
3766
+ );
3432
3767
  if (m.includes("premature close") || m.includes("epipe")) return;
3433
3768
  this.queue.emit(GuildQueueEvent.PlayerError, this.queue, err, track);
3434
3769
  });
@@ -3442,15 +3777,8 @@ var import_equalizer2 = require("@discord-player/equalizer");
3442
3777
 
3443
3778
  // src/utils/FFmpegStream.ts
3444
3779
  var import_ffmpeg = require("@discord-player/ffmpeg");
3445
- var resolveArgs = /* @__PURE__ */ __name((config) => {
3446
- return Object.entries(config).reduce((acc, [key, value]) => {
3447
- if (value == null) return acc;
3448
- acc.push(`-${key}`, String(value));
3449
- return acc;
3450
- }, []);
3451
- }, "resolveArgs");
3452
3780
  function FFMPEG_ARGS_STRING(stream, fmt, cookies) {
3453
- const args = resolveArgs({
3781
+ const args = (0, import_ffmpeg.createFFmpegArgs)({
3454
3782
  reconnect: 1,
3455
3783
  reconnect_streamed: 1,
3456
3784
  reconnect_delay_max: 5,
@@ -3467,7 +3795,7 @@ function FFMPEG_ARGS_STRING(stream, fmt, cookies) {
3467
3795
  }
3468
3796
  __name(FFMPEG_ARGS_STRING, "FFMPEG_ARGS_STRING");
3469
3797
  function FFMPEG_ARGS_PIPED(fmt) {
3470
- const args = resolveArgs({
3798
+ const args = (0, import_ffmpeg.createFFmpegArgs)({
3471
3799
  analyzeduration: 0,
3472
3800
  loglevel: 0,
3473
3801
  ar: 48e3,
@@ -3522,13 +3850,104 @@ var EqualizerConfigurationPreset = Object.freeze({
3522
3850
  -9.6
3523
3851
  ]
3524
3852
  ),
3525
- Club: makeBands([-111022e-20, -111022e-20, 8, 5.6, 5.6, 5.6, 3.2, -111022e-20, -111022e-20, -111022e-20]),
3526
- Dance: makeBands([9.6, 7.2, 2.4, -111022e-20, -111022e-20, -5.6, -7.2, -7.2, -111022e-20, -111022e-20]),
3527
- FullBass: makeBands([-8, 9.6, 9.6, 5.6, 1.6, -4, -8, -10.4, -11.2, -11.2]),
3528
- FullBassTreble: makeBands([7.2, 5.6, -111022e-20, -7.2, -4.8, 1.6, 8, 11.2, 12, 12]),
3529
- FullTreble: makeBands([-9.6, -9.6, -9.6, -4, 2.4, 11.2, 16, 16, 16, 16.8]),
3530
- Headphones: makeBands([4.8, 11.2, 5.6, -3.2, -2.4, 1.6, 4.8, 9.6, 12.8, 14.4]),
3531
- LargeHall: makeBands([10.4, 10.4, 5.6, 5.6, -111022e-20, -4.8, -4.8, -4.8, -111022e-20, -111022e-20]),
3853
+ Club: makeBands(
3854
+ [
3855
+ -111022e-20,
3856
+ -111022e-20,
3857
+ 8,
3858
+ 5.6,
3859
+ 5.6,
3860
+ 5.6,
3861
+ 3.2,
3862
+ -111022e-20,
3863
+ -111022e-20,
3864
+ -111022e-20
3865
+ ]
3866
+ ),
3867
+ Dance: makeBands(
3868
+ [
3869
+ 9.6,
3870
+ 7.2,
3871
+ 2.4,
3872
+ -111022e-20,
3873
+ -111022e-20,
3874
+ -5.6,
3875
+ -7.2,
3876
+ -7.2,
3877
+ -111022e-20,
3878
+ -111022e-20
3879
+ ]
3880
+ ),
3881
+ FullBass: makeBands(
3882
+ [
3883
+ -8,
3884
+ 9.6,
3885
+ 9.6,
3886
+ 5.6,
3887
+ 1.6,
3888
+ -4,
3889
+ -8,
3890
+ -10.4,
3891
+ -11.2,
3892
+ -11.2
3893
+ ]
3894
+ ),
3895
+ FullBassTreble: makeBands(
3896
+ [
3897
+ 7.2,
3898
+ 5.6,
3899
+ -111022e-20,
3900
+ -7.2,
3901
+ -4.8,
3902
+ 1.6,
3903
+ 8,
3904
+ 11.2,
3905
+ 12,
3906
+ 12
3907
+ ]
3908
+ ),
3909
+ FullTreble: makeBands(
3910
+ [
3911
+ -9.6,
3912
+ -9.6,
3913
+ -9.6,
3914
+ -4,
3915
+ 2.4,
3916
+ 11.2,
3917
+ 16,
3918
+ 16,
3919
+ 16,
3920
+ 16.8
3921
+ ]
3922
+ ),
3923
+ Headphones: makeBands(
3924
+ [
3925
+ 4.8,
3926
+ 11.2,
3927
+ 5.6,
3928
+ -3.2,
3929
+ -2.4,
3930
+ 1.6,
3931
+ 4.8,
3932
+ 9.6,
3933
+ 12.8,
3934
+ 14.4
3935
+ ]
3936
+ ),
3937
+ LargeHall: makeBands(
3938
+ [
3939
+ 10.4,
3940
+ 10.4,
3941
+ 5.6,
3942
+ 5.6,
3943
+ -111022e-20,
3944
+ -4.8,
3945
+ -4.8,
3946
+ -4.8,
3947
+ -111022e-20,
3948
+ -111022e-20
3949
+ ]
3950
+ ),
3532
3951
  Live: makeBands([-4.8, -111022e-20, 4, 5.6, 5.6, 5.6, 4, 2.4, 2.4, 2.4]),
3533
3952
  Party: makeBands(
3534
3953
  [
@@ -3544,7 +3963,20 @@ var EqualizerConfigurationPreset = Object.freeze({
3544
3963
  7.2
3545
3964
  ]
3546
3965
  ),
3547
- Pop: makeBands([-1.6, 4.8, 7.2, 8, 5.6, -111022e-20, -2.4, -2.4, -1.6, -1.6]),
3966
+ Pop: makeBands(
3967
+ [
3968
+ -1.6,
3969
+ 4.8,
3970
+ 7.2,
3971
+ 8,
3972
+ 5.6,
3973
+ -111022e-20,
3974
+ -2.4,
3975
+ -2.4,
3976
+ -1.6,
3977
+ -1.6
3978
+ ]
3979
+ ),
3548
3980
  Reggae: makeBands(
3549
3981
  [
3550
3982
  -111022e-20,
@@ -3560,10 +3992,62 @@ var EqualizerConfigurationPreset = Object.freeze({
3560
3992
  ]
3561
3993
  ),
3562
3994
  Rock: makeBands([8, 4.8, -5.6, -8, -3.2, 4, 8.8, 11.2, 11.2, 11.2]),
3563
- Ska: makeBands([-2.4, -4.8, -4, -111022e-20, 4, 5.6, 8.8, 9.6, 11.2, 9.6]),
3564
- Soft: makeBands([4.8, 1.6, -111022e-20, -2.4, -111022e-20, 4, 8, 9.6, 11.2, 12]),
3565
- SoftRock: makeBands([4, 4, 2.4, -111022e-20, -4, -5.6, -3.2, -111022e-20, 2.4, 8.8]),
3566
- Techno: makeBands([8, 5.6, -111022e-20, -5.6, -4.8, -111022e-20, 8, 9.6, 9.6, 8.8])
3995
+ Ska: makeBands(
3996
+ [
3997
+ -2.4,
3998
+ -4.8,
3999
+ -4,
4000
+ -111022e-20,
4001
+ 4,
4002
+ 5.6,
4003
+ 8.8,
4004
+ 9.6,
4005
+ 11.2,
4006
+ 9.6
4007
+ ]
4008
+ ),
4009
+ Soft: makeBands(
4010
+ [
4011
+ 4.8,
4012
+ 1.6,
4013
+ -111022e-20,
4014
+ -2.4,
4015
+ -111022e-20,
4016
+ 4,
4017
+ 8,
4018
+ 9.6,
4019
+ 11.2,
4020
+ 12
4021
+ ]
4022
+ ),
4023
+ SoftRock: makeBands(
4024
+ [
4025
+ 4,
4026
+ 4,
4027
+ 2.4,
4028
+ -111022e-20,
4029
+ -4,
4030
+ -5.6,
4031
+ -3.2,
4032
+ -111022e-20,
4033
+ 2.4,
4034
+ 8.8
4035
+ ]
4036
+ ),
4037
+ Techno: makeBands(
4038
+ [
4039
+ 8,
4040
+ 5.6,
4041
+ -111022e-20,
4042
+ -5.6,
4043
+ -4.8,
4044
+ -111022e-20,
4045
+ 8,
4046
+ 9.6,
4047
+ 9.6,
4048
+ 8.8
4049
+ ]
4050
+ )
3567
4051
  });
3568
4052
  var _ffmpegFilters, _inputArgs, _FFmpegFilterer_instances, setFilters_fn;
3569
4053
  var _FFmpegFilterer = class _FFmpegFilterer {
@@ -3612,8 +4096,13 @@ var _FFmpegFilterer = class _FFmpegFilterer {
3612
4096
  * @param options The stream options
3613
4097
  */
3614
4098
  createStream(source, options) {
3615
- if (__privateGet(this, _inputArgs).length) options.encoderArgs = [...__privateGet(this, _inputArgs), ...options.encoderArgs || []];
3616
- return createFFmpegStream(source, options);
4099
+ if (__privateGet(this, _inputArgs).length)
4100
+ options.encoderArgs = [
4101
+ ...__privateGet(this, _inputArgs),
4102
+ ...options.encoderArgs || []
4103
+ ];
4104
+ const stream = createFFmpegStream(source, options);
4105
+ return stream;
3617
4106
  }
3618
4107
  /**
3619
4108
  * Set ffmpeg filters
@@ -3725,7 +4214,12 @@ setFilters_fn = /* @__PURE__ */ __name(function(filters) {
3725
4214
  const prev = __privateGet(this, _ffmpegFilters).slice();
3726
4215
  __privateSet(this, _ffmpegFilters, [...new Set(filters)]);
3727
4216
  return this.af.triggerReplay(seekTime).then((t) => {
3728
- queue.emit(GuildQueueEvent.AudioFiltersUpdate, queue, prev, __privateGet(this, _ffmpegFilters).slice());
4217
+ queue.emit(
4218
+ GuildQueueEvent.AudioFiltersUpdate,
4219
+ queue,
4220
+ prev,
4221
+ __privateGet(this, _ffmpegFilters).slice()
4222
+ );
3729
4223
  return t;
3730
4224
  });
3731
4225
  }, "#setFilters");
@@ -3844,7 +4338,7 @@ var _AFilterGraph = class _AFilterGraph {
3844
4338
  equalizer: this.equalizer,
3845
4339
  biquad: this.biquad,
3846
4340
  filters: this.filters,
3847
- sampleRate: this.resampler?.targetSampleRate || this.resampler?.sampleRate || 48e3,
4341
+ sampleRate: this.resampler?.sampleRate || 48e3,
3848
4342
  volume: this.volume?.volume ?? 100
3849
4343
  };
3850
4344
  }
@@ -3878,7 +4372,9 @@ var _GuildQueueStatistics = class _GuildQueueStatistics {
3878
4372
  tracksCount: this.queue.tracks.size,
3879
4373
  historySize: this.queue.history.tracks.size,
3880
4374
  extractors: this.queue.player.extractors.size,
3881
- listeners: this.queue.guild.members.me?.voice.channel?.members.filter((m) => !m.user.bot).size || 0,
4375
+ listeners: this.queue.guild.members.me?.voice.channel?.members.filter(
4376
+ (m) => !m.user.bot
4377
+ ).size || 0,
3882
4378
  memoryUsage: process.memoryUsage(),
3883
4379
  versions: {
3884
4380
  node: process.version,
@@ -3929,9 +4425,12 @@ var _SyncedLyricsProvider = class _SyncedLyricsProvider {
3929
4425
  at(time) {
3930
4426
  const lowestTime = this.lyrics.keys().next().value;
3931
4427
  if (lowestTime == null || time < lowestTime) return null;
3932
- if (this.lyrics.has(time)) return { line: this.lyrics.get(time), timestamp: time };
4428
+ if (this.lyrics.has(time))
4429
+ return { line: this.lyrics.get(time), timestamp: time };
3933
4430
  const keys = Array.from(this.lyrics.keys());
3934
- const closest = keys.reduce((a, b) => Math.abs(b - time) < Math.abs(a - time) ? b : a);
4431
+ const closest = keys.reduce(
4432
+ (a, b) => Math.abs(b - time) < Math.abs(a - time) ? b : a
4433
+ );
3935
4434
  if (closest > time) return null;
3936
4435
  if (Math.abs(closest - time) > 2e3) return null;
3937
4436
  const line = this.lyrics.get(closest);
@@ -4006,7 +4505,8 @@ createLoop_fn = /* @__PURE__ */ __name(function() {
4006
4505
  if (!time) return;
4007
4506
  const lyrics = this.at(time.current.value);
4008
4507
  if (!lyrics) return;
4009
- if (lastValue !== null && lyrics.line === lastValue.line && lyrics.timestamp === lastValue.timestamp) return;
4508
+ if (lastValue !== null && lyrics.line === lastValue.line && lyrics.timestamp === lastValue.timestamp)
4509
+ return;
4010
4510
  lastValue = lyrics;
4011
4511
  __privateGet(this, _callback).call(this, lyrics.line, lyrics.timestamp);
4012
4512
  }, this.interval).unref());
@@ -4131,7 +4631,11 @@ var GuildQueueEvent = {
4131
4631
  /**
4132
4632
  * Emitted when a queue is trying to add similar track for autoplay
4133
4633
  */
4134
- WillAutoPlay: "willAutoPlay"
4634
+ WillAutoPlay: "willAutoPlay",
4635
+ /**
4636
+ * Emitted when sample rate is updated
4637
+ */
4638
+ SampleRateUpdate: "sampleRateUpdate"
4135
4639
  };
4136
4640
  var TrackSkipReason = /* @__PURE__ */ ((TrackSkipReason2) => {
4137
4641
  TrackSkipReason2["NoStream"] = "ERR_NO_STREAM";
@@ -4186,9 +4690,12 @@ var _GuildQueue = class _GuildQueue {
4186
4690
  __publicField(this, "tasksQueue", new AsyncQueue());
4187
4691
  __publicField(this, "syncedLyricsProvider", new SyncedLyricsProvider(this));
4188
4692
  this.tracks = new import_utils6.Queue(options.queueStrategy);
4189
- if (TypeUtil.isFunction(options.onBeforeCreateStream)) this.onBeforeCreateStream = options.onBeforeCreateStream;
4190
- if (TypeUtil.isFunction(options.onAfterCreateStream)) this.onAfterCreateStream = options.onAfterCreateStream;
4191
- if (!TypeUtil.isNullish(options.repeatMode)) this.repeatMode = options.repeatMode;
4693
+ if (TypeUtil.isFunction(options.onBeforeCreateStream))
4694
+ this.onBeforeCreateStream = options.onBeforeCreateStream;
4695
+ if (TypeUtil.isFunction(options.onAfterCreateStream))
4696
+ this.onAfterCreateStream = options.onAfterCreateStream;
4697
+ if (!TypeUtil.isNullish(options.repeatMode))
4698
+ this.repeatMode = options.repeatMode;
4192
4699
  options.selfDeaf ?? (options.selfDeaf = true);
4193
4700
  options.maxSize ?? (options.maxSize = Infinity);
4194
4701
  options.maxHistorySize ?? (options.maxHistorySize = Infinity);
@@ -4209,17 +4716,33 @@ var _GuildQueue = class _GuildQueue {
4209
4716
  this.filters.ffmpeg.setDefaults(this.options.ffmpegFilters);
4210
4717
  }
4211
4718
  if (!TypeUtil.isNumber(options.maxSize)) {
4212
- throw new InvalidArgTypeError("[GuildNodeInit.maxSize]", "number", typeof options.maxSize);
4719
+ throw new InvalidArgTypeError(
4720
+ "[GuildNodeInit.maxSize]",
4721
+ "number",
4722
+ typeof options.maxSize
4723
+ );
4213
4724
  }
4214
4725
  if (!TypeUtil.isNumber(options.maxHistorySize)) {
4215
- throw new InvalidArgTypeError("[GuildNodeInit.maxHistorySize]", "number", typeof options.maxHistorySize);
4726
+ throw new InvalidArgTypeError(
4727
+ "[GuildNodeInit.maxHistorySize]",
4728
+ "number",
4729
+ typeof options.maxHistorySize
4730
+ );
4216
4731
  }
4217
4732
  if (options.maxSize < 1) options.maxSize = Infinity;
4218
4733
  if (options.maxHistorySize < 1) options.maxHistorySize = Infinity;
4219
4734
  if (this.hasDebugger)
4220
- this.debug(`GuildQueue initialized for guild ${this.options.guild.name} (ID: ${this.options.guild.id})`);
4735
+ this.debug(
4736
+ `GuildQueue initialized for guild ${this.options.guild.name} (ID: ${this.options.guild.id})`
4737
+ );
4221
4738
  this.emit(GuildQueueEvent.QueueCreate, this);
4222
4739
  }
4740
+ /**
4741
+ * Whether this queue can intercept streams
4742
+ */
4743
+ canIntercept() {
4744
+ return this.options.enableStreamInterceptor;
4745
+ }
4223
4746
  /**
4224
4747
  * Estimated duration of this queue in ms
4225
4748
  */
@@ -4450,6 +4973,61 @@ var _GuildQueue = class _GuildQueue {
4450
4973
  removeTrack(track) {
4451
4974
  return this.node.remove(track);
4452
4975
  }
4976
+ /**
4977
+ * Prepends a track or track resolvable to the queue
4978
+ * @param track The track resolvable to insert
4979
+ * @param index The index to insert the track at (defaults to 0). If > 0, the inserted track will be placed before the track at the given index.
4980
+ */
4981
+ prepend(track, index = 0) {
4982
+ if (index < 0 || index > this.tracks.size) {
4983
+ throw new OutOfRangeError(
4984
+ "index",
4985
+ `${index}`,
4986
+ "0",
4987
+ `${this.tracks.size}`
4988
+ );
4989
+ }
4990
+ const count = Array.isArray(track) ? track.length : track instanceof import_utils6.Queue ? track.size : 1;
4991
+ VALIDATE_QUEUE_CAP(this, count);
4992
+ const insertionIndex = index === 0 ? 0 : index - 1;
4993
+ if (track instanceof Track) {
4994
+ this.node.insert(track, insertionIndex);
4995
+ this.emit(GuildQueueEvent.AudioTrackAdd, this, track);
4996
+ return;
4997
+ }
4998
+ const tracks = track instanceof import_utils6.Queue ? track.store : track;
4999
+ this.tracks.store.splice(insertionIndex, 0, ...tracks);
5000
+ if (!this.options.noEmitInsert) {
5001
+ this.emit(GuildQueueEvent.AudioTracksAdd, this, tracks);
5002
+ }
5003
+ }
5004
+ /**
5005
+ * Appends a track or track resolvable to the queue
5006
+ * @param track The track resolvable to insert
5007
+ * @param index The index to insert the track at (defaults to 0). If > 0, the inserted track will be placed after the track at the given index.
5008
+ */
5009
+ append(track, index = 0) {
5010
+ if (index < 0 || index > this.tracks.size) {
5011
+ throw new OutOfRangeError(
5012
+ "index",
5013
+ `${index}`,
5014
+ "0",
5015
+ `${this.tracks.size}`
5016
+ );
5017
+ }
5018
+ const count = Array.isArray(track) ? track.length : track instanceof import_utils6.Queue ? track.size : 1;
5019
+ VALIDATE_QUEUE_CAP(this, count);
5020
+ if (track instanceof Track) {
5021
+ this.node.insert(track, index);
5022
+ this.emit(GuildQueueEvent.AudioTrackAdd, this, track);
5023
+ return;
5024
+ }
5025
+ const tracks = track instanceof import_utils6.Queue ? track.store : track;
5026
+ this.tracks.store.splice(index, 0, ...tracks);
5027
+ if (!this.options.noEmitInsert) {
5028
+ this.emit(GuildQueueEvent.AudioTracksAdd, this, tracks);
5029
+ }
5030
+ }
4453
5031
  /**
4454
5032
  * Inserts the track to the given index
4455
5033
  * @param track The track to insert
@@ -4490,7 +5068,9 @@ var _GuildQueue = class _GuildQueue {
4490
5068
  if (connection.state.status === import_discord_voip3.VoiceConnectionStatus.Destroyed) {
4491
5069
  throw new VoiceConnectionDestroyedError();
4492
5070
  }
4493
- const channel = this.player.client.channels.cache.get(connection.joinConfig.channelId);
5071
+ const channel = this.player.client.channels.cache.get(
5072
+ connection.joinConfig.channelId
5073
+ );
4494
5074
  if (!channel) throw new NoVoiceChannelError();
4495
5075
  if (!channel.isVoiceBased())
4496
5076
  throw new InvalidArgTypeError(
@@ -4544,9 +5124,13 @@ var _GuildQueue = class _GuildQueue {
4544
5124
  });
4545
5125
  this.emit(GuildQueueEvent.Connection, this);
4546
5126
  if (this.channel.type === import_discord3.ChannelType.GuildStageVoice) {
4547
- await this.channel.guild.members.me.voice.setSuppressed(false).catch(async () => {
4548
- return await this.channel.guild.members.me.voice.setRequestToSpeak(true).catch(Util.noop);
4549
- });
5127
+ await this.channel.guild.members.me.voice.setSuppressed(false).catch(
5128
+ async () => {
5129
+ return await this.channel.guild.members.me.voice.setRequestToSpeak(
5130
+ true
5131
+ ).catch(Util.noop);
5132
+ }
5133
+ );
4550
5134
  }
4551
5135
  __privateMethod(this, _GuildQueue_instances, attachListeners_fn).call(this, this.dispatcher);
4552
5136
  return this;
@@ -4664,7 +5248,10 @@ _shuffle = new WeakMap();
4664
5248
  _GuildQueue_instances = new WeakSet();
4665
5249
  attachListeners_fn = /* @__PURE__ */ __name(function(dispatcher) {
4666
5250
  dispatcher.on("error", (e) => this.emit(GuildQueueEvent.Error, this, e));
4667
- dispatcher.on("debug", (m) => this.hasDebugger && this.emit(GuildQueueEvent.Debug, this, m));
5251
+ dispatcher.on(
5252
+ "debug",
5253
+ (m) => this.hasDebugger && this.emit(GuildQueueEvent.Debug, this, m)
5254
+ );
4668
5255
  dispatcher.on("finish", (r) => __privateMethod(this, _GuildQueue_instances, performFinish_fn).call(this, r));
4669
5256
  dispatcher.on("start", (r) => __privateMethod(this, _GuildQueue_instances, performStart_fn).call(this, r));
4670
5257
  dispatcher.on("destroyed", () => {
@@ -4673,27 +5260,57 @@ attachListeners_fn = /* @__PURE__ */ __name(function(dispatcher) {
4673
5260
  });
4674
5261
  dispatcher.on("dsp", (f) => {
4675
5262
  if (!Object.is(this.filters._lastFiltersCache.filters, f)) {
4676
- this.emit(GuildQueueEvent.DSPUpdate, this, this.filters._lastFiltersCache.filters, f);
5263
+ this.emit(
5264
+ GuildQueueEvent.DSPUpdate,
5265
+ this,
5266
+ this.filters._lastFiltersCache.filters,
5267
+ f
5268
+ );
4677
5269
  }
4678
5270
  this.filters._lastFiltersCache.filters = f;
4679
5271
  });
4680
5272
  dispatcher.on("biquad", (f) => {
4681
5273
  if (this.filters._lastFiltersCache.biquad !== f) {
4682
- this.emit(GuildQueueEvent.BiquadFiltersUpdate, this, this.filters._lastFiltersCache.biquad, f);
5274
+ this.emit(
5275
+ GuildQueueEvent.BiquadFiltersUpdate,
5276
+ this,
5277
+ this.filters._lastFiltersCache.biquad,
5278
+ f
5279
+ );
4683
5280
  }
4684
5281
  this.filters._lastFiltersCache.biquad = f;
4685
5282
  });
4686
5283
  dispatcher.on("eqBands", (f) => {
4687
5284
  if (!Object.is(f, this.filters._lastFiltersCache.equalizer)) {
4688
- this.emit(GuildQueueEvent.EqualizerUpdate, this, this.filters._lastFiltersCache.equalizer, f);
5285
+ this.emit(
5286
+ GuildQueueEvent.EqualizerUpdate,
5287
+ this,
5288
+ this.filters._lastFiltersCache.equalizer,
5289
+ f
5290
+ );
4689
5291
  }
4690
5292
  this.filters._lastFiltersCache.equalizer = f;
4691
5293
  });
4692
5294
  dispatcher.on("volume", (f) => {
4693
5295
  if (this.filters._lastFiltersCache.volume !== f)
4694
- this.emit(GuildQueueEvent.VolumeChange, this, this.filters._lastFiltersCache.volume, f);
5296
+ this.emit(
5297
+ GuildQueueEvent.VolumeChange,
5298
+ this,
5299
+ this.filters._lastFiltersCache.volume,
5300
+ f
5301
+ );
4695
5302
  this.filters._lastFiltersCache.volume = f;
4696
5303
  });
5304
+ dispatcher.on("sampleRate", (f) => {
5305
+ if (this.filters._lastFiltersCache.sampleRate !== f)
5306
+ this.emit(
5307
+ GuildQueueEvent.SampleRateUpdate,
5308
+ this,
5309
+ this.filters._lastFiltersCache.sampleRate,
5310
+ f
5311
+ );
5312
+ this.filters._lastFiltersCache.sampleRate = f;
5313
+ });
4697
5314
  }, "#attachListeners");
4698
5315
  removeListeners_fn = /* @__PURE__ */ __name(function(target) {
4699
5316
  target.removeAllListeners();
@@ -4709,7 +5326,8 @@ performStart_fn = /* @__PURE__ */ __name(function(resource) {
4709
5326
  })}`
4710
5327
  );
4711
5328
  this.emit(GuildQueueEvent.PlayerTrigger, this, track, reason);
4712
- if (track && !this.isTransitioning()) this.emit(GuildQueueEvent.PlayerStart, this, track);
5329
+ if (track && !this.isTransitioning())
5330
+ this.emit(GuildQueueEvent.PlayerStart, this, track);
4713
5331
  this.setTransitioning(false);
4714
5332
  }, "#performStart");
4715
5333
  getNextTrack_fn = /* @__PURE__ */ __name(function() {
@@ -4737,7 +5355,9 @@ performFinish_fn = /* @__PURE__ */ __name(function(resource) {
4737
5355
  this.syncedLyricsProvider.unsubscribe();
4738
5356
  this.syncedLyricsProvider.lyrics.clear();
4739
5357
  if (this.hasDebugger)
4740
- this.debug("Adding track to history and emitting finish event since transition mode is disabled...");
5358
+ this.debug(
5359
+ "Adding track to history and emitting finish event since transition mode is disabled..."
5360
+ );
4741
5361
  if (track) {
4742
5362
  this.history.push(track);
4743
5363
  this.node.resetProgress();
@@ -4746,28 +5366,39 @@ performFinish_fn = /* @__PURE__ */ __name(function(resource) {
4746
5366
  if (__privateGet(this, _deleted)) return __privateMethod(this, _GuildQueue_instances, emitEnd_fn).call(this);
4747
5367
  if (this.tracks.size < 1 && this.repeatMode === QueueRepeatMode.OFF) {
4748
5368
  if (this.hasDebugger)
4749
- this.debug("No more tracks left in the queue to play and repeat mode is off, initiating #emitEnd()");
5369
+ this.debug(
5370
+ "No more tracks left in the queue to play and repeat mode is off, initiating #emitEnd()"
5371
+ );
4750
5372
  __privateMethod(this, _GuildQueue_instances, emitEnd_fn).call(this);
4751
5373
  } else {
4752
5374
  if (this.repeatMode === QueueRepeatMode.TRACK) {
4753
- if (this.hasDebugger) this.debug("Repeat mode is set to track, repeating last track from the history...");
5375
+ if (this.hasDebugger)
5376
+ this.debug(
5377
+ "Repeat mode is set to track, repeating last track from the history..."
5378
+ );
4754
5379
  this.__current = this.history.tracks.dispatch() || track;
4755
5380
  return this.node.play(this.__current, { queue: false });
4756
5381
  }
4757
5382
  if (this.repeatMode === QueueRepeatMode.QUEUE) {
4758
5383
  if (this.hasDebugger)
4759
- this.debug("Repeat mode is set to queue, moving last track from the history to current queue...");
5384
+ this.debug(
5385
+ "Repeat mode is set to queue, moving last track from the history to current queue..."
5386
+ );
4760
5387
  const next = this.history.tracks.dispatch() || track;
4761
5388
  if (next) this.tracks.add(next);
4762
5389
  }
4763
5390
  if (!this.tracks.size && track) {
4764
5391
  if (this.repeatMode === QueueRepeatMode.AUTOPLAY) {
4765
- if (this.hasDebugger) this.debug("Repeat mode is set to autoplay, initiating autoplay handler...");
5392
+ if (this.hasDebugger)
5393
+ this.debug(
5394
+ "Repeat mode is set to autoplay, initiating autoplay handler..."
5395
+ );
4766
5396
  __privateMethod(this, _GuildQueue_instances, handleAutoplay_fn).call(this, track);
4767
5397
  return;
4768
5398
  }
4769
5399
  } else {
4770
- if (this.hasDebugger) this.debug("Initializing next track of the queue...");
5400
+ if (this.hasDebugger)
5401
+ this.debug("Initializing next track of the queue...");
4771
5402
  this.__current = __privateMethod(this, _GuildQueue_instances, getNextTrack_fn).call(this);
4772
5403
  this.node.play(this.__current, {
4773
5404
  queue: false
@@ -4793,29 +5424,46 @@ handleAutoplay_fn = /* @__PURE__ */ __name(async function(track) {
4793
5424
  `Autoplay >> Finding related tracks for Track ${track.title} (${track.url}) [ext:${track.extractor?.identifier || "N/A"}]`
4794
5425
  );
4795
5426
  const tracks = (await track.extractor?.getRelatedTracks(track, this.history))?.tracks || (await this.player.extractors.run(async (ext) => {
4796
- if (this.hasDebugger) this.debug(`Autoplay >> Querying extractor ${ext.identifier}`);
5427
+ if (this.hasDebugger)
5428
+ this.debug(`Autoplay >> Querying extractor ${ext.identifier}`);
4797
5429
  const res = await ext.getRelatedTracks(track, this.history);
4798
5430
  if (!res.tracks.length) {
4799
- if (this.hasDebugger) this.debug(`Autoplay >> Extractor ${ext.identifier} failed to provide results.`);
5431
+ if (this.hasDebugger)
5432
+ this.debug(
5433
+ `Autoplay >> Extractor ${ext.identifier} failed to provide results.`
5434
+ );
4800
5435
  return false;
4801
5436
  }
4802
- if (this.hasDebugger) this.debug(`Autoplay >> Extractor ${ext.identifier} successfully returned results.`);
5437
+ if (this.hasDebugger)
5438
+ this.debug(
5439
+ `Autoplay >> Extractor ${ext.identifier} successfully returned results.`
5440
+ );
4803
5441
  return res.tracks;
4804
5442
  }))?.result || [];
4805
5443
  let resolver = Util.noop;
4806
- const donePromise = new Promise((resolve2) => resolver = resolve2);
4807
- const success = this.emit(GuildQueueEvent.WillAutoPlay, this, tracks, resolver);
5444
+ const donePromise = new Promise(
5445
+ (resolve2) => resolver = resolve2
5446
+ );
5447
+ const success = this.emit(
5448
+ GuildQueueEvent.WillAutoPlay,
5449
+ this,
5450
+ tracks,
5451
+ resolver
5452
+ );
4808
5453
  if (!success) {
4809
5454
  resolver(
4810
5455
  tracks.length ? (() => {
4811
- const unique = tracks.filter((tr) => !this.history.tracks.find((t) => t.url === tr.url));
5456
+ const unique = tracks.filter(
5457
+ (tr) => !this.history.tracks.find((t) => t.url === tr.url)
5458
+ );
4812
5459
  return unique?.[0] ?? Util.randomChoice(tracks.slice(0, 5));
4813
5460
  })() : null
4814
5461
  );
4815
5462
  }
4816
5463
  const nextTrack = await donePromise;
4817
5464
  if (!nextTrack) {
4818
- if (this.hasDebugger) this.debug("Autoplay >> No track was found, initiating #emitEnd()");
5465
+ if (this.hasDebugger)
5466
+ this.debug("Autoplay >> No track was found, initiating #emitEnd()");
4819
5467
  throw "No track was found";
4820
5468
  }
4821
5469
  await this.node.play(nextTrack, {
@@ -4872,13 +5520,19 @@ var _GuildNodeManager = class _GuildNodeManager {
4872
5520
  options.disableEqualizer ?? (options.disableEqualizer = false);
4873
5521
  options.disableFilterer ?? (options.disableFilterer = false);
4874
5522
  options.disableVolume ?? (options.disableVolume = false);
4875
- options.disableResampler ?? (options.disableResampler = true);
5523
+ options.disableResampler ?? (options.disableResampler = false);
4876
5524
  options.disableFallbackStream ?? (options.disableFallbackStream = false);
5525
+ options.enableStreamInterceptor ?? (options.enableStreamInterceptor = false);
5526
+ options.verifyFallbackStream ?? (options.verifyFallbackStream = false);
4877
5527
  if (getGlobalRegistry().has("@[onBeforeCreateStream]") && !options.onBeforeCreateStream) {
4878
- options.onBeforeCreateStream = getGlobalRegistry().get("@[onBeforeCreateStream]");
5528
+ options.onBeforeCreateStream = getGlobalRegistry().get(
5529
+ "@[onBeforeCreateStream]"
5530
+ );
4879
5531
  }
4880
5532
  if (getGlobalRegistry().has("@[onAfterCreateStream]") && !options.onAfterCreateStream) {
4881
- options.onAfterCreateStream = getGlobalRegistry().get("@[onAfterCreateStream]");
5533
+ options.onAfterCreateStream = getGlobalRegistry().get(
5534
+ "@[onAfterCreateStream]"
5535
+ );
4882
5536
  }
4883
5537
  const queue = new GuildQueue5(this.player, {
4884
5538
  guild: server,
@@ -4913,7 +5567,9 @@ var _GuildNodeManager = class _GuildNodeManager {
4913
5567
  disableFilterer: options.disableFilterer,
4914
5568
  disableResampler: options.disableResampler,
4915
5569
  disableVolume: options.disableVolume,
4916
- disableFallbackStream: options.disableFallbackStream
5570
+ disableFallbackStream: options.disableFallbackStream,
5571
+ enableStreamInterceptor: options.enableStreamInterceptor,
5572
+ verifyFallbackStream: options.verifyFallbackStream
4917
5573
  });
4918
5574
  this.cache.set(server.id, queue);
4919
5575
  return queue;
@@ -4962,7 +5618,9 @@ var _GuildNodeManager = class _GuildNodeManager {
4962
5618
  if (node instanceof GuildQueue5) {
4963
5619
  return node;
4964
5620
  }
4965
- return this.cache.get(this.player.client.guilds.resolveId(node));
5621
+ return this.cache.get(
5622
+ this.player.client.guilds.resolveId(node)
5623
+ );
4966
5624
  }
4967
5625
  /**
4968
5626
  * Resolve queue id
@@ -5060,7 +5718,10 @@ var toSnakeCase = /* @__PURE__ */ __name((obj) => {
5060
5718
  const snakeObj = {};
5061
5719
  for (const [key, value] of Object.entries(obj)) {
5062
5720
  if (value == null) continue;
5063
- const newKey = key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
5721
+ const newKey = key.replace(
5722
+ /[A-Z]/g,
5723
+ (letter) => `_${letter.toLowerCase()}`
5724
+ );
5064
5725
  snakeObj[newKey] = value;
5065
5726
  }
5066
5727
  return snakeObj;
@@ -5159,7 +5820,10 @@ var _LrcLib = class _LrcLib {
5159
5820
  }
5160
5821
  };
5161
5822
  this.player.debug(`[LrcLib] Requesting ${path}`);
5162
- return fetch(`${this.api}${path.startsWith("/") ? path : "/" + path}`, init);
5823
+ return fetch(
5824
+ `${this.api}${path.startsWith("/") ? path : "/" + path}`,
5825
+ init
5826
+ );
5163
5827
  }, "dispatcher");
5164
5828
  const res = await this.bucket.enqueue(dispatcher);
5165
5829
  return res.json();
@@ -5194,7 +5858,13 @@ var _VoiceUtils = class _VoiceUtils {
5194
5858
  async connect(channel, options) {
5195
5859
  if (!options?.queue) throw new NoGuildQueueError();
5196
5860
  const conn = await this.join(channel, options);
5197
- const sub = new StreamDispatcher(conn, channel, options.queue, options.maxTime, options.audioPlayer);
5861
+ const sub = new StreamDispatcher(
5862
+ conn,
5863
+ channel,
5864
+ options.queue,
5865
+ options.maxTime,
5866
+ options.audioPlayer
5867
+ );
5198
5868
  return sub;
5199
5869
  }
5200
5870
  /**
@@ -5204,7 +5874,10 @@ var _VoiceUtils = class _VoiceUtils {
5204
5874
  * @returns {VoiceConnection}
5205
5875
  */
5206
5876
  async join(channel, options) {
5207
- const existingConnection = this.getConnection(channel.guild.id, options?.group);
5877
+ const existingConnection = this.getConnection(
5878
+ channel.guild.id,
5879
+ options?.group
5880
+ );
5208
5881
  if (existingConnection?.joinConfig.channelId === channel?.id && existingConnection.state.status !== import_discord_voip4.VoiceConnectionStatus.Destroyed) {
5209
5882
  return existingConnection;
5210
5883
  }
@@ -5224,9 +5897,11 @@ var _VoiceUtils = class _VoiceUtils {
5224
5897
  * @returns {void}
5225
5898
  */
5226
5899
  disconnect(connection) {
5227
- if (connection instanceof StreamDispatcher) connection = connection.voiceConnection;
5900
+ if (connection instanceof StreamDispatcher)
5901
+ connection = connection.voiceConnection;
5228
5902
  try {
5229
- if (connection.state.status !== import_discord_voip4.VoiceConnectionStatus.Destroyed) return connection.destroy();
5903
+ if (connection.state.status !== import_discord_voip4.VoiceConnectionStatus.Destroyed)
5904
+ return connection.destroy();
5230
5905
  } catch {
5231
5906
  }
5232
5907
  }
@@ -5253,7 +5928,10 @@ var _QueryCache = class _QueryCache {
5253
5928
  this.options = options;
5254
5929
  __privateAdd(this, _defaultCache, /* @__PURE__ */ new Map());
5255
5930
  __publicField(this, "timer");
5256
- this.timer = setInterval(this.cleanup.bind(this), this.checkInterval).unref();
5931
+ this.timer = setInterval(
5932
+ this.cleanup.bind(this),
5933
+ this.checkInterval
5934
+ ).unref();
5257
5935
  }
5258
5936
  get checkInterval() {
5259
5937
  return this.options.checkInterval ?? DEFAULT_EXPIRY_TIMEOUT;
@@ -5306,7 +5984,8 @@ var _DiscordPlayerQueryResultCache = class _DiscordPlayerQueryResultCache {
5306
5984
  }
5307
5985
  }
5308
5986
  hasExpired() {
5309
- if (typeof this.expireAfter !== "number" || isNaN(this.expireAfter) || this.expireAfter < 1) return false;
5987
+ if (typeof this.expireAfter !== "number" || isNaN(this.expireAfter) || this.expireAfter < 1)
5988
+ return false;
5310
5989
  return Date.now() <= this.expireAfter;
5311
5990
  }
5312
5991
  };
@@ -5325,7 +6004,8 @@ var import_discord_voip5 = require("discord-voip");
5325
6004
  var import_discord4 = require("discord.js");
5326
6005
  function handleEmptyChannel(player, queue, guildId) {
5327
6006
  const timeout = setTimeout(() => {
5328
- if (!Util.isVoiceEmpty(queue.channel) || !player.nodes.has(queue.guild.id)) return;
6007
+ if (!Util.isVoiceEmpty(queue.channel) || !player.nodes.has(queue.guild.id))
6008
+ return;
5329
6009
  if (queue.options.leaveOnEmpty) queue.delete();
5330
6010
  player.events.emit(GuildQueueEvent.EmptyChannel, queue);
5331
6011
  }, queue.options.leaveOnEmptyCooldown || 0).unref();
@@ -5348,13 +6028,17 @@ function handlePauseOnEmpty(queue) {
5348
6028
  queue.node.setPaused(true);
5349
6029
  Reflect.set(queue, "__pausedOnEmpty", true);
5350
6030
  if (queue.hasDebugger) {
5351
- queue.debug("Voice channel is empty and options#pauseOnEmpty is true, pausing...");
6031
+ queue.debug(
6032
+ "Voice channel is empty and options#pauseOnEmpty is true, pausing..."
6033
+ );
5352
6034
  }
5353
6035
  } else if (!isEmpty && wasPausedOnEmpty) {
5354
6036
  queue.node.setPaused(false);
5355
6037
  Reflect.set(queue, "__pausedOnEmpty", false);
5356
6038
  if (queue.hasDebugger) {
5357
- queue.debug("Voice channel is not empty and options#pauseOnEmpty is true, resuming...");
6039
+ queue.debug(
6040
+ "Voice channel is not empty and options#pauseOnEmpty is true, resuming..."
6041
+ );
5358
6042
  }
5359
6043
  }
5360
6044
  }
@@ -5396,7 +6080,8 @@ async function defaultVoiceStateHandler(player, queue, oldState, newState) {
5396
6080
  } else if (newState.channelId === queue.channel.id) {
5397
6081
  handleChannelPopulate(player, queue, guildId);
5398
6082
  } else if (oldState.channelId !== newState.channelId) {
5399
- if (newState.channelId !== queue.channel.id && !Util.isVoiceEmpty(queue.channel)) return;
6083
+ if (newState.channelId !== queue.channel.id && !Util.isVoiceEmpty(queue.channel))
6084
+ return;
5400
6085
  if (!queue.timeouts.has(`empty_${guildId}`)) {
5401
6086
  handleEmptyChannel(player, queue, guildId);
5402
6087
  }
@@ -5411,7 +6096,7 @@ var import_ffmpeg2 = require("@discord-player/ffmpeg");
5411
6096
  // src/version.ts
5412
6097
  var version = (
5413
6098
  /* @__MACRO__ getVersion */
5414
- "7.0.0"
6099
+ "7.1.1-dev.0"
5415
6100
  );
5416
6101
 
5417
6102
  // src/utils/DependencyReportGenerator.ts
@@ -5426,7 +6111,11 @@ var DependencyReportGenerator = {
5426
6111
  findPackageJSON(dir, packageName, depth) {
5427
6112
  if (depth === 0) return null;
5428
6113
  const target = (0, import_node_path.resolve)(dir, "package.json");
5429
- const next = /* @__PURE__ */ __name(() => DependencyReportGenerator.findPackageJSON((0, import_node_path.resolve)(dir, ".."), packageName, depth - 1), "next");
6114
+ const next = /* @__PURE__ */ __name(() => DependencyReportGenerator.findPackageJSON(
6115
+ (0, import_node_path.resolve)(dir, ".."),
6116
+ packageName,
6117
+ depth - 1
6118
+ ), "next");
5430
6119
  try {
5431
6120
  const pkgJSON = require(target);
5432
6121
  if (pkgJSON.name !== packageName) {
@@ -5448,7 +6137,11 @@ var DependencyReportGenerator = {
5448
6137
  if (name === "discord-player") {
5449
6138
  return version;
5450
6139
  }
5451
- const pkg = DependencyReportGenerator.findPackageJSON((0, import_node_path.dirname)(require.resolve(name)), name, maxLookupDepth);
6140
+ const pkg = DependencyReportGenerator.findPackageJSON(
6141
+ (0, import_node_path.dirname)(require.resolve(name)),
6142
+ name,
6143
+ maxLookupDepth
6144
+ );
5452
6145
  return pkg?.version ?? null;
5453
6146
  } catch {
5454
6147
  return null;
@@ -5472,8 +6165,12 @@ var DependencyReportGenerator = {
5472
6165
  }
5473
6166
  return {
5474
6167
  core: {
5475
- "discord-player": DependencyReportGenerator.version("discord-player"),
5476
- "discord-voip": DependencyReportGenerator.version("discord-voip")
6168
+ "discord-player": DependencyReportGenerator.version(
6169
+ "discord-player"
6170
+ ),
6171
+ "discord-voip": DependencyReportGenerator.version(
6172
+ "discord-voip"
6173
+ )
5477
6174
  },
5478
6175
  libopus: {
5479
6176
  mediaplex: DependencyReportGenerator.version("mediaplex"),
@@ -5486,7 +6183,9 @@ var DependencyReportGenerator = {
5486
6183
  "sodium-native": DependencyReportGenerator.version("sodium-native"),
5487
6184
  sodium: DependencyReportGenerator.version("sodium"),
5488
6185
  "libsodium-wrappers": DependencyReportGenerator.version("libsodium-wrappers"),
5489
- "@stablelib/xchacha20poly1305": DependencyReportGenerator.version("@stablelib/xchacha20poly1305"),
6186
+ "@stablelib/xchacha20poly1305": DependencyReportGenerator.version(
6187
+ "@stablelib/xchacha20poly1305"
6188
+ ),
5490
6189
  "sodium-javascript": DependencyReportGenerator.version("sodium-javascript"),
5491
6190
  "@nobel/ciphers": DependencyReportGenerator.version("@nobel/ciphers")
5492
6191
  },
@@ -5511,7 +6210,9 @@ var DependencyReportGenerator = {
5511
6210
  for (const _subKey of subKeys) {
5512
6211
  const subKey = _subKey;
5513
6212
  const value = report[key][subKey] ?? "N/A";
5514
- output.push(`- ${subKey}: ${typeof value === "object" ? JSON.stringify(value, null, 2) : value}`);
6213
+ output.push(
6214
+ `- ${subKey}: ${typeof value === "object" ? JSON.stringify(value, null, 2) : value}`
6215
+ );
5515
6216
  }
5516
6217
  output.push("");
5517
6218
  }
@@ -5520,6 +6221,55 @@ var DependencyReportGenerator = {
5520
6221
  }
5521
6222
  };
5522
6223
 
6224
+ // src/PlayerStreamInterceptor.ts
6225
+ var _onStream;
6226
+ var _PlayerStreamInterceptor = class _PlayerStreamInterceptor {
6227
+ /**
6228
+ * Creates a new PlayerStreamInterceptor instance.
6229
+ * @param player The player instance
6230
+ * @param options The interceptor options
6231
+ */
6232
+ constructor(player, options) {
6233
+ this.player = player;
6234
+ this.options = options;
6235
+ __privateAdd(this, _onStream, /* @__PURE__ */ new Set());
6236
+ }
6237
+ /**
6238
+ * Handles the intercepted stream.
6239
+ * @param queue The guild queue
6240
+ * @param track The track
6241
+ * @param stream The intercepted stream
6242
+ * @returns Whether the stream was intercepted
6243
+ */
6244
+ async handle(queue, track, type, stream) {
6245
+ const filter = this.options.shouldIntercept;
6246
+ if (filter) {
6247
+ const result = await filter(queue, track, type, stream);
6248
+ if (!result) return false;
6249
+ }
6250
+ const hasListeners = __privateGet(this, _onStream).size;
6251
+ if (!hasListeners) return false;
6252
+ await Promise.all(
6253
+ [...__privateGet(this, _onStream)].map((handler) => handler(queue, track, type, stream))
6254
+ );
6255
+ return true;
6256
+ }
6257
+ /**
6258
+ * Adds a new intercepted stream listener.
6259
+ * @param handler The handler
6260
+ * @returns A function to remove the listener
6261
+ */
6262
+ onStream(handler) {
6263
+ __privateGet(this, _onStream).add(handler);
6264
+ return () => {
6265
+ __privateGet(this, _onStream).delete(handler);
6266
+ };
6267
+ }
6268
+ };
6269
+ _onStream = new WeakMap();
6270
+ __name(_PlayerStreamInterceptor, "PlayerStreamInterceptor");
6271
+ var PlayerStreamInterceptor = _PlayerStreamInterceptor;
6272
+
5523
6273
  // src/Player.ts
5524
6274
  var PlayerEvent = {
5525
6275
  debug: "debug",
@@ -5529,7 +6279,7 @@ var PlayerEvent = {
5529
6279
  voiceStateUpdate: "voiceStateUpdate",
5530
6280
  VoiceStateUpdate: "voiceStateUpdate"
5531
6281
  };
5532
- var _lastLatency, _voiceStateUpdateListener, _lagMonitorTimeout, _lagMonitorInterval, _onVoiceStateUpdate, _hooksCtx;
6282
+ var _lastLatency, _voiceStateUpdateListener, _lagMonitorTimeout, _lagMonitorInterval, _onVoiceStateUpdate, _hooksCtx, _streamInterceptor;
5533
6283
  var _Player = class _Player extends PlayerEventsEmitter {
5534
6284
  /**
5535
6285
  * Creates new Discord Player
@@ -5571,7 +6321,12 @@ var _Player = class _Player extends PlayerEventsEmitter {
5571
6321
  /**
5572
6322
  * The player events channel
5573
6323
  */
5574
- __publicField(this, "events", new PlayerEventsEmitter([GuildQueueEvent.Error, GuildQueueEvent.PlayerError]));
6324
+ __publicField(this, "events", new PlayerEventsEmitter(
6325
+ [
6326
+ GuildQueueEvent.Error,
6327
+ GuildQueueEvent.PlayerError
6328
+ ]
6329
+ ));
5575
6330
  /**
5576
6331
  * The player version
5577
6332
  */
@@ -5580,9 +6335,12 @@ var _Player = class _Player extends PlayerEventsEmitter {
5580
6335
  * The lyrics api
5581
6336
  */
5582
6337
  __publicField(this, "lyrics", new LrcLib(this));
6338
+ __privateAdd(this, _streamInterceptor, null);
5583
6339
  if (options.ffmpegPath) {
5584
6340
  if (typeof options.ffmpegPath !== "string")
5585
- throw new TypeError(`Expected type "string" for options.ffmpegPath. Got ${typeof options.ffmpegPath} instead`);
6341
+ throw new TypeError(
6342
+ `Expected type "string" for options.ffmpegPath. Got ${typeof options.ffmpegPath} instead`
6343
+ );
5586
6344
  process.env.FFMPEG_PATH = options.ffmpegPath;
5587
6345
  }
5588
6346
  const isCompatMode = isClientProxy(client);
@@ -5597,7 +6355,10 @@ var _Player = class _Player extends PlayerEventsEmitter {
5597
6355
  }
5598
6356
  const ibf = this.client.options.intents instanceof import_discord5.IntentsBitField ? this.client.options.intents : new import_discord5.IntentsBitField(this.client.options.intents);
5599
6357
  if (!ibf.has(import_discord5.IntentsBitField.Flags.GuildVoiceStates)) {
5600
- Util.warn('client is missing "GuildVoiceStates" intent', "InvalidIntentsBitField");
6358
+ Util.warn(
6359
+ 'client is missing "GuildVoiceStates" intent',
6360
+ "InvalidIntentsBitField"
6361
+ );
5601
6362
  }
5602
6363
  } catch {
5603
6364
  }
@@ -5632,7 +6393,10 @@ var _Player = class _Player extends PlayerEventsEmitter {
5632
6393
  const start = performance.now();
5633
6394
  __privateSet(this, _lagMonitorTimeout, setTimeout(() => {
5634
6395
  __privateSet(this, _lastLatency, performance.now() - start);
5635
- if (this.hasDebugger) this.debug(`[Lag Monitor] Event loop latency: ${__privateGet(this, _lastLatency)}ms`);
6396
+ if (this.hasDebugger)
6397
+ this.debug(
6398
+ `[Lag Monitor] Event loop latency: ${__privateGet(this, _lastLatency)}ms`
6399
+ );
5636
6400
  }, 0).unref());
5637
6401
  }, this.options.lagMonitor).unref());
5638
6402
  }
@@ -5750,7 +6514,12 @@ var _Player = class _Player extends PlayerEventsEmitter {
5750
6514
  _handleVoiceState(oldState, newState) {
5751
6515
  const queue = this.nodes.get(oldState.guild.id);
5752
6516
  if (!queue || !queue.connection || !queue.channel) return;
5753
- const wasHandled = this.events.emit(GuildQueueEvent.VoiceStateUpdate, queue, oldState, newState);
6517
+ const wasHandled = this.events.emit(
6518
+ GuildQueueEvent.VoiceStateUpdate,
6519
+ queue,
6520
+ oldState,
6521
+ newState
6522
+ );
5754
6523
  if (wasHandled && !this.options.lockVoiceStateHandler) return;
5755
6524
  return __privateGet(this, _onVoiceStateUpdate).call(this, this, queue, oldState, newState);
5756
6525
  }
@@ -5809,19 +6578,28 @@ var _Player = class _Player extends PlayerEventsEmitter {
5809
6578
  async play(channel, query, options = {}) {
5810
6579
  const vc = this.client.channels.resolve(channel);
5811
6580
  if (!vc?.isVoiceBased())
5812
- throw new InvalidArgTypeError("channel", "VoiceBasedChannel", !vc ? "undefined" : `channel type ${vc.type}`);
6581
+ throw new InvalidArgTypeError(
6582
+ "channel",
6583
+ "VoiceBasedChannel",
6584
+ !vc ? "undefined" : `channel type ${vc.type}`
6585
+ );
5813
6586
  const originalResult = query instanceof SearchResult ? query : await this.search(query, options);
5814
6587
  const result = await options.afterSearch?.(originalResult) || originalResult;
5815
6588
  if (result.isEmpty()) {
5816
- throw new NoResultError(`No results found for "${query}" (Extractor: ${result.extractor?.identifier || "N/A"})`);
6589
+ throw new NoResultError(
6590
+ `No results found for "${query}" (Extractor: ${result.extractor?.identifier || "N/A"})`
6591
+ );
5817
6592
  }
5818
6593
  const queue = this.nodes.create(vc.guild, options.nodeOptions);
5819
6594
  if (this.hasDebugger) this.debug(`[AsyncQueue] Acquiring an entry...`);
5820
6595
  const entry = queue.tasksQueue.acquire({ signal: options.signal });
5821
- if (this.hasDebugger) this.debug(`[AsyncQueue] Entry ${entry.id} was acquired successfully!`);
5822
- if (this.hasDebugger) this.debug(`[AsyncQueue] Waiting for the queue to resolve...`);
6596
+ if (this.hasDebugger)
6597
+ this.debug(`[AsyncQueue] Entry ${entry.id} was acquired successfully!`);
6598
+ if (this.hasDebugger)
6599
+ this.debug(`[AsyncQueue] Waiting for the queue to resolve...`);
5823
6600
  await entry.getTask();
5824
- if (this.hasDebugger) this.debug(`[AsyncQueue] Entry ${entry.id} was resolved!`);
6601
+ if (this.hasDebugger)
6602
+ this.debug(`[AsyncQueue] Entry ${entry.id} was resolved!`);
5825
6603
  try {
5826
6604
  if (!queue.channel) await queue.connect(vc, options.connectionOptions);
5827
6605
  if (!result.playlist) {
@@ -5829,9 +6607,11 @@ var _Player = class _Player extends PlayerEventsEmitter {
5829
6607
  } else {
5830
6608
  queue.addTrack(result.playlist);
5831
6609
  }
5832
- if (!queue.isPlaying()) await queue.node.play(null, options.audioPlayerOptions);
6610
+ if (!queue.isPlaying())
6611
+ await queue.node.play(null, options.audioPlayerOptions);
5833
6612
  } finally {
5834
- if (this.hasDebugger) this.debug(`[AsyncQueue] Releasing an entry from the queue...`);
6613
+ if (this.hasDebugger)
6614
+ this.debug(`[AsyncQueue] Releasing an entry from the queue...`);
5835
6615
  queue.tasksQueue.release();
5836
6616
  }
5837
6617
  return {
@@ -5858,7 +6638,8 @@ var _Player = class _Player extends PlayerEventsEmitter {
5858
6638
  if (searchQuery instanceof import_discord_voip5.AudioResource) {
5859
6639
  searchQuery = this.createTrackFromAudioResource(searchQuery);
5860
6640
  }
5861
- if (options.requestedBy != null) options.requestedBy = this.client.users.resolve(options.requestedBy);
6641
+ if (options.requestedBy != null)
6642
+ options.requestedBy = this.client.users.resolve(options.requestedBy);
5862
6643
  options.blockExtractors ?? (options.blockExtractors = this.options.blockExtractors);
5863
6644
  options.fallbackSearchEngine ?? (options.fallbackSearchEngine = QueryType.AUTO_SEARCH);
5864
6645
  if (searchQuery instanceof Track) {
@@ -5902,13 +6683,16 @@ var _Player = class _Player extends PlayerEventsEmitter {
5902
6683
  );
5903
6684
  if (/^\w+:/.test(searchQuery)) {
5904
6685
  const [protocolName, ...query2] = searchQuery.split(":");
5905
- if (this.hasDebugger) this.debug(`Protocol ${protocolName} detected in query`);
6686
+ if (this.hasDebugger)
6687
+ this.debug(`Protocol ${protocolName} detected in query`);
5906
6688
  const matchingExtractor = this.extractors.store.find(
5907
6689
  (e) => !this.extractors.isDisabled(e.identifier) && e.protocols.includes(protocolName)
5908
6690
  );
5909
6691
  if (matchingExtractor) {
5910
6692
  if (this.hasDebugger)
5911
- this.debug(`Protocol ${protocolName} is supported by ${matchingExtractor.identifier} extractor!`);
6693
+ this.debug(
6694
+ `Protocol ${protocolName} is supported by ${matchingExtractor.identifier} extractor!`
6695
+ );
5912
6696
  extractor = matchingExtractor;
5913
6697
  searchQuery = query2.join(":");
5914
6698
  protocol = protocolName;
@@ -5926,7 +6710,8 @@ var _Player = class _Player extends PlayerEventsEmitter {
5926
6710
  `Query type identified as ${queryType}${extractor && protocol ? " but might not be used due to the presence of protocol" : ""}`
5927
6711
  );
5928
6712
  if (options.searchEngine.startsWith("ext:")) {
5929
- if (this.hasDebugger) this.debug(`Forcing ${options.searchEngine.substring(4)} extractor...`);
6713
+ if (this.hasDebugger)
6714
+ this.debug(`Forcing ${options.searchEngine.substring(4)} extractor...`);
5930
6715
  extractor = this.extractors.get(options.searchEngine.substring(4));
5931
6716
  if (!extractor)
5932
6717
  return new SearchResult(this, {
@@ -5964,7 +6749,10 @@ var _Player = class _Player extends PlayerEventsEmitter {
5964
6749
  requestedBy: options.requestedBy
5965
6750
  });
5966
6751
  }
5967
- if (this.hasDebugger) this.debug(`Executing metadata query using ${extractor.identifier} extractor...`);
6752
+ if (this.hasDebugger)
6753
+ this.debug(
6754
+ `Executing metadata query using ${extractor.identifier} extractor...`
6755
+ );
5968
6756
  const res = await extractor.handle(query, {
5969
6757
  type: queryType,
5970
6758
  requestedBy: options.requestedBy,
@@ -5987,7 +6775,10 @@ var _Player = class _Player extends PlayerEventsEmitter {
5987
6775
  }
5988
6776
  return result2;
5989
6777
  }
5990
- if (this.hasDebugger) this.debug("Failed to find result using appropriate extractor. Querying all extractors...");
6778
+ if (this.hasDebugger)
6779
+ this.debug(
6780
+ "Failed to find result using appropriate extractor. Querying all extractors..."
6781
+ );
5991
6782
  const result = await this.extractors.run(
5992
6783
  async (ext) => !options.blockExtractors?.includes(ext.identifier) && await ext.validate(query) && ext.handle(query, {
5993
6784
  type: queryType,
@@ -5998,7 +6789,9 @@ var _Player = class _Player extends PlayerEventsEmitter {
5998
6789
  );
5999
6790
  if (!result?.result) {
6000
6791
  if (this.hasDebugger)
6001
- this.debug(`Failed to query metadata query using ${result?.extractor.identifier || "N/A"} extractor.`);
6792
+ this.debug(
6793
+ `Failed to query metadata query using ${result?.extractor.identifier || "N/A"} extractor.`
6794
+ );
6002
6795
  return new SearchResult(this, {
6003
6796
  query,
6004
6797
  queryType,
@@ -6006,7 +6799,10 @@ var _Player = class _Player extends PlayerEventsEmitter {
6006
6799
  extractor: result?.extractor
6007
6800
  });
6008
6801
  }
6009
- if (this.hasDebugger) this.debug(`Metadata query was successful using ${result.extractor.identifier}!`);
6802
+ if (this.hasDebugger)
6803
+ this.debug(
6804
+ `Metadata query was successful using ${result.extractor.identifier}!`
6805
+ );
6010
6806
  const data = new SearchResult(this, {
6011
6807
  query,
6012
6808
  queryType,
@@ -6075,7 +6871,7 @@ var _Player = class _Player extends PlayerEventsEmitter {
6075
6871
  * @param resource The audio resource
6076
6872
  */
6077
6873
  createTrackFromAudioResource(resource) {
6078
- const metadata = resource.metadata;
6874
+ const metadata = resource.metadata || {};
6079
6875
  const ref = import_discord5.SnowflakeUtil.generate().toString();
6080
6876
  const maybeTitle = "title" in metadata ? `${metadata.title}` : `Track ${ref}`;
6081
6877
  const maybeAuthor = "author" in metadata ? `${metadata.author}` : "Unknown author";
@@ -6101,6 +6897,25 @@ var _Player = class _Player extends PlayerEventsEmitter {
6101
6897
  track.setResource(resource);
6102
6898
  return track;
6103
6899
  }
6900
+ /**
6901
+ * Handles intercepting streams
6902
+ * @param stream The stream to intercept
6903
+ */
6904
+ async handleInterceptingStream(queue, track, format, stream) {
6905
+ if (!__privateGet(this, _streamInterceptor)) return;
6906
+ return __privateGet(this, _streamInterceptor).handle(queue, track, format, stream);
6907
+ }
6908
+ /**
6909
+ * Creates a global stream interceptor
6910
+ * @param options The stream interceptor options
6911
+ */
6912
+ createStreamInterceptor(options) {
6913
+ if (__privateGet(this, _streamInterceptor)) {
6914
+ return __privateGet(this, _streamInterceptor);
6915
+ }
6916
+ __privateSet(this, _streamInterceptor, new PlayerStreamInterceptor(this, options));
6917
+ return __privateGet(this, _streamInterceptor);
6918
+ }
6104
6919
  };
6105
6920
  _lastLatency = new WeakMap();
6106
6921
  _voiceStateUpdateListener = new WeakMap();
@@ -6108,6 +6923,7 @@ _lagMonitorTimeout = new WeakMap();
6108
6923
  _lagMonitorInterval = new WeakMap();
6109
6924
  _onVoiceStateUpdate = new WeakMap();
6110
6925
  _hooksCtx = new WeakMap();
6926
+ _streamInterceptor = new WeakMap();
6111
6927
  __name(_Player, "Player");
6112
6928
  /**
6113
6929
  * The version of discord-player
@@ -6147,11 +6963,13 @@ var import_discord_voip6 = require("discord-voip");
6147
6963
  GuildQueueHistory,
6148
6964
  GuildQueuePlayerNode,
6149
6965
  GuildQueueStatistics,
6966
+ InterceptedStream,
6150
6967
  LrcLib,
6151
6968
  PCMAudioFilters,
6152
6969
  Player,
6153
6970
  PlayerEvent,
6154
6971
  PlayerEventsEmitter,
6972
+ PlayerStreamInterceptor,
6155
6973
  Playlist,
6156
6974
  Q_BUTTERWORTH,
6157
6975
  QueryCache,
@@ -6162,6 +6980,7 @@ var import_discord_voip6 = require("discord-voip");
6162
6980
  SequentialBucket,
6163
6981
  SerializedType,
6164
6982
  StreamDispatcher,
6983
+ StreamType,
6165
6984
  Track,
6166
6985
  TrackSkipReason,
6167
6986
  TypeUtil,
@@ -6170,6 +6989,7 @@ var import_discord_voip6 = require("discord-voip");
6170
6989
  VoiceUtils,
6171
6990
  VolumeTransformer,
6172
6991
  createAudioPlayer,
6992
+ createAudioResource,
6173
6993
  createContext,
6174
6994
  createErisCompat,
6175
6995
  createFFmpegStream,
@@ -6195,4 +7015,4 @@ var import_discord_voip6 = require("discord-voip");
6195
7015
  version,
6196
7016
  ...require("@discord-player/ffmpeg")
6197
7017
  });
6198
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXIudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvci50cyIsICIuLi9zcmMvZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LnRzIiwgIi4uL3NyYy9ob29rcy9jb250ZXh0L2FzeW5jLWNvbnRleHQudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9fY29udGFpbmVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vZ2V0R2xvYmFsUmVnaXN0cnkudHMiLCAiLi4vc3JjL2hvb2tzL2NvbW1vbi50cyIsICIuLi9zcmMvaG9va3MvdXNlSGlzdG9yeS50cyIsICIuLi9zcmMvaG9va3MvdXNlUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VRdWV1ZS50cyIsICIuLi9zcmMvaG9va3MvdXNlTWFpblBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlTWV0YWRhdGEudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVRpbWVsaW5lLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25BZnRlckNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQmVmb3JlQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy91c2VWb2x1bWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkTm9kZU1hbmFnZXIudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWUudHMiLCAiLi4vc3JjL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVBsYXllck5vZGUudHMiLCAiLi4vc3JjL3V0aWxzL0FzeW5jUXVldWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3F1ZXVlL1N5bmNlZEx5cmljc1Byb3ZpZGVyLnRzIiwgIi4uL3NyYy91dGlscy9TZXF1ZW50aWFsQnVja2V0LnRzIiwgIi4uL3NyYy9scmNsaWIvTHJjTGliLnRzIiwgIi4uL3NyYy9zdHJlYW0vVm9pY2VVdGlscy50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlDYWNoZS50cyIsICIuLi9zcmMvUGxheWVyLnRzIiwgIi4uL3NyYy9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIudHMiLCAiLi4vc3JjL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudHMiLCAiLi4vc3JjL3ZlcnNpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IGNyZWF0ZUVyaXNDb21wYXQsIGlzRXJpc1Byb3h5IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWJyaWMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWV1ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xyY2xpYi9McmNMaWInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL1ZvaWNlVXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UeXBlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0FzeW5jUXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyJztcbmV4cG9ydCAqIGZyb20gJy4vaG9va3MnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zZXJkZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuZXhwb3J0IHtcbiAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgdHlwZSBCaXF1YWRGaWx0ZXJzLFxuICBGaWx0ZXJUeXBlIGFzIEJpcXVhZEZpbHRlclR5cGUsXG4gIHR5cGUgUENNRmlsdGVycyxcbiAgUV9CVVRURVJXT1JUSCxcbiAgVm9sdW1lVHJhbnNmb3JtZXIsXG4gIEJBU1NfRVFfQkFORFMsXG4gIEFGX05JR0hUQ09SRV9SQVRFLFxuICBBRl9WQVBPUldBVkVfUkFURSxcbiAgRmlsdGVyc0NoYWluIH0gZnJvbVxuJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHtcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUGxheWVyLFxuICBnZXRWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbnMsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIHR5cGUgSm9pbkNvbmZpZyxcbiAgdHlwZSBKb2luVm9pY2VDaGFubmVsT3B0aW9ucyxcbiAgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMgfSBmcm9tXG4nZGlzY29yZC12b2lwJztcblxuZXhwb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7IENoYW5uZWxUeXBlLCBHYXRld2F5RGlzcGF0Y2hFdmVudHMgfSBmcm9tICdkaXNjb3JkLWFwaS10eXBlcy92MTAnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuXG5pbXBvcnQgdHlwZSB7IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHtcbiAgQ2xpZW50LFxuICBHYXRld2F5Vm9pY2VTZXJ2ZXJVcGRhdGVEaXNwYXRjaERhdGEsXG4gIEdhdGV3YXlWb2ljZVN0YXRlVXBkYXRlRGlzcGF0Y2hEYXRhLFxuICBWb2ljZVN0YXRlIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHR5cGUgRXJpcyBmcm9tICdlcmlzJztcblxudHlwZSBFcmlzVXNlclJlc29sdmFibGUgPSBFcmlzLlVzZXIgfCBzdHJpbmcgfCBFcmlzLk1lbWJlcjtcbnR5cGUgRXJpc0d1aWxkUmVzb2x2YWJsZSA9IEVyaXMuR3VpbGQgfCBzdHJpbmcgfCBFcmlzLk1lbWJlciB8IEVyaXMuR3VpbGRDaGFubmVsIHwgRXJpcy5Sb2xlO1xudHlwZSBFcmlzQ2hhbm5lbFJlc29sdmFibGUgPSBFcmlzLkd1aWxkQ2hhbm5lbCB8IHN0cmluZztcblxuY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDbGllbnRQcm94eShjbGllbnQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSAhPSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcGF0TmFtZShjbGllbnQ6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBSZWZsZWN0LmdldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wpID8/IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VyaXNQcm94eShjbGllbnQ6IGFueSk6IGNsaWVudCBpcyBFcmlzLkNsaWVudCB7XG4gIHJldHVybiBSZWZsZWN0LmdldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wpID09PSAnRXJpcyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VyaXNDbGllbnQoY2xpZW50OiBhbnkpOiBjbGllbnQgaXMgRXJpcy5DbGllbnQge1xuICBjb25zdCB7IG1vZHVsZSwgZXJyb3IgfSA9IFV0aWwucmVxdWlyZSgnZXJpcycpO1xuXG4gIGlmIChlcnJvcikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGVyaXMgPSBtb2R1bGUgYXMgdHlwZW9mIGltcG9ydCgnZXJpcycpO1xuXG4gIHJldHVybiBjbGllbnQgaW5zdGFuY2VvZiBlcmlzLkNsaWVudDtcbn1cblxuZnVuY3Rpb24gZGVjbGFyZVByb3BlcnR5KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eTxUPih0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpOiBUIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5KTtcbn1cblxuLyoqXG4gKiBBbGxvd3MgRXJpcyBjbGllbnRzIHRvIGJlIHVzZWQgd2l0aCBkaXNjb3JkLXBsYXllci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIGNyZWF0ZXMgYSBwcm94eSBvYmplY3QgdGhhdCBpbnRlcmNlcHRzIGNlcnRhaW4gbWV0aG9kcyBhbmQgcHJvcGVydGllcyB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBkaXNjb3JkLXBsYXllci5cbiAqIEBwYXJhbSBjbGllbnQgVGhlIEVyaXMgY2xpZW50IHRvIGJlIHVzZWQuXG4gKiBAcmV0dXJucyBUaGUgRXJpcyBjbGllbnQgd2l0aCBkaXNjb3JkLXBsYXllciBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXJpc0NvbXBhdChjbGllbnQ6IEVyaXMuQ2xpZW50KTogQ2xpZW50IHtcbiAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ2VyaXMnKTtcblxuICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuXG4gIGNvbnN0IGVyaXMgPSBtb2R1bGUgYXMgdHlwZW9mIGltcG9ydCgnZXJpcycpO1xuXG4gIGVyaXNWb2ljZUV2ZW50c0hhbmRsZXIoY2xpZW50KTtcblxuICBjb25zdCBlcmlzUHJveHkgPSBuZXcgUHJveHkoY2xpZW50LCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgc3dpdGNoIChwKSB7XG4gICAgICAgIGNhc2UgJ3VzZXJzJzpcbiAgICAgICAgICByZXR1cm4gZXJpc1VzZXJzUHJveHkodGFyZ2V0LCBlcmlzKTtcbiAgICAgICAgY2FzZSAnZ3VpbGRzJzpcbiAgICAgICAgICByZXR1cm4gZXJpc0d1aWxkc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ2NoYW5uZWxzJzpcbiAgICAgICAgICByZXR1cm4gZXJpc0NoYW5uZWxzUHJveHkodGFyZ2V0LCBlcmlzKTtcbiAgICAgICAgY2FzZSAnX19kcF92b2ljZVN0YXRlVXBkYXRlX3Byb3h5JzpcbiAgICAgICAgICByZXR1cm4gKGhhbmRsZXI6IChhLCBiKSA9PiB2b2lkKSA9PiBlcmlzVm9pY2VTdGF0ZVVwZGF0ZVByb3h5KHRhcmdldCwgZXJpc1Byb3h5LCBoYW5kbGVyKTtcbiAgICAgICAgY2FzZSAnaW5jcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgKyAxKTtcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdkZWNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgLSAxO1xuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGxpc3RlbmVycyA8IDAgPyAxIDogbGlzdGVuZXJzKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgUmVmbGVjdC5zZXQoZXJpc1Byb3h5LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sLCAnRXJpcycpO1xuXG4gIHJldHVybiBlcmlzUHJveHkgYXMgdW5rbm93biBhcyBDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZVN0YXRlVXBkYXRlUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgcHJveHk6IEVyaXMuQ2xpZW50LCBoYW5kbGVyOiAoYSwgYikgPT4gdm9pZCkge1xuICBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAobWVtYmVyLCBvbGRTdGF0ZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm94aWVkT2xkU3RhdGUgPSB7XG4gICAgICAgIGNoYW5uZWxJZDogb2xkU3RhdGUuY2hhbm5lbElELFxuICAgICAgICBzZXJ2ZXJNdXRlOiBvbGRTdGF0ZS5tdXRlLFxuICAgICAgICBzdXBwcmVzczogb2xkU3RhdGUuc3VwcHJlc3MsXG4gICAgICAgIGd1aWxkOiB7XG4gICAgICAgICAgaWQ6IG9sZFN0YXRlLmd1aWxkLmlkXG4gICAgICAgIH0sXG4gICAgICAgIG1lbWJlcjoge1xuICAgICAgICAgIGlkOiBvbGRTdGF0ZS51c2VyLmlkXG4gICAgICAgIH1cbiAgICAgIH0gYXMgVm9pY2VTdGF0ZTtcblxuICAgICAgY29uc3QgbWUgPSBtZW1iZXIuZ3VpbGQubWVtYmVycy5nZXQoY2xpZW50LnVzZXIuaWQpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRDaGFubmVsID0gbWVtYmVyLmd1aWxkLmNoYW5uZWxzLmdldChtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSUQpO1xuXG4gICAgICBjb25zdCBwcm94aWVkTmV3U3RhdGUgPSB7XG4gICAgICAgIGNoYW5uZWxJZDogbWVtYmVyLnZvaWNlU3RhdGUuY2hhbm5lbElELFxuICAgICAgICBzZXJ2ZXJNdXRlOiBtZW1iZXIudm9pY2VTdGF0ZS5tdXRlLFxuICAgICAgICBzdXBwcmVzczogbWVtYmVyLnZvaWNlU3RhdGUuc3VwcHJlc3MsXG4gICAgICAgIGNoYW5uZWw6IGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShyZXNvbHZlZENoYW5uZWwsIGNsaWVudCksXG4gICAgICAgIG1lbWJlcjoge1xuICAgICAgICAgIGlkOiBtZW1iZXIuaWRcbiAgICAgICAgfSxcbiAgICAgICAgZ3VpbGQ6IHtcbiAgICAgICAgICBpZDogbWVtYmVyLmd1aWxkLmlkLFxuICAgICAgICAgIG1lbWJlcnM6IHtcbiAgICAgICAgICAgIG1lOiB7XG4gICAgICAgICAgICAgIGlkOiBtZT8uaWQsXG4gICAgICAgICAgICAgIHZvaWNlOiB7XG4gICAgICAgICAgICAgICAgYXN5bmMgc2V0UmVxdWVzdFRvU3BlYWsodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICAgIHZvaWQgdmFsdWU7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbWU/LnZvaWNlU3RhdGU7XG4gICAgICAgICAgICAgICAgICAvLyBpZiAobWUpIHtcbiAgICAgICAgICAgICAgICAgIC8vICAgcmV0dXJuIG1lLnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gYXMgVm9pY2VTdGF0ZTtcblxuICAgICAgcmV0dXJuIGhhbmRsZXIocHJveGllZE5ld1N0YXRlLCBwcm94aWVkT2xkU3RhdGUpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvKiBub29wICovfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlRXZlbnRzSGFuZGxlcihjbGllbnQ6IEVyaXMuQ2xpZW50KSB7XG4gIGxldCBhZGFwdGVycyA9IGdldFByb3BlcnR5PE1hcDxzdHJpbmcsIGFueT4+KGNsaWVudCwgJ2FkYXB0ZXJzJyk7XG5cbiAgaWYgKCFhZGFwdGVycykge1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGFkYXB0ZXJzID0gY29sbGVjdGlvbjtcbiAgICBkZWNsYXJlUHJvcGVydHkoY2xpZW50LCAnYWRhcHRlcnMnLCBjb2xsZWN0aW9uKTtcbiAgfVxuXG4gIGNsaWVudC5vbignc2hhcmREaXNjb25uZWN0JywgKF8sIHNoYXJkSWQpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtndWlsZElkLCBhZGFwdGVyXSBvZiBhZGFwdGVycy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChjbGllbnQuZ3VpbGRzLmdldChndWlsZElkKT8uc2hhcmQuaWQgPT09IHNoYXJkSWQpIHtcbiAgICAgICAgYWRhcHRlci5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBjbGllbnQub24oJ3Jhd1dTJywgKHBhY2tldCkgPT4ge1xuICAgIHN3aXRjaCAocGFja2V0LnQpIHtcbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU2VydmVyVXBkYXRlOntcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU2VydmVyVXBkYXRlRGlzcGF0Y2hEYXRhO1xuICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVNlcnZlclVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGU6e1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YTtcblxuICAgICAgICAgIGlmIChwYXlsb2FkLmd1aWxkX2lkICYmIHBheWxvYWQuc2Vzc2lvbl9pZCAmJiBwYXlsb2FkLnVzZXJfaWQgPT09IGNsaWVudC51c2VyLmlkKSB7XG4gICAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTdGF0ZVVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNDaGFubmVsc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICBjb25zdCBoYW5kbGVyID0ge1xuICAgIGNsaWVudCxcbiAgICBnZXQgY2FjaGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZXQoaWQ6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBjbGllbnQuZ2V0Q2hhbm5lbChpZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhcyhpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGlkIGluIGNsaWVudC5jaGFubmVsR3VpbGRNYXA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICByZXNvbHZlKHJlc29sdmFibGU6IHN0cmluZyB8IEVyaXNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHRoaXMuY2xpZW50LmdldENoYW5uZWwocmVzb2x2YWJsZSkgYXMgRXJpcy5HdWlsZENoYW5uZWwsIGNsaWVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZENoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShyZXNvbHZhYmxlLCBjbGllbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzb2x2ZUlkKHJlc29sdmFibGU6IEVyaXNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucmVzb2x2ZShyZXNvbHZhYmxlKTtcbiAgICAgIHJldHVybiBjaGFubmVsPy5pZDtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShcbmNoYW5uZWw6IEVyaXMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkLFxuY2xpZW50OiBFcmlzLkNsaWVudClcbjogRXJpcy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNoYW5uZWwpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGNoYW5uZWwsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAnZ3VpbGQnOlxuICAgICAgICAgIHJldHVybiBlcmlzVm9pY2VBZGFwdGVyUHJveHkodGFyZ2V0Lmd1aWxkLCBjbGllbnQpO1xuICAgICAgICBjYXNlICdtZW1iZXJzJzpcbiAgICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBFcmlzLlZvaWNlQ2hhbm5lbCkudm9pY2VNZW1iZXJzO1xuICAgICAgICBjYXNlICdpc1ZvaWNlQmFzZWQnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZSB8fCB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBjYXNlICdpc1ZvaWNlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2U7XG4gICAgICAgIGNhc2UgJ2lzU3RhZ2UnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJQcm94eShndWlsZDogRXJpcy5HdWlsZCB8IHVuZGVmaW5lZCwgY2xpZW50OiBFcmlzLkNsaWVudCk6IEVyaXMuR3VpbGQgfCB1bmRlZmluZWQge1xuICBpZiAoIWd1aWxkKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm94eShndWlsZCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAndm9pY2VBZGFwdGVyQ3JlYXRvcicpIHtcbiAgICAgICAgcmV0dXJuIGVyaXNWb2ljZUFkYXB0ZXJDcmVhdG9yKHRhcmdldCwgY2xpZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VBZGFwdGVyQ3JlYXRvcihndWlsZDogRXJpcy5HdWlsZCwgY2xpZW50OiBFcmlzLkNsaWVudCk6IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3Ige1xuICByZXR1cm4gKG1ldGhvZHMpID0+IHtcbiAgICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCB0eXBlb2YgbWV0aG9kcz4+KGNsaWVudCwgJ2FkYXB0ZXJzJyk7XG5cbiAgICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPigpO1xuICAgICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgYWRhcHRlcnMuc2V0KGd1aWxkLmlkLCBtZXRob2RzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZW5kUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgIGlmIChndWlsZC5zaGFyZC5zdGF0dXMgIT09ICdyZWFkeScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZ3VpbGQuc2hhcmQuc2VuZFdTKHBheWxvYWQub3AsIHBheWxvYWQuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGFkYXB0ZXJzLmRlbGV0ZShndWlsZC5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXJpc0d1aWxkc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC5ndWlsZHMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLlJvbGUpXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1VzZXJzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gIHJldHVybiBuZXcgUHJveHkoY2xpZW50LnVzZXJzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzVXNlclJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuVXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLk1lbWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUudXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiB1c2VyPy5pZDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufSIsICJpbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2ssIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IE91dE9mU3BhY2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICBjcmVhdGVGaWx0ZXIsXG4gIGNyZWF0ZVNwb3RpZnlGaWx0ZXIsXG4gIGZpeFRyYWNrU3VmZml4LFxuICByZW1vdmVMaXZlLFxuICByZW1vdmVSZW1hc3RlcmVkLFxuICB5b3V0dWJlLFxuICByZW1vdmVaZXJvV2lkdGgsXG4gIHJlcGxhY2VOYnNwLFxuICByZXBsYWNlU21hcnRRdW90ZXMsXG4gIHJlbW92ZUNsZWFuRXhwbGljaXQgfSBmcm9tXG4nQHdlYi1zY3JvYmJsZXIvbWV0YWRhdGEtZmlsdGVyJztcblxuZXhwb3J0IHR5cGUgUnVudGltZVR5cGUgPSAnbm9kZScgfCAnZGVubycgfCAnYnVuJyB8ICd1bmtub3duJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gIC8qKlxuICAgKiBUaW1lIGluIGRheXNcbiAgICovXG4gIGRheXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gaG91cnNcbiAgICovXG4gIGhvdXJzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbnV0ZXNcbiAgICovXG4gIG1pbnV0ZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gc2Vjb25kc1xuICAgKi9cbiAgc2Vjb25kczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWUge1xuICBuYW1lOiBSdW50aW1lVHlwZTtcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jbGFzcyBVdGlsIHtcbiAgLyoqXG4gICAqIFV0aWxzXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAvKipcbiAgICogR2V0cyB0aGUgcnVudGltZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgc3RhdGljIGdldFJ1bnRpbWUoKTogUnVudGltZSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6IG51bGw7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJyAmJiBEZW5vLnZlcnNpb24pIHJldHVybiB7IG5hbWU6ICdkZW5vJywgdmVyc2lvbjogRGVuby52ZXJzaW9uLmRlbm8gfTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIEJ1biAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVuLnZlcnNpb24pIHJldHVybiB7IG5hbWU6ICdidW4nLCB2ZXJzaW9uOiBCdW4udmVyc2lvbiB9O1xuXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnZlcnNpb24pIHJldHVybiB7IG5hbWU6ICdub2RlJywgdmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uIH07XG5cbiAgICByZXR1cm4geyBuYW1lOiAndW5rbm93bicsIHZlcnNpb246IHZlcnNpb24gPz8gJ3Vua25vd24nIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICogQHBhcmFtIHtvYmplY3R9IGR1ck9iaiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZHVyYXRpb25TdHJpbmcoZHVyT2JqOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKS5cbiAgICBtYXAoKG0pID0+IGlzTmFOKG0pID8gMCA6IG0pLlxuICAgIGpvaW4oJzonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyBUaGUgdGltZSBpbiBtc1xuICAgKiBAcmV0dXJucyB7VGltZURhdGF9XG4gICAqL1xuICBzdGF0aWMgcGFyc2VNUyhtaWxsaXNlY29uZHM6IG51bWJlcikge1xuICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgIGNvbnN0IHJvdW5kID0gbWlsbGlzZWNvbmRzID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF5czogcm91bmQobWlsbGlzZWNvbmRzIC8gODY0MDAwMDApLFxuICAgICAgaG91cnM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDM2MDAwMDApICUgMjQsXG4gICAgICBtaW51dGVzOiByb3VuZChtaWxsaXNlY29uZHMgLyA2MDAwMCkgJSA2MCxcbiAgICAgIHNlY29uZHM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjBcbiAgICB9IGFzIFRpbWVEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICogQHBhcmFtIHtUaW1lRGF0YX0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGJ1aWxkVGltZUNvZGUoZHVyYXRpb246IFRpbWVEYXRhKSB7XG4gICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgY29uc3QgcmVxdWlyZWQgPSBbJ2RheXMnLCAnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ107XG5cbiAgICBjb25zdCBwYXJzZWQgPSBpdGVtcy5maWx0ZXIoKHgpID0+IHJlcXVpcmVkLmluY2x1ZGVzKHgpKS5tYXAoKG0pID0+IGR1cmF0aW9uW20gYXMga2V5b2YgVGltZURhdGFdKTtcbiAgICBjb25zdCBmaW5hbCA9IHBhcnNlZC5cbiAgICBzbGljZShwYXJzZWQuZmluZEluZGV4KCh4KSA9PiB4ICE9PSAwKSkuXG4gICAgbWFwKCh4KSA9PiB4LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSkuXG4gICAgam9pbignOicpO1xuXG4gICAgcmV0dXJuIGZpbmFsLmxlbmd0aCA8PSAzID8gYDA6JHtmaW5hbC5wYWRTdGFydCgyLCAnMCcpIHx8IDB9YCA6IGZpbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgZHVyYXRpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBtc1xuICAgKi9cbiAgc3RhdGljIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFRpbWVDb2RlKHRoaXMucGFyc2VNUyhkdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tzIGxhc3QgaXRlbSBvZiB0aGUgZ2l2ZW4gYXJyYXlcbiAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgc3RhdGljIGxhc3Q8VCA9IGFueT4oYXJyOiBUW10pOiBUIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICByZXR1cm4gY2hhbm5lbCAmJiBjaGFubmVsLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+ICFtZW1iZXIudXNlci5ib3QpLnNpemUgPT09IDA7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHRoZSB0cmFjayB0aXRsZVxuICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZVxuICAgKiBAcmV0dXJucyBDbGVhbmVkIHRpdGxlXG4gICAqL1xuICBzdGF0aWMgY2xlYW5UaXRsZSh0aXRsZTogc3RyaW5nLCBzb3VyY2U6IFRyYWNrU291cmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbHRlck9wdHMgPSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0cmFjazogW1xuICAgICAgICByZW1vdmVSZW1hc3RlcmVkLFxuICAgICAgICByZW1vdmVMaXZlLFxuICAgICAgICBmaXhUcmFja1N1ZmZpeCxcbiAgICAgICAgcmVtb3ZlWmVyb1dpZHRoLFxuICAgICAgICByZXBsYWNlTmJzcCxcbiAgICAgICAgcmVwbGFjZVNtYXJ0UXVvdGVzLFxuICAgICAgICByZW1vdmVDbGVhbkV4cGxpY2l0XVxuXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3BvdGlmeUZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcbiAgICAgIHNwb3RpZnlGaWx0ZXIuZXh0ZW5kKGNyZWF0ZVNwb3RpZnlGaWx0ZXIoKSk7XG4gICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gY3JlYXRlRmlsdGVyKGZpbHRlck9wdHMpO1xuXG4gICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICBjYXNlICd5b3V0dWJlJzpcbiAgICAgICAgICByZXR1cm4geW91dHViZSh0aXRsZSk7XG4gICAgICAgIGNhc2UgJ3Nwb3RpZnknOlxuICAgICAgICAgIHJldHVybiBzcG90aWZ5RmlsdGVyLmZpbHRlckZpZWxkKCd0cmFjaycsIHRpdGxlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdEZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGl0bGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhZmVyIHJlcXVpcmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIE5vZGUgcmVxdWlyZSBpZFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgc3RhdGljIHJlcXVpcmUoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChpZCk7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG1vZCwgZXJyb3I6IG51bGwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBUaGUgdGltZSBpbiBtcyB0byB3YWl0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKi9cbiAgc3RhdGljIHdhaXQodGltZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gIH1cblxuICBzdGF0aWMgbm9vcCgpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgIGlmICgnZmV0Y2gnIGluIGdsb2JhbFRoaXMpIHJldHVybiBnbG9iYWxUaGlzLmZldGNoO1xuICAgIGZvciAoY29uc3QgbGliIG9mIFsnbm9kZS1mZXRjaCcsICd1bmRpY2knXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGltcG9ydChsaWIpLnRoZW4oKHJlcykgPT4gcmVzLmZldGNoIHx8IHJlcy5kZWZhdWx0Py5mZXRjaCB8fCByZXMuZGVmYXVsdCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICBjb25zdCByZXMgPSByZXF1aXJlKGxpYik7XG4gICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgIH0gY2F0Y2gge1xuXG4gICAgICAgICAgLy8gbm8/XG4gICAgICAgIH19XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBjb2RlID0gJ0RlcHJlY2F0aW9uV2FybmluZycsIGRldGFpbD86IHN0cmluZykge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobWVzc2FnZSwge1xuICAgICAgY29kZSxcbiAgICAgIGRldGFpbFxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHJhbmRvbUNob2ljZTxUPihzcmM6IFRbXSk6IFQge1xuICAgIHJldHVybiBzcmNbcmFuZG9tSW50KHNyYy5sZW5ndGgpXTtcbiAgfVxuXG4gIHN0YXRpYyBhcnJheUNsb25lU2h1ZmZsZTxUPihzcmM6IFRbXSk6IFRbXSB7XG4gICAgY29uc3QgYXJyID0gc3JjLnNsaWNlKCk7XG5cbiAgICBsZXQgbSA9IGFyci5sZW5ndGg7XG5cbiAgICB3aGlsZSAobSkge1xuICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG0tLSk7XG4gICAgICBbYXJyW21dLCBhcnJbaV1dID0gW2FycltpXSwgYXJyW21dXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBWQUxJREFURV9RVUVVRV9DQVAgPSAocXVldWU6IEd1aWxkUXVldWUsIGl0ZW1zOiBQbGF5bGlzdCB8IFRyYWNrIHwgVHJhY2tbXSkgPT4ge1xuICBjb25zdCB0cmFja3MgPSBpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gaXRlbXMudHJhY2tzIDogQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtpdGVtc107XG5cbiAgaWYgKHF1ZXVlLm1heFNpemUgPCAxIHx8IHF1ZXVlLm1heFNpemUgPT09IEluZmluaXR5KSByZXR1cm47XG5cbiAgY29uc3QgbWF4Q2FwID0gcXVldWUuZ2V0Q2FwYWNpdHkoKTtcblxuICBpZiAobWF4Q2FwIDwgdHJhY2tzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXJyb3IoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzLmxlbmd0aCk7XG4gIH1cbn07XG5cbmV4cG9ydCB7IFV0aWwgfTsiLCAiaW1wb3J0IHsgVXNlciwgZXNjYXBlTWFya2Rvd24sIFNub3dmbGFrZVV0aWwsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgQVBJVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QsIFBsYXlsaXN0SlNPTiB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgU2VyaWFsaXplZFR5cGUsIHRyeUludG9UaHVtYm5haWxTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJkZSc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5cbmV4cG9ydCB0eXBlIFRyYWNrUmVzb2x2YWJsZSA9IFRyYWNrIHwgc3RyaW5nIHwgbnVtYmVyO1xuXG5leHBvcnQgdHlwZSBXaXRoTWV0YWRhdGE8VCBleHRlbmRzIG9iamVjdCwgTT4gPSBUICYge1xuICBtZXRhZGF0YTogTTtcbiAgcmVxdWVzdE1ldGFkYXRhKCk6IFByb21pc2U8TT47XG59O1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkVHJhY2sgPSBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT47XG5cbi8qKlxuICogVGhlIHRyYWNrIHNvdXJjZTpcbiAqIC0gc291bmRjbG91ZFxuICogLSB5b3V0dWJlXG4gKiAtIHNwb3RpZnlcbiAqIC0gYXBwbGVfbXVzaWNcbiAqIC0gYXJiaXRyYXJ5XG4gKi9cbmV4cG9ydCB0eXBlIFRyYWNrU291cmNlID0gJ3NvdW5kY2xvdWQnIHwgJ3lvdXR1YmUnIHwgJ3Nwb3RpZnknIHwgJ2FwcGxlX211c2ljJyB8ICdhcmJpdHJhcnknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhd1RyYWNrRGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIHZpZXdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICovXG4gIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3RcbiAgICovXG4gIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlXG4gICAqL1xuICBzb3VyY2U/OiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBlbmdpbmVcbiAgICovXG4gIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIC8qKlxuICAgKiBJZiB0aGlzIHRyYWNrIGlzIGxpdmVcbiAgICovXG4gIGxpdmU/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHJhdyBkYXRhXG4gICAqL1xuICByYXc/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAvKipcbiAgICogVGhlIHF1ZXJ5IHR5cGVcbiAgICovXG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZTtcbiAgLyoqXG4gICAqIFRoZSBzZXJpYWxpemVkIHRpdGxlXG4gICAqL1xuICBjbGVhblRpdGxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrSlNPTiB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIGR1cmF0aW9uTVM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB2aWV3c1xuICAgKi9cbiAgdmlld3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB1c2VyIGlkIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgKi9cbiAgcmVxdWVzdGVkQnk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gICAqL1xuICBwbGF5bGlzdD86IFBsYXlsaXN0SlNPTjtcbn1cblxuZXhwb3J0IGNsYXNzIFRyYWNrPFQgPSB1bmtub3duPiB7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIGF1dGhvcjogc3RyaW5nO1xuICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgcHVibGljIGR1cmF0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyB2aWV3czogbnVtYmVyO1xuICBwdWJsaWMgcmVxdWVzdGVkQnk6IFVzZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gIHB1YmxpYyBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgcmF3OiBhbnk7XG4gIHB1YmxpYyBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIHByaXZhdGUgX19tZXRhZGF0YTogVCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9fcmVxTWV0YWRhdGFGbjogKCkgPT4gUHJvbWlzZTxUIHwgbnVsbD47XG4gIHB1YmxpYyBjbGVhblRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBicmlkZ2VkRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBicmlkZ2VkVHJhY2s6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG5cbiAgI3Jlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBUcmFja1xuICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyLCBkYXRhOiBQYXJ0aWFsPFdpdGhNZXRhZGF0YTxSYXdUcmFja0RhdGEsIFQ+Pikge1xuICAgIHRoaXMudGl0bGUgPSBlc2NhcGVNYXJrZG93bihkYXRhLnRpdGxlID8/ICcnKTtcbiAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yID8/ICcnO1xuICAgIHRoaXMudXJsID0gZGF0YS51cmwgPz8gJyc7XG4gICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbCA/PyAnJztcbiAgICB0aGlzLmR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbiA/PyAnJztcbiAgICB0aGlzLnZpZXdzID0gZGF0YS52aWV3cyA/PyAwO1xuICAgIHRoaXMucXVlcnlUeXBlID0gZGF0YS5xdWVyeVR5cGU7XG4gICAgdGhpcy5yZXF1ZXN0ZWRCeSA9IGRhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICB0aGlzLnBsYXlsaXN0ID0gZGF0YS5wbGF5bGlzdDtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgIHRoaXMucmF3ID0gT2JqZWN0LmFzc2lnbih7fSwgeyBzb3VyY2U6IGRhdGEucmF3Py5zb3VyY2UgPz8gZGF0YS5zb3VyY2UgfSwgZGF0YS5yYXcgPz8gZGF0YSk7XG4gICAgdGhpcy5fX21ldGFkYXRhID0gZGF0YS5tZXRhZGF0YSA/PyBudWxsO1xuICAgIHRoaXMuX19yZXFNZXRhZGF0YUZuID0gZGF0YS5yZXF1ZXN0TWV0YWRhdGEgfHwgKCgpID0+IFByb21pc2UucmVzb2x2ZTxUIHwgbnVsbD4obnVsbCkpO1xuICAgIHRoaXMuY2xlYW5UaXRsZSA9IGRhdGEuY2xlYW5UaXRsZSA/PyBVdGlsLmNsZWFuVGl0bGUodGhpcy50aXRsZSwgdGhpcy5zb3VyY2UpO1xuICAgIHRoaXMubGl2ZSA9IGRhdGEubGl2ZSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGF1ZGlvIHJlc291cmNlIGZvciB0aGlzIHRyYWNrLiBUaGlzIGlzIG5vdCB1c2VmdWwgb3V0c2lkZSBvZiB0aGUgbGlicmFyeS5cbiAgICogQHBhcmFtIHJlc291cmNlIEF1ZGlvIHJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgc2V0UmVzb3VyY2UocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbCkge1xuICAgIHRoaXMuI3Jlc291cmNlID0gcmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhdWRpbyByZXNvdXJjZSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYWNrIGhhcyBhbiBhdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGdldCBoYXNSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2UgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdE1ldGFkYXRhKCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICB0aGlzLnNldE1ldGFkYXRhKHJlcyk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fX21ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzTWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGEgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcXVldWUgaW4gd2hpY2ggdGhpcyB0cmFjayBpcyBsb2NhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5maW5kKChxKSA9PiBxLnRyYWNrcy5zb21lKChhYikgPT4gYWIuaWQgPT09IHRoaXMuaWQpKSE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uTVMoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IHRuID0gMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmR1cmF0aW9uLlxuICAgIHNwbGl0KCc6JykuXG4gICAgcmV2ZXJzZSgpLlxuICAgIG1hcCgobSwgaSkgPT4gcGFyc2VJbnQobSkgKiB0aW1lcyg2MCwgaSkpLlxuICAgIHJlZHVjZSgoYSwgYykgPT4gYSArIGMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvcmQgaHlwZXJsaW5rIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b0h5cGVybGluaygpOiBzdHJpbmcgLyogbm90IHVzaW5nIGBbJHtzdHJpbmd9XSgke3N0cmluZ30pYCB5ZXQgKi8ge1xuICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3Py5zb3VyY2UgPz8gJ2FyYml0cmFyeSc7XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gIH1cblxuICAvKipcbiAgICogUmF3IEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvSlNPTihoaWRlUGxheWxpc3Q/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgIH0gYXMgVHJhY2tKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgdHJhY2sgZGF0YSB0aGF0IGNhbiBiZSByZWNvbnN0cnVjdGVkXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/IHRoaXMudGh1bWJuYWlsIDogdHJ5SW50b1RodW1ibmFpbFN0cmluZyh0aGlzLnRodW1ibmFpbCksXG4gICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgIHZpZXdzOiB0aGlzLnZpZXdzID8/IDAsXG4gICAgICByZXF1ZXN0ZWRfYnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpID8/IG51bGwsXG4gICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgbGl2ZTogZmFsc2UsXG4gICAgICBxdWVyeV90eXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIGV4dHJhY3RvcjogdGhpcy5leHRyYWN0b3I/LmlkZW50aWZpZXIgPz8gbnVsbCxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlRyYWNrLFxuICAgICAgJGVuY29kZXJfdmVyc2lvbjogdGhpcy5wbGF5ZXIudmVyc2lvblxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IGEgdHJhY2sgZnJvbSBzZXJpYWxpemVkIGRhdGFcbiAgICogQHBhcmFtIHBsYXllciBQbGF5ZXIgaW5zdGFuY2VcbiAgICogQHBhcmFtIGRhdGEgU2VyaWFsaXplZCBkYXRhXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21TZXJpYWxpemVkKHBsYXllcjogUGxheWVyLCBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pIHtcbiAgICBpZiAoZGF0YS4kdHlwZSAhPT0gU2VyaWFsaXplZFR5cGUuVHJhY2spIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdkYXRhJywgJ1NlcmlhbGl6ZWRUcmFjaycsICdtYWxmb3JtZWQgZGF0YScpO1xuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHBsYXllciwge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBkYXRhLnJlcXVlc3RlZF9ieSA/XG4gICAgICAoKCkgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBkYXRhLnJlcXVlc3RlZF9ieSBhcyBBUElVc2VyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcGxheWVyLmNsaWVudC51c2Vycy5yZXNvbHZlKHJlcy5pZCk7XG4gICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpIHJldHVybiBwbGF5ZXIuY2xpZW50LnVzZXJzLmNhY2hlLmdldChyZXMuaWQpITtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgY29uc3QgdXNlciA9IG5ldyBVc2VyKHBsYXllci5jbGllbnQsIHJlcyk7XG4gICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KSgpIDpcbiAgICAgIG51bGwsXG4gICAgICBxdWVyeVR5cGU6IGRhdGEucXVlcnlfdHlwZSA/PyB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHRyYWNrLnNldE1ldGFkYXRhKGRhdGEubWV0YWRhdGEpO1xuXG4gICAgcmV0dXJuIHRyYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBiZWxvbmdpbmcgcXVldWVzIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRCZWxvbmdpbmdRdWV1ZXMoKSB7XG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5maWx0ZXIoKG5vZGUpID0+IG5vZGUudHJhY2tzLnNvbWUoKHQpID0+IHQuaWQgPT09IHRoaXMuaWQpKTtcblxuICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgdHJhY2sgc2hhbGwgYmUgcGxheWVkXG4gICAqIEBwYXJhbSBvcHRpb25zIE5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+KVxuICA6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnBsYXllci5wbGF5LmJpbmQodGhpcy5wbGF5ZXIpO1xuXG4gICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG59IiwgImV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb2RlOiBFcnJvckNvZGVzO1xuICBwdWJsaWMgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb2RlOiBFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcblxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiB0aGlzLnRpbWVzdGFtcFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE91dE9mU3BhY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBjYXBhY2l0eTogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfT1VUX09GX1NQQUNFLCBgTWF4IGNhcGFjaXR5IHJlYWNoZWQgZm9yICR7dGFyZ2V0fSAoQ2FwYWNpdHkgJHtjYXBhY2l0eX0vVG90YWwgJHt0b3RhbH0pYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRBcmdUeXBlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgZXhwZWN0YXRpb246IHN0cmluZywgZm91bmQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsIGBFeHBlY3RlZCAke3RhcmdldH0gdG8gYmUgXCIke2V4cGVjdGF0aW9ufVwiLCByZWNlaXZlZCBcIiR7Zm91bmR9XCJgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9SZXN1bHRFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX1JFU1VMVCwgbWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PVF9JTVBMRU1FTlRFRCwgYCR7dGFyZ2V0fSBpcyBub3QgeWV0IGltcGxlbWVudGVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEV4aXN0aW5nRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElORywgYCR7dGFyZ2V0fSBkb2VzIG5vdCBleGlzdGApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRPZlJhbmdlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbWluaW11bTogc3RyaW5nLCBtYXhpbXVtOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX09VVF9PRl9SQU5HRSxcbiAgICAgIGAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWluaW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9fVk9JQ0VfQ09OTkVDVElPTixcbiAgICAgIG1lc3NhZ2UgfHwgJ05vIHZvaWNlIGNvbm5lY3Rpb24gYXZhaWxhYmxlLCBtYXliZSBjb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbCBmaXJzdD8nXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVm9pY2VDb25uZWN0aW9uRGVzdHJveWVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCwgJ0Nhbm5vdCB1c2UgZGVzdHJveWVkIHZvaWNlIGNvbm5lY3Rpb24nKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9Wb2ljZUNoYW5uZWxFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX1ZPSUNFX0NIQU5ORUwsICdDb3VsZCBub3QgZ2V0IHRoZSB2b2ljZSBjaGFubmVsJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRWb2ljZUNoYW5uZWxFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTCwgJ0V4cGVjdGVkIGEgdm9pY2UgY2hhbm5lbCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1JlY2VpdmVyRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9OT19SRUNFSVZFUixcbiAgICAgIG1lc3NhZ2UgfHwgJ05vIHZvaWNlIHJlY2VpdmVyIGlzIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/J1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfRkZNUEVHX0xPQ0FUT1IsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0F1ZGlvUmVzb3VyY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19BVURJT19SRVNPVVJDRSwgbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYW4gYXVkaW8gcmVzb3VyY2UnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZFF1ZXVlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fR1VJTERfUVVFVUUsIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQgcXVldWUnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX0dVSUxELCBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZm9SZXF1aXJlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfSU5GT19SRVFVSVJFRCwgYEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCwgXCJEb24ndCBrbm93IGhvdyB0byBzZXJpYWxpemUgdGhpcyBkYXRhXCIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXNlcmlhbGl6YXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQsIFwiRG9uJ3Qga25vdyBob3cgdG8gZGVzZXJpYWxpemUgdGhpcyBkYXRhXCIpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTixcbiAgICAgIGBJbGxlZ2FsIGludm9jYXRpb24gb2YgJHt0YXJnZXR9IGhvb2suJHttZXNzYWdlID8gYCAke21lc3NhZ2V9YCA6ICcnfWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVOb3RGb3VuZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGRlc2NyaXB0aW9uID0gJycpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElOR19NT0RVTEUsXG4gICAgICBgJHt0YXJnZXR9IG1vZHVsZSBkb2VzIG5vdCBleGlzdC4gSW5zdGFsbCBpdCB3aXRoIFxcYG5wbSBpbnN0YWxsICR7dGFyZ2V0fVxcYC4ke1xuICAgICAgZGVzY3JpcHRpb24gPyAnICcgKyBkZXNjcmlwdGlvbiA6ICcnfWBcblxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJyaWRnZUZhaWxlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZyB8IG51bGwsIGVycm9yOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0JSSURHRV9GQUlMRUQsXG4gICAgICBgJHtpZCA/IGAoRXh0cmFjdG9yIEV4ZWN1dGlvbiBDb250ZXh0IElEIGlzICR7aWR9KWAgOiAnJ31GYWlsZWQgdG8gYnJpZGdlIHRoaXMgcXVlcnk6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxufVxuXG4vLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbmV4cG9ydCBjb25zdCBFcnJvckNvZGVzID0ge1xuICBFUlJfT1VUX09GX1NQQUNFOiAnRVJSX09VVF9PRl9TUEFDRScsXG4gIEVSUl9JTlZBTElEX0FSR19UWVBFOiAnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICBFUlJfTk9fUkVTVUxUOiAnRVJSX05PX1JFU1VMVCcsXG4gIEVSUl9OT1RfSU1QTEVNRU5URUQ6ICdFUlJfTk9UX0lNUExFTUVOVEVEJyxcbiAgRVJSX05PVF9FWElTVElORzogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICBFUlJfT1VUX09GX1JBTkdFOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiAnRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04nLFxuICBFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQ6ICdFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQnLFxuICBFUlJfTk9fVk9JQ0VfQ0hBTk5FTDogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTDogJ0VSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUwnLFxuICBFUlJfTk9fUkVDRUlWRVI6ICdFUlJfTk9fUkVDRUlWRVInLFxuICBFUlJfRkZNUEVHX0xPQ0FUT1I6ICdFUlJfRkZNUEVHX0xPQ0FUT1InLFxuICBFUlJfTk9fQVVESU9fUkVTT1VSQ0U6ICdFUlJfTk9fQVVESU9fUkVTT1VSQ0UnLFxuICBFUlJfTk9fR1VJTERfUVVFVUU6ICdFUlJfTk9fR1VJTERfUVVFVUUnLFxuICBFUlJfTk9fR1VJTEQ6ICdFUlJfTk9fR1VJTEQnLFxuICBFUlJfSU5GT19SRVFVSVJFRDogJ0VSUl9JTkZPX1JFUVVJUkVEJyxcbiAgRVJSX1NFUklBTElaQVRJT05fRkFJTEVEOiAnRVJSX1NFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQ6ICdFUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCcsXG4gIEVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTjogJ0VSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTicsXG4gIEVSUl9OT1RfRVhJU1RJTkdfTU9EVUxFOiAnRVJSX05PVF9FWElTVElOR19NT0RVTEUnLFxuICBFUlJfQlJJREdFX0ZBSUxFRDogJ0VSUl9CUklER0VfRkFJTEVEJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRXJyb3JDb2RlcyA9ICh0eXBlb2YgRXJyb3JDb2Rlcylba2V5b2YgdHlwZW9mIEVycm9yQ29kZXNdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc2NvcmRQbGF5ZXJFcnJvcihlcnJvcjogYW55KTogZXJyb3IgaXMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgcmV0dXJuIGVycm9yICE9IG51bGwgJiYgZXJyb3IgaW5zdGFuY2VvZiBEaXNjb3JkUGxheWVyRXJyb3I7XG59XG5cbi8qKlxuICogSGFuZGxlIGEgYERpc2NvcmRQbGF5ZXJFcnJvcmAgZXJyb3IuXG4gKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIHRvIGhhbmRsZVxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgZXJyb3IgaXMgYSBgRGlzY29yZFBsYXllckVycm9yYC5cbiAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgaGFuZGxlclxuICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgLy8gLi4uXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogIGhhbmRsZURpc2NvcmRQbGF5ZXJFcnJvcihlcnJvciwgKGVycm9yKSA9PiB7XG4gKiAgICBjb25zb2xlLmVycm9yKGBBbiBlcnJvciBvY2N1cnJlZCBmcm9tIGRpc2NvcmQtcGxheWVyOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gKiAgfSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZURpc2NvcmRQbGF5ZXJFcnJvcjxcbiAgVCBleHRlbmRzIGFueVtdLFxuICBGIGV4dGVuZHMgKGVycm9yOiBEaXNjb3JkUGxheWVyRXJyb3IsIC4uLmFyZ3M6IFQpID0+IGFueSxcbiAgUiBleHRlbmRzIFJldHVyblR5cGU8Rj4+KFxuZXJyb3I6IGFueSwgaGFuZGxlcjogRiwgYXJnczogVCk6IFIge1xuICBpZiAoaXNEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGhhbmRsZXIoZXJyb3IsIC4uLmFyZ3MpIGFzIFI7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkIGFzIFI7XG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyIsICJpbXBvcnQgeyBEaXNjb3JkUGxheWVyRXJyb3IsIGlzRGlzY29yZFBsYXllckVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGNsYXNzIFR5cGVVdGlsIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gVHlwZVV0aWw7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICBwdWJsaWMgc3RhdGljIGlzRnVuY3Rpb24odDogdW5rbm93bik6IHQgaXMgRnVuY3Rpb24ge1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodDogdW5rbm93bik6IHQgaXMgbnVtYmVyIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdudW1iZXInICYmICFpc05hTih0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Jvb2xlYW4odDogdW5rbm93bik6IHQgaXMgYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTnVsbGlzaCh0OiB1bmtub3duKTogdCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdCA9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRXJyb3IodDogdW5rbm93bik6IHQgaXMgRXJyb3Ige1xuICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRGlzY29yZFBsYXllckVycm9yKHQ6IHVua25vd24pOiB0IGlzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gICAgcmV0dXJuIGlzRGlzY29yZFBsYXllckVycm9yKHQpO1xuICB9XG59IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgRGVzZXJpYWxpemF0aW9uRXJyb3IsIFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgdHlwZSBTZXJpYWxpemVkVHJhY2ssIFRyYWNrLCBTZXJpYWxpemVkUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgZW51bSBTZXJpYWxpemVkVHlwZSB7XG4gIFRyYWNrID0gJ3RyYWNrJyxcbiAgUGxheWxpc3QgPSAncGxheWxpc3QnLFxufVxuXG5leHBvcnQgdHlwZSBFbmNvZGFibGUgPSBTZXJpYWxpemVkVHJhY2sgfCBTZXJpYWxpemVkUGxheWxpc3Q7XG5cbmNvbnN0IGlzVHJhY2sgPSAoZGF0YTogYW55KTogZGF0YSBpcyBTZXJpYWxpemVkVHJhY2sgPT4gZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuVHJhY2s7XG5jb25zdCBpc1BsYXlsaXN0ID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFBsYXlsaXN0ID0+IGRhdGEuJHR5cGUgPT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGRhdGE6IFRyYWNrIHwgUGxheWxpc3QgfCBhbnkpIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBUcmFjaykgcmV0dXJuIGRhdGEuc2VyaWFsaXplKCk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgUGxheWxpc3QpIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRhdGEudG9KU09OKCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUocGxheWVyOiBQbGF5ZXIsIGRhdGE6IEVuY29kYWJsZSkge1xuICBpZiAoaXNUcmFjayhkYXRhKSkgcmV0dXJuIFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG4gIGlmIChpc1BsYXlsaXN0KGRhdGEpKSByZXR1cm4gUGxheWxpc3QuZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBkYXRhKTtcblxuICB0aHJvdyBuZXcgRGVzZXJpYWxpemF0aW9uRXJyb3IoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShkYXRhOiBFbmNvZGFibGUpIHtcbiAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGE6IHN0cmluZykge1xuICBjb25zdCBzdHIgPSBCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoKTtcblxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5SW50b1RodW1ibmFpbFN0cmluZyhkYXRhOiBhbnkpIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoVHlwZVV0aWwuaXNTdHJpbmcoZGF0YSkpIHJldHVybiBkYXRhO1xuICAgIHJldHVybiBkYXRhPy51cmwgPz8gZGF0YT8udGh1bWJuYWlsPy51cmwgPz8gbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0iLCAiaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrSlNPTiwgVHJhY2tTb3VyY2UgfSBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXplZFR5cGUsIHRyeUludG9UaHVtYm5haWxTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJkZSc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IEludmFsaWRBcmdUeXBlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkUGxheWxpc3QgPSBSZXR1cm5UeXBlPFBsYXlsaXN0WydzZXJpYWxpemUnXT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RJbml0RGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2tzIG9mIHRoaXMgcGxheWxpc3RcbiAgICovXG4gIHRyYWNrczogVHJhY2tbXTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvblxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHR5cGU6IGBhbGJ1bWAgfCBgcGxheWxpc3RgXG4gICAqL1xuICB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBzb3VyY2VcbiAgICovXG4gIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIG5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgfTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJhdyBwbGF5bGlzdCBkYXRhXG4gICAqL1xuICByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RKU09OIHtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAgICovXG4gIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHNvdXJjZVxuICAgKi9cbiAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICovXG4gIGF1dGhvcjoge1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIHVybFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICB9O1xuICAvKipcbiAgICogVGhlIHRyYWNrcyBkYXRhIChpZiBhbnkpXG4gICAqL1xuICB0cmFja3M6IFRyYWNrSlNPTltdO1xufVxuXG5leHBvcnQgY2xhc3MgUGxheWxpc3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXI7XG4gIHB1YmxpYyB0cmFja3M6IFRyYWNrW107XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIHRodW1ibmFpbDogc3RyaW5nO1xuICBwdWJsaWMgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIHB1YmxpYyBzb3VyY2U6IFRyYWNrU291cmNlO1xuICBwdWJsaWMgYXV0aG9yOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICB9O1xuICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgcHVibGljIHVybDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXG4gIC8qKlxuICAgKiBQbGF5bGlzdCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXJcbiAgICogQHBhcmFtIHtQbGF5bGlzdEluaXREYXRhfSBkYXRhIFRoZSBkYXRhXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwbGF5ZXI6IFBsYXllciwgZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5ZXJcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNwbGF5ZXJcbiAgICAgKiBAdHlwZSB7UGxheWVyfVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrcyBpbiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjdHJhY2tzXG4gICAgICogQHR5cGUge1RyYWNrW119XG4gICAgICovXG4gICAgdGhpcy50cmFja3MgPSBkYXRhLnRyYWNrcyA/PyBbXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3Igb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I2F1dGhvclxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG4gICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAqIEBuYW1lIFBsYXlsaXN0I2Rlc2NyaXB0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0aHVtYm5haWwgb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3RodW1ibmFpbFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0eXBlOlxuICAgICAqIC0gYGFsYnVtYFxuICAgICAqIC0gYHBsYXlsaXN0YFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3R5cGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudHlwZSA9IGRhdGEudHlwZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzb3VyY2Ugb2YgdGhpcyBwbGF5bGlzdDpcbiAgICAgKiAtIGB5b3V0dWJlYFxuICAgICAqIC0gYHNvdW5kY2xvdWRgXG4gICAgICogLSBgc3BvdGlmeWBcbiAgICAgKiAtIGBhcmJpdHJhcnlgXG4gICAgICogQG5hbWUgUGxheWxpc3Qjc291cmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnNvdXJjZSA9IGRhdGEuc291cmNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICogQG5hbWUgUGxheWxpc3QjaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3VybFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy51cmwgPSBkYXRhLnVybDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG5cbiAgICAvKipcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNyYXdQbGF5bGlzdFxuICAgICAqIEB0eXBlIHthbnl9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gIH1cblxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgeWllbGQqIHRoaXMudHJhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5yZWR1Y2UoKHAsIGMpID0+IHAgKyBjLmR1cmF0aW9uTVMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlZCBlc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGdldCBkdXJhdGlvbkZvcm1hdHRlZCgpIHtcbiAgICByZXR1cm4gVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0aGlzLmVzdGltYXRlZER1cmF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dpdGhUcmFja3M9dHJ1ZV0gSWYgaXQgc2hvdWxkIGJ1aWxkIGpzb24gd2l0aCB0cmFja3NcbiAgICogQHJldHVybnMge1BsYXlsaXN0SlNPTn1cbiAgICovXG4gIHRvSlNPTih3aXRoVHJhY2tzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgdHJhY2tzOiBbXSBhcyBUcmFja0pTT05bXVxuICAgIH07XG5cbiAgICBpZiAod2l0aFRyYWNrcykgcGF5bG9hZC50cmFja3MgPSB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0udG9KU09OKHRydWUpKTtcblxuICAgIHJldHVybiBwYXlsb2FkIGFzIFBsYXlsaXN0SlNPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhpcyBwbGF5bGlzdCBpbnRvIHJlY29uc3RydWN0YWJsZSBkYXRhXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS5zZXJpYWxpemUoKSksXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgdGh1bWJuYWlsOiBUeXBlVXRpbC5pc1N0cmluZyh0aGlzLnRodW1ibmFpbCkgPyB0aGlzLnRodW1ibmFpbCA6IHRyeUludG9UaHVtYm5haWxTdHJpbmcodGhpcy50aHVtYm5haWwpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuUGxheWxpc3QsXG4gICAgICAkZW5jb2Rlcl92ZXJzaW9uOiB0aGlzLnBsYXllci52ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAqIEBwYXJhbSBwbGF5ZXIgUGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZChwbGF5ZXI6IFBsYXllciwgZGF0YTogU2VyaWFsaXplZFBsYXlsaXN0KSB7XG4gICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0KVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdkYXRhJywgJ1NlcmlhbGl6ZWRQbGF5bGlzdCcsICdtYWxmb3JtZWQgZGF0YScpO1xuICAgIHJldHVybiBuZXcgUGxheWxpc3QocGxheWVyLCB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgdHJhY2tzOiBkYXRhLnRyYWNrcy5tYXAoKG0pID0+IFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgbSkpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGlzIHBsYXlsaXN0IHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHBsYXlsaXN0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgcGxheWxpc3Qgc2hhbGwgYmUgcGxheWVkXG4gICAqIEBwYXJhbSBvcHRpb25zIE5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+KVxuICA6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnBsYXllci5wbGF5LmJpbmQodGhpcy5wbGF5ZXIpO1xuXG4gICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG59IiwgImltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi9UeXBlVXRpbCc7XG5pbXBvcnQgeyBJbmZvUmVxdWlyZWRFcnJvciwgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBmZXRjaCB9IGZyb20gJ3VuZGljaSc7XG5cbi8vICNyZWdpb24gc2NhcnkgdGhpbmdzIGJlbG93ICpzaWdoKlxuY29uc3Qgc3BvdGlmeVNvbmdSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnRyYWNrXFwvfFxcP3VyaT1zcG90aWZ5OnRyYWNrOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlQbGF5bGlzdFJlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86cGxheWxpc3RcXC98XFw/dXJpPXNwb3RpZnk6cGxheWxpc3Q6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeUFsYnVtUmVnZXggPVxuL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzphbGJ1bVxcL3xcXD91cmk9c3BvdGlmeTphbGJ1bTopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCB2aW1lb1JlZ2V4ID1cbi9eKGh0dHB8aHR0cHMpPzpcXC9cXC8od3d3XFwufHBsYXllclxcLik/dmltZW9cXC5jb21cXC8oPzpjaGFubmVsc1xcLyg/OlxcdytcXC8pP3xncm91cHNcXC8oW14vXSopXFwvdmlkZW9zXFwvfHZpZGVvXFwvfCkoXFxkKykoPzp8XFwvXFw/KSQvO1xuY29uc3QgcmV2ZXJibmF0aW9uUmVnZXggPSAvXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC8oc29uZ3xhbGJ1bSlcXC8uKz8oXFwvLis/XFw/aT18XFwvKShbMC05XSspJC87XG5jb25zdCBhcHBsZU11c2ljUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC9wbGF5bGlzdFxcLy4rXFwvcGxcXC4odS18cG0tKT9bYS16QS1aMC05XSskLztcbmNvbnN0IGFwcGxlTXVzaWNBbGJ1bVJlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL2FsYnVtXFwvLitcXC8oWzAtOV0rKSQvO1xuY29uc3Qgc291bmRjbG91ZFRyYWNrUmVnZXggPSAvXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvKG0ufHd3dy4pP3NvdW5kY2xvdWQuY29tXFwvKFxcd3wtKStcXC9zZXRzXFwvKFxcd3wtKSsoLispPyQvO1xuY29uc3QgeW91dHViZVBsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvKHd3dy4pP3lvdXR1YmUuY29tXFwvcGxheWxpc3RcXD9saXN0PSgoUEx8Rkx8VVV8TEx8UkR8T0wpW2EtekEtWjAtOS1fXXsxNiw0MX0pJC87XG5jb25zdCB5b3V0dWJlVmlkZW9VUkxSZWdleCA9XG4vXigoPzpodHRwcz86KT9cXC9cXC8pPygoPzp3d3d8bSlcXC4pPygoPzp5b3V0dWJlXFwuY29tfHlvdXR1LmJlKSkoXFwvKD86W1xcdy1dK1xcP3Y9fGVtYmVkXFwvfHZcXC8pPykoW1xcdy1dKykoXFxTKyk/JC87XG5jb25zdCB5b3V0dWJlVmlkZW9JZFJlZ2V4ID0gL15bYS16QS1aMC05LV9dezExfSQvO1xuLy8gZGlzY29yZC1wbGF5ZXI6Ly9ibG9iL3V1aWQtdjRcbmNvbnN0IGRpc2NvcmRQbGF5ZXJCbG9iUmVnZXggPSAvXmRpc2NvcmQtcGxheWVyOlxcL1xcL2Jsb2JcXC9cXGQrJC87XG4vLyAjZW5kcmVnaW9uIHNjYXJ5IHRoaW5ncyBhYm92ZSAqc2lnaCpcblxuY29uc3QgRG9tYWluc01hcCA9IHtcbiAgRGlzY29yZFBsYXllcjogWydkaXNjb3JkLXBsYXllciddLFxuICBZb3VUdWJlOiBbJ3lvdXR1YmUuY29tJywgJ3lvdXR1LmJlJywgJ211c2ljLnlvdXR1YmUuY29tJywgJ2dhbWluZy55b3V0dWJlLmNvbScsICd3d3cueW91dHViZS5jb20nLCAnbS55b3V0dWJlLmNvbSddLFxuICBTcG90aWZ5OiBbJ29wZW4uc3BvdGlmeS5jb20nLCAnZW1iZWQuc3BvdGlmeS5jb20nXSxcbiAgVmltZW86IFsndmltZW8uY29tJywgJ3BsYXllci52aW1lby5jb20nXSxcbiAgUmV2ZXJiTmF0aW9uOiBbJ3JldmVyYm5hdGlvbi5jb20nXSxcbiAgU291bmRDbG91ZDogWydzb3VuZGNsb3VkLmNvbSddLFxuICBBcHBsZU11c2ljOiBbJ211c2ljLmFwcGxlLmNvbSddXG59O1xuXG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IHJlZGlyZWN0RG9tYWlucyA9IG5ldyBTZXQoW1xuL15odHRwcz86XFwvXFwvc3BvdGlmeS5saW5rXFwvW0EtWmEtejAtOV0rJC8sXG4vXmh0dHBzOlxcL1xcL29uXFwuc291bmRjbG91ZFxcLmNvbVxcL1thLXpBLVoxLTldezAsMTd9JC9dXG4pO1xuXG4vKipcbiAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICogVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBBVVRPXG4gKiAtIFlPVVRVQkVcbiAqIC0gWU9VVFVCRV9QTEFZTElTVFxuICogLSBTT1VORENMT1VEX1RSQUNLXG4gKiAtIFNPVU5EQ0xPVURfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRFxuICogLSBTUE9USUZZX1NPTkdcbiAqIC0gU1BPVElGWV9BTEJVTVxuICogLSBTUE9USUZZX1BMQVlMSVNUXG4gKiAtIFNQT1RJRllfU0VBUkNIXG4gKiAtIEZBQ0VCT09LXG4gKiAtIFZJTUVPXG4gKiAtIEFSQklUUkFSWVxuICogLSBSRVZFUkJOQVRJT05cbiAqIC0gWU9VVFVCRV9TRUFSQ0hcbiAqIC0gWU9VVFVCRV9WSURFT1xuICogLSBTT1VORENMT1VEX1NFQVJDSFxuICogLSBBUFBMRV9NVVNJQ19TT05HXG4gKiAtIEFQUExFX01VU0lDX0FMQlVNXG4gKiAtIEFQUExFX01VU0lDX1BMQVlMSVNUXG4gKiAtIEFQUExFX01VU0lDX1NFQVJDSFxuICogLSBGSUxFXG4gKiAtIEFVVE9fU0VBUkNIXG4gKiAtIERJU0NPUkRfUExBWUVSX0JMT0JcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IFF1ZXJ5VHlwZVxuICovXG5leHBvcnQgY29uc3QgUXVlcnlUeXBlID0ge1xuICBBVVRPOiAnYXV0bycsXG4gIFlPVVRVQkU6ICd5b3V0dWJlJyxcbiAgWU9VVFVCRV9QTEFZTElTVDogJ3lvdXR1YmVQbGF5bGlzdCcsXG4gIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICBTT1VORENMT1VEX1BMQVlMSVNUOiAnc291bmRjbG91ZFBsYXlsaXN0JyxcbiAgU09VTkRDTE9VRDogJ3NvdW5kY2xvdWQnLFxuICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gIFNQT1RJRllfQUxCVU06ICdzcG90aWZ5QWxidW0nLFxuICBTUE9USUZZX1BMQVlMSVNUOiAnc3BvdGlmeVBsYXlsaXN0JyxcbiAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgRkFDRUJPT0s6ICdmYWNlYm9vaycsXG4gIFZJTUVPOiAndmltZW8nLFxuICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICBSRVZFUkJOQVRJT046ICdyZXZlcmJuYXRpb24nLFxuICBZT1VUVUJFX1NFQVJDSDogJ3lvdXR1YmVTZWFyY2gnLFxuICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgU09VTkRDTE9VRF9TRUFSQ0g6ICdzb3VuZGNsb3VkU2VhcmNoJyxcbiAgQVBQTEVfTVVTSUNfU09ORzogJ2FwcGxlTXVzaWNTb25nJyxcbiAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICBBUFBMRV9NVVNJQ19QTEFZTElTVDogJ2FwcGxlTXVzaWNQbGF5bGlzdCcsXG4gIEFQUExFX01VU0lDX1NFQVJDSDogJ2FwcGxlTXVzaWNTZWFyY2gnLFxuICBGSUxFOiAnZmlsZScsXG4gIEFVVE9fU0VBUkNIOiAnYXV0b1NlYXJjaCcsXG4gIERJU0NPUkRfUExBWUVSX0JMT0I6ICdkaXNjb3JkUGxheWVyQmxvYidcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5VHlwZSA9ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8IFF1ZXJ5VHlwZTtcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFF1ZXJ5IHtcbiAgdHlwZTogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xuICBxdWVyeTogc3RyaW5nO1xufVxuXG5jbGFzcyBRdWVyeVJlc29sdmVyIHtcbiAgLyoqXG4gICAqIFF1ZXJ5IHJlc29sdmVyXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICBzdGF0aWMgZ2V0IHJlZ2V4KCkge1xuICAgIHJldHVybiB7XG4gICAgICBzcG90aWZ5QWxidW1SZWdleCxcbiAgICAgIHNwb3RpZnlQbGF5bGlzdFJlZ2V4LFxuICAgICAgc3BvdGlmeVNvbmdSZWdleCxcbiAgICAgIHZpbWVvUmVnZXgsXG4gICAgICByZXZlcmJuYXRpb25SZWdleCxcbiAgICAgIGF0dGFjaG1lbnRSZWdleCxcbiAgICAgIGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LFxuICAgICAgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgsXG4gICAgICBhcHBsZU11c2ljU29uZ1JlZ2V4LFxuICAgICAgc291bmRjbG91ZFRyYWNrUmVnZXgsXG4gICAgICBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCxcbiAgICAgIHlvdXR1YmVQbGF5bGlzdFJlZ2V4LFxuICAgICAgZGlzY29yZFBsYXllckJsb2JSZWdleFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUHJlLXJlc29sdmUgcmVkaXJlY3QgdXJsc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIHByZVJlc29sdmUocXVlcnk6IHN0cmluZywgbWF4RGVwdGggPSA1KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzU3RyaW5nKHF1ZXJ5KSkgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuXG4gICAgZm9yIChjb25zdCBkb21haW4gb2YgcmVkaXJlY3REb21haW5zKSB7XG4gICAgICBpZiAoZG9tYWluLnRlc3QocXVlcnkpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocXVlcnksIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdydcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghcmVzLm9rKSBicmVhaztcblxuICAgICAgICAgIC8vIHNwb3RpZnkgZG9lcyBub3QgXCJyZWRpcmVjdFwiLCBpdCByZXR1cm5zIGEgcGFnZSB3aXRoIGpzIHRoYXQgcmVkaXJlY3RzXG4gICAgICAgICAgaWYgKC9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkuYXBwLmxpbmtcXC8oLispJC8udGVzdChyZXMudXJsKSkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBib2R5LnNwbGl0KCdodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJylbMV0uc3BsaXQoJz9zaT0nKVswXTtcblxuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIGJyZWFrO1xuXG4gICAgICAgICAgICByZXR1cm4gYGh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS90cmFjay8ke3RhcmdldH1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbWF4RGVwdGggPCAxID8gcmVzLnVybCA6IHRoaXMucHJlUmVzb2x2ZShyZXMudXJsLCBtYXhEZXB0aCAtIDEpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICovXG4gIHN0YXRpYyByZXNvbHZlKFxuICBxdWVyeTogc3RyaW5nLFxuICBmYWxsYmFja1NlYXJjaEVuZ2luZTogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdID0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIKVxuICA6IFJlc29sdmVkUXVlcnkge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKSB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihxdWVyeSwgJ3N0cmluZycsIHR5cGVvZiBxdWVyeSk7XG4gICAgaWYgKCFxdWVyeS5sZW5ndGgpIHRocm93IG5ldyBJbmZvUmVxdWlyZWRFcnJvcigncXVlcnknLCBTdHJpbmcocXVlcnkpKTtcblxuICAgIGNvbnN0IHJlc29sdmVyID0gKHR5cGU6IHR5cGVvZiBmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnk6IHN0cmluZykgPT4gKHsgdHlwZSwgcXVlcnkgfSk7XG5cbiAgICBpZiAoZGlzY29yZFBsYXllckJsb2JSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5ESVNDT1JEX1BMQVlFUl9CTE9CLCBxdWVyeSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChxdWVyeSk7XG5cbiAgICAgIGlmIChEb21haW5zTWFwLllvdVR1YmUuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvKG0odXNpYyk/fGdhbWluZylcXC4vLCAnJykudHJpbSgpO1xuICAgICAgICBjb25zdCBwbGF5bGlzdElkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ2xpc3QnKTtcbiAgICAgICAgY29uc3QgdmlkZW9JZCA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCd2Jyk7XG4gICAgICAgIGlmIChwbGF5bGlzdElkKSB7XG4gICAgICAgICAgaWYgKHZpZGVvSWQgJiYgcGxheWxpc3RJZC5zdGFydHNXaXRoKCdSRCcpKVxuICAgICAgICAgIHJldHVybiByZXNvbHZlcihcbiAgICAgICAgICAgIFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULFxuICAgICAgICAgICAgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9JHt2aWRlb0lkfSZsaXN0PSR7cGxheWxpc3RJZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsIGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9wbGF5bGlzdD9saXN0PSR7cGxheWxpc3RJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUXVlcnlSZXNvbHZlci52YWxpZGF0ZUlkKHF1ZXJ5KSB8fCBRdWVyeVJlc29sdmVyLnZhbGlkYXRlVVJMKHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5ZT1VUVUJFX1ZJREVPLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlNwb3RpZnkuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvaW50bC0oW2EtekEtWl0rKVxcLy8sICcnKTtcbiAgICAgICAgaWYgKHNwb3RpZnlQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHNwb3RpZnlBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHNwb3RpZnlTb25nUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9TT05HLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlZpbWVvLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAodmltZW9SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5WSU1FTywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5SZXZlcmJOYXRpb24uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmIChyZXZlcmJuYXRpb25SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5SRVZFUkJOQVRJT04sIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuU291bmRDbG91ZC5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNPVU5EQ0xPVURfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHNvdW5kY2xvdWRUcmFja1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNPVU5EQ0xPVURfVFJBQ0ssIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuQXBwbGVNdXNpYy5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgIGlmIChhcHBsZU11c2ljUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoYXBwbGVNdXNpY1NvbmdSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19TT05HLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUkJJVFJBUlksIHF1ZXJ5KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdmltZW8gaWQgZnJvbSB1cmxcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGdldFZpbWVvSUQocXVlcnk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBRdWVyeVJlc29sdmVyLnJlc29sdmUocXVlcnkpLnR5cGUgPT09IFF1ZXJ5VHlwZS5WSU1FTyA/IHF1ZXJ5LnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pLnBvcCgpIDogbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUlkKHE6IHN0cmluZykge1xuICAgIHJldHVybiB5b3V0dWJlVmlkZW9JZFJlZ2V4LnRlc3QocSk7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHlvdXR1YmVWaWRlb1VSTFJlZ2V4LnRlc3QocSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9OyIsICJpbXBvcnQgeyBVc2VyLCBVc2VyUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBRdWVyeVR5cGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdERhdGEge1xuICBxdWVyeTogc3RyaW5nO1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCB8IG51bGw7XG4gIGV4dHJhY3Rvcj86IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzPzogVHJhY2tbXTtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICovXG4gIGZpbHRlcnNVcGRhdGU/OiBib29sZWFuO1xuICAvKipcbiAgICogRkZtcGVnIGFyZ3MgcGFzc2VkIHRvIGVuY29kZXJcbiAgICovXG4gIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaW1lIHRvIHNlZWsgdG8gYmVmb3JlIHBsYXlpbmdcbiAgICovXG4gIHNlZWs/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICovXG4gIGltbWVkaWF0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RXh0cmFjdG9yU2VhcmNoID0gYGV4dDoke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHNlYXJjaFxuICAgKi9cbiAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICAgKi9cbiAgc2VhcmNoRW5naW5lPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2g7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBpZ25vcmUgcXVlcnkgY2FjaGUgbG9va3VwXG4gICAqL1xuICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmVxdWVzdE9wdGlvbnM/OiBhbnk7XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU2VhcmNoUmVzdWx0IHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgY2xhc3MgU2VhcmNoUmVzdWx0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHJpdmF0ZSBfZGF0YTogU2VhcmNoUmVzdWx0RGF0YSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2suZXh0cmFjdG9yID8/PSB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPz89IF9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnlUeXBlKHR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoKSB7XG4gICAgdGhpcy5fZGF0YS5xdWVyeVR5cGUgPSB0eXBlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFJlcXVlc3RlZEJ5KHVzZXI6IFVzZXIpIHtcbiAgICB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgdGhpcy5fZGF0YS5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0VHJhY2tzKHRyYWNrczogVHJhY2tbXSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UGxheWxpc3QocGxheWxpc3Q6IFBsYXlsaXN0KSB7XG4gICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZWFyY2ggcXVlcnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXJ5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeVR5cGUgfHwgUXVlcnlUeXBlLkFVVE87XG4gIH1cblxuICAvKipcbiAgICogVGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGxheWxpc3QgcmVzdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXlsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXQgdHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnRyYWNrcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0ZWQgYnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1leGVjdXRlIHRoaXMgc2VhcmNoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIHNlYXJjaCByZXN1bHQgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBoYXNQbGF5bGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5bGlzdCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICB9O1xuICB9XG59IiwgImV4cG9ydCB0eXBlIEZpbHRlcnNOYW1lID0ga2V5b2YgUXVldWVGaWx0ZXJzO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICBiYXNzYm9vc3RfbG93PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAnOEQnPzogYm9vbGVhbjtcbiAgdmFwb3J3YXZlPzogYm9vbGVhbjtcbiAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgcGhhc2VyPzogYm9vbGVhbjtcbiAgdHJlbW9sbz86IGJvb2xlYW47XG4gIHZpYnJhdG8/OiBib29sZWFuO1xuICByZXZlcnNlPzogYm9vbGVhbjtcbiAgdHJlYmxlPzogYm9vbGVhbjtcbiAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gIG5vcm1hbGl6ZXIyPzogYm9vbGVhbjtcbiAgc3Vycm91bmRpbmc/OiBib29sZWFuO1xuICBwdWxzYXRvcj86IGJvb2xlYW47XG4gIHN1YmJvb3N0PzogYm9vbGVhbjtcbiAga2FyYW9rZT86IGJvb2xlYW47XG4gIGZsYW5nZXI/OiBib29sZWFuO1xuICBnYXRlPzogYm9vbGVhbjtcbiAgaGFhcz86IGJvb2xlYW47XG4gIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgbW9ubz86IGJvb2xlYW47XG4gIG1zdGxyPzogYm9vbGVhbjtcbiAgbXN0cnI/OiBib29sZWFuO1xuICBjb21wcmVzc29yPzogYm9vbGVhbjtcbiAgZXhwYW5kZXI/OiBib29sZWFuO1xuICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gIGNob3J1cz86IGJvb2xlYW47XG4gIGNob3J1czJkPzogYm9vbGVhbjtcbiAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICBmYWRlaW4/OiBib29sZWFuO1xuICBkaW0/OiBib29sZWFuO1xuICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgbG9maT86IGJvb2xlYW47XG4gIHNpbGVuY2VyZW1vdmU/OiBib29sZWFuO1xufVxuXG5jb25zdCBiYXNzID0gKGc6IG51bWJlcikgPT4gYGJhc3M9Zz0ke2d9OmY9MTEwOnc9MC4zYDtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvRmlsdGVycyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgYmFzc2Jvb3N0X2xvdzogYmFzcygxNSksXG4gICAgYmFzc2Jvb3N0OiBiYXNzKDIwKSxcbiAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgJzhEJzogJ2FwdWxzYXRvcj1oej0wLjA5JyxcbiAgICB2YXBvcndhdmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC44JyxcbiAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgbG9maTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjksZXh0cmFzdGVyZW89bT0yLjU6Yz1kaXNhYmxlZCcsXG4gICAgcGhhc2VyOiAnYXBoYXNlcj1pbl9nYWluPTAuNCcsXG4gICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgIHZpYnJhdG86ICd2aWJyYXRvPWY9Ni41JyxcbiAgICByZXZlcnNlOiAnYXJldmVyc2UnLFxuICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgIG5vcm1hbGl6ZXIyOiAnZHluYXVkbm9ybT1nPTEwMScsXG4gICAgbm9ybWFsaXplcjogJ2Fjb21wcmVzc29yJyxcbiAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICBwdWxzYXRvcjogJ2FwdWxzYXRvcj1oej0xJyxcbiAgICBzdWJib29zdDogJ2FzdWJib29zdCcsXG4gICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgZmxhbmdlcjogJ2ZsYW5nZXInLFxuICAgIGdhdGU6ICdhZ2F0ZScsXG4gICAgaGFhczogJ2hhYXMnLFxuICAgIG1jb21wYW5kOiAnbWNvbXBhbmQnLFxuICAgIG1vbm86ICdwYW49bW9ub3xjMD0uNSpjMCsuNSpjMScsXG4gICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICBtc3RycjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+cnInLFxuICAgIGNvbXByZXNzb3I6ICdjb21wYW5kPXBvaW50cz0tODAvLTEwNXwtNjIvLTgwfC0xNS40Ly0xNS40fDAvLTEyfDIwLy03LjYnLFxuICAgIGV4cGFuZGVyOiAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tMTY5fC01NC8tODB8LTQ5LjUvLTY0LjZ8LTQxLjEvLTQxLjF8LTI1LjgvLTE1fC0xMC44Ly00LjV8MC8wfDIwLzguMycsXG4gICAgc29mdGxpbWl0ZXI6ICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy04MHwtMTIuNC8tMTIuNHwtNi8tOHwwLy02Ljh8MjAvLTIuOCcsXG4gICAgY2hvcnVzOiAnY2hvcnVzPTAuNzowLjk6NTU6MC40OjAuMjU6MicsXG4gICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgY2hvcnVzM2Q6ICdjaG9ydXM9MC41OjAuOTo1MHw2MHw0MDowLjR8MC4zMnwwLjM6MC4yNXwwLjR8MC4zOjJ8Mi4zfDEuMycsXG4gICAgZmFkZWluOiAnYWZhZGU9dD1pbjpzcz0wOmQ9MTAnLFxuICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgIGVhcnJhcGU6ICdjaGFubmVsc3BsaXQsc2lkZWNoYWluZ2F0ZT1sZXZlbF9pbj02NCcsXG4gICAgc2lsZW5jZXJlbW92ZTogJ3NpbGVuY2VyZW1vdmU9MTowOi01MGRCJ1xuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnNbbmFtZV0gPz8gbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaGFzPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8e25hbWU6IEZpbHRlcnNOYW1lO3ZhbHVlOiBzdHJpbmc7fT4ge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZmlsdGVycykpIHtcbiAgICAgIHlpZWxkIHsgbmFtZTogayBhcyBGaWx0ZXJzTmFtZSwgdmFsdWU6IHYgYXMgc3RyaW5nIH07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgbmFtZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykgYXMgRmlsdGVyc05hbWVbXTtcbiAgfVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHN0YXRpYyBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMubWFwKChtKSA9PiAodGhpcyBhcyBhbnkpW21dKS5qb2luKCcsJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBmZm1wZWcgYXJncyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsdGVycyBuYW1lXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciBuYW1lXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KGZpbHRlcnM/OiAoSyB8IHN0cmluZylbXSkge1xuICAgIGlmICghZmlsdGVycyB8fCAhQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gZmlsdGVycy5cbiAgICBmaWx0ZXIoKHByZWRpY2F0ZSkgPT4gdHlwZW9mIHByZWRpY2F0ZSA9PT0gJ3N0cmluZycpLlxuICAgIG1hcCgobSkgPT4gdGhpcy5nZXQobSBhcyBLKSkuXG4gICAgam9pbignLCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgYXVkaW8gZmlsdGVyXG4gICAqIEBwYXJhbSBmaWx0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWx0ZXJcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZpbmUoZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5maWx0ZXJzW2ZpbHRlck5hbWUgYXMgRmlsdGVyc05hbWVdID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBtdWx0aXBsZSBhdWRpbyBmaWx0ZXJzXG4gICAqIEBwYXJhbSBmaWx0ZXJzQXJyYXkgQXJyYXkgb2YgZmlsdGVycyBjb250YWluaW5nIHRoZSBmaWx0ZXIgbmFtZSBhbmQgZmZtcGVnIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVmaW5lQnVsayhmaWx0ZXJzQXJyYXk6IHtuYW1lOiBzdHJpbmc7dmFsdWU6IHN0cmluZzt9W10pIHtcbiAgICBmaWx0ZXJzQXJyYXkuZm9yRWFjaCgoYXJyKSA9PiB0aGlzLmRlZmluZShhcnIubmFtZSwgYXJyLnZhbHVlKSk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgRGVmYXVsdExpc3RlbmVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IExpc3RlbmVyU2lnbmF0dXJlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIFBsYXllckV2ZW50c0VtaXR0ZXI8TCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzIEV2ZW50RW1pdHRlcjxMPiB7XG4gICNoYXNEZWJ1Z2dlciA9IGZhbHNlO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlcXVpcmVkRXZlbnRzOiBBcnJheTxrZXlvZiBMPiA9IFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgb25jZTxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5hZGRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgb2ZmPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgcmV0dXJuIHN1cGVyLm9mZihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICByZXR1cm4gc3VwZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVyczxLIGV4dGVuZHMga2V5b2YgTD4obmFtZT86IEspIHtcbiAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgIHJldHVybiBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgLi4uYXJnczogUGFyYW1ldGVyczxMW0tdPikge1xuICAgIGlmICh0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICBVdGlsLndhcm4oXG4gICAgICAgIGBObyBldmVudCBsaXN0ZW5lciBmb3VuZCBmb3IgZXZlbnQgXCIke1N0cmluZyhuYW1lKX1cIi4gRXZlbnRzICR7dGhpcy5yZXF1aXJlZEV2ZW50cy5cbiAgICAgICAgbWFwKChtKSA9PiBgXCIke1N0cmluZyhtKX1cImApLlxuICAgICAgICBqb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICdVbmhhbmRsZWRFdmVudHNXYXJuaW5nJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZW1pdChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhc0RlYnVnZ2VyO1xuICB9XG59IiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JTdHJlYW1hYmxlID1cblJlYWRhYmxlIHxcbnN0cmluZyB8XG57XG4gICRmbXQ6IHN0cmluZztcbiAgc3RyZWFtOiBSZWFkYWJsZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkZW50aWZpZXIgPSAnY29tLmRpc2NvcmQtcGxheWVyLmV4dHJhY3Rvcic7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgZXh0cmFjdG9yLiBIaWdoZXIgdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5ICh3aWxsIGJlIGV4ZWN1dGVkIGZpcnN0KS5cbiAgICovXG4gIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBxdWVyeSBwcm90b2NvbHMgdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cy5cbiAgICovXG4gIHB1YmxpYyBwcm90b2NvbHM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+IGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0b3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBwdWJsaWMgb3B0aW9uczogVCA9IDxUPiB7fSkge31cblxuICAvKipcbiAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBpZGVudGlmaWVyKCkge1xuICAgIHJldHVybiAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQmFzZUV4dHJhY3RvcikuaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbmZpZ3VyZXMgdGhpcyBleHRyYWN0b3JcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG5ldyBvcHRpb25zIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjb25maWd1cmUob3B0aW9uczogVCkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgYXdhaXQgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgYXdhaXQgdGhpcy5hY3RpdmF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgIC8vIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaW5jb21pbmcgcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKHF1ZXJ5OiBzdHJpbmcsIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdm9pZCB0eXBlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdHJlYW0oaW5mbzogVHJhY2spOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGU+IHtcbiAgICB2b2lkIGluZm87XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zdHJlYW0oKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgZ2l2ZW4gcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUocXVlcnk6IHN0cmluZywgY29udGV4dDogRXh0cmFjdG9yU2VhcmNoQ29udGV4dCk6IFByb21pc2U8RXh0cmFjdG9ySW5mbz4ge1xuICAgIHZvaWQgY29udGV4dDtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmhhbmRsZSgpYCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlbGF0ZWQgdHJhY2tzIGZvciB0aGUgZ2l2ZW4gdHJhY2tcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayBzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWxhdGVkVHJhY2tzKHRyYWNrOiBUcmFjaywgaGlzdG9yeTogR3VpbGRRdWV1ZUhpc3RvcnkpOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICB2b2lkIHRyYWNrO1xuICAgIHZvaWQgaGlzdG9yeTtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmdldFJlbGF0ZWRUcmFja3MoKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3RyZWFtIG1pZGRsZXdhcmUgdG8gaGFuZGxlIHN0cmVhbXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbmNvbWluZyBzdHJlYW1cbiAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVQb3N0U3RyZWFtKHN0cmVhbTogUmVhZGFibGUsIG5leHQ6IE5leHRGdW5jdGlvbikge1xuICAgIHJldHVybiBuZXh0KG51bGwsIHN0cmVhbSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoXG4gICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAqL1xuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgUGxheWVyRXZlbnRzPihldmVudDogSywgLi4uYXJnczogUGFyYW1ldGVyczxQbGF5ZXJFdmVudHNbS10+KSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGV4dHJhY3RvciByZXNwb25zZVxuICAgKiBAcGFyYW0gcGxheWxpc3QgVGhlIHBsYXlsaXN0XG4gICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUmVzcG9uc2UocGxheWxpc3Q/OiBQbGF5bGlzdCB8IG51bGwsIHRyYWNrczogVHJhY2tbXSA9IHBsYXlsaXN0Py50cmFja3MgfHwgW10pOiBFeHRyYWN0b3JJbmZvIHtcbiAgICByZXR1cm4geyBwbGF5bGlzdDogcGxheWxpc3QgfHwgbnVsbCwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgZGVidWcgbWVzc2FnZVxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmxhZyB0byBpbmRpY2F0ZSBgRGVtdXhhYmxlYCBzdHJlYW0gc3VwcG9ydCBmb3IgYG9wdXNgL2BvZ2cvb3B1c2AvYHdlYm0vb3B1c2AgZm9ybWF0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VwcG9ydHNEZW11eCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbnRleHQucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3RyZWFtIGV4dHJhY3Rpb24gZm9yIGFub3RoZXIgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYnJpZGdlXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBhc3luYyBicmlkZ2UodHJhY2s6IFRyYWNrLCBzb3VyY2VFeHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsKTogUHJvbWlzZTxFeHRyYWN0b3JTdHJlYW1hYmxlIHwgbnVsbD4ge1xuICAgIHZvaWQgc291cmNlRXh0cmFjdG9yO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE5leHRGdW5jdGlvbiA9IChlcnJvcj86IEVycm9yIHwgbnVsbCwgc3RyZWFtPzogUmVhZGFibGUpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9ySW5mbyB7XG4gIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gIHRyYWNrczogVHJhY2tbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JTZWFyY2hDb250ZXh0IHtcbiAgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGw7XG4gIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gIHJlcXVlc3RPcHRpb25zPzogUmVxdWVzdE9wdGlvbnM7XG4gIHByb3RvY29sPzogc3RyaW5nIHwgbnVsbDtcbn0iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciwgRXh0cmFjdG9yU3RyZWFtYWJsZSB9IGZyb20gJy4vQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuLi9ob29rcyc7XG5pbXBvcnQgeyBCcmlkZ2VGYWlsZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yU2Vzc2lvbiB7XG4gIGlkOiBzdHJpbmc7XG4gIGF0dGVtcHRlZEV4dHJhY3RvcnM6IFNldDxzdHJpbmc+O1xuICBicmlkZ2VBdHRlbXB0ZWRFeHRyYWN0b3JzOiBTZXQ8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25FdmVudHMge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyByZWdpc3RlcmVkXG4gICAqL1xuICByZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgdW5yZWdpc3RlcmVkXG4gICAqL1xuICB1bnJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBhY3RpdmF0ZWRcbiAgICovXG4gIGFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgZGVhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBmYWlscyB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgZXJyb3I6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgc3RvcmVcbiAgICovXG4gIHB1YmxpYyBzdG9yZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgQmFzZUV4dHJhY3Rvcj4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8RXh0cmFjdG9yU2Vzc2lvbj4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7XG4gICAgc3VwZXIoWydlcnJvciddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGlkXG4gICAqL1xuICBwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCk/LmlkID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbnN1bWUoKSA/PyBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWREZWZhdWx0KCkge1xuICAgIGNvbnN0IHNhbXBsZSA9IGBcXHRpbXBvcnQgeyBEZWZhdWx0RXh0cmFjdG9ycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xcblxcdGF3YWl0IHBsYXllci5leHRyYWN0b3JzLmxvYWRNdWx0aShEZWZhdWx0RXh0cmFjdG9ycyk7YDtcblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBleHRyYWN0b3JzLmxvYWREZWZhdWx0KCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIGV4dHJhY3RvcnMubG9hZE11bHRpIGluc3RlYWQuIEV4YW1wbGU6XFxuJHtzYW1wbGV9XFxuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIGJ1bmRsZSBvZiBleHRyYWN0b3JzLlxuICAgKiBAZXhhbXBsZSBpbXBvcnQgeyBEZWZhdWx0RXh0cmFjdG9ycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xuICAgKlxuICAgKiBhd2FpdCBwbGF5ZXIuZXh0cmFjdG9ycy5sb2FkTXVsdGkoRGVmYXVsdEV4dHJhY3RvcnMpO1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRNdWx0aTxcbiAgICBPIGV4dGVuZHMgb2JqZWN0LFxuICAgIFQgZXh0ZW5kcyAodHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4pW10sXG4gICAgUiBleHRlbmRzIFJlY29yZDxUW251bWJlcl1bJ2lkZW50aWZpZXInXSwgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFRbbnVtYmVyXT5bMV0+PihcbiAgYnVuZGxlOiBULCBvcHRpb25zOiBSID0ge30gYXMgUikge1xuICAgIGJ1bmRsZS5mb3JFYWNoKChleHQpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVnaXN0ZXIoZXh0LCBvcHRpb25zPy5bZXh0LmlkZW50aWZpZXJdIHx8IHt9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVycm9yOiBudWxsIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaWYgdGhlIGdpdmVuIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIGlzUmVnaXN0ZXJlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5oYXMoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgcmVnaXN0ZXJlZCBleHRyYWN0b3JzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgKi9cbiAgcHVibGljIGdldChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyPE8gZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyB0eXBlb2YgQmFzZUV4dHJhY3RvcjxPPj4oXG4gIF9leHRyYWN0b3I6IFQsXG4gIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKVxuICA6IFByb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD4ge1xuICAgIGlmICh0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fCB0aGlzLnN0b3JlLmhhcyhfZXh0cmFjdG9yLmlkZW50aWZpZXIpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgX2V4dHJhY3Rvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0b3JlLnNldChfZXh0cmFjdG9yLmlkZW50aWZpZXIsIGV4dHJhY3Rvcik7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGxvYWRlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgncmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICBhd2FpdCBleHRyYWN0b3IuYWN0aXZhdGUoKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgYWN0aXZhdGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCdhY3RpdmF0ZScsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICByZXR1cm4gZXh0cmFjdG9yIGFzIHVua25vd24gYXMgSW5zdGFuY2VUeXBlPFQ+O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKF9leHRyYWN0b3IuaWRlbnRpZmllcik7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gYWN0aXZhdGUhIEVycm9yOiAke2V9YCk7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIHNpbmdsZSBleHRyYWN0b3JcbiAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byB1bnJlZ2lzdGVyXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlcjxLIGV4dGVuZHMgc3RyaW5nIHwgQmFzZUV4dHJhY3Rvcj4oX2V4dHJhY3RvcjogSykge1xuICAgIGNvbnN0IGV4dHJhY3RvciA9XG4gICAgdHlwZW9mIF9leHRyYWN0b3IgPT09ICdzdHJpbmcnID8gdGhpcy5zdG9yZS5nZXQoX2V4dHJhY3RvcikgOiB0aGlzLnN0b3JlLmZpbmQoKHIpID0+IHIgPT09IF9leHRyYWN0b3IpO1xuICAgIGlmICghZXh0cmFjdG9yKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgdGhpcy5zdG9yZS5maW5kS2V5KChlKSA9PiBlID09PSBleHRyYWN0b3IpITtcbiAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGlzYWJsZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ3VucmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICBhd2FpdCBleHRyYWN0b3IuZGVhY3RpdmF0ZSgpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGRlYWN0aXZhdGUhYCk7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBhbGwgZXh0cmFjdG9yc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJBbGwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuc3RvcmUubWFwKChlKSA9PiB0aGlzLnVucmVnaXN0ZXIoZSkpKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFJ1biBhbGwgdGhlIGV4dHJhY3RvcnNcbiAgICogQHBhcmFtIGZuIFRoZSBydW5uZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIGZpbHRlckJsb2NrZWQgRmlsdGVyIGJsb2NrZWQgZXh0cmFjdG9yc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJ1bjxUID0gdW5rbm93bj4oZm46IEV4dHJhY3RvckV4ZWN1dGlvbkZOPFQ+LCBmaWx0ZXJCbG9ja2VkID0gdHJ1ZSkge1xuICAgIGNvbnN0IGJsb2NrZWQgPSB0aGlzLnBsYXllci5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/PyBbXTtcblxuICAgIGlmICghdGhpcy5zdG9yZS5zaXplKSB7XG4gICAgICBVdGlsLndhcm4oJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLCAnTm9FeHRyYWN0b3JzJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc29ydCBieSBwcmlvcml0eSBzbyB0aGF0IGV4dHJhY3RvcnMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgYXJlIGV4ZWN1dGVkIGZpcnN0XG4gICAgY29uc3QgZXh0cmFjdG9ycyA9IHRoaXMuc3RvcmUuc29ydCgoYSwgYikgPT4gYi5wcmlvcml0eSAtIGEucHJpb3JpdHkpO1xuXG4gICAgbGV0IGVycjogRXJyb3IgfCBudWxsID0gbnVsbCxcbiAgICAgIGxhc3RFeHQ6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dHJhY3RvcnMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChmaWx0ZXJCbG9ja2VkICYmIGJsb2NrZWQuc29tZSgoZSkgPT4gZSA9PT0gZXh0LmlkZW50aWZpZXIpKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0uLi5gKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGV4dCkudGhlbihcbiAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB3aXRoIGVycm9yOiAke2V9YCk7XG5cbiAgICAgICAgICByZXR1cm4gVHlwZVV0aWwuaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoYCR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgbGFzdEV4dCA9IGV4dDtcblxuICAgICAgaWYgKHJlc3VsdCAmJiAhVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBleGVjdXRlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBleHRyYWN0b3I6IGV4dCxcbiAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgICByZXN1bHRcbiAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VD47XG4gICAgICB9IGVsc2UgaWYgKFR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICBlcnIgPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycilcbiAgICByZXR1cm4ge1xuICAgICAgZXh0cmFjdG9yOiBsYXN0RXh0ISxcbiAgICAgIGVycm9yOiBlcnIsXG4gICAgICByZXN1bHQ6IGZhbHNlXG4gICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8ZmFsc2U+O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYnJpZGdlIGZvciBhIHRyYWNrXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVxdWVzdCBicmlkZ2UgZm9yXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3Igb2YgdGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdEJyaWRnZSh0cmFjazogVHJhY2ssIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSB0cmFjay5leHRyYWN0b3IpIHtcbiAgICBjb25zdCBwcmV2aW91c2x5QXR0ZW1wdGVkID0gdGhpcy5nZXRDb250ZXh0KCk/LmJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnMgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bjxFeHRyYWN0b3JTdHJlYW1hYmxlPihhc3luYyAoZXh0KSA9PiB7XG4gICAgICBpZiAoc291cmNlRXh0cmFjdG9yICYmIGV4dC5pZGVudGlmaWVyID09PSBzb3VyY2VFeHRyYWN0b3IuaWRlbnRpZmllcikgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHByZXZpb3VzbHlBdHRlbXB0ZWQuaGFzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBwcmV2aW91c2x5QXR0ZW1wdGVkLmFkZChleHQuaWRlbnRpZmllcik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4dC5icmlkZ2UodHJhY2ssIHNvdXJjZUV4dHJhY3Rvcik7XG5cbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KVxuICAgIHRocm93IG5ldyBCcmlkZ2VGYWlsZWRFcnJvcihcbiAgICAgIHRoaXMuZ2V0RXhlY3V0aW9uSWQoKSxcbiAgICAgIHJlc3VsdD8uZXJyb3I/LnN0YWNrIHx8IHJlc3VsdD8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ05vIGV4dHJhY3RvcnMgYXZhaWxhYmxlIHRvIGJyaWRnZSdcbiAgICApO1xuXG4gICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IHJlc3VsdC5leHRyYWN0b3I7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYnJpZGdlIGZyb20gdGhlIHNwZWNpZmllZCBleHRyYWN0b3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZXF1ZXN0IGJyaWRnZSBmb3JcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvciBvZiB0aGUgdHJhY2tcbiAgICogQHBhcmFtIHRhcmdldEV4dHJhY3RvciBUaGUgdGFyZ2V0IGV4dHJhY3RvciB0byBicmlkZ2UgdG9cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0QnJpZGdlRnJvbShcbiAgdHJhY2s6IFRyYWNrLFxuICBzb3VyY2VFeHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsLFxuICB0YXJnZXRFeHRyYWN0b3I6IEV4dHJhY3RvclJlc29sdmFibGUpXG4gIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlc29sdmUodGFyZ2V0RXh0cmFjdG9yKTtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRhcmdldC5icmlkZ2UodHJhY2ssIHNvdXJjZUV4dHJhY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZXh0cmFjdG9yIGlzIGRpc2FibGVkXG4gICAqL1xuICBwdWJsaWMgaXNEaXNhYmxlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGlkZW50aWZpZXIpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGV4dHJhY3RvciBpcyBlbmFibGVkXG4gICAqL1xuICBwdWJsaWMgaXNFbmFibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiAhdGhpcy5pc0Rpc2FibGVkKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgZXh0cmFjdG9yIGlkZW50aWZpZXJcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlSWQocmVzb2x2YWJsZTogRXh0cmFjdG9yUmVzb2x2YWJsZSkge1xuICAgIHJldHVybiB0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycgPyByZXNvbHZhYmxlIDogcmVzb2x2YWJsZS5pZGVudGlmaWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZShyZXNvbHZhYmxlOiBFeHRyYWN0b3JSZXNvbHZhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHRoaXMuZ2V0KHJlc29sdmFibGUpIDogcmVzb2x2YWJsZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3I7XG4gIGVycm9yOiBFcnJvciB8IG51bGw7XG4gIHJlc3VsdDogVDtcbn1cblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yRXhlY3V0aW9uRk48VCA9IHVua25vd24+ID0gKGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gUHJvbWlzZTxUIHwgYm9vbGVhbj47XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvclJlc29sdmFibGUgPSBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yOyIsICJpbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSB1bnNhZmUgPSBhbnk7XG5cbi8qKlxuICogVGhlIHJlY2VpdmVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY29udGV4dCBpcyBwcm92aWRlZFxuICovXG5leHBvcnQgdHlwZSBDb250ZXh0UmVjZWl2ZXI8Uj4gPSAoKSA9PiBSO1xuXG5leHBvcnQgY2xhc3MgQ29udGV4dDxUPiB7XG4gIHByaXZhdGUgc3RvcmFnZSA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZTxUPigpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRlZmF1bHRWYWx1ZT86IFQpIHt9XG5cbiAgLyoqXG4gICAqIEV4aXQgb3V0IG9mIHRoaXMgY29udGV4dFxuICAgKi9cbiAgcHVibGljIGV4aXQoc2NvcGU6IENvbnRleHRSZWNlaXZlcjx2b2lkPikge1xuICAgIHRoaXMuc3RvcmFnZS5leGl0KHNjb3BlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb250ZXh0IGlzIGxvc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNMb3N0KCkge1xuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0U3RvcmUoKSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY29udGV4dC4gSWYgdGhlIGNvbnRleHQgaXMgbG9zdCBhbmQgbm8gZGVmYXVsdCB2YWx1ZSBpcyBwcm92aWRlZCwgdW5kZWZpbmVkIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3VtZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5zdG9yYWdlLmdldFN0b3JlKCk7XG5cbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIHByb3ZpZGVyXG4gICAqL1xuICBwdWJsaWMgcHJvdmlkZTxSID0gdW5zYWZlPih2YWx1ZTogVCwgcmVjZWl2ZXI6IENvbnRleHRSZWNlaXZlcjxSPik6IFIge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgdmFsdWUgbWF5IG5vdCBiZSB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlY2VpdmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgcmVjZWl2ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5ydW4odmFsdWUsIHJlY2VpdmVyKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBjb250ZXh0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBvcHRpb25hbC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvbnRleHRcbiAqIEBleGFtcGxlIGNvbnN0IHVzZXJDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuICpcbiAqICAvLyB0aGUgdmFsdWUgdG8gcHJvdmlkZVxuICogIGNvbnN0IHVzZXIgPSB7XG4gKiAgIGlkOiAxLFxuICogICBuYW1lOiAnSm9obiBEb2UnXG4gKiAgfTtcbiAqXG4gKiAgLy8gcHJvdmlkZSB0aGUgY29udGV4dCB2YWx1ZSB0byB0aGUgcmVjZWl2ZXJcbiAqICBjb250ZXh0LnByb3ZpZGUodXNlciwgaGFuZGxlcik7XG4gKlxuICogIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gKiAgICAvLyBnZXQgdGhlIGNvbnRleHQgdmFsdWVcbiAqICAgIGNvbnN0IHsgaWQsIG5hbWUgfSA9IHVzZUNvbnRleHQoY29udGV4dCk7XG4gKlxuICogICAgY29uc29sZS5sb2coaWQsIG5hbWUpOyAvLyAxLCBKb2huIERvZVxuICogIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VCA9IHVuc2FmZT4oZGVmYXVsdFZhbHVlPzogVCk6IENvbnRleHQ8VD4ge1xuICByZXR1cm4gbmV3IENvbnRleHQoZGVmYXVsdFZhbHVlKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIGxvc3QgYW5kIG5vIGRlZmF1bHQgdmFsdWUgaXMgcHJvdmlkZWQsIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tXG4gKiBAZXhhbXBsZSBjb25zdCB2YWx1ZSA9IHVzZUNvbnRleHQoY29udGV4dCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDb250ZXh0PFQgPSB1bnNhZmU+KGNvbnRleHQ6IENvbnRleHQ8VD4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRleHQuY29uc3VtZSgpO1xufSIsICJpbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCB1bmtub3duPigpOyIsICJpbXBvcnQgeyBnbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxSZWdpc3RyeSgpIHtcbiAgcmV0dXJuIGdsb2JhbFJlZ2lzdHJ5O1xufSIsICJpbXBvcnQgeyBHdWlsZCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQvYXN5bmMtY29udGV4dCc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9va3NDdHgge1xuICBndWlsZDogR3VpbGQ7XG59XG5cbmV4cG9ydCBjb25zdCBTVVBFUl9DT05URVhUID0gY3JlYXRlQ29udGV4dDxQbGF5ZXI+KCk7XG5cbmNvbnN0IGdldEZhbGxiYWNrQ29udGV4dCA9ICgpID0+IHtcbiAgcmV0dXJuIGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW3BsYXllcl0nKSBhcyBQbGF5ZXIgfCB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIb29rc0NvbnRleHQoaG9va05hbWU6IHN0cmluZywgbWFpbk9ubHkgPSBmYWxzZSkge1xuICBsZXQgaXNGYWxsYmFjayA9IGZhbHNlO1xuXG4gIGxldCBwbGF5ZXI6IFBsYXllciB8IHVuZGVmaW5lZDtcblxuICBpZiAoIShwbGF5ZXIgPSBTVVBFUl9DT05URVhULmNvbnN1bWUoKSkpIHtcbiAgICBwbGF5ZXIgPSBnZXRGYWxsYmFja0NvbnRleHQoKTtcbiAgICBpc0ZhbGxiYWNrID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghcGxheWVyKVxuICB0aHJvdyBuZXcgSWxsZWdhbEhvb2tJbnZvY2F0aW9uRXJyb3IoXG4gICAgJ2Rpc2NvcmQtcGxheWVyJyxcbiAgICBgUGxheWVyIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSwgJHtcbiAgICBpc0ZhbGxiYWNrID9cbiAgICAnZGlkIHlvdSBmb3JnZXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGxheWVyIHdpdGggYG5ldyBQbGF5ZXIoY2xpZW50KWA/JyA6XG4gICAgJ2lzIGl0IGJlaW5nIGNhbGxlZCBpbnNpZGUgPFBsYXllcj4uY29udGV4dC5wcm92aWRlKCk/J31gXG5cbiAgKTtcblxuICBpZiAobWFpbk9ubHkpIHJldHVybiB7IHBsYXllciwgY29udGV4dDoge30gYXMgSG9va3NDdHgsIGlzRmFsbGJhY2sgfTtcblxuICBsZXQgY29udGV4dDogSG9va3NDdHggfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCFpc0ZhbGxiYWNrKSB7XG4gICAgY29udGV4dCA9IHVzZUNvbnRleHQocGxheWVyLmNvbnRleHQpO1xuICAgIGlmICghY29udGV4dClcbiAgICB0aHJvdyBuZXcgSWxsZWdhbEhvb2tJbnZvY2F0aW9uRXJyb3IoXG4gICAgICBob29rTmFtZSxcbiAgICAgIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dCBjcmVhdGVkIGJ5IDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpYFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dCA9IHtcbiAgICAgIGdldCBndWlsZCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICAgICAgIGhvb2tOYW1lLFxuICAgICAgICAgIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGV4cGxpY2l0IGd1aWxkIGFyZ3VtZW50IHdoZW4gbm90IGluc2lkZSBhIHBsYXllciBjb250ZXh0YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gYXMgdW5rbm93biBhcyBIb29rc0N0eDtcbiAgfVxuXG4gIHJldHVybiB7IGNvbnRleHQsIHBsYXllciwgaXNGYWxsYmFjayB9O1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgaGlzdG9yeVxuICogQHBhcmFtIG5vZGUgZ3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4obm9kZT86IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlSGlzdG9yeScpO1xuXG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlLmhpc3Rvcnk7XG59IiwgImltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBwbGF5ZXIgbm9kZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4obm9kZT86IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlUGxheWVyJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlLm5vZGU7XG59IiwgImltcG9ydCB7IEd1aWxkUXVldWUsIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlLlxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlLiBEZWZhdWx0cyB0byBpbmZlcnJlZCBndWlsZCBmcm9tIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlUXVldWUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLnJlc29sdmU8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlO1xufSIsICJpbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1haW5QbGF5ZXIoKSB7XG4gIGNvbnN0IHsgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1haW5QbGF5ZXInLCB0cnVlKTtcblxuICByZXR1cm4gcGxheWVyO1xufSIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgdHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcbmV4cG9ydCB0eXBlIE1ldGFkYXRhRGlzcGF0Y2g8VD4gPSByZWFkb25seSBbKCkgPT4gVCwgKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHZvaWRdO1xuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgZ3VpbGQgcXVldWUgbWV0YWRhdGFcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KCk6IE1ldGFkYXRhRGlzcGF0Y2g8VD47XG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogTWV0YWRhdGFEaXNwYXRjaDxUPjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VNZXRhZGF0YTxUID0gdW5rbm93bj4obm9kZT86IE5vZGVSZXNvbHZhYmxlKTogTWV0YWRhdGFEaXNwYXRjaDxUPiB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1ldGFkYXRhJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8VD4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSkgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKHF1ZXVlLm1ldGFkYXRhKSk7XG4gICAgICByZXR1cm4gcXVldWUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHF1ZXVlPy5tZXRhZGF0YSBhcyBUO1xuICB9O1xuXG4gIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufSIsICJpbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSwgUGxheWVyVGltZXN0YW1wIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnMge1xuICBpZ25vcmVGaWx0ZXJzOiBib29sZWFuO1xuICBub2RlOiBOb2RlUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlVGltZWxpbmUge1xuICByZWFkb25seSB0aW1lc3RhbXA6IFBsYXllclRpbWVzdGFtcDtcbiAgcmVhZG9ubHkgdm9sdW1lOiBudW1iZXI7XG4gIHJlYWRvbmx5IHBhdXNlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdHJhY2s6IFRyYWNrPHVua25vd24+IHwgbnVsbDtcbiAgcGF1c2UoKTogYm9vbGVhbjtcbiAgcmVzdW1lKCk6IGJvb2xlYW47XG4gIHNldFZvbHVtZSh2b2w6IG51bWJlcik6IGJvb2xlYW47XG4gIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBjdXJyZW50IHRyYWNrXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aW1lbGluZSBkaXNwYXRjaGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZSgpOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG9wdGlvbnM6IFBhcnRpYWw8VGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucz4pOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG9wdGlvbnM/OiBQYXJ0aWFsPFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnM+KTogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVRpbWVsaW5lJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQob3B0aW9ucz8ubm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdGltZWxpbmUgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAob3B0aW9ucz8uaWdub3JlRmlsdGVycykhO1xuICAgIH0sXG4gICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICB9LFxuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgIH0sXG4gICAgZ2V0IHRyYWNrKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICB9LFxuICAgIHBhdXNlKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICB9LFxuICAgIHJlc3VtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgIH0sXG4gICAgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sKTtcbiAgICB9LFxuICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0aW1lbGluZTtcbn0iLCAiaW1wb3J0IHsgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9xdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQWZ0ZXJDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn0iLCAiaW1wb3J0IHsgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vcXVldWUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBoYW5kbGVyXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25CZWZvcmVDcmVhdGVTdHJlYW0oaGFuZGxlcjogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufSIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG50eXBlIFNldHRlckZOID0gKHByZXZpb3VzOiBudW1iZXIpID0+IG51bWJlcjtcbnR5cGUgVm9sdW1lRGlzcGF0Y2ggPSByZWFkb25seSBbKCkgPT4gbnVtYmVyLCAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZF07XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBwbGF5ZXIgdm9sdW1lXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZSgpOiBWb2x1bWVEaXNwYXRjaDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUobm9kZTogTm9kZVJlc29sdmFibGUpOiBWb2x1bWVEaXNwYXRjaDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUobm9kZT86IE5vZGVSZXNvbHZhYmxlKTogVm9sdW1lRGlzcGF0Y2gge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VWb2x1bWUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldChub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBjb25zdCBzZXR0ZXIgPSAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4ge1xuICAgIGlmIChxdWV1ZSkge1xuICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24odm9sdW1lKSkgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZShxdWV1ZS5ub2RlLnZvbHVtZSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICByZXR1cm4gcXVldWU/Lm5vZGUudm9sdW1lIGFzIG51bWJlcjtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycywgQmlxdWFkRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciwgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyLCBRdWV1ZVJlcGVhdE1vZGUgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuaW1wb3J0IHsgTm9HdWlsZEVycm9yLCBOb0d1aWxkUXVldWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gdW5rbm93bj4ge1xuICBzdHJhdGVneT86IFF1ZXVlU3RyYXRlZ3k7XG4gIHZvbHVtZT86IG51bWJlcjtcbiAgZXF1YWxpemVyPzogRXF1YWxpemVyQmFuZFtdO1xuICBhX2ZpbHRlcj86IFBDTUZpbHRlcnNbXTtcbiAgYmlxdWFkPzogQmlxdWFkRmlsdGVycztcbiAgcmVzYW1wbGVyPzogbnVtYmVyO1xuICBkaXNhYmxlSGlzdG9yeT86IGJvb2xlYW47XG4gIG9uQmVmb3JlQ3JlYXRlU3RyZWFtPzogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICBvbkFmdGVyQ3JlYXRlU3RyZWFtPzogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gIHBhdXNlT25FbXB0eT86IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eT86IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eUNvb2xkb3duPzogbnVtYmVyO1xuICBsZWF2ZU9uRW5kPzogYm9vbGVhbjtcbiAgbGVhdmVPbkVuZENvb2xkb3duPzogbnVtYmVyO1xuICBsZWF2ZU9uU3RvcD86IGJvb2xlYW47XG4gIGxlYXZlT25TdG9wQ29vbGRvd24/OiBudW1iZXI7XG4gIG1ldGFkYXRhPzogVCB8IG51bGw7XG4gIHNlbGZEZWFmPzogYm9vbGVhbjtcbiAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIGRlZmF1bHRGRm1wZWdGaWx0ZXJzPzogRmlsdGVyc05hbWVbXTtcbiAgYnVmZmVyaW5nVGltZW91dD86IG51bWJlcjtcbiAgbm9FbWl0SW5zZXJ0PzogYm9vbGVhbjtcbiAgbWF4U2l6ZT86IG51bWJlcjtcbiAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gIHByZWZlckJyaWRnZWRNZXRhZGF0YT86IGJvb2xlYW47XG4gIGRpc2FibGVWb2x1bWU/OiBib29sZWFuO1xuICBkaXNhYmxlRXF1YWxpemVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZUZpbHRlcmVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZUJpcXVhZD86IGJvb2xlYW47XG4gIGRpc2FibGVSZXNhbXBsZXI/OiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW0/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBOb2RlUmVzb2x2YWJsZSA9IEd1aWxkUXVldWUgfCBHdWlsZFJlc29sdmFibGU7XG5cbmV4cG9ydCBjbGFzcyBHdWlsZE5vZGVNYW5hZ2VyPE1ldGEgPSB1bmtub3duPiB7XG4gIHB1YmxpYyBjYWNoZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZT4oKTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogQ3JlYXRlIGd1aWxkIHF1ZXVlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAqIEBwYXJhbSBndWlsZCBUaGUgZ3VpbGQgd2hpY2ggd2lsbCBiZSB0aGUgb3duZXIgb2YgdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBvcHRpb25zIFF1ZXVlIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGU8VCA9IE1ldGE+KGd1aWxkOiBHdWlsZFJlc29sdmFibGUsIG9wdGlvbnM6IEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnM8VD4gPSB7fSk6IEd1aWxkUXVldWU8VD4ge1xuICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBOb0d1aWxkRXJyb3IoJ0ludmFsaWQgb3IgdW5rbm93biBndWlsZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhzZXJ2ZXIuaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoc2VydmVyLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICBvcHRpb25zLnZvbHVtZSA/Pz0gMTAwO1xuICAgIG9wdGlvbnMuZXF1YWxpemVyID8/PSBbXTtcbiAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICBvcHRpb25zLmRpc2FibGVIaXN0b3J5ID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eSA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgIG9wdGlvbnMubGVhdmVPbkVuZCA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLnJlc2FtcGxlciA/Pz0gNDgwMDA7XG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0O1xuICAgIG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCA/Pz0gMTAwMDtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhID8/PSB0cnVlO1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuICAgIC8vIHRvZG8odHdsaXRlKTogbWF5YmUgZGlzYWJsZSB0aGVzZSBieSBkZWZhdWx0P1xuICAgIG9wdGlvbnMuZGlzYWJsZUJpcXVhZCA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVGaWx0ZXJlciA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlVm9sdW1lID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IHRydWU7XG4gICAgb3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuXG4gICAgaWYgKGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSB7XG4gICAgICBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJykgYXMgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIH1cblxuICAgIGlmIChnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScpICYmICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pIHtcbiAgICAgIG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJykgYXMgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgfVxuXG4gICAgY29uc3QgcXVldWUgPSBuZXcgR3VpbGRRdWV1ZTxUPih0aGlzLnBsYXllciwge1xuICAgICAgZ3VpbGQ6IHNlcnZlcixcbiAgICAgIHF1ZXVlU3RyYXRlZ3k6IG9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICB2b2x1bWU6IG9wdGlvbnMudm9sdW1lLFxuICAgICAgZXF1YWxpemVyOiBvcHRpb25zLmVxdWFsaXplcixcbiAgICAgIGZpbHRlcmVyOiBvcHRpb25zLmFfZmlsdGVyLFxuICAgICAgYmlxdWFkOiBvcHRpb25zLmJpcXVhZCxcbiAgICAgIHJlc2FtcGxlcjogb3B0aW9ucy5yZXNhbXBsZXIsXG4gICAgICBkaXNhYmxlSGlzdG9yeTogb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSxcbiAgICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtLFxuICAgICAgb25BZnRlckNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtLFxuICAgICAgcmVwZWF0TW9kZTogb3B0aW9ucy5yZXBlYXRNb2RlLFxuICAgICAgbGVhdmVPbkVtcHR5OiBvcHRpb25zLmxlYXZlT25FbXB0eSxcbiAgICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duLFxuICAgICAgbGVhdmVPbkVuZDogb3B0aW9ucy5sZWF2ZU9uRW5kLFxuICAgICAgbGVhdmVPbkVuZENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93bixcbiAgICAgIGxlYXZlT25TdG9wOiBvcHRpb25zLmxlYXZlT25TdG9wLFxuICAgICAgbGVhdmVPblN0b3BDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duLFxuICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICBjb25uZWN0aW9uVGltZW91dDogb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgc2VsZkRlYWY6IG9wdGlvbnMuc2VsZkRlYWYsXG4gICAgICBmZm1wZWdGaWx0ZXJzOiBvcHRpb25zLmRlZmF1bHRGRm1wZWdGaWx0ZXJzID8/IFtdLFxuICAgICAgYnVmZmVyaW5nVGltZW91dDogb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0LFxuICAgICAgbm9FbWl0SW5zZXJ0OiBvcHRpb25zLm5vRW1pdEluc2VydCA/PyBmYWxzZSxcbiAgICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YTogb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEsXG4gICAgICBtYXhIaXN0b3J5U2l6ZTogb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSxcbiAgICAgIG1heFNpemU6IG9wdGlvbnMubWF4U2l6ZSxcbiAgICAgIHBhdXNlT25FbXB0eTogb3B0aW9ucy5wYXVzZU9uRW1wdHksXG4gICAgICBkaXNhYmxlQmlxdWFkOiBvcHRpb25zLmRpc2FibGVCaXF1YWQsXG4gICAgICBkaXNhYmxlRXF1YWxpemVyOiBvcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICBkaXNhYmxlRmlsdGVyZXI6IG9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyLFxuICAgICAgZGlzYWJsZVJlc2FtcGxlcjogb3B0aW9ucy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgZGlzYWJsZVZvbHVtZTogb3B0aW9ucy5kaXNhYmxlVm9sdW1lLFxuICAgICAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtOiBvcHRpb25zLmRpc2FibGVGYWxsYmFja1N0cmVhbVxuICAgIH0pO1xuXG4gICAgdGhpcy5jYWNoZS5zZXQoc2VydmVyLmlkLCBxdWV1ZSk7XG5cbiAgICByZXR1cm4gcXVldWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGV4aXN0aW5nIHF1ZXVlXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyBnZXQ8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQocXVldWUuaWQpIGFzIEd1aWxkUXVldWU8VD4gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHF1ZXVlIGV4aXN0c1xuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgaGFzKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgaWQgPSBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/IG5vZGUuaWQgOiB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuaGFzKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZShub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgIGlmICghcXVldWUpIHtcbiAgICAgIHRocm93IG5ldyBOb0d1aWxkUXVldWVFcnJvcignQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RpbmcgcXVldWUnKTtcbiAgICB9XG5cbiAgICBxdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKHRydWUpO1xuICAgIHF1ZXVlLm5vZGUuc3RvcCh0cnVlKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcXVldWUuY29ubmVjdGlvbj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcXVldWUuZGlzcGF0Y2hlcj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcXVldWUuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgIHF1ZXVlLnRpbWVvdXRzLmZvckVhY2goKHRtKSA9PiBjbGVhclRpbWVvdXQodG0pKTtcbiAgICBxdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgcXVldWUudHJhY2tzLmNsZWFyKCk7XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZS5kZWxldGUocXVldWUuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIHJlc29sdmU8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZTxUPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlKSB7XG4gICAgICByZXR1cm4gbm9kZSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldCh0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSEpIGFzIEd1aWxkUXVldWU8VD47XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBxdWV1ZSBpZFxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZUlkKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICByZXR1cm4gcT8uaWQgfHwgbnVsbDtcbiAgfVxufSIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMsIFRyYWNrTGlrZSB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR3VpbGQsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgVm9pY2VCYXNlZENoYW5uZWwsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IHR5cGUgQXVkaW9QbGF5ZXIsIEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUsIFZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuL0d1aWxkUXVldWVIaXN0b3J5JztcbmltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBTdHJlYW1Db25maWcgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcbmltcG9ydCB7IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnMgfSBmcm9tICcuL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlU3RhdGlzdGljcyB9IGZyb20gJy4vR3VpbGRRdWV1ZVN0YXRpc3RpY3MnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQge1xuICBJbnZhbGlkQXJnVHlwZUVycm9yLFxuICBOb1ZvaWNlQ2hhbm5lbEVycm9yLFxuICBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yLFxuICBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU3luY2VkTHlyaWNzUHJvdmlkZXIgfSBmcm9tICcuL1N5bmNlZEx5cmljc1Byb3ZpZGVyJztcbmltcG9ydCB7IExyY0dldFJlc3VsdCwgTHJjU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVJbml0PE1ldGEgPSB1bmtub3duPiB7XG4gIGd1aWxkOiBHdWlsZDtcbiAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICBsZWF2ZU9uRW1wdHk6IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eUNvb2xkb3duOiBudW1iZXI7XG4gIGxlYXZlT25FbmQ6IGJvb2xlYW47XG4gIGxlYXZlT25FbmRDb29sZG93bjogbnVtYmVyO1xuICBsZWF2ZU9uU3RvcDogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bjogbnVtYmVyO1xuICBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyO1xuICBzZWxmRGVhZj86IGJvb2xlYW47XG4gIG1ldGFkYXRhPzogTWV0YSB8IG51bGw7XG4gIGJ1ZmZlcmluZ1RpbWVvdXQ6IG51bWJlcjtcbiAgbm9FbWl0SW5zZXJ0OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBib29sZWFuO1xuICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICBkaXNhYmxlVm9sdW1lOiBib29sZWFuO1xuICBkaXNhYmxlRXF1YWxpemVyOiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI6IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ6IGJvb2xlYW47XG4gIGRpc2FibGVSZXNhbXBsZXI6IGJvb2xlYW47XG4gIGRpc2FibGVGYWxsYmFja1N0cmVhbTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUNvbm5lY3RDb25maWcge1xuICBkZWFmPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gIHN0cmVhbTogUmVhZGFibGU7XG4gIHR5cGU6IFN0cmVhbVR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChcbnRyYWNrOiBUcmFjayxcbnF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlLFxucXVldWU6IEd1aWxkUXVldWUpXG49PiBQcm9taXNlPFJlYWRhYmxlIHwgbnVsbD47XG5leHBvcnQgdHlwZSBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChzdHJlYW06IFJlYWRhYmxlLCBxdWV1ZTogR3VpbGRRdWV1ZSkgPT4gUHJvbWlzZTxQb3N0UHJvY2Vzc2VkUmVzdWx0IHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIFBsYXllclRyaWdnZXJlZFJlYXNvbiA9ICdmaWx0ZXJzJyB8ICdub3JtYWwnO1xuXG5leHBvcnQgY29uc3QgR3VpbGRRdWV1ZUV2ZW50ID0ge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKi9cbiAgQXVkaW9UcmFja0FkZDogJ2F1ZGlvVHJhY2tBZGQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKi9cbiAgQXVkaW9UcmFja3NBZGQ6ICdhdWRpb1RyYWNrc0FkZCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKi9cbiAgQXVkaW9UcmFja1JlbW92ZTogJ2F1ZGlvVHJhY2tSZW1vdmUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKi9cbiAgQXVkaW9UcmFja3NSZW1vdmU6ICdhdWRpb1RyYWNrc1JlbW92ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICovXG4gIENvbm5lY3Rpb246ICdjb25uZWN0aW9uJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNvbm5lY3Rpb24gaXMgZGVzdHJveWVkXG4gICAqL1xuICBDb25uZWN0aW9uRGVzdHJveWVkOiAnY29ubmVjdGlvbkRlc3Ryb3llZCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgKi9cbiAgRGlzY29ubmVjdDogJ2Rpc2Nvbm5lY3QnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBzZW5kcyBhIGRlYnVnIGluZm9cbiAgICovXG4gIERlYnVnOiAnZGVidWcnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBlbmNvdW50ZXJzIGVycm9yXG4gICAqL1xuICBFcnJvcjogJ2Vycm9yJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgKi9cbiAgRW1wdHlDaGFubmVsOiAnZW1wdHlDaGFubmVsJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICovXG4gIEVtcHR5UXVldWU6ICdlbXB0eVF1ZXVlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHN0YXJ0cyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICovXG4gIFBsYXllclN0YXJ0OiAncGxheWVyU3RhcnQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKi9cbiAgUGxheWVyRXJyb3I6ICdwbGF5ZXJFcnJvcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBmaW5pc2hlcyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICovXG4gIFBsYXllckZpbmlzaDogJ3BsYXllckZpbmlzaCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBza2lwcyBjdXJyZW50IHRyYWNrXG4gICAqL1xuICBQbGF5ZXJTa2lwOiAncGxheWVyU2tpcCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICovXG4gIFBsYXllclRyaWdnZXI6ICdwbGF5ZXJUcmlnZ2VyJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2Ugc3RhdGUgaXMgdXBkYXRlZC4gQ29uc3VtaW5nIHRoaXMgZXZlbnQgbWF5IGRpc2FibGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBgUGxheWVyLmlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKWAgcmV0dXJucyBgZmFsc2VgLlxuICAgKi9cbiAgVm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHZvbHVtZSBpcyB1cGRhdGVkXG4gICAqL1xuICBWb2x1bWVDaGFuZ2U6ICd2b2x1bWVDaGFuZ2UnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyBwYXVzZWRcbiAgICovXG4gIFBsYXllclBhdXNlOiAncGxheWVyUGF1c2UnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyByZXN1bWVkXG4gICAqL1xuICBQbGF5ZXJSZXN1bWU6ICdwbGF5ZXJSZXN1bWUnLFxuICAvKipcbiAgICogQmlxdWFkIEZpbHRlcnMgVXBkYXRlXG4gICAqL1xuICBCaXF1YWRGaWx0ZXJzVXBkYXRlOiAnYmlxdWFkRmlsdGVyc1VwZGF0ZScsXG4gIC8qKlxuICAgKiBFcXVhbGl6ZXIgVXBkYXRlXG4gICAqL1xuICBFcXVhbGl6ZXJVcGRhdGU6ICdlcXVhbGl6ZXJVcGRhdGUnLFxuICAvKipcbiAgICogRFNQIHVwZGF0ZVxuICAgKi9cbiAgRFNQVXBkYXRlOiAnZHNwVXBkYXRlJyxcbiAgLyoqXG4gICAqIEF1ZGlvIEZpbHRlcnMgVXBkYXRlXG4gICAqL1xuICBBdWRpb0ZpbHRlcnNVcGRhdGU6ICdhdWRpb0ZpbHRlcnNVcGRhdGUnLFxuICAvKipcbiAgICogQXVkaW8gcGxheWVyIHdpbGwgcGxheSBuZXh0IHRyYWNrXG4gICAqL1xuICBXaWxsUGxheVRyYWNrOiAnd2lsbFBsYXlUcmFjaycsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHJlcG9wdWxhdGVkXG4gICAqL1xuICBDaGFubmVsUG9wdWxhdGU6ICdjaGFubmVsUG9wdWxhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICovXG4gIFF1ZXVlQ3JlYXRlOiAncXVldWVDcmVhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgZGVsZXRlZFxuICAgKi9cbiAgUXVldWVEZWxldGU6ICdxdWV1ZURlbGV0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyB0cnlpbmcgdG8gYWRkIHNpbWlsYXIgdHJhY2sgZm9yIGF1dG9wbGF5XG4gICAqL1xuICBXaWxsQXV0b1BsYXk6ICd3aWxsQXV0b1BsYXknXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBHdWlsZFF1ZXVlRXZlbnQgPSAodHlwZW9mIEd1aWxkUXVldWVFdmVudClba2V5b2YgdHlwZW9mIEd1aWxkUXVldWVFdmVudF07XG5cbmV4cG9ydCBlbnVtIFRyYWNrU2tpcFJlYXNvbiB7XG4gIE5vU3RyZWFtID0gJ0VSUl9OT19TVFJFQU0nLFxuICBNYW51YWwgPSAnTUFOVUFMJyxcbiAgU0VFS19PVkVSX1RIUkVTSE9MRCA9ICdTRUVLX09WRVJfVEhSRVNIT0xEJyxcbiAgSnVtcCA9ICdKVU1QRURfVE9fQU5PVEhFUl9UUkFDSycsXG4gIFNraXBUbyA9ICdTS0lQX1RPX0FOT1RIRVJfVFJBQ0snLFxuICBIaXN0b3J5TmV4dCA9ICdISVNUT1JZX05FWFRfVFJBQ0snLFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSBhbnk+IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2tzIGFycmF5XG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tSZW1vdmVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb25EZXN0cm95ZWRdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5EZWJ1Z106IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgbWVzc2FnZTogc3RyaW5nKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBlbmNvdW50ZXJzIGVycm9yXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkVycm9yXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkVtcHR5Q2hhbm5lbF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkVtcHR5UXVldWVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgaXMgYmVpbmcgc3RyZWFtZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU3RhcnRdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IsIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2hdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgc2tpcHBlZFxuICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHNraXBwaW5nXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gZm9yIHNraXBwaW5nXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXBdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2ssXG4gIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLFxuICBkZXNjcmlwdGlvbjogc3RyaW5nKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHdoaWNoIHdhcyBwbGF5ZWQgaW4gdGhpcyBldmVudFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJUcmlnZ2VyXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2ssIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHBhdXNlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyUGF1c2VdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHJlc3VtZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIncyB2b2x1bWUgaXMgY2hhbmdlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZFZvbHVtZSBUaGUgb2xkIHZvbHVtZVxuICAgKiBAcGFyYW0gbmV3Vm9sdW1lIFRoZSB1cGRhdGVkIHZvbHVtZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2x1bWVDaGFuZ2VdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZFZvbHVtZTogbnVtYmVyLCBuZXdWb2x1bWU6IG51bWJlcikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBlcXVhbGl6ZXIgY29uZmlnIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkVxdWFsaXplclVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSxcbiAgbmV3RmlsdGVyczogRXF1YWxpemVyQmFuZFtdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGJpcXVhZCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkJpcXVhZEZpbHRlcnNVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCxcbiAgbmV3RmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gZHNwIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRFNQVXBkYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBQQ01GaWx0ZXJzW10sIG5ld0ZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBmZm1wZWcgYXVkaW8gZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb0ZpbHRlcnNVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdLFxuICBuZXdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdKVxuICA9PiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIGJlZm9yZSBzdHJlYW1pbmcgYW4gYXVkaW8gdHJhY2suIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHN0cmVhbSBjb25maWcgYmVmb3JlIHBsYXlpbmcgYSB0cmFjay5cbiAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdpbGwgYmUgc3RyZWFtZWRcbiAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbFBsYXlUcmFja106IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjazx1bmtub3duPixcbiAgY29uZmlnOiBTdHJlYW1Db25maWcsXG4gIGRvbmU6ICgpID0+IHZvaWQpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHBvcHVsYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQ2hhbm5lbFBvcHVsYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlRGVsZXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgc2ltaWxhciB0cmFja3MgdGhhdCB3ZXJlIGZvdW5kXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbEF1dG9QbGF5XTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2tzOiBUcmFja1tdLFxuICBkb25lOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZClcbiAgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBUaGUgcXVldWUgcmVwZWF0IG1vZGUuIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gT0ZGXG4gKiAtIFRSQUNLXG4gKiAtIFFVRVVFXG4gKiAtIEFVVE9QTEFZXG4gKi9cbmV4cG9ydCBjb25zdCBRdWV1ZVJlcGVhdE1vZGUgPSB7XG4gIC8qKlxuICAgKiBEaXNhYmxlIHJlcGVhdCBtb2RlLlxuICAgKi9cbiAgT0ZGOiAwLFxuICAvKipcbiAgICogUmVwZWF0IHRoZSBjdXJyZW50IHRyYWNrLlxuICAgKi9cbiAgVFJBQ0s6IDEsXG4gIC8qKlxuICAgKiBSZXBlYXQgdGhlIGVudGlyZSBxdWV1ZS5cbiAgICovXG4gIFFVRVVFOiAyLFxuICAvKipcbiAgICogV2hlbiBsYXN0IHRyYWNrIGVuZHMsIHBsYXkgc2ltaWxhciB0cmFja3MgaW4gdGhlIGZ1dHVyZSBpZiBxdWV1ZSBpcyBlbXB0eS5cbiAgICovXG4gIEFVVE9QTEFZOiAzXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBRdWV1ZVJlcGVhdE1vZGUgPSAodHlwZW9mIFF1ZXVlUmVwZWF0TW9kZSlba2V5b2YgdHlwZW9mIFF1ZXVlUmVwZWF0TW9kZV07XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlPE1ldGEgPSB1bmtub3duPiB7XG4gICN0cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICNkZWxldGVkID0gZmFsc2U7XG4gICNzaHVmZmxlID0gZmFsc2U7XG4gIHByaXZhdGUgX19jdXJyZW50OiBUcmFjayB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgdHJhY2tzOiBRdWV1ZTxUcmFjaz47XG4gIHB1YmxpYyBoaXN0b3J5ID0gbmV3IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgbm9kZSA9IG5ldyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPih0aGlzKTtcbiAgcHVibGljIGZpbHRlcnMgPSBuZXcgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPih0aGlzKTtcbiAgcHVibGljIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoKSA9PiBudWxsO1xuICBwdWJsaWMgb25BZnRlckNyZWF0ZVN0cmVhbTogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoc3RyZWFtKSA9PiAoe1xuICAgIHN0cmVhbSxcbiAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICB9KTtcbiAgcHVibGljIHJlcGVhdE1vZGU6IFF1ZXVlUmVwZWF0TW9kZSA9IFF1ZXVlUmVwZWF0TW9kZS5PRkY7XG4gIHB1YmxpYyB0aW1lb3V0cyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgTm9kZUpTLlRpbWVvdXQ+KCk7XG4gIHB1YmxpYyBzdGF0cyA9IG5ldyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhPih0aGlzKTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgc3luY2VkTHlyaWNzUHJvdmlkZXIgPSBuZXcgU3luY2VkTHlyaWNzUHJvdmlkZXIodGhpcyk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHVibGljIG9wdGlvbnM6IEd1aWxkTm9kZUluaXQ8TWV0YT4pIHtcbiAgICB0aGlzLnRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4ob3B0aW9ucy5xdWV1ZVN0cmF0ZWd5KTtcbiAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSkgdGhpcy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW07XG4gICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtKSkgdGhpcy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtO1xuICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpIHRoaXMucmVwZWF0TW9kZSA9IG9wdGlvbnMucmVwZWF0TW9kZTtcblxuICAgIG9wdGlvbnMuc2VsZkRlYWYgPz89IHRydWU7XG4gICAgb3B0aW9ucy5tYXhTaXplID8/PSBJbmZpbml0eTtcbiAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICBvcHRpb25zLnBhdXNlT25FbXB0eSA/Pz0gdHJ1ZTtcblxuICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKHRoaXMub3B0aW9ucy5iaXF1YWQpICYmICFUeXBlVXRpbC5pc0Jvb2xlYW4odGhpcy5vcHRpb25zLmJpcXVhZCkpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSB0aGlzLm9wdGlvbnMuYmlxdWFkO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmlsdGVyZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IHRoaXMub3B0aW9ucy5maWx0ZXJlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIodGhpcy5vcHRpb25zLnJlc2FtcGxlcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gdGhpcy5vcHRpb25zLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ1tHdWlsZE5vZGVJbml0Lm1heFNpemVdJywgJ251bWJlcicsIHR5cGVvZiBvcHRpb25zLm1heFNpemUpO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdbR3VpbGROb2RlSW5pdC5tYXhIaXN0b3J5U2l6ZV0nLCAnbnVtYmVyJywgdHlwZW9mIG9wdGlvbnMubWF4SGlzdG9yeVNpemUpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1heFNpemUgPCAxKSBvcHRpb25zLm1heFNpemUgPSBJbmZpbml0eTtcbiAgICBpZiAob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA8IDEpIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBJbmZpbml0eTtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoYEd1aWxkUXVldWUgaW5pdGlhbGl6ZWQgZm9yIGd1aWxkICR7dGhpcy5vcHRpb25zLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLm9wdGlvbnMuZ3VpbGQuaWR9KWApO1xuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlIGluIG1zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zdG9yZS5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLmR1cmF0aW9uTVMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3luYyBseXJpY3MgcHJvdmlkZXIgZm9yIHRoaXMgcXVldWUuXG4gICAqIEBleGFtcGxlIGNvbnN0IGx5cmljcyA9IGF3YWl0IHBsYXllci5seXJpY3Muc2VhcmNoKHsgcTogJ0FsYW4gV2Fsa2VyIEZhZGVkJyB9KTtcbiAgICogY29uc3Qgc3luY2VkTHlyaWNzID0gcXVldWUuc3luY2VkTHlyaWNzKGx5cmljc1swXSk7XG4gICAqIGNvbnNvbGUubG9nKHN5bmNlZEx5cmljcy5hdCgxMF8wMDApKTtcbiAgICogLy8gc3Vic2NyaWJlIHRvIGx5cmljcyBjaGFuZ2VcbiAgICogY29uc3QgdW5zdWJzY3JpYmUgPSBzeW5jZWRMeXJpY3Mub25DaGFuZ2UoKGx5cmljcywgdGltZXN0YW1wKSA9PiB7XG4gICAqICAgIGNvbnNvbGUubG9nKGx5cmljcywgdGltZXN0YW1wKTtcbiAgICogfSk7XG4gICAqIC8vIHVuc3Vic2NyaWJlIGZyb20gbHlyaWNzIGNoYW5nZVxuICAgKiB1bnN1YnNjcmliZSgpOyAvLyBvclxuICAgKiBzeW5jZWRMeXJpY3MudW5zdWJzY3JpYmUoKTtcbiAgICovXG4gIHB1YmxpYyBzeW5jZWRMeXJpY3MobHlyaWNzOiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpIHtcbiAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmxvYWQobHlyaWNzPy5zeW5jZWRMeXJpY3MgPz8gJycpO1xuICAgIHJldHVybiB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZSB0byB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBtIFRoZSBtZXNzYWdlIHRvIHdyaXRlXG4gICAqL1xuICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5EZWJ1ZywgdGhpcywgbSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhZGF0YSE7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgY3VycmVudCB0cmFjayBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLl9fY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBxdWV1ZSB3YXMgZGVsZXRlZCBwcmV2aW91c2x5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjaGFubmVsKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmNoYW5uZWwgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICBpZiAoYykge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGd1aWxkIHRoaXMgcXVldWUgYmVsb25ncyB0b1xuICAgKi9cbiAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmd1aWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy4jdHJhbnNpdGlvbmluZyA9IHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIGlmIHRoaXMgcXVldWUgaXMgY3VycmVudGx5IHVuZGVyIHRyYW5zaXRpb24gbW9kZVxuICAgKi9cbiAgcHVibGljIGlzVHJhbnNpdGlvbmluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIG1vZGUgVGhlIHJlcGVhdCBtb2RlIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICB0aGlzLnJlcGVhdE1vZGUgPSBtb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldE1heFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXRTaXplKCkge1xuICAgIHJldHVybiB0aGlzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heEhpc3RvcnlTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0TWF4SGlzdG9yeVNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4SGlzdG9yeVNpemU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1heCBoaXN0b3J5IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4SGlzdG9yeVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgIH1cblxuICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWF4IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcignc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZSA9IHNpemU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBoYXMgbm8gdHJhY2tzIGxlZnQgaW4gaXRcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGlzIGZ1bGxcbiAgICovXG4gIHB1YmxpYyBpc0Z1bGwoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPj0gdGhpcy5tYXhTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBxdWV1ZSBjYXBhY2l0eVxuICAgKi9cbiAgcHVibGljIGdldENhcGFjaXR5KCkge1xuICAgIGlmICh0aGlzLmlzRnVsbCgpKSByZXR1cm4gMDtcbiAgICBjb25zdCBjYXAgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemU7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZSAhPSBudWxsICYmICF0aGlzLmRpc3BhdGNoZXIuYXVkaW9SZXNvdXJjZS5lbmRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdHJhY2sgdG8gdGhlIHF1ZXVlLiBUaGlzIHdpbGwgZW1pdCBgYXVkaW9UcmFja3NBZGRgIHdoZW4gbXVsdGlwbGUgdHJhY2tzIGFyZSBhZGRlZCwgb3RoZXJ3aXNlIGBhdWRpb1RyYWNrQWRkYC5cbiAgICogQHBhcmFtIHRyYWNrIFRyYWNrIG9yIHBsYXlsaXN0IG9yIGFycmF5IG9mIHRyYWNrcyB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRUcmFjayh0cmFjazogVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QpIHtcbiAgICBjb25zdCB0b0FkZCA9IHRyYWNrIGluc3RhbmNlb2YgUGxheWxpc3QgPyB0cmFjay50cmFja3MgOiB0cmFjaztcbiAgICBjb25zdCBpc011bHRpID0gQXJyYXkuaXNBcnJheSh0b0FkZCk7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgdG9BZGQpO1xuXG4gICAgdGhpcy50cmFja3MuYWRkKHRvQWRkKTtcblxuICAgIGlmIChpc011bHRpKSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdG9BZGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB0cmFjayBmcm9tIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIHJldHVybiB0aGlzLm5vZGUucmVtb3ZlKHRyYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIHRoZSB0cmFjayB0byB0aGUgZ2l2ZW4gaW5kZXhcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKVxuICAgKi9cbiAgcHVibGljIGluc2VydFRyYWNrKHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5tb3ZlKHRyYWNrLCBpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgKi9cbiAgcHVibGljIGNvcHlUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmNvcHkodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBzcmMgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICogQHBhcmFtIGRlc3QgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAqL1xuICBwdWJsaWMgc3dhcFRyYWNrcyhzcmM6IFRyYWNrUmVzb2x2YWJsZSwgZGVzdDogVHJhY2tSZXNvbHZhYmxlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5zd2FwKHNyYywgZGVzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHN0cmVhbSBkaXNwYXRjaGVyIGZyb20gdGhlIGdpdmVuIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gdXNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlRGlzcGF0Y2hlcihcbiAgY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLFxuICBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSlcbiAge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IFZvaWNlQ29ubmVjdGlvbkRlc3Ryb3llZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5jYWNoZS5nZXQoY29ubmVjdGlvbi5qb2luQ29uZmlnLmNoYW5uZWxJZCEpO1xuICAgIGlmICghY2hhbm5lbCkgdGhyb3cgbmV3IE5vVm9pY2VDaGFubmVsRXJyb3IoKTtcbiAgICBpZiAoIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAnY2hhbm5lbCcsXG4gICAgICBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCxcbiAgICAgIFN0cmluZyhjaGFubmVsPy50eXBlKVxuICAgICk7XG5cbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKFxuICAgICAgY29ubmVjdGlvbixcbiAgICAgIGNoYW5uZWwsXG4gICAgICB0aGlzLFxuICAgICAgb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCxcbiAgICAgIG9wdGlvbnMuYXVkaW9QbGF5ZXJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSBjaGFubmVsUmVzb2x2YWJsZSBUaGUgdm9pY2UgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAqIEBwYXJhbSBvcHRpb25zIEpvaW4gY29uZmlnXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdChjaGFubmVsUmVzb2x2YWJsZTogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zOiBWb2ljZUNvbm5lY3RDb25maWcgPSB7fSkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsUmVzb2x2YWJsZSk7XG4gICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICAgJ2NoYW5uZWwnLFxuICAgICAgICBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCxcbiAgICAgICAgU3RyaW5nKGNoYW5uZWw/LnR5cGUpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgQ29ubmVjdGluZyB0byAke2NoYW5uZWwudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlID8gJ3N0YWdlJyA6ICd2b2ljZSd9IGNoYW5uZWwgJHtcbiAgICAgIGNoYW5uZWwubmFtZX0gKElEOiAke1xuICAgICAgY2hhbm5lbC5pZH0pYFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsLmlkKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBhd2FpdCB0aGlzLnBsYXllci52b2ljZVV0aWxzLmNvbm5lY3QoY2hhbm5lbCwge1xuICAgICAgZGVhZjogb3B0aW9ucy5kZWFmID8/IHRoaXMub3B0aW9ucy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgbWF4VGltZTogb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgIHF1ZXVlOiB0aGlzLFxuICAgICAgYXVkaW9QbGF5ZXI6IG9wdGlvbnM/LmF1ZGlvUGxheWVyLFxuICAgICAgZ3JvdXA6IG9wdGlvbnMuZ3JvdXAgPz8gdGhpcy5wbGF5ZXIuY2xpZW50LnVzZXI/LmlkXG4gICAgfSk7XG5cbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb24sIHRoaXMpO1xuXG4gICAgaWYgKHRoaXMuY2hhbm5lbCEudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFN1cHByZXNzZWQoZmFsc2UpLmNhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuI2F0dGFjaExpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIER5bmFtaWMgc2h1ZmZsaW5nIHdpbGwgc2h1ZmZsZSB0aGUgcXVldWUgd2hlbiB0aGUgY3VycmVudCB0cmFjayBlbmRzLCB3aXRob3V0IG11dGF0aW5nIHRoZSBxdWV1ZS5cbiAgICogSWYgc2V0IHRvIGBmYWxzZWAsIHRoZSBxdWV1ZSB3aWxsIGJlIHNodWZmbGVkIGltbWVkaWF0ZWx5IGluLXBsYWNlLCB3aGljaCBjYW5ub3QgYmUgdW5kb25lLlxuICAgKi9cbiAgcHVibGljIGVuYWJsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoIWR5bmFtaWMpIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuI3NodWZmbGUgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGRpc2FibGVTaHVmZmxlKCkge1xuICAgIHRoaXMuI3NodWZmbGUgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgc2h1ZmZsZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoZHluYW1pYykge1xuICAgICAgdGhpcy4jc2h1ZmZsZSA9ICF0aGlzLiNzaHVmZmxlO1xuICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNodWZmbGUgbW9kZSBpcyBlbmFibGVkIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1NodWZmbGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jc2h1ZmZsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBsYXRlbmN5IG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIubm9kZXMuZGVsZXRlKHRoaXMuaWQpKSB7XG4gICAgICB0aGlzLiNkZWxldGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZURlbGV0ZSwgdGhpcyk7XG4gICAgICB0aGlzLm5vZGUudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgIHRoaXMudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgcmV2aXZlKCkge1xuICAgIGlmICghdGhpcy5kZWxldGVkIHx8IHRoaXMucGxheWVyLm5vZGVzLmhhcyh0aGlzLmlkKSkgcmV0dXJuO1xuICAgIHRoaXMuI2RlbGV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLnNldCh0aGlzLmlkLCB0aGlzKTtcbiAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZWxmIGRlYWZcbiAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZkRlYWYobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldERlYWYobW9kZSwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc2VsZiBtdXRlXG4gICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgKi9cbiAgcHVibGljIHNldFNlbGZNdXRlKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRNdXRlKG1vZGUsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogUGxheSBhIHRyYWNrIGluIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIG5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXkodHJhY2s6IFRyYWNrTGlrZSwgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8TWV0YT4pIHtcbiAgICBpZiAoIXRoaXMuY2hhbm5lbCkgdGhyb3cgbmV3IE5vVm9pY2VDb25uZWN0aW9uRXJyb3IoKTtcblxuICAgIHJldHVybiB0aGlzLnBsYXllci5wbGF5KHRoaXMuY2hhbm5lbCwgdHJhY2ssIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYW4gZXZlbnQgb24gdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGVtaXRcbiAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgZm9yIHRoZSBldmVudFxuICAgKi9cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEd1aWxkUXVldWVFdmVudHM8TWV0YT4+KFxuICBldmVudDogSyxcbiAgLi4uYXJnczogUGFyYW1ldGVyczxHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+W0tdPilcbiAgOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kZWxldGVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfVxuXG4gICNhdHRhY2hMaXN0ZW5lcnMoZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgIGRpc3BhdGNoZXIub24oJ2Vycm9yJywgKGUpID0+IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIHRoaXMsIGUpKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkZWJ1ZycsIChtKSA9PiB0aGlzLmhhc0RlYnVnZ2VyICYmIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGVidWcsIHRoaXMsIG0pKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdmaW5pc2gnLCAocikgPT4gdGhpcy4jcGVyZm9ybUZpbmlzaChyKSk7XG4gICAgZGlzcGF0Y2hlci5vbignc3RhcnQnLCAocikgPT4gdGhpcy4jcGVyZm9ybVN0YXJ0KHIpKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkZXN0cm95ZWQnLCAoKSA9PiB7XG4gICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnMoZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2RzcCcsIChmKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5pcyh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZikpIHtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5EU1BVcGRhdGUsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLCBmKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gZjtcbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdiaXF1YWQnLCAoZikgPT4ge1xuICAgICAgaWYgKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgIT09IGYpIHtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5CaXF1YWRGaWx0ZXJzVXBkYXRlLCB0aGlzLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkLCBmKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2VxQmFuZHMnLCAoZikgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaXMoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcikpIHtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5FcXVhbGl6ZXJVcGRhdGUsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsIGYpO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbigndm9sdW1lJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lICE9PSBmKVxuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5Wb2x1bWVDaGFuZ2UsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsIGYpO1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IGY7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0RlYnVnZ2VyKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuaGFzRGVidWdnZXI7XG4gIH1cblxuICAjcmVtb3ZlTGlzdGVuZXJzPFQgZXh0ZW5kcyB7cmVtb3ZlQWxsTGlzdGVuZXJzOiAoKSA9PiB1bmtub3duO30+KHRhcmdldDogVCkge1xuICAgIHRhcmdldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gICNwZXJmb3JtU3RhcnQocmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgIGNvbnN0IHRyYWNrID0gcmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuY3VycmVudFRyYWNrO1xuICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuaXNUcmFuc2l0aW9uaW5nKCkgPyAnZmlsdGVycycgOiAnbm9ybWFsJztcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgUGxheWVyIHRyaWdnZXJlZCBmb3IgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgIHJlYXNvblxuICAgICAgfSl9YFxuICAgICk7XG5cbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclRyaWdnZXIsIHRoaXMsIHRyYWNrISwgcmVhc29uKTtcbiAgICBpZiAodHJhY2sgJiYgIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU3RhcnQsIHRoaXMsIHRyYWNrKTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICB9XG5cbiAgI2dldE5leHRUcmFjaygpIHtcbiAgICBpZiAoIXRoaXMuaXNTaHVmZmxpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy50cmFja3Muc3RvcmU7XG5cbiAgICBpZiAoIXN0b3JlLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHJhY2sgPSBVdGlsLnJhbmRvbUNob2ljZShzdG9yZSk7XG5cbiAgICB0aGlzLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHtcbiAgICAgIHJldHVybiB0LmlkID09PSB0cmFjay5pZDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFjaztcbiAgfVxuXG4gICNwZXJmb3JtRmluaXNoKHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgIGlzVHJhbnNpdGlvbk1vZGU6IHRoaXMuaXNUcmFuc2l0aW9uaW5nKClcbiAgICAgIH0pfSB3YXMgbWFya2VkIGFzIGZpbmlzaGVkYFxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHtcbiAgICAgIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXIubHlyaWNzLmNsZWFyKCk7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoJ0FkZGluZyB0cmFjayB0byBoaXN0b3J5IGFuZCBlbWl0dGluZyBmaW5pc2ggZXZlbnQgc2luY2UgdHJhbnNpdGlvbiBtb2RlIGlzIGRpc2FibGVkLi4uJyk7XG4gICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2godHJhY2spO1xuICAgICAgICB0aGlzLm5vZGUucmVzZXRQcm9ncmVzcygpO1xuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllckZpbmlzaCwgdGhpcywgdHJhY2spO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuI2RlbGV0ZWQpIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICBpZiAodGhpcy50cmFja3Muc2l6ZSA8IDEgJiYgdGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuT0ZGKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKCdObyBtb3JlIHRyYWNrcyBsZWZ0IGluIHRoZSBxdWV1ZSB0byBwbGF5IGFuZCByZXBlYXQgbW9kZSBpcyBvZmYsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuVFJBQ0spIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJyk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHF1ZXVlLCBtb3ZpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5IHRvIGN1cnJlbnQgcXVldWUuLi4nKTtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5oaXN0b3J5LnRyYWNrcy5kaXNwYXRjaCgpIHx8IHRyYWNrO1xuICAgICAgICAgIGlmIChuZXh0KSB0aGlzLnRyYWNrcy5hZGQobmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnRyYWNrcy5zaXplICYmIHRyYWNrKSB7XG4gICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLkFVVE9QTEFZKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIGF1dG9wbGF5LCBpbml0aWF0aW5nIGF1dG9wbGF5IGhhbmRsZXIuLi4nKTtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0luaXRpYWxpemluZyBuZXh0IHRyYWNrIG9mIHRoZSBxdWV1ZS4uLicpO1xuICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy4jZ2V0TmV4dFRyYWNrKCkhO1xuICAgICAgICAgIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50LCB7XG4gICAgICAgICAgICBxdWV1ZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICNlbWl0RW5kKCkge1xuICAgIHRoaXMuX19jdXJyZW50ID0gbnVsbDtcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVtcHR5UXVldWUsIHRoaXMpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMubGVhdmVPbkVuZCkge1xuICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRtKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgICB9LCB0aGlzLm9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duKS51bnJlZigpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jICNoYW5kbGVBdXRvcGxheSh0cmFjazogVHJhY2spIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgQXV0b3BsYXkgPj4gRmluZGluZyByZWxhdGVkIHRyYWNrcyBmb3IgVHJhY2sgJHt0cmFjay50aXRsZX0gKCR7dHJhY2sudXJsfSkgW2V4dDoke1xuICAgICAgICB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWBcblxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRyYWNrcyA9XG4gICAgICAoYXdhaXQgdHJhY2suZXh0cmFjdG9yPy5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrLCB0aGlzLmhpc3RvcnkpKT8udHJhY2tzIHx8XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSk7XG4gICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQXV0b3BsYXkgPj4gRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB0byBwcm92aWRlIHJlc3VsdHMuYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgcmVzdWx0cy5gKTtcblxuICAgICAgICByZXR1cm4gcmVzLnRyYWNrcztcbiAgICAgIH0pKT8uXG4gICAgICByZXN1bHQgfHxcbiAgICAgIFtdO1xuXG4gICAgICBsZXQgcmVzb2x2ZXI6ICh0cmFjazogVHJhY2sgfCBudWxsKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTxUcmFjayB8IG51bGw+KChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmUpO1xuXG4gICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXksIHRoaXMsIHRyYWNrcywgcmVzb2x2ZXIhKTtcblxuICAgICAgLy8gcHJldmVudCBkYW5nbGluZyBwcm9taXNlXG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgcmVzb2x2ZXIoXG4gICAgICAgICAgdHJhY2tzLmxlbmd0aCA/XG4gICAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZSA9IHRyYWNrcy5maWx0ZXIoKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKSk7XG4gICAgICAgICAgICByZXR1cm4gdW5pcXVlPy5bMF0gPz8gVXRpbC5yYW5kb21DaG9pY2UodHJhY2tzLnNsaWNlKDAsIDUpKTtcbiAgICAgICAgICB9KSgpIDpcbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRUcmFjayA9IGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICBpZiAoIW5leHRUcmFjaykge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnQXV0b3BsYXkgPj4gTm8gdHJhY2sgd2FzIGZvdW5kLCBpbml0aWF0aW5nICNlbWl0RW5kKCknKTtcbiAgICAgICAgdGhyb3cgJ05vIHRyYWNrIHdhcyBmb3VuZCc7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubm9kZS5wbGF5KG5leHRUcmFjaywge1xuICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgIHNlZWs6IDAsXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgIH1cbiAgfVxufSIsICJpbXBvcnQge1xuICBBdWRpb1BsYXllcixcbiAgQXVkaW9QbGF5ZXJFcnJvcixcbiAgQXVkaW9QbGF5ZXJTdGF0dXMsXG4gIEF1ZGlvUmVzb3VyY2UsXG4gIGNyZWF0ZUF1ZGlvUGxheWVyLFxuICBjcmVhdGVBdWRpb1Jlc291cmNlLFxuICBlbnRlcnNTdGF0ZSxcbiAgU3RyZWFtVHlwZSxcbiAgVm9pY2VDb25uZWN0aW9uLFxuICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsXG4gIFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24gfSBmcm9tXG4nZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBFcXVhbGl6ZXJCYW5kLCBCaXF1YWRGaWx0ZXJzLCBQQ01GaWx0ZXJzLCBGaWx0ZXJzQ2hhaW4gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgUG9zdFByb2Nlc3NlZFJlc3VsdCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IE5vQXVkaW9SZXNvdXJjZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTdHJlYW1PcHMge1xuICB0eXBlPzogU3RyZWFtVHlwZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZGF0YT86IGFueTtcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZXE/OiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZEZpbHRlcj86IEJpcXVhZEZpbHRlcnM7XG4gIGRpc2FibGVGaWx0ZXJzPzogYm9vbGVhbjtcbiAgZGVmYXVsdEZpbHRlcnM/OiBQQ01GaWx0ZXJzW107XG4gIHZvbHVtZT86IG51bWJlcjtcbiAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gIHNhbXBsZVJhdGU/OiBudW1iZXI7XG4gIHNraXBGRm1wZWc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvaWNlRXZlbnRzIHtcbiAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICBlcnJvcjogKGVycm9yOiBBdWRpb1BsYXllckVycm9yKSA9PiBhbnk7XG4gIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gIHN0YXJ0OiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gIGZpbmlzaDogKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikgPT4gYW55O1xuICBkc3A6IChmaWx0ZXJzOiBQQ01GaWx0ZXJzW10pID0+IGFueTtcbiAgZXFCYW5kczogKGZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSkgPT4gYW55O1xuICBzYW1wbGVSYXRlOiAoZmlsdGVyczogbnVtYmVyKSA9PiBhbnk7XG4gIGJpcXVhZDogKGZpbHRlcnM6IEJpcXVhZEZpbHRlcnMpID0+IGFueTtcbiAgdm9sdW1lOiAodm9sdW1lOiBudW1iZXIpID0+IGFueTtcbiAgZGVzdHJveWVkOiAoKSA9PiBhbnk7XG4gIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xufVxuXG5jbGFzcyBTdHJlYW1EaXNwYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPFZvaWNlRXZlbnRzPiB7XG4gIHB1YmxpYyB2b2ljZUNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbjtcbiAgcHVibGljIGF1ZGlvUGxheWVyOiBBdWRpb1BsYXllcjtcbiAgcHVibGljIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbDtcbiAgcHVibGljIGF1ZGlvUmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGw7XG4gIHB1YmxpYyBkc3AgPSBuZXcgRmlsdGVyc0NoYWluKCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IGNvbm5lY3Rpb24gb2JqZWN0XG4gICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgY29ubmVjdGVkIGNoYW5uZWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICBjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgcHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlLFxuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlciA9IDIwMDAwLFxuICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyKVxuICB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHR5cGUge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgKi9cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXVkaW8gcGxheWVyXG4gICAgICogQHR5cGUge0F1ZGlvUGxheWVyfVxuICAgICAqL1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIgPVxuICAgIGF1ZGlvUGxheWVyIHx8XG4gICAgY3JlYXRlQXVkaW9QbGF5ZXIoe1xuICAgICAgZGVidWc6IHRoaXMucXVldWUuaGFzRGVidWdnZXJcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHR5cGUge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9XG4gICAgICovXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcblxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvciBhcyBBdWRpb1BsYXllckVycm9yKSk7XG4gICAgdGhpcy5hdWRpb1BsYXllci5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgdGhpcy5kc3Aub25VcGRhdGUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZHNwKSByZXR1cm47XG4gICAgICBpZiAodGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycykgdGhpcy5lbWl0KCdkc3AnLCB0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKTtcbiAgICAgIGlmICh0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcnMpIHRoaXMuZW1pdCgnYmlxdWFkJywgdGhpcy5kc3AuYmlxdWFkPy5maWx0ZXJzKTtcbiAgICAgIGlmICh0aGlzLmRzcC5lcXVhbGl6ZXIpIHRoaXMuZW1pdCgnZXFCYW5kcycsIHRoaXMuZHNwLmVxdWFsaXplci5nZXRFUSgpKTtcbiAgICAgIGlmICh0aGlzLmRzcC52b2x1bWUpIHRoaXMuZW1pdCgndm9sdW1lJywgdGhpcy5kc3Audm9sdW1lLnZvbHVtZSk7XG4gICAgICBpZiAodGhpcy5kc3AucmVzYW1wbGVyKSB0aGlzLmVtaXQoJ3NhbXBsZVJhdGUnLCB0aGlzLmRzcC5yZXNhbXBsZXIudGFyZ2V0U2FtcGxlUmF0ZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHNwLm9uRXJyb3IgPSAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5cbiAgICBvbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkLCBhc3luYyAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLk1hbnVhbCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLldlYlNvY2tldENsb3NlICYmIG5ld1N0YXRlLmNsb3NlQ29kZSA9PT0gNDAxNCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKHRoaXMudm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZywgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzIDwgNSkge1xuICAgICAgICBhd2FpdCBVdGlsLndhaXQoKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzICsgMSkgKiA1MDAwKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkuXG4gICAgb24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCwgKCkgPT4ge1xuICAgICAgdGhpcy5lbmQoKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbkRlc3Ryb3llZCwgdGhpcy5xdWV1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdzdGF0ZUNoYW5nZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgIGlmIChvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCAmJiBuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCkge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclBhdXNlLCB0aGlzLnF1ZXVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKSB7XG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyUmVzdW1lLCB0aGlzLnF1ZXVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZykge1xuICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlIHx8IG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnc3RhcnQnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgJiYgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgKi9cbiAgZ2V0IHBhdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZDtcbiAgfVxuXG4gIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgdmFsID8gdGhpcy5wYXVzZSh0cnVlKSA6IHRoaXMucmVzdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkuXG4gICAqL1xuICBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXVzZWQgfHwgdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkF1dG9QYXVzZWQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nXG4gICAqL1xuICBpc0J1ZmZlcmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkJ1ZmZlcmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwbGF5aW5nXG4gICAqL1xuICBpc1BsYXlpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGlkbGVcbiAgICovXG4gIGlzSWRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAqL1xuICBpc0Rlc3Ryb3llZCgpIHtcbiAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgKi9cbiAgaXNEaXNjb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyByZWFkeSB0byBwbGF5XG4gICAqL1xuICBpc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBzaWduYWxsaW5nXG4gICAqL1xuICBpc1NpZ25hbGxpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlNpZ25hbGxpbmc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgY29ubmVjdGluZ1xuICAgKi9cbiAgaXNDb25uZWN0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgc3RyZWFtXG4gICAqIEBwYXJhbSB7UmVhZGFibGV9IHNyYyBUaGUgc3RyZWFtIHNvdXJjZVxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wc10gT3B0aW9uc1xuICAgKiBAcmV0dXJucyB7QXVkaW9SZXNvdXJjZX1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVN0cmVhbShzcmM6IFJlYWRhYmxlLCBvcHM/OiBDcmVhdGVTdHJlYW1PcHMpIHtcbiAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhdGluZyBEU1AgZmlsdGVycyBwaXBlbGluZS4uLicpO1xuICAgIGNvbnN0IHN0cmVhbSA9ICFvcHM/LmRpc2FibGVGaWx0ZXJzID9cbiAgICB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICBkc3A6IHtcbiAgICAgICAgZmlsdGVyczogb3BzPy5kZWZhdWx0RmlsdGVycyxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgIH0sXG4gICAgICBiaXF1YWQ6IG9wcz8uYmlxdWFkRmlsdGVyID9cbiAgICAgIHtcbiAgICAgICAgZmlsdGVyOiBvcHMuYmlxdWFkRmlsdGVyLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlQmlxdWFkXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHJlc2FtcGxlcjoge1xuICAgICAgICB0YXJnZXRTYW1wbGVSYXRlOiBvcHM/LnNhbXBsZVJhdGUsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVSZXNhbXBsZXJcbiAgICAgIH0sXG4gICAgICBlcXVhbGl6ZXI6IHtcbiAgICAgICAgYmFuZE11bHRpcGxpZXI6IG9wcz8uZXEsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVFcXVhbGl6ZXJcbiAgICAgIH0sXG4gICAgICB2b2x1bWU6IHtcbiAgICAgICAgdm9sdW1lOiBvcHM/LnZvbHVtZSxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVZvbHVtZVxuICAgICAgfVxuICAgIH0pIDpcbiAgICBzcmM7XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRXhlY3V0aW5nIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaG9vay4uLicpO1xuICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLm9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUpLmNhdGNoKFxuICAgICAgKCkgPT5cbiAgICAgICh7XG4gICAgICAgIHN0cmVhbTogc3RyZWFtLFxuICAgICAgICB0eXBlOiBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnlcbiAgICAgIH0pIGFzIFBvc3RQcm9jZXNzZWRSZXN1bHRcbiAgICApO1xuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1ByZXBhcmluZyBBdWRpb1Jlc291cmNlLi4uJyk7XG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gY3JlYXRlQXVkaW9SZXNvdXJjZShwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtLCB7XG4gICAgICBpbnB1dFR5cGU6IHBvc3RTdHJlYW0/LnR5cGUgPz8gb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5LFxuICAgICAgbWV0YWRhdGE6IG9wcz8uZGF0YSxcbiAgICAgIC8vIHZvbHVtZSBjb250cm9scyBoYXBwZW4gZnJvbSBBdWRpb0ZpbHRlciBEU1AgdXRpbGl0eVxuICAgICAgaW5saW5lVm9sdW1lOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8ucmVzYW1wbGVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uZmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uYmlxdWFkIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmVxdWFsaXplciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgc3RhdHVzXG4gICAqIEB0eXBlIHtBdWRpb1BsYXllclN0YXR1c31cbiAgICovXG4gIGdldCBzdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkaXNjb25uZWN0KCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5hdWRpb1BsYXllcikgdGhpcy5hdWRpb1BsYXllci5zdG9wKHRydWUpO1xuICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgdGhpcy52b2ljZUNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoaXMgZGlzcGF0Y2hlclxuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuYXVkaW9QbGF5ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuZW1pdCgnZGVzdHJveWVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsYXllclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGVuZCgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5hdWRpb1BsYXllci5zdG9wKCk7XG4gICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vXG4gICAgfX1cblxuICAvKipcbiAgICogUGF1c2VzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJwb2xhdGVTaWxlbmNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgcGxheWVyIHdpbGwgcGxheSA1IHBhY2tldHMgb2Ygc2lsZW5jZSBhZnRlciBwYXVzaW5nIHRvIHByZXZlbnQgYXVkaW8gZ2xpdGNoZXMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnBhdXNlKGludGVycG9sYXRlU2lsZW5jZSk7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcmVzdW1lKCkge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnVucGF1c2UoKTtcbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHN0cmVhbVxuICAgKiBAcGFyYW0ge0F1ZGlvUmVzb3VyY2U8VHJhY2s+fSBbcmVzb3VyY2U9dGhpcy5hdWRpb1Jlc291cmNlXSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHVzPWZhbHNlXSBXaGV0aGVyIG9yIG5vdCB0byB1c2Ugb3B1c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICovXG4gIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBOb0F1ZGlvUmVzb3VyY2VFcnJvcigpO1xuICAgIH1cbiAgICBpZiAocmVzb3VyY2UuZW5kZWQpIHtcbiAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZmluaXNoJywgcmVzb3VyY2UpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgdGhpcy5hdWRpb1Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZSh0aGlzLnZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5LCB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1ZGlvUGxheWVyLnBsYXkocmVzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGxheWJhY2sgdm9sdW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdm9sdW1lIGFtb3VudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNldFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgdm9sdW1lKCkge1xuICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gMTAwO1xuICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUudm9sdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5YmFjayB0aW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZS5wbGF5YmFja0R1cmF0aW9uO1xuICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfTsiLCAiaW1wb3J0IHsgUXVldWUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgTm9SZXN1bHRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+IHtcbiAgcHVibGljIHRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4oJ0xJRk8nKTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge31cblxuICAvKipcbiAgICogQ3VycmVudCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgKHRoaXMucXVldWUgYXMgYW55KS5fX2N1cnJlbnQgYXMgVHJhY2sgfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5leHRUcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJldmlvdXNUcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBoaXN0b3J5IGlzIGRpc2FibGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUhpc3Rvcnk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTaXplKCkge1xuICAgIHJldHVybiB0aGlzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogSWYgaGlzdG9yeSBpcyBlbXB0eVxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPCAxO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0cmFjayB0byB0cmFjayBoaXN0b3J5XG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgcHVzaCh0cmFjazogVHJhY2sgfCBUcmFja1tdKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnRyYWNrcy5hZGQodHJhY2spO1xuXG4gICAgdGhpcy5yZXNpemUoKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGhpc3RvcnlcbiAgICovXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLnRyYWNrcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbmV4dCgpIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMubmV4dFRyYWNrO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdObyBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgIH1cblxuICAgIHRoaXMucXVldWUubm9kZS5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLkhpc3RvcnlOZXh0LFxuICAgICAgZGVzY3JpcHRpb246ICdTa2lwcGVkIGJ5IEd1aWxkUXVldWVIaXN0b3J5Lm5leHQoKSdcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoZSBwcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdObyBwcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0cmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgaWYgKGN1cnJlbnQgJiYgcHJlc2VydmVDdXJyZW50KSB0aGlzLnF1ZXVlLm5vZGUuaW5zZXJ0KGN1cnJlbnQsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsaWFzIHRvIFtHdWlsZFF1ZXVlSGlzdG9yeV0ucHJldmlvdXMoKVxuICAgKi9cbiAgcHVibGljIGJhY2socHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLnByZXZpb3VzKHByZXNlcnZlQ3VycmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzaXplIGhpc3Rvcnkgc3RvcmVcbiAgICovXG4gIHB1YmxpYyByZXNpemUoKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSkpIHJldHVybjtcbiAgICBpZiAodGhpcy50cmFja3Muc3RvcmUubGVuZ3RoIDwgdGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSkgcmV0dXJuO1xuICAgIHRoaXMudHJhY2tzLnN0b3JlLnNwbGljZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKTtcbiAgfVxufSIsICJpbXBvcnQgeyBBdWRpb1Jlc291cmNlLCBTdHJlYW1UeXBlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgVHJhY2tTa2lwUmVhc29uIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IHNldFRpbWVvdXQgYXMgd2FpdEZvciB9IGZyb20gJ3RpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yLCBOb1Jlc3VsdEVycm9yLCBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yLCBPdXRPZlJhbmdlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBDcmVhdGVTdHJlYW1PcHMgfSBmcm9tICcuLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IE9nZ0RlbXV4ZXIsIE9wdXNEZWNvZGVyLCBXZWJtRGVtdXhlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9vcHVzJztcblxuZXhwb3J0IGNvbnN0IEZGTVBFR19TUkFURV9SRUdFWCA9IC9hc2V0cmF0ZT1cXGQrXFwqKFxcZChcXC5cXGQpPykvO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclByb2dyZXNzYmFyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgcmVuZGVyIHRpbWUgY29kZXNcbiAgICovXG4gIHRpbWVjb2Rlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgY3JlYXRlIHByb2dyZXNzIGJhciBmb3IgdGhlIHdob2xlIHF1ZXVlXG4gICAqL1xuICBsZW5ndGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYmFyIGxlbmd0aFxuICAgKi9cbiAgbGVmdENoYXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZWxhcHNlZCB0aW1lIHRyYWNrXG4gICAqL1xuICByaWdodENoYXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmVtYWluaW5nIHRpbWUgdHJhY2tcbiAgICovXG4gIHNlcGFyYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGltZXN0YW1wIGFuZCBsaW5lXG4gICAqL1xuICBpbmRpY2F0b3I/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kaWNhdG9yXG4gICAqL1xuICBxdWV1ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQbGF5T3B0aW9ucyB7XG4gIHF1ZXVlPzogYm9vbGVhbjtcbiAgc2Vlaz86IG51bWJlcjtcbiAgdHJhbnNpdGlvbk1vZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNraXBPcHRpb25zIHtcbiAgcmVhc29uOiBUcmFja1NraXBSZWFzb247XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyVGltZXN0YW1wIHtcbiAgY3VycmVudDoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcbiAgdG90YWw6IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHZhbHVlOiBudW1iZXI7XG4gIH07XG4gIHByb2dyZXNzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtQ29uZmlnIHtcbiAgZGlzcGF0Y2hlckNvbmZpZzogQ3JlYXRlU3RyZWFtT3BzO1xuICBwbGF5ZXJDb25maWc6IFJlc291cmNlUGxheU9wdGlvbnM7XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gdW5rbm93bj4ge1xuICAjcHJvZ3Jlc3MgPSAwO1xuICAjaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gZmFsc2U7XG4gIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbiA9IC9saWJvcHVzOiAoeWVzfHRydWUpLy50ZXN0KHRoaXMucXVldWUucGxheWVyLnNjYW5EZXBzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGluIGlkbGUgbW9kZVxuICAgKi9cbiAgcHVibGljIGlzSWRsZSgpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzSWRsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZyB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBpc0J1ZmZlcmluZygpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzQnVmZmVyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZyBhIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQbGF5aW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkXG4gICAqL1xuICBwdWJsaWMgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BhdXNlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHByb2dyZXNzIGhpc3RvcnlcbiAgICovXG4gIHB1YmxpYyByZXNldFByb2dyZXNzKCkge1xuICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcGxheWVyIHByb2dyZXNzXG4gICAqL1xuICBwdWJsaWMgc2V0UHJvZ3Jlc3MocHJvZ3Jlc3M6IG51bWJlcikge1xuICAgIHRoaXMuI3Byb2dyZXNzID0gcHJvZ3Jlc3M7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN0cmVhbSB0aW1lIGZvciBjdXJyZW50IHNlc3Npb25cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5zdHJlYW1UaW1lID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudCBwbGF5YmFjayBkdXJhdGlvbiB3aXRoIGhpc3RvcnkgaW5jbHVkZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgcGxheWJhY2tUaW1lKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMuI3Byb2dyZXNzICsgdGhpcy5zdHJlYW1UaW1lO1xuXG4gICAgcmV0dXJuIGR1cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZHVyYXRpb24gbXVsdGlwbGllclxuICAgKi9cbiAgcHVibGljIGdldER1cmF0aW9uTXVsdGlwbGllcigpIHtcbiAgICBjb25zdCBzcmF0ZUZpbHRlcnMgPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLnRvQXJyYXkoKS5maWx0ZXIoKGZmKSA9PiBGRk1QRUdfU1JBVEVfUkVHRVgudGVzdChmZikpO1xuICAgIGNvbnN0IG11bHRpcGxpZXJzID0gc3JhdGVGaWx0ZXJzLlxuICAgIG1hcCgobSkgPT4ge1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoRkZNUEVHX1NSQVRFX1JFR0VYLmV4ZWMobSk/LlsxXSBhcyBzdHJpbmcpO1xuICAgIH0pLlxuICAgIGZpbHRlcigoZikgPT4gIWlzTmFOKGYpKTtcblxuICAgIHJldHVybiAhbXVsdGlwbGllcnMubGVuZ3RoID8gMSA6IG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkUGxheWJhY2tUaW1lKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMucGxheWJhY2tUaW1lO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMudG90YWxEdXJhdGlvbjtcblxuICAgIHJldHVybiBNYXRoLnJvdW5kKGR1ciAvIHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGF1ZGlvIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRvdGFsRHVyYXRpb24oKSB7XG4gICAgY29uc3QgcHJlZmVyc0JyaWRnZWRNZXRhZGF0YSA9IHRoaXMucXVldWUub3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGE7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcblxuICAgIGlmIChwcmVmZXJzQnJpZGdlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCB0cmFja0hhc0xlZ2FjeU1ldGFkYXRhID1cbiAgICAgIHRyYWNrPy5tZXRhZGF0YSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdHJhY2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAnYnJpZGdlJyBpbiB0cmFjay5tZXRhZGF0YSAmJlxuICAgICAgdHJhY2subWV0YWRhdGEuYnJpZGdlICE9IG51bGw7XG4gICAgICBjb25zdCB0cmFja0hhc01ldGFkYXRhID0gdHJhY2s/LmJyaWRnZWRUcmFjayAhPSBudWxsO1xuXG4gICAgICBpZiAodHJhY2tIYXNMZWdhY3lNZXRhZGF0YSB8fCB0cmFja0hhc01ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID1cbiAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrPy5kdXJhdGlvbk1TID8/XG4gICAgICAgIChcbiAgICAgICAgdHJhY2sgYXMgVHJhY2s8e1xuICAgICAgICAgIGJyaWRnZToge1xuICAgICAgICAgICAgZHVyYXRpb246IG51bWJlcjtcbiAgICAgICAgICB9O1xuICAgICAgICB9PikuXG4gICAgICAgIG1ldGFkYXRhPy5icmlkZ2UuZHVyYXRpb247XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKGR1cmF0aW9uKSkgcmV0dXJuIGR1cmF0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFjaz8uZHVyYXRpb25NUyA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdHJlYW0gcHJvZ3Jlc3NcbiAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyA9IGZhbHNlKTogUGxheWVyVGltZXN0YW1wIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/IHRoaXMucGxheWJhY2tUaW1lIDogdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWU7XG4gICAgY29uc3QgdG90YWwgPSBpZ25vcmVGaWx0ZXJzID8gdGhpcy50b3RhbER1cmF0aW9uIDogdGhpcy5lc3RpbWF0ZWREdXJhdGlvbjtcblxuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50OiB7XG4gICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKGN1cnJlbnQpKSxcbiAgICAgICAgdmFsdWU6IGN1cnJlbnRcbiAgICAgIH0sXG4gICAgICB0b3RhbDoge1xuICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0b3RhbCkpLFxuICAgICAgICB2YWx1ZTogdG90YWxcbiAgICAgIH0sXG4gICAgICBwcm9ncmVzczogTWF0aC5yb3VuZChjdXJyZW50IC8gdG90YWwgKiAxMDApXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciBjdXJyZW50IHByb2dyZXNzXG4gICAqIEBwYXJhbSBvcHRpb25zIFByb2dyZXNzIGJhciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUHJvZ3Jlc3NCYXIob3B0aW9ucz86IFBsYXllclByb2dyZXNzYmFyT3B0aW9ucykge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuZ2V0VGltZXN0YW1wKCk7XG4gICAgaWYgKCF0aW1lc3RhbXApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHtcbiAgICAgIGluZGljYXRvciA9ICdcXHV7MUY1MTh9JyxcbiAgICAgIGxlZnRDaGFyID0gJ1xcdTI1QUMnLFxuICAgICAgcmlnaHRDaGFyID0gJ1xcdTI1QUMnLFxuICAgICAgbGVuZ3RoID0gMTUsXG4gICAgICB0aW1lY29kZXMgPSB0cnVlLFxuICAgICAgc2VwYXJhdG9yID0gJ1xcdTI1MDMnXG4gICAgfSA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKGlzTmFOKGxlbmd0aCkgfHwgbGVuZ3RoIDwgMCB8fCAhTnVtYmVyLmlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIHRocm93IG5ldyBPdXRPZlJhbmdlRXJyb3IoJ1tQbGF5ZXJQcm9ncmVzc0Jhck9wdGlvbnMubGVuZ3RoXScsIFN0cmluZyhsZW5ndGgpLCAnMCcsICdGaW5pdGUgTnVtYmVyJyk7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAuY3VycmVudC52YWx1ZSAvIHRpbWVzdGFtcC50b3RhbC52YWx1ZSAqIGxlbmd0aCk7XG4gICAgaWYgKGluZGV4ID49IDEgJiYgaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBiYXIgPSBsZWZ0Q2hhci5yZXBlYXQoaW5kZXggLSAxKS5zcGxpdCgnJyk7XG4gICAgICBiYXIucHVzaChpbmRpY2F0b3IpO1xuICAgICAgYmFyLnB1c2gocmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSBpbmRleCkpO1xuICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICByZXR1cm4gYCR7dGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7c2VwYXJhdG9yfSAke2Jhci5qb2luKCcnKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYCR7YmFyLmpvaW4oJycpfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aW1lY29kZXMpIHtcbiAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIDEpfSAke3NlcGFyYXRvcn0gJHtcbiAgICAgICAgdGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIDEpfWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdGhlIHBsYXllclxuICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIHRvIHNlZWsgdG9cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWVrKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGR1cmF0aW9uID09PSB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGR1cmF0aW9uID4gdGhpcy50b3RhbER1cmF0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU0VFS19PVkVSX1RIUkVTSE9MRCxcbiAgICAgICAgZGVzY3JpcHRpb246IG5ldyBPdXRPZlJhbmdlRXJyb3IoJ1tkdXJhdGlvbl0nLCBTdHJpbmcoZHVyYXRpb24pLCAnMCcsIFN0cmluZyh0aGlzLnRvdGFsRHVyYXRpb24pKS5tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGR1cmF0aW9uIDwgMCkgZHVyYXRpb24gPSAwO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXVlLmZpbHRlcnMudHJpZ2dlclJlcGxheShkdXJhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudCB2b2x1bWVcbiAgICovXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnZvbHVtZSA/PyAxMDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZvbHVtZVxuICAgKiBAcGFyYW0gdm9sIFZvbHVtZSBhbW91bnQgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXMgPSB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuc2V0Vm9sdW1lKHZvbCk7XG4gICAgaWYgKHJlcykgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHZvbDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBiaXQgcmF0ZVxuICAgKiBAcGFyYW0gcmF0ZSBUaGUgYml0IHJhdGUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0Qml0cmF0ZShyYXRlOiBudW1iZXIgfCAnYXV0bycpIHtcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/LmVuY29kZXI/LnNldEJpdHJhdGUoXG4gICAgICByYXRlID09PSAnYXV0bycgPyB0aGlzLnF1ZXVlLmNoYW5uZWw/LmJpdHJhdGUgPz8gNjQwMDAgOiByYXRlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcGF1c2VkIHN0YXRlXG4gICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBzZXRQYXVzZWQoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoc3RhdGUpIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBhdXNlKHRydWUpIHx8IGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJlc3VtZSgpIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIHRoZSBwbGF5YmFja1xuICAgKi9cbiAgcHVibGljIHBhdXNlKCkge1xuICAgIHJldHVybiB0aGlzLnNldFBhdXNlZCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgdGhlIHBsYXliYWNrXG4gICAqL1xuICBwdWJsaWMgcmVzdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnNldFBhdXNlZChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCBjdXJyZW50IHRyYWNrXG4gICAqL1xuICBwdWJsaWMgc2tpcChvcHRpb25zPzogU2tpcE9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG4gICAgaWYgKCF0cmFjaykgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgIGNvbnN0IHsgcmVhc29uLCBkZXNjcmlwdGlvbiB9ID0gb3B0aW9ucyB8fCB7XG4gICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5NYW51YWwsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0cmFjayB3YXMgc2tpcHBlZCBtYW51YWxseSdcbiAgICB9O1xuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcCwgdGhpcy5xdWV1ZSwgdHJhY2ssIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZ2l2ZW4gdHJhY2sgZnJvbSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gZW1pdEV2ZW50IFdoZXRoZXIgb3Igbm90IHRvIGVtaXQgdGhlIGV2ZW50IEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZSh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBlbWl0RXZlbnQgPSB0cnVlKSB7XG4gICAgY29uc3QgZm91bmRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmZpbmQoKHQsIGlkeCkgPT4ge1xuICAgICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2sgfHwgdHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICB9KTtcbiAgICBpZiAoIWZvdW5kVHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgdGhpcy5xdWV1ZS50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB0LmlkID09PSBmb3VuZFRyYWNrLmlkKTtcblxuICAgIGlmIChlbWl0RXZlbnQpIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZSwgdGhpcy5xdWV1ZSwgZm91bmRUcmFjayk7XG5cbiAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGp1bXAgdG8gd2l0aG91dCByZW1vdmluZyBvdGhlciB0cmFja3NcbiAgICovXG4gIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUodHJhY2ssIGZhbHNlKTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS51bnNoaWZ0KHJlbW92ZWQpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSnVtcCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBqdW1wZWQgdG8gbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYWNrIHBvc2l0aW9uXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFja1Bvc2l0aW9uKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gc2tpcCB0b1xuICAgKi9cbiAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHRyYWNrKTtcbiAgICBpZiAoaWR4IDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuZmlsdGVyKChfLCBpKSA9PiBpIDw9IGlkeCk7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc1JlbW92ZSwgdGhpcy5xdWV1ZSwgdG9SZW1vdmUpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU2tpcFRvLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcGxheWVyIHdhcyBza2lwcGVkIHRvIGFub3RoZXIgdHJhY2sgbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IGEgdHJhY2sgb24gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRvLCBkZWZhdWx0cyB0byAwLlxuICAgKi9cbiAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgIGlmICghKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spKSB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcigndHJhY2sgdmFsdWUnLCAnaW5zdGFuY2Ugb2YgVHJhY2snLCBTdHJpbmcodHJhY2spKTtcbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLm5vRW1pdEluc2VydCkgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLnF1ZXVlLCB0cmFjayk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRvXG4gICAqL1xuICBwdWJsaWMgbW92ZShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoZnJvbSk7XG4gICAgaWYgKCFyZW1vdmVkKSB7XG4gICAgICB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignaW52YWxpZCB0cmFjayB0byBtb3ZlJyk7XG4gICAgfVxuICAgIHRoaXMuaW5zZXJ0KHJlbW92ZWQsIHRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAqL1xuICBwdWJsaWMgY29weShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLnF1ZXVlLnRyYWNrcy5hdCh0aGlzLmdldFRyYWNrUG9zaXRpb24oZnJvbSkpO1xuICAgIGlmICghc3JjKSB7XG4gICAgICB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignaW52YWxpZCB0cmFjayB0byBjb3B5Jyk7XG4gICAgfVxuICAgIHRoaXMuaW5zZXJ0KHNyYywgdG8pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIGZpcnN0IFRoZSBmaXJzdCB0cmFjayB0byBzd2FwXG4gICAqIEBwYXJhbSBzZWNvbmQgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAqL1xuICBwdWJsaWMgc3dhcChmaXJzdDogVHJhY2tSZXNvbHZhYmxlLCBzZWNvbmQ6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHNyYyA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmaXJzdCk7XG4gICAgaWYgKHNyYyA8IDApIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHNyYyB0cmFjayB0byBzd2FwJyk7XG5cbiAgICBjb25zdCBkZXN0ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHNlY29uZCk7XG4gICAgaWYgKGRlc3QgPCAwKSB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignaW52YWxpZCBkZXN0IHRyYWNrIHRvIHN3YXAnKTtcblxuICAgIGNvbnN0IHNyY1QgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdO1xuICAgIGNvbnN0IGRlc3RUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF07XG5cbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdID0gZGVzdFQ7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF0gPSBzcmNUO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIHBsYXliYWNrXG4gICAqIEBwYXJhbSBmb3JjZSBXaGV0aGVyIG9yIG5vdCB0byBmb3JjZWZ1bGx5IHN0b3AgdGhlIHBsYXliYWNrXG4gICAqL1xuICBwdWJsaWMgc3RvcChmb3JjZSA9IGZhbHNlKSB7XG4gICAgdGhpcy5xdWV1ZS50cmFja3MuY2xlYXIoKTtcbiAgICB0aGlzLnF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcCkge1xuICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpIHx8IHRoaXMucXVldWUudHJhY2tzLnNpemUpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRlc3Ryb3koKTtcbiAgICAgIH0sIHRoaXMucXVldWUub3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duKS51bnJlZigpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoZSBnaXZlbiB0cmFja1xuICAgKiBAcGFyYW0gcmVzIFRoZSB0cmFjayB0byBwbGF5XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXlpbmcgdGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheShyZXM/OiBUcmFjayB8IG51bGwsIG9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnZvaWNlQ29ubmVjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IE5vVm9pY2VDb25uZWN0aW9uRXJyb3IoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKGBSZWNlaXZlZCBwbGF5IHJlcXVlc3QgZnJvbSBndWlsZCAke3RoaXMucXVldWUuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMucXVldWUuZ3VpbGQuaWR9KWApO1xuXG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcXVldWU6IHRoaXMucXVldWUuY3VycmVudFRyYWNrICE9IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMFxuICAgICAgfSBhcyBSZXNvdXJjZVBsYXlPcHRpb25zLFxuICAgICAgb3B0aW9uc1xuICAgICkhO1xuXG4gICAgaWYgKHJlcyAmJiBvcHRpb25zLnF1ZXVlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcXVldWUgdGhlIHRyYWNrLCBhZGRpbmcgdGhlIGdpdmVuIHRyYWNrIHRvIHF1ZXVlIGluc3RlYWQuLi4nKTtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2sgPSByZXMgfHwgdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBOb1Jlc3VsdEVycm9yKCdQbGF5IHJlcXVlc3QgcmVjZWl2ZWQgYnV0IHRyYWNrIHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIHRoaXMucXVldWUsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBwbGF5IHRoZSB0cmFjaywgaW5pdGlhbGl6aW5nLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXNzaWduZWRSZXNvdXJjZSA9IHRyYWNrLnJlc291cmNlO1xuXG4gICAgICBpZiAoYXNzaWduZWRSZXNvdXJjZSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnVHJhY2sgaGFzIGFuIGF1ZGlvIHJlc291cmNlIGFzc2lnbmVkLCBwbGF5ZXIgd2lsbCBub3cgcGxheSB0aGUgcmVzb3VyY2UgZGlyZWN0bHkuLi4nKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jcGVyZm9ybVBsYXkoYXNzaWduZWRSZXNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBJbml0aWF0aW5nIHN0cmVhbSBleHRyYWN0aW9uIHByb2Nlc3MuLi5gKTtcbiAgICAgIGNvbnN0IHNyYyA9IHRyYWNrLnJhdz8uc291cmNlIHx8IHRyYWNrLnNvdXJjZTtcbiAgICAgIGNvbnN0IHF0OiBTZWFyY2hRdWVyeVR5cGUgPVxuICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IChzcmMgPT09ICdzcG90aWZ5JyA/ICdzcG90aWZ5U29uZycgOiBzcmMgPT09ICdhcHBsZV9tdXNpYycgPyAnYXBwbGVNdXNpY1NvbmcnIDogc3JjKTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gKTtcblxuICAgICAgY29uc3Qgc3RyZWFtU3JjID0ge1xuICAgICAgICBlcnJvcjogbnVsbCBhcyBFcnJvciB8IG51bGwsXG4gICAgICAgIHN0cmVhbTogbnVsbCBhcyBFeHRyYWN0b3JTdHJlYW1hYmxlIHwgbnVsbFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5vbkJlZm9yZUNyZWF0ZVN0cmVhbT8uKHRyYWNrLCBxdCB8fCAnYXJiaXRyYXJ5JywgdGhpcy5xdWV1ZSkudGhlbihcbiAgICAgICAgKHMpID0+IHtcbiAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHM7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICk7XG5cbiAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRmFpbGVkIHRvIGdldCBzdHJlYW0gZnJvbSBvbkJlZm9yZUNyZWF0ZVN0cmVhbSEnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5jb250ZXh0LnByb3ZpZGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICAgICAgICBhdHRlbXB0ZWRFeHRyYWN0b3JzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgICAgICAgIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgIHRoaXMuI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2spLnRoZW4oXG4gICAgICAgICAgICAocikgPT4ge1xuICAgICAgICAgICAgICBpZiAocj8ucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IDxSZWFkYWJsZT4gci5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHI/LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VlayA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5zZWVrID49IDApIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBvcHRpb25zLnNlZWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYWNrU3RyZWFtQ29uZmlnOiBTdHJlYW1Db25maWcgPSB7XG4gICAgICAgIGRpc3BhdGNoZXJDb25maWc6IHtcbiAgICAgICAgICBkaXNhYmxlQmlxdWFkOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVZvbHVtZSxcbiAgICAgICAgICBkaXNhYmxlRmlsdGVyczogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICBzYW1wbGVSYXRlOlxuICAgICAgICAgIHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSAnbnVtYmVyJyAmJiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID4gMCA/XG4gICAgICAgICAgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA6XG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGJpcXVhZEZpbHRlcjogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgZXE6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgIHZvbHVtZTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgICBkYXRhOiB0cmFjayxcbiAgICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhdyxcbiAgICAgICAgICBza2lwRkZtcGVnOiB0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWdcbiAgICAgICAgfSxcbiAgICAgICAgcGxheWVyQ29uZmlnOiBvcHRpb25zXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVzb2x2ZXI6ICgpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmUpO1xuXG4gICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5XaWxsUGxheVRyYWNrLCB0aGlzLnF1ZXVlLCB0cmFjaywgdHJhY2tTdHJlYW1Db25maWcsIHJlc29sdmVyISk7XG5cbiAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgaWYgKCFzdWNjZXNzKSByZXNvbHZlcigpO1xuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnV2FpdGluZyBmb3Igd2lsbFBsYXlUcmFjayBldmVudCB0byByZXNvbHZlLi4uJyk7XG5cbiAgICAgIGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGNvbnN0IGRhc3BEaXNhYmxlZCA9IFtcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUJpcXVhZCxcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUZpbHRlcnMsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWVdLlxuICAgICAgZXZlcnkoKGUpID0+ICEhZSA9PT0gdHJ1ZSk7XG5cbiAgICAgIGNvbnN0IG5lZWRzRmlsdGVycyA9ICEhdHJhY2tTdHJlYW1Db25maWcucGxheWVyQ29uZmlnLnNlZWsgfHwgISF0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MubGVuZ3RoO1xuICAgICAgY29uc3Qgc2hvdWxkU2tpcEZGbXBlZyA9ICEhdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5za2lwRkZtcGVnICYmICFuZWVkc0ZpbHRlcnM7XG5cbiAgICAgIGxldCBmaW5hbFN0cmVhbTogUmVhZGFibGU7XG5cbiAgICAgIGNvbnN0IGRlbXV4YWJsZSA9IChmbXQ6IHN0cmluZykgPT5cbiAgICAgIFtTdHJlYW1UeXBlLk9wdXMsIFN0cmVhbVR5cGUuV2VibU9wdXMsIFN0cmVhbVR5cGUuT2dnT3B1c10uaW5jbHVkZXMoZm10IGFzIFN0cmVhbVR5cGUpO1xuXG4gICAgICAvLyBza2lwIGZmbXBlZyB3aGVuIHBvc3NpYmxlXG4gICAgICBpZiAoXG4gICAgICBzaG91bGRTa2lwRkZtcGVnICYmXG4gICAgICAhKHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSkgJiZcbiAgICAgIHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtICE9PSAnc3RyaW5nJyAmJlxuICAgICAgZGVtdXhhYmxlKHN0cmVhbVNyYy5zdHJlYW0uJGZtdCkpXG4gICAgICB7XG4gICAgICAgIGNvbnN0IHsgJGZtdCwgc3RyZWFtIH0gPSBzdHJlYW1TcmMuc3RyZWFtO1xuICAgICAgICBjb25zdCBzaG91bGRQQ00gPSAhZGFzcERpc2FibGVkO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBza2lwRkZtcGVnIGlzIHNldCB0byB0cnVlIGFuZCBzdHJlYW0gaXMgZGVtdXhhYmxlLCBjcmVhdGluZyBzdHJlYW0gd2l0aCB0eXBlICR7XG4gICAgICAgICAgc2hvdWxkUENNID8gJ3BjbScgOiAnb3B1cyd9YFxuXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNvbnN0IG9wdXNTdHJlYW0gPSAkZm10ID09PSBTdHJlYW1UeXBlLk9wdXMgP1xuICAgICAgICBzdHJlYW0gOlxuICAgICAgICAkZm10ID09PSBTdHJlYW1UeXBlLk9nZ09wdXMgP1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgT2dnRGVtdXhlcigpIGFzIGFueSkgOlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgV2VibURlbXV4ZXIoKSBhcyBhbnkpO1xuXG4gICAgICAgIGlmIChzaG91bGRQQ00pIHtcbiAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBmaWx0ZXJzIGVuYWJsZWQsIHdlIG5lZWQgdG8gZGVjb2RlIHRoZSBvcHVzIHN0cmVhbSB0byBwY21cbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW0ucGlwZShcbiAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICAgICAgICBmcmFtZVNpemU6IDk2MCxcbiAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5PcHVzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zdCBvcHVzID0gZGFzcERpc2FibGVkICYmIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbjtcbiAgICAgICAgLy8gaWYgKG9wdXMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRGlzYWJsaW5nIFBDTSBvdXRwdXQgc2luY2UgYWxsIGZpbHRlcnMgYXJlIGRpc2FibGVkIGFuZCBvcHVzIGVuY29kaW5nIGlzIHN1cHBvcnRlZC4uLicpO1xuXG4gICAgICAgIGZpbmFsU3RyZWFtID0gdGhpcy4jY3JlYXRlRkZtcGVnU3RyZWFtKFxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSB8fCB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gOlxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0uc3RyZWFtLFxuICAgICAgICAgIHRyYWNrLFxuICAgICAgICAgIG9wdGlvbnMuc2VlayA/PyAwXG4gICAgICAgICAgLy8gb3B1c1xuICAgICAgICApO1xuICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgLy8gRklYTUU6IE9nZ09wdXMgcmVzdWx0cyBpbiBzdGF0aWMgbm9pc2VcbiAgICAgICAgLy8gdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gb3B1cyA/IFN0cmVhbVR5cGUuT2dnT3B1cyA6IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTW9kZSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICBgVHJhbnNpdGlvbiBtb2RlIGRldGVjdGVkLCBwbGF5ZXIgd2lsbCB3YWl0IGZvciBidWZmZXJpbmcgdGltZW91dCB0byBleHBpcmUgKFRpbWVvdXQ6ICR7dGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXR9bXMpYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB3YWl0Rm9yKHRoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0J1ZmZlcmluZyB0aW1lb3V0IGhhcyBleHBpcmVkIScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoYFByZXBhcmluZyBmaW5hbCBzdHJlYW0gY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KHRyYWNrU3RyZWFtQ29uZmlnLCBudWxsLCAyKX1gKTtcblxuICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXMucXVldWUuZGlzcGF0Y2hlcjtcblxuICAgICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgICdEaXNwYXRjaGVyIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHRoZSBxdWV1ZSBiZWluZyBkZWxldGVkIGluIHRoZSBtaWRkbGUgb2Ygb3BlcmF0aW9uLiBDYW5jZWxsaW5nIHRoZSBzdHJlYW0uLi4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbmFsU3RyZWFtLmRlc3Ryb3koKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgZGlzcGF0Y2hlci5jcmVhdGVTdHJlYW0oZmluYWxTdHJlYW0sIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcpO1xuXG4gICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyghIW9wdGlvbnMudHJhbnNpdGlvbk1vZGUpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuI3BlcmZvcm1QbGF5KHJlc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgYXVkaW8gcGxheWVyOiAke2V9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gICN0aHJvdyh0cmFjazogVHJhY2ssIGVycm9yPzogRXJyb3IgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgY29uc3Qgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0ID1cbiAgICBuZXcgTm9SZXN1bHRFcnJvcihgQ291bGQgbm90IGV4dHJhY3Qgc3RyZWFtIGZvciB0aGlzIHRyYWNrJHtlcnJvciA/IGBcXG5cXG4ke2Vycm9yLnN0YWNrIHx8IGVycm9yfWAgOiAnJ31gKTtcblxuXG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXAsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgdHJhY2ssXG4gICAgICBUcmFja1NraXBSZWFzb24uTm9TdHJlYW0sXG4gICAgICBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQubWVzc2FnZVxuICAgICk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yLFxuICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCxcbiAgICAgIHRyYWNrXG4gICAgKTtcbiAgICBjb25zdCBuZXh0VHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIGlmIChuZXh0VHJhY2spIHJldHVybiB2b2lkIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc2hvdWxkIGJlIHJlc29sdmVkXG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lbWl0KCdmaW5pc2gnLCBudWxsKTtcbiAgfVxuXG4gIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhbGl6aW5nIGF1ZGlvIHBsYXllci4uLicpO1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnBsYXlTdHJlYW0ocmVzb3VyY2UpO1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc3BhdGNoaW5nIGF1ZGlvLi4uJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF0dGVtcHRlZEV4dHJhY3RvcnMgPSB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLmdldENvbnRleHQoKT8uYXR0ZW1wdGVkRXh0cmFjdG9ycyB8fCBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHN0cmVhbUluZm8gPSBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChhdHRlbXB0ZWRFeHRyYWN0b3JzLmhhcyhleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgIGF0dGVtcHRlZEV4dHJhY3RvcnMuYWRkKGV4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgIGNvbnN0IGNhblN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZSh0cmFjay51cmwsIHRyYWNrLnF1ZXJ5VHlwZSB8fCBRdWVyeVJlc29sdmVyLnJlc29sdmUodHJhY2sudXJsKS50eXBlKTtcbiAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gYXdhaXQgZXh0cmFjdG9yLnN0cmVhbSh0cmFjayk7XG4gICAgfSwgZmFsc2UpO1xuXG4gICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLnJlc3VsdCkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICBgRmFpbGVkIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGYWxsYmFja1N0cmVhbSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgR2VuZXJpYyBzdHJlYW0gZXh0cmFjdGlvbiBmYWlsZWQgYW5kIGZhbGxiYWNrIHN0cmVhbSBleHRyYWN0aW9uIGlzIGVuYWJsZWRgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZUZhbGxiYWNrU3RyZWFtKHRyYWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cmVhbUluZm8gfHwgbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYFN0cmVhbSBleHRyYWN0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSAoRXh0cmFjdG9yOiAke1xuICAgICAgc3RyZWFtSW5mby5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWBcblxuICAgICk7XG5cbiAgICByZXR1cm4gc3RyZWFtSW5mbztcbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVGYWxsYmFja1N0cmVhbSh0cmFjazogVHJhY2spIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYEF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2QuLi5gXG4gICAgKTtcblxuICAgIGNvbnN0IGZhbGxiYWNrU3RyZWFtID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dHJhY3RvcikgPT4ge1xuICAgICAgaWYgKGV4dHJhY3Rvci5pZGVudGlmaWVyID09PSB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZSgoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjb25zdCBxdWVyeSA9IGAke3RyYWNrLnRpdGxlfSAke3RyYWNrLmF1dGhvcn1gO1xuICAgICAgY29uc3QgZmFsbGJhY2tUcmFja3MgPSBhd2FpdCBleHRyYWN0b3IuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgIHJlcXVlc3RlZEJ5OiB0cmFjay5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGZhbGxiYWNrVHJhY2sgPSBmYWxsYmFja1RyYWNrcy50cmFja3NbMF07XG5cbiAgICAgIGlmICghZmFsbGJhY2tUcmFjaykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKGZhbGxiYWNrVHJhY2spO1xuXG4gICAgICBpZiAoIXN0cmVhbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICB0cmFjay5icmlkZ2VkVHJhY2sgPSBmYWxsYmFja1RyYWNrO1xuXG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH0sIHRydWUpO1xuXG4gICAgaWYgKCFmYWxsYmFja1N0cmVhbSB8fCAhZmFsbGJhY2tTdHJlYW0ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2RgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtIHx8IG51bGw7XG4gICAgfVxuXG4gICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IGZhbGxiYWNrU3RyZWFtLmV4dHJhY3RvcjtcblxuICAgIHJldHVybiBmYWxsYmFja1N0cmVhbTtcbiAgfVxuXG4gICNjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IHN0cmluZywgdHJhY2s6IFRyYWNrLCBzZWVrID0gMCwgb3B1cz86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBmZm1wZWdTdHJlYW0gPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLlxuICAgIGNyZWF0ZVN0cmVhbShzdHJlYW0sIHtcbiAgICAgIGVuY29kZXJBcmdzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MsXG4gICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgIGZtdDogb3B1cyA/ICdvcHVzJyA6ICdzMTZsZSdcbiAgICB9KS5cbiAgICBvbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBjb25zdCBtID0gYCR7ZXJyfWAudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBTdHJlYW0gY2xvc2VkIGR1ZSB0byBhbiBlcnJvciBmcm9tIEZGbXBlZyBzdHJlYW06ICR7ZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlIHx8IGVycn1gKTtcblxuICAgICAgaWYgKG0uaW5jbHVkZXMoJ3ByZW1hdHVyZSBjbG9zZScpIHx8IG0uaW5jbHVkZXMoJ2VwaXBlJykpIHJldHVybjtcblxuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvciwgdGhpcy5xdWV1ZSwgZXJyLCB0cmFjayk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmZtcGVnU3RyZWFtO1xuICB9XG59IiwgImltcG9ydCB7IFNub3dmbGFrZVV0aWwgfSBmcm9tICdkaXNjb3JkLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEFib3J0U2lnbmFsIHRvIGNhbmNlbCB0aGlzIGVudHJ5XG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXIgPSAoZXhjZXB0aW9uOiBFcnJvcikgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWUge1xuICAvKipcbiAgICogVGhlIHF1ZXVlZCBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgZW50cmllczogQXJyYXk8QXN5bmNRdWV1ZUVudHJ5PiA9IFtdO1xuXG4gIHB1YmxpYyBleGNlcHRpb25IYW5kbGVyPzogQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENsZWFyIGVudHJpZXMgcXVldWVcbiAgICogQHBhcmFtIGNvbnN1bWUgV2hldGhlciBvciBub3QgdG8gY29uc3VtZSBhbGwgZW50cmllcyBiZWZvcmUgY2xlYXJpbmdcbiAgICovXG4gIHB1YmxpYyBjbGVhcihjb25zdW1lID0gZmFsc2UpIHtcbiAgICBpZiAoY29uc3VtZSkge1xuICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jb25zdW1lKCkpO1xuICAgIH1cblxuICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHF1ZXVlLiBSZXR1cm5zIGAwYCBpZiBubyBlbnRyaWVzIGFyZSBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBhbiBlbnRyeS5cbiAgICpcbiAgICogQGV4YW1wbGUgLy8gbG9jayB0aGUgcXVldWVcbiAgICogY29uc3QgZW50cnkgPSBhc3luY1F1ZXVlLmFjcXVpcmUoKTtcbiAgICogLy8gd2FpdCB1bnRpbCBwcmV2aW91cyB0YXNrIGlzIGNvbXBsZXRlZFxuICAgKiBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAqIC8vIGRvIHNvbWV0aGluZyBleHBlbnNpdmVcbiAgICogYXdhaXQgcGVyZm9ybVNvbWV0aGluZ0V4cGVuc2l2ZSgpO1xuICAgKiAvLyBtYWtlIHN1cmUgdG8gcmVsZWFzZSB0aGUgbG9jayBvbmNlIGRvbmVcbiAgICogYXN5bmNRdWV1ZS5yZWxlYXNlKCk7XG4gICAqXG4gICAqL1xuICBwdWJsaWMgYWNxdWlyZShvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgIGNvbnN0IGVudHJ5ID0gbmV3IEFzeW5jUXVldWVFbnRyeSh0aGlzLCBvcHRpb25zKTtcblxuICAgIGlmICh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpIGVudHJ5LmdldFRhc2soKS5jYXRjaCh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpO1xuXG4gICAgaWYgKHRoaXMuZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIGVudHJ5LmNvbnN1bWUoKTtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgdGhlIGN1cnJlbnQgYWNxdWlzaXRpb24gYW5kIG1vdmUgdG8gbmV4dCBlbnRyeS5cbiAgICovXG4gIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5lbnRyaWVzLnNoaWZ0KCk7XG4gICAgdGhpcy5lbnRyaWVzWzBdPy5jb25zdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGFsbCBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgY2FuY2VsQWxsKCkge1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY2FuY2VsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byByZW1vdmVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbnRyeShlbnRyeTogQXN5bmNRdWV1ZUVudHJ5KSB7XG4gICAgY29uc3QgZW50cnlJZHggPSB0aGlzLmVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG5cbiAgICBpZiAoZW50cnlJZHggIT09IC0xKSB7XG4gICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SWR4LCAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZUVudHJ5IHtcbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgcHVibGljIHNpZ25hbDogQWJvcnRTaWduYWwgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG9uQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlc29sdmUhOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlamVjdCE6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEFzeW5jUXVldWUsIHB1YmxpYyBvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnNpZ25hbCkge1xuICAgICAgdGhpcy5zZXRBYm9ydFNpZ25hbCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0QWJvcnRTaWduYWwoc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2lnbmFsID0gc2lnbmFsO1xuICAgIHRoaXMub25BYm9ydCA9ICgpID0+IHtcbiAgICAgIHRoaXMucXVldWUucmVtb3ZlRW50cnkodGhpcyk7XG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgIH07XG5cbiAgICB0aGlzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gIH1cblxuICBwdWJsaWMgY29uc3VtZSgpIHtcbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgICB0aGlzLnJlc29sdmUoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWxlYXNlKCkge1xuICAgIHRoaXMuY29uc3VtZSgpO1xuICAgIHRoaXMucXVldWUucmVsZWFzZSgpO1xuICB9XG5cbiAgcHVibGljIGNhbmNlbCgpIHtcbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgICB0aGlzLnJlamVjdChuZXcgRXJyb3IoJ0NhbmNlbGxlZCcpKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhbnVwKCkge1xuICAgIGlmICh0aGlzLm9uQWJvcnQpIHRoaXMuc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gICAgdGhpcy5zaWduYWwgPSBudWxsO1xuICAgIHRoaXMub25BYm9ydCA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xuICB9XG59IiwgImltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEF1ZGlvRmlsdGVycywgRmlsdGVyc05hbWUsIFF1ZXVlRmlsdGVycyB9IGZyb20gJy4uL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmlxdWFkRmlsdGVycywgRXF1YWxpemVyLCBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbnR5cGUgRmlsdGVycyA9IGtleW9mIHR5cGVvZiBBdWRpb0ZpbHRlcnMuZmlsdGVycztcblxuY29uc3QgbWFrZUJhbmRzID0gKGFycjogbnVtYmVyW10pID0+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAge1xuICAgICAgbGVuZ3RoOiBFcXVhbGl6ZXIuQkFORF9DT1VOVFxuICAgIH0sXG4gICAgKF8sIGkpID0+ICh7XG4gICAgICBiYW5kOiBpLFxuICAgICAgZ2FpbjogYXJyW2ldID8gYXJyW2ldIC8gMzAgOiAwXG4gICAgfSlcbiAgKSBhcyBFcXVhbGl6ZXJCYW5kW107XG59O1xuXG50eXBlIEVRUHJlc2V0ID0ge1xuICBGbGF0OiBFcXVhbGl6ZXJCYW5kW107XG4gIENsYXNzaWNhbDogRXF1YWxpemVyQmFuZFtdO1xuICBDbHViOiBFcXVhbGl6ZXJCYW5kW107XG4gIERhbmNlOiBFcXVhbGl6ZXJCYW5kW107XG4gIEZ1bGxCYXNzOiBFcXVhbGl6ZXJCYW5kW107XG4gIEZ1bGxCYXNzVHJlYmxlOiBFcXVhbGl6ZXJCYW5kW107XG4gIEZ1bGxUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgSGVhZHBob25lczogRXF1YWxpemVyQmFuZFtdO1xuICBMYXJnZUhhbGw6IEVxdWFsaXplckJhbmRbXTtcbiAgTGl2ZTogRXF1YWxpemVyQmFuZFtdO1xuICBQYXJ0eTogRXF1YWxpemVyQmFuZFtdO1xuICBQb3A6IEVxdWFsaXplckJhbmRbXTtcbiAgUmVnZ2FlOiBFcXVhbGl6ZXJCYW5kW107XG4gIFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgU2thOiBFcXVhbGl6ZXJCYW5kW107XG4gIFNvZnQ6IEVxdWFsaXplckJhbmRbXTtcbiAgU29mdFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgVGVjaG5vOiBFcXVhbGl6ZXJCYW5kW107XG59O1xuXG5leHBvcnQgY29uc3QgRXF1YWxpemVyQ29uZmlndXJhdGlvblByZXNldDogUmVhZG9ubHk8RVFQcmVzZXQ+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEZsYXQ6IG1ha2VCYW5kcyhbXSksXG4gIENsYXNzaWNhbDogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTcuMiwgLTcuMiwgLTcuMiwgLTkuNl1cbiAgKSxcbiAgQ2x1YjogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgRGFuY2U6IG1ha2VCYW5kcyhbOS42LCA3LjIsIDIuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC01LjYsIC03LjIsIC03LjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gIEZ1bGxCYXNzOiBtYWtlQmFuZHMoWy04LjAsIDkuNiwgOS42LCA1LjYsIDEuNiwgLTQuMCwgLTguMCwgLTEwLjQsIC0xMS4yLCAtMTEuMl0pLFxuICBGdWxsQmFzc1RyZWJsZTogbWFrZUJhbmRzKFs3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF0pLFxuICBGdWxsVHJlYmxlOiBtYWtlQmFuZHMoWy05LjYsIC05LjYsIC05LjYsIC00LjAsIDIuNCwgMTEuMiwgMTYuMCwgMTYuMCwgMTYuMCwgMTYuOF0pLFxuICBIZWFkcGhvbmVzOiBtYWtlQmFuZHMoWzQuOCwgMTEuMiwgNS42LCAtMy4yLCAtMi40LCAxLjYsIDQuOCwgOS42LCAxMi44LCAxNC40XSksXG4gIExhcmdlSGFsbDogbWFrZUJhbmRzKFsxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICBMaXZlOiBtYWtlQmFuZHMoWy00LjgsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDUuNiwgNS42LCA0LjAsIDIuNCwgMi40LCAyLjRdKSxcbiAgUGFydHk6IG1ha2VCYW5kcyhbXG4gIDcuMiwgNy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA3LjIsIDcuMl1cbiAgKSxcbiAgUG9wOiBtYWtlQmFuZHMoWy0xLjYsIDQuOCwgNy4yLCA4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMi40LCAtMS42LCAtMS42XSksXG4gIFJlZ2dhZTogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgU2thOiBtYWtlQmFuZHMoWy0yLjQsIC00LjgsIC00LjAsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDguOCwgOS42LCAxMS4yLCA5LjZdKSxcbiAgU29mdDogbWFrZUJhbmRzKFs0LjgsIDEuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMS4xMTAyMmUtMTUsIDQuMCwgOC4wLCA5LjYsIDExLjIsIDEyLjBdKSxcbiAgU29mdFJvY2s6IG1ha2VCYW5kcyhbNC4wLCA0LjAsIDIuNCwgLTEuMTEwMjJlLTE1LCAtNC4wLCAtNS42LCAtMy4yLCAtMS4xMTAyMmUtMTUsIDIuNCwgOC44XSksXG4gIFRlY2hubzogbWFrZUJhbmRzKFs4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNC44LCAtMS4xMTAyMmUtMTUsIDguMCwgOS42LCA5LjYsIDguOF0pXG59KTtcblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSB1bmtub3duPiB7XG4gICNmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgI2lucHV0QXJnczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgZmZtcGVnIG1heSBiZSBza2lwcGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNraXBwYWJsZSgpIHtcbiAgICByZXR1cm4gISF0aGlzLmFmLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWc7XG4gIH1cblxuICAjc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10pIHtcbiAgICBjb25zdCB7IHF1ZXVlIH0gPSB0aGlzLmFmO1xuICAgIC8vIHNraXAgaWYgZmlsdGVycyBhcmUgdGhlIHNhbWVcbiAgICBpZiAoZmlsdGVycy5ldmVyeSgoZikgPT4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSkgJiYgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgY29uc3QgaWdub3JlRmlsdGVycyA9XG4gICAgdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJlxuICAgICFmaWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKTtcbiAgICBjb25zdCBzZWVrVGltZSA9IHF1ZXVlLm5vZGUuZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMpPy5jdXJyZW50LnZhbHVlIHx8IDA7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKTtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gWy4uLm5ldyBTZXQoZmlsdGVycyldO1xuXG4gICAgcmV0dXJuIHRoaXMuYWYudHJpZ2dlclJlcGxheShzZWVrVGltZSkudGhlbigodCkgPT4ge1xuICAgICAgcXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9GaWx0ZXJzVXBkYXRlLCBxdWV1ZSwgcHJldiwgdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpKTtcbiAgICAgIHJldHVybiB0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpbnB1dCBhcmdzIGZvciBGRm1wZWdcbiAgICovXG4gIHB1YmxpYyBzZXRJbnB1dEFyZ3MoYXJnczogc3RyaW5nW10pIHtcbiAgICBpZiAoIWFyZ3MuZXZlcnkoKGFyZykgPT4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdhcmdzJywgJ0FycmF5PHN0cmluZz4nLCAnaW52YWxpZCBpdGVtKHMpJyk7XG4gICAgdGhpcy4jaW5wdXRBcmdzID0gYXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaW5wdXQgYXJnc1xuICAgKi9cbiAgcHVibGljIGdldCBpbnB1dEFyZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lucHV0QXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZW5jb2RlciBhcmdzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVuY29kZXJBcmdzKCkge1xuICAgIGlmICghdGhpcy5maWx0ZXJzLmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgcmV0dXJuIFsnLWFmJywgdGhpcy50b1N0cmluZygpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmluYWwgZmZtcGVnIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBnZXQgYXJncygpIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dEFyZ3MuY29uY2F0KHRoaXMuZW5jb2RlckFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBmZm1wZWcgc3RyZWFtXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHN0cmVhbSBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlU3RyZWFtKHNvdXJjZTogc3RyaW5nIHwgUmVhZGFibGUsIG9wdGlvbnM6IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy4jaW5wdXRBcmdzLmxlbmd0aCkgb3B0aW9ucy5lbmNvZGVyQXJncyA9IFsuLi50aGlzLiNpbnB1dEFyZ3MsIC4uLihvcHRpb25zLmVuY29kZXJBcmdzIHx8IFtdKV07XG4gICAgcmV0dXJuIGNyZWF0ZUZGbXBlZ1N0cmVhbShzb3VyY2UsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBmZm1wZWcgZmlsdGVyc1xuICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIHNldEZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdIHwgUmVjb3JkPEZpbHRlcnMsIGJvb2xlYW4+IHwgc3RyaW5nW10gfCBib29sZWFuKSB7XG4gICAgbGV0IF9maWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgICBpZiAodHlwZW9mIGZpbHRlcnMgPT09ICdib29sZWFuJykge1xuICAgICAgX2ZpbHRlcnMgPSAhZmlsdGVycyA/IFtdIDogT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVycykpIHtcbiAgICAgIF9maWx0ZXJzID0gZmlsdGVycyBhcyBGaWx0ZXJzW107XG4gICAgfSBlbHNlIHtcbiAgICAgIF9maWx0ZXJzID0gT2JqZWN0LmVudHJpZXMoZmlsdGVycykuXG4gICAgICBmaWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKS5cbiAgICAgIG1hcCgobSkgPT4gbVswXSkgYXMgRmlsdGVyc1tdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgdGhpcy5zZXRGaWx0ZXJzKGZpbHRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBnaXZlbiBmZm1wZWcgZmlsdGVyKHMpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICovXG4gIHB1YmxpYyB0b2dnbGUoZmlsdGVyczogRmlsdGVyc1tdIHwgRmlsdGVycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgZmlsdGVycyA9IFtmaWx0ZXJzXTtcbiAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICBmaWx0ZXJzLmZvckVhY2goKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuaW5jbHVkZXMoZikpIHJldHVybjtcbiAgICAgIGZyZXNoLnB1c2goZik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyh0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICogQHBhcmFtIGZmIEZpbHRlcnMgbGlzdFxuICAgKi9cbiAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gZmY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZW5hYmxlZCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldEZpbHRlcnNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLm5hbWVzLmZpbHRlcigoZikgPT4gIXRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNFbmFibGVkKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBhIHZhbGlkIGZpbHRlclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgKi9cbiAgcHVibGljIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcpOiBmaWx0ZXIgaXMgRmlsdGVyc05hbWUge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuaGFzKGZpbHRlciBhcyBGaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBhcnJheVxuICAgKi9cbiAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gQXVkaW9GaWx0ZXJzLmdldChmaWx0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBKU09OIG9iamVjdFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4gb2JqW2ZpbHRlcl0gPSBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlIHtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgcHVibGljIGdyYXBoID0gbmV3IEFGaWx0ZXJHcmFwaDxNZXRhPih0aGlzKTtcbiAgcHVibGljIGZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICBwdWJsaWMgX2xhc3RGaWx0ZXJzQ2FjaGU6IEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlID0ge1xuICAgIGJpcXVhZDogbnVsbCxcbiAgICBlcXVhbGl6ZXI6IFtdLFxuICAgIGZpbHRlcnM6IFtdLFxuICAgIHZvbHVtZTogMTAwLFxuICAgIHNhbXBsZVJhdGU6IC0xXG4gIH07XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHtcbiAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogZW5hYmxlIHRoaXMgaW4gdGhlIGZ1dHVyZVxuICAvLyBwdWJsaWMgZ2V0IGZmbXBlZygpOiBGRm1wZWdGaWx0ZXJlcjxNZXRhPiB8IG51bGwge1xuICAvLyAgICAgaWYgKHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZykge1xuICAvLyAgICAgICAgIGlmICh0aGlzLiNmZm1wZWcpIHRoaXMuI2ZmbXBlZyA9IG51bGw7XG4gIC8vICAgICAgICAgcmV0dXJuIG51bGw7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGlmICghdGhpcy4jZmZtcGVnKSB7XG4gIC8vICAgICAgICAgdGhpcy4jZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICByZXR1cm4gdGhpcy4jZmZtcGVnO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIFZvbHVtZSB0cmFuc2Zvcm1lclxuICAgKi9cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgKi9cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZXF1YWxpemVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGlnaXRhbCBiaXF1YWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYmlxdWFkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRFNQIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXNhbXBsZXIgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYXkgY3VycmVudCB0cmFjayBpbiB0cmFuc2l0aW9uIG1vZGVcbiAgICogQHBhcmFtIHNlZWsgVGhlIGR1cmF0aW9uIHRvIHNlZWsgdG9cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmlnZ2VyUmVwbGF5KHNlZWsgPSAwKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUuYWNxdWlyZSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaywge1xuICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgIHNlZWssXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSB1bmtub3duPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgcHVibGljIGdldCBmZm1wZWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYuZmZtcGVnPy5maWx0ZXJzID8/IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuICh0aGlzLmFmLmVxdWFsaXplcj8uYmFuZE11bHRpcGxpZXJzIHx8IFtdKS5tYXAoKG0sIGkpID0+ICh7XG4gICAgICBiYW5kOiBpLFxuICAgICAgZ2FpbjogbVxuICAgIH0pKSBhcyBFcXVhbGl6ZXJCYW5kW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5iaXF1YWQ/LmdldEZpbHRlck5hbWUoKSBhcyBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYuZmlsdGVycz8uZmlsdGVycyB8fCBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLmFmLnZvbHVtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmFmLnJlc2FtcGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBkdW1wKCk6IEZpbHRlckdyYXBoIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmZtcGVnOiB0aGlzLmZmbXBlZyxcbiAgICAgIGVxdWFsaXplcjogdGhpcy5lcXVhbGl6ZXIsXG4gICAgICBiaXF1YWQ6IHRoaXMuYmlxdWFkLFxuICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAgc2FtcGxlUmF0ZTogdGhpcy5yZXNhbXBsZXI/LnRhcmdldFNhbXBsZVJhdGUgfHwgdGhpcy5yZXNhbXBsZXI/LnNhbXBsZVJhdGUgfHwgNDgwMDAsXG4gICAgICB2b2x1bWU6IHRoaXMudm9sdW1lPy52b2x1bWUgPz8gMTAwXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckdyYXBoIHtcbiAgZmZtcGVnOiBGaWx0ZXJzW107XG4gIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICBiaXF1YWQ6IEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn0iLCAiaW1wb3J0IHR5cGUgeyBEdXBsZXgsIFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEZGbXBlZyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZGbXBlZ1N0cmVhbU9wdGlvbnMge1xuICBmbXQ/OiBzdHJpbmc7XG4gIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gIHNlZWs/OiBudW1iZXI7XG4gIHNraXA/OiBib29sZWFuO1xuICBjb29raWVzPzogc3RyaW5nO1xufVxuXG5jb25zdCByZXNvbHZlQXJncyA9IChjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ+KTogc3RyaW5nW10gPT4ge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29uZmlnKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBhY2M7XG4gICAgYWNjLnB1c2goYC0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSBhcyBzdHJpbmdbXSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbTogc3RyaW5nLCBmbXQ/OiBzdHJpbmcsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgY29uc3QgYXJncyA9IHJlc29sdmVBcmdzKHtcbiAgICByZWNvbm5lY3Q6IDEsXG4gICAgcmVjb25uZWN0X3N0cmVhbWVkOiAxLFxuICAgIHJlY29ubmVjdF9kZWxheV9tYXg6IDUsXG4gICAgaTogc3RyZWFtLFxuICAgIGFuYWx5emVkdXJhdGlvbjogMCxcbiAgICBsb2dsZXZlbDogMCxcbiAgICBhcjogNDgwMDAsXG4gICAgYWM6IDIsXG4gICAgZjogYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGwsXG4gICAgY29va2llczogdHlwZW9mIGNvb2tpZXMgPT09ICdzdHJpbmcnID8gIWNvb2tpZXMuaW5jbHVkZXMoJyAnKSA/IGNvb2tpZXMgOiBgXCIke2Nvb2tpZXN9XCJgIDogbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICBjb25zdCBhcmdzID0gcmVzb2x2ZUFyZ3Moe1xuICAgIGFuYWx5emVkdXJhdGlvbjogMCxcbiAgICBsb2dsZXZlbDogMCxcbiAgICBhcjogNDgwMDAsXG4gICAgYWM6IDIsXG4gICAgZjogYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGxcbiAgfSk7XG5cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBGRm1wZWcgc3RyZWFtXG4gKiBAcGFyYW0gc3RyZWFtIFRoZSBzb3VyY2Ugc3RyZWFtXG4gKiBAcGFyYW0gb3B0aW9ucyBGRm1wZWcgc3RyZWFtIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW06IFJlYWRhYmxlIHwgRHVwbGV4IHwgc3RyaW5nLCBvcHRpb25zPzogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICBpZiAob3B0aW9ucz8uc2tpcCAmJiB0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykgcmV0dXJuIHN0cmVhbTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIGNvbnN0IGFyZ3MgPVxuICB0eXBlb2Ygc3RyZWFtID09PSAnc3RyaW5nJyA/XG4gIEZGTVBFR19BUkdTX1NUUklORyhzdHJlYW0sIG9wdGlvbnMuZm10LCBvcHRpb25zLmNvb2tpZXMpIDpcbiAgRkZNUEVHX0FSR1NfUElQRUQob3B0aW9ucy5mbXQpO1xuXG4gIGlmICghTnVtYmVyLmlzTmFOKG9wdGlvbnMuc2VlaykpIGFyZ3MudW5zaGlmdCgnLXNzJywgU3RyaW5nKG9wdGlvbnMuc2VlaykpO1xuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmVuY29kZXJBcmdzKSkgYXJncy5wdXNoKC4uLm9wdGlvbnMuZW5jb2RlckFyZ3MpO1xuXG4gIGNvbnN0IHRyYW5zY29kZXI6IER1cGxleCA9IG5ldyBGRm1wZWcoeyBzaGVsbDogZmFsc2UsIGFyZ3MgfSk7XG5cbiAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0cmVhbS5waXBlKHRyYW5zY29kZXIgYXMgYW55KTtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2NvZGVyO1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhIHtcbiAgbGF0ZW5jeToge1xuICAgIGV2ZW50TG9vcDogbnVtYmVyO1xuICAgIHZvaWNlQ29ubmVjdGlvbjogbnVtYmVyO1xuICB9O1xuICBzdGF0dXM6IHtcbiAgICBidWZmZXJpbmc6IGJvb2xlYW47XG4gICAgcGxheWluZzogYm9vbGVhbjtcbiAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgaWRsZTogYm9vbGVhbjtcbiAgfTtcbiAgdHJhY2tzQ291bnQ6IG51bWJlcjtcbiAgaGlzdG9yeVNpemU6IG51bWJlcjtcbiAgZXh0cmFjdG9yczogbnVtYmVyO1xuICBsaXN0ZW5lcnM6IG51bWJlcjtcbiAgbWVtb3J5VXNhZ2U6IE5vZGVKUy5NZW1vcnlVc2FnZTtcbiAgdmVyc2lvbnM6IHtcbiAgICBub2RlOiBzdHJpbmc7XG4gICAgcGxheWVyOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhID0gdW5rbm93bj4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdGF0aXN0aWNzIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IHRoaXMucXVldWUucGxheWVyLmV2ZW50TG9vcExhZyxcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiB0aGlzLnF1ZXVlLnBpbmdcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgcGxheWluZzogdGhpcy5xdWV1ZS5ub2RlLmlzUGxheWluZygpLFxuICAgICAgICBwYXVzZWQ6IHRoaXMucXVldWUubm9kZS5pc1BhdXNlZCgpLFxuICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgIH0sXG4gICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICBsaXN0ZW5lcnM6IHRoaXMucXVldWUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2UuY2hhbm5lbD8ubWVtYmVycy5maWx0ZXIoKG0pID0+ICFtLnVzZXIuYm90KS5zaXplIHx8IDAsXG4gICAgICBtZW1vcnlVc2FnZTogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLFxuICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgICBwbGF5ZXI6IHRoaXMucXVldWUucGxheWVyLnZlcnNpb25cbiAgICAgIH1cbiAgICB9IGFzIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGE7XG4gIH1cbn0iLCAiaW1wb3J0IHsgTm90RXhpc3RpbmdFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBMcmNHZXRSZXN1bHQsIExyY1NlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2xyY2xpYi9McmNMaWInO1xuaW1wb3J0IHR5cGUgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IHR5cGUgTHlyaWNzRGF0YSA9IE1hcDxudW1iZXIsIHN0cmluZz47XG5leHBvcnQgdHlwZSBVbnN1YnNjcmliZSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBMeXJpY3NDYWxsYmFjayA9IChseXJpY3M6IHN0cmluZywgdGltZXN0YW1wOiBudW1iZXIpID0+IHVua25vd247XG5leHBvcnQgdHlwZSBMeXJpY3NBdCA9IHt0aW1lc3RhbXA6IG51bWJlcjtsaW5lOiBzdHJpbmc7fTtcblxuY29uc3QgdGltZXN0YW1wUGF0dGVybiA9IC9cXFsoXFxkezJ9KTooXFxkezJ9KVxcLihcXGR7Mn0pXFxdLztcblxuZXhwb3J0IGNsYXNzIFN5bmNlZEx5cmljc1Byb3ZpZGVyIHtcbiAgI2xvb3A6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG4gICNjYWxsYmFjazogTHlyaWNzQ2FsbGJhY2sgfCBudWxsID0gbnVsbDtcbiAgI29uVW5zdWJzY3JpYmU6IFVuc3Vic2NyaWJlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIGludGVydmFsID0gMTAwO1xuICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzOiBMeXJpY3NEYXRhID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcXVldWU6IEd1aWxkUXVldWUsIHB1YmxpYyByZWFkb25seSByYXc/OiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpIHtcbiAgICBpZiAocmF3Py5zeW5jZWRMeXJpY3MpIHRoaXMubG9hZChyYXc/LnN5bmNlZEx5cmljcyk7XG4gIH1cblxuICBwdWJsaWMgaXNTdWJzY3JpYmVkKCkge1xuICAgIHJldHVybiB0aGlzLiNjYWxsYmFjayAhPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkKGx5cmljczogc3RyaW5nKSB7XG4gICAgaWYgKCFseXJpY3MpIHRocm93IG5ldyBOb3RFeGlzdGluZ0Vycm9yKCdzeW5jZWRMeXJpY3MnKTtcblxuICAgIHRoaXMubHlyaWNzLmNsZWFyKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgY29uc3QgbGluZXMgPSBseXJpY3Muc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2godGltZXN0YW1wUGF0dGVybik7XG5cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjb25zdCBbLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHNdID0gbWF0Y2g7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHBhcnNlSW50KG1pbnV0ZXMpICogNjAgKiAxMDAwICsgcGFyc2VJbnQoc2Vjb25kcykgKiAxMDAwICsgcGFyc2VJbnQobWlsbGlzZWNvbmRzKTtcblxuICAgICAgICB0aGlzLmx5cmljcy5zZXQodGltZXN0YW1wLCBsaW5lLnJlcGxhY2UodGltZXN0YW1wUGF0dGVybiwgJycpLnRyaW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGx5cmljcyBhdCBhIHNwZWNpZmljIHRpbWUgb3IgYXQgdGhlIGNsb3Nlc3QgdGltZSAoXHUwMEIxMiBzZWNvbmRzKVxuICAgKiBAcGFyYW0gdGltZSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBhdCh0aW1lOiBudW1iZXIpOiBMeXJpY3NBdCB8IG51bGwge1xuICAgIGNvbnN0IGxvd2VzdFRpbWUgPSB0aGlzLmx5cmljcy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgIGlmIChsb3dlc3RUaW1lID09IG51bGwgfHwgdGltZSA8IGxvd2VzdFRpbWUpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmx5cmljcy5oYXModGltZSkpIHJldHVybiB7IGxpbmU6IHRoaXMubHlyaWNzLmdldCh0aW1lKSBhcyBzdHJpbmcsIHRpbWVzdGFtcDogdGltZSB9O1xuXG4gICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20odGhpcy5seXJpY3Mua2V5cygpKTtcblxuICAgIGNvbnN0IGNsb3Nlc3QgPSBrZXlzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5hYnMoYiAtIHRpbWUpIDwgTWF0aC5hYnMoYSAtIHRpbWUpID8gYiA6IGEpO1xuXG4gICAgaWYgKGNsb3Nlc3QgPiB0aW1lKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChNYXRoLmFicyhjbG9zZXN0IC0gdGltZSkgPiAyMDAwKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmx5cmljcy5nZXQoY2xvc2VzdCk7XG5cbiAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHsgdGltZXN0YW1wOiBjbG9zZXN0LCBsaW5lIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRoZSBseXJpY3MgY2hhbmdlLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25DaGFuZ2UoY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrKSB7XG4gICAgdGhpcy4jY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBkZXRlY3Qgd2hlbiB0aGUgcHJvdmlkZXIgaXMgdW5zdWJzY3JpYmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25VbnN1YnNjcmliZShjYWxsYmFjazogVW5zdWJzY3JpYmUpIHtcbiAgICB0aGlzLiNvblVuc3Vic2NyaWJlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLiNsb29wKSBjbGVhckludGVydmFsKHRoaXMuI2xvb3ApO1xuICAgIGlmICh0aGlzLiNvblVuc3Vic2NyaWJlKSB0aGlzLiNvblVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLiNjYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IG51bGw7XG4gICAgdGhpcy4jbG9vcCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgcXVldWUgdG8gbW9uaXRvciB0aGUgY3VycmVudCB0aW1lLlxuICAgKiBAcmV0dXJucyBUaGUgdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdWJzY3JpYmUoKTogVW5zdWJzY3JpYmUge1xuICAgIGlmICh0aGlzLiNsb29wKSByZXR1cm4gKCkgPT4gdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy4jY3JlYXRlTG9vcCgpO1xuXG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICBjb25zdCBoYXNMb29wID0gdGhpcy4jbG9vcCAhPT0gbnVsbDtcblxuICAgIGlmIChoYXNMb29wKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuI2xvb3AhKTtcbiAgICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNMb29wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgY29uc3QgaGFzTG9vcCA9IHRoaXMuI2xvb3AgIT09IG51bGw7XG5cbiAgICBpZiAoIWhhc0xvb3ApIHRoaXMuI2NyZWF0ZUxvb3AoKTtcblxuICAgIHJldHVybiAhaGFzTG9vcDtcbiAgfVxuXG4gICNjcmVhdGVMb29wKCkge1xuICAgIGlmICghdGhpcy4jY2FsbGJhY2spIHJldHVybjtcbiAgICBpZiAodGhpcy4jbG9vcCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wKTtcblxuICAgIGxldCBsYXN0VmFsdWU6IEx5cmljc0F0IHwgbnVsbCA9IG51bGw7XG5cbiAgICB0aGlzLiNsb29wID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucXVldWUuZGVsZXRlZCkgcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgaWYgKCF0aGlzLiNjYWxsYmFjayB8fCAhdGhpcy5xdWV1ZS5pc1BsYXlpbmcoKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0aW1lID0gdGhpcy5xdWV1ZS5ub2RlLmdldFRpbWVzdGFtcCgpO1xuICAgICAgaWYgKCF0aW1lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGx5cmljcyA9IHRoaXMuYXQodGltZS5jdXJyZW50LnZhbHVlKTtcblxuICAgICAgaWYgKCFseXJpY3MpIHJldHVybjtcblxuICAgICAgaWYgKGxhc3RWYWx1ZSAhPT0gbnVsbCAmJiBseXJpY3MubGluZSA9PT0gbGFzdFZhbHVlLmxpbmUgJiYgbHlyaWNzLnRpbWVzdGFtcCA9PT0gbGFzdFZhbHVlLnRpbWVzdGFtcCkgcmV0dXJuO1xuXG4gICAgICBsYXN0VmFsdWUgPSBseXJpY3M7XG5cbiAgICAgIHRoaXMuI2NhbGxiYWNrKGx5cmljcy5saW5lLCBseXJpY3MudGltZXN0YW1wKTtcbiAgICB9LCB0aGlzLmludGVydmFsKS51bnJlZigpO1xuICB9XG59IiwgImltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4vQXN5bmNRdWV1ZSc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RFbnRpdHkgPSAoKSA9PiBQcm9taXNlPFJlc3BvbnNlPjtcblxuZXhwb3J0IGNsYXNzIFNlcXVlbnRpYWxCdWNrZXQge1xuICBwdWJsaWMgbGltaXQgPSAxO1xuICBwdWJsaWMgcmVtYWluaW5nID0gMTtcbiAgcHVibGljIHJlc2V0QWZ0ZXIgPSAwO1xuICBwdWJsaWMgcXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgTUFYX1JFVFJJRVMgPSA1O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGJ1Y2tldCBpcyByYXRlIGxpbWl0ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNSYXRlTGltaXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW1haW5pbmcgPD0gMCAmJiBEYXRlLm5vdygpIDwgdGhpcy5yZXNldEFmdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEVucXVldWVzIGEgcmVxdWVzdC5cbiAgICogQHBhcmFtIHJlcSBUaGUgcmVxdWVzdCBmdW5jdGlvbiB0byBlbnF1ZXVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5xdWV1ZShyZXE6IFJlcXVlc3RFbnRpdHkpIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUuYWNxdWlyZSgpO1xuICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChyZXEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbnRyeS5yZWxlYXNlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVxdWVzdChyZXE6IFJlcXVlc3RFbnRpdHksIHJldHJpZXMgPSAwKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHdoaWxlICh0aGlzLmlzUmF0ZUxpbWl0ZWQoKSkge1xuICAgICAgY29uc3QgcmVzZXQgPSB0aGlzLnJlc2V0QWZ0ZXIgLSBEYXRlLm5vdygpO1xuICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgfVxuXG4gICAgbGV0IHBhc3MgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXEoKTtcblxuICAgICAgdGhpcy5fcGF0Y2hIZWFkZXJzKHJlcyk7XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgY29uc3QgcmVzZXQgPSB0aGlzLnJlc2V0QWZ0ZXIgLSBEYXRlLm5vdygpO1xuICAgICAgICBhd2FpdCBzZXRUaW1lb3V0KHJlc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgbGV0IGVycjogRXJyb3I7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5OiB7XG4gICAgICAgICAgICBjb2RlOiBudW1iZXI7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgICAgfSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihib2R5Lm1lc3NhZ2UpIGFzIEVycm9yICYge2NvZGU6IG51bWJlcjt9O1xuXG4gICAgICAgICAgZXJyb3IubmFtZSA9IGJvZHkubmFtZTtcbiAgICAgICAgICBlcnJvci5jb2RlID0gYm9keS5jb2RlO1xuXG4gICAgICAgICAgZXJyID0gZXJyb3I7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGVyciA9IG5ldyBFcnJvcihgSFRUUCBFcnJvcjogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFzcyA9IHRydWU7XG5cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChwYXNzKSB0aHJvdyBlO1xuXG4gICAgICBjb25zdCBiYWRSZXEgPSBlIGluc3RhbmNlb2YgRXJyb3IgJiYgL0Vycm9yOiA0WzAtOV17Mn0vLnRlc3QoZS5tZXNzYWdlKTtcblxuICAgICAgaWYgKCFiYWRSZXEgJiYgcmV0cmllcyA8IHRoaXMuTUFYX1JFVFJJRVMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxLCArK3JldHJpZXMpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3BhdGNoSGVhZGVycyhyZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbGltaXQgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1MaW1pdCcpKTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZW1haW5pbmcnKSk7XG4gICAgY29uc3QgcmVzZXRBZnRlciA9IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVJlc2V0JykpICogMTAwMCArIERhdGUubm93KCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihsaW1pdCkpIHRoaXMubGltaXQgPSBsaW1pdDtcbiAgICBpZiAoIU51bWJlci5pc05hTihyZW1haW5pbmcpKSB0aGlzLnJlbWFpbmluZyA9IHJlbWFpbmluZztcbiAgICBpZiAoIU51bWJlci5pc05hTihyZXNldEFmdGVyKSkgdGhpcy5yZXNldEFmdGVyID0gcmVzZXRBZnRlcjtcbiAgfVxufSIsICJpbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlcXVlbnRpYWxCdWNrZXQgfSBmcm9tICcuLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHRyYWNrTmFtZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHE/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZSB0byBzZWFyY2ggZm9yLiBFaXRoZXIgdGhpcyBvciBxdWVyeSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHRyYWNrTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhcnRpc3QgbmFtZVxuICAgKi9cbiAgYXJ0aXN0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhbGJ1bU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjR2V0UGFyYW1zIGV4dGVuZHMgUmVxdWlyZWQ8T21pdDxMcmNTZWFyY2hQYXJhbXMsICdxdWVyeSc+PiB7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xufVxuXG5jb25zdCB0b1NuYWtlQ2FzZSA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3Qgc25ha2VPYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5ld0tleSA9IGtleS5yZXBsYWNlKC9bQS1aXS9nLCAobGV0dGVyKSA9PiBgXyR7bGV0dGVyLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgc25ha2VPYmpbbmV3S2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHNuYWtlT2JqO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGNyZWF0ZVF1ZXJ5ID0gKHBhcmFtczogYW55KSA9PiBuZXcgVVJMU2VhcmNoUGFyYW1zKHRvU25ha2VDYXNlKHBhcmFtcykpLnRvU3RyaW5nKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjU2VhcmNoUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayBpZFxuICAgKi9cbiAgaWQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayBuYW1lXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXJ0aXN0IG5hbWVcbiAgICovXG4gIHRyYWNrTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFsYnVtIG5hbWVcbiAgICovXG4gIGFydGlzdE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhbGJ1bU5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhY2tcbiAgICovXG4gIGR1cmF0aW9uOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgaW5zdHJ1bWVudGFsOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHBsYWluTHlyaWNzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgc3luY2VkTHlyaWNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBMcmNHZXRSZXN1bHQgPSBPbWl0PExyY1NlYXJjaFJlc3VsdCwgJ25hbWUnPjtcblxuZXhwb3J0IGNsYXNzIExyY0xpYiB7XG4gIC8qKlxuICAgKiBUaGUgQVBJIFVSTFxuICAgKi9cbiAgcHVibGljIGFwaSA9ICdodHRwczovL2xyY2xpYi5uZXQvYXBpJztcbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IHRpbWVvdXQuIERlZmF1bHQgaXMgMTUgc2Vjb25kcy5cbiAgICovXG4gIHB1YmxpYyB0aW1lb3V0ID0gMTVfMDAwO1xuICAvKipcbiAgICogVGhlIHJlcXVlc3QgYnVja2V0XG4gICAqL1xuICBwdWJsaWMgYnVja2V0ID0gbmV3IFNlcXVlbnRpYWxCdWNrZXQoKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBMcmNMaWIgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyKSB7fVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByZXF1ZXN0IHRpbWVvdXRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgc2V0UmVxdWVzdFRpbWVvdXQodGltZW91dDogbnVtYmVyKSB7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByZXRyeSBsaW1pdC4gRGVmYXVsdCBpcyA1LlxuICAgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgVGhlIHJldHJ5IGxpbWl0XG4gICAqL1xuICBwdWJsaWMgc2V0UmV0cnlMaW1pdChsaW1pdDogbnVtYmVyKSB7XG4gICAgdGhpcy5idWNrZXQuTUFYX1JFVFJJRVMgPSBsaW1pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGx5cmljc1xuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBnZXQgcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgZ2V0KHBhcmFtczogTHJjR2V0UGFyYW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IGBnZXQ/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdD4ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBseXJpY3MgYnkgSURcbiAgICogQHBhcmFtIGlkIFRoZSBseXJpY3MgSURcbiAgICovXG4gIHB1YmxpYyBnZXRCeUlkKGlkOiBgJHtudW1iZXJ9YCB8IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihgZ2V0LyR7aWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjYWNoZWQgbHlyaWNzXG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIGdldCBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBnZXRDYWNoZWQocGFyYW1zOiBMcmNHZXRQYXJhbXMpIHtcbiAgICBjb25zdCBwYXRoID0gYGdldC1jYWNoZWQ/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdD4ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoZXMgZm9yIGx5cmljc1xuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBzZWFyY2ggcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgc2VhcmNoKHBhcmFtczogTHJjU2VhcmNoUGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMucSAmJiAhcGFyYW1zLnRyYWNrTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdvbmUgb2YgcSBvciB0cmFja05hbWUnLFxuICAgICAgICAnc3RyaW5nJyxcbiAgICAgICAgW1N0cmluZyhwYXJhbXMucSksIFN0cmluZyhwYXJhbXMudHJhY2tOYW1lKV0uam9pbignLCAnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gYHNlYXJjaD8ke2NyZWF0ZVF1ZXJ5KHBhcmFtcyl9YDtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0W10+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIHRoZSBBUElcbiAgICogQHBhcmFtIHBhdGggVGhlIHBhdGhcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3Q8VD4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBVdGlsLmdldFJ1bnRpbWUoKTtcblxuICAgICAgY29uc3QgcnVudGltZVZlcnNpb24gPSBuYW1lID09PSAndW5rbm93bicgPyB2ZXJzaW9uIDogYCR7bmFtZX0vJHt2ZXJzaW9ufWA7XG5cbiAgICAgIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCh0aGlzLnRpbWVvdXQpLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiBgRGlzY29yZC1QbGF5ZXIvJHt0aGlzLnBsYXllci52ZXJzaW9ufSAke3J1bnRpbWVWZXJzaW9uID8/ICcnfWAudHJpbUVuZCgpLFxuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgLi4ub3B0aW9ucz8uaGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgW0xyY0xpYl0gUmVxdWVzdGluZyAke3BhdGh9YCk7XG5cbiAgICAgIHJldHVybiBmZXRjaChgJHt0aGlzLmFwaX0ke3BhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6ICcvJyArIHBhdGh9YCwgaW5pdCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYnVja2V0LmVucXVldWUoZGlzcGF0Y2hlcik7XG5cbiAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgfVxufSIsICJpbXBvcnQgeyBWb2ljZUNoYW5uZWwsIFN0YWdlQ2hhbm5lbCwgU25vd2ZsYWtlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQge1xuICBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICBqb2luVm9pY2VDaGFubmVsLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbixcbiAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICBBdWRpb1BsYXllciB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBOb0d1aWxkUXVldWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmNsYXNzIFZvaWNlVXRpbHMge1xuICAvKipcbiAgICogVm9pY2UgY29ubmVjdGlvbiBjYWNoZSB0byBzdG9yZSB2b2ljZSBjb25uZWN0aW9ucyBvZiB0aGUgUGxheWVyIGNvbXBvbmVudHMuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4gICAqIEl0IG9ubHkgZXhpc3RzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgY2FjaGU6IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPiA9IG5ldyBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj4oKTtcblxuICAvKipcbiAgICogVGhlIHZvaWNlIHV0aWxzIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbCwgY3JlYXRpbmcgYmFzaWMgc3RyZWFtIGRpc3BhdGNoIG1hbmFnZXJcbiAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgb3B0aW9ucz86IHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgIHF1ZXVlOiBHdWlsZFF1ZXVlO1xuICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG4gICAgZ3JvdXA/OiBzdHJpbmc7XG4gIH0pXG4gIDogUHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPiB7XG4gICAgaWYgKCFvcHRpb25zPy5xdWV1ZSkgdGhyb3cgbmV3IE5vR3VpbGRRdWV1ZUVycm9yKCk7XG4gICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMuam9pbihjaGFubmVsLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdWIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihjb25uLCBjaGFubmVsLCBvcHRpb25zLnF1ZXVlLCBvcHRpb25zLm1heFRpbWUsIG9wdGlvbnMuYXVkaW9QbGF5ZXIpO1xuICAgIHJldHVybiBzdWI7XG4gIH1cblxuICAvKipcbiAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gW2NoYW5uZWxdIFRoZSB2b2ljZS9zdGFnZSBjaGFubmVsIHRvIGpvaW5cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICogQHJldHVybnMge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBqb2luKFxuICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gIG9wdGlvbnM/OiB7XG4gICAgZGVhZj86IGJvb2xlYW47XG4gICAgbWF4VGltZT86IG51bWJlcjtcbiAgICBncm91cD86IHN0cmluZztcbiAgfSlcbiAge1xuICAgIGNvbnN0IGV4aXN0aW5nQ29ubmVjdGlvbiA9IHRoaXMuZ2V0Q29ubmVjdGlvbihjaGFubmVsLmd1aWxkLmlkLCBvcHRpb25zPy5ncm91cCk7XG5cbiAgICBpZiAoXG4gICAgZXhpc3RpbmdDb25uZWN0aW9uPy5qb2luQ29uZmlnLmNoYW5uZWxJZCA9PT0gY2hhbm5lbD8uaWQgJiZcbiAgICBleGlzdGluZ0Nvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuICAgIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0Nvbm5lY3Rpb247XG4gICAgfVxuXG4gICAgY29uc3QgY29ubiA9IGpvaW5Wb2ljZUNoYW5uZWwoe1xuICAgICAgZ3VpbGRJZDogY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgIGNoYW5uZWxJZDogY2hhbm5lbC5pZCxcbiAgICAgIGFkYXB0ZXJDcmVhdG9yOiBjaGFubmVsLmd1aWxkLnZvaWNlQWRhcHRlckNyZWF0b3IgYXMgdW5rbm93biBhcyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICAgICAgc2VsZkRlYWY6IEJvb2xlYW4ob3B0aW9ucz8uZGVhZiksXG4gICAgICBkZWJ1ZzogdGhpcy5wbGF5ZXIuZXZlbnRzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJykgPiAwLFxuICAgICAgZ3JvdXA6IG9wdGlvbnM/Lmdyb3VwXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29ubjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0cyB2b2ljZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHVibGljIGRpc2Nvbm5lY3QoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uIHwgU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgU3RyZWFtRGlzcGF0Y2hlcikgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgcmV0dXJuIGNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvL1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFJldHVybnMgRGlzY29yZCBQbGF5ZXIgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1Nub3dmbGFrZX0gZ3VpbGQgVGhlIGd1aWxkIGlkXG4gICAqIEByZXR1cm5zIHtTdHJlYW1EaXNwYXRjaGVyfVxuICAgKi9cbiAgcHVibGljIGdldENvbm5lY3Rpb24oZ3VpbGQ6IFNub3dmbGFrZSwgZ3JvdXA/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZ2V0Vm9pY2VDb25uZWN0aW9uKGd1aWxkLCBncm91cCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgVm9pY2VVdGlscyB9OyIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vZmFicmljL1NlYXJjaFJlc3VsdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuL1F1ZXJ5UmVzb2x2ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVPcHRpb25zIHtcbiAgY2hlY2tJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLy8gNWhcbmNvbnN0IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQgPSAxOF8wMDBfMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUPiB7XG4gIGdldERhdGEoKTogUHJvbWlzZTxEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUPltdPjtcbiAgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpOiBQcm9taXNlPHZvaWQ+O1xuICByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUNhY2hlIGltcGxlbWVudHMgUXVlcnlDYWNoZVByb3ZpZGVyPFRyYWNrPiB7XG4gICNkZWZhdWx0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VHJhY2s+PigpO1xuICBwdWJsaWMgdGltZXI6IE5vZGVKUy5UaW1lcjtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgcGxheWVyOiBQbGF5ZXIsXG4gIHB1YmxpYyBvcHRpb25zOiBRdWVyeUNhY2hlT3B0aW9ucyA9IHtcbiAgICBjaGVja0ludGVydmFsOiBERUZBVUxUX0VYUElSWV9USU1FT1VUXG4gIH0pXG4gIHtcbiAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5jbGVhbnVwLmJpbmQodGhpcyksIHRoaXMuY2hlY2tJbnRlcnZhbCkudW5yZWYoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2hlY2tJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNoZWNrSW50ZXJ2YWwgPz8gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjbGVhbnVwKCkge1xuICAgIGZvciAoY29uc3QgW2lkLCB2YWx1ZV0gb2YgdGhpcy4jZGVmYXVsdENhY2hlKSB7XG4gICAgICBpZiAodmFsdWUuaGFzRXhwaXJlZCgpKSB7XG4gICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjbGVhcigpIHtcbiAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREYXRhKCkge1xuICAgIHJldHVybiBbLi4udGhpcy4jZGVmYXVsdENhY2hlLnZhbHVlcygpXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCkge1xuICAgIGRhdGEudHJhY2tzLmZvckVhY2goKGQpID0+IHtcbiAgICAgIGlmICh0aGlzLiNkZWZhdWx0Q2FjaGUuaGFzKGQudXJsKSkgcmV0dXJuO1xuICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLnNldChkLnVybCwgbmV3IERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlKGQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNkZWZhdWx0Q2FjaGUuZ2V0KGNvbnRleHQucXVlcnkpO1xuICAgIGlmICghcmVzdWx0KVxuICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5LFxuICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgIHF1ZXJ5OiBjb250ZXh0LnF1ZXJ5LFxuICAgICAgdHJhY2tzOiBbcmVzdWx0LmRhdGFdLFxuICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlLFxuICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnlcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VCA9IHVua25vd24+IHtcbiAgcHVibGljIGV4cGlyZUFmdGVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBULCBleHBpcmVBZnRlcjogbnVtYmVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVCkge1xuICAgIGlmICh0eXBlb2YgZXhwaXJlQWZ0ZXIgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmV4cGlyZUFmdGVyID0gRGF0ZS5ub3coKSArIGV4cGlyZUFmdGVyO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYXNFeHBpcmVkKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5leHBpcmVBZnRlciAhPT0gJ251bWJlcicgfHwgaXNOYU4odGhpcy5leHBpcmVBZnRlcikgfHwgdGhpcy5leHBpcmVBZnRlciA8IDEpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gRGF0ZS5ub3coKSA8PSB0aGlzLmV4cGlyZUFmdGVyO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCB7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIHJlcXVlc3RlZEJ5PzogVXNlcjtcbiAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgYGV4dDoke3N0cmluZ31gO1xufSIsICJpbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmltcG9ydCB7XG4gIENsaWVudCxcbiAgU25vd2ZsYWtlVXRpbCxcbiAgVm9pY2VTdGF0ZSxcbiAgSW50ZW50c0JpdEZpZWxkLFxuICBVc2VyLFxuICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIHZlcnNpb24gYXMgZGpzVmVyc2lvbixcbiAgRXZlbnRzIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrLCBTZWFyY2hSZXN1bHQsIFNlYXJjaE9wdGlvbnMsIFBsYXlsaXN0SW5pdERhdGEgfSBmcm9tICcuL2ZhYnJpYyc7XG5pbXBvcnQge1xuICBHdWlsZFF1ZXVlRXZlbnRzLFxuICBWb2ljZUNvbm5lY3RDb25maWcsXG4gIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnMsXG4gIEd1aWxkTm9kZU1hbmFnZXIsXG4gIEd1aWxkUXVldWUsXG4gIFJlc291cmNlUGxheU9wdGlvbnMsXG4gIEd1aWxkUXVldWVFdmVudCB9IGZyb21cbicuL3F1ZXVlJztcbmltcG9ydCB7IFZvaWNlVXRpbHMgfSBmcm9tICcuL3N0cmVhbS9Wb2ljZVV0aWxzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIsIFF1ZXJ5VHlwZSwgUmVzb2x2ZWRRdWVyeSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSwgdmVyc2lvbiBhcyBkVm9pY2VWZXJzaW9uIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgUXVlcnlDYWNoZSwgUXVlcnlDYWNoZVByb3ZpZGVyIH0gZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciwgTm9SZXN1bHRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlciB9IGZyb20gJy4vRGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyJztcbmltcG9ydCB7IENvbnRleHQsIGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuL2hvb2tzJztcbmltcG9ydCB7IEhvb2tzQ3R4LCBTVVBFUl9DT05URVhUIH0gZnJvbSAnLi9ob29rcy9jb21tb24nO1xuaW1wb3J0IHsgTHJjTGliIH0gZnJvbSAnLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB7IGdldENvbXBhdE5hbWUsIGlzQ2xpZW50UHJveHkgfSBmcm9tICcuL2NvbXBhdC9jcmVhdGVFcmlzQ29tcGF0JztcbmltcG9ydCB7IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IgfSBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIGRwVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyRXZlbnRzIHtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgdm9pY2VTdGF0ZVVwZGF0ZTogKHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpID0+IGFueTtcbn1cblxuZXhwb3J0IGNvbnN0IFBsYXllckV2ZW50ID0ge1xuICBkZWJ1ZzogJ2RlYnVnJyxcbiAgRGVidWc6ICdkZWJ1ZycsXG4gIGVycm9yOiAnZXJyb3InLFxuICBFcnJvcjogJ2Vycm9yJyxcbiAgdm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICBWb2ljZVN0YXRlVXBkYXRlOiAndm9pY2VTdGF0ZVVwZGF0ZSdcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQbGF5ZXJFdmVudCA9ICh0eXBlb2YgUGxheWVyRXZlbnQpW2tleW9mIHR5cGVvZiBQbGF5ZXJFdmVudF07XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICB0cmFjazogVHJhY2s7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICBxdWV1ZTogR3VpbGRRdWV1ZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tMaWtlID0gc3RyaW5nIHwgVHJhY2sgfCBTZWFyY2hSZXN1bHQgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBBdWRpb1Jlc291cmNlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gZXh0ZW5kcyBTZWFyY2hPcHRpb25zIHtcbiAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICBjb25uZWN0aW9uT3B0aW9ucz86IFZvaWNlQ29ubmVjdENvbmZpZztcbiAgYXVkaW9QbGF5ZXJPcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIGFmdGVyU2VhcmNoPzogKHJlc3VsdDogU2VhcmNoUmVzdWx0KSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCB0eXBlIFZvaWNlU3RhdGVIYW5kbGVyID0gKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFZvaWNlU3RhdGU6IFZvaWNlU3RhdGUsXG5uZXdWb2ljZVN0YXRlOiBWb2ljZVN0YXRlKVxuPT4gQXdhaXRlZDx2b2lkPjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiB0aW1lb3V0XG4gICAqL1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbXMgdG8gcmUtbW9uaXRvciBldmVudCBsb29wIGxhZ1xuICAgKi9cbiAgbGFnTW9uaXRvcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAgICovXG4gIGxvY2tWb2ljZVN0YXRlSGFuZGxlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBxdWVyeWluZyBtZXRhZGF0YSBmcm9tXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHN0cmVhbWluZyBmcm9tXG4gICAqL1xuICBibG9ja1N0cmVhbUZyb20/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZVByb3ZpZGVyPGFueT4gfCBudWxsO1xuICAvKipcbiAgICogU2tpcCBmZm1wZWcgcHJvY2VzcyB3aGVuIHBvc3NpYmxlXG4gICAqL1xuICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBwcm9iZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNTAwMC5cbiAgICovXG4gIHByb2JlVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBmZm1wZWcgcGF0aFxuICAgKi9cbiAgZmZtcGVnUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3ZlcnJpZGUgdGhlIGZhbGxiYWNrIGNvbnRleHQuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIG92ZXJyaWRlRmFsbGJhY2tDb250ZXh0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXllciBleHRlbmRzIFBsYXllckV2ZW50c0VtaXR0ZXI8UGxheWVyRXZlbnRzPiB7XG4gICNsYXN0TGF0ZW5jeSA9IC0xO1xuICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICNsYWdNb25pdG9yVGltZW91dDogTm9kZUpTLlRpbWVvdXQ7XG4gICNsYWdNb25pdG9ySW50ZXJ2YWw6IE5vZGVKUy5UaW1lb3V0O1xuICAjb25Wb2ljZVN0YXRlVXBkYXRlOiBWb2ljZVN0YXRlSGFuZGxlciA9IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcjtcbiAgI2hvb2tzQ3R4OiBDb250ZXh0PEhvb2tzQ3R4PiB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgZGlzY29yZC1wbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nID0gZHBWZXJzaW9uO1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcGxheWVyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgLyoqXG4gICAqIFRoZSBkaXNjb3JkLmpzIGNsaWVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudCE6IENsaWVudDtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMhOiBQbGF5ZXJJbml0T3B0aW9ucztcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgbm9kZXMgKHF1ZXVlKSBtYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBhcGkgdXRpbGl0aWVzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VVdGlscyA9IG5ldyBWb2ljZVV0aWxzKHRoaXMpO1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgbWFuYWdlclxuICAgKi9cbiAgcHVibGljIGV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCh0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgZXZlbnRzIGNoYW5uZWxcbiAgICovXG4gIHB1YmxpYyBldmVudHMgPSBuZXcgUGxheWVyRXZlbnRzRW1pdHRlcjxHdWlsZFF1ZXVlRXZlbnRzPihbR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3JdKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdmVyc2lvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24gPSBQbGF5ZXIudmVyc2lvbjtcbiAgLyoqXG4gICAqIFRoZSBseXJpY3MgYXBpXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzID0gbmV3IExyY0xpYih0aGlzKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgRGlzY29yZCBQbGF5ZXJcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBUaGUgRGlzY29yZCBDbGllbnRcbiAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihbUGxheWVyRXZlbnQuRXJyb3JdKTtcblxuICAgIGlmIChvcHRpb25zLmZmbXBlZ1BhdGgpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mZm1wZWdQYXRoICE9PSAnc3RyaW5nJylcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIHR5cGUgXCJzdHJpbmdcIiBmb3Igb3B0aW9ucy5mZm1wZWdQYXRoLiBHb3QgJHt0eXBlb2Ygb3B0aW9ucy5mZm1wZWdQYXRofSBpbnN0ZWFkYCk7XG5cbiAgICAgIHByb2Nlc3MuZW52LkZGTVBFR19QQVRIID0gb3B0aW9ucy5mZm1wZWdQYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQ29tcGF0TW9kZSA9IGlzQ2xpZW50UHJveHkoY2xpZW50KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkaXNjb3JkIGNsaWVudFxuICAgICAqIEB0eXBlIHtDbGllbnR9XG4gICAgICovXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoY2xpZW50IGluc3RhbmNlb2YgQ2xpZW50KSkge1xuICAgICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAgIGBDbGllbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIGRpc2NvcmQuanNAJHtkanNWZXJzaW9ufSBjbGllbnQsIHNvbWUgdGhpbmdzIG1heSBub3Qgd29yayBjb3JyZWN0bHkuIFRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gY29ycnVwdCBkZXBlbmRlbmNpZXMgb3IgaGF2aW5nIG11bHRpcGxlIGluc3RhbGxhdGlvbnMgb2YgZGlzY29yZC5qcy5gLFxuICAgICAgICAgICAgJ0ludmFsaWRDbGllbnRJbnN0YW5jZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWJmID1cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIGluc3RhbmNlb2YgSW50ZW50c0JpdEZpZWxkID9cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIDpcbiAgICAgICAgbmV3IEludGVudHNCaXRGaWVsZCh0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMpO1xuXG4gICAgICAgIGlmICghaWJmLmhhcyhJbnRlbnRzQml0RmllbGQuRmxhZ3MuR3VpbGRWb2ljZVN0YXRlcykpIHtcbiAgICAgICAgICBVdGlsLndhcm4oJ2NsaWVudCBpcyBtaXNzaW5nIFwiR3VpbGRWb2ljZVN0YXRlc1wiIGludGVudCcsICdJbnZhbGlkSW50ZW50c0JpdEZpZWxkJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuXG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH19XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI6IGZhbHNlLFxuICAgICAgYmxvY2tFeHRyYWN0b3JzOiBbXSxcbiAgICAgIGJsb2NrU3RyZWFtRnJvbTogW10sXG4gICAgICBjb25uZWN0aW9uVGltZW91dDogMjAwMDAsXG4gICAgICBsYWdNb25pdG9yOiAzMDAwMCxcbiAgICAgIHF1ZXJ5Q2FjaGU6IG9wdGlvbnMucXVlcnlDYWNoZSA9PT0gbnVsbCA/IG51bGwgOiBvcHRpb25zLnF1ZXJ5Q2FjaGUgfHwgbmV3IFF1ZXJ5Q2FjaGUodGhpcyksXG4gICAgICBza2lwRkZtcGVnOiB0cnVlLFxuICAgICAgcHJvYmVUaW1lb3V0OiA1MDAwLFxuICAgICAgb3ZlcnJpZGVGYWxsYmFja0NvbnRleHQ6IHRydWUsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSBzYXRpc2ZpZXMgUGxheWVySW5pdE9wdGlvbnM7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuaW5jcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmNsaWVudC5vbihFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZSwgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgICB0aGlzLmNsaWVudC5fX2RwX3ZvaWNlU3RhdGVVcGRhdGVfcHJveHkodGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICdGYWlsZWQgdG8gYXR0YWNoIHZvaWNlIHN0YXRlIHVwZGF0ZSBwcm94eSwgdm9pY2Ugc3RhdGUgaGFuZGxlciB3aWxsIG5vdCB3b3JrIHByb3Blcmx5JyxcbiAgICAgICAgICAnQ29tcGF0TW9kZUVycm9yJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPT09ICdudW1iZXInICYmIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID4gMCkge1xuICAgICAgdGhpcy4jbGFnTW9uaXRvckludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI2xhc3RMYXRlbmN5ID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydDtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0xhZyBNb25pdG9yXSBFdmVudCBsb29wIGxhdGVuY3k6ICR7dGhpcy4jbGFzdExhdGVuY3l9bXNgKTtcbiAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcnJpZGVGYWxsYmFja0NvbnRleHQpIHtcbiAgICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW3BsYXllcl0nLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGhvb2tzIGNvbnRleHQgZm9yIHRoaXMgcGxheWVyIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb250ZXh0KCkge1xuICAgIGlmICghdGhpcy4jaG9va3NDdHgpIHtcbiAgICAgIHRoaXMuI2hvb2tzQ3R4ID0gY3JlYXRlQ29udGV4dCgpO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFByb3ZpZGVyID0gdGhpcy4jaG9va3NDdHgucHJvdmlkZS5iaW5kKHRoaXMuI2hvb2tzQ3R4KTtcblxuICAgICAgdGhpcy4jaG9va3NDdHgucHJvdmlkZSA9ICh2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIFNVUEVSX0NPTlRFWFQucHJvdmlkZSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUHJvdmlkZXIodmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWNlaXZlcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hvb2tzQ3R4O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIGRlYnVnKG06IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgZGlzY29yZC1wbGF5ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBxdWVyeSBjYWNoZSBwcm92aWRlciBpbiB1c2VcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnF1ZXJ5Q2FjaGUgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyB0byBgUGxheWVyLm5vZGVzYC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVldWVzKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgKiBzb21lIGV4cGVuc2l2ZSB0YXNrIGlzIGJlaW5nIGV4ZWN1dGVkIG9uIHRoZSBjdXJyZW50IHRocmVhZCB3aGljaCBpcyBzbG93aW5nIGRvd24gdGhlIGV2ZW50IGxvb3AuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBwdWJsaWMgZ2V0IGV2ZW50TG9vcExhZygpIHtcbiAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0cyA9IHBsYXllci5nZW5lcmF0ZVN0YXRpc3RpY3MoKTtcbiAgICpcbiAgICogY29uc29sZS5sb2coc3RhdHMpO1xuICAgKlxuICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAqIC8vIHtcbiAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgKiAvLyAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiBib29sZWFuLFxuICAgKiAvLyAgIHF1ZXVlczogW1xuICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgKiAvLyAgICAgIC4uLlxuICAgKiAvLyAgIF1cbiAgICogLy8gfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZVN0YXRpc3RpY3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlc0NvdW50OiB0aGlzLnF1ZXVlcy5jYWNoZS5zaXplLFxuICAgICAgcXVlcnlDYWNoZUVuYWJsZWQ6IHRoaXMucXVlcnlDYWNoZSAhPSBudWxsLFxuICAgICAgcXVldWVzOiB0aGlzLnF1ZXVlcy5jYWNoZS5tYXAoKG0pID0+IG0uc3RhdHMuZ2VuZXJhdGUoKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsYXllciBpcyBpbiBjb21wYXRpYmlsaXR5IG1vZGUuIENvbXBhdGliaWxpdHkgbW9kZSBpcyBlbmFibGVkIHdoZW4gbm9uLWRpc2NvcmQuanMgY2xpZW50IGlzIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgaXNDb21wYXRNb2RlKCkge1xuICAgIHJldHVybiBpc0NsaWVudFByb3h5KHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IGV2ZXJ5IHNpbmdsZSBxdWV1ZXMgbWFuYWdlZCBieSB0aGlzIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAqIGF3YWl0IHBsYXllci5kZXN0cm95KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcblxuICAgIGlmICghdGhpcy5pc0NvbXBhdE1vZGUoKSkge1xuICAgICAgdGhpcy5jbGllbnQub2ZmKEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuZGVjcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMudW5yZWdpc3RlckFsbCgpO1xuICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICBpZiAodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICAvLyBkaXNwYXRjaCB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuVm9pY2VTdGF0ZVVwZGF0ZSwgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgLy8gaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCByZXR1cm4gYXNzdW1pbmcgdGhlIGxpc3RlbmVyIGltcGxlbWVudGVkIGFsbCBvZiB0aGUgbG9naWMgYmVsb3dcbiAgICBpZiAod2FzSGFuZGxlZCAmJiAhdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlcikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSh0aGlzLCBxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgKiBAcGFyYW0ge1ZvaWNlU3RhdGV9IG9sZFN0YXRlIFRoZSBvbGQgdm9pY2Ugc3RhdGVcbiAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIHBhc3Npbmcgdm9pY2Ugc3RhdGUgdXBkYXRlIGRhdGEgdG8gdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHZvaWNlIHN0YXRlIGhhbmRsZXJcbiAgICpcbiAgICogY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgKiAgIC8vIHRoaXMgaXMgZGVmaW5pdGVseSBhIHJvY2tldCBzY2llbmNlLCByaWdodCBoZXJlXG4gICAqICAgcGxheWVyLmhhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGhhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5faGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2sgdm9pY2Ugc3RhdGUgaGFuZGxlci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIHdpbGwga2VlcCB1c2luZyB0aGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciwgZXZlbiBpZiBjdXN0b20gaW1wbGVtZW50YXRpb24gZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIGxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvY2sgdm9pY2Ugc3RhdGUgaGFuZGxlci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIHdpbGwgc3RvcCB1c2luZyB0aGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBjdXN0b20gaW1wbGVtZW50YXRpb24gZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIHVubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdm9pY2Ugc3RhdGUgaGFuZGxlciBpcyBsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlIGF1ZGlvIHBsYXllclxuICAgKiBAcGFyYW0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGUgbXVzaWMgc2hvdWxkIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gcXVlcnkgVGhlIHRyYWNrIG9yIHNvdXJjZSB0byBwbGF5XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXllclxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgcXVldWUgbWFuYWdlbWVudCwganVzdCB1c2UgdGhpcyBtZXRob2QgXHVEODNEXHVERTA0XG4gICAqIGNvbnN0IHF1ZXJ5ID0gJ3RoaXMgaXMgbXkgc3VwZXIgY29vbCBzZWFyY2ggcXVlcnkgdGhhdCBJIHdhbnQgdG8gcGxheSc7XG4gICAqXG4gICAqIHRyeSB7XG4gICAqICAgIGNvbnN0IHsgdHJhY2sgfSA9IGF3YWl0IHBsYXllci5wbGF5KHZvaWNlQ2hhbm5lbCwgcXVlcnkpO1xuICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0NcdURGODkgSSBhbSBwbGF5aW5nICR7dHJhY2sudGl0bGV9IFx1RDgzQ1x1REY4OWApO1xuICAgKiB9IGNhdGNoKGUpIHtcbiAgICogICBjb25zb2xlLmxvZyhgXHVEODNEXHVERTJEIEZhaWxlZCB0byBwbGF5IGVycm9yIG9oIG5vOlxcblxcbiR7ZX1gKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBxdWVyeTogVHJhY2tMaWtlLFxuICBvcHRpb25zOiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+ID0ge30pXG4gIDogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICBjb25zdCB2YyA9IHRoaXMuY2xpZW50LmNoYW5uZWxzLnJlc29sdmUoY2hhbm5lbCk7XG4gICAgaWYgKCF2Yz8uaXNWb2ljZUJhc2VkKCkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ2NoYW5uZWwnLCAnVm9pY2VCYXNlZENoYW5uZWwnLCAhdmMgPyAndW5kZWZpbmVkJyA6IGBjaGFubmVsIHR5cGUgJHt2Yy50eXBlfWApO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPSBxdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCA/IHF1ZXJ5IDogYXdhaXQgdGhpcy5zZWFyY2gocXVlcnksIG9wdGlvbnMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCBvcHRpb25zLmFmdGVyU2VhcmNoPy4ob3JpZ2luYWxSZXN1bHQpKSB8fCBvcmlnaW5hbFJlc3VsdDtcbiAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoYE5vIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtxdWVyeX1cIiAoRXh0cmFjdG9yOiAke3Jlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWApO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5jcmVhdGUodmMuZ3VpbGQsIG9wdGlvbnMubm9kZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICBjb25zdCBlbnRyeSA9IHF1ZXVlLnRhc2tzUXVldWUuYWNxdWlyZSh7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBXYWl0aW5nIGZvciB0aGUgcXVldWUgdG8gcmVzb2x2ZS4uLmApO1xuICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyByZXNvbHZlZCFgKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQudHJhY2tzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC5wbGF5bGlzdCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1ZXVlLmlzUGxheWluZygpKSBhd2FpdCBxdWV1ZS5ub2RlLnBsYXkobnVsbCwgb3B0aW9ucy5hdWRpb1BsYXllck9wdGlvbnMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFJlbGVhc2luZyBhbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4uLmApO1xuICAgICAgcXVldWUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrOiByZXN1bHQudHJhY2tzWzBdLFxuICAgICAgZXh0cmFjdG9yOiByZXN1bHQuZXh0cmFjdG9yLFxuICAgICAgc2VhcmNoUmVzdWx0OiByZXN1bHQsXG4gICAgICBxdWV1ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHRyYWNrc1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0fSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8U2VhcmNoUmVzdWx0Pn1cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYXllci5zZWFyY2goc2VhcmNoUXVlcnkpO1xuICAgKlxuICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2goc2VhcmNoUXVlcnk6IFRyYWNrTGlrZSwgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHJldHVybiBzZWFyY2hRdWVyeTtcblxuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIEF1ZGlvUmVzb3VyY2UpIHtcbiAgICAgIHNlYXJjaFF1ZXJ5ID0gdGhpcy5jcmVhdGVUcmFja0Zyb21BdWRpb1Jlc291cmNlKHNlYXJjaFF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5yZXF1ZXN0ZWRCeSAhPSBudWxsKSBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG5cbiAgICBvcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/Pz0gdGhpcy5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycztcbiAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgdHJhY2tzOiBbc2VhcmNoUXVlcnldLFxuICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICBxdWVyeVR5cGU6IHNlYXJjaFF1ZXJ5LnF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHBsYXlsaXN0OiBzZWFyY2hRdWVyeSxcbiAgICAgICAgdHJhY2tzOiBzZWFyY2hRdWVyeS50cmFja3MsXG4gICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgZXh0cmFjdG9yOiBzZWFyY2hRdWVyeS50cmFja3NbMF0/LmV4dHJhY3RvcixcbiAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgdHJhY2tzID0gc2VhcmNoUXVlcnkuZmlsdGVyKCh0KSA9PiB0IGluc3RhbmNlb2YgVHJhY2spO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgdHJhY2tzLFxuICAgICAgICBxdWVyeTogJ0BAIyV7e1VzZXJMb2FkZWRDb250ZW50fX0lI0BAJyxcbiAgICAgICAgZXh0cmFjdG9yOiBudWxsLFxuICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaGluZyAke3NlYXJjaFF1ZXJ5fWApO1xuXG4gICAgbGV0IGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsLFxuICAgICAgcHJvdG9jb2w6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSDtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgU2VhcmNoIGVuZ2luZSBzZXQgdG8gJHtvcHRpb25zLnNlYXJjaEVuZ2luZX0sIGZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZX1gXG4gICAgKTtcblxuICAgIGlmICgvXlxcdys6Ly50ZXN0KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgW3Byb3RvY29sTmFtZSwgLi4ucXVlcnldID0gc2VhcmNoUXVlcnkuc3BsaXQoJzonKTtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBQcm90b2NvbCAke3Byb3RvY29sTmFtZX0gZGV0ZWN0ZWQgaW4gcXVlcnlgKTtcblxuICAgICAgY29uc3QgbWF0Y2hpbmdFeHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuc3RvcmUuZmluZChcbiAgICAgICAgKGUpID0+ICF0aGlzLmV4dHJhY3RvcnMuaXNEaXNhYmxlZChlLmlkZW50aWZpZXIpICYmIGUucHJvdG9jb2xzLmluY2x1ZGVzKHByb3RvY29sTmFtZSlcbiAgICAgICk7XG5cbiAgICAgIGlmIChtYXRjaGluZ0V4dHJhY3Rvcikge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5kZWJ1ZyhgUHJvdG9jb2wgJHtwcm90b2NvbE5hbWV9IGlzIHN1cHBvcnRlZCBieSAke21hdGNoaW5nRXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciFgKTtcbiAgICAgICAgZXh0cmFjdG9yID0gbWF0Y2hpbmdFeHRyYWN0b3I7XG4gICAgICAgIHNlYXJjaFF1ZXJ5ID0gcXVlcnkuam9pbignOicpO1xuICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBhbiBleHRyYWN0b3IgdGhhdCBzdXBwb3J0cyAke3Byb3RvY29sTmFtZX0gcHJvdG9jb2wuIEZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yLi4uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlZGlyZWN0ZWQgPSBhd2FpdCBRdWVyeVJlc29sdmVyLnByZVJlc29sdmUoc2VhcmNoUXVlcnkpO1xuICAgIGNvbnN0IHsgdHlwZTogcXVlcnlUeXBlLCBxdWVyeSB9ID1cbiAgICBvcHRpb25zLnNlYXJjaEVuZ2luZSA9PT0gUXVlcnlUeXBlLkFVVE8gP1xuICAgIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShyZWRpcmVjdGVkLCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6XG4gICAgeyB0eXBlOiBvcHRpb25zLnNlYXJjaEVuZ2luZSwgcXVlcnk6IHJlZGlyZWN0ZWQgfSBhcyBSZXNvbHZlZFF1ZXJ5O1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBRdWVyeSB0eXBlIGlkZW50aWZpZWQgYXMgJHtxdWVyeVR5cGV9JHtcbiAgICAgIGV4dHJhY3RvciAmJiBwcm90b2NvbCA/ICcgYnV0IG1pZ2h0IG5vdCBiZSB1c2VkIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgcHJvdG9jb2wnIDogJyd9YFxuXG4gICAgKTtcblxuICAgIC8vIGZvcmNlIHBhcnRpY3VsYXIgZXh0cmFjdG9yXG4gICAgaWYgKG9wdGlvbnMuc2VhcmNoRW5naW5lLnN0YXJ0c1dpdGgoJ2V4dDonKSkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEZvcmNpbmcgJHtvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCl9IGV4dHJhY3Rvci4uLmApO1xuICAgICAgZXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLmdldChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCkpITtcbiAgICAgIGlmICghZXh0cmFjdG9yKVxuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBxdWVyeSBhbGwgZXh0cmFjdG9yc1xuICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAvLyBjYWNoZSB2YWxpZGF0aW9uXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENoZWNraW5nIGNhY2hlLi4uYCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgcXVlcnksXG4gICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjYWNoZSBoaXRcbiAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgaGl0IGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgIGV4dHJhY3RvciA9XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGV4dC52YWxpZGF0ZShxdWVyeSwgcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSk7XG4gICAgICB9KSk/LlxuICAgICAgZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gbm8gZXh0cmFjdG9ycyBhdmFpbGFibGVcbiAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0ZhaWxlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGV4dHJhY3RvcicpO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBleHRyYWN0b3IuXG4gICAgaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgcHJvdG9jb2xcbiAgICB9KS5cbiAgICBjYXRjaCgoKSA9PiBudWxsKTtcblxuICAgIGlmIChyZXMpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCEnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBwbGF5bGlzdDogcmVzLnBsYXlsaXN0LFxuICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShyZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdGYWlsZWQgdG8gZmluZCByZXN1bHQgdXNpbmcgYXBwcm9wcmlhdGUgZXh0cmFjdG9yLiBRdWVyeWluZyBhbGwgZXh0cmFjdG9ycy4uLicpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXh0cmFjdG9ycy5ydW4oXG4gICAgICBhc3luYyAoZXh0KSA9PlxuICAgICAgIW9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikgJiYgKFxuICAgICAgYXdhaXQgZXh0LnZhbGlkYXRlKHF1ZXJ5KSkgJiZcbiAgICAgIGV4dC5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgICAgcmVxdWVzdE9wdGlvbnM6IG9wdGlvbnMucmVxdWVzdE9wdGlvbnMsXG4gICAgICAgIHByb3RvY29sXG4gICAgICB9KVxuICAgICk7XG4gICAgaWYgKCFyZXN1bHQ/LnJlc3VsdCkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtyZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYCk7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICBleHRyYWN0b3I6IHJlc3VsdD8uZXh0cmFjdG9yXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwgdXNpbmcgJHtyZXN1bHQuZXh0cmFjdG9yLmlkZW50aWZpZXJ9IWApO1xuXG4gICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgcXVlcnksXG4gICAgICBxdWVyeVR5cGUsXG4gICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgIH0pO1xuXG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQWRkaW5nIGRhdGEgdG8gY2FjaGUuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgZGlzY29yZC12b2lwYCBtb2R1bGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnNvbGUubG9nKHBsYXllci5zY2FuRGVwcygpKTtcbiAgICogLy8gLT4gbG9ncyBkZXBlbmRlbmNpZXMgcmVwb3J0XG4gICAqIGBgYFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgcHVibGljIHNjYW5EZXBzKCkge1xuICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcbiAgICBjb25zdCBydW50aW1lID0gJ0J1bicgaW4gZ2xvYmFsVGhpcyA/ICdCdW4nIDogJ0Rlbm8nIGluIGdsb2JhbFRoaXMgPyAnRGVubycgOiAnTm9kZSc7XG4gICAgY29uc3QgZGVwc1JlcG9ydCA9IFtcbiAgICAnRGlzY29yZCBQbGF5ZXInLFxuICAgIGxpbmUsXG4gICAgYC0gZGlzY29yZC1wbGF5ZXI6ICR7UGxheWVyLnZlcnNpb259JHtcbiAgICB0aGlzLmlzQ29tcGF0TW9kZSgpID8gYCAoJHtnZXRDb21wYXROYW1lKHRoaXMuY2xpZW50KX0gY29tcGF0aWJpbGl0eSBtb2RlKWAgOiAnJ31gLFxuXG4gICAgYC0gZGlzY29yZC12b2lwOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICBgLSBkaXNjb3JkLmpzOiAke2Rqc1ZlcnNpb259YCxcbiAgICBgLSBOb2RlIHZlcnNpb246ICR7cHJvY2Vzcy52ZXJzaW9ufSAoRGV0ZWN0ZWQgUnVudGltZTogJHtydW50aW1lfSwgUGxhdGZvcm06ICR7cHJvY2Vzcy5wbGF0Zm9ybX0gWyR7cHJvY2Vzcy5hcmNofV0pYCxcbiAgICAoKCkgPT4ge1xuICAgICAgY29uc3QgaW5mbyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuICAgICAgaWYgKCFpbmZvKSByZXR1cm4gJ0ZGbXBlZy9BdmNvbnYgbm90IGZvdW5kJztcblxuICAgICAgcmV0dXJuIFtcbiAgICAgIGAtIGZmbXBlZzogJHtpbmZvLnZlcnNpb259YCxcbiAgICAgIGAtIGNvbW1hbmQ6ICR7aW5mby5jb21tYW5kfWAsXG4gICAgICBgLSBzdGF0aWM6ICR7aW5mby5tb2R1bGV9YCxcbiAgICAgIGAtIGxpYm9wdXM6ICR7aW5mby5yZXN1bHQhLmluY2x1ZGVzKCctLWVuYWJsZS1saWJvcHVzJyl9YF0uXG4gICAgICBqb2luKCdcXG4nKTtcbiAgICB9KSgpLFxuICAgICdcXG4nLFxuICAgICdMb2FkZWQgRXh0cmFjdG9yczonLFxuICAgIGxpbmUsXG4gICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlLlxuICAgIG1hcCgobSkgPT4ge1xuICAgICAgcmV0dXJuIG0uaWRlbnRpZmllcjtcbiAgICB9KS5cbiAgICBqb2luKCdcXG4nKSB8fCAnTi9BJyxcbiAgICAnXFxuXFxuZGlzY29yZC12b2lwJyxcbiAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlU3RyaW5nKCldO1xuXG5cbiAgICByZXR1cm4gZGVwc1JlcG9ydC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgeWllbGQqIHRoaXMubm9kZXMuY2FjaGUudmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBgUGxheWxpc3RgIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVBsYXlsaXN0KGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0cmFjayBmcm9tIGFuIGF1ZGlvIHJlc291cmNlLlxuICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlVHJhY2tGcm9tQXVkaW9SZXNvdXJjZShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gcmVzb3VyY2UubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgcmVmID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgbWF5YmVUaXRsZSA9ICd0aXRsZScgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aXRsZX1gIDogYFRyYWNrICR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVBdXRob3IgPSAnYXV0aG9yJyBpbiBtZXRhZGF0YSA/IGAke21ldGFkYXRhLmF1dGhvcn1gIDogJ1Vua25vd24gYXV0aG9yJztcbiAgICBjb25zdCBtYXliZUR1cmF0aW9uID0gJ2R1cmF0aW9uJyBpbiBtZXRhZGF0YSA/IGAke21ldGFkYXRhLmR1cmF0aW9ufWAgOiAnMDA6MDAnO1xuICAgIGNvbnN0IG1heWJlVGh1bWJuYWlsID0gJ3RodW1ibmFpbCcgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aHVtYm5haWx9YCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXliZVVSTCA9ICd1cmwnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudXJsfWAgOiBgZGlzY29yZC1wbGF5ZXI6Ly9ibG9iLyR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVEZXNjcmlwdGlvbiA9ICdkZXNjcmlwdGlvbicgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS5kZXNjcmlwdGlvbn1gIDogJ05vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZS4nO1xuICAgIGNvbnN0IG1heWJlVmlld3MgPSAndmlld3MnIGluIG1ldGFkYXRhID8gTnVtYmVyKG1ldGFkYXRhLnZpZXdzKSB8fCAwIDogMDtcblxuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIHtcbiAgICAgIHRpdGxlOiBtYXliZVRpdGxlLFxuICAgICAgYXV0aG9yOiBtYXliZUF1dGhvcixcbiAgICAgIGR1cmF0aW9uOiBtYXliZUR1cmF0aW9uLFxuICAgICAgdGh1bWJuYWlsOiBtYXliZVRodW1ibmFpbCxcbiAgICAgIHVybDogbWF5YmVVUkwsXG4gICAgICBkZXNjcmlwdGlvbjogbWF5YmVEZXNjcmlwdGlvbixcbiAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkRJU0NPUkRfUExBWUVSX0JMT0IsXG4gICAgICBzb3VyY2U6ICdhcmJpdHJhcnknLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBsaXZlOiBmYWxzZSxcbiAgICAgIHZpZXdzOiBtYXliZVZpZXdzXG4gICAgfSk7XG5cbiAgICByZXNvdXJjZS5tZXRhZGF0YSA9IHRyYWNrO1xuXG4gICAgdHJhY2suc2V0UmVzb3VyY2UocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuXG4gICAgcmV0dXJuIHRyYWNrO1xuICB9XG59IiwgImltcG9ydCB7IENoYW5uZWxUeXBlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL3F1ZXVlJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuXG5mdW5jdGlvbiBoYW5kbGVFbXB0eUNoYW5uZWwocGxheWVyOiBQbGF5ZXIsIHF1ZXVlOiBHdWlsZFF1ZXVlLCBndWlsZElkOiBzdHJpbmcpIHtcbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpIHx8ICFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSkgcmV0dXJuO1xuICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5FbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICBxdWV1ZS50aW1lb3V0cy5zZXQoYGVtcHR5XyR7Z3VpbGRJZH1gLCB0aW1lb3V0KTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlQ2hhbm5lbFBvcHVsYXRlKHBsYXllcjogUGxheWVyLCBxdWV1ZTogR3VpbGRRdWV1ZSwgZ3VpbGRJZDogc3RyaW5nKSB7XG4gIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtndWlsZElkfWApO1xuICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7Z3VpbGRJZH1gKTtcbiAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVBhdXNlT25FbXB0eShxdWV1ZTogR3VpbGRRdWV1ZSkge1xuICBjb25zdCBpc0VtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpO1xuICBjb25zdCB3YXNQYXVzZWRPbkVtcHR5ID0gUmVmbGVjdC5nZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknKTtcblxuICBpZiAoaXNFbXB0eSAmJiAhd2FzUGF1c2VkT25FbXB0eSkge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKHRydWUpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgdHJ1ZSk7XG4gICAgaWYgKHF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICBxdWV1ZS5kZWJ1ZygnVm9pY2UgY2hhbm5lbCBpcyBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcGF1c2luZy4uLicpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghaXNFbXB0eSAmJiB3YXNQYXVzZWRPbkVtcHR5KSB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQoZmFsc2UpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgZmFsc2UpO1xuICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgcXVldWUuZGVidWcoJ1ZvaWNlIGNoYW5uZWwgaXMgbm90IGVtcHR5IGFuZCBvcHRpb25zI3BhdXNlT25FbXB0eSBpcyB0cnVlLCByZXN1bWluZy4uLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVCb3RWb2ljZVN0YXRlVXBkYXRlKHF1ZXVlOiBHdWlsZFF1ZXVlLCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgaWYgKG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKSB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc2VydmVyTXV0ZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICBuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiZcbiAgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJlxuICBvbGRTdGF0ZS5zdXBwcmVzcyAhPT0gbmV3U3RhdGUuc3VwcHJlc3MpXG4gIHtcbiAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zdXBwcmVzcyk7XG4gICAgaWYgKG5ld1N0YXRlLnN1cHByZXNzKSB7XG4gICAgICBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh0cnVlKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFN0YXRlOiBWb2ljZVN0YXRlLFxubmV3U3RhdGU6IFZvaWNlU3RhdGUpXG57XG4gIGlmICghcXVldWU/LmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICBjb25zdCBpc0JvdFN0YXRlID0gbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQ7XG4gIGNvbnN0IGd1aWxkSWQgPSBvbGRTdGF0ZS5ndWlsZC5pZDtcblxuICAvLyBCb3QgZGlzY29ubmVjdGVkXG4gIGlmIChpc0JvdFN0YXRlICYmIG9sZFN0YXRlLmNoYW5uZWxJZCAmJiAhbmV3U3RhdGUuY2hhbm5lbElkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvKiBub29wICovfVxuICAgIHJldHVybiB2b2lkIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdCwgcXVldWUpO1xuICB9XG5cbiAgaWYgKHF1ZXVlLm9wdGlvbnMucGF1c2VPbkVtcHR5KSB7XG4gICAgaGFuZGxlUGF1c2VPbkVtcHR5KHF1ZXVlKTtcbiAgfVxuXG4gIC8vIEJvdCBqb2luZWQgY2hhbm5lbCBvciBjaGFuZ2VkIHN0YXRlXG4gIGlmIChpc0JvdFN0YXRlICYmIG5ld1N0YXRlLmNoYW5uZWxJZCAmJiAoIW9sZFN0YXRlLmNoYW5uZWxJZCB8fCBvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkpIHtcbiAgICBpZiAocXVldWUuY29ubmVjdGlvbikgcXVldWUuY2hhbm5lbCA9IG5ld1N0YXRlLmNoYW5uZWwhO1xuICAgIGhhbmRsZUJvdFZvaWNlU3RhdGVVcGRhdGUocXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvLyBIYW5kbGUgY2hhbm5lbCBlbXB0eS9wb3B1bGF0ZSBldmVudHNcbiAgaWYgKCFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgfSBlbHNlIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICBoYW5kbGVDaGFubmVsUG9wdWxhdGUocGxheWVyLCBxdWV1ZSwgZ3VpbGRJZCk7XG4gIH0gZWxzZSBpZiAob2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICBpZiAobmV3U3RhdGUuY2hhbm5lbElkICE9PSBxdWV1ZS5jaGFubmVsLmlkICYmICFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgIGlmICghcXVldWUudGltZW91dHMuaGFzKGBlbXB0eV8ke2d1aWxkSWR9YCkpIHtcbiAgICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgICB9XG4gIH1cbn0iLCAiaW1wb3J0IHsgcmVzb2x2ZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBGRm1wZWcsIEZGbXBlZ0xpYiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VKU09OIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1heWJlTnVsbDxUPiA9IFQgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGVuZGVuY2llc1JlcG9ydCB7XG4gIGNvcmU6IHtcbiAgICAnZGlzY29yZC1wbGF5ZXInOiBzdHJpbmc7XG4gICAgJ2Rpc2NvcmQtdm9pcCc6IHN0cmluZztcbiAgfTtcbiAgbGlib3B1czoge1xuICAgIG1lZGlhcGxleDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BkaXNjb3JkanMvb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAZXZhbi9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgb3B1c3NjcmlwdDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ25vZGUtb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICB9O1xuICBsaWJzb2RpdW06IHtcbiAgICAnc29kaXVtLW5hdGl2ZSc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgIHNvZGl1bTogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdzb2RpdW0tamF2YXNjcmlwdCc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0Bub2JlbC9jaXBoZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gIH07XG4gIGZmbXBlZzogRkZtcGVnUmVwb3J0O1xufVxuXG5leHBvcnQgdHlwZSBGRm1wZWdSZXBvcnQgPSBSZWNvcmQ8XG4gIEZGbXBlZ0xpYixcbiAgTWF5YmVOdWxsPHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgaGFzTGlib3B1czogYm9vbGVhbjtcbiAgfT4+O1xuXG5cbi8qKlxuICogQSB1dGlsaXR5IHRvIGdlbmVyYXRlIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICovXG5leHBvcnQgY29uc3QgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvciA9IHtcbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBvZiBhIHBhY2thZ2UuXG4gICAqIEBwYXJhbSBkaXIgLSBUaGUgZGlyZWN0b3J5IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG4gICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGZpbmRcbiAgICogQHBhcmFtIGRlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoXG4gICAqIEByZXR1cm5zIFRoZSBwYWNrYWdlLmpzb24gZmlsZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIGZpbmRQYWNrYWdlSlNPTihkaXI6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZywgZGVwdGg6IG51bWJlcik6IFBhY2thZ2VKU09OIHwgbnVsbCB7XG4gICAgaWYgKGRlcHRoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHRhcmdldCA9IHJlc29sdmUoZGlyLCAncGFja2FnZS5qc29uJyk7XG5cbiAgICBjb25zdCBuZXh0ID0gKCkgPT4gRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5maW5kUGFja2FnZUpTT04ocmVzb2x2ZShkaXIsICcuLicpLCBwYWNrYWdlTmFtZSwgZGVwdGggLSAxKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgICAgY29uc3QgcGtnSlNPTjogUGFja2FnZUpTT04gPSByZXF1aXJlKHRhcmdldCk7XG5cbiAgICAgIGlmIChwa2dKU09OLm5hbWUgIT09IHBhY2thZ2VOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwa2dKU09OO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBUcmllcyB0byBmaW5kIHRoZSB2ZXJzaW9uIG9mIGEgZGVwZW5kZW5jeS5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgcGFja2FnZSB0byBmaW5kIHRoZSB2ZXJzaW9uIG9mXG4gICAqIEBwYXJhbSBtYXhMb29rdXBEZXB0aCAtIFRoZSBtYXhpbXVtIGRlcHRoIHRvIHNlYXJjaCBmb3IgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAqIEByZXR1cm5zIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgdmVyc2lvbihuYW1lOiBzdHJpbmcsIG1heExvb2t1cERlcHRoID0gMyk6IHN0cmluZyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBpZiAobmFtZSA9PT0gJ2Rpc2NvcmQtcGxheWVyJykge1xuICAgICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGtnID0gRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5maW5kUGFja2FnZUpTT04oZGlybmFtZShyZXF1aXJlLnJlc29sdmUobmFtZSkpLCBuYW1lLCBtYXhMb29rdXBEZXB0aCk7XG4gICAgICByZXR1cm4gcGtnPy52ZXJzaW9uID8/IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBkaXNjb3JkLXBsYXllciBtb2R1bGUuXG4gICAqIEByZXR1cm5zIFRoZSByZXBvcnQgb2JqZWN0XG4gICAqL1xuICBnZW5lcmF0ZSgpOiBEZXBlbmRlbmNpZXNSZXBvcnQge1xuICAgIGNvbnN0IGZmbXBlZ1JlcG9ydCA9IHt9IGFzIEZGbXBlZ1JlcG9ydDtcblxuICAgIGZvciAoY29uc3QgbGliIG9mIEZGbXBlZy5zb3VyY2VzKSB7XG4gICAgICBmZm1wZWdSZXBvcnRbbGliLm5hbWVdID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmZm1wZWcgPSBGRm1wZWcucmVzb2x2ZVNhZmUoKTtcblxuICAgIGlmIChmZm1wZWcpIHtcbiAgICAgIGZmbXBlZ1JlcG9ydFtmZm1wZWcubmFtZV0gPSB7XG4gICAgICAgIGhhc0xpYm9wdXM6IGZmbXBlZy5jb21tYW5kLmluY2x1ZGVzKCctLWVuYWJsZS1saWJvcHVzJyksXG4gICAgICAgIHZlcnNpb246IGZmbXBlZy52ZXJzaW9uXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb3JlOiB7XG4gICAgICAgICdkaXNjb3JkLXBsYXllcic6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignZGlzY29yZC1wbGF5ZXInKSBhcyBzdHJpbmcsXG4gICAgICAgICdkaXNjb3JkLXZvaXAnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ2Rpc2NvcmQtdm9pcCcpIGFzIHN0cmluZ1xuICAgICAgfSxcbiAgICAgIGxpYm9wdXM6IHtcbiAgICAgICAgbWVkaWFwbGV4OiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ21lZGlhcGxleCcpLFxuICAgICAgICAnQGRpc2NvcmRqcy9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZGlzY29yZGpzL29wdXMnKSxcbiAgICAgICAgJ0BldmFuL29wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0BldmFuL29wdXMnKSxcbiAgICAgICAgb3B1c3NjcmlwdDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdvcHVzc2NyaXB0JyksXG4gICAgICAgICdub2RlLW9wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ25vZGUtb3B1cycpXG4gICAgICB9LFxuICAgICAgbGlic29kaXVtOiB7XG4gICAgICAgICdzb2RpdW0tbmF0aXZlJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tbmF0aXZlJyksXG4gICAgICAgIHNvZGl1bTogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0nKSxcbiAgICAgICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignbGlic29kaXVtLXdyYXBwZXJzJyksXG4gICAgICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JyksXG4gICAgICAgICdzb2RpdW0tamF2YXNjcmlwdCc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtLWphdmFzY3JpcHQnKSxcbiAgICAgICAgJ0Bub2JlbC9jaXBoZXJzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAbm9iZWwvY2lwaGVycycpXG4gICAgICB9LFxuICAgICAgZmZtcGVnOiBmZm1wZWdSZXBvcnRcbiAgICB9O1xuICB9LFxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXBlbmRlbmNpZXMgcmVwb3J0LlxuICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAqL1xuICBnZW5lcmF0ZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlcG9ydCA9IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZ2VuZXJhdGUoKTtcbiAgICBjb25zdCBsaW5lID0gJy0nLnJlcGVhdCg1MCk7XG5cbiAgICBjb25zdCBvdXRwdXQ6IHN0cmluZ1tdID0gW107XG5cbiAgICBvdXRwdXQucHVzaCgnRGVwZW5kZW5jaWVzIFJlcG9ydCcpO1xuICAgIG91dHB1dC5wdXNoKGxpbmUpO1xuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlcG9ydCkgYXMgKGtleW9mIERlcGVuZGVuY2llc1JlcG9ydClbXTtcblxuICAgIGZvciAoY29uc3QgX2tleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBrZXkgPSBfa2V5IGFzIGtleW9mIERlcGVuZGVuY2llc1JlcG9ydDtcblxuICAgICAgb3V0cHV0LnB1c2goa2V5KTtcblxuICAgICAgY29uc3Qgc3ViS2V5cyA9IE9iamVjdC5rZXlzKHJlcG9ydFtrZXldKTtcblxuICAgICAgZm9yIChjb25zdCBfc3ViS2V5IG9mIHN1YktleXMpIHtcbiAgICAgICAgY29uc3Qgc3ViS2V5ID0gX3N1YktleSBhcyBrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnRbdHlwZW9mIGtleV07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVwb3J0W2tleV1bc3ViS2V5XSA/PyAnTi9BJztcblxuICAgICAgICBvdXRwdXQucHVzaChgLSAke3N1YktleX06ICR7dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKSA6IHZhbHVlfWApO1xuICAgICAgfVxuXG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgb3V0cHV0LnB1c2gobGluZSk7XG5cbiAgICByZXR1cm4gb3V0cHV0LmpvaW4oJ1xcbicpO1xuICB9XG59OyIsICJcblxuXG5cblxuXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9IC8qIEBfX01BQ1JPX18gZ2V0VmVyc2lvbiAqL1wiNy4wLjBcIjsiXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0dBLGlCQUFtRDs7O0FDRm5ELHNCQUEyQjs7O0FDRDNCLHFCQUEwRjs7O0FDQW5GLElBQU0sc0JBQU4sTUFBTSw0QkFBMkIsTUFBTTtBQUFBLEVBSXJDLFlBQVksTUFBa0IsU0FBaUI7QUFDcEQsVUFBTSxPQUFPO0FBSmYsd0JBQWdCO0FBQ2hCLHdCQUFnQixhQUFvQixLQUFLLElBQUk7QUFJM0MsU0FBSyxPQUFPLEtBQUssWUFBWTtBQUM3QixTQUFLLE9BQU87QUFFWixRQUFJLE1BQU0sbUJBQW1CO0FBQzNCLFlBQU0sa0JBQWtCLE1BQU0sS0FBSyxXQUFXO0FBQUEsSUFDaEQ7QUFBQSxFQUNGO0FBQUEsRUFFTyxTQUFTO0FBQ2QsV0FBTztBQUFBLE1BQ0wsTUFBTSxLQUFLLFlBQVk7QUFBQSxNQUN2QixN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TSx1QkFBTjs7O0FSMEVBLElBQU0sa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJN0IsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJaEIsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVoscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVgsb0JBQW9CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJcEIsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsYUFBYTtBQUFB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QUFTLEtBQUs7QUFDM0UsVUFBTSxXQUFXLFNBQVMsV0FBVyxHQUFHLFNBQVMsR0FBRyxLQUFLLHlCQUF5QixHQUFHO0FBQ3JGLFVBQU0sbUJBQW1CLGlCQUFpQixXQUFXLEdBQUcsU0FBUyxXQUFXLEtBQUs7QUFDakYsVUFBTSxhQUFhLFdBQVcsV0FBVyxPQUFPLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFFdkUsVUFBTSxRQUFRLElBQUksTUFBTSxNQUFNO0FBQUEsTUFDNUIsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsS0FBSztBQUFBLE1BQ0wsYUFBYTtBQUFBLE1BQ2IsV0FBVyxVQUFVO0FBQUEsTUFDckIsUUFBUTtBQUFBLE1BQ1I7QUFBQSxNQUNBLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxJQUNULENBQUM7QUFFRCxhQUFTLFdBQVc7QUFFcEIsVUFBTSxZQUFZLFFBQWdDO0FBRWxELFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUExckJFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU40RDtBQUFBO0FBQUE7QUFBQTtBQVU1RCxjQVZXLFNBVVksV0FBa0I7QUFWcEMsSUFBTSxTQUFOOzs7QXpDeEdQLElBQUFLLG9CQVdBO0FBQ0EsSUFBQUMsdUJBU0E7IiwKICAibmFtZXMiOiBbIkd1aWxkUXVldWUiLCAiU2VyaWFsaXplZFR5cGUiLCAicXVlcnkiLCAidmVyc2lvbiIsICJtb2R1bGUiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJyZXN1bHQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfcHJvbWlzZXMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAicmVzb2x2ZSIsICJyZXNvbHZlIiwgIndhaXRGb3IiLCAiaW1wb3J0X2VxdWFsaXplciIsICJUcmFja1NraXBSZWFzb24iLCAicmVzb2x2ZSIsICJHdWlsZFF1ZXVlIiwgIkd1aWxkUXVldWUiLCAiaW1wb3J0X3Byb21pc2VzIiwgInZlcnNpb24iLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2ZmbXBlZyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9mZm1wZWciLCAiZGpzVmVyc2lvbiIsICJxdWVyeSIsICJyZXMiLCAicmVzdWx0IiwgImRWb2ljZVZlcnNpb24iLCAiaW1wb3J0X2VxdWFsaXplciIsICJpbXBvcnRfZGlzY29yZF92b2lwIl0KfQo=
7018
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXIudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvci50cyIsICIuLi9zcmMvZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LnRzIiwgIi4uL3NyYy9ob29rcy9jb250ZXh0L2FzeW5jLWNvbnRleHQudHMiLCAiLi4vc3JjL3V0aWxzL19faW50ZXJuYWxfXy9fY29udGFpbmVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vZ2V0R2xvYmFsUmVnaXN0cnkudHMiLCAiLi4vc3JjL2hvb2tzL2NvbW1vbi50cyIsICIuLi9zcmMvaG9va3MvdXNlSGlzdG9yeS50cyIsICIuLi9zcmMvaG9va3MvdXNlUGxheWVyLnRzIiwgIi4uL3NyYy9ob29rcy91c2VRdWV1ZS50cyIsICIuLi9zcmMvaG9va3MvdXNlTWFpblBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlTWV0YWRhdGEudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVRpbWVsaW5lLnRzIiwgIi4uL3NyYy9ob29rcy9zdHJlYW0vb25BZnRlckNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQmVmb3JlQ3JlYXRlU3RyZWFtLnRzIiwgIi4uL3NyYy9ob29rcy91c2VWb2x1bWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkTm9kZU1hbmFnZXIudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWUudHMiLCAiLi4vc3JjL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0udHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVIaXN0b3J5LnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlUGxheWVyTm9kZS50cyIsICIuLi9zcmMvdXRpbHMvQXN5bmNRdWV1ZS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycy50cyIsICIuLi9zcmMvdXRpbHMvRkZtcGVnU3RyZWFtLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlU3RhdGlzdGljcy50cyIsICIuLi9zcmMvcXVldWUvU3luY2VkTHlyaWNzUHJvdmlkZXIudHMiLCAiLi4vc3JjL3V0aWxzL1NlcXVlbnRpYWxCdWNrZXQudHMiLCAiLi4vc3JjL2xyY2xpYi9McmNMaWIudHMiLCAiLi4vc3JjL3N0cmVhbS9Wb2ljZVV0aWxzLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeUNhY2hlLnRzIiwgIi4uL3NyYy9QbGF5ZXIudHMiLCAiLi4vc3JjL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlci50cyIsICIuLi9zcmMvdXRpbHMvRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci50cyIsICIuLi9zcmMvdmVyc2lvbi50cyIsICIuLi9zcmMvUGxheWVyU3RyZWFtSW50ZXJjZXB0b3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IGNyZWF0ZUVyaXNDb21wYXQsIGlzRXJpc1Byb3h5IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWJyaWMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWV1ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xyY2xpYi9McmNMaWInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL1ZvaWNlVXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UeXBlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0FzeW5jUXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyJztcbmV4cG9ydCAqIGZyb20gJy4vaG9va3MnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zZXJkZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi9QbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcic7XG5leHBvcnQge1xuICBBdWRpb0ZpbHRlcnMgYXMgUENNQXVkaW9GaWx0ZXJzLFxuICB0eXBlIEJpcXVhZEZpbHRlcnMsXG4gIEZpbHRlclR5cGUgYXMgQmlxdWFkRmlsdGVyVHlwZSxcbiAgdHlwZSBQQ01GaWx0ZXJzLFxuICBRX0JVVFRFUldPUlRILFxuICBWb2x1bWVUcmFuc2Zvcm1lcixcbiAgQkFTU19FUV9CQU5EUyxcbiAgQUZfTklHSFRDT1JFX1JBVEUsXG4gIEFGX1ZBUE9SV0FWRV9SQVRFLFxuICBGaWx0ZXJzQ2hhaW4gfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5leHBvcnQge1xuICBjcmVhdGVBdWRpb1BsYXllcixcbiAgQXVkaW9QbGF5ZXIsXG4gIGdldFZvaWNlQ29ubmVjdGlvbixcbiAgZ2V0Vm9pY2VDb25uZWN0aW9ucyxcbiAgam9pblZvaWNlQ2hhbm5lbCxcbiAgU3RyZWFtVHlwZSxcbiAgY3JlYXRlQXVkaW9SZXNvdXJjZSxcbiAgdHlwZSBKb2luQ29uZmlnLFxuICB0eXBlIEpvaW5Wb2ljZUNoYW5uZWxPcHRpb25zLFxuICB0eXBlIENyZWF0ZUF1ZGlvUGxheWVyT3B0aW9ucyB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuXG5leHBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJzsiLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLy8gQHRzLW5vY2hlY2tcblxuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIEdhdGV3YXlEaXNwYXRjaEV2ZW50cyB9IGZyb20gJ2Rpc2NvcmQtYXBpLXR5cGVzL3YxMCc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGEsXG4gIFZvaWNlU3RhdGUgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSBFcmlzIGZyb20gJ2VyaXMnO1xuXG50eXBlIEVyaXNVc2VyUmVzb2x2YWJsZSA9IEVyaXMuVXNlciB8IHN0cmluZyB8IEVyaXMuTWVtYmVyO1xudHlwZSBFcmlzR3VpbGRSZXNvbHZhYmxlID1cbkVyaXMuR3VpbGQgfFxuc3RyaW5nIHxcbkVyaXMuTWVtYmVyIHxcbkVyaXMuR3VpbGRDaGFubmVsIHxcbkVyaXMuUm9sZTtcbnR5cGUgRXJpc0NoYW5uZWxSZXNvbHZhYmxlID0gRXJpcy5HdWlsZENoYW5uZWwgfCBzdHJpbmc7XG5cbmNvbnN0IERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wgPSBTeW1ib2woJ0Rpc2NvcmRQbGF5ZXJDbGllbnQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xpZW50UHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KGNsaWVudCwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCkgIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBhdE5hbWUoY2xpZW50OiBhbnkpOiBzdHJpbmcge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA/PyBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzUHJveHkoY2xpZW50OiBhbnkpOiBjbGllbnQgaXMgRXJpcy5DbGllbnQge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA9PT0gJ0VyaXMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzQ2xpZW50KGNsaWVudDogYW55KTogY2xpZW50IGlzIEVyaXMuQ2xpZW50IHtcbiAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ2VyaXMnKTtcblxuICBpZiAoZXJyb3IpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICByZXR1cm4gY2xpZW50IGluc3RhbmNlb2YgZXJpcy5DbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGRlY2xhcmVQcm9wZXJ0eSh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHk8VD4odGFyZ2V0OiBhbnksIGtleTogc3RyaW5nKTogVCB7XG4gIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSk7XG59XG5cbi8qKlxuICogQWxsb3dzIEVyaXMgY2xpZW50cyB0byBiZSB1c2VkIHdpdGggZGlzY29yZC1wbGF5ZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciBjcmVhdGVzIGEgcHJveHkgb2JqZWN0IHRoYXQgaW50ZXJjZXB0cyBjZXJ0YWluIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggZGlzY29yZC1wbGF5ZXIuXG4gKiBAcGFyYW0gY2xpZW50IFRoZSBFcmlzIGNsaWVudCB0byBiZSB1c2VkLlxuICogQHJldHVybnMgVGhlIEVyaXMgY2xpZW50IHdpdGggZGlzY29yZC1wbGF5ZXIgY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVyaXNDb21wYXQoY2xpZW50OiBFcmlzLkNsaWVudCk6IENsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdlcmlzJyk7XG5cbiAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudCk7XG5cbiAgY29uc3QgZXJpc1Byb3h5ID0gbmV3IFByb3h5KGNsaWVudCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICBjYXNlICd1c2Vycyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNVc2Vyc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ2d1aWxkcyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNHdWlsZHNQcm94eSh0YXJnZXQsIGVyaXMpO1xuICAgICAgICBjYXNlICdjaGFubmVscyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNDaGFubmVsc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ19fZHBfdm9pY2VTdGF0ZVVwZGF0ZV9wcm94eSc6XG4gICAgICAgICAgcmV0dXJuIChoYW5kbGVyOiAoYSwgYikgPT4gdm9pZCkgPT5cbiAgICAgICAgICBlcmlzVm9pY2VTdGF0ZVVwZGF0ZVByb3h5KHRhcmdldCwgZXJpc1Byb3h5LCBoYW5kbGVyKTtcbiAgICAgICAgY2FzZSAnaW5jcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgKyAxKTtcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdkZWNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgLSAxO1xuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGxpc3RlbmVycyA8IDAgPyAxIDogbGlzdGVuZXJzKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgUmVmbGVjdC5zZXQoZXJpc1Byb3h5LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sLCAnRXJpcycpO1xuXG4gIHJldHVybiBlcmlzUHJveHkgYXMgdW5rbm93biBhcyBDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZVN0YXRlVXBkYXRlUHJveHkoXG5jbGllbnQ6IEVyaXMuQ2xpZW50LFxucHJveHk6IEVyaXMuQ2xpZW50LFxuaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpXG57XG4gIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChtZW1iZXIsIG9sZFN0YXRlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb3hpZWRPbGRTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBvbGRTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG9sZFN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBvbGRTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgZ3VpbGQ6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUuZ3VpbGQuaWRcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG9sZFN0YXRlLnVzZXIuaWRcbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICBjb25zdCBtZSA9IG1lbWJlci5ndWlsZC5tZW1iZXJzLmdldChjbGllbnQudXNlci5pZCk7XG4gICAgICBjb25zdCByZXNvbHZlZENoYW5uZWwgPSBtZW1iZXIuZ3VpbGQuY2hhbm5lbHMuZ2V0KFxuICAgICAgICBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSURcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHByb3hpZWROZXdTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG1lbWJlci52b2ljZVN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBtZW1iZXIudm9pY2VTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgY2hhbm5lbDogZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmVkQ2hhbm5lbCwgY2xpZW50KSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5pZFxuICAgICAgICB9LFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBtZW1iZXIuZ3VpbGQuaWQsXG4gICAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgICAgbWU6IHtcbiAgICAgICAgICAgICAgaWQ6IG1lPy5pZCxcbiAgICAgICAgICAgICAgdm9pY2U6IHtcbiAgICAgICAgICAgICAgICBhc3luYyBzZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgdm9pZCB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtZT8udm9pY2VTdGF0ZTtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIChtZSkge1xuICAgICAgICAgICAgICAgICAgLy8gICByZXR1cm4gbWUudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcihwcm94aWVkTmV3U3RhdGUsIHByb3hpZWRPbGRTdGF0ZSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8qIG5vb3AgKi99XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudDogRXJpcy5DbGllbnQpIHtcbiAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgYW55Pj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICB9XG5cbiAgY2xpZW50Lm9uKCdzaGFyZERpc2Nvbm5lY3QnLCAoXywgc2hhcmRJZCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2d1aWxkSWQsIGFkYXB0ZXJdIG9mIGFkYXB0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNsaWVudC5ndWlsZHMuZ2V0KGd1aWxkSWQpPy5zaGFyZC5pZCA9PT0gc2hhcmRJZCkge1xuICAgICAgICBhZGFwdGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNsaWVudC5vbigncmF3V1MnLCAocGFja2V0KSA9PiB7XG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSBHYXRld2F5RGlzcGF0Y2hFdmVudHMuVm9pY2VTZXJ2ZXJVcGRhdGU6e1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTZXJ2ZXJVcGRhdGVEaXNwYXRjaERhdGE7XG4gICAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU2VydmVyVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5RGlzcGF0Y2hFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZTp7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIEdhdGV3YXlWb2ljZVN0YXRlVXBkYXRlRGlzcGF0Y2hEYXRhO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgIHBheWxvYWQuZ3VpbGRfaWQgJiZcbiAgICAgICAgICBwYXlsb2FkLnNlc3Npb25faWQgJiZcbiAgICAgICAgICBwYXlsb2FkLnVzZXJfaWQgPT09IGNsaWVudC51c2VyLmlkKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVN0YXRlVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc0NoYW5uZWxzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gIGNvbnN0IGhhbmRsZXIgPSB7XG4gICAgY2xpZW50LFxuICAgIGdldCBjYWNoZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGdldChpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGNsaWVudC5nZXRDaGFubmVsKGlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gaWQgaW4gY2xpZW50LmNoYW5uZWxHdWlsZE1hcDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgIHJlc29sdmUocmVzb2x2YWJsZTogc3RyaW5nIHwgRXJpc0NoYW5uZWxSZXNvbHZhYmxlKSB7XG4gICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkoXG4gICAgICAgICAgdGhpcy5jbGllbnQuZ2V0Q2hhbm5lbChyZXNvbHZhYmxlKSBhcyBFcmlzLkd1aWxkQ2hhbm5lbCxcbiAgICAgICAgICBjbGllbnRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCkge1xuICAgICAgICByZXR1cm4gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmFibGUsIGNsaWVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICByZXNvbHZlSWQocmVzb2x2YWJsZTogRXJpc0NoYW5uZWxSZXNvbHZhYmxlKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5yZXNvbHZlKHJlc29sdmFibGUpO1xuICAgICAgcmV0dXJuIGNoYW5uZWw/LmlkO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gaGFuZGxlcjtcbn1cblxuZnVuY3Rpb24gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KFxuY2hhbm5lbDogRXJpcy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBFcmlzLkd1aWxkQ2hhbm5lbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2hhbm5lbCkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJveHkoY2hhbm5lbCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICBjYXNlICdndWlsZCc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNWb2ljZUFkYXB0ZXJQcm94eSh0YXJnZXQuZ3VpbGQsIGNsaWVudCk7XG4gICAgICAgIGNhc2UgJ21lbWJlcnMnOlxuICAgICAgICAgIHJldHVybiAodGFyZ2V0IGFzIEVyaXMuVm9pY2VDaGFubmVsKS52b2ljZU1lbWJlcnM7XG4gICAgICAgIGNhc2UgJ2lzVm9pY2VCYXNlZCc6XG4gICAgICAgICAgcmV0dXJuICgpID0+XG4gICAgICAgICAgdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2UgfHxcbiAgICAgICAgICB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBjYXNlICdpc1ZvaWNlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2U7XG4gICAgICAgIGNhc2UgJ2lzU3RhZ2UnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJQcm94eShcbmd1aWxkOiBFcmlzLkd1aWxkIHwgdW5kZWZpbmVkLFxuY2xpZW50OiBFcmlzLkNsaWVudClcbjogRXJpcy5HdWlsZCB8IHVuZGVmaW5lZCB7XG4gIGlmICghZ3VpbGQpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGd1aWxkLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICd2b2ljZUFkYXB0ZXJDcmVhdG9yJykge1xuICAgICAgICByZXR1cm4gZXJpc1ZvaWNlQWRhcHRlckNyZWF0b3IodGFyZ2V0LCBjbGllbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJDcmVhdG9yKFxuZ3VpbGQ6IEVyaXMuR3VpbGQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yIHtcbiAgcmV0dXJuIChtZXRob2RzKSA9PiB7XG4gICAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgdHlwZW9mIG1ldGhvZHM+PihjbGllbnQsICdhZGFwdGVycycpO1xuXG4gICAgaWYgKCFhZGFwdGVycykge1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCB0eXBlb2YgbWV0aG9kcz4oKTtcbiAgICAgIGFkYXB0ZXJzID0gY29sbGVjdGlvbjtcbiAgICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICAgIH1cblxuICAgIGFkYXB0ZXJzLnNldChndWlsZC5pZCwgbWV0aG9kcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VuZFBheWxvYWQocGF5bG9hZCkge1xuICAgICAgICBpZiAoZ3VpbGQuc2hhcmQuc3RhdHVzICE9PSAncmVhZHknKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGd1aWxkLnNoYXJkLnNlbmRXUyhwYXlsb2FkLm9wLCBwYXlsb2FkLmQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBkZXN0cm95KCkge1xuICAgICAgICBhZGFwdGVycy5kZWxldGUoZ3VpbGQuaWQpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVyaXNHdWlsZHNQcm94eShjbGllbnQ6IEVyaXMuQ2xpZW50LCBlcmlzOiB0eXBlb2YgaW1wb3J0KCdlcmlzJykpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShjbGllbnQuZ3VpbGRzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzR3VpbGRSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2YWJsZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuTWVtYmVyIHx8XG4gICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZENoYW5uZWwgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5Sb2xlKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLmd1aWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChyZXNvbHZhYmxlOiBFcmlzR3VpbGRSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ3VpbGQgPSByZXNvbHZlcihyZXNvbHZhYmxlKTtcbiAgICAgICAgICByZXR1cm4gZ3VpbGQ/LmlkO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNVc2Vyc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC51c2Vycywge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAnY2FjaGUnKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwID09PSAncmVzb2x2ZScgfHwgcCA9PT0gJ3Jlc29sdmVJZCcpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBmdW5jdGlvbiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLlVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLnVzZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNVc2VyUmVzb2x2YWJsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVzZXIgPSByZXNvbHZlcihyZXNvbHZhYmxlKTtcbiAgICAgICAgICByZXR1cm4gdXNlcj8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn0iLCAiaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgUGxheWxpc3QsIFRyYWNrLCBUcmFja1NvdXJjZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBPdXRPZlNwYWNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgY3JlYXRlRmlsdGVyLFxuICBjcmVhdGVTcG90aWZ5RmlsdGVyLFxuICBmaXhUcmFja1N1ZmZpeCxcbiAgcmVtb3ZlTGl2ZSxcbiAgcmVtb3ZlUmVtYXN0ZXJlZCxcbiAgeW91dHViZSxcbiAgcmVtb3ZlWmVyb1dpZHRoLFxuICByZXBsYWNlTmJzcCxcbiAgcmVwbGFjZVNtYXJ0UXVvdGVzLFxuICByZW1vdmVDbGVhbkV4cGxpY2l0IH0gZnJvbVxuJ0B3ZWItc2Nyb2JibGVyL21ldGFkYXRhLWZpbHRlcic7XG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVUeXBlID0gJ25vZGUnIHwgJ2Rlbm8nIHwgJ2J1bicgfCAndW5rbm93bic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZURhdGEge1xuICAvKipcbiAgICogVGltZSBpbiBkYXlzXG4gICAqL1xuICBkYXlzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIGhvdXJzXG4gICAqL1xuICBob3VyczogbnVtYmVyO1xuICAvKipcbiAgICogVGltZSBpbiBtaW51dGVzXG4gICAqL1xuICBtaW51dGVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIHNlY29uZHNcbiAgICovXG4gIHNlY29uZHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lIHtcbiAgbmFtZTogUnVudGltZVR5cGU7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuY2xhc3MgVXRpbCB7XG4gIC8qKlxuICAgKiBVdGlsc1xuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJ1bnRpbWUgaW5mb3JtYXRpb25cbiAgICovXG4gIHN0YXRpYyBnZXRSdW50aW1lKCk6IFJ1bnRpbWUge1xuICAgIGNvbnN0IHZlcnNpb24gPVxuICAgIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6IG51bGw7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJyAmJiBEZW5vLnZlcnNpb24pIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiB7IG5hbWU6ICdkZW5vJywgdmVyc2lvbjogRGVuby52ZXJzaW9uLmRlbm8gfTtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBCdW4gIT09ICd1bmRlZmluZWQnICYmIEJ1bi52ZXJzaW9uKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4geyBuYW1lOiAnYnVuJywgdmVyc2lvbjogQnVuLnZlcnNpb24gfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudmVyc2lvbilcbiAgICByZXR1cm4geyBuYW1lOiAnbm9kZScsIHZlcnNpb246IHByb2Nlc3MudmVyc2lvbiB9O1xuXG4gICAgcmV0dXJuIHsgbmFtZTogJ3Vua25vd24nLCB2ZXJzaW9uOiB2ZXJzaW9uID8/ICd1bmtub3duJyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZHVyYXRpb24gc3RyaW5nXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkdXJPYmogVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGR1cmF0aW9uU3RyaW5nKGR1ck9iajogUmVjb3JkPHN0cmluZywgbnVtYmVyPikge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGR1ck9iaikuXG4gICAgbWFwKChtKSA9PiBpc05hTihtKSA/IDAgOiBtKS5cbiAgICBqb2luKCc6Jyk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIG1pbGxpc2Vjb25kcyB0byBjb25zdW1hYmxlIHRpbWUgb2JqZWN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXNlY29uZHMgVGhlIHRpbWUgaW4gbXNcbiAgICogQHJldHVybnMge1RpbWVEYXRhfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlTVMobWlsbGlzZWNvbmRzOiBudW1iZXIpIHtcbiAgICBpZiAoaXNOYU4obWlsbGlzZWNvbmRzKSkgbWlsbGlzZWNvbmRzID0gMDtcbiAgICBjb25zdCByb3VuZCA9IG1pbGxpc2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRheXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDg2NDAwMDAwKSxcbiAgICAgIGhvdXJzOiByb3VuZChtaWxsaXNlY29uZHMgLyAzNjAwMDAwKSAlIDI0LFxuICAgICAgbWludXRlczogcm91bmQobWlsbGlzZWNvbmRzIC8gNjAwMDApICUgNjAsXG4gICAgICBzZWNvbmRzOiByb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKSAlIDYwXG4gICAgfSBhcyBUaW1lRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGltZSBjb2RlXG4gICAqIEBwYXJhbSB7VGltZURhdGF9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBidWlsZFRpbWVDb2RlKGR1cmF0aW9uOiBUaW1lRGF0YSkge1xuICAgIGNvbnN0IGl0ZW1zID0gT2JqZWN0LmtleXMoZHVyYXRpb24pO1xuICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgY29uc3QgcGFyc2VkID0gaXRlbXMuXG4gICAgZmlsdGVyKCh4KSA9PiByZXF1aXJlZC5pbmNsdWRlcyh4KSkuXG4gICAgbWFwKChtKSA9PiBkdXJhdGlvblttIGFzIGtleW9mIFRpbWVEYXRhXSk7XG4gICAgY29uc3QgZmluYWwgPSBwYXJzZWQuXG4gICAgc2xpY2UocGFyc2VkLmZpbmRJbmRleCgoeCkgPT4geCAhPT0gMCkpLlxuICAgIG1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpLlxuICAgIGpvaW4oJzonKTtcblxuICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGR1cmF0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIHN0YXRpYyBmb3JtYXREdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRUaW1lQ29kZSh0aGlzLnBhcnNlTVMoZHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyBsYXN0IGl0ZW0gb2YgdGhlIGdpdmVuIGFycmF5XG4gICAqIEBwYXJhbSB7YW55W119IGFyciBUaGUgYXJyYXlcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHN0YXRpYyBsYXN0PFQgPSBhbnk+KGFycjogVFtdKTogVCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG4gICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc1ZvaWNlRW1wdHkoY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoYW5uZWwgJiYgY2hhbm5lbC5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiAhbWVtYmVyLnVzZXIuYm90KS5zaXplID09PSAwKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFucyB0aGUgdHJhY2sgdGl0bGVcbiAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZVxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2VcbiAgICogQHJldHVybnMgQ2xlYW5lZCB0aXRsZVxuICAgKi9cbiAgc3RhdGljIGNsZWFuVGl0bGUodGl0bGU6IHN0cmluZywgc291cmNlOiBUcmFja1NvdXJjZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWx0ZXJPcHRzID0ge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgdHJhY2s6IFtcbiAgICAgICAgcmVtb3ZlUmVtYXN0ZXJlZCxcbiAgICAgICAgcmVtb3ZlTGl2ZSxcbiAgICAgICAgZml4VHJhY2tTdWZmaXgsXG4gICAgICAgIHJlbW92ZVplcm9XaWR0aCxcbiAgICAgICAgcmVwbGFjZU5ic3AsXG4gICAgICAgIHJlcGxhY2VTbWFydFF1b3RlcyxcbiAgICAgICAgcmVtb3ZlQ2xlYW5FeHBsaWNpdF1cblxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNwb3RpZnlGaWx0ZXIgPSBjcmVhdGVGaWx0ZXIoZmlsdGVyT3B0cyk7XG4gICAgICBzcG90aWZ5RmlsdGVyLmV4dGVuZChjcmVhdGVTcG90aWZ5RmlsdGVyKCkpO1xuICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcblxuICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgY2FzZSAneW91dHViZSc6XG4gICAgICAgICAgcmV0dXJuIHlvdXR1YmUodGl0bGUpO1xuICAgICAgICBjYXNlICdzcG90aWZ5JzpcbiAgICAgICAgICByZXR1cm4gc3BvdGlmeUZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRGaWx0ZXIuZmlsdGVyRmllbGQoJ3RyYWNrJywgdGl0bGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRpdGxlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYWZlciByZXF1aXJlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBOb2RlIHJlcXVpcmUgaWRcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHN0YXRpYyByZXF1aXJlKGlkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiByZXF1aXJlKGlkKSwgZXJyb3I6IG51bGwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBpbXBvcnQoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IG1vZHVsZTogbnVsbCwgZXJyb3IgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzIHRpbWVvdXRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWUgVGhlIHRpbWUgaW4gbXMgdG8gd2FpdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICovXG4gIHN0YXRpYyB3YWl0KHRpbWU6IG51bWJlcikge1xuICAgIHJldHVybiBzZXRUaW1lb3V0KHRpbWUsIHVuZGVmaW5lZCwgeyByZWY6IGZhbHNlIH0pO1xuICB9XG5cbiAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gIHN0YXRpYyBhc3luYyBnZXRGZXRjaCgpIHtcbiAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBbJ25vZGUtZmV0Y2gnLCAndW5kaWNpJ10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKFxuICAgICAgICAgIChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICBpZiAocmVzKSByZXR1cm4gcmVzLmZldGNoIHx8IHJlcy5kZWZhdWx0Py5mZXRjaCB8fCByZXMuZGVmYXVsdDtcbiAgICAgICAgfSBjYXRjaCB7XG5cbiAgICAgICAgICAvLyBubz9cbiAgICAgICAgfX1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIGNvZGUgPSAnRGVwcmVjYXRpb25XYXJuaW5nJywgZGV0YWlsPzogc3RyaW5nKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICBjb2RlLFxuICAgICAgZGV0YWlsXG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgcmFuZG9tQ2hvaWNlPFQ+KHNyYzogVFtdKTogVCB7XG4gICAgcmV0dXJuIHNyY1tyYW5kb21JbnQoc3JjLmxlbmd0aCldO1xuICB9XG5cbiAgc3RhdGljIGFycmF5Q2xvbmVTaHVmZmxlPFQ+KHNyYzogVFtdKTogVFtdIHtcbiAgICBjb25zdCBhcnIgPSBzcmMuc2xpY2UoKTtcblxuICAgIGxldCBtID0gYXJyLmxlbmd0aDtcblxuICAgIHdoaWxlIChtKSB7XG4gICAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbS0tKTtcbiAgICAgIFthcnJbbV0sIGFycltpXV0gPSBbYXJyW2ldLCBhcnJbbV1dO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZBTElEQVRFX1FVRVVFX0NBUCA9IChcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxuaXRlbXM6IFBsYXlsaXN0IHwgVHJhY2sgfCBUcmFja1tdIHwgbnVtYmVyKSA9Plxue1xuICBpZiAocXVldWUubWF4U2l6ZSA8IDEgfHwgcXVldWUubWF4U2l6ZSA9PT0gSW5maW5pdHkpIHJldHVybjtcblxuICBjb25zdCB0cmFja3MgPVxuICB0eXBlb2YgaXRlbXMgPT09ICdudW1iZXInID9cbiAgaXRlbXMgOlxuICAoaXRlbXMgaW5zdGFuY2VvZiBQbGF5bGlzdCA/XG4gIGl0ZW1zLnRyYWNrcyA6XG4gIEFycmF5LmlzQXJyYXkoaXRlbXMpID9cbiAgaXRlbXMgOlxuICBbaXRlbXNdKS5cbiAgbGVuZ3RoO1xuXG4gIGNvbnN0IG1heENhcCA9IHF1ZXVlLmdldENhcGFjaXR5KCk7XG5cbiAgaWYgKG1heENhcCA8IHRyYWNrcykge1xuICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXJyb3IoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzKTtcbiAgfVxufTtcblxuZXhwb3J0IHsgVXRpbCB9OyIsICJpbXBvcnQge1xuICBVc2VyLFxuICBlc2NhcGVNYXJrZG93bixcbiAgU25vd2ZsYWtlVXRpbCxcbiAgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBBUElVc2VyIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHtcbiAgUGxheWVyLFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsXG4gIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tXG4nLi4vUGxheWVyJztcbmltcG9ydCB7IFBsYXlsaXN0LCBQbGF5bGlzdEpTT04gfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZS9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IFNlcmlhbGl6ZWRUeXBlLCB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc2VyZGUnO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IEF1ZGlvUmVzb3VyY2UgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuXG5leHBvcnQgdHlwZSBUcmFja1Jlc29sdmFibGUgPSBUcmFjayB8IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgV2l0aE1ldGFkYXRhPFQgZXh0ZW5kcyBvYmplY3QsIE0+ID0gVCAmIHtcbiAgbWV0YWRhdGE6IE07XG4gIHJlcXVlc3RNZXRhZGF0YSgpOiBQcm9taXNlPE0+O1xufTtcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFRyYWNrID0gUmV0dXJuVHlwZTxUcmFja1snc2VyaWFsaXplJ10+O1xuXG4vKipcbiAqIFRoZSB0cmFjayBzb3VyY2U6XG4gKiAtIHNvdW5kY2xvdWRcbiAqIC0geW91dHViZVxuICogLSBzcG90aWZ5XG4gKiAtIGFwcGxlX211c2ljXG4gKiAtIGFyYml0cmFyeVxuICovXG5leHBvcnQgdHlwZSBUcmFja1NvdXJjZSA9XG4nc291bmRjbG91ZCcgfFxuJ3lvdXR1YmUnIHxcbidzcG90aWZ5JyB8XG4nYXBwbGVfbXVzaWMnIHxcbidhcmJpdHJhcnknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhd1RyYWNrRGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIHZpZXdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICovXG4gIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3RcbiAgICovXG4gIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlXG4gICAqL1xuICBzb3VyY2U/OiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBlbmdpbmVcbiAgICovXG4gIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIC8qKlxuICAgKiBJZiB0aGlzIHRyYWNrIGlzIGxpdmVcbiAgICovXG4gIGxpdmU/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHJhdyBkYXRhXG4gICAqL1xuICByYXc/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAvKipcbiAgICogVGhlIHF1ZXJ5IHR5cGVcbiAgICovXG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZTtcbiAgLyoqXG4gICAqIFRoZSBzZXJpYWxpemVkIHRpdGxlXG4gICAqL1xuICBjbGVhblRpdGxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrSlNPTiB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIGR1cmF0aW9uTVM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB2aWV3c1xuICAgKi9cbiAgdmlld3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB1c2VyIGlkIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgKi9cbiAgcmVxdWVzdGVkQnk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gICAqL1xuICBwbGF5bGlzdD86IFBsYXlsaXN0SlNPTjtcbn1cblxuZXhwb3J0IGNsYXNzIFRyYWNrPFQgPSB1bmtub3duPiB7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIGF1dGhvcjogc3RyaW5nO1xuICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgcHVibGljIGR1cmF0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyB2aWV3czogbnVtYmVyO1xuICBwdWJsaWMgcmVxdWVzdGVkQnk6IFVzZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gIHB1YmxpYyBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgcmF3OiBhbnk7XG4gIHB1YmxpYyBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIHByaXZhdGUgX19tZXRhZGF0YTogVCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9fcmVxTWV0YWRhdGFGbjogKCkgPT4gUHJvbWlzZTxUIHwgbnVsbD47XG4gIHB1YmxpYyBjbGVhblRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBicmlkZ2VkRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBicmlkZ2VkVHJhY2s6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG5cbiAgI3Jlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBUcmFja1xuICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcixcbiAgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pXG4gIHtcbiAgICB0aGlzLnRpdGxlID0gZXNjYXBlTWFya2Rvd24oZGF0YS50aXRsZSA/PyAnJyk7XG4gICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvciA/PyAnJztcbiAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWwgPz8gJyc7XG4gICAgdGhpcy5kdXJhdGlvbiA9IGRhdGEuZHVyYXRpb24gPz8gJyc7XG4gICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IGRhdGEucXVlcnlUeXBlO1xuICAgIHRoaXMucmVxdWVzdGVkQnkgPSBkYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgICB0aGlzLnJhdyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHsgc291cmNlOiBkYXRhLnJhdz8uc291cmNlID8/IGRhdGEuc291cmNlIH0sXG4gICAgICBkYXRhLnJhdyA/PyBkYXRhXG4gICAgKTtcbiAgICB0aGlzLl9fbWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhID8/IG51bGw7XG4gICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPVxuICAgIGRhdGEucmVxdWVzdE1ldGFkYXRhIHx8ICgoKSA9PiBQcm9taXNlLnJlc29sdmU8VCB8IG51bGw+KG51bGwpKTtcbiAgICB0aGlzLmNsZWFuVGl0bGUgPVxuICAgIGRhdGEuY2xlYW5UaXRsZSA/PyBVdGlsLmNsZWFuVGl0bGUodGhpcy50aXRsZSwgdGhpcy5zb3VyY2UpO1xuICAgIHRoaXMubGl2ZSA9IGRhdGEubGl2ZSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGF1ZGlvIHJlc291cmNlIGZvciB0aGlzIHRyYWNrLiBUaGlzIGlzIG5vdCB1c2VmdWwgb3V0c2lkZSBvZiB0aGUgbGlicmFyeS5cbiAgICogQHBhcmFtIHJlc291cmNlIEF1ZGlvIHJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgc2V0UmVzb3VyY2UocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbCkge1xuICAgIHRoaXMuI3Jlc291cmNlID0gcmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhdWRpbyByZXNvdXJjZSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYWNrIGhhcyBhbiBhdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGdldCBoYXNSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2UgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdE1ldGFkYXRhKCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICB0aGlzLnNldE1ldGFkYXRhKHJlcyk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fX21ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzTWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGEgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcXVldWUgaW4gd2hpY2ggdGhpcyB0cmFjayBpcyBsb2NhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5maW5kKChxKSA9PlxuICAgIHEudHJhY2tzLnNvbWUoKGFiKSA9PiBhYi5pZCA9PT0gdGhpcy5pZClcbiAgICApITtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRcbiAgICovXG4gIHB1YmxpYyBnZXQgZHVyYXRpb25NUygpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbWVzID0gKG46IG51bWJlciwgdDogbnVtYmVyKSA9PiB7XG4gICAgICBsZXQgdG4gPSAxO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0OyBpKyspIHRuICo9IG47XG4gICAgICByZXR1cm4gdCA8PSAwID8gMTAwMCA6IHRuICogMTAwMDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZHVyYXRpb24uXG4gICAgc3BsaXQoJzonKS5cbiAgICByZXZlcnNlKCkuXG4gICAgbWFwKChtLCBpKSA9PiBwYXJzZUludChtKSAqIHRpbWVzKDYwLCBpKSkuXG4gICAgcmVkdWNlKChhLCBjKSA9PiBhICsgYywgMCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzY29yZCBoeXBlcmxpbmsgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvSHlwZXJsaW5rKCk6IHN0cmluZyAvKiBub3QgdXNpbmcgYFske3N0cmluZ31dKCR7c3RyaW5nfSlgIHlldCAqLyB7XG4gICAgcmV0dXJuIGBbJHt0aGlzLnRpdGxlfV0oJHt0aGlzLnVybH0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHNvdXJjZSBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSYXcgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKGhpZGVQbGF5bGlzdD86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICBkdXJhdGlvbk1TOiB0aGlzLmR1cmF0aW9uTVMsXG4gICAgICB2aWV3czogdGhpcy52aWV3cyxcbiAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5Py5pZCB8fCBudWxsLFxuICAgICAgcGxheWxpc3Q6IGhpZGVQbGF5bGlzdCA/IG51bGwgOiB0aGlzLnBsYXlsaXN0Py50b0pTT04oKSA/PyBudWxsXG4gICAgfSBhcyBUcmFja0pTT047XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplZCB0cmFjayBkYXRhIHRoYXQgY2FuIGJlIHJlY29uc3RydWN0ZWRcbiAgICovXG4gIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID9cbiAgICAgIHRoaXMudGh1bWJuYWlsIDpcbiAgICAgIHRyeUludG9UaHVtYm5haWxTdHJpbmcodGhpcy50aHVtYm5haWwpLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICB2aWV3czogdGhpcy52aWV3cyA/PyAwLFxuICAgICAgcmVxdWVzdGVkX2J5OiB0aGlzLnJlcXVlc3RlZEJ5Py50b0pTT04oKSA/PyBudWxsLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgcXVlcnlfdHlwZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICBleHRyYWN0b3I6IHRoaXMuZXh0cmFjdG9yPy5pZGVudGlmaWVyID8/IG51bGwsXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgICR0eXBlOiBTZXJpYWxpemVkVHlwZS5UcmFjayxcbiAgICAgICRlbmNvZGVyX3ZlcnNpb246IHRoaXMucGxheWVyLnZlcnNpb25cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIHRyYWNrIGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAqIEBwYXJhbSBwbGF5ZXIgUGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZChcbiAgcGxheWVyOiBQbGF5ZXIsXG4gIGRhdGE6IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPilcbiAge1xuICAgIGlmIChkYXRhLiR0eXBlICE9PSBTZXJpYWxpemVkVHlwZS5UcmFjaylcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdkYXRhJyxcbiAgICAgICdTZXJpYWxpemVkVHJhY2snLFxuICAgICAgJ21hbGZvcm1lZCBkYXRhJ1xuICAgICk7XG4gICAgY29uc3QgdHJhY2sgPSBuZXcgVHJhY2socGxheWVyLCB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgcmVxdWVzdGVkQnk6IGRhdGEucmVxdWVzdGVkX2J5ID9cbiAgICAgICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGRhdGEucmVxdWVzdGVkX2J5IGFzIEFQSVVzZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBwbGF5ZXIuY2xpZW50LnVzZXJzLnJlc29sdmUocmVzLmlkKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICBpZiAocGxheWVyLmNsaWVudC51c2Vycy5jYWNoZS5oYXMocmVzLmlkKSlcbiAgICAgICAgICByZXR1cm4gcGxheWVyLmNsaWVudC51c2Vycy5jYWNoZS5nZXQocmVzLmlkKSE7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcihwbGF5ZXIuY2xpZW50LCByZXMpO1xuICAgICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSkoKSA6XG4gICAgICBudWxsLFxuICAgICAgcXVlcnlUeXBlOiBkYXRhLnF1ZXJ5X3R5cGUgPz8gdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICB0cmFjay5zZXRNZXRhZGF0YShkYXRhLm1ldGFkYXRhKTtcblxuICAgIHJldHVybiB0cmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYmVsb25naW5nIHF1ZXVlcyBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0QmVsb25naW5nUXVldWVzKCkge1xuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmlsdGVyKChub2RlKSA9PlxuICAgIG5vZGUudHJhY2tzLnNvbWUoKHQpID0+IHQuaWQgPT09IHRoaXMuaWQpXG4gICAgKTtcblxuICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgdHJhY2sgc2hhbGwgYmUgcGxheWVkXG4gICAqIEBwYXJhbSBvcHRpb25zIE5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+KVxuICA6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnBsYXllci5wbGF5LmJpbmQodGhpcy5wbGF5ZXIpO1xuXG4gICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG59IiwgImV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb2RlOiBFcnJvckNvZGVzO1xuICBwdWJsaWMgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb2RlOiBFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcblxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiB0aGlzLnRpbWVzdGFtcFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE91dE9mU3BhY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBjYXBhY2l0eTogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9PVVRfT0ZfU1BBQ0UsXG4gICAgICBgTWF4IGNhcGFjaXR5IHJlYWNoZWQgZm9yICR7dGFyZ2V0fSAoQ2FwYWNpdHkgJHtjYXBhY2l0eX0vVG90YWwgJHt0b3RhbH0pYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRBcmdUeXBlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgZXhwZWN0YXRpb246IHN0cmluZywgZm91bmQ6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRSxcbiAgICAgIGBFeHBlY3RlZCAke3RhcmdldH0gdG8gYmUgXCIke2V4cGVjdGF0aW9ufVwiLCByZWNlaXZlZCBcIiR7Zm91bmR9XCJgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9SZXN1bHRFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX1JFU1VMVCwgbWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PVF9JTVBMRU1FTlRFRCwgYCR7dGFyZ2V0fSBpcyBub3QgeWV0IGltcGxlbWVudGVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEV4aXN0aW5nRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElORywgYCR7dGFyZ2V0fSBkb2VzIG5vdCBleGlzdGApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRPZlJhbmdlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbWluaW11bTogc3RyaW5nLCBtYXhpbXVtOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX09VVF9PRl9SQU5HRSxcbiAgICAgIGAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWluaW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9fVk9JQ0VfQ09OTkVDVElPTixcbiAgICAgIG1lc3NhZ2UgfHxcbiAgICAgICdObyB2b2ljZSBjb25uZWN0aW9uIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/J1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZvaWNlQ29ubmVjdGlvbkRlc3Ryb3llZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCxcbiAgICAgICdDYW5ub3QgdXNlIGRlc3Ryb3llZCB2b2ljZSBjb25uZWN0aW9uJ1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vVm9pY2VDaGFubmVsRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19WT0lDRV9DSEFOTkVMLCAnQ291bGQgbm90IGdldCB0aGUgdm9pY2UgY2hhbm5lbCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVm9pY2VDaGFubmVsRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUwsICdFeHBlY3RlZCBhIHZvaWNlIGNoYW5uZWwnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9SZWNlaXZlckVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9fUkVDRUlWRVIsXG4gICAgICBtZXNzYWdlIHx8XG4gICAgICAnTm8gdm9pY2UgcmVjZWl2ZXIgaXMgYXZhaWxhYmxlLCBtYXliZSBjb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbCBmaXJzdD8nXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRkZtcGVnRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9GRk1QRUdfTE9DQVRPUiwgbWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vQXVkaW9SZXNvdXJjZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9fQVVESU9fUkVTT1VSQ0UsXG4gICAgICBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhbiBhdWRpbyByZXNvdXJjZSdcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0d1aWxkUXVldWVFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19HVUlMRF9RVUVVRSwgbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCBxdWV1ZScpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0d1aWxkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fR1VJTEQsIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5mb1JlcXVpcmVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgYWN0dWFsOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0lORk9fUkVRVUlSRUQsXG4gICAgICBgRXhwZWN0ZWQgJHt0YXJnZXR9LCBmb3VuZCBcIiR7YWN0dWFsfVwiYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcmlhbGl6YXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfU0VSSUFMSVpBVElPTl9GQUlMRUQsXG4gICAgICBcIkRvbid0IGtub3cgaG93IHRvIHNlcmlhbGl6ZSB0aGlzIGRhdGFcIlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlc2VyaWFsaXphdGlvbkVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9ERVNFUklBTElaQVRJT05fRkFJTEVELFxuICAgICAgXCJEb24ndCBrbm93IGhvdyB0byBkZXNlcmlhbGl6ZSB0aGlzIGRhdGFcIlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OLFxuICAgICAgYElsbGVnYWwgaW52b2NhdGlvbiBvZiAke3RhcmdldH0gaG9vay4ke21lc3NhZ2UgPyBgICR7bWVzc2FnZX1gIDogJyd9YFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vZHVsZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgZGVzY3JpcHRpb24gPSAnJykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9UX0VYSVNUSU5HX01PRFVMRSxcbiAgICAgIGAke3RhcmdldH0gbW9kdWxlIGRvZXMgbm90IGV4aXN0LiBJbnN0YWxsIGl0IHdpdGggXFxgbnBtIGluc3RhbGwgJHt0YXJnZXR9XFxgLiR7XG4gICAgICBkZXNjcmlwdGlvbiA/ICcgJyArIGRlc2NyaXB0aW9uIDogJyd9YFxuXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQnJpZGdlRmFpbGVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nIHwgbnVsbCwgZXJyb3I6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfQlJJREdFX0ZBSUxFRCxcbiAgICAgIGAke1xuICAgICAgaWQgPyBgKEV4dHJhY3RvciBFeGVjdXRpb24gQ29udGV4dCBJRCBpcyAke2lkfSlgIDogJyd9RmFpbGVkIHRvIGJyaWRnZSB0aGlzIHF1ZXJ5OlxcbiR7XG4gICAgICBlcnJvcn1gXG4gICAgKTtcbiAgfVxufVxuXG4vLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbmV4cG9ydCBjb25zdCBFcnJvckNvZGVzID0ge1xuICBFUlJfT1VUX09GX1NQQUNFOiAnRVJSX09VVF9PRl9TUEFDRScsXG4gIEVSUl9JTlZBTElEX0FSR19UWVBFOiAnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICBFUlJfTk9fUkVTVUxUOiAnRVJSX05PX1JFU1VMVCcsXG4gIEVSUl9OT1RfSU1QTEVNRU5URUQ6ICdFUlJfTk9UX0lNUExFTUVOVEVEJyxcbiAgRVJSX05PVF9FWElTVElORzogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICBFUlJfT1VUX09GX1JBTkdFOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiAnRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04nLFxuICBFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQ6ICdFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQnLFxuICBFUlJfTk9fVk9JQ0VfQ0hBTk5FTDogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTDogJ0VSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUwnLFxuICBFUlJfTk9fUkVDRUlWRVI6ICdFUlJfTk9fUkVDRUlWRVInLFxuICBFUlJfRkZNUEVHX0xPQ0FUT1I6ICdFUlJfRkZNUEVHX0xPQ0FUT1InLFxuICBFUlJfTk9fQVVESU9fUkVTT1VSQ0U6ICdFUlJfTk9fQVVESU9fUkVTT1VSQ0UnLFxuICBFUlJfTk9fR1VJTERfUVVFVUU6ICdFUlJfTk9fR1VJTERfUVVFVUUnLFxuICBFUlJfTk9fR1VJTEQ6ICdFUlJfTk9fR1VJTEQnLFxuICBFUlJfSU5GT19SRVFVSVJFRDogJ0VSUl9JTkZPX1JFUVVJUkVEJyxcbiAgRVJSX1NFUklBTElaQVRJT05fRkFJTEVEOiAnRVJSX1NFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQ6ICdFUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCcsXG4gIEVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTjogJ0VSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTicsXG4gIEVSUl9OT1RfRVhJU1RJTkdfTU9EVUxFOiAnRVJSX05PVF9FWElTVElOR19NT0RVTEUnLFxuICBFUlJfQlJJREdFX0ZBSUxFRDogJ0VSUl9CUklER0VfRkFJTEVEJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRXJyb3JDb2RlcyA9ICh0eXBlb2YgRXJyb3JDb2Rlcylba2V5b2YgdHlwZW9mIEVycm9yQ29kZXNdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc2NvcmRQbGF5ZXJFcnJvcihlcnJvcjogYW55KTogZXJyb3IgaXMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgcmV0dXJuIGVycm9yICE9IG51bGwgJiYgZXJyb3IgaW5zdGFuY2VvZiBEaXNjb3JkUGxheWVyRXJyb3I7XG59XG5cbi8qKlxuICogSGFuZGxlIGEgYERpc2NvcmRQbGF5ZXJFcnJvcmAgZXJyb3IuXG4gKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIHRvIGhhbmRsZVxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgZXJyb3IgaXMgYSBgRGlzY29yZFBsYXllckVycm9yYC5cbiAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgaGFuZGxlclxuICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgLy8gLi4uXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogIGhhbmRsZURpc2NvcmRQbGF5ZXJFcnJvcihlcnJvciwgKGVycm9yKSA9PiB7XG4gKiAgICBjb25zb2xlLmVycm9yKGBBbiBlcnJvciBvY2N1cnJlZCBmcm9tIGRpc2NvcmQtcGxheWVyOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gKiAgfSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZURpc2NvcmRQbGF5ZXJFcnJvcjxcbiAgVCBleHRlbmRzIGFueVtdLFxuICBGIGV4dGVuZHMgKGVycm9yOiBEaXNjb3JkUGxheWVyRXJyb3IsIC4uLmFyZ3M6IFQpID0+IGFueSxcbiAgUiBleHRlbmRzIFJldHVyblR5cGU8Rj4+KFxuZXJyb3I6IGFueSwgaGFuZGxlcjogRiwgYXJnczogVCk6IFIge1xuICBpZiAoaXNEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGhhbmRsZXIoZXJyb3IsIC4uLmFyZ3MpIGFzIFI7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkIGFzIFI7XG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyIsICJpbXBvcnQgeyBEaXNjb3JkUGxheWVyRXJyb3IsIGlzRGlzY29yZFBsYXllckVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGNsYXNzIFR5cGVVdGlsIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gVHlwZVV0aWw7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICBwdWJsaWMgc3RhdGljIGlzRnVuY3Rpb24odDogdW5rbm93bik6IHQgaXMgRnVuY3Rpb24ge1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodDogdW5rbm93bik6IHQgaXMgbnVtYmVyIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdudW1iZXInICYmICFpc05hTih0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Jvb2xlYW4odDogdW5rbm93bik6IHQgaXMgYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTnVsbGlzaCh0OiB1bmtub3duKTogdCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdCA9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRXJyb3IodDogdW5rbm93bik6IHQgaXMgRXJyb3Ige1xuICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRGlzY29yZFBsYXllckVycm9yKHQ6IHVua25vd24pOiB0IGlzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gICAgcmV0dXJuIGlzRGlzY29yZFBsYXllckVycm9yKHQpO1xuICB9XG59IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgRGVzZXJpYWxpemF0aW9uRXJyb3IsIFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge1xuICBQbGF5bGlzdCxcbiAgdHlwZSBTZXJpYWxpemVkVHJhY2ssXG4gIFRyYWNrLFxuICBTZXJpYWxpemVkUGxheWxpc3QgfSBmcm9tXG4nLi4vZmFicmljJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi9UeXBlVXRpbCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcblxuZXhwb3J0IGVudW0gU2VyaWFsaXplZFR5cGUge1xuICBUcmFjayA9ICd0cmFjaycsXG4gIFBsYXlsaXN0ID0gJ3BsYXlsaXN0Jyxcbn1cblxuZXhwb3J0IHR5cGUgRW5jb2RhYmxlID0gU2VyaWFsaXplZFRyYWNrIHwgU2VyaWFsaXplZFBsYXlsaXN0O1xuXG5jb25zdCBpc1RyYWNrID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFRyYWNrID0+XG5kYXRhLiR0eXBlID09PSBTZXJpYWxpemVkVHlwZS5UcmFjaztcbmNvbnN0IGlzUGxheWxpc3QgPSAoZGF0YTogYW55KTogZGF0YSBpcyBTZXJpYWxpemVkUGxheWxpc3QgPT5cbmRhdGEuJHR5cGUgPT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGRhdGE6IFRyYWNrIHwgUGxheWxpc3QgfCBhbnkpIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBUcmFjaykgcmV0dXJuIGRhdGEuc2VyaWFsaXplKCk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgUGxheWxpc3QpIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRhdGEudG9KU09OKCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUocGxheWVyOiBQbGF5ZXIsIGRhdGE6IEVuY29kYWJsZSkge1xuICBpZiAoaXNUcmFjayhkYXRhKSkgcmV0dXJuIFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG4gIGlmIChpc1BsYXlsaXN0KGRhdGEpKSByZXR1cm4gUGxheWxpc3QuZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBkYXRhKTtcblxuICB0aHJvdyBuZXcgRGVzZXJpYWxpemF0aW9uRXJyb3IoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShkYXRhOiBFbmNvZGFibGUpIHtcbiAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGE6IHN0cmluZykge1xuICBjb25zdCBzdHIgPSBCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoKTtcblxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5SW50b1RodW1ibmFpbFN0cmluZyhkYXRhOiBhbnkpIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoVHlwZVV0aWwuaXNTdHJpbmcoZGF0YSkpIHJldHVybiBkYXRhO1xuICAgIHJldHVybiBkYXRhPy51cmwgPz8gZGF0YT8udGh1bWJuYWlsPy51cmwgPz8gbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0iLCAiaW1wb3J0IHtcbiAgUGxheWVyLFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsXG4gIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tXG4nLi4vUGxheWVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja0pTT04sIFRyYWNrU291cmNlIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6ZWRUeXBlLCB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc2VyZGUnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFBsYXlsaXN0ID0gUmV0dXJuVHlwZTxQbGF5bGlzdFsnc2VyaWFsaXplJ10+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SW5pdERhdGEge1xuICAvKipcbiAgICogVGhlIHRyYWNrcyBvZiB0aGlzIHBsYXlsaXN0XG4gICAqL1xuICB0cmFja3M6IFRyYWNrW107XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgKi9cbiAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3Qgc291cmNlXG4gICAqL1xuICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByYXcgcGxheWxpc3QgZGF0YVxuICAgKi9cbiAgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SlNPTiB7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBkZXNjcmlwdGlvblxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHR5cGU6IGBhbGJ1bWAgfCBgcGxheWxpc3RgXG4gICAqL1xuICB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayBzb3VyY2VcbiAgICovXG4gIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIG5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgfTtcbiAgLyoqXG4gICAqIFRoZSB0cmFja3MgZGF0YSAoaWYgYW55KVxuICAgKi9cbiAgdHJhY2tzOiBUcmFja0pTT05bXTtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXlsaXN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuICBwdWJsaWMgdHJhY2tzOiBUcmFja1tdO1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgcHVibGljIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICBwdWJsaWMgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgcHVibGljIGF1dGhvcjoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgfTtcbiAgcHVibGljIGlkOiBzdHJpbmc7XG4gIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuICAvKipcbiAgICogUGxheWxpc3QgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyXG4gICAqIEBwYXJhbSB7UGxheWxpc3RJbml0RGF0YX0gZGF0YSBUaGUgZGF0YVxuICAgKi9cbiAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWVyXG4gICAgICogQG5hbWUgUGxheWxpc3QjcGxheWVyXG4gICAgICogQHR5cGUge1BsYXllcn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFja3MgaW4gdGhpcyBwbGF5bGlzdFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3RyYWNrc1xuICAgICAqIEB0eXBlIHtUcmFja1tdfVxuICAgICAqL1xuICAgIHRoaXMudHJhY2tzID0gZGF0YS50cmFja3MgPz8gW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNhdXRob3JcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuYXV0aG9yID0gZGF0YS5hdXRob3I7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNkZXNjcmlwdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGh1bWJuYWlsIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0aHVtYm5haWxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdHlwZTpcbiAgICAgKiAtIGBhbGJ1bWBcbiAgICAgKiAtIGBwbGF5bGlzdGBcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0eXBlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc291cmNlIG9mIHRoaXMgcGxheWxpc3Q6XG4gICAgICogLSBgeW91dHViZWBcbiAgICAgKiAtIGBzb3VuZGNsb3VkYFxuICAgICAqIC0gYHNwb3RpZnlgXG4gICAgICogLSBgYXJiaXRyYXJ5YFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3NvdXJjZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I2lkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN1cmxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgUGxheWxpc3QjcmF3UGxheWxpc3RcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICB9XG5cbiAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHlpZWxkKiB0aGlzLnRyYWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3MucmVkdWNlKChwLCBjKSA9PiBwICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXR0ZWQgZXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoVHJhY2tzPXRydWVdIElmIGl0IHNob3VsZCBidWlsZCBqc29uIHdpdGggdHJhY2tzXG4gICAqIEByZXR1cm5zIHtQbGF5bGlzdEpTT059XG4gICAqL1xuICB0b0pTT04od2l0aFRyYWNrcyA9IHRydWUpIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRodW1ibmFpbDogdGhpcy50aHVtYm5haWwsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHRyYWNrczogW10gYXMgVHJhY2tKU09OW11cbiAgICB9O1xuXG4gICAgaWYgKHdpdGhUcmFja3MpIHBheWxvYWQudHJhY2tzID0gdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSk7XG5cbiAgICByZXR1cm4gcGF5bG9hZCBhcyBQbGF5bGlzdEpTT047XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoaXMgcGxheWxpc3QgaW50byByZWNvbnN0cnVjdGFibGUgZGF0YVxuICAgKi9cbiAgcHVibGljIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2tzOiB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0uc2VyaWFsaXplKCkpLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID9cbiAgICAgIHRoaXMudGh1bWJuYWlsIDpcbiAgICAgIHRyeUludG9UaHVtYm5haWxTdHJpbmcodGhpcy50aHVtYm5haWwpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuUGxheWxpc3QsXG4gICAgICAkZW5jb2Rlcl92ZXJzaW9uOiB0aGlzLnBsYXllci52ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAqIEBwYXJhbSBwbGF5ZXIgUGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZChwbGF5ZXI6IFBsYXllciwgZGF0YTogU2VyaWFsaXplZFBsYXlsaXN0KSB7XG4gICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0KVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ2RhdGEnLFxuICAgICAgJ1NlcmlhbGl6ZWRQbGF5bGlzdCcsXG4gICAgICAnbWFsZm9ybWVkIGRhdGEnXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHBsYXllciwge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHRyYWNrczogZGF0YS50cmFja3MubWFwKChtKSA9PiBUcmFjay5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIG0pKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhpcyBwbGF5bGlzdCB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyBwbGF5bGlzdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICogQHBhcmFtIGNoYW5uZWwgVm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGlzIHBsYXlsaXN0IHNoYWxsIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPilcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgIHJldHVybiBhd2FpdCBmbihjaGFubmVsLCB0aGlzLCBvcHRpb25zKTtcbiAgfVxufSIsICJpbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgSW5mb1JlcXVpcmVkRXJyb3IsIEludmFsaWRBcmdUeXBlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZmV0Y2ggfSBmcm9tICd1bmRpY2knO1xuXG4vLyAjcmVnaW9uIHNjYXJ5IHRoaW5ncyBiZWxvdyAqc2lnaCpcbmNvbnN0IHNwb3RpZnlTb25nUmVnZXggPVxuL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzp0cmFja1xcL3xcXD91cmk9c3BvdGlmeTp0cmFjazopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5UGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnBsYXlsaXN0XFwvfFxcP3VyaT1zcG90aWZ5OnBsYXlsaXN0OikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlBbGJ1bVJlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86YWxidW1cXC98XFw/dXJpPXNwb3RpZnk6YWxidW06KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3QgdmltZW9SZWdleCA9XG4vXihodHRwfGh0dHBzKT86XFwvXFwvKHd3d1xcLnxwbGF5ZXJcXC4pP3ZpbWVvXFwuY29tXFwvKD86Y2hhbm5lbHNcXC8oPzpcXHcrXFwvKT98Z3JvdXBzXFwvKFteL10qKVxcL3ZpZGVvc1xcL3x2aWRlb1xcL3wpKFxcZCspKD86fFxcL1xcPykkLztcbmNvbnN0IHJldmVyYm5hdGlvblJlZ2V4ID1cbi9eaHR0cHM6XFwvXFwvKHd3dy4pP3JldmVyYm5hdGlvbi5jb21cXC8oLispXFwvc29uZ1xcLyguKykkLztcbmNvbnN0IGF0dGFjaG1lbnRSZWdleCA9IC9eaHR0cHM/OlxcL1xcLy4rJC87XG5jb25zdCBhcHBsZU11c2ljU29uZ1JlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC8oc29uZ3xhbGJ1bSlcXC8uKz8oXFwvLis/XFw/aT18XFwvKShbMC05XSspJC87XG5jb25zdCBhcHBsZU11c2ljUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvcGxheWxpc3RcXC8uK1xcL3BsXFwuKHUtfHBtLSk/W2EtekEtWjAtOV0rJC87XG5jb25zdCBhcHBsZU11c2ljQWxidW1SZWdleCA9XG4vXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvYWxidW1cXC8uK1xcLyhbMC05XSspJC87XG5jb25zdCBzb3VuZGNsb3VkVHJhY2tSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvc2V0c1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHlvdXR1YmVQbGF5bGlzdFJlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyh3d3cuKT95b3V0dWJlLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD0oKFBMfEZMfFVVfExMfFJEfE9MKVthLXpBLVowLTktX117MTYsNDF9KSQvO1xuY29uc3QgeW91dHViZVZpZGVvVVJMUmVnZXggPVxuL14oKD86aHR0cHM/Oik/XFwvXFwvKT8oKD86d3d3fG0pXFwuKT8oKD86eW91dHViZVxcLmNvbXx5b3V0dS5iZSkpKFxcLyg/OltcXHctXStcXD92PXxlbWJlZFxcL3x2XFwvKT8pKFtcXHctXSspKFxcUyspPyQvO1xuY29uc3QgeW91dHViZVZpZGVvSWRSZWdleCA9IC9eW2EtekEtWjAtOS1fXXsxMX0kLztcbi8vIGRpc2NvcmQtcGxheWVyOi8vYmxvYi91dWlkLXY0XG5jb25zdCBkaXNjb3JkUGxheWVyQmxvYlJlZ2V4ID0gL15kaXNjb3JkLXBsYXllcjpcXC9cXC9ibG9iXFwvXFxkKyQvO1xuLy8gI2VuZHJlZ2lvbiBzY2FyeSB0aGluZ3MgYWJvdmUgKnNpZ2gqXG5cbmNvbnN0IERvbWFpbnNNYXAgPSB7XG4gIERpc2NvcmRQbGF5ZXI6IFsnZGlzY29yZC1wbGF5ZXInXSxcbiAgWW91VHViZTogW1xuICAneW91dHViZS5jb20nLFxuICAneW91dHUuYmUnLFxuICAnbXVzaWMueW91dHViZS5jb20nLFxuICAnZ2FtaW5nLnlvdXR1YmUuY29tJyxcbiAgJ3d3dy55b3V0dWJlLmNvbScsXG4gICdtLnlvdXR1YmUuY29tJ10sXG5cbiAgU3BvdGlmeTogWydvcGVuLnNwb3RpZnkuY29tJywgJ2VtYmVkLnNwb3RpZnkuY29tJ10sXG4gIFZpbWVvOiBbJ3ZpbWVvLmNvbScsICdwbGF5ZXIudmltZW8uY29tJ10sXG4gIFJldmVyYk5hdGlvbjogWydyZXZlcmJuYXRpb24uY29tJ10sXG4gIFNvdW5kQ2xvdWQ6IFsnc291bmRjbG91ZC5jb20nXSxcbiAgQXBwbGVNdXNpYzogWydtdXNpYy5hcHBsZS5jb20nXVxufTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCByZWRpcmVjdERvbWFpbnMgPSBuZXcgU2V0KFtcbi9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkubGlua1xcL1tBLVphLXowLTldKyQvLFxuL15odHRwczpcXC9cXC9vblxcLnNvdW5kY2xvdWRcXC5jb21cXC9bYS16QS1aMS05XXswLDE3fSQvXVxuKTtcblxuLyoqXG4gKiBUaGUgc2VhcmNoIHF1ZXJ5IHR5cGVcbiAqIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gQVVUT1xuICogLSBZT1VUVUJFXG4gKiAtIFlPVVRVQkVfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRF9UUkFDS1xuICogLSBTT1VORENMT1VEX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURcbiAqIC0gU1BPVElGWV9TT05HXG4gKiAtIFNQT1RJRllfQUxCVU1cbiAqIC0gU1BPVElGWV9QTEFZTElTVFxuICogLSBTUE9USUZZX1NFQVJDSFxuICogLSBGQUNFQk9PS1xuICogLSBWSU1FT1xuICogLSBBUkJJVFJBUllcbiAqIC0gUkVWRVJCTkFUSU9OXG4gKiAtIFlPVVRVQkVfU0VBUkNIXG4gKiAtIFlPVVRVQkVfVklERU9cbiAqIC0gU09VTkRDTE9VRF9TRUFSQ0hcbiAqIC0gQVBQTEVfTVVTSUNfU09OR1xuICogLSBBUFBMRV9NVVNJQ19BTEJVTVxuICogLSBBUFBMRV9NVVNJQ19QTEFZTElTVFxuICogLSBBUFBMRV9NVVNJQ19TRUFSQ0hcbiAqIC0gRklMRVxuICogLSBBVVRPX1NFQVJDSFxuICogLSBESVNDT1JEX1BMQVlFUl9CTE9CXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgQVVUTzogJ2F1dG8nLFxuICBZT1VUVUJFOiAneW91dHViZScsXG4gIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICBTT1VORENMT1VEX1RSQUNLOiAnc291bmRjbG91ZFRyYWNrJyxcbiAgU09VTkRDTE9VRF9QTEFZTElTVDogJ3NvdW5kY2xvdWRQbGF5bGlzdCcsXG4gIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgU1BPVElGWV9TT05HOiAnc3BvdGlmeVNvbmcnLFxuICBTUE9USUZZX0FMQlVNOiAnc3BvdGlmeUFsYnVtJyxcbiAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gIFNQT1RJRllfU0VBUkNIOiAnc3BvdGlmeVNlYXJjaCcsXG4gIEZBQ0VCT09LOiAnZmFjZWJvb2snLFxuICBWSU1FTzogJ3ZpbWVvJyxcbiAgQVJCSVRSQVJZOiAnYXJiaXRyYXJ5JyxcbiAgUkVWRVJCTkFUSU9OOiAncmV2ZXJibmF0aW9uJyxcbiAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgWU9VVFVCRV9WSURFTzogJ3lvdXR1YmVWaWRlbycsXG4gIFNPVU5EQ0xPVURfU0VBUkNIOiAnc291bmRjbG91ZFNlYXJjaCcsXG4gIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gIEFQUExFX01VU0lDX0FMQlVNOiAnYXBwbGVNdXNpY0FsYnVtJyxcbiAgQVBQTEVfTVVTSUNfUExBWUxJU1Q6ICdhcHBsZU11c2ljUGxheWxpc3QnLFxuICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgRklMRTogJ2ZpbGUnLFxuICBBVVRPX1NFQVJDSDogJ2F1dG9TZWFyY2gnLFxuICBESVNDT1JEX1BMQVlFUl9CTE9COiAnZGlzY29yZFBsYXllckJsb2InXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBRdWVyeVR5cGUgPSAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG5cbmV4cG9ydCB0eXBlIFNlYXJjaFF1ZXJ5VHlwZSA9IGtleW9mIHR5cGVvZiBRdWVyeVR5cGUgfCBRdWVyeVR5cGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRRdWVyeSB7XG4gIHR5cGU6ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcbiAgcXVlcnk6IHN0cmluZztcbn1cblxuY2xhc3MgUXVlcnlSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBRdWVyeSByZXNvbHZlclxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgc3RhdGljIGdldCByZWdleCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3BvdGlmeUFsYnVtUmVnZXgsXG4gICAgICBzcG90aWZ5UGxheWxpc3RSZWdleCxcbiAgICAgIHNwb3RpZnlTb25nUmVnZXgsXG4gICAgICB2aW1lb1JlZ2V4LFxuICAgICAgcmV2ZXJibmF0aW9uUmVnZXgsXG4gICAgICBhdHRhY2htZW50UmVnZXgsXG4gICAgICBhcHBsZU11c2ljQWxidW1SZWdleCxcbiAgICAgIGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LFxuICAgICAgYXBwbGVNdXNpY1NvbmdSZWdleCxcbiAgICAgIHNvdW5kY2xvdWRUcmFja1JlZ2V4LFxuICAgICAgc291bmRjbG91ZFBsYXlsaXN0UmVnZXgsXG4gICAgICB5b3V0dWJlUGxheWxpc3RSZWdleCxcbiAgICAgIGRpc2NvcmRQbGF5ZXJCbG9iUmVnZXhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZS1yZXNvbHZlIHJlZGlyZWN0IHVybHNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBwcmVSZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIG1heERlcHRoID0gNSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuXG4gICAgZm9yIChjb25zdCBkb21haW4gb2YgcmVkaXJlY3REb21haW5zKSB7XG4gICAgICBpZiAoZG9tYWluLnRlc3QocXVlcnkpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocXVlcnksIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdydcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghcmVzLm9rKSBicmVhaztcblxuICAgICAgICAgIC8vIHNwb3RpZnkgZG9lcyBub3QgXCJyZWRpcmVjdFwiLCBpdCByZXR1cm5zIGEgcGFnZSB3aXRoIGpzIHRoYXQgcmVkaXJlY3RzXG4gICAgICAgICAgaWYgKC9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkuYXBwLmxpbmtcXC8oLispJC8udGVzdChyZXMudXJsKSkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBib2R5LlxuICAgICAgICAgICAgc3BsaXQoJ2h0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS90cmFjay8nKVsxXS5cbiAgICAgICAgICAgIHNwbGl0KCc/c2k9JylbMF07XG5cbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSBicmVhaztcblxuICAgICAgICAgICAgcmV0dXJuIGBodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJHt0YXJnZXR9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1heERlcHRoIDwgMSA/XG4gICAgICAgICAgcmVzLnVybCA6XG4gICAgICAgICAgdGhpcy5wcmVSZXNvbHZlKHJlcy51cmwsIG1heERlcHRoIC0gMSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgKi9cbiAgc3RhdGljIHJlc29sdmUoXG4gIHF1ZXJ5OiBzdHJpbmcsXG4gIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gpXG4gIDogUmVzb2x2ZWRRdWVyeSB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuICAgIGlmICghcXVlcnkubGVuZ3RoKSB0aHJvdyBuZXcgSW5mb1JlcXVpcmVkRXJyb3IoJ3F1ZXJ5JywgU3RyaW5nKHF1ZXJ5KSk7XG5cbiAgICBjb25zdCByZXNvbHZlciA9ICh0eXBlOiB0eXBlb2YgZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5OiBzdHJpbmcpID0+ICh7XG4gICAgICB0eXBlLFxuICAgICAgcXVlcnlcbiAgICB9KTtcblxuICAgIGlmIChkaXNjb3JkUGxheWVyQmxvYlJlZ2V4LnRlc3QocXVlcnkpKVxuICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuRElTQ09SRF9QTEFZRVJfQkxPQiwgcXVlcnkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocXVlcnkpO1xuXG4gICAgICBpZiAoRG9tYWluc01hcC5Zb3VUdWJlLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoLyhtKHVzaWMpP3xnYW1pbmcpXFwuLywgJycpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgcGxheWxpc3RJZCA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCdsaXN0Jyk7XG4gICAgICAgIGNvbnN0IHZpZGVvSWQgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgndicpO1xuICAgICAgICBpZiAocGxheWxpc3RJZCkge1xuICAgICAgICAgIGlmICh2aWRlb0lkICYmIHBsYXlsaXN0SWQuc3RhcnRzV2l0aCgnUkQnKSlcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoXG4gICAgICAgICAgICBRdWVyeVR5cGUuWU9VVFVCRV9QTEFZTElTVCxcbiAgICAgICAgICAgIGBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PSR7dmlkZW9JZH0mbGlzdD0ke3BsYXlsaXN0SWR9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFxuICAgICAgICAgICAgUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsXG4gICAgICAgICAgICBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vcGxheWxpc3Q/bGlzdD0ke3BsYXlsaXN0SWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVJZChxdWVyeSkgfHwgUXVlcnlSZXNvbHZlci52YWxpZGF0ZVVSTChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuWU9VVFVCRV9WSURFTywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5TcG90aWZ5LmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoL2ludGwtKFthLXpBLVpdKylcXC8vLCAnJyk7XG4gICAgICAgIGlmIChzcG90aWZ5UGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChzcG90aWZ5QWxidW1SZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgIGlmIChzcG90aWZ5U29uZ1JlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfU09ORywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5WaW1lby5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKHZpbWVvUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuVklNRU8sIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuUmV2ZXJiTmF0aW9uLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAocmV2ZXJibmF0aW9uUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuUkVWRVJCTkFUSU9OLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlNvdW5kQ2xvdWQuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmIChzb3VuZGNsb3VkUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TT1VORENMT1VEX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChzb3VuZGNsb3VkVHJhY2tSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TT1VORENMT1VEX1RSQUNLLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLkFwcGxlTXVzaWMuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmIChhcHBsZU11c2ljQWxidW1SZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19BTEJVTSwgcXVlcnkpO1xuICAgICAgICBpZiAoYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNTb25nUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfU09ORywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVJCSVRSQVJZLCBxdWVyeSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHZpbWVvIGlkIGZyb20gdXJsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXRWaW1lb0lEKHF1ZXJ5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHF1ZXJ5KS50eXBlID09PSBRdWVyeVR5cGUuVklNRU8gP1xuICAgIHF1ZXJ5LnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pLnBvcCgpIDpcbiAgICBudWxsO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlSWQocTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHlvdXR1YmVWaWRlb0lkUmVnZXgudGVzdChxKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVVSTChxOiBzdHJpbmcpIHtcbiAgICByZXR1cm4geW91dHViZVZpZGVvVVJMUmVnZXgudGVzdChxKTtcbiAgfVxufVxuXG5leHBvcnQgeyBRdWVyeVJlc29sdmVyIH07IiwgImltcG9ydCB7IFVzZXIsIFVzZXJSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IFF1ZXJ5VHlwZSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUmVzdWx0RGF0YSB7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgZXh0cmFjdG9yPzogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gIHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsO1xuICB0cmFja3M/OiBUcmFja1tdO1xuICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRoaXMgcGxheSB3YXMgdHJpZ2dlcmVkIGZvciBmaWx0ZXJzIHVwZGF0ZVxuICAgKi9cbiAgZmlsdGVyc1VwZGF0ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGRm1wZWcgYXJncyBwYXNzZWQgdG8gZW5jb2RlclxuICAgKi9cbiAgZW5jb2RlckFyZ3M/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRpbWUgdG8gc2VlayB0byBiZWZvcmUgcGxheWluZ1xuICAgKi9cbiAgc2Vlaz86IG51bWJlcjtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBzdGFydCBwbGF5aW5nIHRoZSBwcm92aWRlZCB0cmFjayBpbW1lZGlhdGVseVxuICAgKi9cbiAgaW1tZWRpYXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlFeHRyYWN0b3JTZWFyY2ggPSBgZXh0OiR7c3RyaW5nfWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgc2VhcmNoXG4gICAqL1xuICByZXF1ZXN0ZWRCeT86IFVzZXJSZXNvbHZhYmxlO1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IHNlYXJjaCBlbmdpbmUsIGNhbiBiZSBleHRyYWN0b3IgbmFtZSB0byB0YXJnZXQgc3BlY2lmaWMgb25lIChjdXN0b20pXG4gICAqL1xuICBzZWFyY2hFbmdpbmU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaDtcbiAgLyoqXG4gICAqIExpc3Qgb2YgdGhlIGV4dHJhY3RvcnMgdG8gYmxvY2tcbiAgICovXG4gIGJsb2NrRXh0cmFjdG9ycz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAgICovXG4gIGlnbm9yZUNhY2hlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICByZXF1ZXN0T3B0aW9ucz86IGFueTtcbiAgLyoqXG4gICAqIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gICAqL1xuICBmYWxsYmFja1NlYXJjaEVuZ2luZT86ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJTZWFyY2hSZXN1bHQge1xuICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICB0cmFja3M6IFRyYWNrW107XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyLCBwcml2YXRlIF9kYXRhOiBTZWFyY2hSZXN1bHREYXRhKSB7XG4gICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRRdWVyeVR5cGUodHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2gpIHtcbiAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UmVxdWVzdGVkQnkodXNlcjogVXNlcikge1xuICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldEV4dHJhY3RvcihleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpIHtcbiAgICB0aGlzLl9kYXRhLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgdGhpcy5fZGF0YS50cmFja3MgPSB0cmFja3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgIHRoaXMuX2RhdGEucXVlcnkgPSBxdWVyeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICB0aGlzLl9kYXRhLnBsYXlsaXN0ID0gcGxheWxpc3Q7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlYXJjaCBxdWVyeVxuICAgKi9cbiAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VhcmNoIHF1ZXJ5IHR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4dHJhY3RvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5leHRyYWN0b3IgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5bGlzdCByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucGxheWxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIHJlc3VsdFxuICAgKi9cbiAgcHVibGljIGdldCB0cmFja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RlZCBieVxuICAgKi9cbiAgcHVibGljIGdldCByZXF1ZXN0ZWRCeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5yZXF1ZXN0ZWRCeSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLWV4ZWN1dGUgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5zZWFyY2godGhpcy5xdWVyeSwge1xuICAgICAgc2VhcmNoRW5naW5lOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5IVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBpcyBlbXB0eVxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuICF0aGlzLnRyYWNrcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGhhc1BsYXlsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICovXG4gIHB1YmxpYyBoYXNUcmFja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNlYXJjaFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVlcnk6IHRoaXMucXVlcnksXG4gICAgICBxdWVyeVR5cGU6IHRoaXMucXVlcnlUeXBlLFxuICAgICAgcGxheWxpc3Q6IHRoaXMucGxheWxpc3Q/LnRvSlNPTihmYWxzZSkgfHwgbnVsbCxcbiAgICAgIHRyYWNrczogdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSksXG4gICAgICBleHRyYWN0b3I6IHRoaXMuZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8IG51bGwsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8udG9KU09OKCkgfHwgbnVsbFxuICAgIH07XG4gIH1cbn0iLCAiZXhwb3J0IHR5cGUgRmlsdGVyc05hbWUgPSBrZXlvZiBRdWV1ZUZpbHRlcnM7XG5cbi8qKlxuICogUmVwcmVzZW50cyBGRm1wZWcgZmlsdGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXVlRmlsdGVycyB7XG4gIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICBiYXNzYm9vc3Q/OiBib29sZWFuO1xuICBiYXNzYm9vc3RfaGlnaD86IGJvb2xlYW47XG4gICc4RCc/OiBib29sZWFuO1xuICB2YXBvcndhdmU/OiBib29sZWFuO1xuICBuaWdodGNvcmU/OiBib29sZWFuO1xuICBwaGFzZXI/OiBib29sZWFuO1xuICB0cmVtb2xvPzogYm9vbGVhbjtcbiAgdmlicmF0bz86IGJvb2xlYW47XG4gIHJldmVyc2U/OiBib29sZWFuO1xuICB0cmVibGU/OiBib29sZWFuO1xuICBub3JtYWxpemVyPzogYm9vbGVhbjtcbiAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICBzdXJyb3VuZGluZz86IGJvb2xlYW47XG4gIHB1bHNhdG9yPzogYm9vbGVhbjtcbiAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICBrYXJhb2tlPzogYm9vbGVhbjtcbiAgZmxhbmdlcj86IGJvb2xlYW47XG4gIGdhdGU/OiBib29sZWFuO1xuICBoYWFzPzogYm9vbGVhbjtcbiAgbWNvbXBhbmQ/OiBib29sZWFuO1xuICBtb25vPzogYm9vbGVhbjtcbiAgbXN0bHI/OiBib29sZWFuO1xuICBtc3Rycj86IGJvb2xlYW47XG4gIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICBleHBhbmRlcj86IGJvb2xlYW47XG4gIHNvZnRsaW1pdGVyPzogYm9vbGVhbjtcbiAgY2hvcnVzPzogYm9vbGVhbjtcbiAgY2hvcnVzMmQ/OiBib29sZWFuO1xuICBjaG9ydXMzZD86IGJvb2xlYW47XG4gIGZhZGVpbj86IGJvb2xlYW47XG4gIGRpbT86IGJvb2xlYW47XG4gIGVhcnJhcGU/OiBib29sZWFuO1xuICBsb2ZpPzogYm9vbGVhbjtcbiAgc2lsZW5jZXJlbW92ZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9GaWx0ZXJzIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZpbHRlcnM6IFJlY29yZDxGaWx0ZXJzTmFtZSwgc3RyaW5nPiA9IHtcbiAgICBiYXNzYm9vc3RfbG93OiBiYXNzKDE1KSxcbiAgICBiYXNzYm9vc3Q6IGJhc3MoMjApLFxuICAgIGJhc3Nib29zdF9oaWdoOiBiYXNzKDMwKSxcbiAgICAnOEQnOiAnYXB1bHNhdG9yPWh6PTAuMDknLFxuICAgIHZhcG9yd2F2ZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjgnLFxuICAgIG5pZ2h0Y29yZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCoxLjI1JyxcbiAgICBsb2ZpOiAnYXJlc2FtcGxlPTQ4MDAwLGFzZXRyYXRlPTQ4MDAwKjAuOSxleHRyYXN0ZXJlbz1tPTIuNTpjPWRpc2FibGVkJyxcbiAgICBwaGFzZXI6ICdhcGhhc2VyPWluX2dhaW49MC40JyxcbiAgICB0cmVtb2xvOiAndHJlbW9sbycsXG4gICAgdmlicmF0bzogJ3ZpYnJhdG89Zj02LjUnLFxuICAgIHJldmVyc2U6ICdhcmV2ZXJzZScsXG4gICAgdHJlYmxlOiAndHJlYmxlPWc9NScsXG4gICAgbm9ybWFsaXplcjI6ICdkeW5hdWRub3JtPWc9MTAxJyxcbiAgICBub3JtYWxpemVyOiAnYWNvbXByZXNzb3InLFxuICAgIHN1cnJvdW5kaW5nOiAnc3Vycm91bmQnLFxuICAgIHB1bHNhdG9yOiAnYXB1bHNhdG9yPWh6PTEnLFxuICAgIHN1YmJvb3N0OiAnYXN1YmJvb3N0JyxcbiAgICBrYXJhb2tlOiAnc3RlcmVvdG9vbHM9bWxldj0wLjAzJyxcbiAgICBmbGFuZ2VyOiAnZmxhbmdlcicsXG4gICAgZ2F0ZTogJ2FnYXRlJyxcbiAgICBoYWFzOiAnaGFhcycsXG4gICAgbWNvbXBhbmQ6ICdtY29tcGFuZCcsXG4gICAgbW9ubzogJ3Bhbj1tb25vfGMwPS41KmMwKy41KmMxJyxcbiAgICBtc3RscjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+bHInLFxuICAgIG1zdHJyOiAnc3RlcmVvdG9vbHM9bW9kZT1tcz5ycicsXG4gICAgY29tcHJlc3NvcjogJ2NvbXBhbmQ9cG9pbnRzPS04MC8tMTA1fC02Mi8tODB8LTE1LjQvLTE1LjR8MC8tMTJ8MjAvLTcuNicsXG4gICAgZXhwYW5kZXI6XG4gICAgJ2NvbXBhbmQ9YXR0YWNrcz0wOnBvaW50cz0tODAvLTE2OXwtNTQvLTgwfC00OS41Ly02NC42fC00MS4xLy00MS4xfC0yNS44Ly0xNXwtMTAuOC8tNC41fDAvMHwyMC84LjMnLFxuICAgIHNvZnRsaW1pdGVyOlxuICAgICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy04MHwtMTIuNC8tMTIuNHwtNi8tOHwwLy02Ljh8MjAvLTIuOCcsXG4gICAgY2hvcnVzOiAnY2hvcnVzPTAuNzowLjk6NTU6MC40OjAuMjU6MicsXG4gICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgY2hvcnVzM2Q6ICdjaG9ydXM9MC41OjAuOTo1MHw2MHw0MDowLjR8MC4zMnwwLjM6MC4yNXwwLjR8MC4zOjJ8Mi4zfDEuMycsXG4gICAgZmFkZWluOiAnYWZhZGU9dD1pbjpzcz0wOmQ9MTAnLFxuICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgIGVhcnJhcGU6ICdjaGFubmVsc3BsaXQsc2lkZWNoYWluZ2F0ZT1sZXZlbF9pbj02NCcsXG4gICAgc2lsZW5jZXJlbW92ZTogJ3NpbGVuY2VyZW1vdmU9MTowOi01MGRCJ1xuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnNbbmFtZV0gPz8gbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaGFzPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8e1xuICAgIG5hbWU6IEZpbHRlcnNOYW1lO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpbHRlcnMpKSB7XG4gICAgICB5aWVsZCB7IG5hbWU6IGsgYXMgRmlsdGVyc05hbWUsIHZhbHVlOiB2IGFzIHN0cmluZyB9O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IG5hbWVzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpIGFzIEZpbHRlcnNOYW1lW107XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLm1hcCgobSkgPT4gKHRoaXMgYXMgYW55KVttXSkuam9pbignLCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZmZtcGVnIGFyZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbHRlcnMgbmFtZVxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgbmFtZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGU8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihmaWx0ZXJzPzogKEsgfCBzdHJpbmcpW10pIHtcbiAgICBpZiAoIWZpbHRlcnMgfHwgIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGZpbHRlcnMuXG4gICAgZmlsdGVyKChwcmVkaWNhdGUpID0+IHR5cGVvZiBwcmVkaWNhdGUgPT09ICdzdHJpbmcnKS5cbiAgICBtYXAoKG0pID0+IHRoaXMuZ2V0KG0gYXMgSykpLlxuICAgIGpvaW4oJywnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGF1ZGlvIGZpbHRlclxuICAgKiBAcGFyYW0gZmlsdGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsdGVyXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZmZtcGVnIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVmaW5lKGZpbHRlck5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZmlsdGVyc1tmaWx0ZXJOYW1lIGFzIEZpbHRlcnNOYW1lXSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgbXVsdGlwbGUgYXVkaW8gZmlsdGVyc1xuICAgKiBAcGFyYW0gZmlsdGVyc0FycmF5IEFycmF5IG9mIGZpbHRlcnMgY29udGFpbmluZyB0aGUgZmlsdGVyIG5hbWUgYW5kIGZmbXBlZyBhcmdzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZmluZUJ1bGsoZmlsdGVyc0FycmF5OiB7bmFtZTogc3RyaW5nO3ZhbHVlOiBzdHJpbmc7fVtdKSB7XG4gICAgZmlsdGVyc0FycmF5LmZvckVhY2goKGFycikgPT4gdGhpcy5kZWZpbmUoYXJyLm5hbWUsIGFyci52YWx1ZSkpO1xuICB9XG59IiwgImltcG9ydCB7IERlZmF1bHRMaXN0ZW5lciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBMaXN0ZW5lclNpZ25hdHVyZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXJFdmVudHNFbWl0dGVyPFxuICBMIGV4dGVuZHMgTGlzdGVuZXJTaWduYXR1cmU8TD4gPSBEZWZhdWx0TGlzdGVuZXI+IGV4dGVuZHNcbkV2ZW50RW1pdHRlcjxMPiB7XG4gICNoYXNEZWJ1Z2dlciA9IGZhbHNlO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlcXVpcmVkRXZlbnRzOiBBcnJheTxrZXlvZiBMPiA9IFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgb25jZTxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5hZGRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgb2ZmPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgcmV0dXJuIHN1cGVyLm9mZihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICByZXR1cm4gc3VwZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVyczxLIGV4dGVuZHMga2V5b2YgTD4obmFtZT86IEspIHtcbiAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgIHJldHVybiBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgLi4uYXJnczogUGFyYW1ldGVyczxMW0tdPikge1xuICAgIGlmIChcbiAgICB0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmXG4gICAgIXRoaXMuZXZlbnROYW1lcygpLmluY2x1ZGVzKG5hbWUpKVxuICAgIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuICAgICAgVXRpbC53YXJuKFxuICAgICAgICBgTm8gZXZlbnQgbGlzdGVuZXIgZm91bmQgZm9yIGV2ZW50IFwiJHtTdHJpbmcoXG4gICAgICAgICAgbmFtZVxuICAgICAgICApfVwiLiBFdmVudHMgJHt0aGlzLnJlcXVpcmVkRXZlbnRzLlxuICAgICAgICBtYXAoKG0pID0+IGBcIiR7U3RyaW5nKG0pfVwiYCkuXG4gICAgICAgIGpvaW4oJywgJyl9IG11c3QgaGF2ZSBldmVudCBsaXN0ZW5lcnMuYCxcbiAgICAgICAgJ1VuaGFuZGxlZEV2ZW50c1dhcm5pbmcnXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5lbWl0KG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNEZWJ1Z2dlcigpIHtcbiAgICByZXR1cm4gdGhpcy4jaGFzRGVidWdnZXI7XG4gIH1cbn0iLCAiaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBOb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFBsYXllckV2ZW50cyB9IGZyb20gJy4uL1BsYXllcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvclN0cmVhbWFibGUgPVxuUmVhZGFibGUgfFxuc3RyaW5nIHxcbntcbiAgJGZtdDogc3RyaW5nO1xuICBzdHJlYW06IFJlYWRhYmxlO1xufTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAvKipcbiAgICogSWRlbnRpZmllciBmb3IgdGhpcyBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWRlbnRpZmllciA9ICdjb20uZGlzY29yZC1wbGF5ZXIuZXh0cmFjdG9yJztcblxuICAvKipcbiAgICogUHJpb3JpdHkgb2YgdGhpcyBleHRyYWN0b3IuIEhpZ2hlciB2YWx1ZSBtZWFucyBoaWdoZXIgcHJpb3JpdHkgKHdpbGwgYmUgZXhlY3V0ZWQgZmlyc3QpLlxuICAgKi9cbiAgcHVibGljIHByaW9yaXR5ID0gMTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHF1ZXJ5IHByb3RvY29scyB0aGF0IHRoaXMgZXh0cmFjdG9yIHN1cHBvcnRzLlxuICAgKi9cbiAgcHVibGljIHByb3RvY29sczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogSGFuZGxlIGJyaWRnZSBxdWVyeSBjcmVhdGlvblxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJ1aWxkIHF1ZXJ5IGZvclxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUJyaWRnZVF1ZXJ5ID0gKHRyYWNrOiBUcmFjaykgPT5cbiAgYCR7dHJhY2sudGl0bGV9IGJ5ICR7dHJhY2suYXV0aG9yfSBvZmZpY2lhbCBhdWRpb2A7XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RvciBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBwdWJsaWMgb3B0aW9uczogVCA9IDxUPiB7fSlcbiAge31cblxuICAvKipcbiAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBpZGVudGlmaWVyKCkge1xuICAgIHJldHVybiAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQmFzZUV4dHJhY3RvcikuaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbmZpZ3VyZXMgdGhpcyBleHRyYWN0b3JcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG5ldyBvcHRpb25zIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjb25maWd1cmUob3B0aW9uczogVCkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgYXdhaXQgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgYXdhaXQgdGhpcy5hY3RpdmF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgIC8vIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaW5jb21pbmcgcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKFxuICBxdWVyeTogc3RyaW5nLFxuICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbClcbiAgOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB2b2lkIHR5cGU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICogQHBhcmFtIGluZm8gVGhlIHRyYWNrIHRvIHN0cmVhbVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN0cmVhbShpbmZvOiBUcmFjayk6IFByb21pc2U8RXh0cmFjdG9yU3RyZWFtYWJsZT4ge1xuICAgIHZvaWQgaW5mbztcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnN0cmVhbSgpYCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSBnaXZlbiBxdWVyeVxuICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIGhhbmRsZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmRsZShcbiAgcXVlcnk6IHN0cmluZyxcbiAgY29udGV4dDogRXh0cmFjdG9yU2VhcmNoQ29udGV4dClcbiAgOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICB2b2lkIGNvbnRleHQ7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5oYW5kbGUoKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWxhdGVkIHRyYWNrcyBmb3IgdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgc291cmNlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRlZFRyYWNrcyhcbiAgdHJhY2s6IFRyYWNrLFxuICBoaXN0b3J5OiBHdWlsZFF1ZXVlSGlzdG9yeSlcbiAgOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICB2b2lkIHRyYWNrO1xuICAgIHZvaWQgaGlzdG9yeTtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZ2V0UmVsYXRlZFRyYWNrcygpYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQSBzdHJlYW0gbWlkZGxld2FyZSB0byBoYW5kbGUgc3RyZWFtcyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGluY29taW5nIHN0cmVhbVxuICAgKiBAcGFyYW0gbmV4dCBUaGUgbmV4dCBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIGhhbmRsZVBvc3RTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIG5leHQobnVsbCwgc3RyZWFtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZGlzcGF0Y2hcbiAgICogQHBhcmFtIGFyZ3MgVGhlIGRhdGEgdG8gZGlzcGF0Y2hcbiAgICovXG4gIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBQbGF5ZXJFdmVudHM+KFxuICBldmVudDogSyxcbiAgLi4uYXJnczogUGFyYW1ldGVyczxQbGF5ZXJFdmVudHNbS10+KVxuICB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGV4dHJhY3RvciByZXNwb25zZVxuICAgKiBAcGFyYW0gcGxheWxpc3QgVGhlIHBsYXlsaXN0XG4gICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUmVzcG9uc2UoXG4gIHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsLFxuICB0cmFja3M6IFRyYWNrW10gPSBwbGF5bGlzdD8udHJhY2tzIHx8IFtdKVxuICA6IEV4dHJhY3RvckluZm8ge1xuICAgIHJldHVybiB7IHBsYXlsaXN0OiBwbGF5bGlzdCB8fCBudWxsLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBkZWJ1ZyBtZXNzYWdlXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAqL1xuICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZGVidWcobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQSBmbGFnIHRvIGluZGljYXRlIGBEZW11eGFibGVgIHN0cmVhbSBzdXBwb3J0IGZvciBgb3B1c2AvYG9nZy9vcHVzYC9gd2VibS9vcHVzYCBmb3JtYXRzLlxuICAgKi9cbiAgcHVibGljIGdldCBzdXBwb3J0c0RlbXV4KCkge1xuICAgIHJldHVybiAhIXRoaXMuY29udGV4dC5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdHJlYW0gZXh0cmFjdGlvbiBmb3IgYW5vdGhlciBleHRyYWN0b3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBicmlkZ2VcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJyaWRnZShcbiAgdHJhY2s6IFRyYWNrLFxuICBzb3VyY2VFeHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsKVxuICA6IFByb21pc2U8RXh0cmFjdG9yU3RyZWFtYWJsZSB8IG51bGw+IHtcbiAgICB2b2lkIHNvdXJjZUV4dHJhY3RvcjtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXh0RnVuY3Rpb24gPSAoZXJyb3I/OiBFcnJvciB8IG51bGwsIHN0cmVhbT86IFJlYWRhYmxlKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckluZm8ge1xuICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICB0cmFja3M6IFRyYWNrW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yU2VhcmNoQ29udGV4dCB7XG4gIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsO1xuICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICByZXF1ZXN0T3B0aW9ucz86IFJlcXVlc3RPcHRpb25zO1xuICBwcm90b2NvbD86IHN0cmluZyB8IG51bGw7XG59IiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IsIEV4dHJhY3RvclN0cmVhbWFibGUgfSBmcm9tICcuL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi4vaG9va3MnO1xuaW1wb3J0IHsgQnJpZGdlRmFpbGVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlc3Npb24ge1xuICBpZDogc3RyaW5nO1xuICBhdHRlbXB0ZWRFeHRyYWN0b3JzOiBTZXQ8c3RyaW5nPjtcbiAgYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9yczogU2V0PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uRXZlbnRzIHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIGV4dHJhY3RvciB3YXMgcmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgcmVnaXN0ZXJlZDogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgdW5yZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIGV4dHJhY3RvciB3YXMgdW5yZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyB1bnJlZ2lzdGVyZWRcbiAgICovXG4gIHVucmVnaXN0ZXJlZDogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBhY3RpdmF0ZWRcbiAgICovXG4gIGFjdGl2YXRlOiAoXG4gIGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsXG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcilcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgZGVhY3RpdmF0ZWRcbiAgICovXG4gIGRlYWN0aXZhdGU6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGZhaWxzIHRvIGFjdGl2YXRlL2RlYWN0aXZhdGVcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBlcnJvcjogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsXG4gIGVycm9yOiBFcnJvcilcbiAgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgc3RvcmVcbiAgICovXG4gIHB1YmxpYyBzdG9yZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgQmFzZUV4dHJhY3Rvcj4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8RXh0cmFjdG9yU2Vzc2lvbj4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7XG4gICAgc3VwZXIoWydlcnJvciddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGlkXG4gICAqL1xuICBwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCk/LmlkID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbnN1bWUoKSA/PyBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWREZWZhdWx0KCkge1xuICAgIGNvbnN0IHNhbXBsZSA9IGBcXHRpbXBvcnQgeyBEZWZhdWx0RXh0cmFjdG9ycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xcblxcdGF3YWl0IHBsYXllci5leHRyYWN0b3JzLmxvYWRNdWx0aShEZWZhdWx0RXh0cmFjdG9ycyk7YDtcblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBleHRyYWN0b3JzLmxvYWREZWZhdWx0KCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIGV4dHJhY3RvcnMubG9hZE11bHRpIGluc3RlYWQuIEV4YW1wbGU6XFxuJHtzYW1wbGV9XFxuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIGJ1bmRsZSBvZiBleHRyYWN0b3JzLlxuICAgKiBAZXhhbXBsZSBpbXBvcnQgeyBEZWZhdWx0RXh0cmFjdG9ycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xuICAgKlxuICAgKiBhd2FpdCBwbGF5ZXIuZXh0cmFjdG9ycy5sb2FkTXVsdGkoRGVmYXVsdEV4dHJhY3RvcnMpO1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRNdWx0aTxcbiAgICBPIGV4dGVuZHMgb2JqZWN0LFxuICAgIFQgZXh0ZW5kcyAodHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4pW10sXG4gICAgUiBleHRlbmRzIFJlY29yZDxcbiAgICAgIFRbbnVtYmVyXVsnaWRlbnRpZmllciddLFxuICAgICAgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFRbbnVtYmVyXT5bMV0+PihcblxuICBidW5kbGU6IFQsIG9wdGlvbnM6IFIgPSB7fSBhcyBSKSB7XG4gICAgYnVuZGxlLmZvckVhY2goKGV4dCkgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5yZWdpc3RlcihleHQsIG9wdGlvbnM/LltleHQuaWRlbnRpZmllcl0gfHwge30pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZXJyb3I6IG51bGwgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBpZiB0aGUgZ2l2ZW4gZXh0cmFjdG9yIGlzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGV4dHJhY3RvciBpZGVudGlmaWVyXG4gICAqL1xuICBwdWJsaWMgaXNSZWdpc3RlcmVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaW5nbGUgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgdG8gZ2V0XG4gICAqL1xuICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBzdXBwbGllZCB0byB0aGUgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXI8TyBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+PihcbiAgX2V4dHJhY3RvcjogVCxcbiAgb3B0aW9uczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFQ+WycxJ10pXG4gIDogUHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPiB7XG4gICAgaWYgKFxuICAgIHR5cGVvZiBfZXh0cmFjdG9yLmlkZW50aWZpZXIgIT09ICdzdHJpbmcnIHx8XG4gICAgdGhpcy5zdG9yZS5oYXMoX2V4dHJhY3Rvci5pZGVudGlmaWVyKSlcblxuICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBfZXh0cmFjdG9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3RvcmUuc2V0KF9leHRyYWN0b3IuaWRlbnRpZmllciwgZXh0cmFjdG9yKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGxvYWRlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgncmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICBhd2FpdCBleHRyYWN0b3IuYWN0aXZhdGUoKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGFjdGl2YXRlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgnYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgcmV0dXJuIGV4dHJhY3RvciBhcyB1bmtub3duIGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnN0b3JlLmRlbGV0ZShfZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoXG4gICAgICAgIGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBhY3RpdmF0ZSEgRXJyb3I6ICR7ZX1gXG4gICAgICApO1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gdW5yZWdpc3RlclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXI8SyBleHRlbmRzIHN0cmluZyB8IEJhc2VFeHRyYWN0b3I+KF9leHRyYWN0b3I6IEspIHtcbiAgICBjb25zdCBleHRyYWN0b3IgPVxuICAgIHR5cGVvZiBfZXh0cmFjdG9yID09PSAnc3RyaW5nJyA/XG4gICAgdGhpcy5zdG9yZS5nZXQoX2V4dHJhY3RvcikgOlxuICAgIHRoaXMuc3RvcmUuZmluZCgocikgPT4gciA9PT0gX2V4dHJhY3Rvcik7XG4gICAgaWYgKCFleHRyYWN0b3IpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXkgPVxuICAgICAgZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgdGhpcy5zdG9yZS5maW5kS2V5KChlKSA9PiBlID09PSBleHRyYWN0b3IpITtcbiAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRpc2FibGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCd1bnJlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgYXdhaXQgZXh0cmFjdG9yLmRlYWN0aXZhdGUoKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGVhY3RpdmF0ZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ2RlYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICBgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBkZWFjdGl2YXRlIWBcbiAgICAgICk7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBhbGwgZXh0cmFjdG9yc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJBbGwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuc3RvcmUubWFwKChlKSA9PiB0aGlzLnVucmVnaXN0ZXIoZSkpKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFJ1biBhbGwgdGhlIGV4dHJhY3RvcnNcbiAgICogQHBhcmFtIGZuIFRoZSBydW5uZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIGZpbHRlckJsb2NrZWQgRmlsdGVyIGJsb2NrZWQgZXh0cmFjdG9yc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJ1bjxUID0gdW5rbm93bj4oXG4gIGZuOiBFeHRyYWN0b3JFeGVjdXRpb25GTjxUPixcbiAgZmlsdGVyQmxvY2tlZCA9IHRydWUpXG4gIHtcbiAgICBjb25zdCBibG9ja2VkID0gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz8gW107XG5cbiAgICBpZiAoIXRoaXMuc3RvcmUuc2l6ZSkge1xuICAgICAgVXRpbC53YXJuKFxuICAgICAgICAnU2tpcHBpbmcgZXh0cmFjdG9ycyBleGVjdXRpb24gc2luY2UgemVybyBleHRyYWN0b3JzIHdlcmUgcmVnaXN0ZXJlZCcsXG4gICAgICAgICdOb0V4dHJhY3RvcnMnXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNvcnQgYnkgcHJpb3JpdHkgc28gdGhhdCBleHRyYWN0b3JzIHdpdGggaGlnaGVyIHByaW9yaXR5IGFyZSBleGVjdXRlZCBmaXJzdFxuICAgIGNvbnN0IGV4dHJhY3RvcnMgPSB0aGlzLnN0b3JlLnNvcnQoKGEsIGIpID0+IGIucHJpb3JpdHkgLSBhLnByaW9yaXR5KTtcblxuICAgIGxldCBlcnI6IEVycm9yIHwgbnVsbCA9IG51bGwsXG4gICAgICBsYXN0RXh0OiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRyYWN0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZmlsdGVyQmxvY2tlZCAmJiBibG9ja2VkLnNvbWUoKGUpID0+IGUgPT09IGV4dC5pZGVudGlmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfS4uLmApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oZXh0KS50aGVuKFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSxcbiAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoXG4gICAgICAgICAgICBgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB3aXRoIGVycm9yOiAke2V9YFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gVHlwZVV0aWwuaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoYCR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgbGFzdEV4dCA9IGV4dDtcblxuICAgICAgaWYgKHJlc3VsdCAmJiAhVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoXG4gICAgICAgICAgYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBleGVjdXRlZCBzdWNjZXNzZnVsbHkhYFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXh0cmFjdG9yOiBleHQsXG4gICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgcmVzdWx0XG4gICAgICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQ+O1xuICAgICAgfSBlbHNlIGlmIChUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgZXJyID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnIpXG4gICAgcmV0dXJuIHtcbiAgICAgIGV4dHJhY3RvcjogbGFzdEV4dCEsXG4gICAgICBlcnJvcjogZXJyLFxuICAgICAgcmVzdWx0OiBmYWxzZVxuICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PGZhbHNlPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGJyaWRnZSBmb3IgYSB0cmFja1xuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlcXVlc3QgYnJpZGdlIGZvclxuICAgKiBAcGFyYW0gc291cmNlRXh0cmFjdG9yIFRoZSBzb3VyY2UgZXh0cmFjdG9yIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RCcmlkZ2UoXG4gIHRyYWNrOiBUcmFjayxcbiAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IHRyYWNrLmV4dHJhY3RvcilcbiAge1xuICAgIGNvbnN0IHByZXZpb3VzbHlBdHRlbXB0ZWQgPVxuICAgIHRoaXMuZ2V0Q29udGV4dCgpPy5icmlkZ2VBdHRlbXB0ZWRFeHRyYWN0b3JzID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW48RXh0cmFjdG9yU3RyZWFtYWJsZT4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgaWYgKHNvdXJjZUV4dHJhY3RvciAmJiBleHQuaWRlbnRpZmllciA9PT0gc291cmNlRXh0cmFjdG9yLmlkZW50aWZpZXIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocHJldmlvdXNseUF0dGVtcHRlZC5oYXMoZXh0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHByZXZpb3VzbHlBdHRlbXB0ZWQuYWRkKGV4dC5pZGVudGlmaWVyKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXh0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcblxuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0Py5yZXN1bHQpXG4gICAgdGhyb3cgbmV3IEJyaWRnZUZhaWxlZEVycm9yKFxuICAgICAgdGhpcy5nZXRFeGVjdXRpb25JZCgpLFxuICAgICAgcmVzdWx0Py5lcnJvcj8uc3RhY2sgfHxcbiAgICAgIHJlc3VsdD8uZXJyb3I/Lm1lc3NhZ2UgfHxcbiAgICAgICdObyBleHRyYWN0b3JzIGF2YWlsYWJsZSB0byBicmlkZ2UnXG4gICAgKTtcblxuICAgIHRyYWNrLmJyaWRnZWRFeHRyYWN0b3IgPSByZXN1bHQuZXh0cmFjdG9yO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGJyaWRnZSBmcm9tIHRoZSBzcGVjaWZpZWQgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVxdWVzdCBicmlkZ2UgZm9yXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3Igb2YgdGhlIHRyYWNrXG4gICAqIEBwYXJhbSB0YXJnZXRFeHRyYWN0b3IgVGhlIHRhcmdldCBleHRyYWN0b3IgdG8gYnJpZGdlIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdEJyaWRnZUZyb20oXG4gIHRyYWNrOiBUcmFjayxcbiAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCxcbiAgdGFyZ2V0RXh0cmFjdG9yOiBFeHRyYWN0b3JSZXNvbHZhYmxlKVxuICB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlKHRhcmdldEV4dHJhY3Rvcik7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0YXJnZXQuYnJpZGdlKHRyYWNrLCBzb3VyY2VFeHRyYWN0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGV4dHJhY3RvciBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcHVibGljIGlzRGlzYWJsZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhpZGVudGlmaWVyKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBleHRyYWN0b3IgaXMgZW5hYmxlZFxuICAgKi9cbiAgcHVibGljIGlzRW5hYmxlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNEaXNhYmxlZChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGV4dHJhY3RvciBpZGVudGlmaWVyXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZUlkKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gcmVzb2x2YWJsZSA6IHJlc29sdmFibGUuaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIHJlc29sdmUocmVzb2x2YWJsZTogRXh0cmFjdG9yUmVzb2x2YWJsZSkge1xuICAgIHJldHVybiB0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycgPyB0aGlzLmdldChyZXNvbHZhYmxlKSA6IHJlc29sdmFibGU7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VCA9IHVua25vd24+IHtcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yO1xuICBlcnJvcjogRXJyb3IgfCBudWxsO1xuICByZXN1bHQ6IFQ7XG59XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvckV4ZWN1dGlvbkZOPFQgPSB1bmtub3duPiA9IChcbmV4dHJhY3RvcjogQmFzZUV4dHJhY3Rvcilcbj0+IFByb21pc2U8VCB8IGJvb2xlYW4+O1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JSZXNvbHZhYmxlID0gc3RyaW5nIHwgQmFzZUV4dHJhY3RvcjsiLCAiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnR5cGUgdW5zYWZlID0gYW55O1xuXG4vKipcbiAqIFRoZSByZWNlaXZlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRleHQgaXMgcHJvdmlkZWRcbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dFJlY2VpdmVyPFI+ID0gKCkgPT4gUjtcblxuZXhwb3J0IGNsYXNzIENvbnRleHQ8VD4ge1xuICBwcml2YXRlIHN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VD4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBkZWZhdWx0VmFsdWU/OiBUKSB7fVxuXG4gIC8qKlxuICAgKiBFeGl0IG91dCBvZiB0aGlzIGNvbnRleHRcbiAgICovXG4gIHB1YmxpYyBleGl0KHNjb3BlOiBDb250ZXh0UmVjZWl2ZXI8dm9pZD4pIHtcbiAgICB0aGlzLnN0b3JhZ2UuZXhpdChzY29wZSk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY29udGV4dCBpcyBsb3N0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTG9zdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldFN0b3JlKCkgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIGxvc3QgYW5kIG5vIGRlZmF1bHQgdmFsdWUgaXMgcHJvdmlkZWQsIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxuICAgKi9cbiAgcHVibGljIGNvbnN1bWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpO1xuXG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIHByb3ZpZGVyXG4gICAqL1xuICBwdWJsaWMgcHJvdmlkZTxSID0gdW5zYWZlPih2YWx1ZTogVCwgcmVjZWl2ZXI6IENvbnRleHRSZWNlaXZlcjxSPik6IFIge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgdmFsdWUgbWF5IG5vdCBiZSB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlY2VpdmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgcmVjZWl2ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5ydW4odmFsdWUsIHJlY2VpdmVyKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBjb250ZXh0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBvcHRpb25hbC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvbnRleHRcbiAqIEBleGFtcGxlIGNvbnN0IHVzZXJDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuICpcbiAqICAvLyB0aGUgdmFsdWUgdG8gcHJvdmlkZVxuICogIGNvbnN0IHVzZXIgPSB7XG4gKiAgIGlkOiAxLFxuICogICBuYW1lOiAnSm9obiBEb2UnXG4gKiAgfTtcbiAqXG4gKiAgLy8gcHJvdmlkZSB0aGUgY29udGV4dCB2YWx1ZSB0byB0aGUgcmVjZWl2ZXJcbiAqICBjb250ZXh0LnByb3ZpZGUodXNlciwgaGFuZGxlcik7XG4gKlxuICogIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gKiAgICAvLyBnZXQgdGhlIGNvbnRleHQgdmFsdWVcbiAqICAgIGNvbnN0IHsgaWQsIG5hbWUgfSA9IHVzZUNvbnRleHQoY29udGV4dCk7XG4gKlxuICogICAgY29uc29sZS5sb2coaWQsIG5hbWUpOyAvLyAxLCBKb2huIERvZVxuICogIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VCA9IHVuc2FmZT4oZGVmYXVsdFZhbHVlPzogVCk6IENvbnRleHQ8VD4ge1xuICByZXR1cm4gbmV3IENvbnRleHQoZGVmYXVsdFZhbHVlKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIGxvc3QgYW5kIG5vIGRlZmF1bHQgdmFsdWUgaXMgcHJvdmlkZWQsIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tXG4gKiBAZXhhbXBsZSBjb25zdCB2YWx1ZSA9IHVzZUNvbnRleHQoY29udGV4dCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDb250ZXh0PFQgPSB1bnNhZmU+KGNvbnRleHQ6IENvbnRleHQ8VD4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRleHQuY29uc3VtZSgpO1xufSIsICJpbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCB1bmtub3duPigpOyIsICJpbXBvcnQgeyBnbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxSZWdpc3RyeSgpIHtcbiAgcmV0dXJuIGdsb2JhbFJlZ2lzdHJ5O1xufSIsICJpbXBvcnQgeyBHdWlsZCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQvYXN5bmMtY29udGV4dCc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9va3NDdHgge1xuICBndWlsZDogR3VpbGQ7XG59XG5cbmV4cG9ydCBjb25zdCBTVVBFUl9DT05URVhUID0gY3JlYXRlQ29udGV4dDxQbGF5ZXI+KCk7XG5cbmNvbnN0IGdldEZhbGxiYWNrQ29udGV4dCA9ICgpID0+IHtcbiAgcmV0dXJuIGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW3BsYXllcl0nKSBhcyBQbGF5ZXIgfCB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIb29rc0NvbnRleHQoaG9va05hbWU6IHN0cmluZywgbWFpbk9ubHkgPSBmYWxzZSkge1xuICBsZXQgaXNGYWxsYmFjayA9IGZhbHNlO1xuXG4gIGxldCBwbGF5ZXI6IFBsYXllciB8IHVuZGVmaW5lZDtcblxuICBpZiAoIShwbGF5ZXIgPSBTVVBFUl9DT05URVhULmNvbnN1bWUoKSkpIHtcbiAgICBwbGF5ZXIgPSBnZXRGYWxsYmFja0NvbnRleHQoKTtcbiAgICBpc0ZhbGxiYWNrID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghcGxheWVyKVxuICB0aHJvdyBuZXcgSWxsZWdhbEhvb2tJbnZvY2F0aW9uRXJyb3IoXG4gICAgJ2Rpc2NvcmQtcGxheWVyJyxcbiAgICBgUGxheWVyIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSwgJHtcbiAgICBpc0ZhbGxiYWNrID9cbiAgICAnZGlkIHlvdSBmb3JnZXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGxheWVyIHdpdGggYG5ldyBQbGF5ZXIoY2xpZW50KWA/JyA6XG4gICAgJ2lzIGl0IGJlaW5nIGNhbGxlZCBpbnNpZGUgPFBsYXllcj4uY29udGV4dC5wcm92aWRlKCk/J31gXG5cbiAgKTtcblxuICBpZiAobWFpbk9ubHkpIHJldHVybiB7IHBsYXllciwgY29udGV4dDoge30gYXMgSG9va3NDdHgsIGlzRmFsbGJhY2sgfTtcblxuICBsZXQgY29udGV4dDogSG9va3NDdHggfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCFpc0ZhbGxiYWNrKSB7XG4gICAgY29udGV4dCA9IHVzZUNvbnRleHQocGxheWVyLmNvbnRleHQpO1xuICAgIGlmICghY29udGV4dClcbiAgICB0aHJvdyBuZXcgSWxsZWdhbEhvb2tJbnZvY2F0aW9uRXJyb3IoXG4gICAgICBob29rTmFtZSxcbiAgICAgIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dCBjcmVhdGVkIGJ5IDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpYFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dCA9IHtcbiAgICAgIGdldCBndWlsZCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICAgICAgIGhvb2tOYW1lLFxuICAgICAgICAgIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGV4cGxpY2l0IGd1aWxkIGFyZ3VtZW50IHdoZW4gbm90IGluc2lkZSBhIHBsYXllciBjb250ZXh0YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gYXMgdW5rbm93biBhcyBIb29rc0N0eDtcbiAgfVxuXG4gIHJldHVybiB7IGNvbnRleHQsIHBsYXllciwgaXNGYWxsYmFjayB9O1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgaGlzdG9yeVxuICogQHBhcmFtIG5vZGUgZ3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4oXG5ub2RlOiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGwge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VIaXN0b3J5Jyk7XG5cbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxNZXRhPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gcXVldWUuaGlzdG9yeTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUsIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIHBsYXllciBub2RlXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4oXG5ub2RlOiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4oXG5ub2RlPzogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVBsYXllcicpO1xuICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0PE1ldGE+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBxdWV1ZS5ub2RlO1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZS5cbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZS4gRGVmYXVsdHMgdG8gaW5mZXJyZWQgZ3VpbGQgZnJvbSBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPihcbm5vZGU6IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oXG5ub2RlPzogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlUXVldWUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLnJlc29sdmU8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlO1xufSIsICJpbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1haW5QbGF5ZXIoKSB7XG4gIGNvbnN0IHsgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1haW5QbGF5ZXInLCB0cnVlKTtcblxuICByZXR1cm4gcGxheWVyO1xufSIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgdHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcbmV4cG9ydCB0eXBlIE1ldGFkYXRhRGlzcGF0Y2g8VD4gPSByZWFkb25seSBbXG4gICgpID0+IFQsXG4gIChtZXRhZGF0YTogVCB8IFNldHRlckZOPFQsIFQ+KSA9PiB2b2lkXTtcblxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgZ3VpbGQgcXVldWUgbWV0YWRhdGFcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KCk6IE1ldGFkYXRhRGlzcGF0Y2g8VD47XG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IE1ldGFkYXRhRGlzcGF0Y2g8VD47XG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBNZXRhZGF0YURpc3BhdGNoPFQ+IHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlTWV0YWRhdGEnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxUPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBjb25zdCBzZXR0ZXIgPSAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4ge1xuICAgIGlmIChxdWV1ZSkge1xuICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24obWV0YWRhdGEpKVxuICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKHF1ZXVlLm1ldGFkYXRhKSk7XG4gICAgICByZXR1cm4gcXVldWUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHF1ZXVlPy5tZXRhZGF0YSBhcyBUO1xuICB9O1xuXG4gIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufSIsICJpbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSwgUGxheWVyVGltZXN0YW1wIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnMge1xuICBpZ25vcmVGaWx0ZXJzOiBib29sZWFuO1xuICBub2RlOiBOb2RlUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlVGltZWxpbmUge1xuICByZWFkb25seSB0aW1lc3RhbXA6IFBsYXllclRpbWVzdGFtcDtcbiAgcmVhZG9ubHkgdm9sdW1lOiBudW1iZXI7XG4gIHJlYWRvbmx5IHBhdXNlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdHJhY2s6IFRyYWNrPHVua25vd24+IHwgbnVsbDtcbiAgcGF1c2UoKTogYm9vbGVhbjtcbiAgcmVzdW1lKCk6IGJvb2xlYW47XG4gIHNldFZvbHVtZSh2b2w6IG51bWJlcik6IGJvb2xlYW47XG4gIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBjdXJyZW50IHRyYWNrXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aW1lbGluZSBkaXNwYXRjaGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZSgpOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKFxub3B0aW9uczogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPilcbjogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShcbm9wdGlvbnM/OiBQYXJ0aWFsPFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnM+KVxuOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlVGltZWxpbmUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldChvcHRpb25zPy5ub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0aW1lbGluZSA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7XG4gICAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmdldFRpbWVzdGFtcChvcHRpb25zPy5pZ25vcmVGaWx0ZXJzKSE7XG4gICAgfSxcbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUudm9sdW1lO1xuICAgIH0sXG4gICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmlzUGF1c2VkKCk7XG4gICAgfSxcbiAgICBnZXQgdHJhY2soKSB7XG4gICAgICByZXR1cm4gcXVldWUuY3VycmVudFRyYWNrO1xuICAgIH0sXG4gICAgcGF1c2UoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5wYXVzZSgpO1xuICAgIH0sXG4gICAgcmVzdW1lKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucmVzdW1lKCk7XG4gICAgfSxcbiAgICBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2wpO1xuICAgIH0sXG4gICAgYXN5bmMgc2V0UG9zaXRpb24odGltZTogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZWVrKHRpbWUpO1xuICAgIH1cbiAgfSBzYXRpc2ZpZXMgR3VpbGRRdWV1ZVRpbWVsaW5lKTtcblxuICByZXR1cm4gdGltZWxpbmU7XG59IiwgImltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vcXVldWUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFmdGVyQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59IiwgImltcG9ydCB7IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25CZWZvcmVDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQmVmb3JlQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn0iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxudHlwZSBTZXR0ZXJGTiA9IChwcmV2aW91czogbnVtYmVyKSA9PiBudW1iZXI7XG50eXBlIFZvbHVtZURpc3BhdGNoID0gcmVhZG9ubHkgW1xuICAoKSA9PiBudW1iZXIsXG4gICh2b2x1bWU6IG51bWJlciB8IFNldHRlckZOKSA9PiBib29sZWFuIHwgdW5kZWZpbmVkXTtcblxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgcGxheWVyIHZvbHVtZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUoKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IFZvbHVtZURpc3BhdGNoIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlVm9sdW1lJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQobm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgY29uc3Qgc2V0dGVyID0gKHZvbHVtZTogbnVtYmVyIHwgU2V0dGVyRk4pID0+IHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKHZvbHVtZSkpXG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sdW1lKHF1ZXVlLm5vZGUudm9sdW1lKSk7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sdW1lKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0dGVyID0gKCkgPT4ge1xuICAgIHJldHVybiBxdWV1ZT8ubm9kZS52b2x1bWUgYXMgbnVtYmVyO1xuICB9O1xuXG4gIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufSIsICJpbXBvcnQge1xuICBFcXVhbGl6ZXJCYW5kLFxuICBQQ01GaWx0ZXJzLFxuICBCaXF1YWRGaWx0ZXJzIH0gZnJvbVxuJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQge1xuICBHdWlsZFF1ZXVlLFxuICBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcixcbiAgT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyLFxuICBRdWV1ZVJlcGVhdE1vZGUgfSBmcm9tXG4nLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IE5vR3VpbGRFcnJvciwgTm9HdWlsZFF1ZXVlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi9mYWJyaWMnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQgPSBhbnk+IHtcbiAgc3RyYXRlZ3k/OiBRdWV1ZVN0cmF0ZWd5O1xuICB2b2x1bWU/OiBudW1iZXI7XG4gIGVxdWFsaXplcj86IEVxdWFsaXplckJhbmRbXTtcbiAgYV9maWx0ZXI/OiBQQ01GaWx0ZXJzW107XG4gIGJpcXVhZD86IEJpcXVhZEZpbHRlcnM7XG4gIHJlc2FtcGxlcj86IG51bWJlcjtcbiAgZGlzYWJsZUhpc3Rvcnk/OiBib29sZWFuO1xuICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICBsZWF2ZU9uRW1wdHk/OiBib29sZWFuO1xuICBsZWF2ZU9uRW1wdHlDb29sZG93bj86IG51bWJlcjtcbiAgbGVhdmVPbkVuZD86IGJvb2xlYW47XG4gIGxlYXZlT25FbmRDb29sZG93bj86IG51bWJlcjtcbiAgbGVhdmVPblN0b3A/OiBib29sZWFuO1xuICBsZWF2ZU9uU3RvcENvb2xkb3duPzogbnVtYmVyO1xuICBtZXRhZGF0YT86IFQgfCBudWxsO1xuICBzZWxmRGVhZj86IGJvb2xlYW47XG4gIGNvbm5lY3Rpb25UaW1lb3V0PzogbnVtYmVyO1xuICBkZWZhdWx0RkZtcGVnRmlsdGVycz86IEZpbHRlcnNOYW1lW107XG4gIGJ1ZmZlcmluZ1RpbWVvdXQ/OiBudW1iZXI7XG4gIG5vRW1pdEluc2VydD86IGJvb2xlYW47XG4gIG1heFNpemU/OiBudW1iZXI7XG4gIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE/OiBib29sZWFuO1xuICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gIGRpc2FibGVGaWx0ZXJlcj86IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ/OiBib29sZWFuO1xuICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtPzogYm9vbGVhbjtcbiAgZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I/OiBib29sZWFuO1xuICB2ZXJpZnlGYWxsYmFja1N0cmVhbT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIE5vZGVSZXNvbHZhYmxlID0gR3VpbGRRdWV1ZSB8IEd1aWxkUmVzb2x2YWJsZTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZE5vZGVNYW5hZ2VyPE1ldGEgPSBhbnk+IHtcbiAgcHVibGljIGNhY2hlID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBHdWlsZFF1ZXVlPigpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZ3VpbGQgcXVldWUgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICogQHBhcmFtIG9wdGlvbnMgUXVldWUgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oXG4gIGd1aWxkOiBHdWlsZFJlc29sdmFibGUsXG4gIG9wdGlvbnM6IEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnM8VD4gPSB7fSlcbiAgOiBHdWlsZFF1ZXVlPFQ+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmUoZ3VpbGQpO1xuICAgIGlmICghc2VydmVyKSB7XG4gICAgICB0aHJvdyBuZXcgTm9HdWlsZEVycm9yKCdJbnZhbGlkIG9yIHVua25vd24gZ3VpbGQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWNoZS5oYXMoc2VydmVyLmlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHNlcnZlci5pZCkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICB9XG5cbiAgICBvcHRpb25zLnN0cmF0ZWd5ID8/PSAnRklGTyc7XG4gICAgb3B0aW9ucy52b2x1bWUgPz89IDEwMDtcbiAgICBvcHRpb25zLmVxdWFsaXplciA/Pz0gW107XG4gICAgb3B0aW9ucy5hX2ZpbHRlciA/Pz0gW107XG4gICAgb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5sZWF2ZU9uRW1wdHkgPz89IHRydWU7XG4gICAgb3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLmxlYXZlT25FbmQgPz89IHRydWU7XG4gICAgb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24gPz89IDA7XG4gICAgb3B0aW9ucy5sZWF2ZU9uU3RvcCA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24gPz89IDA7XG4gICAgb3B0aW9ucy5yZXNhbXBsZXIgPz89IDQ4MDAwO1xuICAgIG9wdGlvbnMuc2VsZkRlYWYgPz89IHRydWU7XG4gICAgb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dDtcbiAgICBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQgPz89IDEwMDA7XG4gICAgb3B0aW9ucy5tYXhTaXplID8/PSBJbmZpbml0eTtcbiAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLnBhdXNlT25FbXB0eSA/Pz0gdHJ1ZTtcblxuICAgIC8vIHRvZG8odHdsaXRlKTogbWF5YmUgZGlzYWJsZSB0aGVzZSBieSBkZWZhdWx0P1xuICAgIG9wdGlvbnMuZGlzYWJsZUJpcXVhZCA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVGaWx0ZXJlciA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlVm9sdW1lID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IGZhbHNlO1xuXG4gICAgb3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMudmVyaWZ5RmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuXG4gICAgaWYgKFxuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmXG4gICAgIW9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KFxuICAgICAgICAnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nXG4gICAgICApIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSAmJlxuICAgICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoXG4gICAgICAgICdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJ1xuICAgICAgKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICBndWlsZDogc2VydmVyLFxuICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW06IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0sXG4gICAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0sXG4gICAgICByZXBlYXRNb2RlOiBvcHRpb25zLnJlcGVhdE1vZGUsXG4gICAgICBsZWF2ZU9uRW1wdHk6IG9wdGlvbnMubGVhdmVPbkVtcHR5LFxuICAgICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24sXG4gICAgICBsZWF2ZU9uRW5kOiBvcHRpb25zLmxlYXZlT25FbmQsXG4gICAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duLFxuICAgICAgbGVhdmVPblN0b3A6IG9wdGlvbnMubGVhdmVPblN0b3AsXG4gICAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24sXG4gICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICBzZWxmRGVhZjogb3B0aW9ucy5zZWxmRGVhZixcbiAgICAgIGZmbXBlZ0ZpbHRlcnM6IG9wdGlvbnMuZGVmYXVsdEZGbXBlZ0ZpbHRlcnMgPz8gW10sXG4gICAgICBidWZmZXJpbmdUaW1lb3V0OiBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQsXG4gICAgICBub0VtaXRJbnNlcnQ6IG9wdGlvbnMubm9FbWl0SW5zZXJ0ID8/IGZhbHNlLFxuICAgICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSxcbiAgICAgIG1heEhpc3RvcnlTaXplOiBvcHRpb25zLm1heEhpc3RvcnlTaXplLFxuICAgICAgbWF4U2l6ZTogb3B0aW9ucy5tYXhTaXplLFxuICAgICAgcGF1c2VPbkVtcHR5OiBvcHRpb25zLnBhdXNlT25FbXB0eSxcbiAgICAgIGRpc2FibGVCaXF1YWQ6IG9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IG9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIGRpc2FibGVGaWx0ZXJlcjogb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICBkaXNhYmxlUmVzYW1wbGVyOiBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICBkaXNhYmxlVm9sdW1lOiBvcHRpb25zLmRpc2FibGVWb2x1bWUsXG4gICAgICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IG9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtLFxuICAgICAgZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I6IG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IsXG4gICAgICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogb3B0aW9ucy52ZXJpZnlGYWxsYmFja1N0cmVhbVxuICAgIH0pO1xuXG4gICAgdGhpcy5jYWNoZS5zZXQoc2VydmVyLmlkLCBxdWV1ZSk7XG5cbiAgICByZXR1cm4gcXVldWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGV4aXN0aW5nIHF1ZXVlXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyBnZXQ8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQocXVldWUuaWQpIGFzIEd1aWxkUXVldWU8VD4gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHF1ZXVlIGV4aXN0c1xuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgaGFzKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgaWQgPVxuICAgIG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlID9cbiAgICBub2RlLmlkIDpcbiAgICB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuaGFzKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZShub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgIGlmICghcXVldWUpIHtcbiAgICAgIHRocm93IG5ldyBOb0d1aWxkUXVldWVFcnJvcignQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RpbmcgcXVldWUnKTtcbiAgICB9XG5cbiAgICBxdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKHRydWUpO1xuICAgIHF1ZXVlLm5vZGUuc3RvcCh0cnVlKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcXVldWUuY29ubmVjdGlvbj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcXVldWUuZGlzcGF0Y2hlcj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcXVldWUuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgIHF1ZXVlLnRpbWVvdXRzLmZvckVhY2goKHRtKSA9PiBjbGVhclRpbWVvdXQodG0pKTtcbiAgICBxdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgcXVldWUudHJhY2tzLmNsZWFyKCk7XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZS5kZWxldGUocXVldWUuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIHJlc29sdmU8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZTxUPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlKSB7XG4gICAgICByZXR1cm4gbm9kZSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChcbiAgICAgIHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpIVxuICAgICkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHF1ZXVlIGlkXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlSWQobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgIHJldHVybiBxPy5pZCB8fCBudWxsO1xuICB9XG59IiwgImltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucywgVHJhY2tMaWtlIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7XG4gIENoYW5uZWxUeXBlLFxuICBHdWlsZCxcbiAgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBWb2ljZUJhc2VkQ2hhbm5lbCxcbiAgVm9pY2VTdGF0ZSB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7XG4gIEJpcXVhZEZpbHRlcnMsXG4gIEVxdWFsaXplckJhbmQsXG4gIFBDTUZpbHRlcnMgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tSZXNvbHZhYmxlIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQge1xuICB0eXBlIEF1ZGlvUGxheWVyLFxuICBBdWRpb1Jlc291cmNlLFxuICBTdHJlYW1UeXBlLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIFZvaWNlQ29ubmVjdGlvblN0YXR1cyB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgVXRpbCwgVkFMSURBVEVfUVVFVUVfQ0FQIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSB9IGZyb20gJy4vR3VpbGRRdWV1ZUhpc3RvcnknO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUsIFN0cmVhbUNvbmZpZyB9IGZyb20gJy4vR3VpbGRRdWV1ZVBsYXllck5vZGUnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyB9IGZyb20gJy4vR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWVTdGF0aXN0aWNzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlU3RhdGlzdGljcyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7XG4gIEludmFsaWRBcmdUeXBlRXJyb3IsXG4gIE5vVm9pY2VDaGFubmVsRXJyb3IsXG4gIE5vVm9pY2VDb25uZWN0aW9uRXJyb3IsXG4gIE91dE9mUmFuZ2VFcnJvcixcbiAgVm9pY2VDb25uZWN0aW9uRGVzdHJveWVkRXJyb3IgfSBmcm9tXG4nLi4vZXJyb3JzJztcbmltcG9ydCB7IFN5bmNlZEx5cmljc1Byb3ZpZGVyIH0gZnJvbSAnLi9TeW5jZWRMeXJpY3NQcm92aWRlcic7XG5pbXBvcnQgeyBMcmNHZXRSZXN1bHQsIExyY1NlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2xyY2xpYi9McmNMaWInO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkTm9kZUluaXQ8TWV0YSA9IGFueT4ge1xuICBndWlsZDogR3VpbGQ7XG4gIHF1ZXVlU3RyYXRlZ3k6IFF1ZXVlU3RyYXRlZ3k7XG4gIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdIHwgYm9vbGVhbjtcbiAgdm9sdW1lOiBudW1iZXIgfCBib29sZWFuO1xuICBiaXF1YWQ6IEJpcXVhZEZpbHRlcnMgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuICByZXNhbXBsZXI6IG51bWJlciB8IGJvb2xlYW47XG4gIGZpbHRlcmVyOiBQQ01GaWx0ZXJzW10gfCBib29sZWFuO1xuICBmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdO1xuICBkaXNhYmxlSGlzdG9yeTogYm9vbGVhbjtcbiAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgbGVhdmVPbkVtcHR5OiBib29sZWFuO1xuICBsZWF2ZU9uRW1wdHlDb29sZG93bjogbnVtYmVyO1xuICBsZWF2ZU9uRW5kOiBib29sZWFuO1xuICBsZWF2ZU9uRW5kQ29vbGRvd246IG51bWJlcjtcbiAgbGVhdmVPblN0b3A6IGJvb2xlYW47XG4gIGxlYXZlT25TdG9wQ29vbGRvd246IG51bWJlcjtcbiAgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlcjtcbiAgc2VsZkRlYWY/OiBib29sZWFuO1xuICBtZXRhZGF0YT86IE1ldGEgfCBudWxsO1xuICBidWZmZXJpbmdUaW1lb3V0OiBudW1iZXI7XG4gIG5vRW1pdEluc2VydDogYm9vbGVhbjtcbiAgbWF4U2l6ZT86IG51bWJlcjtcbiAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gIHByZWZlckJyaWRnZWRNZXRhZGF0YTogYm9vbGVhbjtcbiAgcGF1c2VPbkVtcHR5PzogYm9vbGVhbjtcbiAgZGlzYWJsZVZvbHVtZTogYm9vbGVhbjtcbiAgZGlzYWJsZUVxdWFsaXplcjogYm9vbGVhbjtcbiAgZGlzYWJsZUZpbHRlcmVyOiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkOiBib29sZWFuO1xuICBkaXNhYmxlUmVzYW1wbGVyOiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IGJvb2xlYW47XG4gIGVuYWJsZVN0cmVhbUludGVyY2VwdG9yOiBib29sZWFuO1xuICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUNvbm5lY3RDb25maWcge1xuICBkZWFmPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gIHN0cmVhbTogUmVhZGFibGU7XG4gIHR5cGU6IFN0cmVhbVR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChcbnRyYWNrOiBUcmFjayxcbnF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlLFxucXVldWU6IEd1aWxkUXVldWUpXG49PiBQcm9taXNlPFJlYWRhYmxlIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyPFQgPSB1bmtub3duPiA9IChcbnN0cmVhbTogUmVhZGFibGUsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbnRyYWNrOiBUcmFjazxUPilcbj0+IFByb21pc2U8UG9zdFByb2Nlc3NlZFJlc3VsdCB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24gPSAnZmlsdGVycycgfCAnbm9ybWFsJztcblxuZXhwb3J0IGNvbnN0IEd1aWxkUXVldWVFdmVudCA9IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tSZW1vdmU6ICdhdWRpb1RyYWNrUmVtb3ZlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzUmVtb3ZlOiAnYXVkaW9UcmFja3NSZW1vdmUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqL1xuICBDb25uZWN0aW9uOiAnY29ubmVjdGlvbicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgKi9cbiAgQ29ubmVjdGlvbkRlc3Ryb3llZDogJ2Nvbm5lY3Rpb25EZXN0cm95ZWQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICovXG4gIERpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqL1xuICBEZWJ1ZzogJ2RlYnVnJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgKi9cbiAgRXJyb3I6ICdlcnJvcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICovXG4gIEVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqL1xuICBFbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJTdGFydDogJ3BsYXllclN0YXJ0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICovXG4gIFBsYXllckVycm9yOiAncGxheWVyRXJyb3InLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKi9cbiAgUGxheWVyU2tpcDogJ3BsYXllclNraXAnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAqL1xuICBQbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICovXG4gIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgKi9cbiAgVm9sdW1lQ2hhbmdlOiAndm9sdW1lQ2hhbmdlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcGF1c2VkXG4gICAqL1xuICBQbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgKi9cbiAgUGxheWVyUmVzdW1lOiAncGxheWVyUmVzdW1lJyxcbiAgLyoqXG4gICAqIEJpcXVhZCBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQmlxdWFkRmlsdGVyc1VwZGF0ZTogJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAvKipcbiAgICogRXF1YWxpemVyIFVwZGF0ZVxuICAgKi9cbiAgRXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgLyoqXG4gICAqIERTUCB1cGRhdGVcbiAgICovXG4gIERTUFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gIC8qKlxuICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQXVkaW9GaWx0ZXJzVXBkYXRlOiAnYXVkaW9GaWx0ZXJzVXBkYXRlJyxcbiAgLyoqXG4gICAqIEF1ZGlvIHBsYXllciB3aWxsIHBsYXkgbmV4dCB0cmFja1xuICAgKi9cbiAgV2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyByZXBvcHVsYXRlZFxuICAgKi9cbiAgQ2hhbm5lbFBvcHVsYXRlOiAnY2hhbm5lbFBvcHVsYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAqL1xuICBRdWV1ZUNyZWF0ZTogJ3F1ZXVlQ3JlYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIGRlbGV0ZWRcbiAgICovXG4gIFF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKi9cbiAgV2lsbEF1dG9QbGF5OiAnd2lsbEF1dG9QbGF5JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBzYW1wbGUgcmF0ZSBpcyB1cGRhdGVkXG4gICAqL1xuICBTYW1wbGVSYXRlVXBkYXRlOiAnc2FtcGxlUmF0ZVVwZGF0ZSdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEd1aWxkUXVldWVFdmVudCA9XG4odHlwZW9mIEd1aWxkUXVldWVFdmVudClba2V5b2YgdHlwZW9mIEd1aWxkUXVldWVFdmVudF07XG5cbmV4cG9ydCBlbnVtIFRyYWNrU2tpcFJlYXNvbiB7XG4gIE5vU3RyZWFtID0gJ0VSUl9OT19TVFJFQU0nLFxuICBNYW51YWwgPSAnTUFOVUFMJyxcbiAgU0VFS19PVkVSX1RIUkVTSE9MRCA9ICdTRUVLX09WRVJfVEhSRVNIT0xEJyxcbiAgSnVtcCA9ICdKVU1QRURfVE9fQU5PVEhFUl9UUkFDSycsXG4gIFNraXBUbyA9ICdTS0lQX1RPX0FOT1RIRVJfVFJBQ0snLFxuICBIaXN0b3J5TmV4dCA9ICdISVNUT1JZX05FWFRfVFJBQ0snLFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSBhbnk+IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrcyBhcnJheVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc0FkZF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFja1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2tbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgZGVzdHJveWVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uRGVzdHJveWVkXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkRpc2Nvbm5lY3RdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRGVidWddOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBtZXNzYWdlOiBzdHJpbmcpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRXJyb3JdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlDaGFubmVsXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHN0YXJ0cyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCBpcyBiZWluZyBzdHJlYW1lZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTdGFydF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgZXJyb3I6IEVycm9yLFxuICB0cmFjazogVHJhY2spXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBmaW5pc2hlcyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgYmVpbmcgc3RyZWFtZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRmluaXNoXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBza2lwcGVkXG4gICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3Igc2tpcHBpbmdcbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBmb3Igc2tpcHBpbmdcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjayxcbiAgcmVhc29uOiBUcmFja1NraXBSZWFzb24sXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgd2hpY2ggd2FzIHBsYXllZCBpbiB0aGlzIGV2ZW50XG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclRyaWdnZXJdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2ssXG4gIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkU3RhdGU6IFZvaWNlU3RhdGUsXG4gIG5ld1N0YXRlOiBWb2ljZVN0YXRlKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyBwYXVzZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclBhdXNlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyByZXN1bWVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJSZXN1bWVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyJ3Mgdm9sdW1lIGlzIGNoYW5nZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRWb2x1bWUgVGhlIG9sZCB2b2x1bWVcbiAgICogQHBhcmFtIG5ld1ZvbHVtZSBUaGUgdXBkYXRlZCB2b2x1bWVcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuVm9sdW1lQ2hhbmdlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkVm9sdW1lOiBudW1iZXIsXG4gIG5ld1ZvbHVtZTogbnVtYmVyKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGVxdWFsaXplciBjb25maWcgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRXF1YWxpemVyVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyczogRXF1YWxpemVyQmFuZFtdLFxuICBuZXdGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYmlxdWFkIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQmlxdWFkRmlsdGVyc1VwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsLFxuICBuZXdGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBkc3AgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5EU1BVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBQQ01GaWx0ZXJzW10sXG4gIG5ld0ZpbHRlcnM6IFBDTUZpbHRlcnNbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBmZm1wZWcgYXVkaW8gZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb0ZpbHRlcnNVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdLFxuICBuZXdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdKVxuICA9PiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIGJlZm9yZSBzdHJlYW1pbmcgYW4gYXVkaW8gdHJhY2suIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHN0cmVhbSBjb25maWcgYmVmb3JlIHBsYXlpbmcgYSB0cmFjay5cbiAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdpbGwgYmUgc3RyZWFtZWRcbiAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbFBsYXlUcmFja106IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjazx1bmtub3duPixcbiAgY29uZmlnOiBTdHJlYW1Db25maWcsXG4gIGRvbmU6ICgpID0+IHZvaWQpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHBvcHVsYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQ2hhbm5lbFBvcHVsYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlRGVsZXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgc2ltaWxhciB0cmFja3MgdGhhdCB3ZXJlIGZvdW5kXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbEF1dG9QbGF5XTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2tzOiBUcmFja1tdLFxuICBkb25lOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBzYW1wbGUgcmF0ZSBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkUmF0ZSBUaGUgb2xkIHNhbXBsZSByYXRlXG4gICAqIEBwYXJhbSBuZXdSYXRlIFRoZSBuZXcgc2FtcGxlIHJhdGVcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZVVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZFJhdGU6IG51bWJlcixcbiAgbmV3UmF0ZTogbnVtYmVyKVxuICA9PiB1bmtub3duO1xufVxuXG4vKipcbiAqIFRoZSBxdWV1ZSByZXBlYXQgbW9kZS4gVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBPRkZcbiAqIC0gVFJBQ0tcbiAqIC0gUVVFVUVcbiAqIC0gQVVUT1BMQVlcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXVlUmVwZWF0TW9kZSA9IHtcbiAgLyoqXG4gICAqIERpc2FibGUgcmVwZWF0IG1vZGUuXG4gICAqL1xuICBPRkY6IDAsXG4gIC8qKlxuICAgKiBSZXBlYXQgdGhlIGN1cnJlbnQgdHJhY2suXG4gICAqL1xuICBUUkFDSzogMSxcbiAgLyoqXG4gICAqIFJlcGVhdCB0aGUgZW50aXJlIHF1ZXVlLlxuICAgKi9cbiAgUVVFVUU6IDIsXG4gIC8qKlxuICAgKiBXaGVuIGxhc3QgdHJhY2sgZW5kcywgcGxheSBzaW1pbGFyIHRyYWNrcyBpbiB0aGUgZnV0dXJlIGlmIHF1ZXVlIGlzIGVtcHR5LlxuICAgKi9cbiAgQVVUT1BMQVk6IDNcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFF1ZXVlUmVwZWF0TW9kZSA9XG4odHlwZW9mIFF1ZXVlUmVwZWF0TW9kZSlba2V5b2YgdHlwZW9mIFF1ZXVlUmVwZWF0TW9kZV07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZTxNZXRhID0gYW55PiB7XG4gICN0cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICNkZWxldGVkID0gZmFsc2U7XG4gICNzaHVmZmxlID0gZmFsc2U7XG4gIHByaXZhdGUgX19jdXJyZW50OiBUcmFjayB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgdHJhY2tzOiBRdWV1ZTxUcmFjaz47XG4gIHB1YmxpYyBoaXN0b3J5ID0gbmV3IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgbm9kZSA9IG5ldyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPih0aGlzKTtcbiAgcHVibGljIGZpbHRlcnMgPSBuZXcgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPih0aGlzKTtcbiAgcHVibGljIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoKSA9PiBudWxsO1xuICBwdWJsaWMgb25BZnRlckNyZWF0ZVN0cmVhbTogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoc3RyZWFtKSA9PiAoe1xuICAgIHN0cmVhbSxcbiAgICB0eXBlOiBTdHJlYW1UeXBlLlJhd1xuICB9KTtcbiAgcHVibGljIHJlcGVhdE1vZGU6IFF1ZXVlUmVwZWF0TW9kZSA9IFF1ZXVlUmVwZWF0TW9kZS5PRkY7XG4gIHB1YmxpYyB0aW1lb3V0cyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgTm9kZUpTLlRpbWVvdXQ+KCk7XG4gIHB1YmxpYyBzdGF0cyA9IG5ldyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhPih0aGlzKTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgc3luY2VkTHlyaWNzUHJvdmlkZXIgPSBuZXcgU3luY2VkTHlyaWNzUHJvdmlkZXIodGhpcyk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgcGxheWVyOiBQbGF5ZXIsXG4gIHB1YmxpYyBvcHRpb25zOiBHdWlsZE5vZGVJbml0PE1ldGE+KVxuICB7XG4gICAgdGhpcy50cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KG9wdGlvbnMucXVldWVTdHJhdGVneSk7XG4gICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkpXG4gICAgdGhpcy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW07XG4gICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtKSlcbiAgICB0aGlzLm9uQWZ0ZXJDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW07XG4gICAgaWYgKCFUeXBlVXRpbC5pc051bGxpc2gob3B0aW9ucy5yZXBlYXRNb2RlKSlcbiAgICB0aGlzLnJlcGVhdE1vZGUgPSBvcHRpb25zLnJlcGVhdE1vZGU7XG5cbiAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubWF4U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgb3B0aW9ucy5wYXVzZU9uRW1wdHkgPz89IHRydWU7XG5cbiAgICBpZiAoXG4gICAgIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJlxuICAgICFUeXBlVXRpbC5pc0Jvb2xlYW4odGhpcy5vcHRpb25zLmJpcXVhZCkpXG4gICAge1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IHRoaXMub3B0aW9ucy5iaXF1YWQ7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmVxdWFsaXplcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSB0aGlzLm9wdGlvbnMuZXF1YWxpemVyO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5maWx0ZXJlcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcmVyO1xuICAgIH1cblxuICAgIGlmIChUeXBlVXRpbC5pc051bWJlcih0aGlzLm9wdGlvbnMucmVzYW1wbGVyKSkge1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUgPSB0aGlzLm9wdGlvbnMucmVzYW1wbGVyO1xuICAgIH1cblxuICAgIGlmIChUeXBlVXRpbC5pc0FycmF5KHRoaXMub3B0aW9ucy5mZm1wZWdGaWx0ZXJzKSkge1xuICAgICAgdGhpcy5maWx0ZXJzLmZmbXBlZy5zZXREZWZhdWx0cyh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycyk7XG4gICAgfVxuXG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heFNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICAgJ1tHdWlsZE5vZGVJbml0Lm1heFNpemVdJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLm1heFNpemVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heEhpc3RvcnlTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdbR3VpbGROb2RlSW5pdC5tYXhIaXN0b3J5U2l6ZV0nLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMubWF4SGlzdG9yeVNpemVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWF4U2l6ZSA8IDEpIG9wdGlvbnMubWF4U2l6ZSA9IEluZmluaXR5O1xuICAgIGlmIChvcHRpb25zLm1heEhpc3RvcnlTaXplIDwgMSkgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IEluZmluaXR5O1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBHdWlsZFF1ZXVlIGluaXRpYWxpemVkIGZvciBndWlsZCAke3RoaXMub3B0aW9ucy5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5vcHRpb25zLmd1aWxkLmlkfSlgXG4gICAgKTtcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcXVldWUgY2FuIGludGVyY2VwdCBzdHJlYW1zXG4gICAqL1xuICBwdWJsaWMgY2FuSW50ZXJjZXB0KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWUgaW4gbXNcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnN0b3JlLnJlZHVjZSgoYSwgYykgPT4gYSArIGMuZHVyYXRpb25NUywgMCk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0dGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzeW5jIGx5cmljcyBwcm92aWRlciBmb3IgdGhpcyBxdWV1ZS5cbiAgICogQGV4YW1wbGUgY29uc3QgbHlyaWNzID0gYXdhaXQgcGxheWVyLmx5cmljcy5zZWFyY2goeyBxOiAnQWxhbiBXYWxrZXIgRmFkZWQnIH0pO1xuICAgKiBjb25zdCBzeW5jZWRMeXJpY3MgPSBxdWV1ZS5zeW5jZWRMeXJpY3MobHlyaWNzWzBdKTtcbiAgICogY29uc29sZS5sb2coc3luY2VkTHlyaWNzLmF0KDEwXzAwMCkpO1xuICAgKiAvLyBzdWJzY3JpYmUgdG8gbHlyaWNzIGNoYW5nZVxuICAgKiBjb25zdCB1bnN1YnNjcmliZSA9IHN5bmNlZEx5cmljcy5vbkNoYW5nZSgobHlyaWNzLCB0aW1lc3RhbXApID0+IHtcbiAgICogICAgY29uc29sZS5sb2cobHlyaWNzLCB0aW1lc3RhbXApO1xuICAgKiB9KTtcbiAgICogLy8gdW5zdWJzY3JpYmUgZnJvbSBseXJpY3MgY2hhbmdlXG4gICAqIHVuc3Vic2NyaWJlKCk7IC8vIG9yXG4gICAqIHN5bmNlZEx5cmljcy51bnN1YnNjcmliZSgpO1xuICAgKi9cbiAgcHVibGljIHN5bmNlZEx5cmljcyhseXJpY3M6IExyY0dldFJlc3VsdCB8IExyY1NlYXJjaFJlc3VsdCkge1xuICAgIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXIubG9hZChseXJpY3M/LnN5bmNlZEx5cmljcyA/PyAnJyk7XG4gICAgcmV0dXJuIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYSBkZWJ1ZyBtZXNzYWdlIHRvIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIG0gVGhlIG1lc3NhZ2UgdG8gd3JpdGVcbiAgICovXG4gIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRlYnVnLCB0aGlzLCBtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWV0YWRhdGEgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1ldGFkYXRhITtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbWV0YWRhdGEobTogTWV0YSkge1xuICAgIHRoaXMub3B0aW9ucy5tZXRhZGF0YSA9IG07XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBtIE1ldGFkYXRhIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldE1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBjdXJyZW50IHRyYWNrIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuX19jdXJyZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGlzIHF1ZXVlIHdhcyBkZWxldGVkIHByZXZpb3VzbHlcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVsZXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY2hhbm5lbCBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNoYW5uZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uY2hhbm5lbCB8fCBudWxsO1xuICB9XG5cbiAgcHVibGljIHNldCBjaGFubmVsKGM6IFZvaWNlQmFzZWRDaGFubmVsIHwgbnVsbCkge1xuICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgIGlmIChjKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsID0gYztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVsZXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZ3VpbGQgdGhpcyBxdWV1ZSBiZWxvbmdzIHRvXG4gICAqL1xuICBwdWJsaWMgZ2V0IGd1aWxkKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ3VpbGQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3VpbGQuaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRyYW5zaXRpb24gbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldFRyYW5zaXRpb25pbmcoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiN0cmFuc2l0aW9uaW5nID0gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogaWYgdGhpcyBxdWV1ZSBpcyBjdXJyZW50bHkgdW5kZXIgdHJhbnNpdGlvbiBtb2RlXG4gICAqL1xuICBwdWJsaWMgaXNUcmFuc2l0aW9uaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiN0cmFuc2l0aW9uaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCByZXBlYXQgbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gbW9kZSBUaGUgcmVwZWF0IG1vZGUgdG8gYXBwbHlcbiAgICovXG4gIHB1YmxpYyBzZXRSZXBlYXRNb2RlKG1vZGU6IFF1ZXVlUmVwZWF0TW9kZSkge1xuICAgIHRoaXMucmVwZWF0TW9kZSA9IG1vZGU7XG4gIH1cblxuICAvKipcbiAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBtYXhTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4U2l6ZSA/PyBJbmZpbml0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXggc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0TWF4U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXhTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4SGlzdG9yeVNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/PyBJbmZpbml0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXRNYXhIaXN0b3J5U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXhIaXN0b3J5U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWF4IGhpc3Rvcnkgc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNYXhIaXN0b3J5U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcignc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBzaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtYXggc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNYXhTaXplKHNpemU6IG51bWJlcikge1xuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICB9XG5cbiAgICBpZiAoc2l6ZSA8IDEpIHNpemUgPSBJbmZpbml0eTtcblxuICAgIHRoaXMub3B0aW9ucy5tYXhTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgICB0aGlzLmhpc3RvcnkuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGhhcyBubyB0cmFja3MgbGVmdCBpbiBpdFxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPCAxO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaXMgZnVsbFxuICAgKi9cbiAgcHVibGljIGlzRnVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA+PSB0aGlzLm1heFNpemU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHF1ZXVlIGNhcGFjaXR5XG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FwYWNpdHkoKSB7XG4gICAgaWYgKHRoaXMuaXNGdWxsKCkpIHJldHVybiAwO1xuICAgIGNvbnN0IGNhcCA9IHRoaXMubWF4U2l6ZSAtIHRoaXMuc2l6ZTtcbiAgICByZXR1cm4gY2FwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgcXVldWUgY3VycmVudGx5IGhvbGRzIGFjdGl2ZSBhdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlICE9IG51bGwgJiZcbiAgICAgICF0aGlzLmRpc3BhdGNoZXIuYXVkaW9SZXNvdXJjZS5lbmRlZCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdHJhY2sgdG8gdGhlIHF1ZXVlLiBUaGlzIHdpbGwgZW1pdCBgYXVkaW9UcmFja3NBZGRgIHdoZW4gbXVsdGlwbGUgdHJhY2tzIGFyZSBhZGRlZCwgb3RoZXJ3aXNlIGBhdWRpb1RyYWNrQWRkYC5cbiAgICogQHBhcmFtIHRyYWNrIFRyYWNrIG9yIHBsYXlsaXN0IG9yIGFycmF5IG9mIHRyYWNrcyB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRUcmFjayh0cmFjazogVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QpIHtcbiAgICBjb25zdCB0b0FkZCA9IHRyYWNrIGluc3RhbmNlb2YgUGxheWxpc3QgPyB0cmFjay50cmFja3MgOiB0cmFjaztcbiAgICBjb25zdCBpc011bHRpID0gQXJyYXkuaXNBcnJheSh0b0FkZCk7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgdG9BZGQpO1xuXG4gICAgdGhpcy50cmFja3MuYWRkKHRvQWRkKTtcblxuICAgIGlmIChpc011bHRpKSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdG9BZGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB0cmFjayBmcm9tIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIHJldHVybiB0aGlzLm5vZGUucmVtb3ZlKHRyYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwZW5kcyBhIHRyYWNrIG9yIHRyYWNrIHJlc29sdmFibGUgdG8gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgcmVzb2x2YWJsZSB0byBpbnNlcnRcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKS4gSWYgPiAwLCB0aGUgaW5zZXJ0ZWQgdHJhY2sgd2lsbCBiZSBwbGFjZWQgYmVmb3JlIHRoZSB0cmFjayBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAqL1xuICBwdWJsaWMgcHJlcGVuZCh0cmFjazogVHJhY2sgfCBRdWV1ZTxUcmFjaz4gfCBBcnJheTxUcmFjaz4sIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLnRyYWNrcy5zaXplKSB7XG4gICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAnaW5kZXgnLFxuICAgICAgICBgJHtpbmRleH1gLFxuICAgICAgICAnMCcsXG4gICAgICAgIGAke3RoaXMudHJhY2tzLnNpemV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudCA9IEFycmF5LmlzQXJyYXkodHJhY2spID9cbiAgICB0cmFjay5sZW5ndGggOlxuICAgIHRyYWNrIGluc3RhbmNlb2YgUXVldWUgP1xuICAgIHRyYWNrLnNpemUgOlxuICAgIDE7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgY291bnQpO1xuXG4gICAgY29uc3QgaW5zZXJ0aW9uSW5kZXggPSBpbmRleCA9PT0gMCA/IDAgOiBpbmRleCAtIDE7XG5cbiAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5zZXJ0aW9uSW5kZXgpO1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLCB0cmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzID0gdHJhY2sgaW5zdGFuY2VvZiBRdWV1ZSA/IHRyYWNrLnN0b3JlIDogdHJhY2s7XG5cbiAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UoaW5zZXJ0aW9uSW5kZXgsIDAsIC4uLnRyYWNrcyk7XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NBZGQsIHRoaXMsIHRyYWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSB0cmFjayBvciB0cmFjayByZXNvbHZhYmxlIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHJlc29sdmFibGUgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMCkuIElmID4gMCwgdGhlIGluc2VydGVkIHRyYWNrIHdpbGwgYmUgcGxhY2VkIGFmdGVyIHRoZSB0cmFjayBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAqL1xuICBwdWJsaWMgYXBwZW5kKHRyYWNrOiBUcmFjayB8IFF1ZXVlPFRyYWNrPiB8IEFycmF5PFRyYWNrPiwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRoaXMudHJhY2tzLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBPdXRPZlJhbmdlRXJyb3IoXG4gICAgICAgICdpbmRleCcsXG4gICAgICAgIGAke2luZGV4fWAsXG4gICAgICAgICcwJyxcbiAgICAgICAgYCR7dGhpcy50cmFja3Muc2l6ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gQXJyYXkuaXNBcnJheSh0cmFjaykgP1xuICAgIHRyYWNrLmxlbmd0aCA6XG4gICAgdHJhY2sgaW5zdGFuY2VvZiBRdWV1ZSA/XG4gICAgdHJhY2suc2l6ZSA6XG4gICAgMTtcblxuICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLCBjb3VudCk7XG5cbiAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5kZXgpO1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLCB0cmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzID0gdHJhY2sgaW5zdGFuY2VvZiBRdWV1ZSA/IHRyYWNrLnN0b3JlIDogdHJhY2s7XG5cbiAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UoaW5kZXgsIDAsIC4uLnRyYWNrcyk7XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NBZGQsIHRoaXMsIHRyYWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgdGhlIHRyYWNrIHRvIHRoZSBnaXZlbiBpbmRleFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApXG4gICAqL1xuICBwdWJsaWMgaW5zZXJ0VHJhY2sodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgKi9cbiAgcHVibGljIG1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLm1vdmUodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAqL1xuICBwdWJsaWMgY29weVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5vZGUuY29weSh0cmFjaywgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHNyYyBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgKiBAcGFyYW0gZGVzdCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICovXG4gIHB1YmxpYyBzd2FwVHJhY2tzKHNyYzogVHJhY2tSZXNvbHZhYmxlLCBkZXN0OiBUcmFja1Jlc29sdmFibGUpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnN3YXAoc3JjLCBkZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgc3RyZWFtIGRpc3BhdGNoZXIgZnJvbSB0aGUgZ2l2ZW4gY29ubmVjdGlvblxuICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byB1c2VcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVEaXNwYXRjaGVyKFxuICBjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sXG4gIG9wdGlvbnM6IFBpY2s8Vm9pY2VDb25uZWN0Q29uZmlnLCAnYXVkaW9QbGF5ZXInIHwgJ3RpbWVvdXQnPiA9IHt9KVxuICB7XG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICB0aHJvdyBuZXcgVm9pY2VDb25uZWN0aW9uRGVzdHJveWVkRXJyb3IoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5wbGF5ZXIuY2xpZW50LmNoYW5uZWxzLmNhY2hlLmdldChcbiAgICAgIGNvbm5lY3Rpb24uam9pbkNvbmZpZy5jaGFubmVsSWQhXG4gICAgKTtcbiAgICBpZiAoIWNoYW5uZWwpIHRocm93IG5ldyBOb1ZvaWNlQ2hhbm5lbEVycm9yKCk7XG4gICAgaWYgKCFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ2NoYW5uZWwnLFxuICAgICAgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsXG4gICAgICBTdHJpbmcoY2hhbm5lbD8udHlwZSlcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihcbiAgICAgIGNvbm5lY3Rpb24sXG4gICAgICBjaGFubmVsLFxuICAgICAgdGhpcyxcbiAgICAgIG9wdGlvbnMudGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQsXG4gICAgICBvcHRpb25zLmF1ZGlvUGxheWVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbFxuICAgKiBAcGFyYW0gY2hhbm5lbFJlc29sdmFibGUgVGhlIHZvaWNlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgKiBAcGFyYW0gb3B0aW9ucyBKb2luIGNvbmZpZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gIGNoYW5uZWxSZXNvbHZhYmxlOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIG9wdGlvbnM6IFZvaWNlQ29ubmVjdENvbmZpZyA9IHt9KVxuICB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWxSZXNvbHZhYmxlKTtcbiAgICBpZiAoIWNoYW5uZWwgfHwgIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnY2hhbm5lbCcsXG4gICAgICAgIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLFxuICAgICAgICBTdHJpbmcoY2hhbm5lbD8udHlwZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBDb25uZWN0aW5nIHRvICR7XG4gICAgICBjaGFubmVsLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSA/ICdzdGFnZScgOiAndm9pY2UnfSBjaGFubmVsICR7XG4gICAgICBjaGFubmVsLm5hbWV9IChJRDogJHtjaGFubmVsLmlkfSlgXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmRpc3BhdGNoZXIgJiYgY2hhbm5lbC5pZCAhPT0gdGhpcy5kaXNwYXRjaGVyLmNoYW5uZWwuaWQpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdEZXN0cm95aW5nIG9sZCBjb25uZWN0aW9uJyk7XG4gICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuZGlzcGF0Y2hlciA9IGF3YWl0IHRoaXMucGxheWVyLnZvaWNlVXRpbHMuY29ubmVjdChjaGFubmVsLCB7XG4gICAgICBkZWFmOiBvcHRpb25zLmRlYWYgPz8gdGhpcy5vcHRpb25zLnNlbGZEZWFmID8/IHRydWUsXG4gICAgICBtYXhUaW1lOiBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgcXVldWU6IHRoaXMsXG4gICAgICBhdWRpb1BsYXllcjogb3B0aW9ucz8uYXVkaW9QbGF5ZXIsXG4gICAgICBncm91cDogb3B0aW9ucy5ncm91cCA/PyB0aGlzLnBsYXllci5jbGllbnQudXNlcj8uaWRcbiAgICB9KTtcblxuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbiwgdGhpcyk7XG5cbiAgICBpZiAodGhpcy5jaGFubmVsIS50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0U3VwcHJlc3NlZChmYWxzZSkuY2F0Y2goXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayhcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy4jYXR0YWNoTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBkeW5hbWljIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgcXVldWUgZHluYW1pY2FsbHkuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICogRHluYW1pYyBzaHVmZmxpbmcgd2lsbCBzaHVmZmxlIHRoZSBxdWV1ZSB3aGVuIHRoZSBjdXJyZW50IHRyYWNrIGVuZHMsIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHF1ZXVlLlxuICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgdGhlIHF1ZXVlIHdpbGwgYmUgc2h1ZmZsZWQgaW1tZWRpYXRlbHkgaW4tcGxhY2UsIHdoaWNoIGNhbm5vdCBiZSB1bmRvbmUuXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgIGlmICghZHluYW1pYykge1xuICAgICAgdGhpcy50cmFja3Muc2h1ZmZsZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy4jc2h1ZmZsZSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBzaHVmZmxlIG1vZGUgZm9yIHRoaXMgcXVldWUuXG4gICAqL1xuICBwdWJsaWMgZGlzYWJsZVNodWZmbGUoKSB7XG4gICAgdGhpcy4jc2h1ZmZsZSA9IGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBzaHVmZmxlIG1vZGUgZm9yIHRoaXMgcXVldWUuXG4gICAqIEBwYXJhbSBkeW5hbWljIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgcXVldWUgZHluYW1pY2FsbHkuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICogQHJldHVybnMgV2hldGhlciBzaHVmZmxlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgIGlmIChkeW5hbWljKSB7XG4gICAgICB0aGlzLiNzaHVmZmxlID0gIXRoaXMuI3NodWZmbGU7XG4gICAgICByZXR1cm4gdGhpcy4jc2h1ZmZsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFja3Muc2h1ZmZsZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2h1ZmZsZSBtb2RlIGlzIGVuYWJsZWQgZm9yIHRoaXMgcXVldWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzU2h1ZmZsaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNzaHVmZmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIGxhdGVuY3kgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24/LnBpbmcudWRwID8/IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKCkge1xuICAgIGlmICh0aGlzLnBsYXllci5ub2Rlcy5kZWxldGUodGhpcy5pZCkpIHtcbiAgICAgIHRoaXMuI2RlbGV0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlRGVsZXRlLCB0aGlzKTtcbiAgICAgIHRoaXMubm9kZS50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgICAgdGhpcy50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZpdmVzIHRoaXMgcXVldWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyByZXZpdmUoKSB7XG4gICAgaWYgKCF0aGlzLmRlbGV0ZWQgfHwgdGhpcy5wbGF5ZXIubm9kZXMuaGFzKHRoaXMuaWQpKSByZXR1cm47XG4gICAgdGhpcy4jZGVsZXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG4gICAgdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuc2V0KHRoaXMuaWQsIHRoaXMpO1xuICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlbGYgZGVhZlxuICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICogQHBhcmFtIHJlYXNvbiBSZWFzb25cbiAgICovXG4gIHB1YmxpYyBzZXRTZWxmRGVhZihtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0RGVhZihtb2RlLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZWxmIG11dGVcbiAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZk11dGUobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldE11dGUobW9kZSwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IGEgdHJhY2sgaW4gdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgbm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheShcbiAgdHJhY2s6IFRyYWNrTGlrZSxcbiAgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8TWV0YT4pXG4gIHtcbiAgICBpZiAoIXRoaXMuY2hhbm5lbCkgdGhyb3cgbmV3IE5vVm9pY2VDb25uZWN0aW9uRXJyb3IoKTtcblxuICAgIHJldHVybiB0aGlzLnBsYXllci5wbGF5KHRoaXMuY2hhbm5lbCwgdHJhY2ssIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYW4gZXZlbnQgb24gdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGVtaXRcbiAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgZm9yIHRoZSBldmVudFxuICAgKi9cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEd1aWxkUXVldWVFdmVudHM8TWV0YT4+KFxuICBldmVudDogSyxcbiAgLi4uYXJnczogUGFyYW1ldGVyczxHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+W0tdPilcbiAgOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kZWxldGVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfVxuXG4gICNhdHRhY2hMaXN0ZW5lcnMoZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgIGRpc3BhdGNoZXIub24oJ2Vycm9yJywgKGUpID0+IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIHRoaXMsIGUpKTtcbiAgICBkaXNwYXRjaGVyLm9uKFxuICAgICAgJ2RlYnVnJyxcbiAgICAgIChtKSA9PiB0aGlzLmhhc0RlYnVnZ2VyICYmIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGVidWcsIHRoaXMsIG0pXG4gICAgKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdmaW5pc2gnLCAocikgPT4gdGhpcy4jcGVyZm9ybUZpbmlzaChyKSk7XG4gICAgZGlzcGF0Y2hlci5vbignc3RhcnQnLCAocikgPT4gdGhpcy4jcGVyZm9ybVN0YXJ0KHIpKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkZXN0cm95ZWQnLCAoKSA9PiB7XG4gICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnMoZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2RzcCcsIChmKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5pcyh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5EU1BVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyxcbiAgICAgICAgICBmXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbignYmlxdWFkJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkICE9PSBmKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuQmlxdWFkRmlsdGVyc1VwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbignZXFCYW5kcycsIChmKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5pcyhmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyKSkge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LkVxdWFsaXplclVwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbigndm9sdW1lJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lICE9PSBmKVxuICAgICAgdGhpcy5lbWl0KFxuICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuVm9sdW1lQ2hhbmdlLFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lLFxuICAgICAgICBmXG4gICAgICApO1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbignc2FtcGxlUmF0ZScsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUgIT09IGYpXG4gICAgICB0aGlzLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5TYW1wbGVSYXRlVXBkYXRlLFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSxcbiAgICAgICAgZlxuICAgICAgKTtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gZjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5oYXNEZWJ1Z2dlcjtcbiAgfVxuXG4gICNyZW1vdmVMaXN0ZW5lcnM8VCBleHRlbmRzIHtyZW1vdmVBbGxMaXN0ZW5lcnM6ICgpID0+IHVua25vd247fT4odGFyZ2V0OiBUKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB9XG5cbiAgI3BlcmZvcm1TdGFydChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgY29uc3QgcmVhc29uID0gdGhpcy5pc1RyYW5zaXRpb25pbmcoKSA/ICdmaWx0ZXJzJyA6ICdub3JtYWwnO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBQbGF5ZXIgdHJpZ2dlcmVkIGZvciBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdGl0bGU6IHRyYWNrPy50aXRsZSxcbiAgICAgICAgcmVhc29uXG4gICAgICB9KX1gXG4gICAgKTtcblxuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlciwgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSlcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclN0YXJ0LCB0aGlzLCB0cmFjayk7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgfVxuXG4gICNnZXROZXh0VHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLmlzU2h1ZmZsaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZSA9IHRoaXMudHJhY2tzLnN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZS5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IHRyYWNrID0gVXRpbC5yYW5kb21DaG9pY2Uoc3RvcmUpO1xuXG4gICAgdGhpcy50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB7XG4gICAgICByZXR1cm4gdC5pZCA9PT0gdHJhY2suaWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAjcGVyZm9ybUZpbmlzaChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGBcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmx5cmljcy5jbGVhcigpO1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nXG4gICAgICApO1xuICAgICAgaWYgKHRyYWNrKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgdGhpcy5ub2RlLnJlc2V0UHJvZ3Jlc3MoKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2gsIHRoaXMsIHRyYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiNkZWxldGVkKSByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAnTm8gbW9yZSB0cmFja3MgbGVmdCBpbiB0aGUgcXVldWUgdG8gcGxheSBhbmQgcmVwZWF0IG1vZGUgaXMgb2ZmLCBpbml0aWF0aW5nICNlbWl0RW5kKCknXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5UUkFDSykge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gcXVldWUsIG1vdmluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkgdG8gY3VycmVudCBxdWV1ZS4uLidcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgaWYgKG5leHQpIHRoaXMudHJhY2tzLmFkZChuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUgJiYgdHJhY2spIHtcbiAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuQVVUT1BMQVkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBhdXRvcGxheSwgaW5pdGlhdGluZyBhdXRvcGxheSBoYW5kbGVyLi4uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLiNnZXROZXh0VHJhY2soKSE7XG4gICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2VtaXRFbmQoKSB7XG4gICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZSwgdGhpcyk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2hhbmRsZUF1dG9wbGF5KHRyYWNrOiBUcmFjaykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBBdXRvcGxheSA+PiBGaW5kaW5nIHJlbGF0ZWQgdHJhY2tzIGZvciBUcmFjayAke3RyYWNrLnRpdGxlfSAoJHtcbiAgICAgICAgdHJhY2sudXJsfSkgW2V4dDoke1xuICAgICAgICB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWBcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgKGF3YWl0IHRyYWNrLmV4dHJhY3Rvcj8uZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KSk/LlxuICAgICAgdHJhY2tzIHx8XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSk7XG4gICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgdG8gcHJvdmlkZSByZXN1bHRzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gc3VjY2Vzc2Z1bGx5IHJldHVybmVkIHJlc3VsdHMuYFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiByZXMudHJhY2tzO1xuICAgICAgfSkpPy5cbiAgICAgIHJlc3VsdCB8fFxuICAgICAgW107XG5cbiAgICAgIGxldCByZXNvbHZlcjogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRyYWNrIHwgbnVsbD4oXG4gICAgICAgIChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXksXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRyYWNrcyxcbiAgICAgICAgcmVzb2x2ZXIhXG4gICAgICApO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXNvbHZlcihcbiAgICAgICAgICB0cmFja3MubGVuZ3RoID9cbiAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlID0gdHJhY2tzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB1bmlxdWU/LlswXSA/PyBVdGlsLnJhbmRvbUNob2ljZSh0cmFja3Muc2xpY2UoMCwgNSkpO1xuICAgICAgICAgIH0pKCkgOlxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dFRyYWNrID0gYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgIGlmICghbmV4dFRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKCdBdXRvcGxheSA+PiBObyB0cmFjayB3YXMgZm91bmQsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICB0aHJvdyAnTm8gdHJhY2sgd2FzIGZvdW5kJztcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5ub2RlLnBsYXkobmV4dFRyYWNrLCB7XG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMCxcbiAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgfVxuICB9XG59IiwgImltcG9ydCB7XG4gIEF1ZGlvUGxheWVyLFxuICBBdWRpb1BsYXllckVycm9yLFxuICBBdWRpb1BsYXllclN0YXR1cyxcbiAgQXVkaW9SZXNvdXJjZSxcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gIGVudGVyc1N0YXRlLFxuICBTdHJlYW1UeXBlLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIFZvaWNlQ29ubmVjdGlvblN0YXR1cyxcbiAgVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbiB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7XG4gIEVxdWFsaXplckJhbmQsXG4gIEJpcXVhZEZpbHRlcnMsXG4gIFBDTUZpbHRlcnMsXG4gIEZpbHRlcnNDaGFpbiB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgUG9zdFByb2Nlc3NlZFJlc3VsdCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IE5vQXVkaW9SZXNvdXJjZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9JbnRlcmNlcHRlZFN0cmVhbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RyZWFtT3BzIHtcbiAgdHlwZT86IFN0cmVhbVR5cGU7XG4gIGRhdGE6IFRyYWNrO1xuICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ/OiBib29sZWFuO1xuICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkRmlsdGVyPzogQmlxdWFkRmlsdGVycztcbiAgZGlzYWJsZUZpbHRlcnM/OiBib29sZWFuO1xuICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgc2FtcGxlUmF0ZT86IG51bWJlcjtcbiAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VFdmVudHMge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgc3RhcnQ6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gIGRzcDogKGZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gYW55O1xuICBlcUJhbmRzOiAoZmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiBhbnk7XG4gIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBudW1iZXIpID0+IGFueTtcbiAgYmlxdWFkOiAoZmlsdGVyczogQmlxdWFkRmlsdGVycykgPT4gYW55O1xuICB2b2x1bWU6ICh2b2x1bWU6IG51bWJlcikgPT4gYW55O1xuICBkZXN0cm95ZWQ6ICgpID0+IGFueTtcbiAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG59XG5cbmNsYXNzIFN0cmVhbURpc3BhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8Vm9pY2VFdmVudHM+IHtcbiAgcHVibGljIHZvaWNlQ29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uO1xuICBwdWJsaWMgYXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyO1xuICBwdWJsaWMgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsO1xuICBwdWJsaWMgYXVkaW9SZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbDtcbiAgcHVibGljIGRzcCA9IG5ldyBGaWx0ZXJzQ2hhaW4oKTtcblxuICAjaW50ZXJjZXB0b3I6IEludGVyY2VwdGVkU3RyZWFtIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IGNvbm5lY3Rpb24gb2JqZWN0XG4gICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgY29ubmVjdGVkIGNoYW5uZWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICBjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgcHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlLFxuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlciA9IDIwMDAwLFxuICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyKVxuICB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAgICogQHR5cGUge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgKi9cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXVkaW8gcGxheWVyXG4gICAgICogQHR5cGUge0F1ZGlvUGxheWVyfVxuICAgICAqL1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIgPVxuICAgIGF1ZGlvUGxheWVyIHx8XG4gICAgY3JlYXRlQXVkaW9QbGF5ZXIoe1xuICAgICAgZGVidWc6IHRoaXMucXVldWUuaGFzRGVidWdnZXJcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHR5cGUge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9XG4gICAgICovXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcblxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oXG4gICAgICAnZXJyb3InLFxuICAgICAgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvciBhcyBBdWRpb1BsYXllckVycm9yKVxuICAgICk7XG4gICAgdGhpcy5hdWRpb1BsYXllci5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgdGhpcy5kc3Aub25VcGRhdGUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZHNwKSByZXR1cm47XG4gICAgICBpZiAodGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycylcbiAgICAgIHRoaXMuZW1pdCgnZHNwJywgdGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycyk7XG4gICAgICBpZiAodGhpcy5kc3AuYmlxdWFkPy5maWx0ZXJzKVxuICAgICAgdGhpcy5lbWl0KCdiaXF1YWQnLCB0aGlzLmRzcC5iaXF1YWQ/LmZpbHRlcnMpO1xuICAgICAgaWYgKHRoaXMuZHNwLmVxdWFsaXplcikgdGhpcy5lbWl0KCdlcUJhbmRzJywgdGhpcy5kc3AuZXF1YWxpemVyLmdldEVRKCkpO1xuICAgICAgaWYgKHRoaXMuZHNwLnZvbHVtZSkgdGhpcy5lbWl0KCd2b2x1bWUnLCB0aGlzLmRzcC52b2x1bWUudm9sdW1lKTtcbiAgICAgIGlmICh0aGlzLmRzcC5yZXNhbXBsZXIpXG4gICAgICB0aGlzLmVtaXQoJ3NhbXBsZVJhdGUnLCB0aGlzLmRzcC5yZXNhbXBsZXIuc2FtcGxlUmF0ZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZHNwLm9uRXJyb3IgPSAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5cbiAgICBvbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkLCBhc3luYyAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLk1hbnVhbCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICBuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uV2ViU29ja2V0Q2xvc2UgJiZcbiAgICAgIG5ld1N0YXRlLmNsb3NlQ29kZSA9PT0gNDAxNClcbiAgICAgIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZShcbiAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLFxuICAgICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcsXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT1cbiAgICAgICAgICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpXG5cbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgPCA1KSB7XG4gICAgICAgIGF3YWl0IFV0aWwud2FpdCgodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgKyAxKSAqIDUwMDApO1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT1cbiAgICAgICAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuXG4gICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5cbiAgICBvbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkLCAoKSA9PiB7XG4gICAgICB0aGlzLmVuZCgpO1xuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uRGVzdHJveWVkLCB0aGlzLnF1ZXVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ3N0YXRlQ2hhbmdlJywgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiZcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKVxuICAgICAge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclBhdXNlLCB0aGlzLnF1ZXVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiZcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKVxuICAgICAge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZSwgdGhpcy5xdWV1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmcpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICBvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgfHxcbiAgICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmcpXG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdzdGFydCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgbmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlICYmXG4gICAgICBvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUpXG4gICAgICB7XG4gICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgKi9cbiAgZ2V0IHBhdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZDtcbiAgfVxuXG4gIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgdmFsID8gdGhpcy5wYXVzZSh0cnVlKSA6IHRoaXMucmVzdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkuXG4gICAqL1xuICBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wYXVzZWQgfHxcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5BdXRvUGF1c2VkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZ1xuICAgKi9cbiAgaXNCdWZmZXJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZ1xuICAgKi9cbiAgaXNQbGF5aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpZGxlXG4gICAqL1xuICBpc0lkbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgKi9cbiAgaXNEZXN0cm95ZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICovXG4gIGlzRGlzY29ubmVjdGVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gcGxheVxuICAgKi9cbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgc2lnbmFsbGluZ1xuICAgKi9cbiAgaXNTaWduYWxsaW5nKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5TaWduYWxsaW5nKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RpbmdcbiAgICovXG4gIGlzQ29ubmVjdGluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHN0cmVhbVxuICAgKiBAcGFyYW0ge1JlYWRhYmxlfSBzcmMgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHNdIE9wdGlvbnNcbiAgICogQHJldHVybnMge0F1ZGlvUmVzb3VyY2V9XG4gICAqL1xuICBhc3luYyBjcmVhdGVTdHJlYW0oc3JjOiBSZWFkYWJsZSwgb3BzOiBDcmVhdGVTdHJlYW1PcHMpIHtcbiAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKCdJbml0aWF0aW5nIERTUCBmaWx0ZXJzIHBpcGVsaW5lLi4uJyk7XG4gICAgY29uc3Qgc3RyZWFtID0gIW9wcz8uZGlzYWJsZUZpbHRlcnMgP1xuICAgIHRoaXMuZHNwLmNyZWF0ZShzcmMsIHtcbiAgICAgIGRzcDoge1xuICAgICAgICBmaWx0ZXJzOiBvcHM/LmRlZmF1bHRGaWx0ZXJzLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgfSxcbiAgICAgIGJpcXVhZDogb3BzPy5iaXF1YWRGaWx0ZXIgP1xuICAgICAge1xuICAgICAgICBmaWx0ZXI6IG9wcy5iaXF1YWRGaWx0ZXIsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVCaXF1YWRcbiAgICAgIH0gOlxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcmVzYW1wbGVyOiBvcHM/LnNhbXBsZVJhdGUgP1xuICAgICAge1xuICAgICAgICBpbnB1dFNhbXBsZVJhdGU6IDQ4MDAwLFxuICAgICAgICB0YXJnZXRTYW1wbGVSYXRlOiBvcHM/LnNhbXBsZVJhdGUsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVSZXNhbXBsZXJcbiAgICAgIH0gOlxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXF1YWxpemVyOiB7XG4gICAgICAgIGJhbmRNdWx0aXBsaWVyOiBvcHM/LmVxLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRXF1YWxpemVyXG4gICAgICB9LFxuICAgICAgdm9sdW1lOiB7XG4gICAgICAgIHZvbHVtZTogb3BzPy52b2x1bWUsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVWb2x1bWVcbiAgICAgIH1cbiAgICB9KSA6XG4gICAgc3JjO1xuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgIHRoaXMucXVldWUuZGVidWcoJ0V4ZWN1dGluZyBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhvb2suLi4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3N0U3RyZWFtID0gYXdhaXQgdGhpcy5xdWV1ZS5cbiAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtPy4oc3RyZWFtLCB0aGlzLnF1ZXVlLCBvcHM/LmRhdGEpLlxuICAgIGNhdGNoKFxuICAgICAgKCkgPT5cbiAgICAgICh7XG4gICAgICAgIHN0cmVhbTogc3RyZWFtLFxuICAgICAgICB0eXBlOiBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnlcbiAgICAgIH0pIGFzIFBvc3RQcm9jZXNzZWRSZXN1bHRcbiAgICApO1xuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1ByZXBhcmluZyBBdWRpb1Jlc291cmNlLi4uJyk7XG5cbiAgICBjb25zdCBmb3JtYXQgPSBwb3N0U3RyZWFtPy50eXBlID8/IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeTtcblxuICAgIGxldCBfc3RyZWFtOiBSZWFkYWJsZTtcblxuICAgIGlmICh0aGlzLnF1ZXVlLmNhbkludGVyY2VwdCgpKSB7XG4gICAgICB0aGlzLiNpbnRlcmNlcHRvciA9IG5ldyBJbnRlcmNlcHRlZFN0cmVhbSgpO1xuXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAocG9zdFN0cmVhbT8uc3RyZWFtID8/IHN0cmVhbSkucGlwZSh0aGlzLiNpbnRlcmNlcHRvcik7XG5cbiAgICAgIF9zdHJlYW0gPSB0aGlzLiNpbnRlcmNlcHRvcjtcblxuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuaGFuZGxlSW50ZXJjZXB0aW5nU3RyZWFtKFxuICAgICAgICB0aGlzLnF1ZXVlLFxuICAgICAgICBvcHM/LmRhdGEsXG4gICAgICAgIGZvcm1hdCxcbiAgICAgICAgdGhpcy4jaW50ZXJjZXB0b3JcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9zdHJlYW0gPSBwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtO1xuICAgIH1cblxuICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IGNyZWF0ZUF1ZGlvUmVzb3VyY2UoX3N0cmVhbSwge1xuICAgICAgaW5wdXRUeXBlOiBmb3JtYXQsXG4gICAgICBtZXRhZGF0YTogb3BzPy5kYXRhIGFzIFRyYWNrLFxuICAgICAgLy8gdm9sdW1lIGNvbnRyb2xzIGhhcHBlbiBmcm9tIEF1ZGlvRmlsdGVyIERTUCB1dGlsaXR5XG4gICAgICBpbmxpbmVWb2x1bWU6IGZhbHNlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hdWRpb1Jlc291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5yZXNhbXBsZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5maWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5iaXF1YWQgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uZXF1YWxpemVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYXllciBzdGF0dXNcbiAgICogQHR5cGUge0F1ZGlvUGxheWVyU3RhdHVzfVxuICAgKi9cbiAgZ2V0IHN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgZnJvbSB2b2ljZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGRpc2Nvbm5lY3QoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmF1ZGlvUGxheWVyKSB0aGlzLmF1ZGlvUGxheWVyLnN0b3AodHJ1ZSk7XG4gICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoaXMgZGlzcGF0Y2hlclxuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuYXVkaW9QbGF5ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuZW1pdCgnZGVzdHJveWVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsYXllclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGVuZCgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5hdWRpb1BsYXllci5zdG9wKCk7XG4gICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vXG4gICAgfX1cblxuICAvKipcbiAgICogUGF1c2VzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJwb2xhdGVTaWxlbmNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgcGxheWVyIHdpbGwgcGxheSA1IHBhY2tldHMgb2Ygc2lsZW5jZSBhZnRlciBwYXVzaW5nIHRvIHByZXZlbnQgYXVkaW8gZ2xpdGNoZXMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnBhdXNlKGludGVycG9sYXRlU2lsZW5jZSk7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcmVzdW1lKCkge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnVucGF1c2UoKTtcbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHN0cmVhbVxuICAgKiBAcGFyYW0ge0F1ZGlvUmVzb3VyY2U8VHJhY2s+fSBbcmVzb3VyY2U9dGhpcy5hdWRpb1Jlc291cmNlXSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHVzPWZhbHNlXSBXaGV0aGVyIG9yIG5vdCB0byB1c2Ugb3B1c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICovXG4gIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBOb0F1ZGlvUmVzb3VyY2VFcnJvcigpO1xuICAgIH1cbiAgICBpZiAocmVzb3VyY2UuZW5kZWQpIHtcbiAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZmluaXNoJywgcmVzb3VyY2UpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgdGhpcy5hdWRpb1Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZShcbiAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbixcbiAgICAgICAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHksXG4gICAgICAgICAgdGhpcy5jb25uZWN0aW9uVGltZW91dFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2b2x1bWUgYW1vdW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2V0Vm9sdW1lKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUuc2V0Vm9sdW1lKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB2b2x1bWVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB2b2x1bWUoKSB7XG4gICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiAxMDA7XG4gICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBzdHJlYW1UaW1lKCkge1xuICAgIGlmICghdGhpcy5hdWRpb1Jlc291cmNlKSByZXR1cm4gMDtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1Jlc291cmNlLnBsYXliYWNrRHVyYXRpb247XG4gIH1cbn1cblxuZXhwb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9OyIsICJpbXBvcnQgeyBUcmFuc2Zvcm0sIHR5cGUgVHJhbnNmb3JtQ2FsbGJhY2ssIHR5cGUgV3JpdGFibGUgfSBmcm9tICdub2RlOnN0cmVhbSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN0cmVhbSB0aGF0IGNhbiBiZSBpbnRlcmNlcHRlZCBhbmQgY29uc3VtZWQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIG9yaWdpbmFsIGNvbnN1bWVyLlxuICogQGV4YW1wbGUgY29uc3Qgc3RyZWFtID0gbmV3IEludGVyY2VwdGVkU3RyZWFtKCk7XG4gKlxuICogLy8gcmVhbCBjb25zdW1lclxuICogc3RyZWFtLnBpcGUoZnMuY3JlYXRlV3JpdGVTdHJlYW0oJ2ZpbGUudHh0JykpO1xuICpcbiAqIC8vIG1hbiBpbiB0aGUgbWlkZGxlIGNvbnN1bWVyXG4gKiBjb25zdCBtYW5JblRoZU1pZGRsZSA9IG5ldyBXcml0YWJsZSh7XG4gKiAgd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICogICBjb25zb2xlLmxvZyhjaHVuay50b1N0cmluZygpKTtcbiAqICAgY2FsbGJhY2soKTtcbiAqICB9XG4gKiB9KTtcbiAqXG4gKiAvLyBzdHJlYW0uaW50ZXJjZXB0b3JzIGlzIGEgU2V0IG9mIFdyaXRhYmxlIHN0cmVhbXNcbiAqIHN0cmVhbS5pbnRlcmNlcHRvcnMuYWRkKG1hbkluVGhlTWlkZGxlKTtcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVyY2VwdGVkU3RyZWFtIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgcHVibGljIHJlYWRvbmx5IGludGVyY2VwdG9ycyA9IG5ldyBTZXQ8V3JpdGFibGU+KCk7XG4gICNpbnRlcmNlcHRpbmcgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTdGFydCBpbnRlcmNlcHRpbmcgdGhlIHN0cmVhbS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzdGF0ZSBvZiBJbnRlcmNlcHRlZFN0cmVhbS5cbiAgICovXG4gIHB1YmxpYyBzdGFydEludGVyY2VwdGluZygpOiB2b2lkIHtcbiAgICB0aGlzLiNpbnRlcmNlcHRpbmcgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgaW50ZXJjZXB0aW5nIHRoZSBzdHJlYW0uIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzdHJlYW0gZnJvbSBiZWluZyBjb25zdW1lZCBieSB0aGUgaW50ZXJjZXB0b3JzLlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byB0ZW1wb3JhcmlseSBzdG9wIHRoZSBpbnRlcmNlcHRpb24uIFRoZSBzdG9wcGVkIHN0YXRlIGNhbiBiZSByZXN1bWVkIGJ5IGNhbGxpbmcgc3RhcnRJbnRlcmNlcHRpbmcgYWdhaW4uXG4gICAqL1xuICBwdWJsaWMgc3RvcEludGVyY2VwdGluZygpOiB2b2lkIHtcbiAgICB0aGlzLiNpbnRlcmNlcHRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdHJlYW0gaXMgYmVpbmcgaW50ZXJjZXB0ZWRcbiAgICovXG4gIHB1YmxpYyBpc0ludGVyY2VwdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jaW50ZXJjZXB0aW5nO1xuICB9XG5cbiAgcHVibGljIF90cmFuc2Zvcm0oXG4gIGNodW5rOiBCdWZmZXIsXG4gIGVuY29kaW5nOiBCdWZmZXJFbmNvZGluZyxcbiAgY2FsbGJhY2s6IFRyYW5zZm9ybUNhbGxiYWNrKVxuICA6IHZvaWQge1xuICAgIHRoaXMucHVzaChjaHVuaywgZW5jb2RpbmcpO1xuXG4gICAgaWYgKHRoaXMuI2ludGVyY2VwdGluZyAmJiB0aGlzLmludGVyY2VwdG9ycy5zaXplID4gMCkge1xuICAgICAgZm9yIChjb25zdCBjb25zdW1lciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgICBjb25zdW1lci53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBfZmluYWwoY2FsbGJhY2s6IFRyYW5zZm9ybUNhbGxiYWNrKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb25zdW1lciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgY29uc3VtZXIuZW5kKCk7XG4gICAgfVxuXG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBfZGVzdHJveShlcnJvcjogRXJyb3IsIGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjayk6IHZvaWQge1xuICAgIGNvbnN0IGlnbm9yZUVycm9yID0gU3RyaW5nKGVycm9yKS5pbmNsdWRlcygnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnKTtcbiAgICBjb25zdCBlcnIgPSBpZ25vcmVFcnJvciA/IHVuZGVmaW5lZCA6IGVycm9yO1xuXG4gICAgZm9yIChjb25zdCBjb25zdW1lciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgY29uc3VtZXIuZGVzdHJveShlcnIpO1xuICAgIH1cblxuICAgIHRoaXMuaW50ZXJjZXB0b3JzLmNsZWFyKCk7XG5cbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG59IiwgImltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IE5vUmVzdWx0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgVHJhY2tTa2lwUmVhc29uIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhID0gYW55PiB7XG4gIHB1YmxpYyB0cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KCdMSUZPJyk7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICh0aGlzLnF1ZXVlIGFzIGFueSkuX19jdXJyZW50IGFzIFRyYWNrIHwgbnVsbCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBOZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBuZXh0VHJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByZXZpb3VzVHJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSWYgaGlzdG9yeSBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVIaXN0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGhpc3RvcnkgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdHJhY2sgdG8gdHJhY2sgaGlzdG9yeVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIHB1c2godHJhY2s6IFRyYWNrIHwgVHJhY2tbXSkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy50cmFja3MuYWRkKHRyYWNrKTtcblxuICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBoaXN0b3J5XG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoZSBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIG5leHQoKSB7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLm5leHRUcmFjaztcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignTm8gbmV4dCB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnF1ZXVlLm5vZGUuc2tpcCh7XG4gICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5IaXN0b3J5TmV4dCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcHBlZCBieSBHdWlsZFF1ZXVlSGlzdG9yeS5uZXh0KCknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJldmlvdXMocHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignTm8gcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgYXdhaXQgdGhpcy5xdWV1ZS5ub2RlLnBsYXkodHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgIGlmIChjdXJyZW50ICYmIHByZXNlcnZlQ3VycmVudCkgdGhpcy5xdWV1ZS5ub2RlLmluc2VydChjdXJyZW50LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyB0byBbR3VpbGRRdWV1ZUhpc3RvcnldLnByZXZpb3VzKClcbiAgICovXG4gIHB1YmxpYyBiYWNrKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5wcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2l6ZSBoaXN0b3J5IHN0b3JlXG4gICAqL1xuICBwdWJsaWMgcmVzaXplKCkge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpKSByZXR1cm47XG4gICAgaWYgKHRoaXMudHJhY2tzLnN0b3JlLmxlbmd0aCA8IHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpIHJldHVybjtcbiAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSwgU3RyZWFtVHlwZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHdhaXRGb3IgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ1R5cGVFcnJvcixcbiAgTm9SZXN1bHRFcnJvcixcbiAgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcixcbiAgT3V0T2ZSYW5nZUVycm9yIH0gZnJvbVxuJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IENyZWF0ZVN0cmVhbU9wcyB9IGZyb20gJy4uL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IEV4dHJhY3RvclN0cmVhbWFibGUgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgT2dnRGVtdXhlciwgT3B1c0RlY29kZXIsIFdlYm1EZW11eGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL29wdXMnO1xuXG5leHBvcnQgY29uc3QgRkZNUEVHX1NSQVRFX1JFR0VYID0gL2FzZXRyYXRlPVxcZCtcXCooXFxkKFxcLlxcZCk/KS87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCByZW5kZXIgdGltZSBjb2Rlc1xuICAgKi9cbiAgdGltZWNvZGVzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAgICovXG4gIGxlbmd0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBiYXIgbGVuZ3RoXG4gICAqL1xuICBsZWZ0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBlbGFwc2VkIHRpbWUgdHJhY2tcbiAgICovXG4gIHJpZ2h0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICAgKi9cbiAgc2VwYXJhdG9yPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aW1lc3RhbXAgYW5kIGxpbmVcbiAgICovXG4gIGluZGljYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbmRpY2F0b3JcbiAgICovXG4gIHF1ZXVlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVBsYXlPcHRpb25zIHtcbiAgcXVldWU/OiBib29sZWFuO1xuICBzZWVrPzogbnVtYmVyO1xuICB0cmFuc2l0aW9uTW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2tpcE9wdGlvbnMge1xuICByZWFzb246IFRyYWNrU2tpcFJlYXNvbjtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJUaW1lc3RhbXAge1xuICBjdXJyZW50OiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuICB0b3RhbDoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcbiAgcHJvZ3Jlc3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1Db25maWcge1xuICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gIHBsYXllckNvbmZpZzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gYW55PiB7XG4gICNwcm9ncmVzcyA9IDA7XG4gICNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSBmYWxzZTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgdGhpcy4jaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gL2xpYm9wdXM6ICh5ZXN8dHJ1ZSkvLnRlc3QoXG4gICAgICB0aGlzLnF1ZXVlLnBsYXllci5zY2FuRGVwcygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpbiBpZGxlIG1vZGVcbiAgICovXG4gIHB1YmxpYyBpc0lkbGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0lkbGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgdGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgaXNCdWZmZXJpbmcoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0J1ZmZlcmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmcgYSB0cmFja1xuICAgKi9cbiAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGxheWluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZFxuICAgKi9cbiAgcHVibGljIGlzUGF1c2VkKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQYXVzZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwcm9ncmVzcyBoaXN0b3J5XG4gICAqL1xuICBwdWJsaWMgcmVzZXRQcm9ncmVzcygpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBsYXllciBwcm9ncmVzc1xuICAgKi9cbiAgcHVibGljIHNldFByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IHByb2dyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJlYW0gdGltZSBmb3IgY3VycmVudCBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc3RyZWFtVGltZSA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgcGxheWJhY2sgZHVyYXRpb24gd2l0aCBoaXN0b3J5IGluY2x1ZGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXliYWNrVGltZSgpIHtcbiAgICBjb25zdCBkdXIgPSB0aGlzLiNwcm9ncmVzcyArIHRoaXMuc3RyZWFtVGltZTtcblxuICAgIHJldHVybiBkdXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGR1cmF0aW9uIG11bHRpcGxpZXJcbiAgICovXG4gIHB1YmxpYyBnZXREdXJhdGlvbk11bHRpcGxpZXIoKSB7XG4gICAgY29uc3Qgc3JhdGVGaWx0ZXJzID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5cbiAgICB0b0FycmF5KCkuXG4gICAgZmlsdGVyKChmZikgPT4gRkZNUEVHX1NSQVRFX1JFR0VYLnRlc3QoZmYpKTtcbiAgICBjb25zdCBtdWx0aXBsaWVycyA9IHNyYXRlRmlsdGVycy5cbiAgICBtYXAoKG0pID0+IHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KEZGTVBFR19TUkFURV9SRUdFWC5leGVjKG0pPy5bMV0gYXMgc3RyaW5nKTtcbiAgICB9KS5cbiAgICBmaWx0ZXIoKGYpID0+ICFpc05hTihmKSk7XG5cbiAgICByZXR1cm4gIW11bHRpcGxpZXJzLmxlbmd0aCA/XG4gICAgMSA6XG4gICAgbXVsdGlwbGllcnMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gY3VycmVudCArIGFjY3VtdWxhdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgcHJvZ3Jlc3Mgb2YgdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIGdldCBlc3RpbWF0ZWRQbGF5YmFja1RpbWUoKSB7XG4gICAgY29uc3QgZHVyID0gdGhpcy5wbGF5YmFja1RpbWU7XG4gICAgY29uc3QgdmFsID0gdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSAqIGR1cjtcblxuICAgIC8vIHdlIGFsc28gbmVlZCB0byBjaGVjayBpZiB3ZSBoYXZlIGEgbmF0aXZlIHJlc2FtcGxlciBmaWx0ZXIgYXMgaXQgbWF5IGFsc28gYWZmZWN0IHRoZSBkdXJhdGlvblxuICAgIGlmICh0aGlzLnF1ZXVlLmZpbHRlcnMucmVzYW1wbGVyKSB7XG4gICAgICAvLyBnZXQgdGhlIHJlc2FtcGxlciByYXRpbyBpZiB3ZSBoYXZlIG9uZVxuICAgICAgY29uc3QgcmF0aW8gPSB0aGlzLnF1ZXVlLmZpbHRlcnMucmVzYW1wbGVyLmdldFJhdGlvKCk7XG4gICAgICBpZiAocmF0aW8gPD0gMCkgcmV0dXJuIHZhbDtcblxuICAgICAgcmV0dXJuIHZhbCAqIHJhdGlvO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgY29uc3QgZHVyID0gdGhpcy50b3RhbER1cmF0aW9uO1xuXG4gICAgLy8gZHVyYXRpb24gbXVsdGlwbGllciBjaGVja3MgZmZtcGVnIGZpbHRlcnMgdGhhdCBtYXkgYWZmZWN0IHRoZSBkdXJhdGlvblxuICAgIGNvbnN0IHZhbCA9IE1hdGgucm91bmQoZHVyIC8gdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSk7XG5cbiAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gY2hlY2sgaWYgd2UgaGF2ZSBhIG5hdGl2ZSByZXNhbXBsZXIgZmlsdGVyIGFzIGl0IG1heSBhbHNvIGFmZmVjdCB0aGUgZHVyYXRpb25cbiAgICBpZiAodGhpcy5xdWV1ZS5maWx0ZXJzLnJlc2FtcGxlcikge1xuICAgICAgLy8gZ2V0IHRoZSByZXNhbXBsZXIgcmF0aW8gaWYgd2UgaGF2ZSBvbmVcbiAgICAgIGNvbnN0IHJhdGlvID0gdGhpcy5xdWV1ZS5maWx0ZXJzLnJlc2FtcGxlci5nZXRSYXRpbygpO1xuICAgICAgaWYgKHJhdGlvIDw9IDApIHJldHVybiB2YWw7XG5cbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbCAvIHJhdGlvKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGF1ZGlvIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRvdGFsRHVyYXRpb24oKSB7XG4gICAgY29uc3QgcHJlZmVyc0JyaWRnZWRNZXRhZGF0YSA9IHRoaXMucXVldWUub3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGE7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcblxuICAgIGlmIChwcmVmZXJzQnJpZGdlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCB0cmFja0hhc0xlZ2FjeU1ldGFkYXRhID1cbiAgICAgIHRyYWNrPy5tZXRhZGF0YSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdHJhY2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAnYnJpZGdlJyBpbiB0cmFjay5tZXRhZGF0YSAmJlxuICAgICAgdHJhY2subWV0YWRhdGEuYnJpZGdlICE9IG51bGw7XG4gICAgICBjb25zdCB0cmFja0hhc01ldGFkYXRhID0gdHJhY2s/LmJyaWRnZWRUcmFjayAhPSBudWxsO1xuXG4gICAgICBpZiAodHJhY2tIYXNMZWdhY3lNZXRhZGF0YSB8fCB0cmFja0hhc01ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID1cbiAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrPy5kdXJhdGlvbk1TID8/XG4gICAgICAgIChcbiAgICAgICAgdHJhY2sgYXMgVHJhY2s8e1xuICAgICAgICAgIGJyaWRnZToge1xuICAgICAgICAgICAgZHVyYXRpb246IG51bWJlcjtcbiAgICAgICAgICB9O1xuICAgICAgICB9PikuXG4gICAgICAgIG1ldGFkYXRhPy5icmlkZ2UuZHVyYXRpb247XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKGR1cmF0aW9uKSkgcmV0dXJuIGR1cmF0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFjaz8uZHVyYXRpb25NUyA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdHJlYW0gcHJvZ3Jlc3NcbiAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyA9IGZhbHNlKTogUGxheWVyVGltZXN0YW1wIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/XG4gICAgdGhpcy5wbGF5YmFja1RpbWUgOlxuICAgIHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lO1xuICAgIGNvbnN0IHRvdGFsID0gaWdub3JlRmlsdGVycyA/IHRoaXMudG90YWxEdXJhdGlvbiA6IHRoaXMuZXN0aW1hdGVkRHVyYXRpb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudDoge1xuICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyhjdXJyZW50KSksXG4gICAgICAgIHZhbHVlOiBjdXJyZW50XG4gICAgICB9LFxuICAgICAgdG90YWw6IHtcbiAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModG90YWwpKSxcbiAgICAgICAgdmFsdWU6IHRvdGFsXG4gICAgICB9LFxuICAgICAgcHJvZ3Jlc3M6IE1hdGgucm91bmQoY3VycmVudCAvIHRvdGFsICogMTAwKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHByb2dyZXNzIGJhciBmb3IgY3VycmVudCBwcm9ncmVzc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBQcm9ncmVzcyBiYXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVByb2dyZXNzQmFyKG9wdGlvbnM/OiBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xuICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7XG4gICAgICBpbmRpY2F0b3IgPSAnXFx1ezFGNTE4fScsXG4gICAgICBsZWZ0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgIHJpZ2h0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgIGxlbmd0aCA9IDE1LFxuICAgICAgdGltZWNvZGVzID0gdHJ1ZSxcbiAgICAgIHNlcGFyYXRvciA9ICdcXHUyNTAzJ1xuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmIChpc05hTihsZW5ndGgpIHx8IGxlbmd0aCA8IDAgfHwgIU51bWJlci5pc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAnW1BsYXllclByb2dyZXNzQmFyT3B0aW9ucy5sZW5ndGhdJyxcbiAgICAgICAgU3RyaW5nKGxlbmd0aCksXG4gICAgICAgICcwJyxcbiAgICAgICAgJ0Zpbml0ZSBOdW1iZXInXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoXG4gICAgICB0aW1lc3RhbXAuY3VycmVudC52YWx1ZSAvIHRpbWVzdGFtcC50b3RhbC52YWx1ZSAqIGxlbmd0aFxuICAgICk7XG4gICAgaWYgKGluZGV4ID49IDEgJiYgaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBiYXIgPSBsZWZ0Q2hhci5yZXBlYXQoaW5kZXggLSAxKS5zcGxpdCgnJyk7XG4gICAgICBiYXIucHVzaChpbmRpY2F0b3IpO1xuICAgICAgYmFyLnB1c2gocmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSBpbmRleCkpO1xuICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICByZXR1cm4gYCR7dGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7c2VwYXJhdG9yfSAke2Jhci5qb2luKFxuICAgICAgICAgICcnXG4gICAgICAgICl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2Jhci5qb2luKCcnKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgIHJldHVybiBgJHtcbiAgICAgICAgdGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7XG4gICAgICAgIHNlcGFyYXRvcn0gJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KFxuICAgICAgICAgIGxlbmd0aCAtIDFcbiAgICAgICAgKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYCR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSAxKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHRoZSBwbGF5ZXJcbiAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VlayhkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkdXJhdGlvbiA9PT0gdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWUpIHJldHVybiB0cnVlO1xuICAgIGlmIChkdXJhdGlvbiA+IHRoaXMudG90YWxEdXJhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuc2tpcCh7XG4gICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNFRUtfT1ZFUl9USFJFU0hPTEQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAgICdbZHVyYXRpb25dJyxcbiAgICAgICAgICBTdHJpbmcoZHVyYXRpb24pLFxuICAgICAgICAgICcwJyxcbiAgICAgICAgICBTdHJpbmcodGhpcy50b3RhbER1cmF0aW9uKVxuICAgICAgICApLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZHVyYXRpb24gPCAwKSBkdXJhdGlvbiA9IDA7XG5cbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5maWx0ZXJzLnRyaWdnZXJSZXBsYXkoZHVyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdm9sdW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2x1bWUgPz8gMTAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2b2x1bWVcbiAgICogQHBhcmFtIHZvbCBWb2x1bWUgYW1vdW50IHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldFZvbHVtZSh2b2w6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVzID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnNldFZvbHVtZSh2b2wpO1xuICAgIGlmIChyZXMpIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB2b2w7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYml0IHJhdGVcbiAgICogQHBhcmFtIHJhdGUgVGhlIGJpdCByYXRlIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldEJpdHJhdGUocmF0ZTogbnVtYmVyIHwgJ2F1dG8nKSB7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5lbmNvZGVyPy5zZXRCaXRyYXRlKFxuICAgICAgcmF0ZSA9PT0gJ2F1dG8nID8gdGhpcy5xdWV1ZS5jaGFubmVsPy5iaXRyYXRlID8/IDY0MDAwIDogcmF0ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBhdXNlZCBzdGF0ZVxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgc2V0UGF1c2VkKHN0YXRlOiBib29sZWFuKSB7XG4gICAgaWYgKHN0YXRlKSByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5wYXVzZSh0cnVlKSB8fCBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXN1bWUoKSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIHRoZSBwbGF5YmFja1xuICAgKi9cbiAgcHVibGljIHJlc3VtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgY3VycmVudCB0cmFja1xuICAgKi9cbiAgcHVibGljIHNraXAob3B0aW9ucz86IFNraXBPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuICAgIGlmICghdHJhY2spIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICBjb25zdCB7IHJlYXNvbiwgZGVzY3JpcHRpb24gfSA9IG9wdGlvbnMgfHwge1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uTWFudWFsLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgdHJhY2sgd2FzIHNraXBwZWQgbWFudWFsbHknXG4gICAgfTtcbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcCxcbiAgICAgIHRoaXMucXVldWUsXG4gICAgICB0cmFjayxcbiAgICAgIHJlYXNvbixcbiAgICAgIGRlc2NyaXB0aW9uXG4gICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICogQHBhcmFtIGVtaXRFdmVudCBXaGV0aGVyIG9yIG5vdCB0byBlbWl0IHRoZSBldmVudCBAZGVmYXVsdFZhbHVlIHRydWVcbiAgICovXG4gIHB1YmxpYyByZW1vdmUodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgZW1pdEV2ZW50ID0gdHJ1ZSkge1xuICAgIGNvbnN0IGZvdW5kVHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5maW5kKCh0LCBpZHgpID0+IHtcbiAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgfSk7XG4gICAgaWYgKCFmb3VuZFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgIHRoaXMucXVldWUudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4gdC5pZCA9PT0gZm91bmRUcmFjay5pZCk7XG5cbiAgICBpZiAoZW1pdEV2ZW50KVxuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZSwgdGhpcy5xdWV1ZSwgZm91bmRUcmFjayk7XG5cbiAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGp1bXAgdG8gd2l0aG91dCByZW1vdmluZyBvdGhlciB0cmFja3NcbiAgICovXG4gIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUodHJhY2ssIGZhbHNlKTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS51bnNoaWZ0KHJlbW92ZWQpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSnVtcCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBqdW1wZWQgdG8gbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYWNrIHBvc2l0aW9uXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFja1Bvc2l0aW9uKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gc2tpcCB0b1xuICAgKi9cbiAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHRyYWNrKTtcbiAgICBpZiAoaWR4IDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuZmlsdGVyKChfLCBpKSA9PiBpIDw9IGlkeCk7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc1JlbW92ZSwgdGhpcy5xdWV1ZSwgdG9SZW1vdmUpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU2tpcFRvLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcGxheWVyIHdhcyBza2lwcGVkIHRvIGFub3RoZXIgdHJhY2sgbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IGEgdHJhY2sgb24gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRvLCBkZWZhdWx0cyB0byAwLlxuICAgKi9cbiAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgIGlmICghKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ3RyYWNrIHZhbHVlJyxcbiAgICAgICdpbnN0YW5jZSBvZiBUcmFjaycsXG4gICAgICBTdHJpbmcodHJhY2spXG4gICAgKTtcbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLm5vRW1pdEluc2VydCkge1xuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgKi9cbiAgcHVibGljIG1vdmUoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGZyb20pO1xuICAgIGlmICghcmVtb3ZlZCkge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgdHJhY2sgdG8gbW92ZScpO1xuICAgIH1cbiAgICB0aGlzLmluc2VydChyZW1vdmVkLCB0byk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgKi9cbiAgcHVibGljIGNvcHkoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgY29uc3Qgc3JjID0gdGhpcy5xdWV1ZS50cmFja3MuYXQodGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZyb20pKTtcbiAgICBpZiAoIXNyYykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgdHJhY2sgdG8gY29weScpO1xuICAgIH1cbiAgICB0aGlzLmluc2VydChzcmMsIHRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgKi9cbiAgcHVibGljIHN3YXAoZmlyc3Q6IFRyYWNrUmVzb2x2YWJsZSwgc2Vjb25kOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oZmlyc3QpO1xuICAgIGlmIChzcmMgPCAwKSB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignaW52YWxpZCBzcmMgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgY29uc3QgZGVzdCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihzZWNvbmQpO1xuICAgIGlmIChkZXN0IDwgMCkgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgZGVzdCB0cmFjayB0byBzd2FwJyk7XG5cbiAgICBjb25zdCBzcmNUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXTtcbiAgICBjb25zdCBkZXN0VCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdO1xuXG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXSA9IGRlc3RUO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdID0gc3JjVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBwbGF5YmFja1xuICAgKiBAcGFyYW0gZm9yY2UgV2hldGhlciBvciBub3QgdG8gZm9yY2VmdWxseSBzdG9wIHRoZSBwbGF5YmFja1xuICAgKi9cbiAgcHVibGljIHN0b3AoZm9yY2UgPSBmYWxzZSkge1xuICAgIHRoaXMucXVldWUudHJhY2tzLmNsZWFyKCk7XG4gICAgdGhpcy5xdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3ApIHtcbiAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcoKSB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5zaXplKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRtKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5kZXN0cm95KCk7XG4gICAgICB9LCB0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bikudW5yZWYoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICogQHBhcmFtIHJlcyBUaGUgdHJhY2sgdG8gcGxheVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBwbGF5aW5nIHRoZSB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXkocmVzPzogVHJhY2sgfCBudWxsLCBvcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucykge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBSZWNlaXZlZCBwbGF5IHJlcXVlc3QgZnJvbSBndWlsZCAke3RoaXMucXVldWUuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMucXVldWUuZ3VpbGQuaWR9KWBcbiAgICApO1xuXG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcXVldWU6IHRoaXMucXVldWUuY3VycmVudFRyYWNrICE9IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMFxuICAgICAgfSBhcyBSZXNvdXJjZVBsYXlPcHRpb25zLFxuICAgICAgb3B0aW9uc1xuICAgICkhO1xuXG4gICAgaWYgKHJlcyAmJiBvcHRpb25zLnF1ZXVlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICdSZXF1ZXN0ZWQgb3B0aW9uIHJlcXVpcmVzIHRvIHF1ZXVlIHRoZSB0cmFjaywgYWRkaW5nIHRoZSBnaXZlbiB0cmFjayB0byBxdWV1ZSBpbnN0ZWFkLi4uJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2sgPSByZXMgfHwgdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBOb1Jlc3VsdEVycm9yKFxuICAgICAgICAnUGxheSByZXF1ZXN0IHJlY2VpdmVkIGJ1dCB0cmFjayB3YXMgbm90IHByb3ZpZGVkJ1xuICAgICAgKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIHRoaXMucXVldWUsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcGxheSB0aGUgdHJhY2ssIGluaXRpYWxpemluZy4uLidcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFzc2lnbmVkUmVzb3VyY2UgPSB0cmFjay5yZXNvdXJjZTtcblxuICAgICAgaWYgKGFzc2lnbmVkUmVzb3VyY2UpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgJ1RyYWNrIGhhcyBhbiBhdWRpbyByZXNvdXJjZSBhc3NpZ25lZCwgcGxheWVyIHdpbGwgbm93IHBsYXkgdGhlIHJlc291cmNlIGRpcmVjdGx5Li4uJ1xuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyghIW9wdGlvbnMudHJhbnNpdGlvbk1vZGUpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLiNwZXJmb3JtUGxheShhc3NpZ25lZFJlc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBJbml0aWF0aW5nIHN0cmVhbSBleHRyYWN0aW9uIHByb2Nlc3MuLi5gKTtcbiAgICAgIGNvbnN0IHNyYyA9IHRyYWNrLnJhdz8uc291cmNlIHx8IHRyYWNrLnNvdXJjZTtcbiAgICAgIGNvbnN0IHF0OiBTZWFyY2hRdWVyeVR5cGUgPVxuICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IChcbiAgICAgIHNyYyA9PT0gJ3Nwb3RpZnknID9cbiAgICAgICdzcG90aWZ5U29uZycgOlxuICAgICAgc3JjID09PSAnYXBwbGVfbXVzaWMnID9cbiAgICAgICdhcHBsZU11c2ljU29uZycgOlxuICAgICAgc3JjKTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYEV4ZWN1dGluZyBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBob29rIChRdWVyeVR5cGU6ICR7cXR9KS4uLmBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0cmVhbVNyYyA9IHtcbiAgICAgICAgZXJyb3I6IG51bGwgYXMgRXJyb3IgfCBudWxsLFxuICAgICAgICBzdHJlYW06IG51bGwgYXMgRXh0cmFjdG9yU3RyZWFtYWJsZSB8IG51bGxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMucXVldWUuXG4gICAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT8uKHRyYWNrLCBxdCB8fCAnYXJiaXRyYXJ5JywgdGhpcy5xdWV1ZSkuXG4gICAgICB0aGVuKFxuICAgICAgICAocykgPT4ge1xuICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gcztcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBFcnJvcikgPT4gc3RyZWFtU3JjLmVycm9yID0gZVxuICAgICAgKTtcblxuICAgICAgLy8gdGhyb3cgaWYgJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBwYW5pY3NcbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSAmJiBzdHJlYW1TcmMuZXJyb3IpXG4gICAgICByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAnRmFpbGVkIHRvIGdldCBzdHJlYW0gZnJvbSBvbkJlZm9yZUNyZWF0ZVN0cmVhbSwgYXR0ZW1wdGluZyB0byBleHRyYWN0IHN0cmVhbSB1c2luZyBleHRyYWN0b3JzLi4uJ1xuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLmNvbnRleHQucHJvdmlkZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgICAgICAgIGF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgICAgICAgYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9yczogbmV3IFNldDxzdHJpbmc+KClcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgdGhpcy4jY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjaykudGhlbihcbiAgICAgICAgICAgIChyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyPy5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gPFJlYWRhYmxlPiByLnJlc3VsdDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAocj8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW1TcmMuZXJyb3IgPSByLmVycm9yO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSBzdHJlYW1TcmMuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlOiBFcnJvcikgPT4gc3RyZWFtU3JjLmVycm9yID0gZVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zZWVrID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnNlZWsgPj0gMCkge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IG9wdGlvbnMuc2VlaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhY2tTdHJlYW1Db25maWc6IFN0cmVhbUNvbmZpZyA9IHtcbiAgICAgICAgZGlzcGF0Y2hlckNvbmZpZzoge1xuICAgICAgICAgIGRpc2FibGVCaXF1YWQ6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlQmlxdWFkLFxuICAgICAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgICAgIGRpc2FibGVWb2x1bWU6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlVm9sdW1lLFxuICAgICAgICAgIGRpc2FibGVGaWx0ZXJzOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyLFxuICAgICAgICAgIGRpc2FibGVSZXNhbXBsZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgIHNhbXBsZVJhdGU6XG4gICAgICAgICAgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUgPz8gKFxuICAgICAgICAgIHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPiAwID9cbiAgICAgICAgICB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyIDpcbiAgICAgICAgICB1bmRlZmluZWQpLFxuICAgICAgICAgIGJpcXVhZEZpbHRlcjpcbiAgICAgICAgICB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBlcTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcixcbiAgICAgICAgICBkZWZhdWx0RmlsdGVyczogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsXG4gICAgICAgICAgdm9sdW1lOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lLFxuICAgICAgICAgIGRhdGE6IHRyYWNrLFxuICAgICAgICAgIHR5cGU6IFN0cmVhbVR5cGUuUmF3LFxuICAgICAgICAgIHNraXBGRm1wZWc6IHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZ1xuICAgICAgICB9LFxuICAgICAgICBwbGF5ZXJDb25maWc6IG9wdGlvbnNcbiAgICAgIH07XG5cbiAgICAgIGxldCByZXNvbHZlcjogKCkgPT4gdm9pZCA9IFV0aWwubm9vcDtcbiAgICAgIGNvbnN0IGRvbmVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHJlc29sdmVyID0gcmVzb2x2ZSk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5XaWxsUGxheVRyYWNrLFxuICAgICAgICB0aGlzLnF1ZXVlLFxuICAgICAgICB0cmFjayxcbiAgICAgICAgdHJhY2tTdHJlYW1Db25maWcsXG4gICAgICAgIHJlc29sdmVyIVxuICAgICAgKTtcblxuICAgICAgLy8gcHJldmVudCBkYW5nbGluZyBwcm9taXNlXG4gICAgICBpZiAoIXN1Y2Nlc3MpIHJlc29sdmVyKCk7XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnV2FpdGluZyBmb3Igd2lsbFBsYXlUcmFjayBldmVudCB0byByZXNvbHZlLi4uJyk7XG5cbiAgICAgIGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgIGNvbnN0IGRhc3BEaXNhYmxlZCA9IFtcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUJpcXVhZCxcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUZpbHRlcnMsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWVdLlxuICAgICAgZXZlcnkoKGUpID0+ICEhZSA9PT0gdHJ1ZSk7XG5cbiAgICAgIGNvbnN0IG5lZWRzRmlsdGVycyA9XG4gICAgICAhIXRyYWNrU3RyZWFtQ29uZmlnLnBsYXllckNvbmZpZy5zZWVrIHx8XG4gICAgICAhIXRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuYXJncy5sZW5ndGg7XG4gICAgICBjb25zdCBzaG91bGRTa2lwRkZtcGVnID1cbiAgICAgICEhdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5za2lwRkZtcGVnICYmICFuZWVkc0ZpbHRlcnM7XG5cbiAgICAgIGxldCBmaW5hbFN0cmVhbTogUmVhZGFibGU7XG5cbiAgICAgIGNvbnN0IGRlbXV4YWJsZSA9IChmbXQ6IHN0cmluZykgPT5cbiAgICAgIFtTdHJlYW1UeXBlLk9wdXMsIFN0cmVhbVR5cGUuV2VibU9wdXMsIFN0cmVhbVR5cGUuT2dnT3B1c10uaW5jbHVkZXMoXG4gICAgICAgIGZtdCBhcyBTdHJlYW1UeXBlXG4gICAgICApO1xuXG4gICAgICAvLyBza2lwIGZmbXBlZyB3aGVuIHBvc3NpYmxlXG4gICAgICBpZiAoXG4gICAgICBzaG91bGRTa2lwRkZtcGVnICYmXG4gICAgICAhKHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSkgJiZcbiAgICAgIHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtICE9PSAnc3RyaW5nJyAmJlxuICAgICAgZGVtdXhhYmxlKHN0cmVhbVNyYy5zdHJlYW0uJGZtdCkpXG4gICAgICB7XG4gICAgICAgIGNvbnN0IHsgJGZtdCwgc3RyZWFtIH0gPSBzdHJlYW1TcmMuc3RyZWFtO1xuICAgICAgICBjb25zdCBzaG91bGRQQ00gPSAhZGFzcERpc2FibGVkO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBza2lwRkZtcGVnIGlzIHNldCB0byB0cnVlIGFuZCBzdHJlYW0gaXMgZGVtdXhhYmxlLCBjcmVhdGluZyBzdHJlYW0gd2l0aCB0eXBlICR7XG4gICAgICAgICAgc2hvdWxkUENNID8gJ3BjbScgOiAnb3B1cyd9YFxuXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNvbnN0IG9wdXNTdHJlYW0gPSAkZm10ID09PSBTdHJlYW1UeXBlLk9wdXMgP1xuICAgICAgICBzdHJlYW0gOlxuICAgICAgICAkZm10ID09PSBTdHJlYW1UeXBlLk9nZ09wdXMgP1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgT2dnRGVtdXhlcigpIGFzIGFueSkgOlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgV2VibURlbXV4ZXIoKSBhcyBhbnkpO1xuXG4gICAgICAgIGlmIChzaG91bGRQQ00pIHtcbiAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBmaWx0ZXJzIGVuYWJsZWQsIHdlIG5lZWQgdG8gZGVjb2RlIHRoZSBvcHVzIHN0cmVhbSB0byBwY21cbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW0ucGlwZShcbiAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICAgICAgICBmcmFtZVNpemU6IDk2MCxcbiAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5PcHVzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zdCBvcHVzID0gZGFzcERpc2FibGVkICYmIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbjtcbiAgICAgICAgLy8gaWYgKG9wdXMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRGlzYWJsaW5nIFBDTSBvdXRwdXQgc2luY2UgYWxsIGZpbHRlcnMgYXJlIGRpc2FibGVkIGFuZCBvcHVzIGVuY29kaW5nIGlzIHN1cHBvcnRlZC4uLicpO1xuXG4gICAgICAgIGZpbmFsU3RyZWFtID0gdGhpcy4jY3JlYXRlRkZtcGVnU3RyZWFtKFxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSB8fFxuICAgICAgICAgIHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA6XG4gICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbS5zdHJlYW0sXG4gICAgICAgICAgdHJhY2ssXG4gICAgICAgICAgb3B0aW9ucy5zZWVrID8/IDBcbiAgICAgICAgICAvLyBvcHVzXG4gICAgICAgICk7XG4gICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICAvLyBGSVhNRTogT2dnT3B1cyByZXN1bHRzIGluIHN0YXRpYyBub2lzZVxuICAgICAgICAvLyB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBvcHVzID8gU3RyZWFtVHlwZS5PZ2dPcHVzIDogU3RyZWFtVHlwZS5SYXc7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25Nb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBUcmFuc2l0aW9uIG1vZGUgZGV0ZWN0ZWQsIHBsYXllciB3aWxsIHdhaXQgZm9yIGJ1ZmZlcmluZyB0aW1lb3V0IHRvIGV4cGlyZSAoVGltZW91dDogJHt0aGlzLnF1ZXVlLm9wdGlvbnMuYnVmZmVyaW5nVGltZW91dH1tcylgXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHdhaXRGb3IodGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnQnVmZmVyaW5nIHRpbWVvdXQgaGFzIGV4cGlyZWQhJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYFByZXBhcmluZyBmaW5hbCBzdHJlYW0gY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgMlxuICAgICAgICApfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI7XG5cbiAgICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmaW5hbFN0cmVhbS5kZXN0cm95KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IGRpc3BhdGNoZXIuY3JlYXRlU3RyZWFtKFxuICAgICAgICAgIGZpbmFsU3RyZWFtLFxuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWdcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICBhd2FpdCB0aGlzLiNwZXJmb3JtUGxheShyZXNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhdWRpbyBwbGF5ZXI6ICR7ZX1gKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgI3Rocm93KHRyYWNrOiBUcmFjaywgZXJyb3I/OiBFcnJvciB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQgPVxuICAgIG5ldyBOb1Jlc3VsdEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBzdHJlYW0gZm9yIHRoaXMgdHJhY2ske2Vycm9yID8gYFxcblxcbiR7ZXJyb3Iuc3RhY2sgfHwgZXJyb3J9YCA6ICcnfWApO1xuXG5cbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcCxcbiAgICAgIHRoaXMucXVldWUsXG4gICAgICB0cmFjayxcbiAgICAgIFRyYWNrU2tpcFJlYXNvbi5Ob1N0cmVhbSxcbiAgICAgIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdC5tZXNzYWdlXG4gICAgKTtcbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3IsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0LFxuICAgICAgdHJhY2tcbiAgICApO1xuICAgIGNvbnN0IG5leHRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKG5leHRUcmFjaykgcmV0dXJuIHZvaWQgdGhpcy5wbGF5KG5leHRUcmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzaG91bGQgYmUgcmVzb2x2ZWRcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmVtaXQoJ2ZpbmlzaCcsIG51bGwpO1xuICB9XG5cbiAgYXN5bmMgI3BlcmZvcm1QbGF5KHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICdEaXNwYXRjaGVyIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHRoZSBxdWV1ZSBiZWluZyBkZWxldGVkIGluIHRoZSBtaWRkbGUgb2Ygb3BlcmF0aW9uLiBDYW5jZWxsaW5nIHRoZSBzdHJlYW0uLi4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhbGl6aW5nIGF1ZGlvIHBsYXllci4uLicpO1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnBsYXlTdHJlYW0ocmVzb3VyY2UpO1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc3BhdGNoaW5nIGF1ZGlvLi4uJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF0dGVtcHRlZEV4dHJhY3RvcnMgPVxuICAgIHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuZ2V0Q29udGV4dCgpPy5hdHRlbXB0ZWRFeHRyYWN0b3JzIHx8XG4gICAgbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBzdHJlYW1JbmZvID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oXG4gICAgICBhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoXG4gICAgICAgICAgKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllclxuICAgICAgICApKVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGF0dGVtcHRlZEV4dHJhY3RvcnMuaGFzKGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBhdHRlbXB0ZWRFeHRyYWN0b3JzLmFkZChleHRyYWN0b3IuaWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IGNhblN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZShcbiAgICAgICAgICB0cmFjay51cmwsXG4gICAgICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZSh0cmFjay51cmwpLnR5cGVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjYW5TdHJlYW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3Rvci5zdHJlYW0odHJhY2spO1xuICAgICAgfSxcbiAgICAgIGZhbHNlXG4gICAgKTtcblxuICAgIGlmICghc3RyZWFtSW5mbyB8fCAhc3RyZWFtSW5mby5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYEdlbmVyaWMgc3RyZWFtIGV4dHJhY3Rpb24gZmFpbGVkIGFuZCBmYWxsYmFjayBzdHJlYW0gZXh0cmFjdGlvbiBpcyBlbmFibGVkYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy4jY3JlYXRlRmFsbGJhY2tTdHJlYW0odHJhY2spO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RyZWFtSW5mbyB8fCBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgU3RyZWFtIGV4dHJhY3Rpb24gd2FzIHN1Y2Nlc3NmdWwgZm9yIFRyYWNrIHsgdGl0bGU6ICR7XG4gICAgICB0cmFjay50aXRsZX0sIHVybDogJHtcbiAgICAgIHRyYWNrLnVybH0gfSAoRXh0cmFjdG9yOiAke1xuICAgICAgc3RyZWFtSW5mby5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWBcblxuICAgICk7XG5cbiAgICByZXR1cm4gc3RyZWFtSW5mbztcbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVGYWxsYmFja1N0cmVhbSh0cmFjazogVHJhY2spIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYEF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2QuLi5gXG4gICAgKTtcblxuICAgIGNvbnN0IHZlcmlmeUZhbGxiYWNrU3RyZWFtID0gdGhpcy5xdWV1ZS5vcHRpb25zLnZlcmlmeUZhbGxiYWNrU3RyZWFtO1xuXG4gICAgY29uc3QgZmFsbGJhY2tTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnJ1bihcbiAgICAgIGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgaWYgKGV4dHJhY3Rvci5pZGVudGlmaWVyID09PSB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKFxuICAgICAgICB0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZShcbiAgICAgICAgICAoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyXG4gICAgICAgICkpXG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeSA9IGAke3RyYWNrLnRpdGxlfSAke3RyYWNrLmF1dGhvcn1gO1xuXG4gICAgICAgIGlmICh2ZXJpZnlGYWxsYmFja1N0cmVhbSkge1xuICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICBgRmFsbGJhY2sgc3RyZWFtIHZlcmlmaWNhdGlvbiBpcyBlbmFibGVkLCB2YWxpZGF0aW5nIHF1ZXJ5IGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfS4uLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2hvdWxkUHJvY2VlZCA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZShcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IHRyYWNrLnNvdXJjZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIXNob3VsZFByb2NlZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byB2YWxpZGF0ZSBxdWVyeSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgIGBRdWVyeSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gd2FzIHZhbGlkYXRlZCB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfS4gUHJvY2VlZGluZyB3aXRoIGV4dHJhY3Rpb24uLi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhbGxiYWNrVHJhY2tzID0gYXdhaXQgZXh0cmFjdG9yLmhhbmRsZShxdWVyeSwge1xuICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0cmFjay5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBmYWxsYmFja1RyYWNrID0gZmFsbGJhY2tUcmFja3MudHJhY2tzWzBdO1xuXG4gICAgICAgIGlmICghZmFsbGJhY2tUcmFjaykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci5zdHJlYW0oZmFsbGJhY2tUcmFjayk7XG5cbiAgICAgICAgaWYgKCFzdHJlYW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgICB0cmFjay5icmlkZ2VkVHJhY2sgPSBmYWxsYmFja1RyYWNrO1xuXG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgICB9LFxuICAgICAgdHJ1ZVxuICAgICk7XG5cbiAgICBpZiAoIWZhbGxiYWNrU3RyZWFtIHx8ICFmYWxsYmFja1N0cmVhbS5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgZmFsbGJhY2sgc3RyZWFtaW5nIG1ldGhvZGBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsbGJhY2tTdHJlYW0gfHwgbnVsbDtcbiAgICB9XG5cbiAgICB0cmFjay5icmlkZ2VkRXh0cmFjdG9yID0gZmFsbGJhY2tTdHJlYW0uZXh0cmFjdG9yO1xuXG4gICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtO1xuICB9XG5cbiAgI2NyZWF0ZUZGbXBlZ1N0cmVhbShcbiAgc3RyZWFtOiBSZWFkYWJsZSB8IHN0cmluZyxcbiAgdHJhY2s6IFRyYWNrLFxuICBzZWVrID0gMCxcbiAgb3B1cz86IGJvb2xlYW4pXG4gIHtcbiAgICBjb25zdCBmZm1wZWdTdHJlYW0gPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLlxuICAgIGNyZWF0ZVN0cmVhbShzdHJlYW0sIHtcbiAgICAgIGVuY29kZXJBcmdzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MsXG4gICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgIGZtdDogb3B1cyA/ICdvcHVzJyA6ICdzMTZsZSdcbiAgICB9KS5cbiAgICBvbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBjb25zdCBtID0gYCR7ZXJyfWAudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICBgU3RyZWFtIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IgZnJvbSBGRm1wZWcgc3RyZWFtOiAke1xuICAgICAgICBlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UgfHwgZXJyfWBcblxuICAgICAgKTtcblxuICAgICAgaWYgKG0uaW5jbHVkZXMoJ3ByZW1hdHVyZSBjbG9zZScpIHx8IG0uaW5jbHVkZXMoJ2VwaXBlJykpIHJldHVybjtcblxuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvciwgdGhpcy5xdWV1ZSwgZXJyLCB0cmFjayk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmZtcGVnU3RyZWFtO1xuICB9XG59IiwgImltcG9ydCB7IFNub3dmbGFrZVV0aWwgfSBmcm9tICdkaXNjb3JkLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEFib3J0U2lnbmFsIHRvIGNhbmNlbCB0aGlzIGVudHJ5XG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXIgPSAoZXhjZXB0aW9uOiBFcnJvcikgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWUge1xuICAvKipcbiAgICogVGhlIHF1ZXVlZCBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgZW50cmllczogQXJyYXk8QXN5bmNRdWV1ZUVudHJ5PiA9IFtdO1xuXG4gIHB1YmxpYyBleGNlcHRpb25IYW5kbGVyPzogQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENsZWFyIGVudHJpZXMgcXVldWVcbiAgICogQHBhcmFtIGNvbnN1bWUgV2hldGhlciBvciBub3QgdG8gY29uc3VtZSBhbGwgZW50cmllcyBiZWZvcmUgY2xlYXJpbmdcbiAgICovXG4gIHB1YmxpYyBjbGVhcihjb25zdW1lID0gZmFsc2UpIHtcbiAgICBpZiAoY29uc3VtZSkge1xuICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jb25zdW1lKCkpO1xuICAgIH1cblxuICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHF1ZXVlLiBSZXR1cm5zIGAwYCBpZiBubyBlbnRyaWVzIGFyZSBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBhbiBlbnRyeS5cbiAgICpcbiAgICogQGV4YW1wbGUgLy8gbG9jayB0aGUgcXVldWVcbiAgICogY29uc3QgZW50cnkgPSBhc3luY1F1ZXVlLmFjcXVpcmUoKTtcbiAgICogLy8gd2FpdCB1bnRpbCBwcmV2aW91cyB0YXNrIGlzIGNvbXBsZXRlZFxuICAgKiBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAqIC8vIGRvIHNvbWV0aGluZyBleHBlbnNpdmVcbiAgICogYXdhaXQgcGVyZm9ybVNvbWV0aGluZ0V4cGVuc2l2ZSgpO1xuICAgKiAvLyBtYWtlIHN1cmUgdG8gcmVsZWFzZSB0aGUgbG9jayBvbmNlIGRvbmVcbiAgICogYXN5bmNRdWV1ZS5yZWxlYXNlKCk7XG4gICAqXG4gICAqL1xuICBwdWJsaWMgYWNxdWlyZShvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgIGNvbnN0IGVudHJ5ID0gbmV3IEFzeW5jUXVldWVFbnRyeSh0aGlzLCBvcHRpb25zKTtcblxuICAgIGlmICh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpIGVudHJ5LmdldFRhc2soKS5jYXRjaCh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpO1xuXG4gICAgaWYgKHRoaXMuZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIGVudHJ5LmNvbnN1bWUoKTtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgdGhlIGN1cnJlbnQgYWNxdWlzaXRpb24gYW5kIG1vdmUgdG8gbmV4dCBlbnRyeS5cbiAgICovXG4gIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5lbnRyaWVzLnNoaWZ0KCk7XG4gICAgdGhpcy5lbnRyaWVzWzBdPy5jb25zdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGFsbCBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgY2FuY2VsQWxsKCkge1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY2FuY2VsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byByZW1vdmVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbnRyeShlbnRyeTogQXN5bmNRdWV1ZUVudHJ5KSB7XG4gICAgY29uc3QgZW50cnlJZHggPSB0aGlzLmVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG5cbiAgICBpZiAoZW50cnlJZHggIT09IC0xKSB7XG4gICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SWR4LCAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZUVudHJ5IHtcbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgcHVibGljIHNpZ25hbDogQWJvcnRTaWduYWwgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG9uQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlc29sdmUhOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlamVjdCE6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHF1ZXVlOiBBc3luY1F1ZXVlLFxuICBwdWJsaWMgb3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpXG4gIHtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5zaWduYWwpIHtcbiAgICAgIHRoaXMuc2V0QWJvcnRTaWduYWwodGhpcy5vcHRpb25zLnNpZ25hbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEFib3J0U2lnbmFsKHNpZ25hbDogQWJvcnRTaWduYWwpIHtcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICB0aGlzLnNpZ25hbCA9IHNpZ25hbDtcbiAgICB0aGlzLm9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnF1ZXVlLnJlbW92ZUVudHJ5KHRoaXMpO1xuICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICB9XG5cbiAgcHVibGljIGNvbnN1bWUoKSB7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgdGhpcy5yZXNvbHZlKCk7XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZSgpIHtcbiAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICB0aGlzLnF1ZXVlLnJlbGVhc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWwoKSB7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgdGhpcy5yZWplY3QobmV3IEVycm9yKCdDYW5jZWxsZWQnKSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYW51cCgpIHtcbiAgICBpZiAodGhpcy5vbkFib3J0KSB0aGlzLnNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgIHRoaXMuc2lnbmFsID0gbnVsbDtcbiAgICB0aGlzLm9uQWJvcnQgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldFRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgfVxufSIsICJpbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBBdWRpb0ZpbHRlcnMsIEZpbHRlcnNOYW1lLCBRdWV1ZUZpbHRlcnMgfSBmcm9tICcuLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7XG4gIEJpcXVhZEZpbHRlcnMsXG4gIEVxdWFsaXplcixcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEZGbXBlZ1N0cmVhbU9wdGlvbnMsIGNyZWF0ZUZGbXBlZ1N0cmVhbSB9IGZyb20gJy4uL3V0aWxzL0ZGbXBlZ1N0cmVhbSc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICB7XG4gICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5UXG4gICAgfSxcbiAgICAoXywgaSkgPT4gKHtcbiAgICAgIGJhbmQ6IGksXG4gICAgICBnYWluOiBhcnJbaV0gPyBhcnJbaV0gLyAzMCA6IDBcbiAgICB9KVxuICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbnR5cGUgRVFQcmVzZXQgPSB7XG4gIEZsYXQ6IEVxdWFsaXplckJhbmRbXTtcbiAgQ2xhc3NpY2FsOiBFcXVhbGl6ZXJCYW5kW107XG4gIENsdWI6IEVxdWFsaXplckJhbmRbXTtcbiAgRGFuY2U6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3M6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3NUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbFRyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICBIZWFkcGhvbmVzOiBFcXVhbGl6ZXJCYW5kW107XG4gIExhcmdlSGFsbDogRXF1YWxpemVyQmFuZFtdO1xuICBMaXZlOiBFcXVhbGl6ZXJCYW5kW107XG4gIFBhcnR5OiBFcXVhbGl6ZXJCYW5kW107XG4gIFBvcDogRXF1YWxpemVyQmFuZFtdO1xuICBSZWdnYWU6IEVxdWFsaXplckJhbmRbXTtcbiAgUm9jazogRXF1YWxpemVyQmFuZFtdO1xuICBTa2E6IEVxdWFsaXplckJhbmRbXTtcbiAgU29mdDogRXF1YWxpemVyQmFuZFtdO1xuICBTb2Z0Um9jazogRXF1YWxpemVyQmFuZFtdO1xuICBUZWNobm86IEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0OiBSZWFkb25seTxFUVByZXNldD4gPSBPYmplY3QuZnJlZXplKHtcbiAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgQ2xhc3NpY2FsOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNy4yLCAtNy4yLCAtOS42XVxuICApLFxuICBDbHViOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdXG4gICksXG4gIERhbmNlOiBtYWtlQmFuZHMoW1xuICA5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTVdXG4gICksXG4gIEZ1bGxCYXNzOiBtYWtlQmFuZHMoW1xuICAtOC4wLCA5LjYsIDkuNiwgNS42LCAxLjYsIC00LjAsIC04LjAsIC0xMC40LCAtMTEuMiwgLTExLjJdXG4gICksXG4gIEZ1bGxCYXNzVHJlYmxlOiBtYWtlQmFuZHMoW1xuICA3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF1cbiAgKSxcbiAgRnVsbFRyZWJsZTogbWFrZUJhbmRzKFtcbiAgLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XVxuICApLFxuICBIZWFkcGhvbmVzOiBtYWtlQmFuZHMoW1xuICA0LjgsIDExLjIsIDUuNiwgLTMuMiwgLTIuNCwgMS42LCA0LjgsIDkuNiwgMTIuOCwgMTQuNF1cbiAgKSxcbiAgTGFyZ2VIYWxsOiBtYWtlQmFuZHMoW1xuICAxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsXG4gIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgTGl2ZTogbWFrZUJhbmRzKFstNC44LCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA1LjYsIDUuNiwgNC4wLCAyLjQsIDIuNCwgMi40XSksXG4gIFBhcnR5OiBtYWtlQmFuZHMoW1xuICA3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjJdXG4gICksXG4gIFBvcDogbWFrZUJhbmRzKFtcbiAgLTEuNiwgNC44LCA3LjIsIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0yLjQsIC0xLjYsIC0xLjZdXG4gICksXG4gIFJlZ2dhZTogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgU2thOiBtYWtlQmFuZHMoW1xuICAtMi40LCAtNC44LCAtNC4wLCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA4LjgsIDkuNiwgMTEuMiwgOS42XVxuICApLFxuICBTb2Z0OiBtYWtlQmFuZHMoW1xuICA0LjgsIDEuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMS4xMTAyMmUtMTUsIDQuMCwgOC4wLCA5LjYsIDExLjIsIDEyLjBdXG4gICksXG4gIFNvZnRSb2NrOiBtYWtlQmFuZHMoW1xuICA0LjAsIDQuMCwgMi40LCAtMS4xMTAyMmUtMTUsIC00LjAsIC01LjYsIC0zLjIsIC0xLjExMDIyZS0xNSwgMi40LCA4LjhdXG4gICksXG4gIFRlY2hubzogbWFrZUJhbmRzKFtcbiAgOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTQuOCwgLTEuMTEwMjJlLTE1LCA4LjAsIDkuNiwgOS42LCA4LjhdXG4gIClcbn0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSBhbnk+IHtcbiAgI2ZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAjaW5wdXRBcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGZmbXBlZyBtYXkgYmUgc2tpcHBlZFxuICAgKi9cbiAgcHVibGljIGdldCBza2lwcGFibGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5hZi5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICB9XG5cbiAgI3NldEZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgY29uc3QgeyBxdWV1ZSB9ID0gdGhpcy5hZjtcbiAgICAvLyBza2lwIGlmIGZpbHRlcnMgYXJlIHRoZSBzYW1lXG4gICAgaWYgKFxuICAgIGZpbHRlcnMuZXZlcnkoKGYpID0+IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpICYmXG4gICAgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpXG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID1cbiAgICB0aGlzLmZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpICYmXG4gICAgIWZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpO1xuICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMgPSBbLi4ubmV3IFNldChmaWx0ZXJzKV07XG5cbiAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICBxdWV1ZS5lbWl0KFxuICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuQXVkaW9GaWx0ZXJzVXBkYXRlLFxuICAgICAgICBxdWV1ZSxcbiAgICAgICAgcHJldixcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGlucHV0IGFyZ3MgZm9yIEZGbXBlZ1xuICAgKi9cbiAgcHVibGljIHNldElucHV0QXJncyhhcmdzOiBzdHJpbmdbXSkge1xuICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICB0aGlzLiNpbnB1dEFyZ3MgPSBhcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpbnB1dCBhcmdzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0QXJncygpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5jb2RlckFyZ3MoKSB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcnMubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIGdldCBhcmdzKCkge1xuICAgIHJldHVybiB0aGlzLmlucHV0QXJncy5jb25jYXQodGhpcy5lbmNvZGVyQXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGZmbXBlZyBzdHJlYW1cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyZWFtIHNvdXJjZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVTdHJlYW0oc291cmNlOiBzdHJpbmcgfCBSZWFkYWJsZSwgb3B0aW9uczogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICAgIGlmICh0aGlzLiNpbnB1dEFyZ3MubGVuZ3RoKVxuICAgIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbXG4gICAgLi4udGhpcy4jaW5wdXRBcmdzLFxuICAgIC4uLihvcHRpb25zLmVuY29kZXJBcmdzIHx8IFtdKV07XG5cblxuICAgIGNvbnN0IHN0cmVhbSA9IGNyZWF0ZUZGbXBlZ1N0cmVhbShzb3VyY2UsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmZtcGVnIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBzZXRGaWx0ZXJzKFxuICBmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBzdHJpbmdbXSB8IGJvb2xlYW4pXG4gIHtcbiAgICBsZXQgX2ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID9cbiAgICAgIFtdIDpcbiAgICAgIE9iamVjdC5rZXlzKEF1ZGlvRmlsdGVycy5maWx0ZXJzKSBhcyBGaWx0ZXJzW107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XG4gICAgICBfZmlsdGVycyA9IGZpbHRlcnMgYXMgRmlsdGVyc1tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfZmlsdGVycyA9IE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpLlxuICAgICAgZmlsdGVyKChyZXMpID0+IHJlc1sxXSA9PT0gdHJ1ZSkuXG4gICAgICBtYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyhfZmlsdGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudGx5IGFjdGl2ZSBmZm1wZWcgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldCBmaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyKHMpXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIGZpbHRlcnMgPSBbZmlsdGVyc107XG4gICAgY29uc3QgZnJlc2g6IEZpbHRlcnNbXSA9IFtdO1xuXG4gICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICBmcmVzaC5wdXNoKGYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuI3NldEZpbHRlcnMoXG4gICAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICogQHBhcmFtIGZmIEZpbHRlcnMgbGlzdFxuICAgKi9cbiAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gZmY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZW5hYmxlZCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldEZpbHRlcnNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLm5hbWVzLmZpbHRlcigoZikgPT4gIXRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNFbmFibGVkKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBhIHZhbGlkIGZpbHRlclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgKi9cbiAgcHVibGljIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcpOiBmaWx0ZXIgaXMgRmlsdGVyc05hbWUge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuaGFzKGZpbHRlciBhcyBGaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBhcnJheVxuICAgKi9cbiAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gQXVkaW9GaWx0ZXJzLmdldChmaWx0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBKU09OIG9iamVjdFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4gb2JqW2ZpbHRlcl0gPSBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlIHtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGEgPSBhbnk+IHtcbiAgcHVibGljIGdyYXBoID0gbmV3IEFGaWx0ZXJHcmFwaDxNZXRhPih0aGlzKTtcbiAgcHVibGljIGZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICBwdWJsaWMgX2xhc3RGaWx0ZXJzQ2FjaGU6IEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlID0ge1xuICAgIGJpcXVhZDogbnVsbCxcbiAgICBlcXVhbGl6ZXI6IFtdLFxuICAgIGZpbHRlcnM6IFtdLFxuICAgIHZvbHVtZTogMTAwLFxuICAgIHNhbXBsZVJhdGU6IC0xXG4gIH07XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHtcbiAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogZW5hYmxlIHRoaXMgaW4gdGhlIGZ1dHVyZVxuICAvLyBwdWJsaWMgZ2V0IGZmbXBlZygpOiBGRm1wZWdGaWx0ZXJlcjxNZXRhPiB8IG51bGwge1xuICAvLyAgICAgaWYgKHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZykge1xuICAvLyAgICAgICAgIGlmICh0aGlzLiNmZm1wZWcpIHRoaXMuI2ZmbXBlZyA9IG51bGw7XG4gIC8vICAgICAgICAgcmV0dXJuIG51bGw7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGlmICghdGhpcy4jZmZtcGVnKSB7XG4gIC8vICAgICAgICAgdGhpcy4jZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICByZXR1cm4gdGhpcy4jZmZtcGVnO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIFZvbHVtZSB0cmFuc2Zvcm1lclxuICAgKi9cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgKi9cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZXF1YWxpemVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGlnaXRhbCBiaXF1YWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYmlxdWFkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRFNQIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXNhbXBsZXIgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYXkgY3VycmVudCB0cmFjayBpbiB0cmFuc2l0aW9uIG1vZGVcbiAgICogQHBhcmFtIHNlZWsgVGhlIGR1cmF0aW9uIHRvIHNlZWsgdG9cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmlnZ2VyUmVwbGF5KHNlZWsgPSAwKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUuYWNxdWlyZSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaywge1xuICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgIHNlZWssXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEFGaWx0ZXJHcmFwaDxNZXRhID0gYW55PiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgcHVibGljIGdldCBmZm1wZWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYuZmZtcGVnPy5maWx0ZXJzID8/IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuICh0aGlzLmFmLmVxdWFsaXplcj8uYmFuZE11bHRpcGxpZXJzIHx8IFtdKS5tYXAoKG0sIGkpID0+ICh7XG4gICAgICBiYW5kOiBpLFxuICAgICAgZ2FpbjogbVxuICAgIH0pKSBhcyBFcXVhbGl6ZXJCYW5kW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hZi5iaXF1YWQ/LmdldEZpbHRlck5hbWUoKSBhcyBFeGNsdWRlPFxuICAgICAgICBCaXF1YWRGaWx0ZXJzLFxuICAgICAgICBudW1iZXI+IHxcbiAgICAgIG51bGwgfHwgbnVsbCk7XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5maWx0ZXJzPy5maWx0ZXJzIHx8IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYudm9sdW1lO1xuICB9XG5cbiAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYucmVzYW1wbGVyO1xuICB9XG5cbiAgcHVibGljIGR1bXAoKTogRmlsdGVyR3JhcGgge1xuICAgIHJldHVybiB7XG4gICAgICBmZm1wZWc6IHRoaXMuZmZtcGVnLFxuICAgICAgZXF1YWxpemVyOiB0aGlzLmVxdWFsaXplcixcbiAgICAgIGJpcXVhZDogdGhpcy5iaXF1YWQsXG4gICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXG4gICAgICBzYW1wbGVSYXRlOiB0aGlzLnJlc2FtcGxlcj8uc2FtcGxlUmF0ZSB8fCA0ODAwMCxcbiAgICAgIHZvbHVtZTogdGhpcy52b2x1bWU/LnZvbHVtZSA/PyAxMDBcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JhcGgge1xuICBmZm1wZWc6IEZpbHRlcnNbXTtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZDogRXhjbHVkZTxCaXF1YWRGaWx0ZXJzLCBudW1iZXI+IHwgbnVsbDtcbiAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICB2b2x1bWU6IG51bWJlcjtcbiAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufSIsICJpbXBvcnQgdHlwZSB7IER1cGxleCwgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRkZtcGVnLCBjcmVhdGVGRm1wZWdBcmdzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRkZtcGVnU3RyZWFtT3B0aW9ucyB7XG4gIGZtdD86IHN0cmluZztcbiAgZW5jb2RlckFyZ3M/OiBzdHJpbmdbXTtcbiAgc2Vlaz86IG51bWJlcjtcbiAgc2tpcD86IGJvb2xlYW47XG4gIGNvb2tpZXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGRk1QRUdfQVJHU19TVFJJTkcoXG5zdHJlYW06IHN0cmluZyxcbmZtdD86IHN0cmluZyxcbmNvb2tpZXM/OiBzdHJpbmcpXG57XG4gIGNvbnN0IGFyZ3MgPSBjcmVhdGVGRm1wZWdBcmdzKHtcbiAgICByZWNvbm5lY3Q6IDEsXG4gICAgcmVjb25uZWN0X3N0cmVhbWVkOiAxLFxuICAgIHJlY29ubmVjdF9kZWxheV9tYXg6IDUsXG4gICAgaTogc3RyZWFtLFxuICAgIGFuYWx5emVkdXJhdGlvbjogMCxcbiAgICBsb2dsZXZlbDogMCxcbiAgICBhcjogNDgwMDAsXG4gICAgYWM6IDIsXG4gICAgZjogYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGwsXG4gICAgY29va2llczpcbiAgICB0eXBlb2YgY29va2llcyA9PT0gJ3N0cmluZycgP1xuICAgICFjb29raWVzLmluY2x1ZGVzKCcgJykgP1xuICAgIGNvb2tpZXMgOlxuICAgIGBcIiR7Y29va2llc31cImAgOlxuICAgIG51bGxcbiAgfSk7XG5cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGRk1QRUdfQVJHU19QSVBFRChmbXQ/OiBzdHJpbmcpIHtcbiAgY29uc3QgYXJncyA9IGNyZWF0ZUZGbXBlZ0FyZ3Moe1xuICAgIGFuYWx5emVkdXJhdGlvbjogMCxcbiAgICBsb2dsZXZlbDogMCxcbiAgICBhcjogNDgwMDAsXG4gICAgYWM6IDIsXG4gICAgZjogYCR7dHlwZW9mIGZtdCA9PT0gJ3N0cmluZycgPyBmbXQgOiAnczE2bGUnfWAsXG4gICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGxcbiAgfSk7XG5cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBGRm1wZWcgc3RyZWFtXG4gKiBAcGFyYW0gc3RyZWFtIFRoZSBzb3VyY2Ugc3RyZWFtXG4gKiBAcGFyYW0gb3B0aW9ucyBGRm1wZWcgc3RyZWFtIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZGbXBlZ1N0cmVhbShcbnN0cmVhbTogUmVhZGFibGUgfCBEdXBsZXggfCBzdHJpbmcsXG5vcHRpb25zPzogRkZtcGVnU3RyZWFtT3B0aW9ucylcbjogUmVhZGFibGUge1xuICBpZiAob3B0aW9ucz8uc2tpcCAmJiB0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykgcmV0dXJuIHN0cmVhbTtcbiAgb3B0aW9ucyA/Pz0ge307XG4gIGNvbnN0IGFyZ3MgPVxuICB0eXBlb2Ygc3RyZWFtID09PSAnc3RyaW5nJyA/XG4gIEZGTVBFR19BUkdTX1NUUklORyhzdHJlYW0sIG9wdGlvbnMuZm10LCBvcHRpb25zLmNvb2tpZXMpIDpcbiAgRkZNUEVHX0FSR1NfUElQRUQob3B0aW9ucy5mbXQpO1xuXG4gIGlmICghTnVtYmVyLmlzTmFOKG9wdGlvbnMuc2VlaykpIGFyZ3MudW5zaGlmdCgnLXNzJywgU3RyaW5nKG9wdGlvbnMuc2VlaykpO1xuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmVuY29kZXJBcmdzKSkgYXJncy5wdXNoKC4uLm9wdGlvbnMuZW5jb2RlckFyZ3MpO1xuXG4gIGNvbnN0IHRyYW5zY29kZXIgPSBuZXcgRkZtcGVnKHsgc2hlbGw6IGZhbHNlLCBhcmdzIH0pO1xuXG4gIHRyYW5zY29kZXIub24oJ2Nsb3NlJywgKCkgPT4gdHJhbnNjb2Rlci5kZXN0cm95KCkpO1xuXG4gIGlmICh0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmVhbS5vbignZXJyb3InLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdHJlYW0ucGlwZSh0cmFuc2NvZGVyIGFzIGFueSk7XG4gIH1cblxuICByZXR1cm4gdHJhbnNjb2Rlcjtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSB7XG4gIGxhdGVuY3k6IHtcbiAgICBldmVudExvb3A6IG51bWJlcjtcbiAgICB2b2ljZUNvbm5lY3Rpb246IG51bWJlcjtcbiAgfTtcbiAgc3RhdHVzOiB7XG4gICAgYnVmZmVyaW5nOiBib29sZWFuO1xuICAgIHBsYXlpbmc6IGJvb2xlYW47XG4gICAgcGF1c2VkOiBib29sZWFuO1xuICAgIGlkbGU6IGJvb2xlYW47XG4gIH07XG4gIHRyYWNrc0NvdW50OiBudW1iZXI7XG4gIGhpc3RvcnlTaXplOiBudW1iZXI7XG4gIGV4dHJhY3RvcnM6IG51bWJlcjtcbiAgbGlzdGVuZXJzOiBudW1iZXI7XG4gIG1lbW9yeVVzYWdlOiBOb2RlSlMuTWVtb3J5VXNhZ2U7XG4gIHZlcnNpb25zOiB7XG4gICAgbm9kZTogc3RyaW5nO1xuICAgIHBsYXllcjogc3RyaW5nO1xuICB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVTdGF0aXN0aWNzPE1ldGEgPSBhbnk+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge31cblxuICAvKipcbiAgICogR2VuZXJhdGUgc3RhdGlzdGljcyBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGVuY3k6IHtcbiAgICAgICAgZXZlbnRMb29wOiB0aGlzLnF1ZXVlLnBsYXllci5ldmVudExvb3BMYWcsXG4gICAgICAgIHZvaWNlQ29ubmVjdGlvbjogdGhpcy5xdWV1ZS5waW5nXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGJ1ZmZlcmluZzogdGhpcy5xdWV1ZS5ub2RlLmlzQnVmZmVyaW5nKCksXG4gICAgICAgIHBsYXlpbmc6IHRoaXMucXVldWUubm9kZS5pc1BsYXlpbmcoKSxcbiAgICAgICAgcGF1c2VkOiB0aGlzLnF1ZXVlLm5vZGUuaXNQYXVzZWQoKSxcbiAgICAgICAgaWRsZTogdGhpcy5xdWV1ZS5ub2RlLmlzSWRsZSgpXG4gICAgICB9LFxuICAgICAgdHJhY2tzQ291bnQ6IHRoaXMucXVldWUudHJhY2tzLnNpemUsXG4gICAgICBoaXN0b3J5U2l6ZTogdGhpcy5xdWV1ZS5oaXN0b3J5LnRyYWNrcy5zaXplLFxuICAgICAgZXh0cmFjdG9yczogdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5zaXplLFxuICAgICAgbGlzdGVuZXJzOlxuICAgICAgdGhpcy5xdWV1ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5jaGFubmVsPy5tZW1iZXJzLmZpbHRlcihcbiAgICAgICAgKG0pID0+ICFtLnVzZXIuYm90XG4gICAgICApLnNpemUgfHwgMCxcbiAgICAgIG1lbW9yeVVzYWdlOiBwcm9jZXNzLm1lbW9yeVVzYWdlKCksXG4gICAgICB2ZXJzaW9uczoge1xuICAgICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICAgIHBsYXllcjogdGhpcy5xdWV1ZS5wbGF5ZXIudmVyc2lvblxuICAgICAgfVxuICAgIH0gYXMgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YTtcbiAgfVxufSIsICJpbXBvcnQgeyBOb3RFeGlzdGluZ0Vycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IExyY0dldFJlc3VsdCwgTHJjU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWUgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgdHlwZSBMeXJpY3NEYXRhID0gTWFwPG51bWJlciwgc3RyaW5nPjtcbmV4cG9ydCB0eXBlIFVuc3Vic2NyaWJlID0gKCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEx5cmljc0NhbGxiYWNrID0gKGx5cmljczogc3RyaW5nLCB0aW1lc3RhbXA6IG51bWJlcikgPT4gdW5rbm93bjtcbmV4cG9ydCB0eXBlIEx5cmljc0F0ID0ge3RpbWVzdGFtcDogbnVtYmVyO2xpbmU6IHN0cmluZzt9O1xuXG5jb25zdCB0aW1lc3RhbXBQYXR0ZXJuID0gL1xcWyhcXGR7Mn0pOihcXGR7Mn0pXFwuKFxcZHsyfSlcXF0vO1xuXG5leHBvcnQgY2xhc3MgU3luY2VkTHlyaWNzUHJvdmlkZXIge1xuICAjbG9vcDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgI2NhbGxiYWNrOiBMeXJpY3NDYWxsYmFjayB8IG51bGwgPSBudWxsO1xuICAjb25VbnN1YnNjcmliZTogVW5zdWJzY3JpYmUgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgaW50ZXJ2YWwgPSAxMDA7XG4gIHB1YmxpYyByZWFkb25seSBseXJpY3M6IEx5cmljc0RhdGEgPSBuZXcgTWFwKCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgcmVhZG9ubHkgcXVldWU6IEd1aWxkUXVldWUsXG4gIHB1YmxpYyByZWFkb25seSByYXc/OiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpXG4gIHtcbiAgICBpZiAocmF3Py5zeW5jZWRMeXJpY3MpIHRoaXMubG9hZChyYXc/LnN5bmNlZEx5cmljcyk7XG4gIH1cblxuICBwdWJsaWMgaXNTdWJzY3JpYmVkKCkge1xuICAgIHJldHVybiB0aGlzLiNjYWxsYmFjayAhPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkKGx5cmljczogc3RyaW5nKSB7XG4gICAgaWYgKCFseXJpY3MpIHRocm93IG5ldyBOb3RFeGlzdGluZ0Vycm9yKCdzeW5jZWRMeXJpY3MnKTtcblxuICAgIHRoaXMubHlyaWNzLmNsZWFyKCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgY29uc3QgbGluZXMgPSBseXJpY3Muc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2godGltZXN0YW1wUGF0dGVybik7XG5cbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjb25zdCBbLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHNdID0gbWF0Y2g7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9XG4gICAgICAgIHBhcnNlSW50KG1pbnV0ZXMpICogNjAgKiAxMDAwICtcbiAgICAgICAgcGFyc2VJbnQoc2Vjb25kcykgKiAxMDAwICtcbiAgICAgICAgcGFyc2VJbnQobWlsbGlzZWNvbmRzKTtcblxuICAgICAgICB0aGlzLmx5cmljcy5zZXQodGltZXN0YW1wLCBsaW5lLnJlcGxhY2UodGltZXN0YW1wUGF0dGVybiwgJycpLnRyaW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGx5cmljcyBhdCBhIHNwZWNpZmljIHRpbWUgb3IgYXQgdGhlIGNsb3Nlc3QgdGltZSAoXHUwMEIxMiBzZWNvbmRzKVxuICAgKiBAcGFyYW0gdGltZSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBhdCh0aW1lOiBudW1iZXIpOiBMeXJpY3NBdCB8IG51bGwge1xuICAgIGNvbnN0IGxvd2VzdFRpbWUgPSB0aGlzLmx5cmljcy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgIGlmIChsb3dlc3RUaW1lID09IG51bGwgfHwgdGltZSA8IGxvd2VzdFRpbWUpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmx5cmljcy5oYXModGltZSkpXG4gICAgcmV0dXJuIHsgbGluZTogdGhpcy5seXJpY3MuZ2V0KHRpbWUpIGFzIHN0cmluZywgdGltZXN0YW1wOiB0aW1lIH07XG5cbiAgICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbSh0aGlzLmx5cmljcy5rZXlzKCkpO1xuXG4gICAgY29uc3QgY2xvc2VzdCA9IGtleXMucmVkdWNlKChhLCBiKSA9PlxuICAgIE1hdGguYWJzKGIgLSB0aW1lKSA8IE1hdGguYWJzKGEgLSB0aW1lKSA/IGIgOiBhXG4gICAgKTtcblxuICAgIGlmIChjbG9zZXN0ID4gdGltZSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoTWF0aC5hYnMoY2xvc2VzdCAtIHRpbWUpID4gMjAwMCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBsaW5lID0gdGhpcy5seXJpY3MuZ2V0KGNsb3Nlc3QpO1xuXG4gICAgaWYgKCFsaW5lKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB7IHRpbWVzdGFtcDogY2xvc2VzdCwgbGluZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZvciB0aGUgbHlyaWNzIGNoYW5nZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIG9uQ2hhbmdlKGNhbGxiYWNrOiBMeXJpY3NDYWxsYmFjaykge1xuICAgIHRoaXMuI2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gZGV0ZWN0IHdoZW4gdGhlIHByb3ZpZGVyIGlzIHVuc3Vic2NyaWJlZC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIG9uVW5zdWJzY3JpYmUoY2FsbGJhY2s6IFVuc3Vic2NyaWJlKSB7XG4gICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlcyBmcm9tIHRoZSBxdWV1ZS5cbiAgICovXG4gIHB1YmxpYyB1bnN1YnNjcmliZSgpIHtcbiAgICBpZiAodGhpcy4jbG9vcCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wKTtcbiAgICBpZiAodGhpcy4jb25VbnN1YnNjcmliZSkgdGhpcy4jb25VbnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy4jY2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuI29uVW5zdWJzY3JpYmUgPSBudWxsO1xuICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIHF1ZXVlIHRvIG1vbml0b3IgdGhlIGN1cnJlbnQgdGltZS5cbiAgICogQHJldHVybnMgVGhlIHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgc3Vic2NyaWJlKCk6IFVuc3Vic2NyaWJlIHtcbiAgICBpZiAodGhpcy4jbG9vcCkgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuI2NyZWF0ZUxvb3AoKTtcblxuICAgIHJldHVybiAoKSA9PiB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2VzIHRoZSBseXJpY3MgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgY29uc3QgaGFzTG9vcCA9IHRoaXMuI2xvb3AgIT09IG51bGw7XG5cbiAgICBpZiAoaGFzTG9vcCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wISk7XG4gICAgICB0aGlzLiNsb29wID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzTG9vcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWVzIHRoZSBseXJpY3MgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgcmVzdW1lKCkge1xuICAgIGNvbnN0IGhhc0xvb3AgPSB0aGlzLiNsb29wICE9PSBudWxsO1xuXG4gICAgaWYgKCFoYXNMb29wKSB0aGlzLiNjcmVhdGVMb29wKCk7XG5cbiAgICByZXR1cm4gIWhhc0xvb3A7XG4gIH1cblxuICAjY3JlYXRlTG9vcCgpIHtcbiAgICBpZiAoIXRoaXMuI2NhbGxiYWNrKSByZXR1cm47XG4gICAgaWYgKHRoaXMuI2xvb3ApIGNsZWFySW50ZXJ2YWwodGhpcy4jbG9vcCk7XG5cbiAgICBsZXQgbGFzdFZhbHVlOiBMeXJpY3NBdCB8IG51bGwgPSBudWxsO1xuXG4gICAgdGhpcy4jbG9vcCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmRlbGV0ZWQpIHJldHVybiB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgIGlmICghdGhpcy4jY2FsbGJhY2sgfHwgIXRoaXMucXVldWUuaXNQbGF5aW5nKCkpIHJldHVybjtcblxuICAgICAgY29uc3QgdGltZSA9IHRoaXMucXVldWUubm9kZS5nZXRUaW1lc3RhbXAoKTtcbiAgICAgIGlmICghdGltZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBseXJpY3MgPSB0aGlzLmF0KHRpbWUuY3VycmVudC52YWx1ZSk7XG5cbiAgICAgIGlmICghbHlyaWNzKSByZXR1cm47XG5cbiAgICAgIGlmIChcbiAgICAgIGxhc3RWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgbHlyaWNzLmxpbmUgPT09IGxhc3RWYWx1ZS5saW5lICYmXG4gICAgICBseXJpY3MudGltZXN0YW1wID09PSBsYXN0VmFsdWUudGltZXN0YW1wKVxuXG4gICAgICByZXR1cm47XG5cbiAgICAgIGxhc3RWYWx1ZSA9IGx5cmljcztcblxuICAgICAgdGhpcy4jY2FsbGJhY2sobHlyaWNzLmxpbmUsIGx5cmljcy50aW1lc3RhbXApO1xuICAgIH0sIHRoaXMuaW50ZXJ2YWwpLnVucmVmKCk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi9Bc3luY1F1ZXVlJztcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEVudGl0eSA9ICgpID0+IFByb21pc2U8UmVzcG9uc2U+O1xuXG5leHBvcnQgY2xhc3MgU2VxdWVudGlhbEJ1Y2tldCB7XG4gIHB1YmxpYyBsaW1pdCA9IDE7XG4gIHB1YmxpYyByZW1haW5pbmcgPSAxO1xuICBwdWJsaWMgcmVzZXRBZnRlciA9IDA7XG4gIHB1YmxpYyBxdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG4gIHB1YmxpYyBNQVhfUkVUUklFUyA9IDU7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgYnVja2V0IGlzIHJhdGUgbGltaXRlZC5cbiAgICovXG4gIHB1YmxpYyBpc1JhdGVMaW1pdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnJlbWFpbmluZyA8PSAwICYmIERhdGUubm93KCkgPCB0aGlzLnJlc2V0QWZ0ZXI7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZXMgYSByZXF1ZXN0LlxuICAgKiBAcGFyYW0gcmVxIFRoZSByZXF1ZXN0IGZ1bmN0aW9uIHRvIGVucXVldWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnF1ZXVlKHJlcTogUmVxdWVzdEVudGl0eSkge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5xdWV1ZS5hY3F1aXJlKCk7XG4gICAgYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVudHJ5LnJlbGVhc2UoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9yZXF1ZXN0KHJlcTogUmVxdWVzdEVudGl0eSwgcmV0cmllcyA9IDApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgd2hpbGUgKHRoaXMuaXNSYXRlTGltaXRlZCgpKSB7XG4gICAgICBjb25zdCByZXNldCA9IHRoaXMucmVzZXRBZnRlciAtIERhdGUubm93KCk7XG4gICAgICBhd2FpdCBzZXRUaW1lb3V0KHJlc2V0KTtcbiAgICB9XG5cbiAgICBsZXQgcGFzcyA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlcSgpO1xuXG4gICAgICB0aGlzLl9wYXRjaEhlYWRlcnMocmVzKTtcblxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQyOSkge1xuICAgICAgICBjb25zdCByZXNldCA9IHRoaXMucmVzZXRBZnRlciAtIERhdGUubm93KCk7XG4gICAgICAgIGF3YWl0IHNldFRpbWVvdXQocmVzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChyZXEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBsZXQgZXJyOiBFcnJvcjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJvZHk6IHtcbiAgICAgICAgICAgIGNvZGU6IG51bWJlcjtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgICB9ID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGJvZHkubWVzc2FnZSkgYXMgRXJyb3IgJiB7Y29kZTogbnVtYmVyO307XG5cbiAgICAgICAgICBlcnJvci5uYW1lID0gYm9keS5uYW1lO1xuICAgICAgICAgIGVycm9yLmNvZGUgPSBib2R5LmNvZGU7XG5cbiAgICAgICAgICBlcnIgPSBlcnJvcjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgZXJyID0gbmV3IEVycm9yKGBIVFRQIEVycm9yOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXNzID0gdHJ1ZTtcblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHBhc3MpIHRocm93IGU7XG5cbiAgICAgIGNvbnN0IGJhZFJlcSA9IGUgaW5zdGFuY2VvZiBFcnJvciAmJiAvRXJyb3I6IDRbMC05XXsyfS8udGVzdChlLm1lc3NhZ2UpO1xuXG4gICAgICBpZiAoIWJhZFJlcSAmJiByZXRyaWVzIDwgdGhpcy5NQVhfUkVUUklFUykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChyZXEsICsrcmV0cmllcyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGF0Y2hIZWFkZXJzKHJlczogUmVzcG9uc2UpIHtcbiAgICBjb25zdCBsaW1pdCA9IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LUxpbWl0JykpO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVJlbWFpbmluZycpKTtcbiAgICBjb25zdCByZXNldEFmdGVyID1cbiAgICBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZXNldCcpKSAqIDEwMDAgKyBEYXRlLm5vdygpO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNOYU4obGltaXQpKSB0aGlzLmxpbWl0ID0gbGltaXQ7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4ocmVtYWluaW5nKSkgdGhpcy5yZW1haW5pbmcgPSByZW1haW5pbmc7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4ocmVzZXRBZnRlcikpIHRoaXMucmVzZXRBZnRlciA9IHJlc2V0QWZ0ZXI7XG4gIH1cbn0iLCAiaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBTZXF1ZW50aWFsQnVja2V0IH0gZnJvbSAnLi4vdXRpbHMvU2VxdWVudGlhbEJ1Y2tldCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjU2VhcmNoUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSB0byBzZWFyY2ggZm9yLiBFaXRoZXIgdGhpcyBvciB0cmFja05hbWUgaXMgcmVxdWlyZWQuXG4gICAqL1xuICBxPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIG5hbWUgdG8gc2VhcmNoIGZvci4gRWl0aGVyIHRoaXMgb3IgcXVlcnkgaXMgcmVxdWlyZWQuXG4gICAqL1xuICB0cmFja05hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXJ0aXN0IG5hbWVcbiAgICovXG4gIGFydGlzdE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWxidW0gbmFtZVxuICAgKi9cbiAgYWxidW1OYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExyY0dldFBhcmFtcyBleHRlbmRzIFJlcXVpcmVkPE9taXQ8THJjU2VhcmNoUGFyYW1zLCAncXVlcnknPj4ge1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgZHVyYXRpb246IG51bWJlcjtcbn1cblxuY29uc3QgdG9TbmFrZUNhc2UgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gIGNvbnN0IHNuYWtlT2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcbiAgICBjb25zdCBuZXdLZXkgPSBrZXkucmVwbGFjZShcbiAgICAgIC9bQS1aXS9nLFxuICAgICAgKGxldHRlcikgPT4gYF8ke2xldHRlci50b0xvd2VyQ2FzZSgpfWBcbiAgICApO1xuICAgIHNuYWtlT2JqW25ld0tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBzbmFrZU9iajtcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBjcmVhdGVRdWVyeSA9IChwYXJhbXM6IGFueSkgPT5cbm5ldyBVUkxTZWFyY2hQYXJhbXModG9TbmFrZUNhc2UocGFyYW1zKSkudG9TdHJpbmcoKTtcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hSZXN1bHQge1xuICAvKipcbiAgICogVGhlIHRyYWNrIGlkXG4gICAqL1xuICBpZDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRyYWNrIG5hbWVcbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhcnRpc3QgbmFtZVxuICAgKi9cbiAgdHJhY2tOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWxidW0gbmFtZVxuICAgKi9cbiAgYXJ0aXN0TmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFsYnVtIG5hbWVcbiAgICovXG4gIGFsYnVtTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgZHVyYXRpb246IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRyYWNrXG4gICAqL1xuICBpbnN0cnVtZW50YWw6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgcGxhaW5MeXJpY3M6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRyYWNrXG4gICAqL1xuICBzeW5jZWRMeXJpY3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIExyY0dldFJlc3VsdCA9IE9taXQ8THJjU2VhcmNoUmVzdWx0LCAnbmFtZSc+O1xuXG5leHBvcnQgY2xhc3MgTHJjTGliIHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgVVJMXG4gICAqL1xuICBwdWJsaWMgYXBpID0gJ2h0dHBzOi8vbHJjbGliLm5ldC9hcGknO1xuICAvKipcbiAgICogVGhlIHJlcXVlc3QgdGltZW91dC4gRGVmYXVsdCBpcyAxNSBzZWNvbmRzLlxuICAgKi9cbiAgcHVibGljIHRpbWVvdXQgPSAxNV8wMDA7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBidWNrZXRcbiAgICovXG4gIHB1YmxpYyBidWNrZXQgPSBuZXcgU2VxdWVudGlhbEJ1Y2tldCgpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IExyY0xpYiBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJlcXVlc3QgdGltZW91dFxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBzZXRSZXF1ZXN0VGltZW91dCh0aW1lb3V0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJldHJ5IGxpbWl0LiBEZWZhdWx0IGlzIDUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCBUaGUgcmV0cnkgbGltaXRcbiAgICovXG4gIHB1YmxpYyBzZXRSZXRyeUxpbWl0KGxpbWl0OiBudW1iZXIpIHtcbiAgICB0aGlzLmJ1Y2tldC5NQVhfUkVUUklFUyA9IGxpbWl0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbHlyaWNzXG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIGdldCBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBnZXQocGFyYW1zOiBMcmNHZXRQYXJhbXMpIHtcbiAgICBjb25zdCBwYXRoID0gYGdldD8ke2NyZWF0ZVF1ZXJ5KHBhcmFtcyl9YDtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGx5cmljcyBieSBJRFxuICAgKiBAcGFyYW0gaWQgVGhlIGx5cmljcyBJRFxuICAgKi9cbiAgcHVibGljIGdldEJ5SWQoaWQ6IGAke251bWJlcn1gIHwgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KGBnZXQvJHtpZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNhY2hlZCBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgZ2V0IHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGdldENhY2hlZChwYXJhbXM6IExyY0dldFBhcmFtcykge1xuICAgIGNvbnN0IHBhdGggPSBgZ2V0LWNhY2hlZD8ke2NyZWF0ZVF1ZXJ5KHBhcmFtcyl9YDtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBmb3IgbHlyaWNzXG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIHNlYXJjaCBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBzZWFyY2gocGFyYW1zOiBMcmNTZWFyY2hQYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcy5xICYmICFwYXJhbXMudHJhY2tOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICAgJ29uZSBvZiBxIG9yIHRyYWNrTmFtZScsXG4gICAgICAgICdzdHJpbmcnLFxuICAgICAgICBbU3RyaW5nKHBhcmFtcy5xKSwgU3RyaW5nKHBhcmFtcy50cmFja05hbWUpXS5qb2luKCcsICcpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBgc2VhcmNoPyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHRbXT4ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgdGhlIEFQSVxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aFxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgcmVxdWVzdCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdDxUPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGRpc3BhdGNoZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IFV0aWwuZ2V0UnVudGltZSgpO1xuXG4gICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9XG4gICAgICBuYW1lID09PSAndW5rbm93bicgPyB2ZXJzaW9uIDogYCR7bmFtZX0vJHt2ZXJzaW9ufWA7XG5cbiAgICAgIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCh0aGlzLnRpbWVvdXQpLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiBgRGlzY29yZC1QbGF5ZXIvJHt0aGlzLnBsYXllci52ZXJzaW9ufSAke1xuICAgICAgICAgIHJ1bnRpbWVWZXJzaW9uID8/ICcnfWAuXG4gICAgICAgICAgdHJpbUVuZCgpLFxuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgLi4ub3B0aW9ucz8uaGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgW0xyY0xpYl0gUmVxdWVzdGluZyAke3BhdGh9YCk7XG5cbiAgICAgIHJldHVybiBmZXRjaChcbiAgICAgICAgYCR7dGhpcy5hcGl9JHtwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGggOiAnLycgKyBwYXRofWAsXG4gICAgICAgIGluaXRcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYnVja2V0LmVucXVldWUoZGlzcGF0Y2hlcik7XG5cbiAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgfVxufSIsICJpbXBvcnQgeyBWb2ljZUNoYW5uZWwsIFN0YWdlQ2hhbm5lbCwgU25vd2ZsYWtlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQge1xuICBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICBqb2luVm9pY2VDaGFubmVsLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbixcbiAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICBBdWRpb1BsYXllciB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBOb0d1aWxkUXVldWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmNsYXNzIFZvaWNlVXRpbHMge1xuICAvKipcbiAgICogVm9pY2UgY29ubmVjdGlvbiBjYWNoZSB0byBzdG9yZSB2b2ljZSBjb25uZWN0aW9ucyBvZiB0aGUgUGxheWVyIGNvbXBvbmVudHMuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4gICAqIEl0IG9ubHkgZXhpc3RzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgY2FjaGU6IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPiA9IG5ldyBDb2xsZWN0aW9uPFxuICAgIFNub3dmbGFrZSxcbiAgICBTdHJlYW1EaXNwYXRjaGVyPihcbiAgKTtcblxuICAvKipcbiAgICogVGhlIHZvaWNlIHV0aWxzIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbCwgY3JlYXRpbmcgYmFzaWMgc3RyZWFtIGRpc3BhdGNoIG1hbmFnZXJcbiAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgb3B0aW9ucz86IHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgIHF1ZXVlOiBHdWlsZFF1ZXVlO1xuICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG4gICAgZ3JvdXA/OiBzdHJpbmc7XG4gIH0pXG4gIDogUHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPiB7XG4gICAgaWYgKCFvcHRpb25zPy5xdWV1ZSkgdGhyb3cgbmV3IE5vR3VpbGRRdWV1ZUVycm9yKCk7XG4gICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMuam9pbihjaGFubmVsLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdWIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihcbiAgICAgIGNvbm4sXG4gICAgICBjaGFubmVsLFxuICAgICAgb3B0aW9ucy5xdWV1ZSxcbiAgICAgIG9wdGlvbnMubWF4VGltZSxcbiAgICAgIG9wdGlvbnMuYXVkaW9QbGF5ZXJcbiAgICApO1xuICAgIHJldHVybiBzdWI7XG4gIH1cblxuICAvKipcbiAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gW2NoYW5uZWxdIFRoZSB2b2ljZS9zdGFnZSBjaGFubmVsIHRvIGpvaW5cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICogQHJldHVybnMge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBqb2luKFxuICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gIG9wdGlvbnM/OiB7XG4gICAgZGVhZj86IGJvb2xlYW47XG4gICAgbWF4VGltZT86IG51bWJlcjtcbiAgICBncm91cD86IHN0cmluZztcbiAgfSlcbiAge1xuICAgIGNvbnN0IGV4aXN0aW5nQ29ubmVjdGlvbiA9IHRoaXMuZ2V0Q29ubmVjdGlvbihcbiAgICAgIGNoYW5uZWwuZ3VpbGQuaWQsXG4gICAgICBvcHRpb25zPy5ncm91cFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgZXhpc3RpbmdDb25uZWN0aW9uPy5qb2luQ29uZmlnLmNoYW5uZWxJZCA9PT0gY2hhbm5lbD8uaWQgJiZcbiAgICBleGlzdGluZ0Nvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuICAgIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0Nvbm5lY3Rpb247XG4gICAgfVxuXG4gICAgY29uc3QgY29ubiA9IGpvaW5Wb2ljZUNoYW5uZWwoe1xuICAgICAgZ3VpbGRJZDogY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgIGNoYW5uZWxJZDogY2hhbm5lbC5pZCxcbiAgICAgIGFkYXB0ZXJDcmVhdG9yOiBjaGFubmVsLmd1aWxkLlxuICAgICAgdm9pY2VBZGFwdGVyQ3JlYXRvciBhcyB1bmtub3duIGFzIERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsXG4gICAgICBzZWxmRGVhZjogQm9vbGVhbihvcHRpb25zPy5kZWFmKSxcbiAgICAgIGRlYnVnOiB0aGlzLnBsYXllci5ldmVudHMubGlzdGVuZXJDb3VudCgnZGVidWcnKSA+IDAsXG4gICAgICBncm91cDogb3B0aW9ucz8uZ3JvdXBcbiAgICB9KTtcblxuICAgIHJldHVybiBjb25uO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHZvaWNlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBwdWJsaWMgZGlzY29ubmVjdChjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24gfCBTdHJlYW1EaXNwYXRjaGVyKSB7XG4gICAgaWYgKGNvbm5lY3Rpb24gaW5zdGFuY2VvZiBTdHJlYW1EaXNwYXRjaGVyKVxuICAgIGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLnZvaWNlQ29ubmVjdGlvbjtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpXG4gICAgICByZXR1cm4gY29ubmVjdGlvbi5kZXN0cm95KCk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vXG4gICAgfX1cblxuICAvKipcbiAgICogUmV0dXJucyBEaXNjb3JkIFBsYXllciB2b2ljZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7U25vd2ZsYWtlfSBndWlsZCBUaGUgZ3VpbGQgaWRcbiAgICogQHJldHVybnMge1N0cmVhbURpc3BhdGNoZXJ9XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29ubmVjdGlvbihndWlsZDogU25vd2ZsYWtlLCBncm91cD86IHN0cmluZykge1xuICAgIHJldHVybiBnZXRWb2ljZUNvbm5lY3Rpb24oZ3VpbGQsIGdyb3VwKTtcbiAgfVxufVxuXG5leHBvcnQgeyBWb2ljZVV0aWxzIH07IiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9mYWJyaWMvU2VhcmNoUmVzdWx0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4vUXVlcnlSZXNvbHZlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZU9wdGlvbnMge1xuICBjaGVja0ludGVydmFsPzogbnVtYmVyO1xufVxuXG4vLyA1aFxuY29uc3QgREVGQVVMVF9FWFBJUllfVElNRU9VVCA9IDE4XzAwMF8wMDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZVByb3ZpZGVyPFQ+IHtcbiAgZ2V0RGF0YSgpOiBQcm9taXNlPERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQ+W10+O1xuICBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCk6IFByb21pc2U8dm9pZD47XG4gIHJlc29sdmUoY29udGV4dDogUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCk6IFByb21pc2U8U2VhcmNoUmVzdWx0Pjtcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5Q2FjaGUgaW1wbGVtZW50cyBRdWVyeUNhY2hlUHJvdmlkZXI8VHJhY2s+IHtcbiAgI2RlZmF1bHRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUcmFjaz4+KCk7XG4gIHB1YmxpYyB0aW1lcjogTm9kZUpTLlRpbWVyO1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBwbGF5ZXI6IFBsYXllcixcbiAgcHVibGljIG9wdGlvbnM6IFF1ZXJ5Q2FjaGVPcHRpb25zID0ge1xuICAgIGNoZWNrSW50ZXJ2YWw6IERFRkFVTFRfRVhQSVJZX1RJTUVPVVRcbiAgfSlcbiAge1xuICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbChcbiAgICAgIHRoaXMuY2xlYW51cC5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5jaGVja0ludGVydmFsXG4gICAgKS51bnJlZigpO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGVja0ludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY2hlY2tJbnRlcnZhbCA/PyBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFudXAoKSB7XG4gICAgZm9yIChjb25zdCBbaWQsIHZhbHVlXSBvZiB0aGlzLiNkZWZhdWx0Q2FjaGUpIHtcbiAgICAgIGlmICh2YWx1ZS5oYXNFeHBpcmVkKCkpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNsZWFyKCkge1xuICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERhdGEoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLiNkZWZhdWx0Q2FjaGUudmFsdWVzKCldO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KSB7XG4gICAgZGF0YS50cmFja3MuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI2RlZmF1bHRDYWNoZS5oYXMoZC51cmwpKSByZXR1cm47XG4gICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuc2V0KGQudXJsLCBuZXcgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGUoZCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlc29sdmUoY29udGV4dDogUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2RlZmF1bHRDYWNoZS5nZXQoY29udGV4dC5xdWVyeSk7XG4gICAgaWYgKCFyZXN1bHQpXG4gICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgIHF1ZXJ5OiBjb250ZXh0LnF1ZXJ5LFxuICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnksXG4gICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICB0cmFja3M6IFtyZXN1bHQuZGF0YV0sXG4gICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGUsXG4gICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUID0gdW5rbm93bj4ge1xuICBwdWJsaWMgZXhwaXJlQWZ0ZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBkYXRhOiBULFxuICBleHBpcmVBZnRlcjogbnVtYmVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVClcbiAge1xuICAgIGlmICh0eXBlb2YgZXhwaXJlQWZ0ZXIgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmV4cGlyZUFmdGVyID0gRGF0ZS5ub3coKSArIGV4cGlyZUFmdGVyO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYXNFeHBpcmVkKCkge1xuICAgIGlmIChcbiAgICB0eXBlb2YgdGhpcy5leHBpcmVBZnRlciAhPT0gJ251bWJlcicgfHxcbiAgICBpc05hTih0aGlzLmV4cGlyZUFmdGVyKSB8fFxuICAgIHRoaXMuZXhwaXJlQWZ0ZXIgPCAxKVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBEYXRlLm5vdygpIDw9IHRoaXMuZXhwaXJlQWZ0ZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0IHtcbiAgcXVlcnk6IHN0cmluZztcbiAgcmVxdWVzdGVkQnk/OiBVc2VyO1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBgZXh0OiR7c3RyaW5nfWA7XG59IiwgImltcG9ydCB7IEZGbXBlZyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuaW1wb3J0IHtcbiAgQ2xpZW50LFxuICBTbm93Zmxha2VVdGlsLFxuICBWb2ljZVN0YXRlLFxuICBJbnRlbnRzQml0RmllbGQsXG4gIFVzZXIsXG4gIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgdmVyc2lvbiBhcyBkanNWZXJzaW9uLFxuICBFdmVudHMgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQge1xuICBQbGF5bGlzdCxcbiAgVHJhY2ssXG4gIFNlYXJjaFJlc3VsdCxcbiAgU2VhcmNoT3B0aW9ucyxcbiAgUGxheWxpc3RJbml0RGF0YSB9IGZyb21cbicuL2ZhYnJpYyc7XG5pbXBvcnQge1xuICBHdWlsZFF1ZXVlRXZlbnRzLFxuICBWb2ljZUNvbm5lY3RDb25maWcsXG4gIEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnMsXG4gIEd1aWxkTm9kZU1hbmFnZXIsXG4gIEd1aWxkUXVldWUsXG4gIFJlc291cmNlUGxheU9wdGlvbnMsXG4gIEd1aWxkUXVldWVFdmVudCB9IGZyb21cbicuL3F1ZXVlJztcbmltcG9ydCB7IFZvaWNlVXRpbHMgfSBmcm9tICcuL3N0cmVhbS9Wb2ljZVV0aWxzJztcbmltcG9ydCB7XG4gIFF1ZXJ5UmVzb2x2ZXIsXG4gIFF1ZXJ5VHlwZSxcbiAgUmVzb2x2ZWRRdWVyeSxcbiAgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbVxuJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi91dGlscy9VdGlsJztcbmltcG9ydCB7XG4gIEF1ZGlvUmVzb3VyY2UsXG4gIHZlcnNpb24gYXMgZFZvaWNlVmVyc2lvbixcbiAgU3RyZWFtVHlwZSB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBRdWVyeUNhY2hlLCBRdWVyeUNhY2hlUHJvdmlkZXIgfSBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yLCBOb1Jlc3VsdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyIH0gZnJvbSAnLi9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXInO1xuaW1wb3J0IHsgQ29udGV4dCwgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4vaG9va3MnO1xuaW1wb3J0IHsgSG9va3NDdHgsIFNVUEVSX0NPTlRFWFQgfSBmcm9tICcuL2hvb2tzL2NvbW1vbic7XG5pbXBvcnQgeyBMcmNMaWIgfSBmcm9tICcuL2xyY2xpYi9McmNMaWInO1xuaW1wb3J0IHsgZ2V0Q29tcGF0TmFtZSwgaXNDbGllbnRQcm94eSB9IGZyb20gJy4vY29tcGF0L2NyZWF0ZUVyaXNDb21wYXQnO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvciB9IGZyb20gJy4vdXRpbHMvRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvcic7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IHZlcnNpb24gYXMgZHBWZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcbmltcG9ydCB7XG4gIFBsYXllclN0cmVhbUludGVyY2VwdG9yLFxuICB0eXBlIFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucyB9IGZyb21cbicuL1BsYXllclN0cmVhbUludGVyY2VwdG9yJztcbmltcG9ydCB0eXBlIHsgSW50ZXJjZXB0ZWRTdHJlYW0gfSBmcm9tICcuL3N0cmVhbS9JbnRlcmNlcHRlZFN0cmVhbSc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyRXZlbnRzIHtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgdm9pY2VTdGF0ZVVwZGF0ZTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgb2xkU3RhdGU6IFZvaWNlU3RhdGUsXG4gIG5ld1N0YXRlOiBWb2ljZVN0YXRlKVxuICA9PiBhbnk7XG59XG5cbmV4cG9ydCBjb25zdCBQbGF5ZXJFdmVudCA9IHtcbiAgZGVidWc6ICdkZWJ1ZycsXG4gIERlYnVnOiAnZGVidWcnLFxuICBlcnJvcjogJ2Vycm9yJyxcbiAgRXJyb3I6ICdlcnJvcicsXG4gIHZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgVm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGxheWVyRXZlbnQgPSAodHlwZW9mIFBsYXllckV2ZW50KVtrZXlvZiB0eXBlb2YgUGxheWVyRXZlbnRdO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gYW55PiB7XG4gIHRyYWNrOiBUcmFjaztcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgc2VhcmNoUmVzdWx0OiBTZWFyY2hSZXN1bHQ7XG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPFQ+O1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuZXhwb3J0IHR5cGUgVHJhY2tMaWtlID1cbnN0cmluZyB8XG5UcmFjayB8XG5TZWFyY2hSZXN1bHQgfFxuVHJhY2tbXSB8XG5QbGF5bGlzdCB8XG5BdWRpb1Jlc291cmNlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gZXh0ZW5kcyBTZWFyY2hPcHRpb25zIHtcbiAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICBjb25uZWN0aW9uT3B0aW9ucz86IFZvaWNlQ29ubmVjdENvbmZpZztcbiAgYXVkaW9QbGF5ZXJPcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIGFmdGVyU2VhcmNoPzogKHJlc3VsdDogU2VhcmNoUmVzdWx0KSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCB0eXBlIFZvaWNlU3RhdGVIYW5kbGVyID0gKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFZvaWNlU3RhdGU6IFZvaWNlU3RhdGUsXG5uZXdWb2ljZVN0YXRlOiBWb2ljZVN0YXRlKVxuPT4gQXdhaXRlZDx2b2lkPjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiB0aW1lb3V0XG4gICAqL1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbXMgdG8gcmUtbW9uaXRvciBldmVudCBsb29wIGxhZ1xuICAgKi9cbiAgbGFnTW9uaXRvcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAgICovXG4gIGxvY2tWb2ljZVN0YXRlSGFuZGxlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBxdWVyeWluZyBtZXRhZGF0YSBmcm9tXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHN0cmVhbWluZyBmcm9tXG4gICAqL1xuICBibG9ja1N0cmVhbUZyb20/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZVByb3ZpZGVyPGFueT4gfCBudWxsO1xuICAvKipcbiAgICogU2tpcCBmZm1wZWcgcHJvY2VzcyB3aGVuIHBvc3NpYmxlXG4gICAqL1xuICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBwcm9iZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNTAwMC5cbiAgICovXG4gIHByb2JlVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBmZm1wZWcgcGF0aFxuICAgKi9cbiAgZmZtcGVnUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3ZlcnJpZGUgdGhlIGZhbGxiYWNrIGNvbnRleHQuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIG92ZXJyaWRlRmFsbGJhY2tDb250ZXh0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXllciBleHRlbmRzIFBsYXllckV2ZW50c0VtaXR0ZXI8UGxheWVyRXZlbnRzPiB7XG4gICNsYXN0TGF0ZW5jeSA9IC0xO1xuICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICNsYWdNb25pdG9yVGltZW91dDogTm9kZUpTLlRpbWVvdXQ7XG4gICNsYWdNb25pdG9ySW50ZXJ2YWw6IE5vZGVKUy5UaW1lb3V0O1xuICAjb25Wb2ljZVN0YXRlVXBkYXRlOiBWb2ljZVN0YXRlSGFuZGxlciA9IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcjtcbiAgI2hvb2tzQ3R4OiBDb250ZXh0PEhvb2tzQ3R4PiB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgZGlzY29yZC1wbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nID0gZHBWZXJzaW9uO1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcGxheWVyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgLyoqXG4gICAqIFRoZSBkaXNjb3JkLmpzIGNsaWVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudCE6IENsaWVudDtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMhOiBQbGF5ZXJJbml0T3B0aW9ucztcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgbm9kZXMgKHF1ZXVlKSBtYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBhcGkgdXRpbGl0aWVzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VVdGlscyA9IG5ldyBWb2ljZVV0aWxzKHRoaXMpO1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgbWFuYWdlclxuICAgKi9cbiAgcHVibGljIGV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCh0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgZXZlbnRzIGNoYW5uZWxcbiAgICovXG4gIHB1YmxpYyBldmVudHMgPSBuZXcgUGxheWVyRXZlbnRzRW1pdHRlcjxHdWlsZFF1ZXVlRXZlbnRzPihbXG4gIEd1aWxkUXVldWVFdmVudC5FcnJvcixcbiAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yXVxuICApO1xuICAvKipcbiAgICogVGhlIHBsYXllciB2ZXJzaW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbiA9IFBsYXllci52ZXJzaW9uO1xuICAvKipcbiAgICogVGhlIGx5cmljcyBhcGlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBseXJpY3MgPSBuZXcgTHJjTGliKHRoaXMpO1xuXG4gICNzdHJlYW1JbnRlcmNlcHRvcjogUGxheWVyU3RyZWFtSW50ZXJjZXB0b3IgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgRGlzY29yZCBQbGF5ZXJcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBUaGUgRGlzY29yZCBDbGllbnRcbiAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihbUGxheWVyRXZlbnQuRXJyb3JdKTtcblxuICAgIGlmIChvcHRpb25zLmZmbXBlZ1BhdGgpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mZm1wZWdQYXRoICE9PSAnc3RyaW5nJylcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCB0eXBlIFwic3RyaW5nXCIgZm9yIG9wdGlvbnMuZmZtcGVnUGF0aC4gR290ICR7dHlwZW9mIG9wdGlvbnMuZmZtcGVnUGF0aH0gaW5zdGVhZGBcbiAgICAgICk7XG5cbiAgICAgIHByb2Nlc3MuZW52LkZGTVBFR19QQVRIID0gb3B0aW9ucy5mZm1wZWdQYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQ29tcGF0TW9kZSA9IGlzQ2xpZW50UHJveHkoY2xpZW50KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkaXNjb3JkIGNsaWVudFxuICAgICAqIEB0eXBlIHtDbGllbnR9XG4gICAgICovXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoY2xpZW50IGluc3RhbmNlb2YgQ2xpZW50KSkge1xuICAgICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAgIGBDbGllbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIGRpc2NvcmQuanNAJHtkanNWZXJzaW9ufSBjbGllbnQsIHNvbWUgdGhpbmdzIG1heSBub3Qgd29yayBjb3JyZWN0bHkuIFRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gY29ycnVwdCBkZXBlbmRlbmNpZXMgb3IgaGF2aW5nIG11bHRpcGxlIGluc3RhbGxhdGlvbnMgb2YgZGlzY29yZC5qcy5gLFxuICAgICAgICAgICAgJ0ludmFsaWRDbGllbnRJbnN0YW5jZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWJmID1cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIGluc3RhbmNlb2YgSW50ZW50c0JpdEZpZWxkID9cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIDpcbiAgICAgICAgbmV3IEludGVudHNCaXRGaWVsZCh0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMpO1xuXG4gICAgICAgIGlmICghaWJmLmhhcyhJbnRlbnRzQml0RmllbGQuRmxhZ3MuR3VpbGRWb2ljZVN0YXRlcykpIHtcbiAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICAnY2xpZW50IGlzIG1pc3NpbmcgXCJHdWlsZFZvaWNlU3RhdGVzXCIgaW50ZW50JyxcbiAgICAgICAgICAgICdJbnZhbGlkSW50ZW50c0JpdEZpZWxkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuXG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH19XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI6IGZhbHNlLFxuICAgICAgYmxvY2tFeHRyYWN0b3JzOiBbXSxcbiAgICAgIGJsb2NrU3RyZWFtRnJvbTogW10sXG4gICAgICBjb25uZWN0aW9uVGltZW91dDogMjAwMDAsXG4gICAgICBsYWdNb25pdG9yOiAzMDAwMCxcbiAgICAgIHF1ZXJ5Q2FjaGU6XG4gICAgICBvcHRpb25zLnF1ZXJ5Q2FjaGUgPT09IG51bGwgP1xuICAgICAgbnVsbCA6XG4gICAgICBvcHRpb25zLnF1ZXJ5Q2FjaGUgfHwgbmV3IFF1ZXJ5Q2FjaGUodGhpcyksXG4gICAgICBza2lwRkZtcGVnOiB0cnVlLFxuICAgICAgcHJvYmVUaW1lb3V0OiA1MDAwLFxuICAgICAgb3ZlcnJpZGVGYWxsYmFja0NvbnRleHQ6IHRydWUsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSBzYXRpc2ZpZXMgUGxheWVySW5pdE9wdGlvbnM7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuaW5jcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmNsaWVudC5vbihFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZSwgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgICB0aGlzLmNsaWVudC5fX2RwX3ZvaWNlU3RhdGVVcGRhdGVfcHJveHkodGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICdGYWlsZWQgdG8gYXR0YWNoIHZvaWNlIHN0YXRlIHVwZGF0ZSBwcm94eSwgdm9pY2Ugc3RhdGUgaGFuZGxlciB3aWxsIG5vdCB3b3JrIHByb3Blcmx5JyxcbiAgICAgICAgICAnQ29tcGF0TW9kZUVycm9yJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICB0eXBlb2YgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPT09ICdudW1iZXInICYmXG4gICAgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKVxuICAgIHtcbiAgICAgIHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgdGhpcy4jbGFnTW9uaXRvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgIGBbTGFnIE1vbml0b3JdIEV2ZW50IGxvb3AgbGF0ZW5jeTogJHt0aGlzLiNsYXN0TGF0ZW5jeX1tc2BcbiAgICAgICAgICApO1xuICAgICAgICB9LCAwKS51bnJlZigpO1xuICAgICAgfSwgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IpLnVucmVmKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vdmVycmlkZUZhbGxiYWNrQ29udGV4dCkge1xuICAgICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0BbcGxheWVyXScsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaG9va3MgY29udGV4dCBmb3IgdGhpcyBwbGF5ZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbnRleHQoKSB7XG4gICAgaWYgKCF0aGlzLiNob29rc0N0eCkge1xuICAgICAgdGhpcy4jaG9va3NDdHggPSBjcmVhdGVDb250ZXh0KCk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsUHJvdmlkZXIgPSB0aGlzLiNob29rc0N0eC5wcm92aWRlLmJpbmQodGhpcy4jaG9va3NDdHgpO1xuXG4gICAgICB0aGlzLiNob29rc0N0eC5wcm92aWRlID0gKHZhbHVlLCByZWNlaXZlcikgPT4ge1xuICAgICAgICByZXR1cm4gU1VQRVJfQ09OVEVYVC5wcm92aWRlKHRoaXMsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxQcm92aWRlcih2YWx1ZSwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jaG9va3NDdHg7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICAgKi9cbiAgcHVibGljIG9uVm9pY2VTdGF0ZVVwZGF0ZShoYW5kbGVyOiBWb2ljZVN0YXRlSGFuZGxlcikge1xuICAgIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZGVidWcnLCBtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG5ldyBkaXNjb3JkLXBsYXllciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHBsYXllclxuICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBsYXllcihjbGllbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhY2hlIHByb3ZpZGVyIGluIHVzZVxuICAgKi9cbiAgcHVibGljIGdldCBxdWVyeUNhY2hlKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucXVlcnlDYWNoZSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsaWFzIHRvIGBQbGF5ZXIubm9kZXNgLlxuICAgKi9cbiAgcHVibGljIGdldCBxdWV1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgbG9vcCBsYXRlbmN5IGluIG1zLiBJZiB5b3VyIGJvdCBpcyBsYWdneSBhbmQgdGhpcyByZXR1cm5zIGEgbnVtYmVyIGFib3ZlIDIwbXMgZm9yIGV4YW1wbGUsXG4gICAqIHNvbWUgZXhwZW5zaXZlIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHdoaWNoIGlzIHNsb3dpbmcgZG93biB0aGUgZXZlbnQgbG9vcC5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIHB1YmxpYyBnZXQgZXZlbnRMb29wTGFnKCkge1xuICAgIHJldHVybiB0aGlzLiNsYXN0TGF0ZW5jeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgc3RhdGlzdGljcyB0aGF0IGNvdWxkIGJlIHVzZWZ1bC4gU3RhdGlzdGljcyBnZW5lcmF0b3IgaXMgc3RpbGwgZXhwZXJpbWVudGFsLlxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRzID0gcGxheWVyLmdlbmVyYXRlU3RhdGlzdGljcygpO1xuICAgKlxuICAgKiBjb25zb2xlLmxvZyhzdGF0cyk7XG4gICAqXG4gICAqIC8vIG91dHB1dHMgc29tZXRoaW5nIGxpa2VcbiAgICogLy8ge1xuICAgKiAvLyAgIHF1ZXVlc0NvdW50OiBudW1iZXIsXG4gICAqIC8vICAgcXVlcnlDYWNoZUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAqIC8vICAgcXVldWVzOiBbXG4gICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAqIC8vICAgICAgLi4uXG4gICAqIC8vICAgXVxuICAgKiAvLyB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlU3RhdGlzdGljcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVldWVzQ291bnQ6IHRoaXMucXVldWVzLmNhY2hlLnNpemUsXG4gICAgICBxdWVyeUNhY2hlRW5hYmxlZDogdGhpcy5xdWVyeUNhY2hlICE9IG51bGwsXG4gICAgICBxdWV1ZXM6IHRoaXMucXVldWVzLmNhY2hlLm1hcCgobSkgPT4gbS5zdGF0cy5nZW5lcmF0ZSgpKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGxheWVyIGlzIGluIGNvbXBhdGliaWxpdHkgbW9kZS4gQ29tcGF0aWJpbGl0eSBtb2RlIGlzIGVuYWJsZWQgd2hlbiBub24tZGlzY29yZC5qcyBjbGllbnQgaXMgdXNlZC5cbiAgICovXG4gIHB1YmxpYyBpc0NvbXBhdE1vZGUoKSB7XG4gICAgcmV0dXJuIGlzQ2xpZW50UHJveHkodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgZXZlcnkgc2luZ2xlIHF1ZXVlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFzdGVyIHBsYXllciBpbnN0YW5jZVxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIHVzZSBtZSB3aGVuIHlvdSB3YW50IHRvIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZSBldmVyeSBzaW5nbGUgcXVldWVzIGluIGV4aXN0ZW5jZSBcdUQ4M0RcdUREMkFcbiAgICogYXdhaXQgcGxheWVyLmRlc3Ryb3koKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICB0aGlzLm5vZGVzLmNhY2hlLmZvckVhY2goKG5vZGUpID0+IG5vZGUuZGVsZXRlKCkpO1xuXG4gICAgaWYgKCF0aGlzLmlzQ29tcGF0TW9kZSgpKSB7XG4gICAgICB0aGlzLmNsaWVudC5vZmYoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGUsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgICAvLyBAdHMtaWdub3JlIHByaXZhdGUgbWV0aG9kXG4gICAgICB0aGlzLmNsaWVudC5kZWNyZW1lbnRNYXhMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgaWYgKHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpO1xuICAgIGlmICh0aGlzLiNsYWdNb25pdG9yVGltZW91dCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9yVGltZW91dCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5nZXQob2xkU3RhdGUuZ3VpbGQuaWQpO1xuICAgIGlmICghcXVldWUgfHwgIXF1ZXVlLmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICAgIC8vIGRpc3BhdGNoIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgIGNvbnN0IHdhc0hhbmRsZWQgPSB0aGlzLmV2ZW50cy5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlZvaWNlU3RhdGVVcGRhdGUsXG4gICAgICBxdWV1ZSxcbiAgICAgIG9sZFN0YXRlLFxuICAgICAgbmV3U3RhdGVcbiAgICApO1xuICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgaWYgKHdhc0hhbmRsZWQgJiYgIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIpIHJldHVybjtcblxuICAgIHJldHVybiB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUodGhpcywgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBwYXNzaW5nIHZvaWNlIHN0YXRlIHVwZGF0ZSBkYXRhIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB2b2ljZSBzdGF0ZSBoYW5kbGVyXG4gICAqXG4gICAqIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICogICAvLyB0aGlzIGlzIGRlZmluaXRlbHkgYSByb2NrZXQgc2NpZW5jZSwgcmlnaHQgaGVyZVxuICAgKiAgIHBsYXllci5oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBoYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIGtlZXAgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIsIGV2ZW4gaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBsb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVW5sb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIHN0b3AgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyB1bmxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHZvaWNlIHN0YXRlIGhhbmRsZXIgaXMgbG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhdWRpbyBwbGF5ZXJcbiAgICogQHBhcmFtIGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhlIG11c2ljIHNob3VsZCBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSB0cmFjayBvciBzb3VyY2UgdG8gcGxheVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBwbGF5ZXJcbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHF1ZXVlIG1hbmFnZW1lbnQsIGp1c3QgdXNlIHRoaXMgbWV0aG9kIFx1RDgzRFx1REUwNFxuICAgKiBjb25zdCBxdWVyeSA9ICd0aGlzIGlzIG15IHN1cGVyIGNvb2wgc2VhcmNoIHF1ZXJ5IHRoYXQgSSB3YW50IHRvIHBsYXknO1xuICAgKlxuICAgKiB0cnkge1xuICAgKiAgICBjb25zdCB7IHRyYWNrIH0gPSBhd2FpdCBwbGF5ZXIucGxheSh2b2ljZUNoYW5uZWwsIHF1ZXJ5KTtcbiAgICogICBjb25zb2xlLmxvZyhgXHVEODNDXHVERjg5IEkgYW0gcGxheWluZyAke3RyYWNrLnRpdGxlfSBcdUQ4M0NcdURGODlgKTtcbiAgICogfSBjYXRjaChlKSB7XG4gICAqICAgY29uc29sZS5sb2coYFx1RDgzRFx1REUyRCBGYWlsZWQgdG8gcGxheSBlcnJvciBvaCBubzpcXG5cXG4ke2V9YCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgcXVlcnk6IFRyYWNrTGlrZSxcbiAgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9KVxuICA6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgdmMgPSB0aGlzLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWwpO1xuICAgIGlmICghdmM/LmlzVm9pY2VCYXNlZCgpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ2NoYW5uZWwnLFxuICAgICAgJ1ZvaWNlQmFzZWRDaGFubmVsJyxcbiAgICAgICF2YyA/ICd1bmRlZmluZWQnIDogYGNoYW5uZWwgdHlwZSAke3ZjLnR5cGV9YFxuICAgICk7XG5cbiAgICBjb25zdCBvcmlnaW5hbFJlc3VsdCA9XG4gICAgcXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQgPyBxdWVyeSA6IGF3YWl0IHRoaXMuc2VhcmNoKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPVxuICAgIChhd2FpdCBvcHRpb25zLmFmdGVyU2VhcmNoPy4ob3JpZ2luYWxSZXN1bHQpKSB8fCBvcmlnaW5hbFJlc3VsdDtcbiAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoXG4gICAgICAgIGBObyByZXN1bHRzIGZvdW5kIGZvciBcIiR7cXVlcnl9XCIgKEV4dHJhY3RvcjogJHtcbiAgICAgICAgcmVzdWx0LmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYFxuXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5jcmVhdGUodmMuZ3VpbGQsIG9wdGlvbnMubm9kZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICBjb25zdCBlbnRyeSA9IHF1ZXVlLnRhc2tzUXVldWUuYWNxdWlyZSh7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gV2FpdGluZyBmb3IgdGhlIHF1ZXVlIHRvIHJlc29sdmUuLi5gKTtcbiAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyByZXNvbHZlZCFgKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQudHJhY2tzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC5wbGF5bGlzdCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1ZXVlLmlzUGxheWluZygpKVxuICAgICAgYXdhaXQgcXVldWUubm9kZS5wbGF5KG51bGwsIG9wdGlvbnMuYXVkaW9QbGF5ZXJPcHRpb25zKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gUmVsZWFzaW5nIGFuIGVudHJ5IGZyb20gdGhlIHF1ZXVlLi4uYCk7XG4gICAgICBxdWV1ZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2s6IHJlc3VsdC50cmFja3NbMF0sXG4gICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICBzZWFyY2hSZXN1bHQ6IHJlc3VsdCxcbiAgICAgIHF1ZXVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggdHJhY2tzXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBTZWFyY2hSZXN1bHR9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnlcbiAgICogQHBhcmFtIHtTZWFyY2hPcHRpb25zfSBvcHRpb25zIFRoZSBzZWFyY2ggb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZWFyY2hSZXN1bHQ+fVxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gJ3Bhc3MgdXJsIG9yIHRleHQgb3IgZGlzY29yZC1wbGF5ZXIgdHJhY2sgY29uc3RydWN0YWJsZSBvYmplY3RzLCB3ZSBnb3QgeW91IGNvdmVyZWQgXHVEODNEXHVERTBFJztcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGxheWVyLnNlYXJjaChzZWFyY2hRdWVyeSk7XG4gICAqXG4gICAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8vIExvZ3MgYFNlYXJjaFJlc3VsdGAgb2JqZWN0XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlYXJjaChcbiAgc2VhcmNoUXVlcnk6IFRyYWNrTGlrZSxcbiAgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KVxuICA6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSByZXR1cm4gc2VhcmNoUXVlcnk7XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBBdWRpb1Jlc291cmNlKSB7XG4gICAgICBzZWFyY2hRdWVyeSA9IHRoaXMuY3JlYXRlVHJhY2tGcm9tQXVkaW9SZXNvdXJjZShzZWFyY2hRdWVyeSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdGVkQnkgIT0gbnVsbClcbiAgICBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG5cbiAgICBvcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/Pz0gdGhpcy5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycztcbiAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgdHJhY2tzOiBbc2VhcmNoUXVlcnldLFxuICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICBxdWVyeVR5cGU6IHNlYXJjaFF1ZXJ5LnF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHBsYXlsaXN0OiBzZWFyY2hRdWVyeSxcbiAgICAgICAgdHJhY2tzOiBzZWFyY2hRdWVyeS50cmFja3MsXG4gICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgZXh0cmFjdG9yOiBzZWFyY2hRdWVyeS50cmFja3NbMF0/LmV4dHJhY3RvcixcbiAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgdHJhY2tzID0gc2VhcmNoUXVlcnkuZmlsdGVyKCh0KSA9PiB0IGluc3RhbmNlb2YgVHJhY2spO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgdHJhY2tzLFxuICAgICAgICBxdWVyeTogJ0BAIyV7e1VzZXJMb2FkZWRDb250ZW50fX0lI0BAJyxcbiAgICAgICAgZXh0cmFjdG9yOiBudWxsLFxuICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaGluZyAke3NlYXJjaFF1ZXJ5fWApO1xuXG4gICAgbGV0IGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsLFxuICAgICAgcHJvdG9jb2w6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSDtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgU2VhcmNoIGVuZ2luZSBzZXQgdG8gJHtvcHRpb25zLnNlYXJjaEVuZ2luZX0sIGZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZX1gXG4gICAgKTtcblxuICAgIGlmICgvXlxcdys6Ly50ZXN0KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgW3Byb3RvY29sTmFtZSwgLi4ucXVlcnldID0gc2VhcmNoUXVlcnkuc3BsaXQoJzonKTtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgUHJvdG9jb2wgJHtwcm90b2NvbE5hbWV9IGRldGVjdGVkIGluIHF1ZXJ5YCk7XG5cbiAgICAgIGNvbnN0IG1hdGNoaW5nRXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLnN0b3JlLmZpbmQoXG4gICAgICAgIChlKSA9PlxuICAgICAgICAhdGhpcy5leHRyYWN0b3JzLmlzRGlzYWJsZWQoZS5pZGVudGlmaWVyKSAmJlxuICAgICAgICBlLnByb3RvY29scy5pbmNsdWRlcyhwcm90b2NvbE5hbWUpXG4gICAgICApO1xuXG4gICAgICBpZiAobWF0Y2hpbmdFeHRyYWN0b3IpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBpcyBzdXBwb3J0ZWQgYnkgJHttYXRjaGluZ0V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IhYFxuICAgICAgICApO1xuICAgICAgICBleHRyYWN0b3IgPSBtYXRjaGluZ0V4dHJhY3RvcjtcbiAgICAgICAgc2VhcmNoUXVlcnkgPSBxdWVyeS5qb2luKCc6Jyk7XG4gICAgICAgIHByb3RvY29sID0gcHJvdG9jb2xOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIGFuIGV4dHJhY3RvciB0aGF0IHN1cHBvcnRzICR7cHJvdG9jb2xOYW1lfSBwcm90b2NvbC4gRmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgYmVoYXZpb3IuLi5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVkaXJlY3RlZCA9IGF3YWl0IFF1ZXJ5UmVzb2x2ZXIucHJlUmVzb2x2ZShzZWFyY2hRdWVyeSk7XG4gICAgY29uc3QgeyB0eXBlOiBxdWVyeVR5cGUsIHF1ZXJ5IH0gPVxuICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID09PSBRdWVyeVR5cGUuQVVUTyA/XG4gICAgUXVlcnlSZXNvbHZlci5yZXNvbHZlKHJlZGlyZWN0ZWQsIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUpIDpcbiAgICB7IHR5cGU6IG9wdGlvbnMuc2VhcmNoRW5naW5lLCBxdWVyeTogcmVkaXJlY3RlZCB9IGFzIFJlc29sdmVkUXVlcnk7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFF1ZXJ5IHR5cGUgaWRlbnRpZmllZCBhcyAke3F1ZXJ5VHlwZX0ke1xuICAgICAgZXh0cmFjdG9yICYmIHByb3RvY29sID9cbiAgICAgICcgYnV0IG1pZ2h0IG5vdCBiZSB1c2VkIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgcHJvdG9jb2wnIDpcbiAgICAgICcnfWBcblxuICAgICk7XG5cbiAgICAvLyBmb3JjZSBwYXJ0aWN1bGFyIGV4dHJhY3RvclxuICAgIGlmIChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdGFydHNXaXRoKCdleHQ6JykpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgRm9yY2luZyAke29wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KX0gZXh0cmFjdG9yLi4uYCk7XG4gICAgICBleHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuZ2V0KG9wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KSkhO1xuICAgICAgaWYgKCFleHRyYWN0b3IpXG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHF1ZXJ5IGFsbCBleHRyYWN0b3JzXG4gICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgIC8vIGNhY2hlIHZhbGlkYXRpb25cbiAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2hlY2tpbmcgY2FjaGUuLi5gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5yZXNvbHZlKHtcbiAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNhY2hlIGhpdFxuICAgICAgICBpZiAocmVzPy5oYXNUcmFja3MoKSkge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBoaXQgZm9yIHF1ZXJ5ICR7cXVlcnl9YCk7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBtaXNzIGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvcnMuLi5gKTtcblxuICAgICAgLy8gY2FjaGUgbWlzc1xuICAgICAgZXh0cmFjdG9yID1cbiAgICAgIChcbiAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gZXh0LnZhbGlkYXRlKHF1ZXJ5LCBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlKTtcbiAgICAgIH0pKT8uXG4gICAgICBleHRyYWN0b3IgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvLyBubyBleHRyYWN0b3JzIGF2YWlsYWJsZVxuICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gXG4gICAgKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBleHRyYWN0b3IuXG4gICAgaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgcHJvdG9jb2xcbiAgICB9KS5cbiAgICBjYXRjaCgoKSA9PiBudWxsKTtcblxuICAgIGlmIChyZXMpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCEnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBwbGF5bGlzdDogcmVzLnBsYXlsaXN0LFxuICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShyZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICAnRmFpbGVkIHRvIGZpbmQgcmVzdWx0IHVzaW5nIGFwcHJvcHJpYXRlIGV4dHJhY3Rvci4gUXVlcnlpbmcgYWxsIGV4dHJhY3RvcnMuLi4nXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKFxuICAgICAgYXN5bmMgKGV4dCkgPT5cbiAgICAgICFvcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoZXh0LmlkZW50aWZpZXIpICYmIChcbiAgICAgIGF3YWl0IGV4dC52YWxpZGF0ZShxdWVyeSkpICYmXG4gICAgICBleHQuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgICBwcm90b2NvbFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgYEZhaWxlZCB0byBxdWVyeSBtZXRhZGF0YSBxdWVyeSB1c2luZyAke1xuICAgICAgICByZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYFxuXG4gICAgICApO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQ/LmV4dHJhY3RvclxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCB1c2luZyAke3Jlc3VsdC5leHRyYWN0b3IuaWRlbnRpZmllcn0hYFxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiByZXN1bHQucmVzdWx0LnBsYXlsaXN0LFxuICAgICAgdHJhY2tzOiByZXN1bHQucmVzdWx0LnRyYWNrcyxcbiAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgfSk7XG5cbiAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGBkaXNjb3JkLXZvaXBgIG1vZHVsZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc29sZS5sb2cocGxheWVyLnNjYW5EZXBzKCkpO1xuICAgKiAvLyAtPiBsb2dzIGRlcGVuZGVuY2llcyByZXBvcnRcbiAgICogYGBgXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBwdWJsaWMgc2NhbkRlcHMoKSB7XG4gICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuICAgIGNvbnN0IHJ1bnRpbWUgPVxuICAgICdCdW4nIGluIGdsb2JhbFRoaXMgPyAnQnVuJyA6ICdEZW5vJyBpbiBnbG9iYWxUaGlzID8gJ0Rlbm8nIDogJ05vZGUnO1xuICAgIGNvbnN0IGRlcHNSZXBvcnQgPSBbXG4gICAgJ0Rpc2NvcmQgUGxheWVyJyxcbiAgICBsaW5lLFxuICAgIGAtIGRpc2NvcmQtcGxheWVyOiAke1BsYXllci52ZXJzaW9ufSR7XG4gICAgdGhpcy5pc0NvbXBhdE1vZGUoKSA/XG4gICAgYCAoJHtnZXRDb21wYXROYW1lKHRoaXMuY2xpZW50KX0gY29tcGF0aWJpbGl0eSBtb2RlKWAgOlxuICAgICcnfWAsXG5cbiAgICBgLSBkaXNjb3JkLXZvaXA6ICR7ZFZvaWNlVmVyc2lvbn1gLFxuICAgIGAtIGRpc2NvcmQuanM6ICR7ZGpzVmVyc2lvbn1gLFxuICAgIGAtIE5vZGUgdmVyc2lvbjogJHtwcm9jZXNzLnZlcnNpb259IChEZXRlY3RlZCBSdW50aW1lOiAke3J1bnRpbWV9LCBQbGF0Zm9ybTogJHtwcm9jZXNzLnBsYXRmb3JtfSBbJHtwcm9jZXNzLmFyY2h9XSlgLFxuICAgICgoKSA9PiB7XG4gICAgICBjb25zdCBpbmZvID0gRkZtcGVnLnJlc29sdmVTYWZlKCk7XG4gICAgICBpZiAoIWluZm8pIHJldHVybiAnRkZtcGVnL0F2Y29udiBub3QgZm91bmQnO1xuXG4gICAgICByZXR1cm4gW1xuICAgICAgYC0gZmZtcGVnOiAke2luZm8udmVyc2lvbn1gLFxuICAgICAgYC0gY29tbWFuZDogJHtpbmZvLmNvbW1hbmR9YCxcbiAgICAgIGAtIHN0YXRpYzogJHtpbmZvLm1vZHVsZX1gLFxuICAgICAgYC0gbGlib3B1czogJHtpbmZvLnJlc3VsdCEuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKX1gXS5cbiAgICAgIGpvaW4oJ1xcbicpO1xuICAgIH0pKCksXG4gICAgJ1xcbicsXG4gICAgJ0xvYWRlZCBFeHRyYWN0b3JzOicsXG4gICAgbGluZSxcbiAgICB0aGlzLmV4dHJhY3RvcnMuc3RvcmUuXG4gICAgbWFwKChtKSA9PiB7XG4gICAgICByZXR1cm4gbS5pZGVudGlmaWVyO1xuICAgIH0pLlxuICAgIGpvaW4oJ1xcbicpIHx8ICdOL0EnLFxuICAgICdcXG5cXG5kaXNjb3JkLXZvaXAnLFxuICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZ2VuZXJhdGVTdHJpbmcoKV07XG5cblxuICAgIHJldHVybiBkZXBzUmVwb3J0LmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHVibGljICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICB5aWVsZCogdGhpcy5ub2Rlcy5jYWNoZS52YWx1ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGBQbGF5bGlzdGAgaW5zdGFuY2VcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gaW5pdGlhbGl6ZSBhIHBsYXlsaXN0XG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUGxheWxpc3QoZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgIHJldHVybiBuZXcgUGxheWxpc3QodGhpcywgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRyYWNrIGZyb20gYW4gYXVkaW8gcmVzb3VyY2UuXG4gICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVUcmFja0Zyb21BdWRpb1Jlc291cmNlKHJlc291cmNlOiBBdWRpb1Jlc291cmNlKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSAocmVzb3VyY2UubWV0YWRhdGEgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHJlZiA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIGNvbnN0IG1heWJlVGl0bGUgPVxuICAgICd0aXRsZScgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aXRsZX1gIDogYFRyYWNrICR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVBdXRob3IgPVxuICAgICdhdXRob3InIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEuYXV0aG9yfWAgOiAnVW5rbm93biBhdXRob3InO1xuICAgIGNvbnN0IG1heWJlRHVyYXRpb24gPVxuICAgICdkdXJhdGlvbicgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS5kdXJhdGlvbn1gIDogJzAwOjAwJztcbiAgICBjb25zdCBtYXliZVRodW1ibmFpbCA9XG4gICAgJ3RodW1ibmFpbCcgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aHVtYm5haWx9YCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXliZVVSTCA9XG4gICAgJ3VybCcgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS51cmx9YCA6IGBkaXNjb3JkLXBsYXllcjovL2Jsb2IvJHtyZWZ9YDtcbiAgICBjb25zdCBtYXliZURlc2NyaXB0aW9uID1cbiAgICAnZGVzY3JpcHRpb24nIGluIG1ldGFkYXRhID9cbiAgICBgJHttZXRhZGF0YS5kZXNjcmlwdGlvbn1gIDpcbiAgICAnTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlLic7XG4gICAgY29uc3QgbWF5YmVWaWV3cyA9ICd2aWV3cycgaW4gbWV0YWRhdGEgPyBOdW1iZXIobWV0YWRhdGEudmlld3MpIHx8IDAgOiAwO1xuXG4gICAgY29uc3QgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywge1xuICAgICAgdGl0bGU6IG1heWJlVGl0bGUsXG4gICAgICBhdXRob3I6IG1heWJlQXV0aG9yLFxuICAgICAgZHVyYXRpb246IG1heWJlRHVyYXRpb24sXG4gICAgICB0aHVtYm5haWw6IG1heWJlVGh1bWJuYWlsLFxuICAgICAgdXJsOiBtYXliZVVSTCxcbiAgICAgIGRlc2NyaXB0aW9uOiBtYXliZURlc2NyaXB0aW9uLFxuICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuRElTQ09SRF9QTEFZRVJfQkxPQixcbiAgICAgIHNvdXJjZTogJ2FyYml0cmFyeScsXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgdmlld3M6IG1heWJlVmlld3NcbiAgICB9KTtcblxuICAgIHJlc291cmNlLm1ldGFkYXRhID0gdHJhY2s7XG5cbiAgICB0cmFjay5zZXRSZXNvdXJjZShyZXNvdXJjZSBhcyBBdWRpb1Jlc291cmNlPFRyYWNrPik7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpbnRlcmNlcHRpbmcgc3RyZWFtc1xuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBzdHJlYW0gdG8gaW50ZXJjZXB0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZGxlSW50ZXJjZXB0aW5nU3RyZWFtKFxuICBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgdHJhY2s6IFRyYWNrLFxuICBmb3JtYXQ6IFN0cmVhbVR5cGUsXG4gIHN0cmVhbTogSW50ZXJjZXB0ZWRTdHJlYW0pXG4gIHtcbiAgICBpZiAoIXRoaXMuI3N0cmVhbUludGVyY2VwdG9yKSByZXR1cm47XG5cbiAgICByZXR1cm4gdGhpcy4jc3RyZWFtSW50ZXJjZXB0b3IuaGFuZGxlKHF1ZXVlLCB0cmFjaywgZm9ybWF0LCBzdHJlYW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBnbG9iYWwgc3RyZWFtIGludGVyY2VwdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBzdHJlYW0gaW50ZXJjZXB0b3Igb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVN0cmVhbUludGVyY2VwdG9yKG9wdGlvbnM6IFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucykge1xuICAgIGlmICh0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yO1xuICAgIH1cblxuICAgIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yID0gbmV3IFBsYXllclN0cmVhbUludGVyY2VwdG9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yO1xuICB9XG59IiwgImltcG9ydCB7IENoYW5uZWxUeXBlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL3F1ZXVlJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuXG5mdW5jdGlvbiBoYW5kbGVFbXB0eUNoYW5uZWwoXG5wbGF5ZXI6IFBsYXllcixcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxuZ3VpbGRJZDogc3RyaW5nKVxue1xuICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkgfHwgIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKVxuICAgIHJldHVybjtcbiAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke2d1aWxkSWR9YCwgdGltZW91dCk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNoYW5uZWxQb3B1bGF0ZShcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5ndWlsZElkOiBzdHJpbmcpXG57XG4gIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtndWlsZElkfWApO1xuICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7Z3VpbGRJZH1gKTtcbiAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVBhdXNlT25FbXB0eShxdWV1ZTogR3VpbGRRdWV1ZSkge1xuICBjb25zdCBpc0VtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpO1xuICBjb25zdCB3YXNQYXVzZWRPbkVtcHR5ID0gUmVmbGVjdC5nZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknKTtcblxuICBpZiAoaXNFbXB0eSAmJiAhd2FzUGF1c2VkT25FbXB0eSkge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKHRydWUpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgdHJ1ZSk7XG4gICAgaWYgKHF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICBxdWV1ZS5kZWJ1ZyhcbiAgICAgICAgJ1ZvaWNlIGNoYW5uZWwgaXMgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHBhdXNpbmcuLi4nXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghaXNFbXB0eSAmJiB3YXNQYXVzZWRPbkVtcHR5KSB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQoZmFsc2UpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgZmFsc2UpO1xuICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgcXVldWUuZGVidWcoXG4gICAgICAgICdWb2ljZSBjaGFubmVsIGlzIG5vdCBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcmVzdW1pbmcuLi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVCb3RWb2ljZVN0YXRlVXBkYXRlKFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbm5ld1N0YXRlOiBWb2ljZVN0YXRlKVxue1xuICBpZiAoXG4gIG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJlxuICBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKVxuICB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc2VydmVyTXV0ZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICBuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiZcbiAgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJlxuICBvbGRTdGF0ZS5zdXBwcmVzcyAhPT0gbmV3U3RhdGUuc3VwcHJlc3MpXG4gIHtcbiAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zdXBwcmVzcyk7XG4gICAgaWYgKG5ld1N0YXRlLnN1cHByZXNzKSB7XG4gICAgICBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh0cnVlKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFN0YXRlOiBWb2ljZVN0YXRlLFxubmV3U3RhdGU6IFZvaWNlU3RhdGUpXG57XG4gIGlmICghcXVldWU/LmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICBjb25zdCBpc0JvdFN0YXRlID0gbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQ7XG4gIGNvbnN0IGd1aWxkSWQgPSBvbGRTdGF0ZS5ndWlsZC5pZDtcblxuICAvLyBCb3QgZGlzY29ubmVjdGVkXG4gIGlmIChpc0JvdFN0YXRlICYmIG9sZFN0YXRlLmNoYW5uZWxJZCAmJiAhbmV3U3RhdGUuY2hhbm5lbElkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvKiBub29wICovfVxuICAgIHJldHVybiB2b2lkIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdCwgcXVldWUpO1xuICB9XG5cbiAgaWYgKHF1ZXVlLm9wdGlvbnMucGF1c2VPbkVtcHR5KSB7XG4gICAgaGFuZGxlUGF1c2VPbkVtcHR5KHF1ZXVlKTtcbiAgfVxuXG4gIC8vIEJvdCBqb2luZWQgY2hhbm5lbCBvciBjaGFuZ2VkIHN0YXRlXG4gIGlmIChcbiAgaXNCb3RTdGF0ZSAmJlxuICBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgKFxuICAhb2xkU3RhdGUuY2hhbm5lbElkIHx8IG9sZFN0YXRlLmNoYW5uZWxJZCAhPT0gbmV3U3RhdGUuY2hhbm5lbElkKSlcbiAge1xuICAgIGlmIChxdWV1ZS5jb25uZWN0aW9uKSBxdWV1ZS5jaGFubmVsID0gbmV3U3RhdGUuY2hhbm5lbCE7XG4gICAgaGFuZGxlQm90Vm9pY2VTdGF0ZVVwZGF0ZShxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjaGFubmVsIGVtcHR5L3BvcHVsYXRlIGV2ZW50c1xuICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKSByZXR1cm47XG4gICAgaGFuZGxlRW1wdHlDaGFubmVsKHBsYXllciwgcXVldWUsIGd1aWxkSWQpO1xuICB9IGVsc2UgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCA9PT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgIGhhbmRsZUNoYW5uZWxQb3B1bGF0ZShwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgfSBlbHNlIGlmIChvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgIGlmIChcbiAgICBuZXdTdGF0ZS5jaGFubmVsSWQgIT09IHF1ZXVlLmNoYW5uZWwuaWQgJiZcbiAgICAhVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCkpXG5cbiAgICByZXR1cm47XG4gICAgaWYgKCFxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7Z3VpbGRJZH1gKSkge1xuICAgICAgaGFuZGxlRW1wdHlDaGFubmVsKHBsYXllciwgcXVldWUsIGd1aWxkSWQpO1xuICAgIH1cbiAgfVxufSIsICJpbXBvcnQgeyByZXNvbHZlLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEZGbXBlZywgRkZtcGVnTGliIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUpTT04ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTWF5YmVOdWxsPFQ+ID0gVCB8IG51bGw7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwZW5kZW5jaWVzUmVwb3J0IHtcbiAgY29yZToge1xuICAgICdkaXNjb3JkLXBsYXllcic6IHN0cmluZztcbiAgICAnZGlzY29yZC12b2lwJzogc3RyaW5nO1xuICB9O1xuICBsaWJvcHVzOiB7XG4gICAgbWVkaWFwbGV4OiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnQGRpc2NvcmRqcy9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BldmFuL29wdXMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICBvcHVzc2NyaXB0OiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnbm9kZS1vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gIH07XG4gIGxpYnNvZGl1bToge1xuICAgICdzb2RpdW0tbmF0aXZlJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgc29kaXVtOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnbGlic29kaXVtLXdyYXBwZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ3NvZGl1bS1qYXZhc2NyaXB0JzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BzdGFibGVsaWIveGNoYWNoYTIwcG9seTEzMDUnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnQG5vYmVsL2NpcGhlcnMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgfTtcbiAgZmZtcGVnOiBGRm1wZWdSZXBvcnQ7XG59XG5cbmV4cG9ydCB0eXBlIEZGbXBlZ1JlcG9ydCA9IFJlY29yZDxcbiAgRkZtcGVnTGliLFxuICBNYXliZU51bGw8e1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBoYXNMaWJvcHVzOiBib29sZWFuO1xuICB9Pj47XG5cblxuLyoqXG4gKiBBIHV0aWxpdHkgdG8gZ2VuZXJhdGUgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBkaXNjb3JkLXBsYXllciBtb2R1bGUuXG4gKi9cbmV4cG9ydCBjb25zdCBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yID0ge1xuICAvKipcbiAgICogRmluZHMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIG9mIGEgcGFja2FnZS5cbiAgICogQHBhcmFtIGRpciAtIFRoZSBkaXJlY3RvcnkgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cbiAgICogQHBhcmFtIHBhY2thZ2VOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gZmluZFxuICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2hcbiAgICogQHJldHVybnMgVGhlIHBhY2thZ2UuanNvbiBmaWxlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZmluZFBhY2thZ2VKU09OKFxuICBkaXI6IHN0cmluZyxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZGVwdGg6IG51bWJlcilcbiAgOiBQYWNrYWdlSlNPTiB8IG51bGwge1xuICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB0YXJnZXQgPSByZXNvbHZlKGRpciwgJ3BhY2thZ2UuanNvbicpO1xuXG4gICAgY29uc3QgbmV4dCA9ICgpID0+XG4gICAgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5maW5kUGFja2FnZUpTT04oXG4gICAgICByZXNvbHZlKGRpciwgJy4uJyksXG4gICAgICBwYWNrYWdlTmFtZSxcbiAgICAgIGRlcHRoIC0gMVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICAgIGNvbnN0IHBrZ0pTT046IFBhY2thZ2VKU09OID0gcmVxdWlyZSh0YXJnZXQpO1xuXG4gICAgICBpZiAocGtnSlNPTi5uYW1lICE9PSBwYWNrYWdlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGtnSlNPTjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogVHJpZXMgdG8gZmluZCB0aGUgdmVyc2lvbiBvZiBhIGRlcGVuZGVuY3kuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHBhY2thZ2UgdG8gZmluZCB0aGUgdmVyc2lvbiBvZlxuICAgKiBAcGFyYW0gbWF4TG9va3VwRGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2ggZm9yIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgKiBAcmV0dXJucyBUaGUgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIHZlcnNpb24obmFtZTogc3RyaW5nLCBtYXhMb29rdXBEZXB0aCA9IDMpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG5hbWUgPT09ICdkaXNjb3JkLXBsYXllcicpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBrZyA9IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZmluZFBhY2thZ2VKU09OKFxuICAgICAgICBkaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShuYW1lKSksXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1heExvb2t1cERlcHRoXG4gICAgICApO1xuICAgICAgcmV0dXJuIHBrZz8udmVyc2lvbiA/PyBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICAgKiBAcmV0dXJucyBUaGUgcmVwb3J0IG9iamVjdFxuICAgKi9cbiAgZ2VuZXJhdGUoKTogRGVwZW5kZW5jaWVzUmVwb3J0IHtcbiAgICBjb25zdCBmZm1wZWdSZXBvcnQgPSB7fSBhcyBGRm1wZWdSZXBvcnQ7XG5cbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBGRm1wZWcuc291cmNlcykge1xuICAgICAgZmZtcGVnUmVwb3J0W2xpYi5uYW1lXSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZmZtcGVnID0gRkZtcGVnLnJlc29sdmVTYWZlKCk7XG5cbiAgICBpZiAoZmZtcGVnKSB7XG4gICAgICBmZm1wZWdSZXBvcnRbZmZtcGVnLm5hbWVdID0ge1xuICAgICAgICBoYXNMaWJvcHVzOiBmZm1wZWcuY29tbWFuZC5pbmNsdWRlcygnLS1lbmFibGUtbGlib3B1cycpLFxuICAgICAgICB2ZXJzaW9uOiBmZm1wZWcudmVyc2lvblxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29yZToge1xuICAgICAgICAnZGlzY29yZC1wbGF5ZXInOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oXG4gICAgICAgICAgJ2Rpc2NvcmQtcGxheWVyJ1xuICAgICAgICApIGFzIHN0cmluZyxcbiAgICAgICAgJ2Rpc2NvcmQtdm9pcCc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbihcbiAgICAgICAgICAnZGlzY29yZC12b2lwJ1xuICAgICAgICApIGFzIHN0cmluZ1xuICAgICAgfSxcbiAgICAgIGxpYm9wdXM6IHtcbiAgICAgICAgbWVkaWFwbGV4OiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ21lZGlhcGxleCcpLFxuICAgICAgICAnQGRpc2NvcmRqcy9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZGlzY29yZGpzL29wdXMnKSxcbiAgICAgICAgJ0BldmFuL29wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0BldmFuL29wdXMnKSxcbiAgICAgICAgb3B1c3NjcmlwdDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdvcHVzc2NyaXB0JyksXG4gICAgICAgICdub2RlLW9wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ25vZGUtb3B1cycpXG4gICAgICB9LFxuICAgICAgbGlic29kaXVtOiB7XG4gICAgICAgICdzb2RpdW0tbmF0aXZlJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tbmF0aXZlJyksXG4gICAgICAgIHNvZGl1bTogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0nKSxcbiAgICAgICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6XG4gICAgICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignbGlic29kaXVtLXdyYXBwZXJzJyksXG4gICAgICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKFxuICAgICAgICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1J1xuICAgICAgICApLFxuICAgICAgICAnc29kaXVtLWphdmFzY3JpcHQnOlxuICAgICAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ3NvZGl1bS1qYXZhc2NyaXB0JyksXG4gICAgICAgICdAbm9iZWwvY2lwaGVycyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQG5vYmVsL2NpcGhlcnMnKVxuICAgICAgfSxcbiAgICAgIGZmbXBlZzogZmZtcGVnUmVwb3J0XG4gICAgfTtcbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVwZW5kZW5jaWVzIHJlcG9ydC5cbiAgICogQHJldHVybnMgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKi9cbiAgZ2VuZXJhdGVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXBvcnQgPSBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlKCk7XG4gICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuXG4gICAgY29uc3Qgb3V0cHV0OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgb3V0cHV0LnB1c2goJ0RlcGVuZGVuY2llcyBSZXBvcnQnKTtcbiAgICBvdXRwdXQucHVzaChsaW5lKTtcblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZXBvcnQpIGFzIChrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnQpW107XG5cbiAgICBmb3IgKGNvbnN0IF9rZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qga2V5ID0gX2tleSBhcyBrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnQ7XG5cbiAgICAgIG91dHB1dC5wdXNoKGtleSk7XG5cbiAgICAgIGNvbnN0IHN1YktleXMgPSBPYmplY3Qua2V5cyhyZXBvcnRba2V5XSk7XG5cbiAgICAgIGZvciAoY29uc3QgX3N1YktleSBvZiBzdWJLZXlzKSB7XG4gICAgICAgIGNvbnN0IHN1YktleSA9IF9zdWJLZXkgYXMga2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0W3R5cGVvZiBrZXldO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlcG9ydFtrZXldW3N1YktleV0gPz8gJ04vQSc7XG5cbiAgICAgICAgb3V0cHV0LnB1c2goXG4gICAgICAgICAgYC0gJHtzdWJLZXl9OiAke1xuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMikgOiB2YWx1ZX1gXG5cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cblxuICAgIG91dHB1dC5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCdcXG4nKTtcbiAgfVxufTsiLCAiXG5cblxuXG5cblxuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSAvKiBAX19NQUNST19fIGdldFZlcnNpb24gKi9cIjcuMS4xLWRldi4wXCI7IiwgImltcG9ydCB7IFN0cmVhbVR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHR5cGUgeyBUcmFjayB9IGZyb20gJy4vZmFicmljJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi9QbGF5ZXInO1xuaW1wb3J0IHR5cGUgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG50eXBlIEF3YWl0YWJsZTxUPiA9IFQgfCBQcm9taXNlTGlrZTxUPjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFNob3VsZEludGVyY2VwdEZ1bmN0aW9uID0gPFQgPSBhbnk+KFxucXVldWU6IEd1aWxkUXVldWU8VD4sXG50cmFjazogVHJhY2ssXG5mb3JtYXQ6IFN0cmVhbVR5cGUsXG5zdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuPT4gQXdhaXRhYmxlPGJvb2xlYW4+O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgT25JbnRlcmNlcHRlZFN0cmVhbUhhbmRsZXIgPSA8VCA9IGFueT4oXG5xdWV1ZTogR3VpbGRRdWV1ZTxUPixcbnRyYWNrOiBUcmFjayxcbmZvcm1hdDogU3RyZWFtVHlwZSxcbnN0cmVhbTogSW50ZXJjZXB0ZWRTdHJlYW0pXG49PiBBd2FpdGFibGU8dm9pZD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU3RyZWFtSW50ZXJjZXB0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3RyZWFtIHNob3VsZCBiZSBpbnRlcmNlcHRlZC5cbiAgICovXG4gIHNob3VsZEludGVyY2VwdD86IFNob3VsZEludGVyY2VwdEZ1bmN0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyU3RyZWFtSW50ZXJjZXB0b3Ige1xuICAjb25TdHJlYW0gPSBuZXcgU2V0PE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFBsYXllclN0cmVhbUludGVyY2VwdG9yIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGludGVyY2VwdG9yIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyLFxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucylcbiAge31cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgaW50ZXJjZXB0ZWQgc3RyZWFtLlxuICAgKiBAcGFyYW0gcXVldWUgVGhlIGd1aWxkIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW50ZXJjZXB0ZWQgc3RyZWFtXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHN0cmVhbSB3YXMgaW50ZXJjZXB0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGU8VCA9IHVua25vd24+KFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxUPixcbiAgdHJhY2s6IFRyYWNrLFxuICB0eXBlOiBTdHJlYW1UeXBlLFxuICBzdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuICA6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMub3B0aW9ucy5zaG91bGRJbnRlcmNlcHQ7XG5cbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaWx0ZXIocXVldWUsIHRyYWNrLCB0eXBlLCBzdHJlYW0pO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNMaXN0ZW5lcnMgPSB0aGlzLiNvblN0cmVhbS5zaXplO1xuXG4gICAgaWYgKCFoYXNMaXN0ZW5lcnMpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLnRoaXMuI29uU3RyZWFtXS5tYXAoKGhhbmRsZXIpID0+IGhhbmRsZXIocXVldWUsIHRyYWNrLCB0eXBlLCBzdHJlYW0pKVxuICAgICk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGludGVyY2VwdGVkIHN0cmVhbSBsaXN0ZW5lci5cbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXJcbiAgICogQHJldHVybnMgQSBmdW5jdGlvbiB0byByZW1vdmUgdGhlIGxpc3RlbmVyXG4gICAqL1xuICBwdWJsaWMgb25TdHJlYW0oaGFuZGxlcjogT25JbnRlcmNlcHRlZFN0cmVhbUhhbmRsZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLiNvblN0cmVhbS5hZGQoaGFuZGxlcik7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy4jb25TdHJlYW0uZGVsZXRlKGhhbmRsZXIpO1xuICAgIH07XG4gIH1cbn0iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDR0EsaUJBQW1EOzs7QUNGbkQsc0JBQTJCOzs7QUNEM0IscUJBTUE7OztBQ05PLElBQU0sc0JBQU4sTUFBTSw0QkFBMkIsTUFBTTtBQUFBLEVBSXJDLFlBQVksTUFBa0IsU0FBaUI7QUFDcEQsVUFBTSxPQUFPO0FBSmYsd0JBQWdCO0FBQ2hCLHdCQUFn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M0IsYUFBTyxtQkFBSztBQUFBLElBQ2Q7QUFFQSx1QkFBSyxvQkFBcUIsSUFBSSx3QkFBd0IsTUFBTSxPQUFPO0FBRW5FLFdBQU8sbUJBQUs7QUFBQSxFQUNkO0FBQ0Y7QUFseUJFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTZDQTtBQW5ENEQ7QUFBQTtBQUFBO0FBQUE7QUFVNUQsY0FWVyxTQVVZLFdBQWtCO0FBVnBDLElBQU0sU0FBTjs7O0ExQ3BJUCxJQUFBSyxvQkFXQTtBQUNBLElBQUFDLHVCQVdBOyIsCiAgIm5hbWVzIjogWyJHdWlsZFF1ZXVlIiwgIlNlcmlhbGl6ZWRUeXBlIiwgInF1ZXJ5IiwgInZlcnNpb24iLCAibW9kdWxlIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAicmVzdWx0IiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3Byb21pc2VzIiwgImltcG9ydF9kaXNjb3JkIiwgInJlc29sdmUiLCAicmVzb2x2ZSIsICJ3YWl0Rm9yIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAiVHJhY2tTa2lwUmVhc29uIiwgInJlc29sdmUiLCAiR3VpbGRRdWV1ZSIsICJHdWlsZFF1ZXVlIiwgImltcG9ydF9wcm9taXNlcyIsICJ2ZXJzaW9uIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9mZm1wZWciLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfZmZtcGVnIiwgImRqc1ZlcnNpb24iLCAicXVlcnkiLCAicmVzIiwgInJlc3VsdCIsICJkVm9pY2VWZXJzaW9uIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCJdCn0K