@discordeno/gateway 19.0.0-next.d1a91b9 → 19.0.0-next.d6898f2

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.
@@ -1,4 +1,4 @@
1
- /* eslint-disable @typescript-eslint/no-confusing-void-expression */ "use strict";
1
+ "use strict";
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
@@ -16,9 +16,9 @@ _export(exports, {
16
16
  return _default;
17
17
  }
18
18
  });
19
+ const _nodezlib = require("node:zlib");
19
20
  const _types = require("@discordeno/types");
20
21
  const _utils = require("@discordeno/utils");
21
- const _nodezlib = require("node:zlib");
22
22
  const _ws = /*#__PURE__*/ _interop_require_default(require("ws"));
23
23
  const _types1 = require("./types.cjs");
24
24
  function _interop_require_default(obj) {
@@ -66,13 +66,12 @@ let DiscordenoShard = class DiscordenoShard {
66
66
  return safeRequests < 0 ? 0 : safeRequests;
67
67
  }
68
68
  async checkOffline(highPriority) {
69
- if (!this.isOpen()) {
70
- await new Promise((resolve)=>{
71
- // Higher priority requests get added at the beginning of the array.
72
- if (highPriority) this.offlineSendQueue.unshift(resolve);
73
- else this.offlineSendQueue.push(resolve);
74
- });
75
- }
69
+ if (this.isOpen()) return;
70
+ return await new Promise((resolve)=>{
71
+ // Higher priority requests get added at the beginning of the array.
72
+ if (highPriority) this.offlineSendQueue.unshift(resolve);
73
+ else this.offlineSendQueue.push(resolve);
74
+ });
76
75
  }
77
76
  /** Close the socket connection to discord if present. */ close(code, reason) {
78
77
  if (this.socket?.readyState !== _ws.default.OPEN) return;
@@ -91,20 +90,17 @@ let DiscordenoShard = class DiscordenoShard {
91
90
  const url = new URL(this.connectionUrl);
92
91
  url.searchParams.set('v', this.gatewayConfig.version.toString());
93
92
  url.searchParams.set('encoding', 'json');
94
- const socket = // @ts-expect-error Deno
95
- globalThis.Deno !== undefined && Reflect.has(globalThis, 'Deno') ? new WebSocket(url.toString()) : new _ws.default(url.toString());
93
+ // We check for built-in WebSocket implementations in Bun or Deno, NodeJS v22 has an implementation too but it seems to be less optimized so for now it is better to use the ws npm package
94
+ const shouldUseBuiltin = Reflect.has(globalThis, 'WebSocket') && (Reflect.has(globalThis, 'Bun') || Reflect.has(globalThis, 'Deno'));
95
+ // @ts-expect-error NodeWebSocket doesn't support "dispatchEvent", and while we don't use it, it is required on the "WebSocket" type
96
+ const socket = shouldUseBuiltin ? new WebSocket(url) : new _ws.default(url);
96
97
  this.socket = socket;
97
- // TODO: proper event handling
98
- socket.onerror = (event)=>console.log({
99
- error: event,
100
- shardId: this.id
101
- });
102
- socket.onclose = async (event)=>await this.handleClose(event);
103
- socket.onmessage = async (message)=>await this.handleMessage(message);
98
+ socket.onerror = (event)=>this.handleError(event);
99
+ socket.onclose = async (closeEvent)=>await this.handleClose(closeEvent);
100
+ socket.onmessage = async (messageEvent)=>await this.handleMessage(messageEvent);
104
101
  return await new Promise((resolve)=>{
105
102
  socket.onopen = ()=>{
106
- // Only set the shard to `Unidentified` state,
107
- // if the connection request does not come from an identify or resume action.
103
+ // Only set the shard to `Unidentified` state if the connection request does not come from an identify or resume action.
108
104
  if (![
109
105
  _types1.ShardState.Identifying,
110
106
  _types1.ShardState.Resuming
@@ -181,8 +177,7 @@ let DiscordenoShard = class DiscordenoShard {
181
177
  this.logger.debug(`[Gateway] Resuming Shard #${this.id}, before connecting`);
182
178
  // Before we can resume, we need to create a new connection with Discord's gateway.
183
179
  await this.connect();
184
- this.logger.debug(// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
185
- `[Gateway] Resuming Shard #${this.id}, after connecting. ${this.sessionId} | ${this.previousSequenceNumber}`);
180
+ this.logger.debug(`[Gateway] Resuming Shard #${this.id}, after connecting. ${this.sessionId} | ${this.previousSequenceNumber}`);
186
181
  this.send({
187
182
  op: _types.GatewayOpcodes.Resume,
188
183
  d: {
@@ -191,7 +186,7 @@ let DiscordenoShard = class DiscordenoShard {
191
186
  seq: this.previousSequenceNumber ?? 0
192
187
  }
193
188
  }, true);
194
- this.logger.debug(`[Gateway] Resuming Shard #${this.id} after send resumg`);
189
+ this.logger.debug(`[Shard] Resuming Shard #${this.id} after send resume`);
195
190
  return await new Promise((resolve)=>{
196
191
  this.resolves.set('RESUMED', ()=>resolve());
197
192
  // If it is attempted to resume with an invalid session id,
@@ -218,10 +213,12 @@ let DiscordenoShard = class DiscordenoShard {
218
213
  this.close(_types1.ShardSocketCloseCodes.Shutdown, 'Shard shutting down.');
219
214
  this.state = _types1.ShardState.Offline;
220
215
  }
216
+ /** Handle a gateway connection error */ handleError(error) {
217
+ this.logger.error(`[Shard] There was an error connecting shard ${this.id}.`, error);
218
+ }
221
219
  /** Handle a gateway connection close. */ async handleClose(close) {
222
- // gateway.debug("GW CLOSED", { shardId, payload: event });
223
220
  this.stopHeartbeating();
224
- this.logger.debug(`[Shard] Gateway connection closed with code ${close.code}.`);
221
+ this.logger.debug(`[Shard] Gateway connection closed with code ${close.code} (${close.reason || '<No reason provided>'}).`);
225
222
  switch(close.code){
226
223
  case _types1.ShardSocketCloseCodes.TestingFinished:
227
224
  {
@@ -279,6 +276,16 @@ let DiscordenoShard = class DiscordenoShard {
279
276
  }
280
277
  }
281
278
  }
279
+ /** Handle an incoming gateway message. */ async handleMessage(message) {
280
+ let preProcessMessage = message.data;
281
+ // If message compression is enabled, Discord might send zlib compressed payloads.
282
+ if (this.gatewayConfig.compress && preProcessMessage instanceof Blob) {
283
+ preProcessMessage = (0, _nodezlib.inflateSync)(await preProcessMessage.arrayBuffer()).toString();
284
+ }
285
+ // Safeguard incase decompression failed to make a string.
286
+ if (typeof preProcessMessage !== 'string') return;
287
+ return await this.handleDiscordPacket(JSON.parse(preProcessMessage));
288
+ }
282
289
  /** Handles a incoming gateway packet. */ async handleDiscordPacket(packet) {
283
290
  // Edge case start: https://github.com/discordeno/discordeno/issues/2311
284
291
  this.heart.lastAck = Date.now();
@@ -363,7 +370,9 @@ let DiscordenoShard = class DiscordenoShard {
363
370
  this.state = _types1.ShardState.Connected;
364
371
  this.events.resumed?.(this);
365
372
  // Continue the requests which have been queued since the shard went offline.
366
- this.offlineSendQueue.map((resolve)=>resolve());
373
+ this.offlineSendQueue.forEach((resolve)=>resolve());
374
+ // Setting the length to 0 will delete the elements in it
375
+ this.offlineSendQueue.length = 0;
367
376
  this.resolves.get('RESUMED')?.(packet);
368
377
  this.resolves.delete('RESUMED');
369
378
  break;
@@ -376,7 +385,9 @@ let DiscordenoShard = class DiscordenoShard {
376
385
  this.state = _types1.ShardState.Connected;
377
386
  // Continue the requests which have been queued since the shard went offline.
378
387
  // Important when this is a re-identify
379
- this.offlineSendQueue.map((resolve)=>resolve());
388
+ this.offlineSendQueue.forEach((resolve)=>resolve());
389
+ // Setting the length to 0 will delete the elements in it
390
+ this.offlineSendQueue.length = 0;
380
391
  this.resolves.get('READY')?.(packet);
381
392
  this.resolves.delete('READY');
382
393
  break;
@@ -395,29 +406,17 @@ let DiscordenoShard = class DiscordenoShard {
395
406
  // Now the event can be safely forwarded.
396
407
  this.events.message?.(this, (0, _utils.camelize)(packet));
397
408
  }
398
- /** Handle an incoming gateway message. */ async handleMessage(message) {
399
- let preProcessMessage = message.data;
400
- // If message compression is enabled,
401
- // Discord might send zlib compressed payloads.
402
- if (this.gatewayConfig.compress && preProcessMessage instanceof Blob) {
403
- preProcessMessage = (0, _nodezlib.inflateSync)(await preProcessMessage.arrayBuffer()).toString();
404
- }
405
- // Safeguard incase decompression failed to make a string.
406
- if (typeof preProcessMessage !== 'string') return;
407
- return await this.handleDiscordPacket(JSON.parse(preProcessMessage));
408
- }
409
409
  /**
410
410
  * Override in order to make the shards presence.
411
411
  * async in case devs create the presence based on eg. database values.
412
412
  * Passing the shard's id there to make it easier for the dev to use this function.
413
413
  */ async makePresence() {
414
- // eslint-disable-next-line no-useless-return
415
414
  return;
416
415
  }
417
416
  /** This function communicates with the management process, in order to know whether its free to identify. When this function resolves, this means that the shard is allowed to send an identify payload to discord. */ async requestIdentify() {}
418
417
  /** This function communicates with the management process, in order to tell it can identify the next shard. */ async shardIsReady() {}
419
418
  /** Start sending heartbeat payloads to Discord in the provided interval. */ startHeartbeating(interval) {
420
- this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id}`);
419
+ this.logger.debug(`[Shard] Start heartbeating on shard #${this.id}`);
421
420
  // If old heartbeast exist like after resume, clear the old ones.
422
421
  if (this.heart.intervalId) clearInterval(this.heart.intervalId);
423
422
  if (this.heart.timeoutId) clearTimeout(this.heart.timeoutId);
@@ -428,7 +427,7 @@ let DiscordenoShard = class DiscordenoShard {
428
427
  _types1.ShardState.Disconnected,
429
428
  _types1.ShardState.Offline
430
429
  ].includes(this.state)) {
431
- this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} a`);
430
+ this.logger.debug(`[Shard] Shard is disconnected or offline but the heartbeat was started #${this.id}`);
432
431
  this.state = _types1.ShardState.Unidentified;
433
432
  }
434
433
  // The first heartbeat needs to be send with a random delay between `0` and `interval`
@@ -437,42 +436,39 @@ let DiscordenoShard = class DiscordenoShard {
437
436
  // Reference: https://discord.com/developers/docs/topics/gateway#heartbeating
438
437
  const jitter = Math.ceil(this.heart.interval * (Math.random() || 0.5));
439
438
  this.heart.timeoutId = setTimeout(()=>{
440
- this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} b`);
439
+ this.logger.debug(`[Shard] Beginning heartbeating process for shard #${this.id}`);
441
440
  if (!this.isOpen()) return;
442
- this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} c ${this.previousSequenceNumber}`);
441
+ this.logger.debug(`[Shard] Heartbeating on #${this.id}. Previous sequence number: ${this.previousSequenceNumber}`);
443
442
  // Using a direct socket.send call here because heartbeat requests are reserved by us.
444
443
  this.socket?.send(JSON.stringify({
445
444
  op: _types.GatewayOpcodes.Heartbeat,
446
445
  d: this.previousSequenceNumber
447
446
  }));
448
- this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} d`);
449
447
  this.heart.lastBeat = Date.now();
450
448
  this.heart.acknowledged = false;
451
449
  // After the random heartbeat jitter we can start a normal interval.
452
450
  this.heart.intervalId = setInterval(async ()=>{
453
- this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} e`);
454
- if (!this.isOpen()) return;
455
- this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} f`);
456
- // gateway.debug("GW DEBUG", `Running setInterval in heartbeat file. Shard: ${shardId}`);
457
- // gateway.debug("GW HEARTBEATING", { shardId, shard: currentShard });
451
+ if (!this.isOpen()) {
452
+ this.logger.debug(`[Shard] Shard #${this.id} is not open, but attempted heartbeat, ignoring.`);
453
+ return;
454
+ }
458
455
  // The Shard did not receive a heartbeat ACK from Discord in time,
459
456
  // therefore we have to assume that the connection has failed or got "zombied".
460
457
  // The Shard needs to start a re-identify action accordingly.
461
458
  // Reference: https://discord.com/developers/docs/topics/gateway#heartbeating-example-gateway-heartbeat-ack
462
459
  if (!this.heart.acknowledged) {
463
- this.logger.debug(`[Shard] Heartbeat not acknowledged for shard #${this.id}.`);
460
+ this.logger.debug(`[Shard] Heartbeat not acknowledged for shard #${this.id}. Assuming zombied connection.`);
464
461
  this.close(_types1.ShardSocketCloseCodes.ZombiedConnection, 'Zombied connection, did not receive an heartbeat ACK in time.');
465
462
  return await this.identify();
466
463
  }
467
- this.heart.acknowledged = false;
468
- this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} g`);
464
+ this.logger.debug(`[Shard] Heartbeating on #${this.id}. Previous sequence number: ${this.previousSequenceNumber}`);
469
465
  // Using a direct socket.send call here because heartbeat requests are reserved by us.
470
466
  this.socket?.send(JSON.stringify({
471
467
  op: _types.GatewayOpcodes.Heartbeat,
472
468
  d: this.previousSequenceNumber
473
469
  }));
474
- this.logger.debug(`[Gateway] Start Heartbeating Shard #${this.id} h`);
475
470
  this.heart.lastBeat = Date.now();
471
+ this.heart.acknowledged = false;
476
472
  this.events.heartbeat?.(this);
477
473
  }, this.heart.interval);
478
474
  }, jitter);
@@ -487,4 +483,4 @@ let DiscordenoShard = class DiscordenoShard {
487
483
  };
488
484
  const _default = DiscordenoShard;
489
485
 
490
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLXZvaWQtZXhwcmVzc2lvbiAqL1xuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheVBheWxvYWQsIERpc2NvcmRIZWxsbywgRGlzY29yZFJlYWR5IH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBHYXRld2F5Q2xvc2VFdmVudENvZGVzLCBHYXRld2F5T3Bjb2RlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgTGVha3lCdWNrZXQsIGNhbWVsaXplLCBkZWxheSwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgeyBpbmZsYXRlU3luYyB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCBOb2RlV2ViU29ja2V0IGZyb20gJ3dzJ1xuaW1wb3J0IHR5cGUgeyBCb3RTdGF0dXNVcGRhdGUsIFNoYXJkRXZlbnRzLCBTaGFyZEdhdGV3YXlDb25maWcsIFNoYXJkSGVhcnQsIFNoYXJkU29ja2V0UmVxdWVzdCB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgeyBTaGFyZFNvY2tldENsb3NlQ29kZXMsIFNoYXJkU3RhdGUgfSBmcm9tICcuL3R5cGVzLmpzJ1xuXG5kZWNsYXJlIGxldCBXZWJTb2NrZXQ6IGFueVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZGVub1NoYXJkIHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgc2hhcmQgKi9cbiAgaWQ6IG51bWJlclxuICAvKiogVGhlIGNvbm5lY3Rpb24gY29uZmlnIGRldGFpbHMgdGhhdCB0aGlzIHNoYXJkIHdpbGwgdXNlZCB0byBjb25uZWN0IHRvIGRpc2NvcmQuICovXG4gIGNvbm5lY3Rpb246IFNoYXJkR2F0ZXdheUNvbmZpZ1xuICAvKiogVGhpcyBjb250YWlucyBhbGwgdGhlIGhlYXJ0YmVhdCBpbmZvcm1hdGlvbiAqL1xuICBoZWFydDogU2hhcmRIZWFydFxuICAvKiogVGhlIG1heGltdW0gb2YgcmVxdWVzdHMgd2hpY2ggY2FuIGJlIHNlbmQgdG8gZGlzY29yZCBwZXIgcmF0ZSBsaW1pdCB0aWNrLiBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlIGNoYW5nZWQuICovXG4gIG1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljazogbnVtYmVyID0gMTIwXG4gIC8qKiBUaGUgcHJldmlvdXMgcGF5bG9hZCBzZXF1ZW5jZSBudW1iZXIuICovXG4gIHByZXZpb3VzU2VxdWVuY2VOdW1iZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG4gIC8qKiBJbiB3aGljaCBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKSB0aGUgZ2F0ZXdheSByZXNldHMgaXQncyByYXRlIGxpbWl0LiAqL1xuICByYXRlTGltaXRSZXNldEludGVydmFsOiBudW1iZXIgPSA2MDAwMFxuICAvKiogQ3VycmVudCBzZXNzaW9uIGlkIG9mIHRoZSBzaGFyZCBpZiBwcmVzZW50LiAqL1xuICBzZXNzaW9uSWQ/OiBzdHJpbmdcbiAgLyoqIFRoaXMgY29udGFpbnMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIERpc2NvcmQsIGlmIGN1cnJlbnRseSBjb25uZWN0ZWQuICovXG4gIHNvY2tldD86IE5vZGVXZWJTb2NrZXRcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIC8qKiBUaGUgdXJsIHByb3ZpZGVkIGJ5IGRpc2NvcmQgdG8gdXNlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWN0aW9uIGZvciB0aGlzIHRoaXMuICovXG4gIHJlc3VtZUdhdGV3YXlVcmw6IHN0cmluZyA9ICcnXG4gIC8qKiBUaGUgc2hhcmQgcmVsYXRlZCBldmVudCBoYW5kbGVycy4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cyA9IHt9XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6IEFycmF5PChfPzogdW5rbm93bikgPT4gdm9pZD4gPSBbXVxuICAvKiogUmVzb2x2ZSBpbnRlcm5hbCB3YWl0aW5nIHN0YXRlcy4gTWFwcGVkIGJ5IFNlbGVjdGVkRXZlbnRzID0+IFJlc29sdmVGdW5jdGlvbiAqL1xuICByZXNvbHZlcyA9IG5ldyBNYXA8J1JFQURZJyB8ICdSRVNVTUVEJyB8ICdJTlZBTElEX1NFU1NJT04nLCAocGF5bG9hZDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKSA9PiB2b2lkPigpXG4gIC8qKiBTaGFyZCBidWNrZXQuIE9ubHkgYWNjZXNzIHRoaXMgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBCdWNrZXQgZm9yIGhhbmRsaW5nIHNoYXJkIHJlcXVlc3QgcmF0ZSBsaW1pdHMuICovXG4gIGJ1Y2tldDogTGVha3lCdWNrZXRcbiAgLyoqIExvZ2dlciBmb3IgdGhlIGJ1Y2tldCAqL1xuICBsb2dnZXI6IFBpY2s8dHlwZW9mIGxvZ2dlciwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnZmF0YWwnPlxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNoYXJkQ3JlYXRlT3B0aW9ucykge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkXG4gICAgdGhpcy5jb25uZWN0aW9uID0gb3B0aW9ucy5jb25uZWN0aW9uXG4gICAgdGhpcy5ldmVudHMgPSBvcHRpb25zLmV2ZW50c1xuICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyXG5cbiAgICB0aGlzLmhlYXJ0ID0ge1xuICAgICAgYWNrbm93bGVkZ2VkOiBmYWxzZSxcbiAgICAgIGludGVydmFsOiA0NTAwMCxcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5yZXF1ZXN0SWRlbnRpZnkpIHRoaXMucmVxdWVzdElkZW50aWZ5ID0gb3B0aW9ucy5yZXF1ZXN0SWRlbnRpZnlcbiAgICBpZiAob3B0aW9ucy5zaGFyZElzUmVhZHkpIHRoaXMuc2hhcmRJc1JlYWR5ID0gb3B0aW9ucy5zaGFyZElzUmVhZHlcblxuICAgIHRoaXMuYnVja2V0ID0gbmV3IExlYWt5QnVja2V0KHtcbiAgICAgIG1heDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgIHJlZmlsbEFtb3VudDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgIHJlZmlsbEludGVydmFsOiA2MDAwMCxcbiAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBUaGUgZ2F0ZXdheSBjb25maWd1cmF0aW9uIHdoaWNoIGlzIHVzZWQgdG8gY29ubmVjdCB0byBEaXNjb3JkLiAqL1xuICBnZXQgZ2F0ZXdheUNvbmZpZygpOiBTaGFyZEdhdGV3YXlDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKiBUaGUgdXJsIHRvIGNvbm5lY3QgdG8uIEluaXRpYWxseSB0aGlzIGlzIHRoZSBkaXNjb3JkIGdhdGV3YXkgdXJsLCBhbmQgdGhlbiBpcyBzd2l0Y2hlZCB0byByZXN1bWUgZ2F0ZXdheSB1cmwgb25jZSBhIFJFQURZIGlzIHJlY2VpdmVkLiAqL1xuICBnZXQgY29ubmVjdGlvblVybCgpOiBzdHJpbmcge1xuICAgIC8vIFVzZSB8fCBhbmQgbm90ID8/IGhlcmUuID8/IHdpbGwgY2F1c2UgYSBidWcuXG4gICAgcmV0dXJuIHRoaXMucmVzdW1lR2F0ZXdheVVybCB8fCB0aGlzLmdhdGV3YXlDb25maWcudXJsXG4gIH1cblxuICAvKiogQ2FsY3VsYXRlIHRoZSBhbW91bnQgb2YgcmVxdWVzdHMgd2hpY2ggY2FuIHNhZmVseSBiZSBtYWRlIHBlciByYXRlIGxpbWl0IGludGVydmFsLCBiZWZvcmUgdGhlIGdhdGV3YXkgZ2V0cyBkaXNjb25uZWN0ZWQgZHVlIHRvIGFuIGV4Y2VlZGVkIHJhdGUgbGltaXQuICovXG4gIGNhbGN1bGF0ZVNhZmVSZXF1ZXN0cygpOiBudW1iZXIge1xuICAgIC8vICogMiBhZGRzIGV4dHJhIHNhZmV0eSBsYXllciBmb3IgZGlzY29yZHMgT1AgMSByZXF1ZXN0cyB0aGF0IHdlIG5lZWQgdG8gcmVzcG9uZCB0b1xuICAgIGNvbnN0IHNhZmVSZXF1ZXN0cyA9IHRoaXMubWF4UmVxdWVzdHNQZXJSYXRlTGltaXRUaWNrIC0gTWF0aC5jZWlsKHRoaXMucmF0ZUxpbWl0UmVzZXRJbnRlcnZhbCAvIHRoaXMuaGVhcnQuaW50ZXJ2YWwpICogMlxuXG4gICAgcmV0dXJuIHNhZmVSZXF1ZXN0cyA8IDAgPyAwIDogc2FmZVJlcXVlc3RzXG4gIH1cblxuICBhc3luYyBjaGVja09mZmxpbmUoaGlnaFByaW9yaXR5OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbigpKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAvLyBIaWdoZXIgcHJpb3JpdHkgcmVxdWVzdHMgZ2V0IGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LlxuICAgICAgICBpZiAoaGlnaFByaW9yaXR5KSB0aGlzLm9mZmxpbmVTZW5kUXVldWUudW5zaGlmdChyZXNvbHZlKVxuICAgICAgICBlbHNlIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5wdXNoKHJlc29sdmUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlICE9PSBOb2RlV2ViU29ja2V0Lk9QRU4pIHJldHVyblxuXG4gICAgdGhpcy5zb2NrZXQ/LmNsb3NlKGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKiBDb25uZWN0IHRoZSBzaGFyZCB3aXRoIHRoZSBnYXRld2F5IGFuZCBzdGFydCBoZWFydGJlYXRpbmcuIFRoaXMgd2lsbCBub3QgaWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8RGlzY29yZGVub1NoYXJkPiB7XG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBDb25uZWN0aW5nYCBzdGF0ZSxcbiAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0aW5nXG4gICAgfVxuICAgIHRoaXMuZXZlbnRzLmNvbm5lY3Rpbmc/Lih0aGlzKVxuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmNvbm5lY3Rpb25VcmwpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3YnLCB0aGlzLmdhdGV3YXlDb25maWcudmVyc2lvbi50b1N0cmluZygpKVxuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdlbmNvZGluZycsICdqc29uJylcblxuICAgIGNvbnN0IHNvY2tldDogTm9kZVdlYlNvY2tldCA9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIERlbm9cbiAgICAgIGdsb2JhbFRoaXMuRGVubyAhPT0gdW5kZWZpbmVkICYmIFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdEZW5vJykgPyBuZXcgV2ViU29ja2V0KHVybC50b1N0cmluZygpKSA6IG5ldyBOb2RlV2ViU29ja2V0KHVybC50b1N0cmluZygpKVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG5cbiAgICAvLyBUT0RPOiBwcm9wZXIgZXZlbnQgaGFuZGxpbmdcbiAgICBzb2NrZXQub25lcnJvciA9IChldmVudDogTm9kZVdlYlNvY2tldC5FcnJvckV2ZW50KSA9PiBjb25zb2xlLmxvZyh7IGVycm9yOiBldmVudCwgc2hhcmRJZDogdGhpcy5pZCB9KVxuICAgIHNvY2tldC5vbmNsb3NlID0gYXN5bmMgKGV2ZW50OiBOb2RlV2ViU29ja2V0LkNsb3NlRXZlbnQpID0+IGF3YWl0IHRoaXMuaGFuZGxlQ2xvc2UoZXZlbnQpXG4gICAgc29ja2V0Lm9ubWVzc2FnZSA9IGFzeW5jIChtZXNzYWdlOiBOb2RlV2ViU29ja2V0Lk1lc3NhZ2VFdmVudCkgPT4gYXdhaXQgdGhpcy5oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCB0byBgVW5pZGVudGlmaWVkYCBzdGF0ZSxcbiAgICAgICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgaWYgKCFbU2hhcmRTdGF0ZS5JZGVudGlmeWluZywgU2hhcmRTdGF0ZS5SZXN1bWluZ10uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV2ZW50cy5jb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJlc29sdmUodGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIElkZW50aWZ5IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gSWYgbm90IGNvbm5lY3RlZCwgdGhpcyB3aWxsIGFsc28gY29ubmVjdCB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIGlkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEEgbmV3IGlkZW50aWZ5IGhhcyBiZWVuIHJlcXVlc3RlZCBldmVuIHRob3VnaCB0aGVyZSBpcyBhbHJlYWR5IGEgY29ubmVjdGlvbiBvcGVuLlxuICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBvbGQgY29ubmVjdGlvbiBhbmQgaGVhcnRiZWF0aW5nIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDTE9TSU5HIEVYSVNUSU5HIFNIQVJEOiAjJHt0aGlzLmlkfWApXG4gICAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZUlkZW50aWZ5aW5nLCAnUmUtaWRlbnRpZnlpbmcgY2xvc3VyZSBvZiBvbGQgY29ubmVjdGlvbi4nKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nXG4gICAgdGhpcy5ldmVudHMuaWRlbnRpZnlpbmc/Lih0aGlzKVxuXG4gICAgLy8gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgc2hhcmQgaXMgaW4gSGVhcnRiZWF0aW5nIHN0YXRlIGJ1dCBub3QgaWRlbnRpZmllZCxcbiAgICAvLyBzbyBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFscmVhZHkgYSBnYXRld2F5IGNvbm5lY3Rpb24gZXhpc3RpbmcuXG4gICAgLy8gSWYgbm90IHdlIG5lZWQgdG8gY3JlYXRlIG9uZSBiZWZvcmUgd2UgaWRlbnRpZnkuXG4gICAgaWYgKCF0aGlzLmlzT3BlbigpKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgIH1cblxuICAgIHRoaXMuc2VuZChcbiAgICAgIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLklkZW50aWZ5LFxuICAgICAgICBkOiB7XG4gICAgICAgICAgdG9rZW46IGBCb3QgJHt0aGlzLmdhdGV3YXlDb25maWcudG9rZW59YCxcbiAgICAgICAgICBjb21wcmVzczogdGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZ2F0ZXdheUNvbmZpZy5wcm9wZXJ0aWVzLFxuICAgICAgICAgIGludGVudHM6IHRoaXMuZ2F0ZXdheUNvbmZpZy5pbnRlbnRzLFxuICAgICAgICAgIHNoYXJkOiBbdGhpcy5pZCwgdGhpcy5nYXRld2F5Q29uZmlnLnRvdGFsU2hhcmRzXSxcbiAgICAgICAgICBwcmVzZW5jZTogYXdhaXQgdGhpcy5tYWtlUHJlc2VuY2U/LigpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnUkVBRFknLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmlkZW50aWZpZWQ/Lih0aGlzKVxuICAgICAgICAvLyBUZWxscyB0aGUgbWFuYWdlciB0aGF0IHRoaXMgc2hhcmQgaXMgcmVhZHlcbiAgICAgICAgdGhpcy5zaGFyZElzUmVhZHkoKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgICAvLyBXaGVuIGlkZW50aWZ5aW5nIHRvbyBmYXN0LFxuICAgICAgLy8gRGlzY29yZCBzZW5kcyBhbiBpbnZhbGlkIHNlc3Npb24gcGF5bG9hZC5cbiAgICAgIC8vIFRoaXMgY2FuIHNhZmVseSBiZSBpZ25vcmVkIHRob3VnaCBhbmQgdGhlIHNoYXJkIHN0YXJ0cyBhIG5ldyBpZGVudGlmeSBhY3Rpb24uXG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnSU5WQUxJRF9TRVNTSU9OJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVBRFknKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBDaGVjayB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHRvIERpc2NvcmQgaXMgY3VycmVudGx5IG9wZW4uICovXG4gIGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LnJlYWR5U3RhdGUgPT09IE5vZGVXZWJTb2NrZXQuT1BFTlxuICB9XG5cbiAgLyoqIEF0dGVtcHQgdG8gcmVzdW1lIHRoZSBwcmV2aW91cyBzaGFyZHMgc2Vzc2lvbiB3aXRoIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyByZXN1bWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgLy8gSXQgaGFzIGJlZW4gcmVxdWVzdGVkIHRvIHJlc3VtZSB0aGUgU2hhcmRzIHNlc3Npb24uXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBzdGlsbCBjb25uZWN0ZWQgd2l0aCBEaXNjb3JkJ3MgZ2F0ZXdheSB0aGVyZWZvcmUgd2UgbmVlZCB0byBmb3JjZWZ1bGx5IGNsb3NlIGl0LlxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9IGluIGlzT3BlbmApXG4gICAgICB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbiwgJ1JlY29ubmVjdGluZyB0aGUgc2hhcmQsIGNsb3Npbmcgb2xkIGNvbm5lY3Rpb24uJylcbiAgICB9XG5cbiAgICAvLyBTaGFyZCBoYXMgbmV2ZXIgaWRlbnRpZmllZCwgc28gd2UgY2Fubm90IHJlc3VtZS5cbiAgICBpZiAoIXRoaXMuc2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBUcnlpbmcgdG8gcmVzdW1lIGEgc2hhcmQgIyR7dGhpcy5pZH0gdGhhdCB3YXMgTk9UIGZpcnN0IGlkZW50aWZpZWQuIChObyBzZXNzaW9uIGlkIGZvdW5kKWApXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmlkZW50aWZ5KClcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5SZXN1bWluZ1xuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSwgYmVmb3JlIGNvbm5lY3RpbmdgKVxuICAgIC8vIEJlZm9yZSB3ZSBjYW4gcmVzdW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHdpdGggRGlzY29yZCdzIGdhdGV3YXkuXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgIGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0sIGFmdGVyIGNvbm5lY3RpbmcuICR7dGhpcy5zZXNzaW9uSWR9IHwgJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YCxcbiAgICApXG5cbiAgICB0aGlzLnNlbmQoXG4gICAgICB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5SZXN1bWUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIHNlc3Npb25faWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIHNlcTogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyID8/IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSBhZnRlciBzZW5kIHJlc3VtZ2ApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRVNVTUVEJywgKCkgPT4gcmVzb2x2ZSgpKVxuICAgICAgLy8gSWYgaXQgaXMgYXR0ZW1wdGVkIHRvIHJlc3VtZSB3aXRoIGFuIGludmFsaWQgc2Vzc2lvbiBpZCxcbiAgICAgIC8vIERpc2NvcmQgc2VuZHMgYW4gaW52YWxpZCBzZXNzaW9uIHBheWxvYWRcbiAgICAgIC8vIE5vdCBlcnJvcmluZyBoZXJlIHNpbmNlIGl0IGlzIGVhc3kgdGhhdCB0aGlzIGhhcHBlbnMsIGFsc28gaXQgd291bGQgYmUgbm90IGNhdGNoYWJsZVxuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ0lOVkFMSURfU0VTU0lPTicsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBTZW5kIGEgbWVzc2FnZSB0byBEaXNjb3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtoaWdoUHJpb3JpdHk9ZmFsc2VdIC0gV2hldGhlciB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbmQgYXNhcC5cbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogU2hhcmRTb2NrZXRSZXF1ZXN0LCBoaWdoUHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSBhY3F1aXJpbmcgYSB0b2tlbiBmcm9tIHRoZSBidWNrZXQsIGNoZWNrIHdoZXRoZXIgdGhlIHNoYXJkIGlzIGN1cnJlbnRseSBvZmZsaW5lIG9yIG5vdC5cbiAgICAvLyBFbHNlIGJ1Y2tldCBhbmQgdG9rZW4gd2FpdCB0aW1lIGp1c3QgZ2V0IHdhc3RlZC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICBhd2FpdCB0aGlzLmJ1Y2tldC5hY3F1aXJlKGhpZ2hQcmlvcml0eSlcblxuICAgIC8vIEl0J3MgcG9zc2libGUsIHRoYXQgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZSBhZnRlciBhIHRva2VuIGhhcyBiZWVuIGFjcXVpcmVkIGZyb20gdGhlIGJ1Y2tldC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICB0aGlzLnNvY2tldD8uc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSlcbiAgfVxuXG4gIC8qKiBTaHV0ZG93biB0aGUgdGhpcy4gRm9yY2VmdWxseSBkaXNjb25uZWN0IHRoZSBzaGFyZCBmcm9tIERpc2NvcmQuIFRoZSBzaGFyZCBtYXkgbm90IGF0dGVtcHQgdG8gcmVjb25uZWN0IHdpdGggRGlzY29yZC4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd24sICdTaGFyZCBzaHV0dGluZyBkb3duLicpXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZS4gKi9cbiAgYXN5bmMgaGFuZGxlQ2xvc2UoY2xvc2U6IE5vZGVXZWJTb2NrZXQuQ2xvc2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vICAgZ2F0ZXdheS5kZWJ1ZyhcIkdXIENMT1NFRFwiLCB7IHNoYXJkSWQsIHBheWxvYWQ6IGV2ZW50IH0pO1xuXG4gICAgdGhpcy5zdG9wSGVhcnRiZWF0aW5nKClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VkIHdpdGggY29kZSAke2Nsb3NlLmNvZGV9LmApXG5cbiAgICBzd2l0Y2ggKGNsb3NlLmNvZGUpIHtcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlRlc3RpbmdGaW5pc2hlZDoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBPbiB0aGVzZSBjb2RlcyBhIG1hbnVhbCBzdGFydCB3aWxsIGJlIGRvbmUuXG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5TaHV0ZG93bjpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmc6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXNoYXJkZWQ6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbjpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlpvbWJpZWRDb25uZWN0aW9uOiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkRpc2Nvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIC8vIGdhdGV3YXkuZGVidWcoXCJHVyBDTE9TRURfUkVDT05ORUNUXCIsIHsgc2hhcmRJZCwgcGF5bG9hZDogZXZlbnQgfSk7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyB3aGljaCByZXF1aXJlIGEgbmV3IGlkZW50aWZ5LlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25PcGNvZGU6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuTm90QXV0aGVudGljYXRlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkU2VxOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlJhdGVMaW1pdGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNlc3Npb25UaW1lZE91dDoge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnW1NoYXJkXSBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2luZyByZXF1aXJpbmcgcmUtaWRlbnRpZnkuJylcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZXNlIGNvZGVzIGFyZSByZWNlaXZlZCBzb21ldGhpbmcgd2VudCByZWFsbHkgd3JvbmcuXG4gICAgICAvLyBPbiB0aG9zZSB3ZSBjYW5ub3Qgc3RhcnQgYSByZWNvbm5lY3QgYXR0ZW1wdC5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BdXRoZW50aWNhdGlvbkZhaWxlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkU2hhcmQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuU2hhcmRpbmdSZXF1aXJlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkQXBpVmVyc2lvbjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkSW50ZW50czpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EaXNhbGxvd2VkSW50ZW50czoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNsb3NlLnJlYXNvbiB8fCAnRGlzY29yZCBnYXZlIG5vIHJlYXNvbiEgR0chIFlvdSBicm9rZSBEaXNjb3JkIScpXG4gICAgICB9XG4gICAgICAvLyBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VzIG9uIHdoaWNoIGEgcmVzdW1lIGlzIGFsbG93ZWQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuVW5rbm93bkVycm9yOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkRlY29kZUVycm9yOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkFscmVhZHlBdXRoZW50aWNhdGVkOlxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGBbU2hhcmRdIENsb3NlZCBzaGFyZCAjJHt0aGlzLmlkfSB3aXRoIGNvZGUgJHtjbG9zZS5jb2RlfS4gQXR0ZW1wdGluZyB0byByZXN1bWUuLi5gKVxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5SZXN1bWluZ1xuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlc3VtZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEhhbmRsZXMgYSBpbmNvbWluZyBnYXRld2F5IHBhY2tldC4gKi9cbiAgYXN5bmMgaGFuZGxlRGlzY29yZFBhY2tldChwYWNrZXQ6IERpc2NvcmRHYXRld2F5UGF5bG9hZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEVkZ2UgY2FzZSBzdGFydDogaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmRlbm8vZGlzY29yZGVuby9pc3N1ZXMvMjMxMVxuICAgIHRoaXMuaGVhcnQubGFzdEFjayA9IERhdGUubm93KClcbiAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IHRydWVcbiAgICAvLyBFZGdlIGNhc2UgZW5kIVxuXG4gICAgc3dpdGNoIChwYWNrZXQub3ApIHtcbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0OiB7XG4gICAgICAgIC8vIFRPRE86IGNhbiB0aGlzIGFjdHVhbGx5IGhhcHBlblxuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVyblxuXG4gICAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG4gICAgICAgIC8vIERpc2NvcmQgcmFuZG9tbHkgc2VuZHMgdGhpcyByZXF1aXJpbmcgYW4gaW1tZWRpYXRlIGhlYXJ0YmVhdCBiYWNrLlxuICAgICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVsbG86IHtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSAocGFja2V0LmQgYXMgRGlzY29yZEhlbGxvKS5oZWFydGJlYXRfaW50ZXJ2YWxcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBIZWxsbyBvbiBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgICAgIHRoaXMuc3RhcnRIZWFydGJlYXRpbmcoaW50ZXJ2YWwpXG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IFNoYXJkU3RhdGUuUmVzdW1pbmcpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UXVldWUgPSBbLi4udGhpcy5idWNrZXQucXVldWVdXG4gICAgICAgICAgLy8gSEVMTE8gaGFzIGJlZW4gc2VuZCBvbiBhIG5vbiByZXN1bWUgYWN0aW9uLlxuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IHNlc3Npb24sXG4gICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSByYXRlIGxpbWl0IGludGVydmFsIGhhcyBiZWVuIHJlc2V0IHRvby5cbiAgICAgICAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICAgICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICAgICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIFF1ZXVlIHNob3VsZCBub3QgYmUgbG9zdCBvbiBhIHJlLWlkZW50aWZ5LlxuICAgICAgICAgIHRoaXMuYnVja2V0LnF1ZXVlLnVuc2hpZnQoLi4uY3VycmVudFF1ZXVlKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVsbG8/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdEFDSzoge1xuICAgICAgICAvLyBNYW51YWxseSBjYWxjdWxhdGluZyB0aGUgcm91bmQgdHJpcCB0aW1lIGZvciB1c2VycyB3aG8gbmVlZCBpdC5cbiAgICAgICAgaWYgKHRoaXMuaGVhcnQubGFzdEJlYXQpIHtcbiAgICAgICAgICB0aGlzLmhlYXJ0LnJ0dCA9IHRoaXMuaGVhcnQubGFzdEFjayAtIHRoaXMuaGVhcnQubGFzdEJlYXRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdEFjaz8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuUmVjb25uZWN0OiB7XG4gICAgICAgIC8vICAgZ2F0ZXdheS5kZWJ1ZyhcIkdXIFJFQ09OTkVDVFwiLCB7IHNoYXJkSWQgfSk7XG5cbiAgICAgICAgdGhpcy5ldmVudHMucmVxdWVzdGVkUmVjb25uZWN0Py4odGhpcylcblxuICAgICAgICBhd2FpdCB0aGlzLnJlc3VtZSgpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSW52YWxpZFNlc3Npb246IHtcbiAgICAgICAgY29uc3QgcmVzdW1hYmxlID0gcGFja2V0LmQgYXMgYm9vbGVhblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZWNlaXZlZCBJbnZhbGlkIFNlc3Npb24gZm9yIFNoYXJkICMke3RoaXMuaWR9IHdpdGggcmVzdW1lYWJsZSBhcyAke3Jlc3VtYWJsZS50b1N0cmluZygpfWApXG5cbiAgICAgICAgdGhpcy5ldmVudHMuaW52YWxpZFNlc3Npb24/Lih0aGlzLCByZXN1bWFibGUpXG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0IGZvciBhIHJhbmRvbSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIDEgYW5kIDVcbiAgICAgICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNyZXN1bWluZ1xuICAgICAgICBhd2FpdCBkZWxheShNYXRoLmZsb29yKChNYXRoLnJhbmRvbSgpICogNCArIDEpICogMTAwMCkpXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ0lOVkFMSURfU0VTU0lPTicpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnSU5WQUxJRF9TRVNTSU9OJylcblxuICAgICAgICAvLyBXaGVuIHJlc3VtYWJsZSBpcyBmYWxzZSB3ZSBuZWVkIHRvIHJlLWlkZW50aWZ5XG4gICAgICAgIGlmICghcmVzdW1hYmxlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0SWRlbnRpZnkoKVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBzZXNzaW9uIGlzIGludmFsaWQgYnV0IGFwcGFyZW50bHkgaXQgaXMgcmVzdW1hYmxlXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKClcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAocGFja2V0LnQpIHtcbiAgICAgIGNhc2UgJ1JFU1VNRUQnOlxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0ZWRcbiAgICAgICAgdGhpcy5ldmVudHMucmVzdW1lZD8uKHRoaXMpXG5cbiAgICAgICAgLy8gQ29udGludWUgdGhlIHJlcXVlc3RzIHdoaWNoIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZS5cbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLm1hcCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKVxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdSRVNVTUVEJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRVNVTUVEJylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ1JFQURZJzoge1xuICAgICAgICAvLyBJbXBvcnRhbnQgZm9yIGZ1dHVyZSByZXN1bWVzLlxuICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgRGlzY29yZFJlYWR5XG5cbiAgICAgICAgdGhpcy5yZXN1bWVHYXRld2F5VXJsID0gcGF5bG9hZC5yZXN1bWVfZ2F0ZXdheV91cmxcblxuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHBheWxvYWQuc2Vzc2lvbl9pZFxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0ZWRcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICAvLyBJbXBvcnRhbnQgd2hlbiB0aGlzIGlzIGEgcmUtaWRlbnRpZnlcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLm1hcCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKVxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdSRUFEWScpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVBRFknKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgc2VxdWVuY2UgbnVtYmVyIGlmIGl0IGlzIHByZXNlbnRcbiAgICAvLyBgc2AgY2FuIGJlIGVpdGhlciBgbnVsbGAgb3IgYSBgbnVtYmVyYC5cbiAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IHVwZGF0ZSBtaXNzZXMgd2hlbiBgc2AgaXMgYDBgIHdlIGNoZWNrIGFnYWluc3QgbnVsbC5cbiAgICBpZiAocGFja2V0LnMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciA9IHBhY2tldC5zXG4gICAgfVxuXG4gICAgdGhpcy5mb3J3YXJkVG9Cb3QocGFja2V0KVxuICB9XG5cbiAgZm9yd2FyZFRvQm90KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogdm9pZCB7XG4gICAgLy8gVGhlIG5lY2Vzc2FyeSBoYW5kbGluZyByZXF1aXJlZCBmb3IgdGhlIFNoYXJkcyBjb25uZWN0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLlxuICAgIC8vIE5vdyB0aGUgZXZlbnQgY2FuIGJlIHNhZmVseSBmb3J3YXJkZWQuXG4gICAgdGhpcy5ldmVudHMubWVzc2FnZT8uKHRoaXMsIGNhbWVsaXplKHBhY2tldCkpXG4gIH1cblxuICAvKiogSGFuZGxlIGFuIGluY29taW5nIGdhdGV3YXkgbWVzc2FnZS4gKi9cbiAgYXN5bmMgaGFuZGxlTWVzc2FnZShtZXNzYWdlOiBOb2RlV2ViU29ja2V0Lk1lc3NhZ2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBwcmVQcm9jZXNzTWVzc2FnZSA9IG1lc3NhZ2UuZGF0YVxuXG4gICAgLy8gSWYgbWVzc2FnZSBjb21wcmVzc2lvbiBpcyBlbmFibGVkLFxuICAgIC8vIERpc2NvcmQgbWlnaHQgc2VuZCB6bGliIGNvbXByZXNzZWQgcGF5bG9hZHMuXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcyAmJiBwcmVQcm9jZXNzTWVzc2FnZSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgIHByZVByb2Nlc3NNZXNzYWdlID0gaW5mbGF0ZVN5bmMoYXdhaXQgcHJlUHJvY2Vzc01lc3NhZ2UuYXJyYXlCdWZmZXIoKSkudG9TdHJpbmcoKVxuICAgIH1cblxuICAgIC8vIFNhZmVndWFyZCBpbmNhc2UgZGVjb21wcmVzc2lvbiBmYWlsZWQgdG8gbWFrZSBhIHN0cmluZy5cbiAgICBpZiAodHlwZW9mIHByZVByb2Nlc3NNZXNzYWdlICE9PSAnc3RyaW5nJykgcmV0dXJuXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVEaXNjb3JkUGFja2V0KEpTT04ucGFyc2UocHJlUHJvY2Vzc01lc3NhZ2UpIGFzIERpc2NvcmRHYXRld2F5UGF5bG9hZClcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBvcmRlciB0byBtYWtlIHRoZSBzaGFyZHMgcHJlc2VuY2UuXG4gICAqIGFzeW5jIGluIGNhc2UgZGV2cyBjcmVhdGUgdGhlIHByZXNlbmNlIGJhc2VkIG9uIGVnLiBkYXRhYmFzZSB2YWx1ZXMuXG4gICAqIFBhc3NpbmcgdGhlIHNoYXJkJ3MgaWQgdGhlcmUgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBkZXYgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXG4gICAqL1xuICBhc3luYyBtYWtlUHJlc2VuY2UoKTogUHJvbWlzZTxCb3RTdGF0dXNVcGRhdGUgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1yZXR1cm5cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qKiBUaGlzIGZ1bmN0aW9uIGNvbW11bmljYXRlcyB3aXRoIHRoZSBtYW5hZ2VtZW50IHByb2Nlc3MsIGluIG9yZGVyIHRvIGtub3cgd2hldGhlciBpdHMgZnJlZSB0byBpZGVudGlmeS4gV2hlbiB0aGlzIGZ1bmN0aW9uIHJlc29sdmVzLCB0aGlzIG1lYW5zIHRoYXQgdGhlIHNoYXJkIGlzIGFsbG93ZWQgdG8gc2VuZCBhbiBpZGVudGlmeSBwYXlsb2FkIHRvIGRpc2NvcmQuICovXG4gIGFzeW5jIHJlcXVlc3RJZGVudGlmeSgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gY29tbXVuaWNhdGVzIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2VzcywgaW4gb3JkZXIgdG8gdGVsbCBpdCBjYW4gaWRlbnRpZnkgdGhlIG5leHQgc2hhcmQuICovXG4gIGFzeW5jIHNoYXJkSXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIFN0YXJ0IHNlbmRpbmcgaGVhcnRiZWF0IHBheWxvYWRzIHRvIERpc2NvcmQgaW4gdGhlIHByb3ZpZGVkIGludGVydmFsLiAqL1xuICBzdGFydEhlYXJ0YmVhdGluZyhpbnRlcnZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH1gKVxuICAgIC8vIElmIG9sZCBoZWFydGJlYXN0IGV4aXN0IGxpa2UgYWZ0ZXIgcmVzdW1lLCBjbGVhciB0aGUgb2xkIG9uZXMuXG4gICAgaWYgKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZCkgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0LmludGVydmFsSWQpXG4gICAgaWYgKHRoaXMuaGVhcnQudGltZW91dElkKSBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG5cbiAgICB0aGlzLmhlYXJ0LmludGVydmFsID0gaW50ZXJ2YWxcblxuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCdzIHN0YXRlIHRvIGBVbmlkZW50aWZpZWRgXG4gICAgLy8gaWYgaGVhcnRiZWF0aW5nIGhhcyBub3QgYmVlbiBzdGFydGVkIGR1ZSB0byBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmIChbU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWQsIFNoYXJkU3RhdGUuT2ZmbGluZV0uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGFgKVxuICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkXG4gICAgfVxuXG4gICAgLy8gVGhlIGZpcnN0IGhlYXJ0YmVhdCBuZWVkcyB0byBiZSBzZW5kIHdpdGggYSByYW5kb20gZGVsYXkgYmV0d2VlbiBgMGAgYW5kIGBpbnRlcnZhbGBcbiAgICAvLyBVc2luZyBhIGBzZXRUaW1lb3V0KF8sIGppdHRlcilgIGhlcmUgdG8gYWNjb21wbGlzaCB0aGF0LlxuICAgIC8vIGBNYXRoLnJhbmRvbSgpYCBjYW4gYmUgYDBgIHNvIHdlIHVzZSBgMC41YCBpZiB0aGlzIGhhcHBlbnNcbiAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZ1xuICAgIGNvbnN0IGppdHRlciA9IE1hdGguY2VpbCh0aGlzLmhlYXJ0LmludGVydmFsICogKE1hdGgucmFuZG9tKCkgfHwgMC41KSlcbiAgICB0aGlzLmhlYXJ0LnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gYmApXG4gICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVyblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtHYXRld2F5XSBTdGFydCBIZWFydGJlYXRpbmcgU2hhcmQgIyR7dGhpcy5pZH0gYyAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciF9YClcblxuICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgIH0pLFxuICAgICAgKVxuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBkYClcbiAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG4gICAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IGZhbHNlXG5cbiAgICAgIC8vIEFmdGVyIHRoZSByYW5kb20gaGVhcnRiZWF0IGppdHRlciB3ZSBjYW4gc3RhcnQgYSBub3JtYWwgaW50ZXJ2YWwuXG4gICAgICB0aGlzLmhlYXJ0LmludGVydmFsSWQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gU3RhcnQgSGVhcnRiZWF0aW5nIFNoYXJkICMke3RoaXMuaWR9IGVgKVxuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHJldHVyblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBmYClcbiAgICAgICAgLy8gZ2F0ZXdheS5kZWJ1ZyhcIkdXIERFQlVHXCIsIGBSdW5uaW5nIHNldEludGVydmFsIGluIGhlYXJ0YmVhdCBmaWxlLiBTaGFyZDogJHtzaGFyZElkfWApO1xuXG4gICAgICAgIC8vIGdhdGV3YXkuZGVidWcoXCJHVyBIRUFSVEJFQVRJTkdcIiwgeyBzaGFyZElkLCBzaGFyZDogY3VycmVudFNoYXJkIH0pO1xuXG4gICAgICAgIC8vIFRoZSBTaGFyZCBkaWQgbm90IHJlY2VpdmUgYSBoZWFydGJlYXQgQUNLIGZyb20gRGlzY29yZCBpbiB0aW1lLFxuICAgICAgICAvLyB0aGVyZWZvcmUgd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgZmFpbGVkIG9yIGdvdCBcInpvbWJpZWRcIi5cbiAgICAgICAgLy8gVGhlIFNoYXJkIG5lZWRzIHRvIHN0YXJ0IGEgcmUtaWRlbnRpZnkgYWN0aW9uIGFjY29yZGluZ2x5LlxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZy1leGFtcGxlLWdhdGV3YXktaGVhcnRiZWF0LWFja1xuICAgICAgICBpZiAoIXRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0IG5vdCBhY2tub3dsZWRnZWQgZm9yIHNoYXJkICMke3RoaXMuaWR9LmApXG4gICAgICAgICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuWm9tYmllZENvbm5lY3Rpb24sICdab21iaWVkIGNvbm5lY3Rpb24sIGRpZCBub3QgcmVjZWl2ZSBhbiBoZWFydGJlYXQgQUNLIGluIHRpbWUuJylcblxuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmlkZW50aWZ5KClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2VcblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBnYClcbiAgICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFN0YXJ0IEhlYXJ0YmVhdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBoYClcblxuICAgICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpXG4gICAgICB9LCB0aGlzLmhlYXJ0LmludGVydmFsKVxuICAgIH0sIGppdHRlcilcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSBoZWFydGJlYXRpbmcgcHJvY2VzcyB3aXRoIGRpc2NvcmQuICovXG4gIHN0b3BIZWFydGJlYXRpbmcoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGhlIHJlZ3VsYXIgaGVhcnRiZWF0IGludGVydmFsLlxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydC5pbnRlcnZhbElkKVxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgU2hhcmQgZ290IGNsb3NlZCBiZWZvcmUgdGhlIGZpcnN0IGppdHRlcmVkIGhlYXJ0YmVhdC5cbiAgICAvLyBUbyBnbyBzYWZlIHdlIHNob3VsZCBjbGVhciB0aGUgcmVsYXRlZCB0aW1lb3V0IHRvby5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZENyZWF0ZU9wdGlvbnMge1xuICAvKiogVGhlIHNoYXJkIGlkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGRldGFpbHMgKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGUgZXZlbnQgaGFuZGxlcnMgZm9yIGV2ZW50cyBvbiB0aGUgc2hhcmQuICovXG4gIGV2ZW50czogU2hhcmRFdmVudHNcbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBzaGFyZCAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIHJlcXVlc3QgYSBzcGFjZSB0byBtYWtlIGFuIGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeT86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIGFsZXJ0IHRoZSBnYXRld2F5IG1hbmFnZXIgdGhhdCB0aGlzIHNoYXJkIGhhcyByZWNlaXZlZCBhIFJFQURZIGV2ZW50LiAqL1xuICBzaGFyZElzUmVhZHk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpc2NvcmRlbm9TaGFyZFxuIl0sIm5hbWVzIjpbIkRpc2NvcmRlbm9TaGFyZCIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayIsInByZXZpb3VzU2VxdWVuY2VOdW1iZXIiLCJyYXRlTGltaXRSZXNldEludGVydmFsIiwic3RhdGUiLCJTaGFyZFN0YXRlIiwiT2ZmbGluZSIsInJlc3VtZUdhdGV3YXlVcmwiLCJldmVudHMiLCJvZmZsaW5lU2VuZFF1ZXVlIiwicmVzb2x2ZXMiLCJNYXAiLCJpZCIsImNvbm5lY3Rpb24iLCJsb2dnZXIiLCJoZWFydCIsImFja25vd2xlZGdlZCIsImludGVydmFsIiwicmVxdWVzdElkZW50aWZ5Iiwic2hhcmRJc1JlYWR5IiwiYnVja2V0IiwiTGVha3lCdWNrZXQiLCJtYXgiLCJjYWxjdWxhdGVTYWZlUmVxdWVzdHMiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImdhdGV3YXlDb25maWciLCJjb25uZWN0aW9uVXJsIiwidXJsIiwic2FmZVJlcXVlc3RzIiwiTWF0aCIsImNlaWwiLCJjaGVja09mZmxpbmUiLCJoaWdoUHJpb3JpdHkiLCJpc09wZW4iLCJQcm9taXNlIiwicmVzb2x2ZSIsInVuc2hpZnQiLCJwdXNoIiwiY2xvc2UiLCJjb2RlIiwicmVhc29uIiwic29ja2V0IiwicmVhZHlTdGF0ZSIsIk5vZGVXZWJTb2NrZXQiLCJPUEVOIiwiY29ubmVjdCIsIklkZW50aWZ5aW5nIiwiUmVzdW1pbmciLCJpbmNsdWRlcyIsIkNvbm5lY3RpbmciLCJjb25uZWN0aW5nIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwidmVyc2lvbiIsInRvU3RyaW5nIiwiZ2xvYmFsVGhpcyIsIkRlbm8iLCJ1bmRlZmluZWQiLCJSZWZsZWN0IiwiaGFzIiwiV2ViU29ja2V0Iiwib25lcnJvciIsImV2ZW50IiwiY29uc29sZSIsImxvZyIsImVycm9yIiwic2hhcmRJZCIsIm9uY2xvc2UiLCJoYW5kbGVDbG9zZSIsIm9ubWVzc2FnZSIsIm1lc3NhZ2UiLCJoYW5kbGVNZXNzYWdlIiwib25vcGVuIiwiVW5pZGVudGlmaWVkIiwiY29ubmVjdGVkIiwiaWRlbnRpZnkiLCJkZWJ1ZyIsIlNoYXJkU29ja2V0Q2xvc2VDb2RlcyIsIlJlSWRlbnRpZnlpbmciLCJpZGVudGlmeWluZyIsInNlbmQiLCJvcCIsIkdhdGV3YXlPcGNvZGVzIiwiSWRlbnRpZnkiLCJkIiwidG9rZW4iLCJjb21wcmVzcyIsInByb3BlcnRpZXMiLCJpbnRlbnRzIiwic2hhcmQiLCJ0b3RhbFNoYXJkcyIsInByZXNlbmNlIiwibWFrZVByZXNlbmNlIiwiaWRlbnRpZmllZCIsImRlbGV0ZSIsInJlc3VtZSIsIlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uIiwic2Vzc2lvbklkIiwiUmVzdW1lIiwic2Vzc2lvbl9pZCIsInNlcSIsImFjcXVpcmUiLCJKU09OIiwic3RyaW5naWZ5Iiwic2h1dGRvd24iLCJTaHV0ZG93biIsInN0b3BIZWFydGJlYXRpbmciLCJUZXN0aW5nRmluaXNoZWQiLCJkaXNjb25uZWN0ZWQiLCJSZXNoYXJkZWQiLCJab21iaWVkQ29ubmVjdGlvbiIsIkRpc2Nvbm5lY3RlZCIsIkdhdGV3YXlDbG9zZUV2ZW50Q29kZXMiLCJVbmtub3duT3Bjb2RlIiwiTm90QXV0aGVudGljYXRlZCIsIkludmFsaWRTZXEiLCJSYXRlTGltaXRlZCIsIlNlc3Npb25UaW1lZE91dCIsIkF1dGhlbnRpY2F0aW9uRmFpbGVkIiwiSW52YWxpZFNoYXJkIiwiU2hhcmRpbmdSZXF1aXJlZCIsIkludmFsaWRBcGlWZXJzaW9uIiwiSW52YWxpZEludGVudHMiLCJEaXNhbGxvd2VkSW50ZW50cyIsIkVycm9yIiwiVW5rbm93bkVycm9yIiwiRGVjb2RlRXJyb3IiLCJBbHJlYWR5QXV0aGVudGljYXRlZCIsImluZm8iLCJoYW5kbGVEaXNjb3JkUGFja2V0IiwicGFja2V0IiwibGFzdEFjayIsIkRhdGUiLCJub3ciLCJIZWFydGJlYXQiLCJsYXN0QmVhdCIsImhlYXJ0YmVhdCIsIkhlbGxvIiwiaGVhcnRiZWF0X2ludGVydmFsIiwic3RhcnRIZWFydGJlYXRpbmciLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImhlbGxvIiwiSGVhcnRiZWF0QUNLIiwicnR0IiwiaGVhcnRiZWF0QWNrIiwiUmVjb25uZWN0IiwicmVxdWVzdGVkUmVjb25uZWN0IiwiSW52YWxpZFNlc3Npb24iLCJyZXN1bWFibGUiLCJpbnZhbGlkU2Vzc2lvbiIsImRlbGF5IiwiZmxvb3IiLCJyYW5kb20iLCJnZXQiLCJ0IiwiQ29ubmVjdGVkIiwicmVzdW1lZCIsIm1hcCIsInBheWxvYWQiLCJyZXN1bWVfZ2F0ZXdheV91cmwiLCJzIiwiZm9yd2FyZFRvQm90IiwiY2FtZWxpemUiLCJwcmVQcm9jZXNzTWVzc2FnZSIsImRhdGEiLCJCbG9iIiwiaW5mbGF0ZVN5bmMiLCJhcnJheUJ1ZmZlciIsInBhcnNlIiwiaW50ZXJ2YWxJZCIsImNsZWFySW50ZXJ2YWwiLCJ0aW1lb3V0SWQiLCJjbGVhclRpbWVvdXQiLCJqaXR0ZXIiLCJzZXRUaW1lb3V0Iiwic2V0SW50ZXJ2YWwiXSwibWFwcGluZ3Mi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
486
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmZsYXRlU3luYyB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlQYXlsb2FkLCBEaXNjb3JkSGVsbG8sIERpc2NvcmRSZWFkeSB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgR2F0ZXdheUNsb3NlRXZlbnRDb2RlcywgR2F0ZXdheU9wY29kZXMgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7IExlYWt5QnVja2V0LCBjYW1lbGl6ZSwgZGVsYXksIGxvZ2dlciB9IGZyb20gJ0BkaXNjb3JkZW5vL3V0aWxzJ1xuaW1wb3J0IE5vZGVXZWJTb2NrZXQgZnJvbSAnd3MnXG5pbXBvcnQge1xuICB0eXBlIEJvdFN0YXR1c1VwZGF0ZSxcbiAgdHlwZSBTaGFyZEV2ZW50cyxcbiAgdHlwZSBTaGFyZEdhdGV3YXlDb25maWcsXG4gIHR5cGUgU2hhcmRIZWFydCxcbiAgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLFxuICB0eXBlIFNoYXJkU29ja2V0UmVxdWVzdCxcbiAgU2hhcmRTdGF0ZSxcbn0gZnJvbSAnLi90eXBlcy5qcydcblxuZXhwb3J0IGNsYXNzIERpc2NvcmRlbm9TaGFyZCB7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIHNoYXJkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGNvbmZpZyBkZXRhaWxzIHRoYXQgdGhpcyBzaGFyZCB3aWxsIHVzZWQgdG8gY29ubmVjdCB0byBkaXNjb3JkLiAqL1xuICBjb25uZWN0aW9uOiBTaGFyZEdhdGV3YXlDb25maWdcbiAgLyoqIFRoaXMgY29udGFpbnMgYWxsIHRoZSBoZWFydGJlYXQgaW5mb3JtYXRpb24gKi9cbiAgaGVhcnQ6IFNoYXJkSGVhcnRcbiAgLyoqIFRoZSBtYXhpbXVtIG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBiZSBzZW5kIHRvIGRpc2NvcmQgcGVyIHJhdGUgbGltaXQgdGljay4gVHlwaWNhbGx5IHRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiAqL1xuICBtYXhSZXF1ZXN0c1BlclJhdGVMaW1pdFRpY2s6IG51bWJlciA9IDEyMFxuICAvKiogVGhlIHByZXZpb3VzIHBheWxvYWQgc2VxdWVuY2UgbnVtYmVyLiAqL1xuICBwcmV2aW91c1NlcXVlbmNlTnVtYmVyOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAvKiogSW4gd2hpY2ggaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykgdGhlIGdhdGV3YXkgcmVzZXRzIGl0J3MgcmF0ZSBsaW1pdC4gKi9cbiAgcmF0ZUxpbWl0UmVzZXRJbnRlcnZhbDogbnVtYmVyID0gNjAwMDBcbiAgLyoqIEN1cnJlbnQgc2Vzc2lvbiBpZCBvZiB0aGUgc2hhcmQgaWYgcHJlc2VudC4gKi9cbiAgc2Vzc2lvbklkPzogc3RyaW5nXG4gIC8qKiBUaGlzIGNvbnRhaW5zIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byBEaXNjb3JkLCBpZiBjdXJyZW50bHkgY29ubmVjdGVkLiAqL1xuICBzb2NrZXQ/OiBXZWJTb2NrZXRcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIC8qKiBUaGUgdXJsIHByb3ZpZGVkIGJ5IGRpc2NvcmQgdG8gdXNlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWN0aW9uIGZvciB0aGlzIHRoaXMuICovXG4gIHJlc3VtZUdhdGV3YXlVcmw6IHN0cmluZyA9ICcnXG4gIC8qKiBUaGUgc2hhcmQgcmVsYXRlZCBldmVudCBoYW5kbGVycy4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cyA9IHt9XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6ICgoKSA9PiB2b2lkKVtdID0gW11cbiAgLyoqIFJlc29sdmUgaW50ZXJuYWwgd2FpdGluZyBzdGF0ZXMuIE1hcHBlZCBieSBTZWxlY3RlZEV2ZW50cyA9PiBSZXNvbHZlRnVuY3Rpb24gKi9cbiAgcmVzb2x2ZXMgPSBuZXcgTWFwPCdSRUFEWScgfCAnUkVTVU1FRCcgfCAnSU5WQUxJRF9TRVNTSU9OJywgKHBheWxvYWQ6IERpc2NvcmRHYXRld2F5UGF5bG9hZCkgPT4gdm9pZD4oKVxuICAvKiogU2hhcmQgYnVja2V0LiBPbmx5IGFjY2VzcyB0aGlzIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gQnVja2V0IGZvciBoYW5kbGluZyBzaGFyZCByZXF1ZXN0IHJhdGUgbGltaXRzLiAqL1xuICBidWNrZXQ6IExlYWt5QnVja2V0XG4gIC8qKiBMb2dnZXIgZm9yIHRoZSBidWNrZXQgKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTaGFyZENyZWF0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZFxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvblxuICAgIHRoaXMuZXZlbnRzID0gb3B0aW9ucy5ldmVudHNcbiAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlclxuXG4gICAgdGhpcy5oZWFydCA9IHtcbiAgICAgIGFja25vd2xlZGdlZDogZmFsc2UsXG4gICAgICBpbnRlcnZhbDogNDUwMDAsXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdElkZW50aWZ5KSB0aGlzLnJlcXVlc3RJZGVudGlmeSA9IG9wdGlvbnMucmVxdWVzdElkZW50aWZ5XG4gICAgaWYgKG9wdGlvbnMuc2hhcmRJc1JlYWR5KSB0aGlzLnNoYXJkSXNSZWFkeSA9IG9wdGlvbnMuc2hhcmRJc1JlYWR5XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgIH0pXG4gIH1cblxuICAvKiogVGhlIGdhdGV3YXkgY29uZmlndXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZC4gKi9cbiAgZ2V0IGdhdGV3YXlDb25maWcoKTogU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gIH1cblxuICAvKiogVGhlIHVybCB0byBjb25uZWN0IHRvLiBJbml0aWFsbHkgdGhpcyBpcyB0aGUgZGlzY29yZCBnYXRld2F5IHVybCwgYW5kIHRoZW4gaXMgc3dpdGNoZWQgdG8gcmVzdW1lIGdhdGV3YXkgdXJsIG9uY2UgYSBSRUFEWSBpcyByZWNlaXZlZC4gKi9cbiAgZ2V0IGNvbm5lY3Rpb25VcmwoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgfHwgYW5kIG5vdCA/PyBoZXJlLiA/PyB3aWxsIGNhdXNlIGEgYnVnLlxuICAgIHJldHVybiB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgfHwgdGhpcy5nYXRld2F5Q29uZmlnLnVybFxuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDJcblxuICAgIHJldHVybiBzYWZlUmVxdWVzdHMgPCAwID8gMCA6IHNhZmVSZXF1ZXN0c1xuICB9XG5cbiAgYXN5bmMgY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgIGlmIChoaWdoUHJpb3JpdHkpIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS51bnNoaWZ0KHJlc29sdmUpXG4gICAgICBlbHNlIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5wdXNoKHJlc29sdmUpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlICE9PSBOb2RlV2ViU29ja2V0Lk9QRU4pIHJldHVyblxuXG4gICAgdGhpcy5zb2NrZXQ/LmNsb3NlKGNvZGUsIHJlYXNvbilcbiAgfVxuXG4gIC8qKiBDb25uZWN0IHRoZSBzaGFyZCB3aXRoIHRoZSBnYXRld2F5IGFuZCBzdGFydCBoZWFydGJlYXRpbmcuIFRoaXMgd2lsbCBub3QgaWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8RGlzY29yZGVub1NoYXJkPiB7XG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBDb25uZWN0aW5nYCBzdGF0ZSxcbiAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0aW5nXG4gICAgfVxuXG4gICAgdGhpcy5ldmVudHMuY29ubmVjdGluZz8uKHRoaXMpXG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHRoaXMuY29ubmVjdGlvblVybClcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndicsIHRoaXMuZ2F0ZXdheUNvbmZpZy52ZXJzaW9uLnRvU3RyaW5nKCkpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2VuY29kaW5nJywgJ2pzb24nKVxuXG4gICAgLy8gV2UgY2hlY2sgZm9yIGJ1aWx0LWluIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbnMgaW4gQnVuIG9yIERlbm8sIE5vZGVKUyB2MjIgaGFzIGFuIGltcGxlbWVudGF0aW9uIHRvbyBidXQgaXQgc2VlbXMgdG8gYmUgbGVzcyBvcHRpbWl6ZWQgc28gZm9yIG5vdyBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZSB3cyBucG0gcGFja2FnZVxuICAgIGNvbnN0IHNob3VsZFVzZUJ1aWx0aW4gPSBSZWZsZWN0LmhhcyhnbG9iYWxUaGlzLCAnV2ViU29ja2V0JykgJiYgKFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdCdW4nKSB8fCBSZWZsZWN0LmhhcyhnbG9iYWxUaGlzLCAnRGVubycpKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb2RlV2ViU29ja2V0IGRvZXNuJ3Qgc3VwcG9ydCBcImRpc3BhdGNoRXZlbnRcIiwgYW5kIHdoaWxlIHdlIGRvbid0IHVzZSBpdCwgaXQgaXMgcmVxdWlyZWQgb24gdGhlIFwiV2ViU29ja2V0XCIgdHlwZVxuICAgIGNvbnN0IHNvY2tldDogV2ViU29ja2V0ID0gc2hvdWxkVXNlQnVpbHRpbiA/IG5ldyBXZWJTb2NrZXQodXJsKSA6IG5ldyBOb2RlV2ViU29ja2V0KHVybClcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuXG4gICAgc29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXZlbnQpXG4gICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyAoY2xvc2VFdmVudCkgPT4gYXdhaXQgdGhpcy5oYW5kbGVDbG9zZShjbG9zZUV2ZW50KVxuICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBhc3luYyAobWVzc2FnZUV2ZW50KSA9PiBhd2FpdCB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQgdG8gYFVuaWRlbnRpZmllZGAgc3RhdGUgaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgaWYgKCFbU2hhcmRTdGF0ZS5JZGVudGlmeWluZywgU2hhcmRTdGF0ZS5SZXN1bWluZ10uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmNvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmVzb2x2ZSh0aGlzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKiogSWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiBJZiBub3QgY29ubmVjdGVkLCB0aGlzIHdpbGwgYWxzbyBjb25uZWN0IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgaWRlbnRpZnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQSBuZXcgaWRlbnRpZnkgaGFzIGJlZW4gcmVxdWVzdGVkIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIGFscmVhZHkgYSBjb25uZWN0aW9uIG9wZW4uXG4gICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY2xvc2UgdGhlIG9sZCBjb25uZWN0aW9uIGFuZCBoZWFydGJlYXRpbmcgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYENMT1NJTkcgRVhJU1RJTkcgU0hBUkQ6ICMke3RoaXMuaWR9YClcbiAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmcsICdSZS1pZGVudGlmeWluZyBjbG9zdXJlIG9mIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICB0aGlzLmV2ZW50cy5pZGVudGlmeWluZz8uKHRoaXMpXG5cbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBpbiBIZWFydGJlYXRpbmcgc3RhdGUgYnV0IG5vdCBpZGVudGlmaWVkLFxuICAgIC8vIHNvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIGdhdGV3YXkgY29ubmVjdGlvbiBleGlzdGluZy5cbiAgICAvLyBJZiBub3Qgd2UgbmVlZCB0byBjcmVhdGUgb25lIGJlZm9yZSB3ZSBpZGVudGlmeS5cbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgfVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSWRlbnRpZnksXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIGNvbXByZXNzOiB0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MsXG4gICAgICAgICAgcHJvcGVydGllczogdGhpcy5nYXRld2F5Q29uZmlnLnByb3BlcnRpZXMsXG4gICAgICAgICAgaW50ZW50czogdGhpcy5nYXRld2F5Q29uZmlnLmludGVudHMsXG4gICAgICAgICAgc2hhcmQ6IFt0aGlzLmlkLCB0aGlzLmdhdGV3YXlDb25maWcudG90YWxTaGFyZHNdLFxuICAgICAgICAgIHByZXNlbmNlOiBhd2FpdCB0aGlzLm1ha2VQcmVzZW5jZT8uKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRUFEWScsICgpID0+IHtcbiAgICAgICAgdGhpcy5ldmVudHMuaWRlbnRpZmllZD8uKHRoaXMpXG4gICAgICAgIC8vIFRlbGxzIHRoZSBtYW5hZ2VyIHRoYXQgdGhpcyBzaGFyZCBpcyByZWFkeVxuICAgICAgICB0aGlzLnNoYXJkSXNSZWFkeSgpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICAgIC8vIFdoZW4gaWRlbnRpZnlpbmcgdG9vIGZhc3QsXG4gICAgICAvLyBEaXNjb3JkIHNlbmRzIGFuIGludmFsaWQgc2Vzc2lvbiBwYXlsb2FkLlxuICAgICAgLy8gVGhpcyBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgdGhvdWdoIGFuZCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IGlkZW50aWZ5IGFjdGlvbi5cbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdJTlZBTElEX1NFU1NJT04nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gdG8gRGlzY29yZCBpcyBjdXJyZW50bHkgb3Blbi4gKi9cbiAgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSA9PT0gTm9kZVdlYlNvY2tldC5PUEVOXG4gIH1cblxuICAvKiogQXR0ZW1wdCB0byByZXN1bWUgdGhlIHByZXZpb3VzIHNoYXJkcyBzZXNzaW9uIHdpdGggdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIHJlc3VtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9YClcbiAgICAvLyBJdCBoYXMgYmVlbiByZXF1ZXN0ZWQgdG8gcmVzdW1lIHRoZSBTaGFyZHMgc2Vzc2lvbi5cbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNoYXJkIGlzIHN0aWxsIGNvbm5lY3RlZCB3aXRoIERpc2NvcmQncyBnYXRld2F5IHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGZvcmNlZnVsbHkgY2xvc2UgaXQuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0gaW4gaXNPcGVuYClcbiAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlc3VtZUNsb3NpbmdPbGRDb25uZWN0aW9uLCAnUmVjb25uZWN0aW5nIHRoZSBzaGFyZCwgY2xvc2luZyBvbGQgY29ubmVjdGlvbi4nKVxuICAgIH1cblxuICAgIC8vIFNoYXJkIGhhcyBuZXZlciBpZGVudGlmaWVkLCBzbyB3ZSBjYW5ub3QgcmVzdW1lLlxuICAgIGlmICghdGhpcy5zZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFRyeWluZyB0byByZXN1bWUgYSBzaGFyZCAjJHt0aGlzLmlkfSB0aGF0IHdhcyBOT1QgZmlyc3QgaWRlbnRpZmllZC4gKE5vIHNlc3Npb24gaWQgZm91bmQpYClcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlJlc3VtaW5nXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9LCBiZWZvcmUgY29ubmVjdGluZ2ApXG4gICAgLy8gQmVmb3JlIHdlIGNhbiByZXN1bWUsIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gd2l0aCBEaXNjb3JkJ3MgZ2F0ZXdheS5cbiAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbR2F0ZXdheV0gUmVzdW1pbmcgU2hhcmQgIyR7dGhpcy5pZH0sIGFmdGVyIGNvbm5lY3RpbmcuICR7dGhpcy5zZXNzaW9uSWR9IHwgJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YClcblxuICAgIHRoaXMuc2VuZChcbiAgICAgIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlc3VtZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgc2Vzc2lvbl9pZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgc2VxOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIgPz8gMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgIClcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSBhZnRlciBzZW5kIHJlc3VtZWApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRVNVTUVEJywgKCkgPT4gcmVzb2x2ZSgpKVxuICAgICAgLy8gSWYgaXQgaXMgYXR0ZW1wdGVkIHRvIHJlc3VtZSB3aXRoIGFuIGludmFsaWQgc2Vzc2lvbiBpZCxcbiAgICAgIC8vIERpc2NvcmQgc2VuZHMgYW4gaW52YWxpZCBzZXNzaW9uIHBheWxvYWRcbiAgICAgIC8vIE5vdCBlcnJvcmluZyBoZXJlIHNpbmNlIGl0IGlzIGVhc3kgdGhhdCB0aGlzIGhhcHBlbnMsIGFsc28gaXQgd291bGQgYmUgbm90IGNhdGNoYWJsZVxuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ0lOVkFMSURfU0VTU0lPTicsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBTZW5kIGEgbWVzc2FnZSB0byBEaXNjb3JkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtoaWdoUHJpb3JpdHk9ZmFsc2VdIC0gV2hldGhlciB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbmQgYXNhcC5cbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogU2hhcmRTb2NrZXRSZXF1ZXN0LCBoaWdoUHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSBhY3F1aXJpbmcgYSB0b2tlbiBmcm9tIHRoZSBidWNrZXQsIGNoZWNrIHdoZXRoZXIgdGhlIHNoYXJkIGlzIGN1cnJlbnRseSBvZmZsaW5lIG9yIG5vdC5cbiAgICAvLyBFbHNlIGJ1Y2tldCBhbmQgdG9rZW4gd2FpdCB0aW1lIGp1c3QgZ2V0IHdhc3RlZC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICBhd2FpdCB0aGlzLmJ1Y2tldC5hY3F1aXJlKGhpZ2hQcmlvcml0eSlcblxuICAgIC8vIEl0J3MgcG9zc2libGUsIHRoYXQgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZSBhZnRlciBhIHRva2VuIGhhcyBiZWVuIGFjcXVpcmVkIGZyb20gdGhlIGJ1Y2tldC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICB0aGlzLnNvY2tldD8uc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSlcbiAgfVxuXG4gIC8qKiBTaHV0ZG93biB0aGUgdGhpcy4gRm9yY2VmdWxseSBkaXNjb25uZWN0IHRoZSBzaGFyZCBmcm9tIERpc2NvcmQuIFRoZSBzaGFyZCBtYXkgbm90IGF0dGVtcHQgdG8gcmVjb25uZWN0IHdpdGggRGlzY29yZC4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd24sICdTaGFyZCBzaHV0dGluZyBkb3duLicpXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBlcnJvciAqL1xuICBoYW5kbGVFcnJvcihlcnJvcjogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5lcnJvcihgW1NoYXJkXSBUaGVyZSB3YXMgYW4gZXJyb3IgY29ubmVjdGluZyBzaGFyZCAke3RoaXMuaWR9LmAsIGVycm9yKVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZS4gKi9cbiAgYXN5bmMgaGFuZGxlQ2xvc2UoY2xvc2U6IENsb3NlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3BIZWFydGJlYXRpbmcoKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZWQgd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0gKCR7Y2xvc2UucmVhc29uIHx8ICc8Tm8gcmVhc29uIHByb3ZpZGVkPid9KS5gKVxuXG4gICAgc3dpdGNoIChjbG9zZS5jb2RlKSB7XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5UZXN0aW5nRmluaXNoZWQ6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gT24gdGhlc2UgY29kZXMgYSBtYW51YWwgc3RhcnQgd2lsbCBiZSBkb25lLlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZUlkZW50aWZ5aW5nOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzaGFyZGVkOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5ab21iaWVkQ29ubmVjdGlvbjoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWRcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICAvLyBnYXRld2F5LmRlYnVnKFwiR1cgQ0xPU0VEX1JFQ09OTkVDVFwiLCB7IHNoYXJkSWQsIHBheWxvYWQ6IGV2ZW50IH0pO1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8vIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZXMgd2hpY2ggcmVxdWlyZSBhIG5ldyBpZGVudGlmeS5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Vbmtub3duT3Bjb2RlOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLk5vdEF1dGhlbnRpY2F0ZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNlcTpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5SYXRlTGltaXRlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5TZXNzaW9uVGltZWRPdXQ6IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1tTaGFyZF0gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NpbmcgcmVxdWlyaW5nIHJlLWlkZW50aWZ5LicpXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgfVxuICAgICAgLy8gV2hlbiB0aGVzZSBjb2RlcyBhcmUgcmVjZWl2ZWQgc29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nLlxuICAgICAgLy8gT24gdGhvc2Ugd2UgY2Fubm90IHN0YXJ0IGEgcmVjb25uZWN0IGF0dGVtcHQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuQXV0aGVudGljYXRpb25GYWlsZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNoYXJkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNoYXJkaW5nUmVxdWlyZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEFwaVZlcnNpb246XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEludGVudHM6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuRGlzYWxsb3dlZEludGVudHM6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjbG9zZS5yZWFzb24gfHwgJ0Rpc2NvcmQgZ2F2ZSBubyByZWFzb24hIEdHISBZb3UgYnJva2UgRGlzY29yZCEnKVxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyBvbiB3aGljaCBhIHJlc3VtZSBpcyBhbGxvd2VkLlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25FcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EZWNvZGVFcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BbHJlYWR5QXV0aGVudGljYXRlZDpcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgW1NoYXJkXSBDbG9zZWQgc2hhcmQgIyR7dGhpcy5pZH0gd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0uIEF0dGVtcHRpbmcgdG8gcmVzdW1lLi4uYClcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuUmVzdW1pbmdcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXN1bWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBIYW5kbGUgYW4gaW5jb21pbmcgZ2F0ZXdheSBtZXNzYWdlLiAqL1xuICBhc3luYyBoYW5kbGVNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBwcmVQcm9jZXNzTWVzc2FnZSA9IG1lc3NhZ2UuZGF0YVxuXG4gICAgLy8gSWYgbWVzc2FnZSBjb21wcmVzc2lvbiBpcyBlbmFibGVkLCBEaXNjb3JkIG1pZ2h0IHNlbmQgemxpYiBjb21wcmVzc2VkIHBheWxvYWRzLlxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MgJiYgcHJlUHJvY2Vzc01lc3NhZ2UgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICBwcmVQcm9jZXNzTWVzc2FnZSA9IGluZmxhdGVTeW5jKGF3YWl0IHByZVByb2Nlc3NNZXNzYWdlLmFycmF5QnVmZmVyKCkpLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICAvLyBTYWZlZ3VhcmQgaW5jYXNlIGRlY29tcHJlc3Npb24gZmFpbGVkIHRvIG1ha2UgYSBzdHJpbmcuXG4gICAgaWYgKHR5cGVvZiBwcmVQcm9jZXNzTWVzc2FnZSAhPT0gJ3N0cmluZycpIHJldHVyblxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlRGlzY29yZFBhY2tldChKU09OLnBhcnNlKHByZVByb2Nlc3NNZXNzYWdlKSBhcyBEaXNjb3JkR2F0ZXdheVBheWxvYWQpXG4gIH1cblxuICAvKiogSGFuZGxlcyBhIGluY29taW5nIGdhdGV3YXkgcGFja2V0LiAqL1xuICBhc3luYyBoYW5kbGVEaXNjb3JkUGFja2V0KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRWRnZSBjYXNlIHN0YXJ0OiBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vL2lzc3Vlcy8yMzExXG4gICAgdGhpcy5oZWFydC5sYXN0QWNrID0gRGF0ZS5ub3coKVxuICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gdHJ1ZVxuICAgIC8vIEVkZ2UgY2FzZSBlbmQhXG5cbiAgICBzd2l0Y2ggKHBhY2tldC5vcCkge1xuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQ6IHtcbiAgICAgICAgLy8gVE9ETzogY2FuIHRoaXMgYWN0dWFsbHkgaGFwcGVuXG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgICAgLy8gRGlzY29yZCByYW5kb21seSBzZW5kcyB0aGlzIHJlcXVpcmluZyBhbiBpbW1lZGlhdGUgaGVhcnRiZWF0IGJhY2suXG4gICAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0Py4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWxsbzoge1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IChwYWNrZXQuZCBhcyBEaXNjb3JkSGVsbG8pLmhlYXJ0YmVhdF9pbnRlcnZhbFxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW0dhdGV3YXldIEhlbGxvIG9uIFNoYXJkICMke3RoaXMuaWR9YClcbiAgICAgICAgdGhpcy5zdGFydEhlYXJ0YmVhdGluZyhpbnRlcnZhbClcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU2hhcmRTdGF0ZS5SZXN1bWluZykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRRdWV1ZSA9IFsuLi50aGlzLmJ1Y2tldC5xdWV1ZV1cbiAgICAgICAgICAvLyBIRUxMTyBoYXMgYmVlbiBzZW5kIG9uIGEgbm9uIHJlc3VtZSBhY3Rpb24uXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBzaGFyZCBzdGFydHMgYSBuZXcgc2Vzc2lvbixcbiAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIHJhdGUgbGltaXQgaW50ZXJ2YWwgaGFzIGJlZW4gcmVzZXQgdG9vLlxuICAgICAgICAgIHRoaXMuYnVja2V0ID0gbmV3IExlYWt5QnVja2V0KHtcbiAgICAgICAgICAgIG1heDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICAgIHJlZmlsbEludGVydmFsOiA2MDAwMCxcbiAgICAgICAgICAgIHJlZmlsbEFtb3VudDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gUXVldWUgc2hvdWxkIG5vdCBiZSBsb3N0IG9uIGEgcmUtaWRlbnRpZnkuXG4gICAgICAgICAgdGhpcy5idWNrZXQucXVldWUudW5zaGlmdCguLi5jdXJyZW50UXVldWUpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWxsbz8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0QUNLOiB7XG4gICAgICAgIC8vIE1hbnVhbGx5IGNhbGN1bGF0aW5nIHRoZSByb3VuZCB0cmlwIHRpbWUgZm9yIHVzZXJzIHdobyBuZWVkIGl0LlxuICAgICAgICBpZiAodGhpcy5oZWFydC5sYXN0QmVhdCkge1xuICAgICAgICAgIHRoaXMuaGVhcnQucnR0ID0gdGhpcy5oZWFydC5sYXN0QWNrIC0gdGhpcy5oZWFydC5sYXN0QmVhdFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0QWNrPy4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5SZWNvbm5lY3Q6IHtcbiAgICAgICAgLy8gICBnYXRld2F5LmRlYnVnKFwiR1cgUkVDT05ORUNUXCIsIHsgc2hhcmRJZCB9KTtcblxuICAgICAgICB0aGlzLmV2ZW50cy5yZXF1ZXN0ZWRSZWNvbm5lY3Q/Lih0aGlzKVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKClcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5JbnZhbGlkU2Vzc2lvbjoge1xuICAgICAgICBjb25zdCByZXN1bWFibGUgPSBwYWNrZXQuZCBhcyBib29sZWFuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlY2VpdmVkIEludmFsaWQgU2Vzc2lvbiBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gd2l0aCByZXN1bWVhYmxlIGFzICR7cmVzdW1hYmxlLnRvU3RyaW5nKCl9YClcblxuICAgICAgICB0aGlzLmV2ZW50cy5pbnZhbGlkU2Vzc2lvbj8uKHRoaXMsIHJlc3VtYWJsZSlcblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gMSBhbmQgNVxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3Jlc3VtaW5nXG4gICAgICAgIGF3YWl0IGRlbGF5KE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiA0ICsgMSkgKiAxMDAwKSlcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnSU5WQUxJRF9TRVNTSU9OJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdJTlZBTElEX1NFU1NJT04nKVxuXG4gICAgICAgIC8vIFdoZW4gcmVzdW1hYmxlIGlzIGZhbHNlIHdlIG5lZWQgdG8gcmUtaWRlbnRpZnlcbiAgICAgICAgaWYgKCFyZXN1bWFibGUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpXG5cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlc3Npb24gaXMgaW52YWxpZCBidXQgYXBwYXJlbnRseSBpdCBpcyByZXN1bWFibGVcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSAnUkVTVU1FRCc6XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5yZXN1bWVkPy4odGhpcylcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUuZm9yRWFjaCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKVxuICAgICAgICAvLyBTZXR0aW5nIHRoZSBsZW5ndGggdG8gMCB3aWxsIGRlbGV0ZSB0aGUgZWxlbWVudHMgaW4gaXRcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmxlbmd0aCA9IDBcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnUkVTVU1FRCcpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdSRUFEWSc6IHtcbiAgICAgICAgLy8gSW1wb3J0YW50IGZvciBmdXR1cmUgcmVzdW1lcy5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIERpc2NvcmRSZWFkeVxuXG4gICAgICAgIHRoaXMucmVzdW1lR2F0ZXdheVVybCA9IHBheWxvYWQucmVzdW1lX2dhdGV3YXlfdXJsXG5cbiAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBwYXlsb2FkLnNlc3Npb25faWRcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGVkXG5cbiAgICAgICAgLy8gQ29udGludWUgdGhlIHJlcXVlc3RzIHdoaWNoIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZS5cbiAgICAgICAgLy8gSW1wb3J0YW50IHdoZW4gdGhpcyBpcyBhIHJlLWlkZW50aWZ5XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5mb3JFYWNoKChyZXNvbHZlKSA9PiByZXNvbHZlKCkpXG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGxlbmd0aCB0byAwIHdpbGwgZGVsZXRlIHRoZSBlbGVtZW50cyBpbiBpdFxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUubGVuZ3RoID0gMFxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdSRUFEWScpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVBRFknKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgc2VxdWVuY2UgbnVtYmVyIGlmIGl0IGlzIHByZXNlbnRcbiAgICAvLyBgc2AgY2FuIGJlIGVpdGhlciBgbnVsbGAgb3IgYSBgbnVtYmVyYC5cbiAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IHVwZGF0ZSBtaXNzZXMgd2hlbiBgc2AgaXMgYDBgIHdlIGNoZWNrIGFnYWluc3QgbnVsbC5cbiAgICBpZiAocGFja2V0LnMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlciA9IHBhY2tldC5zXG4gICAgfVxuXG4gICAgdGhpcy5mb3J3YXJkVG9Cb3QocGFja2V0KVxuICB9XG5cbiAgZm9yd2FyZFRvQm90KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogdm9pZCB7XG4gICAgLy8gVGhlIG5lY2Vzc2FyeSBoYW5kbGluZyByZXF1aXJlZCBmb3IgdGhlIFNoYXJkcyBjb25uZWN0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLlxuICAgIC8vIE5vdyB0aGUgZXZlbnQgY2FuIGJlIHNhZmVseSBmb3J3YXJkZWQuXG4gICAgdGhpcy5ldmVudHMubWVzc2FnZT8uKHRoaXMsIGNhbWVsaXplKHBhY2tldCkpXG4gIH1cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNoYXJkcyBwcmVzZW5jZS5cbiAgICogYXN5bmMgaW4gY2FzZSBkZXZzIGNyZWF0ZSB0aGUgcHJlc2VuY2UgYmFzZWQgb24gZWcuIGRhdGFiYXNlIHZhbHVlcy5cbiAgICogUGFzc2luZyB0aGUgc2hhcmQncyBpZCB0aGVyZSB0byBtYWtlIGl0IGVhc2llciBmb3IgdGhlIGRldiB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICovXG4gIGFzeW5jIG1ha2VQcmVzZW5jZSgpOiBQcm9taXNlPEJvdFN0YXR1c1VwZGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVyblxuICB9XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gY29tbXVuaWNhdGVzIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2VzcywgaW4gb3JkZXIgdG8ga25vdyB3aGV0aGVyIGl0cyBmcmVlIHRvIGlkZW50aWZ5LiBXaGVuIHRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgaXMgYWxsb3dlZCB0byBzZW5kIGFuIGlkZW50aWZ5IHBheWxvYWQgdG8gZGlzY29yZC4gKi9cbiAgYXN5bmMgcmVxdWVzdElkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogVGhpcyBmdW5jdGlvbiBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgbWFuYWdlbWVudCBwcm9jZXNzLCBpbiBvcmRlciB0byB0ZWxsIGl0IGNhbiBpZGVudGlmeSB0aGUgbmV4dCBzaGFyZC4gKi9cbiAgYXN5bmMgc2hhcmRJc1JlYWR5KCk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKiogU3RhcnQgc2VuZGluZyBoZWFydGJlYXQgcGF5bG9hZHMgdG8gRGlzY29yZCBpbiB0aGUgcHJvdmlkZWQgaW50ZXJ2YWwuICovXG4gIHN0YXJ0SGVhcnRiZWF0aW5nKGludGVydmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTdGFydCBoZWFydGJlYXRpbmcgb24gc2hhcmQgIyR7dGhpcy5pZH1gKVxuXG4gICAgLy8gSWYgb2xkIGhlYXJ0YmVhc3QgZXhpc3QgbGlrZSBhZnRlciByZXN1bWUsIGNsZWFyIHRoZSBvbGQgb25lcy5cbiAgICBpZiAodGhpcy5oZWFydC5pbnRlcnZhbElkKSBjbGVhckludGVydmFsKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZClcbiAgICBpZiAodGhpcy5oZWFydC50aW1lb3V0SWQpIGNsZWFyVGltZW91dCh0aGlzLmhlYXJ0LnRpbWVvdXRJZClcblxuICAgIHRoaXMuaGVhcnQuaW50ZXJ2YWwgPSBpbnRlcnZhbFxuXG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkJ3Mgc3RhdGUgdG8gYFVuaWRlbnRpZmllZGBcbiAgICAvLyBpZiBoZWFydGJlYXRpbmcgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZHVlIHRvIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgaWYgKFtTaGFyZFN0YXRlLkRpc2Nvbm5lY3RlZCwgU2hhcmRTdGF0ZS5PZmZsaW5lXS5pbmNsdWRlcyh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgaXMgZGlzY29ubmVjdGVkIG9yIG9mZmxpbmUgYnV0IHRoZSBoZWFydGJlYXQgd2FzIHN0YXJ0ZWQgIyR7dGhpcy5pZH1gKVxuICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkXG4gICAgfVxuXG4gICAgLy8gVGhlIGZpcnN0IGhlYXJ0YmVhdCBuZWVkcyB0byBiZSBzZW5kIHdpdGggYSByYW5kb20gZGVsYXkgYmV0d2VlbiBgMGAgYW5kIGBpbnRlcnZhbGBcbiAgICAvLyBVc2luZyBhIGBzZXRUaW1lb3V0KF8sIGppdHRlcilgIGhlcmUgdG8gYWNjb21wbGlzaCB0aGF0LlxuICAgIC8vIGBNYXRoLnJhbmRvbSgpYCBjYW4gYmUgYDBgIHNvIHdlIHVzZSBgMC41YCBpZiB0aGlzIGhhcHBlbnNcbiAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZ1xuICAgIGNvbnN0IGppdHRlciA9IE1hdGguY2VpbCh0aGlzLmhlYXJ0LmludGVydmFsICogKE1hdGgucmFuZG9tKCkgfHwgMC41KSlcblxuICAgIHRoaXMuaGVhcnQudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBCZWdpbm5pbmcgaGVhcnRiZWF0aW5nIHByb2Nlc3MgZm9yIHNoYXJkICMke3RoaXMuaWR9YClcblxuICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0aW5nIG9uICMke3RoaXMuaWR9LiBQcmV2aW91cyBzZXF1ZW5jZSBudW1iZXI6ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWApXG5cbiAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICB9KSxcbiAgICAgIClcblxuICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2VcblxuICAgICAgLy8gQWZ0ZXIgdGhlIHJhbmRvbSBoZWFydGJlYXQgaml0dGVyIHdlIGNhbiBzdGFydCBhIG5vcm1hbCBpbnRlcnZhbC5cbiAgICAgIHRoaXMuaGVhcnQuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gaXMgbm90IG9wZW4sIGJ1dCBhdHRlbXB0ZWQgaGVhcnRiZWF0LCBpZ25vcmluZy5gKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIFNoYXJkIGRpZCBub3QgcmVjZWl2ZSBhIGhlYXJ0YmVhdCBBQ0sgZnJvbSBEaXNjb3JkIGluIHRpbWUsXG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZSBjb25uZWN0aW9uIGhhcyBmYWlsZWQgb3IgZ290IFwiem9tYmllZFwiLlxuICAgICAgICAvLyBUaGUgU2hhcmQgbmVlZHMgdG8gc3RhcnQgYSByZS1pZGVudGlmeSBhY3Rpb24gYWNjb3JkaW5nbHkuXG4gICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjaGVhcnRiZWF0aW5nLWV4YW1wbGUtZ2F0ZXdheS1oZWFydGJlYXQtYWNrXG4gICAgICAgIGlmICghdGhpcy5oZWFydC5hY2tub3dsZWRnZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXQgbm90IGFja25vd2xlZGdlZCBmb3Igc2hhcmQgIyR7dGhpcy5pZH0uIEFzc3VtaW5nIHpvbWJpZWQgY29ubmVjdGlvbi5gKVxuICAgICAgICAgIHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlpvbWJpZWRDb25uZWN0aW9uLCAnWm9tYmllZCBjb25uZWN0aW9uLCBkaWQgbm90IHJlY2VpdmUgYW4gaGVhcnRiZWF0IEFDSyBpbiB0aW1lLicpXG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXRpbmcgb24gIyR7dGhpcy5pZH0uIFByZXZpb3VzIHNlcXVlbmNlIG51bWJlcjogJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YClcblxuICAgICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSBmYWxzZVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpXG4gICAgICB9LCB0aGlzLmhlYXJ0LmludGVydmFsKVxuICAgIH0sIGppdHRlcilcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSBoZWFydGJlYXRpbmcgcHJvY2VzcyB3aXRoIGRpc2NvcmQuICovXG4gIHN0b3BIZWFydGJlYXRpbmcoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGhlIHJlZ3VsYXIgaGVhcnRiZWF0IGludGVydmFsLlxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydC5pbnRlcnZhbElkKVxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgU2hhcmQgZ290IGNsb3NlZCBiZWZvcmUgdGhlIGZpcnN0IGppdHRlcmVkIGhlYXJ0YmVhdC5cbiAgICAvLyBUbyBnbyBzYWZlIHdlIHNob3VsZCBjbGVhciB0aGUgcmVsYXRlZCB0aW1lb3V0IHRvby5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZENyZWF0ZU9wdGlvbnMge1xuICAvKiogVGhlIHNoYXJkIGlkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGRldGFpbHMgKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGUgZXZlbnQgaGFuZGxlcnMgZm9yIGV2ZW50cyBvbiB0aGUgc2hhcmQuICovXG4gIGV2ZW50czogU2hhcmRFdmVudHNcbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBzaGFyZCAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIHJlcXVlc3QgYSBzcGFjZSB0byBtYWtlIGFuIGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeT86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIGFsZXJ0IHRoZSBnYXRld2F5IG1hbmFnZXIgdGhhdCB0aGlzIHNoYXJkIGhhcyByZWNlaXZlZCBhIFJFQURZIGV2ZW50LiAqL1xuICBzaGFyZElzUmVhZHk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpc2NvcmRlbm9TaGFyZFxuIl0sIm5hbWVzIjpbIkRpc2NvcmRlbm9TaGFyZCIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayIsInByZXZpb3VzU2VxdWVuY2VOdW1iZXIiLCJyYXRlTGltaXRSZXNldEludGVydmFsIiwic3RhdGUiLCJTaGFyZFN0YXRlIiwiT2ZmbGluZSIsInJlc3VtZUdhdGV3YXlVcmwiLCJldmVudHMiLCJvZmZsaW5lU2VuZFF1ZXVlIiwicmVzb2x2ZXMiLCJNYXAiLCJpZCIsImNvbm5lY3Rpb24iLCJsb2dnZXIiLCJoZWFydCIsImFja25vd2xlZGdlZCIsImludGVydmFsIiwicmVxdWVzdElkZW50aWZ5Iiwic2hhcmRJc1JlYWR5IiwiYnVja2V0IiwiTGVha3lCdWNrZXQiLCJtYXgiLCJjYWxjdWxhdGVTYWZlUmVxdWVzdHMiLCJyZWZpbGxBbW91bnQiLCJyZWZpbGxJbnRlcnZhbCIsImdhdGV3YXlDb25maWciLCJjb25uZWN0aW9uVXJsIiwidXJsIiwic2FmZVJlcXVlc3RzIiwiTWF0aCIsImNlaWwiLCJjaGVja09mZmxpbmUiLCJoaWdoUHJpb3JpdHkiLCJpc09wZW4iLCJQcm9taXNlIiwicmVzb2x2ZSIsInVuc2hpZnQiLCJwdXNoIiwiY2xvc2UiLCJjb2RlIiwicmVhc29uIiwic29ja2V0IiwicmVhZHlTdGF0ZSIsIk5vZGVXZWJTb2NrZXQiLCJPUEVOIiwiY29ubmVjdCIsIklkZW50aWZ5aW5nIiwiUmVzdW1pbmciLCJpbmNsdWRlcyIsIkNvbm5lY3RpbmciLCJjb25uZWN0aW5nIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwidmVyc2lvbiIsInRvU3RyaW5nIiwic2hvdWxkVXNlQnVpbHRpbiIsIlJlZmxlY3QiLCJoYXMiLCJnbG9iYWxUaGlzIiwiV2ViU29ja2V0Iiwib25lcnJvciIsImV2ZW50IiwiaGFuZGxlRXJyb3IiLCJvbmNsb3NlIiwiY2xvc2VFdmVudCIsImhhbmRsZUNsb3NlIiwib25tZXNzYWdlIiwibWVzc2FnZUV2ZW50IiwiaGFuZGxlTWVzc2FnZSIsIm9ub3BlbiIsIlVuaWRlbnRpZmllZCIsImNvbm5lY3RlZCIsImlkZW50aWZ5IiwiZGVidWciLCJTaGFyZFNvY2tldENsb3NlQ29kZXMiLCJSZUlkZW50aWZ5aW5nIiwiaWRlbnRpZnlpbmciLCJzZW5kIiwib3AiLCJHYXRld2F5T3Bjb2RlcyIsIklkZW50aWZ5IiwiZCIsInRva2VuIiwiY29tcHJlc3MiLCJwcm9wZXJ0aWVzIiwiaW50ZW50cyIsInNoYXJkIiwidG90YWxTaGFyZHMiLCJwcmVzZW5jZSIsIm1ha2VQcmVzZW5jZSIsImlkZW50aWZpZWQiLCJkZWxldGUiLCJyZXN1bWUiLCJSZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbiIsInNlc3Npb25JZCIsIlJlc3VtZSIsInNlc3Npb25faWQiLCJzZXEiLCJtZXNzYWdlIiwiYWNxdWlyZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzaHV0ZG93biIsIlNodXRkb3duIiwiZXJyb3IiLCJzdG9wSGVhcnRiZWF0aW5nIiwiVGVzdGluZ0ZpbmlzaGVkIiwiZGlzY29ubmVjdGVkIiwiUmVzaGFyZGVkIiwiWm9tYmllZENvbm5lY3Rpb24iLCJEaXNjb25uZWN0ZWQiLCJHYXRld2F5Q2xvc2VFdmVudENvZGVzIiwiVW5rbm93bk9wY29kZSIsIk5vdEF1dGhlbnRpY2F0ZWQiLCJJbnZhbGlkU2VxIiwiUmF0ZUxpbWl0ZWQiLCJTZXNzaW9uVGltZWRPdXQiLCJBdXRoZW50aWNhdGlvbkZhaWxlZCIsIkludmFsaWRTaGFyZCIsIlNoYXJkaW5nUmVxdWlyZWQiLCJJbnZhbGlkQXBpVmVyc2lvbiIsIkludmFsaWRJbnRlbnRzIiwiRGlzYWxsb3dlZEludGVudHMiLCJFcnJvciIsIlVua25vd25FcnJvciIsIkRlY29kZUVycm9yIiwiQWxyZWFkeUF1dGhlbnRpY2F0ZWQiLCJpbmZvIiwicHJlUHJvY2Vzc01lc3NhZ2UiLCJkYXRhIiwiQmxvYiIsImluZmxhdGVTeW5jIiwiYXJyYXlCdWZmZXIiLCJoYW5kbGVEaXNjb3JkUGFja2V0IiwicGFyc2UiLCJwYWNrZXQiLCJsYXN0QWNrIiwiRGF0ZSIsIm5vdyIsIkhlYXJ0YmVhdCIsImxhc3RCZWF0IiwiaGVhcnRiZWF0IiwiSGVsbG8iLCJoZWFydGJlYXRfaW50ZXJ2YWwiLCJzdGFydEhlYXJ0YmVhdGluZyIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlIiwiaGVsbG8iLCJIZWFydGJlYXRBQ0siLCJydHQiLCJoZWFydGJlYXRBY2siLCJSZWNvbm5lY3QiLCJyZXF1ZXN0ZWRSZWNvbm5lY3QiLCJJbnZhbGlkU2Vzc2lvbiIsInJlc3VtYWJsZSIsImludmFsaWRTZXNzaW9uIiwiZGVsYXkiLCJmbG9vciIsInJhbmRvbSIsImdldCIsInQiLCJDb25uZWN0ZWQiLCJyZXN1bWVkIiwiZm9yRWFjaCIsImxlbmd0aCIsInBheWxvYWQiLCJyZXN1bWVfZ2F0ZXdheV91cmwiLCJzIiwiZm9yd2FyZFRvQm90IiwiY2FtZWxpemUiLCJpbnRlcnZhbElkIiwiY2xlYXJJbnRlcnZhbCIsInRpbWVvdXRJZCIsImNsZWFyVGltZW91dCIsImppdHRlciIsInNldFRpbWVvdXQiLCJzZXRJbnRlcnZhbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUFlYUEsZUFBZTtlQUFmQTs7SUF3bEJiLE9BQThCO2VBQTlCOzs7MEJBdm1CNEI7dUJBRTJCO3VCQUNGOzJEQUMzQjt3QkFTbkI7Ozs7OztBQUVBLElBQUEsQUFBTUEsa0JBQU4sTUFBTUE7SUFnQ1hDLFlBQVlDLE9BQTJCLENBQUU7UUF6QnpDLDBIQUEwSCxRQUMxSEMsOEJBQXNDO1FBQ3RDLDBDQUEwQyxRQUMxQ0MseUJBQXdDO1FBQ3hDLDRFQUE0RSxRQUM1RUMseUJBQWlDO1FBS2pDLHdDQUF3QyxRQUN4Q0MsUUFBUUMsa0JBQVUsQ0FBQ0MsT0FBTztRQUMxQixpRkFBaUYsUUFDakZDLG1CQUEyQjtRQUMzQixzQ0FBc0MsUUFDdENDLFNBQXNCLENBQUM7UUFDdkIsbUdBQW1HLFFBQ25HQyxtQkFBbUMsRUFBRTtRQUNyQyxpRkFBaUYsUUFDakZDLFdBQVcsSUFBSUM7UUFPYixJQUFJLENBQUNDLEVBQUUsR0FBR1osUUFBUVksRUFBRTtRQUNwQixJQUFJLENBQUNDLFVBQVUsR0FBR2IsUUFBUWEsVUFBVTtRQUNwQyxJQUFJLENBQUNMLE1BQU0sR0FBR1IsUUFBUVEsTUFBTTtRQUM1QixJQUFJLENBQUNNLE1BQU0sR0FBR2QsUUFBUWMsTUFBTSxJQUFJQSxhQUFNO1FBRXRDLElBQUksQ0FBQ0MsS0FBSyxHQUFHO1lBQ1hDLGNBQWM7WUFDZEMsVUFBVTtRQUNaO1FBRUEsSUFBSWpCLFFBQVFrQixlQUFlLEVBQUUsSUFBSSxDQUFDQSxlQUFlLEdBQUdsQixRQUFRa0IsZUFBZTtRQUMzRSxJQUFJbEIsUUFBUW1CLFlBQVksRUFBRSxJQUFJLENBQUNBLFlBQVksR0FBR25CLFFBQVFtQixZQUFZO1FBRWxFLElBQUksQ0FBQ0MsTUFBTSxHQUFHLElBQUlDLGtCQUFXLENB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