@discordeno/gateway 20.0.0 → 21.0.0-next.0db0ffe

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -60,5 +60,5 @@ Standalone WebSocket to connect to the Discord API.
60
60
  ## Links
61
61
 
62
62
  - [Website](https://discordeno.js.org/)
63
- - [Documentation](https://doc.deno.land/https/deno.land/x/discordeno/mod.ts)
63
+ - [Documentation](https://discordeno.js.org)
64
64
  - [Discord](https://discord.com/invite/5vBgXk3UcZ)
@@ -88,6 +88,15 @@ let DiscordenoShard = class DiscordenoShard {
88
88
  /** The shard related event handlers. */ this.events = {};
89
89
  /** Cache for pending gateway requests which should have been send while the gateway went offline. */ this.offlineSendQueue = [];
90
90
  /** Resolve internal waiting states. Mapped by SelectedEvents => ResolveFunction */ this.resolves = new Map();
91
+ /**
92
+ * Is the shard going offline?
93
+ *
94
+ * @remarks
95
+ * This will be true if the close method has been called with either 1000 or 1001
96
+ *
97
+ * @internal
98
+ * This is for internal purposes only, and subject to breaking changes.
99
+ */ this.goingOffline = false;
91
100
  /** Text decoder used for compressed payloads. */ this.textDecoder = new TextDecoder();
92
101
  /** ZLib inflate buffer. */ this.inflateBuffer = null;
93
102
  /** Queue for compressed payloads for Zstd Decompress */ this.decompressionPromisesQueue = [];
@@ -100,7 +109,6 @@ let DiscordenoShard = class DiscordenoShard {
100
109
  interval: 45000
101
110
  };
102
111
  if (options.requestIdentify) this.requestIdentify = options.requestIdentify;
103
- if (options.shardIsReady) this.shardIsReady = options.shardIsReady;
104
112
  if (options.makePresence) this.makePresence = options.makePresence;
105
113
  this.bucket = new _utils.LeakyBucket({
106
114
  max: this.calculateSafeRequests(),
@@ -130,12 +138,21 @@ let DiscordenoShard = class DiscordenoShard {
130
138
  });
131
139
  }
132
140
  /** Close the socket connection to discord if present. */ async close(code, reason) {
133
- if (this.socket?.readyState !== _ws.default.OPEN) return;
134
- this.socket?.close(code, reason);
135
- // We need to wait for the socket to be fully closed, otherwise there'll be race condition issues if we try to connect again, resulting in unexpected behavior.
136
- await new Promise((resolve)=>{
141
+ this.logger.debug(`[Shard] Request for Shard #${this.id} to close the socket with code ${code}.`);
142
+ if (this.socket?.readyState !== _ws.default.OPEN) {
143
+ this.logger.debug(`[Shard] Shard #${this.id}'s ready state is ${this.socket?.readyState}, Unable to close.`);
144
+ return;
145
+ }
146
+ this.goingOffline = code === _types.GatewayCloseEventCodes.NormalClosure || code === _types.GatewayCloseEventCodes.GoingAway;
147
+ // This has to be created before the actual call to socket.close as for example Bun calls socket.onclose immediately on the .close() call instead of waiting for the connection to end
148
+ const promise = new Promise((resolve)=>{
137
149
  this.resolveAfterClose = resolve;
138
150
  });
151
+ this.socket.close(code, reason);
152
+ this.logger.debug(`[Shard] Waiting for Shard #${this.id} to close the socket with code ${code}.`);
153
+ // We need to wait for the socket to be fully closed, otherwise there'll be race condition issues if we try to connect again, resulting in unexpected behavior.
154
+ await promise;
155
+ this.logger.debug(`[Shard] Shard #${this.id} closed the socket with code ${code}.`);
139
156
  // Reset the resolveAfterClose function after it has been resolved.
140
157
  this.resolveAfterClose = undefined;
141
158
  }
@@ -148,6 +165,7 @@ let DiscordenoShard = class DiscordenoShard {
148
165
  ].includes(this.state)) {
149
166
  this.state = _types1.ShardState.Connecting;
150
167
  }
168
+ this.logger.debug(`[Shard] Connecting Shard #${this.id} socket.`);
151
169
  this.events.connecting?.(this);
152
170
  const url = new URL(this.connectionUrl);
153
171
  url.searchParams.set('v', this.gatewayConfig.version.toString());
@@ -214,18 +232,25 @@ let DiscordenoShard = class DiscordenoShard {
214
232
  ].includes(this.state)) {
215
233
  this.state = _types1.ShardState.Unidentified;
216
234
  }
235
+ this.logger.debug(`[Shard] Shard #${this.id} socket connected.`);
217
236
  this.events.connected?.(this);
218
237
  resolve(this);
219
238
  };
220
239
  });
221
240
  }
222
- /** Identify the shard to the gateway. If not connected, this will also connect the shard to the gateway. */ async identify() {
241
+ /**
242
+ * Identify the shard to the gateway. If not connected, this will also connect the shard to the gateway.
243
+ * @param bypassRequest - Whether to bypass the requestIdentify handler and identify immediately. This should be used carefully as it can cause invalid sessions.
244
+ */ async identify(bypassRequest = false) {
223
245
  // A new identify has been requested even though there is already a connection open.
224
246
  // Therefore we need to close the old connection and heartbeating before creating a new one.
225
247
  if (this.isOpen()) {
226
248
  this.logger.debug(`[Shard] Identifying open Shard #${this.id}, closing the connection`);
227
249
  await this.close(_types1.ShardSocketCloseCodes.ReIdentifying, 'Re-identifying closure of old connection.');
228
250
  }
251
+ if (!bypassRequest) {
252
+ await this.requestIdentify();
253
+ }
229
254
  this.state = _types1.ShardState.Identifying;
230
255
  this.events.identifying?.(this);
231
256
  // It is possible that the shard is in Heartbeating state but not identified,
@@ -234,6 +259,7 @@ let DiscordenoShard = class DiscordenoShard {
234
259
  if (!this.isOpen()) {
235
260
  await this.connect();
236
261
  }
262
+ this.logger.debug(`[Shard] Sending Identify payload for Shard #${this.id}.`);
237
263
  this.send({
238
264
  op: _types.GatewayOpcodes.Identify,
239
265
  d: {
@@ -251,8 +277,6 @@ let DiscordenoShard = class DiscordenoShard {
251
277
  return await new Promise((resolve)=>{
252
278
  this.resolves.set('READY', ()=>{
253
279
  this.events.identified?.(this);
254
- // Tells the manager that this shard is ready
255
- this.shardIsReady();
256
280
  resolve();
257
281
  });
258
282
  // When identifying too fast, Discord sends an invalid session payload.
@@ -344,7 +368,6 @@ let DiscordenoShard = class DiscordenoShard {
344
368
  case _types1.ShardSocketCloseCodes.ReIdentifying:
345
369
  case _types1.ShardSocketCloseCodes.Resharded:
346
370
  case _types1.ShardSocketCloseCodes.ResumeClosingOldConnection:
347
- case _types1.ShardSocketCloseCodes.ZombiedConnection:
348
371
  {
349
372
  this.state = _types1.ShardState.Disconnected;
350
373
  this.events.disconnected?.(this);
@@ -374,6 +397,19 @@ let DiscordenoShard = class DiscordenoShard {
374
397
  await this.identify();
375
398
  return;
376
399
  }
400
+ // NOTE: This case must always be right above the cases that runs with default case because of how switch works when you don't break / return, more info below.
401
+ case _types.GatewayCloseEventCodes.NormalClosure:
402
+ case _types.GatewayCloseEventCodes.GoingAway:
403
+ {
404
+ // If the shard is marked as goingOffline, it stays disconnected.
405
+ if (this.goingOffline) {
406
+ this.state = _types1.ShardState.Disconnected;
407
+ this.events.disconnected?.(this);
408
+ this.goingOffline = false;
409
+ return;
410
+ }
411
+ // Otherwise, we want the shard to go through the default case where it gets resumed, as it might be an unexpected closure from Discord or Cloudflare for example, so we don't use break / return here.
412
+ }
377
413
  // Gateway connection closes on which a resume is allowed.
378
414
  case _types.GatewayCloseEventCodes.UnknownError:
379
415
  case _types.GatewayCloseEventCodes.UnknownOpcode:
@@ -382,7 +418,6 @@ let DiscordenoShard = class DiscordenoShard {
382
418
  case _types.GatewayCloseEventCodes.AlreadyAuthenticated:
383
419
  default:
384
420
  {
385
- this.logger.info(`[Shard] Shard #${this.id} closed with code ${close.code}. Attempting to resume...`);
386
421
  // We don't want to get into an infinite loop where we resume forever, so if we were already resuming we identify instead
387
422
  this.state = this.state === _types1.ShardState.Resuming ? _types1.ShardState.Identifying : _types1.ShardState.Resuming;
388
423
  this.events.disconnected?.(this);
@@ -500,6 +535,7 @@ let DiscordenoShard = class DiscordenoShard {
500
535
  }
501
536
  case _types.GatewayOpcodes.Reconnect:
502
537
  {
538
+ this.logger.debug(`[Shard] Received a Reconnect for Shard #${this.id}`);
503
539
  this.events.requestedReconnect?.(this);
504
540
  await this.resume();
505
541
  break;
@@ -516,7 +552,7 @@ let DiscordenoShard = class DiscordenoShard {
516
552
  this.resolves.delete('INVALID_SESSION');
517
553
  // When resumable is false we need to re-identify
518
554
  if (!resumable) {
519
- await this.requestIdentify();
555
+ await this.identify();
520
556
  break;
521
557
  }
522
558
  // The session is invalid but apparently it is resumable
@@ -578,7 +614,6 @@ let DiscordenoShard = class DiscordenoShard {
578
614
  * This function communicates with the management process, in order to know whether its free to identify.
579
615
  * When this function resolves, this means that the shard is allowed to send an identify payload to discord.
580
616
  */ async requestIdentify() {}
581
- /** This function communicates with the management process, in order to tell it can identify the next shard. */ async shardIsReady() {}
582
617
  /** Start sending heartbeat payloads to Discord in the provided interval. */ startHeartbeating(interval) {
583
618
  this.logger.debug(`[Shard] Start heartbeating on Shard #${this.id}`);
584
619
  // If old heartbeast exist like after resume, clear the old ones.
@@ -622,7 +657,6 @@ let DiscordenoShard = class DiscordenoShard {
622
657
  if (!this.heart.acknowledged) {
623
658
  this.logger.debug(`[Shard] Heartbeat not acknowledged for Shard #${this.id}. Assuming zombied connection.`);
624
659
  await this.close(_types1.ShardSocketCloseCodes.ZombiedConnection, 'Zombied connection, did not receive an heartbeat ACK in time.');
625
- await this.resume();
626
660
  return;
627
661
  }
628
662
  this.logger.debug(`[Shard] Heartbeating on Shard #${this.id}. Previous sequence number: ${this.previousSequenceNumber}`);
@@ -654,4 +688,4 @@ let DiscordenoShard = class DiscordenoShard {
654
688
  }
655
689
  const _default = DiscordenoShard;
656
690
 
657
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcidcbmltcG9ydCB7IHR5cGUgSW5mbGF0ZSwgY3JlYXRlSW5mbGF0ZSwgaW5mbGF0ZVN5bmMsIGNvbnN0YW50cyBhcyB6bGliQ29uc3RhbnRzIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheVBheWxvYWQsIERpc2NvcmRIZWxsbywgRGlzY29yZFJlYWR5IH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBHYXRld2F5Q2xvc2VFdmVudENvZGVzLCBHYXRld2F5T3Bjb2RlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgTGVha3lCdWNrZXQsIGNhbWVsaXplLCBkZWxheSwgbG9nZ2VyIH0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5pbXBvcnQgdHlwZSB7IERlY29tcHJlc3MgYXMgWnN0ZERlY29tcHJlc3MgfSBmcm9tICdmenN0ZCdcbmltcG9ydCBOb2RlV2ViU29ja2V0IGZyb20gJ3dzJ1xuaW1wb3J0IHtcbiAgdHlwZSBCb3RTdGF0dXNVcGRhdGUsXG4gIHR5cGUgU2hhcmRFdmVudHMsXG4gIHR5cGUgU2hhcmRHYXRld2F5Q29uZmlnLFxuICB0eXBlIFNoYXJkSGVhcnQsXG4gIFNoYXJkU29ja2V0Q2xvc2VDb2RlcyxcbiAgdHlwZSBTaGFyZFNvY2tldFJlcXVlc3QsXG4gIFNoYXJkU3RhdGUsXG4gIFRyYW5zcG9ydENvbXByZXNzaW9uLFxufSBmcm9tICcuL3R5cGVzLmpzJ1xuXG5jb25zdCBaTElCX1NZTkNfRkxVU0ggPSBuZXcgVWludDhBcnJheShbMHgwLCAweDAsIDB4ZmYsIDB4ZmZdKVxuXG5sZXQgZnpzdGQ6IHR5cGVvZiBpbXBvcnQoJ2Z6c3RkJylcblxuLyoqIFNpbmNlIGZ6c3RkIGlzIGFuIG9wdGlvbmFsIGRlcGVuZGVuY3ksIHdlIG5lZWQgdG8gaW1wb3J0IGl0IGxhemlseS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZaU3RkKCkge1xuICByZXR1cm4gKGZ6c3RkID8/PSBhd2FpdCBpbXBvcnQoJ2Z6c3RkJykpXG59XG5cbmV4cG9ydCBjbGFzcyBEaXNjb3JkZW5vU2hhcmQge1xuICAvKiogVGhlIGlkIG9mIHRoZSBzaGFyZC4gKi9cbiAgaWQ6IG51bWJlclxuICAvKiogVGhlIGNvbm5lY3Rpb24gY29uZmlnIGRldGFpbHMgdGhhdCB0aGlzIHNoYXJkIHdpbGwgdXNlZCB0byBjb25uZWN0IHRvIGRpc2NvcmQuICovXG4gIGNvbm5lY3Rpb246IFNoYXJkR2F0ZXdheUNvbmZpZ1xuICAvKiogVGhpcyBjb250YWlucyBhbGwgdGhlIGhlYXJ0YmVhdCBpbmZvcm1hdGlvbiAqL1xuICBoZWFydDogU2hhcmRIZWFydFxuICAvKiogVGhlIG1heGltdW0gb2YgcmVxdWVzdHMgd2hpY2ggY2FuIGJlIHNlbmQgdG8gZGlzY29yZCBwZXIgcmF0ZSBsaW1pdCB0aWNrLiBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlIGNoYW5nZWQuICovXG4gIG1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljazogbnVtYmVyID0gMTIwXG4gIC8qKiBUaGUgcHJldmlvdXMgcGF5bG9hZCBzZXF1ZW5jZSBudW1iZXIuICovXG4gIHByZXZpb3VzU2VxdWVuY2VOdW1iZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG4gIC8qKiBJbiB3aGljaCBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKSB0aGUgZ2F0ZXdheSByZXNldHMgaXQncyByYXRlIGxpbWl0LiAqL1xuICByYXRlTGltaXRSZXNldEludGVydmFsOiBudW1iZXIgPSA2MDAwMFxuICAvKiogQ3VycmVudCBzZXNzaW9uIGlkIG9mIHRoZSBzaGFyZCBpZiBwcmVzZW50LiAqL1xuICBzZXNzaW9uSWQ/OiBzdHJpbmdcbiAgLyoqIFRoaXMgY29udGFpbnMgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIERpc2NvcmQsIGlmIGN1cnJlbnRseSBjb25uZWN0ZWQuICovXG4gIHNvY2tldD86IFdlYlNvY2tldFxuICAvKiogQ3VycmVudCBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgdGhpcy4gKi9cbiAgc3RhdGUgPSBTaGFyZFN0YXRlLk9mZmxpbmVcbiAgLyoqIFRoZSB1cmwgcHJvdmlkZWQgYnkgZGlzY29yZCB0byB1c2Ugd2hlbiByZXN1bWluZyBhIGNvbm5lY3Rpb24gZm9yIHRoaXMgdGhpcy4gKi9cbiAgcmVzdW1lR2F0ZXdheVVybDogc3RyaW5nID0gJydcbiAgLyoqIFRoZSBzaGFyZCByZWxhdGVkIGV2ZW50IGhhbmRsZXJzLiAqL1xuICBldmVudHM6IFNoYXJkRXZlbnRzID0ge31cbiAgLyoqIENhY2hlIGZvciBwZW5kaW5nIGdhdGV3YXkgcmVxdWVzdHMgd2hpY2ggc2hvdWxkIGhhdmUgYmVlbiBzZW5kIHdoaWxlIHRoZSBnYXRld2F5IHdlbnQgb2ZmbGluZS4gKi9cbiAgb2ZmbGluZVNlbmRRdWV1ZTogKCgpID0+IHZvaWQpW10gPSBbXVxuICAvKiogUmVzb2x2ZSBpbnRlcm5hbCB3YWl0aW5nIHN0YXRlcy4gTWFwcGVkIGJ5IFNlbGVjdGVkRXZlbnRzID0+IFJlc29sdmVGdW5jdGlvbiAqL1xuICByZXNvbHZlcyA9IG5ldyBNYXA8J1JFQURZJyB8ICdSRVNVTUVEJyB8ICdJTlZBTElEX1NFU1NJT04nLCAocGF5bG9hZDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKSA9PiB2b2lkPigpXG4gIC8qKiBTaGFyZCBidWNrZXQuIE9ubHkgYWNjZXNzIHRoaXMgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBCdWNrZXQgZm9yIGhhbmRsaW5nIHNoYXJkIHJlcXVlc3QgcmF0ZSBsaW1pdHMuICovXG4gIGJ1Y2tldDogTGVha3lCdWNrZXRcbiAgLyoqIExvZ2dlciBmb3IgdGhlIGJ1Y2tldC4gKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIFRleHQgZGVjb2RlciB1c2VkIGZvciBjb21wcmVzc2VkIHBheWxvYWRzLiAqL1xuICB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gIC8qKiBaTGliIEluZmxhdGUgaW5zdGFuY2UgZm9yIFpMaWItc3RyZWFtIHRyYW5zcG9ydCBwYXlsb2Fkcy4gKi9cbiAgaW5mbGF0ZT86IEluZmxhdGVcbiAgLyoqIFpMaWIgaW5mbGF0ZSBidWZmZXIuICovXG4gIGluZmxhdGVCdWZmZXI6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbFxuICAvKiogWlN0ZCBEZWNvbXByZXNzIGluc3RhbmNlIGZvciBaU3RkLXN0cmVhbSB0cmFuc3BvcnQgcGF5bG9hZHMuICovXG4gIHpzdGREZWNvbXByZXNzPzogWnN0ZERlY29tcHJlc3NcbiAgLyoqIFF1ZXVlIGZvciBjb21wcmVzc2VkIHBheWxvYWRzIGZvciBac3RkIERlY29tcHJlc3MgKi9cbiAgZGVjb21wcmVzc2lvblByb21pc2VzUXVldWU6ICgoZGF0YTogRGlzY29yZEdhdGV3YXlQYXlsb2FkKSA9PiB2b2lkKVtdID0gW11cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbmNlIHRoZSBzb2NrZXQgaXMgY2xvc2VkIGFuZCBoYW5kbGVDbG9zZSgpIGhhcyBmaW5pc2hlZCB1cGRhdGluZyBpbnRlcm5hbCBzdGF0ZXMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBvbmx5LCBhbmQgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzLlxuICAgKi9cbiAgcmVzb2x2ZUFmdGVyQ2xvc2U/OiAoY2xvc2U6IENsb3NlRXZlbnQpID0+IHZvaWRcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTaGFyZENyZWF0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZFxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvblxuICAgIHRoaXMuZXZlbnRzID0gb3B0aW9ucy5ldmVudHNcbiAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlclxuXG4gICAgdGhpcy5oZWFydCA9IHtcbiAgICAgIGFja25vd2xlZGdlZDogZmFsc2UsXG4gICAgICBpbnRlcnZhbDogNDUwMDAsXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdElkZW50aWZ5KSB0aGlzLnJlcXVlc3RJZGVudGlmeSA9IG9wdGlvbnMucmVxdWVzdElkZW50aWZ5XG4gICAgaWYgKG9wdGlvbnMuc2hhcmRJc1JlYWR5KSB0aGlzLnNoYXJkSXNSZWFkeSA9IG9wdGlvbnMuc2hhcmRJc1JlYWR5XG4gICAgaWYgKG9wdGlvbnMubWFrZVByZXNlbmNlKSB0aGlzLm1ha2VQcmVzZW5jZSA9IG9wdGlvbnMubWFrZVByZXNlbmNlXG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgIH0pXG4gIH1cblxuICAvKiogVGhlIGdhdGV3YXkgY29uZmlndXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZC4gKi9cbiAgZ2V0IGdhdGV3YXlDb25maWcoKTogU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gIH1cblxuICAvKiogVGhlIHVybCB0byBjb25uZWN0IHRvLiBJbml0aWFsbHkgdGhpcyBpcyB0aGUgZGlzY29yZCBnYXRld2F5IHVybCwgYW5kIHRoZW4gaXMgc3dpdGNoZWQgdG8gcmVzdW1lIGdhdGV3YXkgdXJsIG9uY2UgYSBSRUFEWSBpcyByZWNlaXZlZC4gKi9cbiAgZ2V0IGNvbm5lY3Rpb25VcmwoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgfHwgYW5kIG5vdCA/PyBoZXJlLiA/PyB3aWxsIGNhdXNlIGEgYnVnLlxuICAgIHJldHVybiB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgfHwgdGhpcy5nYXRld2F5Q29uZmlnLnVybFxuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDJcblxuICAgIHJldHVybiBzYWZlUmVxdWVzdHMgPCAwID8gMCA6IHNhZmVSZXF1ZXN0c1xuICB9XG5cbiAgYXN5bmMgY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgIGlmIChoaWdoUHJpb3JpdHkpIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS51bnNoaWZ0KHJlc29sdmUpXG4gICAgICBlbHNlIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5wdXNoKHJlc29sdmUpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBhc3luYyBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlICE9PSBOb2RlV2ViU29ja2V0Lk9QRU4pIHJldHVyblxuXG4gICAgdGhpcy5zb2NrZXQ/LmNsb3NlKGNvZGUsIHJlYXNvbilcblxuICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBmdWxseSBjbG9zZWQsIG90aGVyd2lzZSB0aGVyZSdsbCBiZSByYWNlIGNvbmRpdGlvbiBpc3N1ZXMgaWYgd2UgdHJ5IHRvIGNvbm5lY3QgYWdhaW4sIHJlc3VsdGluZyBpbiB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVBZnRlckNsb3NlID0gcmVzb2x2ZVxuICAgIH0pXG5cbiAgICAvLyBSZXNldCB0aGUgcmVzb2x2ZUFmdGVyQ2xvc2UgZnVuY3Rpb24gYWZ0ZXIgaXQgaGFzIGJlZW4gcmVzb2x2ZWQuXG4gICAgdGhpcy5yZXNvbHZlQWZ0ZXJDbG9zZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqIENvbm5lY3QgdGhlIHNoYXJkIHdpdGggdGhlIGdhdGV3YXkgYW5kIHN0YXJ0IGhlYXJ0YmVhdGluZy4gVGhpcyB3aWxsIG5vdCBpZGVudGlmeSB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTxEaXNjb3JkZW5vU2hhcmQ+IHtcbiAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQgdG8gYENvbm5lY3RpbmdgIHN0YXRlLFxuICAgIC8vIGlmIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QgZG9lcyBub3QgY29tZSBmcm9tIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgaWYgKCFbU2hhcmRTdGF0ZS5JZGVudGlmeWluZywgU2hhcmRTdGF0ZS5SZXN1bWluZ10uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RpbmdcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50cy5jb25uZWN0aW5nPy4odGhpcylcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodGhpcy5jb25uZWN0aW9uVXJsKVxuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCd2JywgdGhpcy5nYXRld2F5Q29uZmlnLnZlcnNpb24udG9TdHJpbmcoKSlcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnZW5jb2RpbmcnLCAnanNvbicpXG5cbiAgICAvLyBTZXQgdGhlIGNvbXByZXNzIHVybCBwYXJhbSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGVjb21wcmVzc2lvbiBjb250ZXh0c1xuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24pIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdjb21wcmVzcycsIHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbilcblxuICAgICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbiA9PT0gVHJhbnNwb3J0Q29tcHJlc3Npb24uemxpYikge1xuICAgICAgICB0aGlzLmluZmxhdGVCdWZmZXIgPSBudWxsXG4gICAgICAgIHRoaXMuaW5mbGF0ZSA9IGNyZWF0ZUluZmxhdGUoe1xuICAgICAgICAgIGZpbmlzaEZsdXNoOiB6bGliQ29uc3RhbnRzLlpfU1lOQ19GTFVTSCxcbiAgICAgICAgICBjaHVua1NpemU6IDY0ICogMTAyNCxcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmluZmxhdGUub24oJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVGhlIHdhcyBhbiBlcnJvciBpbiBkZWNvbXByZXNzaW5nIGEgWkxpYiBjb21wcmVzc2VkIHBheWxvYWQnLCBlKVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuaW5mbGF0ZS5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSByZXR1cm5cblxuICAgICAgICAgIGlmICh0aGlzLmluZmxhdGVCdWZmZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuaW5mbGF0ZUJ1ZmZlci5ieXRlTGVuZ3RoICsgZGF0YS5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgbmV3QnVmZmVyLnNldCh0aGlzLmluZmxhdGVCdWZmZXIpXG4gICAgICAgICAgICBuZXdCdWZmZXIuc2V0KGRhdGEsIHRoaXMuaW5mbGF0ZUJ1ZmZlci5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gbmV3QnVmZmVyXG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IGRhdGFcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbiA9PT0gVHJhbnNwb3J0Q29tcHJlc3Npb24uenN0ZCkge1xuICAgICAgICBjb25zdCBmenN0ZCA9IGF3YWl0IGdldEZaU3RkKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1tTaGFyZF0gXCJmenN0ZFwiIGlzIG5vdCBpbnN0YWxsZWQuIERpc2FibGVkIHRyYW5zcG9ydCBjb21wcmVzc2lvbi4nKVxuICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuZGVsZXRlKCdjb21wcmVzcycpXG5cbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChmenN0ZCkge1xuICAgICAgICAgIHRoaXMuenN0ZERlY29tcHJlc3MgPSBuZXcgZnpzdGQuRGVjb21wcmVzcygoZGF0YSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGVjb2RlZERhdGEgPSB0aGlzLnRleHREZWNvZGVyLmRlY29kZShkYXRhKVxuICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZGVjb2RlZERhdGEpXG4gICAgICAgICAgICB0aGlzLmRlY29tcHJlc3Npb25Qcm9taXNlc1F1ZXVlLnNoaWZ0KCk/LihwYXJzZWREYXRhKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzICYmIHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybignW1NoYXJkXSBQYXlsb2FkIGNvbXByZXNzaW9uIGhhcyBiZWVuIGRpc2FibGVkIHNpbmNlIHRyYW5zcG9ydCBjb21wcmVzc2lvbiBpcyBlbmFibGVkIGFzIHdlbGwuJylcbiAgICAgIHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcyA9IGZhbHNlXG4gICAgfVxuXG4gICAgLy8gV2UgY2hlY2sgZm9yIGJ1aWx0LWluIFdlYlNvY2tldCBpbXBsZW1lbnRhdGlvbnMgaW4gQnVuIG9yIERlbm8sIE5vZGVKUyB2MjIgaGFzIGFuIGltcGxlbWVudGF0aW9uIHRvbyBidXQgaXQgc2VlbXMgdG8gYmUgbGVzcyBvcHRpbWl6ZWQgc28gZm9yIG5vdyBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZSB3cyBucG0gcGFja2FnZVxuICAgIGNvbnN0IHNob3VsZFVzZUJ1aWx0aW4gPSBSZWZsZWN0LmhhcyhnbG9iYWxUaGlzLCAnV2ViU29ja2V0JykgJiYgKFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdCdW4nKSB8fCBSZWZsZWN0LmhhcyhnbG9iYWxUaGlzLCAnRGVubycpKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb2RlV2ViU29ja2V0IGRvZXNuJ3Qgc3VwcG9ydCBcImRpc3BhdGNoRXZlbnRcIiwgYW5kIHdoaWxlIHdlIGRvbid0IHVzZSBpdCwgaXQgaXMgcmVxdWlyZWQgb24gdGhlIFwiV2ViU29ja2V0XCIgdHlwZVxuICAgIGNvbnN0IHNvY2tldDogV2ViU29ja2V0ID0gc2hvdWxkVXNlQnVpbHRpbiA/IG5ldyBXZWJTb2NrZXQodXJsKSA6IG5ldyBOb2RlV2ViU29ja2V0KHVybClcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuXG4gICAgLy8gQnkgZGVmYXVsdCBXZWJTb2NrZXQgd2lsbCBnaXZlIHVzIGEgQmxvYiwgdGhpcyBjaGFuZ2VzIGl0IHNvIHRoYXQgaXQgZ2l2ZXMgdXMgYW4gQXJyYXlCdWZmZXJcbiAgICBzb2NrZXQuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcidcblxuICAgIHNvY2tldC5vbmVycm9yID0gKGV2ZW50KSA9PiB0aGlzLmhhbmRsZUVycm9yKGV2ZW50KVxuICAgIHNvY2tldC5vbmNsb3NlID0gKGNsb3NlRXZlbnQpID0+IHRoaXMuaGFuZGxlQ2xvc2UoY2xvc2VFdmVudClcbiAgICBzb2NrZXQub25tZXNzYWdlID0gKG1lc3NhZ2VFdmVudCkgPT4gdGhpcy5oYW5kbGVNZXNzYWdlKG1lc3NhZ2VFdmVudClcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBVbmlkZW50aWZpZWRgIHN0YXRlIGlmIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QgZG9lcyBub3QgY29tZSBmcm9tIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50cy5jb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJlc29sdmUodGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIElkZW50aWZ5IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gSWYgbm90IGNvbm5lY3RlZCwgdGhpcyB3aWxsIGFsc28gY29ubmVjdCB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIGlkZW50aWZ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEEgbmV3IGlkZW50aWZ5IGhhcyBiZWVuIHJlcXVlc3RlZCBldmVuIHRob3VnaCB0aGVyZSBpcyBhbHJlYWR5IGEgY29ubmVjdGlvbiBvcGVuLlxuICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBvbGQgY29ubmVjdGlvbiBhbmQgaGVhcnRiZWF0aW5nIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIElkZW50aWZ5aW5nIG9wZW4gU2hhcmQgIyR7dGhpcy5pZH0sIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb25gKVxuICAgICAgYXdhaXQgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVJZGVudGlmeWluZywgJ1JlLWlkZW50aWZ5aW5nIGNsb3N1cmUgb2Ygb2xkIGNvbm5lY3Rpb24uJylcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5JZGVudGlmeWluZ1xuICAgIHRoaXMuZXZlbnRzLmlkZW50aWZ5aW5nPy4odGhpcylcblxuICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHNoYXJkIGlzIGluIEhlYXJ0YmVhdGluZyBzdGF0ZSBidXQgbm90IGlkZW50aWZpZWQsXG4gICAgLy8gc28gY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhbHJlYWR5IGEgZ2F0ZXdheSBjb25uZWN0aW9uIGV4aXN0aW5nLlxuICAgIC8vIElmIG5vdCB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmUgYmVmb3JlIHdlIGlkZW50aWZ5LlxuICAgIGlmICghdGhpcy5pc09wZW4oKSkge1xuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICB9XG5cbiAgICB0aGlzLnNlbmQoXG4gICAgICB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5JZGVudGlmeSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgY29tcHJlc3M6IHRoaXMuZ2F0ZXdheUNvbmZpZy5jb21wcmVzcyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLmdhdGV3YXlDb25maWcucHJvcGVydGllcyxcbiAgICAgICAgICBpbnRlbnRzOiB0aGlzLmdhdGV3YXlDb25maWcuaW50ZW50cyxcbiAgICAgICAgICBzaGFyZDogW3RoaXMuaWQsIHRoaXMuZ2F0ZXdheUNvbmZpZy50b3RhbFNoYXJkc10sXG4gICAgICAgICAgcHJlc2VuY2U6IGF3YWl0IHRoaXMubWFrZVByZXNlbmNlKCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRUFEWScsICgpID0+IHtcbiAgICAgICAgdGhpcy5ldmVudHMuaWRlbnRpZmllZD8uKHRoaXMpXG4gICAgICAgIC8vIFRlbGxzIHRoZSBtYW5hZ2VyIHRoYXQgdGhpcyBzaGFyZCBpcyByZWFkeVxuICAgICAgICB0aGlzLnNoYXJkSXNSZWFkeSgpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICAgIC8vIFdoZW4gaWRlbnRpZnlpbmcgdG9vIGZhc3QsIERpc2NvcmQgc2VuZHMgYW4gaW52YWxpZCBzZXNzaW9uIHBheWxvYWQuXG4gICAgICAvLyBUaGlzIGNhbiBzYWZlbHkgYmUgaWdub3JlZCB0aG91Z2ggYW5kIHRoZSBzaGFyZCBzdGFydHMgYSBuZXcgaWRlbnRpZnkgYWN0aW9uLlxuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ0lOVkFMSURfU0VTU0lPTicsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFQURZJylcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKiogQ2hlY2sgd2hldGhlciB0aGUgY29ubmVjdGlvbiB0byBEaXNjb3JkIGlzIGN1cnJlbnRseSBvcGVuLiAqL1xuICBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlID09PSBOb2RlV2ViU29ja2V0Lk9QRU5cbiAgfVxuXG4gIC8qKiBBdHRlbXB0IHRvIHJlc3VtZSB0aGUgcHJldmlvdXMgc2hhcmRzIHNlc3Npb24gd2l0aCB0aGUgZ2F0ZXdheS4gKi9cbiAgYXN5bmMgcmVzdW1lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9YClcblxuICAgIC8vIEl0IGhhcyBiZWVuIHJlcXVlc3RlZCB0byByZXN1bWUgdGhlIFNoYXJkcyBzZXNzaW9uLlxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgc2hhcmQgaXMgc3RpbGwgY29ubmVjdGVkIHdpdGggRGlzY29yZCdzIGdhdGV3YXkgdGhlcmVmb3JlIHdlIG5lZWQgdG8gZm9yY2VmdWxseSBjbG9zZSBpdC5cbiAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVzdW1pbmcgb3BlbiBTaGFyZCAjJHt0aGlzLmlkfSwgY2xvc2luZyB0aGUgY29ubmVjdGlvbmApXG4gICAgICBhd2FpdCB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbiwgJ1JlY29ubmVjdGluZyB0aGUgc2hhcmQsIGNsb3Npbmcgb2xkIGNvbm5lY3Rpb24uJylcbiAgICB9XG5cbiAgICAvLyBTaGFyZCBoYXMgbmV2ZXIgaWRlbnRpZmllZCwgc28gd2UgY2Fubm90IHJlc3VtZS5cbiAgICBpZiAoIXRoaXMuc2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBUcnlpbmcgdG8gcmVzdW1lIFNoYXJkICMke3RoaXMuaWR9IHdpdGhvdXQgdGhlIHNlc3Npb24gaWQuIElkZW50aWZ5aW5nIHRoZSBzaGFyZCBpbnN0ZWFkLmApXG5cbiAgICAgIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuUmVzdW1pbmdcblxuICAgIC8vIEJlZm9yZSB3ZSBjYW4gcmVzdW1lLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHdpdGggRGlzY29yZCdzIGdhdGV3YXkuXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlc3VtaW5nIFNoYXJkICMke3RoaXMuaWR9IGNvbm5lY3RlZC4gU2Vzc2lvbiBpZDogJHt0aGlzLnNlc3Npb25JZH0gfCBTZXF1ZW5jZTogJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YClcblxuICAgIHRoaXMuc2VuZChcbiAgICAgIHtcbiAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLlJlc3VtZSxcbiAgICAgICAgZDoge1xuICAgICAgICAgIHRva2VuOiBgQm90ICR7dGhpcy5nYXRld2F5Q29uZmlnLnRva2VufWAsXG4gICAgICAgICAgc2Vzc2lvbl9pZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICAgICAgc2VxOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIgPz8gMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cnVlLFxuICAgIClcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ1JFU1VNRUQnLCAoKSA9PiByZXNvbHZlKCkpXG5cbiAgICAgIC8vIElmIGl0IGlzIGF0dGVtcHRlZCB0byByZXN1bWUgd2l0aCBhbiBpbnZhbGlkIHNlc3Npb24gaWQsIERpc2NvcmQgc2VuZHMgYW4gaW52YWxpZCBzZXNzaW9uIHBheWxvYWRcbiAgICAgIC8vIE5vdCBlcnJvcmluZyBoZXJlIHNpbmNlIGl0IGlzIGVhc3kgdGhhdCB0aGlzIGhhcHBlbnMsIGFsc28gaXQgd291bGQgYmUgbm90IGNhdGNoYWJsZVxuICAgICAgdGhpcy5yZXNvbHZlcy5zZXQoJ0lOVkFMSURfU0VTU0lPTicsICgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgbWVzc2FnZSB0byBEaXNjb3JkLlxuICAgKiBAcGFyYW0gaGlnaFByaW9yaXR5IC0gV2hldGhlciB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbmQgYXNhcC5cbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogU2hhcmRTb2NrZXRSZXF1ZXN0LCBoaWdoUHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEJlZm9yZSBhY3F1aXJpbmcgYSB0b2tlbiBmcm9tIHRoZSBidWNrZXQsIGNoZWNrIHdoZXRoZXIgdGhlIHNoYXJkIGlzIGN1cnJlbnRseSBvZmZsaW5lIG9yIG5vdC5cbiAgICAvLyBFbHNlIGJ1Y2tldCBhbmQgdG9rZW4gd2FpdCB0aW1lIGp1c3QgZ2V0IHdhc3RlZC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICBhd2FpdCB0aGlzLmJ1Y2tldC5hY3F1aXJlKGhpZ2hQcmlvcml0eSlcblxuICAgIC8vIEl0J3MgcG9zc2libGUsIHRoYXQgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZSBhZnRlciBhIHRva2VuIGhhcyBiZWVuIGFjcXVpcmVkIGZyb20gdGhlIGJ1Y2tldC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrT2ZmbGluZShoaWdoUHJpb3JpdHkpXG5cbiAgICB0aGlzLnNvY2tldD8uc2VuZChKU09OLnN0cmluZ2lmeShtZXNzYWdlKSlcbiAgfVxuXG4gIC8qKiBTaHV0ZG93biB0aGUgdGhpcy4gRm9yY2VmdWxseSBkaXNjb25uZWN0IHRoZSBzaGFyZCBmcm9tIERpc2NvcmQuIFRoZSBzaGFyZCBtYXkgbm90IGF0dGVtcHQgdG8gcmVjb25uZWN0IHdpdGggRGlzY29yZC4gKi9cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd24sICdTaGFyZCBzaHV0dGluZyBkb3duLicpXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICB9XG5cbiAgLyoqIEhhbmRsZSBhIGdhdGV3YXkgY29ubmVjdGlvbiBlcnJvciAqL1xuICBoYW5kbGVFcnJvcihlcnJvcjogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5lcnJvcihgW1NoYXJkXSBUaGVyZSB3YXMgYW4gZXJyb3IgY29ubmVjdGluZyBTaGFyZCAjJHt0aGlzLmlkfS5gLCBlcnJvcilcbiAgfVxuXG4gIC8qKiBIYW5kbGUgYSBnYXRld2F5IGNvbm5lY3Rpb24gY2xvc2UuICovXG4gIGFzeW5jIGhhbmRsZUNsb3NlKGNsb3NlOiBDbG9zZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zb2NrZXQgPSB1bmRlZmluZWRcbiAgICB0aGlzLnN0b3BIZWFydGJlYXRpbmcoKVxuXG4gICAgLy8gQ2xlYXIgdGhlIHpsaWIvenN0ZCBkYXRhXG4gICAgdGhpcy5pbmZsYXRlID0gdW5kZWZpbmVkXG4gICAgdGhpcy56c3RkRGVjb21wcmVzcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGxcbiAgICB0aGlzLmRlY29tcHJlc3Npb25Qcm9taXNlc1F1ZXVlID0gW11cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IGNsb3NlZCB3aXRoIGNvZGUgJHtjbG9zZS5jb2RlfSR7Y2xvc2UucmVhc29uID8gYCwgYW5kIHJlYXNvbjogJHtjbG9zZS5yZWFzb259YCA6ICcnfS5gKVxuXG4gICAgLy8gUmVzb2x2ZSB0aGUgY2xvc2UgcHJvbWlzZSBpZiBpdCBleGlzdHNcbiAgICB0aGlzLnJlc29sdmVBZnRlckNsb3NlPy4oY2xvc2UpXG5cbiAgICBzd2l0Y2ggKGNsb3NlLmNvZGUpIHtcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlRlc3RpbmdGaW5pc2hlZDoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBPbiB0aGVzZSBjb2RlcyBhIG1hbnVhbCBzdGFydCB3aWxsIGJlIGRvbmUuXG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5TaHV0ZG93bjpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmc6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXNoYXJkZWQ6XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbjpcbiAgICAgIGNhc2UgU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlpvbWJpZWRDb25uZWN0aW9uOiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkRpc2Nvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gV2hlbiB0aGVzZSBjb2RlcyBhcmUgcmVjZWl2ZWQgc29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nLlxuICAgICAgLy8gT24gdGhvc2Ugd2UgY2Fubm90IHN0YXJ0IGEgcmVjb25uZWN0IGF0dGVtcHQuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuQXV0aGVudGljYXRpb25GYWlsZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNoYXJkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNoYXJkaW5nUmVxdWlyZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEFwaVZlcnNpb246XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZEludGVudHM6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuRGlzYWxsb3dlZEludGVudHM6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjbG9zZS5yZWFzb24gfHwgJ0Rpc2NvcmQgZ2F2ZSBubyByZWFzb24hIEdHISBZb3UgYnJva2UgRGlzY29yZCEnKVxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyB3aGljaCByZXF1aXJlIGEgbmV3IGlkZW50aWZ5LlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLk5vdEF1dGhlbnRpY2F0ZWQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuSW52YWxpZFNlcTpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5TZXNzaW9uVGltZWRPdXQ6IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gY2xvc2VkIHJlcXVpcmluZyByZS1pZGVudGlmeS5gKVxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5JZGVudGlmeWluZ1xuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8vIEdhdGV3YXkgY29ubmVjdGlvbiBjbG9zZXMgb24gd2hpY2ggYSByZXN1bWUgaXMgYWxsb3dlZC5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Vbmtub3duRXJyb3I6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuVW5rbm93bk9wY29kZTpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EZWNvZGVFcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5SYXRlTGltaXRlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BbHJlYWR5QXV0aGVudGljYXRlZDpcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBjbG9zZWQgd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0uIEF0dGVtcHRpbmcgdG8gcmVzdW1lLi4uYClcbiAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBnZXQgaW50byBhbiBpbmZpbml0ZSBsb29wIHdoZXJlIHdlIHJlc3VtZSBmb3JldmVyLCBzbyBpZiB3ZSB3ZXJlIGFscmVhZHkgcmVzdW1pbmcgd2UgaWRlbnRpZnkgaW5zdGVhZFxuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGF0ZSA9PT0gU2hhcmRTdGF0ZS5SZXN1bWluZyA/IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmcgOiBTaGFyZFN0YXRlLlJlc3VtaW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IFNoYXJkU3RhdGUuUmVzdW1pbmcpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlc3VtZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogSGFuZGxlIGFuIGluY29taW5nIGdhdGV3YXkgbWVzc2FnZS4gKi9cbiAgYXN5bmMgaGFuZGxlTWVzc2FnZShtZXNzYWdlOiBNZXNzYWdlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUaGUgd3MgbnBtIHBhY2thZ2Ugd2lsbCB1c2UgYSBCdWZmZXIsIHdoaWxlIHRoZSBnbG9iYWwgYnVpbHQtaW4gd2lsbCB1c2UgQXJyYXlCdWZmZXJcbiAgICBjb25zdCBpc0NvbXByZXNzZWQgPSBtZXNzYWdlLmRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBtZXNzYWdlLmRhdGEgaW5zdGFuY2VvZiBCdWZmZXJcblxuICAgIGNvbnN0IGRhdGEgPSBpc0NvbXByZXNzZWQgPyBhd2FpdCB0aGlzLmRlY29tcHJlc3NQYWNrZXQobWVzc2FnZS5kYXRhKSA6IChKU09OLnBhcnNlKG1lc3NhZ2UuZGF0YSkgYXMgRGlzY29yZEdhdGV3YXlQYXlsb2FkKVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGRlY29tcHJlc3Npb24gd2FzIG5vdCBzdWNjZXNzZnVsXG4gICAgaWYgKCFkYXRhKSByZXR1cm5cblxuICAgIGF3YWl0IHRoaXMuaGFuZGxlRGlzY29yZFBhY2tldChkYXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIERlY29tcHJlc3MgYSB6bGliL3pzdGQgY29tcHJlc3NlZCBwYWNrZXRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFzeW5jIGRlY29tcHJlc3NQYWNrZXQoZGF0YTogQXJyYXlCdWZmZXIgfCBCdWZmZXIpOiBQcm9taXNlPERpc2NvcmRHYXRld2F5UGF5bG9hZCB8IG51bGw+IHtcbiAgICAvLyBBIGJ1ZmZlciBpcyBhIFVpbnQ4QXJyYXkgdW5kZXIgdGhlIGhvb2QuIEFuIEFycmF5QnVmZmVyIGlzIGdlbmVyaWMsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBVaW50OEFycmF5IHRoYXQgdXNlcyB0aGUgd2hvbGUgQXJyYXlCdWZmZXJcbiAgICBjb25zdCBjb21wcmVzc2VkRGF0YTogVWludDhBcnJheSA9IGRhdGEgaW5zdGFuY2VvZiBCdWZmZXIgPyBkYXRhIDogbmV3IFVpbnQ4QXJyYXkoZGF0YSlcblxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24gPT09IFRyYW5zcG9ydENvbXByZXNzaW9uLnpsaWIpIHtcbiAgICAgIGlmICghdGhpcy5pbmZsYXRlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmZhdGFsKCdbU2hhcmRdIHpsaWItc3RyZWFtIHRyYW5zcG9ydCBjb21wcmVzc2lvbiB3YXMgZW5hYmxlZCBidXQgbm8gaW5zdGFuY2Ugb2YgSW5mbGF0ZSB3YXMgZm91bmQuJylcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgLy8gQWxpYXMsIHVzZWQgdG8gYXZvaWQgc29tZSBudWxsIGNoZWNrcyBpbiB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvclxuICAgICAgY29uc3QgaW5mbGF0ZSA9IHRoaXMuaW5mbGF0ZVxuXG4gICAgICBjb25zdCB3cml0ZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGluZmxhdGUud3JpdGUoY29tcHJlc3NlZERhdGEsICdiaW5hcnknLCAoZXJyb3IpID0+IChlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKCkpKVxuICAgICAgfSlcblxuICAgICAgaWYgKCFlbmRzV2l0aE1hcmtlcihjb21wcmVzc2VkRGF0YSwgWkxJQl9TWU5DX0ZMVVNIKSkgcmV0dXJuIG51bGxcblxuICAgICAgYXdhaXQgd3JpdGVQcm9taXNlXG5cbiAgICAgIGlmICghdGhpcy5pbmZsYXRlQnVmZmVyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1tTaGFyZF0gVGhlIFpMaWIgaW5mbGF0ZSBidWZmZXIgd2FzIGNsZWFyZWQgYXQgYW4gdW5leHBlY3RlZCBtb21lbnQuJylcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjb2RlZERhdGEgPSB0aGlzLnRleHREZWNvZGVyLmRlY29kZSh0aGlzLmluZmxhdGVCdWZmZXIpXG4gICAgICB0aGlzLmluZmxhdGVCdWZmZXIgPSBudWxsXG5cbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWREYXRhKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcudHJhbnNwb3J0Q29tcHJlc3Npb24gPT09IFRyYW5zcG9ydENvbXByZXNzaW9uLnpzdGQpIHtcbiAgICAgIGlmICghdGhpcy56c3RkRGVjb21wcmVzcykge1xuICAgICAgICB0aGlzLmxvZ2dlci5mYXRhbCgnW1NoYXJkXSB6c3RkLXN0cmVhbSB0cmFuc3BvcnQgY29tcHJlc3Npb24gd2FzIGVuYWJsZWQgYnV0IG5vIGluc3RhbmNlIG9mIERlY29tcHJlc3Mgd2FzIGZvdW5kLicpXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIHRoaXMuenN0ZERlY29tcHJlc3MucHVzaChjb21wcmVzc2VkRGF0YSlcblxuICAgICAgY29uc3QgZGVjb21wcmVzc2lvblByb21pc2UgPSBuZXcgUHJvbWlzZTxEaXNjb3JkR2F0ZXdheVBheWxvYWQ+KChyKSA9PiB0aGlzLmRlY29tcHJlc3Npb25Qcm9taXNlc1F1ZXVlLnB1c2gocikpXG4gICAgICByZXR1cm4gYXdhaXQgZGVjb21wcmVzc2lvblByb21pc2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzKSB7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZWQgPSBpbmZsYXRlU3luYyhjb21wcmVzc2VkRGF0YSlcbiAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gdGhpcy50ZXh0RGVjb2Rlci5kZWNvZGUoZGVjb21wcmVzc2VkKVxuXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkRGF0YSlcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqIEhhbmRsZXMgYSBpbmNvbWluZyBnYXRld2F5IHBhY2tldC4gKi9cbiAgYXN5bmMgaGFuZGxlRGlzY29yZFBhY2tldChwYWNrZXQ6IERpc2NvcmRHYXRld2F5UGF5bG9hZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEVkZ2UgY2FzZSBzdGFydDogaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmRlbm8vZGlzY29yZGVuby9pc3N1ZXMvMjMxMVxuICAgIHRoaXMuaGVhcnQubGFzdEFjayA9IERhdGUubm93KClcbiAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IHRydWVcbiAgICAvLyBFZGdlIGNhc2UgZW5kIVxuXG4gICAgc3dpdGNoIChwYWNrZXQub3ApIHtcbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0OiB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgICAgLy8gRGlzY29yZCByYW5kb21seSBzZW5kcyB0aGlzIHJlcXVpcmluZyBhbiBpbW1lZGlhdGUgaGVhcnRiZWF0IGJhY2suXG4gICAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICAgIHRoaXMuc29ja2V0Py5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgICBkOiB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgdGhpcy5ldmVudHMuaGVhcnRiZWF0Py4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWxsbzoge1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IChwYWNrZXQuZCBhcyBEaXNjb3JkSGVsbG8pLmhlYXJ0YmVhdF9pbnRlcnZhbFxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSByZWNlaXZlZCBIZWxsb2ApXG4gICAgICAgIHRoaXMuc3RhcnRIZWFydGJlYXRpbmcoaW50ZXJ2YWwpXG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IFNoYXJkU3RhdGUuUmVzdW1pbmcpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UXVldWUgPSBbLi4udGhpcy5idWNrZXQucXVldWVdXG4gICAgICAgICAgLy8gSEVMTE8gaGFzIGJlZW4gc2VuZCBvbiBhIG5vbiByZXN1bWUgYWN0aW9uLlxuICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IHNlc3Npb24sXG4gICAgICAgICAgLy8gdGhlcmVmb3JlIHRoZSByYXRlIGxpbWl0IGludGVydmFsIGhhcyBiZWVuIHJlc2V0IHRvby5cbiAgICAgICAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICAgICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICAgICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICAgICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICAvLyBRdWV1ZSBzaG91bGQgbm90IGJlIGxvc3Qgb24gYSByZS1pZGVudGlmeS5cbiAgICAgICAgICB0aGlzLmJ1Y2tldC5xdWV1ZS51bnNoaWZ0KC4uLmN1cnJlbnRRdWV1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlbGxvPy4odGhpcylcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXRBQ0s6IHtcbiAgICAgICAgLy8gTWFudWFsbHkgY2FsY3VsYXRpbmcgdGhlIHJvdW5kIHRyaXAgdGltZSBmb3IgdXNlcnMgd2hvIG5lZWQgaXQuXG4gICAgICAgIGlmICh0aGlzLmhlYXJ0Lmxhc3RCZWF0KSB7XG4gICAgICAgICAgdGhpcy5oZWFydC5ydHQgPSB0aGlzLmhlYXJ0Lmxhc3RBY2sgLSB0aGlzLmhlYXJ0Lmxhc3RCZWF0XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXRBY2s/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLlJlY29ubmVjdDoge1xuICAgICAgICB0aGlzLmV2ZW50cy5yZXF1ZXN0ZWRSZWNvbm5lY3Q/Lih0aGlzKVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKClcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5JbnZhbGlkU2Vzc2lvbjoge1xuICAgICAgICBjb25zdCByZXN1bWFibGUgPSBwYWNrZXQuZCBhcyBib29sZWFuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlY2VpdmVkIEludmFsaWQgU2Vzc2lvbiBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gd2l0aCByZXN1bWFibGUgYXMgJHtyZXN1bWFibGV9YClcblxuICAgICAgICB0aGlzLmV2ZW50cy5pbnZhbGlkU2Vzc2lvbj8uKHRoaXMsIHJlc3VtYWJsZSlcblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgcmFuZG9tIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gMSBhbmQgNVxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3Jlc3VtaW5nXG4gICAgICAgIGF3YWl0IGRlbGF5KE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiA0ICsgMSkgKiAxMDAwKSlcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnSU5WQUxJRF9TRVNTSU9OJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdJTlZBTElEX1NFU1NJT04nKVxuXG4gICAgICAgIC8vIFdoZW4gcmVzdW1hYmxlIGlzIGZhbHNlIHdlIG5lZWQgdG8gcmUtaWRlbnRpZnlcbiAgICAgICAgaWYgKCFyZXN1bWFibGUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpXG5cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlc3Npb24gaXMgaW52YWxpZCBidXQgYXBwYXJlbnRseSBpdCBpcyByZXN1bWFibGVcbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSAnUkVTVU1FRCc6XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuICAgICAgICB0aGlzLmV2ZW50cy5yZXN1bWVkPy4odGhpcylcblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSByZWNlaXZlZCBSRVNVTUVEYClcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUuZm9yRWFjaCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKVxuICAgICAgICAvLyBTZXR0aW5nIHRoZSBsZW5ndGggdG8gMCB3aWxsIGRlbGV0ZSB0aGUgZWxlbWVudHMgaW4gaXRcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmxlbmd0aCA9IDBcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnUkVTVU1FRCcpPy4ocGFja2V0KVxuICAgICAgICB0aGlzLnJlc29sdmVzLmRlbGV0ZSgnUkVTVU1FRCcpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdSRUFEWSc6IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIERpc2NvcmRSZWFkeVxuXG4gICAgICAgIC8vIEltcG9ydGFudCBmb3IgZnV0dXJlIHJlc3VtZXMuXG4gICAgICAgIHRoaXMucmVzdW1lR2F0ZXdheVVybCA9IHBheWxvYWQucmVzdW1lX2dhdGV3YXlfdXJsXG4gICAgICAgIHRoaXMuc2Vzc2lvbklkID0gcGF5bG9hZC5zZXNzaW9uX2lkXG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuQ29ubmVjdGVkXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gcmVjZWl2ZWQgUkVBRFlgKVxuXG4gICAgICAgIC8vIENvbnRpbnVlIHRoZSByZXF1ZXN0cyB3aGljaCBoYXZlIGJlZW4gcXVldWVkIHNpbmNlIHRoZSBzaGFyZCB3ZW50IG9mZmxpbmUuXG4gICAgICAgIC8vIEltcG9ydGFudCB3aGVuIHRoaXMgaXMgYSByZS1pZGVudGlmeVxuICAgICAgICB0aGlzLm9mZmxpbmVTZW5kUXVldWUuZm9yRWFjaCgocmVzb2x2ZSkgPT4gcmVzb2x2ZSgpKVxuICAgICAgICAvLyBTZXR0aW5nIHRoZSBsZW5ndGggdG8gMCB3aWxsIGRlbGV0ZSB0aGUgZWxlbWVudHMgaW4gaXRcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmxlbmd0aCA9IDBcblxuICAgICAgICB0aGlzLnJlc29sdmVzLmdldCgnUkVBRFknKT8uKHBhY2tldClcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFQURZJylcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIHNlcXVlbmNlIG51bWJlciBpZiBpdCBpcyBwcmVzZW50XG4gICAgLy8gYHNgIGNhbiBiZSBlaXRoZXIgYG51bGxgIG9yIGEgYG51bWJlcmAuXG4gICAgLy8gSW4gb3JkZXIgdG8gcHJldmVudCB1cGRhdGUgbWlzc2VzIHdoZW4gYHNgIGlzIGAwYCB3ZSBjaGVjayBhZ2FpbnN0IG51bGwuXG4gICAgaWYgKHBhY2tldC5zICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXIgPSBwYWNrZXQuc1xuICAgIH1cblxuICAgIHRoaXMuZm9yd2FyZFRvQm90KHBhY2tldClcbiAgfVxuXG4gIGZvcndhcmRUb0JvdChwYWNrZXQ6IERpc2NvcmRHYXRld2F5UGF5bG9hZCk6IHZvaWQge1xuICAgIC8vIFRoZSBuZWNlc3NhcnkgaGFuZGxpbmcgcmVxdWlyZWQgZm9yIHRoZSBTaGFyZHMgY29ubmVjdGlvbiBoYXMgYmVlbiBmaW5pc2hlZC5cbiAgICAvLyBOb3cgdGhlIGV2ZW50IGNhbiBiZSBzYWZlbHkgZm9yd2FyZGVkLlxuICAgIHRoaXMuZXZlbnRzLm1lc3NhZ2U/Lih0aGlzLCBjYW1lbGl6ZShwYWNrZXQpKVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNoYXJkcyBwcmVzZW5jZS5cbiAgICogYXN5bmMgaW4gY2FzZSBkZXZzIGNyZWF0ZSB0aGUgcHJlc2VuY2UgYmFzZWQgb24gZWcuIGRhdGFiYXNlIHZhbHVlcy5cbiAgICogUGFzc2luZyB0aGUgc2hhcmQncyBpZCB0aGVyZSB0byBtYWtlIGl0IGVhc2llciBmb3IgdGhlIGRldiB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICovXG4gIGFzeW5jIG1ha2VQcmVzZW5jZSgpOiBQcm9taXNlPEJvdFN0YXR1c1VwZGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVyblxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gY29tbXVuaWNhdGVzIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2VzcywgaW4gb3JkZXIgdG8ga25vdyB3aGV0aGVyIGl0cyBmcmVlIHRvIGlkZW50aWZ5LlxuICAgKiBXaGVuIHRoaXMgZnVuY3Rpb24gcmVzb2x2ZXMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgc2hhcmQgaXMgYWxsb3dlZCB0byBzZW5kIGFuIGlkZW50aWZ5IHBheWxvYWQgdG8gZGlzY29yZC5cbiAgICovXG4gIGFzeW5jIHJlcXVlc3RJZGVudGlmeSgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gY29tbXVuaWNhdGVzIHdpdGggdGhlIG1hbmFnZW1lbnQgcHJvY2VzcywgaW4gb3JkZXIgdG8gdGVsbCBpdCBjYW4gaWRlbnRpZnkgdGhlIG5leHQgc2hhcmQuICovXG4gIGFzeW5jIHNoYXJkSXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIFN0YXJ0IHNlbmRpbmcgaGVhcnRiZWF0IHBheWxvYWRzIHRvIERpc2NvcmQgaW4gdGhlIHByb3ZpZGVkIGludGVydmFsLiAqL1xuICBzdGFydEhlYXJ0YmVhdGluZyhpbnRlcnZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU3RhcnQgaGVhcnRiZWF0aW5nIG9uIFNoYXJkICMke3RoaXMuaWR9YClcblxuICAgIC8vIElmIG9sZCBoZWFydGJlYXN0IGV4aXN0IGxpa2UgYWZ0ZXIgcmVzdW1lLCBjbGVhciB0aGUgb2xkIG9uZXMuXG4gICAgdGhpcy5zdG9wSGVhcnRiZWF0aW5nKClcblxuICAgIHRoaXMuaGVhcnQuaW50ZXJ2YWwgPSBpbnRlcnZhbFxuXG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkJ3Mgc3RhdGUgdG8gYFVuaWRlbnRpZmllZGBcbiAgICAvLyBpZiBoZWFydGJlYXRpbmcgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZHVlIHRvIGFuIGlkZW50aWZ5IG9yIHJlc3VtZSBhY3Rpb24uXG4gICAgaWYgKFtTaGFyZFN0YXRlLkRpc2Nvbm5lY3RlZCwgU2hhcmRTdGF0ZS5PZmZsaW5lXS5pbmNsdWRlcyh0aGlzLnN0YXRlKSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgaXMgZGlzY29ubmVjdGVkIG9yIG9mZmxpbmUgYnV0IHRoZSBoZWFydGJlYXQgd2FzIHN0YXJ0ZWQgIyR7dGhpcy5pZH1gKVxuICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuVW5pZGVudGlmaWVkXG4gICAgfVxuXG4gICAgLy8gVGhlIGZpcnN0IGhlYXJ0YmVhdCBuZWVkcyB0byBiZSBzZW5kIHdpdGggYSByYW5kb20gZGVsYXkgYmV0d2VlbiBgMGAgYW5kIGBpbnRlcnZhbGBcbiAgICAvLyBVc2luZyBhIGBzZXRUaW1lb3V0KF8sIGppdHRlcilgIGhlcmUgdG8gYWNjb21wbGlzaCB0aGF0LlxuICAgIC8vIGBNYXRoLnJhbmRvbSgpYCBjYW4gYmUgYDBgIHNvIHdlIHVzZSBgMC41YCBpZiB0aGlzIGhhcHBlbnNcbiAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZ1xuICAgIGNvbnN0IGppdHRlciA9IE1hdGguY2VpbCh0aGlzLmhlYXJ0LmludGVydmFsICogKE1hdGgucmFuZG9tKCkgfHwgMC41KSlcblxuICAgIHRoaXMuaGVhcnQudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBCZWdpbm5pbmcgaGVhcnRiZWF0aW5nIHByb2Nlc3MgZm9yIFNoYXJkICMke3RoaXMuaWR9YClcblxuICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0aW5nIG9uIFNoYXJkICMke3RoaXMuaWR9LiBQcmV2aW91cyBzZXF1ZW5jZSBudW1iZXI6ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWApXG5cbiAgICAgIC8vIFVzaW5nIGEgZGlyZWN0IHNvY2tldC5zZW5kIGNhbGwgaGVyZSBiZWNhdXNlIGhlYXJ0YmVhdCByZXF1ZXN0cyBhcmUgcmVzZXJ2ZWQgYnkgdXMuXG4gICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQsXG4gICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICB9KSxcbiAgICAgIClcblxuICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2VcblxuICAgICAgLy8gQWZ0ZXIgdGhlIHJhbmRvbSBoZWFydGJlYXQgaml0dGVyIHdlIGNhbiBzdGFydCBhIG5vcm1hbCBpbnRlcnZhbC5cbiAgICAgIHRoaXMuaGVhcnQuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gaXMgbm90IG9wZW4sIGJ1dCBhdHRlbXB0ZWQgaGVhcnRiZWF0LCBpZ25vcmluZy5gKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIFNoYXJkIGRpZCBub3QgcmVjZWl2ZSBhIGhlYXJ0YmVhdCBBQ0sgZnJvbSBEaXNjb3JkIGluIHRpbWUsXG4gICAgICAgIC8vIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZSBjb25uZWN0aW9uIGhhcyBmYWlsZWQgb3IgZ290IFwiem9tYmllZFwiLlxuICAgICAgICAvLyBUaGUgU2hhcmQgbmVlZHMgdG8gc3RhcnQgYSByZS1pZGVudGlmeSBhY3Rpb24gYWNjb3JkaW5nbHkuXG4gICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjaGVhcnRiZWF0aW5nLWV4YW1wbGUtZ2F0ZXdheS1oZWFydGJlYXQtYWNrXG4gICAgICAgIGlmICghdGhpcy5oZWFydC5hY2tub3dsZWRnZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXQgbm90IGFja25vd2xlZGdlZCBmb3IgU2hhcmQgIyR7dGhpcy5pZH0uIEFzc3VtaW5nIHpvbWJpZWQgY29ubmVjdGlvbi5gKVxuICAgICAgICAgIGF3YWl0IHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlpvbWJpZWRDb25uZWN0aW9uLCAnWm9tYmllZCBjb25uZWN0aW9uLCBkaWQgbm90IHJlY2VpdmUgYW4gaGVhcnRiZWF0IEFDSyBpbiB0aW1lLicpXG5cbiAgICAgICAgICBhd2FpdCB0aGlzLnJlc3VtZSgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBIZWFydGJlYXRpbmcgb24gU2hhcmQgIyR7dGhpcy5pZH0uIFByZXZpb3VzIHNlcXVlbmNlIG51bWJlcjogJHt0aGlzLnByZXZpb3VzU2VxdWVuY2VOdW1iZXJ9YClcblxuICAgICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgICB0aGlzLnNvY2tldD8uc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgICAgZDogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5oZWFydC5sYXN0QmVhdCA9IERhdGUubm93KClcbiAgICAgICAgdGhpcy5oZWFydC5hY2tub3dsZWRnZWQgPSBmYWxzZVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdD8uKHRoaXMpXG4gICAgICB9LCB0aGlzLmhlYXJ0LmludGVydmFsKVxuICAgIH0sIGppdHRlcilcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSBoZWFydGJlYXRpbmcgcHJvY2VzcyB3aXRoIGRpc2NvcmQuICovXG4gIHN0b3BIZWFydGJlYXRpbmcoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgdGhlIHJlZ3VsYXIgaGVhcnRiZWF0IGludGVydmFsLlxuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5oZWFydC5pbnRlcnZhbElkKVxuICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgU2hhcmQgZ290IGNsb3NlZCBiZWZvcmUgdGhlIGZpcnN0IGppdHRlcmVkIGhlYXJ0YmVhdC5cbiAgICAvLyBUbyBnbyBzYWZlIHdlIHNob3VsZCBjbGVhciB0aGUgcmVsYXRlZCB0aW1lb3V0IHRvby5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydC50aW1lb3V0SWQpXG4gIH1cbn1cblxuLyoqIENoZWNrIGlmIHRoZSBidWZmZXIgZW5kcyB3aXRoIHRoZSBtYXJrZXIgKi9cbmZ1bmN0aW9uIGVuZHNXaXRoTWFya2VyKGJ1ZmZlcjogVWludDhBcnJheSwgbWFya2VyOiBVaW50OEFycmF5KSB7XG4gIGlmIChidWZmZXIubGVuZ3RoIDwgbWFya2VyLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrZXIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYnVmZmVyW2J1ZmZlci5sZW5ndGggLSBtYXJrZXIubGVuZ3RoICsgaV0gIT09IG1hcmtlcltpXSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJkQ3JlYXRlT3B0aW9ucyB7XG4gIC8qKiBUaGUgc2hhcmQgaWQgKi9cbiAgaWQ6IG51bWJlclxuICAvKiogVGhlIGNvbm5lY3Rpb24gZGV0YWlscyAqL1xuICBjb25uZWN0aW9uOiBTaGFyZEdhdGV3YXlDb25maWdcbiAgLyoqIFRoZSBldmVudCBoYW5kbGVycyBmb3IgZXZlbnRzIG9uIHRoZSBzaGFyZC4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50c1xuICAvKiogVGhlIGxvZ2dlciBmb3IgdGhlIHNoYXJkICovXG4gIGxvZ2dlcj86IFBpY2s8dHlwZW9mIGxvZ2dlciwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgfCAnZmF0YWwnPlxuICAvKiogVGhlIGhhbmRsZXIgdG8gcmVxdWVzdCBhIHNwYWNlIHRvIG1ha2UgYW4gaWRlbnRpZnkgcmVxdWVzdC4gKi9cbiAgcmVxdWVzdElkZW50aWZ5PzogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogVGhlIGhhbmRsZXIgdG8gYWxlcnQgdGhlIGdhdGV3YXkgbWFuYWdlciB0aGF0IHRoaXMgc2hhcmQgaGFzIHJlY2VpdmVkIGEgUkVBRFkgZXZlbnQuICovXG4gIHNoYXJkSXNSZWFkeT86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIEZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYm90IHN0YXR1cyB0byBzZW5kIG9uIElkZW50aWZ5IHJlcXVlc3RzICovXG4gIG1ha2VQcmVzZW5jZT86ICgpID0+IFByb21pc2U8Qm90U3RhdHVzVXBkYXRlIHwgdW5kZWZpbmVkPlxufVxuXG5leHBvcnQgZGVmYXVsdCBEaXNjb3JkZW5vU2hhcmRcbiJdLCJuYW1lcyI6WyJEaXNjb3JkZW5vU2hhcmQiLCJaTElCX1NZTkNfRkxVU0giLCJVaW50OEFycmF5IiwiZnpzdGQiLCJnZXRGWlN0ZCIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayIsInByZXZpb3VzU2VxdWVuY2VOdW1iZXIiLCJyYXRlTGltaXRSZXNldEludGVydmFsIiwic3RhdGUiLCJTaGFyZFN0YXRlIiwiT2ZmbGluZSIsInJlc3VtZUdhdGV3YXlVcmwiLCJldmVudHMiLCJvZmZsaW5lU2VuZFF1ZXVlIiwicmVzb2x2ZXMiLCJNYXAiLCJ0ZXh0RGVjb2RlciIsIlRleHREZWNvZGVyIiwiaW5mbGF0ZUJ1ZmZlciIsImRlY29tcHJlc3Npb25Qcm9taXNlc1F1ZXVlIiwiaWQiLCJjb25uZWN0aW9uIiwibG9nZ2VyIiwiaGVhcnQiLCJhY2tub3dsZWRnZWQiLCJpbnRlcnZhbCIsInJlcXVlc3RJZGVudGlmeSIsInNoYXJkSXNSZWFkeSIsIm1ha2VQcmVzZW5jZSIsImJ1Y2tldCIsIkxlYWt5QnVja2V0IiwibWF4IiwiY2FsY3VsYXRlU2FmZVJlcXVlc3RzIiwicmVmaWxsQW1vdW50IiwicmVmaWxsSW50ZXJ2YWwiLCJnYXRld2F5Q29uZmlnIiwiY29ubmVjdGlvblVybCIsInVybCIsInNhZmVSZXF1ZXN0cyIsIk1hdGgiLCJjZWlsIiwiY2hlY2tPZmZsaW5lIiwiaGlnaFByaW9yaXR5IiwiaXNPcGVuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1bnNoaWZ0IiwicHVzaCIsImNsb3NlIiwiY29kZSIsInJlYXNvbiIsInNvY2tldCIsInJlYWR5U3RhdGUiLCJOb2RlV2ViU29ja2V0IiwiT1BFTiIsInJlc29sdmVBZnRlckNsb3NlIiwidW5kZWZpbmVkIiwiY29ubmVjdCIsIklkZW50aWZ5aW5nIiwiUmVzdW1pbmciLCJpbmNsdWRlcyIsIkNvbm5lY3RpbmciLCJjb25uZWN0aW5nIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwic2V0IiwidmVyc2lvbiIsInRvU3RyaW5nIiwidHJhbnNwb3J0Q29tcHJlc3Npb24iLCJUcmFuc3BvcnRDb21wcmVzc2lvbiIsInpsaWIiLCJpbmZsYXRlIiwiY3JlYXRlSW5mbGF0ZSIsImZpbmlzaEZsdXNoIiwiemxpYkNvbnN0YW50cyIsIlpfU1lOQ19GTFVTSCIsImNodW5rU2l6ZSIsIm9uIiwiZSIsImVycm9yIiwiZGF0YSIsIm5ld0J1ZmZlciIsImJ5dGVMZW5ndGgiLCJ6c3RkIiwiY2F0Y2giLCJ3YXJuIiwiZGVsZXRlIiwienN0ZERlY29tcHJlc3MiLCJEZWNvbXByZXNzIiwiZGVjb2RlZERhdGEiLCJkZWNvZGUiLCJwYXJzZWREYXRhIiwiSlNPTiIsInBhcnNlIiwic2hpZnQiLCJjb21wcmVzcyIsInNob3VsZFVzZUJ1aWx0aW4iLCJSZWZsZWN0IiwiaGFzIiwiZ2xvYmFsVGhpcyIsIldlYlNvY2tldCIsImJpbmFyeVR5cGUiLCJvbmVycm9yIiwiZXZlbnQiLCJoYW5kbGVFcnJvciIsIm9uY2xvc2UiLCJjbG9zZUV2ZW50IiwiaGFuZGxlQ2xvc2UiLCJvbm1lc3NhZ2UiLCJtZXNzYWdlRXZlbnQiLCJoYW5kbGVNZXNzYWdlIiwib25vcGVuIiwiVW5pZGVudGlmaWVkIiwiY29ubmVjdGVkIiwiaWRlbnRpZnkiLCJkZWJ1ZyIsIlNoYXJkU29ja2V0Q2xvc2VDb2RlcyIsIlJlSWRlbnRpZnlpbmciLCJpZGVudGlmeWluZyIsInNlbmQiLCJvcCIsIkdhdGV3YXlPcGNvZGVzIiwiSWRlbnRpZnkiLCJkIiwidG9rZW4iLCJwcm9wZXJ0aWVzIiwiaW50ZW50cyIsInNoYXJkIiwidG90YWxTaGFyZHMiLCJwcmVzZW5jZSIsImlkZW50aWZpZWQiLCJyZXN1bWUiLCJSZXN1bWVDbG9zaW5nT2xkQ29ubmVjdGlvbiIsInNlc3Npb25JZCIsIlJlc3VtZSIsInNlc3Npb25faWQiLCJzZXEiLCJtZXNzYWdlIiwiYWNxdWlyZSIsInN0cmluZ2lmeSIsInNodXRkb3duIiwiU2h1dGRvd24iLCJzdG9wSGVhcnRiZWF0aW5nIiwiVGVzdGluZ0ZpbmlzaGVkIiwiZGlzY29ubmVjdGVkIiwiUmVzaGFyZGVkIiwiWm9tYmllZENvbm5lY3Rpb24iLCJEaXNjb25uZWN0ZWQiLCJHYXRld2F5Q2xvc2VFdmVudENvZGVzIiwiQXV0aGVudGljYXRpb25GYWlsZWQiLCJJbnZhbGlkU2hhcmQiLCJTaGFyZGluZ1JlcXVpcmVkIiwiSW52YWxpZEFwaVZlcnNpb24iLCJJbnZhbGlkSW50ZW50cyIsIkRpc2FsbG93ZWRJbnRlbnRzIiwiRXJyb3IiLCJOb3RBdXRoZW50aWNhdGVkIiwiSW52YWxpZFNlcSIsIlNlc3Npb25UaW1lZE91dCIsIlVua25vd25FcnJvciIsIlVua25vd25PcGNvZGUiLCJEZWNvZGVFcnJvciIsIlJhdGVMaW1pdGVkIiwiQWxyZWFkeUF1dGhlbnRpY2F0ZWQiLCJpbmZvIiwiaXNDb21wcmVzc2VkIiwiQXJyYXlCdWZmZXIiLCJCdWZmZXIiLCJkZWNvbXByZXNzUGFja2V0IiwiaGFuZGxlRGlzY29yZFBhY2tldCIsImNvbXByZXNzZWREYXRhIiwiZmF0YWwiLCJ3cml0ZVByb21pc2UiLCJyZWplY3QiLCJ3cml0ZSIsImVuZHNXaXRoTWFya2VyIiwiZGVjb21wcmVzc2lvblByb21pc2UiLCJyIiwiZGVjb21wcmVzc2VkIiwiaW5mbGF0ZVN5bmMiLCJwYWNrZXQiLCJsYXN0QWNrIiwiRGF0ZSIsIm5vdyIsIkhlYXJ0YmVhdCIsImxhc3RCZWF0IiwiaGVhcnRiZWF0IiwiSGVsbG8iLCJoZWFydGJlYXRfaW50ZXJ2YWwiLCJzdGFydEhlYXJ0YmVhdGluZyIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlIiwiaGVsbG8iLCJIZWFydGJlYXRBQ0siLCJydHQiLCJoZWFydGJlYXRBY2siLCJSZWNvbm5lY3QiLCJyZXF1ZXN0ZWRSZWNvbm5lY3QiLCJJbnZhbGlkU2Vzc2lvbiIsInJlc3VtYWJsZSIsImludmFsaWRTZXNzaW9uIiwiZGVsYXkiLCJmbG9vciIsInJhbmRvbSIsImdldCIsInQiLCJDb25uZWN0ZWQiLCJyZXN1bWVkIiwiZm9yRWFjaCIsImxlbmd0aCIsInBheWxvYWQiLCJyZXN1bWVfZ2F0ZXdheV91cmwiLCJzIiwiZm9yd2FyZFRvQm90IiwiY2FtZWxpemUiLCJqaXR0ZXIiLCJ0aW1lb3V0SWQiLCJzZXRUaW1lb3V0IiwiaW50ZXJ2YWxJZCIsInNldEludGVydmFsIiwiY2xlYXJJbnRlcnZhbCIsImNsZWFyVGltZW91dCIsImJ1ZmZlciIsIm1hcmtlciIsImkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBMkJhQSxlQUFlO2VBQWZBOztJQTB3QmIsT0FBOEI7ZUFBOUI7Ozs0QkFyeUJ1QjswQkFDOEQ7dUJBRTlCO3VCQUNGOzJEQUUzQjt3QkFVbkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRVAsTUFBTUMsa0JBQWtCLElBQUlDLFdBQVc7SUFBQztJQUFLO0lBQUs7SUFBTTtDQUFLO0FBRTdELElBQUlDO0FBRUosd0VBQXdFLEdBQ3hFLGVBQWVDO0lBQ2IsT0FBUUQsVUFBVSxNQUFNLG1FQUFBLFFBQU87QUFDakM7QUFFTyxJQUFBLEFBQU1ILGtCQUFOLE1BQU1BO0lBaURYSyxZQUFZQyxPQUEyQixDQUFFO1FBMUN6QywwSEFBMEgsUUFDMUhDLDhCQUFzQztRQUN0QywwQ0FBMEMsUUFDMUNDLHlCQUF3QztRQUN4Qyw0RUFBNEUsUUFDNUVDLHlCQUFpQztRQUtqQyx3Q0FBd0MsUUFDeENDLFFBQVFDLGtCQUFVLENBQUNDLE9BQU87UUFDMUIsaUZBQWlGLFFBQ2pGQyxtQkFBMkI7UUFDM0Isc0NBQXNDLFFBQ3RDQyxTQUFzQixDQUFDO1FBQ3ZCLG1HQUFtRyxRQUNuR0MsbUJBQW1DLEVBQUU7UUFDckMsaUZBQWlGLFFBQ2pGQyxXQUFXLElBQUlDO1FBS2YsK0NBQStDLFFBQy9DQyxjQUFjLElBQUlDO1FBR2xCLHlCQUF5QixRQUN6QkMsZ0JBQW1DO1FBR25DLHNEQUFzRCxRQUN0REMsNkJBQXdFLEVBQUU7UUFVeEUsSUFB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
691
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TaGFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcidcbmltcG9ydCB7IHR5cGUgSW5mbGF0ZSwgY3JlYXRlSW5mbGF0ZSwgaW5mbGF0ZVN5bmMsIGNvbnN0YW50cyBhcyB6bGliQ29uc3RhbnRzIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheVBheWxvYWQsIERpc2NvcmRIZWxsbywgRGlzY29yZFJlYWR5LCBEaXNjb3JkVXBkYXRlUHJlc2VuY2UgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7IEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMsIEdhdGV3YXlPcGNvZGVzIH0gZnJvbSAnQGRpc2NvcmRlbm8vdHlwZXMnXG5pbXBvcnQgeyBMZWFreUJ1Y2tldCwgY2FtZWxpemUsIGRlbGF5LCBsb2dnZXIgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcbmltcG9ydCB0eXBlIHsgRGVjb21wcmVzcyBhcyBac3RkRGVjb21wcmVzcyB9IGZyb20gJ2Z6c3RkJ1xuaW1wb3J0IE5vZGVXZWJTb2NrZXQgZnJvbSAnd3MnXG5pbXBvcnQge1xuICB0eXBlIFNoYXJkRXZlbnRzLFxuICB0eXBlIFNoYXJkR2F0ZXdheUNvbmZpZyxcbiAgdHlwZSBTaGFyZEhlYXJ0LFxuICBTaGFyZFNvY2tldENsb3NlQ29kZXMsXG4gIHR5cGUgU2hhcmRTb2NrZXRSZXF1ZXN0LFxuICBTaGFyZFN0YXRlLFxuICBUcmFuc3BvcnRDb21wcmVzc2lvbixcbn0gZnJvbSAnLi90eXBlcy5qcydcblxuY29uc3QgWkxJQl9TWU5DX0ZMVVNIID0gbmV3IFVpbnQ4QXJyYXkoWzB4MCwgMHgwLCAweGZmLCAweGZmXSlcblxubGV0IGZ6c3RkOiB0eXBlb2YgaW1wb3J0KCdmenN0ZCcpXG5cbi8qKiBTaW5jZSBmenN0ZCBpcyBhbiBvcHRpb25hbCBkZXBlbmRlbmN5LCB3ZSBuZWVkIHRvIGltcG9ydCBpdCBsYXppbHkuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGWlN0ZCgpIHtcbiAgcmV0dXJuIChmenN0ZCA/Pz0gYXdhaXQgaW1wb3J0KCdmenN0ZCcpKVxufVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZGVub1NoYXJkIHtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgc2hhcmQuICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGNvbmZpZyBkZXRhaWxzIHRoYXQgdGhpcyBzaGFyZCB3aWxsIHVzZWQgdG8gY29ubmVjdCB0byBkaXNjb3JkLiAqL1xuICBjb25uZWN0aW9uOiBTaGFyZEdhdGV3YXlDb25maWdcbiAgLyoqIFRoaXMgY29udGFpbnMgYWxsIHRoZSBoZWFydGJlYXQgaW5mb3JtYXRpb24gKi9cbiAgaGVhcnQ6IFNoYXJkSGVhcnRcbiAgLyoqIFRoZSBtYXhpbXVtIG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBiZSBzZW5kIHRvIGRpc2NvcmQgcGVyIHJhdGUgbGltaXQgdGljay4gVHlwaWNhbGx5IHRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLiAqL1xuICBtYXhSZXF1ZXN0c1BlclJhdGVMaW1pdFRpY2s6IG51bWJlciA9IDEyMFxuICAvKiogVGhlIHByZXZpb3VzIHBheWxvYWQgc2VxdWVuY2UgbnVtYmVyLiAqL1xuICBwcmV2aW91c1NlcXVlbmNlTnVtYmVyOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAvKiogSW4gd2hpY2ggaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykgdGhlIGdhdGV3YXkgcmVzZXRzIGl0J3MgcmF0ZSBsaW1pdC4gKi9cbiAgcmF0ZUxpbWl0UmVzZXRJbnRlcnZhbDogbnVtYmVyID0gNjAwMDBcbiAgLyoqIEN1cnJlbnQgc2Vzc2lvbiBpZCBvZiB0aGUgc2hhcmQgaWYgcHJlc2VudC4gKi9cbiAgc2Vzc2lvbklkPzogc3RyaW5nXG4gIC8qKiBUaGlzIGNvbnRhaW5zIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byBEaXNjb3JkLCBpZiBjdXJyZW50bHkgY29ubmVjdGVkLiAqL1xuICBzb2NrZXQ/OiBXZWJTb2NrZXRcbiAgLyoqIEN1cnJlbnQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRoaXMuICovXG4gIHN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gIC8qKiBUaGUgdXJsIHByb3ZpZGVkIGJ5IGRpc2NvcmQgdG8gdXNlIHdoZW4gcmVzdW1pbmcgYSBjb25uZWN0aW9uIGZvciB0aGlzIHRoaXMuICovXG4gIHJlc3VtZUdhdGV3YXlVcmw6IHN0cmluZyA9ICcnXG4gIC8qKiBUaGUgc2hhcmQgcmVsYXRlZCBldmVudCBoYW5kbGVycy4gKi9cbiAgZXZlbnRzOiBTaGFyZEV2ZW50cyA9IHt9XG4gIC8qKiBDYWNoZSBmb3IgcGVuZGluZyBnYXRld2F5IHJlcXVlc3RzIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gc2VuZCB3aGlsZSB0aGUgZ2F0ZXdheSB3ZW50IG9mZmxpbmUuICovXG4gIG9mZmxpbmVTZW5kUXVldWU6ICgoKSA9PiB2b2lkKVtdID0gW11cbiAgLyoqIFJlc29sdmUgaW50ZXJuYWwgd2FpdGluZyBzdGF0ZXMuIE1hcHBlZCBieSBTZWxlY3RlZEV2ZW50cyA9PiBSZXNvbHZlRnVuY3Rpb24gKi9cbiAgcmVzb2x2ZXMgPSBuZXcgTWFwPCdSRUFEWScgfCAnUkVTVU1FRCcgfCAnSU5WQUxJRF9TRVNTSU9OJywgKHBheWxvYWQ6IERpc2NvcmRHYXRld2F5UGF5bG9hZCkgPT4gdm9pZD4oKVxuICAvKiogU2hhcmQgYnVja2V0LiBPbmx5IGFjY2VzcyB0aGlzIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gQnVja2V0IGZvciBoYW5kbGluZyBzaGFyZCByZXF1ZXN0IHJhdGUgbGltaXRzLiAqL1xuICBidWNrZXQ6IExlYWt5QnVja2V0XG4gIC8qKiBMb2dnZXIgZm9yIHRoZSBidWNrZXQuICovXG4gIGxvZ2dlcjogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG4gIC8qKlxuICAgKiBJcyB0aGUgc2hhcmQgZ29pbmcgb2ZmbGluZT9cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyB3aWxsIGJlIHRydWUgaWYgdGhlIGNsb3NlIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgd2l0aCBlaXRoZXIgMTAwMCBvciAxMDAxXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBvbmx5LCBhbmQgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzLlxuICAgKi9cbiAgZ29pbmdPZmZsaW5lID0gZmFsc2VcbiAgLyoqIFRleHQgZGVjb2RlciB1c2VkIGZvciBjb21wcmVzc2VkIHBheWxvYWRzLiAqL1xuICB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gIC8qKiBaTGliIEluZmxhdGUgaW5zdGFuY2UgZm9yIFpMaWItc3RyZWFtIHRyYW5zcG9ydCBwYXlsb2Fkcy4gKi9cbiAgaW5mbGF0ZT86IEluZmxhdGVcbiAgLyoqIFpMaWIgaW5mbGF0ZSBidWZmZXIuICovXG4gIGluZmxhdGVCdWZmZXI6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbFxuICAvKiogWlN0ZCBEZWNvbXByZXNzIGluc3RhbmNlIGZvciBaU3RkLXN0cmVhbSB0cmFuc3BvcnQgcGF5bG9hZHMuICovXG4gIHpzdGREZWNvbXByZXNzPzogWnN0ZERlY29tcHJlc3NcbiAgLyoqIFF1ZXVlIGZvciBjb21wcmVzc2VkIHBheWxvYWRzIGZvciBac3RkIERlY29tcHJlc3MgKi9cbiAgZGVjb21wcmVzc2lvblByb21pc2VzUXVldWU6ICgoZGF0YTogRGlzY29yZEdhdGV3YXlQYXlsb2FkKSA9PiB2b2lkKVtdID0gW11cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbmNlIHRoZSBzb2NrZXQgaXMgY2xvc2VkIGFuZCBoYW5kbGVDbG9zZSgpIGhhcyBmaW5pc2hlZCB1cGRhdGluZyBpbnRlcm5hbCBzdGF0ZXMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCBwdXJwb3NlcyBvbmx5LCBhbmQgc3ViamVjdCB0byBicmVha2luZyBjaGFuZ2VzLlxuICAgKi9cbiAgcmVzb2x2ZUFmdGVyQ2xvc2U/OiAoY2xvc2U6IENsb3NlRXZlbnQpID0+IHZvaWRcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTaGFyZENyZWF0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZFxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG9wdGlvbnMuY29ubmVjdGlvblxuICAgIHRoaXMuZXZlbnRzID0gb3B0aW9ucy5ldmVudHNcbiAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlclxuXG4gICAgdGhpcy5oZWFydCA9IHtcbiAgICAgIGFja25vd2xlZGdlZDogZmFsc2UsXG4gICAgICBpbnRlcnZhbDogNDUwMDAsXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdElkZW50aWZ5KSB0aGlzLnJlcXVlc3RJZGVudGlmeSA9IG9wdGlvbnMucmVxdWVzdElkZW50aWZ5XG4gICAgaWYgKG9wdGlvbnMubWFrZVByZXNlbmNlKSB0aGlzLm1ha2VQcmVzZW5jZSA9IG9wdGlvbnMubWFrZVByZXNlbmNlXG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBMZWFreUJ1Y2tldCh7XG4gICAgICBtYXg6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxBbW91bnQ6IHRoaXMuY2FsY3VsYXRlU2FmZVJlcXVlc3RzKCksXG4gICAgICByZWZpbGxJbnRlcnZhbDogNjAwMDAsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgIH0pXG4gIH1cblxuICAvKiogVGhlIGdhdGV3YXkgY29uZmlndXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gRGlzY29yZC4gKi9cbiAgZ2V0IGdhdGV3YXlDb25maWcoKTogU2hhcmRHYXRld2F5Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uXG4gIH1cblxuICAvKiogVGhlIHVybCB0byBjb25uZWN0IHRvLiBJbml0aWFsbHkgdGhpcyBpcyB0aGUgZGlzY29yZCBnYXRld2F5IHVybCwgYW5kIHRoZW4gaXMgc3dpdGNoZWQgdG8gcmVzdW1lIGdhdGV3YXkgdXJsIG9uY2UgYSBSRUFEWSBpcyByZWNlaXZlZC4gKi9cbiAgZ2V0IGNvbm5lY3Rpb25VcmwoKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgfHwgYW5kIG5vdCA/PyBoZXJlLiA/PyB3aWxsIGNhdXNlIGEgYnVnLlxuICAgIHJldHVybiB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgfHwgdGhpcy5nYXRld2F5Q29uZmlnLnVybFxuICB9XG5cbiAgLyoqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHJlcXVlc3RzIHdoaWNoIGNhbiBzYWZlbHkgYmUgbWFkZSBwZXIgcmF0ZSBsaW1pdCBpbnRlcnZhbCwgYmVmb3JlIHRoZSBnYXRld2F5IGdldHMgZGlzY29ubmVjdGVkIGR1ZSB0byBhbiBleGNlZWRlZCByYXRlIGxpbWl0LiAqL1xuICBjYWxjdWxhdGVTYWZlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAvLyAqIDIgYWRkcyBleHRyYSBzYWZldHkgbGF5ZXIgZm9yIGRpc2NvcmRzIE9QIDEgcmVxdWVzdHMgdGhhdCB3ZSBuZWVkIHRvIHJlc3BvbmQgdG9cbiAgICBjb25zdCBzYWZlUmVxdWVzdHMgPSB0aGlzLm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayAtIE1hdGguY2VpbCh0aGlzLnJhdGVMaW1pdFJlc2V0SW50ZXJ2YWwgLyB0aGlzLmhlYXJ0LmludGVydmFsKSAqIDJcblxuICAgIHJldHVybiBzYWZlUmVxdWVzdHMgPCAwID8gMCA6IHNhZmVSZXF1ZXN0c1xuICB9XG5cbiAgYXN5bmMgY2hlY2tPZmZsaW5lKGhpZ2hQcmlvcml0eTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gSGlnaGVyIHByaW9yaXR5IHJlcXVlc3RzIGdldCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS5cbiAgICAgIGlmIChoaWdoUHJpb3JpdHkpIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS51bnNoaWZ0KHJlc29sdmUpXG4gICAgICBlbHNlIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5wdXNoKHJlc29sdmUpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gZGlzY29yZCBpZiBwcmVzZW50LiAqL1xuICBhc3luYyBjbG9zZShjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVxdWVzdCBmb3IgU2hhcmQgIyR7dGhpcy5pZH0gdG8gY2xvc2UgdGhlIHNvY2tldCB3aXRoIGNvZGUgJHtjb2RlfS5gKVxuXG4gICAgaWYgKHRoaXMuc29ja2V0Py5yZWFkeVN0YXRlICE9PSBOb2RlV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9J3MgcmVhZHkgc3RhdGUgaXMgJHt0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZX0sIFVuYWJsZSB0byBjbG9zZS5gKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5nb2luZ09mZmxpbmUgPSBjb2RlID09PSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLk5vcm1hbENsb3N1cmUgfHwgY29kZSA9PT0gR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Hb2luZ0F3YXlcblxuICAgIC8vIFRoaXMgaGFzIHRvIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBhY3R1YWwgY2FsbCB0byBzb2NrZXQuY2xvc2UgYXMgZm9yIGV4YW1wbGUgQnVuIGNhbGxzIHNvY2tldC5vbmNsb3NlIGltbWVkaWF0ZWx5IG9uIHRoZSAuY2xvc2UoKSBjYWxsIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gZW5kXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVBZnRlckNsb3NlID0gcmVzb2x2ZVxuICAgIH0pXG5cbiAgICB0aGlzLnNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBXYWl0aW5nIGZvciBTaGFyZCAjJHt0aGlzLmlkfSB0byBjbG9zZSB0aGUgc29ja2V0IHdpdGggY29kZSAke2NvZGV9LmApXG5cbiAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgZnVsbHkgY2xvc2VkLCBvdGhlcndpc2UgdGhlcmUnbGwgYmUgcmFjZSBjb25kaXRpb24gaXNzdWVzIGlmIHdlIHRyeSB0byBjb25uZWN0IGFnYWluLCByZXN1bHRpbmcgaW4gdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICBhd2FpdCBwcm9taXNlXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBjbG9zZWQgdGhlIHNvY2tldCB3aXRoIGNvZGUgJHtjb2RlfS5gKVxuXG4gICAgLy8gUmVzZXQgdGhlIHJlc29sdmVBZnRlckNsb3NlIGZ1bmN0aW9uIGFmdGVyIGl0IGhhcyBiZWVuIHJlc29sdmVkLlxuICAgIHRoaXMucmVzb2x2ZUFmdGVyQ2xvc2UgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKiBDb25uZWN0IHRoZSBzaGFyZCB3aXRoIHRoZSBnYXRld2F5IGFuZCBzdGFydCBoZWFydGJlYXRpbmcuIFRoaXMgd2lsbCBub3QgaWRlbnRpZnkgdGhlIHNoYXJkIHRvIHRoZSBnYXRld2F5LiAqL1xuICBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8RGlzY29yZGVub1NoYXJkPiB7XG4gICAgLy8gT25seSBzZXQgdGhlIHNoYXJkIHRvIGBDb25uZWN0aW5nYCBzdGF0ZSxcbiAgICAvLyBpZiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGRvZXMgbm90IGNvbWUgZnJvbSBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmICghW1NoYXJkU3RhdGUuSWRlbnRpZnlpbmcsIFNoYXJkU3RhdGUuUmVzdW1pbmddLmluY2x1ZGVzKHRoaXMuc3RhdGUpKSB7XG4gICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0aW5nXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gQ29ubmVjdGluZyBTaGFyZCAjJHt0aGlzLmlkfSBzb2NrZXQuYClcblxuICAgIHRoaXMuZXZlbnRzLmNvbm5lY3Rpbmc/Lih0aGlzKVxuXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmNvbm5lY3Rpb25VcmwpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3YnLCB0aGlzLmdhdGV3YXlDb25maWcudmVyc2lvbi50b1N0cmluZygpKVxuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdlbmNvZGluZycsICdqc29uJylcblxuICAgIC8vIFNldCB0aGUgY29tcHJlc3MgdXJsIHBhcmFtIGFuZCBpbml0aWFsaXplIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRleHRzXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbikge1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2NvbXByZXNzJywgdGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uKVxuXG4gICAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56bGliKSB7XG4gICAgICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGxcbiAgICAgICAgdGhpcy5pbmZsYXRlID0gY3JlYXRlSW5mbGF0ZSh7XG4gICAgICAgICAgZmluaXNoRmx1c2g6IHpsaWJDb25zdGFudHMuWl9TWU5DX0ZMVVNILFxuICAgICAgICAgIGNodW5rU2l6ZTogNjQgKiAxMDI0LFxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuaW5mbGF0ZS5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdUaGUgd2FzIGFuIGVycm9yIGluIGRlY29tcHJlc3NpbmcgYSBaTGliIGNvbXByZXNzZWQgcGF5bG9hZCcsIGUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5pbmZsYXRlLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHJldHVyblxuXG4gICAgICAgICAgaWYgKHRoaXMuaW5mbGF0ZUJ1ZmZlcikge1xuICAgICAgICAgICAgY29uc3QgbmV3QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5pbmZsYXRlQnVmZmVyLmJ5dGVMZW5ndGggKyBkYXRhLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICBuZXdCdWZmZXIuc2V0KHRoaXMuaW5mbGF0ZUJ1ZmZlcilcbiAgICAgICAgICAgIG5ld0J1ZmZlci5zZXQoZGF0YSwgdGhpcy5pbmZsYXRlQnVmZmVyLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICB0aGlzLmluZmxhdGVCdWZmZXIgPSBuZXdCdWZmZXJcblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5pbmZsYXRlQnVmZmVyID0gZGF0YVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uID09PSBUcmFuc3BvcnRDb21wcmVzc2lvbi56c3RkKSB7XG4gICAgICAgIGNvbnN0IGZ6c3RkID0gYXdhaXQgZ2V0RlpTdGQoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybignW1NoYXJkXSBcImZ6c3RkXCIgaXMgbm90IGluc3RhbGxlZC4gRGlzYWJsZWQgdHJhbnNwb3J0IGNvbXByZXNzaW9uLicpXG4gICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5kZWxldGUoJ2NvbXByZXNzJylcblxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGZ6c3RkKSB7XG4gICAgICAgICAgdGhpcy56c3RkRGVjb21wcmVzcyA9IG5ldyBmenN0ZC5EZWNvbXByZXNzKChkYXRhKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMudGV4dERlY29kZXIuZGVjb2RlKGRhdGEpXG4gICAgICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShkZWNvZGVkRGF0YSlcbiAgICAgICAgICAgIHRoaXMuZGVjb21wcmVzc2lvblByb21pc2VzUXVldWUuc2hpZnQoKT8uKHBhcnNlZERhdGEpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MgJiYgdGhpcy5nYXRld2F5Q29uZmlnLnRyYW5zcG9ydENvbXByZXNzaW9uKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdbU2hhcmRdIFBheWxvYWQgY29tcHJlc3Npb24gaGFzIGJlZW4gZGlzYWJsZWQgc2luY2UgdHJhbnNwb3J0IGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgYXMgd2VsbC4nKVxuICAgICAgdGhpcy5nYXRld2F5Q29uZmlnLmNvbXByZXNzID0gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBXZSBjaGVjayBmb3IgYnVpbHQtaW4gV2ViU29ja2V0IGltcGxlbWVudGF0aW9ucyBpbiBCdW4gb3IgRGVubywgTm9kZUpTIHYyMiBoYXMgYW4gaW1wbGVtZW50YXRpb24gdG9vIGJ1dCBpdCBzZWVtcyB0byBiZSBsZXNzIG9wdGltaXplZCBzbyBmb3Igbm93IGl0IGlzIGJldHRlciB0byB1c2UgdGhlIHdzIG5wbSBwYWNrYWdlXG4gICAgY29uc3Qgc2hvdWxkVXNlQnVpbHRpbiA9IFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdXZWJTb2NrZXQnKSAmJiAoUmVmbGVjdC5oYXMoZ2xvYmFsVGhpcywgJ0J1bicpIHx8IFJlZmxlY3QuaGFzKGdsb2JhbFRoaXMsICdEZW5vJykpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE5vZGVXZWJTb2NrZXQgZG9lc24ndCBzdXBwb3J0IFwiZGlzcGF0Y2hFdmVudFwiLCBhbmQgd2hpbGUgd2UgZG9uJ3QgdXNlIGl0LCBpdCBpcyByZXF1aXJlZCBvbiB0aGUgXCJXZWJTb2NrZXRcIiB0eXBlXG4gICAgY29uc3Qgc29ja2V0OiBXZWJTb2NrZXQgPSBzaG91bGRVc2VCdWlsdGluID8gbmV3IFdlYlNvY2tldCh1cmwpIDogbmV3IE5vZGVXZWJTb2NrZXQodXJsKVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG5cbiAgICAvLyBCeSBkZWZhdWx0IFdlYlNvY2tldCB3aWxsIGdpdmUgdXMgYSBCbG9iLCB0aGlzIGNoYW5nZXMgaXQgc28gdGhhdCBpdCBnaXZlcyB1cyBhbiBBcnJheUJ1ZmZlclxuICAgIHNvY2tldC5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJ1xuXG4gICAgc29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXZlbnQpXG4gICAgc29ja2V0Lm9uY2xvc2UgPSAoY2xvc2VFdmVudCkgPT4gdGhpcy5oYW5kbGVDbG9zZShjbG9zZUV2ZW50KVxuICAgIHNvY2tldC5vbm1lc3NhZ2UgPSAobWVzc2FnZUV2ZW50KSA9PiB0aGlzLmhhbmRsZU1lc3NhZ2UobWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAvLyBPbmx5IHNldCB0aGUgc2hhcmQgdG8gYFVuaWRlbnRpZmllZGAgc3RhdGUgaWYgdGhlIGNvbm5lY3Rpb24gcmVxdWVzdCBkb2VzIG5vdCBjb21lIGZyb20gYW4gaWRlbnRpZnkgb3IgcmVzdW1lIGFjdGlvbi5cbiAgICAgICAgaWYgKCFbU2hhcmRTdGF0ZS5JZGVudGlmeWluZywgU2hhcmRTdGF0ZS5SZXN1bWluZ10uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5VbmlkZW50aWZpZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IHNvY2tldCBjb25uZWN0ZWQuYClcblxuICAgICAgICB0aGlzLmV2ZW50cy5jb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJlc29sdmUodGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aWZ5IHRoZSBzaGFyZCB0byB0aGUgZ2F0ZXdheS4gSWYgbm90IGNvbm5lY3RlZCwgdGhpcyB3aWxsIGFsc28gY29ubmVjdCB0aGUgc2hhcmQgdG8gdGhlIGdhdGV3YXkuXG4gICAqIEBwYXJhbSBieXBhc3NSZXF1ZXN0IC0gV2hldGhlciB0byBieXBhc3MgdGhlIHJlcXVlc3RJZGVudGlmeSBoYW5kbGVyIGFuZCBpZGVudGlmeSBpbW1lZGlhdGVseS4gVGhpcyBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHkgYXMgaXQgY2FuIGNhdXNlIGludmFsaWQgc2Vzc2lvbnMuXG4gICAqL1xuICBhc3luYyBpZGVudGlmeShieXBhc3NSZXF1ZXN0ID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIG5ldyBpZGVudGlmeSBoYXMgYmVlbiByZXF1ZXN0ZWQgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYWxyZWFkeSBhIGNvbm5lY3Rpb24gb3Blbi5cbiAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBjbG9zZSB0aGUgb2xkIGNvbm5lY3Rpb24gYW5kIGhlYXJ0YmVhdGluZyBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBJZGVudGlmeWluZyBvcGVuIFNoYXJkICMke3RoaXMuaWR9LCBjbG9zaW5nIHRoZSBjb25uZWN0aW9uYClcbiAgICAgIGF3YWl0IHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlJlSWRlbnRpZnlpbmcsICdSZS1pZGVudGlmeWluZyBjbG9zdXJlIG9mIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgaWYgKCFieXBhc3NSZXF1ZXN0KSB7XG4gICAgICBhd2FpdCB0aGlzLnJlcXVlc3RJZGVudGlmeSgpXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuSWRlbnRpZnlpbmdcbiAgICB0aGlzLmV2ZW50cy5pZGVudGlmeWluZz8uKHRoaXMpXG5cbiAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzaGFyZCBpcyBpbiBIZWFydGJlYXRpbmcgc3RhdGUgYnV0IG5vdCBpZGVudGlmaWVkLFxuICAgIC8vIHNvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIGdhdGV3YXkgY29ubmVjdGlvbiBleGlzdGluZy5cbiAgICAvLyBJZiBub3Qgd2UgbmVlZCB0byBjcmVhdGUgb25lIGJlZm9yZSB3ZSBpZGVudGlmeS5cbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2VuZGluZyBJZGVudGlmeSBwYXlsb2FkIGZvciBTaGFyZCAjJHt0aGlzLmlkfS5gKVxuXG4gICAgdGhpcy5zZW5kKFxuICAgICAge1xuICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSWRlbnRpZnksXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIGNvbXByZXNzOiB0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MsXG4gICAgICAgICAgcHJvcGVydGllczogdGhpcy5nYXRld2F5Q29uZmlnLnByb3BlcnRpZXMsXG4gICAgICAgICAgaW50ZW50czogdGhpcy5nYXRld2F5Q29uZmlnLmludGVudHMsXG4gICAgICAgICAgc2hhcmQ6IFt0aGlzLmlkLCB0aGlzLmdhdGV3YXlDb25maWcudG90YWxTaGFyZHNdLFxuICAgICAgICAgIHByZXNlbmNlOiBhd2FpdCB0aGlzLm1ha2VQcmVzZW5jZSgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWUsXG4gICAgKVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVzLnNldCgnUkVBRFknLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmlkZW50aWZpZWQ/Lih0aGlzKVxuICAgICAgICByZXNvbHZlKClcbiAgICAgIH0pXG4gICAgICAvLyBXaGVuIGlkZW50aWZ5aW5nIHRvbyBmYXN0LCBEaXNjb3JkIHNlbmRzIGFuIGludmFsaWQgc2Vzc2lvbiBwYXlsb2FkLlxuICAgICAgLy8gVGhpcyBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgdGhvdWdoIGFuZCB0aGUgc2hhcmQgc3RhcnRzIGEgbmV3IGlkZW50aWZ5IGFjdGlvbi5cbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdJTlZBTElEX1NFU1NJT04nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gdG8gRGlzY29yZCBpcyBjdXJyZW50bHkgb3Blbi4gKi9cbiAgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSA9PT0gTm9kZVdlYlNvY2tldC5PUEVOXG4gIH1cblxuICAvKiogQXR0ZW1wdCB0byByZXN1bWUgdGhlIHByZXZpb3VzIHNoYXJkcyBzZXNzaW9uIHdpdGggdGhlIGdhdGV3YXkuICovXG4gIGFzeW5jIHJlc3VtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfWApXG5cbiAgICAvLyBJdCBoYXMgYmVlbiByZXF1ZXN0ZWQgdG8gcmVzdW1lIHRoZSBTaGFyZHMgc2Vzc2lvbi5cbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHNoYXJkIGlzIHN0aWxsIGNvbm5lY3RlZCB3aXRoIERpc2NvcmQncyBnYXRld2F5IHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGZvcmNlZnVsbHkgY2xvc2UgaXQuXG4gICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlc3VtaW5nIG9wZW4gU2hhcmQgIyR7dGhpcy5pZH0sIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb25gKVxuICAgICAgYXdhaXQgdGhpcy5jbG9zZShTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb24sICdSZWNvbm5lY3RpbmcgdGhlIHNoYXJkLCBjbG9zaW5nIG9sZCBjb25uZWN0aW9uLicpXG4gICAgfVxuXG4gICAgLy8gU2hhcmQgaGFzIG5ldmVyIGlkZW50aWZpZWQsIHNvIHdlIGNhbm5vdCByZXN1bWUuXG4gICAgaWYgKCF0aGlzLnNlc3Npb25JZCkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gVHJ5aW5nIHRvIHJlc3VtZSBTaGFyZCAjJHt0aGlzLmlkfSB3aXRob3V0IHRoZSBzZXNzaW9uIGlkLiBJZGVudGlmeWluZyB0aGUgc2hhcmQgaW5zdGVhZC5gKVxuXG4gICAgICBhd2FpdCB0aGlzLmlkZW50aWZ5KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlJlc3VtaW5nXG5cbiAgICAvLyBCZWZvcmUgd2UgY2FuIHJlc3VtZSwgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiB3aXRoIERpc2NvcmQncyBnYXRld2F5LlxuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBSZXN1bWluZyBTaGFyZCAjJHt0aGlzLmlkfSBjb25uZWN0ZWQuIFNlc3Npb24gaWQ6ICR7dGhpcy5zZXNzaW9uSWR9IHwgU2VxdWVuY2U6ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWApXG5cbiAgICB0aGlzLnNlbmQoXG4gICAgICB7XG4gICAgICAgIG9wOiBHYXRld2F5T3Bjb2Rlcy5SZXN1bWUsXG4gICAgICAgIGQ6IHtcbiAgICAgICAgICB0b2tlbjogYEJvdCAke3RoaXMuZ2F0ZXdheUNvbmZpZy50b2tlbn1gLFxuICAgICAgICAgIHNlc3Npb25faWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIHNlcTogdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyID8/IDAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdSRVNVTUVEJywgKCkgPT4gcmVzb2x2ZSgpKVxuXG4gICAgICAvLyBJZiBpdCBpcyBhdHRlbXB0ZWQgdG8gcmVzdW1lIHdpdGggYW4gaW52YWxpZCBzZXNzaW9uIGlkLCBEaXNjb3JkIHNlbmRzIGFuIGludmFsaWQgc2Vzc2lvbiBwYXlsb2FkXG4gICAgICAvLyBOb3QgZXJyb3JpbmcgaGVyZSBzaW5jZSBpdCBpcyBlYXN5IHRoYXQgdGhpcyBoYXBwZW5zLCBhbHNvIGl0IHdvdWxkIGJlIG5vdCBjYXRjaGFibGVcbiAgICAgIHRoaXMucmVzb2x2ZXMuc2V0KCdJTlZBTElEX1NFU1NJT04nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRVNVTUVEJylcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIG1lc3NhZ2UgdG8gRGlzY29yZC5cbiAgICogQHBhcmFtIGhpZ2hQcmlvcml0eSAtIFdoZXRoZXIgdGhpcyBtZXNzYWdlIHNob3VsZCBiZSBzZW5kIGFzYXAuXG4gICAqL1xuICBhc3luYyBzZW5kKG1lc3NhZ2U6IFNoYXJkU29ja2V0UmVxdWVzdCwgaGlnaFByaW9yaXR5OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBCZWZvcmUgYWNxdWlyaW5nIGEgdG9rZW4gZnJvbSB0aGUgYnVja2V0LCBjaGVjayB3aGV0aGVyIHRoZSBzaGFyZCBpcyBjdXJyZW50bHkgb2ZmbGluZSBvciBub3QuXG4gICAgLy8gRWxzZSBidWNrZXQgYW5kIHRva2VuIHdhaXQgdGltZSBqdXN0IGdldCB3YXN0ZWQuXG4gICAgYXdhaXQgdGhpcy5jaGVja09mZmxpbmUoaGlnaFByaW9yaXR5KVxuXG4gICAgYXdhaXQgdGhpcy5idWNrZXQuYWNxdWlyZShoaWdoUHJpb3JpdHkpXG5cbiAgICAvLyBJdCdzIHBvc3NpYmxlLCB0aGF0IHRoZSBzaGFyZCB3ZW50IG9mZmxpbmUgYWZ0ZXIgYSB0b2tlbiBoYXMgYmVlbiBhY3F1aXJlZCBmcm9tIHRoZSBidWNrZXQuXG4gICAgYXdhaXQgdGhpcy5jaGVja09mZmxpbmUoaGlnaFByaW9yaXR5KVxuXG4gICAgdGhpcy5zb2NrZXQ/LnNlbmQoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpXG4gIH1cblxuICAvKiogU2h1dGRvd24gdGhlIHRoaXMuIEZvcmNlZnVsbHkgZGlzY29ubmVjdCB0aGUgc2hhcmQgZnJvbSBEaXNjb3JkLiBUaGUgc2hhcmQgbWF5IG5vdCBhdHRlbXB0IHRvIHJlY29ubmVjdCB3aXRoIERpc2NvcmQuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xvc2UoU2hhcmRTb2NrZXRDbG9zZUNvZGVzLlNodXRkb3duLCAnU2hhcmQgc2h1dHRpbmcgZG93bi4nKVxuICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLk9mZmxpbmVcbiAgfVxuXG4gIC8qKiBIYW5kbGUgYSBnYXRld2F5IGNvbm5lY3Rpb24gZXJyb3IgKi9cbiAgaGFuZGxlRXJyb3IoZXJyb3I6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZXJyb3IoYFtTaGFyZF0gVGhlcmUgd2FzIGFuIGVycm9yIGNvbm5lY3RpbmcgU2hhcmQgIyR7dGhpcy5pZH0uYCwgZXJyb3IpXG4gIH1cblxuICAvKiogSGFuZGxlIGEgZ2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlLiAqL1xuICBhc3luYyBoYW5kbGVDbG9zZShjbG9zZTogQ2xvc2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc29ja2V0ID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zdG9wSGVhcnRiZWF0aW5nKClcblxuICAgIC8vIENsZWFyIHRoZSB6bGliL3pzdGQgZGF0YVxuICAgIHRoaXMuaW5mbGF0ZSA9IHVuZGVmaW5lZFxuICAgIHRoaXMuenN0ZERlY29tcHJlc3MgPSB1bmRlZmluZWRcbiAgICB0aGlzLmluZmxhdGVCdWZmZXIgPSBudWxsXG4gICAgdGhpcy5kZWNvbXByZXNzaW9uUHJvbWlzZXNRdWV1ZSA9IFtdXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBjbG9zZWQgd2l0aCBjb2RlICR7Y2xvc2UuY29kZX0ke2Nsb3NlLnJlYXNvbiA/IGAsIGFuZCByZWFzb246ICR7Y2xvc2UucmVhc29ufWAgOiAnJ30uYClcblxuICAgIC8vIFJlc29sdmUgdGhlIGNsb3NlIHByb21pc2UgaWYgaXQgZXhpc3RzXG4gICAgdGhpcy5yZXNvbHZlQWZ0ZXJDbG9zZT8uKGNsb3NlKVxuXG4gICAgc3dpdGNoIChjbG9zZS5jb2RlKSB7XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5UZXN0aW5nRmluaXNoZWQ6IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuT2ZmbGluZVxuICAgICAgICB0aGlzLmV2ZW50cy5kaXNjb25uZWN0ZWQ/Lih0aGlzKVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gT24gdGhlc2UgY29kZXMgYSBtYW51YWwgc3RhcnQgd2lsbCBiZSBkb25lLlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuU2h1dGRvd246XG4gICAgICBjYXNlIFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5SZUlkZW50aWZ5aW5nOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzaGFyZGVkOlxuICAgICAgY2FzZSBTaGFyZFNvY2tldENsb3NlQ29kZXMuUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb246IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuRGlzY29ubmVjdGVkXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBXaGVuIHRoZXNlIGNvZGVzIGFyZSByZWNlaXZlZCBzb21ldGhpbmcgd2VudCByZWFsbHkgd3JvbmcuXG4gICAgICAvLyBPbiB0aG9zZSB3ZSBjYW5ub3Qgc3RhcnQgYSByZWNvbm5lY3QgYXR0ZW1wdC5cbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5BdXRoZW50aWNhdGlvbkZhaWxlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkU2hhcmQ6XG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuU2hhcmRpbmdSZXF1aXJlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkQXBpVmVyc2lvbjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkSW50ZW50czpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5EaXNhbGxvd2VkSW50ZW50czoge1xuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5PZmZsaW5lXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNsb3NlLnJlYXNvbiB8fCAnRGlzY29yZCBnYXZlIG5vIHJlYXNvbiEgR0chIFlvdSBicm9rZSBEaXNjb3JkIScpXG4gICAgICB9XG4gICAgICAvLyBHYXRld2F5IGNvbm5lY3Rpb24gY2xvc2VzIHdoaWNoIHJlcXVpcmUgYSBuZXcgaWRlbnRpZnkuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuTm90QXV0aGVudGljYXRlZDpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5JbnZhbGlkU2VxOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlNlc3Npb25UaW1lZE91dDoge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgW1NoYXJkXSBTaGFyZCAjJHt0aGlzLmlkfSBjbG9zZWQgcmVxdWlyaW5nIHJlLWlkZW50aWZ5LmApXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLklkZW50aWZ5aW5nXG4gICAgICAgIHRoaXMuZXZlbnRzLmRpc2Nvbm5lY3RlZD8uKHRoaXMpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5pZGVudGlmeSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gTk9URTogVGhpcyBjYXNlIG11c3QgYWx3YXlzIGJlIHJpZ2h0IGFib3ZlIHRoZSBjYXNlcyB0aGF0IHJ1bnMgd2l0aCBkZWZhdWx0IGNhc2UgYmVjYXVzZSBvZiBob3cgc3dpdGNoIHdvcmtzIHdoZW4geW91IGRvbid0IGJyZWFrIC8gcmV0dXJuLCBtb3JlIGluZm8gYmVsb3cuXG4gICAgICBjYXNlIEdhdGV3YXlDbG9zZUV2ZW50Q29kZXMuTm9ybWFsQ2xvc3VyZTpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Hb2luZ0F3YXk6IHtcbiAgICAgICAgLy8gSWYgdGhlIHNoYXJkIGlzIG1hcmtlZCBhcyBnb2luZ09mZmxpbmUsIGl0IHN0YXlzIGRpc2Nvbm5lY3RlZC5cbiAgICAgICAgaWYgKHRoaXMuZ29pbmdPZmZsaW5lKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IFNoYXJkU3RhdGUuRGlzY29ubmVjdGVkXG4gICAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICAgIHRoaXMuZ29pbmdPZmZsaW5lID0gZmFsc2VcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSB3YW50IHRoZSBzaGFyZCB0byBnbyB0aHJvdWdoIHRoZSBkZWZhdWx0IGNhc2Ugd2hlcmUgaXQgZ2V0cyByZXN1bWVkLCBhcyBpdCBtaWdodCBiZSBhbiB1bmV4cGVjdGVkIGNsb3N1cmUgZnJvbSBEaXNjb3JkIG9yIENsb3VkZmxhcmUgZm9yIGV4YW1wbGUsIHNvIHdlIGRvbid0IHVzZSBicmVhayAvIHJldHVybiBoZXJlLlxuICAgICAgfVxuICAgICAgLy8gR2F0ZXdheSBjb25uZWN0aW9uIGNsb3NlcyBvbiB3aGljaCBhIHJlc3VtZSBpcyBhbGxvd2VkLlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlVua25vd25FcnJvcjpcbiAgICAgIGNhc2UgR2F0ZXdheUNsb3NlRXZlbnRDb2Rlcy5Vbmtub3duT3Bjb2RlOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkRlY29kZUVycm9yOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLlJhdGVMaW1pdGVkOlxuICAgICAgY2FzZSBHYXRld2F5Q2xvc2VFdmVudENvZGVzLkFscmVhZHlBdXRoZW50aWNhdGVkOlxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGdldCBpbnRvIGFuIGluZmluaXRlIGxvb3Agd2hlcmUgd2UgcmVzdW1lIGZvcmV2ZXIsIHNvIGlmIHdlIHdlcmUgYWxyZWFkeSByZXN1bWluZyB3ZSBpZGVudGlmeSBpbnN0ZWFkXG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlID09PSBTaGFyZFN0YXRlLlJlc3VtaW5nID8gU2hhcmRTdGF0ZS5JZGVudGlmeWluZyA6IFNoYXJkU3RhdGUuUmVzdW1pbmdcbiAgICAgICAgdGhpcy5ldmVudHMuZGlzY29ubmVjdGVkPy4odGhpcylcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gU2hhcmRTdGF0ZS5SZXN1bWluZykge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmlkZW50aWZ5KClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBIYW5kbGUgYW4gaW5jb21pbmcgZ2F0ZXdheSBtZXNzYWdlLiAqL1xuICBhc3luYyBoYW5kbGVNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFRoZSB3cyBucG0gcGFja2FnZSB3aWxsIHVzZSBhIEJ1ZmZlciwgd2hpbGUgdGhlIGdsb2JhbCBidWlsdC1pbiB3aWxsIHVzZSBBcnJheUJ1ZmZlclxuICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IG1lc3NhZ2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IG1lc3NhZ2UuZGF0YSBpbnN0YW5jZW9mIEJ1ZmZlclxuXG4gICAgY29uc3QgZGF0YSA9IGlzQ29tcHJlc3NlZCA/IGF3YWl0IHRoaXMuZGVjb21wcmVzc1BhY2tldChtZXNzYWdlLmRhdGEpIDogKEpTT04ucGFyc2UobWVzc2FnZS5kYXRhKSBhcyBEaXNjb3JkR2F0ZXdheVBheWxvYWQpXG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZGVjb21wcmVzc2lvbiB3YXMgbm90IHN1Y2Nlc3NmdWxcbiAgICBpZiAoIWRhdGEpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVEaXNjb3JkUGFja2V0KGRhdGEpXG4gIH1cblxuICAvKipcbiAgICogRGVjb21wcmVzcyBhIHpsaWIvenN0ZCBjb21wcmVzc2VkIHBhY2tldFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYXN5bmMgZGVjb21wcmVzc1BhY2tldChkYXRhOiBBcnJheUJ1ZmZlciB8IEJ1ZmZlcik6IFByb21pc2U8RGlzY29yZEdhdGV3YXlQYXlsb2FkIHwgbnVsbD4ge1xuICAgIC8vIEEgYnVmZmVyIGlzIGEgVWludDhBcnJheSB1bmRlciB0aGUgaG9vZC4gQW4gQXJyYXlCdWZmZXIgaXMgZ2VuZXJpYywgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlIFVpbnQ4QXJyYXkgdGhhdCB1c2VzIHRoZSB3aG9sZSBBcnJheUJ1ZmZlclxuICAgIGNvbnN0IGNvbXByZXNzZWREYXRhOiBVaW50OEFycmF5ID0gZGF0YSBpbnN0YW5jZW9mIEJ1ZmZlciA/IGRhdGEgOiBuZXcgVWludDhBcnJheShkYXRhKVxuXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbiA9PT0gVHJhbnNwb3J0Q29tcHJlc3Npb24uemxpYikge1xuICAgICAgaWYgKCF0aGlzLmluZmxhdGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZmF0YWwoJ1tTaGFyZF0gemxpYi1zdHJlYW0gdHJhbnNwb3J0IGNvbXByZXNzaW9uIHdhcyBlbmFibGVkIGJ1dCBubyBpbnN0YW5jZSBvZiBJbmZsYXRlIHdhcyBmb3VuZC4nKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICAvLyBBbGlhcywgdXNlZCB0byBhdm9pZCBzb21lIG51bGwgY2hlY2tzIGluIHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yXG4gICAgICBjb25zdCBpbmZsYXRlID0gdGhpcy5pbmZsYXRlXG5cbiAgICAgIGNvbnN0IHdyaXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaW5mbGF0ZS53cml0ZShjb21wcmVzc2VkRGF0YSwgJ2JpbmFyeScsIChlcnJvcikgPT4gKGVycm9yID8gcmVqZWN0KGVycm9yKSA6IHJlc29sdmUoKSkpXG4gICAgICB9KVxuXG4gICAgICBpZiAoIWVuZHNXaXRoTWFya2VyKGNvbXByZXNzZWREYXRhLCBaTElCX1NZTkNfRkxVU0gpKSByZXR1cm4gbnVsbFxuXG4gICAgICBhd2FpdCB3cml0ZVByb21pc2VcblxuICAgICAgaWYgKCF0aGlzLmluZmxhdGVCdWZmZXIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignW1NoYXJkXSBUaGUgWkxpYiBpbmZsYXRlIGJ1ZmZlciB3YXMgY2xlYXJlZCBhdCBhbiB1bmV4cGVjdGVkIG1vbWVudC4nKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMudGV4dERlY29kZXIuZGVjb2RlKHRoaXMuaW5mbGF0ZUJ1ZmZlcilcbiAgICAgIHRoaXMuaW5mbGF0ZUJ1ZmZlciA9IG51bGxcblxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZERhdGEpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2F0ZXdheUNvbmZpZy50cmFuc3BvcnRDb21wcmVzc2lvbiA9PT0gVHJhbnNwb3J0Q29tcHJlc3Npb24uenN0ZCkge1xuICAgICAgaWYgKCF0aGlzLnpzdGREZWNvbXByZXNzKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmZhdGFsKCdbU2hhcmRdIHpzdGQtc3RyZWFtIHRyYW5zcG9ydCBjb21wcmVzc2lvbiB3YXMgZW5hYmxlZCBidXQgbm8gaW5zdGFuY2Ugb2YgRGVjb21wcmVzcyB3YXMgZm91bmQuJylcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cblxuICAgICAgdGhpcy56c3RkRGVjb21wcmVzcy5wdXNoKGNvbXByZXNzZWREYXRhKVxuXG4gICAgICBjb25zdCBkZWNvbXByZXNzaW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPERpc2NvcmRHYXRld2F5UGF5bG9hZD4oKHIpID0+IHRoaXMuZGVjb21wcmVzc2lvblByb21pc2VzUXVldWUucHVzaChyKSlcbiAgICAgIHJldHVybiBhd2FpdCBkZWNvbXByZXNzaW9uUHJvbWlzZVxuICAgIH1cblxuICAgIGlmICh0aGlzLmdhdGV3YXlDb25maWcuY29tcHJlc3MpIHtcbiAgICAgIGNvbnN0IGRlY29tcHJlc3NlZCA9IGluZmxhdGVTeW5jKGNvbXByZXNzZWREYXRhKVxuICAgICAgY29uc3QgZGVjb2RlZERhdGEgPSB0aGlzLnRleHREZWNvZGVyLmRlY29kZShkZWNvbXByZXNzZWQpXG5cbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWREYXRhKVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKiogSGFuZGxlcyBhIGluY29taW5nIGdhdGV3YXkgcGFja2V0LiAqL1xuICBhc3luYyBoYW5kbGVEaXNjb3JkUGFja2V0KHBhY2tldDogRGlzY29yZEdhdGV3YXlQYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRWRnZSBjYXNlIHN0YXJ0OiBodHRwczovL2dpdGh1Yi5jb20vZGlzY29yZGVuby9kaXNjb3JkZW5vL2lzc3Vlcy8yMzExXG4gICAgdGhpcy5oZWFydC5sYXN0QWNrID0gRGF0ZS5ub3coKVxuICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gdHJ1ZVxuICAgIC8vIEVkZ2UgY2FzZSBlbmQhXG5cbiAgICBzd2l0Y2ggKHBhY2tldC5vcCkge1xuICAgICAgY2FzZSBHYXRld2F5T3Bjb2Rlcy5IZWFydGJlYXQ6IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbigpKSByZXR1cm5cblxuICAgICAgICB0aGlzLmhlYXJ0Lmxhc3RCZWF0ID0gRGF0ZS5ub3coKVxuICAgICAgICAvLyBEaXNjb3JkIHJhbmRvbWx5IHNlbmRzIHRoaXMgcmVxdWlyaW5nIGFuIGltbWVkaWF0ZSBoZWFydGJlYXQgYmFjay5cbiAgICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXQ/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlbGxvOiB7XG4gICAgICAgIGNvbnN0IGludGVydmFsID0gKHBhY2tldC5kIGFzIERpc2NvcmRIZWxsbykuaGVhcnRiZWF0X2ludGVydmFsXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IHJlY2VpdmVkIEhlbGxvYClcbiAgICAgICAgdGhpcy5zdGFydEhlYXJ0YmVhdGluZyhpbnRlcnZhbClcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU2hhcmRTdGF0ZS5SZXN1bWluZykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRRdWV1ZSA9IFsuLi50aGlzLmJ1Y2tldC5xdWV1ZV1cbiAgICAgICAgICAvLyBIRUxMTyBoYXMgYmVlbiBzZW5kIG9uIGEgbm9uIHJlc3VtZSBhY3Rpb24uXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBzaGFyZCBzdGFydHMgYSBuZXcgc2Vzc2lvbixcbiAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIHJhdGUgbGltaXQgaW50ZXJ2YWwgaGFzIGJlZW4gcmVzZXQgdG9vLlxuICAgICAgICAgIHRoaXMuYnVja2V0ID0gbmV3IExlYWt5QnVja2V0KHtcbiAgICAgICAgICAgIG1heDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICAgIHJlZmlsbEludGVydmFsOiA2MDAwMCxcbiAgICAgICAgICAgIHJlZmlsbEFtb3VudDogdGhpcy5jYWxjdWxhdGVTYWZlUmVxdWVzdHMoKSxcbiAgICAgICAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIFF1ZXVlIHNob3VsZCBub3QgYmUgbG9zdCBvbiBhIHJlLWlkZW50aWZ5LlxuICAgICAgICAgIHRoaXMuYnVja2V0LnF1ZXVlLnVuc2hpZnQoLi4uY3VycmVudFF1ZXVlKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuaGVsbG8/Lih0aGlzKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdEFDSzoge1xuICAgICAgICAvLyBNYW51YWxseSBjYWxjdWxhdGluZyB0aGUgcm91bmQgdHJpcCB0aW1lIGZvciB1c2VycyB3aG8gbmVlZCBpdC5cbiAgICAgICAgaWYgKHRoaXMuaGVhcnQubGFzdEJlYXQpIHtcbiAgICAgICAgICB0aGlzLmhlYXJ0LnJ0dCA9IHRoaXMuaGVhcnQubGFzdEFjayAtIHRoaXMuaGVhcnQubGFzdEJlYXRcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmhlYXJ0YmVhdEFjaz8uKHRoaXMpXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheU9wY29kZXMuUmVjb25uZWN0OiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFJlY2VpdmVkIGEgUmVjb25uZWN0IGZvciBTaGFyZCAjJHt0aGlzLmlkfWApXG4gICAgICAgIHRoaXMuZXZlbnRzLnJlcXVlc3RlZFJlY29ubmVjdD8uKHRoaXMpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZXN1bWUoKVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlPcGNvZGVzLkludmFsaWRTZXNzaW9uOiB7XG4gICAgICAgIGNvbnN0IHJlc3VtYWJsZSA9IHBhY2tldC5kIGFzIGJvb2xlYW5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gUmVjZWl2ZWQgSW52YWxpZCBTZXNzaW9uIGZvciBTaGFyZCAjJHt0aGlzLmlkfSB3aXRoIHJlc3VtYWJsZSBhcyAke3Jlc3VtYWJsZX1gKVxuXG4gICAgICAgIHRoaXMuZXZlbnRzLmludmFsaWRTZXNzaW9uPy4odGhpcywgcmVzdW1hYmxlKVxuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgYSByYW5kb20gYW1vdW50IG9mIHRpbWUgYmV0d2VlbiAxIGFuZCA1XG4gICAgICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL2dhdGV3YXkjcmVzdW1pbmdcbiAgICAgICAgYXdhaXQgZGVsYXkoTWF0aC5mbG9vcigoTWF0aC5yYW5kb20oKSAqIDQgKyAxKSAqIDEwMDApKVxuXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZ2V0KCdJTlZBTElEX1NFU1NJT04nKT8uKHBhY2tldClcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ0lOVkFMSURfU0VTU0lPTicpXG5cbiAgICAgICAgLy8gV2hlbiByZXN1bWFibGUgaXMgZmFsc2Ugd2UgbmVlZCB0byByZS1pZGVudGlmeVxuICAgICAgICBpZiAoIXJlc3VtYWJsZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaWRlbnRpZnkoKVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBzZXNzaW9uIGlzIGludmFsaWQgYnV0IGFwcGFyZW50bHkgaXQgaXMgcmVzdW1hYmxlXG4gICAgICAgIGF3YWl0IHRoaXMucmVzdW1lKClcblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAocGFja2V0LnQpIHtcbiAgICAgIGNhc2UgJ1JFU1VNRUQnOlxuICAgICAgICB0aGlzLnN0YXRlID0gU2hhcmRTdGF0ZS5Db25uZWN0ZWRcbiAgICAgICAgdGhpcy5ldmVudHMucmVzdW1lZD8uKHRoaXMpXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gU2hhcmQgIyR7dGhpcy5pZH0gcmVjZWl2ZWQgUkVTVU1FRGApXG5cbiAgICAgICAgLy8gQ29udGludWUgdGhlIHJlcXVlc3RzIHdoaWNoIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlIHNoYXJkIHdlbnQgb2ZmbGluZS5cbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmZvckVhY2goKHJlc29sdmUpID0+IHJlc29sdmUoKSlcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgbGVuZ3RoIHRvIDAgd2lsbCBkZWxldGUgdGhlIGVsZW1lbnRzIGluIGl0XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5sZW5ndGggPSAwXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFU1VNRUQnKT8uKHBhY2tldClcbiAgICAgICAgdGhpcy5yZXNvbHZlcy5kZWxldGUoJ1JFU1VNRUQnKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnUkVBRFknOiB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBEaXNjb3JkUmVhZHlcblxuICAgICAgICAvLyBJbXBvcnRhbnQgZm9yIGZ1dHVyZSByZXN1bWVzLlxuICAgICAgICB0aGlzLnJlc3VtZUdhdGV3YXlVcmwgPSBwYXlsb2FkLnJlc3VtZV9nYXRld2F5X3VybFxuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHBheWxvYWQuc2Vzc2lvbl9pZFxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLkNvbm5lY3RlZFxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IHJlY2VpdmVkIFJFQURZYClcblxuICAgICAgICAvLyBDb250aW51ZSB0aGUgcmVxdWVzdHMgd2hpY2ggaGF2ZSBiZWVuIHF1ZXVlZCBzaW5jZSB0aGUgc2hhcmQgd2VudCBvZmZsaW5lLlxuICAgICAgICAvLyBJbXBvcnRhbnQgd2hlbiB0aGlzIGlzIGEgcmUtaWRlbnRpZnlcbiAgICAgICAgdGhpcy5vZmZsaW5lU2VuZFF1ZXVlLmZvckVhY2goKHJlc29sdmUpID0+IHJlc29sdmUoKSlcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgbGVuZ3RoIHRvIDAgd2lsbCBkZWxldGUgdGhlIGVsZW1lbnRzIGluIGl0XG4gICAgICAgIHRoaXMub2ZmbGluZVNlbmRRdWV1ZS5sZW5ndGggPSAwXG5cbiAgICAgICAgdGhpcy5yZXNvbHZlcy5nZXQoJ1JFQURZJyk/LihwYWNrZXQpXG4gICAgICAgIHRoaXMucmVzb2x2ZXMuZGVsZXRlKCdSRUFEWScpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgcHJlc2VudFxuICAgIC8vIGBzYCBjYW4gYmUgZWl0aGVyIGBudWxsYCBvciBhIGBudW1iZXJgLlxuICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgdXBkYXRlIG1pc3NlcyB3aGVuIGBzYCBpcyBgMGAgd2UgY2hlY2sgYWdhaW5zdCBudWxsLlxuICAgIGlmIChwYWNrZXQucyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyID0gcGFja2V0LnNcbiAgICB9XG5cbiAgICB0aGlzLmZvcndhcmRUb0JvdChwYWNrZXQpXG4gIH1cblxuICBmb3J3YXJkVG9Cb3QocGFja2V0OiBEaXNjb3JkR2F0ZXdheVBheWxvYWQpOiB2b2lkIHtcbiAgICAvLyBUaGUgbmVjZXNzYXJ5IGhhbmRsaW5nIHJlcXVpcmVkIGZvciB0aGUgU2hhcmRzIGNvbm5lY3Rpb24gaGFzIGJlZW4gZmluaXNoZWQuXG4gICAgLy8gTm93IHRoZSBldmVudCBjYW4gYmUgc2FmZWx5IGZvcndhcmRlZC5cbiAgICB0aGlzLmV2ZW50cy5tZXNzYWdlPy4odGhpcywgY2FtZWxpemUocGFja2V0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBvcmRlciB0byBtYWtlIHRoZSBzaGFyZHMgcHJlc2VuY2UuXG4gICAqIGFzeW5jIGluIGNhc2UgZGV2cyBjcmVhdGUgdGhlIHByZXNlbmNlIGJhc2VkIG9uIGVnLiBkYXRhYmFzZSB2YWx1ZXMuXG4gICAqIFBhc3NpbmcgdGhlIHNoYXJkJ3MgaWQgdGhlcmUgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHRoZSBkZXYgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXG4gICAqL1xuICBhc3luYyBtYWtlUHJlc2VuY2UoKTogUHJvbWlzZTxEaXNjb3JkVXBkYXRlUHJlc2VuY2UgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGNvbW11bmljYXRlcyB3aXRoIHRoZSBtYW5hZ2VtZW50IHByb2Nlc3MsIGluIG9yZGVyIHRvIGtub3cgd2hldGhlciBpdHMgZnJlZSB0byBpZGVudGlmeS5cbiAgICogV2hlbiB0aGlzIGZ1bmN0aW9uIHJlc29sdmVzLCB0aGlzIG1lYW5zIHRoYXQgdGhlIHNoYXJkIGlzIGFsbG93ZWQgdG8gc2VuZCBhbiBpZGVudGlmeSBwYXlsb2FkIHRvIGRpc2NvcmQuXG4gICAqL1xuICBhc3luYyByZXF1ZXN0SWRlbnRpZnkoKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBTdGFydCBzZW5kaW5nIGhlYXJ0YmVhdCBwYXlsb2FkcyB0byBEaXNjb3JkIGluIHRoZSBwcm92aWRlZCBpbnRlcnZhbC4gKi9cbiAgc3RhcnRIZWFydGJlYXRpbmcoaW50ZXJ2YWw6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFN0YXJ0IGhlYXJ0YmVhdGluZyBvbiBTaGFyZCAjJHt0aGlzLmlkfWApXG5cbiAgICAvLyBJZiBvbGQgaGVhcnRiZWFzdCBleGlzdCBsaWtlIGFmdGVyIHJlc3VtZSwgY2xlYXIgdGhlIG9sZCBvbmVzLlxuICAgIHRoaXMuc3RvcEhlYXJ0YmVhdGluZygpXG5cbiAgICB0aGlzLmhlYXJ0LmludGVydmFsID0gaW50ZXJ2YWxcblxuICAgIC8vIE9ubHkgc2V0IHRoZSBzaGFyZCdzIHN0YXRlIHRvIGBVbmlkZW50aWZpZWRgXG4gICAgLy8gaWYgaGVhcnRiZWF0aW5nIGhhcyBub3QgYmVlbiBzdGFydGVkIGR1ZSB0byBhbiBpZGVudGlmeSBvciByZXN1bWUgYWN0aW9uLlxuICAgIGlmIChbU2hhcmRTdGF0ZS5EaXNjb25uZWN0ZWQsIFNoYXJkU3RhdGUuT2ZmbGluZV0uaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkIGlzIGRpc2Nvbm5lY3RlZCBvciBvZmZsaW5lIGJ1dCB0aGUgaGVhcnRiZWF0IHdhcyBzdGFydGVkICMke3RoaXMuaWR9YClcbiAgICAgIHRoaXMuc3RhdGUgPSBTaGFyZFN0YXRlLlVuaWRlbnRpZmllZFxuICAgIH1cblxuICAgIC8vIFRoZSBmaXJzdCBoZWFydGJlYXQgbmVlZHMgdG8gYmUgc2VuZCB3aXRoIGEgcmFuZG9tIGRlbGF5IGJldHdlZW4gYDBgIGFuZCBgaW50ZXJ2YWxgXG4gICAgLy8gVXNpbmcgYSBgc2V0VGltZW91dChfLCBqaXR0ZXIpYCBoZXJlIHRvIGFjY29tcGxpc2ggdGhhdC5cbiAgICAvLyBgTWF0aC5yYW5kb20oKWAgY2FuIGJlIGAwYCBzbyB3ZSB1c2UgYDAuNWAgaWYgdGhpcyBoYXBwZW5zXG4gICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy90b3BpY3MvZ2F0ZXdheSNoZWFydGJlYXRpbmdcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLmNlaWwodGhpcy5oZWFydC5pbnRlcnZhbCAqIChNYXRoLnJhbmRvbSgpIHx8IDAuNSkpXG5cbiAgICB0aGlzLmhlYXJ0LnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gQmVnaW5uaW5nIGhlYXJ0YmVhdGluZyBwcm9jZXNzIGZvciBTaGFyZCAjJHt0aGlzLmlkfWApXG5cbiAgICAgIGlmICghdGhpcy5pc09wZW4oKSkgcmV0dXJuXG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIEhlYXJ0YmVhdGluZyBvbiBTaGFyZCAjJHt0aGlzLmlkfS4gUHJldmlvdXMgc2VxdWVuY2UgbnVtYmVyOiAke3RoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcn1gKVxuXG4gICAgICAvLyBVc2luZyBhIGRpcmVjdCBzb2NrZXQuc2VuZCBjYWxsIGhlcmUgYmVjYXVzZSBoZWFydGJlYXQgcmVxdWVzdHMgYXJlIHJlc2VydmVkIGJ5IHVzLlxuICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBvcDogR2F0ZXdheU9wY29kZXMuSGVhcnRiZWF0LFxuICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgfSksXG4gICAgICApXG5cbiAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG4gICAgICB0aGlzLmhlYXJ0LmFja25vd2xlZGdlZCA9IGZhbHNlXG5cbiAgICAgIC8vIEFmdGVyIHRoZSByYW5kb20gaGVhcnRiZWF0IGppdHRlciB3ZSBjYW4gc3RhcnQgYSBub3JtYWwgaW50ZXJ2YWwuXG4gICAgICB0aGlzLmhlYXJ0LmludGVydmFsSWQgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBbU2hhcmRdIFNoYXJkICMke3RoaXMuaWR9IGlzIG5vdCBvcGVuLCBidXQgYXR0ZW1wdGVkIGhlYXJ0YmVhdCwgaWdub3JpbmcuYClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBTaGFyZCBkaWQgbm90IHJlY2VpdmUgYSBoZWFydGJlYXQgQUNLIGZyb20gRGlzY29yZCBpbiB0aW1lLFxuICAgICAgICAvLyB0aGVyZWZvcmUgd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgZmFpbGVkIG9yIGdvdCBcInpvbWJpZWRcIi5cbiAgICAgICAgLy8gVGhlIFNoYXJkIG5lZWRzIHRvIHN0YXJ0IGEgcmUtaWRlbnRpZnkgYWN0aW9uIGFjY29yZGluZ2x5LlxuICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I2hlYXJ0YmVhdGluZy1leGFtcGxlLWdhdGV3YXktaGVhcnRiZWF0LWFja1xuICAgICAgICBpZiAoIXRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0IG5vdCBhY2tub3dsZWRnZWQgZm9yIFNoYXJkICMke3RoaXMuaWR9LiBBc3N1bWluZyB6b21iaWVkIGNvbm5lY3Rpb24uYClcbiAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlKFNoYXJkU29ja2V0Q2xvc2VDb2Rlcy5ab21iaWVkQ29ubmVjdGlvbiwgJ1pvbWJpZWQgY29ubmVjdGlvbiwgZGlkIG5vdCByZWNlaXZlIGFuIGhlYXJ0YmVhdCBBQ0sgaW4gdGltZS4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFtTaGFyZF0gSGVhcnRiZWF0aW5nIG9uIFNoYXJkICMke3RoaXMuaWR9LiBQcmV2aW91cyBzZXF1ZW5jZSBudW1iZXI6ICR7dGhpcy5wcmV2aW91c1NlcXVlbmNlTnVtYmVyfWApXG5cbiAgICAgICAgLy8gVXNpbmcgYSBkaXJlY3Qgc29ja2V0LnNlbmQgY2FsbCBoZXJlIGJlY2F1c2UgaGVhcnRiZWF0IHJlcXVlc3RzIGFyZSByZXNlcnZlZCBieSB1cy5cbiAgICAgICAgdGhpcy5zb2NrZXQ/LnNlbmQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgb3A6IEdhdGV3YXlPcGNvZGVzLkhlYXJ0YmVhdCxcbiAgICAgICAgICAgIGQ6IHRoaXMucHJldmlvdXNTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaGVhcnQubGFzdEJlYXQgPSBEYXRlLm5vdygpXG4gICAgICAgIHRoaXMuaGVhcnQuYWNrbm93bGVkZ2VkID0gZmFsc2VcblxuICAgICAgICB0aGlzLmV2ZW50cy5oZWFydGJlYXQ/Lih0aGlzKVxuICAgICAgfSwgdGhpcy5oZWFydC5pbnRlcnZhbClcbiAgICB9LCBqaXR0ZXIpXG4gIH1cblxuICAvKiogU3RvcCB0aGUgaGVhcnRiZWF0aW5nIHByb2Nlc3Mgd2l0aCBkaXNjb3JkLiAqL1xuICBzdG9wSGVhcnRiZWF0aW5nKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIHRoZSByZWd1bGFyIGhlYXJ0YmVhdCBpbnRlcnZhbC5cbiAgICBjbGVhckludGVydmFsKHRoaXMuaGVhcnQuaW50ZXJ2YWxJZClcbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIFNoYXJkIGdvdCBjbG9zZWQgYmVmb3JlIHRoZSBmaXJzdCBqaXR0ZXJlZCBoZWFydGJlYXQuXG4gICAgLy8gVG8gZ28gc2FmZSB3ZSBzaG91bGQgY2xlYXIgdGhlIHJlbGF0ZWQgdGltZW91dCB0b28uXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaGVhcnQudGltZW91dElkKVxuICB9XG59XG5cbi8qKiBDaGVjayBpZiB0aGUgYnVmZmVyIGVuZHMgd2l0aCB0aGUgbWFya2VyICovXG5mdW5jdGlvbiBlbmRzV2l0aE1hcmtlcihidWZmZXI6IFVpbnQ4QXJyYXksIG1hcmtlcjogVWludDhBcnJheSkge1xuICBpZiAoYnVmZmVyLmxlbmd0aCA8IG1hcmtlci5sZW5ndGgpIHJldHVybiBmYWxzZVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya2VyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gbWFya2VyLmxlbmd0aCArIGldICE9PSBtYXJrZXJbaV0pIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZENyZWF0ZU9wdGlvbnMge1xuICAvKiogVGhlIHNoYXJkIGlkICovXG4gIGlkOiBudW1iZXJcbiAgLyoqIFRoZSBjb25uZWN0aW9uIGRldGFpbHMgKi9cbiAgY29ubmVjdGlvbjogU2hhcmRHYXRld2F5Q29uZmlnXG4gIC8qKiBUaGUgZXZlbnQgaGFuZGxlcnMgZm9yIGV2ZW50cyBvbiB0aGUgc2hhcmQuICovXG4gIGV2ZW50czogU2hhcmRFdmVudHNcbiAgLyoqIFRoZSBsb2dnZXIgZm9yIHRoZSBzaGFyZCAqL1xuICBsb2dnZXI/OiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cbiAgLyoqIFRoZSBoYW5kbGVyIHRvIHJlcXVlc3QgYSBzcGFjZSB0byBtYWtlIGFuIGlkZW50aWZ5IHJlcXVlc3QuICovXG4gIHJlcXVlc3RJZGVudGlmeT86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIEZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYm90IHN0YXR1cyB0byBzZW5kIG9uIElkZW50aWZ5IHJlcXVlc3RzICovXG4gIG1ha2VQcmVzZW5jZT86ICgpID0+IFByb21pc2U8RGlzY29yZFVwZGF0ZVByZXNlbmNlIHwgdW5kZWZpbmVkPlxufVxuXG5leHBvcnQgZGVmYXVsdCBEaXNjb3JkZW5vU2hhcmRcbiJdLCJuYW1lcyI6WyJEaXNjb3JkZW5vU2hhcmQiLCJaTElCX1NZTkNfRkxVU0giLCJVaW50OEFycmF5IiwiZnpzdGQiLCJnZXRGWlN0ZCIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIm1heFJlcXVlc3RzUGVyUmF0ZUxpbWl0VGljayIsInByZXZpb3VzU2VxdWVuY2VOdW1iZXIiLCJyYXRlTGltaXRSZXNldEludGVydmFsIiwic3RhdGUiLCJTaGFyZFN0YXRlIiwiT2ZmbGluZSIsInJlc3VtZUdhdGV3YXlVcmwiLCJldmVudHMiLCJvZmZsaW5lU2VuZFF1ZXVlIiwicmVzb2x2ZXMiLCJNYXAiLCJnb2luZ09mZmxpbmUiLCJ0ZXh0RGVjb2RlciIsIlRleHREZWNvZGVyIiwiaW5mbGF0ZUJ1ZmZlciIsImRlY29tcHJlc3Npb25Qcm9taXNlc1F1ZXVlIiwiaWQiLCJjb25uZWN0aW9uIiwibG9nZ2VyIiwiaGVhcnQiLCJhY2tub3dsZWRnZWQiLCJpbnRlcnZhbCIsInJlcXVlc3RJZGVudGlmeSIsIm1ha2VQcmVzZW5jZSIsImJ1Y2tldCIsIkxlYWt5QnVja2V0IiwibWF4IiwiY2FsY3VsYXRlU2FmZVJlcXVlc3RzIiwicmVmaWxsQW1vdW50IiwicmVmaWxsSW50ZXJ2YWwiLCJnYXRld2F5Q29uZmlnIiwiY29ubmVjdGlvblVybCIsInVybCIsInNhZmVSZXF1ZXN0cyIsIk1hdGgiLCJjZWlsIiwiY2hlY2tPZmZsaW5lIiwiaGlnaFByaW9yaXR5IiwiaXNPcGVuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1bnNoaWZ0IiwicHVzaCIsImNsb3NlIiwiY29kZSIsInJlYXNvbiIsImRlYnVnIiwic29ja2V0IiwicmVhZHlTdGF0ZSIsIk5vZGVXZWJTb2NrZXQiLCJPUEVOIiwiR2F0ZXdheUNsb3NlRXZlbnRDb2RlcyIsIk5vcm1hbENsb3N1cmUiLCJHb2luZ0F3YXkiLCJwcm9taXNlIiwicmVzb2x2ZUFmdGVyQ2xvc2UiLCJ1bmRlZmluZWQiLCJjb25uZWN0IiwiSWRlbnRpZnlpbmciLCJSZXN1bWluZyIsImluY2x1ZGVzIiwiQ29ubmVjdGluZyIsImNvbm5lY3RpbmciLCJVUkwiLCJzZWFyY2hQYXJhbXMiLCJzZXQiLCJ2ZXJzaW9uIiwidG9TdHJpbmciLCJ0cmFuc3BvcnRDb21wcmVzc2lvbiIsIlRyYW5zcG9ydENvbXByZXNzaW9uIiwiemxpYiIsImluZmxhdGUiLCJjcmVhdGVJbmZsYXRlIiwiZmluaXNoRmx1c2giLCJ6bGliQ29uc3RhbnRzIiwiWl9TWU5DX0ZMVVNIIiwiY2h1bmtTaXplIiwib24iLCJlIiwiZXJyb3IiLCJkYXRhIiwibmV3QnVmZmVyIiwiYnl0ZUxlbmd0aCIsInpzdGQiLCJjYXRjaCIsIndhcm4iLCJkZWxldGUiLCJ6c3RkRGVjb21wcmVzcyIsIkRlY29tcHJlc3MiLCJkZWNvZGVkRGF0YSIsImRlY29kZSIsInBhcnNlZERhdGEiLCJKU09OIiwicGFyc2UiLCJzaGlmdCIsImNvbXByZXNzIiwic2hvdWxkVXNlQnVpbHRpbiIsIlJlZmxlY3QiLCJoYXMiLCJnbG9iYWxUaGlzIiwiV2ViU29ja2V0IiwiYmluYXJ5VHlwZSIsIm9uZXJyb3IiLCJldmVudCIsImhhbmRsZUVycm9yIiwib25jbG9zZSIsImNsb3NlRXZlbnQiLCJoYW5kbGVDbG9zZSIsIm9ubWVzc2FnZSIsIm1lc3NhZ2VFdmVudCIsImhhbmRsZU1lc3NhZ2UiLCJvbm9wZW4iLCJVbmlkZW50aWZpZWQiLCJjb25uZWN0ZWQiLCJpZGVudGlmeSIsImJ5cGFzc1JlcXVlc3QiLCJTaGFyZFNvY2tldENsb3NlQ29kZXMiLCJSZUlkZW50aWZ5aW5nIiwiaWRlbnRpZnlpbmciLCJzZW5kIiwib3AiLCJHYXRld2F5T3Bjb2RlcyIsIklkZW50aWZ5IiwiZCIsInRva2VuIiwicHJvcGVydGllcyIsImludGVudHMiLCJzaGFyZCIsInRvdGFsU2hhcmRzIiwicHJlc2VuY2UiLCJpZGVudGlmaWVkIiwicmVzdW1lIiwiUmVzdW1lQ2xvc2luZ09sZENvbm5lY3Rpb24iLCJzZXNzaW9uSWQiLCJSZXN1bWUiLCJzZXNzaW9uX2lkIiwic2VxIiwibWVzc2FnZSIsImFjcXVpcmUiLCJzdHJpbmdpZnkiLCJzaHV0ZG93biIsIlNodXRkb3duIiwic3RvcEhlYXJ0YmVhdGluZyIsIlRlc3RpbmdGaW5pc2hlZCIsImRpc2Nvbm5lY3RlZCIsIlJlc2hhcmRlZCIsIkRpc2Nvbm5lY3RlZCIsIkF1dGhlbnRpY2F0aW9uRmFpbGVkIiwiSW52YWxpZFNoYXJkIiwiU2hhcmRpbmdSZXF1aXJlZCIsIkludmFsaWRBcGlWZXJzaW9uIiwiSW52YWxpZEludGVudHMiLCJEaXNhbGxvd2VkSW50ZW50cyIsIkVycm9yIiwiTm90QXV0aGVudGljYXRlZCIsIkludmFsaWRTZXEiLCJTZXNzaW9uVGltZWRPdXQiLCJVbmtub3duRXJyb3IiLCJVbmtub3duT3Bjb2RlIiwiRGVjb2RlRXJyb3IiLCJSYXRlTGltaXRlZCIsIkFscmVhZHlBdXRoZW50aWNhdGVkIiwiaXNDb21wcmVzc2VkIiwiQXJyYXlCdWZmZXIiLCJCdWZmZXIiLCJkZWNvbXByZXNzUGFja2V0IiwiaGFuZGxlRGlzY29yZFBhY2tldCIsImNvbXByZXNzZWREYXRhIiwiZmF0YWwiLCJ3cml0ZVByb21pc2UiLCJyZWplY3QiLCJ3cml0ZSIsImVuZHNXaXRoTWFya2VyIiwiZGVjb21wcmVzc2lvblByb21pc2UiLCJyIiwiZGVjb21wcmVzc2VkIiwiaW5mbGF0ZVN5bmMiLCJwYWNrZXQiLCJsYXN0QWNrIiwiRGF0ZSIsIm5vdyIsIkhlYXJ0YmVhdCIsImxhc3RCZWF0IiwiaGVhcnRiZWF0IiwiSGVsbG8iLCJoZWFydGJlYXRfaW50ZXJ2YWwiLCJzdGFydEhlYXJ0YmVhdGluZyIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlIiwiaGVsbG8iLCJIZWFydGJlYXRBQ0siLCJydHQiLCJoZWFydGJlYXRBY2siLCJSZWNvbm5lY3QiLCJyZXF1ZXN0ZWRSZWNvbm5lY3QiLCJJbnZhbGlkU2Vzc2lvbiIsInJlc3VtYWJsZSIsImludmFsaWRTZXNzaW9uIiwiZGVsYXkiLCJmbG9vciIsInJhbmRvbSIsImdldCIsInQiLCJDb25uZWN0ZWQiLCJyZXN1bWVkIiwiZm9yRWFjaCIsImxlbmd0aCIsInBheWxvYWQiLCJyZXN1bWVfZ2F0ZXdheV91cmwiLCJzIiwiZm9yd2FyZFRvQm90IiwiY2FtZWxpemUiLCJqaXR0ZXIiLCJ0aW1lb3V0SWQiLCJzZXRUaW1lb3V0IiwiaW50ZXJ2YWxJZCIsInNldEludGVydmFsIiwiWm9tYmllZENvbm5lY3Rpb24iLCJjbGVhckludGVydmFsIiwiY2xlYXJUaW1lb3V0IiwiYnVmZmVyIiwibWFya2VyIiwiaSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUEwQmFBLGVBQWU7ZUFBZkE7O0lBbXpCYixPQUE4QjtlQUE5Qjs7OzRCQTcwQnVCOzBCQUM4RDt1QkFFOUI7dUJBQ0Y7MkRBRTNCO3dCQVNuQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFUCxNQUFNQyxrQkFBa0IsSUFBSUMsV0FBVztJQUFDO0lBQUs7SUFBSztJQUFNO0NBQUs7QUFFN0QsSUFBSUM7QUFFSix3RUFBd0UsR0FDeEUsZUFBZUM7SUFDYixPQUFRRCxVQUFVLE1BQU0sbUVBQUEsUUFBTztBQUNqQztBQUVPLElBQUEsQUFBTUgsa0JBQU4sTUFBTUE7SUEyRFhLLFlBQVlDLE9BQTJCLENBQUU7UUFwRHpDLDBIQUEwSCxRQUMxSEMsOEJBQXNDO1FBQ3RDLDBDQUEwQyxRQUMxQ0MseUJBQXdDO1FBQ3hDLDRFQUE0RSxRQUM1RUMseUJBQWlDO1FBS2pDLHdDQUF3QyxRQUN4Q0MsUUFBUUMsa0JBQVUsQ0FBQ0MsT0FBTztRQUMxQixpRkFBaUYsUUFDakZDLG1CQUEyQjtRQUMzQixzQ0FBc0MsUUFDdENDLFNBQXNCLENBQUM7UUFDdkIsbUdBQW1HLFFBQ25HQyxtQkFBbUMsRUFBRTtRQUNyQyxpRkFBaUYsUUFDakZDLFdBQVcsSUFBSUM7UUFLZjs7Ozs7Ozs7R0FRQyxRQUNEQyxlQUFlO1FBQ2YsK0NBQStDLFFBQy9DQyxjQUFjLElBQUlDO1FBR2xCLHlCQUF5QixRQUN6QkMsZ0JBQW1DO1FBR25DLHNEQUFzRCxRQUN0REMsNkJBQXdF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