discord-player 7.0.0-dev.1 → 7.0.0-dev.3

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
@@ -46,14 +46,6 @@ var __privateSet = (obj, member, value, setter) => {
46
46
  setter ? setter.call(obj, value) : member.set(obj, value);
47
47
  return value;
48
48
  };
49
- var __privateWrapper = (obj, member, setter, getter) => ({
50
- set _(value) {
51
- __privateSet(obj, member, value, setter);
52
- },
53
- get _() {
54
- return __privateGet(obj, member, getter);
55
- }
56
- });
57
49
  var __privateMethod = (obj, member, method) => {
58
50
  __accessCheck(obj, member, "access private method");
59
51
  return method;
@@ -89,8 +81,6 @@ __export(src_exports, {
89
81
  GuildQueueHistory: () => GuildQueueHistory,
90
82
  GuildQueuePlayerNode: () => GuildQueuePlayerNode,
91
83
  GuildQueueStatistics: () => GuildQueueStatistics,
92
- IPBlock: () => IPBlock,
93
- IPRotator: () => IPRotator,
94
84
  LrcLib: () => LrcLib,
95
85
  PCMAudioFilters: () => import_equalizer3.AudioFilters,
96
86
  Player: () => Player,
@@ -117,7 +107,6 @@ __export(src_exports, {
117
107
  createContext: () => createContext,
118
108
  createErisCompat: () => createErisCompat,
119
109
  createFFmpegStream: () => createFFmpegStream,
120
- createHook: () => createHook,
121
110
  decode: () => decode,
122
111
  deserialize: () => deserialize,
123
112
  encode: () => encode,
@@ -132,7 +121,6 @@ __export(src_exports, {
132
121
  useContext: () => useContext,
133
122
  useHistory: () => useHistory,
134
123
  useMainPlayer: () => useMainPlayer,
135
- useMasterPlayer: () => useMasterPlayer,
136
124
  useMetadata: () => useMetadata,
137
125
  usePlayer: () => usePlayer,
138
126
  useQueue: () => useQueue,
@@ -539,7 +527,7 @@ var _Track = class _Track {
539
527
  extractor: this.extractor?.identifier ?? null,
540
528
  metadata: this.metadata,
541
529
  $type: "track" /* Track */,
542
- $encoder_version: "7.0.0-dev.1"
530
+ $encoder_version: "7.0.0-dev.3"
543
531
  };
544
532
  }
545
533
  /**
@@ -662,7 +650,7 @@ var _Playlist = class _Playlist {
662
650
  id: this.id,
663
651
  url: this.url,
664
652
  $type: "playlist" /* Playlist */,
665
- $encoder_version: "7.0.0-dev.1"
653
+ $encoder_version: "7.0.0-dev.3"
666
654
  };
667
655
  }
668
656
  /**
@@ -1552,12 +1540,6 @@ var _BaseExtractor = class _BaseExtractor {
1552
1540
  debug(message) {
1553
1541
  return this.context.player.debug(message);
1554
1542
  }
1555
- /**
1556
- * IP rotator instance, if available
1557
- */
1558
- get routePlanner() {
1559
- return this.context.player.routePlanner;
1560
- }
1561
1543
  /**
1562
1544
  * A flag to indicate `Demuxable` stream support for `opus`/`ogg/opus`/`webm/opus` formats.
1563
1545
  */
@@ -1637,30 +1619,8 @@ __name(useContext, "useContext");
1637
1619
 
1638
1620
  // src/utils/__internal__/_container.ts
1639
1621
  var import_utils2 = require("@discord-player/utils");
1640
- var instances = new import_utils2.Collection();
1641
1622
  var globalRegistry = new import_utils2.Collection();
1642
1623
 
1643
- // src/utils/__internal__/addPlayer.ts
1644
- function addPlayer(player) {
1645
- if (instances.has(player.id))
1646
- return true;
1647
- instances.set(player.id, player);
1648
- return instances.has(player.id);
1649
- }
1650
- __name(addPlayer, "addPlayer");
1651
-
1652
- // src/utils/__internal__/clearPlayer.ts
1653
- function clearPlayer(player) {
1654
- return instances.delete(player.id);
1655
- }
1656
- __name(clearPlayer, "clearPlayer");
1657
-
1658
- // src/utils/__internal__/getPlayers.ts
1659
- function getPlayers() {
1660
- return instances.array();
1661
- }
1662
- __name(getPlayers, "getPlayers");
1663
-
1664
1624
  // src/utils/__internal__/getGlobalRegistry.ts
1665
1625
  function getGlobalRegistry() {
1666
1626
  return globalRegistry;
@@ -1668,39 +1628,38 @@ function getGlobalRegistry() {
1668
1628
  __name(getGlobalRegistry, "getGlobalRegistry");
1669
1629
 
1670
1630
  // src/hooks/common.ts
1671
- var preferredInstanceKey = "__discord_player_hook_instance_cache__";
1672
- var getPlayer = /* @__PURE__ */ __name(() => {
1673
- return instances.get(preferredInstanceKey) || instances.first() || null;
1674
- }, "getPlayer");
1675
- function useHooksContext(hookName) {
1676
- const player = getPlayer();
1631
+ var SUPER_CONTEXT = createContext();
1632
+ var getFallbackContext = /* @__PURE__ */ __name(() => {
1633
+ return getGlobalRegistry().get("@[player]");
1634
+ }, "getFallbackContext");
1635
+ function useHooksContext(hookName, mainOnly = false) {
1636
+ let isFallback = false;
1637
+ let player;
1638
+ if (!(player = SUPER_CONTEXT.consume())) {
1639
+ player = getFallbackContext();
1640
+ isFallback = true;
1641
+ }
1677
1642
  if (!player)
1678
- throw Exceptions.ERR_ILLEGAL_HOOK_INVOCATION("discord-player", "Player instance must be created before using hooks");
1643
+ throw Exceptions.ERR_ILLEGAL_HOOK_INVOCATION(
1644
+ "discord-player",
1645
+ "Player context is not available, is it being called inside <Player>.context.provide()?"
1646
+ );
1647
+ if (mainOnly)
1648
+ return { player, context: {}, isFallback };
1679
1649
  const context = useContext(player.context);
1680
1650
  if (!context)
1681
- throw Exceptions.ERR_ILLEGAL_HOOK_INVOCATION(hookName, `${hookName} must be called inside a player context created by <Player>.context.provide()`);
1682
- return context;
1651
+ throw Exceptions.ERR_ILLEGAL_HOOK_INVOCATION(
1652
+ hookName,
1653
+ `${hookName} must be called inside a player context created by <Player>.context.provide()`
1654
+ );
1655
+ return { context, player, isFallback };
1683
1656
  }
1684
1657
  __name(useHooksContext, "useHooksContext");
1685
- var getQueue = /* @__PURE__ */ __name((node) => {
1686
- const player = getPlayer();
1687
- if (!player)
1688
- return null;
1689
- return player.nodes.resolve(node) || null;
1690
- }, "getQueue");
1691
- function createHook(hook) {
1692
- return hook({
1693
- getQueue,
1694
- getPlayer,
1695
- instances
1696
- });
1697
- }
1698
- __name(createHook, "createHook");
1699
1658
 
1700
1659
  // src/hooks/useHistory.ts
1701
1660
  function useHistory(node) {
1702
- const _node = node ?? useHooksContext("useHistory").guild;
1703
- const queue = getQueue(_node);
1661
+ const { context, player } = useHooksContext("useHistory");
1662
+ const queue = player.queues.get(node ?? context.guild.id);
1704
1663
  if (!queue)
1705
1664
  return null;
1706
1665
  return queue.history;
@@ -1709,8 +1668,8 @@ __name(useHistory, "useHistory");
1709
1668
 
1710
1669
  // src/hooks/usePlayer.ts
1711
1670
  function usePlayer(node) {
1712
- const _node = node ?? useHooksContext("usePlayer").guild;
1713
- const queue = getQueue(_node);
1671
+ const { context, player } = useHooksContext("usePlayer");
1672
+ const queue = player.queues.get(node ?? context.guild.id);
1714
1673
  if (!queue)
1715
1674
  return null;
1716
1675
  return queue.node;
@@ -1719,8 +1678,8 @@ __name(usePlayer, "usePlayer");
1719
1678
 
1720
1679
  // src/hooks/useQueue.ts
1721
1680
  function useQueue(node) {
1722
- const _node = node ?? useHooksContext("useQueue").guild;
1723
- const queue = getQueue(_node);
1681
+ const { context, player } = useHooksContext("useQueue");
1682
+ const queue = player.queues.resolve(node ?? context.guild.id);
1724
1683
  if (!queue)
1725
1684
  return null;
1726
1685
  return queue;
@@ -1728,24 +1687,16 @@ function useQueue(node) {
1728
1687
  __name(useQueue, "useQueue");
1729
1688
 
1730
1689
  // src/hooks/useMainPlayer.ts
1731
- function useMasterPlayer() {
1732
- Util.warn("useMasterPlayer() hook is deprecated, use useMainPlayer() instead.", "DeprecationWarning");
1733
- return useMainPlayer();
1734
- }
1735
- __name(useMasterPlayer, "useMasterPlayer");
1736
1690
  function useMainPlayer() {
1737
- const instance = getPlayer();
1738
- if (!instance) {
1739
- throw Exceptions.ERR_ILLEGAL_HOOK_INVOCATION("useMainPlayer", 'This is likely caused by calling "useMainPlayer" hook before creating a player instance.');
1740
- }
1741
- return instance;
1691
+ const { player } = useHooksContext("useMainPlayer", true);
1692
+ return player;
1742
1693
  }
1743
1694
  __name(useMainPlayer, "useMainPlayer");
1744
1695
 
1745
1696
  // src/hooks/useMetadata.ts
1746
1697
  function useMetadata(node) {
1747
- const _node = node ?? useHooksContext("useMetadata").guild;
1748
- const queue = getQueue(_node);
1698
+ const { context, player } = useHooksContext("useMetadata");
1699
+ const queue = player.queues.get(node ?? context.guild.id);
1749
1700
  const setter = /* @__PURE__ */ __name((metadata) => {
1750
1701
  if (queue) {
1751
1702
  if (TypeUtil.isFunction(metadata))
@@ -1761,12 +1712,12 @@ function useMetadata(node) {
1761
1712
  __name(useMetadata, "useMetadata");
1762
1713
 
1763
1714
  // src/hooks/useTimeline.ts
1764
- function useTimeline(node, options) {
1765
- const _node = node ?? useHooksContext("useTimeline").guild;
1766
- const queue = getQueue(_node);
1715
+ function useTimeline(options) {
1716
+ const { context, player } = useHooksContext("useTimeline");
1717
+ const queue = player.queues.get(options?.node ?? context.guild.id);
1767
1718
  if (!queue)
1768
1719
  return null;
1769
- return Object.preventExtensions({
1720
+ const timeline = Object.preventExtensions({
1770
1721
  get timestamp() {
1771
1722
  return queue.node.getTimestamp(options?.ignoreFilters);
1772
1723
  },
@@ -1792,6 +1743,7 @@ function useTimeline(node, options) {
1792
1743
  return queue.node.seek(time);
1793
1744
  }
1794
1745
  });
1746
+ return timeline;
1795
1747
  }
1796
1748
  __name(useTimeline, "useTimeline");
1797
1749
 
@@ -1809,8 +1761,8 @@ __name(onBeforeCreateStream, "onBeforeCreateStream");
1809
1761
 
1810
1762
  // src/hooks/useVolume.ts
1811
1763
  function useVolume(node) {
1812
- const _node = node ?? useHooksContext("useVolume").guild;
1813
- const queue = getQueue(_node);
1764
+ const { context, player } = useHooksContext("useVolume");
1765
+ const queue = player.queues.get(node ?? context.guild.id);
1814
1766
  const setter = /* @__PURE__ */ __name((volume) => {
1815
1767
  if (queue) {
1816
1768
  if (TypeUtil.isFunction(volume))
@@ -1826,16 +1778,6 @@ function useVolume(node) {
1826
1778
  __name(useVolume, "useVolume");
1827
1779
 
1828
1780
  // src/extractors/ExtractorExecutionContext.ts
1829
- var knownExtractorKeys = [
1830
- "SpotifyExtractor",
1831
- "AppleMusicExtractor",
1832
- "SoundCloudExtractor",
1833
- "YouTubeExtractor",
1834
- "VimeoExtractor",
1835
- "ReverbnationExtractor",
1836
- "AttachmentExtractor"
1837
- ];
1838
- var knownExtractorLib = "@discord-player/extractor";
1839
1781
  var _ExtractorExecutionContext = class _ExtractorExecutionContext extends PlayerEventsEmitter {
1840
1782
  constructor(player) {
1841
1783
  super(["error"]);
@@ -1858,17 +1800,23 @@ var _ExtractorExecutionContext = class _ExtractorExecutionContext extends Player
1858
1800
  getContext() {
1859
1801
  return this.context.consume() ?? null;
1860
1802
  }
1803
+ async loadDefault() {
1804
+ const sample = `import { DefaultExtractors } from '@discord-player/extractor';
1805
+ await player.extractors.loadMulti(DefaultExtractors);`;
1806
+ throw new Error(
1807
+ `extractors.loadDefault is no longer supported. Use extractors.loadMulti instead. Example:
1808
+ ${sample}`
1809
+ );
1810
+ }
1861
1811
  /**
1862
- * Load default extractors from `@discord-player/extractor`
1812
+ * Load a bundle of extractors.
1813
+ * @example import { DefaultExtractors } from '@discord-player/extractor';
1814
+ *
1815
+ * await player.extractors.loadMulti(DefaultExtractors);
1863
1816
  */
1864
- async loadDefault(filter, options) {
1865
- const mod = await Util.import(knownExtractorLib);
1866
- if (mod.error)
1867
- return { success: false, error: mod.error };
1868
- (filter ? knownExtractorKeys.filter(filter) : knownExtractorKeys).forEach((key) => {
1869
- if (!mod.module[key])
1870
- return;
1871
- this.register(mod.module[key], options?.[key] || {});
1817
+ async loadMulti(bundle, options = {}) {
1818
+ bundle.forEach((ext) => {
1819
+ this.register(ext, options?.[ext.identifier] || {});
1872
1820
  });
1873
1821
  return { success: true, error: null };
1874
1822
  }
@@ -2021,7 +1969,10 @@ var _ExtractorExecutionContext = class _ExtractorExecutionContext extends Player
2021
1969
  return result2;
2022
1970
  });
2023
1971
  if (!result?.result)
2024
- throw Exceptions.ERR_BRIDGE_FAILED(this.getExecutionId(), result?.error?.stack || result?.error?.message || "No extractors available to bridge");
1972
+ throw Exceptions.ERR_BRIDGE_FAILED(
1973
+ this.getExecutionId(),
1974
+ result?.error?.stack || result?.error?.message || "No extractors available to bridge"
1975
+ );
2025
1976
  track.bridgedExtractor = result.extractor;
2026
1977
  return result;
2027
1978
  }
@@ -2119,7 +2070,11 @@ var _StreamDispatcher = class _StreamDispatcher extends import_utils4.EventEmitt
2119
2070
  }
2120
2071
  if (newState.reason === import_discord_voip.VoiceConnectionDisconnectReason.WebSocketClose && newState.closeCode === 4014) {
2121
2072
  try {
2122
- await (0, import_discord_voip.entersState)(this.voiceConnection, import_discord_voip.VoiceConnectionStatus.Connecting, this.connectionTimeout);
2073
+ await (0, import_discord_voip.entersState)(
2074
+ this.voiceConnection,
2075
+ import_discord_voip.VoiceConnectionStatus.Connecting,
2076
+ this.connectionTimeout
2077
+ );
2123
2078
  } catch {
2124
2079
  try {
2125
2080
  if (this.voiceConnection.state.status !== import_discord_voip.VoiceConnectionStatus.Destroyed)
@@ -2621,7 +2576,10 @@ var _QueryResolver = class _QueryResolver {
2621
2576
  const videoId = url.searchParams.get("v");
2622
2577
  if (playlistId) {
2623
2578
  if (videoId && playlistId.startsWith("RD"))
2624
- return resolver(QueryType.YOUTUBE_PLAYLIST, `https://www.youtube.com/watch?v=${videoId}&list=${playlistId}`);
2579
+ return resolver(
2580
+ QueryType.YOUTUBE_PLAYLIST,
2581
+ `https://www.youtube.com/watch?v=${videoId}&list=${playlistId}`
2582
+ );
2625
2583
  return resolver(QueryType.YOUTUBE_PLAYLIST, `https://www.youtube.com/playlist?list=${playlistId}`);
2626
2584
  }
2627
2585
  if (_QueryResolver.validateId(query) || _QueryResolver.validateURL(query))
@@ -2952,9 +2910,21 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
2952
2910
  const timestamp = this.getTimestamp();
2953
2911
  if (!timestamp)
2954
2912
  return null;
2955
- const { indicator = "\u{1F518}", leftChar = "\u25AC", rightChar = "\u25AC", length = 15, timecodes = true, separator = "\u2503" } = options || {};
2913
+ const {
2914
+ indicator = "\u{1F518}",
2915
+ leftChar = "\u25AC",
2916
+ rightChar = "\u25AC",
2917
+ length = 15,
2918
+ timecodes = true,
2919
+ separator = "\u2503"
2920
+ } = options || {};
2956
2921
  if (isNaN(length) || length < 0 || !Number.isFinite(length)) {
2957
- throw Exceptions.ERR_OUT_OF_RANGE("[PlayerProgressBarOptions.length]", String(length), "0", "Finite Number");
2922
+ throw Exceptions.ERR_OUT_OF_RANGE(
2923
+ "[PlayerProgressBarOptions.length]",
2924
+ String(length),
2925
+ "0",
2926
+ "Finite Number"
2927
+ );
2958
2928
  }
2959
2929
  const index = Math.round(timestamp.current.value / timestamp.total.value * length);
2960
2930
  if (index >= 1 && index <= length) {
@@ -2968,7 +2938,9 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
2968
2938
  }
2969
2939
  } else {
2970
2940
  if (timecodes) {
2971
- return `${timestamp.current.label} ${separator} ${indicator}${rightChar.repeat(length - 1)} ${separator} ${timestamp.total.label}`;
2941
+ return `${timestamp.current.label} ${separator} ${indicator}${rightChar.repeat(
2942
+ length - 1
2943
+ )} ${separator} ${timestamp.total.label}`;
2972
2944
  } else {
2973
2945
  return `${indicator}${rightChar.repeat(length - 1)}`;
2974
2946
  }
@@ -2986,7 +2958,12 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
2986
2958
  if (duration > this.totalDuration) {
2987
2959
  return this.skip({
2988
2960
  reason: "SEEK_OVER_THRESHOLD" /* SEEK_OVER_THRESHOLD */,
2989
- description: Exceptions.ERR_OUT_OF_RANGE("[duration]", String(duration), "0", String(this.totalDuration)).message
2961
+ description: Exceptions.ERR_OUT_OF_RANGE(
2962
+ "[duration]",
2963
+ String(duration),
2964
+ "0",
2965
+ String(this.totalDuration)
2966
+ ).message
2990
2967
  });
2991
2968
  }
2992
2969
  if (duration < 0)
@@ -3016,7 +2993,9 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3016
2993
  * @param rate The bit rate to set
3017
2994
  */
3018
2995
  setBitrate(rate) {
3019
- this.queue.dispatcher?.audioResource?.encoder?.setBitrate(rate === "auto" ? this.queue.channel?.bitrate ?? 64e3 : rate);
2996
+ this.queue.dispatcher?.audioResource?.encoder?.setBitrate(
2997
+ rate === "auto" ? this.queue.channel?.bitrate ?? 64e3 : rate
2998
+ );
3020
2999
  }
3021
3000
  /**
3022
3001
  * Set paused state
@@ -3231,7 +3210,9 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3231
3210
  );
3232
3211
  if (res && options.queue) {
3233
3212
  if (this.queue.hasDebugger)
3234
- this.queue.debug("Requested option requires to queue the track, adding the given track to queue instead...");
3213
+ this.queue.debug(
3214
+ "Requested option requires to queue the track, adding the given track to queue instead..."
3215
+ );
3235
3216
  return this.queue.addTrack(res);
3236
3217
  }
3237
3218
  const track = res || this.queue.tracks.dispatch();
@@ -3295,7 +3276,6 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3295
3276
  } else {
3296
3277
  __privateSet(this, _progress, 0);
3297
3278
  }
3298
- const cookies = track.raw?.source === "youtube" ? this.queue.player.options.ytdlOptions?.requestOptions?.headers?.cookie : void 0;
3299
3279
  const trackStreamConfig = {
3300
3280
  dispatcherConfig: {
3301
3281
  disableBiquad: this.queue.options.disableBiquad,
@@ -3316,7 +3296,13 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3316
3296
  };
3317
3297
  let resolver = Util.noop;
3318
3298
  const donePromise = new Promise((resolve2) => resolver = resolve2);
3319
- const success = this.queue.emit(GuildQueueEvent.willPlayTrack, this.queue, track, trackStreamConfig, resolver);
3299
+ const success = this.queue.emit(
3300
+ GuildQueueEvent.willPlayTrack,
3301
+ this.queue,
3302
+ track,
3303
+ trackStreamConfig,
3304
+ resolver
3305
+ );
3320
3306
  if (!success)
3321
3307
  resolver();
3322
3308
  if (this.queue.hasDebugger)
@@ -3337,7 +3323,9 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3337
3323
  const { $fmt, stream } = streamSrc.stream;
3338
3324
  const shouldPCM = !daspDisabled;
3339
3325
  if (this.queue.hasDebugger)
3340
- this.queue.debug(`skipFFmpeg is set to true and stream is demuxable, creating stream with type ${shouldPCM ? "pcm" : "opus"}`);
3326
+ this.queue.debug(
3327
+ `skipFFmpeg is set to true and stream is demuxable, creating stream with type ${shouldPCM ? "pcm" : "opus"}`
3328
+ );
3341
3329
  const opusStream = $fmt === import_discord_voip2.StreamType.Opus ? stream : $fmt === import_discord_voip2.StreamType.OggOpus ? (
3342
3330
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
3343
3331
  stream.pipe(new import_opus.OggDemuxer())
@@ -3359,12 +3347,14 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3359
3347
  trackStreamConfig.dispatcherConfig.type = import_discord_voip2.StreamType.Opus;
3360
3348
  }
3361
3349
  } else {
3362
- finalStream = __privateMethod(this, _createFFmpegStream, createFFmpegStream_fn).call(this, streamSrc.stream instanceof import_stream.Readable || typeof streamSrc.stream === "string" ? streamSrc.stream : streamSrc.stream.stream, track, options.seek ?? 0, cookies);
3350
+ finalStream = __privateMethod(this, _createFFmpegStream, createFFmpegStream_fn).call(this, streamSrc.stream instanceof import_stream.Readable || typeof streamSrc.stream === "string" ? streamSrc.stream : streamSrc.stream.stream, track, options.seek ?? 0);
3363
3351
  trackStreamConfig.dispatcherConfig.type = import_discord_voip2.StreamType.Raw;
3364
3352
  }
3365
3353
  if (options.transitionMode) {
3366
3354
  if (this.queue.hasDebugger)
3367
- this.queue.debug(`Transition mode detected, player will wait for buffering timeout to expire (Timeout: ${this.queue.options.bufferingTimeout}ms)`);
3355
+ this.queue.debug(
3356
+ `Transition mode detected, player will wait for buffering timeout to expire (Timeout: ${this.queue.options.bufferingTimeout}ms)`
3357
+ );
3368
3358
  await (0, import_promises2.setTimeout)(this.queue.options.bufferingTimeout);
3369
3359
  if (this.queue.hasDebugger)
3370
3360
  this.queue.debug("Buffering timeout has expired!");
@@ -3374,7 +3364,9 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3374
3364
  const dispatcher = this.queue.dispatcher;
3375
3365
  if (!dispatcher) {
3376
3366
  if (this.queue.hasDebugger) {
3377
- this.queue.debug("Dispatcher is not available, this is most likely due to the queue being deleted in the middle of operation. Cancelling the stream...");
3367
+ this.queue.debug(
3368
+ "Dispatcher is not available, this is most likely due to the queue being deleted in the middle of operation. Cancelling the stream..."
3369
+ );
3378
3370
  }
3379
3371
  finalStream.destroy();
3380
3372
  } else {
@@ -3396,18 +3388,31 @@ throw_fn = /* @__PURE__ */ __name(function(track, error) {
3396
3388
  const streamDefinitelyFailedMyDearT_TPleaseTrustMeItsNotMyFault = Exceptions.ERR_NO_RESULT(`Could not extract stream for this track${error ? `
3397
3389
 
3398
3390
  ${error.stack || error}` : ""}`);
3399
- this.queue.emit(GuildQueueEvent.playerSkip, this.queue, track, "ERR_NO_STREAM" /* NoStream */, streamDefinitelyFailedMyDearT_TPleaseTrustMeItsNotMyFault.message);
3400
- this.queue.emit(GuildQueueEvent.playerError, this.queue, streamDefinitelyFailedMyDearT_TPleaseTrustMeItsNotMyFault, track);
3391
+ this.queue.emit(
3392
+ GuildQueueEvent.playerSkip,
3393
+ this.queue,
3394
+ track,
3395
+ "ERR_NO_STREAM" /* NoStream */,
3396
+ streamDefinitelyFailedMyDearT_TPleaseTrustMeItsNotMyFault.message
3397
+ );
3398
+ this.queue.emit(
3399
+ GuildQueueEvent.playerError,
3400
+ this.queue,
3401
+ streamDefinitelyFailedMyDearT_TPleaseTrustMeItsNotMyFault,
3402
+ track
3403
+ );
3401
3404
  const nextTrack = this.queue.tracks.dispatch();
3402
3405
  if (nextTrack)
3403
- this.play(nextTrack, { queue: false });
3404
- return;
3406
+ return void this.play(nextTrack, { queue: false });
3407
+ this.queue.dispatcher?.emit("finish", null);
3405
3408
  }, "#throw");
3406
3409
  _performPlay = new WeakSet();
3407
3410
  performPlay_fn = /* @__PURE__ */ __name(async function(resource) {
3408
3411
  if (!this.queue.dispatcher) {
3409
3412
  if (this.queue.hasDebugger) {
3410
- this.queue.debug("Dispatcher is not available, this is most likely due to the queue being deleted in the middle of operation. Cancelling the stream...");
3413
+ this.queue.debug(
3414
+ "Dispatcher is not available, this is most likely due to the queue being deleted in the middle of operation. Cancelling the stream..."
3415
+ );
3411
3416
  }
3412
3417
  } else {
3413
3418
  if (this.queue.hasDebugger)
@@ -3420,7 +3425,9 @@ performPlay_fn = /* @__PURE__ */ __name(async function(resource) {
3420
3425
  _createGenericStream = new WeakSet();
3421
3426
  createGenericStream_fn = /* @__PURE__ */ __name(async function(track) {
3422
3427
  if (this.queue.hasDebugger)
3423
- this.queue.debug(`Attempting to extract stream for Track { title: ${track.title}, url: ${track.url} } using registered extractors`);
3428
+ this.queue.debug(
3429
+ `Attempting to extract stream for Track { title: ${track.title}, url: ${track.url} } using registered extractors`
3430
+ );
3424
3431
  const attemptedExtractors = this.queue.player.extractors.getContext()?.attemptedExtractors || /* @__PURE__ */ new Set();
3425
3432
  const streamInfo = await this.queue.player.extractors.run(async (extractor) => {
3426
3433
  if (this.queue.player.options.blockStreamFrom?.some((ext) => ext === extractor.identifier))
@@ -3428,14 +3435,19 @@ createGenericStream_fn = /* @__PURE__ */ __name(async function(track) {
3428
3435
  if (attemptedExtractors.has(extractor.identifier))
3429
3436
  return false;
3430
3437
  attemptedExtractors.add(extractor.identifier);
3431
- const canStream = await extractor.validate(track.url, track.queryType || QueryResolver.resolve(track.url).type);
3438
+ const canStream = await extractor.validate(
3439
+ track.url,
3440
+ track.queryType || QueryResolver.resolve(track.url).type
3441
+ );
3432
3442
  if (!canStream)
3433
3443
  return false;
3434
3444
  return await extractor.stream(track);
3435
3445
  }, false);
3436
3446
  if (!streamInfo || !streamInfo.result) {
3437
3447
  if (this.queue.hasDebugger) {
3438
- this.queue.debug(`Failed to extract stream for Track { title: ${track.title}, url: ${track.url} } using registered extractors`);
3448
+ this.queue.debug(
3449
+ `Failed to extract stream for Track { title: ${track.title}, url: ${track.url} } using registered extractors`
3450
+ );
3439
3451
  }
3440
3452
  if (!this.queue.options.disableFallbackStream) {
3441
3453
  if (this.queue.hasDebugger)
@@ -3445,13 +3457,17 @@ createGenericStream_fn = /* @__PURE__ */ __name(async function(track) {
3445
3457
  return streamInfo || null;
3446
3458
  }
3447
3459
  if (this.queue.hasDebugger)
3448
- this.queue.debug(`Stream extraction was successful for Track { title: ${track.title}, url: ${track.url} } (Extractor: ${streamInfo.extractor?.identifier || "N/A"})`);
3460
+ this.queue.debug(
3461
+ `Stream extraction was successful for Track { title: ${track.title}, url: ${track.url} } (Extractor: ${streamInfo.extractor?.identifier || "N/A"})`
3462
+ );
3449
3463
  return streamInfo;
3450
3464
  }, "#createGenericStream");
3451
3465
  _createFallbackStream = new WeakSet();
3452
3466
  createFallbackStream_fn = /* @__PURE__ */ __name(async function(track) {
3453
3467
  if (this.queue.hasDebugger)
3454
- this.queue.debug(`Attempting to extract stream for Track { title: ${track.title}, url: ${track.url} } using fallback streaming method...`);
3468
+ this.queue.debug(
3469
+ `Attempting to extract stream for Track { title: ${track.title}, url: ${track.url} } using fallback streaming method...`
3470
+ );
3455
3471
  const fallbackStream = await this.queue.player.extractors.run(async (extractor) => {
3456
3472
  if (extractor.identifier === track.extractor?.identifier)
3457
3473
  return false;
@@ -3472,24 +3488,27 @@ createFallbackStream_fn = /* @__PURE__ */ __name(async function(track) {
3472
3488
  }, true);
3473
3489
  if (!fallbackStream || !fallbackStream.result) {
3474
3490
  if (this.queue.hasDebugger)
3475
- this.queue.debug(`Failed to extract stream for Track { title: ${track.title}, url: ${track.url} } using fallback streaming method`);
3491
+ this.queue.debug(
3492
+ `Failed to extract stream for Track { title: ${track.title}, url: ${track.url} } using fallback streaming method`
3493
+ );
3476
3494
  return fallbackStream || null;
3477
3495
  }
3478
3496
  track.bridgedExtractor = fallbackStream.extractor;
3479
3497
  return fallbackStream;
3480
3498
  }, "#createFallbackStream");
3481
3499
  _createFFmpegStream = new WeakSet();
3482
- createFFmpegStream_fn = /* @__PURE__ */ __name(function(stream, track, seek = 0, cookies, opus) {
3500
+ createFFmpegStream_fn = /* @__PURE__ */ __name(function(stream, track, seek = 0, opus) {
3483
3501
  const ffmpegStream = this.queue.filters.ffmpeg.createStream(stream, {
3484
3502
  encoderArgs: this.queue.filters.ffmpeg.args,
3485
3503
  seek: seek / 1e3,
3486
3504
  fmt: opus ? "opus" : "s16le",
3487
- cookies,
3488
3505
  useLegacyFFmpeg: !!this.queue.player.options.useLegacyFFmpeg
3489
3506
  }).on("error", (err) => {
3490
3507
  const m = `${err}`.toLowerCase();
3491
3508
  if (this.queue.hasDebugger)
3492
- this.queue.debug(`Stream closed due to an error from FFmpeg stream: ${err.stack || err.message || err}`);
3509
+ this.queue.debug(
3510
+ `Stream closed due to an error from FFmpeg stream: ${err.stack || err.message || err}`
3511
+ );
3493
3512
  if (m.includes("premature close") || m.includes("epipe"))
3494
3513
  return;
3495
3514
  this.queue.emit(GuildQueueEvent.playerError, this.queue, err, track);
@@ -3577,7 +3596,18 @@ var makeBands = /* @__PURE__ */ __name((arr) => {
3577
3596
  }, "makeBands");
3578
3597
  var EqualizerConfigurationPreset = Object.freeze({
3579
3598
  Flat: makeBands([]),
3580
- Classical: makeBands([-111022e-20, -111022e-20, -111022e-20, -111022e-20, -111022e-20, -111022e-20, -7.2, -7.2, -7.2, -9.6]),
3599
+ Classical: makeBands([
3600
+ -111022e-20,
3601
+ -111022e-20,
3602
+ -111022e-20,
3603
+ -111022e-20,
3604
+ -111022e-20,
3605
+ -111022e-20,
3606
+ -7.2,
3607
+ -7.2,
3608
+ -7.2,
3609
+ -9.6
3610
+ ]),
3581
3611
  Club: makeBands([-111022e-20, -111022e-20, 8, 5.6, 5.6, 5.6, 3.2, -111022e-20, -111022e-20, -111022e-20]),
3582
3612
  Dance: makeBands([9.6, 7.2, 2.4, -111022e-20, -111022e-20, -5.6, -7.2, -7.2, -111022e-20, -111022e-20]),
3583
3613
  FullBass: makeBands([-8, 9.6, 9.6, 5.6, 1.6, -4, -8, -10.4, -11.2, -11.2]),
@@ -3586,9 +3616,31 @@ var EqualizerConfigurationPreset = Object.freeze({
3586
3616
  Headphones: makeBands([4.8, 11.2, 5.6, -3.2, -2.4, 1.6, 4.8, 9.6, 12.8, 14.4]),
3587
3617
  LargeHall: makeBands([10.4, 10.4, 5.6, 5.6, -111022e-20, -4.8, -4.8, -4.8, -111022e-20, -111022e-20]),
3588
3618
  Live: makeBands([-4.8, -111022e-20, 4, 5.6, 5.6, 5.6, 4, 2.4, 2.4, 2.4]),
3589
- Party: makeBands([7.2, 7.2, -111022e-20, -111022e-20, -111022e-20, -111022e-20, -111022e-20, -111022e-20, 7.2, 7.2]),
3619
+ Party: makeBands([
3620
+ 7.2,
3621
+ 7.2,
3622
+ -111022e-20,
3623
+ -111022e-20,
3624
+ -111022e-20,
3625
+ -111022e-20,
3626
+ -111022e-20,
3627
+ -111022e-20,
3628
+ 7.2,
3629
+ 7.2
3630
+ ]),
3590
3631
  Pop: makeBands([-1.6, 4.8, 7.2, 8, 5.6, -111022e-20, -2.4, -2.4, -1.6, -1.6]),
3591
- Reggae: makeBands([-111022e-20, -111022e-20, -111022e-20, -5.6, -111022e-20, 6.4, 6.4, -111022e-20, -111022e-20, -111022e-20]),
3632
+ Reggae: makeBands([
3633
+ -111022e-20,
3634
+ -111022e-20,
3635
+ -111022e-20,
3636
+ -5.6,
3637
+ -111022e-20,
3638
+ 6.4,
3639
+ 6.4,
3640
+ -111022e-20,
3641
+ -111022e-20,
3642
+ -111022e-20
3643
+ ]),
3592
3644
  Rock: makeBands([8, 4.8, -5.6, -8, -3.2, 4, 8.8, 11.2, 11.2, 11.2]),
3593
3645
  Ska: makeBands([-2.4, -4.8, -4, -111022e-20, 4, 5.6, 8.8, 9.6, 11.2, 9.6]),
3594
3646
  Soft: makeBands([4.8, 1.6, -111022e-20, -2.4, -111022e-20, 4, 8, 9.6, 11.2, 12]),
@@ -3917,7 +3969,7 @@ var _GuildQueueStatistics = class _GuildQueueStatistics {
3917
3969
  memoryUsage: process.memoryUsage(),
3918
3970
  versions: {
3919
3971
  node: process.version,
3920
- player: "7.0.0-dev.1"
3972
+ player: "7.0.0-dev.3"
3921
3973
  }
3922
3974
  };
3923
3975
  }
@@ -4284,7 +4336,11 @@ var _GuildQueue = class _GuildQueue {
4284
4336
  throw Exceptions.ERR_INVALID_ARG_TYPE("[GuildNodeInit.maxSize]", "number", typeof options.maxSize);
4285
4337
  }
4286
4338
  if (!TypeUtil.isNumber(options.maxHistorySize)) {
4287
- throw Exceptions.ERR_INVALID_ARG_TYPE("[GuildNodeInit.maxHistorySize]", "number", typeof options.maxHistorySize);
4339
+ throw Exceptions.ERR_INVALID_ARG_TYPE(
4340
+ "[GuildNodeInit.maxHistorySize]",
4341
+ "number",
4342
+ typeof options.maxHistorySize
4343
+ );
4288
4344
  }
4289
4345
  if (options.maxSize < 1)
4290
4346
  options.maxSize = Infinity;
@@ -4571,13 +4627,23 @@ var _GuildQueue = class _GuildQueue {
4571
4627
  if (!channel)
4572
4628
  throw Exceptions.ERR_NO_VOICE_CHANNEL();
4573
4629
  if (!channel.isVoiceBased())
4574
- throw Exceptions.ERR_INVALID_ARG_TYPE("channel", `VoiceBasedChannel (type ${import_discord3.ChannelType.GuildVoice}/${import_discord3.ChannelType.GuildStageVoice})`, String(channel?.type));
4630
+ throw Exceptions.ERR_INVALID_ARG_TYPE(
4631
+ "channel",
4632
+ `VoiceBasedChannel (type ${import_discord3.ChannelType.GuildVoice}/${import_discord3.ChannelType.GuildStageVoice})`,
4633
+ String(channel?.type)
4634
+ );
4575
4635
  if (this.dispatcher) {
4576
4636
  __privateMethod(this, _removeListeners, removeListeners_fn).call(this, this.dispatcher);
4577
4637
  this.dispatcher.destroy();
4578
4638
  this.dispatcher = null;
4579
4639
  }
4580
- this.dispatcher = new StreamDispatcher(connection, channel, this, options.timeout ?? this.options.connectionTimeout, options.audioPlayer);
4640
+ this.dispatcher = new StreamDispatcher(
4641
+ connection,
4642
+ channel,
4643
+ this,
4644
+ options.timeout ?? this.options.connectionTimeout,
4645
+ options.audioPlayer
4646
+ );
4581
4647
  }
4582
4648
  /**
4583
4649
  * Connect to a voice channel
@@ -4587,10 +4653,16 @@ var _GuildQueue = class _GuildQueue {
4587
4653
  async connect(channelResolvable, options = {}) {
4588
4654
  const channel = this.player.client.channels.resolve(channelResolvable);
4589
4655
  if (!channel || !channel.isVoiceBased()) {
4590
- throw Exceptions.ERR_INVALID_ARG_TYPE("channel", `VoiceBasedChannel (type ${import_discord3.ChannelType.GuildVoice}/${import_discord3.ChannelType.GuildStageVoice})`, String(channel?.type));
4656
+ throw Exceptions.ERR_INVALID_ARG_TYPE(
4657
+ "channel",
4658
+ `VoiceBasedChannel (type ${import_discord3.ChannelType.GuildVoice}/${import_discord3.ChannelType.GuildStageVoice})`,
4659
+ String(channel?.type)
4660
+ );
4591
4661
  }
4592
4662
  if (this.hasDebugger)
4593
- this.debug(`Connecting to ${channel.type === import_discord3.ChannelType.GuildStageVoice ? "stage" : "voice"} channel ${channel.name} (ID: ${channel.id})`);
4663
+ this.debug(
4664
+ `Connecting to ${channel.type === import_discord3.ChannelType.GuildStageVoice ? "stage" : "voice"} channel ${channel.name} (ID: ${channel.id})`
4665
+ );
4594
4666
  if (this.dispatcher && channel.id !== this.dispatcher.channel.id) {
4595
4667
  if (this.hasDebugger)
4596
4668
  this.debug("Destroying old connection");
@@ -4805,19 +4877,23 @@ performFinish_fn = /* @__PURE__ */ __name(function(resource) {
4805
4877
  isTransitionMode: this.isTransitioning()
4806
4878
  })} was marked as finished`
4807
4879
  );
4808
- if (track && !this.isTransitioning()) {
4880
+ if (!this.isTransitioning()) {
4809
4881
  this.syncedLyricsProvider.unsubscribe();
4810
4882
  this.syncedLyricsProvider.lyrics.clear();
4811
4883
  if (this.hasDebugger)
4812
4884
  this.debug("Adding track to history and emitting finish event since transition mode is disabled...");
4813
- this.history.push(track);
4814
- this.node.resetProgress();
4815
- this.emit(GuildQueueEvent.playerFinish, this, track);
4885
+ if (track) {
4886
+ this.history.push(track);
4887
+ this.node.resetProgress();
4888
+ this.emit(GuildQueueEvent.playerFinish, this, track);
4889
+ }
4816
4890
  if (__privateGet(this, _deleted))
4817
4891
  return __privateMethod(this, _emitEnd, emitEnd_fn).call(this);
4818
4892
  if (this.tracks.size < 1 && this.repeatMode === 0 /* OFF */) {
4819
4893
  if (this.hasDebugger)
4820
- this.debug("No more tracks left in the queue to play and repeat mode is off, initiating #emitEnd()");
4894
+ this.debug(
4895
+ "No more tracks left in the queue to play and repeat mode is off, initiating #emitEnd()"
4896
+ );
4821
4897
  __privateMethod(this, _emitEnd, emitEnd_fn).call(this);
4822
4898
  } else {
4823
4899
  if (this.repeatMode === 1 /* TRACK */) {
@@ -4828,10 +4904,14 @@ performFinish_fn = /* @__PURE__ */ __name(function(resource) {
4828
4904
  }
4829
4905
  if (this.repeatMode === 2 /* QUEUE */) {
4830
4906
  if (this.hasDebugger)
4831
- this.debug("Repeat mode is set to queue, moving last track from the history to current queue...");
4832
- this.tracks.add(this.history.tracks.dispatch() || track);
4907
+ this.debug(
4908
+ "Repeat mode is set to queue, moving last track from the history to current queue..."
4909
+ );
4910
+ const next = this.history.tracks.dispatch() || track;
4911
+ if (next)
4912
+ this.tracks.add(next);
4833
4913
  }
4834
- if (!this.tracks.size) {
4914
+ if (!this.tracks.size && track) {
4835
4915
  if (this.repeatMode === 3 /* AUTOPLAY */) {
4836
4916
  if (this.hasDebugger)
4837
4917
  this.debug("Repeat mode is set to autoplay, initiating autoplay handler...");
@@ -4865,7 +4945,9 @@ _handleAutoplay = new WeakSet();
4865
4945
  handleAutoplay_fn = /* @__PURE__ */ __name(async function(track) {
4866
4946
  try {
4867
4947
  if (this.hasDebugger)
4868
- this.debug(`Autoplay >> Finding related tracks for Track ${track.title} (${track.url}) [ext:${track.extractor?.identifier || "N/A"}]`);
4948
+ this.debug(
4949
+ `Autoplay >> Finding related tracks for Track ${track.title} (${track.url}) [ext:${track.extractor?.identifier || "N/A"}]`
4950
+ );
4869
4951
  const tracks = (await track.extractor?.getRelatedTracks(track, this.history))?.tracks || (await this.player.extractors.run(async (ext) => {
4870
4952
  if (this.hasDebugger)
4871
4953
  this.debug(`Autoplay >> Querying extractor ${ext.identifier}`);
@@ -4953,10 +5035,14 @@ var _GuildNodeManager = class _GuildNodeManager {
4953
5035
  options.disableResampler ?? (options.disableResampler = true);
4954
5036
  options.disableFallbackStream ?? (options.disableFallbackStream = false);
4955
5037
  if (getGlobalRegistry().has("@[onBeforeCreateStream]") && !options.onBeforeCreateStream) {
4956
- options.onBeforeCreateStream = getGlobalRegistry().get("@[onBeforeCreateStream]");
5038
+ options.onBeforeCreateStream = getGlobalRegistry().get(
5039
+ "@[onBeforeCreateStream]"
5040
+ );
4957
5041
  }
4958
5042
  if (getGlobalRegistry().has("@[onAfterCreateStream]") && !options.onAfterCreateStream) {
4959
- options.onAfterCreateStream = getGlobalRegistry().get("@[onAfterCreateStream]");
5043
+ options.onAfterCreateStream = getGlobalRegistry().get(
5044
+ "@[onAfterCreateStream]"
5045
+ );
4960
5046
  }
4961
5047
  const queue = new GuildQueue5(this.player, {
4962
5048
  guild: server,
@@ -5213,7 +5299,11 @@ var _LrcLib = class _LrcLib {
5213
5299
  */
5214
5300
  search(params) {
5215
5301
  if (!params.q && !params.trackName) {
5216
- throw Exceptions.ERR_INVALID_ARG_TYPE("one of q or trackName", "string", [String(params.q), String(params.trackName)].join(", "));
5302
+ throw Exceptions.ERR_INVALID_ARG_TYPE(
5303
+ "one of q or trackName",
5304
+ "string",
5305
+ [String(params.q), String(params.trackName)].join(", ")
5306
+ );
5217
5307
  }
5218
5308
  const path = `search?${createQuery(params)}`;
5219
5309
  return this.request(path);
@@ -5528,116 +5618,6 @@ async function defaultVoiceStateHandler(player, queue, oldState, newState) {
5528
5618
  }
5529
5619
  __name(defaultVoiceStateHandler, "defaultVoiceStateHandler");
5530
5620
 
5531
- // src/utils/IPRotator.ts
5532
- var ip;
5533
- function ensureIp() {
5534
- if (ip)
5535
- return ip;
5536
- const { error, module: module2 } = Util.require("ip");
5537
- if (error) {
5538
- throw Exceptions.ERR_NOT_EXISTING_MODULE("ip", "ip package is required to use IPRotator.");
5539
- }
5540
- ip = module2;
5541
- return ip;
5542
- }
5543
- __name(ensureIp, "ensureIp");
5544
- var _IPBlock = class _IPBlock {
5545
- constructor(block) {
5546
- this.block = block;
5547
- this.usage = 0;
5548
- if (ensureIp().isV4Format(block.split("/")[0]) && !block.includes("/")) {
5549
- block += "/32";
5550
- } else if (ensureIp().isV6Format(block.split("/")[0]) && !block.includes("/")) {
5551
- block += "/128";
5552
- }
5553
- this.cidr = ensureIp().cidr(this.block);
5554
- this.cidrSize = ensureIp().cidrSubnet(this.block).subnetMaskLength;
5555
- }
5556
- consume() {
5557
- this.usage++;
5558
- }
5559
- };
5560
- __name(_IPBlock, "IPBlock");
5561
- var IPBlock = _IPBlock;
5562
- var _retries;
5563
- var _IPRotator = class _IPRotator {
5564
- constructor(config) {
5565
- this.config = config;
5566
- this.blocks = [];
5567
- this.failures = /* @__PURE__ */ new Map();
5568
- this.MAX_NEXT_RETRIES = 30;
5569
- __privateAdd(this, _retries, 0);
5570
- config.exclude ?? (config.exclude = []);
5571
- this.blocks = config.blocks.map((block) => new IPBlock(block));
5572
- this.MAX_NEXT_RETRIES = config.maxRetries ?? 10;
5573
- }
5574
- getIP() {
5575
- const block = this.blocks.sort((a, b) => a.usage - b.usage)[0];
5576
- if (!block) {
5577
- throw new Error("No IP blocks available");
5578
- }
5579
- const random = _IPRotator.getRandomIP(block.cidr, block.cidrSize);
5580
- if (this.isFailedOrExcluded(random)) {
5581
- if (__privateWrapper(this, _retries)._++ > this.MAX_NEXT_RETRIES) {
5582
- __privateSet(this, _retries, 0);
5583
- throw new Error("Unable to find an IP that is not excluded");
5584
- }
5585
- return this.getIP();
5586
- }
5587
- __privateSet(this, _retries, 0);
5588
- block.consume();
5589
- return { ip: random, family: ensureIp().isV4Format(random) ? 4 : 6 };
5590
- }
5591
- isFailedOrExcluded(ip2) {
5592
- return this.failures.has(ip2) || !!this.config.exclude?.includes(ip2);
5593
- }
5594
- addFailed(ip2) {
5595
- const lastFailedCount = this.failures.get(ip2) ?? 0;
5596
- this.failures.set(ip2, lastFailedCount + 1);
5597
- }
5598
- static getRandomIP(address, start, end) {
5599
- const bytes = ensureIp().toBuffer(address);
5600
- const ipv6 = bytes.length === 16;
5601
- const bytesize = 8;
5602
- start = start || 0;
5603
- end = typeof end !== "undefined" ? end : bytes.length * bytesize;
5604
- for (let i = 0; i < bytes.length; i++) {
5605
- let bit = i * bytesize;
5606
- if (bit + bytesize < start || bit >= end) {
5607
- continue;
5608
- }
5609
- let b = bytes[i];
5610
- for (let n = 0; n < bytesize; n++) {
5611
- if (bit >= start && bit < end) {
5612
- const bitpos = bytesize - n - 1;
5613
- const bitmask = 1 << bitpos;
5614
- if (Math.random() < 0.5) {
5615
- b |= bitmask;
5616
- } else {
5617
- b &= ~bitmask;
5618
- }
5619
- }
5620
- bit++;
5621
- }
5622
- bytes[i] = b;
5623
- }
5624
- const tets = [];
5625
- for (let i = 0; i < bytes.length; i++) {
5626
- if (ipv6) {
5627
- if (i % 2 === 0) {
5628
- tets[i >> 1] = (bytes[i] << bytesize | bytes[i + 1]).toString(16);
5629
- }
5630
- } else {
5631
- tets[i] = bytes[i];
5632
- }
5633
- }
5634
- return tets.join(ipv6 ? ":" : ".");
5635
- }
5636
- };
5637
- _retries = new WeakMap();
5638
- __name(_IPRotator, "IPRotator");
5639
- var IPRotator = _IPRotator;
5640
-
5641
5621
  // src/utils/DependencyReportGenerator.ts
5642
5622
  var import_node_path = require("path");
5643
5623
  var import_ffmpeg2 = require("@discord-player/ffmpeg");
@@ -5673,7 +5653,7 @@ var DependencyReportGenerator = {
5673
5653
  version(name, maxLookupDepth = 3) {
5674
5654
  try {
5675
5655
  if (name === "discord-player") {
5676
- return "7.0.0-dev.1";
5656
+ return "7.0.0-dev.3";
5677
5657
  }
5678
5658
  const pkg = DependencyReportGenerator.findPackageJSON((0, import_node_path.dirname)(require.resolve(name)), name, maxLookupDepth);
5679
5659
  return pkg?.version ?? null;
@@ -5714,7 +5694,8 @@ var DependencyReportGenerator = {
5714
5694
  sodium: DependencyReportGenerator.version("sodium"),
5715
5695
  "libsodium-wrappers": DependencyReportGenerator.version("libsodium-wrappers"),
5716
5696
  "@stablelib/xchacha20poly1305": DependencyReportGenerator.version("@stablelib/xchacha20poly1305"),
5717
- "sodium-javascript": DependencyReportGenerator.version("sodium-javascript")
5697
+ "sodium-javascript": DependencyReportGenerator.version("sodium-javascript"),
5698
+ "@nobel/ciphers": DependencyReportGenerator.version("@nobel/ciphers")
5718
5699
  },
5719
5700
  ffmpeg: ffmpegReport
5720
5701
  };
@@ -5746,7 +5727,6 @@ var DependencyReportGenerator = {
5746
5727
  };
5747
5728
 
5748
5729
  // src/Player.ts
5749
- var kSingleton = Symbol("InstanceDiscordPlayerSingleton");
5750
5730
  var _lastLatency, _voiceStateUpdateListener, _lagMonitorTimeout, _lagMonitorInterval, _onVoiceStateUpdate, _hooksCtx;
5751
5731
  var _Player = class _Player extends PlayerEventsEmitter {
5752
5732
  /**
@@ -5755,8 +5735,6 @@ var _Player = class _Player extends PlayerEventsEmitter {
5755
5735
  * @param {PlayerInitOptions} [options] The player init options
5756
5736
  */
5757
5737
  constructor(client, options = {}) {
5758
- if (!options.ignoreInstance && kSingleton in _Player)
5759
- return _Player[kSingleton];
5760
5738
  super([PlayerEvent.Error]);
5761
5739
  __privateAdd(this, _lastLatency, -1);
5762
5740
  __privateAdd(this, _voiceStateUpdateListener, this.handleVoiceState.bind(this));
@@ -5784,10 +5762,6 @@ var _Player = class _Player extends PlayerEventsEmitter {
5784
5762
  * The player events channel
5785
5763
  */
5786
5764
  this.events = new PlayerEventsEmitter([GuildQueueEvent.Error, GuildQueueEvent.PlayerError]);
5787
- /**
5788
- * The route planner
5789
- */
5790
- this.routePlanner = null;
5791
5765
  /**
5792
5766
  * The player version
5793
5767
  */
@@ -5798,7 +5772,9 @@ var _Player = class _Player extends PlayerEventsEmitter {
5798
5772
  this.lyrics = new LrcLib(this);
5799
5773
  if (options.ffmpegPath) {
5800
5774
  if (typeof options.ffmpegPath !== "string")
5801
- throw new TypeError(`Expected type "string" for options.ffmpegPath. Got ${typeof options.ffmpegPath} instead`);
5775
+ throw new TypeError(
5776
+ `Expected type "string" for options.ffmpegPath. Got ${typeof options.ffmpegPath} instead`
5777
+ );
5802
5778
  process.env.FFMPEG_PATH = options.ffmpegPath;
5803
5779
  }
5804
5780
  const isCompatMode = isClientProxy(client);
@@ -5828,11 +5804,8 @@ var _Player = class _Player extends PlayerEventsEmitter {
5828
5804
  useLegacyFFmpeg: false,
5829
5805
  skipFFmpeg: true,
5830
5806
  probeTimeout: 5e3,
5831
- ...options,
5832
- ytdlOptions: {
5833
- highWaterMark: 1 << 25,
5834
- ...options.ytdlOptions
5835
- }
5807
+ overrideFallbackContext: true,
5808
+ ...options
5836
5809
  };
5837
5810
  if (!isCompatMode) {
5838
5811
  this.client.incrementMaxListeners();
@@ -5848,17 +5821,8 @@ var _Player = class _Player extends PlayerEventsEmitter {
5848
5821
  }, 0).unref());
5849
5822
  }, this.options.lagMonitor).unref());
5850
5823
  }
5851
- if (this.options.ipconfig) {
5852
- this.routePlanner = new IPRotator(this.options.ipconfig);
5853
- }
5854
- addPlayer(this);
5855
- if (!(kSingleton in _Player)) {
5856
- Object.defineProperty(_Player, kSingleton, {
5857
- value: this,
5858
- writable: true,
5859
- configurable: true,
5860
- enumerable: false
5861
- });
5824
+ if (this.options.overrideFallbackContext) {
5825
+ getGlobalRegistry().set("@[player]", this);
5862
5826
  }
5863
5827
  }
5864
5828
  /**
@@ -5867,6 +5831,14 @@ var _Player = class _Player extends PlayerEventsEmitter {
5867
5831
  get context() {
5868
5832
  if (!__privateGet(this, _hooksCtx)) {
5869
5833
  __privateSet(this, _hooksCtx, createContext());
5834
+ const originalProvider = __privateGet(this, _hooksCtx).provide.bind(__privateGet(this, _hooksCtx));
5835
+ __privateGet(this, _hooksCtx).provide = (value, receiver) => {
5836
+ return SUPER_CONTEXT.provide(this, () => {
5837
+ return originalProvider(value, () => {
5838
+ return receiver();
5839
+ });
5840
+ });
5841
+ };
5870
5842
  }
5871
5843
  return __privateGet(this, _hooksCtx);
5872
5844
  }
@@ -5880,39 +5852,13 @@ var _Player = class _Player extends PlayerEventsEmitter {
5880
5852
  debug(m) {
5881
5853
  return this.emit("debug", m);
5882
5854
  }
5883
- /**
5884
- * Creates discord-player singleton instance.
5885
- * @param client The client that instantiated player
5886
- * @param options Player initializer options
5887
- */
5888
- static singleton(client, options = {}) {
5889
- return new _Player(client, {
5890
- ...options,
5891
- ignoreInstance: false
5892
- });
5893
- }
5894
5855
  /**
5895
5856
  * Creates new discord-player instance.
5896
5857
  * @param client The client that instantiated player
5897
5858
  * @param options Player initializer options
5898
5859
  */
5899
5860
  static create(client, options = {}) {
5900
- return new _Player(client, {
5901
- ...options,
5902
- ignoreInstance: true
5903
- });
5904
- }
5905
- /**
5906
- * Get all active master player instances
5907
- */
5908
- static getAllPlayers() {
5909
- return getPlayers();
5910
- }
5911
- /**
5912
- * Clear all master player instances
5913
- */
5914
- static clearAllPlayers() {
5915
- return instances.clear();
5861
+ return new _Player(client, options);
5916
5862
  }
5917
5863
  /**
5918
5864
  * The current query cache provider in use
@@ -5943,7 +5889,6 @@ var _Player = class _Player extends PlayerEventsEmitter {
5943
5889
  *
5944
5890
  * // outputs something like
5945
5891
  * // {
5946
- * // instances: number,
5947
5892
  * // queuesCount: number,
5948
5893
  * // queryCacheEnabled: boolean,
5949
5894
  * // queues: [
@@ -5957,7 +5902,6 @@ var _Player = class _Player extends PlayerEventsEmitter {
5957
5902
  */
5958
5903
  generateStatistics() {
5959
5904
  return {
5960
- instances: instances.size,
5961
5905
  queuesCount: this.queues.cache.size,
5962
5906
  queryCacheEnabled: this.queryCache != null,
5963
5907
  queues: this.queues.cache.map((m) => m.stats.generate())
@@ -5989,7 +5933,6 @@ var _Player = class _Player extends PlayerEventsEmitter {
5989
5933
  clearInterval(__privateGet(this, _lagMonitorInterval));
5990
5934
  if (__privateGet(this, _lagMonitorTimeout))
5991
5935
  clearInterval(__privateGet(this, _lagMonitorTimeout));
5992
- clearPlayer(this);
5993
5936
  }
5994
5937
  _handleVoiceState(oldState, newState) {
5995
5938
  const queue = this.nodes.get(oldState.guild.id);
@@ -6055,11 +5998,17 @@ var _Player = class _Player extends PlayerEventsEmitter {
6055
5998
  async play(channel, query, options = {}) {
6056
5999
  const vc = this.client.channels.resolve(channel);
6057
6000
  if (!vc?.isVoiceBased())
6058
- throw Exceptions.ERR_INVALID_ARG_TYPE("channel", "VoiceBasedChannel", !vc ? "undefined" : `channel type ${vc.type}`);
6001
+ throw Exceptions.ERR_INVALID_ARG_TYPE(
6002
+ "channel",
6003
+ "VoiceBasedChannel",
6004
+ !vc ? "undefined" : `channel type ${vc.type}`
6005
+ );
6059
6006
  const originalResult = query instanceof SearchResult ? query : await this.search(query, options);
6060
6007
  const result = await options.afterSearch?.(originalResult) || originalResult;
6061
6008
  if (result.isEmpty()) {
6062
- throw Exceptions.ERR_NO_RESULT(`No results found for "${query}" (Extractor: ${result.extractor?.identifier || "N/A"})`);
6009
+ throw Exceptions.ERR_NO_RESULT(
6010
+ `No results found for "${query}" (Extractor: ${result.extractor?.identifier || "N/A"})`
6011
+ );
6063
6012
  }
6064
6013
  const queue = this.nodes.create(vc.guild, options.nodeOptions);
6065
6014
  if (this.hasDebugger)
@@ -6150,12 +6099,16 @@ var _Player = class _Player extends PlayerEventsEmitter {
6150
6099
  options.searchEngine ?? (options.searchEngine = QueryType.AUTO);
6151
6100
  options.fallbackSearchEngine ?? (options.fallbackSearchEngine = QueryType.AUTO_SEARCH);
6152
6101
  if (this.hasDebugger)
6153
- this.debug(`Search engine set to ${options.searchEngine}, fallback search engine set to ${options.fallbackSearchEngine}`);
6102
+ this.debug(
6103
+ `Search engine set to ${options.searchEngine}, fallback search engine set to ${options.fallbackSearchEngine}`
6104
+ );
6154
6105
  if (/^\w+:/.test(searchQuery)) {
6155
6106
  const [protocolName, ...query2] = searchQuery.split(":");
6156
6107
  if (this.hasDebugger)
6157
6108
  this.debug(`Protocol ${protocolName} detected in query`);
6158
- const matchingExtractor = this.extractors.store.find((e) => !this.extractors.isDisabled(e.identifier) && e.protocols.includes(protocolName));
6109
+ const matchingExtractor = this.extractors.store.find(
6110
+ (e) => !this.extractors.isDisabled(e.identifier) && e.protocols.includes(protocolName)
6111
+ );
6159
6112
  if (matchingExtractor) {
6160
6113
  if (this.hasDebugger)
6161
6114
  this.debug(`Protocol ${protocolName} is supported by ${matchingExtractor.identifier} extractor!`);
@@ -6164,13 +6117,17 @@ var _Player = class _Player extends PlayerEventsEmitter {
6164
6117
  protocol = protocolName;
6165
6118
  } else {
6166
6119
  if (this.hasDebugger)
6167
- this.debug(`Could not find an extractor that supports ${protocolName} protocol. Falling back to default behavior...`);
6120
+ this.debug(
6121
+ `Could not find an extractor that supports ${protocolName} protocol. Falling back to default behavior...`
6122
+ );
6168
6123
  }
6169
6124
  }
6170
6125
  const redirected = await QueryResolver.preResolve(searchQuery);
6171
6126
  const { type: queryType, query } = options.searchEngine === QueryType.AUTO ? QueryResolver.resolve(redirected, options.fallbackSearchEngine) : { type: options.searchEngine, query: redirected };
6172
6127
  if (this.hasDebugger)
6173
- this.debug(`Query type identified as ${queryType}${extractor && protocol ? " but might not be used due to the presence of protocol" : ""}`);
6128
+ this.debug(
6129
+ `Query type identified as ${queryType}${extractor && protocol ? " but might not be used due to the presence of protocol" : ""}`
6130
+ );
6174
6131
  if (options.searchEngine.startsWith("ext:")) {
6175
6132
  if (this.hasDebugger)
6176
6133
  this.debug(`Forcing ${options.searchEngine.substring(4)} extractor...`);
@@ -6304,7 +6261,12 @@ var _Player = class _Player extends PlayerEventsEmitter {
6304
6261
  const info = import_ffmpeg3.FFmpeg.resolveSafe();
6305
6262
  if (!info)
6306
6263
  return "FFmpeg/Avconv not found";
6307
- return [`- ffmpeg: ${info.version}`, `- command: ${info.command}`, `- static: ${info.module}`, `- libopus: ${info.result.includes("--enable-libopus")}`].join("\n");
6264
+ return [
6265
+ `- ffmpeg: ${info.version}`,
6266
+ `- command: ${info.command}`,
6267
+ `- static: ${info.module}`,
6268
+ `- libopus: ${info.result.includes("--enable-libopus")}`
6269
+ ].join("\n");
6308
6270
  })(),
6309
6271
  "\n",
6310
6272
  "Loaded Extractors:",
@@ -6338,14 +6300,13 @@ __name(_Player, "Player");
6338
6300
  /**
6339
6301
  * The version of discord-player
6340
6302
  */
6341
- _Player.version = "7.0.0-dev.1";
6342
- _Player._singletonKey = kSingleton;
6303
+ _Player.version = "7.0.0-dev.3";
6343
6304
  var Player = _Player;
6344
6305
 
6345
6306
  // src/index.ts
6346
6307
  var import_equalizer3 = require("@discord-player/equalizer");
6347
6308
  var import_discord_voip6 = require("discord-voip");
6348
- var version = "7.0.0-dev.1";
6309
+ var version = "7.0.0-dev.3";
6349
6310
  // Annotate the CommonJS export names for ESM import in node:
6350
6311
  0 && (module.exports = {
6351
6312
  AF_NIGHTCORE_RATE,
@@ -6375,8 +6336,6 @@ var version = "7.0.0-dev.1";
6375
6336
  GuildQueueHistory,
6376
6337
  GuildQueuePlayerNode,
6377
6338
  GuildQueueStatistics,
6378
- IPBlock,
6379
- IPRotator,
6380
6339
  LrcLib,
6381
6340
  PCMAudioFilters,
6382
6341
  Player,
@@ -6403,7 +6362,6 @@ var version = "7.0.0-dev.1";
6403
6362
  createContext,
6404
6363
  createErisCompat,
6405
6364
  createFFmpegStream,
6406
- createHook,
6407
6365
  decode,
6408
6366
  deserialize,
6409
6367
  encode,
@@ -6418,7 +6376,6 @@ var version = "7.0.0-dev.1";
6418
6376
  useContext,
6419
6377
  useHistory,
6420
6378
  useMainPlayer,
6421
- useMasterPlayer,
6422
6379
  useMetadata,
6423
6380
  usePlayer,
6424
6381
  useQueue,
@@ -6427,4 +6384,4 @@ var version = "7.0.0-dev.1";
6427
6384
  version,
6428
6385
  ...require("@discord-player/ffmpeg")
6429
6386
  });
6430
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy91dGlscy9UeXBlVXRpbC50cyIsICIuLi9zcmMvZXJyb3JzL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy90eXBlcy90eXBlcy50cyIsICIuLi9zcmMvZmFicmljL1NlYXJjaFJlc3VsdC50cyIsICIuLi9zcmMvdXRpbHMvQXVkaW9GaWx0ZXJzLnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvaG9va3MvY29udGV4dC9hc3luYy1jb250ZXh0LnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vX2NvbnRhaW5lci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2FkZFBsYXllci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2NsZWFyUGxheWVyLnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vZ2V0UGxheWVycy50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldEdsb2JhbFJlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9ob29rcy9jb21tb24udHMiLCAiLi4vc3JjL2hvb2tzL3VzZUhpc3RvcnkudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlUXVldWUudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1haW5QbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1ldGFkYXRhLnRzIiwgIi4uL3NyYy9ob29rcy91c2VUaW1lbGluZS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQWZ0ZXJDcmVhdGVTdHJlYW0udHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkJlZm9yZUNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3MvdXNlVm9sdW1lLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZE5vZGVNYW5hZ2VyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlLnRzIiwgIi4uL3NyYy9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVBsYXllck5vZGUudHMiLCAiLi4vc3JjL3V0aWxzL1F1ZXJ5UmVzb2x2ZXIudHMiLCAiLi4vc3JjL3V0aWxzL0FzeW5jUXVldWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3F1ZXVlL1N5bmNlZEx5cmljc1Byb3ZpZGVyLnRzIiwgIi4uL3NyYy91dGlscy9TZXF1ZW50aWFsQnVja2V0LnRzIiwgIi4uL3NyYy9scmNsaWIvTHJjTGliLnRzIiwgIi4uL3NyYy9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeUNhY2hlLnRzIiwgIi4uL3NyYy9QbGF5ZXIudHMiLCAiLi4vc3JjL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlci50cyIsICIuLi9zcmMvdXRpbHMvSVBSb3RhdG9yLnRzIiwgIi4uL3NyYy91dGlscy9EZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBjcmVhdGVFcmlzQ29tcGF0LCBpc0VyaXNQcm94eSB9IGZyb20gJy4vY29tcGF0L2NyZWF0ZUVyaXNDb21wYXQnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vZmFicmljJztcbmV4cG9ydCAqIGZyb20gJy4vcXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi9scmNsaWIvTHJjTGliJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvU2VxdWVudGlhbEJ1Y2tldCc7XG5leHBvcnQgKiBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1ZvaWNlVXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1R5cGVVdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvRkZtcGVnU3RyZWFtJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuZXhwb3J0ICogZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5leHBvcnQgKiBmcm9tICcuL1BsYXllcic7XG5leHBvcnQgKiBmcm9tICcuL2hvb2tzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvSVBSb3RhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc2VyZGUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9EZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yJztcbmV4cG9ydCB7XG4gICAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgICB0eXBlIEJpcXVhZEZpbHRlcnMsXG4gICAgRmlsdGVyVHlwZSBhcyBCaXF1YWRGaWx0ZXJUeXBlLFxuICAgIHR5cGUgUENNRmlsdGVycyxcbiAgICBRX0JVVFRFUldPUlRILFxuICAgIFZvbHVtZVRyYW5zZm9ybWVyLFxuICAgIEJBU1NfRVFfQkFORFMsXG4gICAgQUZfTklHSFRDT1JFX1JBVEUsXG4gICAgQUZfVkFQT1JXQVZFX1JBVEUsXG4gICAgRmlsdGVyc0NoYWluXG59IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHsgY3JlYXRlQXVkaW9QbGF5ZXIsIEF1ZGlvUGxheWVyLCBnZXRWb2ljZUNvbm5lY3Rpb24sIGdldFZvaWNlQ29ubmVjdGlvbnMsIGpvaW5Wb2ljZUNoYW5uZWwsIHR5cGUgSm9pbkNvbmZpZywgdHlwZSBKb2luVm9pY2VDaGFubmVsT3B0aW9ucywgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbmV4cG9ydCBjb25zdCB2ZXJzaW9uOiBzdHJpbmcgPSAnNy4wLjAtZGV2LjEnO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7IENoYW5uZWxUeXBlLCBHYXRld2F5RGlzcGF0Y2hFdmVudHMgfSBmcm9tICdkaXNjb3JkLWFwaS10eXBlcy92MTAnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuXG5pbXBvcnQgdHlwZSB7IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQsIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YSwgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGEgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIEVyaXMgZnJvbSAnZXJpcyc7XG5cbnR5cGUgRXJpc1VzZXJSZXNvbHZhYmxlID0gRXJpcy5Vc2VyIHwgc3RyaW5nIHwgRXJpcy5NZW1iZXI7XG50eXBlIEVyaXNHdWlsZFJlc29sdmFibGUgPSBFcmlzLkd1aWxkIHwgc3RyaW5nIHwgRXJpcy5NZW1iZXIgfCBFcmlzLkd1aWxkQ2hhbm5lbCB8IEVyaXMuUm9sZTtcbnR5cGUgRXJpc0NoYW5uZWxSZXNvbHZhYmxlID0gRXJpcy5HdWlsZENoYW5uZWwgfCBzdHJpbmc7XG5cbmNvbnN0IERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wgPSBTeW1ib2woJ0Rpc2NvcmRQbGF5ZXJDbGllbnQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xpZW50UHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSAhPSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcGF0TmFtZShjbGllbnQ6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0KGNsaWVudCwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCkgPz8gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXJpc1Byb3h5KGNsaWVudDogYW55KTogY2xpZW50IGlzIEVyaXMuQ2xpZW50IHtcbiAgICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA9PT0gJ0VyaXMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzQ2xpZW50KGNsaWVudDogYW55KTogY2xpZW50IGlzIEVyaXMuQ2xpZW50IHtcbiAgICBjb25zdCB7IG1vZHVsZSwgZXJyb3IgfSA9IFV0aWwucmVxdWlyZSgnZXJpcycpO1xuXG4gICAgaWYgKGVycm9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICAgIHJldHVybiBjbGllbnQgaW5zdGFuY2VvZiBlcmlzLkNsaWVudDtcbn1cblxuZnVuY3Rpb24gZGVjbGFyZVByb3BlcnR5KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5PFQ+KHRhcmdldDogYW55LCBrZXk6IHN0cmluZyk6IFQge1xuICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSk7XG59XG5cbi8qKlxuICogQWxsb3dzIEVyaXMgY2xpZW50cyB0byBiZSB1c2VkIHdpdGggZGlzY29yZC1wbGF5ZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciBjcmVhdGVzIGEgcHJveHkgb2JqZWN0IHRoYXQgaW50ZXJjZXB0cyBjZXJ0YWluIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggZGlzY29yZC1wbGF5ZXIuXG4gKiBAcGFyYW0gY2xpZW50IFRoZSBFcmlzIGNsaWVudCB0byBiZSB1c2VkLlxuICogQHJldHVybnMgVGhlIEVyaXMgY2xpZW50IHdpdGggZGlzY29yZC1wbGF5ZXIgY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVyaXNDb21wYXQoY2xpZW50OiBFcmlzLkNsaWVudCk6IENsaWVudCB7XG4gICAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ2VyaXMnKTtcblxuICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG5cbiAgICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICAgIGVyaXNWb2ljZUV2ZW50c0hhbmRsZXIoY2xpZW50KTtcblxuICAgIGNvbnN0IGVyaXNQcm94eSA9IG5ldyBQcm94eShjbGllbnQsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgICAgICAgc3dpdGNoIChwKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndXNlcnMnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJpc1VzZXJzUHJveHkodGFyZ2V0LCBlcmlzKTtcbiAgICAgICAgICAgICAgICBjYXNlICdndWlsZHMnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJpc0d1aWxkc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2hhbm5lbHMnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJpc0NoYW5uZWxzUHJveHkodGFyZ2V0LCBlcmlzKTtcbiAgICAgICAgICAgICAgICBjYXNlICdpbmNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjYXNlICdkZWNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gY2xpZW50LmdldE1heExpc3RlbmVycygpIC0gMTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhsaXN0ZW5lcnMgPCAwID8gMSA6IGxpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBSZWZsZWN0LnNldChlcmlzUHJveHksIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wsICdFcmlzJyk7XG5cbiAgICByZXR1cm4gZXJpc1Byb3h5IGFzIHVua25vd24gYXMgQ2xpZW50O1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudDogRXJpcy5DbGllbnQpIHtcbiAgICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCBhbnk+PihjbGllbnQsICdhZGFwdGVycycpO1xuXG4gICAgaWYgKCFhZGFwdGVycykge1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgICAgICBkZWNsYXJlUHJvcGVydHkoY2xpZW50LCAnYWRhcHRlcnMnLCBjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICBjbGllbnQub24oJ3NoYXJkRGlzY29ubmVjdCcsIChfLCBzaGFyZElkKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2d1aWxkSWQsIGFkYXB0ZXJdIG9mIGFkYXB0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGNsaWVudC5ndWlsZHMuZ2V0KGd1aWxkSWQpPy5zaGFyZC5pZCA9PT0gc2hhcmRJZCkge1xuICAgICAgICAgICAgICAgIGFkYXB0ZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBjbGllbnQub24oJ3Jhd1dTJywgKHBhY2tldCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHBhY2tldC50KSB7XG4gICAgICAgICAgICBjYXNlIEdhdGV3YXlEaXNwYXRjaEV2ZW50cy5Wb2ljZVNlcnZlclVwZGF0ZToge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTZXJ2ZXJVcGRhdGVEaXNwYXRjaERhdGE7XG4gICAgICAgICAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU2VydmVyVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGU6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGE7XG5cbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5ndWlsZF9pZCAmJiBwYXlsb2FkLnNlc3Npb25faWQgJiYgcGF5bG9hZC51c2VyX2lkID09PSBjbGllbnQudXNlci5pZCkge1xuICAgICAgICAgICAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTdGF0ZVVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNDaGFubmVsc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB7XG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgZ2V0IGNhY2hlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBnZXQoaWQ6IHN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LmdldENoYW5uZWwoaWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFzKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkIGluIGNsaWVudC5jaGFubmVsR3VpbGRNYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZShyZXNvbHZhYmxlOiBzdHJpbmcgfCBFcmlzQ2hhbm5lbFJlc29sdmFibGUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHRoaXMuY2xpZW50LmdldENoYW5uZWwocmVzb2x2YWJsZSkgYXMgRXJpcy5HdWlsZENoYW5uZWwsIGNsaWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZENoYW5uZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmFibGUsIGNsaWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFcmlzQ2hhbm5lbFJlc29sdmFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnJlc29sdmUocmVzb2x2YWJsZSk7XG4gICAgICAgICAgICByZXR1cm4gY2hhbm5lbD8uaWQ7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShjaGFubmVsOiBFcmlzLkd1aWxkQ2hhbm5lbCB8IHVuZGVmaW5lZCwgY2xpZW50OiBFcmlzLkNsaWVudCk6IEVyaXMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWNoYW5uZWwpIHJldHVybjtcblxuICAgIHJldHVybiBuZXcgUHJveHkoY2hhbm5lbCwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgICAgICAgICBjYXNlICdndWlsZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmlzVm9pY2VBZGFwdGVyUHJveHkodGFyZ2V0Lmd1aWxkLCBjbGllbnQpO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21lbWJlcnMnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBFcmlzLlZvaWNlQ2hhbm5lbCkudm9pY2VNZW1iZXJzO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2lzVm9pY2VCYXNlZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZSB8fCB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2lzVm9pY2UnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2U7XG4gICAgICAgICAgICAgICAgY2FzZSAnaXNTdGFnZSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VBZGFwdGVyUHJveHkoZ3VpbGQ6IEVyaXMuR3VpbGQgfCB1bmRlZmluZWQsIGNsaWVudDogRXJpcy5DbGllbnQpOiBFcmlzLkd1aWxkIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWd1aWxkKSByZXR1cm47XG5cbiAgICByZXR1cm4gbmV3IFByb3h5KGd1aWxkLCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgICAgICAgIGlmIChwID09PSAndm9pY2VBZGFwdGVyQ3JlYXRvcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJpc1ZvaWNlQWRhcHRlckNyZWF0b3IodGFyZ2V0LCBjbGllbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJDcmVhdG9yKGd1aWxkOiBFcmlzLkd1aWxkLCBjbGllbnQ6IEVyaXMuQ2xpZW50KTogRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB7XG4gICAgcmV0dXJuIChtZXRob2RzKSA9PiB7XG4gICAgICAgIGxldCBhZGFwdGVycyA9IGdldFByb3BlcnR5PE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICAgICAgICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPigpO1xuICAgICAgICAgICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgICAgICAgICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBhZGFwdGVycy5zZXQoZ3VpbGQuaWQsIG1ldGhvZHMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZW5kUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGd1aWxkLnNoYXJkLnN0YXR1cyAhPT0gJ3JlYWR5JykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGd1aWxkLnNoYXJkLnNlbmRXUyhwYXlsb2FkLm9wLCBwYXlsb2FkLmQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgICAgICAgYWRhcHRlcnMuZGVsZXRlKGd1aWxkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBlcmlzR3VpbGRzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShjbGllbnQuZ3VpbGRzLCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgICAgICAgIGlmIChwID09PSAnY2FjaGUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLk1lbWJlciB8fCByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZCB8fCByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZENoYW5uZWwgfHwgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuUm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChyZXNvbHZhYmxlOiBFcmlzR3VpbGRSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aWxkID0gcmVzb2x2ZXIocmVzb2x2YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzVXNlcnNQcm94eShjbGllbnQ6IEVyaXMuQ2xpZW50LCBlcmlzOiB0eXBlb2YgaW1wb3J0KCdlcmlzJykpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC51c2Vycywge1xuICAgICAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICAgICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwID09PSAncmVzb2x2ZScgfHwgcCA9PT0gJ3Jlc29sdmVJZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzVXNlclJlc29sdmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuVXNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuTWVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2YWJsZS51c2VyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSByZXNvbHZlcihyZXNvbHZhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI/LmlkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgVGltZURhdGEgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFBsYXlsaXN0LCBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IHJhbmRvbUludCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7XG4gICAgY3JlYXRlRmlsdGVyLFxuICAgIGNyZWF0ZVNwb3RpZnlGaWx0ZXIsXG4gICAgZml4VHJhY2tTdWZmaXgsXG4gICAgcmVtb3ZlTGl2ZSxcbiAgICByZW1vdmVSZW1hc3RlcmVkLFxuICAgIHlvdXR1YmUsXG4gICAgcmVtb3ZlWmVyb1dpZHRoLFxuICAgIHJlcGxhY2VOYnNwLFxuICAgIHJlcGxhY2VTbWFydFF1b3RlcyxcbiAgICByZW1vdmVDbGVhbkV4cGxpY2l0XG59IGZyb20gJ0B3ZWItc2Nyb2JibGVyL21ldGFkYXRhLWZpbHRlcic7XG5pbXBvcnQgeyBUcmFja1NvdXJjZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgUnVudGltZVR5cGUgPSAnbm9kZScgfCAnZGVubycgfCAnYnVuJyB8ICd1bmtub3duJztcblxuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lIHtcbiAgICBuYW1lOiBSdW50aW1lVHlwZTtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmNsYXNzIFV0aWwge1xuICAgIC8qKlxuICAgICAqIFV0aWxzXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBydW50aW1lIGluZm9ybWF0aW9uXG4gICAgICovXG4gICAgc3RhdGljIGdldFJ1bnRpbWUoKTogUnVudGltZSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiBudWxsO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJyAmJiBEZW5vLnZlcnNpb24pIHJldHVybiB7IG5hbWU6ICdkZW5vJywgdmVyc2lvbjogRGVuby52ZXJzaW9uLmRlbm8gfTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0eXBlb2YgQnVuICE9PSAndW5kZWZpbmVkJyAmJiBCdW4udmVyc2lvbikgcmV0dXJuIHsgbmFtZTogJ2J1bicsIHZlcnNpb246IEJ1bi52ZXJzaW9uIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnZlcnNpb24pIHJldHVybiB7IG5hbWU6ICdub2RlJywgdmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uIH07XG5cbiAgICAgICAgcmV0dXJuIHsgbmFtZTogJ3Vua25vd24nLCB2ZXJzaW9uOiB2ZXJzaW9uID8/ICd1bmtub3duJyB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZHVyYXRpb24gc3RyaW5nXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGR1ck9iaiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgZHVyYXRpb25TdHJpbmcoZHVyT2JqOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGR1ck9iailcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IChpc05hTihtKSA/IDAgOiBtKSlcbiAgICAgICAgICAgIC5qb2luKCc6Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIG1pbGxpc2Vjb25kcyB0byBjb25zdW1hYmxlIHRpbWUgb2JqZWN0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyBUaGUgdGltZSBpbiBtc1xuICAgICAqIEByZXR1cm5zIHtUaW1lRGF0YX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyc2VNUyhtaWxsaXNlY29uZHM6IG51bWJlcikge1xuICAgICAgICBpZiAoaXNOYU4obWlsbGlzZWNvbmRzKSkgbWlsbGlzZWNvbmRzID0gMDtcbiAgICAgICAgY29uc3Qgcm91bmQgPSBtaWxsaXNlY29uZHMgPiAwID8gTWF0aC5mbG9vciA6IE1hdGguY2VpbDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF5czogcm91bmQobWlsbGlzZWNvbmRzIC8gODY0MDAwMDApLFxuICAgICAgICAgICAgaG91cnM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDM2MDAwMDApICUgMjQsXG4gICAgICAgICAgICBtaW51dGVzOiByb3VuZChtaWxsaXNlY29uZHMgLyA2MDAwMCkgJSA2MCxcbiAgICAgICAgICAgIHNlY29uZHM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjBcbiAgICAgICAgfSBhcyBUaW1lRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgdGltZSBjb2RlXG4gICAgICogQHBhcmFtIHtUaW1lRGF0YX0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGJ1aWxkVGltZUNvZGUoZHVyYXRpb246IFRpbWVEYXRhKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gT2JqZWN0LmtleXMoZHVyYXRpb24pO1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IFsnZGF5cycsICdob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnXTtcblxuICAgICAgICBjb25zdCBwYXJzZWQgPSBpdGVtcy5maWx0ZXIoKHgpID0+IHJlcXVpcmVkLmluY2x1ZGVzKHgpKS5tYXAoKG0pID0+IGR1cmF0aW9uW20gYXMga2V5b2YgVGltZURhdGFdKTtcbiAgICAgICAgY29uc3QgZmluYWwgPSBwYXJzZWRcbiAgICAgICAgICAgIC5zbGljZShwYXJzZWQuZmluZEluZGV4KCh4KSA9PiB4ICE9PSAwKSlcbiAgICAgICAgICAgIC5tYXAoKHgpID0+IHgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpKVxuICAgICAgICAgICAgLmpvaW4oJzonKTtcblxuICAgICAgICByZXR1cm4gZmluYWwubGVuZ3RoIDw9IDMgPyBgMDoke2ZpbmFsLnBhZFN0YXJ0KDIsICcwJykgfHwgMH1gIDogZmluYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0cyBkdXJhdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZm9ybWF0RHVyYXRpb24oZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRpbWVDb2RlKHRoaXMucGFyc2VNUyhkdXJhdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBpY2tzIGxhc3QgaXRlbSBvZiB0aGUgZ2l2ZW4gYXJyYXlcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBhcnIgVGhlIGFycmF5XG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0YXRpYyBsYXN0PFQgPSBhbnk+KGFycjogVFtdKTogVCB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xuICAgICAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzdGF0aWMgaXNWb2ljZUVtcHR5KGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCkge1xuICAgICAgICByZXR1cm4gY2hhbm5lbCAmJiBjaGFubmVsLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+ICFtZW1iZXIudXNlci5ib3QpLnNpemUgPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHRoZSB0cmFjayB0aXRsZVxuICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGVcbiAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2VcbiAgICAgKiBAcmV0dXJucyBDbGVhbmVkIHRpdGxlXG4gICAgICovXG4gICAgc3RhdGljIGNsZWFuVGl0bGUodGl0bGU6IHN0cmluZywgc291cmNlOiBUcmFja1NvdXJjZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyT3B0cyA9IHtcbiAgICAgICAgICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgICAgICB0cmFjazogW1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVSZW1hc3RlcmVkLFxuICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXZlLFxuICAgICAgICAgICAgICAgICAgICBmaXhUcmFja1N1ZmZpeCxcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlWmVyb1dpZHRoLFxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlTmJzcCxcbiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVNtYXJ0UXVvdGVzLFxuICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGVhbkV4cGxpY2l0XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHNwb3RpZnlGaWx0ZXIgPSBjcmVhdGVGaWx0ZXIoZmlsdGVyT3B0cyk7XG4gICAgICAgICAgICBzcG90aWZ5RmlsdGVyLmV4dGVuZChjcmVhdGVTcG90aWZ5RmlsdGVyKCkpO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcblxuICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd5b3V0dWJlJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlvdXR1YmUodGl0bGUpO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3Nwb3RpZnknOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3BvdGlmeUZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRGaWx0ZXIuZmlsdGVyRmllbGQoJ3RyYWNrJywgdGl0bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB0aXRsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhZmVyIHJlcXVpcmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgTm9kZSByZXF1aXJlIGlkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVxdWlyZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGluIG1zIHRvIHdhaXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgICAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgWydub2RlLWZldGNoJywgJ3VuZGljaSddKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vP1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgZGV0YWlsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICAgICAgcmV0dXJuIHNyY1tyYW5kb21JbnQoc3JjLmxlbmd0aCldO1xuICAgIH1cblxuICAgIHN0YXRpYyBhcnJheUNsb25lU2h1ZmZsZTxUPihzcmM6IFRbXSk6IFRbXSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHNyYy5zbGljZSgpO1xuXG4gICAgICAgIGxldCBtID0gYXJyLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAobSkge1xuICAgICAgICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG0tLSk7XG4gICAgICAgICAgICBbYXJyW21dLCBhcnJbaV1dID0gW2FycltpXSwgYXJyW21dXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgVkFMSURBVEVfUVVFVUVfQ0FQID0gKHF1ZXVlOiBHdWlsZFF1ZXVlLCBpdGVtczogUGxheWxpc3QgfCBUcmFjayB8IFRyYWNrW10pID0+IHtcbiAgICBjb25zdCB0cmFja3MgPSBpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gaXRlbXMudHJhY2tzIDogQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtpdGVtc107XG5cbiAgICBpZiAocXVldWUubWF4U2l6ZSA8IDEgfHwgcXVldWUubWF4U2l6ZSA9PT0gSW5maW5pdHkpIHJldHVybjtcblxuICAgIGNvbnN0IG1heENhcCA9IHF1ZXVlLmdldENhcGFjaXR5KCk7XG5cbiAgICBpZiAobWF4Q2FwIDwgdHJhY2tzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfU1BBQ0UoJ3RyYWNrcyBxdWV1ZScsIG1heENhcCwgdHJhY2tzLmxlbmd0aCk7XG4gICAgfVxufTtcblxuZXhwb3J0IHsgVXRpbCB9O1xuIiwgImltcG9ydCB7IFVzZXIsIGVzY2FwZU1hcmtkb3duLCBTbm93Zmxha2VVdGlsLCBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIEFQSVVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFJhd1RyYWNrRGF0YSwgU2VhcmNoUXVlcnlUeXBlLCBUcmFja0pTT04gfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgU2VyaWFsaXplZFR5cGUsIHRyeUludG9UaHVtYm5haWxTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJkZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcblxuZXhwb3J0IHR5cGUgVHJhY2tSZXNvbHZhYmxlID0gVHJhY2sgfCBzdHJpbmcgfCBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIFdpdGhNZXRhZGF0YTxUIGV4dGVuZHMgb2JqZWN0LCBNPiA9IFQgJiB7XG4gICAgbWV0YWRhdGE6IE07XG4gICAgcmVxdWVzdE1ldGFkYXRhKCk6IFByb21pc2U8TT47XG59O1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkVHJhY2sgPSBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT47XG5cbmV4cG9ydCBjbGFzcyBUcmFjazxUID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyBhdXRob3I6IHN0cmluZztcbiAgICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIHB1YmxpYyBkdXJhdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyB2aWV3czogbnVtYmVyO1xuICAgIHB1YmxpYyByZXF1ZXN0ZWRCeTogVXNlciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAgIHB1YmxpYyBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHVibGljIHJhdzogYW55O1xuICAgIHB1YmxpYyBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgICBwcml2YXRlIF9fbWV0YWRhdGE6IFQgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9fcmVxTWV0YWRhdGFGbjogKCkgPT4gUHJvbWlzZTxUIHwgbnVsbD47XG4gICAgcHVibGljIGNsZWFuVGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBicmlkZ2VkRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGJyaWRnZWRUcmFjazogVHJhY2sgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRyYWNrIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgVHJhY2tcbiAgICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllciwgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pIHtcbiAgICAgICAgdGhpcy50aXRsZSA9IGVzY2FwZU1hcmtkb3duKGRhdGEudGl0bGUgPz8gJycpO1xuICAgICAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yID8/ICcnO1xuICAgICAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgICAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsID8/ICcnO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbiA/PyAnJztcbiAgICAgICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICAgICAgdGhpcy5xdWVyeVR5cGUgPSBkYXRhLnF1ZXJ5VHlwZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ZWRCeSA9IGRhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gICAgICAgIHRoaXMucmF3ID0gT2JqZWN0LmFzc2lnbih7fSwgeyBzb3VyY2U6IGRhdGEucmF3Py5zb3VyY2UgPz8gZGF0YS5zb3VyY2UgfSwgZGF0YS5yYXcgPz8gZGF0YSk7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGEgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPSBkYXRhLnJlcXVlc3RNZXRhZGF0YSB8fCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlPFQgfCBudWxsPihudWxsKSk7XG4gICAgICAgIHRoaXMuY2xlYW5UaXRsZSA9IGRhdGEuY2xlYW5UaXRsZSA/PyBVdGlsLmNsZWFuVGl0bGUodGhpcy50aXRsZSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB0aGlzLmxpdmUgPSBkYXRhLmxpdmUgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0TWV0YWRhdGEoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICAgICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YSAhPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZSBpbiB3aGljaCB0aGlzIHRyYWNrIGlzIGxvY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT4gcS50cmFja3Muc29tZSgoYWIpID0+IGFiLmlkID09PSB0aGlzLmlkKSkhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHVyYXRpb25NUygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgbGV0IHRuID0gMTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZHVyYXRpb25cbiAgICAgICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAubWFwKChtLCBpKSA9PiBwYXJzZUludChtKSAqIHRpbWVzKDYwLCBpKSlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb3JkIGh5cGVybGluayByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHRvSHlwZXJsaW5rKCk6IHN0cmluZyAvKiBub3QgdXNpbmcgYFske3N0cmluZ31dKCR7c3RyaW5nfSlgIHlldCAqLyB7XG4gICAgICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJhdyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKGhpZGVQbGF5bGlzdD86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgICAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgICAgICB9IGFzIFRyYWNrSlNPTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVkIHRyYWNrIGRhdGEgdGhhdCBjYW4gYmUgcmVjb25zdHJ1Y3RlZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/IHRoaXMudGh1bWJuYWlsIDogdHJ5SW50b1RodW1ibmFpbFN0cmluZyh0aGlzLnRodW1ibmFpbCksXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIHZpZXdzOiB0aGlzLnZpZXdzID8/IDAsXG4gICAgICAgICAgICByZXF1ZXN0ZWRfYnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpID8/IG51bGwsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBxdWVyeV90eXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogdGhpcy5leHRyYWN0b3I/LmlkZW50aWZpZXIgPz8gbnVsbCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlRyYWNrLFxuICAgICAgICAgICAgJGVuY29kZXJfdmVyc2lvbjogJzcuMC4wLWRldi4xJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIHRyYWNrIGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAgICogQHBhcmFtIHBsYXllciBQbGF5ZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21TZXJpYWxpemVkKHBsYXllcjogUGxheWVyLCBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pIHtcbiAgICAgICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlRyYWNrKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdkYXRhJywgJ1NlcmlhbGl6ZWRUcmFjaycsICdtYWxmb3JtZWQgZGF0YScpO1xuICAgICAgICBjb25zdCB0cmFjayA9IG5ldyBUcmFjayhwbGF5ZXIsIHtcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogZGF0YS5yZXF1ZXN0ZWRfYnlcbiAgICAgICAgICAgICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gZGF0YS5yZXF1ZXN0ZWRfYnkgYXMgQVBJVXNlcjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHBsYXllci5jbGllbnQudXNlcnMucmVzb2x2ZShyZXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpIHJldHVybiBwbGF5ZXIuY2xpZW50LnVzZXJzLmNhY2hlLmdldChyZXMuaWQpITtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIocGxheWVyLmNsaWVudCwgcmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pKClcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBxdWVyeVR5cGU6IGRhdGEucXVlcnlfdHlwZSA/PyB1bmRlZmluZWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJhY2suc2V0TWV0YWRhdGEoZGF0YS5tZXRhZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiZWxvbmdpbmcgcXVldWVzIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmVsb25naW5nUXVldWVzKCkge1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT4gbm9kZS50cmFja3Muc29tZSgodCkgPT4gdC5pZCA9PT0gdGhpcy5pZCkpO1xuXG4gICAgICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyB0cmFjayBzaGFsbCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPik6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBUeXBlVXRpbCB7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcmV0dXJuIFR5cGVVdGlsO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgcHVibGljIHN0YXRpYyBpc0Z1bmN0aW9uKHQ6IHVua25vd24pOiB0IGlzIEZ1bmN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodDogdW5rbm93bik6IHQgaXMgbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc1N0cmluZyh0OiB1bmtub3duKTogdCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNCb29sZWFuKHQ6IHVua25vd24pOiB0IGlzIGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdib29sZWFuJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTnVsbGlzaCh0OiB1bmtub3duKTogdCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHQgPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQXJyYXkodDogdW5rbm93bik6IHQgaXMgdW5rbm93bltdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0Vycm9yKHQ6IHVua25vd24pOiB0IGlzIEVycm9yIHtcbiAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBFcnJvcjtcbiAgICB9XG59XG4iLCAiY29uc3QgRGlzY29yZFBsYXllckVycm9ycyA9IHtcbiAgICBFUlJfT1VUX09GX1NQQUNFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfT1VUX09GX1NQQUNFJyxcbiAgICAgICAgdHlwZTogUmFuZ2VFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGNhcGFjaXR5OiBudW1iZXIsIHRvdGFsOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gTWF4IGNhcGFjaXR5IHJlYWNoZWQgZm9yICR7dGFyZ2V0fSAoQ2FwYWNpdHkgJHtjYXBhY2l0eX0vVG90YWwgJHt0b3RhbH0pYDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgICAgICAgdHlwZTogVHlwZUVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgZXhwZWN0YXRpb246IHN0cmluZywgZm91bmQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBFeHBlY3RlZCAke3RhcmdldH0gdG8gYmUgXCIke2V4cGVjdGF0aW9ufVwiLCByZWNlaXZlZCBcIiR7Zm91bmR9XCJgO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fUkVTVUxUOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fUkVTVUxUJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSAke21lc3NhZ2V9YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PVF9JTVBMRU1FTlRFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT1RfRVhJU1RJTkc6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gJHt0YXJnZXR9IGRvZXMgbm90IGV4aXN0YDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX09VVF9PRl9SQU5HRToge1xuICAgICAgICBuYW1lOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gICAgICAgIHR5cGU6IFJhbmdlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtaW5pbXVtOiBzdHJpbmcsIG1heGltdW06IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWF4aW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcigpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArICdDYW5ub3QgdXNlIGRlc3Ryb3llZCB2b2ljZSBjb25uZWN0aW9uJztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBgICsgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBgICsgJ0V4cGVjdGVkIGEgdm9pY2UgY2hhbm5lbCc7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19SRUNFSVZFUjoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdObyB2b2ljZSByZWNlaXZlciBpcyBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PycpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfRkZNUEVHX0xPQ0FUT1I6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9GRk1QRUdfTE9DQVRPUicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9OT19BVURJT19SRVNPVVJDRToge1xuICAgICAgICBuYW1lOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdFeHBlY3RlZCBhbiBhdWRpbyByZXNvdXJjZScpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTERfUVVFVUU6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRF9RVUVVRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCBxdWV1ZScpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTEQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCcpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfSU5GT19SRVFVSVJFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX0lORk9fUkVRVUlSRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImA7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIEVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX1NFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLnR5cGUubmFtZX1dYCArIFwiRG9uJ3Qga25vdyBob3cgdG8gc2VyaWFsaXplIHRoaXMgZGF0YVwiO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IoKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMudHlwZS5uYW1lfV1gICsgXCJEb24ndCBrbm93IGhvdyB0byBkZXNlcmlhbGl6ZSB0aGlzIGRhdGFcIjtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT04nLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy50eXBlLm5hbWV9XWAgKyBgSWxsZWdhbCBpbnZvY2F0aW9uIG9mICR7dGFyZ2V0fSBob29rLiR7bWVzc2FnZSA/IGAgJHttZXNzYWdlfWAgOiAnJ31gO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfTk9UX0VYSVNUSU5HX01PRFVMRToge1xuICAgICAgICBuYW1lOiAnRVJSX05PVF9FWElTVElOR19NT0RVTEUnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcsIGRlc2NyaXB0aW9uID0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy50eXBlLm5hbWV9XWAgKyBgJHt0YXJnZXR9IG1vZHVsZSBkb2VzIG5vdCBleGlzdC4gSW5zdGFsbCBpdCB3aXRoIFxcYG5wbSBpbnN0YWxsICR7dGFyZ2V0fVxcYC4ke2Rlc2NyaXB0aW9uID8gJyAnICsgZGVzY3JpcHRpb24gOiAnJ31gO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBFUlJfQlJJREdFX0ZBSUxFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX0JSSURHRV9GQUlMRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IoaWQ6IHN0cmluZyB8IG51bGwsIGVycm9yOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy50eXBlLm5hbWV9XWAgKyBgJHtpZCA/IGAoRXh0cmFjdG9yIEV4ZWN1dGlvbiBDb250ZXh0IElEIGlzICR7aWR9KWAgOiAnJ31GYWlsZWQgdG8gYnJpZGdlIHRoaXMgcXVlcnk6XFxuJHtlcnJvcn1gO1xuICAgICAgICB9XG4gICAgfVxufSBhcyBjb25zdDtcblxudHlwZSBGaW5hbEV4Y2VwdGlvbjxPIGV4dGVuZHMgKHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc10+ID0ge1xuICAgIG5hbWU6IE9bJ25hbWUnXTtcbn0gJiBJbnN0YW5jZVR5cGU8T1sndHlwZSddPjtcblxudHlwZSBEaXNjb3JkUGxheWVyRXhjZXB0aW9uID0ge1xuICAgIFtLIGluIGtleW9mIHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzXTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8KHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtLXVsnY3JlYXRlRXJyb3InXT4pID0+IEZpbmFsRXhjZXB0aW9uPCh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS10+O1xufTtcblxuY29uc3QgdGFyZ2V0ID0ge30gYXMgRGlzY29yZFBsYXllckV4Y2VwdGlvbjtcblxuY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPHR5cGVvZiB0YXJnZXQ+ID0ge1xuICAgIGdldCh0YXJnZXQsIHA6IGtleW9mIHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzLCByZWNlaXZlcikge1xuICAgICAgICBjb25zdCBlcnIgPSBEaXNjb3JkUGxheWVyRXJyb3JzW3BdO1xuXG4gICAgICAgIGlmICghZXJyKSByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG5cbiAgICAgICAgcmV0dXJuICguLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgZXJyKVsnY3JlYXRlRXJyb3InXT4pID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IG5ldyBlcnIudHlwZShlcnIuY3JlYXRlRXJyb3IoLi4uYXJncykpO1xuICAgICAgICAgICAgZXhjZXB0aW9uLm5hbWUgPSBlcnIubmFtZTtcblxuICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjtcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgRXJyb3JDb2RlcyA9ICgoKSA9PiB7XG4gICAgdHlwZSBFcnJDb2RlcyA9IHtcbiAgICAgICAgLXJlYWRvbmx5IFtLIGluIGtleW9mIHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzXTogKHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtLXVsnbmFtZSddO1xuICAgIH07XG5cbiAgICBjb25zdCBkaWN0ID0ge30gYXMgRXJyQ29kZXM7XG5cbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gRGlzY29yZFBsYXllckVycm9ycykge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGRpY3RbcHJvcF0gPSBwcm9wO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGRpY3QpO1xufSkoKTtcbmV4cG9ydCBjb25zdCBFeGNlcHRpb25zID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFBsYXlsaXN0LCB0eXBlIFNlcmlhbGl6ZWRUcmFjaywgVHJhY2ssIFNlcmlhbGl6ZWRQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5cbmV4cG9ydCBlbnVtIFNlcmlhbGl6ZWRUeXBlIHtcbiAgICBUcmFjayA9ICd0cmFjaycsXG4gICAgUGxheWxpc3QgPSAncGxheWxpc3QnXG59XG5cbmV4cG9ydCB0eXBlIEVuY29kYWJsZSA9IFNlcmlhbGl6ZWRUcmFjayB8IFNlcmlhbGl6ZWRQbGF5bGlzdDtcblxuY29uc3QgaXNUcmFjayA9IChkYXRhOiBhbnkpOiBkYXRhIGlzIFNlcmlhbGl6ZWRUcmFjayA9PiBkYXRhLiR0eXBlID09PSBTZXJpYWxpemVkVHlwZS5UcmFjaztcbmNvbnN0IGlzUGxheWxpc3QgPSAoZGF0YTogYW55KTogZGF0YSBpcyBTZXJpYWxpemVkUGxheWxpc3QgPT4gZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuUGxheWxpc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoZGF0YTogVHJhY2sgfCBQbGF5bGlzdCB8IGFueSkge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVHJhY2spIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgUGxheWxpc3QpIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRhdGEudG9KU09OKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX1NFUklBTElaQVRJT05fRkFJTEVEKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUocGxheWVyOiBQbGF5ZXIsIGRhdGE6IEVuY29kYWJsZSkge1xuICAgIGlmIChpc1RyYWNrKGRhdGEpKSByZXR1cm4gVHJhY2suZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBkYXRhKTtcbiAgICBpZiAoaXNQbGF5bGlzdChkYXRhKSkgcmV0dXJuIFBsYXlsaXN0LmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG5cbiAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGUoZGF0YTogRW5jb2RhYmxlKSB7XG4gICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgICByZXR1cm4gQnVmZmVyLmZyb20oc3RyKS50b1N0cmluZygnYmFzZTY0Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGUoZGF0YTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3RyID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5SW50b1RodW1ibmFpbFN0cmluZyhkYXRhOiBhbnkpIHtcbiAgICBpZiAoIWRhdGEpIHJldHVybiBudWxsO1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChUeXBlVXRpbC5pc1N0cmluZyhkYXRhKSkgcmV0dXJuIGRhdGE7XG4gICAgICAgIHJldHVybiBkYXRhPy51cmwgPz8gZGF0YT8udGh1bWJuYWlsPy51cmwgPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBQbGF5bGlzdEluaXREYXRhLCBQbGF5bGlzdEpTT04sIFRyYWNrSlNPTiwgVHJhY2tTb3VyY2UgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6ZWRUeXBlLCB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc2VyZGUnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFBsYXlsaXN0ID0gUmV0dXJuVHlwZTxQbGF5bGlzdFsnc2VyaWFsaXplJ10+O1xuXG5leHBvcnQgY2xhc3MgUGxheWxpc3Qge1xuICAgIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcbiAgICBwdWJsaWMgdHJhY2tzOiBUcmFja1tdO1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgICBwdWJsaWMgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gICAgcHVibGljIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gICAgcHVibGljIGF1dGhvcjoge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgcHVibGljIGlkOiBzdHJpbmc7XG4gICAgcHVibGljIHVybDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbiAgICAvKipcbiAgICAgKiBQbGF5bGlzdCBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllclxuICAgICAqIEBwYXJhbSB7UGxheWxpc3RJbml0RGF0YX0gZGF0YSBUaGUgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWVyXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3BsYXllclxuICAgICAgICAgKiBAdHlwZSB7UGxheWVyfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdHJhY2tzIGluIHRoaXMgcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdHJhY2tzXG4gICAgICAgICAqIEB0eXBlIHtUcmFja1tdfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmFja3MgPSBkYXRhLnRyYWNrcyA/PyBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I2F1dGhvclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I2Rlc2NyaXB0aW9uXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRodW1ibmFpbCBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3RodW1ibmFpbFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IHR5cGU6XG4gICAgICAgICAqIC0gYGFsYnVtYFxuICAgICAgICAgKiAtIGBwbGF5bGlzdGBcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdHlwZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc291cmNlIG9mIHRoaXMgcGxheWxpc3Q6XG4gICAgICAgICAqIC0gYHlvdXR1YmVgXG4gICAgICAgICAqIC0gYHNvdW5kY2xvdWRgXG4gICAgICAgICAqIC0gYHNwb3RpZnlgXG4gICAgICAgICAqIC0gYGFyYml0cmFyeWBcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3Qjc291cmNlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNvdXJjZSA9IGRhdGEuc291cmNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjaWRcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3VybFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjcmF3UGxheWxpc3RcbiAgICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgIH1cblxuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgeWllbGQqIHRoaXMudHJhY2tzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnJlZHVjZSgocCwgYykgPT4gcCArIGMuZHVyYXRpb25NUywgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0dGVkIGVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICovXG4gICAgcHVibGljIGdldCBkdXJhdGlvbkZvcm1hdHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dpdGhUcmFja3M9dHJ1ZV0gSWYgaXQgc2hvdWxkIGJ1aWxkIGpzb24gd2l0aCB0cmFja3NcbiAgICAgKiBAcmV0dXJucyB7UGxheWxpc3RKU09OfVxuICAgICAqL1xuICAgIHRvSlNPTih3aXRoVHJhY2tzID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHRodW1ibmFpbDogdGhpcy50aHVtYm5haWwsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHRyYWNrczogW10gYXMgVHJhY2tKU09OW11cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAod2l0aFRyYWNrcykgcGF5bG9hZC50cmFja3MgPSB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0udG9KU09OKHRydWUpKTtcblxuICAgICAgICByZXR1cm4gcGF5bG9hZCBhcyBQbGF5bGlzdEpTT047XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIHRoaXMgcGxheWxpc3QgaW50byByZWNvbnN0cnVjdGFibGUgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS5zZXJpYWxpemUoKSksXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgdGh1bWJuYWlsOiBUeXBlVXRpbC5pc1N0cmluZyh0aGlzLnRodW1ibmFpbCkgPyB0aGlzLnRodW1ibmFpbCA6IHRyeUludG9UaHVtYm5haWxTdHJpbmcodGhpcy50aHVtYm5haWwpLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuUGxheWxpc3QsXG4gICAgICAgICAgICAkZW5jb2Rlcl92ZXJzaW9uOiAnNy4wLjAtZGV2LjEnXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemUgdGhpcyBwbGF5bGlzdCBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgICAqIEBwYXJhbSBwbGF5ZXIgUGxheWVyIGluc3RhbmNlXG4gICAgICogQHBhcmFtIGRhdGEgU2VyaWFsaXplZCBkYXRhXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZChwbGF5ZXI6IFBsYXllciwgZGF0YTogU2VyaWFsaXplZFBsYXlsaXN0KSB7XG4gICAgICAgIGlmIChkYXRhLiR0eXBlICE9PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnZGF0YScsICdTZXJpYWxpemVkUGxheWxpc3QnLCAnbWFsZm9ybWVkIGRhdGEnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGF5bGlzdChwbGF5ZXIsIHtcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICB0cmFja3M6IGRhdGEudHJhY2tzLm1hcCgobSkgPT4gVHJhY2suZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBtKSlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGlzIHBsYXlsaXN0IHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHBsYXlsaXN0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyBwbGF5bGlzdCBzaGFsbCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPik6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVXNlciwgVXNlclJlc29sdmFibGUsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB0eXBlIHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHR5cGUgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgdHlwZSB7IGRvd25sb2FkT3B0aW9ucyB9IGZyb20gJ3l0ZGwtY29yZSc7XG5pbXBvcnQgdHlwZSB7IFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuaW1wb3J0IHR5cGUgeyBJUFJvdGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vdXRpbHMvSVBSb3RhdG9yJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHR5cGUgeyBCcmlkZ2VQcm92aWRlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJzTmFtZSA9IGtleW9mIFF1ZXVlRmlsdGVycztcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJTZWFyY2hSZXN1bHQge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICAgIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICAgIGJhc3Nib29zdD86IGJvb2xlYW47XG4gICAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAgICc4RCc/OiBib29sZWFuO1xuICAgIHZhcG9yd2F2ZT86IGJvb2xlYW47XG4gICAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgICBwaGFzZXI/OiBib29sZWFuO1xuICAgIHRyZW1vbG8/OiBib29sZWFuO1xuICAgIHZpYnJhdG8/OiBib29sZWFuO1xuICAgIHJldmVyc2U/OiBib29sZWFuO1xuICAgIHRyZWJsZT86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gICAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICAgIHN1cnJvdW5kaW5nPzogYm9vbGVhbjtcbiAgICBwdWxzYXRvcj86IGJvb2xlYW47XG4gICAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICAgIGthcmFva2U/OiBib29sZWFuO1xuICAgIGZsYW5nZXI/OiBib29sZWFuO1xuICAgIGdhdGU/OiBib29sZWFuO1xuICAgIGhhYXM/OiBib29sZWFuO1xuICAgIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgICBtb25vPzogYm9vbGVhbjtcbiAgICBtc3Rscj86IGJvb2xlYW47XG4gICAgbXN0cnI/OiBib29sZWFuO1xuICAgIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICAgIGV4cGFuZGVyPzogYm9vbGVhbjtcbiAgICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gICAgY2hvcnVzPzogYm9vbGVhbjtcbiAgICBjaG9ydXMyZD86IGJvb2xlYW47XG4gICAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICAgIGZhZGVpbj86IGJvb2xlYW47XG4gICAgZGltPzogYm9vbGVhbjtcbiAgICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgICBsb2ZpPzogYm9vbGVhbjtcbiAgICBzaWxlbmNlcmVtb3ZlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPSAnc291bmRjbG91ZCcgfCAneW91dHViZScgfCAnc3BvdGlmeScgfCAnYXBwbGVfbXVzaWMnIHwgJ2FyYml0cmFyeSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF3VHJhY2tEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvclxuICAgICAqL1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGh1bWJuYWlsXG4gICAgICovXG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uXG4gICAgICovXG4gICAgZHVyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICAgKi9cbiAgICB2aWV3czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0XG4gICAgICovXG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgICAvKipcbiAgICAgKiBUaGUgc291cmNlXG4gICAgICovXG4gICAgc291cmNlPzogVHJhY2tTb3VyY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZ2luZVxuICAgICAqL1xuICAgIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgLyoqXG4gICAgICogSWYgdGhpcyB0cmFjayBpcyBsaXZlXG4gICAgICovXG4gICAgbGl2ZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkYXRhXG4gICAgICovXG4gICAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgdHlwZVxuICAgICAqL1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VyYWxpc2VkIHRpdGxlXG4gICAgICovXG4gICAgY2xlYW5UaXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGltZSBpbiBkYXlzXG4gICAgICovXG4gICAgZGF5czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gaG91cnNcbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gbWludXRlc1xuICAgICAqL1xuICAgIG1pbnV0ZXM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaW1lIGluIHNlY29uZHNcbiAgICAgKi9cbiAgICBzZWNvbmRzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiBpdCBzaG91bGQgcmVuZGVyIHRpbWUgY29kZXNcbiAgICAgKi9cbiAgICB0aW1lY29kZXM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAgICAgKi9cbiAgICBsZW5ndGg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGJhciBsZW5ndGhcbiAgICAgKi9cbiAgICBsZWZ0Q2hhcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWxhcHNlZCB0aW1lIHRyYWNrXG4gICAgICovXG4gICAgcmlnaHRDaGFyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICAgICAqL1xuICAgIHNlcGFyYXRvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHRpbWVzdGFtcCBhbmQgbGluZVxuICAgICAqL1xuICAgIGluZGljYXRvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kaWNhdG9yXG4gICAgICovXG4gICAgcXVldWU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICogVGhpcyBjYW4gYmUgb25lIG9mOlxuICogLSBBVVRPXG4gKiAtIFlPVVRVQkVcbiAqIC0gWU9VVFVCRV9QTEFZTElTVFxuICogLSBTT1VORENMT1VEX1RSQUNLXG4gKiAtIFNPVU5EQ0xPVURfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRFxuICogLSBTUE9USUZZX1NPTkdcbiAqIC0gU1BPVElGWV9BTEJVTVxuICogLSBTUE9USUZZX1BMQVlMSVNUXG4gKiAtIFNQT1RJRllfU0VBUkNIXG4gKiAtIEZBQ0VCT09LXG4gKiAtIFZJTUVPXG4gKiAtIEFSQklUUkFSWVxuICogLSBSRVZFUkJOQVRJT05cbiAqIC0gWU9VVFVCRV9TRUFSQ0hcbiAqIC0gWU9VVFVCRV9WSURFT1xuICogLSBTT1VORENMT1VEX1NFQVJDSFxuICogLSBBUFBMRV9NVVNJQ19TT05HXG4gKiAtIEFQUExFX01VU0lDX0FMQlVNXG4gKiAtIEFQUExFX01VU0lDX1BMQVlMSVNUXG4gKiAtIEFQUExFX01VU0lDX1NFQVJDSFxuICogLSBGSUxFXG4gKiAtIEFVVE9fU0VBUkNIXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgICBBVVRPOiAnYXV0bycsXG4gICAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICAgIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVURfVFJBQ0s6ICdzb3VuZGNsb3VkVHJhY2snLFxuICAgIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICAgIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgICBTUE9USUZZX1NPTkc6ICdzcG90aWZ5U29uZycsXG4gICAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gICAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gICAgU1BPVElGWV9TRUFSQ0g6ICdzcG90aWZ5U2VhcmNoJyxcbiAgICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgICBWSU1FTzogJ3ZpbWVvJyxcbiAgICBBUkJJVFJBUlk6ICdhcmJpdHJhcnknLFxuICAgIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gICAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgICBZT1VUVUJFX1ZJREVPOiAneW91dHViZVZpZGVvJyxcbiAgICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICAgIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gICAgQVBQTEVfTVVTSUNfQUxCVU06ICdhcHBsZU11c2ljQWxidW0nLFxuICAgIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgICBGSUxFOiAnZmlsZScsXG4gICAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJFdmVudHMge1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWUsIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gYW55O1xufVxuXG5leHBvcnQgY29uc3QgUGxheWVyRXZlbnQgPSB7XG4gICAgZGVidWc6ICdkZWJ1ZycsXG4gICAgRGVidWc6ICdkZWJ1ZycsXG4gICAgZXJyb3I6ICdlcnJvcicsXG4gICAgRXJyb3I6ICdlcnJvcicsXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICAgIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJ1xufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBsYXllckV2ZW50ID0gKHR5cGVvZiBQbGF5ZXJFdmVudClba2V5b2YgdHlwZW9mIFBsYXllckV2ZW50XTtcblxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIElmIHRoaXMgcGxheSB3YXMgdHJpZ2dlcmVkIGZvciBmaWx0ZXJzIHVwZGF0ZVxuICAgICAqL1xuICAgIGZpbHRlcnNVcGRhdGU/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEZGbXBlZyBhcmdzIHBhc3NlZCB0byBlbmNvZGVyXG4gICAgICovXG4gICAgZW5jb2RlckFyZ3M/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBUaW1lIHRvIHNlZWsgdG8gYmVmb3JlIHBsYXlpbmdcbiAgICAgKi9cbiAgICBzZWVrPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIGl0IHNob3VsZCBzdGFydCBwbGF5aW5nIHRoZSBwcm92aWRlZCB0cmFjayBpbW1lZGlhdGVseVxuICAgICAqL1xuICAgIGltbWVkaWF0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RXh0cmFjdG9yU2VhcmNoID0gYGV4dDoke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHdobyByZXF1ZXN0ZWQgdGhpcyBzZWFyY2hcbiAgICAgKi9cbiAgICByZXF1ZXN0ZWRCeT86IFVzZXJSZXNvbHZhYmxlO1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICAgICAqL1xuICAgIHNlYXJjaEVuZ2luZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgdGhlIGV4dHJhY3RvcnMgdG8gYmxvY2tcbiAgICAgKi9cbiAgICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBJZiBpdCBzaG91bGQgaWdub3JlIHF1ZXJ5IGNhY2hlIGxvb2t1cFxuICAgICAqL1xuICAgIGlnbm9yZUNhY2hlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmVxdWVzdE9wdGlvbnM/OiBhbnk7XG4gICAgLyoqXG4gICAgICogRmFsbGJhY2sgc2VhcmNoIGVuZ2luZSB0byB1c2VcbiAgICAgKi9cbiAgICBmYWxsYmFja1NlYXJjaEVuZ2luZT86ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcbn1cblxuLyoqXG4gKiBUaGUgcXVldWUgcmVwZWF0IG1vZGUuIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gT0ZGXG4gKiAtIFRSQUNLXG4gKiAtIFFVRVVFXG4gKiAtIEFVVE9QTEFZXG4gKi9cbmV4cG9ydCBlbnVtIFF1ZXVlUmVwZWF0TW9kZSB7XG4gICAgLyoqXG4gICAgICogRGlzYWJsZSByZXBlYXQgbW9kZS5cbiAgICAgKi9cbiAgICBPRkYgPSAwLFxuICAgIC8qKlxuICAgICAqIFJlcGVhdCB0aGUgY3VycmVudCB0cmFjay5cbiAgICAgKi9cbiAgICBUUkFDSyA9IDEsXG4gICAgLyoqXG4gICAgICogUmVwZWF0IHRoZSBlbnRpcmUgcXVldWUuXG4gICAgICovXG4gICAgUVVFVUUgPSAyLFxuICAgIC8qKlxuICAgICAqIFdoZW4gbGFzdCB0cmFjayBlbmRzLCBwbGF5IHNpbWlsYXIgdHJhY2tzIGluIHRoZSBmdXR1cmUgaWYgcXVldWUgaXMgZW1wdHkuXG4gICAgICovXG4gICAgQVVUT1BMQVkgPSAzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWxpc3RJbml0RGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrcyBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICovXG4gICAgdHJhY2tzOiBUcmFja1tdO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGh1bWJuYWlsXG4gICAgICovXG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHR5cGU6IGBhbGJ1bWAgfCBgcGxheWxpc3RgXG4gICAgICovXG4gICAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHNvdXJjZVxuICAgICAqL1xuICAgIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgICAqL1xuICAgIGF1dGhvcjoge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXV0aG9yIHVybFxuICAgICAgICAgKi9cbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IHBsYXlsaXN0IGRhdGFcbiAgICAgKi9cbiAgICByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2tKU09OIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgaWRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayB0aXRsZVxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgYXV0aG9yXG4gICAgICovXG4gICAgYXV0aG9yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIHVybFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayB0aHVtYm5haWxcbiAgICAgKi9cbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgZHVyYXRpb25cbiAgICAgKi9cbiAgICBkdXJhdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkdXJhdGlvbiBpbiBtc1xuICAgICAqL1xuICAgIGR1cmF0aW9uTVM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgdmlld3NcbiAgICAgKi9cbiAgICB2aWV3czogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGlkIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHJlcXVlc3RlZEJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IGluZm8gKGlmIGFueSlcbiAgICAgKi9cbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0SlNPTjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEpTT04ge1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IGRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGh1bWJuYWlsXG4gICAgICovXG4gICAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHR5cGU6IGBhbGJ1bWAgfCBgcGxheWxpc3RgXG4gICAgICovXG4gICAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIHNvdXJjZVxuICAgICAqL1xuICAgIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgICAqL1xuICAgIGF1dGhvcjoge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXV0aG9yIHVybFxuICAgICAgICAgKi9cbiAgICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2tzIGRhdGEgKGlmIGFueSlcbiAgICAgKi9cbiAgICB0cmFja3M6IFRyYWNrSlNPTltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllckluaXRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gYHl0ZGwtY29yZWAuXG4gICAgICovXG4gICAgeXRkbE9wdGlvbnM/OiBkb3dubG9hZE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gdGltZW91dFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25UaW1lb3V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gbXMgdG8gcmUtbW9uaXRvciBldmVudCBsb29wIGxhZ1xuICAgICAqL1xuICAgIGxhZ01vbml0b3I/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogUHJldmVudCB2b2ljZSBzdGF0ZSBoYW5kbGVyIGZyb20gYmVpbmcgb3ZlcnJpZGRlblxuICAgICAqL1xuICAgIGxvY2tWb2ljZVN0YXRlSGFuZGxlcj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgcXVlcnlpbmcgbWV0YWRhdGEgZnJvbVxuICAgICAqL1xuICAgIGJsb2NrRXh0cmFjdG9ycz86IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHN0cmVhbWluZyBmcm9tXG4gICAgICovXG4gICAgYmxvY2tTdHJlYW1Gcm9tPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogUXVlcnkgY2FjaGUgcHJvdmlkZXJcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHF1ZXJ5Q2FjaGU/OiBRdWVyeUNhY2hlUHJvdmlkZXI8YW55PiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWdub3JlIHBsYXllciBpbnN0YW5jZVxuICAgICAqL1xuICAgIGlnbm9yZUluc3RhbmNlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBVc2UgbGVnYWN5IHZlcnNpb24gb2YgZmZtcGVnXG4gICAgICovXG4gICAgdXNlTGVnYWN5RkZtcGVnPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTZXQgYnJpZGdlIHByb3ZpZGVyXG4gICAgICovXG4gICAgYnJpZGdlUHJvdmlkZXI/OiBCcmlkZ2VQcm92aWRlcjtcbiAgICAvKipcbiAgICAgKiBJUCByb3RhdG9yIGNvbmZpZ1xuICAgICAqL1xuICAgIGlwY29uZmlnPzogSVBSb3RhdGlvbkNvbmZpZztcbiAgICAvKipcbiAgICAgKiBTa2lwIGZmbXBlZyBwcm9jZXNzIHdoZW4gcG9zc2libGVcbiAgICAgKi9cbiAgICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvYmUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDUwMDAuXG4gICAgICovXG4gICAgcHJvYmVUaW1lb3V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBmZm1wZWcgcGF0aFxuICAgICAqL1xuICAgIGZmbXBlZ1BhdGg/OiBzdHJpbmc7XG59XG4iLCAiaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUXVlcnlFeHRyYWN0b3JTZWFyY2gsIFF1ZXJ5VHlwZSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUmVzdWx0RGF0YSB7XG4gICAgcXVlcnk6IHN0cmluZztcbiAgICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCB8IG51bGw7XG4gICAgZXh0cmFjdG9yPzogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gICAgcGxheWxpc3Q/OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzPzogVHJhY2tbXTtcbiAgICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgU2VhcmNoUmVzdWx0IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyLCBwcml2YXRlIF9kYXRhOiBTZWFyY2hSZXN1bHREYXRhKSB7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgICAgICAgdHJhY2suZXh0cmFjdG9yID8/PSB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgICAgICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPz89IF9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRRdWVyeVR5cGUodHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2gpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5xdWVyeVR5cGUgPSB0eXBlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UmVxdWVzdGVkQnkodXNlcjogVXNlcikge1xuICAgICAgICB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA9IHVzZXI7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RXh0cmFjdG9yKGV4dHJhY3RvcjogQmFzZUV4dHJhY3Rvcikge1xuICAgICAgICB0aGlzLl9kYXRhLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICAgICAgICB0cmFjay5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VHJhY2tzKHRyYWNrczogVHJhY2tbXSkge1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcyA9IHRyYWNrcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5xdWVyeSA9IHF1ZXJ5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UGxheWxpc3QocGxheWxpc3Q6IFBsYXlsaXN0KSB7XG4gICAgICAgIHRoaXMuX2RhdGEucGxheWxpc3QgPSBwbGF5bGlzdDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWFyY2ggcXVlcnkgdHlwZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVlcnlUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeVR5cGUgfHwgUXVlcnlUeXBlLkFVVE87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXh0cmFjdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5leHRyYWN0b3IgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5bGlzdCByZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBsYXlsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5wbGF5bGlzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFja3MgcmVzdWx0XG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmFja3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnRyYWNrcyB8fCBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0ZWQgYnlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlcXVlc3RlZEJ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5yZXF1ZXN0ZWRCeSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlLWV4ZWN1dGUgdGhpcyBzZWFyY2hcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLnNlYXJjaCh0aGlzLnF1ZXJ5LCB7XG4gICAgICAgICAgICBzZWFyY2hFbmdpbmU6IHRoaXMucXVlcnlUeXBlLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnkhXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBpcyBlbXB0eVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMudHJhY2tzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIHNlYXJjaCByZXN1bHQgaGFzIHBsYXlsaXN0XG4gICAgICovXG4gICAgcHVibGljIGhhc1BsYXlsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5bGlzdCAhPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgdHJhY2tzXG4gICAgICovXG4gICAgcHVibGljIGhhc1RyYWNrcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNlYXJjaFxuICAgICAqL1xuICAgIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogdGhpcy5xdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5VHlwZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICAgICAgICBwbGF5bGlzdDogdGhpcy5wbGF5bGlzdD8udG9KU09OKGZhbHNlKSB8fCBudWxsLFxuICAgICAgICAgICAgdHJhY2tzOiB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0udG9KU09OKHRydWUpKSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogdGhpcy5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgbnVsbCxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5Py50b0pTT04oKSB8fCBudWxsXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEZpbHRlcnNOYW1lIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuXG5jb25zdCBiYXNzID0gKGc6IG51bWJlcikgPT4gYGJhc3M9Zz0ke2d9OmY9MTEwOnc9MC4zYDtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvRmlsdGVycyB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICByZXR1cm4gQXVkaW9GaWx0ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZmlsdGVyczogUmVjb3JkPEZpbHRlcnNOYW1lLCBzdHJpbmc+ID0ge1xuICAgICAgICBiYXNzYm9vc3RfbG93OiBiYXNzKDE1KSxcbiAgICAgICAgYmFzc2Jvb3N0OiBiYXNzKDIwKSxcbiAgICAgICAgYmFzc2Jvb3N0X2hpZ2g6IGJhc3MoMzApLFxuICAgICAgICAnOEQnOiAnYXB1bHNhdG9yPWh6PTAuMDknLFxuICAgICAgICB2YXBvcndhdmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC44JyxcbiAgICAgICAgbmlnaHRjb3JlOiAnYXJlc2FtcGxlPTQ4MDAwLGFzZXRyYXRlPTQ4MDAwKjEuMjUnLFxuICAgICAgICBsb2ZpOiAnYXJlc2FtcGxlPTQ4MDAwLGFzZXRyYXRlPTQ4MDAwKjAuOSxleHRyYXN0ZXJlbz1tPTIuNTpjPWRpc2FibGVkJyxcbiAgICAgICAgcGhhc2VyOiAnYXBoYXNlcj1pbl9nYWluPTAuNCcsXG4gICAgICAgIHRyZW1vbG86ICd0cmVtb2xvJyxcbiAgICAgICAgdmlicmF0bzogJ3ZpYnJhdG89Zj02LjUnLFxuICAgICAgICByZXZlcnNlOiAnYXJldmVyc2UnLFxuICAgICAgICB0cmVibGU6ICd0cmVibGU9Zz01JyxcbiAgICAgICAgbm9ybWFsaXplcjI6ICdkeW5hdWRub3JtPWc9MTAxJyxcbiAgICAgICAgbm9ybWFsaXplcjogJ2Fjb21wcmVzc29yJyxcbiAgICAgICAgc3Vycm91bmRpbmc6ICdzdXJyb3VuZCcsXG4gICAgICAgIHB1bHNhdG9yOiAnYXB1bHNhdG9yPWh6PTEnLFxuICAgICAgICBzdWJib29zdDogJ2FzdWJib29zdCcsXG4gICAgICAgIGthcmFva2U6ICdzdGVyZW90b29scz1tbGV2PTAuMDMnLFxuICAgICAgICBmbGFuZ2VyOiAnZmxhbmdlcicsXG4gICAgICAgIGdhdGU6ICdhZ2F0ZScsXG4gICAgICAgIGhhYXM6ICdoYWFzJyxcbiAgICAgICAgbWNvbXBhbmQ6ICdtY29tcGFuZCcsXG4gICAgICAgIG1vbm86ICdwYW49bW9ub3xjMD0uNSpjMCsuNSpjMScsXG4gICAgICAgIG1zdGxyOiAnc3RlcmVvdG9vbHM9bW9kZT1tcz5scicsXG4gICAgICAgIG1zdHJyOiAnc3RlcmVvdG9vbHM9bW9kZT1tcz5ycicsXG4gICAgICAgIGNvbXByZXNzb3I6ICdjb21wYW5kPXBvaW50cz0tODAvLTEwNXwtNjIvLTgwfC0xNS40Ly0xNS40fDAvLTEyfDIwLy03LjYnLFxuICAgICAgICBleHBhbmRlcjogJ2NvbXBhbmQ9YXR0YWNrcz0wOnBvaW50cz0tODAvLTE2OXwtNTQvLTgwfC00OS41Ly02NC42fC00MS4xLy00MS4xfC0yNS44Ly0xNXwtMTAuOC8tNC41fDAvMHwyMC84LjMnLFxuICAgICAgICBzb2Z0bGltaXRlcjogJ2NvbXBhbmQ9YXR0YWNrcz0wOnBvaW50cz0tODAvLTgwfC0xMi40Ly0xMi40fC02Ly04fDAvLTYuOHwyMC8tMi44JyxcbiAgICAgICAgY2hvcnVzOiAnY2hvcnVzPTAuNzowLjk6NTU6MC40OjAuMjU6MicsXG4gICAgICAgIGNob3J1czJkOiAnY2hvcnVzPTAuNjowLjk6NTB8NjA6MC40fDAuMzI6MC4yNXwwLjQ6MnwxLjMnLFxuICAgICAgICBjaG9ydXMzZDogJ2Nob3J1cz0wLjU6MC45OjUwfDYwfDQwOjAuNHwwLjMyfDAuMzowLjI1fDAuNHwwLjM6MnwyLjN8MS4zJyxcbiAgICAgICAgZmFkZWluOiAnYWZhZGU9dD1pbjpzcz0wOmQ9MTAnLFxuICAgICAgICBkaW06IGBhZmZ0ZmlsdD1cIidyZWFsPXJlICogKDEtY2xpcCgoYi9uYikqYiwwLDEpKSc6aW1hZz0naW0gKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJ1wiYCxcbiAgICAgICAgZWFycmFwZTogJ2NoYW5uZWxzcGxpdCxzaWRlY2hhaW5nYXRlPWxldmVsX2luPTY0JyxcbiAgICAgICAgc2lsZW5jZXJlbW92ZTogJ3NpbGVuY2VyZW1vdmU9MTowOi01MGRCJ1xuICAgIH07XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldDxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyc1tuYW1lXSA/PyBuYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgICAgICByZXR1cm4gbmFtZSBpbiB0aGlzLmZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmFibGVJdGVyYXRvcjx7IG5hbWU6IEZpbHRlcnNOYW1lOyB2YWx1ZTogc3RyaW5nIH0+IHtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5maWx0ZXJzKSkge1xuICAgICAgICAgICAgeWllbGQgeyBuYW1lOiBrIGFzIEZpbHRlcnNOYW1lLCB2YWx1ZTogdiBhcyBzdHJpbmcgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IG5hbWVzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKSBhcyBGaWx0ZXJzTmFtZVtdO1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBwdWJsaWMgc3RhdGljIGdldCBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAoKG0pID0+ICh0aGlzIGFzIGFueSlbbV0pLmpvaW4oJywnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGZmbXBlZyBhcmdzIGZyb20gdGhlIHNwZWNpZmllZCBmaWx0ZXJzIG5hbWVcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgbmFtZVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGU8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihmaWx0ZXJzPzogKEsgfCBzdHJpbmcpW10pIHtcbiAgICAgICAgaWYgKCFmaWx0ZXJzIHx8ICFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gZmlsdGVyc1xuICAgICAgICAgICAgLmZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IHRoaXMuZ2V0KG0gYXMgSykpXG4gICAgICAgICAgICAuam9pbignLCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgYXVkaW8gZmlsdGVyXG4gICAgICogQHBhcmFtIGZpbHRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbHRlclxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgZmZtcGVnIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZShmaWx0ZXJOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJzW2ZpbHRlck5hbWUgYXMgRmlsdGVyc05hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBtdWx0aXBsZSBhdWRpbyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnNBcnJheSBBcnJheSBvZiBmaWx0ZXJzIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBuYW1lIGFuZCBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGVmaW5lQnVsayhmaWx0ZXJzQXJyYXk6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSkge1xuICAgICAgICBmaWx0ZXJzQXJyYXkuZm9yRWFjaCgoYXJyKSA9PiB0aGlzLmRlZmluZShhcnIubmFtZSwgYXJyLnZhbHVlKSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IERlZmF1bHRMaXN0ZW5lciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBMaXN0ZW5lclNpZ25hdHVyZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEwgZXh0ZW5kcyBMaXN0ZW5lclNpZ25hdHVyZTxMPiA9IERlZmF1bHRMaXN0ZW5lcj4gZXh0ZW5kcyBFdmVudEVtaXR0ZXI8TD4ge1xuICAgICNoYXNEZWJ1Z2dlciA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVxdWlyZWRFdmVudHM6IEFycmF5PGtleW9mIEw+ID0gW10pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb248SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5hZGRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHVibGljIG9mZjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9mZihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUxpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnM8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU/OiBLKSB7XG4gICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgICAgIHJldHVybiBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMobmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8TFtLXT4pIHtcbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZWRFdmVudHMuaW5jbHVkZXMobmFtZSkgJiYgIXRoaXMuZXZlbnROYW1lcygpLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvciguLi5hcmdzKTtcbiAgICAgICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAgICAgICBgTm8gZXZlbnQgbGlzdGVuZXIgZm91bmQgZm9yIGV2ZW50IFwiJHtTdHJpbmcobmFtZSl9XCIuIEV2ZW50cyAke3RoaXMucmVxdWlyZWRFdmVudHMubWFwKChtKSA9PiBgXCIke1N0cmluZyhtKX1cImApLmpvaW4oJywgJyl9IG11c3QgaGF2ZSBldmVudCBsaXN0ZW5lcnMuYCxcbiAgICAgICAgICAgICAgICAnVW5oYW5kbGVkRXZlbnRzV2FybmluZydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIuZW1pdChuYW1lLCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0RlYnVnZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaGFzRGVidWdnZXI7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFBsYXllckV2ZW50cywgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuLi9xdWV1ZSc7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvclN0cmVhbWFibGUgPVxuICAgIHwgUmVhZGFibGVcbiAgICB8IHN0cmluZ1xuICAgIHwge1xuICAgICAgICAgICRmbXQ6IHN0cmluZztcbiAgICAgICAgICBzdHJlYW06IFJlYWRhYmxlO1xuICAgICAgfTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpZGVudGlmaWVyID0gJ2NvbS5kaXNjb3JkLXBsYXllci5leHRyYWN0b3InO1xuXG4gICAgLyoqXG4gICAgICogUHJpb3JpdHkgb2YgdGhpcyBleHRyYWN0b3IuIEhpZ2hlciB2YWx1ZSBtZWFucyBoaWdoZXIgcHJpb3JpdHkgKHdpbGwgYmUgZXhlY3V0ZWQgZmlyc3QpLlxuICAgICAqL1xuICAgIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcXVlcnkgcHJvdG9jb2xzIHRoYXQgdGhpcyBleHRyYWN0b3Igc3VwcG9ydHMuXG4gICAgICovXG4gICAgcHVibGljIHByb3RvY29sczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJ1aWxkIHF1ZXJ5IGZvclxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+IGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdG9yIGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBwdWJsaWMgb3B0aW9uczogVCA9IDxUPnt9KSB7fVxuXG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBCYXNlRXh0cmFjdG9yKS5pZGVudGlmaWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY29uZmlndXJlcyB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWNvbmZpZ3VyZShvcHRpb25zOiBUKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAgICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgICAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBpbmNvbWluZyBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUocXVlcnk6IHN0cmluZywgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdm9pZCB0eXBlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyZWFtIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc3RyZWFtKGluZm86IFRyYWNrKTogUHJvbWlzZTxFeHRyYWN0b3JTdHJlYW1hYmxlPiB7XG4gICAgICAgIHZvaWQgaW5mbztcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uc3RyZWFtKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIGdpdmVuIHF1ZXJ5XG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKHF1ZXJ5OiBzdHJpbmcsIGNvbnRleHQ6IEV4dHJhY3RvclNlYXJjaENvbnRleHQpOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICAgICAgdm9pZCBjb250ZXh0O1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfSU1QTEVNRU5URUQoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5oYW5kbGUoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCByZWxhdGVkIHRyYWNrcyBmb3IgdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayBzb3VyY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRlZFRyYWNrcyh0cmFjazogVHJhY2ssIGhpc3Rvcnk6IEd1aWxkUXVldWVIaXN0b3J5KTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgdHJhY2s7XG4gICAgICAgIHZvaWQgaGlzdG9yeTtcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZ2V0UmVsYXRlZFRyYWNrcygpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzdHJlYW0gbWlkZGxld2FyZSB0byBoYW5kbGUgc3RyZWFtcyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW5jb21pbmcgc3RyZWFtXG4gICAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlUG9zdFN0cmVhbShzdHJlYW06IFJlYWRhYmxlLCBuZXh0OiBOZXh0RnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5leHQobnVsbCwgc3RyZWFtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBkaXNwYXRjaFxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAgICovXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIFBsYXllckV2ZW50cz4oZXZlbnQ6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZXh0cmFjdG9yIHJlc3BvbnNlXG4gICAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsLCB0cmFja3M6IFRyYWNrW10gPSBwbGF5bGlzdD8udHJhY2tzIHx8IFtdKTogRXh0cmFjdG9ySW5mbyB7XG4gICAgICAgIHJldHVybiB7IHBsYXlsaXN0OiBwbGF5bGlzdCB8fCBudWxsLCB0cmFja3MgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElQIHJvdGF0b3IgaW5zdGFuY2UsIGlmIGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm91dGVQbGFubmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5yb3V0ZVBsYW5uZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBmbGFnIHRvIGluZGljYXRlIGBEZW11eGFibGVgIHN0cmVhbSBzdXBwb3J0IGZvciBgb3B1c2AvYG9nZy9vcHVzYC9gd2VibS9vcHVzYCBmb3JtYXRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VwcG9ydHNEZW11eCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5jb250ZXh0LnBsYXllci5vcHRpb25zLnNraXBGRm1wZWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN0cmVhbSBleHRyYWN0aW9uIGZvciBhbm90aGVyIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYnJpZGdlXG4gICAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBicmlkZ2UodHJhY2s6IFRyYWNrLCBzb3VyY2VFeHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsKTogUHJvbWlzZTxFeHRyYWN0b3JTdHJlYW1hYmxlIHwgbnVsbD4ge1xuICAgICAgICB2b2lkIHNvdXJjZUV4dHJhY3RvcjtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXh0RnVuY3Rpb24gPSAoZXJyb3I/OiBFcnJvciB8IG51bGwsIHN0cmVhbT86IFJlYWRhYmxlKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckluZm8ge1xuICAgIHBsYXlsaXN0OiBQbGF5bGlzdCB8IG51bGw7XG4gICAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICAgIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsO1xuICAgIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gICAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbiAgICBwcm90b2NvbD86IHN0cmluZyB8IG51bGw7XG59XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciwgRXh0cmFjdG9yU3RyZWFtYWJsZSB9IGZyb20gJy4vQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuLi9ob29rcyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBrbm93bkV4dHJhY3RvcktleXMgPSBbXG4gICAgJ1Nwb3RpZnlFeHRyYWN0b3InLFxuICAgICdBcHBsZU11c2ljRXh0cmFjdG9yJyxcbiAgICAnU291bmRDbG91ZEV4dHJhY3RvcicsXG4gICAgJ1lvdVR1YmVFeHRyYWN0b3InLFxuICAgICdWaW1lb0V4dHJhY3RvcicsXG4gICAgJ1JldmVyYm5hdGlvbkV4dHJhY3RvcicsXG4gICAgJ0F0dGFjaG1lbnRFeHRyYWN0b3InXG5dIGFzIGNvbnN0O1xuY29uc3Qga25vd25FeHRyYWN0b3JMaWIgPSAnQGRpc2NvcmQtcGxheWVyL2V4dHJhY3Rvcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvckxvYWRlck9wdGlvbkRpY3QgPSB7XG4gICAgLy8gQHRzLWlnbm9yZSB0eXBlc1xuICAgIFtLIGluICh0eXBlb2Yga25vd25FeHRyYWN0b3JLZXlzKVtudW1iZXJdXT86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgaW1wb3J0KCdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJylbS10+WzFdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JTZXNzaW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGF0dGVtcHRlZEV4dHJhY3RvcnM6IFNldDxzdHJpbmc+O1xuICAgIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IFNldDxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cyB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgcmVnaXN0ZXJlZFxuICAgICAqL1xuICAgIHJlZ2lzdGVyZWQ6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHVucmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIGV4dHJhY3RvciB3YXMgdW5yZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHVucmVnaXN0ZXJlZFxuICAgICAqL1xuICAgIHVucmVnaXN0ZXJlZDogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgYWN0aXZhdGVkXG4gICAgICovXG4gICAgYWN0aXZhdGU6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgZGVhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBkZWFjdGl2YXRlOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBmYWlscyB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgZGVhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBlcnJvcjogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciwgZXJyb3I6IEVycm9yKSA9PiB1bmtub3duO1xufVxuXG5leHBvcnQgY2xhc3MgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCBleHRlbmRzIFBsYXllckV2ZW50c0VtaXR0ZXI8RXh0cmFjdG9yRXhlY3V0aW9uRXZlbnRzPiB7XG4gICAgLyoqXG4gICAgICogVGhlIGV4dHJhY3RvcnMgc3RvcmVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcmUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEJhc2VFeHRyYWN0b3I+KCk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8RXh0cmFjdG9yU2Vzc2lvbj4oKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHtcbiAgICAgICAgc3VwZXIoWydlcnJvciddKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGlkXG4gICAgICovXG4gICAgcHVibGljIGdldEV4ZWN1dGlvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbnN1bWUoKT8uaWQgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGRlZmF1bHQgZXh0cmFjdG9ycyBmcm9tIGBAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBsb2FkRGVmYXVsdChmaWx0ZXI/OiAoZXh0OiAodHlwZW9mIGtub3duRXh0cmFjdG9yS2V5cylbbnVtYmVyXSkgPT4gYm9vbGVhbiB8IG51bGwsIG9wdGlvbnM/OiBFeHRyYWN0b3JMb2FkZXJPcHRpb25EaWN0KSB7XG4gICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IFV0aWwuaW1wb3J0KGtub3duRXh0cmFjdG9yTGliKTtcbiAgICAgICAgaWYgKG1vZC5lcnJvcikgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBtb2QuZXJyb3IgYXMgRXJyb3IgfTtcblxuICAgICAgICAoZmlsdGVyID8ga25vd25FeHRyYWN0b3JLZXlzLmZpbHRlcihmaWx0ZXIpIDoga25vd25FeHRyYWN0b3JLZXlzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghbW9kLm1vZHVsZVtrZXldKSByZXR1cm47XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHR5cGVzXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyKDx0eXBlb2YgQmFzZUV4dHJhY3Rvcj5tb2QubW9kdWxlW2tleV0sIG9wdGlvbnM/LltrZXldIHx8IHt9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZXJyb3I6IG51bGwgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBpZiB0aGUgZ2l2ZW4gZXh0cmFjdG9yIGlzIHJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIGlkZW50aWZpZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNSZWdpc3RlcmVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5oYXMoaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgcmVnaXN0ZXJlZCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGV4dHJhY3RvciB0byBnZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQoaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gcmVnaXN0ZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHN1cHBsaWVkIHRvIHRoZSBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXI8TyBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+PihfZXh0cmFjdG9yOiBULCBvcHRpb25zOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VD5bJzEnXSk6IFByb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD4ge1xuICAgICAgICBpZiAodHlwZW9mIF9leHRyYWN0b3IuaWRlbnRpZmllciAhPT0gJ3N0cmluZycgfHwgdGhpcy5zdG9yZS5oYXMoX2V4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBfZXh0cmFjdG9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHRoaXMucGxheWVyLm9wdGlvbnMuYnJpZGdlUHJvdmlkZXIpIG9wdGlvbnMuYnJpZGdlUHJvdmlkZXIgPz89IHRoaXMucGxheWVyLm9wdGlvbnMuYnJpZGdlUHJvdmlkZXI7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0KF9leHRyYWN0b3IuaWRlbnRpZmllciwgZXh0cmFjdG9yKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgbG9hZGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZWdpc3RlcmVkJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgICAgIGF3YWl0IGV4dHJhY3Rvci5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBhY3RpdmF0ZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2FjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiBleHRyYWN0b3IgYXMgdW5rbm93biBhcyBJbnN0YW5jZVR5cGU8VD47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKF9leHRyYWN0b3IuaWRlbnRpZmllcik7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBhY3RpdmF0ZSEgRXJyb3I6ICR7ZX1gKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVyIHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHVucmVnaXN0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlcjxLIGV4dGVuZHMgc3RyaW5nIHwgQmFzZUV4dHJhY3Rvcj4oX2V4dHJhY3RvcjogSykge1xuICAgICAgICBjb25zdCBleHRyYWN0b3IgPSB0eXBlb2YgX2V4dHJhY3RvciA9PT0gJ3N0cmluZycgPyB0aGlzLnN0b3JlLmdldChfZXh0cmFjdG9yKSA6IHRoaXMuc3RvcmUuZmluZCgocikgPT4gciA9PT0gX2V4dHJhY3Rvcik7XG4gICAgICAgIGlmICghZXh0cmFjdG9yKSByZXR1cm47XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGV4dHJhY3Rvci5pZGVudGlmaWVyIHx8IHRoaXMuc3RvcmUuZmluZEtleSgoZSkgPT4gZSA9PT0gZXh0cmFjdG9yKSE7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKSB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRpc2FibGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCd1bnJlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICAgICAgYXdhaXQgZXh0cmFjdG9yLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkZWFjdGl2YXRlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVhY3RpdmF0ZScsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gZGVhY3RpdmF0ZSFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlciBhbGwgZXh0cmFjdG9yc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyQWxsKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5zdG9yZS5tYXAoKGUpID0+IHRoaXMudW5yZWdpc3RlcihlKSkpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1biBhbGwgdGhlIGV4dHJhY3RvcnNcbiAgICAgKiBAcGFyYW0gZm4gVGhlIHJ1bm5lciBmdW5jdGlvblxuICAgICAqIEBwYXJhbSBmaWx0ZXJCbG9ja2VkIEZpbHRlciBibG9ja2VkIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcnVuPFQgPSB1bmtub3duPihmbjogRXh0cmFjdG9yRXhlY3V0aW9uRk48VD4sIGZpbHRlckJsb2NrZWQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGJsb2NrZWQgPSB0aGlzLnBsYXllci5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/PyBbXTtcblxuICAgICAgICBpZiAoIXRoaXMuc3RvcmUuc2l6ZSkge1xuICAgICAgICAgICAgVXRpbC53YXJuKCdTa2lwcGluZyBleHRyYWN0b3JzIGV4ZWN1dGlvbiBzaW5jZSB6ZXJvIGV4dHJhY3RvcnMgd2VyZSByZWdpc3RlcmVkJywgJ05vRXh0cmFjdG9ycycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc29ydCBieSBwcmlvcml0eSBzbyB0aGF0IGV4dHJhY3RvcnMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgYXJlIGV4ZWN1dGVkIGZpcnN0XG4gICAgICAgIGNvbnN0IGV4dHJhY3RvcnMgPSB0aGlzLnN0b3JlLnNvcnQoKGEsIGIpID0+IGIucHJpb3JpdHkgLSBhLnByaW9yaXR5KTtcblxuICAgICAgICBsZXQgZXJyOiBFcnJvciB8IG51bGwgPSBudWxsLFxuICAgICAgICAgICAgbGFzdEV4dDogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dHJhY3RvcnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJCbG9ja2VkICYmIGJsb2NrZWQuc29tZSgoZSkgPT4gZSA9PT0gZXh0LmlkZW50aWZpZXIpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0uLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGV4dCkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZmFpbGVkIHdpdGggZXJyb3I6ICR7ZX1gKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHlwZVV0aWwuaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoYCR7ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsYXN0RXh0ID0gZXh0O1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmICFUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBleHQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUPjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgZXJyID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBsYXN0RXh0ISxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogZmFsc2VcbiAgICAgICAgICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PGZhbHNlPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGJyaWRnZSBmb3IgYSB0cmFja1xuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVxdWVzdCBicmlkZ2UgZm9yXG4gICAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvciBvZiB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdEJyaWRnZSh0cmFjazogVHJhY2ssIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSB0cmFjay5leHRyYWN0b3IpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNseUF0dGVtcHRlZCA9IHRoaXMuZ2V0Q29udGV4dCgpPy5icmlkZ2VBdHRlbXB0ZWRFeHRyYWN0b3JzID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuPEV4dHJhY3RvclN0cmVhbWFibGU+KGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgICAgIGlmIChzb3VyY2VFeHRyYWN0b3IgJiYgZXh0LmlkZW50aWZpZXIgPT09IHNvdXJjZUV4dHJhY3Rvci5pZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAocHJldmlvdXNseUF0dGVtcHRlZC5oYXMoZXh0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIHByZXZpb3VzbHlBdHRlbXB0ZWQuYWRkKGV4dC5pZGVudGlmaWVyKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXh0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcblxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFyZXN1bHQ/LnJlc3VsdCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfQlJJREdFX0ZBSUxFRCh0aGlzLmdldEV4ZWN1dGlvbklkKCksIHJlc3VsdD8uZXJyb3I/LnN0YWNrIHx8IHJlc3VsdD8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ05vIGV4dHJhY3RvcnMgYXZhaWxhYmxlIHRvIGJyaWRnZScpO1xuXG4gICAgICAgIHRyYWNrLmJyaWRnZWRFeHRyYWN0b3IgPSByZXN1bHQuZXh0cmFjdG9yO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBicmlkZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGV4dHJhY3RvclxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVxdWVzdCBicmlkZ2UgZm9yXG4gICAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvciBvZiB0aGUgdHJhY2tcbiAgICAgKiBAcGFyYW0gdGFyZ2V0RXh0cmFjdG9yIFRoZSB0YXJnZXQgZXh0cmFjdG9yIHRvIGJyaWRnZSB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0QnJpZGdlRnJvbSh0cmFjazogVHJhY2ssIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwsIHRhcmdldEV4dHJhY3RvcjogRXh0cmFjdG9yUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlc29sdmUodGFyZ2V0RXh0cmFjdG9yKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGFyZ2V0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBleHRyYWN0b3IgaXMgZGlzYWJsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNEaXNhYmxlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhpZGVudGlmaWVyKSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBleHRyYWN0b3IgaXMgZW5hYmxlZFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VuYWJsZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0Rpc2FibGVkKGlkZW50aWZpZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgZXh0cmFjdG9yIGlkZW50aWZpZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZUlkKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHJlc29sdmFibGUgOiByZXNvbHZhYmxlLmlkZW50aWZpZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZShyZXNvbHZhYmxlOiBFeHRyYWN0b3JSZXNvbHZhYmxlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycgPyB0aGlzLmdldChyZXNvbHZhYmxlKSA6IHJlc29sdmFibGU7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICAgIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcjtcbiAgICBlcnJvcjogRXJyb3IgfCBudWxsO1xuICAgIHJlc3VsdDogVDtcbn1cblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yRXhlY3V0aW9uRk48VCA9IHVua25vd24+ID0gKGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gUHJvbWlzZTxUIHwgYm9vbGVhbj47XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvclJlc29sdmFibGUgPSBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yO1xuIiwgImltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIHVuc2FmZSA9IGFueTtcblxuLyoqXG4gKiBUaGUgcmVjZWl2ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIHByb3ZpZGVkXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRSZWNlaXZlcjxSPiA9ICgpID0+IFI7XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0PFQ+IHtcbiAgICBwcml2YXRlIHN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VD4oKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRlZmF1bHRWYWx1ZT86IFQpIHt9XG5cbiAgICAvKipcbiAgICAgKiBFeGl0IG91dCBvZiB0aGlzIGNvbnRleHRcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhpdChzY29wZTogQ29udGV4dFJlY2VpdmVyPHZvaWQ+KSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5leGl0KHNjb3BlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb250ZXh0IGlzIGxvc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzTG9zdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3VtZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpO1xuXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgJiYgdGhpcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1biBhIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIHByb3ZpZGVyXG4gICAgICovXG4gICAgcHVibGljIHByb3ZpZGU8UiA9IHVuc2FmZT4odmFsdWU6IFQsIHJlY2VpdmVyOiBDb250ZXh0UmVjZWl2ZXI8Uj4pOiBSIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGV4dCB2YWx1ZSBtYXkgbm90IGJlIHVuZGVmaW5lZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHJlY2VpdmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5ydW4odmFsdWUsIHJlY2VpdmVyKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGNvbnRleHQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG9wdGlvbmFsLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29udGV4dFxuICogQGV4YW1wbGUgY29uc3QgdXNlckNvbnRleHQgPSBjcmVhdGVDb250ZXh0KCk7XG4gKlxuICogIC8vIHRoZSB2YWx1ZSB0byBwcm92aWRlXG4gKiAgY29uc3QgdXNlciA9IHtcbiAqICAgaWQ6IDEsXG4gKiAgIG5hbWU6ICdKb2huIERvZSdcbiAqICB9O1xuICpcbiAqICAvLyBwcm92aWRlIHRoZSBjb250ZXh0IHZhbHVlIHRvIHRoZSByZWNlaXZlclxuICogIGNvbnRleHQucHJvdmlkZSh1c2VyLCBoYW5kbGVyKTtcbiAqXG4gKiAgZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAqICAgIC8vIGdldCB0aGUgY29udGV4dCB2YWx1ZVxuICogICAgY29uc3QgeyBpZCwgbmFtZSB9ID0gdXNlQ29udGV4dChjb250ZXh0KTtcbiAqXG4gKiAgICBjb25zb2xlLmxvZyhpZCwgbmFtZSk7IC8vIDEsIEpvaG4gRG9lXG4gKiAgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDxUID0gdW5zYWZlPihkZWZhdWx0VmFsdWU/OiBUKTogQ29udGV4dDxUPiB7XG4gICAgcmV0dXJuIG5ldyBDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGdldCB0aGUgdmFsdWUgZnJvbVxuICogQGV4YW1wbGUgY29uc3QgdmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udGV4dDxUID0gdW5zYWZlPihjb250ZXh0OiBDb250ZXh0PFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbnRleHQuY29uc3VtZSgpO1xufVxuIiwgImltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vLi4vUGxheWVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgaW5zdGFuY2VzID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBQbGF5ZXI+KCk7XG5leHBvcnQgY29uc3QgZ2xvYmFsUmVnaXN0cnkgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIHVua25vd24+KCk7XG4iLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vLi4vUGxheWVyJztcbmltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRQbGF5ZXIocGxheWVyOiBQbGF5ZXIpIHtcbiAgICBpZiAoaW5zdGFuY2VzLmhhcyhwbGF5ZXIuaWQpKSByZXR1cm4gdHJ1ZTtcblxuICAgIGluc3RhbmNlcy5zZXQocGxheWVyLmlkLCBwbGF5ZXIpO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlcy5oYXMocGxheWVyLmlkKTtcbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi8uLi9QbGF5ZXInO1xuaW1wb3J0IHsgaW5zdGFuY2VzIH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyUGxheWVyKHBsYXllcjogUGxheWVyKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlcy5kZWxldGUocGxheWVyLmlkKTtcbn1cbiIsICJpbXBvcnQgeyBpbnN0YW5jZXMgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGxheWVycygpIHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmFycmF5KCk7XG59XG4iLCAiaW1wb3J0IHsgZ2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsUmVnaXN0cnkoKSB7XG4gICAgcmV0dXJuIGdsb2JhbFJlZ2lzdHJ5O1xufVxuIiwgImltcG9ydCB7IEd1aWxkIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IGluc3RhbmNlcyB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQvYXN5bmMtY29udGV4dCc7XG5cbmNvbnN0IHByZWZlcnJlZEluc3RhbmNlS2V5ID0gJ19fZGlzY29yZF9wbGF5ZXJfaG9va19pbnN0YW5jZV9jYWNoZV9fJztcblxuZXhwb3J0IGNvbnN0IGdldFBsYXllciA9ICgpID0+IHtcbiAgICByZXR1cm4gaW5zdGFuY2VzLmdldChwcmVmZXJyZWRJbnN0YW5jZUtleSkgfHwgaW5zdGFuY2VzLmZpcnN0KCkgfHwgbnVsbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9va3NDdHgge1xuICAgIGd1aWxkOiBHdWlsZDtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSG9va3NDb250ZXh0KGhvb2tOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwbGF5ZXIgPSBnZXRQbGF5ZXIoKTtcbiAgICBpZiAoIXBsYXllcikgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT04oJ2Rpc2NvcmQtcGxheWVyJywgJ1BsYXllciBpbnN0YW5jZSBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIHVzaW5nIGhvb2tzJyk7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChwbGF5ZXIuY29udGV4dCk7XG5cbiAgICBpZiAoIWNvbnRleHQpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OKGhvb2tOYW1lLCBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGEgcGxheWVyIGNvbnRleHQgY3JlYXRlZCBieSA8UGxheWVyPi5jb250ZXh0LnByb3ZpZGUoKWApO1xuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbi8qKlxuICogQmluZCBhIHBsYXllciBpbnN0YW5jZSB0byB0aGUgaG9vayBzeXN0ZW0sIGRlZmF1bHRzIHRvIHRoZSBmaXJzdCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGJpbmRIb29rID0gKHBsYXllcjogUGxheWVyKSA9PiB7XG4gICAgaW5zdGFuY2VzLnNldChwcmVmZXJyZWRJbnN0YW5jZUtleSwgcGxheWVyKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRRdWV1ZSA9IDxUID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpID0+IHtcbiAgICBjb25zdCBwbGF5ZXIgPSBnZXRQbGF5ZXIoKTtcbiAgICBpZiAoIXBsYXllcikgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gKHBsYXllci5ub2Rlcy5yZXNvbHZlKG5vZGUpIGFzIEd1aWxkUXVldWU8VD4pIHx8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tEZWNsYXJhdGlvbkNvbnRleHQge1xuICAgIGdldFF1ZXVlOiB0eXBlb2YgZ2V0UXVldWU7XG4gICAgZ2V0UGxheWVyOiB0eXBlb2YgZ2V0UGxheWVyO1xuICAgIGluc3RhbmNlczogdHlwZW9mIGluc3RhbmNlcztcbn1cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IHR5cGUgSG9va0RlY2xhcmF0aW9uPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueT4gPSAoY29udGV4dDogSG9va0RlY2xhcmF0aW9uQ29udGV4dCkgPT4gVDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2s8VCBleHRlbmRzIEhvb2tEZWNsYXJhdGlvbjwoLi4uYXJnczogYW55W10pID0+IGFueT4+KGhvb2s6IFQpOiBSZXR1cm5UeXBlPFQ+IHtcbiAgICByZXR1cm4gaG9vayh7XG4gICAgICAgIGdldFF1ZXVlLFxuICAgICAgICBnZXRQbGF5ZXIsXG4gICAgICAgIGluc3RhbmNlc1xuICAgIH0pIGFzIFJldHVyblR5cGU8VD47XG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuIiwgImltcG9ydCB7IEd1aWxkUXVldWVIaXN0b3J5LCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldFF1ZXVlLCB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgaGlzdG9yeVxuICogQHBhcmFtIG5vZGUgZ3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4obm9kZT86IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsIHtcbiAgICBjb25zdCBfbm9kZSA9IG5vZGUgPz8gdXNlSG9va3NDb250ZXh0KCd1c2VIaXN0b3J5JykuZ3VpbGQ7XG5cbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlPE1ldGE+KF9ub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZS5oaXN0b3J5O1xufVxuIiwgImltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldFF1ZXVlLCB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgcGxheWVyIG5vZGVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUGxheWVyPE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUGxheWVyPE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbCB7XG4gICAgY29uc3QgX25vZGUgPSBub2RlID8/IHVzZUhvb2tzQ29udGV4dCgndXNlUGxheWVyJykuZ3VpbGQ7XG4gICAgY29uc3QgcXVldWUgPSBnZXRRdWV1ZTxNZXRhPihfbm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWUubm9kZTtcbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldFF1ZXVlLCB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPihub2RlOiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPihub2RlPzogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbCB7XG4gICAgY29uc3QgX25vZGUgPSBub2RlID8/IHVzZUhvb2tzQ29udGV4dCgndXNlUXVldWUnKS5ndWlsZDtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlPE1ldGE+KF9ub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBxdWV1ZTtcbn1cbiIsICJpbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IGdldFBsYXllciB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBtYWluIHBsYXllciBpbnN0YW5jZVxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1hc3RlclBsYXllcigpIHtcbiAgICBVdGlsLndhcm4oJ3VzZU1hc3RlclBsYXllcigpIGhvb2sgaXMgZGVwcmVjYXRlZCwgdXNlIHVzZU1haW5QbGF5ZXIoKSBpbnN0ZWFkLicsICdEZXByZWNhdGlvbldhcm5pbmcnKTtcbiAgICByZXR1cm4gdXNlTWFpblBsYXllcigpO1xufVxuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYWluUGxheWVyKCkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0UGxheWVyKCk7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTigndXNlTWFpblBsYXllcicsICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgY2FsbGluZyBcInVzZU1haW5QbGF5ZXJcIiBob29rIGJlZm9yZSBjcmVhdGluZyBhIHBsYXllciBpbnN0YW5jZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG59XG4iLCAiaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldFF1ZXVlLCB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbmV4cG9ydCB0eXBlIFNldHRlckZOPFQsIFA+ID0gKHByZXZpb3VzOiBQKSA9PiBUO1xuZXhwb3J0IHR5cGUgTWV0YWRhdGFEaXNwYXRjaDxUPiA9IHJlYWRvbmx5IFsoKSA9PiBULCAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4gdm9pZF07XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBndWlsZCBxdWV1ZSBtZXRhZGF0YVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNZXRhZGF0YTxUID0gdW5rbm93bj4oKTogTWV0YWRhdGFEaXNwYXRjaDxUPjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VNZXRhZGF0YTxUID0gdW5rbm93bj4obm9kZTogTm9kZVJlc29sdmFibGUpOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihub2RlPzogTm9kZVJlc29sdmFibGUpOiBNZXRhZGF0YURpc3BhdGNoPFQ+IHtcbiAgICBjb25zdCBfbm9kZSA9IG5vZGUgPz8gdXNlSG9va3NDb250ZXh0KCd1c2VNZXRhZGF0YScpLmd1aWxkO1xuICAgIGNvbnN0IHF1ZXVlID0gZ2V0UXVldWU8VD4oX25vZGUpO1xuICAgIGNvbnN0IHNldHRlciA9IChtZXRhZGF0YTogVCB8IFNldHRlckZOPFQsIFQ+KSA9PiB7XG4gICAgICAgIGlmIChxdWV1ZSkge1xuICAgICAgICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24obWV0YWRhdGEpKSByZXR1cm4gcXVldWUuc2V0TWV0YWRhdGEobWV0YWRhdGEocXVldWUubWV0YWRhdGEpKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0dGVyID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gcXVldWU/Lm1ldGFkYXRhIGFzIFQ7XG4gICAgfTtcblxuICAgIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufVxuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgZ2V0UXVldWUsIHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zIHtcbiAgICBpZ25vcmVGaWx0ZXJzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgY3VycmVudCB0cmFja1xuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aW1lbGluZSBkaXNwYXRjaGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShub2RlPzogTm9kZVJlc29sdmFibGUsIG9wdGlvbnM/OiBQYXJ0aWFsPFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnM+KSB7XG4gICAgY29uc3QgX25vZGUgPSBub2RlID8/IHVzZUhvb2tzQ29udGV4dCgndXNlVGltZWxpbmUnKS5ndWlsZDtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlKF9ub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgICAgICBnZXQgdGltZXN0YW1wKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuZ2V0VGltZXN0YW1wKG9wdGlvbnM/Lmlnbm9yZUZpbHRlcnMpITtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmlzUGF1c2VkKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCB0cmFjaygpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5jdXJyZW50VHJhY2s7XG4gICAgICAgIH0sXG4gICAgICAgIHBhdXNlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucmVzdW1lKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFZvbHVtZSh2b2w6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwgImltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vcXVldWUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFmdGVyQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn1cbiIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9xdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkJlZm9yZUNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn1cbiIsICJpbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgZ2V0UXVldWUsIHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxudHlwZSBTZXR0ZXJGTiA9IChwcmV2aW91czogbnVtYmVyKSA9PiBudW1iZXI7XG50eXBlIFZvbHVtZURpc3BhdGNoID0gcmVhZG9ubHkgWygpID0+IG51bWJlciwgKHZvbHVtZTogbnVtYmVyIHwgU2V0dGVyRk4pID0+IGJvb2xlYW4gfCB1bmRlZmluZWRdO1xuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgcGxheWVyIHZvbHVtZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUoKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU6IE5vZGVSZXNvbHZhYmxlKTogVm9sdW1lRGlzcGF0Y2g7XG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IFZvbHVtZURpc3BhdGNoIHtcbiAgICBjb25zdCBfbm9kZSA9IG5vZGUgPz8gdXNlSG9va3NDb250ZXh0KCd1c2VWb2x1bWUnKS5ndWlsZDtcbiAgICBjb25zdCBxdWV1ZSA9IGdldFF1ZXVlKF9ub2RlKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKHZvbHVtZSkpIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUocXVldWUubm9kZS52b2x1bWUpKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5ub2RlLnZvbHVtZSBhcyBudW1iZXI7XG4gICAgfTtcblxuICAgIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufVxuIiwgImltcG9ydCB7IEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMsIEJpcXVhZEZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVSZXBlYXRNb2RlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gdW5rbm93bj4ge1xuICAgIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgICB2b2x1bWU/OiBudW1iZXI7XG4gICAgZXF1YWxpemVyPzogRXF1YWxpemVyQmFuZFtdO1xuICAgIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdO1xuICAgIGJpcXVhZD86IEJpcXVhZEZpbHRlcnM7XG4gICAgcmVzYW1wbGVyPzogbnVtYmVyO1xuICAgIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtPzogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICAgIGxlYXZlT25FbXB0eT86IGJvb2xlYW47XG4gICAgbGVhdmVPbkVtcHR5Q29vbGRvd24/OiBudW1iZXI7XG4gICAgbGVhdmVPbkVuZD86IGJvb2xlYW47XG4gICAgbGVhdmVPbkVuZENvb2xkb3duPzogbnVtYmVyO1xuICAgIGxlYXZlT25TdG9wPzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uU3RvcENvb2xkb3duPzogbnVtYmVyO1xuICAgIG1ldGFkYXRhPzogVCB8IG51bGw7XG4gICAgc2VsZkRlYWY/OiBib29sZWFuO1xuICAgIGNvbm5lY3Rpb25UaW1lb3V0PzogbnVtYmVyO1xuICAgIGRlZmF1bHRGRm1wZWdGaWx0ZXJzPzogRmlsdGVyc05hbWVbXTtcbiAgICBidWZmZXJpbmdUaW1lb3V0PzogbnVtYmVyO1xuICAgIG5vRW1pdEluc2VydD86IGJvb2xlYW47XG4gICAgbWF4U2l6ZT86IG51bWJlcjtcbiAgICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE/OiBib29sZWFuO1xuICAgIGRpc2FibGVWb2x1bWU/OiBib29sZWFuO1xuICAgIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICAgIGRpc2FibGVGaWx0ZXJlcj86IGJvb2xlYW47XG4gICAgZGlzYWJsZUJpcXVhZD86IGJvb2xlYW47XG4gICAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gICAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG5leHBvcnQgY2xhc3MgR3VpbGROb2RlTWFuYWdlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjYWNoZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZT4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGd1aWxkIHF1ZXVlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSwgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KTogR3VpbGRRdWV1ZTxUPiB7XG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRCgnSW52YWxpZCBvciB1bmtub3duIGd1aWxkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoc2VydmVyLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHNlcnZlci5pZCkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICAgICAgb3B0aW9ucy52b2x1bWUgPz89IDEwMDtcbiAgICAgICAgb3B0aW9ucy5lcXVhbGl6ZXIgPz89IFtdO1xuICAgICAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbmQgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMucmVzYW1wbGVyID8/PSA0ODAwMDtcbiAgICAgICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dDtcbiAgICAgICAgb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0ID8/PSAxMDAwO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICAvLyB0b2RvKHR3bGl0ZSk6IG1heWJlIGRpc2FibGUgdGhlc2UgYnkgZGVmYXVsdD9cbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlQmlxdWFkID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVWb2x1bWUgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtID8/PSBmYWxzZTtcblxuICAgICAgICBpZiAoZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJykgJiYgIW9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBnZXRHbG9iYWxSZWdpc3RyeSgpLmdldCgnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nKSBhcyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSAmJiAhb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0gPSBnZXRHbG9iYWxSZWdpc3RyeSgpLmdldCgnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScpIGFzIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVldWUgPSBuZXcgR3VpbGRRdWV1ZTxUPih0aGlzLnBsYXllciwge1xuICAgICAgICAgICAgZ3VpbGQ6IHNlcnZlcixcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3k6IG9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICAgICAgICB2b2x1bWU6IG9wdGlvbnMudm9sdW1lLFxuICAgICAgICAgICAgZXF1YWxpemVyOiBvcHRpb25zLmVxdWFsaXplcixcbiAgICAgICAgICAgIGZpbHRlcmVyOiBvcHRpb25zLmFfZmlsdGVyLFxuICAgICAgICAgICAgYmlxdWFkOiBvcHRpb25zLmJpcXVhZCxcbiAgICAgICAgICAgIHJlc2FtcGxlcjogb3B0aW9ucy5yZXNhbXBsZXIsXG4gICAgICAgICAgICBkaXNhYmxlSGlzdG9yeTogb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSxcbiAgICAgICAgICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtLFxuICAgICAgICAgICAgb25BZnRlckNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtLFxuICAgICAgICAgICAgcmVwZWF0TW9kZTogb3B0aW9ucy5yZXBlYXRNb2RlLFxuICAgICAgICAgICAgbGVhdmVPbkVtcHR5OiBvcHRpb25zLmxlYXZlT25FbXB0eSxcbiAgICAgICAgICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duLFxuICAgICAgICAgICAgbGVhdmVPbkVuZDogb3B0aW9ucy5sZWF2ZU9uRW5kLFxuICAgICAgICAgICAgbGVhdmVPbkVuZENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93bixcbiAgICAgICAgICAgIGxlYXZlT25TdG9wOiBvcHRpb25zLmxlYXZlT25TdG9wLFxuICAgICAgICAgICAgbGVhdmVPblN0b3BDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duLFxuICAgICAgICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgICAgICAgc2VsZkRlYWY6IG9wdGlvbnMuc2VsZkRlYWYsXG4gICAgICAgICAgICBmZm1wZWdGaWx0ZXJzOiBvcHRpb25zLmRlZmF1bHRGRm1wZWdGaWx0ZXJzID8/IFtdLFxuICAgICAgICAgICAgYnVmZmVyaW5nVGltZW91dDogb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0LFxuICAgICAgICAgICAgbm9FbWl0SW5zZXJ0OiBvcHRpb25zLm5vRW1pdEluc2VydCA/PyBmYWxzZSxcbiAgICAgICAgICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YTogb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEsXG4gICAgICAgICAgICBtYXhIaXN0b3J5U2l6ZTogb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSxcbiAgICAgICAgICAgIG1heFNpemU6IG9wdGlvbnMubWF4U2l6ZSxcbiAgICAgICAgICAgIHBhdXNlT25FbXB0eTogb3B0aW9ucy5wYXVzZU9uRW1wdHksXG4gICAgICAgICAgICBkaXNhYmxlQmlxdWFkOiBvcHRpb25zLmRpc2FibGVCaXF1YWQsXG4gICAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiBvcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICAgICAgICBkaXNhYmxlRmlsdGVyZXI6IG9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyLFxuICAgICAgICAgICAgZGlzYWJsZVJlc2FtcGxlcjogb3B0aW9ucy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgICAgZGlzYWJsZVZvbHVtZTogb3B0aW9ucy5kaXNhYmxlVm9sdW1lLFxuICAgICAgICAgICAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtOiBvcHRpb25zLmRpc2FibGVGYWxsYmFja1N0cmVhbVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhY2hlLnNldChzZXJ2ZXIuaWQsIHF1ZXVlKTtcblxuICAgICAgICByZXR1cm4gcXVldWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGV4aXN0aW5nIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQ8VCA9IE1ldGE+KG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gKHRoaXMuY2FjaGUuZ2V0KHF1ZXVlLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+KSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgcXVldWUgZXhpc3RzXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXMobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgaWQgPSBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/IG5vZGUuaWQgOiB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSE7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgICAgIGlmICghcXVldWUpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0dVSUxEX1FVRVVFKCdDYW5ub3QgZGVsZXRlIG5vbi1leGlzdGluZyBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcbiAgICAgICAgcXVldWUubm9kZS5zdG9wKHRydWUpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHF1ZXVlLmNvbm5lY3Rpb24/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICBxdWV1ZS5kaXNwYXRjaGVyPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcXVldWUuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgICBxdWV1ZS50aW1lb3V0cy5mb3JFYWNoKCh0bSkgPT4gY2xlYXJUaW1lb3V0KHRtKSk7XG4gICAgICAgIHF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICAgICAgcXVldWUudHJhY2tzLmNsZWFyKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZGVsZXRlKHF1ZXVlLmlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHF1ZXVlXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlPFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpISkgYXMgR3VpbGRRdWV1ZTxUPiB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHF1ZXVlIGlkXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlSWQobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICAgICAgcmV0dXJuIHE/LmlkIHx8IG51bGw7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucywgVHJhY2tMaWtlIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENoYW5uZWxUeXBlLCBHdWlsZCwgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBWb2ljZUJhc2VkQ2hhbm5lbCwgVm9pY2VTdGF0ZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWUsIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmlxdWFkRmlsdGVycywgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyB0eXBlIEF1ZGlvUGxheWVyLCBBdWRpb1Jlc291cmNlLCBTdHJlYW1UeXBlLCBWb2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cyB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi9HdWlsZFF1ZXVlSGlzdG9yeSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlUGxheWVyTm9kZSwgU3RyZWFtQ29uZmlnIH0gZnJvbSAnLi9HdWlsZFF1ZXVlUGxheWVyTm9kZSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZVJlcGVhdE1vZGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVN0YXRpc3RpY3MgfSBmcm9tICcuL0d1aWxkUXVldWVTdGF0aXN0aWNzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBTeW5jZWRMeXJpY3NQcm92aWRlciB9IGZyb20gJy4vU3luY2VkTHlyaWNzUHJvdmlkZXInO1xuaW1wb3J0IHsgTHJjR2V0UmVzdWx0LCBMcmNTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9scmNsaWIvTHJjTGliJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVJbml0PE1ldGEgPSB1bmtub3duPiB7XG4gICAgZ3VpbGQ6IEd1aWxkO1xuICAgIHF1ZXVlU3RyYXRlZ3k6IFF1ZXVlU3RyYXRlZ3k7XG4gICAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICAgIHZvbHVtZTogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICBiaXF1YWQ6IEJpcXVhZEZpbHRlcnMgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICBmaWx0ZXJlcjogUENNRmlsdGVyc1tdIHwgYm9vbGVhbjtcbiAgICBmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdO1xuICAgIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtPzogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICAgIGxlYXZlT25FbXB0eTogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHlDb29sZG93bjogbnVtYmVyO1xuICAgIGxlYXZlT25FbmQ6IGJvb2xlYW47XG4gICAgbGVhdmVPbkVuZENvb2xkb3duOiBudW1iZXI7XG4gICAgbGVhdmVPblN0b3A6IGJvb2xlYW47XG4gICAgbGVhdmVPblN0b3BDb29sZG93bjogbnVtYmVyO1xuICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXI7XG4gICAgc2VsZkRlYWY/OiBib29sZWFuO1xuICAgIG1ldGFkYXRhPzogTWV0YSB8IG51bGw7XG4gICAgYnVmZmVyaW5nVGltZW91dDogbnVtYmVyO1xuICAgIG5vRW1pdEluc2VydDogYm9vbGVhbjtcbiAgICBtYXhTaXplPzogbnVtYmVyO1xuICAgIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YTogYm9vbGVhbjtcbiAgICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICAgIGRpc2FibGVWb2x1bWU6IGJvb2xlYW47XG4gICAgZGlzYWJsZUVxdWFsaXplcjogYm9vbGVhbjtcbiAgICBkaXNhYmxlRmlsdGVyZXI6IGJvb2xlYW47XG4gICAgZGlzYWJsZUJpcXVhZDogYm9vbGVhbjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyOiBib29sZWFuO1xuICAgIGRpc2FibGVGYWxsYmFja1N0cmVhbTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUNvbm5lY3RDb25maWcge1xuICAgIGRlYWY/OiBib29sZWFuO1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZ3JvdXA/OiBzdHJpbmc7XG4gICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3N0UHJvY2Vzc2VkUmVzdWx0IHtcbiAgICBzdHJlYW06IFJlYWRhYmxlO1xuICAgIHR5cGU6IFN0cmVhbVR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9ICh0cmFjazogVHJhY2ssIHF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlLCBxdWV1ZTogR3VpbGRRdWV1ZSkgPT4gUHJvbWlzZTxSZWFkYWJsZSB8IG51bGw+O1xuZXhwb3J0IHR5cGUgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgPSAoc3RyZWFtOiBSZWFkYWJsZSwgcXVldWU6IEd1aWxkUXVldWUpID0+IFByb21pc2U8UG9zdFByb2Nlc3NlZFJlc3VsdCB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24gPSAnZmlsdGVycycgfCAnbm9ybWFsJztcblxuZXhwb3J0IGNvbnN0IEd1aWxkUXVldWVFdmVudCA9IHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja0FkZDogJ2F1ZGlvVHJhY2tBZGQnLFxuICAgIEF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja3NBZGQ6ICdhdWRpb1RyYWNrc0FkZCcsXG4gICAgQXVkaW9UcmFja3NBZGQ6ICdhdWRpb1RyYWNrc0FkZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrUmVtb3ZlOiAnYXVkaW9UcmFja1JlbW92ZScsXG4gICAgQXVkaW9UcmFja1JlbW92ZTogJ2F1ZGlvVHJhY2tSZW1vdmUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBhdWRpb1RyYWNrc1JlbW92ZTogJ2F1ZGlvVHJhY2tzUmVtb3ZlJyxcbiAgICBBdWRpb1RyYWNrc1JlbW92ZTogJ2F1ZGlvVHJhY2tzUmVtb3ZlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNyZWF0ZWRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uOiAnY29ubmVjdGlvbicsXG4gICAgQ29ubmVjdGlvbjogJ2Nvbm5lY3Rpb24nLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNvbm5lY3Rpb24gaXMgZGVzdHJveWVkXG4gICAgICovXG4gICAgY29ubmVjdGlvbkRlc3Ryb3llZDogJ2Nvbm5lY3Rpb25EZXN0cm95ZWQnLFxuICAgIENvbm5lY3Rpb25EZXN0cm95ZWQ6ICdjb25uZWN0aW9uRGVzdHJveWVkJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgICBEaXNjb25uZWN0OiAnZGlzY29ubmVjdCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBzZW5kcyBhIGRlYnVnIGluZm9cbiAgICAgKi9cbiAgICBkZWJ1ZzogJ2RlYnVnJyxcbiAgICBEZWJ1ZzogJ2RlYnVnJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcjogJ2Vycm9yJyxcbiAgICBFcnJvcjogJ2Vycm9yJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBlbXB0eUNoYW5uZWw6ICdlbXB0eUNoYW5uZWwnLFxuICAgIEVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqL1xuICAgIGVtcHR5UXVldWU6ICdlbXB0eVF1ZXVlJyxcbiAgICBFbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHBsYXllclN0YXJ0OiAncGxheWVyU3RhcnQnLFxuICAgIFBsYXllclN0YXJ0OiAncGxheWVyU3RhcnQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJFcnJvcjogJ3BsYXllckVycm9yJyxcbiAgICBQbGF5ZXJFcnJvcjogJ3BsYXllckVycm9yJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBmaW5pc2hlcyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAgIFBsYXllckZpbmlzaDogJ3BsYXllckZpbmlzaCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqL1xuICAgIHBsYXllclNraXA6ICdwbGF5ZXJTa2lwJyxcbiAgICBQbGF5ZXJTa2lwOiAncGxheWVyU2tpcCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAgICovXG4gICAgcGxheWVyVHJpZ2dlcjogJ3BsYXllclRyaWdnZXInLFxuICAgIFBsYXllclRyaWdnZXI6ICdwbGF5ZXJUcmlnZ2VyJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKi9cbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAndm9pY2VTdGF0ZVVwZGF0ZScsXG4gICAgVm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgICAqL1xuICAgIHZvbHVtZUNoYW5nZTogJ3ZvbHVtZUNoYW5nZScsXG4gICAgVm9sdW1lQ2hhbmdlOiAndm9sdW1lQ2hhbmdlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHBhdXNlZFxuICAgICAqL1xuICAgIHBsYXllclBhdXNlOiAncGxheWVyUGF1c2UnLFxuICAgIFBsYXllclBhdXNlOiAncGxheWVyUGF1c2UnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgICAqL1xuICAgIHBsYXllclJlc3VtZTogJ3BsYXllclJlc3VtZScsXG4gICAgUGxheWVyUmVzdW1lOiAncGxheWVyUmVzdW1lJyxcbiAgICAvKipcbiAgICAgKiBCaXF1YWQgRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBiaXF1YWRGaWx0ZXJzVXBkYXRlOiAnYmlxdWFkRmlsdGVyc1VwZGF0ZScsXG4gICAgQmlxdWFkRmlsdGVyc1VwZGF0ZTogJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIEVxdWFsaXplciBVcGRhdGVcbiAgICAgKi9cbiAgICBlcXVhbGl6ZXJVcGRhdGU6ICdlcXVhbGl6ZXJVcGRhdGUnLFxuICAgIEVxdWFsaXplclVwZGF0ZTogJ2VxdWFsaXplclVwZGF0ZScsXG4gICAgLyoqXG4gICAgICogRFNQIHVwZGF0ZVxuICAgICAqL1xuICAgIGRzcFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gICAgRFNQVXBkYXRlOiAnZHNwVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgICAqL1xuICAgIGF1ZGlvRmlsdGVyc1VwZGF0ZTogJ2F1ZGlvRmlsdGVyc1VwZGF0ZScsXG4gICAgQXVkaW9GaWx0ZXJzVXBkYXRlOiAnYXVkaW9GaWx0ZXJzVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBBdWRpbyBwbGF5ZXIgd2lsbCBwbGF5IG5leHQgdHJhY2tcbiAgICAgKi9cbiAgICB3aWxsUGxheVRyYWNrOiAnd2lsbFBsYXlUcmFjaycsXG4gICAgV2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcmVwb3B1bGF0ZWRcbiAgICAgKi9cbiAgICBjaGFubmVsUG9wdWxhdGU6ICdjaGFubmVsUG9wdWxhdGUnLFxuICAgIENoYW5uZWxQb3B1bGF0ZTogJ2NoYW5uZWxQb3B1bGF0ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICAgKi9cbiAgICBxdWV1ZUNyZWF0ZTogJ3F1ZXVlQ3JlYXRlJyxcbiAgICBRdWV1ZUNyZWF0ZTogJ3F1ZXVlQ3JlYXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBkZWxldGVkXG4gICAgICovXG4gICAgcXVldWVEZWxldGU6ICdxdWV1ZURlbGV0ZScsXG4gICAgUXVldWVEZWxldGU6ICdxdWV1ZURlbGV0ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgICAqL1xuICAgIHdpbGxBdXRvUGxheTogJ3dpbGxBdXRvUGxheScsXG4gICAgV2lsbEF1dG9QbGF5OiAnd2lsbEF1dG9QbGF5J1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgR3VpbGRRdWV1ZUV2ZW50ID0gKHR5cGVvZiBHdWlsZFF1ZXVlRXZlbnQpW2tleW9mIHR5cGVvZiBHdWlsZFF1ZXVlRXZlbnRdO1xuXG5leHBvcnQgZW51bSBUcmFja1NraXBSZWFzb24ge1xuICAgIE5vU3RyZWFtID0gJ0VSUl9OT19TVFJFQU0nLFxuICAgIE1hbnVhbCA9ICdNQU5VQUwnLFxuICAgIFNFRUtfT1ZFUl9USFJFU0hPTEQgPSAnU0VFS19PVkVSX1RIUkVTSE9MRCcsXG4gICAgSnVtcCA9ICdKVU1QRURfVE9fQU5PVEhFUl9UUkFDSycsXG4gICAgU2tpcFRvID0gJ1NLSVBfVE9fQU5PVEhFUl9UUkFDSycsXG4gICAgSGlzdG9yeU5leHQgPSAnSElTVE9SWV9ORVhUX1RSQUNLJ1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSBhbnk+IHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFja3MgYXJyYXlcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tSZW1vdmVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbkRlc3Ryb3llZF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5EZWJ1Z106IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgbWVzc2FnZTogc3RyaW5nKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LkVycm9yXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5FbXB0eUNoYW5uZWxdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTdGFydF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvcl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yLCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRmluaXNoXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgc2tpcHBlZFxuICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3Igc2tpcHBpbmdcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIGZvciBza2lwcGluZ1xuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrLCByZWFzb246IFRyYWNrU2tpcFJlYXNvbiwgZGVzY3JpcHRpb246IHN0cmluZykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHdoaWNoIHdhcyBwbGF5ZWQgaW4gdGhpcyBldmVudFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlcl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrLCByZWFzb246IFBsYXllclRyaWdnZXJlZFJlYXNvbikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyBwYXVzZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclBhdXNlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyUmVzdW1lXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIncyB2b2x1bWUgaXMgY2hhbmdlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRWb2x1bWUgVGhlIG9sZCB2b2x1bWVcbiAgICAgKiBAcGFyYW0gbmV3Vm9sdW1lIFRoZSB1cGRhdGVkIHZvbHVtZVxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuVm9sdW1lQ2hhbmdlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRWb2x1bWU6IG51bWJlciwgbmV3Vm9sdW1lOiBudW1iZXIpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGVxdWFsaXplciBjb25maWcgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LkVxdWFsaXplclVwZGF0ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkRmlsdGVyczogRXF1YWxpemVyQmFuZFtdLCBuZXdGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGJpcXVhZCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5CaXF1YWRGaWx0ZXJzVXBkYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbCwgbmV3RmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGRzcCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5EU1BVcGRhdGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIG9sZEZpbHRlcnM6IFBDTUZpbHRlcnNbXSwgbmV3RmlsdGVyczogUENNRmlsdGVyc1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBmZm1wZWcgYXVkaW8gZmlsdGVycyBpcyB1cGRhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9GaWx0ZXJzVXBkYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBvbGRGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdLCBuZXdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdKSA9PiB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgc3RyZWFtaW5nIGFuIGF1ZGlvIHRyYWNrLiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIHRvIG1vZGlmeSBzdHJlYW0gY29uZmlnIGJlZm9yZSBwbGF5aW5nIGEgdHJhY2suXG4gICAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3aWxsIGJlIHN0cmVhbWVkXG4gICAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbFBsYXlUcmFja106IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrPHVua25vd24+LCBjb25maWc6IFN0cmVhbUNvbmZpZywgZG9uZTogKCkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHBvcHVsYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuQ2hhbm5lbFBvcHVsYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5RdWV1ZUNyZWF0ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuUXVldWVEZWxldGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFja3MgVGhlIHNpbWlsYXIgdHJhY2tzIHRoYXQgd2VyZSBmb3VuZFxuICAgICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LldpbGxBdXRvUGxheV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2tzOiBUcmFja1tdLCBkb25lOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgICNkZWxldGVkID0gZmFsc2U7XG4gICAgI3NodWZmbGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9fY3VycmVudDogVHJhY2sgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgdHJhY2tzOiBRdWV1ZTxUcmFjaz47XG4gICAgcHVibGljIGhpc3RvcnkgPSBuZXcgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgbm9kZSA9IG5ldyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgZmlsdGVycyA9IG5ldyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKCkgPT4gbnVsbDtcbiAgICBwdWJsaWMgb25BZnRlckNyZWF0ZVN0cmVhbTogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIgPSBhc3luYyAoc3RyZWFtKSA9PiAoe1xuICAgICAgICBzdHJlYW0sXG4gICAgICAgIHR5cGU6IFN0cmVhbVR5cGUuUmF3XG4gICAgfSk7XG4gICAgcHVibGljIHJlcGVhdE1vZGUgPSBRdWV1ZVJlcGVhdE1vZGUuT0ZGO1xuICAgIHB1YmxpYyB0aW1lb3V0cyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgTm9kZUpTLlRpbWVvdXQ+KCk7XG4gICAgcHVibGljIHN0YXRzID0gbmV3IEd1aWxkUXVldWVTdGF0aXN0aWNzPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgICBwdWJsaWMgc3luY2VkTHlyaWNzUHJvdmlkZXIgPSBuZXcgU3luY2VkTHlyaWNzUHJvdmlkZXIodGhpcyk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyLCBwdWJsaWMgb3B0aW9uczogR3VpbGROb2RlSW5pdDxNZXRhPikge1xuICAgICAgICB0aGlzLnRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4ob3B0aW9ucy5xdWV1ZVN0cmF0ZWd5KTtcbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkpIHRoaXMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtO1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pKSB0aGlzLm9uQWZ0ZXJDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW07XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpIHRoaXMucmVwZWF0TW9kZSA9IG9wdGlvbnMucmVwZWF0TW9kZTtcblxuICAgICAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5wYXVzZU9uRW1wdHkgPz89IHRydWU7XG5cbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bGxpc2godGhpcy5vcHRpb25zLmJpcXVhZCkgJiYgIVR5cGVVdGlsLmlzQm9vbGVhbih0aGlzLm9wdGlvbnMuYmlxdWFkKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IHRoaXMub3B0aW9ucy5iaXF1YWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZXF1YWxpemVyKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IHRoaXMub3B0aW9ucy5lcXVhbGl6ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmlsdGVyZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IHRoaXMub3B0aW9ucy5maWx0ZXJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChUeXBlVXRpbC5pc051bWJlcih0aGlzLm9wdGlvbnMucmVzYW1wbGVyKSkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUgPSB0aGlzLm9wdGlvbnMucmVzYW1wbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzQXJyYXkodGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuZmZtcGVnLnNldERlZmF1bHRzKHRoaXMub3B0aW9ucy5mZm1wZWdGaWx0ZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhTaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnW0d1aWxkTm9kZUluaXQubWF4U2l6ZV0nLCAnbnVtYmVyJywgdHlwZW9mIG9wdGlvbnMubWF4U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKG9wdGlvbnMubWF4SGlzdG9yeVNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdbR3VpbGROb2RlSW5pdC5tYXhIaXN0b3J5U2l6ZV0nLCAnbnVtYmVyJywgdHlwZW9mIG9wdGlvbnMubWF4SGlzdG9yeVNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4U2l6ZSA8IDEpIG9wdGlvbnMubWF4U2l6ZSA9IEluZmluaXR5O1xuICAgICAgICBpZiAob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA8IDEpIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBJbmZpbml0eTtcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgR3VpbGRRdWV1ZSBpbml0aWFsaXplZCBmb3IgZ3VpbGQgJHt0aGlzLm9wdGlvbnMuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMub3B0aW9ucy5ndWlsZC5pZH0pYCk7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucXVldWVDcmVhdGUsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlIGluIG1zXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnN0b3JlLnJlZHVjZSgoYSwgYykgPT4gYSArIGMuZHVyYXRpb25NUywgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0dGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgICAgICByZXR1cm4gVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0aGlzLmVzdGltYXRlZER1cmF0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN5bmMgbHlyaWNzIHByb3ZpZGVyIGZvciB0aGlzIHF1ZXVlLlxuICAgICAqIEBleGFtcGxlIGNvbnN0IGx5cmljcyA9IGF3YWl0IHBsYXllci5seXJpY3Muc2VhcmNoKHsgcTogJ0FsYW4gV2Fsa2VyIEZhZGVkJyB9KTtcbiAgICAgKiBjb25zdCBzeW5jZWRMeXJpY3MgPSBxdWV1ZS5zeW5jZWRMeXJpY3MobHlyaWNzWzBdKTtcbiAgICAgKiBjb25zb2xlLmxvZyhzeW5jZWRMeXJpY3MuYXQoMTBfMDAwKSk7XG4gICAgICogLy8gc3Vic2NyaWJlIHRvIGx5cmljcyBjaGFuZ2VcbiAgICAgKiBjb25zdCB1bnN1YnNjcmliZSA9IHN5bmNlZEx5cmljcy5vbkNoYW5nZSgobHlyaWNzLCB0aW1lc3RhbXApID0+IHtcbiAgICAgKiAgICBjb25zb2xlLmxvZyhseXJpY3MsIHRpbWVzdGFtcCk7XG4gICAgICogfSk7XG4gICAgICogLy8gdW5zdWJzY3JpYmUgZnJvbSBseXJpY3MgY2hhbmdlXG4gICAgICogdW5zdWJzY3JpYmUoKTsgLy8gb3JcbiAgICAgKiBzeW5jZWRMeXJpY3MudW5zdWJzY3JpYmUoKTtcbiAgICAgKi9cbiAgICBwdWJsaWMgc3luY2VkTHlyaWNzKGx5cmljczogTHJjR2V0UmVzdWx0IHwgTHJjU2VhcmNoUmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXIubG9hZChseXJpY3M/LnN5bmNlZEx5cmljcyA/PyAnJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZSB0byB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG0gVGhlIG1lc3NhZ2UgdG8gd3JpdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZGVidWcsIHRoaXMsIG0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRhZGF0YSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhZGF0YSE7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBtZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG0gTWV0YWRhdGEgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldE1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgY3VycmVudCB0cmFjayBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuX19jdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHF1ZXVlIHdhcyBkZWxldGVkIHByZXZpb3VzbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlbGV0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWxldGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjaGFubmVsIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNoYW5uZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmNoYW5uZWwgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGNoYW5uZWwoYzogVm9pY2VCYXNlZENoYW5uZWwgfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmNoYW5uZWwgPSBjO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGd1aWxkIHRoaXMgcXVldWUgYmVsb25ncyB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ3VpbGQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ3VpbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZC5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdHJhbnNpdGlvbiBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VHJhbnNpdGlvbmluZyhzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLiN0cmFuc2l0aW9uaW5nID0gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaWYgdGhpcyBxdWV1ZSBpcyBjdXJyZW50bHkgdW5kZXIgdHJhbnNpdGlvbiBtb2RlXG4gICAgICovXG4gICAgcHVibGljIGlzVHJhbnNpdGlvbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYW5zaXRpb25pbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHJlcGVhdCBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIHJlcGVhdCBtb2RlIHRvIGFwcGx5XG4gICAgICovXG4gICAgcHVibGljIHNldFJlcGVhdE1vZGUobW9kZTogUXVldWVSZXBlYXRNb2RlKSB7XG4gICAgICAgIHRoaXMucmVwZWF0TW9kZSA9IG1vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhTaXplID8/IEluZmluaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBoaXN0b3J5IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4SGlzdG9yeVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz8gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldE1heEhpc3RvcnlTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhIaXN0b3J5U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWF4IGhpc3Rvcnkgc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNYXhIaXN0b3J5U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2l6ZSA8IDEpIHNpemUgPSBJbmZpbml0eTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtYXggc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBzaXplIFRoZSBzaXplIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNYXhTaXplKHNpemU6IG51bWJlcikge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLnRyYWNrcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmhpc3RvcnkuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGhhcyBubyB0cmFja3MgbGVmdCBpbiBpdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBpcyBmdWxsXG4gICAgICovXG4gICAgcHVibGljIGlzRnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPj0gdGhpcy5tYXhTaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBxdWV1ZSBjYXBhY2l0eVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDYXBhY2l0eSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGdWxsKCkpIHJldHVybiAwO1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemU7XG4gICAgICAgIHJldHVybiBjYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBjdXJyZW50bHkgaG9sZHMgYWN0aXZlIGF1ZGlvIHJlc291cmNlXG4gICAgICovXG4gICAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZSAhPSBudWxsICYmICF0aGlzLmRpc3BhdGNoZXIuYXVkaW9SZXNvdXJjZS5lbmRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdHJhY2sgdG8gdGhlIHF1ZXVlLiBUaGlzIHdpbGwgZW1pdCBgYXVkaW9UcmFja3NBZGRgIHdoZW4gbXVsdGlwbGUgdHJhY2tzIGFyZSBhZGRlZCwgb3RoZXJ3aXNlIGBhdWRpb1RyYWNrQWRkYC5cbiAgICAgKiBAcGFyYW0gdHJhY2sgVHJhY2sgb3IgcGxheWxpc3Qgb3IgYXJyYXkgb2YgdHJhY2tzIHRvIGFkZFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRUcmFjayh0cmFjazogVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QpIHtcbiAgICAgICAgY29uc3QgdG9BZGQgPSB0cmFjayBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gdHJhY2sudHJhY2tzIDogdHJhY2s7XG4gICAgICAgIGNvbnN0IGlzTXVsdGkgPSBBcnJheS5pc0FycmF5KHRvQWRkKTtcblxuICAgICAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgdG9BZGQpO1xuXG4gICAgICAgIHRoaXMudHJhY2tzLmFkZCh0b0FkZCk7XG5cbiAgICAgICAgaWYgKGlzTXVsdGkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja3NBZGQsIHRoaXMsIHRvQWRkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja0FkZCwgdGhpcywgdG9BZGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgdHJhY2sgZnJvbSBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5yZW1vdmUodHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydHMgdGhlIHRyYWNrIHRvIHRoZSBnaXZlbiBpbmRleFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnNlcnRUcmFjayh0cmFjazogVHJhY2ssIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLm1vdmUodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgICAqL1xuICAgIHB1YmxpYyBjb3B5VHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUuY29weSh0cmFjaywgaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gc3JjIFRoZSBmaXJzdCB0cmFjayB0byBzd2FwXG4gICAgICogQHBhcmFtIGRlc3QgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAgICovXG4gICAgcHVibGljIHN3YXBUcmFja3Moc3JjOiBUcmFja1Jlc29sdmFibGUsIGRlc3Q6IFRyYWNrUmVzb2x2YWJsZSk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnN3YXAoc3JjLCBkZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgc3RyZWFtIGRpc3BhdGNoZXIgZnJvbSB0aGUgZ2l2ZW4gY29ubmVjdGlvblxuICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRvIHVzZVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVEaXNwYXRjaGVyKGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiwgb3B0aW9uczogUGljazxWb2ljZUNvbm5lY3RDb25maWcsICdhdWRpb1BsYXllcicgfCAndGltZW91dCc+ID0ge30pIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5jYWNoZS5nZXQoY29ubmVjdGlvbi5qb2luQ29uZmlnLmNoYW5uZWxJZCEpO1xuICAgICAgICBpZiAoIWNoYW5uZWwpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1ZPSUNFX0NIQU5ORUwoKTtcbiAgICAgICAgaWYgKCFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdjaGFubmVsJywgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsIFN0cmluZyhjaGFubmVsPy50eXBlKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKGNvbm5lY3Rpb24sIGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMudGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQsIG9wdGlvbnMuYXVkaW9QbGF5ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsXG4gICAgICogQHBhcmFtIGNoYW5uZWxSZXNvbHZhYmxlIFRoZSB2b2ljZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBKb2luIGNvbmZpZ1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KGNoYW5uZWxSZXNvbHZhYmxlOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsIG9wdGlvbnM6IFZvaWNlQ29ubmVjdENvbmZpZyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsUmVzb2x2YWJsZSk7XG4gICAgICAgIGlmICghY2hhbm5lbCB8fCAhY2hhbm5lbC5pc1ZvaWNlQmFzZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2hhbm5lbCcsIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLCBTdHJpbmcoY2hhbm5lbD8udHlwZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENvbm5lY3RpbmcgdG8gJHtjaGFubmVsLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSA/ICdzdGFnZScgOiAndm9pY2UnfSBjaGFubmVsICR7Y2hhbm5lbC5uYW1lfSAoSUQ6ICR7Y2hhbm5lbC5pZH0pYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hlciAmJiBjaGFubmVsLmlkICE9PSB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbC5pZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0Rlc3Ryb3lpbmcgb2xkIGNvbm5lY3Rpb24nKTtcbiAgICAgICAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBhd2FpdCB0aGlzLnBsYXllci52b2ljZVV0aWxzLmNvbm5lY3QoY2hhbm5lbCwge1xuICAgICAgICAgICAgZGVhZjogb3B0aW9ucy5kZWFmID8/IHRoaXMub3B0aW9ucy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgICAgICAgbWF4VGltZTogb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgICAgICAgIHF1ZXVlOiB0aGlzLFxuICAgICAgICAgICAgYXVkaW9QbGF5ZXI6IG9wdGlvbnM/LmF1ZGlvUGxheWVyLFxuICAgICAgICAgICAgZ3JvdXA6IG9wdGlvbnMuZ3JvdXAgPz8gdGhpcy5wbGF5ZXIuY2xpZW50LnVzZXI/LmlkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY29ubmVjdGlvbiwgdGhpcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2hhbm5lbCEudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFN1cHByZXNzZWQoZmFsc2UpLmNhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh0cnVlKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiNhdHRhY2hMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIGR5bmFtaWMgV2hldGhlciB0byBzaHVmZmxlIHRoZSBxdWV1ZSBkeW5hbWljYWxseS4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIER5bmFtaWMgc2h1ZmZsaW5nIHdpbGwgc2h1ZmZsZSB0aGUgcXVldWUgd2hlbiB0aGUgY3VycmVudCB0cmFjayBlbmRzLCB3aXRob3V0IG11dGF0aW5nIHRoZSBxdWV1ZS5cbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgdGhlIHF1ZXVlIHdpbGwgYmUgc2h1ZmZsZWQgaW1tZWRpYXRlbHkgaW4tcGxhY2UsIHdoaWNoIGNhbm5vdCBiZSB1bmRvbmUuXG4gICAgICovXG4gICAgcHVibGljIGVuYWJsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICAgICAgaWYgKCFkeW5hbWljKSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrcy5zaHVmZmxlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI3NodWZmbGUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVNodWZmbGUoKSB7XG4gICAgICAgIHRoaXMuI3NodWZmbGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHJldHVybnMgV2hldGhlciBzaHVmZmxlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICAgICAgaWYgKGR5bmFtaWMpIHtcbiAgICAgICAgICAgIHRoaXMuI3NodWZmbGUgPSAhdGhpcy4jc2h1ZmZsZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNzaHVmZmxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmFja3Muc2h1ZmZsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHNodWZmbGUgbW9kZSBpcyBlbmFibGVkIGZvciB0aGlzIHF1ZXVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNTaHVmZmxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzaHVmZmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIGxhdGVuY3kgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbj8ucGluZy51ZHAgPz8gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlKCkge1xuICAgICAgICBpZiAodGhpcy5wbGF5ZXIubm9kZXMuZGVsZXRlKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLiNkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZURlbGV0ZSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLm5vZGUudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgICAgICAgIHRoaXMudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldml2ZXMgdGhpcyBxdWV1ZVxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHVibGljIHJldml2ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlbGV0ZWQgfHwgdGhpcy5wbGF5ZXIubm9kZXMuaGFzKHRoaXMuaWQpKSByZXR1cm47XG4gICAgICAgIHRoaXMuI2RlbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuc2V0KHRoaXMuaWQsIHRoaXMpO1xuICAgICAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucXVldWVDcmVhdGUsIHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzZWxmIGRlYWZcbiAgICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxmRGVhZihtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldERlYWYobW9kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgc2VsZiBtdXRlXG4gICAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAgICogQHBhcmFtIHJlYXNvbiBSZWFzb25cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2VsZk11dGUobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRNdXRlKG1vZGUsIHJlYXNvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSBhIHRyYWNrIGluIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJlIHBsYXllZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBub2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheSh0cmFjazogVHJhY2tMaWtlLCBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxNZXRhPikge1xuICAgICAgICBpZiAoIXRoaXMuY2hhbm5lbCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fVk9JQ0VfQ09OTkVDVElPTigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5wbGF5KHRoaXMuY2hhbm5lbCwgdHJhY2ssIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXQgYW4gZXZlbnQgb24gdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZW1pdFxuICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmdzIGZvciB0aGUgZXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgR3VpbGRRdWV1ZUV2ZW50czxNZXRhPj4oZXZlbnQ6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8R3VpbGRRdWV1ZUV2ZW50czxNZXRhPltLXT4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgICNhdHRhY2hMaXN0ZW5lcnMoZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdlcnJvcicsIChlKSA9PiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVycm9yLCB0aGlzLCBlKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2RlYnVnJywgKG0pID0+IHRoaXMuaGFzRGVidWdnZXIgJiYgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kZWJ1ZywgdGhpcywgbSkpO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdmaW5pc2gnLCAocikgPT4gdGhpcy4jcGVyZm9ybUZpbmlzaChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ3N0YXJ0JywgKHIpID0+IHRoaXMuI3BlcmZvcm1TdGFydChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2Rlc3Ryb3llZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyhkaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdkc3AnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QuaXModGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kc3BVcGRhdGUsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2JpcXVhZCcsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCAhPT0gZikge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYmlxdWFkRmlsdGVyc1VwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2VxQmFuZHMnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QuaXMoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVxdWFsaXplclVwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ3ZvbHVtZScsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSAhPT0gZikgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC52b2x1bWVDaGFuZ2UsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsIGYpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IGY7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuaGFzRGVidWdnZXI7XG4gICAgfVxuXG4gICAgI3JlbW92ZUxpc3RlbmVyczxUIGV4dGVuZHMgeyByZW1vdmVBbGxMaXN0ZW5lcnM6ICgpID0+IHVua25vd24gfT4odGFyZ2V0OiBUKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAjcGVyZm9ybVN0YXJ0KHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuaXNUcmFuc2l0aW9uaW5nKCkgPyAnZmlsdGVycycgOiAnbm9ybWFsJztcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAgICAgYFBsYXllciB0cmlnZ2VyZWQgZm9yIFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICAgICB9KX1gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyVHJpZ2dlciwgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgICAgICBpZiAodHJhY2sgJiYgIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyU3RhcnQsIHRoaXMsIHRyYWNrKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB9XG5cbiAgICAjZ2V0TmV4dFRyYWNrKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNTaHVmZmxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLnRyYWNrcy5zdG9yZTtcblxuICAgICAgICBpZiAoIXN0b3JlLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHRyYWNrID0gVXRpbC5yYW5kb21DaG9pY2Uoc3RvcmUpO1xuXG4gICAgICAgIHRoaXMudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHQuaWQgPT09IHRyYWNrLmlkO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdHJhY2s7XG4gICAgfVxuXG4gICAgI3BlcmZvcm1GaW5pc2gocmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgICAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICAgICAgICAgICAgfSl9IHdhcyBtYXJrZWQgYXMgZmluaXNoZWRgXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5zeW5jZWRMeXJpY3NQcm92aWRlci51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5zeW5jZWRMeXJpY3NQcm92aWRlci5seXJpY3MuY2xlYXIoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdBZGRpbmcgdHJhY2sgdG8gaGlzdG9yeSBhbmQgZW1pdHRpbmcgZmluaXNoIGV2ZW50IHNpbmNlIHRyYW5zaXRpb24gbW9kZSBpcyBkaXNhYmxlZC4uLicpO1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2godHJhY2spO1xuICAgICAgICAgICAgdGhpcy5ub2RlLnJlc2V0UHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyRmluaXNoLCB0aGlzLCB0cmFjayk7XG4gICAgICAgICAgICBpZiAodGhpcy4jZGVsZXRlZCkgcmV0dXJuIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrcy5zaXplIDwgMSAmJiB0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5PRkYpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTm8gbW9yZSB0cmFja3MgbGVmdCBpbiB0aGUgcXVldWUgdG8gcGxheSBhbmQgcmVwZWF0IG1vZGUgaXMgb2ZmLCBpbml0aWF0aW5nICNlbWl0RW5kKCknKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5UUkFDSykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy5oaXN0b3J5LnRyYWNrcy5kaXNwYXRjaCgpIHx8IHRyYWNrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQhLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gcXVldWUsIG1vdmluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkgdG8gY3VycmVudCBxdWV1ZS4uLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNrcy5hZGQodGhpcy5oaXN0b3J5LnRyYWNrcy5kaXNwYXRjaCgpIHx8IHRyYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRyYWNrcy5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5BVVRPUExBWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBhdXRvcGxheSwgaW5pdGlhdGluZyBhdXRvcGxheSBoYW5kbGVyLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNoYW5kbGVBdXRvcGxheSh0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy4jZ2V0TmV4dFRyYWNrKCkhO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUucGxheSh0aGlzLl9fY3VycmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgICNlbWl0RW5kKCkge1xuICAgICAgICB0aGlzLl9fY3VycmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlRdWV1ZSwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGVhdmVPbkVuZCkge1xuICAgICAgICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zLmxlYXZlT25FbmRDb29sZG93bikudW5yZWYoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jICNoYW5kbGVBdXRvcGxheSh0cmFjazogVHJhY2spIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBGaW5kaW5nIHJlbGF0ZWQgdHJhY2tzIGZvciBUcmFjayAke3RyYWNrLnRpdGxlfSAoJHt0cmFjay51cmx9KSBbZXh0OiR7dHJhY2suZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnfV1gKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYWNrcyA9XG4gICAgICAgICAgICAgICAgKGF3YWl0IHRyYWNrLmV4dHJhY3Rvcj8uZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KSk/LnRyYWNrcyB8fFxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IFF1ZXJ5aW5nIGV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy50cmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgdG8gcHJvdmlkZSByZXN1bHRzLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgcmVzdWx0cy5gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy50cmFja3M7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8ucmVzdWx0IHx8XG4gICAgICAgICAgICAgICAgW107XG5cbiAgICAgICAgICAgIGxldCByZXNvbHZlcjogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICAgICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRyYWNrIHwgbnVsbD4oKHJlc29sdmUpID0+IChyZXNvbHZlciA9IHJlc29sdmUpKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQud2lsbEF1dG9QbGF5LCB0aGlzLCB0cmFja3MsIHJlc29sdmVyISk7XG5cbiAgICAgICAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIoXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZSA9IHRyYWNrcy5maWx0ZXIoKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlPy5bMF0gPz8gVXRpbC5yYW5kb21DaG9pY2UodHJhY2tzLnNsaWNlKDAsIDUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV4dFRyYWNrID0gYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgICAgICAgIGlmICghbmV4dFRyYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0F1dG9wbGF5ID4+IE5vIHRyYWNrIHdhcyBmb3VuZCwgaW5pdGlhdGluZyAjZW1pdEVuZCgpJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgJ05vIHRyYWNrIHdhcyBmb3VuZCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubm9kZS5wbGF5KG5leHRUcmFjaywge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrOiAwLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIEF1ZGlvUGxheWVyLFxuICAgIEF1ZGlvUGxheWVyRXJyb3IsXG4gICAgQXVkaW9QbGF5ZXJTdGF0dXMsXG4gICAgQXVkaW9SZXNvdXJjZSxcbiAgICBjcmVhdGVBdWRpb1BsYXllcixcbiAgICBjcmVhdGVBdWRpb1Jlc291cmNlLFxuICAgIGVudGVyc1N0YXRlLFxuICAgIFN0cmVhbVR5cGUsXG4gICAgVm9pY2VDb25uZWN0aW9uLFxuICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cyxcbiAgICBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uXG59IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgQmlxdWFkRmlsdGVycywgUENNRmlsdGVycywgRmlsdGVyc0NoYWluIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFBvc3RQcm9jZXNzZWRSZXN1bHQgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTdHJlYW1PcHMge1xuICAgIHR5cGU/OiBTdHJlYW1UeXBlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YT86IGFueTtcbiAgICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlRXF1YWxpemVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWRGaWx0ZXI/OiBCaXF1YWRGaWx0ZXJzO1xuICAgIGRpc2FibGVGaWx0ZXJzPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgICB2b2x1bWU/OiBudW1iZXI7XG4gICAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gICAgc2FtcGxlUmF0ZT86IG51bWJlcjtcbiAgICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUV2ZW50cyB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICAgIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgICBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gYW55O1xuICAgIHN0YXJ0OiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gICAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gICAgZHNwOiAoZmlsdGVyczogUENNRmlsdGVyc1tdKSA9PiBhbnk7XG4gICAgZXFCYW5kczogKGZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSkgPT4gYW55O1xuICAgIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBudW1iZXIpID0+IGFueTtcbiAgICBiaXF1YWQ6IChmaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzKSA9PiBhbnk7XG4gICAgdm9sdW1lOiAodm9sdW1lOiBudW1iZXIpID0+IGFueTtcbiAgICBkZXN0cm95ZWQ6ICgpID0+IGFueTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbn1cblxuY2xhc3MgU3RyZWFtRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxWb2ljZUV2ZW50cz4ge1xuICAgIHB1YmxpYyB2b2ljZUNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbjtcbiAgICBwdWJsaWMgYXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyO1xuICAgIHB1YmxpYyBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWw7XG4gICAgcHVibGljIGF1ZGlvUmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGw7XG4gICAgcHVibGljIGRzcCA9IG5ldyBGaWx0ZXJzQ2hhaW4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGNvbm5lY3Rpb24gb2JqZWN0XG4gICAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9IGNoYW5uZWwgVGhlIGNvbm5lY3RlZCBjaGFubmVsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCwgcHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlLCBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlciA9IDIwMDAwLCBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAgICAgICAqIEB0eXBlIHtWb2ljZUNvbm5lY3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdWRpbyBwbGF5ZXJcbiAgICAgICAgICogQHR5cGUge0F1ZGlvUGxheWVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdWRpb1BsYXllciA9XG4gICAgICAgICAgICBhdWRpb1BsYXllciB8fFxuICAgICAgICAgICAgY3JlYXRlQXVkaW9QbGF5ZXIoe1xuICAgICAgICAgICAgICAgIGRlYnVnOiB0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgICAgICogQHR5cGUge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdlcnJvcicsIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IgYXMgQXVkaW9QbGF5ZXJFcnJvcikpO1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgICAgIHRoaXMuZHNwLm9uVXBkYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRzcCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpIHRoaXMuZW1pdCgnZHNwJywgdGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycyk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuYmlxdWFkPy5maWx0ZXIpIHRoaXMuZW1pdCgnYmlxdWFkJywgdGhpcy5kc3AuYmlxdWFkPy5maWx0ZXIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmVxdWFsaXplcikgdGhpcy5lbWl0KCdlcUJhbmRzJywgdGhpcy5kc3AuZXF1YWxpemVyLmdldEVRKCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLnZvbHVtZSkgdGhpcy5lbWl0KCd2b2x1bWUnLCB0aGlzLmRzcC52b2x1bWUudm9sdW1lKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5yZXNhbXBsZXIpIHRoaXMuZW1pdCgnc2FtcGxlUmF0ZScsIHRoaXMuZHNwLnJlc2FtcGxlci50YXJnZXRTYW1wbGVSYXRlKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRzcC5vbkVycm9yID0gKGUpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uXG4gICAgICAgICAgICAub24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZCwgYXN5bmMgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uTWFudWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5XZWJTb2NrZXRDbG9zZSAmJiBuZXdTdGF0ZS5jbG9zZUNvZGUgPT09IDQwMTQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKHRoaXMudm9pY2VDb25uZWN0aW9uLCBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZywgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBVdGlsLndhaXQoKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzICsgMSkgKiA1MDAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY29ubmVjdGlvbkRlc3Ryb3llZCwgdGhpcy5xdWV1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdzdGF0ZUNoYW5nZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCAmJiBuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyUGF1c2UsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiYgbmV3U3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclJlc3VtZSwgdGhpcy5xdWV1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlIHx8IG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3N0YXJ0JywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgJiYgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdmaW5pc2gnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3Vic2NyaWJlKHRoaXMuYXVkaW9QbGF5ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBwbGF5ZXIgaGFzIGJlZW4gcGF1c2VkIG1hbnVhbGx5XG4gICAgICovXG4gICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQ7XG4gICAgfVxuXG4gICAgc2V0IHBhdXNlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdmFsID8gdGhpcy5wYXVzZSh0cnVlKSA6IHRoaXMucmVzdW1lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkuXG4gICAgICovXG4gICAgaXNQYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhdXNlZCB8fCB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQXV0b1BhdXNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmdcbiAgICAgKi9cbiAgICBpc0J1ZmZlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZ1xuICAgICAqL1xuICAgIGlzUGxheWluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGlkbGVcbiAgICAgKi9cbiAgICBpc0lkbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBpc0Rlc3Ryb3llZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBpc0Rpc2Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyByZWFkeSB0byBwbGF5XG4gICAgICovXG4gICAgaXNSZWFkeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHNpZ25hbGxpbmdcbiAgICAgKi9cbiAgICBpc1NpZ25hbGxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5TaWduYWxsaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RpbmdcbiAgICAgKi9cbiAgICBpc0Nvbm5lY3RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgc3RyZWFtXG4gICAgICogQHBhcmFtIHtSZWFkYWJsZX0gc3JjIFRoZSBzdHJlYW0gc291cmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHNdIE9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7QXVkaW9SZXNvdXJjZX1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTdHJlYW0oc3JjOiBSZWFkYWJsZSwgb3BzPzogQ3JlYXRlU3RyZWFtT3BzKSB7XG4gICAgICAgIGlmICghb3BzPy5kaXNhYmxlRmlsdGVycyAmJiB0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdJbml0aWF0aW5nIERTUCBmaWx0ZXJzIHBpcGVsaW5lLi4uJyk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9ICFvcHM/LmRpc2FibGVGaWx0ZXJzXG4gICAgICAgICAgICA/IHRoaXMuZHNwLmNyZWF0ZShzcmMsIHtcbiAgICAgICAgICAgICAgICAgIGRzcDoge1xuICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IG9wcz8uZGVmYXVsdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBiaXF1YWQ6IG9wcz8uYmlxdWFkRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBvcHMuYmlxdWFkRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVCaXF1YWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHJlc2FtcGxlcjoge1xuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFNhbXBsZVJhdGU6IG9wcz8uc2FtcGxlUmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlUmVzYW1wbGVyXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZXF1YWxpemVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgYmFuZE11bHRpcGxpZXI6IG9wcz8uZXEsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUVxdWFsaXplclxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHZvbHVtZToge1xuICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZTogb3BzPy52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVZvbHVtZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBzcmM7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0V4ZWN1dGluZyBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhvb2suLi4nKTtcbiAgICAgICAgY29uc3QgcG9zdFN0cmVhbSA9IGF3YWl0IHRoaXMucXVldWUub25BZnRlckNyZWF0ZVN0cmVhbT8uKHN0cmVhbSwgdGhpcy5xdWV1ZSkuY2F0Y2goXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbTogc3RyZWFtLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnlcbiAgICAgICAgICAgICAgICB9IGFzIFBvc3RQcm9jZXNzZWRSZXN1bHQpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1ByZXBhcmluZyBBdWRpb1Jlc291cmNlLi4uJyk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IGNyZWF0ZUF1ZGlvUmVzb3VyY2UocG9zdFN0cmVhbT8uc3RyZWFtID8/IHN0cmVhbSwge1xuICAgICAgICAgICAgaW5wdXRUeXBlOiBwb3N0U3RyZWFtPy50eXBlID8/IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBvcHM/LmRhdGEsXG4gICAgICAgICAgICAvLyB2b2x1bWUgY29udHJvbHMgaGFwcGVuIGZyb20gQXVkaW9GaWx0ZXIgRFNQIHV0aWxpdHlcbiAgICAgICAgICAgIGlubGluZVZvbHVtZTogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5yZXNhbXBsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uYmlxdWFkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8uZXF1YWxpemVyIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllciBzdGF0dXNcbiAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJTdGF0dXN9XG4gICAgICovXG4gICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9QbGF5ZXIpIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhpcyBkaXNwYXRjaGVyXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95ZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyB0aGUgcGxheWVyXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZW5kKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1BsYXllci5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhdXNlcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJwb2xhdGVTaWxlbmNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgcGxheWVyIHdpbGwgcGxheSA1IHBhY2tldHMgb2Ygc2lsZW5jZSBhZnRlciBwYXVzaW5nIHRvIHByZXZlbnQgYXVkaW8gZ2xpdGNoZXMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgcGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci5wYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2UpO1xuICAgICAgICByZXR1cm4gc3VjY2VzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWVzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnVucGF1c2UoKTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSBzdHJlYW1cbiAgICAgKiBAcGFyYW0ge0F1ZGlvUmVzb3VyY2U8VHJhY2s+fSBbcmVzb3VyY2U9dGhpcy5hdWRpb1Jlc291cmNlXSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdXM9ZmFsc2VdIFdoZXRoZXIgb3Igbm90IHRvIHVzZSBvcHVzXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAgICovXG4gICAgYXN5bmMgcGxheVN0cmVhbShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4gPSB0aGlzLmF1ZGlvUmVzb3VyY2UhKSB7XG4gICAgICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX0FVRElPX1JFU09VUkNFKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc291cmNlLmVuZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHJlc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgdGhpcy5hdWRpb1Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZSh0aGlzLnZvaWNlQ29ubmVjdGlvbiwgVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5LCB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1BsYXllci5wbGF5KHJlc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHBsYXliYWNrIHZvbHVtZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdm9sdW1lIGFtb3VudFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHNldFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUuc2V0Vm9sdW1lKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2b2x1bWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gMTAwO1xuICAgICAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnZvbHVtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWJhY2sgdGltZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5hdWRpb1Jlc291cmNlKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZS5wbGF5YmFja0R1cmF0aW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciBhcyBTdHJlYW1EaXNwYXRjaGVyIH07XG4iLCAiaW1wb3J0IHsgUXVldWUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgdHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPignTElGTycpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCAoKHRoaXMucXVldWUgYXMgYW55KS5fX2N1cnJlbnQgYXMgVHJhY2sgfCBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbmV4dFRyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHByZXZpb3VzVHJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGhpc3RvcnkgaXMgZGlzYWJsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVIaXN0b3J5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBoaXN0b3J5IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdHJhY2sgdG8gdHJhY2sgaGlzdG9yeVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYWRkXG4gICAgICovXG4gICAgcHVibGljIHB1c2godHJhY2s6IFRyYWNrIHwgVHJhY2tbXSkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnRyYWNrcy5hZGQodHJhY2spO1xuXG4gICAgICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgaGlzdG9yeVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoZSBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBuZXh0KCkge1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMubmV4dFRyYWNrO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ05vIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnF1ZXVlLm5vZGUuc2tpcCh7XG4gICAgICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5IaXN0b3J5TmV4dCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcHBlZCBieSBHdWlsZFF1ZXVlSGlzdG9yeS5uZXh0KCknXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgaWYgKCF0cmFjaykge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdObyBwcmV2aW91cyB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0cmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIGlmIChjdXJyZW50ICYmIHByZXNlcnZlQ3VycmVudCkgdGhpcy5xdWV1ZS5ub2RlLmluc2VydChjdXJyZW50LCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGlhcyB0byBbR3VpbGRRdWV1ZUhpc3RvcnldLnByZXZpb3VzKClcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFjayhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzKHByZXNlcnZlQ3VycmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplIGhpc3Rvcnkgc3RvcmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzaXplKCkge1xuICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy50cmFja3Muc3RvcmUubGVuZ3RoIDwgdGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50LCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyB3YWl0Rm9yIH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBDcmVhdGVTdHJlYW1PcHMgfSBmcm9tICcuLi9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IEV4dHJhY3RvclN0cmVhbWFibGUgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgT2dnRGVtdXhlciwgT3B1c0RlY29kZXIsIFdlYm1EZW11eGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL29wdXMnO1xuXG5leHBvcnQgY29uc3QgRkZNUEVHX1NSQVRFX1JFR0VYID0gL2FzZXRyYXRlPVxcZCtcXCooXFxkKFxcLlxcZCk/KS87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQbGF5T3B0aW9ucyB7XG4gICAgcXVldWU/OiBib29sZWFuO1xuICAgIHNlZWs/OiBudW1iZXI7XG4gICAgdHJhbnNpdGlvbk1vZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNraXBPcHRpb25zIHtcbiAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbjtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclRpbWVzdGFtcCB7XG4gICAgY3VycmVudDoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgIH07XG4gICAgdG90YWw6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICB9O1xuICAgIHByb2dyZXNzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtQ29uZmlnIHtcbiAgICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gICAgcGxheWVyQ29uZmlnOiBSZXNvdXJjZVBsYXlPcHRpb25zO1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YSA9IHVua25vd24+IHtcbiAgICAjcHJvZ3Jlc3MgPSAwO1xuICAgICNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSBmYWxzZTtcbiAgICBwdWJsaWMgdGFza3NRdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICB0aGlzLiNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSAvbGlib3B1czogKHllc3x0cnVlKS8udGVzdCh0aGlzLnF1ZXVlLnBsYXllci5zY2FuRGVwcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpbiBpZGxlIG1vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNJZGxlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzSWRsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZyB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNCdWZmZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNCdWZmZXJpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBwbGF5aW5nIGEgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGxheWluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1BhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BhdXNlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0IHByb2dyZXNzIGhpc3RvcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRQcm9ncmVzcygpIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBwbGF5ZXIgcHJvZ3Jlc3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UHJvZ3Jlc3MocHJvZ3Jlc3M6IG51bWJlcikge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlYW0gdGltZSBmb3IgY3VycmVudCBzZXNzaW9uXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5zdHJlYW1UaW1lID8/IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCBwbGF5YmFjayBkdXJhdGlvbiB3aXRoIGhpc3RvcnkgaW5jbHVkZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBsYXliYWNrVGltZSgpIHtcbiAgICAgICAgY29uc3QgZHVyID0gdGhpcy4jcHJvZ3Jlc3MgKyB0aGlzLnN0cmVhbVRpbWU7XG5cbiAgICAgICAgcmV0dXJuIGR1cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZHVyYXRpb24gbXVsdGlwbGllclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREdXJhdGlvbk11bHRpcGxpZXIoKSB7XG4gICAgICAgIGNvbnN0IHNyYXRlRmlsdGVycyA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcudG9BcnJheSgpLmZpbHRlcigoZmYpID0+IEZGTVBFR19TUkFURV9SRUdFWC50ZXN0KGZmKSk7XG4gICAgICAgIGNvbnN0IG11bHRpcGxpZXJzID0gc3JhdGVGaWx0ZXJzXG4gICAgICAgICAgICAubWFwKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoRkZNUEVHX1NSQVRFX1JFR0VYLmV4ZWMobSk/LlsxXSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGYpID0+ICFpc05hTihmKSk7XG5cbiAgICAgICAgcmV0dXJuICFtdWx0aXBsaWVycy5sZW5ndGggPyAxIDogbXVsdGlwbGllcnMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gY3VycmVudCArIGFjY3VtdWxhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgcHJvZ3Jlc3Mgb2YgdGhlIHBsYXllclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkUGxheWJhY2tUaW1lKCkge1xuICAgICAgICBjb25zdCBkdXIgPSB0aGlzLnBsYXliYWNrVGltZTtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSAqIGR1cik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXN0aW1hdGVkIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBwbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgICAgICBjb25zdCBkdXIgPSB0aGlzLnRvdGFsRHVyYXRpb247XG5cbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZHVyIC8gdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG90YWwgZHVyYXRpb24gb2YgdGhlIGN1cnJlbnQgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsRHVyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEgPSB0aGlzLnF1ZXVlLm9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhO1xuICAgICAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGlmIChwcmVmZXJzQnJpZGdlZE1ldGFkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFja0hhc0xlZ2FjeU1ldGFkYXRhID0gdHJhY2s/Lm1ldGFkYXRhICE9IG51bGwgJiYgdHlwZW9mIHRyYWNrLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJiAnYnJpZGdlJyBpbiB0cmFjay5tZXRhZGF0YSAmJiB0cmFjay5tZXRhZGF0YS5icmlkZ2UgIT0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHRyYWNrSGFzTWV0YWRhdGEgPSB0cmFjaz8uYnJpZGdlZFRyYWNrICE9IG51bGw7XG5cbiAgICAgICAgICAgIGlmICh0cmFja0hhc0xlZ2FjeU1ldGFkYXRhIHx8IHRyYWNrSGFzTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgIHRyYWNrLmJyaWRnZWRUcmFjaz8uZHVyYXRpb25NUyA/P1xuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFjayBhcyBUcmFjazx7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZGdlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgICAgICAgICkubWV0YWRhdGE/LmJyaWRnZS5kdXJhdGlvbjtcblxuICAgICAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc051bWJlcihkdXJhdGlvbikpIHJldHVybiBkdXJhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmFjaz8uZHVyYXRpb25NUyA/PyAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzdHJlYW0gcHJvZ3Jlc3NcbiAgICAgKiBAcGFyYW0gaWdub3JlRmlsdGVycyBJZ25vcmUgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyA9IGZhbHNlKTogUGxheWVyVGltZXN0YW1wIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBpZ25vcmVGaWx0ZXJzID8gdGhpcy5wbGF5YmFja1RpbWUgOiB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZTtcbiAgICAgICAgY29uc3QgdG90YWwgPSBpZ25vcmVGaWx0ZXJzID8gdGhpcy50b3RhbER1cmF0aW9uIDogdGhpcy5lc3RpbWF0ZWREdXJhdGlvbjtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3VycmVudDoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKGN1cnJlbnQpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY3VycmVudFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvdGFsOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModG90YWwpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdG90YWxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9ncmVzczogTWF0aC5yb3VuZCgoY3VycmVudCAvIHRvdGFsKSAqIDEwMClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciBjdXJyZW50IHByb2dyZXNzXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUHJvZ3Jlc3MgYmFyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUHJvZ3Jlc3NCYXIob3B0aW9ucz86IFBsYXllclByb2dyZXNzYmFyT3B0aW9ucykge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xuICAgICAgICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgaW5kaWNhdG9yID0gJ1xcdXsxRjUxOH0nLCBsZWZ0Q2hhciA9ICdcXHUyNUFDJywgcmlnaHRDaGFyID0gJ1xcdTI1QUMnLCBsZW5ndGggPSAxNSwgdGltZWNvZGVzID0gdHJ1ZSwgc2VwYXJhdG9yID0gJ1xcdTI1MDMnIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAoaXNOYU4obGVuZ3RoKSB8fCBsZW5ndGggPCAwIHx8ICFOdW1iZXIuaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfT1VUX09GX1JBTkdFKCdbUGxheWVyUHJvZ3Jlc3NCYXJPcHRpb25zLmxlbmd0aF0nLCBTdHJpbmcobGVuZ3RoKSwgJzAnLCAnRmluaXRlIE51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZCgodGltZXN0YW1wLmN1cnJlbnQudmFsdWUgLyB0aW1lc3RhbXAudG90YWwudmFsdWUpICogbGVuZ3RoKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDEgJiYgaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBiYXIgPSBsZWZ0Q2hhci5yZXBlYXQoaW5kZXggLSAxKS5zcGxpdCgnJyk7XG4gICAgICAgICAgICBiYXIucHVzaChpbmRpY2F0b3IpO1xuICAgICAgICAgICAgYmFyLnB1c2gocmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSBpbmRleCkpO1xuICAgICAgICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aW1lc3RhbXAuY3VycmVudC5sYWJlbH0gJHtzZXBhcmF0b3J9ICR7YmFyLmpvaW4oJycpfSAke3NlcGFyYXRvcn0gJHt0aW1lc3RhbXAudG90YWwubGFiZWx9YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2Jhci5qb2luKCcnKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aW1lc3RhbXAuY3VycmVudC5sYWJlbH0gJHtzZXBhcmF0b3J9ICR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSAxKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIDEpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWVrIHRoZSBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIHRvIHNlZWsgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VlayhkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGR1cmF0aW9uID09PSB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChkdXJhdGlvbiA+IHRoaXMudG90YWxEdXJhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCh7XG4gICAgICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU0VFS19PVkVSX1RIUkVTSE9MRCxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogRXhjZXB0aW9ucy5FUlJfT1VUX09GX1JBTkdFKCdbZHVyYXRpb25dJywgU3RyaW5nKGR1cmF0aW9uKSwgJzAnLCBTdHJpbmcodGhpcy50b3RhbER1cmF0aW9uKSkubWVzc2FnZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR1cmF0aW9uIDwgMCkgZHVyYXRpb24gPSAwO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5xdWV1ZS5maWx0ZXJzLnRyaWdnZXJSZXBsYXkoZHVyYXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgdm9sdW1lXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnZvbHVtZSA/PyAxMDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHZvbHVtZVxuICAgICAqIEBwYXJhbSB2b2wgVm9sdW1lIGFtb3VudCB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMucXVldWUuZGlzcGF0Y2hlci5zZXRWb2x1bWUodm9sKTtcbiAgICAgICAgaWYgKHJlcykgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHZvbDtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYml0IHJhdGVcbiAgICAgKiBAcGFyYW0gcmF0ZSBUaGUgYml0IHJhdGUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldEJpdHJhdGUocmF0ZTogbnVtYmVyIHwgJ2F1dG8nKSB7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8uZW5jb2Rlcj8uc2V0Qml0cmF0ZShyYXRlID09PSAnYXV0bycgPyB0aGlzLnF1ZXVlLmNoYW5uZWw/LmJpdHJhdGUgPz8gNjQwMDAgOiByYXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgcGF1c2VkIHN0YXRlXG4gICAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQYXVzZWQoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHN0YXRlKSByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5wYXVzZSh0cnVlKSB8fCBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzdW1lKCkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHBhdXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBwbGF5YmFja1xuICAgICAqL1xuICAgIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFBhdXNlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCBjdXJyZW50IHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHNraXAob3B0aW9ucz86IFNraXBPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG4gICAgICAgIGlmICghdHJhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgICAgICBjb25zdCB7IHJlYXNvbiwgZGVzY3JpcHRpb24gfSA9IG9wdGlvbnMgfHwge1xuICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uTWFudWFsLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdHJhY2sgd2FzIHNraXBwZWQgbWFudWFsbHknXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyU2tpcCwgdGhpcy5xdWV1ZSwgdHJhY2ssIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqIEBwYXJhbSBlbWl0RXZlbnQgV2hldGhlciBvciBub3QgdG8gZW1pdCB0aGUgZXZlbnQgQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZSh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBlbWl0RXZlbnQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kVHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5maW5kKCh0LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICAgICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZm91bmRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB0LmlkID09PSBmb3VuZFRyYWNrLmlkKTtcblxuICAgICAgICBpZiAoZW1pdEV2ZW50KSB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvVHJhY2tSZW1vdmUsIHRoaXMucXVldWUsIGZvdW5kVHJhY2spO1xuXG4gICAgICAgIHJldHVybiBmb3VuZFRyYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gc3BlY2lmaWMgdHJhY2sgb24gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBqdW1wIHRvIHdpdGhvdXQgcmVtb3Zpbmcgb3RoZXIgdHJhY2tzXG4gICAgICovXG4gICAgcHVibGljIGp1bXAodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUodHJhY2ssIGZhbHNlKTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnVuc2hpZnQocmVtb3ZlZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSnVtcCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBqdW1wZWQgdG8gbWFudWFsbHknXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0cmFjayBwb3NpdGlvblxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VHJhY2tQb3NpdGlvbih0cmFjazogVHJhY2tSZXNvbHZhYmxlKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUudHJhY2tzLnRvQXJyYXkoKS5maW5kSW5kZXgoKHQsIGlkeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2sgfHwgdHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgICAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTa2lwIHRvIHRoZSBnaXZlbiB0cmFjaywgcmVtb3Zpbmcgb3RoZXJzIG9uIHRoZSB3YXlcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHNraXAgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgc2tpcFRvKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHRyYWNrKTtcbiAgICAgICAgaWYgKGlkeCA8IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGlkeCk7XG4gICAgICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlLmZpbHRlcigoXywgaSkgPT4gaSA8PSBpZHgpO1xuICAgICAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5zcGxpY2UoMCwgaWR4LCByZW1vdmVkKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb1RyYWNrc1JlbW92ZSwgdGhpcy5xdWV1ZSwgdG9SZW1vdmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNraXBUbyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBsYXllciB3YXMgc2tpcHBlZCB0byBhbm90aGVyIHRyYWNrIG1hbnVhbGx5J1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSB0cmFjayBvbiB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRvLCBkZWZhdWx0cyB0byAwLlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnNlcnQodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApIHtcbiAgICAgICAgaWYgKCEodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3RyYWNrIHZhbHVlJywgJ2luc3RhbmNlIG9mIFRyYWNrJywgU3RyaW5nKHRyYWNrKSk7XG4gICAgICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja0FkZCwgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGZyb20pO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCB0cmFjayB0byBtb3ZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNlcnQocmVtb3ZlZCwgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAgICovXG4gICAgcHVibGljIGNvcHkoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMucXVldWUudHJhY2tzLmF0KHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmcm9tKSk7XG4gICAgICAgIGlmICghc3JjKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgdHJhY2sgdG8gY29weScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zZXJ0KHNyYywgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgICAqL1xuICAgIHB1YmxpYyBzd2FwKGZpcnN0OiBUcmFja1Jlc29sdmFibGUsIHNlY29uZDogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmaXJzdCk7XG4gICAgICAgIGlmIChzcmMgPCAwKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgICAgICBjb25zdCBkZXN0ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHNlY29uZCk7XG4gICAgICAgIGlmIChkZXN0IDwgMCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdpbnZhbGlkIGRlc3QgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgICAgIGNvbnN0IHNyY1QgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdO1xuICAgICAgICBjb25zdCBkZXN0VCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY10gPSBkZXN0VDtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF0gPSBzcmNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3AgdGhlIHBsYXliYWNrXG4gICAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgb3Igbm90IHRvIGZvcmNlZnVsbHkgc3RvcCB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpIHx8IHRoaXMucXVldWUudHJhY2tzLnNpemUpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZGVzdHJveSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24pLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSByYXcgYXVkaW8gcmVzb3VyY2VcbiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheVJhdyhyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBsYXlTdHJlYW0ocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIHJlcyBUaGUgdHJhY2sgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXlpbmcgdGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXkocmVzPzogVHJhY2sgfCBudWxsLCBvcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DT05ORUNUSU9OKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgUmVjZWl2ZWQgcGxheSByZXF1ZXN0IGZyb20gZ3VpbGQgJHt0aGlzLnF1ZXVlLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLnF1ZXVlLmd1aWxkLmlkfSlgKTtcblxuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjayAhPSBudWxsLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrOiAwXG4gICAgICAgICAgICB9IGFzIFJlc291cmNlUGxheU9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICkhO1xuXG4gICAgICAgIGlmIChyZXMgJiYgb3B0aW9ucy5xdWV1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcXVldWUgdGhlIHRyYWNrLCBhZGRpbmcgdGhlIGdpdmVuIHRyYWNrIHRvIHF1ZXVlIGluc3RlYWQuLi4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFjayA9IHJlcyB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnUGxheSByZXF1ZXN0IHJlY2VpdmVkIGJ1dCB0cmFjayB3YXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVycm9yLCB0aGlzLnF1ZXVlLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBwbGF5IHRoZSB0cmFjaywgaW5pdGlhbGl6aW5nLi4uJyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBJbml0aWF0aW5nIHN0cmVhbSBleHRyYWN0aW9uIHByb2Nlc3MuLi5gKTtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IHRyYWNrLnJhdz8uc291cmNlIHx8IHRyYWNrLnNvdXJjZTtcbiAgICAgICAgICAgIGNvbnN0IHF0OiBTZWFyY2hRdWVyeVR5cGUgPSB0cmFjay5xdWVyeVR5cGUgfHwgKHNyYyA9PT0gJ3Nwb3RpZnknID8gJ3Nwb3RpZnlTb25nJyA6IHNyYyA9PT0gJ2FwcGxlX211c2ljJyA/ICdhcHBsZU11c2ljU29uZycgOiBzcmMpO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEV4ZWN1dGluZyBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBob29rIChRdWVyeVR5cGU6ICR7cXR9KS4uLmApO1xuXG4gICAgICAgICAgICBjb25zdCBzdHJlYW1TcmMgPSB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG51bGwgYXMgRXJyb3IgfCBudWxsLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogbnVsbCBhcyBFeHRyYWN0b3JTdHJlYW1hYmxlIHwgbnVsbFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5vbkJlZm9yZUNyZWF0ZVN0cmVhbT8uKHRyYWNrLCBxdCB8fCAnYXJiaXRyYXJ5JywgdGhpcy5xdWV1ZSkudGhlbihcbiAgICAgICAgICAgICAgICAocykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlOiBFcnJvcikgPT4gKHN0cmVhbVNyYy5lcnJvciA9IGUpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyB0aHJvdyBpZiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIHBhbmljc1xuICAgICAgICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtICYmIHN0cmVhbVNyYy5lcnJvcikgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAgICAgICAvLyBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBkaWQgbm90IHBhbmljXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRmFpbGVkIHRvIGdldCBzdHJlYW0gZnJvbSBvbkJlZm9yZUNyZWF0ZVN0cmVhbSEnKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLmNvbnRleHQucHJvdmlkZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWRFeHRyYWN0b3JzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyPy5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSA8UmVhZGFibGU+ci5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocj8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5lcnJvciA9IHIuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlOiBFcnJvcikgPT4gKHN0cmVhbVNyYy5lcnJvciA9IGUpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zZWVrID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnNlZWsgPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI3Byb2dyZXNzID0gb3B0aW9ucy5zZWVrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBjb25zdCBjb29raWVzID0gdHJhY2sucmF3Py5zb3VyY2UgPT09ICd5b3V0dWJlJyA/ICg8YW55PnRoaXMucXVldWUucGxheWVyLm9wdGlvbnMueXRkbE9wdGlvbnM/LnJlcXVlc3RPcHRpb25zKT8uaGVhZGVycz8uY29va2llIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBjb25zdCB0cmFja1N0cmVhbUNvbmZpZzogU3RyZWFtQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUJpcXVhZDogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVCaXF1YWQsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUZpbHRlcnM6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVSZXNhbXBsZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiB0eXBlb2YgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA9PT0gJ251bWJlcicgJiYgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA+IDAgPyB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBiaXF1YWRGaWx0ZXI6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBlcTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcixcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHRyYWNrLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhdyxcbiAgICAgICAgICAgICAgICAgICAgc2tpcEZGbXBlZzogdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwbGF5ZXJDb25maWc6IG9wdGlvbnNcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxldCByZXNvbHZlcjogKCkgPT4gdm9pZCA9IFV0aWwubm9vcDtcbiAgICAgICAgICAgIGNvbnN0IGRvbmVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IChyZXNvbHZlciA9IHJlc29sdmUpKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQud2lsbFBsYXlUcmFjaywgdGhpcy5xdWV1ZSwgdHJhY2ssIHRyYWNrU3RyZWFtQ29uZmlnLCByZXNvbHZlciEpO1xuXG4gICAgICAgICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgICAgICAgIGlmICghc3VjY2VzcykgcmVzb2x2ZXIoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1dhaXRpbmcgZm9yIHdpbGxQbGF5VHJhY2sgZXZlbnQgdG8gcmVzb2x2ZS4uLicpO1xuXG4gICAgICAgICAgICBhd2FpdCBkb25lUHJvbWlzZTtcblxuICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICBjb25zdCBkYXNwRGlzYWJsZWQgPSBbXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlQmlxdWFkLFxuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVGaWx0ZXJzLFxuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWVcbiAgICAgICAgICAgIF0uZXZlcnkoKGUpID0+ICEhZSA9PT0gdHJ1ZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5lZWRzRmlsdGVycyA9ICEhdHJhY2tTdHJlYW1Db25maWcucGxheWVyQ29uZmlnLnNlZWsgfHwgISF0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2tpcEZGbXBlZyA9ICEhdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5za2lwRkZtcGVnICYmICFuZWVkc0ZpbHRlcnM7XG5cbiAgICAgICAgICAgIGxldCBmaW5hbFN0cmVhbTogUmVhZGFibGU7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlbXV4YWJsZSA9IChmbXQ6IHN0cmluZykgPT4gW1N0cmVhbVR5cGUuT3B1cywgU3RyZWFtVHlwZS5XZWJtT3B1cywgU3RyZWFtVHlwZS5PZ2dPcHVzXS5pbmNsdWRlcyhmbXQgYXMgU3RyZWFtVHlwZSk7XG5cbiAgICAgICAgICAgIC8vIHNraXAgZmZtcGVnIHdoZW4gcG9zc2libGVcbiAgICAgICAgICAgIGlmIChzaG91bGRTa2lwRkZtcGVnICYmICEoc3RyZWFtU3JjLnN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlKSAmJiB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSAhPT0gJ3N0cmluZycgJiYgZGVtdXhhYmxlKHN0cmVhbVNyYy5zdHJlYW0uJGZtdCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7ICRmbXQsIHN0cmVhbSB9ID0gc3RyZWFtU3JjLnN0cmVhbTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRQQ00gPSAhZGFzcERpc2FibGVkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYHNraXBGRm1wZWcgaXMgc2V0IHRvIHRydWUgYW5kIHN0cmVhbSBpcyBkZW11eGFibGUsIGNyZWF0aW5nIHN0cmVhbSB3aXRoIHR5cGUgJHtzaG91bGRQQ00gPyAncGNtJyA6ICdvcHVzJ31gKTtcblxuICAgICAgICAgICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdXNTdHJlYW0gPSAkZm10ID09PSBTdHJlYW1UeXBlLk9wdXMgP1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0gOlxuICAgICAgICAgICAgICAgICAgICAkZm10ID09PSBTdHJlYW1UeXBlLk9nZ09wdXMgP1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucGlwZShuZXcgT2dnRGVtdXhlcigpIGFzIGFueSkgOlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucGlwZShuZXcgV2VibURlbXV4ZXIoKSBhcyBhbnkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFBDTSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSBmaWx0ZXJzIGVuYWJsZWQsIHdlIG5lZWQgdG8gZGVjb2RlIHRoZSBvcHVzIHN0cmVhbSB0byBwY21cbiAgICAgICAgICAgICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT3B1c0RlY29kZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZTogOTYwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGU6IDQ4MDAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuT3B1cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IG9wdXMgPSBkYXNwRGlzYWJsZWQgJiYgdGhpcy4jaGFzRkZtcGVnT3B0aW1pemF0aW9uO1xuICAgICAgICAgICAgICAgIC8vIGlmIChvcHVzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc2FibGluZyBQQ00gb3V0cHV0IHNpbmNlIGFsbCBmaWx0ZXJzIGFyZSBkaXNhYmxlZCBhbmQgb3B1cyBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuLi4nKTtcblxuICAgICAgICAgICAgICAgIGZpbmFsU3RyZWFtID0gdGhpcy4jY3JlYXRlRkZtcGVnU3RyZWFtKFxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtIGluc3RhbmNlb2YgUmVhZGFibGUgfHwgdHlwZW9mIHN0cmVhbVNyYy5zdHJlYW0gPT09ICdzdHJpbmcnID8gc3RyZWFtU3JjLnN0cmVhbSA6IHN0cmVhbVNyYy5zdHJlYW0uc3RyZWFtLFxuICAgICAgICAgICAgICAgICAgICB0cmFjayxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZWVrID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gb3B1c1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5SYXc7XG4gICAgICAgICAgICAgICAgLy8gRklYTUU6IE9nZ09wdXMgcmVzdWx0cyBpbiBzdGF0aWMgbm9pc2VcbiAgICAgICAgICAgICAgICAvLyB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBvcHVzID8gU3RyZWFtVHlwZS5PZ2dPcHVzIDogU3RyZWFtVHlwZS5SYXc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25Nb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFRyYW5zaXRpb24gbW9kZSBkZXRlY3RlZCwgcGxheWVyIHdpbGwgd2FpdCBmb3IgYnVmZmVyaW5nIHRpbWVvdXQgdG8gZXhwaXJlIChUaW1lb3V0OiAke3RoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0fW1zKWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdhaXRGb3IodGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdCdWZmZXJpbmcgdGltZW91dCBoYXMgZXhwaXJlZCEnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYFByZXBhcmluZyBmaW5hbCBzdHJlYW0gY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KHRyYWNrU3RyZWFtQ29uZmlnLCBudWxsLCAyKX1gKTtcblxuICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXMucXVldWUuZGlzcGF0Y2hlcjtcblxuICAgICAgICAgICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmluYWxTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IGRpc3BhdGNoZXIuY3JlYXRlU3RyZWFtKGZpbmFsU3RyZWFtLCB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyghIW9wdGlvbnMudHJhbnNpdGlvbk1vZGUpO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcGVyZm9ybVBsYXkocmVzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgYXVkaW8gcGxheWVyOiAke2V9YCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgI3Rocm93KHRyYWNrOiBUcmFjaywgZXJyb3I/OiBFcnJvciB8IG51bGwpIHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNvbnN0IHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCA9IChcbiAgICAgICAgICAgIEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVChgQ291bGQgbm90IGV4dHJhY3Qgc3RyZWFtIGZvciB0aGlzIHRyYWNrJHtlcnJvciA/IGBcXG5cXG4ke2Vycm9yLnN0YWNrIHx8IGVycm9yfWAgOiAnJ31gKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyU2tpcCwgdGhpcy5xdWV1ZSwgdHJhY2ssIFRyYWNrU2tpcFJlYXNvbi5Ob1N0cmVhbSwgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllckVycm9yLCB0aGlzLnF1ZXVlLCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQsIHRyYWNrKTtcbiAgICAgICAgY29uc3QgbmV4dFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgaWYgKG5leHRUcmFjaykgdGhpcy5wbGF5KG5leHRUcmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhc3luYyAjcGVyZm9ybVBsYXkocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0Rpc3BhdGNoZXIgaXMgbm90IGF2YWlsYWJsZSwgdGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gdGhlIHF1ZXVlIGJlaW5nIGRlbGV0ZWQgaW4gdGhlIG1pZGRsZSBvZiBvcGVyYXRpb24uIENhbmNlbGxpbmcgdGhlIHN0cmVhbS4uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYWxpemluZyBhdWRpbyBwbGF5ZXIuLi4nKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlci5wbGF5U3RyZWFtKHJlc291cmNlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNwYXRjaGluZyBhdWRpby4uLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgKTtcblxuICAgICAgICBjb25zdCBhdHRlbXB0ZWRFeHRyYWN0b3JzID0gdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5nZXRDb250ZXh0KCk/LmF0dGVtcHRlZEV4dHJhY3RvcnMgfHwgbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZSgoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGF0dGVtcHRlZEV4dHJhY3RvcnMuaGFzKGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgYXR0ZW1wdGVkRXh0cmFjdG9ycy5hZGQoZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgY29uc3QgY2FuU3RyZWFtID0gYXdhaXQgZXh0cmFjdG9yLnZhbGlkYXRlKHRyYWNrLnVybCwgdHJhY2sucXVlcnlUeXBlIHx8IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZSh0cmFjay51cmwpLnR5cGUpO1xuICAgICAgICAgICAgaWYgKCFjYW5TdHJlYW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKHRyYWNrKTtcbiAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghc3RyZWFtSW5mbyB8fCAhc3RyZWFtSW5mby5yZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEdlbmVyaWMgc3RyZWFtIGV4dHJhY3Rpb24gZmFpbGVkIGFuZCBmYWxsYmFjayBzdHJlYW0gZXh0cmFjdGlvbiBpcyBlbmFibGVkYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZUZhbGxiYWNrU3RyZWFtKHRyYWNrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHN0cmVhbUluZm8gfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgU3RyZWFtIGV4dHJhY3Rpb24gd2FzIHN1Y2Nlc3NmdWwgZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IChFeHRyYWN0b3I6ICR7c3RyZWFtSW5mby5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWApO1xuXG4gICAgICAgIHJldHVybiBzdHJlYW1JbmZvO1xuICAgIH1cblxuICAgIGFzeW5jICNjcmVhdGVGYWxsYmFja1N0cmVhbSh0cmFjazogVHJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2QuLi5gKTtcblxuICAgICAgICBjb25zdCBmYWxsYmFja1N0cmVhbSA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgICAgIGlmIChleHRyYWN0b3IuaWRlbnRpZmllciA9PT0gdHJhY2suZXh0cmFjdG9yPy5pZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSBgJHt0cmFjay50aXRsZX0gJHt0cmFjay5hdXRob3J9YDtcbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrVHJhY2tzID0gYXdhaXQgZXh0cmFjdG9yLmhhbmRsZShxdWVyeSwge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0cmFjay5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrVHJhY2sgPSBmYWxsYmFja1RyYWNrcy50cmFja3NbMF07XG5cbiAgICAgICAgICAgIGlmICghZmFsbGJhY2tUcmFjaykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKGZhbGxiYWNrVHJhY2spO1xuXG4gICAgICAgICAgICBpZiAoIXN0cmVhbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICB0cmFjay5icmlkZ2VkVHJhY2sgPSBmYWxsYmFja1RyYWNrO1xuXG4gICAgICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICBpZiAoIWZhbGxiYWNrU3RyZWFtIHx8ICFmYWxsYmFja1N0cmVhbS5yZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2RgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxsYmFja1N0cmVhbSB8fCBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IGZhbGxiYWNrU3RyZWFtLmV4dHJhY3RvcjtcblxuICAgICAgICByZXR1cm4gZmFsbGJhY2tTdHJlYW07XG4gICAgfVxuXG4gICAgI2NyZWF0ZUZGbXBlZ1N0cmVhbShzdHJlYW06IFJlYWRhYmxlIHwgc3RyaW5nLCB0cmFjazogVHJhY2ssIHNlZWsgPSAwLCBjb29raWVzPzogc3RyaW5nLCBvcHVzPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBmZm1wZWdTdHJlYW0gPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnXG4gICAgICAgICAgICAuY3JlYXRlU3RyZWFtKHN0cmVhbSwge1xuICAgICAgICAgICAgICAgIGVuY29kZXJBcmdzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MsXG4gICAgICAgICAgICAgICAgc2Vlazogc2VlayAvIDEwMDAsXG4gICAgICAgICAgICAgICAgZm10OiBvcHVzID8gJ29wdXMnIDogJ3MxNmxlJyxcbiAgICAgICAgICAgICAgICBjb29raWVzLFxuICAgICAgICAgICAgICAgIHVzZUxlZ2FjeUZGbXBlZzogISF0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnVzZUxlZ2FjeUZGbXBlZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbSA9IGAke2Vycn1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgU3RyZWFtIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IgZnJvbSBGRm1wZWcgc3RyZWFtOiAke2Vyci5zdGFjayB8fCBlcnIubWVzc2FnZSB8fCBlcnJ9YCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobS5pbmNsdWRlcygncHJlbWF0dXJlIGNsb3NlJykgfHwgbS5pbmNsdWRlcygnZXBpcGUnKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJFcnJvciwgdGhpcy5xdWV1ZSwgZXJyLCB0cmFjayk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmZtcGVnU3RyZWFtO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBRdWVyeVR5cGUgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBmZXRjaCB9IGZyb20gJ3VuZGljaSc7XG5cbi8vICNyZWdpb24gc2NhcnkgdGhpbmdzIGJlbG93ICpzaWdoKlxuY29uc3Qgc3BvdGlmeVNvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86dHJhY2tcXC98XFw/dXJpPXNwb3RpZnk6dHJhY2s6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeVBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnBsYXlsaXN0XFwvfFxcP3VyaT1zcG90aWZ5OnBsYXlsaXN0OikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlBbGJ1bVJlZ2V4ID0gL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzphbGJ1bVxcL3xcXD91cmk9c3BvdGlmeTphbGJ1bTopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCB2aW1lb1JlZ2V4ID0gL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9IC9eaHR0cHM6XFwvXFwvKHd3dy4pP3JldmVyYm5hdGlvbi5jb21cXC8oLispXFwvc29uZ1xcLyguKykkLztcbmNvbnN0IGF0dGFjaG1lbnRSZWdleCA9IC9eaHR0cHM/OlxcL1xcLy4rJC87XG5jb25zdCBhcHBsZU11c2ljU29uZ1JlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcLyhzb25nfGFsYnVtKVxcLy4rPyhcXC8uKz9cXD9pPXxcXC8pKFswLTldKykkLztcbmNvbnN0IGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LXxwbS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPSAvXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvYWxidW1cXC8uK1xcLyhbMC05XSspJC87XG5jb25zdCBzb3VuZGNsb3VkVHJhY2tSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvKFxcd3wtKSsoLispPyQvO1xuY29uc3Qgc291bmRjbG91ZFBsYXlsaXN0UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcLyh3d3cuKT95b3V0dWJlLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD0oKFBMfEZMfFVVfExMfFJEfE9MKVthLXpBLVowLTktX117MTYsNDF9KSQvO1xuY29uc3QgeW91dHViZVZpZGVvVVJMUmVnZXggPSAvXigoPzpodHRwcz86KT9cXC9cXC8pPygoPzp3d3d8bSlcXC4pPygoPzp5b3V0dWJlXFwuY29tfHlvdXR1LmJlKSkoXFwvKD86W1xcdy1dK1xcP3Y9fGVtYmVkXFwvfHZcXC8pPykoW1xcdy1dKykoXFxTKyk/JC87XG5jb25zdCB5b3V0dWJlVmlkZW9JZFJlZ2V4ID0gL15bYS16QS1aMC05LV9dezExfSQvO1xuLy8gI2VuZHJlZ2lvbiBzY2FyeSB0aGluZ3MgYWJvdmUgKnNpZ2gqXG5cbmNvbnN0IERvbWFpbnNNYXAgPSB7XG4gICAgWW91VHViZTogWyd5b3V0dWJlLmNvbScsICd5b3V0dS5iZScsICdtdXNpYy55b3V0dWJlLmNvbScsICdnYW1pbmcueW91dHViZS5jb20nLCAnd3d3LnlvdXR1YmUuY29tJywgJ20ueW91dHViZS5jb20nXSxcbiAgICBTcG90aWZ5OiBbJ29wZW4uc3BvdGlmeS5jb20nLCAnZW1iZWQuc3BvdGlmeS5jb20nXSxcbiAgICBWaW1lbzogWyd2aW1lby5jb20nLCAncGxheWVyLnZpbWVvLmNvbSddLFxuICAgIFJldmVyYk5hdGlvbjogWydyZXZlcmJuYXRpb24uY29tJ10sXG4gICAgU291bmRDbG91ZDogWydzb3VuZGNsb3VkLmNvbSddLFxuICAgIEFwcGxlTXVzaWM6IFsnbXVzaWMuYXBwbGUuY29tJ11cbn07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgcmVkaXJlY3REb21haW5zID0gbmV3IFNldChbXG4gICAgL15odHRwcz86XFwvXFwvc3BvdGlmeS5saW5rXFwvW0EtWmEtejAtOV0rJC8sXG4gICAgL15odHRwczpcXC9cXC9vblxcLnNvdW5kY2xvdWRcXC5jb21cXC9bYS16QS1aMS05XXswLDE3fSQvXG5dKTtcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFF1ZXJ5IHtcbiAgICB0eXBlOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG4gICAgcXVlcnk6IHN0cmluZztcbn1cblxuY2xhc3MgUXVlcnlSZXNvbHZlciB7XG4gICAgLyoqXG4gICAgICogUXVlcnkgcmVzb2x2ZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAgIHN0YXRpYyBnZXQgcmVnZXgoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcG90aWZ5QWxidW1SZWdleCxcbiAgICAgICAgICAgIHNwb3RpZnlQbGF5bGlzdFJlZ2V4LFxuICAgICAgICAgICAgc3BvdGlmeVNvbmdSZWdleCxcbiAgICAgICAgICAgIHZpbWVvUmVnZXgsXG4gICAgICAgICAgICByZXZlcmJuYXRpb25SZWdleCxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRSZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljU29uZ1JlZ2V4LFxuICAgICAgICAgICAgc291bmRjbG91ZFRyYWNrUmVnZXgsXG4gICAgICAgICAgICBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIHlvdXR1YmVQbGF5bGlzdFJlZ2V4XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlLXJlc29sdmUgcmVkaXJlY3QgdXJsc1xuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBwcmVSZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIG1heERlcHRoID0gNSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiByZWRpcmVjdERvbWFpbnMpIHtcbiAgICAgICAgICAgIGlmIChkb21haW4udGVzdChxdWVyeSkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChxdWVyeSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnZm9sbG93J1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy5vaykgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc3BvdGlmeSBkb2VzIG5vdCBcInJlZGlyZWN0XCIsIGl0IHJldHVybnMgYSBwYWdlIHdpdGgganMgdGhhdCByZWRpcmVjdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkuYXBwLmxpbmtcXC8oLispJC8udGVzdChyZXMudXJsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBib2R5LnNwbGl0KCdodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJylbMV0uc3BsaXQoJz9zaT0nKVswXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYGh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS90cmFjay8ke3RhcmdldH1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhEZXB0aCA8IDEgPyByZXMudXJsIDogdGhpcy5wcmVSZXNvbHZlKHJlcy51cmwsIG1heERlcHRoIC0gMSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gpOiBSZXNvbHZlZFF1ZXJ5IHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuICAgICAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5GT19SRVFVSVJFRCgncXVlcnknLCBTdHJpbmcocXVlcnkpKTtcblxuICAgICAgICBjb25zdCByZXNvbHZlciA9ICh0eXBlOiB0eXBlb2YgZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5OiBzdHJpbmcpID0+ICh7IHR5cGUsIHF1ZXJ5IH0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHF1ZXJ5KTtcblxuICAgICAgICAgICAgaWYgKERvbWFpbnNNYXAuWW91VHViZS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoLyhtKHVzaWMpP3xnYW1pbmcpXFwuLywgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGF5bGlzdElkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ2xpc3QnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWRlb0lkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKTtcbiAgICAgICAgICAgICAgICBpZiAocGxheWxpc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9JZCAmJiBwbGF5bGlzdElkLnN0YXJ0c1dpdGgoJ1JEJykpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuWU9VVFVCRV9QTEFZTElTVCwgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9JHt2aWRlb0lkfSZsaXN0PSR7cGxheWxpc3RJZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULCBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vcGxheWxpc3Q/bGlzdD0ke3BsYXlsaXN0SWR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChRdWVyeVJlc29sdmVyLnZhbGlkYXRlSWQocXVlcnkpIHx8IFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVVUkwocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfVklERU8sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5TcG90aWZ5LmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvaW50bC0oW2EtekEtWl0rKVxcLy8sICcnKTtcbiAgICAgICAgICAgICAgICBpZiAoc3BvdGlmeVBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChzcG90aWZ5QWxidW1SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKHNwb3RpZnlTb25nUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9TT05HLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuVmltZW8uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpbWVvUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuVklNRU8sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5SZXZlcmJOYXRpb24uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlJFVkVSQk5BVElPTiwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlNvdW5kQ2xvdWQuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNPVU5EQ0xPVURfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLkFwcGxlTXVzaWMuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxlTXVzaWNTb25nUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfU09ORywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFSQklUUkFSWSwgcXVlcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHZpbWVvIGlkIGZyb20gdXJsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldFZpbWVvSUQocXVlcnk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHF1ZXJ5KS50eXBlID09PSBRdWVyeVR5cGUuVklNRU8gPyBxdWVyeS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlSWQocTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB5b3V0dWJlVmlkZW9JZFJlZ2V4LnRlc3QocSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHZhbGlkYXRlVVJMKHE6IHN0cmluZykge1xuICAgICAgICByZXR1cm4geW91dHViZVZpZGVvVVJMUmVnZXgudGVzdChxKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfTtcbiIsICJpbXBvcnQgeyBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQWJvcnRTaWduYWwgdG8gY2FuY2VsIHRoaXMgZW50cnlcbiAgICAgKi9cbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXIgPSAoZXhjZXB0aW9uOiBFcnJvcikgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWV1ZWQgZW50cmllc1xuICAgICAqL1xuICAgIHB1YmxpYyBlbnRyaWVzOiBBcnJheTxBc3luY1F1ZXVlRW50cnk+ID0gW107XG5cbiAgICBwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcj86IEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgZW50cmllcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBjb25zdW1lIFdoZXRoZXIgb3Igbm90IHRvIGNvbnN1bWUgYWxsIGVudHJpZXMgYmVmb3JlIGNsZWFyaW5nXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKGNvbnN1bWUgPSBmYWxzZSkge1xuICAgICAgICBpZiAoY29uc3VtZSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jb25zdW1lKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgcXVldWUuIFJldHVybnMgYDBgIGlmIG5vIGVudHJpZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjcXVpcmUgYW4gZW50cnkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSAvLyBsb2NrIHRoZSBxdWV1ZVxuICAgICAqIGNvbnN0IGVudHJ5ID0gYXN5bmNRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICogLy8gd2FpdCB1bnRpbCBwcmV2aW91cyB0YXNrIGlzIGNvbXBsZXRlZFxuICAgICAqIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgKiAvLyBkbyBzb21ldGhpbmcgZXhwZW5zaXZlXG4gICAgICogYXdhaXQgcGVyZm9ybVNvbWV0aGluZ0V4cGVuc2l2ZSgpO1xuICAgICAqIC8vIG1ha2Ugc3VyZSB0byByZWxlYXNlIHRoZSBsb2NrIG9uY2UgZG9uZVxuICAgICAqIGFzeW5jUXVldWUucmVsZWFzZSgpO1xuICAgICAqXG4gICAgICovXG4gICAgcHVibGljIGFjcXVpcmUob3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgQXN5bmNRdWV1ZUVudHJ5KHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpIGVudHJ5LmdldFRhc2soKS5jYXRjaCh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBlbnRyeS5jb25zdW1lKCk7XG4gICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGFjcXVpc2l0aW9uIGFuZCBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgICAgICB0aGlzLmVudHJpZXNbMF0/LmNvbnN1bWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgYWxsIGVudHJpZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuY2VsQWxsKCkge1xuICAgICAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNhbmNlbCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnk6IEFzeW5jUXVldWVFbnRyeSkge1xuICAgICAgICBjb25zdCBlbnRyeUlkeCA9IHRoaXMuZW50cmllcy5pbmRleE9mKGVudHJ5KTtcblxuICAgICAgICBpZiAoZW50cnlJZHggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SWR4LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWVFbnRyeSB7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAgIHB1YmxpYyBzaWduYWw6IEFib3J0U2lnbmFsIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9uQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcmVzb2x2ZSE6ICgpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSByZWplY3QhOiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEFzeW5jUXVldWUsIHB1YmxpYyBvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnM/LnNpZ25hbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRBYm9ydFNpZ25hbCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdW1lKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZSgpO1xuICAgICAgICB0aGlzLnF1ZXVlLnJlbGVhc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuY2VsKCkge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5yZWplY3QobmV3IEVycm9yKCdDYW5jZWxsZWQnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9uQWJvcnQpIHRoaXMuc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gICAgICAgIHRoaXMuc2lnbmFsID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGFzaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRmlsdGVyc05hbWUsIFF1ZXVlRmlsdGVycyB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEF1ZGlvRmlsdGVycyB9IGZyb20gJy4uL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmlxdWFkRmlsdGVycywgRXF1YWxpemVyLCBFcXVhbGl6ZXJCYW5kLCBQQ01GaWx0ZXJzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbnR5cGUgRmlsdGVycyA9IGtleW9mIHR5cGVvZiBBdWRpb0ZpbHRlcnMuZmlsdGVycztcblxuY29uc3QgbWFrZUJhbmRzID0gKGFycjogbnVtYmVyW10pID0+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAge1xuICAgICAgICAgICAgbGVuZ3RoOiBFcXVhbGl6ZXIuQkFORF9DT1VOVFxuICAgICAgICB9LFxuICAgICAgICAoXywgaSkgPT4gKHtcbiAgICAgICAgICAgIGJhbmQ6IGksXG4gICAgICAgICAgICBnYWluOiBhcnJbaV0gPyBhcnJbaV0gLyAzMCA6IDBcbiAgICAgICAgfSlcbiAgICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbnR5cGUgRVFQcmVzZXQgPSB7XG4gICAgRmxhdDogRXF1YWxpemVyQmFuZFtdO1xuICAgIENsYXNzaWNhbDogRXF1YWxpemVyQmFuZFtdO1xuICAgIENsdWI6IEVxdWFsaXplckJhbmRbXTtcbiAgICBEYW5jZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIEZ1bGxCYXNzOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgRnVsbEJhc3NUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBGdWxsVHJlYmxlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgSGVhZHBob25lczogRXF1YWxpemVyQmFuZFtdO1xuICAgIExhcmdlSGFsbDogRXF1YWxpemVyQmFuZFtdO1xuICAgIExpdmU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBQYXJ0eTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFBvcDogRXF1YWxpemVyQmFuZFtdO1xuICAgIFJlZ2dhZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgICBTa2E6IEVxdWFsaXplckJhbmRbXTtcbiAgICBTb2Z0OiBFcXVhbGl6ZXJCYW5kW107XG4gICAgU29mdFJvY2s6IEVxdWFsaXplckJhbmRbXTtcbiAgICBUZWNobm86IEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0OiBSZWFkb25seTxFUVByZXNldD4gPSBPYmplY3QuZnJlZXplKHtcbiAgICBGbGF0OiBtYWtlQmFuZHMoW10pLFxuICAgIENsYXNzaWNhbDogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNy4yLCAtNy4yLCAtOS42XSksXG4gICAgQ2x1YjogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBEYW5jZTogbWFrZUJhbmRzKFs5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBGdWxsQmFzczogbWFrZUJhbmRzKFstOC4wLCA5LjYsIDkuNiwgNS42LCAxLjYsIC00LjAsIC04LjAsIC0xMC40LCAtMTEuMiwgLTExLjJdKSxcbiAgICBGdWxsQmFzc1RyZWJsZTogbWFrZUJhbmRzKFs3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF0pLFxuICAgIEZ1bGxUcmVibGU6IG1ha2VCYW5kcyhbLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XSksXG4gICAgSGVhZHBob25lczogbWFrZUJhbmRzKFs0LjgsIDExLjIsIDUuNiwgLTMuMiwgLTIuNCwgMS42LCA0LjgsIDkuNiwgMTIuOCwgMTQuNF0pLFxuICAgIExhcmdlSGFsbDogbWFrZUJhbmRzKFsxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIExpdmU6IG1ha2VCYW5kcyhbLTQuOCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgNS42LCA1LjYsIDQuMCwgMi40LCAyLjQsIDIuNF0pLFxuICAgIFBhcnR5OiBtYWtlQmFuZHMoWzcuMiwgNy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA3LjIsIDcuMl0pLFxuICAgIFBvcDogbWFrZUJhbmRzKFstMS42LCA0LjgsIDcuMiwgOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTIuNCwgLTIuNCwgLTEuNiwgLTEuNl0pLFxuICAgIFJlZ2dhZTogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNS42LCAtMS4xMTAyMmUtMTUsIDYuNCwgNi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XSksXG4gICAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgICBTa2E6IG1ha2VCYW5kcyhbLTIuNCwgLTQuOCwgLTQuMCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgOC44LCA5LjYsIDExLjIsIDkuNl0pLFxuICAgIFNvZnQ6IG1ha2VCYW5kcyhbNC44LCAxLjYsIC0xLjExMDIyZS0xNSwgLTIuNCwgLTEuMTEwMjJlLTE1LCA0LjAsIDguMCwgOS42LCAxMS4yLCAxMi4wXSksXG4gICAgU29mdFJvY2s6IG1ha2VCYW5kcyhbNC4wLCA0LjAsIDIuNCwgLTEuMTEwMjJlLTE1LCAtNC4wLCAtNS42LCAtMy4yLCAtMS4xMTAyMmUtMTUsIDIuNCwgOC44XSksXG4gICAgVGVjaG5vOiBtYWtlQmFuZHMoWzguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC01LjYsIC00LjgsIC0xLjExMDIyZS0xNSwgOC4wLCA5LjYsIDkuNiwgOC44XSlcbn0pO1xuXG5leHBvcnQgY2xhc3MgRkZtcGVnRmlsdGVyZXI8TWV0YSA9IHVua25vd24+IHtcbiAgICAjZmZtcGVnRmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgI2lucHV0QXJnczogc3RyaW5nW10gPSBbXTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGFmOiBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZmZtcGVnIG1heSBiZSBza2lwcGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBza2lwcGFibGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuYWYucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgICB9XG5cbiAgICAjc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgY29uc3QgeyBxdWV1ZSB9ID0gdGhpcy5hZjtcbiAgICAgICAgLy8gc2tpcCBpZiBmaWx0ZXJzIGFyZSB0aGUgc2FtZVxuICAgICAgICBpZiAoZmlsdGVycy5ldmVyeSgoZikgPT4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSkgJiYgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzLnNvbWUoKGZmKSA9PiBmZiA9PT0gJ25pZ2h0Y29yZScgfHwgZmYgPT09ICd2YXBvcndhdmUnKSAmJiAhZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJyk7XG4gICAgICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKTtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IFsuLi5uZXcgU2V0KGZpbHRlcnMpXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICAgICAgICBxdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb0ZpbHRlcnNVcGRhdGUsIHF1ZXVlLCBwcmV2LCB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBpbnB1dCBhcmdzIGZvciBGRm1wZWdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SW5wdXRBcmdzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICAgICAgdGhpcy4jaW5wdXRBcmdzID0gYXJncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW5wdXQgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5wdXRBcmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVuY29kZXJBcmdzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVycy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYXJncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRBcmdzLmNvbmNhdCh0aGlzLmVuY29kZXJBcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmZtcGVnIHN0cmVhbVxuICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlU3RyZWFtKHNvdXJjZTogc3RyaW5nIHwgUmVhZGFibGUsIG9wdGlvbnM6IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuI2lucHV0QXJncy5sZW5ndGgpIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbLi4udGhpcy4jaW5wdXRBcmdzLCAuLi4ob3B0aW9ucy5lbmNvZGVyQXJncyB8fCBbXSldO1xuICAgICAgICByZXR1cm4gY3JlYXRlRkZtcGVnU3RyZWFtKHNvdXJjZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGZmbXBlZyBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBzdHJpbmdbXSB8IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IF9maWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgICAgICAgaWYgKHR5cGVvZiBmaWx0ZXJzID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIF9maWx0ZXJzID0gIWZpbHRlcnMgPyBbXSA6IChPYmplY3Qua2V5cyhBdWRpb0ZpbHRlcnMuZmlsdGVycykgYXMgRmlsdGVyc1tdKTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9IGZpbHRlcnMgYXMgRmlsdGVyc1tdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhmaWx0ZXJzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSBmaWx0ZXJzID0gW2ZpbHRlcnNdO1xuICAgICAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICAgICAgICBmcmVzaC5wdXNoKGYpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyh0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICAgKiBAcGFyYW0gZmYgRmlsdGVycyBsaXN0XG4gICAgICovXG4gICAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IGZmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGVuYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaWx0ZXJzRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMubmFtZXMuZmlsdGVyKChmKSA9PiAhdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBlbmFibGVkXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyXG4gICAgICovXG4gICAgcHVibGljIGlzRW5hYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRW5hYmxlZChmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgYSB2YWxpZCBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZhbGlkRmlsdGVyKGZpbHRlcjogc3RyaW5nKTogZmlsdGVyIGlzIEZpbHRlcnNOYW1lIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5oYXMoZmlsdGVyIGFzIEZpbHRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIGFycmF5XG4gICAgICovXG4gICAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubWFwKChmaWx0ZXIpID0+IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBjdXJyZW50IGZpbHRlcnMgdG8gSlNPTiBvYmplY3RcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IChvYmpbZmlsdGVyXSA9IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSkpO1xuXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGN1cnJlbnQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUge1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBmZm1wZWcgPSBuZXcgRkZtcGVnRmlsdGVyZXI8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGVxdWFsaXplclByZXNldHMgPSBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0O1xuICAgIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgICAgIGJpcXVhZDogbnVsbCxcbiAgICAgICAgZXF1YWxpemVyOiBbXSxcbiAgICAgICAgZmlsdGVyczogW10sXG4gICAgICAgIHZvbHVtZTogMTAwLFxuICAgICAgICBzYW1wbGVSYXRlOiAtMVxuICAgIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBlbmFibGUgdGhpcyBpbiB0aGUgZnV0dXJlXG4gICAgLy8gcHVibGljIGdldCBmZm1wZWcoKTogRkZtcGVnRmlsdGVyZXI8TWV0YT4gfCBudWxsIHtcbiAgICAvLyAgICAgaWYgKHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZykge1xuICAgIC8vICAgICAgICAgaWYgKHRoaXMuI2ZmbXBlZykgdGhpcy4jZmZtcGVnID0gbnVsbDtcbiAgICAvLyAgICAgICAgIHJldHVybiBudWxsO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgaWYgKCF0aGlzLiNmZm1wZWcpIHtcbiAgICAvLyAgICAgICAgIHRoaXMuI2ZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHJldHVybiB0aGlzLiNmZm1wZWc7XG4gICAgLy8gfVxuXG4gICAgLyoqXG4gICAgICogVm9sdW1lIHRyYW5zZm9ybWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRzcD8udm9sdW1lIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogMTUgQmFuZCBFcXVhbGl6ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZXF1YWxpemVyIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlnaXRhbCBiaXF1YWQgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5iaXF1YWQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEU1AgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZmlsdGVycyB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF1ZGlvIHJlc2FtcGxlclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXNhbXBsZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYXkgY3VycmVudCB0cmFjayBpbiB0cmFuc2l0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gc2VlayBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB0cmlnZ2VyUmVwbGF5KHNlZWsgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5hY3F1aXJlKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLm5vZGUucGxheSh0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaywge1xuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzZWVrLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Nb2RlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFGaWx0ZXJHcmFwaDxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgICBwdWJsaWMgZ2V0IGZmbXBlZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYuZmZtcGVnPy5maWx0ZXJzID8/IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuYWYuZXF1YWxpemVyPy5iYW5kTXVsdGlwbGllcnMgfHwgW10pLm1hcCgobSwgaSkgPT4gKHtcbiAgICAgICAgICAgIGJhbmQ6IGksXG4gICAgICAgICAgICBnYWluOiBtXG4gICAgICAgIH0pKSBhcyBFcXVhbGl6ZXJCYW5kW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hZi5iaXF1YWQ/LmdldEZpbHRlck5hbWUoKSBhcyBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsKSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYuZmlsdGVycz8uZmlsdGVycyB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYudm9sdW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZi5yZXNhbXBsZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGR1bXAoKTogRmlsdGVyR3JhcGgge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmZtcGVnOiB0aGlzLmZmbXBlZyxcbiAgICAgICAgICAgIGVxdWFsaXplcjogdGhpcy5lcXVhbGl6ZXIsXG4gICAgICAgICAgICBiaXF1YWQ6IHRoaXMuYmlxdWFkLFxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAgICAgICAgc2FtcGxlUmF0ZTogdGhpcy5yZXNhbXBsZXI/LnRhcmdldFNhbXBsZVJhdGUgfHwgdGhpcy5yZXNhbXBsZXI/LnNhbXBsZVJhdGUgfHwgNDgwMDAsXG4gICAgICAgICAgICB2b2x1bWU6IHRoaXMudm9sdW1lPy52b2x1bWUgPz8gMTAwXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckdyYXBoIHtcbiAgICBmZm1wZWc6IEZpbHRlcnNbXTtcbiAgICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWQ6IEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGw7XG4gICAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICAgIHZvbHVtZTogbnVtYmVyO1xuICAgIHNhbXBsZVJhdGU6IG51bWJlcjtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IER1cGxleCwgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCAqIGFzIHByaXNtIGZyb20gJ3ByaXNtLW1lZGlhJztcblxuZXhwb3J0IGludGVyZmFjZSBGRm1wZWdTdHJlYW1PcHRpb25zIHtcbiAgICBmbXQ/OiBzdHJpbmc7XG4gICAgZW5jb2RlckFyZ3M/OiBzdHJpbmdbXTtcbiAgICBzZWVrPzogbnVtYmVyO1xuICAgIHNraXA/OiBib29sZWFuO1xuICAgIGNvb2tpZXM/OiBzdHJpbmc7XG4gICAgdXNlTGVnYWN5RkZtcGVnPzogYm9vbGVhbjtcbn1cblxuY29uc3QgZ2V0RkZtcGVnUHJvdmlkZXIgPSAobGVnYWN5ID0gZmFsc2UpID0+IChsZWdhY3kgPyAocHJpc20gYXMgdHlwZW9mIHByaXNtICYgeyBkZWZhdWx0OiB0eXBlb2YgcHJpc20gfSkuZGVmYXVsdD8uRkZtcGVnIHx8IHByaXNtLkZGbXBlZyA6IEZGbXBlZyk7XG5cbmNvbnN0IHJlc29sdmVBcmdzID0gKGNvbmZpZzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZD4pOiBzdHJpbmdbXSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGNvbmZpZykucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGFjYztcbiAgICAgICAgYWNjLnB1c2goYC0ke2tleX1gLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSBhcyBzdHJpbmdbXSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbTogc3RyaW5nLCBmbXQ/OiBzdHJpbmcsIGNvb2tpZXM/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhcmdzID0gcmVzb2x2ZUFyZ3Moe1xuICAgICAgICByZWNvbm5lY3Q6IDEsXG4gICAgICAgIHJlY29ubmVjdF9zdHJlYW1lZDogMSxcbiAgICAgICAgcmVjb25uZWN0X2RlbGF5X21heDogNSxcbiAgICAgICAgaTogc3RyZWFtLFxuICAgICAgICBhbmFseXplZHVyYXRpb246IDAsXG4gICAgICAgIGxvZ2xldmVsOiAwLFxuICAgICAgICBhcjogNDgwMDAsXG4gICAgICAgIGFjOiAyLFxuICAgICAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICAgICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGwsXG4gICAgICAgIGNvb2tpZXM6IHR5cGVvZiBjb29raWVzID09PSAnc3RyaW5nJyA/ICghY29va2llcy5pbmNsdWRlcygnICcpID8gY29va2llcyA6IGBcIiR7Y29va2llc31cImApIDogbnVsbFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGRk1QRUdfQVJHU19QSVBFRChmbXQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhcmdzID0gcmVzb2x2ZUFyZ3Moe1xuICAgICAgICBhbmFseXplZHVyYXRpb246IDAsXG4gICAgICAgIGxvZ2xldmVsOiAwLFxuICAgICAgICBhcjogNDgwMDAsXG4gICAgICAgIGFjOiAyLFxuICAgICAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICAgICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGxcbiAgICB9KTtcblxuICAgIHJldHVybiBhcmdzO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgRkZtcGVnIHN0cmVhbVxuICogQHBhcmFtIHN0cmVhbSBUaGUgc291cmNlIHN0cmVhbVxuICogQHBhcmFtIG9wdGlvbnMgRkZtcGVnIHN0cmVhbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGRm1wZWdTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZywgb3B0aW9ucz86IEZGbXBlZ1N0cmVhbU9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucz8uc2tpcCAmJiB0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykgcmV0dXJuIHN0cmVhbTtcbiAgICBvcHRpb25zID8/PSB7fTtcbiAgICBjb25zdCBhcmdzID0gdHlwZW9mIHN0cmVhbSA9PT0gJ3N0cmluZycgPyBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtLCBvcHRpb25zLmZtdCwgb3B0aW9ucy5jb29raWVzKSA6IEZGTVBFR19BUkdTX1BJUEVEKG9wdGlvbnMuZm10KTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKG9wdGlvbnMuc2VlaykpIGFyZ3MudW5zaGlmdCgnLXNzJywgU3RyaW5nKG9wdGlvbnMuc2VlaykpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgICBjb25zdCBGRk1QRUcgPSBnZXRGRm1wZWdQcm92aWRlcighIW9wdGlvbnMudXNlTGVnYWN5RkZtcGVnKTtcblxuICAgIGNvbnN0IHRyYW5zY29kZXI6IER1cGxleCA9IG5ldyBGRk1QRUcoeyBzaGVsbDogZmFsc2UsIGFyZ3MgfSk7XG5cbiAgICB0cmFuc2NvZGVyLm9uKCdjbG9zZScsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcblxuICAgIGlmICh0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykge1xuICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgKCkgPT4gdHJhbnNjb2Rlci5kZXN0cm95KCkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZSh0cmFuc2NvZGVyIGFzIGFueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zY29kZXI7XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSB7XG4gICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IG51bWJlcjtcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiBib29sZWFuO1xuICAgICAgICBwbGF5aW5nOiBib29sZWFuO1xuICAgICAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgICAgIGlkbGU6IGJvb2xlYW47XG4gICAgfTtcbiAgICB0cmFja3NDb3VudDogbnVtYmVyO1xuICAgIGhpc3RvcnlTaXplOiBudW1iZXI7XG4gICAgZXh0cmFjdG9yczogbnVtYmVyO1xuICAgIGxpc3RlbmVyczogbnVtYmVyO1xuICAgIG1lbW9yeVVzYWdlOiBOb2RlSlMuTWVtb3J5VXNhZ2U7XG4gICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogc3RyaW5nO1xuICAgICAgICBwbGF5ZXI6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgc3RhdGlzdGljcyBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF0ZW5jeToge1xuICAgICAgICAgICAgICAgIGV2ZW50TG9vcDogdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRMb29wTGFnLFxuICAgICAgICAgICAgICAgIHZvaWNlQ29ubmVjdGlvbjogdGhpcy5xdWV1ZS5waW5nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgICAgICAgICBwbGF5aW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNQbGF5aW5nKCksXG4gICAgICAgICAgICAgICAgcGF1c2VkOiB0aGlzLnF1ZXVlLm5vZGUuaXNQYXVzZWQoKSxcbiAgICAgICAgICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgICAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICAgICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICAgICAgICBsaXN0ZW5lcnM6IHRoaXMucXVldWUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2UuY2hhbm5lbD8ubWVtYmVycy5maWx0ZXIoKG0pID0+ICFtLnVzZXIuYm90KS5zaXplIHx8IDAsXG4gICAgICAgICAgICBtZW1vcnlVc2FnZTogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLFxuICAgICAgICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgICAgICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgcGxheWVyOiAnNy4wLjAtZGV2LjEnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBMcmNHZXRSZXN1bHQsIExyY1NlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2xyY2xpYi9McmNMaWInO1xuaW1wb3J0IHR5cGUgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IHR5cGUgTHlyaWNzRGF0YSA9IE1hcDxudW1iZXIsIHN0cmluZz47XG5leHBvcnQgdHlwZSBVbnN1YnNjcmliZSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBMeXJpY3NDYWxsYmFjayA9IChseXJpY3M6IHN0cmluZywgdGltZXN0YW1wOiBudW1iZXIpID0+IHVua25vd247XG5leHBvcnQgdHlwZSBMeXJpY3NBdCA9IHsgdGltZXN0YW1wOiBudW1iZXI7IGxpbmU6IHN0cmluZyB9O1xuXG5jb25zdCB0aW1lc3RhbXBQYXR0ZXJuID0gL1xcWyhcXGR7Mn0pOihcXGR7Mn0pXFwuKFxcZHsyfSlcXF0vO1xuXG5leHBvcnQgY2xhc3MgU3luY2VkTHlyaWNzUHJvdmlkZXIge1xuICAgICNsb29wOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICAgICNjYWxsYmFjazogTHlyaWNzQ2FsbGJhY2sgfCBudWxsID0gbnVsbDtcbiAgICAjb25VbnN1YnNjcmliZTogVW5zdWJzY3JpYmUgfCBudWxsID0gbnVsbDtcblxuICAgIHB1YmxpYyBpbnRlcnZhbCA9IDEwMDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzOiBMeXJpY3NEYXRhID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBxdWV1ZTogR3VpbGRRdWV1ZSwgcHVibGljIHJlYWRvbmx5IHJhdz86IExyY0dldFJlc3VsdCB8IExyY1NlYXJjaFJlc3VsdCkge1xuICAgICAgICBpZiAocmF3Py5zeW5jZWRMeXJpY3MpIHRoaXMubG9hZChyYXc/LnN5bmNlZEx5cmljcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU3Vic2NyaWJlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NhbGxiYWNrICE9PSBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGx5cmljczogc3RyaW5nKSB7XG4gICAgICAgIGlmICghbHlyaWNzKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfRVhJU1RJTkcoJ3N5bmNlZEx5cmljcycpO1xuXG4gICAgICAgIHRoaXMubHlyaWNzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgICBjb25zdCBsaW5lcyA9IGx5cmljcy5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2godGltZXN0YW1wUGF0dGVybik7XG5cbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFssIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kc10gPSBtYXRjaDtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBwYXJzZUludChtaW51dGVzKSAqIDYwICogMTAwMCArIHBhcnNlSW50KHNlY29uZHMpICogMTAwMCArIHBhcnNlSW50KG1pbGxpc2Vjb25kcyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmx5cmljcy5zZXQodGltZXN0YW1wLCBsaW5lLnJlcGxhY2UodGltZXN0YW1wUGF0dGVybiwgJycpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBseXJpY3MgYXQgYSBzcGVjaWZpYyB0aW1lIG9yIGF0IHRoZSBjbG9zZXN0IHRpbWUgKFx1MDBCMTIgc2Vjb25kcylcbiAgICAgKiBAcGFyYW0gdGltZSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXQodGltZTogbnVtYmVyKTogTHlyaWNzQXQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgbG93ZXN0VGltZSA9IHRoaXMubHlyaWNzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmIChsb3dlc3RUaW1lID09IG51bGwgfHwgdGltZSA8IGxvd2VzdFRpbWUpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAodGhpcy5seXJpY3MuaGFzKHRpbWUpKSByZXR1cm4geyBsaW5lOiB0aGlzLmx5cmljcy5nZXQodGltZSkgYXMgc3RyaW5nLCB0aW1lc3RhbXA6IHRpbWUgfTtcblxuICAgICAgICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbSh0aGlzLmx5cmljcy5rZXlzKCkpO1xuXG4gICAgICAgIGNvbnN0IGNsb3Nlc3QgPSBrZXlzLnJlZHVjZSgoYSwgYikgPT4gKE1hdGguYWJzKGIgLSB0aW1lKSA8IE1hdGguYWJzKGEgLSB0aW1lKSA/IGIgOiBhKSk7XG5cbiAgICAgICAgaWYgKGNsb3Nlc3QgPiB0aW1lKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoTWF0aC5hYnMoY2xvc2VzdCAtIHRpbWUpID4gMjAwMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMubHlyaWNzLmdldChjbG9zZXN0KTtcblxuICAgICAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiB7IHRpbWVzdGFtcDogY2xvc2VzdCwgbGluZSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIGZvciB0aGUgbHlyaWNzIGNoYW5nZS5cbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgcHVibGljIG9uQ2hhbmdlKGNhbGxiYWNrOiBMeXJpY3NDYWxsYmFjaykge1xuICAgICAgICB0aGlzLiNjYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIGRldGVjdCB3aGVuIHRoZSBwcm92aWRlciBpcyB1bnN1YnNjcmliZWQuXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBvblVuc3Vic2NyaWJlKGNhbGxiYWNrOiBVbnN1YnNjcmliZSkge1xuICAgICAgICB0aGlzLiNvblVuc3Vic2NyaWJlID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5zdWJzY3JpYmVzIGZyb20gdGhlIHF1ZXVlLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bnN1YnNjcmliZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2xvb3ApIGNsZWFySW50ZXJ2YWwodGhpcy4jbG9vcCk7XG4gICAgICAgIGlmICh0aGlzLiNvblVuc3Vic2NyaWJlKSB0aGlzLiNvblVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgdGhpcy4jY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICB0aGlzLiNvblVuc3Vic2NyaWJlID0gbnVsbDtcbiAgICAgICAgdGhpcy4jbG9vcCA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlcyB0byB0aGUgcXVldWUgdG8gbW9uaXRvciB0aGUgY3VycmVudCB0aW1lLlxuICAgICAqIEByZXR1cm5zIFRoZSB1bnN1YnNjcmliZSBmdW5jdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBzdWJzY3JpYmUoKTogVW5zdWJzY3JpYmUge1xuICAgICAgICBpZiAodGhpcy4jbG9vcCkgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgICB0aGlzLiNjcmVhdGVMb29wKCk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgICAgIGNvbnN0IGhhc0xvb3AgPSB0aGlzLiNsb29wICE9PSBudWxsO1xuXG4gICAgICAgIGlmIChoYXNMb29wKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuI2xvb3AhKTtcbiAgICAgICAgICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0xvb3A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lcyB0aGUgbHlyaWNzIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgICAgIGNvbnN0IGhhc0xvb3AgPSB0aGlzLiNsb29wICE9PSBudWxsO1xuXG4gICAgICAgIGlmICghaGFzTG9vcCkgdGhpcy4jY3JlYXRlTG9vcCgpO1xuXG4gICAgICAgIHJldHVybiAhaGFzTG9vcDtcbiAgICB9XG5cbiAgICAjY3JlYXRlTG9vcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNjYWxsYmFjaykgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy4jbG9vcCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wKTtcblxuICAgICAgICBsZXQgbGFzdFZhbHVlOiBMeXJpY3NBdCB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuI2xvb3AgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5kZWxldGVkKSByZXR1cm4gdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuI2NhbGxiYWNrIHx8ICF0aGlzLnF1ZXVlLmlzUGxheWluZygpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLnF1ZXVlLm5vZGUuZ2V0VGltZXN0YW1wKCk7XG4gICAgICAgICAgICBpZiAoIXRpbWUpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgbHlyaWNzID0gdGhpcy5hdCh0aW1lLmN1cnJlbnQudmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAoIWx5cmljcykgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAobGFzdFZhbHVlICE9PSBudWxsICYmIGx5cmljcy5saW5lID09PSBsYXN0VmFsdWUubGluZSAmJiBseXJpY3MudGltZXN0YW1wID09PSBsYXN0VmFsdWUudGltZXN0YW1wKSByZXR1cm47XG5cbiAgICAgICAgICAgIGxhc3RWYWx1ZSA9IGx5cmljcztcblxuICAgICAgICAgICAgdGhpcy4jY2FsbGJhY2sobHlyaWNzLmxpbmUsIGx5cmljcy50aW1lc3RhbXApO1xuICAgICAgICB9LCB0aGlzLmludGVydmFsKS51bnJlZigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuL0FzeW5jUXVldWUnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0RW50aXR5ID0gKCkgPT4gUHJvbWlzZTxSZXNwb25zZT47XG5cbmV4cG9ydCBjbGFzcyBTZXF1ZW50aWFsQnVja2V0IHtcbiAgICBwdWJsaWMgbGltaXQgPSAxO1xuICAgIHB1YmxpYyByZW1haW5pbmcgPSAxO1xuICAgIHB1YmxpYyByZXNldEFmdGVyID0gMDtcbiAgICBwdWJsaWMgcXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICAgIHB1YmxpYyBNQVhfUkVUUklFUyA9IDU7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGJ1Y2tldCBpcyByYXRlIGxpbWl0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGlzUmF0ZUxpbWl0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbWFpbmluZyA8PSAwICYmIERhdGUubm93KCkgPCB0aGlzLnJlc2V0QWZ0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5xdWV1ZXMgYSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3QgZnVuY3Rpb24gdG8gZW5xdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBlbnF1ZXVlKHJlcTogUmVxdWVzdEVudGl0eSkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUuYWNxdWlyZSgpO1xuICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBlbnRyeS5yZWxlYXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9yZXF1ZXN0KHJlcTogUmVxdWVzdEVudGl0eSwgcmV0cmllcyA9IDApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgICAgIHdoaWxlICh0aGlzLmlzUmF0ZUxpbWl0ZWQoKSkge1xuICAgICAgICAgICAgY29uc3QgcmVzZXQgPSB0aGlzLnJlc2V0QWZ0ZXIgLSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzcyA9IGZhbHNlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCByZXEoKTtcblxuICAgICAgICAgICAgdGhpcy5fcGF0Y2hIZWFkZXJzKHJlcyk7XG5cbiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNldCA9IHRoaXMucmVzZXRBZnRlciAtIERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICAgICAgICBsZXQgZXJyOiBFcnJvcjtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgfSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKSBhcyBFcnJvciAmIHsgY29kZTogbnVtYmVyIH07XG5cbiAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSA9IGJvZHkubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGJvZHkuY29kZTtcblxuICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKGBIVFRQIEVycm9yOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFzcyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChwYXNzKSB0aHJvdyBlO1xuXG4gICAgICAgICAgICBjb25zdCBiYWRSZXEgPSBlIGluc3RhbmNlb2YgRXJyb3IgJiYgL0Vycm9yOiA0WzAtOV17Mn0vLnRlc3QoZS5tZXNzYWdlKTtcblxuICAgICAgICAgICAgaWYgKCFiYWRSZXEgJiYgcmV0cmllcyA8IHRoaXMuTUFYX1JFVFJJRVMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChyZXEsICsrcmV0cmllcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXRjaEhlYWRlcnMocmVzOiBSZXNwb25zZSkge1xuICAgICAgICBjb25zdCBsaW1pdCA9IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LUxpbWl0JykpO1xuICAgICAgICBjb25zdCByZW1haW5pbmcgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZW1haW5pbmcnKSk7XG4gICAgICAgIGNvbnN0IHJlc2V0QWZ0ZXIgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZXNldCcpKSAqIDEwMDAgKyBEYXRlLm5vdygpO1xuXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGxpbWl0KSkgdGhpcy5saW1pdCA9IGxpbWl0O1xuICAgICAgICBpZiAoIU51bWJlci5pc05hTihyZW1haW5pbmcpKSB0aGlzLnJlbWFpbmluZyA9IHJlbWFpbmluZztcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4ocmVzZXRBZnRlcikpIHRoaXMucmVzZXRBZnRlciA9IHJlc2V0QWZ0ZXI7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgU2VxdWVudGlhbEJ1Y2tldCB9IGZyb20gJy4uL3V0aWxzL1NlcXVlbnRpYWxCdWNrZXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExyY1NlYXJjaFBhcmFtcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXJ5IHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHRyYWNrTmFtZSBpcyByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBxPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBuYW1lIHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHF1ZXJ5IGlzIHJlcXVpcmVkLlxuICAgICAqL1xuICAgIHRyYWNrTmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXJ0aXN0IG5hbWVcbiAgICAgKi9cbiAgICBhcnRpc3ROYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAgICovXG4gICAgYWxidW1OYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExyY0dldFBhcmFtcyBleHRlbmRzIFJlcXVpcmVkPE9taXQ8THJjU2VhcmNoUGFyYW1zLCAncXVlcnknPj4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBkdXJhdGlvbjogbnVtYmVyO1xufVxuXG5jb25zdCB0b1NuYWtlQ2FzZSA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgICBjb25zdCBzbmFrZU9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG5ld0tleSA9IGtleS5yZXBsYWNlKC9bQS1aXS9nLCAobGV0dGVyKSA9PiBgXyR7bGV0dGVyLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICAgIHNuYWtlT2JqW25ld0tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc25ha2VPYmo7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgY3JlYXRlUXVlcnkgPSAocGFyYW1zOiBhbnkpID0+IG5ldyBVUkxTZWFyY2hQYXJhbXModG9TbmFrZUNhc2UocGFyYW1zKSkudG9TdHJpbmcoKTtcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBpZFxuICAgICAqL1xuICAgIGlkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIG5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFydGlzdCBuYW1lXG4gICAgICovXG4gICAgdHJhY2tOYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFsYnVtIG5hbWVcbiAgICAgKi9cbiAgICBhcnRpc3ROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFsYnVtIG5hbWVcbiAgICAgKi9cbiAgICBhbGJ1bU5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAgICovXG4gICAgZHVyYXRpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgICAqL1xuICAgIGluc3RydW1lbnRhbDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgICAqL1xuICAgIHBsYWluTHlyaWNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBzeW5jZWRMeXJpY3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIExyY0dldFJlc3VsdCA9IE9taXQ8THJjU2VhcmNoUmVzdWx0LCAnbmFtZSc+O1xuXG5leHBvcnQgY2xhc3MgTHJjTGliIHtcbiAgICAvKipcbiAgICAgKiBUaGUgQVBJIFVSTFxuICAgICAqL1xuICAgIHB1YmxpYyBhcGkgPSAnaHR0cHM6Ly9scmNsaWIubmV0L2FwaSc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3QgdGltZW91dC4gRGVmYXVsdCBpcyAxNSBzZWNvbmRzLlxuICAgICAqL1xuICAgIHB1YmxpYyB0aW1lb3V0ID0gMTVfMDAwO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IGJ1Y2tldFxuICAgICAqL1xuICAgIHB1YmxpYyBidWNrZXQgPSBuZXcgU2VxdWVudGlhbEJ1Y2tldCgpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBMcmNMaWIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVxdWVzdCB0aW1lb3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgcHVibGljIHNldFJlcXVlc3RUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJldHJ5IGxpbWl0LiBEZWZhdWx0IGlzIDUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IFRoZSByZXRyeSBsaW1pdFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXRyeUxpbWl0KGxpbWl0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5idWNrZXQuTUFYX1JFVFJJRVMgPSBsaW1pdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGx5cmljc1xuICAgICAqIEBwYXJhbSBwYXJhbXMgVGhlIGdldCBwYXJhbXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0KHBhcmFtczogTHJjR2V0UGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBgZ2V0PyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGx5cmljcyBieSBJRFxuICAgICAqIEBwYXJhbSBpZCBUaGUgbHlyaWNzIElEXG4gICAgICovXG4gICAgcHVibGljIGdldEJ5SWQoaWQ6IGAke251bWJlcn1gIHwgbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihgZ2V0LyR7aWR9YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBjYWNoZWQgbHlyaWNzXG4gICAgICogQHBhcmFtIHBhcmFtcyBUaGUgZ2V0IHBhcmFtc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDYWNoZWQocGFyYW1zOiBMcmNHZXRQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGBnZXQtY2FjaGVkPyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2hlcyBmb3IgbHlyaWNzXG4gICAgICogQHBhcmFtIHBhcmFtcyBUaGUgc2VhcmNoIHBhcmFtc1xuICAgICAqL1xuICAgIHB1YmxpYyBzZWFyY2gocGFyYW1zOiBMcmNTZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgaWYgKCFwYXJhbXMucSAmJiAhcGFyYW1zLnRyYWNrTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnb25lIG9mIHEgb3IgdHJhY2tOYW1lJywgJ3N0cmluZycsIFtTdHJpbmcocGFyYW1zLnEpLCBTdHJpbmcocGFyYW1zLnRyYWNrTmFtZSldLmpvaW4oJywgJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0aCA9IGBzZWFyY2g/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHRbXT4ocGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdHMgdGhlIEFQSVxuICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0PFQ+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCB0aW1lb3V0OiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgfSwgdGhpcy50aW1lb3V0KS51bnJlZigpO1xuXG4gICAgICAgICAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IFV0aWwuZ2V0UnVudGltZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBydW50aW1lVmVyc2lvbiA9IG5hbWUgPT09ICd1bmtub3duJyA/IHZlcnNpb24gOiBgJHtuYW1lfS8ke3ZlcnNpb259YDtcblxuICAgICAgICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiBgRGlzY29yZC1QbGF5ZXIvJHt0aGlzLnBsYXllci52ZXJzaW9ufSAke3J1bnRpbWVWZXJzaW9uID8/ICcnfWAudHJpbUVuZCgpLFxuICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYFtMcmNMaWJdIFJlcXVlc3RpbmcgJHtwYXRofWApO1xuXG4gICAgICAgICAgICByZXR1cm4gZmV0Y2goYCR7dGhpcy5hcGl9JHtwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGggOiAnLycgKyBwYXRofWAsIGluaXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYnVja2V0LmVucXVldWUoZGlzcGF0Y2hlcik7XG5cbiAgICAgICAgaWYgKHRpbWVvdXQpIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgVm9pY2VDaGFubmVsLCBTdGFnZUNoYW5uZWwsIFNub3dmbGFrZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciwgam9pblZvaWNlQ2hhbm5lbCwgVm9pY2VDb25uZWN0aW9uLCBnZXRWb2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cywgQXVkaW9QbGF5ZXIgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuY2xhc3MgVm9pY2VVdGlscyB7XG4gICAgLyoqXG4gICAgICogVm9pY2UgY29ubmVjdGlvbiBjYWNoZSB0byBzdG9yZSB2b2ljZSBjb25uZWN0aW9ucyBvZiB0aGUgUGxheWVyIGNvbXBvbmVudHMuXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKiBJdCBvbmx5IGV4aXN0cyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHVibGljIGNhY2hlOiBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj4gPSBuZXcgQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgdXRpbHMgY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgICAvKipcbiAgICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWwsIGNyZWF0aW5nIGJhc2ljIHN0cmVhbSBkaXNwYXRjaCBtYW5hZ2VyXG4gICAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgY29ubmVjdChcbiAgICAgICAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgZGVhZj86IGJvb2xlYW47XG4gICAgICAgICAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgICAgICAgICAgcXVldWU6IEd1aWxkUXVldWU7XG4gICAgICAgICAgICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyO1xuICAgICAgICAgICAgZ3JvdXA/OiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICApOiBQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+IHtcbiAgICAgICAgaWYgKCFvcHRpb25zPy5xdWV1ZSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fR1VJTERfUVVFVUUoKTtcbiAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMuam9pbihjaGFubmVsLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoY29ubiwgY2hhbm5lbCwgb3B0aW9ucy5xdWV1ZSwgb3B0aW9ucy5tYXhUaW1lLCBvcHRpb25zLmF1ZGlvUGxheWVyKTtcbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IFtjaGFubmVsXSBUaGUgdm9pY2Uvc3RhZ2UgY2hhbm5lbCB0byBqb2luXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBqb2luKFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgICAgICBncm91cD86IHN0cmluZztcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0Nvbm5lY3Rpb24gPSB0aGlzLmdldENvbm5lY3Rpb24oY2hhbm5lbC5ndWlsZC5pZCwgb3B0aW9ucz8uZ3JvdXApO1xuXG4gICAgICAgIGlmIChleGlzdGluZ0Nvbm5lY3Rpb24/LmpvaW5Db25maWcuY2hhbm5lbElkID09PSBjaGFubmVsPy5pZCAmJiBleGlzdGluZ0Nvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdDb25uZWN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29ubiA9IGpvaW5Wb2ljZUNoYW5uZWwoe1xuICAgICAgICAgICAgZ3VpbGRJZDogY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgICAgICAgIGNoYW5uZWxJZDogY2hhbm5lbC5pZCxcbiAgICAgICAgICAgIGFkYXB0ZXJDcmVhdG9yOiBjaGFubmVsLmd1aWxkLnZvaWNlQWRhcHRlckNyZWF0b3IgYXMgdW5rbm93biBhcyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICAgICAgICAgICAgc2VsZkRlYWY6IEJvb2xlYW4ob3B0aW9ucz8uZGVhZiksXG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5wbGF5ZXIuZXZlbnRzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJykgPiAwLFxuICAgICAgICAgICAgZ3JvdXA6IG9wdGlvbnM/Lmdyb3VwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNjb25uZWN0KGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiB8IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24gaW5zdGFuY2VvZiBTdHJlYW1EaXNwYXRjaGVyKSBjb25uZWN0aW9uID0gY29ubmVjdGlvbi52b2ljZUNvbm5lY3Rpb247XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgcmV0dXJuIGNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIERpc2NvcmQgUGxheWVyIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1Nub3dmbGFrZX0gZ3VpbGQgVGhlIGd1aWxkIGlkXG4gICAgICogQHJldHVybnMge1N0cmVhbURpc3BhdGNoZXJ9XG4gICAgICovXG4gICAgcHVibGljIGdldENvbm5lY3Rpb24oZ3VpbGQ6IFNub3dmbGFrZSwgZ3JvdXA/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGdldFZvaWNlQ29ubmVjdGlvbihndWlsZCwgZ3JvdXApO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgVm9pY2VVdGlscyB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9mYWJyaWMvU2VhcmNoUmVzdWx0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlT3B0aW9ucyB7XG4gICAgY2hlY2tJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLy8gNWhcbmNvbnN0IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQgPSAxOF8wMDBfMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUPiB7XG4gICAgZ2V0RGF0YSgpOiBQcm9taXNlPERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQ+W10+O1xuICAgIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KTogUHJvbWlzZTx2b2lkPjtcbiAgICByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUNhY2hlIGltcGxlbWVudHMgUXVlcnlDYWNoZVByb3ZpZGVyPFRyYWNrPiB7XG4gICAgI2RlZmF1bHRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUcmFjaz4+KCk7XG4gICAgcHVibGljIHRpbWVyOiBOb2RlSlMuVGltZXI7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcGxheWVyOiBQbGF5ZXIsXG4gICAgICAgIHB1YmxpYyBvcHRpb25zOiBRdWVyeUNhY2hlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNoZWNrSW50ZXJ2YWw6IERFRkFVTFRfRVhQSVJZX1RJTUVPVVRcbiAgICAgICAgfVxuICAgICkge1xuICAgICAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5jbGVhbnVwLmJpbmQodGhpcyksIHRoaXMuY2hlY2tJbnRlcnZhbCkudW5yZWYoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNoZWNrSW50ZXJ2YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY2hlY2tJbnRlcnZhbCA/PyBERUZBVUxUX0VYUElSWV9USU1FT1VUO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjbGVhbnVwKCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIHRoaXMuI2RlZmF1bHRDYWNoZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmhhc0V4cGlyZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5kZWxldGUoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFyKCkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLiNkZWZhdWx0Q2FjaGUudmFsdWVzKCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCkge1xuICAgICAgICBkYXRhLnRyYWNrcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy4jZGVmYXVsdENhY2hlLmhhcyhkLnVybCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5zZXQoZC51cmwsIG5ldyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZShkKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZGVmYXVsdENhY2hlLmdldChjb250ZXh0LnF1ZXJ5KTtcbiAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgICAgICAgICAgIHF1ZXJ5OiBjb250ZXh0LnF1ZXJ5LFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgICAgICAgIHRyYWNrczogW3Jlc3VsdC5kYXRhXSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGV4cGlyZUFmdGVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGRhdGE6IFQsIGV4cGlyZUFmdGVyOiBudW1iZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZXhwaXJlQWZ0ZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGlyZUFmdGVyID0gRGF0ZS5ub3coKSArIGV4cGlyZUFmdGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0V4cGlyZWQoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5leHBpcmVBZnRlciAhPT0gJ251bWJlcicgfHwgaXNOYU4odGhpcy5leHBpcmVBZnRlcikgfHwgdGhpcy5leHBpcmVBZnRlciA8IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIERhdGUubm93KCkgPD0gdGhpcy5leHBpcmVBZnRlcjtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCB7XG4gICAgcXVlcnk6IHN0cmluZztcbiAgICByZXF1ZXN0ZWRCeT86IFVzZXI7XG4gICAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgYGV4dDoke3N0cmluZ31gO1xufVxuIiwgImltcG9ydCB7IEZGbXBlZyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuaW1wb3J0IHsgQ2xpZW50LCBTbm93Zmxha2VVdGlsLCBWb2ljZVN0YXRlLCBJbnRlbnRzQml0RmllbGQsIFVzZXIsIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgdmVyc2lvbiBhcyBkanNWZXJzaW9uLCBFdmVudHMgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXlsaXN0LCBUcmFjaywgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi9mYWJyaWMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUV2ZW50cywgVm9pY2VDb25uZWN0Q29uZmlnLCBHdWlsZE5vZGVDcmVhdGVPcHRpb25zLCBHdWlsZE5vZGVNYW5hZ2VyLCBHdWlsZFF1ZXVlLCBSZXNvdXJjZVBsYXlPcHRpb25zLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL3F1ZXVlJztcbmltcG9ydCB7IFZvaWNlVXRpbHMgfSBmcm9tICcuL1ZvaWNlSW50ZXJmYWNlL1ZvaWNlVXRpbHMnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzLCBRdWVyeVR5cGUsIFNlYXJjaE9wdGlvbnMsIFBsYXllckluaXRPcHRpb25zLCBQbGF5bGlzdEluaXREYXRhLCBTZWFyY2hRdWVyeVR5cGUsIFBsYXllckV2ZW50IH0gZnJvbSAnLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyLCBSZXNvbHZlZFF1ZXJ5IH0gZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyBkVm9pY2VWZXJzaW9uIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0ICogYXMgX2ludGVybmFscyBmcm9tICcuL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBRdWVyeUNhY2hlIH0gZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlciB9IGZyb20gJy4vRGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyJztcbmltcG9ydCB7IElQUm90YXRvciB9IGZyb20gJy4vdXRpbHMvSVBSb3RhdG9yJztcbmltcG9ydCB7IENvbnRleHQsIGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuL2hvb2tzJztcbmltcG9ydCB7IEhvb2tzQ3R4IH0gZnJvbSAnLi9ob29rcy9jb21tb24nO1xuaW1wb3J0IHsgTHJjTGliIH0gZnJvbSAnLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB7IGdldENvbXBhdE5hbWUsIGlzQ2xpZW50UHJveHkgfSBmcm9tICcuL2NvbXBhdC9jcmVhdGVFcmlzQ29tcGF0JztcbmltcG9ydCB7IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IgfSBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuXG5jb25zdCBrU2luZ2xldG9uID0gU3ltYm9sKCdJbnN0YW5jZURpc2NvcmRQbGF5ZXJTaW5nbGV0b24nKTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VCA9IHVua25vd24+IHtcbiAgICB0cmFjazogVHJhY2s7XG4gICAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgICBzZWFyY2hSZXN1bHQ6IFNlYXJjaFJlc3VsdDtcbiAgICBxdWV1ZTogR3VpbGRRdWV1ZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tMaWtlID0gc3RyaW5nIHwgVHJhY2sgfCBTZWFyY2hSZXN1bHQgfCBUcmFja1tdIHwgUGxheWxpc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiBleHRlbmRzIFNlYXJjaE9wdGlvbnMge1xuICAgIG5vZGVPcHRpb25zPzogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPjtcbiAgICBjb25uZWN0aW9uT3B0aW9ucz86IFZvaWNlQ29ubmVjdENvbmZpZztcbiAgICBhdWRpb1BsYXllck9wdGlvbnM/OiBSZXNvdXJjZVBsYXlPcHRpb25zO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgIGFmdGVyU2VhcmNoPzogKHJlc3VsdDogU2VhcmNoUmVzdWx0KSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCB0eXBlIFZvaWNlU3RhdGVIYW5kbGVyID0gKHBsYXllcjogUGxheWVyLCBxdWV1ZTogR3VpbGRRdWV1ZSwgb2xkVm9pY2VTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3Vm9pY2VTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gQXdhaXRlZDx2b2lkPjtcblxuZXhwb3J0IGNsYXNzIFBsYXllciBleHRlbmRzIFBsYXllckV2ZW50c0VtaXR0ZXI8UGxheWVyRXZlbnRzPiB7XG4gICAgI2xhc3RMYXRlbmN5ID0gLTE7XG4gICAgI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lciA9IHRoaXMuaGFuZGxlVm9pY2VTdGF0ZS5iaW5kKHRoaXMpO1xuICAgICNsYWdNb25pdG9yVGltZW91dCE6IE5vZGVKUy5UaW1lb3V0O1xuICAgICNsYWdNb25pdG9ySW50ZXJ2YWwhOiBOb2RlSlMuVGltZW91dDtcbiAgICAjb25Wb2ljZVN0YXRlVXBkYXRlOiBWb2ljZVN0YXRlSGFuZGxlciA9IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcjtcbiAgICAjaG9va3NDdHg6IENvbnRleHQ8SG9va3NDdHg+IHwgbnVsbCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgZGlzY29yZC1wbGF5ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyA9ICc3LjAuMC1kZXYuMSc7XG4gICAgcHVibGljIHN0YXRpYyBfc2luZ2xldG9uS2V5ID0ga1NpbmdsZXRvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwbGF5ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGlzY29yZC5qcyBjbGllbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50ITogQ2xpZW50O1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5ZXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zITogUGxheWVySW5pdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllciBub2RlcyAocXVldWUpIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgYXBpIHV0aWxpdGllc1xuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB2b2ljZVV0aWxzID0gbmV3IFZvaWNlVXRpbHModGhpcyk7XG4gICAgLyoqXG4gICAgICogVGhlIGV4dHJhY3RvcnMgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBleHRyYWN0b3JzID0gbmV3IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQodGhpcyk7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllciBldmVudHMgY2hhbm5lbFxuICAgICAqL1xuICAgIHB1YmxpYyBldmVudHMgPSBuZXcgUGxheWVyRXZlbnRzRW1pdHRlcjxHdWlsZFF1ZXVlRXZlbnRzPihbR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3JdKTtcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGUgcGxhbm5lclxuICAgICAqL1xuICAgIHB1YmxpYyByb3V0ZVBsYW5uZXI6IElQUm90YXRvciB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5ZXIgdmVyc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uID0gUGxheWVyLnZlcnNpb247XG4gICAgLyoqXG4gICAgICogVGhlIGx5cmljcyBhcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzID0gbmV3IExyY0xpYih0aGlzKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IERpc2NvcmQgUGxheWVyXG4gICAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBUaGUgRGlzY29yZCBDbGllbnRcbiAgICAgKiBAcGFyYW0ge1BsYXllckluaXRPcHRpb25zfSBbb3B0aW9uc10gVGhlIHBsYXllciBpbml0IG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUluc3RhbmNlICYmIGtTaW5nbGV0b24gaW4gUGxheWVyKSByZXR1cm4gKDxhbnk+UGxheWVyKVtrU2luZ2xldG9uXSBhcyBQbGF5ZXI7XG5cbiAgICAgICAgc3VwZXIoW1BsYXllckV2ZW50LkVycm9yXSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZmZtcGVnUGF0aCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZmbXBlZ1BhdGggIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCB0eXBlIFwic3RyaW5nXCIgZm9yIG9wdGlvbnMuZmZtcGVnUGF0aC4gR290ICR7dHlwZW9mIG9wdGlvbnMuZmZtcGVnUGF0aH0gaW5zdGVhZGApO1xuXG4gICAgICAgICAgICBwcm9jZXNzLmVudi5GRk1QRUdfUEFUSCA9IG9wdGlvbnMuZmZtcGVnUGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQ29tcGF0TW9kZSA9IGlzQ2xpZW50UHJveHkoY2xpZW50KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpc2NvcmQuanMgY2xpZW50XG4gICAgICAgICAqIEB0eXBlIHtDbGllbnR9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcblxuICAgICAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIShjbGllbnQgaW5zdGFuY2VvZiBDbGllbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBDbGllbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIGRpc2NvcmQuanNAJHtkanNWZXJzaW9ufSBjbGllbnQsIHNvbWUgdGhpbmdzIG1heSBub3Qgd29yayBjb3JyZWN0bHkuIFRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gY29ycnVwdCBkZXBlbmRlbmNpZXMgb3IgaGF2aW5nIG11bHRpcGxlIGluc3RhbGxhdGlvbnMgb2YgZGlzY29yZC5qcy5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWRDbGllbnRJbnN0YW5jZSdcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpYmYgPSB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMgaW5zdGFuY2VvZiBJbnRlbnRzQml0RmllbGQgPyB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMgOiBuZXcgSW50ZW50c0JpdEZpZWxkKHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWliZi5oYXMoSW50ZW50c0JpdEZpZWxkLkZsYWdzLkd1aWxkVm9pY2VTdGF0ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIFV0aWwud2FybignY2xpZW50IGlzIG1pc3NpbmcgXCJHdWlsZFZvaWNlU3RhdGVzXCIgaW50ZW50JywgJ0ludmFsaWRJbnRlbnRzQml0RmllbGQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBub29wXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI6IGZhbHNlLFxuICAgICAgICAgICAgYmxvY2tFeHRyYWN0b3JzOiBbXSxcbiAgICAgICAgICAgIGJsb2NrU3RyZWFtRnJvbTogW10sXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogMjAwMDAsXG4gICAgICAgICAgICBsYWdNb25pdG9yOiAzMDAwMCxcbiAgICAgICAgICAgIHF1ZXJ5Q2FjaGU6IG9wdGlvbnMucXVlcnlDYWNoZSA9PT0gbnVsbCA/IG51bGwgOiBvcHRpb25zLnF1ZXJ5Q2FjaGUgfHwgbmV3IFF1ZXJ5Q2FjaGUodGhpcyksXG4gICAgICAgICAgICB1c2VMZWdhY3lGRm1wZWc6IGZhbHNlLFxuICAgICAgICAgICAgc2tpcEZGbXBlZzogdHJ1ZSxcbiAgICAgICAgICAgIHByb2JlVGltZW91dDogNTAwMCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB5dGRsT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGhpZ2hXYXRlck1hcms6IDEgPDwgMjUsXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucy55dGRsT3B0aW9uc1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIFBsYXllckluaXRPcHRpb25zO1xuXG4gICAgICAgIGlmICghaXNDb21wYXRNb2RlKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHByaXZhdGUgbWV0aG9kXG4gICAgICAgICAgICB0aGlzLmNsaWVudC5pbmNyZW1lbnRNYXhMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Lm9uKEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA9PT0gJ251bWJlcicgJiYgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbTGFnIE1vbml0b3JdIEV2ZW50IGxvb3AgbGF0ZW5jeTogJHt0aGlzLiNsYXN0TGF0ZW5jeX1tc2ApO1xuICAgICAgICAgICAgICAgIH0sIDApLnVucmVmKCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMubGFnTW9uaXRvcikudW5yZWYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaXBjb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVQbGFubmVyID0gbmV3IElQUm90YXRvcih0aGlzLm9wdGlvbnMuaXBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2ludGVybmFscy5hZGRQbGF5ZXIodGhpcyk7XG5cbiAgICAgICAgaWYgKCEoa1NpbmdsZXRvbiBpbiBQbGF5ZXIpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUGxheWVyLCBrU2luZ2xldG9uLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBob29rcyBjb250ZXh0IGZvciB0aGlzIHBsYXllciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIGlmICghdGhpcy4jaG9va3NDdHgpIHtcbiAgICAgICAgICAgIHRoaXMuI2hvb2tzQ3R4ID0gY3JlYXRlQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI2hvb2tzQ3R4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlID0gaGFuZGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBkaXNjb3JkLXBsYXllciBzaW5nbGV0b24gaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHBsYXllclxuICAgICAqIEBwYXJhbSBvcHRpb25zIFBsYXllciBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaW5nbGV0b24oY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IE9taXQ8UGxheWVySW5pdE9wdGlvbnMsICdpZ25vcmVJbnN0YW5jZSc+ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgaWdub3JlSW5zdGFuY2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGRpc2NvcmQtcGxheWVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBPbWl0PFBsYXllckluaXRPcHRpb25zLCAnaWdub3JlSW5zdGFuY2UnPiA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxheWVyKGNsaWVudCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIGlnbm9yZUluc3RhbmNlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgYWN0aXZlIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxQbGF5ZXJzKCkge1xuICAgICAgICByZXR1cm4gX2ludGVybmFscy5nZXRQbGF5ZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckFsbFBsYXllcnMoKSB7XG4gICAgICAgIHJldHVybiBfaW50ZXJuYWxzLmluc3RhbmNlcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhY2hlIHByb3ZpZGVyIGluIHVzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5xdWVyeUNhY2hlID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgdG8gYFBsYXllci5ub2Rlc2AuXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWV1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgICAqIHNvbWUgZXhwZW5zaXZlIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHdoaWNoIGlzIHNsb3dpbmcgZG93biB0aGUgZXZlbnQgbG9vcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXZlbnRMb29wTGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc3RhdHMgPSBwbGF5ZXIuZ2VuZXJhdGVTdGF0aXN0aWNzKCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhzdGF0cyk7XG4gICAgICpcbiAgICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAgICogLy8ge1xuICAgICAqIC8vICAgaW5zdGFuY2VzOiBudW1iZXIsXG4gICAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgICAqIC8vICAgcXVlcnlDYWNoZUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgICogLy8gICBxdWV1ZXM6IFtcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIC4uLlxuICAgICAqIC8vICAgXVxuICAgICAqIC8vIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVTdGF0aXN0aWNzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5zdGFuY2VzOiBfaW50ZXJuYWxzLmluc3RhbmNlcy5zaXplLFxuICAgICAgICAgICAgcXVldWVzQ291bnQ6IHRoaXMucXVldWVzLmNhY2hlLnNpemUsXG4gICAgICAgICAgICBxdWVyeUNhY2hlRW5hYmxlZDogdGhpcy5xdWVyeUNhY2hlICE9IG51bGwsXG4gICAgICAgICAgICBxdWV1ZXM6IHRoaXMucXVldWVzLmNhY2hlLm1hcCgobSkgPT4gbS5zdGF0cy5nZW5lcmF0ZSgpKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHBsYXllciBpcyBpbiBjb21wYXRpYmlsaXR5IG1vZGUuIENvbXBhdGliaWxpdHkgbW9kZSBpcyBlbmFibGVkIHdoZW4gbm9uLWRpc2NvcmQuanMgY2xpZW50IGlzIHVzZWQuXG4gICAgICovXG4gICAgcHVibGljIGlzQ29tcGF0TW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIGlzQ2xpZW50UHJveHkodGhpcy5jbGllbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgZXZlcnkgc2luZ2xlIHF1ZXVlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFzdGVyIHBsYXllciBpbnN0YW5jZVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAgICogYXdhaXQgcGxheWVyLmRlc3Ryb3koKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNDb21wYXRNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Lm9mZihFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZSwgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgcHJpdmF0ZSBtZXRob2RcbiAgICAgICAgICAgIHRoaXMuY2xpZW50LmRlY3JlbWVudE1heExpc3RlbmVycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5ldmVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICAgICAgaWYgKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KSBjbGVhckludGVydmFsKHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0KTtcbiAgICAgICAgX2ludGVybmFscy5jbGVhclBsYXllcih0aGlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICAgICAgaWYgKCFxdWV1ZSB8fCAhcXVldWUuY29ubmVjdGlvbiB8fCAhcXVldWUuY2hhbm5lbCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGRpc3BhdGNoIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQudm9pY2VTdGF0ZVVwZGF0ZSwgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSh0aGlzLCBxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBwYXNzaW5nIHZvaWNlIHN0YXRlIHVwZGF0ZSBkYXRhIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB2b2ljZSBzdGF0ZSBoYW5kbGVyXG4gICAgICpcbiAgICAgKiBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICogICAvLyB0aGlzIGlzIGRlZmluaXRlbHkgYSByb2NrZXQgc2NpZW5jZSwgcmlnaHQgaGVyZVxuICAgICAqICAgcGxheWVyLmhhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2sgdm9pY2Ugc3RhdGUgaGFuZGxlci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIHdpbGwga2VlcCB1c2luZyB0aGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciwgZXZlbiBpZiBjdXN0b20gaW1wbGVtZW50YXRpb24gZXhpc3RzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVubG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBzdG9wIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIHVubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHZvaWNlIHN0YXRlIGhhbmRsZXIgaXMgbG9ja2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYXRlIGF1ZGlvIHBsYXllclxuICAgICAqIEBwYXJhbSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBtdXNpYyBzaG91bGQgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIHF1ZXJ5IFRoZSB0cmFjayBvciBzb3VyY2UgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXllclxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHF1ZXVlIG1hbmFnZW1lbnQsIGp1c3QgdXNlIHRoaXMgbWV0aG9kIFx1RDgzRFx1REUwNFxuICAgICAqIGNvbnN0IHF1ZXJ5ID0gJ3RoaXMgaXMgbXkgc3VwZXIgY29vbCBzZWFyY2ggcXVlcnkgdGhhdCBJIHdhbnQgdG8gcGxheSc7XG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgIGNvbnN0IHsgdHJhY2sgfSA9IGF3YWl0IHBsYXllci5wbGF5KHZvaWNlQ2hhbm5lbCwgcXVlcnkpO1xuICAgICAqICAgY29uc29sZS5sb2coYFx1RDgzQ1x1REY4OSBJIGFtIHBsYXlpbmcgJHt0cmFjay50aXRsZX0gXHVEODNDXHVERjg5YCk7XG4gICAgICogfSBjYXRjaChlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgXHVEODNEXHVERTJEIEZhaWxlZCB0byBwbGF5IGVycm9yIG9oIG5vOlxcblxcbiR7ZX1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSwgcXVlcnk6IFRyYWNrTGlrZSwgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9KTogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICAgICAgY29uc3QgdmMgPSB0aGlzLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWwpO1xuICAgICAgICBpZiAoIXZjPy5pc1ZvaWNlQmFzZWQoKSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2hhbm5lbCcsICdWb2ljZUJhc2VkQ2hhbm5lbCcsICF2YyA/ICd1bmRlZmluZWQnIDogYGNoYW5uZWwgdHlwZSAke3ZjLnR5cGV9YCk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPSBxdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCA/IHF1ZXJ5IDogYXdhaXQgdGhpcy5zZWFyY2gocXVlcnksIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoYE5vIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtxdWVyeX1cIiAoRXh0cmFjdG9yOiAke3Jlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLm5vZGVzLmNyZWF0ZSh2Yy5ndWlsZCwgb3B0aW9ucy5ub2RlT3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoeyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBXYWl0aW5nIGZvciB0aGUgcXVldWUgdG8gcmVzb2x2ZS4uLmApO1xuICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gRW50cnkgJHtlbnRyeS5pZH0gd2FzIHJlc29sdmVkIWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC50cmFja3NbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQucGxheWxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFxdWV1ZS5pc1BsYXlpbmcoKSkgYXdhaXQgcXVldWUubm9kZS5wbGF5KG51bGwsIG9wdGlvbnMuYXVkaW9QbGF5ZXJPcHRpb25zKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gUmVsZWFzaW5nIGFuIGVudHJ5IGZyb20gdGhlIHF1ZXVlLi4uYCk7XG4gICAgICAgICAgICBxdWV1ZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFjazogcmVzdWx0LnRyYWNrc1swXSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdDogcmVzdWx0LFxuICAgICAgICAgICAgcXVldWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2ggdHJhY2tzXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBUcmFjayB8IFRyYWNrW10gfCBQbGF5bGlzdCB8IFNlYXJjaFJlc3VsdH0gcXVlcnkgVGhlIHNlYXJjaCBxdWVyeVxuICAgICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZWFyY2hSZXN1bHQ+fVxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGxheWVyLnNlYXJjaChzZWFyY2hRdWVyeSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZWFyY2goc2VhcmNoUXVlcnk6IHN0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0LCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgICAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHJldHVybiBzZWFyY2hRdWVyeTtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0ZWRCeSAhPSBudWxsKSBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG4gICAgICAgIG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/PSB0aGlzLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IFtzZWFyY2hRdWVyeV0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICAgICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogc2VhcmNoUXVlcnkucXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LFxuICAgICAgICAgICAgICAgIHRyYWNrczogc2VhcmNoUXVlcnkudHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LnRyYWNrc1swXT8uZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoUXVlcnkpKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPSBzZWFyY2hRdWVyeS5maWx0ZXIoKHQpID0+IHQgaW5zdGFuY2VvZiBUcmFjayk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgICAgICAgICAgdHJhY2tzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiAnQEAjJXt7VXNlckxvYWRlZENvbnRlbnR9fSUjQEAnLFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogbnVsbCxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgICAgICBsZXQgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGwsXG4gICAgICAgICAgICBwcm90b2NvbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9LCBmYWxsYmFjayBzZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmV9YCk7XG5cbiAgICAgICAgaWYgKC9eXFx3KzovLnRlc3Qoc2VhcmNoUXVlcnkpKSB7XG4gICAgICAgICAgICBjb25zdCBbcHJvdG9jb2xOYW1lLCAuLi5xdWVyeV0gPSBzZWFyY2hRdWVyeS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBkZXRlY3RlZCBpbiBxdWVyeWApO1xuXG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ0V4dHJhY3RvciA9IHRoaXMuZXh0cmFjdG9ycy5zdG9yZS5maW5kKChlKSA9PiAhdGhpcy5leHRyYWN0b3JzLmlzRGlzYWJsZWQoZS5pZGVudGlmaWVyKSAmJiBlLnByb3RvY29scy5pbmNsdWRlcyhwcm90b2NvbE5hbWUpKTtcblxuICAgICAgICAgICAgaWYgKG1hdGNoaW5nRXh0cmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBpcyBzdXBwb3J0ZWQgYnkgJHttYXRjaGluZ0V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IhYCk7XG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yID0gbWF0Y2hpbmdFeHRyYWN0b3I7XG4gICAgICAgICAgICAgICAgc2VhcmNoUXVlcnkgPSBxdWVyeS5qb2luKCc6Jyk7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBwcm90b2NvbE5hbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDb3VsZCBub3QgZmluZCBhbiBleHRyYWN0b3IgdGhhdCBzdXBwb3J0cyAke3Byb3RvY29sTmFtZX0gcHJvdG9jb2wuIEZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yLi4uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWRpcmVjdGVkID0gYXdhaXQgUXVlcnlSZXNvbHZlci5wcmVSZXNvbHZlKHNlYXJjaFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgeyB0eXBlOiBxdWVyeVR5cGUsIHF1ZXJ5IH0gPVxuICAgICAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPT09IFF1ZXJ5VHlwZS5BVVRPID8gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHJlZGlyZWN0ZWQsIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUpIDogKHsgdHlwZTogb3B0aW9ucy5zZWFyY2hFbmdpbmUsIHF1ZXJ5OiByZWRpcmVjdGVkIH0gYXMgUmVzb2x2ZWRRdWVyeSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFF1ZXJ5IHR5cGUgaWRlbnRpZmllZCBhcyAke3F1ZXJ5VHlwZX0ke2V4dHJhY3RvciAmJiBwcm90b2NvbCA/ICcgYnV0IG1pZ2h0IG5vdCBiZSB1c2VkIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgcHJvdG9jb2wnIDogJyd9YCk7XG5cbiAgICAgICAgLy8gZm9yY2UgcGFydGljdWxhciBleHRyYWN0b3JcbiAgICAgICAgaWYgKG9wdGlvbnMuc2VhcmNoRW5naW5lLnN0YXJ0c1dpdGgoJ2V4dDonKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEZvcmNpbmcgJHtvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCl9IGV4dHJhY3Rvci4uLmApO1xuICAgICAgICAgICAgZXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLmdldChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCkpITtcbiAgICAgICAgICAgIGlmICghZXh0cmFjdG9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcXVlcnkgYWxsIGV4dHJhY3RvcnNcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgICAgICAgIC8vIGNhY2hlIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDaGVja2luZyBjYWNoZS4uLmApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gY2FjaGUgaGl0XG4gICAgICAgICAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENhY2hlIGhpdCBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgICAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgICAgICAgIGV4dHJhY3RvciA9XG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoZXh0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0LnZhbGlkYXRlKHF1ZXJ5LCBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApPy5leHRyYWN0b3IgfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIGV4dHJhY3RvcnMgYXZhaWxhYmxlXG4gICAgICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBFeGVjdXRpbmcgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yLi4uYCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4dHJhY3RvclxuICAgICAgICAgICAgLmhhbmRsZShxdWVyeSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgICAgICBwcm90b2NvbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKTtcblxuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwhJyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHJlcy5wbGF5bGlzdCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgcmVzdWx0IHVzaW5nIGFwcHJvcHJpYXRlIGV4dHJhY3Rvci4gUXVlcnlpbmcgYWxsIGV4dHJhY3RvcnMuLi4nKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihcbiAgICAgICAgICAgIGFzeW5jIChleHQpID0+XG4gICAgICAgICAgICAgICAgIW9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAgICAgICAoYXdhaXQgZXh0LnZhbGlkYXRlKHF1ZXJ5KSkgJiZcbiAgICAgICAgICAgICAgICBleHQuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBwcm90b2NvbFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtyZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0Py5leHRyYWN0b3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYE1ldGFkYXRhIHF1ZXJ5IHdhcyBzdWNjZXNzZnVsIHVzaW5nICR7cmVzdWx0LmV4dHJhY3Rvci5pZGVudGlmaWVyfSFgKTtcblxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiByZXN1bHQucmVzdWx0LnBsYXlsaXN0LFxuICAgICAgICAgICAgdHJhY2tzOiByZXN1bHQucmVzdWx0LnRyYWNrcyxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgZGlzY29yZC12b2lwYCBtb2R1bGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zb2xlLmxvZyhwbGF5ZXIuc2NhbkRlcHMoKSk7XG4gICAgICogLy8gLT4gbG9ncyBkZXBlbmRlbmNpZXMgcmVwb3J0XG4gICAgICogYGBgXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBwdWJsaWMgc2NhbkRlcHMoKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcbiAgICAgICAgY29uc3QgcnVudGltZSA9ICdCdW4nIGluIGdsb2JhbFRoaXMgPyAnQnVuJyA6ICdEZW5vJyBpbiBnbG9iYWxUaGlzID8gJ0Rlbm8nIDogJ05vZGUnO1xuICAgICAgICBjb25zdCBkZXBzUmVwb3J0ID0gW1xuICAgICAgICAgICAgJ0Rpc2NvcmQgUGxheWVyJyxcbiAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICBgLSBkaXNjb3JkLXBsYXllcjogJHtQbGF5ZXIudmVyc2lvbn0ke3RoaXMuaXNDb21wYXRNb2RlKCkgPyBgICgke2dldENvbXBhdE5hbWUodGhpcy5jbGllbnQpfSBjb21wYXRpYmlsaXR5IG1vZGUpYCA6ICcnfWAsXG4gICAgICAgICAgICBgLSBkaXNjb3JkLXZvaXA6ICR7ZFZvaWNlVmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gZGlzY29yZC5qczogJHtkanNWZXJzaW9ufWAsXG4gICAgICAgICAgICBgLSBOb2RlIHZlcnNpb246ICR7cHJvY2Vzcy52ZXJzaW9ufSAoRGV0ZWN0ZWQgUnVudGltZTogJHtydW50aW1lfSwgUGxhdGZvcm06ICR7cHJvY2Vzcy5wbGF0Zm9ybX0gWyR7cHJvY2Vzcy5hcmNofV0pYCxcbiAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VMZWdhY3lGRm1wZWcpIHJldHVybiAnLSBmZm1wZWc6IE4vQSAodXNpbmcgbGVnYWN5IGZmbXBlZyknO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBGRm1wZWcucmVzb2x2ZVNhZmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWluZm8pIHJldHVybiAnRkZtcGVnL0F2Y29udiBub3QgZm91bmQnO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtgLSBmZm1wZWc6ICR7aW5mby52ZXJzaW9ufWAsIGAtIGNvbW1hbmQ6ICR7aW5mby5jb21tYW5kfWAsIGAtIHN0YXRpYzogJHtpbmZvLm1vZHVsZX1gLCBgLSBsaWJvcHVzOiAke2luZm8ucmVzdWx0IS5pbmNsdWRlcygnLS1lbmFibGUtbGlib3B1cycpfWBdLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgICdcXG4nLFxuICAgICAgICAgICAgJ0xvYWRlZCBFeHRyYWN0b3JzOicsXG4gICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlXG4gICAgICAgICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5pZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpIHx8ICdOL0EnLFxuICAgICAgICAgICAgJ1xcblxcbmRpc2NvcmQtdm9pcCcsXG4gICAgICAgICAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlU3RyaW5nKClcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gZGVwc1JlcG9ydC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICB5aWVsZCogdGhpcy5ub2Rlcy5jYWNoZS52YWx1ZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGBQbGF5bGlzdGAgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBpbml0aWFsaXplIGEgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlUGxheWxpc3QoZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgICAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBDaGFubmVsVHlwZSwgVm9pY2VTdGF0ZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuL1BsYXllcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi91dGlscy9VdGlsJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcihwbGF5ZXI6IFBsYXllciwgcXVldWU6IEd1aWxkUXVldWUsIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkge1xuICAgIGlmICghcXVldWUgfHwgIXF1ZXVlLmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICAgIGlmIChvbGRTdGF0ZS5jaGFubmVsSWQgJiYgIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm9vcCAqL1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2b2lkIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZGlzY29ubmVjdCwgcXVldWUpO1xuICAgIH1cblxuICAgIGlmIChxdWV1ZS5vcHRpb25zLnBhdXNlT25FbXB0eSkge1xuICAgICAgICBjb25zdCBpc0VtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCk7XG5cbiAgICAgICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKHRydWUpO1xuICAgICAgICAgICAgUmVmbGVjdC5zZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmRlYnVnKCdWb2ljZSBjaGFubmVsIGlzIGVtcHR5IGFuZCBvcHRpb25zI3BhdXNlT25FbXB0eSBpcyB0cnVlLCBwYXVzaW5nLi4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoUmVmbGVjdC5nZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknKSkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAocXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUuZGVidWcoJ1ZvaWNlIGNoYW5uZWwgaXMgbm90IGVtcHR5IGFuZCBvcHRpb25zI3BhdXNlT25FbXB0eSBpcyB0cnVlLCByZXN1bWluZy4uLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghb2xkU3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5tZW1iZXI/LmlkID09PSBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy5pZCkge1xuICAgICAgICBpZiAobmV3U3RhdGUuc2VydmVyTXV0ZSAhPSBudWxsICYmIG9sZFN0YXRlLnNlcnZlck11dGUgIT09IG5ld1N0YXRlLnNlcnZlck11dGUpIHtcbiAgICAgICAgICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnNlcnZlck11dGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlLmNoYW5uZWw/LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSAmJiBuZXdTdGF0ZS5zdXBwcmVzcyAhPSBudWxsICYmIG9sZFN0YXRlLnN1cHByZXNzICE9PSBuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc3VwcHJlc3MpO1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnN1cHByZXNzKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghbmV3U3RhdGUuY2hhbm5lbElkICYmIG9sZFN0YXRlLmNoYW5uZWxJZCA9PT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICAgICAgICBxdWV1ZS50aW1lb3V0cy5zZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCwgdGltZW91dCk7XG4gICAgfVxuXG4gICAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICBjb25zdCBjaGFubmVsRW1wdHkgPSBVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKTtcbiAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLmRlbGV0ZShgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY2hhbm5lbFBvcHVsYXRlLCBxdWV1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgICAgICBpZiAobmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgICAgIGlmIChxdWV1ZS5jb25uZWN0aW9uICYmIG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKSBxdWV1ZS5jaGFubmVsID0gbmV3U3RhdGUuY2hhbm5lbCE7XG4gICAgICAgICAgICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICBjb25zdCBjaGFubmVsRW1wdHkgPSBVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKTtcbiAgICAgICAgICAgIGlmICghY2hhbm5lbEVtcHR5ICYmIGVtcHR5VGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChlbXB0eVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLmRlbGV0ZShgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5jb25uZWN0aW9uICYmICFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVtcHR5Q2hhbm5lbCwgcXVldWUpO1xuICAgICAgICAgICAgICAgIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5zZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCwgdGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobmV3U3RhdGUuY2hhbm5lbElkICE9PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbm5lbEVtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpO1xuICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbEVtcHR5KSByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLnRpbWVvdXRzLmhhcyhgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVtcHR5Q2hhbm5lbCwgcXVldWUpO1xuICAgICAgICAgICAgICAgIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5zZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCwgdGltZW91dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsRW1wdHkgPSBVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChlbXB0eVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY2hhbm5lbFBvcHVsYXRlLCBxdWV1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFV0aWwgfSBmcm9tICcuL1V0aWwnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8vIEB0cy1pZ25vcmVcbmxldCBpcDogdHlwZW9mIGltcG9ydCgnaXAnKTtcblxuZnVuY3Rpb24gZW5zdXJlSXAoKSB7XG4gICAgaWYgKGlwKSByZXR1cm4gaXA7XG5cbiAgICBjb25zdCB7IGVycm9yLCBtb2R1bGUgfSA9IFV0aWwucmVxdWlyZSgnaXAnKTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT1RfRVhJU1RJTkdfTU9EVUxFKCdpcCcsICdpcCBwYWNrYWdlIGlzIHJlcXVpcmVkIHRvIHVzZSBJUFJvdGF0b3IuJyk7XG4gICAgfVxuXG4gICAgaXAgPSBtb2R1bGU7XG5cbiAgICByZXR1cm4gaXA7XG59XG5cbmV4cG9ydCBjbGFzcyBJUEJsb2NrIHtcbiAgICBwdWJsaWMgdXNhZ2UgPSAwO1xuICAgIHB1YmxpYyByZWFkb25seSBjaWRyOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGNpZHJTaXplOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGJsb2NrOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGVuc3VyZUlwKCkuaXNWNEZvcm1hdChibG9jay5zcGxpdCgnLycpWzBdKSAmJiAhYmxvY2suaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICAgICAgYmxvY2sgKz0gJy8zMic7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5zdXJlSXAoKS5pc1Y2Rm9ybWF0KGJsb2NrLnNwbGl0KCcvJylbMF0pICYmICFibG9jay5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgICAgICBibG9jayArPSAnLzEyOCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNpZHIgPSBlbnN1cmVJcCgpLmNpZHIodGhpcy5ibG9jayk7XG4gICAgICAgIHRoaXMuY2lkclNpemUgPSBlbnN1cmVJcCgpLmNpZHJTdWJuZXQodGhpcy5ibG9jaykuc3VibmV0TWFza0xlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3VtZSgpIHtcbiAgICAgICAgdGhpcy51c2FnZSsrO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUFJvdGF0aW9uQ29uZmlnIHtcbiAgICAvKipcbiAgICAgKiBJUCBibG9ja3MgdG8gdXNlXG4gICAgICovXG4gICAgYmxvY2tzOiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBJUHMgdG8gZXhjbHVkZVxuICAgICAqL1xuICAgIGV4Y2x1ZGU/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBNYXggcmV0cmllcyB0byBmaW5kIGFuIElQIHRoYXQgaXMgbm90IGV4Y2x1ZGVkXG4gICAgICovXG4gICAgbWF4UmV0cmllcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIElQUm90YXRvciB7XG4gICAgcHVibGljIGJsb2NrczogSVBCbG9ja1tdID0gW107XG4gICAgcHVibGljIGZhaWx1cmVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBwdWJsaWMgTUFYX05FWFRfUkVUUklFUyA9IDMwO1xuICAgICNyZXRyaWVzID0gMDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgY29uZmlnOiBJUFJvdGF0aW9uQ29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5leGNsdWRlID8/PSBbXTtcbiAgICAgICAgdGhpcy5ibG9ja3MgPSBjb25maWcuYmxvY2tzLm1hcCgoYmxvY2spID0+IG5ldyBJUEJsb2NrKGJsb2NrKSk7XG4gICAgICAgIHRoaXMuTUFYX05FWFRfUkVUUklFUyA9IGNvbmZpZy5tYXhSZXRyaWVzID8/IDEwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJUCgpOiB7IGlwOiBzdHJpbmc7IGZhbWlseTogNCB8IDYgfSB7XG4gICAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5ibG9ja3Muc29ydCgoYSwgYikgPT4gYS51c2FnZSAtIGIudXNhZ2UpWzBdO1xuICAgICAgICBpZiAoIWJsb2NrKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIElQIGJsb2NrcyBhdmFpbGFibGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhbmRvbSA9IElQUm90YXRvci5nZXRSYW5kb21JUChibG9jay5jaWRyLCBibG9jay5jaWRyU2l6ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNGYWlsZWRPckV4Y2x1ZGVkKHJhbmRvbSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNyZXRyaWVzKysgPiB0aGlzLk1BWF9ORVhUX1JFVFJJRVMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZXRyaWVzID0gMDtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIGFuIElQIHRoYXQgaXMgbm90IGV4Y2x1ZGVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldElQKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiNyZXRyaWVzID0gMDtcbiAgICAgICAgYmxvY2suY29uc3VtZSgpO1xuICAgICAgICByZXR1cm4geyBpcDogcmFuZG9tLCBmYW1pbHk6IGVuc3VyZUlwKCkuaXNWNEZvcm1hdChyYW5kb20pID8gNCA6IDYgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNGYWlsZWRPckV4Y2x1ZGVkKGlwOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZXMuaGFzKGlwKSB8fCAhIXRoaXMuY29uZmlnLmV4Y2x1ZGU/LmluY2x1ZGVzKGlwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmFpbGVkKGlwOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbGFzdEZhaWxlZENvdW50ID0gdGhpcy5mYWlsdXJlcy5nZXQoaXApID8/IDA7XG5cbiAgICAgICAgdGhpcy5mYWlsdXJlcy5zZXQoaXAsIGxhc3RGYWlsZWRDb3VudCArIDEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmFuZG9tSVAoYWRkcmVzczogc3RyaW5nLCBzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKSB7XG4gICAgICAgIC8vIEF1dGhvcjogSmVzc2UgVGFuZSA8amVzc2UudGFuZUBnbWFpbC5jb20+XG4gICAgICAgIC8vIE5QTUpTOiBodHRwczovL25wbWpzLm9yZy9yYW5kb20taXBcblxuICAgICAgICBjb25zdCBieXRlcyA9IGVuc3VyZUlwKCkudG9CdWZmZXIoYWRkcmVzcyk7XG4gICAgICAgIGNvbnN0IGlwdjYgPSBieXRlcy5sZW5ndGggPT09IDE2O1xuICAgICAgICBjb25zdCBieXRlc2l6ZSA9IDg7XG5cbiAgICAgICAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICAgICAgICBlbmQgPSB0eXBlb2YgZW5kICE9PSAndW5kZWZpbmVkJyA/IGVuZCA6IGJ5dGVzLmxlbmd0aCAqIGJ5dGVzaXplO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBiaXQgPSBpICogYnl0ZXNpemU7XG5cbiAgICAgICAgICAgIGlmIChiaXQgKyBieXRlc2l6ZSA8IHN0YXJ0IHx8IGJpdCA+PSBlbmQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGIgPSBieXRlc1tpXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBieXRlc2l6ZTsgbisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJpdCA+PSBzdGFydCAmJiBiaXQgPCBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYml0cG9zID0gYnl0ZXNpemUgLSBuIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYml0bWFzayA9IDEgPDwgYml0cG9zO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IDAuNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYiB8PSBiaXRtYXNrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYiAmPSB+Yml0bWFzaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiaXQrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnl0ZXNbaV0gPSBiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV0cyA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpcHY2KSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgJSAyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRldHNbaSA+PiAxXSA9ICgoYnl0ZXNbaV0gPDwgYnl0ZXNpemUpIHwgYnl0ZXNbaSArIDFdKS50b1N0cmluZygxNik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZXRzW2ldID0gYnl0ZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGV0cy5qb2luKGlwdjYgPyAnOicgOiAnLicpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEZGbXBlZywgRkZtcGVnTGliIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUpTT04ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1heWJlTnVsbDxUPiA9IFQgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGVuZGVuY2llc1JlcG9ydCB7XG4gICAgY29yZToge1xuICAgICAgICAnZGlzY29yZC1wbGF5ZXInOiBzdHJpbmc7XG4gICAgICAgICdkaXNjb3JkLXZvaXAnOiBzdHJpbmc7XG4gICAgfTtcbiAgICBsaWJvcHVzOiB7XG4gICAgICAgIG1lZGlhcGxleDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgICAgICdAZGlzY29yZGpzL29wdXMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAgICAgJ0BldmFuL29wdXMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAgICAgb3B1c3NjcmlwdDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgICAgICdub2RlLW9wdXMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICB9O1xuICAgIGxpYnNvZGl1bToge1xuICAgICAgICAnc29kaXVtLW5hdGl2ZSc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICAgICBzb2RpdW06IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICAgICAnbGlic29kaXVtLXdyYXBwZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgICAgICdzb2RpdW0tamF2YXNjcmlwdCc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICAgICAnQHN0YWJsZWxpYi94Y2hhY2hhMjBwb2x5MTMwNSc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgIH07XG4gICAgZmZtcGVnOiBGRm1wZWdSZXBvcnQ7XG59XG5cbmV4cG9ydCB0eXBlIEZGbXBlZ1JlcG9ydCA9IFJlY29yZDxcbiAgICBGRm1wZWdMaWIsXG4gICAgTWF5YmVOdWxsPHtcbiAgICAgICAgdmVyc2lvbjogc3RyaW5nO1xuICAgICAgICBoYXNMaWJvcHVzOiBib29sZWFuO1xuICAgIH0+XG4+O1xuXG4vKipcbiAqIEEgdXRpbGl0eSB0byBnZW5lcmF0ZSBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGRpc2NvcmQtcGxheWVyIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IgPSB7XG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIG9mIGEgcGFja2FnZS5cbiAgICAgKiBAcGFyYW0gZGlyIC0gVGhlIGRpcmVjdG9yeSB0byBzdGFydCBzZWFyY2hpbmcgZnJvbVxuICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGZpbmRcbiAgICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2hcbiAgICAgKiBAcmV0dXJucyBUaGUgcGFja2FnZS5qc29uIGZpbGUsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgZmluZFBhY2thZ2VKU09OKGRpcjogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nLCBkZXB0aDogbnVtYmVyKTogUGFja2FnZUpTT04gfCBudWxsIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB0YXJnZXQgPSByZXNvbHZlKGRpciwgJ3BhY2thZ2UuanNvbicpO1xuXG4gICAgICAgIGNvbnN0IG5leHQgPSAoKSA9PiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmZpbmRQYWNrYWdlSlNPTihyZXNvbHZlKGRpciwgJy4uJyksIHBhY2thZ2VOYW1lLCBkZXB0aCAtIDEpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgICAgICAgICAgY29uc3QgcGtnSlNPTjogUGFja2FnZUpTT04gPSByZXF1aXJlKHRhcmdldCk7XG5cbiAgICAgICAgICAgIGlmIChwa2dKU09OLm5hbWUgIT09IHBhY2thZ2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHBrZ0pTT047XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gZmluZCB0aGUgdmVyc2lvbiBvZiBhIGRlcGVuZGVuY3kuXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgcGFja2FnZSB0byBmaW5kIHRoZSB2ZXJzaW9uIG9mXG4gICAgICogQHBhcmFtIG1heExvb2t1cERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoIGZvciB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICAgKiBAcmV0dXJucyBUaGUgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICB2ZXJzaW9uKG5hbWU6IHN0cmluZywgbWF4TG9va3VwRGVwdGggPSAzKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2Rpc2NvcmQtcGxheWVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAnNy4wLjAtZGV2LjEnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwa2cgPSBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmZpbmRQYWNrYWdlSlNPTihkaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShuYW1lKSksIG5hbWUsIG1heExvb2t1cERlcHRoKTtcbiAgICAgICAgICAgIHJldHVybiBwa2c/LnZlcnNpb24gPz8gbnVsbDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXBvcnQgb2JqZWN0XG4gICAgICovXG4gICAgZ2VuZXJhdGUoKTogRGVwZW5kZW5jaWVzUmVwb3J0IHtcbiAgICAgICAgY29uc3QgZmZtcGVnUmVwb3J0ID0ge30gYXMgRkZtcGVnUmVwb3J0O1xuXG4gICAgICAgIGZvciAoY29uc3QgbGliIG9mIEZGbXBlZy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBmZm1wZWdSZXBvcnRbbGliLm5hbWVdID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZmbXBlZyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuXG4gICAgICAgIGlmIChmZm1wZWcpIHtcbiAgICAgICAgICAgIGZmbXBlZ1JlcG9ydFtmZm1wZWcubmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgaGFzTGlib3B1czogZmZtcGVnLmNvbW1hbmQuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBmZm1wZWcudmVyc2lvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb3JlOiB7XG4gICAgICAgICAgICAgICAgJ2Rpc2NvcmQtcGxheWVyJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdkaXNjb3JkLXBsYXllcicpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAnZGlzY29yZC12b2lwJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdkaXNjb3JkLXZvaXAnKSBhcyBzdHJpbmdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsaWJvcHVzOiB7XG4gICAgICAgICAgICAgICAgbWVkaWFwbGV4OiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ21lZGlhcGxleCcpLFxuICAgICAgICAgICAgICAgICdAZGlzY29yZGpzL29wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0BkaXNjb3JkanMvb3B1cycpLFxuICAgICAgICAgICAgICAgICdAZXZhbi9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZXZhbi9vcHVzJyksXG4gICAgICAgICAgICAgICAgb3B1c3NjcmlwdDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdvcHVzc2NyaXB0JyksXG4gICAgICAgICAgICAgICAgJ25vZGUtb3B1cyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignbm9kZS1vcHVzJylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsaWJzb2RpdW06IHtcbiAgICAgICAgICAgICAgICAnc29kaXVtLW5hdGl2ZSc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtLW5hdGl2ZScpLFxuICAgICAgICAgICAgICAgIHNvZGl1bTogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0nKSxcbiAgICAgICAgICAgICAgICAnbGlic29kaXVtLXdyYXBwZXJzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdsaWJzb2RpdW0td3JhcHBlcnMnKSxcbiAgICAgICAgICAgICAgICAnQHN0YWJsZWxpYi94Y2hhY2hhMjBwb2x5MTMwNSc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQHN0YWJsZWxpYi94Y2hhY2hhMjBwb2x5MTMwNScpLFxuICAgICAgICAgICAgICAgICdzb2RpdW0tamF2YXNjcmlwdCc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtLWphdmFzY3JpcHQnKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZmbXBlZzogZmZtcGVnUmVwb3J0XG4gICAgICAgIH07XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlcGVuZGVuY2llcyByZXBvcnQuXG4gICAgICogQHJldHVybnMgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgICAqL1xuICAgIGdlbmVyYXRlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJlcG9ydCA9IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZ2VuZXJhdGUoKTtcbiAgICAgICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBvdXRwdXQucHVzaCgnRGVwZW5kZW5jaWVzIFJlcG9ydCcpO1xuICAgICAgICBvdXRwdXQucHVzaChsaW5lKTtcblxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVwb3J0KSBhcyAoa2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0KVtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgX2tleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBfa2V5IGFzIGtleW9mIERlcGVuZGVuY2llc1JlcG9ydDtcblxuICAgICAgICAgICAgb3V0cHV0LnB1c2goa2V5KTtcblxuICAgICAgICAgICAgY29uc3Qgc3ViS2V5cyA9IE9iamVjdC5rZXlzKHJlcG9ydFtrZXldKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBfc3ViS2V5IG9mIHN1YktleXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJLZXkgPSBfc3ViS2V5IGFzIGtleW9mIERlcGVuZGVuY2llc1JlcG9ydFt0eXBlb2Yga2V5XTtcblxuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGAtICR7c3ViS2V5fTogJHtyZXBvcnRba2V5XVtzdWJLZXldID8/ICdOL0EnfWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQucHVzaChsaW5lKTtcblxuICAgICAgICByZXR1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LEVBQ1osWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVoscUJBQXFCO0FBQUEsRUFDckIscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsY0FBYztBQUFBLEVBQ2QsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosYUFBYTtBQUFBLEVBQ2IsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsYUFBYTtBQUFBLEVBQ2IsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBLEVBQ2QsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsa0JBQWtCO0FBQUEsRUFDbEIsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsY0FBYztBQUFBLEVBQ2QsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsYUFBYTtBQUFBLEVBQ2IsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBLEVBQ2QsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQscUJBQXFCO0FBQUEsRUFDckIscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsaUJBQWlCO0FBQUEsRUFDakIsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJakIsV0FBVztBQUFBLEVBQ1gsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVgsb0JBQW9CO0FBQUEsRUFDcEIsb0JBQW9CO0FBQUE7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Q0FBQyxhQUFhLEtBQUssT0FBTyxJQUFJLGNBQWMsS0FBSyxPQUFPLElBQUksYUFBYSxLQUFLLE1BQU0sSUFBSSxjQUFjLEtBQUssT0FBUSxTQUFTLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFBQSxNQUN2SyxHQUFHO0FBQUEsTUFDSDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxLQUFLLFdBQVcsTUFDWCxJQUFJLENBQUMsTUFBTTtBQUNSLGVBQU8sRUFBRTtBQUFBLE1BQ2IsQ0FBQyxFQUNBLEtBQUssSUFBSSxLQUFLO0FBQUEsTUFDbkI7QUFBQSxNQUNBLDBCQUEwQixlQUFlO0FBQUEsSUFDN0M7QUFFQSxXQUFPLFdBQVcsS0FBSyxJQUFJO0FBQUEsRUFDL0I7QUFBQSxFQUVBLEVBQVMsT0FBTyxRQUFRLElBQUk7QUFDeEIsV0FBTyxLQUFLLE1BQU0sTUFBTSxPQUFPO0FBQUEsRUFDbkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sZUFBZSxNQUF3QjtBQUMxQyxXQUFPLElBQUksU0FBUyxNQUFNLElBQUk7QUFBQSxFQUNsQztBQUNKO0FBcHBCSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOMEQ7QUFBQTtBQUFBO0FBQUE7QUFBakQsUUFVYyxVQUFrQjtBQVZoQyxRQVdLLGdCQUFnQjtBQVgzQixJQUFNLFNBQU47OztBN0NwQlAsSUFBQU0sb0JBV087QUFDUCxJQUFBQyx1QkFBd0w7QUFHakwsSUFBTSxVQUFrQjsiLAogICJuYW1lcyI6IFsiR3VpbGRRdWV1ZSIsICJ0YXJnZXQiLCAiU2VyaWFsaXplZFR5cGUiLCAiUXVldWVSZXBlYXRNb2RlIiwgInZlcnNpb24iLCAidGFyZ2V0IiwgIm1vZHVsZSIsICJoYW5kbGVyIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAiaGFuZGxlciIsICJoYW5kbGVyIiwgInJlc3VsdCIsICJ0YXJnZXQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJ0YXJnZXQiLCAicXVlcnkiLCAiaW1wb3J0X3Byb21pc2VzIiwgImltcG9ydF9kaXNjb3JkIiwgInJlc29sdmUiLCAicmVzb2x2ZSIsICJ3YWl0Rm9yIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAiVHJhY2tTa2lwUmVhc29uIiwgInRhcmdldCIsICJyZXNvbHZlIiwgIkd1aWxkUXVldWUiLCAiR3VpbGRRdWV1ZSIsICJpbXBvcnRfcHJvbWlzZXMiLCAidmVyc2lvbiIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZmZtcGVnIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X2Rpc2NvcmQiLCAibW9kdWxlIiwgImlwIiwgImltcG9ydF9mZm1wZWciLCAidGFyZ2V0IiwgImRqc1ZlcnNpb24iLCAiaGFuZGxlciIsICJxdWVyeSIsICJyZXMiLCAicmVzdWx0IiwgImRWb2ljZVZlcnNpb24iLCAiaW1wb3J0X2VxdWFsaXplciIsICJpbXBvcnRfZGlzY29yZF92b2lwIl0KfQo=
6387
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy91dGlscy9UeXBlVXRpbC50cyIsICIuLi9zcmMvZXJyb3JzL2luZGV4LnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy90eXBlcy90eXBlcy50cyIsICIuLi9zcmMvZmFicmljL1NlYXJjaFJlc3VsdC50cyIsICIuLi9zcmMvdXRpbHMvQXVkaW9GaWx0ZXJzLnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvaG9va3MvY29udGV4dC9hc3luYy1jb250ZXh0LnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vX2NvbnRhaW5lci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldEdsb2JhbFJlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9ob29rcy9jb21tb24udHMiLCAiLi4vc3JjL2hvb2tzL3VzZUhpc3RvcnkudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlUXVldWUudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1haW5QbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1ldGFkYXRhLnRzIiwgIi4uL3NyYy9ob29rcy91c2VUaW1lbGluZS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQWZ0ZXJDcmVhdGVTdHJlYW0udHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkJlZm9yZUNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3MvdXNlVm9sdW1lLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZE5vZGVNYW5hZ2VyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlLnRzIiwgIi4uL3NyYy9Wb2ljZUludGVyZmFjZS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVBsYXllck5vZGUudHMiLCAiLi4vc3JjL3V0aWxzL1F1ZXJ5UmVzb2x2ZXIudHMiLCAiLi4vc3JjL3V0aWxzL0FzeW5jUXVldWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3F1ZXVlL1N5bmNlZEx5cmljc1Byb3ZpZGVyLnRzIiwgIi4uL3NyYy91dGlscy9TZXF1ZW50aWFsQnVja2V0LnRzIiwgIi4uL3NyYy9scmNsaWIvTHJjTGliLnRzIiwgIi4uL3NyYy9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeUNhY2hlLnRzIiwgIi4uL3NyYy9QbGF5ZXIudHMiLCAiLi4vc3JjL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlci50cyIsICIuLi9zcmMvdXRpbHMvRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHsgY3JlYXRlRXJpc0NvbXBhdCwgaXNFcmlzUHJveHkgfSBmcm9tICcuL2NvbXBhdC9jcmVhdGVFcmlzQ29tcGF0JztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUGxheWVyRXZlbnRzRW1pdHRlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0F1ZGlvRmlsdGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5leHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5leHBvcnQgKiBmcm9tICcuL2ZhYnJpYyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vbHJjbGliL0xyY0xpYic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1NlcXVlbnRpYWxCdWNrZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9Wb2ljZUludGVyZmFjZS9Wb2ljZVV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UeXBlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0FzeW5jUXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0ZGbXBlZ1N0cmVhbSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmV4cG9ydCAqIGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuZXhwb3J0ICogZnJvbSAnLi9QbGF5ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9ob29rcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3NlcmRlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvcic7XG5leHBvcnQge1xuICAgIEF1ZGlvRmlsdGVycyBhcyBQQ01BdWRpb0ZpbHRlcnMsXG4gICAgdHlwZSBCaXF1YWRGaWx0ZXJzLFxuICAgIEZpbHRlclR5cGUgYXMgQmlxdWFkRmlsdGVyVHlwZSxcbiAgICB0eXBlIFBDTUZpbHRlcnMsXG4gICAgUV9CVVRURVJXT1JUSCxcbiAgICBWb2x1bWVUcmFuc2Zvcm1lcixcbiAgICBCQVNTX0VRX0JBTkRTLFxuICAgIEFGX05JR0hUQ09SRV9SQVRFLFxuICAgIEFGX1ZBUE9SV0FWRV9SQVRFLFxuICAgIEZpbHRlcnNDaGFpbixcbn0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5leHBvcnQge1xuICAgIGNyZWF0ZUF1ZGlvUGxheWVyLFxuICAgIEF1ZGlvUGxheWVyLFxuICAgIGdldFZvaWNlQ29ubmVjdGlvbixcbiAgICBnZXRWb2ljZUNvbm5lY3Rpb25zLFxuICAgIGpvaW5Wb2ljZUNoYW5uZWwsXG4gICAgdHlwZSBKb2luQ29uZmlnLFxuICAgIHR5cGUgSm9pblZvaWNlQ2hhbm5lbE9wdGlvbnMsXG4gICAgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMsXG59IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuZXhwb3J0IGNvbnN0IHZlcnNpb246IHN0cmluZyA9ICc3LjAuMC1kZXYuMyc7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLy8gQHRzLW5vY2hlY2tcblxuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIEdhdGV3YXlEaXNwYXRjaEV2ZW50cyB9IGZyb20gJ2Rpc2NvcmQtYXBpLXR5cGVzL3YxMCc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgdHlwZSB7IENsaWVudCwgR2F0ZXdheVZvaWNlU2VydmVyVXBkYXRlRGlzcGF0Y2hEYXRhLCBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHR5cGUgRXJpcyBmcm9tICdlcmlzJztcblxudHlwZSBFcmlzVXNlclJlc29sdmFibGUgPSBFcmlzLlVzZXIgfCBzdHJpbmcgfCBFcmlzLk1lbWJlcjtcbnR5cGUgRXJpc0d1aWxkUmVzb2x2YWJsZSA9IEVyaXMuR3VpbGQgfCBzdHJpbmcgfCBFcmlzLk1lbWJlciB8IEVyaXMuR3VpbGRDaGFubmVsIHwgRXJpcy5Sb2xlO1xudHlwZSBFcmlzQ2hhbm5lbFJlc29sdmFibGUgPSBFcmlzLkd1aWxkQ2hhbm5lbCB8IHN0cmluZztcblxuY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDbGllbnRQcm94eShjbGllbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBSZWZsZWN0LmdldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wpICE9IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wYXROYW1lKGNsaWVudDogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA/PyBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzUHJveHkoY2xpZW50OiBhbnkpOiBjbGllbnQgaXMgRXJpcy5DbGllbnQge1xuICAgIHJldHVybiBSZWZsZWN0LmdldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wpID09PSAnRXJpcyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VyaXNDbGllbnQoY2xpZW50OiBhbnkpOiBjbGllbnQgaXMgRXJpcy5DbGllbnQge1xuICAgIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdlcmlzJyk7XG5cbiAgICBpZiAoZXJyb3IpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGVyaXMgPSBtb2R1bGUgYXMgdHlwZW9mIGltcG9ydCgnZXJpcycpO1xuXG4gICAgcmV0dXJuIGNsaWVudCBpbnN0YW5jZW9mIGVyaXMuQ2xpZW50O1xufVxuXG5mdW5jdGlvbiBkZWNsYXJlUHJvcGVydHkodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHk8VD4odGFyZ2V0OiBhbnksIGtleTogc3RyaW5nKTogVCB7XG4gICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5KTtcbn1cblxuLyoqXG4gKiBBbGxvd3MgRXJpcyBjbGllbnRzIHRvIGJlIHVzZWQgd2l0aCBkaXNjb3JkLXBsYXllci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIGNyZWF0ZXMgYSBwcm94eSBvYmplY3QgdGhhdCBpbnRlcmNlcHRzIGNlcnRhaW4gbWV0aG9kcyBhbmQgcHJvcGVydGllcyB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBkaXNjb3JkLXBsYXllci5cbiAqIEBwYXJhbSBjbGllbnQgVGhlIEVyaXMgY2xpZW50IHRvIGJlIHVzZWQuXG4gKiBAcmV0dXJucyBUaGUgRXJpcyBjbGllbnQgd2l0aCBkaXNjb3JkLXBsYXllciBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXJpc0NvbXBhdChjbGllbnQ6IEVyaXMuQ2xpZW50KTogQ2xpZW50IHtcbiAgICBjb25zdCB7IG1vZHVsZSwgZXJyb3IgfSA9IFV0aWwucmVxdWlyZSgnZXJpcycpO1xuXG4gICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcblxuICAgIGNvbnN0IGVyaXMgPSBtb2R1bGUgYXMgdHlwZW9mIGltcG9ydCgnZXJpcycpO1xuXG4gICAgZXJpc1ZvaWNlRXZlbnRzSGFuZGxlcihjbGllbnQpO1xuXG4gICAgY29uc3QgZXJpc1Byb3h5ID0gbmV3IFByb3h5KGNsaWVudCwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1c2Vycyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmlzVXNlcnNQcm94eSh0YXJnZXQsIGVyaXMpO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2d1aWxkcyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmlzR3VpbGRzUHJveHkodGFyZ2V0LCBlcmlzKTtcbiAgICAgICAgICAgICAgICBjYXNlICdjaGFubmVscyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmlzQ2hhbm5lbHNQcm94eSh0YXJnZXQsIGVyaXMpO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2luY3JlbWVudE1heExpc3RlbmVycyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGNsaWVudC5nZXRNYXhMaXN0ZW5lcnMoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RlY3JlbWVudE1heExpc3RlbmVycyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgLSAxO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGxpc3RlbmVycyA8IDAgPyAxIDogbGlzdGVuZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBSZWZsZWN0LnNldChlcmlzUHJveHksIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wsICdFcmlzJyk7XG5cbiAgICByZXR1cm4gZXJpc1Byb3h5IGFzIHVua25vd24gYXMgQ2xpZW50O1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudDogRXJpcy5DbGllbnQpIHtcbiAgICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCBhbnk+PihjbGllbnQsICdhZGFwdGVycycpO1xuXG4gICAgaWYgKCFhZGFwdGVycykge1xuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgICAgICBkZWNsYXJlUHJvcGVydHkoY2xpZW50LCAnYWRhcHRlcnMnLCBjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICBjbGllbnQub24oJ3NoYXJkRGlzY29ubmVjdCcsIChfLCBzaGFyZElkKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2d1aWxkSWQsIGFkYXB0ZXJdIG9mIGFkYXB0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGNsaWVudC5ndWlsZHMuZ2V0KGd1aWxkSWQpPy5zaGFyZC5pZCA9PT0gc2hhcmRJZCkge1xuICAgICAgICAgICAgICAgIGFkYXB0ZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBjbGllbnQub24oJ3Jhd1dTJywgKHBhY2tldCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHBhY2tldC50KSB7XG4gICAgICAgICAgICBjYXNlIEdhdGV3YXlEaXNwYXRjaEV2ZW50cy5Wb2ljZVNlcnZlclVwZGF0ZToge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTZXJ2ZXJVcGRhdGVEaXNwYXRjaERhdGE7XG4gICAgICAgICAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU2VydmVyVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGU6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGE7XG5cbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5ndWlsZF9pZCAmJiBwYXlsb2FkLnNlc3Npb25faWQgJiYgcGF5bG9hZC51c2VyX2lkID09PSBjbGllbnQudXNlci5pZCkge1xuICAgICAgICAgICAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTdGF0ZVVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNDaGFubmVsc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB7XG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgZ2V0IGNhY2hlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBnZXQoaWQ6IHN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LmdldENoYW5uZWwoaWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFzKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkIGluIGNsaWVudC5jaGFubmVsR3VpbGRNYXA7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmUocmVzb2x2YWJsZTogc3RyaW5nIHwgRXJpc0NoYW5uZWxSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eSh0aGlzLmNsaWVudC5nZXRDaGFubmVsKHJlc29sdmFibGUpIGFzIEVyaXMuR3VpbGRDaGFubmVsLCBjbGllbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGRDaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShyZXNvbHZhYmxlLCBjbGllbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlSWQocmVzb2x2YWJsZTogRXJpc0NoYW5uZWxSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5yZXNvbHZlKHJlc29sdmFibGUpO1xuICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWw/LmlkO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gaGFuZGxlcjtcbn1cblxuZnVuY3Rpb24gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KFxuICAgIGNoYW5uZWw6IEVyaXMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkLFxuICAgIGNsaWVudDogRXJpcy5DbGllbnQsXG4pOiBFcmlzLkd1aWxkQ2hhbm5lbCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFjaGFubmVsKSByZXR1cm47XG5cbiAgICByZXR1cm4gbmV3IFByb3h5KGNoYW5uZWwsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgICAgICAgc3dpdGNoIChwKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZ3VpbGQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJpc1ZvaWNlQWRhcHRlclByb3h5KHRhcmdldC5ndWlsZCwgY2xpZW50KTtcbiAgICAgICAgICAgICAgICBjYXNlICdtZW1iZXJzJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQgYXMgRXJpcy5Wb2ljZUNoYW5uZWwpLnZvaWNlTWVtYmVycztcbiAgICAgICAgICAgICAgICBjYXNlICdpc1ZvaWNlQmFzZWQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2UgfHwgdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgICAgICAgICBjYXNlICdpc1ZvaWNlJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFZvaWNlO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2lzU3RhZ2UnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJQcm94eShndWlsZDogRXJpcy5HdWlsZCB8IHVuZGVmaW5lZCwgY2xpZW50OiBFcmlzLkNsaWVudCk6IEVyaXMuR3VpbGQgfCB1bmRlZmluZWQge1xuICAgIGlmICghZ3VpbGQpIHJldHVybjtcblxuICAgIHJldHVybiBuZXcgUHJveHkoZ3VpbGQsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgICAgICAgaWYgKHAgPT09ICd2b2ljZUFkYXB0ZXJDcmVhdG9yJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmlzVm9pY2VBZGFwdGVyQ3JlYXRvcih0YXJnZXQsIGNsaWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJDcmVhdG9yKGd1aWxkOiBFcmlzLkd1aWxkLCBjbGllbnQ6IEVyaXMuQ2xpZW50KTogRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB7XG4gICAgcmV0dXJuIChtZXRob2RzKSA9PiB7XG4gICAgICAgIGxldCBhZGFwdGVycyA9IGdldFByb3BlcnR5PE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICAgICAgICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPigpO1xuICAgICAgICAgICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgICAgICAgICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBhZGFwdGVycy5zZXQoZ3VpbGQuaWQsIG1ldGhvZHMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZW5kUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGd1aWxkLnNoYXJkLnN0YXR1cyAhPT0gJ3JlYWR5JykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGd1aWxkLnNoYXJkLnNlbmRXUyhwYXlsb2FkLm9wLCBwYXlsb2FkLmQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgICAgICAgYWRhcHRlcnMuZGVsZXRlKGd1aWxkLmlkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZXJpc0d1aWxkc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoY2xpZW50Lmd1aWxkcywge1xuICAgICAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICAgICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwID09PSAncmVzb2x2ZScgfHwgcCA9PT0gJ3Jlc29sdmVJZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzR3VpbGRSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuZ2V0KHJlc29sdmFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2YWJsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLk1lbWJlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuUm9sZVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLmd1aWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogRXJpc0d1aWxkUmVzb2x2YWJsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3VpbGQ/LmlkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNVc2Vyc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoY2xpZW50LnVzZXJzLCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgICAgICAgIGlmIChwID09PSAnY2FjaGUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IEVyaXNVc2VyUmVzb2x2YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5Vc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2YWJsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLnVzZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChyZXNvbHZhYmxlOiBFcmlzVXNlclJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXNlcj8uaWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbiIsICJpbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgVGltZURhdGEgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFBsYXlsaXN0LCBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IHJhbmRvbUludCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7XG4gICAgY3JlYXRlRmlsdGVyLFxuICAgIGNyZWF0ZVNwb3RpZnlGaWx0ZXIsXG4gICAgZml4VHJhY2tTdWZmaXgsXG4gICAgcmVtb3ZlTGl2ZSxcbiAgICByZW1vdmVSZW1hc3RlcmVkLFxuICAgIHlvdXR1YmUsXG4gICAgcmVtb3ZlWmVyb1dpZHRoLFxuICAgIHJlcGxhY2VOYnNwLFxuICAgIHJlcGxhY2VTbWFydFF1b3RlcyxcbiAgICByZW1vdmVDbGVhbkV4cGxpY2l0LFxufSBmcm9tICdAd2ViLXNjcm9iYmxlci9tZXRhZGF0YS1maWx0ZXInO1xuaW1wb3J0IHsgVHJhY2tTb3VyY2UgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVUeXBlID0gJ25vZGUnIHwgJ2Rlbm8nIHwgJ2J1bicgfCAndW5rbm93bic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZSB7XG4gICAgbmFtZTogUnVudGltZVR5cGU7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jbGFzcyBVdGlsIHtcbiAgICAvKipcbiAgICAgKiBVdGlsc1xuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcnVudGltZSBpbmZvcm1hdGlvblxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRSdW50aW1lKCk6IFJ1bnRpbWUge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogbnVsbDtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0eXBlb2YgRGVubyAhPT0gJ3VuZGVmaW5lZCcgJiYgRGVuby52ZXJzaW9uKSByZXR1cm4geyBuYW1lOiAnZGVubycsIHZlcnNpb246IERlbm8udmVyc2lvbi5kZW5vIH07XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodHlwZW9mIEJ1biAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVuLnZlcnNpb24pIHJldHVybiB7IG5hbWU6ICdidW4nLCB2ZXJzaW9uOiBCdW4udmVyc2lvbiB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy52ZXJzaW9uKSByZXR1cm4geyBuYW1lOiAnbm9kZScsIHZlcnNpb246IHByb2Nlc3MudmVyc2lvbiB9O1xuXG4gICAgICAgIHJldHVybiB7IG5hbWU6ICd1bmtub3duJywgdmVyc2lvbjogdmVyc2lvbiA/PyAndW5rbm93bicgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGR1cmF0aW9uIHN0cmluZ1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkdXJPYmogVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGR1cmF0aW9uU3RyaW5nKGR1ck9iajogUmVjb3JkPHN0cmluZywgbnVtYmVyPikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkdXJPYmopXG4gICAgICAgICAgICAubWFwKChtKSA9PiAoaXNOYU4obSkgPyAwIDogbSkpXG4gICAgICAgICAgICAuam9pbignOicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBtaWxsaXNlY29uZHMgdG8gY29uc3VtYWJsZSB0aW1lIG9iamVjdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXNlY29uZHMgVGhlIHRpbWUgaW4gbXNcbiAgICAgKiBAcmV0dXJucyB7VGltZURhdGF9XG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlTVMobWlsbGlzZWNvbmRzOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGlzTmFOKG1pbGxpc2Vjb25kcykpIG1pbGxpc2Vjb25kcyA9IDA7XG4gICAgICAgIGNvbnN0IHJvdW5kID0gbWlsbGlzZWNvbmRzID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRheXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDg2NDAwMDAwKSxcbiAgICAgICAgICAgIGhvdXJzOiByb3VuZChtaWxsaXNlY29uZHMgLyAzNjAwMDAwKSAlIDI0LFxuICAgICAgICAgICAgbWludXRlczogcm91bmQobWlsbGlzZWNvbmRzIC8gNjAwMDApICUgNjAsXG4gICAgICAgICAgICBzZWNvbmRzOiByb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwKSAlIDYwLFxuICAgICAgICB9IGFzIFRpbWVEYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICAgKiBAcGFyYW0ge1RpbWVEYXRhfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBzdGF0aWMgYnVpbGRUaW1lQ29kZShkdXJhdGlvbjogVGltZURhdGEpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gWydkYXlzJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGl0ZW1zLmZpbHRlcigoeCkgPT4gcmVxdWlyZWQuaW5jbHVkZXMoeCkpLm1hcCgobSkgPT4gZHVyYXRpb25bbSBhcyBrZXlvZiBUaW1lRGF0YV0pO1xuICAgICAgICBjb25zdCBmaW5hbCA9IHBhcnNlZFxuICAgICAgICAgICAgLnNsaWNlKHBhcnNlZC5maW5kSW5kZXgoKHgpID0+IHggIT09IDApKVxuICAgICAgICAgICAgLm1hcCgoeCkgPT4geC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykpXG4gICAgICAgICAgICAuam9pbignOicpO1xuXG4gICAgICAgIHJldHVybiBmaW5hbC5sZW5ndGggPD0gMyA/IGAwOiR7ZmluYWwucGFkU3RhcnQoMiwgJzAnKSB8fCAwfWAgOiBmaW5hbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIGR1cmF0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBtc1xuICAgICAqL1xuICAgIHN0YXRpYyBmb3JtYXREdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVGltZUNvZGUodGhpcy5wYXJzZU1TKGR1cmF0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGlja3MgbGFzdCBpdGVtIG9mIHRoZSBnaXZlbiBhcnJheVxuICAgICAqIEBwYXJhbSB7YW55W119IGFyciBUaGUgYXJyYXlcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgc3RhdGljIGxhc3Q8VCA9IGFueT4oYXJyOiBUW10pOiBUIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG4gICAgICAgIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHN0YXRpYyBpc1ZvaWNlRW1wdHkoY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsKSB7XG4gICAgICAgIHJldHVybiBjaGFubmVsICYmIGNoYW5uZWwubWVtYmVycy5maWx0ZXIoKG1lbWJlcikgPT4gIW1lbWJlci51c2VyLmJvdCkuc2l6ZSA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhbnMgdGhlIHRyYWNrIHRpdGxlXG4gICAgICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZVxuICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZVxuICAgICAqIEByZXR1cm5zIENsZWFuZWQgdGl0bGVcbiAgICAgKi9cbiAgICBzdGF0aWMgY2xlYW5UaXRsZSh0aXRsZTogc3RyaW5nLCBzb3VyY2U6IFRyYWNrU291cmNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJPcHRzID0ge1xuICAgICAgICAgICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRyYWNrOiBbXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlbWFzdGVyZWQsXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpdmUsXG4gICAgICAgICAgICAgICAgICAgIGZpeFRyYWNrU3VmZml4LFxuICAgICAgICAgICAgICAgICAgICByZW1vdmVaZXJvV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VOYnNwLFxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlU21hcnRRdW90ZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsZWFuRXhwbGljaXRcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHNwb3RpZnlGaWx0ZXIgPSBjcmVhdGVGaWx0ZXIoZmlsdGVyT3B0cyk7XG4gICAgICAgICAgICBzcG90aWZ5RmlsdGVyLmV4dGVuZChjcmVhdGVTcG90aWZ5RmlsdGVyKCkpO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcblxuICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd5b3V0dWJlJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlvdXR1YmUodGl0bGUpO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3Nwb3RpZnknOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3BvdGlmeUZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRGaWx0ZXIuZmlsdGVyRmllbGQoJ3RyYWNrJywgdGl0bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiB0aXRsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhZmVyIHJlcXVpcmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgTm9kZSByZXF1aXJlIGlkXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVxdWlyZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoaWQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBtb2QsIGVycm9yOiBudWxsIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGluIG1zIHRvIHdhaXRcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgKi9cbiAgICBzdGF0aWMgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG5vb3AoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gICAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgICAgICBpZiAoJ2ZldGNoJyBpbiBnbG9iYWxUaGlzKSByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgWydub2RlLWZldGNoJywgJ3VuZGljaSddKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBpbXBvcnQobGliKS50aGVuKChyZXMpID0+IHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlcXVpcmUobGliKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vP1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhtZXNzYWdlLCB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgZGV0YWlsLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmFuZG9tQ2hvaWNlPFQ+KHNyYzogVFtdKTogVCB7XG4gICAgICAgIHJldHVybiBzcmNbcmFuZG9tSW50KHNyYy5sZW5ndGgpXTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXJyYXlDbG9uZVNodWZmbGU8VD4oc3JjOiBUW10pOiBUW10ge1xuICAgICAgICBjb25zdCBhcnIgPSBzcmMuc2xpY2UoKTtcblxuICAgICAgICBsZXQgbSA9IGFyci5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKG0pIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtLS0pO1xuICAgICAgICAgICAgW2FyclttXSwgYXJyW2ldXSA9IFthcnJbaV0sIGFyclttXV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZBTElEQVRFX1FVRVVFX0NBUCA9IChxdWV1ZTogR3VpbGRRdWV1ZSwgaXRlbXM6IFBsYXlsaXN0IHwgVHJhY2sgfCBUcmFja1tdKSA9PiB7XG4gICAgY29uc3QgdHJhY2tzID0gaXRlbXMgaW5zdGFuY2VvZiBQbGF5bGlzdCA/IGl0ZW1zLnRyYWNrcyA6IEFycmF5LmlzQXJyYXkoaXRlbXMpID8gaXRlbXMgOiBbaXRlbXNdO1xuXG4gICAgaWYgKHF1ZXVlLm1heFNpemUgPCAxIHx8IHF1ZXVlLm1heFNpemUgPT09IEluZmluaXR5KSByZXR1cm47XG5cbiAgICBjb25zdCBtYXhDYXAgPSBxdWV1ZS5nZXRDYXBhY2l0eSgpO1xuXG4gICAgaWYgKG1heENhcCA8IHRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfT1VUX09GX1NQQUNFKCd0cmFja3MgcXVldWUnLCBtYXhDYXAsIHRyYWNrcy5sZW5ndGgpO1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IFV0aWwgfTtcbiIsICJpbXBvcnQgeyBVc2VyLCBlc2NhcGVNYXJrZG93biwgU25vd2ZsYWtlVXRpbCwgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBBUElVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBSYXdUcmFja0RhdGEsIFNlYXJjaFF1ZXJ5VHlwZSwgVHJhY2tKU09OIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZS9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IFNlcmlhbGl6ZWRUeXBlLCB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc2VyZGUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmV4cG9ydCB0eXBlIFRyYWNrUmVzb2x2YWJsZSA9IFRyYWNrIHwgc3RyaW5nIHwgbnVtYmVyO1xuXG5leHBvcnQgdHlwZSBXaXRoTWV0YWRhdGE8VCBleHRlbmRzIG9iamVjdCwgTT4gPSBUICYge1xuICAgIG1ldGFkYXRhOiBNO1xuICAgIHJlcXVlc3RNZXRhZGF0YSgpOiBQcm9taXNlPE0+O1xufTtcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFRyYWNrID0gUmV0dXJuVHlwZTxUcmFja1snc2VyaWFsaXplJ10+O1xuXG5leHBvcnQgY2xhc3MgVHJhY2s8VCA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBwdWJsaWMgYXV0aG9yOiBzdHJpbmc7XG4gICAgcHVibGljIHVybDogc3RyaW5nO1xuICAgIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgICBwdWJsaWMgZHVyYXRpb246IHN0cmluZztcbiAgICBwdWJsaWMgdmlld3M6IG51bWJlcjtcbiAgICBwdWJsaWMgcmVxdWVzdGVkQnk6IFVzZXIgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgcGxheWxpc3Q/OiBQbGF5bGlzdDtcbiAgICBwdWJsaWMgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHB1YmxpYyByYXc6IGFueTtcbiAgICBwdWJsaWMgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gICAgcHJpdmF0ZSBfX21ldGFkYXRhOiBUIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfX3JlcU1ldGFkYXRhRm46ICgpID0+IFByb21pc2U8VCB8IG51bGw+O1xuICAgIHB1YmxpYyBjbGVhblRpdGxlOiBzdHJpbmc7XG4gICAgcHVibGljIGxpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgYnJpZGdlZEV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBicmlkZ2VkVHJhY2s6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIFRyYWNrXG4gICAgICogQHBhcmFtIGRhdGEgVHJhY2sgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcGxheWVyOiBQbGF5ZXIsIGRhdGE6IFBhcnRpYWw8V2l0aE1ldGFkYXRhPFJhd1RyYWNrRGF0YSwgVD4+KSB7XG4gICAgICAgIHRoaXMudGl0bGUgPSBlc2NhcGVNYXJrZG93bihkYXRhLnRpdGxlID8/ICcnKTtcbiAgICAgICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvciA/PyAnJztcbiAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybCA/PyAnJztcbiAgICAgICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbCA/PyAnJztcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGRhdGEuZHVyYXRpb24gPz8gJyc7XG4gICAgICAgIHRoaXMudmlld3MgPSBkYXRhLnZpZXdzID8/IDA7XG4gICAgICAgIHRoaXMucXVlcnlUeXBlID0gZGF0YS5xdWVyeVR5cGU7XG4gICAgICAgIHRoaXMucmVxdWVzdGVkQnkgPSBkYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgICAgIHRoaXMucGxheWxpc3QgPSBkYXRhLnBsYXlsaXN0O1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgICAgICB0aGlzLnJhdyA9IE9iamVjdC5hc3NpZ24oe30sIHsgc291cmNlOiBkYXRhLnJhdz8uc291cmNlID8/IGRhdGEuc291cmNlIH0sIGRhdGEucmF3ID8/IGRhdGEpO1xuICAgICAgICB0aGlzLl9fbWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhID8/IG51bGw7XG4gICAgICAgIHRoaXMuX19yZXFNZXRhZGF0YUZuID0gZGF0YS5yZXF1ZXN0TWV0YWRhdGEgfHwgKCgpID0+IFByb21pc2UucmVzb2x2ZTxUIHwgbnVsbD4obnVsbCkpO1xuICAgICAgICB0aGlzLmNsZWFuVGl0bGUgPSBkYXRhLmNsZWFuVGl0bGUgPz8gVXRpbC5jbGVhblRpdGxlKHRoaXMudGl0bGUsIHRoaXMuc291cmNlKTtcbiAgICAgICAgdGhpcy5saXZlID0gZGF0YS5saXZlID8/IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgbWV0YWRhdGEgZm9yIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdE1ldGFkYXRhKCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9fcmVxTWV0YWRhdGFGbigpO1xuXG4gICAgICAgIHRoaXMuc2V0TWV0YWRhdGEocmVzKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBUIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9fbWV0YWRhdGEgPSBtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ldGFkYXRhIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX21ldGFkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgdHJhY2sgaGFzIG1ldGFkYXRhXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNNZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGEgIT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcXVldWUgaW4gd2hpY2ggdGhpcyB0cmFjayBpcyBsb2NhdGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWV1ZSgpOiBHdWlsZFF1ZXVlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbmQoKHEpID0+IHEudHJhY2tzLnNvbWUoKGFiKSA9PiBhYi5pZCA9PT0gdGhpcy5pZCkpITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGR1cmF0aW9uTVMoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdGltZXMgPSAobjogbnVtYmVyLCB0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGxldCB0biA9IDE7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQ7IGkrKykgdG4gKj0gbjtcbiAgICAgICAgICAgIHJldHVybiB0IDw9IDAgPyAxMDAwIDogdG4gKiAxMDAwO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uXG4gICAgICAgICAgICAuc3BsaXQoJzonKVxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLm1hcCgobSwgaSkgPT4gcGFyc2VJbnQobSkgKiB0aW1lcyg2MCwgaSkpXG4gICAgICAgICAgICAucmVkdWNlKChhLCBjKSA9PiBhICsgYywgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzY29yZCBoeXBlcmxpbmsgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyB0b0h5cGVybGluaygpOiBzdHJpbmcgLyogbm90IHVzaW5nIGBbJHtzdHJpbmd9XSgke3N0cmluZ30pYCB5ZXQgKi8ge1xuICAgICAgICByZXR1cm4gYFske3RoaXMudGl0bGV9XSgke3RoaXMudXJsfSlgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgc291cmNlIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3Py5zb3VyY2UgPz8gJ2FyYml0cmFyeSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSYXcgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTihoaWRlUGxheWxpc3Q/OiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHRodW1ibmFpbDogdGhpcy50aHVtYm5haWwsXG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgICAgICAgIGR1cmF0aW9uTVM6IHRoaXMuZHVyYXRpb25NUyxcbiAgICAgICAgICAgIHZpZXdzOiB0aGlzLnZpZXdzLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LmlkIHx8IG51bGwsXG4gICAgICAgICAgICBwbGF5bGlzdDogaGlkZVBsYXlsaXN0ID8gbnVsbCA6IHRoaXMucGxheWxpc3Q/LnRvSlNPTigpID8/IG51bGwsXG4gICAgICAgIH0gYXMgVHJhY2tKU09OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZWQgdHJhY2sgZGF0YSB0aGF0IGNhbiBiZSByZWNvbnN0cnVjdGVkXG4gICAgICovXG4gICAgcHVibGljIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID8gdGhpcy50aHVtYm5haWwgOiB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgICAgdmlld3M6IHRoaXMudmlld3MgPz8gMCxcbiAgICAgICAgICAgIHJlcXVlc3RlZF9ieTogdGhpcy5yZXF1ZXN0ZWRCeT8udG9KU09OKCkgPz8gbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBsaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIHF1ZXJ5X3R5cGU6IHRoaXMucXVlcnlUeXBlLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciA/PyBudWxsLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICAgICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuVHJhY2ssXG4gICAgICAgICAgICAkZW5jb2Rlcl92ZXJzaW9uOiAnNy4wLjAtZGV2LjMnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIHRyYWNrIGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAgICogQHBhcmFtIHBsYXllciBQbGF5ZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21TZXJpYWxpemVkKHBsYXllcjogUGxheWVyLCBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pIHtcbiAgICAgICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlRyYWNrKVxuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnZGF0YScsICdTZXJpYWxpemVkVHJhY2snLCAnbWFsZm9ybWVkIGRhdGEnKTtcbiAgICAgICAgY29uc3QgdHJhY2sgPSBuZXcgVHJhY2socGxheWVyLCB7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGRhdGEucmVxdWVzdGVkX2J5XG4gICAgICAgICAgICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGRhdGEucmVxdWVzdGVkX2J5IGFzIEFQSVVzZXI7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBwbGF5ZXIuY2xpZW50LnVzZXJzLnJlc29sdmUocmVzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuY2xpZW50LnVzZXJzLmNhY2hlLmhhcyhyZXMuaWQpKSByZXR1cm4gcGxheWVyLmNsaWVudC51c2Vycy5jYWNoZS5nZXQocmVzLmlkKSE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlciA9IG5ldyBVc2VyKHBsYXllci5jbGllbnQsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgcXVlcnlUeXBlOiBkYXRhLnF1ZXJ5X3R5cGUgPz8gdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgICB0cmFjay5zZXRNZXRhZGF0YShkYXRhLm1ldGFkYXRhKTtcblxuICAgICAgICByZXR1cm4gdHJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJlbG9uZ2luZyBxdWV1ZXMgb2YgdGhpcyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCZWxvbmdpbmdRdWV1ZXMoKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmlsdGVyKChub2RlKSA9PiBub2RlLnRyYWNrcy5zb21lKCh0KSA9PiB0LmlkID09PSB0aGlzLmlkKSk7XG5cbiAgICAgICAgcmV0dXJuIG5vZGVzIGFzIENvbGxlY3Rpb248c3RyaW5nLCBHdWlsZFF1ZXVlPHVua25vd24+PjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoaXMgdHJhY2sgdG8gdGhlIGdpdmVuIHZvaWNlIGNoYW5uZWwuIElmIHF1ZXVlIGV4aXN0cyBhbmQgYW5vdGhlciB0cmFjayBpcyBiZWluZyBwbGF5ZWQsIHRoaXMgdHJhY2sgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUuXG4gICAgICogQHBhcmFtIGNoYW5uZWwgVm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGlzIHRyYWNrIHNoYWxsIGJlIHBsYXllZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIE5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgICAgICAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICAgICAgICBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPixcbiAgICApOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgVHlwZVV0aWwge1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHJldHVybiBUeXBlVXRpbDtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIHB1YmxpYyBzdGF0aWMgaXNGdW5jdGlvbih0OiB1bmtub3duKTogdCBpcyBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHQ6IHVua25vd24pOiB0IGlzIG51bWJlciB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnc3RyaW5nJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzQm9vbGVhbih0OiB1bmtub3duKTogdCBpcyBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc051bGxpc2godDogdW5rbm93bik6IHQgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0ID09IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNFcnJvcih0OiB1bmtub3duKTogdCBpcyBFcnJvciB7XG4gICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gICAgfVxufVxuIiwgImNvbnN0IERpc2NvcmRQbGF5ZXJFcnJvcnMgPSB7XG4gICAgRVJSX09VVF9PRl9TUEFDRToge1xuICAgICAgICBuYW1lOiAnRVJSX09VVF9PRl9TUEFDRScsXG4gICAgICAgIHR5cGU6IFJhbmdlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBjYXBhY2l0eTogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIE1heCBjYXBhY2l0eSByZWFjaGVkIGZvciAke3RhcmdldH0gKENhcGFjaXR5ICR7Y2FwYWNpdHl9L1RvdGFsICR7dG90YWx9KWA7XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBFUlJfSU5WQUxJRF9BUkdfVFlQRToge1xuICAgICAgICBuYW1lOiAnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICAgICAgICB0eXBlOiBUeXBlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBleHBlY3RhdGlvbjogc3RyaW5nLCBmb3VuZDogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIEV4cGVjdGVkICR7dGFyZ2V0fSB0byBiZSBcIiR7ZXhwZWN0YXRpb259XCIsIHJlY2VpdmVkIFwiJHtmb3VuZH1cImA7XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBFUlJfTk9fUkVTVUxUOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fUkVTVUxUJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSAke21lc3NhZ2V9YDtcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIEVSUl9OT1RfSU1QTEVNRU5URUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT1RfSU1QTEVNRU5URUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gJHt0YXJnZXR9IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRgO1xuICAgICAgICB9LFxuICAgIH0sXG4gICAgRVJSX05PVF9FWElTVElORzoge1xuICAgICAgICBuYW1lOiAnRVJSX05PVF9FWElTVElORycsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSAke3RhcmdldH0gZG9lcyBub3QgZXhpc3RgO1xuICAgICAgICB9LFxuICAgIH0sXG4gICAgRVJSX09VVF9PRl9SQU5HRToge1xuICAgICAgICBuYW1lOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gICAgICAgIHR5cGU6IFJhbmdlRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtaW5pbXVtOiBzdHJpbmcsIG1heGltdW06IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWF4aW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWA7XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTjoge1xuICAgICAgICBuYW1lOiAnRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04nLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IobWVzc2FnZT86IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArXG4gICAgICAgICAgICAgICAgKG1lc3NhZ2UgfHwgJ05vIHZvaWNlIGNvbm5lY3Rpb24gYXZhaWxhYmxlLCBtYXliZSBjb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbCBmaXJzdD8nKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIEVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBgICsgJ0Nhbm5vdCB1c2UgZGVzdHJveWVkIHZvaWNlIGNvbm5lY3Rpb24nO1xuICAgICAgICB9LFxuICAgIH0sXG4gICAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKCkge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBgICsgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnO1xuICAgICAgICB9LFxuICAgIH0sXG4gICAgRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTDoge1xuICAgICAgICBuYW1lOiAnRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcigpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArICdFeHBlY3RlZCBhIHZvaWNlIGNoYW5uZWwnO1xuICAgICAgICB9LFxuICAgIH0sXG4gICAgRVJSX05PX1JFQ0VJVkVSOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9fUkVDRUlWRVInLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IobWVzc2FnZT86IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArXG4gICAgICAgICAgICAgICAgKG1lc3NhZ2UgfHwgJ05vIHZvaWNlIHJlY2VpdmVyIGlzIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/JylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBFUlJfRkZNUEVHX0xPQ0FUT1I6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9GRk1QRUdfTE9DQVRPUicsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArIG1lc3NhZ2U7XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBFUlJfTk9fQVVESU9fUkVTT1VSQ0U6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19BVURJT19SRVNPVVJDRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYW4gYXVkaW8gcmVzb3VyY2UnKTtcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIEVSUl9OT19HVUlMRF9RVUVVRToge1xuICAgICAgICBuYW1lOiAnRVJSX05PX0dVSUxEX1FVRVVFJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gYCArIChtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkIHF1ZXVlJyk7XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBFUlJfTk9fR1VJTEQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9OT19HVUlMRCcsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMuY29uc3RydWN0b3IubmFtZX1dIGAgKyAobWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCcpO1xuICAgICAgICB9LFxuICAgIH0sXG4gICAgRVJSX0lORk9fUkVRVUlSRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9JTkZPX1JFUVVJUkVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBhY3R1YWw6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBFeHBlY3RlZCAke3RhcmdldH0sIGZvdW5kIFwiJHthY3R1YWx9XCJgO1xuICAgICAgICB9LFxuICAgIH0sXG4gICAgRVJSX1NFUklBTElaQVRJT05fRkFJTEVEOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfU0VSSUFMSVpBVElPTl9GQUlMRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IoKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMudHlwZS5uYW1lfV1gICsgXCJEb24ndCBrbm93IGhvdyB0byBzZXJpYWxpemUgdGhpcyBkYXRhXCI7XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBFUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRDoge1xuICAgICAgICBuYW1lOiAnRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQnLFxuICAgICAgICB0eXBlOiBFcnJvcixcbiAgICAgICAgY3JlYXRlRXJyb3IoKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMudHlwZS5uYW1lfV1gICsgXCJEb24ndCBrbm93IGhvdyB0byBkZXNlcmlhbGl6ZSB0aGlzIGRhdGFcIjtcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIEVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTjoge1xuICAgICAgICBuYW1lOiAnRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKHRhcmdldDogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFske3RoaXMudHlwZS5uYW1lfV1gICsgYElsbGVnYWwgaW52b2NhdGlvbiBvZiAke3RhcmdldH0gaG9vay4ke21lc3NhZ2UgPyBgICR7bWVzc2FnZX1gIDogJyd9YDtcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIEVSUl9OT1RfRVhJU1RJTkdfTU9EVUxFOiB7XG4gICAgICAgIG5hbWU6ICdFUlJfTk9UX0VYSVNUSU5HX01PRFVMRScsXG4gICAgICAgIHR5cGU6IEVycm9yLFxuICAgICAgICBjcmVhdGVFcnJvcih0YXJnZXQ6IHN0cmluZywgZGVzY3JpcHRpb24gPSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBgWyR7dGhpcy50eXBlLm5hbWV9XWAgK1xuICAgICAgICAgICAgICAgIGAke3RhcmdldH0gbW9kdWxlIGRvZXMgbm90IGV4aXN0LiBJbnN0YWxsIGl0IHdpdGggXFxgbnBtIGluc3RhbGwgJHt0YXJnZXR9XFxgLiR7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID8gJyAnICsgZGVzY3JpcHRpb24gOiAnJ1xuICAgICAgICAgICAgICAgIH1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgIH0sXG4gICAgRVJSX0JSSURHRV9GQUlMRUQ6IHtcbiAgICAgICAgbmFtZTogJ0VSUl9CUklER0VfRkFJTEVEJyxcbiAgICAgICAgdHlwZTogRXJyb3IsXG4gICAgICAgIGNyZWF0ZUVycm9yKGlkOiBzdHJpbmcgfCBudWxsLCBlcnJvcjogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIGBbJHt0aGlzLnR5cGUubmFtZX1dYCArXG4gICAgICAgICAgICAgICAgYCR7aWQgPyBgKEV4dHJhY3RvciBFeGVjdXRpb24gQ29udGV4dCBJRCBpcyAke2lkfSlgIDogJyd9RmFpbGVkIHRvIGJyaWRnZSB0aGlzIHF1ZXJ5OlxcbiR7ZXJyb3J9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBGaW5hbEV4Y2VwdGlvbjxPIGV4dGVuZHMgKHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzKVtrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9yc10+ID0ge1xuICAgIG5hbWU6IE9bJ25hbWUnXTtcbn0gJiBJbnN0YW5jZVR5cGU8T1sndHlwZSddPjtcblxudHlwZSBEaXNjb3JkUGxheWVyRXhjZXB0aW9uID0ge1xuICAgIFtLIGluIGtleW9mIHR5cGVvZiBEaXNjb3JkUGxheWVyRXJyb3JzXTogKFxuICAgICAgICAuLi5hcmdzOiBQYXJhbWV0ZXJzPCh0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycylbS11bJ2NyZWF0ZUVycm9yJ10+XG4gICAgKSA9PiBGaW5hbEV4Y2VwdGlvbjwodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW0tdPjtcbn07XG5cbmNvbnN0IHRhcmdldCA9IHt9IGFzIERpc2NvcmRQbGF5ZXJFeGNlcHRpb247XG5cbmNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjx0eXBlb2YgdGFyZ2V0PiA9IHtcbiAgICBnZXQodGFyZ2V0LCBwOiBrZXlvZiB0eXBlb2YgRGlzY29yZFBsYXllckVycm9ycywgcmVjZWl2ZXIpIHtcbiAgICAgICAgY29uc3QgZXJyID0gRGlzY29yZFBsYXllckVycm9yc1twXTtcblxuICAgICAgICBpZiAoIWVycikgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuXG4gICAgICAgIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIGVycilbJ2NyZWF0ZUVycm9yJ10+KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgZXJyLnR5cGUoZXJyLmNyZWF0ZUVycm9yKC4uLmFyZ3MpKTtcbiAgICAgICAgICAgIGV4Y2VwdGlvbi5uYW1lID0gZXJyLm5hbWU7XG5cbiAgICAgICAgICAgIHJldHVybiBleGNlcHRpb247XG4gICAgICAgIH07XG4gICAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBFcnJvckNvZGVzID0gKCgpID0+IHtcbiAgICB0eXBlIEVyckNvZGVzID0ge1xuICAgICAgICAtcmVhZG9ubHkgW0sgaW4ga2V5b2YgdHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnNdOiAodHlwZW9mIERpc2NvcmRQbGF5ZXJFcnJvcnMpW0tdWyduYW1lJ107XG4gICAgfTtcblxuICAgIGNvbnN0IGRpY3QgPSB7fSBhcyBFcnJDb2RlcztcblxuICAgIGZvciAoY29uc3QgcHJvcCBpbiBEaXNjb3JkUGxheWVyRXJyb3JzKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgZGljdFtwcm9wXSA9IHByb3A7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoZGljdCk7XG59KSgpO1xuZXhwb3J0IGNvbnN0IEV4Y2VwdGlvbnMgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgUGxheWxpc3QsIHR5cGUgU2VyaWFsaXplZFRyYWNrLCBUcmFjaywgU2VyaWFsaXplZFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi9UeXBlVXRpbCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcblxuZXhwb3J0IGVudW0gU2VyaWFsaXplZFR5cGUge1xuICAgIFRyYWNrID0gJ3RyYWNrJyxcbiAgICBQbGF5bGlzdCA9ICdwbGF5bGlzdCcsXG59XG5cbmV4cG9ydCB0eXBlIEVuY29kYWJsZSA9IFNlcmlhbGl6ZWRUcmFjayB8IFNlcmlhbGl6ZWRQbGF5bGlzdDtcblxuY29uc3QgaXNUcmFjayA9IChkYXRhOiBhbnkpOiBkYXRhIGlzIFNlcmlhbGl6ZWRUcmFjayA9PiBkYXRhLiR0eXBlID09PSBTZXJpYWxpemVkVHlwZS5UcmFjaztcbmNvbnN0IGlzUGxheWxpc3QgPSAoZGF0YTogYW55KTogZGF0YSBpcyBTZXJpYWxpemVkUGxheWxpc3QgPT4gZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuUGxheWxpc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoZGF0YTogVHJhY2sgfCBQbGF5bGlzdCB8IGFueSkge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVHJhY2spIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgUGxheWxpc3QpIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRhdGEudG9KU09OKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX1NFUklBTElaQVRJT05fRkFJTEVEKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUocGxheWVyOiBQbGF5ZXIsIGRhdGE6IEVuY29kYWJsZSkge1xuICAgIGlmIChpc1RyYWNrKGRhdGEpKSByZXR1cm4gVHJhY2suZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBkYXRhKTtcbiAgICBpZiAoaXNQbGF5bGlzdChkYXRhKSkgcmV0dXJuIFBsYXlsaXN0LmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG5cbiAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGUoZGF0YTogRW5jb2RhYmxlKSB7XG4gICAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgICByZXR1cm4gQnVmZmVyLmZyb20oc3RyKS50b1N0cmluZygnYmFzZTY0Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGUoZGF0YTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3RyID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5SW50b1RodW1ibmFpbFN0cmluZyhkYXRhOiBhbnkpIHtcbiAgICBpZiAoIWRhdGEpIHJldHVybiBudWxsO1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChUeXBlVXRpbC5pc1N0cmluZyhkYXRhKSkgcmV0dXJuIGRhdGE7XG4gICAgICAgIHJldHVybiBkYXRhPy51cmwgPz8gZGF0YT8udGh1bWJuYWlsPy51cmwgPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBQbGF5bGlzdEluaXREYXRhLCBQbGF5bGlzdEpTT04sIFRyYWNrSlNPTiwgVHJhY2tTb3VyY2UgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6ZWRUeXBlLCB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc2VyZGUnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFBsYXlsaXN0ID0gUmV0dXJuVHlwZTxQbGF5bGlzdFsnc2VyaWFsaXplJ10+O1xuXG5leHBvcnQgY2xhc3MgUGxheWxpc3Qge1xuICAgIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcbiAgICBwdWJsaWMgdHJhY2tzOiBUcmFja1tdO1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgICBwdWJsaWMgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gICAgcHVibGljIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gICAgcHVibGljIGF1dGhvcjoge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHVybDogc3RyaW5nO1xuICAgIH07XG4gICAgcHVibGljIGlkOiBzdHJpbmc7XG4gICAgcHVibGljIHVybDogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbiAgICAvKipcbiAgICAgKiBQbGF5bGlzdCBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllclxuICAgICAqIEBwYXJhbSB7UGxheWxpc3RJbml0RGF0YX0gZGF0YSBUaGUgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWVyXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3BsYXllclxuICAgICAgICAgKiBAdHlwZSB7UGxheWVyfVxuICAgICAgICAgKiBAcmVhZG9ubHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGxheWVyID0gcGxheWVyO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdHJhY2tzIGluIHRoaXMgcGxheWxpc3RcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdHJhY2tzXG4gICAgICAgICAqIEB0eXBlIHtUcmFja1tdfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50cmFja3MgPSBkYXRhLnRyYWNrcyA/PyBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1dGhvciBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I2F1dGhvclxuICAgICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I2Rlc2NyaXB0aW9uXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRodW1ibmFpbCBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3RodW1ibmFpbFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IHR5cGU6XG4gICAgICAgICAqIC0gYGFsYnVtYFxuICAgICAgICAgKiAtIGBwbGF5bGlzdGBcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjdHlwZVxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc291cmNlIG9mIHRoaXMgcGxheWxpc3Q6XG4gICAgICAgICAqIC0gYHlvdXR1YmVgXG4gICAgICAgICAqIC0gYHNvdW5kY2xvdWRgXG4gICAgICAgICAqIC0gYHNwb3RpZnlgXG4gICAgICAgICAqIC0gYGFyYml0cmFyeWBcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3Qjc291cmNlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNvdXJjZSA9IGRhdGEuc291cmNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjaWRcbiAgICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICAgICAqIEBuYW1lIFBsYXlsaXN0I3VybFxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQG5hbWUgUGxheWxpc3QjcmF3UGxheWxpc3RcbiAgICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICAqL1xuICAgIH1cblxuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgeWllbGQqIHRoaXMudHJhY2tzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnJlZHVjZSgocCwgYykgPT4gcCArIGMuZHVyYXRpb25NUywgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0dGVkIGVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICovXG4gICAgcHVibGljIGdldCBkdXJhdGlvbkZvcm1hdHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dpdGhUcmFja3M9dHJ1ZV0gSWYgaXQgc2hvdWxkIGJ1aWxkIGpzb24gd2l0aCB0cmFja3NcbiAgICAgKiBAcmV0dXJucyB7UGxheWxpc3RKU09OfVxuICAgICAqL1xuICAgIHRvSlNPTih3aXRoVHJhY2tzID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHRodW1ibmFpbDogdGhpcy50aHVtYm5haWwsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgICAgICAgIHRyYWNrczogW10gYXMgVHJhY2tKU09OW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHdpdGhUcmFja3MpIHBheWxvYWQudHJhY2tzID0gdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSk7XG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGludG8gcmVjb25zdHJ1Y3RhYmxlIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHJhY2tzOiB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0uc2VyaWFsaXplKCkpLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID8gdGhpcy50aHVtYm5haWwgOiB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0LFxuICAgICAgICAgICAgJGVuY29kZXJfdmVyc2lvbjogJzcuMC4wLWRldi4zJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAgICogQHBhcmFtIHBsYXllciBQbGF5ZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21TZXJpYWxpemVkKHBsYXllcjogUGxheWVyLCBkYXRhOiBTZXJpYWxpemVkUGxheWxpc3QpIHtcbiAgICAgICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0KVxuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnZGF0YScsICdTZXJpYWxpemVkUGxheWxpc3QnLCAnbWFsZm9ybWVkIGRhdGEnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGF5bGlzdChwbGF5ZXIsIHtcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICB0cmFja3M6IGRhdGEudHJhY2tzLm1hcCgobSkgPT4gVHJhY2suZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBtKSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhpcyBwbGF5bGlzdCB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyBwbGF5bGlzdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgcGxheWxpc3Qgc2hhbGwgYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICAgICAgICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gICAgICAgIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+LFxuICAgICk6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgVXNlciwgVXNlclJlc29sdmFibGUsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB0eXBlIHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHR5cGUgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgdHlwZSB7IFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5Q2FjaGUnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgdHlwZSB7IEJyaWRnZVByb3ZpZGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2V4dHJhY3Rvcic7XG5cbmV4cG9ydCB0eXBlIEZpbHRlcnNOYW1lID0ga2V5b2YgUXVldWVGaWx0ZXJzO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclNlYXJjaFJlc3VsdCB7XG4gICAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M6IFRyYWNrW107XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBGRm1wZWcgZmlsdGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXVlRmlsdGVycyB7XG4gICAgYmFzc2Jvb3N0X2xvdz86IGJvb2xlYW47XG4gICAgYmFzc2Jvb3N0PzogYm9vbGVhbjtcbiAgICBiYXNzYm9vc3RfaGlnaD86IGJvb2xlYW47XG4gICAgJzhEJz86IGJvb2xlYW47XG4gICAgdmFwb3J3YXZlPzogYm9vbGVhbjtcbiAgICBuaWdodGNvcmU/OiBib29sZWFuO1xuICAgIHBoYXNlcj86IGJvb2xlYW47XG4gICAgdHJlbW9sbz86IGJvb2xlYW47XG4gICAgdmlicmF0bz86IGJvb2xlYW47XG4gICAgcmV2ZXJzZT86IGJvb2xlYW47XG4gICAgdHJlYmxlPzogYm9vbGVhbjtcbiAgICBub3JtYWxpemVyPzogYm9vbGVhbjtcbiAgICBub3JtYWxpemVyMj86IGJvb2xlYW47XG4gICAgc3Vycm91bmRpbmc/OiBib29sZWFuO1xuICAgIHB1bHNhdG9yPzogYm9vbGVhbjtcbiAgICBzdWJib29zdD86IGJvb2xlYW47XG4gICAga2FyYW9rZT86IGJvb2xlYW47XG4gICAgZmxhbmdlcj86IGJvb2xlYW47XG4gICAgZ2F0ZT86IGJvb2xlYW47XG4gICAgaGFhcz86IGJvb2xlYW47XG4gICAgbWNvbXBhbmQ/OiBib29sZWFuO1xuICAgIG1vbm8/OiBib29sZWFuO1xuICAgIG1zdGxyPzogYm9vbGVhbjtcbiAgICBtc3Rycj86IGJvb2xlYW47XG4gICAgY29tcHJlc3Nvcj86IGJvb2xlYW47XG4gICAgZXhwYW5kZXI/OiBib29sZWFuO1xuICAgIHNvZnRsaW1pdGVyPzogYm9vbGVhbjtcbiAgICBjaG9ydXM/OiBib29sZWFuO1xuICAgIGNob3J1czJkPzogYm9vbGVhbjtcbiAgICBjaG9ydXMzZD86IGJvb2xlYW47XG4gICAgZmFkZWluPzogYm9vbGVhbjtcbiAgICBkaW0/OiBib29sZWFuO1xuICAgIGVhcnJhcGU/OiBib29sZWFuO1xuICAgIGxvZmk/OiBib29sZWFuO1xuICAgIHNpbGVuY2VyZW1vdmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSB0cmFjayBzb3VyY2U6XG4gKiAtIHNvdW5kY2xvdWRcbiAqIC0geW91dHViZVxuICogLSBzcG90aWZ5XG4gKiAtIGFwcGxlX211c2ljXG4gKiAtIGFyYml0cmFyeVxuICovXG5leHBvcnQgdHlwZSBUcmFja1NvdXJjZSA9ICdzb3VuZGNsb3VkJyB8ICd5b3V0dWJlJyB8ICdzcG90aWZ5JyB8ICdhcHBsZV9tdXNpYycgfCAnYXJiaXRyYXJ5JztcblxuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFja0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSB0aXRsZVxuICAgICAqL1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yXG4gICAgICovXG4gICAgYXV0aG9yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVybFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aHVtYm5haWxcbiAgICAgKi9cbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb25cbiAgICAgKi9cbiAgICBkdXJhdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBpbiBtc1xuICAgICAqL1xuICAgIHZpZXdzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAgIC8qKlxuICAgICAqIFRoZSBzb3VyY2VcbiAgICAgKi9cbiAgICBzb3VyY2U/OiBUcmFja1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5naW5lXG4gICAgICovXG4gICAgZW5naW5lPzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIHRyYWNrIGlzIGxpdmVcbiAgICAgKi9cbiAgICBsaXZlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRhdGFcbiAgICAgKi9cbiAgICByYXc/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSB0eXBlXG4gICAgICovXG4gICAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXJhbGlzZWQgdGl0bGVcbiAgICAgKi9cbiAgICBjbGVhblRpdGxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaW1lIGluIGRheXNcbiAgICAgKi9cbiAgICBkYXlzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGltZSBpbiBob3Vyc1xuICAgICAqL1xuICAgIGhvdXJzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGltZSBpbiBtaW51dGVzXG4gICAgICovXG4gICAgbWludXRlczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gc2Vjb25kc1xuICAgICAqL1xuICAgIHNlY29uZHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIElmIGl0IHNob3VsZCByZW5kZXIgdGltZSBjb2Rlc1xuICAgICAqL1xuICAgIHRpbWVjb2Rlcz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgaXQgc2hvdWxkIGNyZWF0ZSBwcm9ncmVzcyBiYXIgZm9yIHRoZSB3aG9sZSBxdWV1ZVxuICAgICAqL1xuICAgIGxlbmd0aD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYmFyIGxlbmd0aFxuICAgICAqL1xuICAgIGxlZnRDaGFyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbGFwc2VkIHRpbWUgdHJhY2tcbiAgICAgKi9cbiAgICByaWdodENoYXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbWFpbmluZyB0aW1lIHRyYWNrXG4gICAgICovXG4gICAgc2VwYXJhdG9yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGltZXN0YW1wIGFuZCBsaW5lXG4gICAgICovXG4gICAgaW5kaWNhdG9yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmRpY2F0b3JcbiAgICAgKi9cbiAgICBxdWV1ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gKiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIEFVVE9cbiAqIC0gWU9VVFVCRVxuICogLSBZT1VUVUJFX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURfVFJBQ0tcbiAqIC0gU09VTkRDTE9VRF9QTEFZTElTVFxuICogLSBTT1VORENMT1VEXG4gKiAtIFNQT1RJRllfU09OR1xuICogLSBTUE9USUZZX0FMQlVNXG4gKiAtIFNQT1RJRllfUExBWUxJU1RcbiAqIC0gU1BPVElGWV9TRUFSQ0hcbiAqIC0gRkFDRUJPT0tcbiAqIC0gVklNRU9cbiAqIC0gQVJCSVRSQVJZXG4gKiAtIFJFVkVSQk5BVElPTlxuICogLSBZT1VUVUJFX1NFQVJDSFxuICogLSBZT1VUVUJFX1ZJREVPXG4gKiAtIFNPVU5EQ0xPVURfU0VBUkNIXG4gKiAtIEFQUExFX01VU0lDX1NPTkdcbiAqIC0gQVBQTEVfTVVTSUNfQUxCVU1cbiAqIC0gQVBQTEVfTVVTSUNfUExBWUxJU1RcbiAqIC0gQVBQTEVfTVVTSUNfU0VBUkNIXG4gKiAtIEZJTEVcbiAqIC0gQVVUT19TRUFSQ0hcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IFF1ZXJ5VHlwZVxuICovXG5leHBvcnQgY29uc3QgUXVlcnlUeXBlID0ge1xuICAgIEFVVE86ICdhdXRvJyxcbiAgICBZT1VUVUJFOiAneW91dHViZScsXG4gICAgWU9VVFVCRV9QTEFZTElTVDogJ3lvdXR1YmVQbGF5bGlzdCcsXG4gICAgU09VTkRDTE9VRF9UUkFDSzogJ3NvdW5kY2xvdWRUcmFjaycsXG4gICAgU09VTkRDTE9VRF9QTEFZTElTVDogJ3NvdW5kY2xvdWRQbGF5bGlzdCcsXG4gICAgU09VTkRDTE9VRDogJ3NvdW5kY2xvdWQnLFxuICAgIFNQT1RJRllfU09ORzogJ3Nwb3RpZnlTb25nJyxcbiAgICBTUE9USUZZX0FMQlVNOiAnc3BvdGlmeUFsYnVtJyxcbiAgICBTUE9USUZZX1BMQVlMSVNUOiAnc3BvdGlmeVBsYXlsaXN0JyxcbiAgICBTUE9USUZZX1NFQVJDSDogJ3Nwb3RpZnlTZWFyY2gnLFxuICAgIEZBQ0VCT09LOiAnZmFjZWJvb2snLFxuICAgIFZJTUVPOiAndmltZW8nLFxuICAgIEFSQklUUkFSWTogJ2FyYml0cmFyeScsXG4gICAgUkVWRVJCTkFUSU9OOiAncmV2ZXJibmF0aW9uJyxcbiAgICBZT1VUVUJFX1NFQVJDSDogJ3lvdXR1YmVTZWFyY2gnLFxuICAgIFlPVVRVQkVfVklERU86ICd5b3V0dWJlVmlkZW8nLFxuICAgIFNPVU5EQ0xPVURfU0VBUkNIOiAnc291bmRjbG91ZFNlYXJjaCcsXG4gICAgQVBQTEVfTVVTSUNfU09ORzogJ2FwcGxlTXVzaWNTb25nJyxcbiAgICBBUFBMRV9NVVNJQ19BTEJVTTogJ2FwcGxlTXVzaWNBbGJ1bScsXG4gICAgQVBQTEVfTVVTSUNfUExBWUxJU1Q6ICdhcHBsZU11c2ljUGxheWxpc3QnLFxuICAgIEFQUExFX01VU0lDX1NFQVJDSDogJ2FwcGxlTXVzaWNTZWFyY2gnLFxuICAgIEZJTEU6ICdmaWxlJyxcbiAgICBBVVRPX1NFQVJDSDogJ2F1dG9TZWFyY2gnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2VhcmNoUXVlcnlUeXBlID0ga2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZSB8ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJFdmVudHMge1xuICAgIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gICAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgICB2b2ljZVN0YXRlVXBkYXRlOiAocXVldWU6IEd1aWxkUXVldWUsIG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkgPT4gYW55O1xufVxuXG5leHBvcnQgY29uc3QgUGxheWVyRXZlbnQgPSB7XG4gICAgZGVidWc6ICdkZWJ1ZycsXG4gICAgRGVidWc6ICdkZWJ1ZycsXG4gICAgZXJyb3I6ICdlcnJvcicsXG4gICAgRXJyb3I6ICdlcnJvcicsXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICAgIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQbGF5ZXJFdmVudCA9ICh0eXBlb2YgUGxheWVyRXZlbnQpW2tleW9mIHR5cGVvZiBQbGF5ZXJFdmVudF07XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICAgKi9cbiAgICBmaWx0ZXJzVXBkYXRlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBGRm1wZWcgYXJncyBwYXNzZWQgdG8gZW5jb2RlclxuICAgICAqL1xuICAgIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogVGltZSB0byBzZWVrIHRvIGJlZm9yZSBwbGF5aW5nXG4gICAgICovXG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICAgKi9cbiAgICBpbW1lZGlhdGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBRdWVyeUV4dHJhY3RvclNlYXJjaCA9IGBleHQ6JHtzdHJpbmd9YDtcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcXVlcnkgc2VhcmNoIGVuZ2luZSwgY2FuIGJlIGV4dHJhY3RvciBuYW1lIHRvIHRhcmdldCBzcGVjaWZpYyBvbmUgKGN1c3RvbSlcbiAgICAgKi9cbiAgICBzZWFyY2hFbmdpbmU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAgICovXG4gICAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAgICAgKi9cbiAgICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogRmFsbGJhY2sgc2VhcmNoIGVuZ2luZSB0byB1c2VcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJlcXVlc3RPcHRpb25zPzogYW55O1xuICAgIC8qKlxuICAgICAqIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gICAgICovXG4gICAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbi8qKlxuICogVGhlIHF1ZXVlIHJlcGVhdCBtb2RlLiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIE9GRlxuICogLSBUUkFDS1xuICogLSBRVUVVRVxuICogLSBBVVRPUExBWVxuICovXG5leHBvcnQgZW51bSBRdWV1ZVJlcGVhdE1vZGUge1xuICAgIC8qKlxuICAgICAqIERpc2FibGUgcmVwZWF0IG1vZGUuXG4gICAgICovXG4gICAgT0ZGID0gMCxcbiAgICAvKipcbiAgICAgKiBSZXBlYXQgdGhlIGN1cnJlbnQgdHJhY2suXG4gICAgICovXG4gICAgVFJBQ0sgPSAxLFxuICAgIC8qKlxuICAgICAqIFJlcGVhdCB0aGUgZW50aXJlIHF1ZXVlLlxuICAgICAqL1xuICAgIFFVRVVFID0gMixcbiAgICAvKipcbiAgICAgKiBXaGVuIGxhc3QgdHJhY2sgZW5kcywgcGxheSBzaW1pbGFyIHRyYWNrcyBpbiB0aGUgZnV0dXJlIGlmIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEFVVE9QTEFZID0gMyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEluaXREYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2tzIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICB0cmFja3M6IFRyYWNrW107XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAgICovXG4gICAgdGl0bGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aHVtYm5haWxcbiAgICAgKi9cbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAgICAgKi9cbiAgICB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3Qgc291cmNlXG4gICAgICovXG4gICAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgYXV0aG9yXG4gICAgICovXG4gICAgYXV0aG9yOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXV0aG9yIG5hbWVcbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICAgICAqL1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgcGxheWxpc3QgZGF0YVxuICAgICAqL1xuICAgIHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja0pTT04ge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBpZFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIHRpdGxlXG4gICAgICovXG4gICAgdGl0bGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgZGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBhdXRob3JcbiAgICAgKi9cbiAgICBhdXRob3I6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIHRodW1ibmFpbFxuICAgICAqL1xuICAgIHRodW1ibmFpbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBkdXJhdGlvblxuICAgICAqL1xuICAgIGR1cmF0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1zXG4gICAgICovXG4gICAgZHVyYXRpb25NUzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayB2aWV3c1xuICAgICAqL1xuICAgIHZpZXdzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgaWQgd2hvIHJlcXVlc3RlZCB0aGlzIHRyYWNrXG4gICAgICovXG4gICAgcmVxdWVzdGVkQnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgaW5mbyAoaWYgYW55KVxuICAgICAqL1xuICAgIHBsYXlsaXN0PzogUGxheWxpc3RKU09OO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SlNPTiB7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAgICovXG4gICAgdGl0bGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgZGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aHVtYm5haWxcbiAgICAgKi9cbiAgICB0aHVtYm5haWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAgICAgKi9cbiAgICB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2sgc291cmNlXG4gICAgICovXG4gICAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgYXV0aG9yXG4gICAgICovXG4gICAgYXV0aG9yOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXV0aG9yIG5hbWVcbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICAgICAqL1xuICAgICAgICB1cmw6IHN0cmluZztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFja3MgZGF0YSAoaWYgYW55KVxuICAgICAqL1xuICAgIHRyYWNrczogVHJhY2tKU09OW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVySW5pdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIHRpbWVvdXRcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAgICAgKi9cbiAgICBsYWdNb25pdG9yPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAgICAgKi9cbiAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHF1ZXJ5aW5nIG1ldGFkYXRhIGZyb21cbiAgICAgKi9cbiAgICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBzdHJlYW1pbmcgZnJvbVxuICAgICAqL1xuICAgIGJsb2NrU3RyZWFtRnJvbT86IHN0cmluZ1tdO1xuICAgIC8qKlxuICAgICAqIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZVByb3ZpZGVyPGFueT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVzZSBsZWdhY3kgdmVyc2lvbiBvZiBmZm1wZWdcbiAgICAgKi9cbiAgICB1c2VMZWdhY3lGRm1wZWc/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNldCBicmlkZ2UgcHJvdmlkZXJcbiAgICAgKi9cbiAgICBicmlkZ2VQcm92aWRlcj86IEJyaWRnZVByb3ZpZGVyO1xuICAgIC8qKlxuICAgICAqIFNraXAgZmZtcGVnIHByb2Nlc3Mgd2hlbiBwb3NzaWJsZVxuICAgICAqL1xuICAgIHNraXBGRm1wZWc/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9iZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNTAwMC5cbiAgICAgKi9cbiAgICBwcm9iZVRpbWVvdXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGZmbXBlZyBwYXRoXG4gICAgICovXG4gICAgZmZtcGVnUGF0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIG92ZXJyaWRlIHRoZSBmYWxsYmFjayBjb250ZXh0LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICovXG4gICAgb3ZlcnJpZGVGYWxsYmFja0NvbnRleHQ/OiBib29sZWFuO1xufVxuIiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoLCBRdWVyeVR5cGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi9QbGF5bGlzdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4vVHJhY2snO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdERhdGEge1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2ggfCBudWxsO1xuICAgIGV4dHJhY3Rvcj86IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICAgIHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsO1xuICAgIHRyYWNrcz86IFRyYWNrW107XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlYXJjaFJlc3VsdCB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHJpdmF0ZSBfZGF0YTogU2VhcmNoUmVzdWx0RGF0YSkge1xuICAgICAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgICAgICAgIHRyYWNrLmV4dHJhY3RvciA/Pz0gdGhpcy5fZGF0YS5leHRyYWN0b3IgfHwgbnVsbDtcbiAgICAgICAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID8/PSBfZGF0YS5yZXF1ZXN0ZWRCeSB8fCBudWxsO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UXVlcnlUeXBlKHR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucXVlcnlUeXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFJlcXVlc3RlZEJ5KHVzZXI6IFVzZXIpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5yZXF1ZXN0ZWRCeSA9IHVzZXI7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEV4dHJhY3RvcihleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgICAgICAgdHJhY2suZXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFRyYWNrcyh0cmFja3M6IFRyYWNrW10pIHtcbiAgICAgICAgdGhpcy5fZGF0YS50cmFja3MgPSB0cmFja3M7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRRdWVyeShxdWVyeTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RhdGEucXVlcnkgPSBxdWVyeTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFBsYXlsaXN0KHBsYXlsaXN0OiBQbGF5bGlzdCkge1xuICAgICAgICB0aGlzLl9kYXRhLnBsYXlsaXN0ID0gcGxheWxpc3Q7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzZWFyY2ggcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXJ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5IHR5cGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHF1ZXJ5VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnlUeXBlIHx8IFF1ZXJ5VHlwZS5BVVRPO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGV4dHJhY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheWxpc3QgcmVzdWx0XG4gICAgICovXG4gICAgcHVibGljIGdldCBwbGF5bGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucGxheWxpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhY2tzIHJlc3VsdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS50cmFja3MgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdGVkIGJ5XG4gICAgICovXG4gICAgcHVibGljIGdldCByZXF1ZXN0ZWRCeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZS1leGVjdXRlIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5zZWFyY2godGhpcy5xdWVyeSwge1xuICAgICAgICAgICAgc2VhcmNoRW5naW5lOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5ISxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGlzIGVtcHR5XG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUGxheWxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2VhcmNoXG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGwsXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEZpbHRlcnNOYW1lIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuXG5jb25zdCBiYXNzID0gKGc6IG51bWJlcikgPT4gYGJhc3M9Zz0ke2d9OmY9MTEwOnc9MC4zYDtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvRmlsdGVycyB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICByZXR1cm4gQXVkaW9GaWx0ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZmlsdGVyczogUmVjb3JkPEZpbHRlcnNOYW1lLCBzdHJpbmc+ID0ge1xuICAgICAgICBiYXNzYm9vc3RfbG93OiBiYXNzKDE1KSxcbiAgICAgICAgYmFzc2Jvb3N0OiBiYXNzKDIwKSxcbiAgICAgICAgYmFzc2Jvb3N0X2hpZ2g6IGJhc3MoMzApLFxuICAgICAgICAnOEQnOiAnYXB1bHNhdG9yPWh6PTAuMDknLFxuICAgICAgICB2YXBvcndhdmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC44JyxcbiAgICAgICAgbmlnaHRjb3JlOiAnYXJlc2FtcGxlPTQ4MDAwLGFzZXRyYXRlPTQ4MDAwKjEuMjUnLFxuICAgICAgICBsb2ZpOiAnYXJlc2FtcGxlPTQ4MDAwLGFzZXRyYXRlPTQ4MDAwKjAuOSxleHRyYXN0ZXJlbz1tPTIuNTpjPWRpc2FibGVkJyxcbiAgICAgICAgcGhhc2VyOiAnYXBoYXNlcj1pbl9nYWluPTAuNCcsXG4gICAgICAgIHRyZW1vbG86ICd0cmVtb2xvJyxcbiAgICAgICAgdmlicmF0bzogJ3ZpYnJhdG89Zj02LjUnLFxuICAgICAgICByZXZlcnNlOiAnYXJldmVyc2UnLFxuICAgICAgICB0cmVibGU6ICd0cmVibGU9Zz01JyxcbiAgICAgICAgbm9ybWFsaXplcjI6ICdkeW5hdWRub3JtPWc9MTAxJyxcbiAgICAgICAgbm9ybWFsaXplcjogJ2Fjb21wcmVzc29yJyxcbiAgICAgICAgc3Vycm91bmRpbmc6ICdzdXJyb3VuZCcsXG4gICAgICAgIHB1bHNhdG9yOiAnYXB1bHNhdG9yPWh6PTEnLFxuICAgICAgICBzdWJib29zdDogJ2FzdWJib29zdCcsXG4gICAgICAgIGthcmFva2U6ICdzdGVyZW90b29scz1tbGV2PTAuMDMnLFxuICAgICAgICBmbGFuZ2VyOiAnZmxhbmdlcicsXG4gICAgICAgIGdhdGU6ICdhZ2F0ZScsXG4gICAgICAgIGhhYXM6ICdoYWFzJyxcbiAgICAgICAgbWNvbXBhbmQ6ICdtY29tcGFuZCcsXG4gICAgICAgIG1vbm86ICdwYW49bW9ub3xjMD0uNSpjMCsuNSpjMScsXG4gICAgICAgIG1zdGxyOiAnc3RlcmVvdG9vbHM9bW9kZT1tcz5scicsXG4gICAgICAgIG1zdHJyOiAnc3RlcmVvdG9vbHM9bW9kZT1tcz5ycicsXG4gICAgICAgIGNvbXByZXNzb3I6ICdjb21wYW5kPXBvaW50cz0tODAvLTEwNXwtNjIvLTgwfC0xNS40Ly0xNS40fDAvLTEyfDIwLy03LjYnLFxuICAgICAgICBleHBhbmRlcjogJ2NvbXBhbmQ9YXR0YWNrcz0wOnBvaW50cz0tODAvLTE2OXwtNTQvLTgwfC00OS41Ly02NC42fC00MS4xLy00MS4xfC0yNS44Ly0xNXwtMTAuOC8tNC41fDAvMHwyMC84LjMnLFxuICAgICAgICBzb2Z0bGltaXRlcjogJ2NvbXBhbmQ9YXR0YWNrcz0wOnBvaW50cz0tODAvLTgwfC0xMi40Ly0xMi40fC02Ly04fDAvLTYuOHwyMC8tMi44JyxcbiAgICAgICAgY2hvcnVzOiAnY2hvcnVzPTAuNzowLjk6NTU6MC40OjAuMjU6MicsXG4gICAgICAgIGNob3J1czJkOiAnY2hvcnVzPTAuNjowLjk6NTB8NjA6MC40fDAuMzI6MC4yNXwwLjQ6MnwxLjMnLFxuICAgICAgICBjaG9ydXMzZDogJ2Nob3J1cz0wLjU6MC45OjUwfDYwfDQwOjAuNHwwLjMyfDAuMzowLjI1fDAuNHwwLjM6MnwyLjN8MS4zJyxcbiAgICAgICAgZmFkZWluOiAnYWZhZGU9dD1pbjpzcz0wOmQ9MTAnLFxuICAgICAgICBkaW06IGBhZmZ0ZmlsdD1cIidyZWFsPXJlICogKDEtY2xpcCgoYi9uYikqYiwwLDEpKSc6aW1hZz0naW0gKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJ1wiYCxcbiAgICAgICAgZWFycmFwZTogJ2NoYW5uZWxzcGxpdCxzaWRlY2hhaW5nYXRlPWxldmVsX2luPTY0JyxcbiAgICAgICAgc2lsZW5jZXJlbW92ZTogJ3NpbGVuY2VyZW1vdmU9MTowOi01MGRCJyxcbiAgICB9O1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXQ8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihuYW1lOiBLKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnNbbmFtZV0gPz8gbmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhczxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICAgICAgcmV0dXJuIG5hbWUgaW4gdGhpcy5maWx0ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8eyBuYW1lOiBGaWx0ZXJzTmFtZTsgdmFsdWU6IHN0cmluZyB9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZmlsdGVycykpIHtcbiAgICAgICAgICAgIHlpZWxkIHsgbmFtZTogayBhcyBGaWx0ZXJzTmFtZSwgdmFsdWU6IHYgYXMgc3RyaW5nIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBuYW1lcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykgYXMgRmlsdGVyc05hbWVbXTtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcHVibGljIHN0YXRpYyBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXMubWFwKChtKSA9PiAodGhpcyBhcyBhbnkpW21dKS5qb2luKCcsJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBmZm1wZWcgYXJncyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsdGVycyBuYW1lXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIG5hbWVcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4oZmlsdGVycz86IChLIHwgc3RyaW5nKVtdKSB7XG4gICAgICAgIGlmICghZmlsdGVycyB8fCAhQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcnNcbiAgICAgICAgICAgIC5maWx0ZXIoKHByZWRpY2F0ZSkgPT4gdHlwZW9mIHByZWRpY2F0ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAubWFwKChtKSA9PiB0aGlzLmdldChtIGFzIEspKVxuICAgICAgICAgICAgLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGF1ZGlvIGZpbHRlclxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWx0ZXJcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZmbXBlZyBhcmdzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWZpbmUoZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyc1tmaWx0ZXJOYW1lIGFzIEZpbHRlcnNOYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgbXVsdGlwbGUgYXVkaW8gZmlsdGVyc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJzQXJyYXkgQXJyYXkgb2YgZmlsdGVycyBjb250YWluaW5nIHRoZSBmaWx0ZXIgbmFtZSBhbmQgZmZtcGVnIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlZmluZUJ1bGsoZmlsdGVyc0FycmF5OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pIHtcbiAgICAgICAgZmlsdGVyc0FycmF5LmZvckVhY2goKGFycikgPT4gdGhpcy5kZWZpbmUoYXJyLm5hbWUsIGFyci52YWx1ZSkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBEZWZhdWx0TGlzdGVuZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgTGlzdGVuZXJTaWduYXR1cmUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUGxheWVyRXZlbnRzRW1pdHRlcjxMIGV4dGVuZHMgTGlzdGVuZXJTaWduYXR1cmU8TD4gPSBEZWZhdWx0TGlzdGVuZXI+IGV4dGVuZHMgRXZlbnRFbWl0dGVyPEw+IHtcbiAgICAjaGFzRGVidWdnZXIgPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlcXVpcmVkRXZlbnRzOiBBcnJheTxrZXlvZiBMPiA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25jZTxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvZmY8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgICAgIHJldHVybiBzdXBlci5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQWxsTGlzdGVuZXJzPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lPzogSykge1xuICAgICAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKG5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPExbS10+KSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKG5hbWUpfVwiLiBFdmVudHMgJHt0aGlzLnJlcXVpcmVkRXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKG0pID0+IGBcIiR7U3RyaW5nKG0pfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJywgJyl9IG11c3QgaGF2ZSBldmVudCBsaXN0ZW5lcnMuYCxcbiAgICAgICAgICAgICAgICAnVW5oYW5kbGVkRXZlbnRzV2FybmluZycsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLmVtaXQobmFtZSwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNEZWJ1Z2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hhc0RlYnVnZ2VyO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4uL2ZhYnJpYy9QbGF5bGlzdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vcXVldWUnO1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JTdHJlYW1hYmxlID1cbiAgICB8IFJlYWRhYmxlXG4gICAgfCBzdHJpbmdcbiAgICB8IHtcbiAgICAgICAgICAkZm10OiBzdHJpbmc7XG4gICAgICAgICAgc3RyZWFtOiBSZWFkYWJsZTtcbiAgICAgIH07XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIGZvciB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaWRlbnRpZmllciA9ICdjb20uZGlzY29yZC1wbGF5ZXIuZXh0cmFjdG9yJztcblxuICAgIC8qKlxuICAgICAqIFByaW9yaXR5IG9mIHRoaXMgZXh0cmFjdG9yLiBIaWdoZXIgdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5ICh3aWxsIGJlIGV4ZWN1dGVkIGZpcnN0KS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJpb3JpdHkgPSAxO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHF1ZXJ5IHByb3RvY29scyB0aGF0IHRoaXMgZXh0cmFjdG9yIHN1cHBvcnRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBwcm90b2NvbHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgYnJpZGdlIHF1ZXJ5IGNyZWF0aW9uXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlQnJpZGdlUXVlcnkgPSAodHJhY2s6IFRyYWNrKSA9PiBgJHt0cmFjay50aXRsZX0gYnkgJHt0cmFjay5hdXRob3J9IG9mZmljaWFsIGF1ZGlvYDtcblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RvciBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgcHVibGljIG9wdGlvbnM6IFQgPSA8VD57fSkge31cblxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhpcyBleHRyYWN0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlkZW50aWZpZXIoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQmFzZUV4dHJhY3RvcikuaWRlbnRpZmllcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNvbmZpZ3VyZXMgdGhpcyBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgbmV3IG9wdGlvbnMgdG8gYXBwbHlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVjb25maWd1cmUob3B0aW9uczogVCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBhd2FpdCB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKSB7XG4gICAgICAgIC8vIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGVhY3RpdmF0ZSgpIHtcbiAgICAgICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgaW5jb21pbmcgcXVlcnlcbiAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHZhbGlkYXRlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHZhbGlkYXRlKHF1ZXJ5OiBzdHJpbmcsIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHZvaWQgdHlwZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0cmVhbSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICAgKiBAcGFyYW0gaW5mbyBUaGUgdHJhY2sgdG8gc3RyZWFtXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHN0cmVhbShpbmZvOiBUcmFjayk6IFByb21pc2U8RXh0cmFjdG9yU3RyZWFtYWJsZT4ge1xuICAgICAgICB2b2lkIGluZm87XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PVF9JTVBMRU1FTlRFRChgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnN0cmVhbSgpYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRoZSBnaXZlbiBxdWVyeVxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gaGFuZGxlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZShxdWVyeTogc3RyaW5nLCBjb250ZXh0OiBFeHRyYWN0b3JTZWFyY2hDb250ZXh0KTogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgICAgIHZvaWQgY29udGV4dDtcbiAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0lNUExFTUVOVEVEKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uaGFuZGxlKClgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcmVsYXRlZCB0cmFja3MgZm9yIHRoZSBnaXZlbiB0cmFja1xuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgc291cmNlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGdldFJlbGF0ZWRUcmFja3ModHJhY2s6IFRyYWNrLCBoaXN0b3J5OiBHdWlsZFF1ZXVlSGlzdG9yeSk6IFByb21pc2U8RXh0cmFjdG9ySW5mbz4ge1xuICAgICAgICB2b2lkIHRyYWNrO1xuICAgICAgICB2b2lkIGhpc3Rvcnk7XG4gICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PVF9JTVBMRU1FTlRFRChgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmdldFJlbGF0ZWRUcmFja3MoKWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3RyZWFtIG1pZGRsZXdhcmUgdG8gaGFuZGxlIHN0cmVhbXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHBsYXllclxuICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIGluY29taW5nIHN0cmVhbVxuICAgICAqIEBwYXJhbSBuZXh0IFRoZSBuZXh0IGZ1bmN0aW9uXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZVBvc3RTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXh0KG51bGwsIHN0cmVhbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsYXllclxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZGlzcGF0Y2hcbiAgICAgKiBAcGFyYW0gYXJncyBUaGUgZGF0YSB0byBkaXNwYXRjaFxuICAgICAqL1xuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBQbGF5ZXJFdmVudHM+KGV2ZW50OiBLLCAuLi5hcmdzOiBQYXJhbWV0ZXJzPFBsYXllckV2ZW50c1tLXT4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGV4dHJhY3RvciByZXNwb25zZVxuICAgICAqIEBwYXJhbSBwbGF5bGlzdCBUaGUgcGxheWxpc3RcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFjayBhcnJheVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVSZXNwb25zZShwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbCwgdHJhY2tzOiBUcmFja1tdID0gcGxheWxpc3Q/LnRyYWNrcyB8fCBbXSk6IEV4dHJhY3RvckluZm8ge1xuICAgICAgICByZXR1cm4geyBwbGF5bGlzdDogcGxheWxpc3QgfHwgbnVsbCwgdHJhY2tzIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JpdGUgZGVidWcgbWVzc2FnZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICovXG4gICAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBsYXllci5kZWJ1ZyhtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGZsYWcgdG8gaW5kaWNhdGUgYERlbXV4YWJsZWAgc3RyZWFtIHN1cHBvcnQgZm9yIGBvcHVzYC9gb2dnL29wdXNgL2B3ZWJtL29wdXNgIGZvcm1hdHMuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzdXBwb3J0c0RlbXV4KCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmNvbnRleHQucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgc3RyZWFtIGV4dHJhY3Rpb24gZm9yIGFub3RoZXIgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBicmlkZ2VcbiAgICAgKiBAcGFyYW0gc291cmNlRXh0cmFjdG9yIFRoZSBzb3VyY2UgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGJyaWRnZSh0cmFjazogVHJhY2ssIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwpOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsPiB7XG4gICAgICAgIHZvaWQgc291cmNlRXh0cmFjdG9yO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5leHRGdW5jdGlvbiA9IChlcnJvcj86IEVycm9yIHwgbnVsbCwgc3RyZWFtPzogUmVhZGFibGUpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9ySW5mbyB7XG4gICAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgICB0cmFja3M6IFRyYWNrW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yU2VhcmNoQ29udGV4dCB7XG4gICAgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGw7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgICByZXF1ZXN0T3B0aW9ucz86IFJlcXVlc3RPcHRpb25zO1xuICAgIHByb3RvY29sPzogc3RyaW5nIHwgbnVsbDtcbn1cbiIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yLCBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4uL2hvb2tzJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlc3Npb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgYXR0ZW1wdGVkRXh0cmFjdG9yczogU2V0PHN0cmluZz47XG4gICAgYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9yczogU2V0PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uRXZlbnRzIHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIGV4dHJhY3RvciB3YXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyByZWdpc3RlcmVkXG4gICAgICovXG4gICAgcmVnaXN0ZXJlZDogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgdW5yZWdpc3RlcmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgZXh0cmFjdG9yIHdhcyB1bnJlZ2lzdGVyZWRcbiAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgdW5yZWdpc3RlcmVkXG4gICAgICovXG4gICAgdW5yZWdpc3RlcmVkOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBhY3RpdmF0ZWRcbiAgICAgKi9cbiAgICBhY3RpdmF0ZTogKGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIGRlYWN0aXZhdGU6IChjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGZhaWxzIHRvIGFjdGl2YXRlL2RlYWN0aXZhdGVcbiAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgICAqL1xuICAgIGVycm9yOiAoY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCwgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yLCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxFeHRyYWN0b3JFeGVjdXRpb25FdmVudHM+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0cmFjdG9ycyBzdG9yZVxuICAgICAqL1xuICAgIHB1YmxpYyBzdG9yZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgQmFzZUV4dHJhY3Rvcj4oKTtcblxuICAgIHB1YmxpYyByZWFkb25seSBjb250ZXh0ID0gY3JlYXRlQ29udGV4dDxFeHRyYWN0b3JTZXNzaW9uPigpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgICAgICBzdXBlcihbJ2Vycm9yJ10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBleGVjdXRpb24gaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQuY29uc3VtZSgpPy5pZCA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDb250ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbnN1bWUoKSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkRGVmYXVsdCgpIHtcbiAgICAgICAgY29uc3Qgc2FtcGxlID0gYGltcG9ydCB7IERlZmF1bHRFeHRyYWN0b3JzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2V4dHJhY3Rvcic7XFxuYXdhaXQgcGxheWVyLmV4dHJhY3RvcnMubG9hZE11bHRpKERlZmF1bHRFeHRyYWN0b3JzKTtgO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBleHRyYWN0b3JzLmxvYWREZWZhdWx0IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzZSBleHRyYWN0b3JzLmxvYWRNdWx0aSBpbnN0ZWFkLiBFeGFtcGxlOlxcbiR7c2FtcGxlfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIGJ1bmRsZSBvZiBleHRyYWN0b3JzLlxuICAgICAqIEBleGFtcGxlIGltcG9ydCB7IERlZmF1bHRFeHRyYWN0b3JzIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2V4dHJhY3Rvcic7XG4gICAgICpcbiAgICAgKiBhd2FpdCBwbGF5ZXIuZXh0cmFjdG9ycy5sb2FkTXVsdGkoRGVmYXVsdEV4dHJhY3RvcnMpO1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBsb2FkTXVsdGk8XG4gICAgICAgIE8gZXh0ZW5kcyBvYmplY3QsXG4gICAgICAgIFQgZXh0ZW5kcyAodHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4pW10sXG4gICAgICAgIFIgZXh0ZW5kcyBSZWNvcmQ8VFtudW1iZXJdWydpZGVudGlmaWVyJ10sIENvbnN0cnVjdG9yUGFyYW1ldGVyczxUW251bWJlcl0+WzFdPixcbiAgICA+KGJ1bmRsZTogVCwgb3B0aW9uczogUiA9IHt9IGFzIFIpIHtcbiAgICAgICAgYnVuZGxlLmZvckVhY2goKGV4dCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5yZWdpc3RlcihleHQsIG9wdGlvbnM/LltleHQuaWRlbnRpZmllcl0gfHwge30pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGlmIHRoZSBnaXZlbiBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlZ2lzdGVyZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIF9leHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0byByZWdpc3RlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcjxPIGV4dGVuZHMgb2JqZWN0LCBUIGV4dGVuZHMgdHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4+KFxuICAgICAgICBfZXh0cmFjdG9yOiBULFxuICAgICAgICBvcHRpb25zOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VD5bJzEnXSxcbiAgICApOiBQcm9taXNlPEluc3RhbmNlVHlwZTxUPiB8IG51bGw+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBfZXh0cmFjdG9yLmlkZW50aWZpZXIgIT09ICdzdHJpbmcnIHx8IHRoaXMuc3RvcmUuaGFzKF9leHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgX2V4dHJhY3Rvcih0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLnBsYXllci5vcHRpb25zLmJyaWRnZVByb3ZpZGVyKSBvcHRpb25zLmJyaWRnZVByb3ZpZGVyID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmJyaWRnZVByb3ZpZGVyO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldChfZXh0cmFjdG9yLmlkZW50aWZpZXIsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGxvYWRlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICBhd2FpdCBleHRyYWN0b3IuYWN0aXZhdGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7X2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgYWN0aXZhdGVkIWApO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdhY3RpdmF0ZScsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdG9yIGFzIHVua25vd24gYXMgSW5zdGFuY2VUeXBlPFQ+O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLmRlbGV0ZShfZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBhY3RpdmF0ZSEgRXJyb3I6ICR7ZX1gKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVyIHNpbmdsZSBleHRyYWN0b3JcbiAgICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHVucmVnaXN0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlcjxLIGV4dGVuZHMgc3RyaW5nIHwgQmFzZUV4dHJhY3Rvcj4oX2V4dHJhY3RvcjogSykge1xuICAgICAgICBjb25zdCBleHRyYWN0b3IgPVxuICAgICAgICAgICAgdHlwZW9mIF9leHRyYWN0b3IgPT09ICdzdHJpbmcnID8gdGhpcy5zdG9yZS5nZXQoX2V4dHJhY3RvcikgOiB0aGlzLnN0b3JlLmZpbmQoKHIpID0+IHIgPT09IF9leHRyYWN0b3IpO1xuICAgICAgICBpZiAoIWV4dHJhY3RvcikgcmV0dXJuO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBleHRyYWN0b3IuaWRlbnRpZmllciB8fCB0aGlzLnN0b3JlLmZpbmRLZXkoKGUpID0+IGUgPT09IGV4dHJhY3RvcikhO1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcikgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkaXNhYmxlZCFgKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgndW5yZWdpc3RlcmVkJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgICAgICAgIGF3YWl0IGV4dHJhY3Rvci5kZWFjdGl2YXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGVhY3RpdmF0ZWQhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RlYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZmFpbGVkIHRvIGRlYWN0aXZhdGUhYCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXIgYWxsIGV4dHJhY3RvcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlckFsbCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuc3RvcmUubWFwKChlKSA9PiB0aGlzLnVucmVnaXN0ZXIoZSkpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW4gYWxsIHRoZSBleHRyYWN0b3JzXG4gICAgICogQHBhcmFtIGZuIFRoZSBydW5uZXIgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0gZmlsdGVyQmxvY2tlZCBGaWx0ZXIgYmxvY2tlZCBleHRyYWN0b3JzXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJ1bjxUID0gdW5rbm93bj4oZm46IEV4dHJhY3RvckV4ZWN1dGlvbkZOPFQ+LCBmaWx0ZXJCbG9ja2VkID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBibG9ja2VkID0gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz8gW107XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0b3JlLnNpemUpIHtcbiAgICAgICAgICAgIFV0aWwud2FybignU2tpcHBpbmcgZXh0cmFjdG9ycyBleGVjdXRpb24gc2luY2UgemVybyBleHRyYWN0b3JzIHdlcmUgcmVnaXN0ZXJlZCcsICdOb0V4dHJhY3RvcnMnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNvcnQgYnkgcHJpb3JpdHkgc28gdGhhdCBleHRyYWN0b3JzIHdpdGggaGlnaGVyIHByaW9yaXR5IGFyZSBleGVjdXRlZCBmaXJzdFxuICAgICAgICBjb25zdCBleHRyYWN0b3JzID0gdGhpcy5zdG9yZS5zb3J0KChhLCBiKSA9PiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eSk7XG5cbiAgICAgICAgbGV0IGVycjogRXJyb3IgfCBudWxsID0gbnVsbCxcbiAgICAgICAgICAgIGxhc3RFeHQ6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRyYWN0b3JzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyQmxvY2tlZCAmJiBibG9ja2VkLnNvbWUoKGUpID0+IGUgPT09IGV4dC5pZGVudGlmaWVyKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGBFeGVjdXRpbmcgZXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9Li4uYCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihleHQpLnRoZW4oXG4gICAgICAgICAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWApO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUeXBlVXRpbC5pc0Vycm9yKGUpID8gZSA6IG5ldyBFcnJvcihgJHtlfWApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsYXN0RXh0ID0gZXh0O1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmICFUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpIHRoaXMucGxheWVyLmRlYnVnKGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBleHQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VD47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGVyciA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogbGFzdEV4dCEsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICByZXN1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgfSBhcyBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8ZmFsc2U+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgYnJpZGdlIGZvciBhIHRyYWNrXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZXF1ZXN0IGJyaWRnZSBmb3JcbiAgICAgKiBAcGFyYW0gc291cmNlRXh0cmFjdG9yIFRoZSBzb3VyY2UgZXh0cmFjdG9yIG9mIHRoZSB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZXF1ZXN0QnJpZGdlKHRyYWNrOiBUcmFjaywgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IHRyYWNrLmV4dHJhY3Rvcikge1xuICAgICAgICBjb25zdCBwcmV2aW91c2x5QXR0ZW1wdGVkID0gdGhpcy5nZXRDb250ZXh0KCk/LmJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnMgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW48RXh0cmFjdG9yU3RyZWFtYWJsZT4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvdXJjZUV4dHJhY3RvciAmJiBleHQuaWRlbnRpZmllciA9PT0gc291cmNlRXh0cmFjdG9yLmlkZW50aWZpZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChwcmV2aW91c2x5QXR0ZW1wdGVkLmhhcyhleHQuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgcHJldmlvdXNseUF0dGVtcHRlZC5hZGQoZXh0LmlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleHQuYnJpZGdlKHRyYWNrLCBzb3VyY2VFeHRyYWN0b3IpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KVxuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfQlJJREdFX0ZBSUxFRChcbiAgICAgICAgICAgICAgICB0aGlzLmdldEV4ZWN1dGlvbklkKCksXG4gICAgICAgICAgICAgICAgcmVzdWx0Py5lcnJvcj8uc3RhY2sgfHwgcmVzdWx0Py5lcnJvcj8ubWVzc2FnZSB8fCAnTm8gZXh0cmFjdG9ycyBhdmFpbGFibGUgdG8gYnJpZGdlJyxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IHJlc3VsdC5leHRyYWN0b3I7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGJyaWRnZSBmcm9tIHRoZSBzcGVjaWZpZWQgZXh0cmFjdG9yXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZXF1ZXN0IGJyaWRnZSBmb3JcbiAgICAgKiBAcGFyYW0gc291cmNlRXh0cmFjdG9yIFRoZSBzb3VyY2UgZXh0cmFjdG9yIG9mIHRoZSB0cmFja1xuICAgICAqIEBwYXJhbSB0YXJnZXRFeHRyYWN0b3IgVGhlIHRhcmdldCBleHRyYWN0b3IgdG8gYnJpZGdlIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJlcXVlc3RCcmlkZ2VGcm9tKFxuICAgICAgICB0cmFjazogVHJhY2ssXG4gICAgICAgIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwsXG4gICAgICAgIHRhcmdldEV4dHJhY3RvcjogRXh0cmFjdG9yUmVzb2x2YWJsZSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlKHRhcmdldEV4dHJhY3Rvcik7XG4gICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRhcmdldC5icmlkZ2UodHJhY2ssIHNvdXJjZUV4dHJhY3Rvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgZXh0cmFjdG9yIGlzIGRpc2FibGVkXG4gICAgICovXG4gICAgcHVibGljIGlzRGlzYWJsZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllci5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoaWRlbnRpZmllcikgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgZXh0cmFjdG9yIGlzIGVuYWJsZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFbmFibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gIXRoaXMuaXNEaXNhYmxlZChpZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGV4dHJhY3RvciBpZGVudGlmaWVyXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFeHRyYWN0b3JSZXNvbHZhYmxlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycgPyByZXNvbHZhYmxlIDogcmVzb2x2YWJsZS5pZGVudGlmaWVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgZXh0cmFjdG9yXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmUocmVzb2x2YWJsZTogRXh0cmFjdG9yUmVzb2x2YWJsZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gdGhpcy5nZXQocmVzb2x2YWJsZSkgOiByZXNvbHZhYmxlO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VCA9IHVua25vd24+IHtcbiAgICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3I7XG4gICAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbiAgICByZXN1bHQ6IFQ7XG59XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvckV4ZWN1dGlvbkZOPFQgPSB1bmtub3duPiA9IChleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpID0+IFByb21pc2U8VCB8IGJvb2xlYW4+O1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JSZXNvbHZhYmxlID0gc3RyaW5nIHwgQmFzZUV4dHJhY3RvcjtcbiIsICJpbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSB1bnNhZmUgPSBhbnk7XG5cbi8qKlxuICogVGhlIHJlY2VpdmVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY29udGV4dCBpcyBwcm92aWRlZFxuICovXG5leHBvcnQgdHlwZSBDb250ZXh0UmVjZWl2ZXI8Uj4gPSAoKSA9PiBSO1xuXG5leHBvcnQgY2xhc3MgQ29udGV4dDxUPiB7XG4gICAgcHJpdmF0ZSBzdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFQ+KCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBkZWZhdWx0VmFsdWU/OiBUKSB7fVxuXG4gICAgLyoqXG4gICAgICogRXhpdCBvdXQgb2YgdGhpcyBjb250ZXh0XG4gICAgICovXG4gICAgcHVibGljIGV4aXQoc2NvcGU6IENvbnRleHRSZWNlaXZlcjx2b2lkPikge1xuICAgICAgICB0aGlzLnN0b3JhZ2UuZXhpdChzY29wZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgY29udGV4dCBpcyBsb3N0XG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0xvc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZ2V0U3RvcmUoKSA9PT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY29udGV4dC4gSWYgdGhlIGNvbnRleHQgaXMgbG9zdCBhbmQgbm8gZGVmYXVsdCB2YWx1ZSBpcyBwcm92aWRlZCwgdW5kZWZpbmVkIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN1bWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnN0b3JhZ2UuZ2V0U3RvcmUoKTtcblxuICAgICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTtcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW4gYSBmdW5jdGlvbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBwcm92aWRlclxuICAgICAqL1xuICAgIHB1YmxpYyBwcm92aWRlPFIgPSB1bnNhZmU+KHZhbHVlOiBULCByZWNlaXZlcjogQ29udGV4dFJlY2VpdmVyPFI+KTogUiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgdmFsdWUgbWF5IG5vdCBiZSB1bmRlZmluZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVjZWl2ZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGV4dCByZWNlaXZlciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UucnVuKHZhbHVlLCByZWNlaXZlcik7XG4gICAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBjb250ZXh0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBvcHRpb25hbC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvbnRleHRcbiAqIEBleGFtcGxlIGNvbnN0IHVzZXJDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuICpcbiAqICAvLyB0aGUgdmFsdWUgdG8gcHJvdmlkZVxuICogIGNvbnN0IHVzZXIgPSB7XG4gKiAgIGlkOiAxLFxuICogICBuYW1lOiAnSm9obiBEb2UnXG4gKiAgfTtcbiAqXG4gKiAgLy8gcHJvdmlkZSB0aGUgY29udGV4dCB2YWx1ZSB0byB0aGUgcmVjZWl2ZXJcbiAqICBjb250ZXh0LnByb3ZpZGUodXNlciwgaGFuZGxlcik7XG4gKlxuICogIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gKiAgICAvLyBnZXQgdGhlIGNvbnRleHQgdmFsdWVcbiAqICAgIGNvbnN0IHsgaWQsIG5hbWUgfSA9IHVzZUNvbnRleHQoY29udGV4dCk7XG4gKlxuICogICAgY29uc29sZS5sb2coaWQsIG5hbWUpOyAvLyAxLCBKb2huIERvZVxuICogIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VCA9IHVuc2FmZT4oZGVmYXVsdFZhbHVlPzogVCk6IENvbnRleHQ8VD4ge1xuICAgIHJldHVybiBuZXcgQ29udGV4dChkZWZhdWx0VmFsdWUpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY29udGV4dC4gSWYgdGhlIGNvbnRleHQgaXMgbG9zdCBhbmQgbm8gZGVmYXVsdCB2YWx1ZSBpcyBwcm92aWRlZCwgdW5kZWZpbmVkIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBnZXQgdGhlIHZhbHVlIGZyb21cbiAqIEBleGFtcGxlIGNvbnN0IHZhbHVlID0gdXNlQ29udGV4dChjb250ZXh0KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRleHQ8VCA9IHVuc2FmZT4oY29udGV4dDogQ29udGV4dDxUPik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjb250ZXh0LmNvbnN1bWUoKTtcbn1cbiIsICJpbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCB1bmtub3duPigpO1xuIiwgImltcG9ydCB7IGdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi9fY29udGFpbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbFJlZ2lzdHJ5KCkge1xuICAgIHJldHVybiBnbG9iYWxSZWdpc3RyeTtcbn1cbiIsICJpbXBvcnQgeyBHdWlsZCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCB9IGZyb20gJy4vY29udGV4dC9hc3luYy1jb250ZXh0JztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuZXhwb3J0IGludGVyZmFjZSBIb29rc0N0eCB7XG4gICAgZ3VpbGQ6IEd1aWxkO1xufVxuXG5leHBvcnQgY29uc3QgU1VQRVJfQ09OVEVYVCA9IGNyZWF0ZUNvbnRleHQ8UGxheWVyPigpO1xuXG5jb25zdCBnZXRGYWxsYmFja0NvbnRleHQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW3BsYXllcl0nKSBhcyBQbGF5ZXIgfCB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIb29rc0NvbnRleHQoaG9va05hbWU6IHN0cmluZywgbWFpbk9ubHkgPSBmYWxzZSkge1xuICAgIGxldCBpc0ZhbGxiYWNrID0gZmFsc2U7XG5cbiAgICBsZXQgcGxheWVyOiBQbGF5ZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIShwbGF5ZXIgPSBTVVBFUl9DT05URVhULmNvbnN1bWUoKSkpIHtcbiAgICAgICAgcGxheWVyID0gZ2V0RmFsbGJhY2tDb250ZXh0KCk7XG4gICAgICAgIGlzRmFsbGJhY2sgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghcGxheWVyKVxuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTihcbiAgICAgICAgICAgICdkaXNjb3JkLXBsYXllcicsXG4gICAgICAgICAgICAnUGxheWVyIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSwgaXMgaXQgYmVpbmcgY2FsbGVkIGluc2lkZSA8UGxheWVyPi5jb250ZXh0LnByb3ZpZGUoKT8nLFxuICAgICAgICApO1xuXG4gICAgaWYgKG1haW5Pbmx5KSByZXR1cm4geyBwbGF5ZXIsIGNvbnRleHQ6IHt9IGFzIEhvb2tzQ3R4LCBpc0ZhbGxiYWNrIH07XG5cbiAgICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChwbGF5ZXIuY29udGV4dCk7XG4gICAgaWYgKCFjb250ZXh0KVxuICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTihcbiAgICAgICAgICAgIGhvb2tOYW1lLFxuICAgICAgICAgICAgYCR7aG9va05hbWV9IG11c3QgYmUgY2FsbGVkIGluc2lkZSBhIHBsYXllciBjb250ZXh0IGNyZWF0ZWQgYnkgPFBsYXllcj4uY29udGV4dC5wcm92aWRlKClgLFxuICAgICAgICApO1xuXG4gICAgcmV0dXJuIHsgY29udGV4dCwgcGxheWVyLCBpc0ZhbGxiYWNrIH07XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnksIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIGhpc3RvcnlcbiAqIEBwYXJhbSBub2RlIGd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KG5vZGU/OiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+IHwgbnVsbCB7XG4gICAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlSGlzdG9yeScpO1xuXG4gICAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxNZXRhPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHF1ZXVlLmhpc3Rvcnk7XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUsIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIHBsYXllciBub2RlXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4obm9kZT86IE5vZGVSZXNvbHZhYmxlKTogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsIHtcbiAgICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VQbGF5ZXInKTtcbiAgICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0PE1ldGE+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gcXVldWUubm9kZTtcbn1cbiIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZS5cbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZS4gRGVmYXVsdHMgdG8gaW5mZXJyZWQgZ3VpbGQgZnJvbSBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPihub2RlPzogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbCB7XG4gICAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlUXVldWUnKTtcbiAgICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMucmVzb2x2ZTxNZXRhPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHF1ZXVlO1xufVxuIiwgImltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBtYWluIHBsYXllciBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWFpblBsYXllcigpIHtcbiAgICBjb25zdCB7IHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VNYWluUGxheWVyJywgdHJ1ZSk7XG5cbiAgICByZXR1cm4gcGxheWVyO1xufVxuIiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbmV4cG9ydCB0eXBlIFNldHRlckZOPFQsIFA+ID0gKHByZXZpb3VzOiBQKSA9PiBUO1xuZXhwb3J0IHR5cGUgTWV0YWRhdGFEaXNwYXRjaDxUPiA9IHJlYWRvbmx5IFsoKSA9PiBULCAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4gdm9pZF07XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBndWlsZCBxdWV1ZSBtZXRhZGF0YVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNZXRhZGF0YTxUID0gdW5rbm93bj4oKTogTWV0YWRhdGFEaXNwYXRjaDxUPjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VNZXRhZGF0YTxUID0gdW5rbm93bj4obm9kZT86IE5vZGVSZXNvbHZhYmxlKTogTWV0YWRhdGFEaXNwYXRjaDxUPiB7XG4gICAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlTWV0YWRhdGEnKTtcbiAgICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0PFQ+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gICAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICAgICAgaWYgKHF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihtZXRhZGF0YSkpIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtnZXR0ZXIsIHNldHRlcl0gYXMgY29uc3Q7XG59XG4iLCAiaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUsIFBsYXllclRpbWVzdGFtcCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zIHtcbiAgICBpZ25vcmVGaWx0ZXJzOiBib29sZWFuO1xuICAgIG5vZGU6IE5vZGVSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVUaW1lbGluZSB7XG4gICAgcmVhZG9ubHkgdGltZXN0YW1wOiBQbGF5ZXJUaW1lc3RhbXA7XG4gICAgcmVhZG9ubHkgdm9sdW1lOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgcGF1c2VkOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHRyYWNrOiBUcmFjazx1bmtub3duPiB8IG51bGw7XG4gICAgcGF1c2UoKTogYm9vbGVhbjtcbiAgICByZXN1bWUoKTogYm9vbGVhbjtcbiAgICBzZXRWb2x1bWUodm9sOiBudW1iZXIpOiBib29sZWFuO1xuICAgIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBjdXJyZW50IHRyYWNrXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aW1lbGluZSBkaXNwYXRjaGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZSgpOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKG9wdGlvbnM/OiBQYXJ0aWFsPFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnM+KTogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbCB7XG4gICAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlVGltZWxpbmUnKTtcbiAgICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0KG9wdGlvbnM/Lm5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB0aW1lbGluZSA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7XG4gICAgICAgIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAob3B0aW9ucz8uaWdub3JlRmlsdGVycykhO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUudm9sdW1lO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgcGF1c2VkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuaXNQYXVzZWQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHRyYWNrKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICAgICAgfSxcbiAgICAgICAgcGF1c2UoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5wYXVzZSgpO1xuICAgICAgICB9LFxuICAgICAgICByZXN1bWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5yZXN1bWUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sKTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgc2V0UG9zaXRpb24odGltZTogbnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVldWUubm9kZS5zZWVrKHRpbWUpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRpbWVsaW5lO1xufVxuIiwgImltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vcXVldWUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFmdGVyQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn1cbiIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9xdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkJlZm9yZUNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn1cbiIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG50eXBlIFNldHRlckZOID0gKHByZXZpb3VzOiBudW1iZXIpID0+IG51bWJlcjtcbnR5cGUgVm9sdW1lRGlzcGF0Y2ggPSByZWFkb25seSBbKCkgPT4gbnVtYmVyLCAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZF07XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBwbGF5ZXIgdm9sdW1lXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZSgpOiBWb2x1bWVEaXNwYXRjaDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUobm9kZT86IE5vZGVSZXNvbHZhYmxlKTogVm9sdW1lRGlzcGF0Y2gge1xuICAgIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVZvbHVtZScpO1xuICAgIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQobm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgICBjb25zdCBzZXR0ZXIgPSAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4ge1xuICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKHZvbHVtZSkpIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUocXVldWUubm9kZS52b2x1bWUpKTtcbiAgICAgICAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHF1ZXVlPy5ub2RlLnZvbHVtZSBhcyBudW1iZXI7XG4gICAgfTtcblxuICAgIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufVxuIiwgImltcG9ydCB7IEVxdWFsaXplckJhbmQsIFBDTUZpbHRlcnMsIEJpcXVhZEZpbHRlcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSwgUXVldWVSZXBlYXRNb2RlIH0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gdW5rbm93bj4ge1xuICAgIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgICB2b2x1bWU/OiBudW1iZXI7XG4gICAgZXF1YWxpemVyPzogRXF1YWxpemVyQmFuZFtdO1xuICAgIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdO1xuICAgIGJpcXVhZD86IEJpcXVhZEZpbHRlcnM7XG4gICAgcmVzYW1wbGVyPzogbnVtYmVyO1xuICAgIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtPzogT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICAgIGxlYXZlT25FbXB0eT86IGJvb2xlYW47XG4gICAgbGVhdmVPbkVtcHR5Q29vbGRvd24/OiBudW1iZXI7XG4gICAgbGVhdmVPbkVuZD86IGJvb2xlYW47XG4gICAgbGVhdmVPbkVuZENvb2xkb3duPzogbnVtYmVyO1xuICAgIGxlYXZlT25TdG9wPzogYm9vbGVhbjtcbiAgICBsZWF2ZU9uU3RvcENvb2xkb3duPzogbnVtYmVyO1xuICAgIG1ldGFkYXRhPzogVCB8IG51bGw7XG4gICAgc2VsZkRlYWY/OiBib29sZWFuO1xuICAgIGNvbm5lY3Rpb25UaW1lb3V0PzogbnVtYmVyO1xuICAgIGRlZmF1bHRGRm1wZWdGaWx0ZXJzPzogRmlsdGVyc05hbWVbXTtcbiAgICBidWZmZXJpbmdUaW1lb3V0PzogbnVtYmVyO1xuICAgIG5vRW1pdEluc2VydD86IGJvb2xlYW47XG4gICAgbWF4U2l6ZT86IG51bWJlcjtcbiAgICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE/OiBib29sZWFuO1xuICAgIGRpc2FibGVWb2x1bWU/OiBib29sZWFuO1xuICAgIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICAgIGRpc2FibGVGaWx0ZXJlcj86IGJvb2xlYW47XG4gICAgZGlzYWJsZUJpcXVhZD86IGJvb2xlYW47XG4gICAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gICAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG5leHBvcnQgY2xhc3MgR3VpbGROb2RlTWFuYWdlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjYWNoZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZT4oKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGd1aWxkIHF1ZXVlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSwgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KTogR3VpbGRRdWV1ZTxUPiB7XG4gICAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRCgnSW52YWxpZCBvciB1bmtub3duIGd1aWxkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWNoZS5oYXMoc2VydmVyLmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHNlcnZlci5pZCkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICAgICAgb3B0aW9ucy52b2x1bWUgPz89IDEwMDtcbiAgICAgICAgb3B0aW9ucy5lcXVhbGl6ZXIgPz89IFtdO1xuICAgICAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25FbmQgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duID8/PSAwO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgICAgICBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24gPz89IDA7XG4gICAgICAgIG9wdGlvbnMucmVzYW1wbGVyID8/PSA0ODAwMDtcbiAgICAgICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICAgICAgb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dDtcbiAgICAgICAgb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0ID8/PSAxMDAwO1xuICAgICAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICAgICAgb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuICAgICAgICAvLyB0b2RvKHR3bGl0ZSk6IG1heWJlIGRpc2FibGUgdGhlc2UgYnkgZGVmYXVsdD9cbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlQmlxdWFkID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICAgICAgb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVWb2x1bWUgPz89IGZhbHNlO1xuICAgICAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtID8/PSBmYWxzZTtcblxuICAgICAgICBpZiAoZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJykgJiYgIW9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pIHtcbiAgICAgICAgICAgIG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBnZXRHbG9iYWxSZWdpc3RyeSgpLmdldChcbiAgICAgICAgICAgICAgICAnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nLFxuICAgICAgICAgICAgKSBhcyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSAmJiAhb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0gPSBnZXRHbG9iYWxSZWdpc3RyeSgpLmdldChcbiAgICAgICAgICAgICAgICAnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScsXG4gICAgICAgICAgICApIGFzIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVldWUgPSBuZXcgR3VpbGRRdWV1ZTxUPih0aGlzLnBsYXllciwge1xuICAgICAgICAgICAgZ3VpbGQ6IHNlcnZlcixcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3k6IG9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICAgICAgICB2b2x1bWU6IG9wdGlvbnMudm9sdW1lLFxuICAgICAgICAgICAgZXF1YWxpemVyOiBvcHRpb25zLmVxdWFsaXplcixcbiAgICAgICAgICAgIGZpbHRlcmVyOiBvcHRpb25zLmFfZmlsdGVyLFxuICAgICAgICAgICAgYmlxdWFkOiBvcHRpb25zLmJpcXVhZCxcbiAgICAgICAgICAgIHJlc2FtcGxlcjogb3B0aW9ucy5yZXNhbXBsZXIsXG4gICAgICAgICAgICBkaXNhYmxlSGlzdG9yeTogb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSxcbiAgICAgICAgICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtLFxuICAgICAgICAgICAgb25BZnRlckNyZWF0ZVN0cmVhbTogb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtLFxuICAgICAgICAgICAgcmVwZWF0TW9kZTogb3B0aW9ucy5yZXBlYXRNb2RlLFxuICAgICAgICAgICAgbGVhdmVPbkVtcHR5OiBvcHRpb25zLmxlYXZlT25FbXB0eSxcbiAgICAgICAgICAgIGxlYXZlT25FbXB0eUNvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duLFxuICAgICAgICAgICAgbGVhdmVPbkVuZDogb3B0aW9ucy5sZWF2ZU9uRW5kLFxuICAgICAgICAgICAgbGVhdmVPbkVuZENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93bixcbiAgICAgICAgICAgIGxlYXZlT25TdG9wOiBvcHRpb25zLmxlYXZlT25TdG9wLFxuICAgICAgICAgICAgbGVhdmVPblN0b3BDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uU3RvcENvb2xkb3duLFxuICAgICAgICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgICAgICAgc2VsZkRlYWY6IG9wdGlvbnMuc2VsZkRlYWYsXG4gICAgICAgICAgICBmZm1wZWdGaWx0ZXJzOiBvcHRpb25zLmRlZmF1bHRGRm1wZWdGaWx0ZXJzID8/IFtdLFxuICAgICAgICAgICAgYnVmZmVyaW5nVGltZW91dDogb3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0LFxuICAgICAgICAgICAgbm9FbWl0SW5zZXJ0OiBvcHRpb25zLm5vRW1pdEluc2VydCA/PyBmYWxzZSxcbiAgICAgICAgICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YTogb3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGEsXG4gICAgICAgICAgICBtYXhIaXN0b3J5U2l6ZTogb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSxcbiAgICAgICAgICAgIG1heFNpemU6IG9wdGlvbnMubWF4U2l6ZSxcbiAgICAgICAgICAgIHBhdXNlT25FbXB0eTogb3B0aW9ucy5wYXVzZU9uRW1wdHksXG4gICAgICAgICAgICBkaXNhYmxlQmlxdWFkOiBvcHRpb25zLmRpc2FibGVCaXF1YWQsXG4gICAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiBvcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICAgICAgICBkaXNhYmxlRmlsdGVyZXI6IG9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyLFxuICAgICAgICAgICAgZGlzYWJsZVJlc2FtcGxlcjogb3B0aW9ucy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgICAgZGlzYWJsZVZvbHVtZTogb3B0aW9ucy5kaXNhYmxlVm9sdW1lLFxuICAgICAgICAgICAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtOiBvcHRpb25zLmRpc2FibGVGYWxsYmFja1N0cmVhbSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoc2VydmVyLmlkLCBxdWV1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHF1ZXVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBleGlzdGluZyBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0PFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICAgICAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLmNhY2hlLmdldChxdWV1ZS5pZCkgYXMgR3VpbGRRdWV1ZTxUPikgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIHF1ZXVlIGV4aXN0c1xuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IGlkID0gbm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUgPyBub2RlLmlkIDogdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5oYXMoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgICAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19HVUlMRF9RVUVVRSgnQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RpbmcgcXVldWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG4gICAgICAgIHF1ZXVlLm5vZGUuc3RvcCh0cnVlKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBxdWV1ZS5jb25uZWN0aW9uPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgcXVldWUuZGlzcGF0Y2hlcj8ucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHF1ZXVlLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcXVldWUudGltZW91dHMuZm9yRWFjaCgodG0pID0+IGNsZWFyVGltZW91dCh0bSkpO1xuICAgICAgICBxdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgICAgIHF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmRlbGV0ZShxdWV1ZS5pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZTxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBHdWlsZFF1ZXVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpISkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIHF1ZXVlIGlkXG4gICAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlSWQobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICAgICAgY29uc3QgcSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICAgICAgcmV0dXJuIHE/LmlkIHx8IG51bGw7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFBsYXllciwgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucywgVHJhY2tMaWtlIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IENoYW5uZWxUeXBlLCBHdWlsZCwgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBWb2ljZUJhc2VkQ2hhbm5lbCwgVm9pY2VTdGF0ZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWUsIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgQmlxdWFkRmlsdGVycywgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi4vVm9pY2VJbnRlcmZhY2UvU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyB0eXBlIEF1ZGlvUGxheWVyLCBBdWRpb1Jlc291cmNlLCBTdHJlYW1UeXBlLCBWb2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cyB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi9HdWlsZFF1ZXVlSGlzdG9yeSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlUGxheWVyTm9kZSwgU3RyZWFtQ29uZmlnIH0gZnJvbSAnLi9HdWlsZFF1ZXVlUGxheWVyTm9kZSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZVJlcGVhdE1vZGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVN0YXRpc3RpY3MgfSBmcm9tICcuL0d1aWxkUXVldWVTdGF0aXN0aWNzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBTeW5jZWRMeXJpY3NQcm92aWRlciB9IGZyb20gJy4vU3luY2VkTHlyaWNzUHJvdmlkZXInO1xuaW1wb3J0IHsgTHJjR2V0UmVzdWx0LCBMcmNTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9scmNsaWIvTHJjTGliJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZE5vZGVJbml0PE1ldGEgPSB1bmtub3duPiB7XG4gICAgZ3VpbGQ6IEd1aWxkO1xuICAgIHF1ZXVlU3RyYXRlZ3k6IFF1ZXVlU3RyYXRlZ3k7XG4gICAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICAgIHZvbHVtZTogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICBiaXF1YWQ6IEJpcXVhZEZpbHRlcnMgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgICBmaWx0ZXJlcjogUENNRmlsdGVyc1tdIHwgYm9vbGVhbjtcbiAgICBmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdO1xuICAgIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICAgIG9uQmVmb3JlQ3JlYXRlU3RyZWFtPzogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICAgIGxlYXZlT25FbXB0eTogYm9vbGVhbjtcbiAgICBsZWF2ZU9uRW1wdHlDb29sZG93bjogbnVtYmVyO1xuICAgIGxlYXZlT25FbmQ6IGJvb2xlYW47XG4gICAgbGVhdmVPbkVuZENvb2xkb3duOiBudW1iZXI7XG4gICAgbGVhdmVPblN0b3A6IGJvb2xlYW47XG4gICAgbGVhdmVPblN0b3BDb29sZG93bjogbnVtYmVyO1xuICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXI7XG4gICAgc2VsZkRlYWY/OiBib29sZWFuO1xuICAgIG1ldGFkYXRhPzogTWV0YSB8IG51bGw7XG4gICAgYnVmZmVyaW5nVGltZW91dDogbnVtYmVyO1xuICAgIG5vRW1pdEluc2VydDogYm9vbGVhbjtcbiAgICBtYXhTaXplPzogbnVtYmVyO1xuICAgIG1heEhpc3RvcnlTaXplPzogbnVtYmVyO1xuICAgIHByZWZlckJyaWRnZWRNZXRhZGF0YTogYm9vbGVhbjtcbiAgICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICAgIGRpc2FibGVWb2x1bWU6IGJvb2xlYW47XG4gICAgZGlzYWJsZUVxdWFsaXplcjogYm9vbGVhbjtcbiAgICBkaXNhYmxlRmlsdGVyZXI6IGJvb2xlYW47XG4gICAgZGlzYWJsZUJpcXVhZDogYm9vbGVhbjtcbiAgICBkaXNhYmxlUmVzYW1wbGVyOiBib29sZWFuO1xuICAgIGRpc2FibGVGYWxsYmFja1N0cmVhbTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUNvbm5lY3RDb25maWcge1xuICAgIGRlYWY/OiBib29sZWFuO1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgZ3JvdXA/OiBzdHJpbmc7XG4gICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3N0UHJvY2Vzc2VkUmVzdWx0IHtcbiAgICBzdHJlYW06IFJlYWRhYmxlO1xuICAgIHR5cGU6IFN0cmVhbVR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChcbiAgICB0cmFjazogVHJhY2ssXG4gICAgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUsXG4gICAgcXVldWU6IEd1aWxkUXVldWUsXG4pID0+IFByb21pc2U8UmVhZGFibGUgfCBudWxsPjtcbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gKHN0cmVhbTogUmVhZGFibGUsIHF1ZXVlOiBHdWlsZFF1ZXVlKSA9PiBQcm9taXNlPFBvc3RQcm9jZXNzZWRSZXN1bHQgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHJpZ2dlcmVkUmVhc29uID0gJ2ZpbHRlcnMnIHwgJ25vcm1hbCc7XG5cbmV4cG9ydCBjb25zdCBHdWlsZFF1ZXVlRXZlbnQgPSB7XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgICBBdWRpb1RyYWNrQWRkOiAnYXVkaW9UcmFja0FkZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIGF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAgIEF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja1JlbW92ZTogJ2F1ZGlvVHJhY2tSZW1vdmUnLFxuICAgIEF1ZGlvVHJhY2tSZW1vdmU6ICdhdWRpb1RyYWNrUmVtb3ZlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgYXVkaW9UcmFja3NSZW1vdmU6ICdhdWRpb1RyYWNrc1JlbW92ZScsXG4gICAgQXVkaW9UcmFja3NSZW1vdmU6ICdhdWRpb1RyYWNrc1JlbW92ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAgICovXG4gICAgY29ubmVjdGlvbjogJ2Nvbm5lY3Rpb24nLFxuICAgIENvbm5lY3Rpb246ICdjb25uZWN0aW9uJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgICAqL1xuICAgIGNvbm5lY3Rpb25EZXN0cm95ZWQ6ICdjb25uZWN0aW9uRGVzdHJveWVkJyxcbiAgICBDb25uZWN0aW9uRGVzdHJveWVkOiAnY29ubmVjdGlvbkRlc3Ryb3llZCcsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0OiAnZGlzY29ubmVjdCcsXG4gICAgRGlzY29ubmVjdDogJ2Rpc2Nvbm5lY3QnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAgICovXG4gICAgZGVidWc6ICdkZWJ1ZycsXG4gICAgRGVidWc6ICdkZWJ1ZycsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBlbmNvdW50ZXJzIGVycm9yXG4gICAgICovXG4gICAgZXJyb3I6ICdlcnJvcicsXG4gICAgRXJyb3I6ICdlcnJvcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICovXG4gICAgZW1wdHlDaGFubmVsOiAnZW1wdHlDaGFubmVsJyxcbiAgICBFbXB0eUNoYW5uZWw6ICdlbXB0eUNoYW5uZWwnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICAgKi9cbiAgICBlbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gICAgRW1wdHlRdWV1ZTogJ2VtcHR5UXVldWUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHN0YXJ0cyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJTdGFydDogJ3BsYXllclN0YXJ0JyxcbiAgICBQbGF5ZXJTdGFydDogJ3BsYXllclN0YXJ0JyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBlcnJvcnMgd2hpbGUgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcGxheWVyRXJyb3I6ICdwbGF5ZXJFcnJvcicsXG4gICAgUGxheWVyRXJyb3I6ICdwbGF5ZXJFcnJvcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICovXG4gICAgcGxheWVyRmluaXNoOiAncGxheWVyRmluaXNoJyxcbiAgICBQbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwbGF5ZXJTa2lwOiAncGxheWVyU2tpcCcsXG4gICAgUGxheWVyU2tpcDogJ3BsYXllclNraXAnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgICAqL1xuICAgIHBsYXllclRyaWdnZXI6ICdwbGF5ZXJUcmlnZ2VyJyxcbiAgICBQbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICovXG4gICAgdm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnLFxuICAgIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdm9sdW1lIGlzIHVwZGF0ZWRcbiAgICAgKi9cbiAgICB2b2x1bWVDaGFuZ2U6ICd2b2x1bWVDaGFuZ2UnLFxuICAgIFZvbHVtZUNoYW5nZTogJ3ZvbHVtZUNoYW5nZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHBsYXllciBpcyBwYXVzZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgICBQbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHJlc3VtZWRcbiAgICAgKi9cbiAgICBwbGF5ZXJSZXN1bWU6ICdwbGF5ZXJSZXN1bWUnLFxuICAgIFBsYXllclJlc3VtZTogJ3BsYXllclJlc3VtZScsXG4gICAgLyoqXG4gICAgICogQmlxdWFkIEZpbHRlcnMgVXBkYXRlXG4gICAgICovXG4gICAgYmlxdWFkRmlsdGVyc1VwZGF0ZTogJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAgIEJpcXVhZEZpbHRlcnNVcGRhdGU6ICdiaXF1YWRGaWx0ZXJzVXBkYXRlJyxcbiAgICAvKipcbiAgICAgKiBFcXVhbGl6ZXIgVXBkYXRlXG4gICAgICovXG4gICAgZXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgICBFcXVhbGl6ZXJVcGRhdGU6ICdlcXVhbGl6ZXJVcGRhdGUnLFxuICAgIC8qKlxuICAgICAqIERTUCB1cGRhdGVcbiAgICAgKi9cbiAgICBkc3BVcGRhdGU6ICdkc3BVcGRhdGUnLFxuICAgIERTUFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gICAgLyoqXG4gICAgICogQXVkaW8gRmlsdGVycyBVcGRhdGVcbiAgICAgKi9cbiAgICBhdWRpb0ZpbHRlcnNVcGRhdGU6ICdhdWRpb0ZpbHRlcnNVcGRhdGUnLFxuICAgIEF1ZGlvRmlsdGVyc1VwZGF0ZTogJ2F1ZGlvRmlsdGVyc1VwZGF0ZScsXG4gICAgLyoqXG4gICAgICogQXVkaW8gcGxheWVyIHdpbGwgcGxheSBuZXh0IHRyYWNrXG4gICAgICovXG4gICAgd2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAgIFdpbGxQbGF5VHJhY2s6ICd3aWxsUGxheVRyYWNrJyxcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHJlcG9wdWxhdGVkXG4gICAgICovXG4gICAgY2hhbm5lbFBvcHVsYXRlOiAnY2hhbm5lbFBvcHVsYXRlJyxcbiAgICBDaGFubmVsUG9wdWxhdGU6ICdjaGFubmVsUG9wdWxhdGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAgICovXG4gICAgcXVldWVDcmVhdGU6ICdxdWV1ZUNyZWF0ZScsXG4gICAgUXVldWVDcmVhdGU6ICdxdWV1ZUNyZWF0ZScsXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgZGVsZXRlZFxuICAgICAqL1xuICAgIHF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAgIFF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHRyeWluZyB0byBhZGQgc2ltaWxhciB0cmFjayBmb3IgYXV0b3BsYXlcbiAgICAgKi9cbiAgICB3aWxsQXV0b1BsYXk6ICd3aWxsQXV0b1BsYXknLFxuICAgIFdpbGxBdXRvUGxheTogJ3dpbGxBdXRvUGxheScsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBHdWlsZFF1ZXVlRXZlbnQgPSAodHlwZW9mIEd1aWxkUXVldWVFdmVudClba2V5b2YgdHlwZW9mIEd1aWxkUXVldWVFdmVudF07XG5cbmV4cG9ydCBlbnVtIFRyYWNrU2tpcFJlYXNvbiB7XG4gICAgTm9TdHJlYW0gPSAnRVJSX05PX1NUUkVBTScsXG4gICAgTWFudWFsID0gJ01BTlVBTCcsXG4gICAgU0VFS19PVkVSX1RIUkVTSE9MRCA9ICdTRUVLX09WRVJfVEhSRVNIT0xEJyxcbiAgICBKdW1wID0gJ0pVTVBFRF9UT19BTk9USEVSX1RSQUNLJyxcbiAgICBTa2lwVG8gPSAnU0tJUF9UT19BTk9USEVSX1RSQUNLJyxcbiAgICBIaXN0b3J5TmV4dCA9ICdISVNUT1JZX05FWFRfVFJBQ0snLFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSBhbnk+IHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFja3MgYXJyYXlcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2tbXSkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tSZW1vdmVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFjaykgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIHRyYWNrOiBUcmFja1tdKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbkRlc3Ryb3llZF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5EZWJ1Z106IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgbWVzc2FnZTogc3RyaW5nKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LkVycm9yXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCBlcnJvcjogRXJyb3IpID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5FbXB0eUNoYW5uZWxdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTdGFydF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgdHJhY2s6IFRyYWNrKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvcl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yLCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRmluaXNoXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2spID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgc2tpcHBlZFxuICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3Igc2tpcHBpbmdcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIGZvciBza2lwcGluZ1xuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcF06IChcbiAgICAgICAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gICAgICAgIHRyYWNrOiBUcmFjayxcbiAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgd2hpY2ggd2FzIHBsYXllZCBpbiB0aGlzIGV2ZW50XG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJUcmlnZ2VyXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LCB0cmFjazogVHJhY2ssIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2Ugc3RhdGUgaXMgdXBkYXRlZC4gQ29uc3VtaW5nIHRoaXMgZXZlbnQgbWF5IGRpc2FibGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlciBpZiBgUGxheWVyLmlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKWAgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAgICogQHBhcmFtIG5ld1N0YXRlIFRoZSBuZXcgdm9pY2Ugc3RhdGVcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LlZvaWNlU3RhdGVVcGRhdGVdOiAoXG4gICAgICAgIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICAgICAgICBvbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbiAgICAgICAgbmV3U3RhdGU6IFZvaWNlU3RhdGUsXG4gICAgKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIgaXMgcGF1c2VkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJQYXVzZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHJlc3VtZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyJ3Mgdm9sdW1lIGlzIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkVm9sdW1lIFRoZSBvbGQgdm9sdW1lXG4gICAgICogQHBhcmFtIG5ld1ZvbHVtZSBUaGUgdXBkYXRlZCB2b2x1bWVcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LlZvbHVtZUNoYW5nZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgb2xkVm9sdW1lOiBudW1iZXIsIG5ld1ZvbHVtZTogbnVtYmVyKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBlcXVhbGl6ZXIgY29uZmlnIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5FcXVhbGl6ZXJVcGRhdGVdOiAoXG4gICAgICAgIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICAgICAgICBvbGRGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10sXG4gICAgICAgIG5ld0ZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSxcbiAgICApID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGJpcXVhZCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5CaXF1YWRGaWx0ZXJzVXBkYXRlXTogKFxuICAgICAgICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgICAgICAgb2xkRmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwsXG4gICAgICAgIG5ld0ZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsLFxuICAgICkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZHNwIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LkRTUFVwZGF0ZV06IChcbiAgICAgICAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gICAgICAgIG9sZEZpbHRlcnM6IFBDTUZpbHRlcnNbXSxcbiAgICAgICAgbmV3RmlsdGVyczogUENNRmlsdGVyc1tdLFxuICAgICkgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gZmZtcGVnIGF1ZGlvIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvRmlsdGVyc1VwZGF0ZV06IChcbiAgICAgICAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gICAgICAgIG9sZEZpbHRlcnM6IEZpbHRlcnNOYW1lW10sXG4gICAgICAgIG5ld0ZpbHRlcnM6IEZpbHRlcnNOYW1lW10sXG4gICAgKSA9PiB1bmtub3duO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgc3RyZWFtaW5nIGFuIGF1ZGlvIHRyYWNrLiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIHRvIG1vZGlmeSBzdHJlYW0gY29uZmlnIGJlZm9yZSBwbGF5aW5nIGEgdHJhY2suXG4gICAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3aWxsIGJlIHN0cmVhbWVkXG4gICAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbFBsYXlUcmFja106IChcbiAgICAgICAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gICAgICAgIHRyYWNrOiBUcmFjazx1bmtub3duPixcbiAgICAgICAgY29uZmlnOiBTdHJlYW1Db25maWcsXG4gICAgICAgIGRvbmU6ICgpID0+IHZvaWQsXG4gICAgKSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcG9wdWxhdGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5DaGFubmVsUG9wdWxhdGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICAgKi9cbiAgICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBkZWxldGVkXG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICovXG4gICAgW0d1aWxkUXVldWVFdmVudC5RdWV1ZURlbGV0ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyB0cnlpbmcgdG8gYWRkIHNpbWlsYXIgdHJhY2sgZm9yIGF1dG9wbGF5XG4gICAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAgICogQHBhcmFtIHRyYWNrcyBUaGUgc2ltaWxhciB0cmFja3MgdGhhdCB3ZXJlIGZvdW5kXG4gICAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgICAqL1xuICAgIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbEF1dG9QbGF5XTogKFxuICAgICAgICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgICAgICAgdHJhY2tzOiBUcmFja1tdLFxuICAgICAgICBkb25lOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZCxcbiAgICApID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlPE1ldGEgPSB1bmtub3duPiB7XG4gICAgI3RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAjZGVsZXRlZCA9IGZhbHNlO1xuICAgICNzaHVmZmxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfX2N1cnJlbnQ6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIHRyYWNrczogUXVldWU8VHJhY2s+O1xuICAgIHB1YmxpYyBoaXN0b3J5ID0gbmV3IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG5vZGUgPSBuZXcgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIGZpbHRlcnMgPSBuZXcgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgb25CZWZvcmVDcmVhdGVTdHJlYW06IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jICgpID0+IG51bGw7XG4gICAgcHVibGljIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKHN0cmVhbSkgPT4gKHtcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhdyxcbiAgICB9KTtcbiAgICBwdWJsaWMgcmVwZWF0TW9kZSA9IFF1ZXVlUmVwZWF0TW9kZS5PRkY7XG4gICAgcHVibGljIHRpbWVvdXRzID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBOb2RlSlMuVGltZW91dD4oKTtcbiAgICBwdWJsaWMgc3RhdHMgPSBuZXcgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YT4odGhpcyk7XG4gICAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICAgIHB1YmxpYyBzeW5jZWRMeXJpY3NQcm92aWRlciA9IG5ldyBTeW5jZWRMeXJpY3NQcm92aWRlcih0aGlzKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIsIHB1YmxpYyBvcHRpb25zOiBHdWlsZE5vZGVJbml0PE1ldGE+KSB7XG4gICAgICAgIHRoaXMudHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPihvcHRpb25zLnF1ZXVlU3RyYXRlZ3kpO1xuICAgICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbihvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtKSkgdGhpcy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW07XG4gICAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkpIHRoaXMub25BZnRlckNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbTtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bGxpc2gob3B0aW9ucy5yZXBlYXRNb2RlKSkgdGhpcy5yZXBlYXRNb2RlID0gb3B0aW9ucy5yZXBlYXRNb2RlO1xuXG4gICAgICAgIG9wdGlvbnMuc2VsZkRlYWYgPz89IHRydWU7XG4gICAgICAgIG9wdGlvbnMubWF4U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgICAgICBvcHRpb25zLnBhdXNlT25FbXB0eSA/Pz0gdHJ1ZTtcblxuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJiAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gdGhpcy5vcHRpb25zLmJpcXVhZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5maWx0ZXJlcikpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKHRoaXMub3B0aW9ucy5yZXNhbXBsZXIpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA9IHRoaXMub3B0aW9ucy5yZXNhbXBsZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heFNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdbR3VpbGROb2RlSW5pdC5tYXhTaXplXScsICdudW1iZXInLCB0eXBlb2Ygb3B0aW9ucy5tYXhTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoXG4gICAgICAgICAgICAgICAgJ1tHdWlsZE5vZGVJbml0Lm1heEhpc3RvcnlTaXplXScsXG4gICAgICAgICAgICAgICAgJ251bWJlcicsXG4gICAgICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMubWF4SGlzdG9yeVNpemUsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4U2l6ZSA8IDEpIG9wdGlvbnMubWF4U2l6ZSA9IEluZmluaXR5O1xuICAgICAgICBpZiAob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA8IDEpIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBJbmZpbml0eTtcblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYEd1aWxkUXVldWUgaW5pdGlhbGl6ZWQgZm9yIGd1aWxkICR7dGhpcy5vcHRpb25zLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLm9wdGlvbnMuZ3VpbGQuaWR9KWApO1xuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnF1ZXVlQ3JlYXRlLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBxdWV1ZSBpbiBtc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zdG9yZS5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLmR1cmF0aW9uTVMsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBkdXJhdGlvbkZvcm1hdHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzeW5jIGx5cmljcyBwcm92aWRlciBmb3IgdGhpcyBxdWV1ZS5cbiAgICAgKiBAZXhhbXBsZSBjb25zdCBseXJpY3MgPSBhd2FpdCBwbGF5ZXIubHlyaWNzLnNlYXJjaCh7IHE6ICdBbGFuIFdhbGtlciBGYWRlZCcgfSk7XG4gICAgICogY29uc3Qgc3luY2VkTHlyaWNzID0gcXVldWUuc3luY2VkTHlyaWNzKGx5cmljc1swXSk7XG4gICAgICogY29uc29sZS5sb2coc3luY2VkTHlyaWNzLmF0KDEwXzAwMCkpO1xuICAgICAqIC8vIHN1YnNjcmliZSB0byBseXJpY3MgY2hhbmdlXG4gICAgICogY29uc3QgdW5zdWJzY3JpYmUgPSBzeW5jZWRMeXJpY3Mub25DaGFuZ2UoKGx5cmljcywgdGltZXN0YW1wKSA9PiB7XG4gICAgICogICAgY29uc29sZS5sb2cobHlyaWNzLCB0aW1lc3RhbXApO1xuICAgICAqIH0pO1xuICAgICAqIC8vIHVuc3Vic2NyaWJlIGZyb20gbHlyaWNzIGNoYW5nZVxuICAgICAqIHVuc3Vic2NyaWJlKCk7IC8vIG9yXG4gICAgICogc3luY2VkTHlyaWNzLnVuc3Vic2NyaWJlKCk7XG4gICAgICovXG4gICAgcHVibGljIHN5bmNlZEx5cmljcyhseXJpY3M6IExyY0dldFJlc3VsdCB8IExyY1NlYXJjaFJlc3VsdCkge1xuICAgICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmxvYWQobHlyaWNzPy5zeW5jZWRMeXJpY3MgPz8gJycpO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZWRMeXJpY3NQcm92aWRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGRlYnVnIG1lc3NhZ2UgdG8gdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBtIFRoZSBtZXNzYWdlIHRvIHdyaXRlXG4gICAgICovXG4gICAgcHVibGljIGRlYnVnKG06IHN0cmluZykge1xuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRlYnVnLCB0aGlzLCBtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0YWRhdGEgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWV0YWRhdGEhO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgbWV0YWRhdGEobTogTWV0YSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBtIE1ldGFkYXRhIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5tZXRhZGF0YSA9IG07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGN1cnJlbnQgdHJhY2sgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLl9fY3VycmVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBxdWV1ZSB3YXMgZGVsZXRlZCBwcmV2aW91c2x5XG4gICAgICovXG4gICAgcHVibGljIGdldCBkZWxldGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVsZXRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY2hhbm5lbCBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjaGFubmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5jaGFubmVsIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjaGFubmVsKGM6IFZvaWNlQmFzZWRDaGFubmVsIHwgbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICAgICAgICBpZiAoYykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsID0gYztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LnZvaWNlQ29ubmVjdGlvbiB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBndWlsZCB0aGlzIHF1ZXVlIGJlbG9uZ3MgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGd1aWxkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmd1aWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGQuaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRyYW5zaXRpb24gbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldFRyYW5zaXRpb25pbmcoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy4jdHJhbnNpdGlvbmluZyA9IHN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGlmIHRoaXMgcXVldWUgaXMgY3VycmVudGx5IHVuZGVyIHRyYW5zaXRpb24gbW9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1RyYW5zaXRpb25pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0cmFuc2l0aW9uaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCByZXBlYXQgbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSByZXBlYXQgbW9kZSB0byBhcHBseVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXBlYXRNb2RlKG1vZGU6IFF1ZXVlUmVwZWF0TW9kZSkge1xuICAgICAgICB0aGlzLnJlcGVhdE1vZGUgPSBtb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1heFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4U2l6ZSA/PyBJbmZpbml0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldE1heFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heFNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1heEhpc3RvcnlTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID8/IEluZmluaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBoaXN0b3J5IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYXhIaXN0b3J5U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4SGlzdG9yeVNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1heCBoaXN0b3J5IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWF4SGlzdG9yeVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID0gc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgbWF4IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSB0byBzZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWF4U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRSgnc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2l6ZSA8IDEpIHNpemUgPSBJbmZpbml0eTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBoYXMgbm8gdHJhY2tzIGxlZnQgaW4gaXRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPCAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaXMgZnVsbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0Z1bGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplID49IHRoaXMubWF4U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcXVldWUgY2FwYWNpdHlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2FwYWNpdHkoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRnVsbCgpKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5tYXhTaXplIC0gdGhpcy5zaXplO1xuICAgICAgICByZXR1cm4gY2FwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgcXVldWUgY3VycmVudGx5IGhvbGRzIGFjdGl2ZSBhdWRpbyByZXNvdXJjZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2UgIT0gbnVsbCAmJiAhdGhpcy5kaXNwYXRjaGVyLmF1ZGlvUmVzb3VyY2UuZW5kZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHRyYWNrIHRvIHRoZSBxdWV1ZS4gVGhpcyB3aWxsIGVtaXQgYGF1ZGlvVHJhY2tzQWRkYCB3aGVuIG11bHRpcGxlIHRyYWNrcyBhcmUgYWRkZWQsIG90aGVyd2lzZSBgYXVkaW9UcmFja0FkZGAuXG4gICAgICogQHBhcmFtIHRyYWNrIFRyYWNrIG9yIHBsYXlsaXN0IG9yIGFycmF5IG9mIHRyYWNrcyB0byBhZGRcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkVHJhY2sodHJhY2s6IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0KSB7XG4gICAgICAgIGNvbnN0IHRvQWRkID0gdHJhY2sgaW5zdGFuY2VvZiBQbGF5bGlzdCA/IHRyYWNrLnRyYWNrcyA6IHRyYWNrO1xuICAgICAgICBjb25zdCBpc011bHRpID0gQXJyYXkuaXNBcnJheSh0b0FkZCk7XG5cbiAgICAgICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMsIHRvQWRkKTtcblxuICAgICAgICB0aGlzLnRyYWNrcy5hZGQodG9BZGQpO1xuXG4gICAgICAgIGlmIChpc011bHRpKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvVHJhY2tBZGQsIHRoaXMsIHRvQWRkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHB1YmxpYyByZW1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUucmVtb3ZlKHRyYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSB0cmFjayB0byB0aGUgZ2l2ZW4gaW5kZXhcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMClcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zZXJ0VHJhY2sodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBtb3ZlIHRvXG4gICAgICovXG4gICAgcHVibGljIG1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5tb3ZlKHRyYWNrLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29weVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmNvcHkodHJhY2ssIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHNyYyBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgICAqIEBwYXJhbSBkZXN0IFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgICAqL1xuICAgIHB1YmxpYyBzd2FwVHJhY2tzKHNyYzogVHJhY2tSZXNvbHZhYmxlLCBkZXN0OiBUcmFja1Jlc29sdmFibGUpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5zd2FwKHNyYywgZGVzdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHN0cmVhbSBkaXNwYXRjaGVyIGZyb20gdGhlIGdpdmVuIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byB1c2VcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRGlzcGF0Y2hlcihcbiAgICAgICAgY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLFxuICAgICAgICBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSxcbiAgICApIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5jYWNoZS5nZXQoY29ubmVjdGlvbi5qb2luQ29uZmlnLmNoYW5uZWxJZCEpO1xuICAgICAgICBpZiAoIWNoYW5uZWwpIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1ZPSUNFX0NIQU5ORUwoKTtcbiAgICAgICAgaWYgKCFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKVxuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRShcbiAgICAgICAgICAgICAgICAnY2hhbm5lbCcsXG4gICAgICAgICAgICAgICAgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsXG4gICAgICAgICAgICAgICAgU3RyaW5nKGNoYW5uZWw/LnR5cGUpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoXG4gICAgICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBvcHRpb25zLnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0LFxuICAgICAgICAgICAgb3B0aW9ucy5hdWRpb1BsYXllcixcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBjaGFubmVsUmVzb2x2YWJsZSBUaGUgdm9pY2UgY2hhbm5lbCB0byBjb25uZWN0IHRvXG4gICAgICogQHBhcmFtIG9wdGlvbnMgSm9pbiBjb25maWdcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgY29ubmVjdChjaGFubmVsUmVzb2x2YWJsZTogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLCBvcHRpb25zOiBWb2ljZUNvbm5lY3RDb25maWcgPSB7fSkge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5wbGF5ZXIuY2xpZW50LmNoYW5uZWxzLnJlc29sdmUoY2hhbm5lbFJlc29sdmFibGUpO1xuICAgICAgICBpZiAoIWNoYW5uZWwgfHwgIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoXG4gICAgICAgICAgICAgICAgJ2NoYW5uZWwnLFxuICAgICAgICAgICAgICAgIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLFxuICAgICAgICAgICAgICAgIFN0cmluZyhjaGFubmVsPy50eXBlKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAgICAgYENvbm5lY3RpbmcgdG8gJHtjaGFubmVsLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSA/ICdzdGFnZScgOiAndm9pY2UnfSBjaGFubmVsICR7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwubmFtZVxuICAgICAgICAgICAgICAgIH0gKElEOiAke2NoYW5uZWwuaWR9KWAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLmRpc3BhdGNoZXIgJiYgY2hhbm5lbC5pZCAhPT0gdGhpcy5kaXNwYXRjaGVyLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdEZXN0cm95aW5nIG9sZCBjb25uZWN0aW9uJyk7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gYXdhaXQgdGhpcy5wbGF5ZXIudm9pY2VVdGlscy5jb25uZWN0KGNoYW5uZWwsIHtcbiAgICAgICAgICAgIGRlYWY6IG9wdGlvbnMuZGVhZiA/PyB0aGlzLm9wdGlvbnMuc2VsZkRlYWYgPz8gdHJ1ZSxcbiAgICAgICAgICAgIG1heFRpbWU6IG9wdGlvbnM/LnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICAgICAgICBxdWV1ZTogdGhpcyxcbiAgICAgICAgICAgIGF1ZGlvUGxheWVyOiBvcHRpb25zPy5hdWRpb1BsYXllcixcbiAgICAgICAgICAgIGdyb3VwOiBvcHRpb25zLmdyb3VwID8/IHRoaXMucGxheWVyLmNsaWVudC51c2VyPy5pZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5jb25uZWN0aW9uLCB0aGlzKTtcblxuICAgICAgICBpZiAodGhpcy5jaGFubmVsIS50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0U3VwcHJlc3NlZChmYWxzZSkuY2F0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFJlcXVlc3RUb1NwZWFrKHRydWUpLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI2F0dGFjaExpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBzaHVmZmxlIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogRHluYW1pYyBzaHVmZmxpbmcgd2lsbCBzaHVmZmxlIHRoZSBxdWV1ZSB3aGVuIHRoZSBjdXJyZW50IHRyYWNrIGVuZHMsIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHF1ZXVlLlxuICAgICAqIElmIHNldCB0byBgZmFsc2VgLCB0aGUgcXVldWUgd2lsbCBiZSBzaHVmZmxlZCBpbW1lZGlhdGVseSBpbi1wbGFjZSwgd2hpY2ggY2Fubm90IGJlIHVuZG9uZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZW5hYmxlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIWR5bmFtaWMpIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jc2h1ZmZsZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNhYmxlU2h1ZmZsZSgpIHtcbiAgICAgICAgdGhpcy4jc2h1ZmZsZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgICAqIEBwYXJhbSBkeW5hbWljIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgcXVldWUgZHluYW1pY2FsbHkuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHNodWZmbGUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgICAgICBpZiAoZHluYW1pYykge1xuICAgICAgICAgICAgdGhpcy4jc2h1ZmZsZSA9ICF0aGlzLiNzaHVmZmxlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyYWNrcy5zaHVmZmxlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgc2h1ZmZsZSBtb2RlIGlzIGVuYWJsZWQgZm9yIHRoaXMgcXVldWUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1NodWZmbGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gbGF0ZW5jeSBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5ub2Rlcy5kZWxldGUodGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI2RlbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnF1ZXVlRGVsZXRlLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMubm9kZS50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgICAgICAgICAgdGhpcy50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmV2aXZlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGVsZXRlZCB8fCB0aGlzLnBsYXllci5ub2Rlcy5oYXModGhpcy5pZCkpIHJldHVybjtcbiAgICAgICAgdGhpcy4jZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgICAgICB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5zZXQodGhpcy5pZCwgdGhpcyk7XG4gICAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5xdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHNlbGYgZGVhZlxuICAgICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGZEZWFmKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0RGVhZihtb2RlLCByZWFzb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBzZWxmIG11dGVcbiAgICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxmTXV0ZShtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldE11dGUobW9kZSwgcmVhc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5IGEgdHJhY2sgaW4gdGhpcyBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYmUgcGxheWVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIG5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KHRyYWNrOiBUcmFja0xpa2UsIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPE1ldGE+KSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFubmVsKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DT05ORUNUSU9OKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLnBsYXkodGhpcy5jaGFubmVsLCB0cmFjaywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdCBhbiBldmVudCBvbiB0aGlzIHF1ZXVlXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBlbWl0XG4gICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgZm9yIHRoZSBldmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+PihcbiAgICAgICAgZXZlbnQ6IEssXG4gICAgICAgIC4uLmFyZ3M6IFBhcmFtZXRlcnM8R3VpbGRRdWV1ZUV2ZW50czxNZXRhPltLXT5cbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgIH1cblxuICAgICNhdHRhY2hMaXN0ZW5lcnMoZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdlcnJvcicsIChlKSA9PiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVycm9yLCB0aGlzLCBlKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2RlYnVnJywgKG0pID0+IHRoaXMuaGFzRGVidWdnZXIgJiYgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kZWJ1ZywgdGhpcywgbSkpO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdmaW5pc2gnLCAocikgPT4gdGhpcy4jcGVyZm9ybUZpbmlzaChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ3N0YXJ0JywgKHIpID0+IHRoaXMuI3BlcmZvcm1TdGFydChyKSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2Rlc3Ryb3llZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyhkaXNwYXRjaGVyKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICBkaXNwYXRjaGVyLm9uKCdkc3AnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QuaXModGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5kc3BVcGRhdGUsIHRoaXMsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLCBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2JpcXVhZCcsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCAhPT0gZikge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYmlxdWFkRmlsdGVyc1VwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ2VxQmFuZHMnLCAoZikgPT4ge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QuaXMoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmVxdWFsaXplclVwZGF0ZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciwgZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BhdGNoZXIub24oJ3ZvbHVtZScsIChmKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSAhPT0gZilcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnZvbHVtZUNoYW5nZSwgdGhpcywgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSwgZik7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gZjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNEZWJ1Z2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5oYXNEZWJ1Z2dlcjtcbiAgICB9XG5cbiAgICAjcmVtb3ZlTGlzdGVuZXJzPFQgZXh0ZW5kcyB7IHJlbW92ZUFsbExpc3RlbmVyczogKCkgPT4gdW5rbm93biB9Pih0YXJnZXQ6IFQpIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIH1cblxuICAgICNwZXJmb3JtU3RhcnQocmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgICAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcbiAgICAgICAgY29uc3QgcmVhc29uID0gdGhpcy5pc1RyYW5zaXRpb25pbmcoKSA/ICdmaWx0ZXJzJyA6ICdub3JtYWwnO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgUGxheWVyIHRyaWdnZXJlZCBmb3IgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICB9KX1gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclRyaWdnZXIsIHRoaXMsIHRyYWNrISwgcmVhc29uKTtcbiAgICAgICAgaWYgKHRyYWNrICYmICF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclN0YXJ0LCB0aGlzLCB0cmFjayk7XG4gICAgICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG4gICAgfVxuXG4gICAgI2dldE5leHRUcmFjaygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2h1ZmZsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy50cmFja3Muc3RvcmU7XG5cbiAgICAgICAgaWYgKCFzdG9yZS5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICBjb25zdCB0cmFjayA9IFV0aWwucmFuZG9tQ2hvaWNlKHN0b3JlKTtcblxuICAgICAgICB0aGlzLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0LmlkID09PSB0cmFjay5pZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYWNrO1xuICAgIH1cblxuICAgICNwZXJmb3JtRmluaXNoKHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRyYWNrPy50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2l0aW9uTW9kZTogdGhpcy5pc1RyYW5zaXRpb25pbmcoKSxcbiAgICAgICAgICAgICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1RyYW5zaXRpb25pbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5zeW5jZWRMeXJpY3NQcm92aWRlci51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5zeW5jZWRMeXJpY3NQcm92aWRlci5seXJpY3MuY2xlYXIoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ0FkZGluZyB0cmFjayB0byBoaXN0b3J5IGFuZCBlbWl0dGluZyBmaW5pc2ggZXZlbnQgc2luY2UgdHJhbnNpdGlvbiBtb2RlIGlzIGRpc2FibGVkLi4uJyk7XG4gICAgICAgICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh0cmFjayk7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLnJlc2V0UHJvZ3Jlc3MoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllckZpbmlzaCwgdGhpcywgdHJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuI2RlbGV0ZWQpIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICAgICAgICBpZiAodGhpcy50cmFja3Muc2l6ZSA8IDEgJiYgdGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuT0ZGKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAnTm8gbW9yZSB0cmFja3MgbGVmdCBpbiB0aGUgcXVldWUgdG8gcGxheSBhbmQgcmVwZWF0IG1vZGUgaXMgb2ZmLCBpbml0aWF0aW5nICNlbWl0RW5kKCknLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlRSQUNLKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jdXJyZW50ID0gdGhpcy5oaXN0b3J5LnRyYWNrcy5kaXNwYXRjaCgpIHx8IHRyYWNrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQhLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHF1ZXVlLCBtb3ZpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5IHRvIGN1cnJlbnQgcXVldWUuLi4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuaGlzdG9yeS50cmFja3MuZGlzcGF0Y2goKSB8fCB0cmFjaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHRoaXMudHJhY2tzLmFkZChuZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRyYWNrcy5zaXplICYmIHRyYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5BVVRPUExBWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIGF1dG9wbGF5LCBpbml0aWF0aW5nIGF1dG9wbGF5IGhhbmRsZXIuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdJbml0aWFsaXppbmcgbmV4dCB0cmFjayBvZiB0aGUgcXVldWUuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLiNnZXROZXh0VHJhY2soKSE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgICNlbWl0RW5kKCkge1xuICAgICAgICB0aGlzLl9fY3VycmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlRdWV1ZSwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGVhdmVPbkVuZCkge1xuICAgICAgICAgICAgY29uc3QgdG06IE5vZGVKUy5UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zLmxlYXZlT25FbmRDb29sZG93bikudW5yZWYoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jICNoYW5kbGVBdXRvcGxheSh0cmFjazogVHJhY2spIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBBdXRvcGxheSA+PiBGaW5kaW5nIHJlbGF0ZWQgdHJhY2tzIGZvciBUcmFjayAke3RyYWNrLnRpdGxlfSAoJHt0cmFjay51cmx9KSBbZXh0OiR7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSdcbiAgICAgICAgICAgICAgICAgICAgfV1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgICAgICAgICAgIChhd2FpdCB0cmFjay5leHRyYWN0b3I/LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSkpPy50cmFja3MgfHxcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4dC5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrLCB0aGlzLmhpc3RvcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMudHJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZmFpbGVkIHRvIHByb3ZpZGUgcmVzdWx0cy5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgcmVzdWx0cy5gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy50cmFja3M7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8ucmVzdWx0IHx8XG4gICAgICAgICAgICAgICAgW107XG5cbiAgICAgICAgICAgIGxldCByZXNvbHZlcjogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICAgICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRyYWNrIHwgbnVsbD4oKHJlc29sdmUpID0+IChyZXNvbHZlciA9IHJlc29sdmUpKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQud2lsbEF1dG9QbGF5LCB0aGlzLCB0cmFja3MsIHJlc29sdmVyISk7XG5cbiAgICAgICAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIoXG4gICAgICAgICAgICAgICAgICAgIHRyYWNrcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZSA9IHRyYWNrcy5maWx0ZXIoKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlPy5bMF0gPz8gVXRpbC5yYW5kb21DaG9pY2UodHJhY2tzLnNsaWNlKDAsIDUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRUcmFjayA9IGF3YWl0IGRvbmVQcm9taXNlO1xuXG4gICAgICAgICAgICBpZiAoIW5leHRUcmFjaykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdBdXRvcGxheSA+PiBObyB0cmFjayB3YXMgZm91bmQsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICAgICAgICAgIHRocm93ICdObyB0cmFjayB3YXMgZm91bmQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5vZGUucGxheShuZXh0VHJhY2ssIHtcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VlazogMCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgQXVkaW9QbGF5ZXIsXG4gICAgQXVkaW9QbGF5ZXJFcnJvcixcbiAgICBBdWRpb1BsYXllclN0YXR1cyxcbiAgICBBdWRpb1Jlc291cmNlLFxuICAgIGNyZWF0ZUF1ZGlvUGxheWVyLFxuICAgIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gICAgZW50ZXJzU3RhdGUsXG4gICAgU3RyZWFtVHlwZSxcbiAgICBWb2ljZUNvbm5lY3Rpb24sXG4gICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICAgIFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24sXG59IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgRXF1YWxpemVyQmFuZCwgQmlxdWFkRmlsdGVycywgUENNRmlsdGVycywgRmlsdGVyc0NoYWluIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFBvc3RQcm9jZXNzZWRSZXN1bHQgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTdHJlYW1PcHMge1xuICAgIHR5cGU/OiBTdHJlYW1UeXBlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YT86IGFueTtcbiAgICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlRXF1YWxpemVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWRGaWx0ZXI/OiBCaXF1YWRGaWx0ZXJzO1xuICAgIGRpc2FibGVGaWx0ZXJzPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgICB2b2x1bWU/OiBudW1iZXI7XG4gICAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gICAgc2FtcGxlUmF0ZT86IG51bWJlcjtcbiAgICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUV2ZW50cyB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICAgIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgICBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gYW55O1xuICAgIHN0YXJ0OiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gICAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gICAgZHNwOiAoZmlsdGVyczogUENNRmlsdGVyc1tdKSA9PiBhbnk7XG4gICAgZXFCYW5kczogKGZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSkgPT4gYW55O1xuICAgIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBudW1iZXIpID0+IGFueTtcbiAgICBiaXF1YWQ6IChmaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzKSA9PiBhbnk7XG4gICAgdm9sdW1lOiAodm9sdW1lOiBudW1iZXIpID0+IGFueTtcbiAgICBkZXN0cm95ZWQ6ICgpID0+IGFueTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbn1cblxuY2xhc3MgU3RyZWFtRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxWb2ljZUV2ZW50cz4ge1xuICAgIHB1YmxpYyB2b2ljZUNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbjtcbiAgICBwdWJsaWMgYXVkaW9QbGF5ZXI6IEF1ZGlvUGxheWVyO1xuICAgIHB1YmxpYyBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWw7XG4gICAgcHVibGljIGF1ZGlvUmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGw7XG4gICAgcHVibGljIGRzcCA9IG5ldyBGaWx0ZXJzQ2hhaW4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGNvbm5lY3Rpb24gb2JqZWN0XG4gICAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9IGNoYW5uZWwgVGhlIGNvbm5lY3RlZCBjaGFubmVsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXIgPSAyMDAwMCxcbiAgICAgICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgICAgICogQHR5cGUge1ZvaWNlQ29ubmVjdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGF1ZGlvIHBsYXllclxuICAgICAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJ9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyID1cbiAgICAgICAgICAgIGF1ZGlvUGxheWVyIHx8XG4gICAgICAgICAgICBjcmVhdGVBdWRpb1BsYXllcih7XG4gICAgICAgICAgICAgICAgZGVidWc6IHRoaXMucXVldWUuaGFzRGVidWdnZXIsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgICAgICogQHR5cGUge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKCdlcnJvcicsIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IgYXMgQXVkaW9QbGF5ZXJFcnJvcikpO1xuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgICAgIHRoaXMuZHNwLm9uVXBkYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRzcCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpIHRoaXMuZW1pdCgnZHNwJywgdGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycyk7XG4gICAgICAgICAgICBpZiAodGhpcy5kc3AuYmlxdWFkPy5maWx0ZXIpIHRoaXMuZW1pdCgnYmlxdWFkJywgdGhpcy5kc3AuYmlxdWFkPy5maWx0ZXIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLmVxdWFsaXplcikgdGhpcy5lbWl0KCdlcUJhbmRzJywgdGhpcy5kc3AuZXF1YWxpemVyLmdldEVRKCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZHNwLnZvbHVtZSkgdGhpcy5lbWl0KCd2b2x1bWUnLCB0aGlzLmRzcC52b2x1bWUudm9sdW1lKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRzcC5yZXNhbXBsZXIpIHRoaXMuZW1pdCgnc2FtcGxlUmF0ZScsIHRoaXMuZHNwLnJlc2FtcGxlci50YXJnZXRTYW1wbGVSYXRlKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRzcC5vbkVycm9yID0gKGUpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uXG4gICAgICAgICAgICAub24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZCwgYXN5bmMgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uTWFudWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5XZWJTb2NrZXRDbG9zZSAmJiBuZXdTdGF0ZS5jbG9zZUNvZGUgPT09IDQwMTQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGVudGVyc1N0YXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblRpbWVvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgVXRpbC53YWl0KCh0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW5BdHRlbXB0cyArIDEpICogNTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmNvbm5lY3Rpb25EZXN0cm95ZWQsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hdWRpb1BsYXllci5vbignc3RhdGVDaGFuZ2UnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAgICAgICBpZiAob2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiYgbmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllclBhdXNlLCB0aGlzLnF1ZXVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5wbGF5ZXJSZXN1bWUsIHRoaXMucXVldWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSB8fCBvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkJ1ZmZlcmluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdzdGFydCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlICYmIG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgICAgICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgICAqL1xuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkO1xuICAgIH1cblxuICAgIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHZhbCA/IHRoaXMucGF1c2UodHJ1ZSkgOiB0aGlzLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5LlxuICAgICAqL1xuICAgIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXVzZWQgfHwgdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLkF1dG9QYXVzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nXG4gICAgICovXG4gICAgaXNCdWZmZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICAgKi9cbiAgICBpc1BsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpZGxlXG4gICAgICovXG4gICAgaXNJZGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEZXN0cm95ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAgICovXG4gICAgaXNEaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gcGxheVxuICAgICAqL1xuICAgIGlzUmVhZHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBzaWduYWxsaW5nXG4gICAgICovXG4gICAgaXNTaWduYWxsaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBjb25uZWN0aW5nXG4gICAgICovXG4gICAgaXNDb25uZWN0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHN0cmVhbVxuICAgICAqIEBwYXJhbSB7UmVhZGFibGV9IHNyYyBUaGUgc3RyZWFtIHNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3BzXSBPcHRpb25zXG4gICAgICogQHJldHVybnMge0F1ZGlvUmVzb3VyY2V9XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlU3RyZWFtKHNyYzogUmVhZGFibGUsIG9wcz86IENyZWF0ZVN0cmVhbU9wcykge1xuICAgICAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhdGluZyBEU1AgZmlsdGVycyBwaXBlbGluZS4uLicpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSAhb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgICAgICAgPyB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICAgICAgICAgICAgICBkc3A6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBvcHM/LmRlZmF1bHRGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGJpcXVhZDogb3BzPy5iaXF1YWRGaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IG9wcy5iaXF1YWRGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHJlc2FtcGxlcjoge1xuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFNhbXBsZVJhdGU6IG9wcz8uc2FtcGxlUmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVxdWFsaXplcjoge1xuICAgICAgICAgICAgICAgICAgICAgIGJhbmRNdWx0aXBsaWVyOiBvcHM/LmVxLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgdm9sdW1lOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiBvcHM/LnZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlVm9sdW1lLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogc3JjO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdFeGVjdXRpbmcgb25BZnRlckNyZWF0ZVN0cmVhbSBob29rLi4uJyk7XG4gICAgICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLm9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUpLmNhdGNoKFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5LFxuICAgICAgICAgICAgICAgIH0gYXMgUG9zdFByb2Nlc3NlZFJlc3VsdCksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1ByZXBhcmluZyBBdWRpb1Jlc291cmNlLi4uJyk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IGNyZWF0ZUF1ZGlvUmVzb3VyY2UocG9zdFN0cmVhbT8uc3RyZWFtID8/IHN0cmVhbSwge1xuICAgICAgICAgICAgaW5wdXRUeXBlOiBwb3N0U3RyZWFtPy50eXBlID8/IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBvcHM/LmRhdGEsXG4gICAgICAgICAgICAvLyB2b2x1bWUgY29udHJvbHMgaGFwcGVuIGZyb20gQXVkaW9GaWx0ZXIgRFNQIHV0aWxpdHlcbiAgICAgICAgICAgIGlubGluZVZvbHVtZTogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRzcD8ucmVzYW1wbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwPy5maWx0ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmJpcXVhZCB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kc3A/LmVxdWFsaXplciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5ZXIgc3RhdHVzXG4gICAgICogQHR5cGUge0F1ZGlvUGxheWVyU3RhdHVzfVxuICAgICAqL1xuICAgIGdldCBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0cyBmcm9tIHZvaWNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1ZGlvUGxheWVyKSB0aGlzLmF1ZGlvUGxheWVyLnN0b3AodHJ1ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB0aGlzLnZvaWNlQ29ubmVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2gge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoaXMgZGlzcGF0Y2hlclxuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmF1ZGlvUGxheWVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZW1pdCgnZGVzdHJveWVkJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcHMgdGhlIHBsYXllclxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGVuZCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCgpO1xuICAgICAgICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVycG9sYXRlU2lsZW5jZT1mYWxzZV0gSWYgdHJ1ZSwgdGhlIHBsYXllciB3aWxsIHBsYXkgNSBwYWNrZXRzIG9mIHNpbGVuY2UgYWZ0ZXIgcGF1c2luZyB0byBwcmV2ZW50IGF1ZGlvIGdsaXRjaGVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIHBhdXNlKGludGVycG9sYXRlU2lsZW5jZT86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuYXVkaW9QbGF5ZXIucGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlKTtcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdW1lcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgcmVzdW1lKCkge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci51bnBhdXNlKCk7XG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgc3RyZWFtXG4gICAgICogQHBhcmFtIHtBdWRpb1Jlc291cmNlPFRyYWNrPn0gW3Jlc291cmNlPXRoaXMuYXVkaW9SZXNvdXJjZV0gVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHVzPWZhbHNlXSBXaGV0aGVyIG9yIG5vdCB0byB1c2Ugb3B1c1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19BVURJT19SRVNPVVJDRSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvdXJjZS5lbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KCdmaW5pc2gnLCByZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUodGhpcy52b2ljZUNvbm5lY3Rpb24sIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSwgdGhpcy5jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIHZvbHVtZSBhbW91bnRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBzZXRWb2x1bWUodmFsdWU6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIDEwMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBzdHJlYW1UaW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2UucGxheWJhY2tEdXJhdGlvbjtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgYXMgU3RyZWFtRGlzcGF0Y2hlciB9O1xuIiwgImltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgVHJhY2tTa2lwUmVhc29uIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVIaXN0b3J5PE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIHRyYWNrcyA9IG5ldyBRdWV1ZTxUcmFjaz4oJ0xJRk8nKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHwgKCh0aGlzLnF1ZXVlIGFzIGFueSkuX19jdXJyZW50IGFzIFRyYWNrIHwgbnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5leHRUcmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwcmV2aW91c1RyYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3MuYXQoMCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBoaXN0b3J5IGlzIGRpc2FibGVkXG4gICAgICovXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlSGlzdG9yeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgaGlzdG9yeSBpcyBlbXB0eVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHRyYWNrIHRvIHRyYWNrIGhpc3RvcnlcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGFkZFxuICAgICAqL1xuICAgIHB1YmxpYyBwdXNoKHRyYWNrOiBUcmFjayB8IFRyYWNrW10pIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy50cmFja3MuYWRkKHRyYWNrKTtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGhpc3RvcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgbmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLm5leHRUcmFjaztcbiAgICAgICAgaWYgKCF0cmFjaykge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdObyBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnNraXAoe1xuICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSGlzdG9yeU5leHQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXBwZWQgYnkgR3VpbGRRdWV1ZUhpc3RvcnkubmV4dCgpJyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHByZXZpb3VzKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAoIXRyYWNrKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ05vIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgcHJlc2VydmVDdXJyZW50KSB0aGlzLnF1ZXVlLm5vZGUuaW5zZXJ0KGN1cnJlbnQsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsaWFzIHRvIFtHdWlsZFF1ZXVlSGlzdG9yeV0ucHJldmlvdXMoKVxuICAgICAqL1xuICAgIHB1YmxpYyBiYWNrKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXMocHJlc2VydmVDdXJyZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemUgaGlzdG9yeSBzdG9yZVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNpemUoKSB7XG4gICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnRyYWNrcy5zdG9yZS5sZW5ndGggPCB0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSByZXR1cm47XG4gICAgICAgIHRoaXMudHJhY2tzLnN0b3JlLnNwbGljZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSwgU3RyZWFtVHlwZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFF1ZXJ5UmVzb2x2ZXIgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHdhaXRGb3IgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHsgRXhjZXB0aW9ucyB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IENyZWF0ZVN0cmVhbU9wcyB9IGZyb20gJy4uL1ZvaWNlSW50ZXJmYWNlL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgRXh0cmFjdG9yU3RyZWFtYWJsZSB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBPZ2dEZW11eGVyLCBPcHVzRGVjb2RlciwgV2VibURlbXV4ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvb3B1cyc7XG5cbmV4cG9ydCBjb25zdCBGRk1QRUdfU1JBVEVfUkVHRVggPSAvYXNldHJhdGU9XFxkK1xcKihcXGQoXFwuXFxkKT8pLztcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVBsYXlPcHRpb25zIHtcbiAgICBxdWV1ZT86IGJvb2xlYW47XG4gICAgc2Vlaz86IG51bWJlcjtcbiAgICB0cmFuc2l0aW9uTW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2tpcE9wdGlvbnMge1xuICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyVGltZXN0YW1wIHtcbiAgICBjdXJyZW50OiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgfTtcbiAgICB0b3RhbDoge1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgIH07XG4gICAgcHJvZ3Jlc3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1Db25maWcge1xuICAgIGRpc3BhdGNoZXJDb25maWc6IENyZWF0ZVN0cmVhbU9wcztcbiAgICBwbGF5ZXJDb25maWc6IFJlc291cmNlUGxheU9wdGlvbnM7XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gdW5rbm93bj4ge1xuICAgICNwcm9ncmVzcyA9IDA7XG4gICAgI2hhc0ZGbXBlZ09wdGltaXphdGlvbiA9IGZhbHNlO1xuICAgIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgICAgIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbiA9IC9saWJvcHVzOiAoeWVzfHRydWUpLy50ZXN0KHRoaXMucXVldWUucGxheWVyLnNjYW5EZXBzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGluIGlkbGUgbW9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0lkbGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNJZGxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgYnVmZmVyaW5nIHRoZSB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBpc0J1ZmZlcmluZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0J1ZmZlcmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmcgYSB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQbGF5aW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkXG4gICAgICovXG4gICAgcHVibGljIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGF1c2VkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgcHJvZ3Jlc3MgaGlzdG9yeVxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldFByb2dyZXNzKCkge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHBsYXllciBwcm9ncmVzc1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQcm9ncmVzcyhwcm9ncmVzczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gcHJvZ3Jlc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVhbSB0aW1lIGZvciBjdXJyZW50IHNlc3Npb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnN0cmVhbVRpbWUgPz8gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHBsYXliYWNrIGR1cmF0aW9uIHdpdGggaGlzdG9yeSBpbmNsdWRlZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGxheWJhY2tUaW1lKCkge1xuICAgICAgICBjb25zdCBkdXIgPSB0aGlzLiNwcm9ncmVzcyArIHRoaXMuc3RyZWFtVGltZTtcblxuICAgICAgICByZXR1cm4gZHVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBkdXJhdGlvbiBtdWx0aXBsaWVyXG4gICAgICovXG4gICAgcHVibGljIGdldER1cmF0aW9uTXVsdGlwbGllcigpIHtcbiAgICAgICAgY29uc3Qgc3JhdGVGaWx0ZXJzID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy50b0FycmF5KCkuZmlsdGVyKChmZikgPT4gRkZNUEVHX1NSQVRFX1JFR0VYLnRlc3QoZmYpKTtcbiAgICAgICAgY29uc3QgbXVsdGlwbGllcnMgPSBzcmF0ZUZpbHRlcnNcbiAgICAgICAgICAgIC5tYXAoKG0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChGRk1QRUdfU1JBVEVfUkVHRVguZXhlYyhtKT8uWzFdIGFzIHN0cmluZyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoZikgPT4gIWlzTmFOKGYpKTtcblxuICAgICAgICByZXR1cm4gIW11bHRpcGxpZXJzLmxlbmd0aCA/IDEgOiBtdWx0aXBsaWVycy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBjdXJyZW50ICsgYWNjdW11bGF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzdGltYXRlZCBwcm9ncmVzcyBvZiB0aGUgcGxheWVyXG4gICAgICovXG4gICAgcHVibGljIGdldCBlc3RpbWF0ZWRQbGF5YmFja1RpbWUoKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IHRoaXMucGxheWJhY2tUaW1lO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLmdldER1cmF0aW9uTXVsdGlwbGllcigpICogZHVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc3RpbWF0ZWQgdG90YWwgZHVyYXRpb24gb2YgdGhlIHBsYXllclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGR1ciA9IHRoaXMudG90YWxEdXJhdGlvbjtcblxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkdXIgLyB0aGlzLmdldER1cmF0aW9uTXVsdGlwbGllcigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCBhdWRpbyB0cmFja1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxEdXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgcHJlZmVyc0JyaWRnZWRNZXRhZGF0YSA9IHRoaXMucXVldWUub3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGE7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG5cbiAgICAgICAgaWYgKHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYWNrSGFzTGVnYWN5TWV0YWRhdGEgPVxuICAgICAgICAgICAgICAgIHRyYWNrPy5tZXRhZGF0YSAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHRyYWNrLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICdicmlkZ2UnIGluIHRyYWNrLm1ldGFkYXRhICYmXG4gICAgICAgICAgICAgICAgdHJhY2subWV0YWRhdGEuYnJpZGdlICE9IG51bGw7XG4gICAgICAgICAgICBjb25zdCB0cmFja0hhc01ldGFkYXRhID0gdHJhY2s/LmJyaWRnZWRUcmFjayAhPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAodHJhY2tIYXNMZWdhY3lNZXRhZGF0YSB8fCB0cmFja0hhc01ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICB0cmFjay5icmlkZ2VkVHJhY2s/LmR1cmF0aW9uTVMgPz9cbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgYXMgVHJhY2s8e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWRnZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgICAgICAgICApLm1ldGFkYXRhPy5icmlkZ2UuZHVyYXRpb247XG5cbiAgICAgICAgICAgICAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIoZHVyYXRpb24pKSByZXR1cm4gZHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhY2s/LmR1cmF0aW9uTVMgPz8gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RyZWFtIHByb2dyZXNzXG4gICAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IFBsYXllclRpbWVzdGFtcCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/IHRoaXMucGxheWJhY2tUaW1lIDogdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWU7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gaWdub3JlRmlsdGVycyA/IHRoaXMudG90YWxEdXJhdGlvbiA6IHRoaXMuZXN0aW1hdGVkRHVyYXRpb247XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyhjdXJyZW50KSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGN1cnJlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdG90YWw6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyh0b3RhbCkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0b3RhbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9ncmVzczogTWF0aC5yb3VuZCgoY3VycmVudCAvIHRvdGFsKSAqIDEwMCksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHByb2dyZXNzIGJhciBmb3IgY3VycmVudCBwcm9ncmVzc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFByb2dyZXNzIGJhciBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVByb2dyZXNzQmFyKG9wdGlvbnM/OiBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5nZXRUaW1lc3RhbXAoKTtcbiAgICAgICAgaWYgKCF0aW1lc3RhbXApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpbmRpY2F0b3IgPSAnXFx1ezFGNTE4fScsXG4gICAgICAgICAgICBsZWZ0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgICAgICAgIHJpZ2h0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgICAgICAgIGxlbmd0aCA9IDE1LFxuICAgICAgICAgICAgdGltZWNvZGVzID0gdHJ1ZSxcbiAgICAgICAgICAgIHNlcGFyYXRvciA9ICdcXHUyNTAzJyxcbiAgICAgICAgfSA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGlmIChpc05hTihsZW5ndGgpIHx8IGxlbmd0aCA8IDAgfHwgIU51bWJlci5pc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9PVVRfT0ZfUkFOR0UoXG4gICAgICAgICAgICAgICAgJ1tQbGF5ZXJQcm9ncmVzc0Jhck9wdGlvbnMubGVuZ3RoXScsXG4gICAgICAgICAgICAgICAgU3RyaW5nKGxlbmd0aCksXG4gICAgICAgICAgICAgICAgJzAnLFxuICAgICAgICAgICAgICAgICdGaW5pdGUgTnVtYmVyJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKCh0aW1lc3RhbXAuY3VycmVudC52YWx1ZSAvIHRpbWVzdGFtcC50b3RhbC52YWx1ZSkgKiBsZW5ndGgpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMSAmJiBpbmRleCA8PSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhciA9IGxlZnRDaGFyLnJlcGVhdChpbmRleCAtIDEpLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIGJhci5wdXNoKGluZGljYXRvcik7XG4gICAgICAgICAgICBiYXIucHVzaChyaWdodENoYXIucmVwZWF0KGxlbmd0aCAtIGluZGV4KSk7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtiYXIuam9pbignJyl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YmFyLmpvaW4oJycpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KFxuICAgICAgICAgICAgICAgICAgICBsZW5ndGggLSAxLFxuICAgICAgICAgICAgICAgICl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSAxKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VlayB0aGUgcGxheWVyXG4gICAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNlZWsoZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkdXJhdGlvbiA9PT0gdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWUpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoZHVyYXRpb24gPiB0aGlzLnRvdGFsRHVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgICAgICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNFRUtfT1ZFUl9USFJFU0hPTEQsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IEV4Y2VwdGlvbnMuRVJSX09VVF9PRl9SQU5HRShcbiAgICAgICAgICAgICAgICAgICAgJ1tkdXJhdGlvbl0nLFxuICAgICAgICAgICAgICAgICAgICBTdHJpbmcoZHVyYXRpb24pLFxuICAgICAgICAgICAgICAgICAgICAnMCcsXG4gICAgICAgICAgICAgICAgICAgIFN0cmluZyh0aGlzLnRvdGFsRHVyYXRpb24pLFxuICAgICAgICAgICAgICAgICkubWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkdXJhdGlvbiA8IDApIGR1cmF0aW9uID0gMDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucXVldWUuZmlsdGVycy50cmlnZ2VyUmVwbGF5KGR1cmF0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHZvbHVtZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2x1bWUgPz8gMTAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB2b2x1bWVcbiAgICAgKiBAcGFyYW0gdm9sIFZvbHVtZSBhbW91bnQgdG8gc2V0XG4gICAgICovXG4gICAgcHVibGljIHNldFZvbHVtZSh2b2w6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCByZXMgPSB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuc2V0Vm9sdW1lKHZvbCk7XG4gICAgICAgIGlmIChyZXMpIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB2b2w7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGJpdCByYXRlXG4gICAgICogQHBhcmFtIHJhdGUgVGhlIGJpdCByYXRlIHRvIHNldFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRCaXRyYXRlKHJhdGU6IG51bWJlciB8ICdhdXRvJykge1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/LmVuY29kZXI/LnNldEJpdHJhdGUoXG4gICAgICAgICAgICByYXRlID09PSAnYXV0bycgPyB0aGlzLnF1ZXVlLmNoYW5uZWw/LmJpdHJhdGUgPz8gNjQwMDAgOiByYXRlLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBwYXVzZWQgc3RhdGVcbiAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlXG4gICAgICovXG4gICAgcHVibGljIHNldFBhdXNlZChzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3RhdGUpIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBhdXNlKHRydWUpIHx8IGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXN1bWUoKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFBhdXNlZCh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdGhlIHBsYXliYWNrXG4gICAgICovXG4gICAgcHVibGljIHJlc3VtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTa2lwIGN1cnJlbnQgdHJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc2tpcChvcHRpb25zPzogU2tpcE9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICAgICAgaWYgKCF0cmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgICAgIGNvbnN0IHsgcmVhc29uLCBkZXNjcmlwdGlvbiB9ID0gb3B0aW9ucyB8fCB7XG4gICAgICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5NYW51YWwsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0cmFjayB3YXMgc2tpcHBlZCBtYW51YWxseScsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQucGxheWVyU2tpcCwgdGhpcy5xdWV1ZSwgdHJhY2ssIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgICAqIEBwYXJhbSBlbWl0RXZlbnQgV2hldGhlciBvciBub3QgdG8gZW1pdCB0aGUgZXZlbnQgQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZSh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBlbWl0RXZlbnQgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kVHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5maW5kKCh0LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICAgICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZm91bmRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB0LmlkID09PSBmb3VuZFRyYWNrLmlkKTtcblxuICAgICAgICBpZiAoZW1pdEV2ZW50KSB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmF1ZGlvVHJhY2tSZW1vdmUsIHRoaXMucXVldWUsIGZvdW5kVHJhY2spO1xuXG4gICAgICAgIHJldHVybiBmb3VuZFRyYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gc3BlY2lmaWMgdHJhY2sgb24gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBqdW1wIHRvIHdpdGhvdXQgcmVtb3Zpbmcgb3RoZXIgdHJhY2tzXG4gICAgICovXG4gICAgcHVibGljIGp1bXAodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUodHJhY2ssIGZhbHNlKTtcbiAgICAgICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnVuc2hpZnQocmVtb3ZlZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSnVtcCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBqdW1wZWQgdG8gbWFudWFsbHknLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdHJhY2sgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGdldFRyYWNrUG9zaXRpb24odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycgPyB0cmFjayA6IHRyYWNrLmlkKSA9PT0gdC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSByZXR1cm4gdHJhY2sgPT09IHQuaWQ7XG4gICAgICAgICAgICByZXR1cm4gaWR4ID09PSB0cmFjaztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBza2lwIHRvXG4gICAgICovXG4gICAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbih0cmFjayk7XG4gICAgICAgIGlmIChpZHggPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5maWx0ZXIoKF8sIGkpID0+IGkgPD0gaWR4KTtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja3NSZW1vdmUsIHRoaXMucXVldWUsIHRvUmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCh7XG4gICAgICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5Ta2lwVG8sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwbGF5ZXIgd2FzIHNraXBwZWQgdG8gYW5vdGhlciB0cmFjayBtYW51YWxseScsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluc2VydCBhIHRyYWNrIG9uIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBxdWV1ZVxuICAgICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdG8sIGRlZmF1bHRzIHRvIDAuXG4gICAgICovXG4gICAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgICAgICBpZiAoISh0cmFjayBpbnN0YW5jZW9mIFRyYWNrKSlcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3RyYWNrIHZhbHVlJywgJ2luc3RhbmNlIG9mIFRyYWNrJywgU3RyaW5nKHRyYWNrKSk7XG4gICAgICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuYXVkaW9UcmFja0FkZCwgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIG1vdmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZShmcm9tOiBUcmFja1Jlc29sdmFibGUsIHRvOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGZyb20pO1xuICAgICAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbnMuRVJSX05PX1JFU1VMVCgnaW52YWxpZCB0cmFjayB0byBtb3ZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNlcnQocmVtb3ZlZCwgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAgICovXG4gICAgcHVibGljIGNvcHkoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMucXVldWUudHJhY2tzLmF0KHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmcm9tKSk7XG4gICAgICAgIGlmICghc3JjKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgdHJhY2sgdG8gY29weScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zZXJ0KHNyYywgdG8pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgICAqL1xuICAgIHB1YmxpYyBzd2FwKGZpcnN0OiBUcmFja1Jlc29sdmFibGUsIHNlY29uZDogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmaXJzdCk7XG4gICAgICAgIGlmIChzcmMgPCAwKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgICAgICBjb25zdCBkZXN0ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHNlY29uZCk7XG4gICAgICAgIGlmIChkZXN0IDwgMCkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKCdpbnZhbGlkIGRlc3QgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgICAgIGNvbnN0IHNyY1QgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtzcmNdO1xuICAgICAgICBjb25zdCBkZXN0VCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdO1xuXG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY10gPSBkZXN0VDtcbiAgICAgICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbZGVzdF0gPSBzcmNUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3AgdGhlIHBsYXliYWNrXG4gICAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgb3Igbm90IHRvIGZvcmNlZnVsbHkgc3RvcCB0aGUgcGxheWJhY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcChmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucXVldWUudHJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGxheWluZygpIHx8IHRoaXMucXVldWUudHJhY2tzLnNpemUpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZGVzdHJveSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24pLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxheSByYXcgYXVkaW8gcmVzb3VyY2VcbiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheVJhdyhyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnBsYXlTdHJlYW0ocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXkgdGhlIGdpdmVuIHRyYWNrXG4gICAgICogQHBhcmFtIHJlcyBUaGUgdHJhY2sgdG8gcGxheVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHBsYXlpbmcgdGhlIHRyYWNrXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXkocmVzPzogVHJhY2sgfCBudWxsLCBvcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19WT0lDRV9DT05ORUNUSU9OKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoYFJlY2VpdmVkIHBsYXkgcmVxdWVzdCBmcm9tIGd1aWxkICR7dGhpcy5xdWV1ZS5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5xdWV1ZS5ndWlsZC5pZH0pYCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBxdWV1ZTogdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2sgIT0gbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VlazogMCxcbiAgICAgICAgICAgIH0gYXMgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICkhO1xuXG4gICAgICAgIGlmIChyZXMgJiYgb3B0aW9ucy5xdWV1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcXVldWUgdGhlIHRyYWNrLCBhZGRpbmcgdGhlIGdpdmVuIHRyYWNrIHRvIHF1ZXVlIGluc3RlYWQuLi4nLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5hZGRUcmFjayhyZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhY2sgPSByZXMgfHwgdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICAgICAgaWYgKCF0cmFjaykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5lcnJvciwgdGhpcy5xdWV1ZSwgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcGxheSB0aGUgdHJhY2ssIGluaXRpYWxpemluZy4uLicpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZyhgSW5pdGlhdGluZyBzdHJlYW0gZXh0cmFjdGlvbiBwcm9jZXNzLi4uYCk7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSB0cmFjay5yYXc/LnNvdXJjZSB8fCB0cmFjay5zb3VyY2U7XG4gICAgICAgICAgICBjb25zdCBxdDogU2VhcmNoUXVlcnlUeXBlID1cbiAgICAgICAgICAgICAgICB0cmFjay5xdWVyeVR5cGUgfHwgKHNyYyA9PT0gJ3Nwb3RpZnknID8gJ3Nwb3RpZnlTb25nJyA6IHNyYyA9PT0gJ2FwcGxlX211c2ljJyA/ICdhcHBsZU11c2ljU29uZycgOiBzcmMpO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoYEV4ZWN1dGluZyBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBob29rIChRdWVyeVR5cGU6ICR7cXR9KS4uLmApO1xuXG4gICAgICAgICAgICBjb25zdCBzdHJlYW1TcmMgPSB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG51bGwgYXMgRXJyb3IgfCBudWxsLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogbnVsbCBhcyBFeHRyYWN0b3JTdHJlYW1hYmxlIHwgbnVsbCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUub25CZWZvcmVDcmVhdGVTdHJlYW0/Lih0cmFjaywgcXQgfHwgJ2FyYml0cmFyeScsIHRoaXMucXVldWUpLnRoZW4oXG4gICAgICAgICAgICAgICAgKHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSBzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZTogRXJyb3IpID0+IChzdHJlYW1TcmMuZXJyb3IgPSBlKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgICAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgICAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdGYWlsZWQgdG8gZ2V0IHN0cmVhbSBmcm9tIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIScpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuY29udGV4dC5wcm92aWRlKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9yczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyPy5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSA8UmVhZGFibGU+ci5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocj8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNyYy5lcnJvciA9IHIuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlOiBFcnJvcikgPT4gKHN0cmVhbVNyYy5lcnJvciA9IGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHJldHVybiB0aGlzLiN0aHJvdyh0cmFjaywgc3RyZWFtU3JjLmVycm9yKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNlZWsgPT09ICdudW1iZXInICYmIG9wdGlvbnMuc2VlayA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBvcHRpb25zLnNlZWs7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJhY2tTdHJlYW1Db25maWc6IFN0cmVhbUNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaGVyQ29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVCaXF1YWQ6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlQmlxdWFkLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVZvbHVtZTogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVWb2x1bWUsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVGaWx0ZXJzOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID09PSAnbnVtYmVyJyAmJiB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBiaXF1YWRGaWx0ZXI6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBlcTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcixcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHRyYWNrLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhdyxcbiAgICAgICAgICAgICAgICAgICAgc2tpcEZGbXBlZzogdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGxheWVyQ29uZmlnOiBvcHRpb25zLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IHJlc29sdmVyOiAoKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gKHJlc29sdmVyID0gcmVzb2x2ZSkpO1xuXG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgICAgICAgICAgIEd1aWxkUXVldWVFdmVudC53aWxsUGxheVRyYWNrLFxuICAgICAgICAgICAgICAgIHRoaXMucXVldWUsXG4gICAgICAgICAgICAgICAgdHJhY2ssXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIhLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gcHJldmVudCBkYW5nbGluZyBwcm9taXNlXG4gICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHJlc29sdmVyKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdXYWl0aW5nIGZvciB3aWxsUGxheVRyYWNrIGV2ZW50IHRvIHJlc29sdmUuLi4nKTtcblxuICAgICAgICAgICAgYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZGFzcERpc2FibGVkID0gW1xuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVFcXVhbGl6ZXIsXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlRmlsdGVycyxcbiAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlVm9sdW1lXG4gICAgICAgICAgICBdLmV2ZXJ5KChlKSA9PiAhIWUgPT09IHRydWUpO1xuXG4gICAgICAgICAgICBjb25zdCBuZWVkc0ZpbHRlcnMgPSAhIXRyYWNrU3RyZWFtQ29uZmlnLnBsYXllckNvbmZpZy5zZWVrIHx8ICEhdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5hcmdzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFNraXBGRm1wZWcgPSAhIXRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuc2tpcEZGbXBlZyAmJiAhbmVlZHNGaWx0ZXJzO1xuXG4gICAgICAgICAgICBsZXQgZmluYWxTdHJlYW06IFJlYWRhYmxlO1xuXG4gICAgICAgICAgICBjb25zdCBkZW11eGFibGUgPSAoZm10OiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgW1N0cmVhbVR5cGUuT3B1cywgU3RyZWFtVHlwZS5XZWJtT3B1cywgU3RyZWFtVHlwZS5PZ2dPcHVzXS5pbmNsdWRlcyhmbXQgYXMgU3RyZWFtVHlwZSk7XG5cbiAgICAgICAgICAgIC8vIHNraXAgZmZtcGVnIHdoZW4gcG9zc2libGVcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzaG91bGRTa2lwRkZtcGVnICYmXG4gICAgICAgICAgICAgICAgIShzdHJlYW1TcmMuc3RyZWFtIGluc3RhbmNlb2YgUmVhZGFibGUpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHN0cmVhbVNyYy5zdHJlYW0gIT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgZGVtdXhhYmxlKHN0cmVhbVNyYy5zdHJlYW0uJGZtdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgJGZtdCwgc3RyZWFtIH0gPSBzdHJlYW1TcmMuc3RyZWFtO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZFBDTSA9ICFkYXNwRGlzYWJsZWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGBza2lwRkZtcGVnIGlzIHNldCB0byB0cnVlIGFuZCBzdHJlYW0gaXMgZGVtdXhhYmxlLCBjcmVhdGluZyBzdHJlYW0gd2l0aCB0eXBlICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkUENNID8gJ3BjbScgOiAnb3B1cydcbiAgICAgICAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B1c1N0cmVhbSA9ICRmbXQgPT09IFN0cmVhbVR5cGUuT3B1cyA/XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA6XG4gICAgICAgICAgICAgICAgICAgICRmbXQgPT09IFN0cmVhbVR5cGUuT2dnT3B1cyA/XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5waXBlKG5ldyBPZ2dEZW11eGVyKCkgYXMgYW55KSA6XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5waXBlKG5ldyBXZWJtRGVtdXhlcigpIGFzIGFueSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkUENNKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IGZpbHRlcnMgZW5hYmxlZCwgd2UgbmVlZCB0byBkZWNvZGUgdGhlIG9wdXMgc3RyZWFtIHRvIHBjbVxuICAgICAgICAgICAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplOiA5NjAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogNDgwMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5SYXc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtO1xuICAgICAgICAgICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLk9wdXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBvcHVzID0gZGFzcERpc2FibGVkICYmIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbjtcbiAgICAgICAgICAgICAgICAvLyBpZiAob3B1cyAmJiB0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNhYmxpbmcgUENNIG91dHB1dCBzaW5jZSBhbGwgZmlsdGVycyBhcmUgZGlzYWJsZWQgYW5kIG9wdXMgZW5jb2RpbmcgaXMgc3VwcG9ydGVkLi4uJyk7XG5cbiAgICAgICAgICAgICAgICBmaW5hbFN0cmVhbSA9IHRoaXMuI2NyZWF0ZUZGbXBlZ1N0cmVhbShcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlIHx8IHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBzdHJlYW1TcmMuc3RyZWFtXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHN0cmVhbVNyYy5zdHJlYW0uc3RyZWFtLFxuICAgICAgICAgICAgICAgICAgICB0cmFjayxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZWVrID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIC8vIG9wdXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBPZ2dPcHVzIHJlc3VsdHMgaW4gc3RhdGljIG5vaXNlXG4gICAgICAgICAgICAgICAgLy8gdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gb3B1cyA/IFN0cmVhbVR5cGUuT2dnT3B1cyA6IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTW9kZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFRyYW5zaXRpb24gbW9kZSBkZXRlY3RlZCwgcGxheWVyIHdpbGwgd2FpdCBmb3IgYnVmZmVyaW5nIHRpbWVvdXQgdG8gZXhwaXJlIChUaW1lb3V0OiAke3RoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0fW1zKWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYXdhaXQgd2FpdEZvcih0aGlzLnF1ZXVlLm9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0J1ZmZlcmluZyB0aW1lb3V0IGhhcyBleHBpcmVkIScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBQcmVwYXJpbmcgZmluYWwgc3RyZWFtIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeSh0cmFja1N0cmVhbUNvbmZpZywgbnVsbCwgMil9YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI7XG5cbiAgICAgICAgICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaW5hbFN0cmVhbS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgZGlzcGF0Y2hlci5jcmVhdGVTdHJlYW0oZmluYWxTdHJlYW0sIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKCEhb3B0aW9ucy50cmFuc2l0aW9uTW9kZSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNwZXJmb3JtUGxheShyZXNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhdWRpbyBwbGF5ZXI6ICR7ZX1gKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjdGhyb3codHJhY2s6IFRyYWNrLCBlcnJvcj86IEVycm9yIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgY29uc3Qgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0ID0gKFxuICAgICAgICAgICAgRXhjZXB0aW9ucy5FUlJfTk9fUkVTVUxUKGBDb3VsZCBub3QgZXh0cmFjdCBzdHJlYW0gZm9yIHRoaXMgdHJhY2ske2Vycm9yID8gYFxcblxcbiR7ZXJyb3Iuc3RhY2sgfHwgZXJyb3J9YCA6ICcnfWApXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LnBsYXllclNraXAsXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLFxuICAgICAgICAgICAgdHJhY2ssXG4gICAgICAgICAgICBUcmFja1NraXBSZWFzb24uTm9TdHJlYW0sXG4gICAgICAgICAgICBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQubWVzc2FnZSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LnBsYXllckVycm9yLFxuICAgICAgICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgICAgICAgIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCxcbiAgICAgICAgICAgIHRyYWNrLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBuZXh0VHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgICAgICBpZiAobmV4dFRyYWNrKSByZXR1cm4gdm9pZCB0aGlzLnBsYXkobmV4dFRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzaG91bGQgYmUgcmVzb2x2ZWRcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lbWl0KCdmaW5pc2gnLCBudWxsKTtcbiAgICB9XG5cbiAgICBhc3luYyAjcGVyZm9ybVBsYXkocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICdEaXNwYXRjaGVyIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHRoZSBxdWV1ZSBiZWluZyBkZWxldGVkIGluIHRoZSBtaWRkbGUgb2Ygb3BlcmF0aW9uLiBDYW5jZWxsaW5nIHRoZSBzdHJlYW0uLi4nLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhbGl6aW5nIGF1ZGlvIHBsYXllci4uLicpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnBsYXlTdHJlYW0ocmVzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc3BhdGNoaW5nIGF1ZGlvLi4uJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyAjY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjazogVHJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBhdHRlbXB0ZWRFeHRyYWN0b3JzID0gdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5nZXRDb250ZXh0KCk/LmF0dGVtcHRlZEV4dHJhY3RvcnMgfHwgbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZSgoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGF0dGVtcHRlZEV4dHJhY3RvcnMuaGFzKGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgYXR0ZW1wdGVkRXh0cmFjdG9ycy5hZGQoZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgY29uc3QgY2FuU3RyZWFtID0gYXdhaXQgZXh0cmFjdG9yLnZhbGlkYXRlKFxuICAgICAgICAgICAgICAgIHRyYWNrLnVybCxcbiAgICAgICAgICAgICAgICB0cmFjay5xdWVyeVR5cGUgfHwgUXVlcnlSZXNvbHZlci5yZXNvbHZlKHRyYWNrLnVybCkudHlwZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWNhblN0cmVhbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3Rvci5zdHJlYW0odHJhY2spO1xuICAgICAgICB9LCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFzdHJlYW1JbmZvIHx8ICFzdHJlYW1JbmZvLnJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGYWxsYmFja1N0cmVhbSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBHZW5lcmljIHN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCBhbmQgZmFsbGJhY2sgc3RyZWFtIGV4dHJhY3Rpb24gaXMgZW5hYmxlZGApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNjcmVhdGVGYWxsYmFja1N0cmVhbSh0cmFjayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzdHJlYW1JbmZvIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgICAgYFN0cmVhbSBleHRyYWN0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSAoRXh0cmFjdG9yOiAke1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ1xuICAgICAgICAgICAgICAgIH0pYCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHN0cmVhbUluZm87XG4gICAgfVxuXG4gICAgYXN5bmMgI2NyZWF0ZUZhbGxiYWNrU3RyZWFtKHRyYWNrOiBUcmFjaykge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgICAgYEF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2QuLi5gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBmYWxsYmFja1N0cmVhbSA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgICAgIGlmIChleHRyYWN0b3IuaWRlbnRpZmllciA9PT0gdHJhY2suZXh0cmFjdG9yPy5pZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSBgJHt0cmFjay50aXRsZX0gJHt0cmFjay5hdXRob3J9YDtcbiAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrVHJhY2tzID0gYXdhaXQgZXh0cmFjdG9yLmhhbmRsZShxdWVyeSwge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0cmFjay5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBmYWxsYmFja1RyYWNrID0gZmFsbGJhY2tUcmFja3MudHJhY2tzWzBdO1xuXG4gICAgICAgICAgICBpZiAoIWZhbGxiYWNrVHJhY2spIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgZXh0cmFjdG9yLnN0cmVhbShmYWxsYmFja1RyYWNrKTtcblxuICAgICAgICAgICAgaWYgKCFzdHJlYW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrID0gZmFsbGJhY2tUcmFjaztcblxuICAgICAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKCFmYWxsYmFja1N0cmVhbSB8fCAhZmFsbGJhY2tTdHJlYW0ucmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyBmYWxsYmFjayBzdHJlYW1pbmcgbWV0aG9kYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0cmFjay5icmlkZ2VkRXh0cmFjdG9yID0gZmFsbGJhY2tTdHJlYW0uZXh0cmFjdG9yO1xuXG4gICAgICAgIHJldHVybiBmYWxsYmFja1N0cmVhbTtcbiAgICB9XG5cbiAgICAjY3JlYXRlRkZtcGVnU3RyZWFtKHN0cmVhbTogUmVhZGFibGUgfCBzdHJpbmcsIHRyYWNrOiBUcmFjaywgc2VlayA9IDAsIG9wdXM/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGZmbXBlZ1N0cmVhbSA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWdcbiAgICAgICAgICAgIC5jcmVhdGVTdHJlYW0oc3RyZWFtLCB7XG4gICAgICAgICAgICAgICAgZW5jb2RlckFyZ3M6IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuYXJncyxcbiAgICAgICAgICAgICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgICAgICAgICAgICBmbXQ6IG9wdXMgPyAnb3B1cycgOiAnczE2bGUnLFxuICAgICAgICAgICAgICAgIHVzZUxlZ2FjeUZGbXBlZzogISF0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnVzZUxlZ2FjeUZGbXBlZyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBgJHtlcnJ9YC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICBgU3RyZWFtIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IgZnJvbSBGRm1wZWcgc3RyZWFtOiAke2Vyci5zdGFjayB8fCBlcnIubWVzc2FnZSB8fCBlcnJ9YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChtLmluY2x1ZGVzKCdwcmVtYXR1cmUgY2xvc2UnKSB8fCBtLmluY2x1ZGVzKCdlcGlwZScpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LnBsYXllckVycm9yLCB0aGlzLnF1ZXVlLCBlcnIsIHRyYWNrKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmZm1wZWdTdHJlYW07XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi9UeXBlVXRpbCc7XG5pbXBvcnQgeyBFeGNlcHRpb25zIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGZldGNoIH0gZnJvbSAndW5kaWNpJztcblxuLy8gI3JlZ2lvbiBzY2FyeSB0aGluZ3MgYmVsb3cgKnNpZ2gqXG5jb25zdCBzcG90aWZ5U29uZ1JlZ2V4ID1cbiAgICAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnRyYWNrXFwvfFxcP3VyaT1zcG90aWZ5OnRyYWNrOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlQbGF5bGlzdFJlZ2V4ID1cbiAgICAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnBsYXlsaXN0XFwvfFxcP3VyaT1zcG90aWZ5OnBsYXlsaXN0OikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlBbGJ1bVJlZ2V4ID1cbiAgICAvXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OmFsYnVtXFwvfFxcP3VyaT1zcG90aWZ5OmFsYnVtOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHZpbWVvUmVnZXggPVxuICAgIC9eKGh0dHB8aHR0cHMpPzpcXC9cXC8od3d3XFwufHBsYXllclxcLik/dmltZW9cXC5jb21cXC8oPzpjaGFubmVsc1xcLyg/OlxcdytcXC8pP3xncm91cHNcXC8oW14vXSopXFwvdmlkZW9zXFwvfHZpZGVvXFwvfCkoXFxkKykoPzp8XFwvXFw/KSQvO1xuY29uc3QgcmV2ZXJibmF0aW9uUmVnZXggPSAvXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC8oc29uZ3xhbGJ1bSlcXC8uKz8oXFwvLis/XFw/aT18XFwvKShbMC05XSspJC87XG5jb25zdCBhcHBsZU11c2ljUGxheWxpc3RSZWdleCA9IC9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC9wbGF5bGlzdFxcLy4rXFwvcGxcXC4odS18cG0tKT9bYS16QS1aMC05XSskLztcbmNvbnN0IGFwcGxlTXVzaWNBbGJ1bVJlZ2V4ID0gL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL2FsYnVtXFwvLitcXC8oWzAtOV0rKSQvO1xuY29uc3Qgc291bmRjbG91ZFRyYWNrUmVnZXggPSAvXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4ID0gL15odHRwcz86XFwvXFwvKG0ufHd3dy4pP3NvdW5kY2xvdWQuY29tXFwvKFxcd3wtKStcXC9zZXRzXFwvKFxcd3wtKSsoLispPyQvO1xuY29uc3QgeW91dHViZVBsYXlsaXN0UmVnZXggPVxuICAgIC9eaHR0cHM/OlxcL1xcLyh3d3cuKT95b3V0dWJlLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD0oKFBMfEZMfFVVfExMfFJEfE9MKVthLXpBLVowLTktX117MTYsNDF9KSQvO1xuY29uc3QgeW91dHViZVZpZGVvVVJMUmVnZXggPVxuICAgIC9eKCg/Omh0dHBzPzopP1xcL1xcLyk/KCg/Ond3d3xtKVxcLik/KCg/OnlvdXR1YmVcXC5jb218eW91dHUuYmUpKShcXC8oPzpbXFx3LV0rXFw/dj18ZW1iZWRcXC98dlxcLyk/KShbXFx3LV0rKShcXFMrKT8kLztcbmNvbnN0IHlvdXR1YmVWaWRlb0lkUmVnZXggPSAvXlthLXpBLVowLTktX117MTF9JC87XG4vLyAjZW5kcmVnaW9uIHNjYXJ5IHRoaW5ncyBhYm92ZSAqc2lnaCpcblxuY29uc3QgRG9tYWluc01hcCA9IHtcbiAgICBZb3VUdWJlOiBbJ3lvdXR1YmUuY29tJywgJ3lvdXR1LmJlJywgJ211c2ljLnlvdXR1YmUuY29tJywgJ2dhbWluZy55b3V0dWJlLmNvbScsICd3d3cueW91dHViZS5jb20nLCAnbS55b3V0dWJlLmNvbSddLFxuICAgIFNwb3RpZnk6IFsnb3Blbi5zcG90aWZ5LmNvbScsICdlbWJlZC5zcG90aWZ5LmNvbSddLFxuICAgIFZpbWVvOiBbJ3ZpbWVvLmNvbScsICdwbGF5ZXIudmltZW8uY29tJ10sXG4gICAgUmV2ZXJiTmF0aW9uOiBbJ3JldmVyYm5hdGlvbi5jb20nXSxcbiAgICBTb3VuZENsb3VkOiBbJ3NvdW5kY2xvdWQuY29tJ10sXG4gICAgQXBwbGVNdXNpYzogWydtdXNpYy5hcHBsZS5jb20nXSxcbn07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgcmVkaXJlY3REb21haW5zID0gbmV3IFNldChbXG4gICAgL15odHRwcz86XFwvXFwvc3BvdGlmeS5saW5rXFwvW0EtWmEtejAtOV0rJC8sXG4gICAgL15odHRwczpcXC9cXC9vblxcLnNvdW5kY2xvdWRcXC5jb21cXC9bYS16QS1aMS05XXswLDE3fSQvXG5dKTtcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFF1ZXJ5IHtcbiAgICB0eXBlOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG4gICAgcXVlcnk6IHN0cmluZztcbn1cblxuY2xhc3MgUXVlcnlSZXNvbHZlciB7XG4gICAgLyoqXG4gICAgICogUXVlcnkgcmVzb2x2ZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAgIHN0YXRpYyBnZXQgcmVnZXgoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcG90aWZ5QWxidW1SZWdleCxcbiAgICAgICAgICAgIHNwb3RpZnlQbGF5bGlzdFJlZ2V4LFxuICAgICAgICAgICAgc3BvdGlmeVNvbmdSZWdleCxcbiAgICAgICAgICAgIHZpbWVvUmVnZXgsXG4gICAgICAgICAgICByZXZlcmJuYXRpb25SZWdleCxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRSZWdleCxcbiAgICAgICAgICAgIGFwcGxlTXVzaWNBbGJ1bVJlZ2V4LFxuICAgICAgICAgICAgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgsXG4gICAgICAgICAgICBhcHBsZU11c2ljU29uZ1JlZ2V4LFxuICAgICAgICAgICAgc291bmRjbG91ZFRyYWNrUmVnZXgsXG4gICAgICAgICAgICBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCxcbiAgICAgICAgICAgIHlvdXR1YmVQbGF5bGlzdFJlZ2V4LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZS1yZXNvbHZlIHJlZGlyZWN0IHVybHNcbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgcHJlUmVzb2x2ZShxdWVyeTogc3RyaW5nLCBtYXhEZXB0aCA9IDUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBpZiAoIVR5cGVVdGlsLmlzU3RyaW5nKHF1ZXJ5KSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRShxdWVyeSwgJ3N0cmluZycsIHR5cGVvZiBxdWVyeSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBkb21haW4gb2YgcmVkaXJlY3REb21haW5zKSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluLnRlc3QocXVlcnkpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocXVlcnksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdycsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKSBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAvLyBzcG90aWZ5IGRvZXMgbm90IFwicmVkaXJlY3RcIiwgaXQgcmV0dXJucyBhIHBhZ2Ugd2l0aCBqcyB0aGF0IHJlZGlyZWN0c1xuICAgICAgICAgICAgICAgICAgICBpZiAoL15odHRwcz86XFwvXFwvc3BvdGlmeS5hcHAubGlua1xcLyguKykkLy50ZXN0KHJlcy51cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGJvZHkuc3BsaXQoJ2h0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS90cmFjay8nKVsxXS5zcGxpdCgnP3NpPScpWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly9vcGVuLnNwb3RpZnkuY29tL3RyYWNrLyR7dGFyZ2V0fWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1heERlcHRoIDwgMSA/IHJlcy51cmwgOiB0aGlzLnByZVJlc29sdmUocmVzLnVybCwgbWF4RGVwdGggLSAxKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAgICovXG4gICAgc3RhdGljIHJlc29sdmUoXG4gICAgICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgICAgIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gsXG4gICAgKTogUmVzb2x2ZWRRdWVyeSB7XG4gICAgICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKSB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcbiAgICAgICAgaWYgKCFxdWVyeS5sZW5ndGgpIHRocm93IEV4Y2VwdGlvbnMuRVJSX0lORk9fUkVRVUlSRUQoJ3F1ZXJ5JywgU3RyaW5nKHF1ZXJ5KSk7XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSAodHlwZTogdHlwZW9mIGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeTogc3RyaW5nKSA9PiAoeyB0eXBlLCBxdWVyeSB9KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChxdWVyeSk7XG5cbiAgICAgICAgICAgIGlmIChEb21haW5zTWFwLllvdVR1YmUuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC8obSh1c2ljKT98Z2FtaW5nKVxcLi8sICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxheWxpc3RJZCA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCdsaXN0Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlkZW9JZCA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCd2Jyk7XG4gICAgICAgICAgICAgICAgaWYgKHBsYXlsaXN0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvSWQgJiYgcGxheWxpc3RJZC5zdGFydHNXaXRoKCdSRCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PSR7dmlkZW9JZH0mbGlzdD0ke3BsYXlsaXN0SWR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuWU9VVFVCRV9QTEFZTElTVCwgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9JHtwbGF5bGlzdElkfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoUXVlcnlSZXNvbHZlci52YWxpZGF0ZUlkKHF1ZXJ5KSB8fCBRdWVyeVJlc29sdmVyLnZhbGlkYXRlVVJMKHF1ZXJ5KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5ZT1VUVUJFX1ZJREVPLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuU3BvdGlmeS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoL2ludGwtKFthLXpBLVpdKylcXC8vLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKHNwb3RpZnlQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBpZiAoc3BvdGlmeUFsYnVtUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9BTEJVTSwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChzcG90aWZ5U29uZ1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfU09ORywgcXVlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlZpbWVvLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICAgICAgICAgIGlmICh2aW1lb1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlZJTUVPLCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuUmV2ZXJiTmF0aW9uLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICAgICAgICAgIGlmIChyZXZlcmJuYXRpb25SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5SRVZFUkJOQVRJT04sIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5Tb3VuZENsb3VkLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICAgICAgICAgIGlmIChzb3VuZGNsb3VkUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TT1VORENMT1VEX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgICAgICAgICAgaWYgKHNvdW5kY2xvdWRUcmFja1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNPVU5EQ0xPVURfVFJBQ0ssIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5BcHBsZU11c2ljLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICAgICAgICAgIGlmIChhcHBsZU11c2ljQWxidW1SZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19BTEJVTSwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChhcHBsZU11c2ljUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSkgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUkJJVFJBUlksIHF1ZXJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyB2aW1lbyBpZCBmcm9tIHVybFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRWaW1lb0lEKHF1ZXJ5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShxdWVyeSkudHlwZSA9PT0gUXVlcnlUeXBlLlZJTUVPID8gcXVlcnkuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgOiBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyB2YWxpZGF0ZUlkKHE6IHN0cmluZykge1xuICAgICAgICByZXR1cm4geW91dHViZVZpZGVvSWRSZWdleC50ZXN0KHEpO1xuICAgIH1cblxuICAgIHN0YXRpYyB2YWxpZGF0ZVVSTChxOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHlvdXR1YmVWaWRlb1VSTFJlZ2V4LnRlc3QocSk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBRdWVyeVJlc29sdmVyIH07XG4iLCAiaW1wb3J0IHsgU25vd2ZsYWtlVXRpbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFib3J0U2lnbmFsIHRvIGNhbmNlbCB0aGlzIGVudHJ5XG4gICAgICovXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmV4cG9ydCB0eXBlIEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyID0gKGV4Y2VwdGlvbjogRXJyb3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcXVldWVkIGVudHJpZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZW50cmllczogQXJyYXk8QXN5bmNRdWV1ZUVudHJ5PiA9IFtdO1xuXG4gICAgcHVibGljIGV4Y2VwdGlvbkhhbmRsZXI/OiBBc3luY1F1ZXVlRXhjZXB0aW9uSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGVudHJpZXMgcXVldWVcbiAgICAgKiBAcGFyYW0gY29uc3VtZSBXaGV0aGVyIG9yIG5vdCB0byBjb25zdW1lIGFsbCBlbnRyaWVzIGJlZm9yZSBjbGVhcmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcihjb25zdW1lID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGNvbnN1bWUpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY29uc3VtZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHF1ZXVlLiBSZXR1cm5zIGAwYCBpZiBubyBlbnRyaWVzIGFyZSBhdmFpbGFibGUuXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBY3F1aXJlIGFuIGVudHJ5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgLy8gbG9jayB0aGUgcXVldWVcbiAgICAgKiBjb25zdCBlbnRyeSA9IGFzeW5jUXVldWUuYWNxdWlyZSgpO1xuICAgICAqIC8vIHdhaXQgdW50aWwgcHJldmlvdXMgdGFzayBpcyBjb21wbGV0ZWRcbiAgICAgKiBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICogLy8gZG8gc29tZXRoaW5nIGV4cGVuc2l2ZVxuICAgICAqIGF3YWl0IHBlcmZvcm1Tb21ldGhpbmdFeHBlbnNpdmUoKTtcbiAgICAgKiAvLyBtYWtlIHN1cmUgdG8gcmVsZWFzZSB0aGUgbG9jayBvbmNlIGRvbmVcbiAgICAgKiBhc3luY1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgKlxuICAgICAqL1xuICAgIHB1YmxpYyBhY3F1aXJlKG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IEFzeW5jUXVldWVFbnRyeSh0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodGhpcy5leGNlcHRpb25IYW5kbGVyKSBlbnRyeS5nZXRUYXNrKCkuY2F0Y2godGhpcy5leGNlcHRpb25IYW5kbGVyKTtcblxuICAgICAgICBpZiAodGhpcy5lbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgZW50cnkuY29uc3VtZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZSB0aGUgY3VycmVudCBhY3F1aXNpdGlvbiBhbmQgbW92ZSB0byBuZXh0IGVudHJ5LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2hpZnQoKTtcbiAgICAgICAgdGhpcy5lbnRyaWVzWzBdPy5jb25zdW1lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIGFsbCBlbnRyaWVzXG4gICAgICovXG4gICAgcHVibGljIGNhbmNlbEFsbCgpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jYW5jZWwoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBnaXZlbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZVxuICAgICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZUVudHJ5KGVudHJ5OiBBc3luY1F1ZXVlRW50cnkpIHtcbiAgICAgICAgY29uc3QgZW50cnlJZHggPSB0aGlzLmVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG5cbiAgICAgICAgaWYgKGVudHJ5SWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShlbnRyeUlkeCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlRW50cnkge1xuICAgIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgICBwdWJsaWMgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvbkFib3J0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHJlc29sdmUhOiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgcmVqZWN0ITogKGVycjogRXJyb3IpID0+IHZvaWQ7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBBc3luY1F1ZXVlLCBwdWJsaWMgb3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zPy5zaWduYWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWJvcnRTaWduYWwodGhpcy5vcHRpb25zLnNpZ25hbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWJvcnRTaWduYWwoc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5zaWduYWwgPSBzaWduYWw7XG4gICAgICAgIHRoaXMub25BYm9ydCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVldWUucmVtb3ZlRW50cnkodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3VtZSgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIHRoaXMucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWxlYXNlKCkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcignQ2FuY2VsbGVkJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbnVwKCkge1xuICAgICAgICBpZiAodGhpcy5vbkFib3J0KSB0aGlzLnNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IG51bGw7XG4gICAgICAgIHRoaXMub25BYm9ydCA9IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRhc2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lLCBRdWV1ZUZpbHRlcnMgfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBBdWRpb0ZpbHRlcnMgfSBmcm9tICcuLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7IEJpcXVhZEZpbHRlcnMsIEVxdWFsaXplciwgRXF1YWxpemVyQmFuZCwgUENNRmlsdGVycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgRkZtcGVnU3RyZWFtT3B0aW9ucywgY3JlYXRlRkZtcGVnU3RyZWFtIH0gZnJvbSAnLi4vdXRpbHMvRkZtcGVnU3RyZWFtJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG50eXBlIEZpbHRlcnMgPSBrZXlvZiB0eXBlb2YgQXVkaW9GaWx0ZXJzLmZpbHRlcnM7XG5cbmNvbnN0IG1ha2VCYW5kcyA9IChhcnI6IG51bWJlcltdKSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxlbmd0aDogRXF1YWxpemVyLkJBTkRfQ09VTlQsXG4gICAgICAgIH0sXG4gICAgICAgIChfLCBpKSA9PiAoe1xuICAgICAgICAgICAgYmFuZDogaSxcbiAgICAgICAgICAgIGdhaW46IGFycltpXSA/IGFycltpXSAvIDMwIDogMCxcbiAgICAgICAgfSksXG4gICAgKSBhcyBFcXVhbGl6ZXJCYW5kW107XG59O1xuXG50eXBlIEVRUHJlc2V0ID0ge1xuICAgIEZsYXQ6IEVxdWFsaXplckJhbmRbXTtcbiAgICBDbGFzc2ljYWw6IEVxdWFsaXplckJhbmRbXTtcbiAgICBDbHViOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgRGFuY2U6IEVxdWFsaXplckJhbmRbXTtcbiAgICBGdWxsQmFzczogRXF1YWxpemVyQmFuZFtdO1xuICAgIEZ1bGxCYXNzVHJlYmxlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgRnVsbFRyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICAgIEhlYWRwaG9uZXM6IEVxdWFsaXplckJhbmRbXTtcbiAgICBMYXJnZUhhbGw6IEVxdWFsaXplckJhbmRbXTtcbiAgICBMaXZlOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgUGFydHk6IEVxdWFsaXplckJhbmRbXTtcbiAgICBQb3A6IEVxdWFsaXplckJhbmRbXTtcbiAgICBSZWdnYWU6IEVxdWFsaXplckJhbmRbXTtcbiAgICBSb2NrOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgU2thOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgU29mdDogRXF1YWxpemVyQmFuZFtdO1xuICAgIFNvZnRSb2NrOiBFcXVhbGl6ZXJCYW5kW107XG4gICAgVGVjaG5vOiBFcXVhbGl6ZXJCYW5kW107XG59O1xuXG5leHBvcnQgY29uc3QgRXF1YWxpemVyQ29uZmlndXJhdGlvblByZXNldDogUmVhZG9ubHk8RVFQcmVzZXQ+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgICBDbGFzc2ljYWw6IG1ha2VCYW5kcyhbXG4gICAgICAgIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC03LjIsIC03LjIsIC03LjIsIC05LjYsXG4gICAgXSksXG4gICAgQ2x1YjogbWFrZUJhbmRzKFstMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBEYW5jZTogbWFrZUJhbmRzKFs5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdKSxcbiAgICBGdWxsQmFzczogbWFrZUJhbmRzKFstOC4wLCA5LjYsIDkuNiwgNS42LCAxLjYsIC00LjAsIC04LjAsIC0xMC40LCAtMTEuMiwgLTExLjJdKSxcbiAgICBGdWxsQmFzc1RyZWJsZTogbWFrZUJhbmRzKFs3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF0pLFxuICAgIEZ1bGxUcmVibGU6IG1ha2VCYW5kcyhbLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XSksXG4gICAgSGVhZHBob25lczogbWFrZUJhbmRzKFs0LjgsIDExLjIsIDUuNiwgLTMuMiwgLTIuNCwgMS42LCA0LjgsIDkuNiwgMTIuOCwgMTQuNF0pLFxuICAgIExhcmdlSGFsbDogbWFrZUJhbmRzKFsxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV0pLFxuICAgIExpdmU6IG1ha2VCYW5kcyhbLTQuOCwgLTEuMTEwMjJlLTE1LCA0LjAsIDUuNiwgNS42LCA1LjYsIDQuMCwgMi40LCAyLjQsIDIuNF0pLFxuICAgIFBhcnR5OiBtYWtlQmFuZHMoW1xuICAgICAgICA3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjIsXG4gICAgXSksXG4gICAgUG9wOiBtYWtlQmFuZHMoWy0xLjYsIDQuOCwgNy4yLCA4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMi40LCAtMS42LCAtMS42XSksXG4gICAgUmVnZ2FlOiBtYWtlQmFuZHMoW1xuICAgICAgICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNS42LCAtMS4xMTAyMmUtMTUsIDYuNCwgNi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSxcbiAgICAgICAgLTEuMTEwMjJlLTE1LFxuICAgIF0pLFxuICAgIFJvY2s6IG1ha2VCYW5kcyhbOC4wLCA0LjgsIC01LjYsIC04LjAsIC0zLjIsIDQuMCwgOC44LCAxMS4yLCAxMS4yLCAxMS4yXSksXG4gICAgU2thOiBtYWtlQmFuZHMoWy0yLjQsIC00LjgsIC00LjAsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDguOCwgOS42LCAxMS4yLCA5LjZdKSxcbiAgICBTb2Z0OiBtYWtlQmFuZHMoWzQuOCwgMS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0xLjExMDIyZS0xNSwgNC4wLCA4LjAsIDkuNiwgMTEuMiwgMTIuMF0pLFxuICAgIFNvZnRSb2NrOiBtYWtlQmFuZHMoWzQuMCwgNC4wLCAyLjQsIC0xLjExMDIyZS0xNSwgLTQuMCwgLTUuNiwgLTMuMiwgLTEuMTEwMjJlLTE1LCAyLjQsIDguOF0pLFxuICAgIFRlY2hubzogbWFrZUJhbmRzKFs4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNC44LCAtMS4xMTAyMmUtMTUsIDguMCwgOS42LCA5LjYsIDguOF0pLFxufSk7XG5cbmV4cG9ydCBjbGFzcyBGRm1wZWdGaWx0ZXJlcjxNZXRhID0gdW5rbm93bj4ge1xuICAgICNmZm1wZWdGaWx0ZXJzOiBGaWx0ZXJzW10gPSBbXTtcbiAgICAjaW5wdXRBcmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBmZm1wZWcgbWF5IGJlIHNraXBwZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNraXBwYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5hZi5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICAgIH1cblxuICAgICNzZXRGaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlIH0gPSB0aGlzLmFmO1xuICAgICAgICAvLyBza2lwIGlmIGZpbHRlcnMgYXJlIHRoZSBzYW1lXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGZpbHRlcnMuZXZlcnkoKGYpID0+IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpICYmXG4gICAgICAgICAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzLmV2ZXJ5KChmKSA9PiBmaWx0ZXJzLmluY2x1ZGVzKGYpKVxuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgY29uc3QgaWdub3JlRmlsdGVycyA9XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpICYmXG4gICAgICAgICAgICAhZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJyk7XG4gICAgICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuc2xpY2UoKTtcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IFsuLi5uZXcgU2V0KGZpbHRlcnMpXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICAgICAgICBxdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5hdWRpb0ZpbHRlcnNVcGRhdGUsIHF1ZXVlLCBwcmV2LCB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBpbnB1dCBhcmdzIGZvciBGRm1wZWdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SW5wdXRBcmdzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpXG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKCdhcmdzJywgJ0FycmF5PHN0cmluZz4nLCAnaW52YWxpZCBpdGVtKHMpJyk7XG4gICAgICAgIHRoaXMuI2lucHV0QXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGlucHV0IGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlucHV0QXJncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lucHV0QXJncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZW5jb2RlciBhcmdzXG4gICAgICovXG4gICAgcHVibGljIGdldCBlbmNvZGVyQXJncygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlcnMubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICAgICAgcmV0dXJuIFsnLWFmJywgdGhpcy50b1N0cmluZygpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZmluYWwgZmZtcGVnIGFyZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGFyZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0QXJncy5jb25jYXQodGhpcy5lbmNvZGVyQXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGZmbXBlZyBzdHJlYW1cbiAgICAgKiBAcGFyYW0gc291cmNlIFRoZSBzdHJlYW0gc291cmNlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHN0cmVhbSBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVN0cmVhbShzb3VyY2U6IHN0cmluZyB8IFJlYWRhYmxlLCBvcHRpb25zOiBGRm1wZWdTdHJlYW1PcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLiNpbnB1dEFyZ3MubGVuZ3RoKSBvcHRpb25zLmVuY29kZXJBcmdzID0gWy4uLnRoaXMuI2lucHV0QXJncywgLi4uKG9wdGlvbnMuZW5jb2RlckFyZ3MgfHwgW10pXTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZGbXBlZ1N0cmVhbShzb3VyY2UsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBmZm1wZWcgZmlsdGVyc1xuICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIHNldEZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdIHwgUmVjb3JkPEZpbHRlcnMsIGJvb2xlYW4+IHwgc3RyaW5nW10gfCBib29sZWFuKSB7XG4gICAgICAgIGxldCBfZmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID8gW10gOiAoT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkge1xuICAgICAgICAgICAgX2ZpbHRlcnMgPSBmaWx0ZXJzIGFzIEZpbHRlcnNbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9maWx0ZXJzID0gT2JqZWN0LmVudHJpZXMoZmlsdGVycylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChyZXMpID0+IHJlc1sxXSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAubWFwKChtKSA9PiBtWzBdKSBhcyBGaWx0ZXJzW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyhfZmlsdGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudGx5IGFjdGl2ZSBmZm1wZWcgZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgICAgICB0aGlzLnNldEZpbHRlcnMoZmlsdGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlIGdpdmVuIGZmbXBlZyBmaWx0ZXIocylcbiAgICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyKHMpXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZShmaWx0ZXJzOiBGaWx0ZXJzW10gfCBGaWx0ZXJzKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgZmlsdGVycyA9IFtmaWx0ZXJzXTtcbiAgICAgICAgY29uc3QgZnJlc2g6IEZpbHRlcnNbXSA9IFtdO1xuXG4gICAgICAgIGZpbHRlcnMuZm9yRWFjaCgoZikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycy5pbmNsdWRlcyhmKSkgcmV0dXJuO1xuICAgICAgICAgICAgZnJlc2gucHVzaChmKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuI3NldEZpbHRlcnModGhpcy4jZmZtcGVnRmlsdGVycy5maWx0ZXIoKHIpID0+ICFmaWx0ZXJzLmluY2x1ZGVzKHIpKS5jb25jYXQoZnJlc2gpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZGVmYXVsdCBmaWx0ZXJzXG4gICAgICogQHBhcmFtIGZmIEZpbHRlcnMgbGlzdFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXREZWZhdWx0cyhmZjogRmlsdGVyc1tdKSB7XG4gICAgICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMgPSBmZjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbGlzdCBvZiBlbmFibGVkIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmlsdGVyc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIGRpc2FibGVkIGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmlsdGVyc0Rpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLm5hbWVzLmZpbHRlcigoZikgPT4gIXRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VuYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZGlzYWJsZWRcbiAgICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNEaXNhYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0VuYWJsZWQoZmlsdGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmlsdGVyIGlzIGEgdmFsaWQgZmlsdGVyXG4gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIHRlc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNWYWxpZEZpbHRlcihmaWx0ZXI6IHN0cmluZyk6IGZpbHRlciBpcyBGaWx0ZXJzTmFtZSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuaGFzKGZpbHRlciBhcyBGaWx0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBhcnJheVxuICAgICAqL1xuICAgIHB1YmxpYyB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzLm1hcCgoZmlsdGVyKSA9PiBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIEpTT04gb2JqZWN0XG4gICAgICovXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3Qgb2JqID0ge30gYXMgUmVjb3JkPGtleW9mIFF1ZXVlRmlsdGVycywgc3RyaW5nPjtcblxuICAgICAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKSA9PiAob2JqW2ZpbHRlcl0gPSBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpKTtcblxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBjdXJyZW50IGZpbHRlcnNcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuY3JlYXRlKHRoaXMuZmlsdGVycyk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlIHtcbiAgICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgICBiaXF1YWQ6IEJpcXVhZEZpbHRlcnMgfCBudWxsO1xuICAgIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgICB2b2x1bWU6IG51bWJlcjtcbiAgICBzYW1wbGVSYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGEgPSB1bmtub3duPiB7XG4gICAgcHVibGljIGdyYXBoID0gbmV3IEFGaWx0ZXJHcmFwaDxNZXRhPih0aGlzKTtcbiAgICBwdWJsaWMgZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICAgIHB1YmxpYyBlcXVhbGl6ZXJQcmVzZXRzID0gRXF1YWxpemVyQ29uZmlndXJhdGlvblByZXNldDtcbiAgICBwdWJsaWMgX2xhc3RGaWx0ZXJzQ2FjaGU6IEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlID0ge1xuICAgICAgICBiaXF1YWQ6IG51bGwsXG4gICAgICAgIGVxdWFsaXplcjogW10sXG4gICAgICAgIGZpbHRlcnM6IFtdLFxuICAgICAgICB2b2x1bWU6IDEwMCxcbiAgICAgICAgc2FtcGxlUmF0ZTogLTEsXG4gICAgfTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5xdWV1ZS5vcHRpb25zLnZvbHVtZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gdGhpcy5xdWV1ZS5vcHRpb25zLnZvbHVtZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IGVuYWJsZSB0aGlzIGluIHRoZSBmdXR1cmVcbiAgICAvLyBwdWJsaWMgZ2V0IGZmbXBlZygpOiBGRm1wZWdGaWx0ZXJlcjxNZXRhPiB8IG51bGwge1xuICAgIC8vICAgICBpZiAodGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnKSB7XG4gICAgLy8gICAgICAgICBpZiAodGhpcy4jZmZtcGVnKSB0aGlzLiNmZm1wZWcgPSBudWxsO1xuICAgIC8vICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBpZiAoIXRoaXMuI2ZmbXBlZykge1xuICAgIC8vICAgICAgICAgdGhpcy4jZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZztcbiAgICAvLyB9XG5cbiAgICAvKipcbiAgICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaWdpdGFsIGJpcXVhZCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERTUCBmaWx0ZXJzXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAgICovXG4gICAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJlc2FtcGxlciB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxheSBjdXJyZW50IHRyYWNrIGluIHRyYW5zaXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBzZWVrIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHRyaWdnZXJSZXBsYXkoc2VlayA9IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRoaXMucXVldWUuY3VycmVudFRyYWNrLCB7XG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNlZWssXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbk1vZGU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFGaWx0ZXJHcmFwaDxNZXRhID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgICBwdWJsaWMgZ2V0IGZmbXBlZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYuZmZtcGVnPy5maWx0ZXJzID8/IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuYWYuZXF1YWxpemVyPy5iYW5kTXVsdGlwbGllcnMgfHwgW10pLm1hcCgobSwgaSkgPT4gKHtcbiAgICAgICAgICAgIGJhbmQ6IGksXG4gICAgICAgICAgICBnYWluOiBtLFxuICAgICAgICB9KSkgYXMgRXF1YWxpemVyQmFuZFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuYWYuYmlxdWFkPy5nZXRGaWx0ZXJOYW1lKCkgYXMgRXhjbHVkZTxCaXF1YWRGaWx0ZXJzLCBudW1iZXI+IHwgbnVsbCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFmLmZpbHRlcnM/LmZpbHRlcnMgfHwgW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFmLnZvbHVtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWYucmVzYW1wbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBkdW1wKCk6IEZpbHRlckdyYXBoIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZmbXBlZzogdGhpcy5mZm1wZWcsXG4gICAgICAgICAgICBlcXVhbGl6ZXI6IHRoaXMuZXF1YWxpemVyLFxuICAgICAgICAgICAgYmlxdWFkOiB0aGlzLmJpcXVhZCxcbiAgICAgICAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycyxcbiAgICAgICAgICAgIHNhbXBsZVJhdGU6IHRoaXMucmVzYW1wbGVyPy50YXJnZXRTYW1wbGVSYXRlIHx8IHRoaXMucmVzYW1wbGVyPy5zYW1wbGVSYXRlIHx8IDQ4MDAwLFxuICAgICAgICAgICAgdm9sdW1lOiB0aGlzLnZvbHVtZT8udm9sdW1lID8/IDEwMCxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JhcGgge1xuICAgIGZmbXBlZzogRmlsdGVyc1tdO1xuICAgIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICAgIGJpcXVhZDogRXhjbHVkZTxCaXF1YWRGaWx0ZXJzLCBudW1iZXI+IHwgbnVsbDtcbiAgICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gICAgdm9sdW1lOiBudW1iZXI7XG4gICAgc2FtcGxlUmF0ZTogbnVtYmVyO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0ICogYXMgcHJpc20gZnJvbSAncHJpc20tbWVkaWEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZGbXBlZ1N0cmVhbU9wdGlvbnMge1xuICAgIGZtdD86IHN0cmluZztcbiAgICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICAgIHNlZWs/OiBudW1iZXI7XG4gICAgc2tpcD86IGJvb2xlYW47XG4gICAgY29va2llcz86IHN0cmluZztcbiAgICB1c2VMZWdhY3lGRm1wZWc/OiBib29sZWFuO1xufVxuXG5jb25zdCBnZXRGRm1wZWdQcm92aWRlciA9IChsZWdhY3kgPSBmYWxzZSkgPT5cbiAgICBsZWdhY3kgPyAocHJpc20gYXMgdHlwZW9mIHByaXNtICYgeyBkZWZhdWx0OiB0eXBlb2YgcHJpc20gfSkuZGVmYXVsdD8uRkZtcGVnIHx8IHByaXNtLkZGbXBlZyA6IEZGbXBlZztcblxuY29uc3QgcmVzb2x2ZUFyZ3MgPSAoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkPik6IHN0cmluZ1tdID0+IHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29uZmlnKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gYWNjO1xuICAgICAgICBhY2MucHVzaChgLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdIGFzIHN0cmluZ1tdKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtOiBzdHJpbmcsIGZtdD86IHN0cmluZywgY29va2llcz86IHN0cmluZykge1xuICAgIGNvbnN0IGFyZ3MgPSByZXNvbHZlQXJncyh7XG4gICAgICAgIHJlY29ubmVjdDogMSxcbiAgICAgICAgcmVjb25uZWN0X3N0cmVhbWVkOiAxLFxuICAgICAgICByZWNvbm5lY3RfZGVsYXlfbWF4OiA1LFxuICAgICAgICBpOiBzdHJlYW0sXG4gICAgICAgIGFuYWx5emVkdXJhdGlvbjogMCxcbiAgICAgICAgbG9nbGV2ZWw6IDAsXG4gICAgICAgIGFyOiA0ODAwMCxcbiAgICAgICAgYWM6IDIsXG4gICAgICAgIGY6IGAke3R5cGVvZiBmbXQgPT09ICdzdHJpbmcnID8gZm10IDogJ3MxNmxlJ31gLFxuICAgICAgICBhY29kZWM6IGZtdCA9PT0gJ29wdXMnID8gJ2xpYm9wdXMnIDogbnVsbCxcbiAgICAgICAgY29va2llczogdHlwZW9mIGNvb2tpZXMgPT09ICdzdHJpbmcnID8gKCFjb29raWVzLmluY2x1ZGVzKCcgJykgPyBjb29raWVzIDogYFwiJHtjb29raWVzfVwiYCkgOiBudWxsLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFyZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGRk1QRUdfQVJHU19QSVBFRChmbXQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhcmdzID0gcmVzb2x2ZUFyZ3Moe1xuICAgICAgICBhbmFseXplZHVyYXRpb246IDAsXG4gICAgICAgIGxvZ2xldmVsOiAwLFxuICAgICAgICBhcjogNDgwMDAsXG4gICAgICAgIGFjOiAyLFxuICAgICAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICAgICAgYWNvZGVjOiBmbXQgPT09ICdvcHVzJyA/ICdsaWJvcHVzJyA6IG51bGwsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEZGbXBlZyBzdHJlYW1cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIHNvdXJjZSBzdHJlYW1cbiAqIEBwYXJhbSBvcHRpb25zIEZGbXBlZyBzdHJlYW0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRkZtcGVnU3RyZWFtKHN0cmVhbTogUmVhZGFibGUgfCBEdXBsZXggfCBzdHJpbmcsIG9wdGlvbnM/OiBGRm1wZWdTdHJlYW1PcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnM/LnNraXAgJiYgdHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHJldHVybiBzdHJlYW07XG4gICAgb3B0aW9ucyA/Pz0ge307XG4gICAgY29uc3QgYXJncyA9XG4gICAgICAgIHR5cGVvZiBzdHJlYW0gPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IEZGTVBFR19BUkdTX1NUUklORyhzdHJlYW0sIG9wdGlvbnMuZm10LCBvcHRpb25zLmNvb2tpZXMpXG4gICAgICAgICAgICA6IEZGTVBFR19BUkdTX1BJUEVEKG9wdGlvbnMuZm10KTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKG9wdGlvbnMuc2VlaykpIGFyZ3MudW5zaGlmdCgnLXNzJywgU3RyaW5nKG9wdGlvbnMuc2VlaykpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgICBjb25zdCBGRk1QRUcgPSBnZXRGRm1wZWdQcm92aWRlcighIW9wdGlvbnMudXNlTGVnYWN5RkZtcGVnKTtcblxuICAgIGNvbnN0IHRyYW5zY29kZXI6IER1cGxleCA9IG5ldyBGRk1QRUcoeyBzaGVsbDogZmFsc2UsIGFyZ3MgfSk7XG5cbiAgICB0cmFuc2NvZGVyLm9uKCdjbG9zZScsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcblxuICAgIGlmICh0eXBlb2Ygc3RyZWFtICE9PSAnc3RyaW5nJykge1xuICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgKCkgPT4gdHJhbnNjb2Rlci5kZXN0cm95KCkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZSh0cmFuc2NvZGVyIGFzIGFueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zY29kZXI7XG59XG4iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSB7XG4gICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IG51bWJlcjtcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiBib29sZWFuO1xuICAgICAgICBwbGF5aW5nOiBib29sZWFuO1xuICAgICAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgICAgIGlkbGU6IGJvb2xlYW47XG4gICAgfTtcbiAgICB0cmFja3NDb3VudDogbnVtYmVyO1xuICAgIGhpc3RvcnlTaXplOiBudW1iZXI7XG4gICAgZXh0cmFjdG9yczogbnVtYmVyO1xuICAgIGxpc3RlbmVyczogbnVtYmVyO1xuICAgIG1lbW9yeVVzYWdlOiBOb2RlSlMuTWVtb3J5VXNhZ2U7XG4gICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogc3RyaW5nO1xuICAgICAgICBwbGF5ZXI6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IHVua25vd24+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgc3RhdGlzdGljcyBvZiB0aGlzIHF1ZXVlXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF0ZW5jeToge1xuICAgICAgICAgICAgICAgIGV2ZW50TG9vcDogdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRMb29wTGFnLFxuICAgICAgICAgICAgICAgIHZvaWNlQ29ubmVjdGlvbjogdGhpcy5xdWV1ZS5waW5nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXR1czoge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcmluZzogdGhpcy5xdWV1ZS5ub2RlLmlzQnVmZmVyaW5nKCksXG4gICAgICAgICAgICAgICAgcGxheWluZzogdGhpcy5xdWV1ZS5ub2RlLmlzUGxheWluZygpLFxuICAgICAgICAgICAgICAgIHBhdXNlZDogdGhpcy5xdWV1ZS5ub2RlLmlzUGF1c2VkKCksXG4gICAgICAgICAgICAgICAgaWRsZTogdGhpcy5xdWV1ZS5ub2RlLmlzSWRsZSgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYWNrc0NvdW50OiB0aGlzLnF1ZXVlLnRyYWNrcy5zaXplLFxuICAgICAgICAgICAgaGlzdG9yeVNpemU6IHRoaXMucXVldWUuaGlzdG9yeS50cmFja3Muc2l6ZSxcbiAgICAgICAgICAgIGV4dHJhY3RvcnM6IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuc2l6ZSxcbiAgICAgICAgICAgIGxpc3RlbmVyczogdGhpcy5xdWV1ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5jaGFubmVsPy5tZW1iZXJzLmZpbHRlcigobSkgPT4gIW0udXNlci5ib3QpLnNpemUgfHwgMCxcbiAgICAgICAgICAgIG1lbW9yeVVzYWdlOiBwcm9jZXNzLm1lbW9yeVVzYWdlKCksXG4gICAgICAgICAgICB2ZXJzaW9uczoge1xuICAgICAgICAgICAgICAgIG5vZGU6IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgICAgICAgICBwbGF5ZXI6ICc3LjAuMC1kZXYuMycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9IGFzIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGE7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgTHJjR2V0UmVzdWx0LCBMcmNTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCB0eXBlIEx5cmljc0RhdGEgPSBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuZXhwb3J0IHR5cGUgVW5zdWJzY3JpYmUgPSAoKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgTHlyaWNzQ2FsbGJhY2sgPSAobHlyaWNzOiBzdHJpbmcsIHRpbWVzdGFtcDogbnVtYmVyKSA9PiB1bmtub3duO1xuZXhwb3J0IHR5cGUgTHlyaWNzQXQgPSB7IHRpbWVzdGFtcDogbnVtYmVyOyBsaW5lOiBzdHJpbmcgfTtcblxuY29uc3QgdGltZXN0YW1wUGF0dGVybiA9IC9cXFsoXFxkezJ9KTooXFxkezJ9KVxcLihcXGR7Mn0pXFxdLztcblxuZXhwb3J0IGNsYXNzIFN5bmNlZEx5cmljc1Byb3ZpZGVyIHtcbiAgICAjbG9vcDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgICAjY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrIHwgbnVsbCA9IG51bGw7XG4gICAgI29uVW5zdWJzY3JpYmU6IFVuc3Vic2NyaWJlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgaW50ZXJ2YWwgPSAxMDA7XG4gICAgcHVibGljIHJlYWRvbmx5IGx5cmljczogTHlyaWNzRGF0YSA9IG5ldyBNYXAoKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcXVldWU6IEd1aWxkUXVldWUsIHB1YmxpYyByZWFkb25seSByYXc/OiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpIHtcbiAgICAgICAgaWYgKHJhdz8uc3luY2VkTHlyaWNzKSB0aGlzLmxvYWQocmF3Py5zeW5jZWRMeXJpY3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1N1YnNjcmliZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWxsYmFjayAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChseXJpY3M6IHN0cmluZykge1xuICAgICAgICBpZiAoIWx5cmljcykgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9UX0VYSVNUSU5HKCdzeW5jZWRMeXJpY3MnKTtcblxuICAgICAgICB0aGlzLmx5cmljcy5jbGVhcigpO1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgY29uc3QgbGluZXMgPSBseXJpY3Muc3BsaXQoJ1xcbicpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKHRpbWVzdGFtcFBhdHRlcm4pO1xuXG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHNdID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wID0gcGFyc2VJbnQobWludXRlcykgKiA2MCAqIDEwMDAgKyBwYXJzZUludChzZWNvbmRzKSAqIDEwMDAgKyBwYXJzZUludChtaWxsaXNlY29uZHMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5seXJpY3Muc2V0KHRpbWVzdGFtcCwgbGluZS5yZXBsYWNlKHRpbWVzdGFtcFBhdHRlcm4sICcnKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbHlyaWNzIGF0IGEgc3BlY2lmaWMgdGltZSBvciBhdCB0aGUgY2xvc2VzdCB0aW1lIChcdTAwQjEyIHNlY29uZHMpXG4gICAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgcHVibGljIGF0KHRpbWU6IG51bWJlcik6IEx5cmljc0F0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGxvd2VzdFRpbWUgPSB0aGlzLmx5cmljcy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAobG93ZXN0VGltZSA9PSBudWxsIHx8IHRpbWUgPCBsb3dlc3RUaW1lKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMubHlyaWNzLmhhcyh0aW1lKSkgcmV0dXJuIHsgbGluZTogdGhpcy5seXJpY3MuZ2V0KHRpbWUpIGFzIHN0cmluZywgdGltZXN0YW1wOiB0aW1lIH07XG5cbiAgICAgICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20odGhpcy5seXJpY3Mua2V5cygpKTtcblxuICAgICAgICBjb25zdCBjbG9zZXN0ID0ga2V5cy5yZWR1Y2UoKGEsIGIpID0+IChNYXRoLmFicyhiIC0gdGltZSkgPCBNYXRoLmFicyhhIC0gdGltZSkgPyBiIDogYSkpO1xuXG4gICAgICAgIGlmIChjbG9zZXN0ID4gdGltZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKGNsb3Nlc3QgLSB0aW1lKSA+IDIwMDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmx5cmljcy5nZXQoY2xvc2VzdCk7XG5cbiAgICAgICAgaWYgKCFsaW5lKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4geyB0aW1lc3RhbXA6IGNsb3Nlc3QsIGxpbmUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayBmb3IgdGhlIGx5cmljcyBjaGFuZ2UuXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNoYW5nZShjYWxsYmFjazogTHlyaWNzQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy4jY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayB0byBkZXRlY3Qgd2hlbiB0aGUgcHJvdmlkZXIgaXMgdW5zdWJzY3JpYmVkLlxuICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgb25VbnN1YnNjcmliZShjYWxsYmFjazogVW5zdWJzY3JpYmUpIHtcbiAgICAgICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVuc3Vic2NyaWJlcyBmcm9tIHRoZSBxdWV1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdW5zdWJzY3JpYmUoKSB7XG4gICAgICAgIGlmICh0aGlzLiNsb29wKSBjbGVhckludGVydmFsKHRoaXMuI2xvb3ApO1xuICAgICAgICBpZiAodGhpcy4jb25VbnN1YnNjcmliZSkgdGhpcy4jb25VbnN1YnNjcmliZSgpO1xuXG4gICAgICAgIHRoaXMuI2NhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IG51bGw7XG4gICAgICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZXMgdG8gdGhlIHF1ZXVlIHRvIG1vbml0b3IgdGhlIGN1cnJlbnQgdGltZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgc3Vic2NyaWJlKCk6IFVuc3Vic2NyaWJlIHtcbiAgICAgICAgaWYgKHRoaXMuI2xvb3ApIHJldHVybiAoKSA9PiB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgdGhpcy4jY3JlYXRlTG9vcCgpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSBseXJpY3MgcHJvdmlkZXIuXG4gICAgICovXG4gICAgcHVibGljIHBhdXNlKCkge1xuICAgICAgICBjb25zdCBoYXNMb29wID0gdGhpcy4jbG9vcCAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoaGFzTG9vcCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wISk7XG4gICAgICAgICAgICB0aGlzLiNsb29wID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNMb29wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3VtZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzdW1lKCkge1xuICAgICAgICBjb25zdCBoYXNMb29wID0gdGhpcy4jbG9vcCAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoIWhhc0xvb3ApIHRoaXMuI2NyZWF0ZUxvb3AoKTtcblxuICAgICAgICByZXR1cm4gIWhhc0xvb3A7XG4gICAgfVxuXG4gICAgI2NyZWF0ZUxvb3AoKSB7XG4gICAgICAgIGlmICghdGhpcy4jY2FsbGJhY2spIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuI2xvb3ApIGNsZWFySW50ZXJ2YWwodGhpcy4jbG9vcCk7XG5cbiAgICAgICAgbGV0IGxhc3RWYWx1ZTogTHlyaWNzQXQgfCBudWxsID0gbnVsbDtcblxuICAgICAgICB0aGlzLiNsb29wID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuZGVsZXRlZCkgcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLiNjYWxsYmFjayB8fCAhdGhpcy5xdWV1ZS5pc1BsYXlpbmcoKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB0aW1lID0gdGhpcy5xdWV1ZS5ub2RlLmdldFRpbWVzdGFtcCgpO1xuICAgICAgICAgICAgaWYgKCF0aW1lKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IGx5cmljcyA9IHRoaXMuYXQodGltZS5jdXJyZW50LnZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKCFseXJpY3MpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKGxhc3RWYWx1ZSAhPT0gbnVsbCAmJiBseXJpY3MubGluZSA9PT0gbGFzdFZhbHVlLmxpbmUgJiYgbHlyaWNzLnRpbWVzdGFtcCA9PT0gbGFzdFZhbHVlLnRpbWVzdGFtcClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGxhc3RWYWx1ZSA9IGx5cmljcztcblxuICAgICAgICAgICAgdGhpcy4jY2FsbGJhY2sobHlyaWNzLmxpbmUsIGx5cmljcy50aW1lc3RhbXApO1xuICAgICAgICB9LCB0aGlzLmludGVydmFsKS51bnJlZigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuL0FzeW5jUXVldWUnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0RW50aXR5ID0gKCkgPT4gUHJvbWlzZTxSZXNwb25zZT47XG5cbmV4cG9ydCBjbGFzcyBTZXF1ZW50aWFsQnVja2V0IHtcbiAgICBwdWJsaWMgbGltaXQgPSAxO1xuICAgIHB1YmxpYyByZW1haW5pbmcgPSAxO1xuICAgIHB1YmxpYyByZXNldEFmdGVyID0gMDtcbiAgICBwdWJsaWMgcXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICAgIHB1YmxpYyBNQVhfUkVUUklFUyA9IDU7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGJ1Y2tldCBpcyByYXRlIGxpbWl0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGlzUmF0ZUxpbWl0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbWFpbmluZyA8PSAwICYmIERhdGUubm93KCkgPCB0aGlzLnJlc2V0QWZ0ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5xdWV1ZXMgYSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3QgZnVuY3Rpb24gdG8gZW5xdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBlbnF1ZXVlKHJlcTogUmVxdWVzdEVudGl0eSkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUuYWNxdWlyZSgpO1xuICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBlbnRyeS5yZWxlYXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9yZXF1ZXN0KHJlcTogUmVxdWVzdEVudGl0eSwgcmV0cmllcyA9IDApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgICAgIHdoaWxlICh0aGlzLmlzUmF0ZUxpbWl0ZWQoKSkge1xuICAgICAgICAgICAgY29uc3QgcmVzZXQgPSB0aGlzLnJlc2V0QWZ0ZXIgLSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzcyA9IGZhbHNlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCByZXEoKTtcblxuICAgICAgICAgICAgdGhpcy5fcGF0Y2hIZWFkZXJzKHJlcyk7XG5cbiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNldCA9IHRoaXMucmVzZXRBZnRlciAtIERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICAgICAgICBsZXQgZXJyOiBFcnJvcjtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgfSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKSBhcyBFcnJvciAmIHsgY29kZTogbnVtYmVyIH07XG5cbiAgICAgICAgICAgICAgICAgICAgZXJyb3IubmFtZSA9IGJvZHkubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGJvZHkuY29kZTtcblxuICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKGBIVFRQIEVycm9yOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFzcyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChwYXNzKSB0aHJvdyBlO1xuXG4gICAgICAgICAgICBjb25zdCBiYWRSZXEgPSBlIGluc3RhbmNlb2YgRXJyb3IgJiYgL0Vycm9yOiA0WzAtOV17Mn0vLnRlc3QoZS5tZXNzYWdlKTtcblxuICAgICAgICAgICAgaWYgKCFiYWRSZXEgJiYgcmV0cmllcyA8IHRoaXMuTUFYX1JFVFJJRVMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChyZXEsICsrcmV0cmllcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXRjaEhlYWRlcnMocmVzOiBSZXNwb25zZSkge1xuICAgICAgICBjb25zdCBsaW1pdCA9IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LUxpbWl0JykpO1xuICAgICAgICBjb25zdCByZW1haW5pbmcgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZW1haW5pbmcnKSk7XG4gICAgICAgIGNvbnN0IHJlc2V0QWZ0ZXIgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZXNldCcpKSAqIDEwMDAgKyBEYXRlLm5vdygpO1xuXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKGxpbWl0KSkgdGhpcy5saW1pdCA9IGxpbWl0O1xuICAgICAgICBpZiAoIU51bWJlci5pc05hTihyZW1haW5pbmcpKSB0aGlzLnJlbWFpbmluZyA9IHJlbWFpbmluZztcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4ocmVzZXRBZnRlcikpIHRoaXMucmVzZXRBZnRlciA9IHJlc2V0QWZ0ZXI7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgU2VxdWVudGlhbEJ1Y2tldCB9IGZyb20gJy4uL3V0aWxzL1NlcXVlbnRpYWxCdWNrZXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExyY1NlYXJjaFBhcmFtcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXJ5IHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHRyYWNrTmFtZSBpcyByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBxPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBuYW1lIHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHF1ZXJ5IGlzIHJlcXVpcmVkLlxuICAgICAqL1xuICAgIHRyYWNrTmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXJ0aXN0IG5hbWVcbiAgICAgKi9cbiAgICBhcnRpc3ROYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAgICovXG4gICAgYWxidW1OYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExyY0dldFBhcmFtcyBleHRlbmRzIFJlcXVpcmVkPE9taXQ8THJjU2VhcmNoUGFyYW1zLCAncXVlcnknPj4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBkdXJhdGlvbjogbnVtYmVyO1xufVxuXG5jb25zdCB0b1NuYWtlQ2FzZSA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgICBjb25zdCBzbmFrZU9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG5ld0tleSA9IGtleS5yZXBsYWNlKC9bQS1aXS9nLCAobGV0dGVyKSA9PiBgXyR7bGV0dGVyLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICAgIHNuYWtlT2JqW25ld0tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc25ha2VPYmo7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgY3JlYXRlUXVlcnkgPSAocGFyYW1zOiBhbnkpID0+IG5ldyBVUkxTZWFyY2hQYXJhbXModG9TbmFrZUNhc2UocGFyYW1zKSkudG9TdHJpbmcoKTtcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjayBpZFxuICAgICAqL1xuICAgIGlkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNrIG5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFydGlzdCBuYW1lXG4gICAgICovXG4gICAgdHJhY2tOYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFsYnVtIG5hbWVcbiAgICAgKi9cbiAgICBhcnRpc3ROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFsYnVtIG5hbWVcbiAgICAgKi9cbiAgICBhbGJ1bU5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAgICovXG4gICAgZHVyYXRpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgICAqL1xuICAgIGluc3RydW1lbnRhbDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgICAqL1xuICAgIHBsYWluTHlyaWNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICAgKi9cbiAgICBzeW5jZWRMeXJpY3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIExyY0dldFJlc3VsdCA9IE9taXQ8THJjU2VhcmNoUmVzdWx0LCAnbmFtZSc+O1xuXG5leHBvcnQgY2xhc3MgTHJjTGliIHtcbiAgICAvKipcbiAgICAgKiBUaGUgQVBJIFVSTFxuICAgICAqL1xuICAgIHB1YmxpYyBhcGkgPSAnaHR0cHM6Ly9scmNsaWIubmV0L2FwaSc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3QgdGltZW91dC4gRGVmYXVsdCBpcyAxNSBzZWNvbmRzLlxuICAgICAqL1xuICAgIHB1YmxpYyB0aW1lb3V0ID0gMTVfMDAwO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IGJ1Y2tldFxuICAgICAqL1xuICAgIHB1YmxpYyBidWNrZXQgPSBuZXcgU2VxdWVudGlhbEJ1Y2tldCgpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBMcmNMaWIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1BsYXllcn0gcGxheWVyIFRoZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyKSB7fVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVxdWVzdCB0aW1lb3V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgcHVibGljIHNldFJlcXVlc3RUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJldHJ5IGxpbWl0LiBEZWZhdWx0IGlzIDUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IFRoZSByZXRyeSBsaW1pdFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZXRyeUxpbWl0KGxpbWl0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5idWNrZXQuTUFYX1JFVFJJRVMgPSBsaW1pdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGx5cmljc1xuICAgICAqIEBwYXJhbSBwYXJhbXMgVGhlIGdldCBwYXJhbXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0KHBhcmFtczogTHJjR2V0UGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBgZ2V0PyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGx5cmljcyBieSBJRFxuICAgICAqIEBwYXJhbSBpZCBUaGUgbHlyaWNzIElEXG4gICAgICovXG4gICAgcHVibGljIGdldEJ5SWQoaWQ6IGAke251bWJlcn1gIHwgbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihgZ2V0LyR7aWR9YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBjYWNoZWQgbHlyaWNzXG4gICAgICogQHBhcmFtIHBhcmFtcyBUaGUgZ2V0IHBhcmFtc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDYWNoZWQocGFyYW1zOiBMcmNHZXRQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGBnZXQtY2FjaGVkPyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2hlcyBmb3IgbHlyaWNzXG4gICAgICogQHBhcmFtIHBhcmFtcyBUaGUgc2VhcmNoIHBhcmFtc1xuICAgICAqL1xuICAgIHB1YmxpYyBzZWFyY2gocGFyYW1zOiBMcmNTZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgaWYgKCFwYXJhbXMucSAmJiAhcGFyYW1zLnRyYWNrTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9ucy5FUlJfSU5WQUxJRF9BUkdfVFlQRShcbiAgICAgICAgICAgICAgICAnb25lIG9mIHEgb3IgdHJhY2tOYW1lJyxcbiAgICAgICAgICAgICAgICAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICBbU3RyaW5nKHBhcmFtcy5xKSwgU3RyaW5nKHBhcmFtcy50cmFja05hbWUpXS5qb2luKCcsICcpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGggPSBgc2VhcmNoPyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0W10+KHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RzIHRoZSBBUElcbiAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVxdWVzdDxUPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgdGltZW91dDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIH0sIHRoaXMudGltZW91dCkudW5yZWYoKTtcblxuICAgICAgICAgICAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBVdGlsLmdldFJ1bnRpbWUoKTtcblxuICAgICAgICAgICAgY29uc3QgcnVudGltZVZlcnNpb24gPSBuYW1lID09PSAndW5rbm93bicgPyB2ZXJzaW9uIDogYCR7bmFtZX0vJHt2ZXJzaW9ufWA7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLFxuICAgICAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogYERpc2NvcmQtUGxheWVyLyR7dGhpcy5wbGF5ZXIudmVyc2lvbn0gJHtydW50aW1lVmVyc2lvbiA/PyAnJ31gLnRyaW1FbmQoKSxcbiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucz8uaGVhZGVycyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYFtMcmNMaWJdIFJlcXVlc3RpbmcgJHtwYXRofWApO1xuXG4gICAgICAgICAgICByZXR1cm4gZmV0Y2goYCR7dGhpcy5hcGl9JHtwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGggOiAnLycgKyBwYXRofWAsIGluaXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYnVja2V0LmVucXVldWUoZGlzcGF0Y2hlcik7XG5cbiAgICAgICAgaWYgKHRpbWVvdXQpIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgVm9pY2VDaGFubmVsLCBTdGFnZUNoYW5uZWwsIFNub3dmbGFrZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHtcbiAgICBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICAgIGpvaW5Wb2ljZUNoYW5uZWwsXG4gICAgVm9pY2VDb25uZWN0aW9uLFxuICAgIGdldFZvaWNlQ29ubmVjdGlvbixcbiAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsXG4gICAgQXVkaW9QbGF5ZXIsXG59IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5jbGFzcyBWb2ljZVV0aWxzIHtcbiAgICAvKipcbiAgICAgKiBWb2ljZSBjb25uZWN0aW9uIGNhY2hlIHRvIHN0b3JlIHZvaWNlIGNvbm5lY3Rpb25zIG9mIHRoZSBQbGF5ZXIgY29tcG9uZW50cy5cbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLlxuICAgICAqIEl0IG9ubHkgZXhpc3RzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FjaGU6IENvbGxlY3Rpb248U25vd2ZsYWtlLCBTdHJlYW1EaXNwYXRjaGVyPiA9IG5ldyBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj4oKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB2b2ljZSB1dGlscyBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAgIC8qKlxuICAgICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbCwgY3JlYXRpbmcgYmFzaWMgc3RyZWFtIGRpc3BhdGNoIG1hbmFnZXJcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+fVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgICAgICBxdWV1ZTogR3VpbGRRdWV1ZTtcbiAgICAgICAgICAgIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG4gICAgICAgICAgICBncm91cD86IHN0cmluZztcbiAgICAgICAgfSxcbiAgICApOiBQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+IHtcbiAgICAgICAgaWYgKCFvcHRpb25zPy5xdWV1ZSkgdGhyb3cgRXhjZXB0aW9ucy5FUlJfTk9fR1VJTERfUVVFVUUoKTtcbiAgICAgICAgY29uc3QgY29ubiA9IGF3YWl0IHRoaXMuam9pbihjaGFubmVsLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoY29ubiwgY2hhbm5lbCwgb3B0aW9ucy5xdWV1ZSwgb3B0aW9ucy5tYXhUaW1lLCBvcHRpb25zLmF1ZGlvUGxheWVyKTtcbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IFtjaGFubmVsXSBUaGUgdm9pY2Uvc3RhZ2UgY2hhbm5lbCB0byBqb2luXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBqb2luKFxuICAgICAgICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gICAgICAgIG9wdGlvbnM/OiB7XG4gICAgICAgICAgICBkZWFmPzogYm9vbGVhbjtcbiAgICAgICAgICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgICAgICAgICBncm91cD86IHN0cmluZztcbiAgICAgICAgfSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb25uZWN0aW9uID0gdGhpcy5nZXRDb25uZWN0aW9uKGNoYW5uZWwuZ3VpbGQuaWQsIG9wdGlvbnM/Lmdyb3VwKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBleGlzdGluZ0Nvbm5lY3Rpb24/LmpvaW5Db25maWcuY2hhbm5lbElkID09PSBjaGFubmVsPy5pZCAmJlxuICAgICAgICAgICAgZXhpc3RpbmdDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0Nvbm5lY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25uID0gam9pblZvaWNlQ2hhbm5lbCh7XG4gICAgICAgICAgICBndWlsZElkOiBjaGFubmVsLmd1aWxkLmlkLFxuICAgICAgICAgICAgY2hhbm5lbElkOiBjaGFubmVsLmlkLFxuICAgICAgICAgICAgYWRhcHRlckNyZWF0b3I6IGNoYW5uZWwuZ3VpbGQudm9pY2VBZGFwdGVyQ3JlYXRvciBhcyB1bmtub3duIGFzIERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsXG4gICAgICAgICAgICBzZWxmRGVhZjogQm9vbGVhbihvcHRpb25zPy5kZWFmKSxcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLnBsYXllci5ldmVudHMubGlzdGVuZXJDb3VudCgnZGVidWcnKSA+IDAsXG4gICAgICAgICAgICBncm91cDogb3B0aW9ucz8uZ3JvdXAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3RzIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNjb25uZWN0KGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiB8IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24gaW5zdGFuY2VvZiBTdHJlYW1EaXNwYXRjaGVyKSBjb25uZWN0aW9uID0gY29ubmVjdGlvbi52b2ljZUNvbm5lY3Rpb247XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkgcmV0dXJuIGNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIERpc2NvcmQgUGxheWVyIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0ge1Nub3dmbGFrZX0gZ3VpbGQgVGhlIGd1aWxkIGlkXG4gICAgICogQHJldHVybnMge1N0cmVhbURpc3BhdGNoZXJ9XG4gICAgICovXG4gICAgcHVibGljIGdldENvbm5lY3Rpb24oZ3VpbGQ6IFNub3dmbGFrZSwgZ3JvdXA/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGdldFZvaWNlQ29ubmVjdGlvbihndWlsZCwgZ3JvdXApO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgVm9pY2VVdGlscyB9O1xuIiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9mYWJyaWMvU2VhcmNoUmVzdWx0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlT3B0aW9ucyB7XG4gICAgY2hlY2tJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLy8gNWhcbmNvbnN0IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQgPSAxOF8wMDBfMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUPiB7XG4gICAgZ2V0RGF0YSgpOiBQcm9taXNlPERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQ+W10+O1xuICAgIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KTogUHJvbWlzZTx2b2lkPjtcbiAgICByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUNhY2hlIGltcGxlbWVudHMgUXVlcnlDYWNoZVByb3ZpZGVyPFRyYWNrPiB7XG4gICAgI2RlZmF1bHRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUcmFjaz4+KCk7XG4gICAgcHVibGljIHRpbWVyOiBOb2RlSlMuVGltZXI7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcGxheWVyOiBQbGF5ZXIsXG4gICAgICAgIHB1YmxpYyBvcHRpb25zOiBRdWVyeUNhY2hlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNoZWNrSW50ZXJ2YWw6IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQsXG4gICAgICAgIH0sXG4gICAgKSB7XG4gICAgICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCh0aGlzLmNsZWFudXAuYmluZCh0aGlzKSwgdGhpcy5jaGVja0ludGVydmFsKS51bnJlZigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2hlY2tJbnRlcnZhbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jaGVja0ludGVydmFsID8/IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsZWFudXAoKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2lkLCB2YWx1ZV0gb2YgdGhpcy4jZGVmYXVsdENhY2hlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUuaGFzRXhwaXJlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXREYXRhKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuI2RlZmF1bHRDYWNoZS52YWx1ZXMoKV07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KSB7XG4gICAgICAgIGRhdGEudHJhY2tzLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNkZWZhdWx0Q2FjaGUuaGFzKGQudXJsKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLnNldChkLnVybCwgbmV3IERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlKGQpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlc29sdmUoY29udGV4dDogUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNkZWZhdWx0Q2FjaGUuZ2V0KGNvbnRleHQucXVlcnkpO1xuICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICAgICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgICAgICAgIHRyYWNrczogW3Jlc3VsdC5kYXRhXSxcbiAgICAgICAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZSxcbiAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5LFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUID0gdW5rbm93bj4ge1xuICAgIHB1YmxpYyBleHBpcmVBZnRlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRhOiBULCBleHBpcmVBZnRlcjogbnVtYmVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVCkge1xuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZUFmdGVyID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5leHBpcmVBZnRlciA9IERhdGUubm93KCkgKyBleHBpcmVBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNFeHBpcmVkKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZXhwaXJlQWZ0ZXIgIT09ICdudW1iZXInIHx8IGlzTmFOKHRoaXMuZXhwaXJlQWZ0ZXIpIHx8IHRoaXMuZXhwaXJlQWZ0ZXIgPCAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpIDw9IHRoaXMuZXhwaXJlQWZ0ZXI7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQge1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgcmVxdWVzdGVkQnk/OiBVc2VyO1xuICAgIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IGBleHQ6JHtzdHJpbmd9YDtcbn1cbiIsICJpbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmltcG9ydCB7XG4gICAgQ2xpZW50LFxuICAgIFNub3dmbGFrZVV0aWwsXG4gICAgVm9pY2VTdGF0ZSxcbiAgICBJbnRlbnRzQml0RmllbGQsXG4gICAgVXNlcixcbiAgICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gICAgdmVyc2lvbiBhcyBkanNWZXJzaW9uLFxuICAgIEV2ZW50cyxcbn0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2ssIFNlYXJjaFJlc3VsdCB9IGZyb20gJy4vZmFicmljJztcbmltcG9ydCB7XG4gICAgR3VpbGRRdWV1ZUV2ZW50cyxcbiAgICBWb2ljZUNvbm5lY3RDb25maWcsXG4gICAgR3VpbGROb2RlQ3JlYXRlT3B0aW9ucyxcbiAgICBHdWlsZE5vZGVNYW5hZ2VyLFxuICAgIEd1aWxkUXVldWUsXG4gICAgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgICBHdWlsZFF1ZXVlRXZlbnQsXG59IGZyb20gJy4vcXVldWUnO1xuaW1wb3J0IHsgVm9pY2VVdGlscyB9IGZyb20gJy4vVm9pY2VJbnRlcmZhY2UvVm9pY2VVdGlscyc7XG5pbXBvcnQge1xuICAgIFBsYXllckV2ZW50cyxcbiAgICBRdWVyeVR5cGUsXG4gICAgU2VhcmNoT3B0aW9ucyxcbiAgICBQbGF5ZXJJbml0T3B0aW9ucyxcbiAgICBQbGF5bGlzdEluaXREYXRhLFxuICAgIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICBQbGF5ZXJFdmVudCxcbn0gZnJvbSAnLi90eXBlcy90eXBlcyc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyLCBSZXNvbHZlZFF1ZXJ5IH0gZnJvbSAnLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyBkVm9pY2VWZXJzaW9uIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgUXVlcnlDYWNoZSB9IGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IEV4Y2VwdGlvbnMgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIgfSBmcm9tICcuL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcic7XG5pbXBvcnQgeyBDb250ZXh0LCBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgeyBIb29rc0N0eCwgU1VQRVJfQ09OVEVYVCB9IGZyb20gJy4vaG9va3MvY29tbW9uJztcbmltcG9ydCB7IExyY0xpYiB9IGZyb20gJy4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBnZXRDb21wYXROYW1lLCBpc0NsaWVudFByb3h5IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdCc7XG5pbXBvcnQgeyBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yIH0gZnJvbSAnLi91dGlscy9EZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi91dGlscy9fX2ludGVybmFsX18nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gdW5rbm93bj4ge1xuICAgIHRyYWNrOiBUcmFjaztcbiAgICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICAgIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICAgIHF1ZXVlOiBHdWlsZFF1ZXVlPFQ+O1xufVxuXG5leHBvcnQgdHlwZSBUcmFja0xpa2UgPSBzdHJpbmcgfCBUcmFjayB8IFNlYXJjaFJlc3VsdCB8IFRyYWNrW10gfCBQbGF5bGlzdDtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+IGV4dGVuZHMgU2VhcmNoT3B0aW9ucyB7XG4gICAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICAgIGNvbm5lY3Rpb25PcHRpb25zPzogVm9pY2VDb25uZWN0Q29uZmlnO1xuICAgIGF1ZGlvUGxheWVyT3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnM7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gICAgYWZ0ZXJTZWFyY2g/OiAocmVzdWx0OiBTZWFyY2hSZXN1bHQpID0+IFByb21pc2U8U2VhcmNoUmVzdWx0Pjtcbn1cblxuZXhwb3J0IHR5cGUgVm9pY2VTdGF0ZUhhbmRsZXIgPSAoXG4gICAgcGxheWVyOiBQbGF5ZXIsXG4gICAgcXVldWU6IEd1aWxkUXVldWUsXG4gICAgb2xkVm9pY2VTdGF0ZTogVm9pY2VTdGF0ZSxcbiAgICBuZXdWb2ljZVN0YXRlOiBWb2ljZVN0YXRlLFxuKSA9PiBBd2FpdGVkPHZvaWQ+O1xuXG5leHBvcnQgY2xhc3MgUGxheWVyIGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxQbGF5ZXJFdmVudHM+IHtcbiAgICAjbGFzdExhdGVuY3kgPSAtMTtcbiAgICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICAgI2xhZ01vbml0b3JUaW1lb3V0ITogTm9kZUpTLlRpbWVvdXQ7XG4gICAgI2xhZ01vbml0b3JJbnRlcnZhbCE6IE5vZGVKUy5UaW1lb3V0O1xuICAgICNvblZvaWNlU3RhdGVVcGRhdGU6IFZvaWNlU3RhdGVIYW5kbGVyID0gZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyO1xuICAgICNob29rc0N0eDogQ29udGV4dDxIb29rc0N0eD4gfCBudWxsID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiBkaXNjb3JkLXBsYXllclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nID0gJzcuMC4wLWRldi4zJztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwbGF5ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGlzY29yZC5qcyBjbGllbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50ITogQ2xpZW50O1xuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5ZXIgb3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zITogUGxheWVySW5pdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllciBub2RlcyAocXVldWUpIG1hbmFnZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgYXBpIHV0aWxpdGllc1xuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB2b2ljZVV0aWxzID0gbmV3IFZvaWNlVXRpbHModGhpcyk7XG4gICAgLyoqXG4gICAgICogVGhlIGV4dHJhY3RvcnMgbWFuYWdlclxuICAgICAqL1xuICAgIHB1YmxpYyBleHRyYWN0b3JzID0gbmV3IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQodGhpcyk7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllciBldmVudHMgY2hhbm5lbFxuICAgICAqL1xuICAgIHB1YmxpYyBldmVudHMgPSBuZXcgUGxheWVyRXZlbnRzRW1pdHRlcjxHdWlsZFF1ZXVlRXZlbnRzPihbR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3JdKTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWVyIHZlcnNpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbiA9IFBsYXllci52ZXJzaW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBseXJpY3MgYXBpXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGx5cmljcyA9IG5ldyBMcmNMaWIodGhpcyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBEaXNjb3JkIFBsYXllclxuICAgICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgVGhlIERpc2NvcmQgQ2xpZW50XG4gICAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKFtQbGF5ZXJFdmVudC5FcnJvcl0pO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmZmbXBlZ1BhdGgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mZm1wZWdQYXRoICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgdHlwZSBcInN0cmluZ1wiIGZvciBvcHRpb25zLmZmbXBlZ1BhdGguIEdvdCAke3R5cGVvZiBvcHRpb25zLmZmbXBlZ1BhdGh9IGluc3RlYWRgLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHByb2Nlc3MuZW52LkZGTVBFR19QQVRIID0gb3B0aW9ucy5mZm1wZWdQYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNDb21wYXRNb2RlID0gaXNDbGllbnRQcm94eShjbGllbnQpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZGlzY29yZC5qcyBjbGllbnRcbiAgICAgICAgICogQHR5cGUge0NsaWVudH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuXG4gICAgICAgIGlmICghaXNDb21wYXRNb2RlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghKGNsaWVudCBpbnN0YW5jZW9mIENsaWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYENsaWVudCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgZGlzY29yZC5qc0Ake2Rqc1ZlcnNpb259IGNsaWVudCwgc29tZSB0aGluZ3MgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS4gVGhpcyBjYW4gaGFwcGVuIGR1ZSB0byBjb3JydXB0IGRlcGVuZGVuY2llcyBvciBoYXZpbmcgbXVsdGlwbGUgaW5zdGFsbGF0aW9ucyBvZiBkaXNjb3JkLmpzLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZENsaWVudEluc3RhbmNlJyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpYmYgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMgaW5zdGFuY2VvZiBJbnRlbnRzQml0RmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBJbnRlbnRzQml0RmllbGQodGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzKTtcblxuICAgICAgICAgICAgICAgIGlmICghaWJmLmhhcyhJbnRlbnRzQml0RmllbGQuRmxhZ3MuR3VpbGRWb2ljZVN0YXRlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgVXRpbC53YXJuKCdjbGllbnQgaXMgbWlzc2luZyBcIkd1aWxkVm9pY2VTdGF0ZXNcIiBpbnRlbnQnLCAnSW52YWxpZEludGVudHNCaXRGaWVsZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIG5vb3BcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGxvY2tWb2ljZVN0YXRlSGFuZGxlcjogZmFsc2UsXG4gICAgICAgICAgICBibG9ja0V4dHJhY3RvcnM6IFtdLFxuICAgICAgICAgICAgYmxvY2tTdHJlYW1Gcm9tOiBbXSxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiAyMDAwMCxcbiAgICAgICAgICAgIGxhZ01vbml0b3I6IDMwMDAwLFxuICAgICAgICAgICAgcXVlcnlDYWNoZTogb3B0aW9ucy5xdWVyeUNhY2hlID09PSBudWxsID8gbnVsbCA6IG9wdGlvbnMucXVlcnlDYWNoZSB8fCBuZXcgUXVlcnlDYWNoZSh0aGlzKSxcbiAgICAgICAgICAgIHVzZUxlZ2FjeUZGbXBlZzogZmFsc2UsXG4gICAgICAgICAgICBza2lwRkZtcGVnOiB0cnVlLFxuICAgICAgICAgICAgcHJvYmVUaW1lb3V0OiA1MDAwLFxuICAgICAgICAgICAgb3ZlcnJpZGVGYWxsYmFja0NvbnRleHQ6IHRydWUsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9IGFzIFBsYXllckluaXRPcHRpb25zO1xuXG4gICAgICAgIGlmICghaXNDb21wYXRNb2RlKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHByaXZhdGUgbWV0aG9kXG4gICAgICAgICAgICB0aGlzLmNsaWVudC5pbmNyZW1lbnRNYXhMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHRoaXMuY2xpZW50Lm9uKEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMubGFnTW9uaXRvciA9PT0gJ251bWJlcicgJiYgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNsYWdNb25pdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbTGFnIE1vbml0b3JdIEV2ZW50IGxvb3AgbGF0ZW5jeTogJHt0aGlzLiNsYXN0TGF0ZW5jeX1tc2ApO1xuICAgICAgICAgICAgICAgIH0sIDApLnVucmVmKCk7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMubGFnTW9uaXRvcikudW5yZWYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcnJpZGVGYWxsYmFja0NvbnRleHQpIHtcbiAgICAgICAgICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW3BsYXllcl0nLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBob29rcyBjb250ZXh0IGZvciB0aGlzIHBsYXllciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIGlmICghdGhpcy4jaG9va3NDdHgpIHtcbiAgICAgICAgICAgIHRoaXMuI2hvb2tzQ3R4ID0gY3JlYXRlQ29udGV4dCgpO1xuXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFByb3ZpZGVyID0gdGhpcy4jaG9va3NDdHgucHJvdmlkZS5iaW5kKHRoaXMuI2hvb2tzQ3R4KTtcblxuICAgICAgICAgICAgdGhpcy4jaG9va3NDdHgucHJvdmlkZSA9ICh2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU1VQRVJfQ09OVEVYVC5wcm92aWRlKHRoaXMsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUHJvdmlkZXIodmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXZlcigpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy4jaG9va3NDdHg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlclxuICAgICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gICAgICovXG4gICAgcHVibGljIG9uVm9pY2VTdGF0ZVVwZGF0ZShoYW5kbGVyOiBWb2ljZVN0YXRlSGFuZGxlcikge1xuICAgICAgICB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUgPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnZGVidWcnLCBtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG5ldyBkaXNjb3JkLXBsYXllciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFRoZSBjbGllbnQgdGhhdCBpbnN0YW50aWF0ZWQgcGxheWVyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShjbGllbnQ6IENsaWVudCwgb3B0aW9uczogUGxheWVySW5pdE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFBsYXllcihjbGllbnQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhY2hlIHByb3ZpZGVyIGluIHVzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5xdWVyeUNhY2hlID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxpYXMgdG8gYFBsYXllci5ub2Rlc2AuXG4gICAgICovXG4gICAgcHVibGljIGdldCBxdWV1ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgICAqIHNvbWUgZXhwZW5zaXZlIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHdoaWNoIGlzIHNsb3dpbmcgZG93biB0aGUgZXZlbnQgbG9vcC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXZlbnRMb29wTGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc3RhdHMgPSBwbGF5ZXIuZ2VuZXJhdGVTdGF0aXN0aWNzKCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhzdGF0cyk7XG4gICAgICpcbiAgICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAgICogLy8ge1xuICAgICAqIC8vICAgcXVldWVzQ291bnQ6IG51bWJlcixcbiAgICAgKiAvLyAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiBib29sZWFuLFxuICAgICAqIC8vICAgcXVldWVzOiBbXG4gICAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAgICogLy8gICAgICAuLi5cbiAgICAgKiAvLyAgIF1cbiAgICAgKiAvLyB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlU3RhdGlzdGljcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXVlc0NvdW50OiB0aGlzLnF1ZXVlcy5jYWNoZS5zaXplLFxuICAgICAgICAgICAgcXVlcnlDYWNoZUVuYWJsZWQ6IHRoaXMucXVlcnlDYWNoZSAhPSBudWxsLFxuICAgICAgICAgICAgcXVldWVzOiB0aGlzLnF1ZXVlcy5jYWNoZS5tYXAoKG0pID0+IG0uc3RhdHMuZ2VuZXJhdGUoKSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgcGxheWVyIGlzIGluIGNvbXBhdGliaWxpdHkgbW9kZS4gQ29tcGF0aWJpbGl0eSBtb2RlIGlzIGVuYWJsZWQgd2hlbiBub24tZGlzY29yZC5qcyBjbGllbnQgaXMgdXNlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDb21wYXRNb2RlKCkge1xuICAgICAgICByZXR1cm4gaXNDbGllbnRQcm94eSh0aGlzLmNsaWVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSBldmVyeSBzaW5nbGUgcXVldWVzIG1hbmFnZWQgYnkgdGhpcyBtYXN0ZXIgcGxheWVyIGluc3RhbmNlXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHVzZSBtZSB3aGVuIHlvdSB3YW50IHRvIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZSBldmVyeSBzaW5nbGUgcXVldWVzIGluIGV4aXN0ZW5jZSBcdUQ4M0RcdUREMkFcbiAgICAgKiBhd2FpdCBwbGF5ZXIuZGVzdHJveSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLm5vZGVzLmNhY2hlLmZvckVhY2goKG5vZGUpID0+IG5vZGUuZGVsZXRlKCkpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc0NvbXBhdE1vZGUoKSkge1xuICAgICAgICAgICAgdGhpcy5jbGllbnQub2ZmKEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5jbGllbnQuZGVjcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0b3JzLnVucmVnaXN0ZXJBbGwoKTtcbiAgICAgICAgaWYgKHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpO1xuICAgICAgICBpZiAodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGU6IFZvaWNlU3RhdGUsIG5ld1N0YXRlOiBWb2ljZVN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5nZXQob2xkU3RhdGUuZ3VpbGQuaWQpO1xuICAgICAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICAgICAgLy8gZGlzcGF0Y2ggdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAgICAgIGNvbnN0IHdhc0hhbmRsZWQgPSB0aGlzLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC52b2ljZVN0YXRlVXBkYXRlLCBxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgICAgLy8gaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkLCByZXR1cm4gYXNzdW1pbmcgdGhlIGxpc3RlbmVyIGltcGxlbWVudGVkIGFsbCBvZiB0aGUgbG9naWMgYmVsb3dcbiAgICAgICAgaWYgKHdhc0hhbmRsZWQgJiYgIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIpIHJldHVybjtcblxuICAgICAgICByZXR1cm4gdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlKHRoaXMsIHF1ZXVlLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHBhc3Npbmcgdm9pY2Ugc3RhdGUgdXBkYXRlIGRhdGEgdG8gdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHZvaWNlIHN0YXRlIGhhbmRsZXJcbiAgICAgKlxuICAgICAqIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgKiAgIC8vIHRoaXMgaXMgZGVmaW5pdGVseSBhIHJvY2tldCBzY2llbmNlLCByaWdodCBoZXJlXG4gICAgICogICBwbGF5ZXIuaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBrZWVwIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyLCBldmVuIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAgICovXG4gICAgcHVibGljIGxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5sb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIHN0b3AgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdW5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdm9pY2Ugc3RhdGUgaGFuZGxlciBpcyBsb2NrZWQuXG4gICAgICovXG4gICAgcHVibGljIGlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhdGUgYXVkaW8gcGxheWVyXG4gICAgICogQHBhcmFtIGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhlIG11c2ljIHNob3VsZCBiZSBwbGF5ZWRcbiAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHRyYWNrIG9yIHNvdXJjZSB0byBwbGF5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWVyXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgcXVldWUgbWFuYWdlbWVudCwganVzdCB1c2UgdGhpcyBtZXRob2QgXHVEODNEXHVERTA0XG4gICAgICogY29uc3QgcXVlcnkgPSAndGhpcyBpcyBteSBzdXBlciBjb29sIHNlYXJjaCBxdWVyeSB0aGF0IEkgd2FudCB0byBwbGF5JztcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICAgY29uc3QgeyB0cmFjayB9ID0gYXdhaXQgcGxheWVyLnBsYXkodm9pY2VDaGFubmVsLCBxdWVyeSk7XG4gICAgICogICBjb25zb2xlLmxvZyhgXHVEODNDXHVERjg5IEkgYW0gcGxheWluZyAke3RyYWNrLnRpdGxlfSBcdUQ4M0NcdURGODlgKTtcbiAgICAgKiB9IGNhdGNoKGUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0RcdURFMkQgRmFpbGVkIHRvIHBsYXkgZXJyb3Igb2ggbm86XFxuXFxuJHtlfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gICAgICAgIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgICAgICAgcXVlcnk6IFRyYWNrTGlrZSxcbiAgICAgICAgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9LFxuICAgICk6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgICAgIGNvbnN0IHZjID0gdGhpcy5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsKTtcbiAgICAgICAgaWYgKCF2Yz8uaXNWb2ljZUJhc2VkKCkpXG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9JTlZBTElEX0FSR19UWVBFKFxuICAgICAgICAgICAgICAgICdjaGFubmVsJyxcbiAgICAgICAgICAgICAgICAnVm9pY2VCYXNlZENoYW5uZWwnLFxuICAgICAgICAgICAgICAgICF2YyA/ICd1bmRlZmluZWQnIDogYGNoYW5uZWwgdHlwZSAke3ZjLnR5cGV9YCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPSBxdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCA/IHF1ZXJ5IDogYXdhaXQgdGhpcy5zZWFyY2gocXVlcnksIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25zLkVSUl9OT19SRVNVTFQoXG4gICAgICAgICAgICAgICAgYE5vIHJlc3VsdHMgZm91bmQgZm9yIFwiJHtxdWVyeX1cIiAoRXh0cmFjdG9yOiAke3Jlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVldWUgPSB0aGlzLm5vZGVzLmNyZWF0ZSh2Yy5ndWlsZCwgb3B0aW9ucy5ub2RlT3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoeyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBXYWl0aW5nIGZvciB0aGUgcXVldWUgdG8gcmVzb2x2ZS4uLmApO1xuICAgICAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gRW50cnkgJHtlbnRyeS5pZH0gd2FzIHJlc29sdmVkIWApO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC50cmFja3NbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQucGxheWxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFxdWV1ZS5pc1BsYXlpbmcoKSkgYXdhaXQgcXVldWUubm9kZS5wbGF5KG51bGwsIG9wdGlvbnMuYXVkaW9QbGF5ZXJPcHRpb25zKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gUmVsZWFzaW5nIGFuIGVudHJ5IGZyb20gdGhlIHF1ZXVlLi4uYCk7XG4gICAgICAgICAgICBxdWV1ZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFjazogcmVzdWx0LnRyYWNrc1swXSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdDogcmVzdWx0LFxuICAgICAgICAgICAgcXVldWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VhcmNoIHRyYWNrc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBTZWFyY2hSZXN1bHR9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnlcbiAgICAgKiBAcGFyYW0ge1NlYXJjaE9wdGlvbnN9IG9wdGlvbnMgVGhlIHNlYXJjaCBvcHRpb25zXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U2VhcmNoUmVzdWx0Pn1cbiAgICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc2VhcmNoUXVlcnkgPSAncGFzcyB1cmwgb3IgdGV4dCBvciBkaXNjb3JkLXBsYXllciB0cmFjayBjb25zdHJ1Y3RhYmxlIG9iamVjdHMsIHdlIGdvdCB5b3UgY292ZXJlZCBcdUQ4M0RcdURFMEUnO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYXllci5zZWFyY2goc2VhcmNoUXVlcnkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0KTsgLy8gTG9ncyBgU2VhcmNoUmVzdWx0YCBvYmplY3RcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VhcmNoKFxuICAgICAgICBzZWFyY2hRdWVyeTogc3RyaW5nIHwgVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBTZWFyY2hSZXN1bHQsXG4gICAgICAgIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgPSB7fSxcbiAgICApOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgICAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQpIHJldHVybiBzZWFyY2hRdWVyeTtcblxuICAgICAgICBpZiAob3B0aW9ucy5yZXF1ZXN0ZWRCeSAhPSBudWxsKSBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG4gICAgICAgIG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/PSB0aGlzLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IFtzZWFyY2hRdWVyeV0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICAgICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogc2VhcmNoUXVlcnkucXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBQbGF5bGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHBsYXlsaXN0OiBzZWFyY2hRdWVyeSxcbiAgICAgICAgICAgICAgICB0cmFja3M6IHNlYXJjaFF1ZXJ5LnRyYWNrcyxcbiAgICAgICAgICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBzZWFyY2hRdWVyeS50cmFja3NbMF0/LmV4dHJhY3RvcixcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWFyY2hRdWVyeSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYWNrcyA9IHNlYXJjaFF1ZXJ5LmZpbHRlcigodCkgPT4gdCBpbnN0YW5jZW9mIFRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFja3MsXG4gICAgICAgICAgICAgICAgcXVlcnk6ICdAQCMle3tVc2VyTG9hZGVkQ29udGVudH19JSNAQCcsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yOiBudWxsLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgICAgICBsZXQgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGwsXG4gICAgICAgICAgICBwcm90b2NvbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgICAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBTZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuc2VhcmNoRW5naW5lfSwgZmFsbGJhY2sgc2VhcmNoIGVuZ2luZSBzZXQgdG8gJHtvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lfWAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGlmICgvXlxcdys6Ly50ZXN0KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgICAgICAgY29uc3QgW3Byb3RvY29sTmFtZSwgLi4ucXVlcnldID0gc2VhcmNoUXVlcnkuc3BsaXQoJzonKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBQcm90b2NvbCAke3Byb3RvY29sTmFtZX0gZGV0ZWN0ZWQgaW4gcXVlcnlgKTtcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdFeHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuc3RvcmUuZmluZChcbiAgICAgICAgICAgICAgICAoZSkgPT4gIXRoaXMuZXh0cmFjdG9ycy5pc0Rpc2FibGVkKGUuaWRlbnRpZmllcikgJiYgZS5wcm90b2NvbHMuaW5jbHVkZXMocHJvdG9jb2xOYW1lKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChtYXRjaGluZ0V4dHJhY3Rvcikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBQcm90b2NvbCAke3Byb3RvY29sTmFtZX0gaXMgc3VwcG9ydGVkIGJ5ICR7bWF0Y2hpbmdFeHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIWApO1xuICAgICAgICAgICAgICAgIGV4dHJhY3RvciA9IG1hdGNoaW5nRXh0cmFjdG9yO1xuICAgICAgICAgICAgICAgIHNlYXJjaFF1ZXJ5ID0gcXVlcnkuam9pbignOicpO1xuICAgICAgICAgICAgICAgIHByb3RvY29sID0gcHJvdG9jb2xOYW1lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBhbiBleHRyYWN0b3IgdGhhdCBzdXBwb3J0cyAke3Byb3RvY29sTmFtZX0gcHJvdG9jb2wuIEZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yLi4uYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlZGlyZWN0ZWQgPSBhd2FpdCBRdWVyeVJlc29sdmVyLnByZVJlc29sdmUoc2VhcmNoUXVlcnkpO1xuICAgICAgICBjb25zdCB7IHR5cGU6IHF1ZXJ5VHlwZSwgcXVlcnkgfSA9XG4gICAgICAgICAgICBvcHRpb25zLnNlYXJjaEVuZ2luZSA9PT0gUXVlcnlUeXBlLkFVVE9cbiAgICAgICAgICAgICAgICA/IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShyZWRpcmVjdGVkLCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKVxuICAgICAgICAgICAgICAgIDogKHsgdHlwZTogb3B0aW9ucy5zZWFyY2hFbmdpbmUsIHF1ZXJ5OiByZWRpcmVjdGVkIH0gYXMgUmVzb2x2ZWRRdWVyeSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBRdWVyeSB0eXBlIGlkZW50aWZpZWQgYXMgJHtxdWVyeVR5cGV9JHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yICYmIHByb3RvY29sID8gJyBidXQgbWlnaHQgbm90IGJlIHVzZWQgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiBwcm90b2NvbCcgOiAnJ1xuICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAvLyBmb3JjZSBwYXJ0aWN1bGFyIGV4dHJhY3RvclxuICAgICAgICBpZiAob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3RhcnRzV2l0aCgnZXh0OicpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgRm9yY2luZyAke29wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KX0gZXh0cmFjdG9yLi4uYCk7XG4gICAgICAgICAgICBleHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuZ2V0KG9wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KSkhO1xuICAgICAgICAgICAgaWYgKCFleHRyYWN0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcXVlcnkgYWxsIGV4dHJhY3RvcnNcbiAgICAgICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgICAgICAgIC8vIGNhY2hlIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDaGVja2luZyBjYWNoZS4uLmApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGNhY2hlIGhpdFxuICAgICAgICAgICAgICAgIGlmIChyZXM/Lmhhc1RyYWNrcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBoaXQgZm9yIHF1ZXJ5ICR7cXVlcnl9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENhY2hlIG1pc3MgZm9yIHF1ZXJ5ICR7cXVlcnl9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBFeGVjdXRpbmcgZXh0cmFjdG9ycy4uLmApO1xuXG4gICAgICAgICAgICAvLyBjYWNoZSBtaXNzXG4gICAgICAgICAgICBleHRyYWN0b3IgPVxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dC52YWxpZGF0ZShxdWVyeSwgcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKT8uZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBubyBleHRyYWN0b3JzIGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0ZhaWxlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGV4dHJhY3RvcicpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0cmFjdG9yXG4gICAgICAgICAgICAuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSBhcyBVc2VyLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgICAgIHByb3RvY29sLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKTtcblxuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwhJyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICAgICAgcGxheWxpc3Q6IHJlcy5wbGF5bGlzdCxcbiAgICAgICAgICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLmRlYnVnKCdGYWlsZWQgdG8gZmluZCByZXN1bHQgdXNpbmcgYXBwcm9wcmlhdGUgZXh0cmFjdG9yLiBRdWVyeWluZyBhbGwgZXh0cmFjdG9ycy4uLicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKFxuICAgICAgICAgICAgYXN5bmMgKGV4dCkgPT5cbiAgICAgICAgICAgICAgICAhb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICAgICAgIChhd2FpdCBleHQudmFsaWRhdGUocXVlcnkpKSAmJlxuICAgICAgICAgICAgICAgIGV4dC5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IG9wdGlvbnMucmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHByb3RvY29sLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtyZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5LFxuICAgICAgICAgICAgICAgIGV4dHJhY3RvcjogcmVzdWx0Py5leHRyYWN0b3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCB1c2luZyAke3Jlc3VsdC5leHRyYWN0b3IuaWRlbnRpZmllcn0hYCk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgICAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICAgICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQWRkaW5nIGRhdGEgdG8gY2FjaGUuLi5gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGBkaXNjb3JkLXZvaXBgIG1vZHVsZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnNvbGUubG9nKHBsYXllci5zY2FuRGVwcygpKTtcbiAgICAgKiAvLyAtPiBsb2dzIGRlcGVuZGVuY2llcyByZXBvcnRcbiAgICAgKiBgYGBcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHB1YmxpYyBzY2FuRGVwcygpIHtcbiAgICAgICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuICAgICAgICBjb25zdCBydW50aW1lID0gJ0J1bicgaW4gZ2xvYmFsVGhpcyA/ICdCdW4nIDogJ0Rlbm8nIGluIGdsb2JhbFRoaXMgPyAnRGVubycgOiAnTm9kZSc7XG4gICAgICAgIGNvbnN0IGRlcHNSZXBvcnQgPSBbXG4gICAgICAgICAgICAnRGlzY29yZCBQbGF5ZXInLFxuICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgIGAtIGRpc2NvcmQtcGxheWVyOiAke1BsYXllci52ZXJzaW9ufSR7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NvbXBhdE1vZGUoKSA/IGAgKCR7Z2V0Q29tcGF0TmFtZSh0aGlzLmNsaWVudCl9IGNvbXBhdGliaWxpdHkgbW9kZSlgIDogJydcbiAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgYC0gZGlzY29yZC12b2lwOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICAgICAgICAgIGAtIGRpc2NvcmQuanM6ICR7ZGpzVmVyc2lvbn1gLFxuICAgICAgICAgICAgYC0gTm9kZSB2ZXJzaW9uOiAke3Byb2Nlc3MudmVyc2lvbn0gKERldGVjdGVkIFJ1bnRpbWU6ICR7cnVudGltZX0sIFBsYXRmb3JtOiAke3Byb2Nlc3MucGxhdGZvcm19IFske3Byb2Nlc3MuYXJjaH1dKWAsXG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlTGVnYWN5RkZtcGVnKSByZXR1cm4gJy0gZmZtcGVnOiBOL0EgKHVzaW5nIGxlZ2FjeSBmZm1wZWcpJztcbiAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0gRkZtcGVnLnJlc29sdmVTYWZlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmZvKSByZXR1cm4gJ0ZGbXBlZy9BdmNvbnYgbm90IGZvdW5kJztcblxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIGAtIGZmbXBlZzogJHtpbmZvLnZlcnNpb259YCxcbiAgICAgICAgICAgICAgICAgICAgYC0gY29tbWFuZDogJHtpbmZvLmNvbW1hbmR9YCxcbiAgICAgICAgICAgICAgICAgICAgYC0gc3RhdGljOiAke2luZm8ubW9kdWxlfWAsXG4gICAgICAgICAgICAgICAgICAgIGAtIGxpYm9wdXM6ICR7aW5mby5yZXN1bHQhLmluY2x1ZGVzKCctLWVuYWJsZS1saWJvcHVzJyl9YCxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgICdcXG4nLFxuICAgICAgICAgICAgJ0xvYWRlZCBFeHRyYWN0b3JzOicsXG4gICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlXG4gICAgICAgICAgICAgICAgLm1hcCgobSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5pZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpIHx8ICdOL0EnLFxuICAgICAgICAgICAgJ1xcblxcbmRpc2NvcmQtdm9pcCcsXG4gICAgICAgICAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlU3RyaW5nKCksXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIGRlcHNSZXBvcnQuam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgcHVibGljICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgeWllbGQqIHRoaXMubm9kZXMuY2FjaGUudmFsdWVzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBgUGxheWxpc3RgIGluc3RhbmNlXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gaW5pdGlhbGl6ZSBhIHBsYXlsaXN0XG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVBsYXlsaXN0KGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGF5bGlzdCh0aGlzLCBkYXRhKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIFZvaWNlU3RhdGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vcXVldWUnO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi9QbGF5ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vdXRpbHMvVXRpbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIoXG4gICAgcGxheWVyOiBQbGF5ZXIsXG4gICAgcXVldWU6IEd1aWxkUXVldWUsXG4gICAgb2xkU3RhdGU6IFZvaWNlU3RhdGUsXG4gICAgbmV3U3RhdGU6IFZvaWNlU3RhdGUsXG4pIHtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmICFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIG5vb3AgKi9cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdm9pZCBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LmRpc2Nvbm5lY3QsIHF1ZXVlKTtcbiAgICB9XG5cbiAgICBpZiAocXVldWUub3B0aW9ucy5wYXVzZU9uRW1wdHkpIHtcbiAgICAgICAgY29uc3QgaXNFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpO1xuXG4gICAgICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZCh0cnVlKTtcbiAgICAgICAgICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAocXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5kZWJ1ZygnVm9pY2UgY2hhbm5lbCBpcyBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcGF1c2luZy4uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFJlZmxlY3QuZ2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JykpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgUmVmbGVjdC5zZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLmRlYnVnKCdWb2ljZSBjaGFubmVsIGlzIG5vdCBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcmVzdW1pbmcuLi4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9sZFN0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgaWYgKG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJiBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKSB7XG4gICAgICAgICAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zZXJ2ZXJNdXRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIG5ld1N0YXRlLmNoYW5uZWw/LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSAmJlxuICAgICAgICAgICAgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJlxuICAgICAgICAgICAgb2xkU3RhdGUuc3VwcHJlc3MgIT09IG5ld1N0YXRlLnN1cHByZXNzXG4gICAgICAgICkge1xuICAgICAgICAgICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc3VwcHJlc3MpO1xuICAgICAgICAgICAgaWYgKG5ld1N0YXRlLnN1cHByZXNzKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghbmV3U3RhdGUuY2hhbm5lbElkICYmIG9sZFN0YXRlLmNoYW5uZWxJZCA9PT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5lbXB0eUNoYW5uZWwsIHF1ZXVlKTtcbiAgICAgICAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICAgICAgICBxdWV1ZS50aW1lb3V0cy5zZXQoYGVtcHR5XyR7b2xkU3RhdGUuZ3VpbGQuaWR9YCwgdGltZW91dCk7XG4gICAgfVxuXG4gICAgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBuZXdTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICBjb25zdCBjaGFubmVsRW1wdHkgPSBVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKTtcbiAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLmRlbGV0ZShgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY2hhbm5lbFBvcHVsYXRlLCBxdWV1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2xkU3RhdGUuY2hhbm5lbElkICYmIG5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgICAgICBpZiAobmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQpIHtcbiAgICAgICAgICAgIGlmIChxdWV1ZS5jb25uZWN0aW9uICYmIG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkKVxuICAgICAgICAgICAgICAgIHF1ZXVlLmNoYW5uZWwgPSBuZXdTdGF0ZS5jaGFubmVsITtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpO1xuICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICAgICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuY2hhbm5lbFBvcHVsYXRlLCBxdWV1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmNvbm5lY3Rpb24gJiYgIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgICAgICAgICAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgIT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsRW1wdHkgPSBVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsRW1wdHkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAocXVldWUudGltZW91dHMuaGFzKGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eSkgcXVldWUuZGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuZW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gICAgICAgICAgICAgICAgfSwgcXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biB8fCAwKS51bnJlZigpO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW1wdHlUaW1lb3V0ID0gcXVldWUudGltZW91dHMuZ2V0KGBlbXB0eV8ke29sZFN0YXRlLmd1aWxkLmlkfWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWxFbXB0eSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnRpbWVvdXRzLmRlbGV0ZShgZW1wdHlfJHtvbGRTdGF0ZS5ndWlsZC5pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5jaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBGRm1wZWcsIEZGbXBlZ0xpYiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VKU09OIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBNYXliZU51bGw8VD4gPSBUIHwgbnVsbDtcblxuZXhwb3J0IGludGVyZmFjZSBEZXBlbmRlbmNpZXNSZXBvcnQge1xuICAgIGNvcmU6IHtcbiAgICAgICAgJ2Rpc2NvcmQtcGxheWVyJzogc3RyaW5nO1xuICAgICAgICAnZGlzY29yZC12b2lwJzogc3RyaW5nO1xuICAgIH07XG4gICAgbGlib3B1czoge1xuICAgICAgICBtZWRpYXBsZXg6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICAgICAnQGRpc2NvcmRqcy9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgICAgICdAZXZhbi9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgICAgIG9wdXNzY3JpcHQ6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICAgICAnbm9kZS1vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgfTtcbiAgICBsaWJzb2RpdW06IHtcbiAgICAgICAgJ3NvZGl1bS1uYXRpdmUnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAgICAgc29kaXVtOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAgICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICAgICAnc29kaXVtLWphdmFzY3JpcHQnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAgICAgJ0BzdGFibGVsaWIveGNoYWNoYTIwcG9seTEzMDUnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAgICAgJ0Bub2JlbC9jaXBoZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgfTtcbiAgICBmZm1wZWc6IEZGbXBlZ1JlcG9ydDtcbn1cblxuZXhwb3J0IHR5cGUgRkZtcGVnUmVwb3J0ID0gUmVjb3JkPFxuICAgIEZGbXBlZ0xpYixcbiAgICBNYXliZU51bGw8e1xuICAgICAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgICAgIGhhc0xpYm9wdXM6IGJvb2xlYW47XG4gICAgfT5cbj47XG5cbi8qKlxuICogQSB1dGlsaXR5IHRvIGdlbmVyYXRlIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICovXG5leHBvcnQgY29uc3QgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvciA9IHtcbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgcGFja2FnZS5qc29uIGZpbGUgb2YgYSBwYWNrYWdlLlxuICAgICAqIEBwYXJhbSBkaXIgLSBUaGUgZGlyZWN0b3J5IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG4gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gZmluZFxuICAgICAqIEBwYXJhbSBkZXB0aCAtIFRoZSBtYXhpbXVtIGRlcHRoIHRvIHNlYXJjaFxuICAgICAqIEByZXR1cm5zIFRoZSBwYWNrYWdlLmpzb24gZmlsZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBmaW5kUGFja2FnZUpTT04oZGlyOiBzdHJpbmcsIHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRlcHRoOiBudW1iZXIpOiBQYWNrYWdlSlNPTiB8IG51bGwge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHJlc29sdmUoZGlyLCAncGFja2FnZS5qc29uJyk7XG5cbiAgICAgICAgY29uc3QgbmV4dCA9ICgpID0+IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZmluZFBhY2thZ2VKU09OKHJlc29sdmUoZGlyLCAnLi4nKSwgcGFja2FnZU5hbWUsIGRlcHRoIC0gMSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgICAgICAgICBjb25zdCBwa2dKU09OOiBQYWNrYWdlSlNPTiA9IHJlcXVpcmUodGFyZ2V0KTtcblxuICAgICAgICAgICAgaWYgKHBrZ0pTT04ubmFtZSAhPT0gcGFja2FnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcGtnSlNPTjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUcmllcyB0byBmaW5kIHRoZSB2ZXJzaW9uIG9mIGEgZGVwZW5kZW5jeS5cbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBwYWNrYWdlIHRvIGZpbmQgdGhlIHZlcnNpb24gb2ZcbiAgICAgKiBAcGFyYW0gbWF4TG9va3VwRGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2ggZm9yIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAqIEByZXR1cm5zIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHZlcnNpb24obmFtZTogc3RyaW5nLCBtYXhMb29rdXBEZXB0aCA9IDMpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChuYW1lID09PSAnZGlzY29yZC1wbGF5ZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICc3LjAuMC1kZXYuMyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBrZyA9IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZmluZFBhY2thZ2VKU09OKGRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKG5hbWUpKSwgbmFtZSwgbWF4TG9va3VwRGVwdGgpO1xuICAgICAgICAgICAgcmV0dXJuIHBrZz8udmVyc2lvbiA/PyBudWxsO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBkaXNjb3JkLXBsYXllciBtb2R1bGUuXG4gICAgICogQHJldHVybnMgVGhlIHJlcG9ydCBvYmplY3RcbiAgICAgKi9cbiAgICBnZW5lcmF0ZSgpOiBEZXBlbmRlbmNpZXNSZXBvcnQge1xuICAgICAgICBjb25zdCBmZm1wZWdSZXBvcnQgPSB7fSBhcyBGRm1wZWdSZXBvcnQ7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaWIgb2YgRkZtcGVnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGZmbXBlZ1JlcG9ydFtsaWIubmFtZV0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmZtcGVnID0gRkZtcGVnLnJlc29sdmVTYWZlKCk7XG5cbiAgICAgICAgaWYgKGZmbXBlZykge1xuICAgICAgICAgICAgZmZtcGVnUmVwb3J0W2ZmbXBlZy5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgICBoYXNMaWJvcHVzOiBmZm1wZWcuY29tbWFuZC5pbmNsdWRlcygnLS1lbmFibGUtbGlib3B1cycpLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IGZmbXBlZy52ZXJzaW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb3JlOiB7XG4gICAgICAgICAgICAgICAgJ2Rpc2NvcmQtcGxheWVyJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdkaXNjb3JkLXBsYXllcicpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAnZGlzY29yZC12b2lwJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdkaXNjb3JkLXZvaXAnKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGlib3B1czoge1xuICAgICAgICAgICAgICAgIG1lZGlhcGxleDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdtZWRpYXBsZXgnKSxcbiAgICAgICAgICAgICAgICAnQGRpc2NvcmRqcy9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZGlzY29yZGpzL29wdXMnKSxcbiAgICAgICAgICAgICAgICAnQGV2YW4vb3B1cyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQGV2YW4vb3B1cycpLFxuICAgICAgICAgICAgICAgIG9wdXNzY3JpcHQ6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignb3B1c3NjcmlwdCcpLFxuICAgICAgICAgICAgICAgICdub2RlLW9wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ25vZGUtb3B1cycpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxpYnNvZGl1bToge1xuICAgICAgICAgICAgICAgICdzb2RpdW0tbmF0aXZlJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tbmF0aXZlJyksXG4gICAgICAgICAgICAgICAgc29kaXVtOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ3NvZGl1bScpLFxuICAgICAgICAgICAgICAgICdsaWJzb2RpdW0td3JhcHBlcnMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ2xpYnNvZGl1bS13cmFwcGVycycpLFxuICAgICAgICAgICAgICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JyksXG4gICAgICAgICAgICAgICAgJ3NvZGl1bS1qYXZhc2NyaXB0JzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tamF2YXNjcmlwdCcpLFxuICAgICAgICAgICAgICAgICdAbm9iZWwvY2lwaGVycyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQG5vYmVsL2NpcGhlcnMnKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmZm1wZWc6IGZmbXBlZ1JlcG9ydCxcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVwZW5kZW5jaWVzIHJlcG9ydC5cbiAgICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgZ2VuZXJhdGVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcmVwb3J0ID0gRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5nZW5lcmF0ZSgpO1xuICAgICAgICBjb25zdCBsaW5lID0gJy0nLnJlcGVhdCg1MCk7XG5cbiAgICAgICAgY29uc3Qgb3V0cHV0OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIG91dHB1dC5wdXNoKCdEZXBlbmRlbmNpZXMgUmVwb3J0Jyk7XG4gICAgICAgIG91dHB1dC5wdXNoKGxpbmUpO1xuXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZXBvcnQpIGFzIChrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnQpW107XG5cbiAgICAgICAgZm9yIChjb25zdCBfa2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IF9rZXkgYXMga2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0O1xuXG4gICAgICAgICAgICBvdXRwdXQucHVzaChrZXkpO1xuXG4gICAgICAgICAgICBjb25zdCBzdWJLZXlzID0gT2JqZWN0LmtleXMocmVwb3J0W2tleV0pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IF9zdWJLZXkgb2Ygc3ViS2V5cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YktleSA9IF9zdWJLZXkgYXMga2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0W3R5cGVvZiBrZXldO1xuXG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goYC0gJHtzdWJLZXl9OiAke3JlcG9ydFtrZXldW3N1YktleV0gPz8gJ04vQSd9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG91dHB1dC5wdXNoKGxpbmUpO1xuXG4gICAgICAgIHJldHVybiBvdXRwdXQuam9pbignXFxuJyk7XG4gICAgfSxcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBQUFBO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNHQSxpQkFBbUQ7OztBQ0RuRCxzQkFBMkI7OztBQ0YzQixxQkFBMEY7OztBQ0FuRixJQUFNLFlBQU4sTUFB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LElBQU0sa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJM0IsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsZ0JBQWdCO0FBQUEsRUFDaEIsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJaEIsa0JBQWtCO0FBQUEsRUFDbEIsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsbUJBQW1CO0FBQUEsRUFDbkIsbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkIsWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVoscUJBQXFCO0FBQUEsRUFDckIscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJckIsWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVAsY0FBYztBQUFBLEVBQ2QsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosYUFBYTtBQUFBLEVBQ2IsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsYUFBYTtBQUFBLEVBQ2IsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWIsY0FBYztBQUFBLEVBQ2QsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVosZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWYsa0JBQWtCO0FBQUEsRUFDbEIsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEIsY0FBYztBQUFBLEVBQ2QsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWQsYUFBYTtBQUFBLEVBQ2IsYUFBYTtB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TztBQUNQLElBQUFDLHVCQVNPO0FBR0EsSUFBTSxVQUFrQjsiLAogICJuYW1lcyI6IFsiR3VpbGRRdWV1ZSIsICJ0YXJnZXQiLCAiU2VyaWFsaXplZFR5cGUiLCAiUXVldWVSZXBlYXRNb2RlIiwgInZlcnNpb24iLCAidGFyZ2V0IiwgIm1vZHVsZSIsICJoYW5kbGVyIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAiaGFuZGxlciIsICJoYW5kbGVyIiwgInJlc3VsdCIsICJ0YXJnZXQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJ0YXJnZXQiLCAicXVlcnkiLCAiaW1wb3J0X3Byb21pc2VzIiwgImltcG9ydF9kaXNjb3JkIiwgInJlc29sdmUiLCAicmVzb2x2ZSIsICJ3YWl0Rm9yIiwgImltcG9ydF9lcXVhbGl6ZXIiLCAiVHJhY2tTa2lwUmVhc29uIiwgInRhcmdldCIsICJyZXNvbHZlIiwgIkd1aWxkUXVldWUiLCAiR3VpbGRRdWV1ZSIsICJpbXBvcnRfcHJvbWlzZXMiLCAidmVyc2lvbiIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZmZtcGVnIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2ZmbXBlZyIsICJ0YXJnZXQiLCAiZGpzVmVyc2lvbiIsICJoYW5kbGVyIiwgInF1ZXJ5IiwgInJlcyIsICJyZXN1bHQiLCAiZFZvaWNlVmVyc2lvbiIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiXQp9Cg==