velocious 1.0.337 → 1.0.339

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.
@@ -18,11 +18,12 @@ export default class VelociousWebsocketClient {
18
18
  * @param {object} [args] - Options object.
19
19
  * @param {boolean} [args.autoReconnect] - Enable auto-reconnect with exponential backoff.
20
20
  * @param {boolean} [args.debug] - Whether debug.
21
+ * @param {{getIsOnline?: () => boolean | Promise<boolean>, subscribe?: (callback: (isOnline: boolean) => void) => (() => void) | {remove: () => void}}} [args.networkMonitor] - Optional online-state adapter. When provided, auto-reconnect can wait for the network to report online before reconnecting, and open sockets are closed when the monitor reports offline.
21
22
  * @param {number[]} [args.reconnectDelays] - Backoff delays in ms (default: [1000, 2000, 4000, 8000, 15000]).
22
23
  * @param {{get: () => string | null | undefined | Promise<string | null | undefined>, set: (sessionId: string) => void | Promise<void>, clear: () => void | Promise<void>}} [args.sessionStore] - Optional sessionId persistence hook. When provided, the client writes every `session-established` / `session-resumed` id via `store.set(id)` and clears it on `session-gone`. Before the first `connect()`, the client reads any persisted id via `store.get()` and attempts resumption. Apps should back this by whatever persistence layer survives page reloads (localStorage, a cookie, SQLite, etc.).
23
24
  * @param {string} [args.url] Full websocket URL (default: ws://127.0.0.1:3006/websocket)
24
25
  */
25
- constructor({ autoReconnect = false, debug = false, reconnectDelays, sessionStore, url } = {}) {
26
+ constructor({ autoReconnect = true, debug = false, networkMonitor, reconnectDelays, sessionStore, url } = {}) {
26
27
  if (!globalThis.WebSocket)
27
28
  throw new Error("WebSocket global is not available");
28
29
  /** @type {boolean} */
@@ -34,6 +35,8 @@ export default class VelociousWebsocketClient {
34
35
  this.pendingSubscriptions = new Map();
35
36
  /** @type {number} */
36
37
  this.reconnectAttempt = 0;
38
+ /** @type {number} */
39
+ this.connectionAttempts = 0;
37
40
  /** @type {number[]} */
38
41
  this.reconnectDelays = reconnectDelays || DEFAULT_RECONNECT_DELAYS;
39
42
  /** @type {ReturnType<typeof setTimeout> | null} */
@@ -59,6 +62,12 @@ export default class VelociousWebsocketClient {
59
62
  this._sessionStore = sessionStore;
60
63
  /** @type {boolean} - true once the sessionStore has been consulted for a restored id. */
61
64
  this._sessionStoreRestored = false;
65
+ /** @type {{getIsOnline?: () => boolean | Promise<boolean>, subscribe?: (callback: (isOnline: boolean) => void) => (() => void) | {remove: () => void}} | undefined} */
66
+ this._networkMonitor = networkMonitor;
67
+ /** @type {null | (() => void) | {remove: () => void}} */
68
+ this._networkMonitorSubscription = null;
69
+ /** @type {boolean} */
70
+ this._waitingForOnline = false;
62
71
  }
63
72
  /** @returns {boolean} */
64
73
  isOpen() {
@@ -109,21 +118,21 @@ export default class VelociousWebsocketClient {
109
118
  this._connections.delete(connectionId);
110
119
  }
111
120
  /**
112
- * Subscribes to a named WebsocketChannel. Requires the socket to
113
- * already be connected.
121
+ * Subscribes to a named WebsocketChannel. If the socket is not yet
122
+ * open, the subscription is queued and sent once a connection is
123
+ * established.
114
124
  *
115
125
  * @param {string} channelType - Name the server registered the channel under.
116
126
  * @param {{params?: Record<string, any>, lastEventId?: string, onMessage?: (body: any) => void, onDisconnect?: () => void, onResume?: () => void, onClose?: (reason: string) => void}} [options]
117
127
  * @returns {VelociousWebsocketClientSubscription}
118
128
  */
119
129
  subscribeChannel(channelType, options = {}) {
120
- if (!this.isOpen())
121
- throw new Error("Websocket is not open; call connect() first");
122
130
  const subscriptionId = `s${this._nextSubscriptionIdSeq++}`;
123
131
  const subscription = new VelociousWebsocketClientSubscription({
124
132
  client: this,
125
133
  subscriptionId,
126
134
  channelType,
135
+ lastEventId: options.lastEventId,
127
136
  params: options.params,
128
137
  onMessage: options.onMessage,
129
138
  onDisconnect: options.onDisconnect,
@@ -131,13 +140,7 @@ export default class VelociousWebsocketClient {
131
140
  onClose: options.onClose
132
141
  });
133
142
  this._channelSubscriptions.set(subscriptionId, subscription);
134
- this._sendMessage({
135
- type: "channel-subscribe",
136
- subscriptionId,
137
- channelType,
138
- params: options.params || {},
139
- ...(options.lastEventId ? { lastEventId: options.lastEventId } : {})
140
- });
143
+ this._sendChannelSubscribe(subscription);
141
144
  return subscription;
142
145
  }
143
146
  /**
@@ -147,6 +150,84 @@ export default class VelociousWebsocketClient {
147
150
  _removeChannelSubscription(subscriptionId) {
148
151
  this._channelSubscriptions.delete(subscriptionId);
149
152
  }
153
+ /**
154
+ * @param {VelociousWebsocketClientSubscription} subscription
155
+ * @returns {void}
156
+ */
157
+ _sendChannelSubscribe(subscription) {
158
+ if (!this.isOpen() || !subscription._needsSubscribe())
159
+ return;
160
+ subscription._markSubscribeSent();
161
+ this._sendMessage({
162
+ type: "channel-subscribe",
163
+ subscriptionId: subscription.subscriptionId,
164
+ channelType: subscription.channelType,
165
+ params: subscription.params,
166
+ ...(subscription.lastEventId ? { lastEventId: subscription.lastEventId } : {})
167
+ });
168
+ }
169
+ /** @returns {void} */
170
+ _sendPendingChannelSubscriptions() {
171
+ for (const subscription of this._channelSubscriptions.values()) {
172
+ this._sendChannelSubscribe(subscription);
173
+ }
174
+ }
175
+ /** @returns {Promise<boolean>} */
176
+ async _isOnline() {
177
+ if (!this._networkMonitor?.getIsOnline)
178
+ return true;
179
+ try {
180
+ return await this._networkMonitor.getIsOnline() !== false;
181
+ }
182
+ catch (error) {
183
+ this._debug("networkMonitor.getIsOnline failed", error);
184
+ return true;
185
+ }
186
+ }
187
+ /** @returns {Promise<boolean>} */
188
+ async _shouldWaitForOnline() {
189
+ if (!this._networkMonitor)
190
+ return false;
191
+ const isOnline = await this._isOnline();
192
+ if (isOnline)
193
+ return false;
194
+ this._waitingForOnline = true;
195
+ this._cancelPendingReconnect();
196
+ return true;
197
+ }
198
+ /** @returns {void} */
199
+ _ensureNetworkMonitorSubscription() {
200
+ if (!this._networkMonitor?.subscribe || this._networkMonitorSubscription)
201
+ return;
202
+ this._networkMonitorSubscription = this._networkMonitor.subscribe((isOnline) => {
203
+ if (!this.autoReconnect)
204
+ return;
205
+ if (isOnline) {
206
+ if (!this._waitingForOnline)
207
+ return;
208
+ this._waitingForOnline = false;
209
+ void this._attemptReconnect();
210
+ return;
211
+ }
212
+ this._waitingForOnline = true;
213
+ this._cancelPendingReconnect();
214
+ if (this.isOpen()) {
215
+ void this.dropConnection();
216
+ }
217
+ });
218
+ }
219
+ /** @returns {void} */
220
+ _teardownNetworkMonitorSubscription() {
221
+ if (!this._networkMonitorSubscription)
222
+ return;
223
+ if (typeof this._networkMonitorSubscription === "function") {
224
+ this._networkMonitorSubscription();
225
+ }
226
+ else {
227
+ this._networkMonitorSubscription.remove();
228
+ }
229
+ this._networkMonitorSubscription = null;
230
+ }
150
231
  /**
151
232
  * Sets a global metadata value that is sent to the server.
152
233
  * For WebSocket connections, a metadata update message is sent immediately.
@@ -171,13 +252,35 @@ export default class VelociousWebsocketClient {
171
252
  }
172
253
  /**
173
254
  * Ensure a websocket connection is open.
255
+ * Auto-reconnect and online gating are enabled by default.
256
+ * Pass `autoReconnect: false` or `waitForOnline: false` only when a caller
257
+ * explicitly needs lower-level behavior.
258
+ * @param {{autoReconnect?: boolean, waitForOnline?: boolean, resetReconnectState?: boolean}} [options]
174
259
  * @returns {Promise<void>} - Resolves when complete.
175
260
  */
176
- async connect() {
261
+ async connect({ autoReconnect = this.autoReconnect, waitForOnline = true, resetReconnectState = true } = {}) {
262
+ this.autoReconnect = autoReconnect;
263
+ if (this.autoReconnect) {
264
+ this._ensureNetworkMonitorSubscription();
265
+ }
266
+ else {
267
+ this._waitingForOnline = false;
268
+ this._cancelPendingReconnect();
269
+ this._teardownNetworkMonitorSubscription();
270
+ }
271
+ if (waitForOnline && this.autoReconnect && !await this._isOnline()) {
272
+ this._waitingForOnline = true;
273
+ return;
274
+ }
275
+ if (resetReconnectState) {
276
+ this.reconnectAttempt = 0;
277
+ }
177
278
  if (this.socket && this.socket.readyState === this.socket.OPEN)
178
279
  return;
179
280
  if (this.connectPromise)
180
281
  return this.connectPromise;
282
+ this._waitingForOnline = false;
283
+ this.connectionAttempts += 1;
181
284
  this.connectPromise = new Promise((resolve, reject) => {
182
285
  this.socket = new WebSocket(this.url);
183
286
  const cleanup = () => {
@@ -233,16 +336,9 @@ export default class VelociousWebsocketClient {
233
336
  if (Object.keys(this._metadata).length > 0) {
234
337
  this._sendMessage({ type: "metadata", data: { ...this._metadata } });
235
338
  }
236
- }
237
- /**
238
- * Connect and enable auto-reconnect. Resets reconnect state.
239
- * @returns {Promise<void>} - Resolves when connected.
240
- */
241
- async connectWithReconnect() {
242
- this.autoReconnect = true;
243
- this.reconnectAttempt = 0;
244
- this._cancelPendingReconnect();
245
- await this.connect();
339
+ if (!this._awaitingResume) {
340
+ this._sendPendingChannelSubscriptions();
341
+ }
246
342
  this.disconnectedSince = null;
247
343
  }
248
344
  /**
@@ -250,6 +346,10 @@ export default class VelociousWebsocketClient {
250
346
  * @returns {Promise<void>} - Resolves when complete.
251
347
  */
252
348
  async close() {
349
+ this.autoReconnect = false;
350
+ this._waitingForOnline = false;
351
+ this._cancelPendingReconnect();
352
+ this._teardownNetworkMonitorSubscription();
253
353
  if (!this.socket)
254
354
  return;
255
355
  if (this.socket.readyState === this.socket.CLOSED) {
@@ -269,8 +369,6 @@ export default class VelociousWebsocketClient {
269
369
  * @returns {Promise<void>} - Resolves when closed.
270
370
  */
271
371
  async disconnectAndStopReconnect() {
272
- this.autoReconnect = false;
273
- this._cancelPendingReconnect();
274
372
  await this.close();
275
373
  }
276
374
  /**
@@ -526,6 +624,7 @@ export default class VelociousWebsocketClient {
526
624
  this._awaitingResume = false;
527
625
  this._sessionId = message.sessionId;
528
626
  this._persistSessionId(message.sessionId);
627
+ this._sendPendingChannelSubscriptions();
529
628
  // Fire onResume on every live handle so user code knows the
530
629
  // session came back with state intact.
531
630
  for (const connection of this._connections.values())
@@ -602,9 +701,13 @@ export default class VelociousWebsocketClient {
602
701
  this.pendingRequests.clear();
603
702
  this.pendingSubscriptions.clear();
604
703
  this.connectPromise = undefined;
605
- if (this.autoReconnect) {
606
- this._scheduleReconnect();
607
- }
704
+ if (!this.autoReconnect)
705
+ return;
706
+ void this._shouldWaitForOnline().then((shouldWaitForOnline) => {
707
+ if (!shouldWaitForOnline) {
708
+ this._scheduleReconnect();
709
+ }
710
+ });
608
711
  };
609
712
  /**
610
713
  * @param {Record<string, any>} payload - Payload data.
@@ -639,8 +742,14 @@ export default class VelociousWebsocketClient {
639
742
  async _attemptReconnect() {
640
743
  if (!this.autoReconnect)
641
744
  return;
745
+ if (!await this._isOnline()) {
746
+ this._waitingForOnline = true;
747
+ return;
748
+ }
642
749
  try {
643
- await this.connect();
750
+ this._waitingForOnline = false;
751
+ this.connectionAttempts += 1;
752
+ await this.connect({ autoReconnect: this.autoReconnect, resetReconnectState: false, waitForOnline: false });
644
753
  this.reconnectAttempt = 0;
645
754
  this.disconnectedSince = null;
646
755
  this._resubscribeActiveListeners();
@@ -740,4 +849,4 @@ class VelociousWebsocketResponse {
740
849
  return deserializeFrontendModelTransportValue(JSON.parse(this.body));
741
850
  }
742
851
  }
743
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGtDQUFrQyxNQUFNLDJCQUEyQixDQUFBO0FBQzFFLE9BQU8sb0NBQW9DLE1BQU0sd0JBQXdCLENBQUE7QUFDekUsT0FBTyxFQUFDLHNDQUFzQyxFQUFDLE1BQU0sK0NBQStDLENBQUE7QUFFcEcsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUVoRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHdCQUF3QjtJQUMzQyx1SEFBdUg7SUFDdkgsZUFBZSxDQUFBO0lBQ2YsK0ZBQStGO0lBQy9GLG9CQUFvQixDQUFBO0lBQ3BCLG9KQUFvSjtJQUNwSixTQUFTLENBQUE7SUFFVDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsR0FBRyxLQUFLLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBQyxHQUFHLEVBQUU7UUFDekYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBRS9FLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDckMs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Q0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDdEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9uIGZyb20gXCIuL3dlYnNvY2tldC1jb25uZWN0aW9uLmpzXCJcbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRTdWJzY3JpcHRpb24gZnJvbSBcIi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIlxuaW1wb3J0IHtkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZX0gZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVscy90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiXG5cbmNvbnN0IERFRkFVTFRfUkVDT05ORUNUX0RFTEFZUyA9IFsxMDAwLCAyMDAwLCA0MDAwLCA4MDAwLCAxNTAwMF1cblxuLyoqXG4gKiBBIHNtYWxsIHdlYnNvY2tldCBjbGllbnQgdGhhdCBtaXJyb3JzIHNpbXBsZSBIVFRQLXN0eWxlIGNhbGxzIGFuZCBjaGFubmVsIHN1YnNjcmlwdGlvbnMuXG4gKiBTdXBwb3J0cyBvcHRpb25hbCBhdXRvLXJlY29ubmVjdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYgYW5kIGxpc3RlbmVyIHJlLXN1YnNjcmlwdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7cmVqZWN0OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQsIHJlc29sdmU6IChyZXNwb25zZTogVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2UpID0+IHZvaWR9Pn0gKi9cbiAgcGVuZGluZ1JlcXVlc3RzXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge3JlamVjdDogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkLCByZXNvbHZlOiAodmFsdWU/OiB2b2lkKSA9PiB2b2lkfT59ICovXG4gIHBlbmRpbmdTdWJzY3JpcHRpb25zXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2NhbGxiYWNrczogU2V0PChwYXlsb2FkOiBhbnkpID0+IHZvaWQ+LCBjaGFubmVsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCwgcmVhZHk6IFByb21pc2U8dm9pZD59Pn0gKi9cbiAgbGlzdGVuZXJzXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5hdXRvUmVjb25uZWN0XSAtIEVuYWJsZSBhdXRvLXJlY29ubmVjdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWddIC0gV2hldGhlciBkZWJ1Zy5cbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW2FyZ3MucmVjb25uZWN0RGVsYXlzXSAtIEJhY2tvZmYgZGVsYXlzIGluIG1zIChkZWZhdWx0OiBbMTAwMCwgMjAwMCwgNDAwMCwgODAwMCwgMTUwMDBdKS5cbiAgICogQHBhcmFtIHt7Z2V0OiAoKSA9PiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPiwgc2V0OiAoc2Vzc2lvbklkOiBzdHJpbmcpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LCBjbGVhcjogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59fSBbYXJncy5zZXNzaW9uU3RvcmVdIC0gT3B0aW9uYWwgc2Vzc2lvbklkIHBlcnNpc3RlbmNlIGhvb2suIFdoZW4gcHJvdmlkZWQsIHRoZSBjbGllbnQgd3JpdGVzIGV2ZXJ5IGBzZXNzaW9uLWVzdGFibGlzaGVkYCAvIGBzZXNzaW9uLXJlc3VtZWRgIGlkIHZpYSBgc3RvcmUuc2V0KGlkKWAgYW5kIGNsZWFycyBpdCBvbiBgc2Vzc2lvbi1nb25lYC4gQmVmb3JlIHRoZSBmaXJzdCBgY29ubmVjdCgpYCwgdGhlIGNsaWVudCByZWFkcyBhbnkgcGVyc2lzdGVkIGlkIHZpYSBgc3RvcmUuZ2V0KClgIGFuZCBhdHRlbXB0cyByZXN1bXB0aW9uLiBBcHBzIHNob3VsZCBiYWNrIHRoaXMgYnkgd2hhdGV2ZXIgcGVyc2lzdGVuY2UgbGF5ZXIgc3Vydml2ZXMgcGFnZSByZWxvYWRzIChsb2NhbFN0b3JhZ2UsIGEgY29va2llLCBTUUxpdGUsIGV0Yy4pLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudXJsXSBGdWxsIHdlYnNvY2tldCBVUkwgKGRlZmF1bHQ6IHdzOi8vMTI3LjAuMC4xOjMwMDYvd2Vic29ja2V0KVxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2F1dG9SZWNvbm5lY3QgPSBmYWxzZSwgZGVidWcgPSBmYWxzZSwgcmVjb25uZWN0RGVsYXlzLCBzZXNzaW9uU3RvcmUsIHVybH0gPSB7fSkge1xuICAgIGlmICghZ2xvYmFsVGhpcy5XZWJTb2NrZXQpIHRocm93IG5ldyBFcnJvcihcIldlYlNvY2tldCBnbG9iYWwgaXMgbm90IGF2YWlsYWJsZVwiKVxuXG4gICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuYXV0b1JlY29ubmVjdCA9IGF1dG9SZWNvbm5lY3RcbiAgICB0aGlzLmRlYnVnID0gZGVidWdcbiAgICAvKiogQHR5cGUge251bWJlciB8IG51bGx9ICovXG4gICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IG5ldyBNYXAoKVxuICAgIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPSAwXG4gICAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgICB0aGlzLnJlY29ubmVjdERlbGF5cyA9IHJlY29ubmVjdERlbGF5cyB8fCBERUZBVUxUX1JFQ09OTkVDVF9ERUxBWVNcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH0gKi9cbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgIHRoaXMudXJsID0gdXJsIHx8IFwid3M6Ly8xMjcuMC4wLjE6MzAwNi93ZWJzb2NrZXRcIlxuICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5uZXh0SUQgPSAxXG4gICAgLyoqIEB0eXBlIHsoKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgbnVsbH0gKi9cbiAgICB0aGlzLm9uUmVjb25uZWN0ID0gbnVsbFxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMuX21ldGFkYXRhID0ge31cblxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50Q29ubmVjdGlvbj59ICovXG4gICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgTWFwKClcblxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50U3Vic2NyaXB0aW9uPn0gKi9cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgdGhpcy5fbmV4dENvbm5lY3Rpb25JZFNlcSA9IDFcbiAgICB0aGlzLl9uZXh0U3Vic2NyaXB0aW9uSWRTZXEgPSAxXG5cbiAgICAvKiogQHR5cGUge3N0cmluZyB8IG51bGx9IC0gc2Vzc2lvbklkIHJlY2VpdmVkIGZyb20gYHNlc3Npb24tZXN0YWJsaXNoZWRgOyBzZW50IG9uIHJlY29ubmVjdCBmb3IgcmVzdW1wdGlvbi4gKi9cbiAgICB0aGlzLl9zZXNzaW9uSWQgPSBudWxsXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59IC0gdHJ1ZSBiZXR3ZWVuIGEgcmVjb25uZWN0IGFuZCB0aGUgc2Vzc2lvbi1yZXN1bWVkIC8gc2Vzc2lvbi1nb25lIHJlcGx5LiAqL1xuICAgIHRoaXMuX2F3YWl0aW5nUmVzdW1lID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7e2dldDogKCkgPT4gc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB8IFByb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4sIHNldDogKHNlc3Npb25JZDogc3RyaW5nKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPiwgY2xlYXI6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLl9zZXNzaW9uU3RvcmUgPSBzZXNzaW9uU3RvcmVcbiAgICAvKiogQHR5cGUge2Jvb2xlYW59IC0gdHJ1ZSBvbmNlIHRoZSBzZXNzaW9uU3RvcmUgaGFzIGJlZW4gY29uc3VsdGVkIGZvciBhIHJlc3RvcmVkIGlkLiAqL1xuICAgIHRoaXMuX3Nlc3Npb25TdG9yZVJlc3RvcmVkID0gZmFsc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNPcGVuKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pXG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSAxOjEgYFdlYnNvY2tldENvbm5lY3Rpb25gIG9mIHRoZSBnaXZlbiB0eXBlIGFnYWluc3QgdGhlXG4gICAqIHNlcnZlci4gUmVxdWlyZXMgdGhlIHNvY2tldCB0byBhbHJlYWR5IGJlIGNvbm5lY3RlZCAoY2FsbFxuICAgKiBgY29ubmVjdCgpYCBmaXJzdCkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uVHlwZSAtIE5hbWUgdGhlIHNlcnZlciByZWdpc3RlcmVkIHRoZSBjbGFzcyB1bmRlci5cbiAgICogQHBhcmFtIHt7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Piwgb25Db25uZWN0PzogKCkgPT4gdm9pZCwgb25NZXNzYWdlPzogKGJvZHk6IGFueSkgPT4gdm9pZCwgb25EaXNjb25uZWN0PzogKCkgPT4gdm9pZCwgb25SZXN1bWU/OiAoKSA9PiB2b2lkLCBvbkNsb3NlPzogKHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkfX0gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9ufVxuICAgKi9cbiAgb3BlbkNvbm5lY3Rpb24oY29ubmVjdGlvblR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgdGhyb3cgbmV3IEVycm9yKFwiV2Vic29ja2V0IGlzIG5vdCBvcGVuOyBjYWxsIGNvbm5lY3QoKSBmaXJzdFwiKVxuXG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gYGMke3RoaXMuX25leHRDb25uZWN0aW9uSWRTZXErK31gXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGNvbm5lY3Rpb25UeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICAgIG9uQ29ubmVjdDogb3B0aW9ucy5vbkNvbm5lY3QsXG4gICAgICBvbk1lc3NhZ2U6IG9wdGlvbnMub25NZXNzYWdlLFxuICAgICAgb25EaXNjb25uZWN0OiBvcHRpb25zLm9uRGlzY29ubmVjdCxcbiAgICAgIG9uUmVzdW1lOiBvcHRpb25zLm9uUmVzdW1lLFxuICAgICAgb25DbG9zZTogb3B0aW9ucy5vbkNsb3NlXG4gICAgfSlcblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjb25uZWN0aW9uLW9wZW5cIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGNvbm5lY3Rpb25UeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyB8fCB7fVxuICAgIH0pXG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIGEgY29ubmVjdGlvbiBoYW5kbGUgZnJvbSB0aGUgcmVnaXN0cnkuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50Q29ubmVjdGlvbi5jbG9zZSgpYCBhZnRlciBpdCBub3RpZmllc1xuICAgKiB0aGUgc2VydmVyLCBhbmQgYnkgdGhlIHNlc3Npb24tZGVzdHJveWVkIGNsZWFudXAgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbm5lY3Rpb25JZFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkge1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhIG5hbWVkIFdlYnNvY2tldENoYW5uZWwuIFJlcXVpcmVzIHRoZSBzb2NrZXQgdG9cbiAgICogYWxyZWFkeSBiZSBjb25uZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsVHlwZSAtIE5hbWUgdGhlIHNlcnZlciByZWdpc3RlcmVkIHRoZSBjaGFubmVsIHVuZGVyLlxuICAgKiBAcGFyYW0ge3twYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBsYXN0RXZlbnRJZD86IHN0cmluZywgb25NZXNzYWdlPzogKGJvZHk6IGFueSkgPT4gdm9pZCwgb25EaXNjb25uZWN0PzogKCkgPT4gdm9pZCwgb25SZXN1bWU/OiAoKSA9PiB2b2lkLCBvbkNsb3NlPzogKHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkfX0gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRTdWJzY3JpcHRpb259XG4gICAqL1xuICBzdWJzY3JpYmVDaGFubmVsKGNoYW5uZWxUeXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHRocm93IG5ldyBFcnJvcihcIldlYnNvY2tldCBpcyBub3Qgb3BlbjsgY2FsbCBjb25uZWN0KCkgZmlyc3RcIilcblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbklkID0gYHMke3RoaXMuX25leHRTdWJzY3JpcHRpb25JZFNlcSsrfWBcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50U3Vic2NyaXB0aW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICAgY2hhbm5lbFR5cGUsXG4gICAgICBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLFxuICAgICAgb25NZXNzYWdlOiBvcHRpb25zLm9uTWVzc2FnZSxcbiAgICAgIG9uRGlzY29ubmVjdDogb3B0aW9ucy5vbkRpc2Nvbm5lY3QsXG4gICAgICBvblJlc3VtZTogb3B0aW9ucy5vblJlc3VtZSxcbiAgICAgIG9uQ2xvc2U6IG9wdGlvbnMub25DbG9zZVxuICAgIH0pXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5zZXQoc3Vic2NyaXB0aW9uSWQsIHN1YnNjcmlwdGlvbilcbiAgICB0aGlzLl9zZW5kTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcImNoYW5uZWwtc3Vic2NyaWJlXCIsXG4gICAgICBzdWJzY3JpcHRpb25JZCxcbiAgICAgIGNoYW5uZWxUeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyB8fCB7fSxcbiAgICAgIC4uLihvcHRpb25zLmxhc3RFdmVudElkID8ge2xhc3RFdmVudElkOiBvcHRpb25zLmxhc3RFdmVudElkfSA6IHt9KVxuICAgIH0pXG5cbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnNjcmlwdGlvbklkXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlbW92ZUNoYW5uZWxTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uSWQpIHtcbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIGdsb2JhbCBtZXRhZGF0YSB2YWx1ZSB0aGF0IGlzIHNlbnQgdG8gdGhlIHNlcnZlci5cbiAgICogRm9yIFdlYlNvY2tldCBjb25uZWN0aW9ucywgYSBtZXRhZGF0YSB1cGRhdGUgbWVzc2FnZSBpcyBzZW50IGltbWVkaWF0ZWx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTWV0YWRhdGEga2V5LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBNZXRhZGF0YSB2YWx1ZSAobnVsbCB0byBjbGVhcikuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TWV0YWRhdGEoa2V5LCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgdGhpcy5fbWV0YWRhdGFba2V5XVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tZXRhZGF0YVtrZXldID0gdmFsdWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTikge1xuICAgICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe3R5cGU6IFwibWV0YWRhdGFcIiwgZGF0YTogey4uLnRoaXMuX21ldGFkYXRhfX0pXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIEN1cnJlbnQgbWV0YWRhdGEuICovXG4gIGdldE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB7Li4udGhpcy5fbWV0YWRhdGF9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24gaXMgb3Blbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNvbm5lY3QoKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pIHJldHVyblxuICAgIGlmICh0aGlzLmNvbm5lY3RQcm9taXNlKSByZXR1cm4gdGhpcy5jb25uZWN0UHJvbWlzZVxuXG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnVybClcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIG9uT3BlbilcbiAgICAgICAgdGhpcy5zb2NrZXQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvbk9wZW4gPSAoKSA9PiB7XG4gICAgICAgIGNsZWFudXAoKVxuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoLyoqIEB0eXBlIHtFdmVudCAmIHtlcnJvcj86IHVua25vd259fSAqLyBldmVudCkgPT4ge1xuICAgICAgICBjbGVhbnVwKClcbiAgICAgICAgY29uc3QgZXJyb3IgPSBldmVudD8uZXJyb3IgfHwgbmV3IEVycm9yKFwiV2Vic29ja2V0IGNvbm5lY3Rpb24gZXJyb3JcIilcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwib3BlblwiLCBvbk9wZW4pXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcilcbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMub25NZXNzYWdlKVxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIHRoaXMub25DbG9zZSlcbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0UHJvbWlzZVxuXG4gICAgLy8gQ29sZCByZXN0b3JlIGZyb20gZXh0ZXJuYWwgcGVyc2lzdGVuY2UgKHNlc3Npb25TdG9yZSkgb24gdGhlXG4gICAgLy8gdmVyeSBmaXJzdCBjb25uZWN0OiBhcHBzIHdpcmUgdGhpcyB1cCB0byBzdXJ2aXZlIGEgZnVsbCBwYWdlXG4gICAgLy8gcmVsb2FkLiBBZnRlciB0aGUgZmlyc3QgcmVzdG9yZSBhdHRlbXB0IHRoZSBpbi1tZW1vcnkgY2FjaGVcbiAgICAvLyB0YWtlcyBvdmVyLlxuICAgIGlmICghdGhpcy5fc2Vzc2lvbklkICYmICF0aGlzLl9zZXNzaW9uU3RvcmVSZXN0b3JlZCAmJiB0aGlzLl9zZXNzaW9uU3RvcmUpIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25TdG9yZVJlc3RvcmVkID0gdHJ1ZVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdG9yZWRJZCA9IGF3YWl0IHRoaXMuX3Nlc3Npb25TdG9yZS5nZXQoKVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkSWQgPT09IFwic3RyaW5nXCIgJiYgc3RvcmVkSWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IHN0b3JlZElkXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmdldCBmYWlsZWRcIiwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIGNhY2hlZCBzZXNzaW9uSWQgZnJvbSBhIHByaW9yIGNvbm5lY3QsIGFzayB0aGVcbiAgICAvLyBzZXJ2ZXIgdG8gcmVzdW1lIGl0LiBUaGUgc2VydmVyIHJlcGxpZXMgd2l0aCBlaXRoZXJcbiAgICAvLyBgc2Vzc2lvbi1yZXN1bWVkYCAoc3RhdGUgcHJlc2VydmVkKSBvciBgc2Vzc2lvbi1nb25lYCAoY2xpZW50XG4gICAgLy8gbXVzdCBzdGFydCBmcmVzaCk7IHRoZSBtZXNzYWdlIGRpc3BhdGNoZXIgZmlyZXMgdGhlIGFwcHJvcHJpYXRlXG4gICAgLy8gbGlmZWN5Y2xlIGhvb2tzIG9uIGxpdmUgQ29ubmVjdGlvbiAvIENoYW5uZWwgaGFuZGxlcy5cbiAgICBpZiAodGhpcy5fc2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLl9hd2FpdGluZ1Jlc3VtZSA9IHRydWVcbiAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHt0eXBlOiBcInNlc3Npb24tcmVzdW1lXCIsIHNlc3Npb25JZDogdGhpcy5fc2Vzc2lvbklkfSlcbiAgICAgIC8vIEZpcmUgb25EaXNjb25uZWN0IG9uIGxpdmUgaGFuZGxlcyBzbyBhcHBzIGNhbiBwYXVzZSBVSSB3b3JrXG4gICAgICAvLyB1bnRpbCBzZXNzaW9uLXJlc3VtZWQgLyBzZXNzaW9uLWdvbmUgYXJyaXZlcy5cbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkgY29ubmVjdGlvbi5faGFuZGxlRGlzY29ubmVjdGVkKClcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSBzdWJzY3JpcHRpb24uX2hhbmRsZURpc2Nvbm5lY3RlZCgpXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX21ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7dHlwZTogXCJtZXRhZGF0YVwiLCBkYXRhOiB7Li4udGhpcy5fbWV0YWRhdGF9fSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCBhbmQgZW5hYmxlIGF1dG8tcmVjb25uZWN0LiBSZXNldHMgcmVjb25uZWN0IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbm5lY3RlZC5cbiAgICovXG4gIGFzeW5jIGNvbm5lY3RXaXRoUmVjb25uZWN0KCkge1xuICAgIHRoaXMuYXV0b1JlY29ubmVjdCA9IHRydWVcbiAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPSAwXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ1JlY29ubmVjdCgpXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB3ZWJzb2NrZXQgYW5kIGNsZWFyIHBlbmRpbmcgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuc29ja2V0KSByZXR1cm5cblxuICAgIGlmICh0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5DTE9TRUQpIHtcbiAgICAgIHRoaXMuc29ja2V0ID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQ/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpXG4gICAgICB0aGlzLnNvY2tldD8uY2xvc2UoKVxuICAgIH0pXG5cbiAgICB0aGlzLnNvY2tldCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGF1dG8tcmVjb25uZWN0IGFuZCBjbG9zZSB0aGUgd2Vic29ja2V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNsb3NlZC5cbiAgICovXG4gIGFzeW5jIGRpc2Nvbm5lY3RBbmRTdG9wUmVjb25uZWN0KCkge1xuICAgIHRoaXMuYXV0b1JlY29ubmVjdCA9IGZhbHNlXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ1JlY29ubmVjdCgpXG4gICAgYXdhaXQgdGhpcy5jbG9zZSgpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIHJhdyBzb2NrZXQgd2l0aG91dCBkaXNhYmxpbmcgYXV0by1yZWNvbm5lY3QuIFVzZWQgYnkgdGVzdHMgdG9cbiAgICogc2ltdWxhdGUgYW4gdW5leHBlY3RlZCBuZXR3b3JrIGRyb3AgYW5kIHZlcmlmeSByZWNvbm5lY3Rpb24gYmVoYXZpb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIHNvY2tldCBoYXMgY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgZHJvcENvbm5lY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCkgcmV0dXJuXG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQ/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpXG4gICAgICB0aGlzLnNvY2tldD8uY2xvc2UoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIFBPU1QgcmVxdWVzdCBvdmVyIHRoZSB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aC5cbiAgICogQHBhcmFtIHthbnl9IFtib2R5XSAtIFJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIHt7aGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSBbb3B0aW9uc10gLSBSZXF1ZXN0IG9wdGlvbnMgc3VjaCBhcyBoZWFkZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcG9zdC5cbiAgICovXG4gIGFzeW5jIHBvc3QocGF0aCwgYm9keSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdChcIlBPU1RcIiwgcGF0aCwgey4uLm9wdGlvbnMsIGJvZHl9KVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBHRVQgcmVxdWVzdCBvdmVyIHRoZSB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aC5cbiAgICogQHBhcmFtIHt7aGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSBbb3B0aW9uc10gLSBSZXF1ZXN0IG9wdGlvbnMgc3VjaCBhcyBoZWFkZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgZ2V0LlxuICAgKi9cbiAgYXN5bmMgZ2V0KHBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoXCJHRVRcIiwgcGF0aCwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGZvciBzZXJ2ZXItc2VudCBldmVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBhbnkpID0+IHZvaWR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSB1bnN1YnNjcmliZSBmdW5jdGlvblxuICAgKi9cbiAgb24oY2hhbm5lbCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmUoY2hhbm5lbCwge30sIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzbmFwc2hvdCBvZiB0aGUgY2xpZW50J3MgY29ubmVjdGlvbiBzdGF0ZS5cbiAgICogQHJldHVybnMge3tkaXNjb25uZWN0ZWRTaW5jZTogbnVtYmVyIHwgbnVsbCwgaXNPcGVuOiBib29sZWFuLCBsaXN0ZW5lckNvdW50OiBudW1iZXJ9fVxuICAgKi9cbiAgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc2Nvbm5lY3RlZFNpbmNlOiB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlLFxuICAgICAgaXNPcGVuOiAhIXRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4sXG4gICAgICBsaXN0ZW5lckNvdW50OiB0aGlzLmxpc3RlbmVycy5zaXplICsgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2l6ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGZvciBzZXJ2ZXItc2VudCBldmVudHMgd2l0aCBvcHRpb25hbCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn19IG9wdGlvbnMgLSBTdWJzY3JpcHRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogYW55LCBtZXNzYWdlPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdm9pZH0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgeygoKSA9PiB2b2lkKSAmIHtyZWFkeTogUHJvbWlzZTx2b2lkPn19IC0gVW5zdWJzY3JpYmUgZnVuY3Rpb24gd2l0aCByZWFkaW5lc3MgcHJvbWlzZS5cbiAgICovXG4gIHN1YnNjcmliZShjaGFubmVsLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHBhcmFtcyA9IG9wdGlvbnM/LnBhcmFtc1xuICAgIGNvbnN0IGxhc3RFdmVudElkID0gb3B0aW9ucz8ubGFzdEV2ZW50SWRcbiAgICBjb25zdCBzdWJzY3JpcHRpb25LZXkgPSB0aGlzLl9zdWJzY3JpcHRpb25LZXkoY2hhbm5lbCwgcGFyYW1zKVxuXG4gICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoc3Vic2NyaXB0aW9uS2V5KSkge1xuICAgICAgLyoqIEB0eXBlIHsoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgICAvKiogQHR5cGUgeygodmFsdWU/OiB2b2lkKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCByZXNvbHZlUmVhZHlcbiAgICAgIC8qKiBAdHlwZSB7KChlcnJvcjogdW5rbm93bikgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgICBsZXQgcmVqZWN0UmVhZHlcbiAgICAgIGNvbnN0IHJlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXNvbHZlUmVhZHkgPSByZXNvbHZlXG4gICAgICAgIHJlamVjdFJlYWR5ID0gcmVqZWN0XG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxpc3RlbmVycy5zZXQoc3Vic2NyaXB0aW9uS2V5LCB7XG4gICAgICAgIGNhbGxiYWNrczogbmV3IFNldCgpLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJlYWR5XG4gICAgICB9KVxuICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5zZXQoc3Vic2NyaXB0aW9uS2V5LCB7XG4gICAgICAgIHJlamVjdDogcmVqZWN0UmVhZHkgfHwgKCgpID0+IHt9KSxcbiAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZVJlYWR5IHx8ICgoKSA9PiB7fSlcbiAgICAgIH0pXG5cbiAgICAgIHZvaWQgdGhpcy5jb25uZWN0KCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zLCB0eXBlOiBcInN1YnNjcmliZVwifSlcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gdGhpcy5fZGVidWcoXCJTdWJzY3JpYmUgZmFpbGVkXCIsIGVycm9yKSlcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ZW5lckVudHJ5ID0gdGhpcy5saXN0ZW5lcnMuZ2V0KHN1YnNjcmlwdGlvbktleSlcblxuICAgIGlmICghbGlzdGVuZXJFbnRyeSkgdGhyb3cgbmV3IEVycm9yKFwiTGlzdGVuZXJzIG1hcCBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgIGxpc3RlbmVyRW50cnkuY2FsbGJhY2tzLmFkZChjYWxsYmFjaylcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgbGlzdGVuZXJFbnRyeS5jYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKVxuXG4gICAgICBpZiAobGlzdGVuZXJFbnRyeS5jYWxsYmFja3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUoc3Vic2NyaXB0aW9uS2V5KVxuICAgICAgfVxuICAgIH1cblxuICAgIHVuc3Vic2NyaWJlLnJlYWR5ID0gbGlzdGVuZXJFbnRyeS5yZWFkeVxuXG4gICAgcmV0dXJuIHVuc3Vic2NyaWJlXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGEgY2hhbm5lbCBhbmQgd2FpdCB1bnRpbCB0aGUgc2VydmVyIGFja25vd2xlZGdlcyB0aGUgc3Vic2NyaXB0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7bGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT59fSBvcHRpb25zIC0gU3Vic2NyaXB0aW9uIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IGFueSwgbWVzc2FnZT86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCgoKSA9PiB2b2lkKSAmIHtyZWFkeTogUHJvbWlzZTx2b2lkPn0+fSAtIFJlYWR5IHVuc3Vic2NyaWJlIGhhbmRsZS5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZUFuZFdhaXQoY2hhbm5lbCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBjb25zdCB1bnN1YnNjcmliZSA9IHRoaXMuc3Vic2NyaWJlKGNoYW5uZWwsIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gICAgYXdhaXQgdW5zdWJzY3JpYmUucmVhZHlcblxuICAgIHJldHVybiB1bnN1YnNjcmliZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBIVFRQIG1ldGhvZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSBbb3B0aW9ucy5ib2R5XSAtIFJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbb3B0aW9ucy5oZWFkZXJzXSAtIEhlYWRlciBsaXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHJlcXVlc3QobWV0aG9kLCBwYXRoLCB7Ym9keSwgaGVhZGVyc30gPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG5cbiAgICBjb25zdCBpZCA9IGB3cy0ke3RoaXMubmV4dElEKyt9YFxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIGlkLFxuICAgICAgbWV0aG9kLFxuICAgICAgcGF0aCxcbiAgICAgIHR5cGU6IFwicmVxdWVzdFwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLnNldChpZCwge3Jlc29sdmUsIHJlamVjdH0pXG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZShwYXlsb2FkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnQ8YW55Pn0gZXZlbnQgLSBFdmVudCBwYXlsb2FkLlxuICAgKi9cbiAgb25NZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgcmF3ID0gdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgPyBldmVudC5kYXRhIDogZXZlbnQuZGF0YT8udG9TdHJpbmc/LigpXG5cbiAgICBpZiAoIXJhdykgcmV0dXJuXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgbGV0IG1lc3NhZ2VcblxuICAgIHRyeSB7XG4gICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShyYXcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiRmFpbGVkIHRvIHBhcnNlIHdlYnNvY2tldCBtZXNzYWdlXCIsIGVycm9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGV9ID0gbWVzc2FnZVxuXG4gICAgaWYgKHR5cGUgPT09IFwicmVzcG9uc2VcIikge1xuICAgICAgY29uc3Qge2lkfSA9IG1lc3NhZ2VcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBpZCA/IHRoaXMucGVuZGluZ1JlcXVlc3RzLmdldChpZCkgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGlkKVxuICAgICAgICBwZW5kaW5nLnJlc29sdmUobmV3IFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlKG1lc3NhZ2UpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGVidWcoYE5vIHBlbmRpbmcgcmVxdWVzdCBmb3IgcmVzcG9uc2UgaWQgJHtpZH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJzdWJzY3JpYmVkXCIpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShtZXNzYWdlLmNoYW5uZWwsIG1lc3NhZ2UucGFyYW1zKVxuICAgICAgY29uc3QgcGVuZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbktleSlcblxuICAgICAgaWYgKHBlbmRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uS2V5KVxuICAgICAgICBwZW5kaW5nU3Vic2NyaXB0aW9uLnJlc29sdmUoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJldmVudFwiKSB7XG4gICAgICBjb25zdCB7Y2hhbm5lbCwgcGF5bG9hZH0gPSBtZXNzYWdlXG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyRW50cnkgb2YgdGhpcy5saXN0ZW5lcnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyRW50cnkuY2hhbm5lbCAhPT0gY2hhbm5lbCkgY29udGludWVcblxuICAgICAgICBsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5mb3JFYWNoKCgvKiogQHR5cGUgeyhwYXlsb2FkOiBhbnksIG1lc3NhZ2U/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkfSAqLyBjYWxsYmFjaykgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsYmFjayhwYXlsb2FkLCBtZXNzYWdlKVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZyhcIkxpc3RlbmVyIGVycm9yXCIsIGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwicmVwbGF5LWdhcFwiKSB7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb25LZXkgPSB0aGlzLl9zdWJzY3JpcHRpb25LZXkobWVzc2FnZS5jaGFubmVsLCBtZXNzYWdlLnBhcmFtcylcbiAgICAgIGNvbnN0IHBlbmRpbmdTdWJzY3JpcHRpb24gPSB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLmdldChzdWJzY3JpcHRpb25LZXkpXG5cbiAgICAgIGlmIChwZW5kaW5nU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbktleSlcbiAgICAgICAgcGVuZGluZ1N1YnNjcmlwdGlvbi5yZWplY3QobmV3IEVycm9yKGBSZXBsYXkgZ2FwIGZvciAke21lc3NhZ2UuY2hhbm5lbH1gKSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1vcGVuZWRcIikge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChtZXNzYWdlLmNvbm5lY3Rpb25JZClcblxuICAgICAgY29ubmVjdGlvbj8uX2hhbmRsZU9wZW5lZCgpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNvbm5lY3Rpb24tbWVzc2FnZVwiKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuXG4gICAgICBjb25uZWN0aW9uPy5faGFuZGxlTWVzc2FnZShtZXNzYWdlLmJvZHkpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNvbm5lY3Rpb24tY2xvc2VkXCIpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9ucy5nZXQobWVzc2FnZS5jb25uZWN0aW9uSWQpXG5cbiAgICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShtZXNzYWdlLmNvbm5lY3Rpb25JZClcbiAgICAgICAgY29ubmVjdGlvbi5faGFuZGxlQ2xvc2VkKG1lc3NhZ2UucmVhc29uIHx8IFwic2VydmVyX2Nsb3NlXCIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNvbm5lY3Rpb24tZXJyb3JcIikge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChtZXNzYWdlLmNvbm5lY3Rpb25JZClcblxuICAgICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuICAgICAgICBjb25uZWN0aW9uLl9oYW5kbGVDbG9zZWQoYGVycm9yOiAke21lc3NhZ2UubWVzc2FnZSB8fCBcImNvbm5lY3Rpb24tZXJyb3JcIn1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLXN1YnNjcmliZWRcIikge1xuICAgICAgY29uc3Qgc3ViID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KG1lc3NhZ2Uuc3Vic2NyaXB0aW9uSWQpXG5cbiAgICAgIHN1Yj8uX2hhbmRsZVN1YnNjcmliZWQoKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLW1lc3NhZ2VcIikge1xuICAgICAgY29uc3Qgc3ViID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KG1lc3NhZ2Uuc3Vic2NyaXB0aW9uSWQpXG5cbiAgICAgIHN1Yj8uX2hhbmRsZU1lc3NhZ2UobWVzc2FnZS5ib2R5KVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLXVuc3Vic2NyaWJlZFwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgaWYgKHN1Yikge1xuICAgICAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcbiAgICAgICAgc3ViLl9oYW5kbGVDbG9zZWQoXCJzZXJ2ZXJfdW5zdWJzY3JpYmVcIilcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY2hhbm5lbC1lcnJvclwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgaWYgKHN1Yikge1xuICAgICAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcbiAgICAgICAgc3ViLl9oYW5kbGVDbG9zZWQoYGVycm9yOiAke21lc3NhZ2UubWVzc2FnZSB8fCBcImNoYW5uZWwtZXJyb3JcIn1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJzZXNzaW9uLWVzdGFibGlzaGVkXCIpIHtcbiAgICAgIC8vIEZpcnN0IGNvbm5lY3Q6IGNhY2hlIHNlc3Npb25JZCBmb3IgZnV0dXJlIHJlc3VtZSBhdHRlbXB0cy5cbiAgICAgIGlmICghdGhpcy5fYXdhaXRpbmdSZXN1bWUpIHtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbklkID0gbWVzc2FnZS5zZXNzaW9uSWRcbiAgICAgICAgdGhpcy5fcGVyc2lzdFNlc3Npb25JZChtZXNzYWdlLnNlc3Npb25JZClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwic2Vzc2lvbi1yZXN1bWVkXCIpIHtcbiAgICAgIHRoaXMuX2F3YWl0aW5nUmVzdW1lID0gZmFsc2VcbiAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IG1lc3NhZ2Uuc2Vzc2lvbklkXG4gICAgICB0aGlzLl9wZXJzaXN0U2Vzc2lvbklkKG1lc3NhZ2Uuc2Vzc2lvbklkKVxuICAgICAgLy8gRmlyZSBvblJlc3VtZSBvbiBldmVyeSBsaXZlIGhhbmRsZSBzbyB1c2VyIGNvZGUga25vd3MgdGhlXG4gICAgICAvLyBzZXNzaW9uIGNhbWUgYmFjayB3aXRoIHN0YXRlIGludGFjdC5cbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkgY29ubmVjdGlvbi5faGFuZGxlUmVzdW1lZCgpXG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkgc3Vic2NyaXB0aW9uLl9oYW5kbGVSZXN1bWVkKClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwic2Vzc2lvbi1nb25lXCIpIHtcbiAgICAgIHRoaXMuX2F3YWl0aW5nUmVzdW1lID0gZmFsc2VcbiAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IG51bGxcbiAgICAgIHRoaXMuX2NsZWFyUGVyc2lzdGVkU2Vzc2lvbklkKClcbiAgICAgIC8vIFRlYXIgZG93biBldmVyeSBsaXZlIGhhbmRsZSDigJQgdGhlaXIgc2VydmVyLXNpZGUgY291bnRlcnBhcnRzXG4gICAgICAvLyBhcmUgZ29uZSBhbmQgbm90aGluZyBjYW4gYnJpbmcgdGhlbSBiYWNrLlxuICAgICAgY29uc3QgY29ubmVjdGlvbnMgPSBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldXG4gICAgICB0aGlzLl9jb25uZWN0aW9ucy5jbGVhcigpXG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIGNvbm5lY3Rpb24uX2hhbmRsZUNsb3NlZChcInNlc3Npb25fZ29uZVwiKVxuXG4gICAgICBjb25zdCBzdWJzID0gWy4uLnRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2Ygc3Vicykgc3Vic2NyaXB0aW9uLl9oYW5kbGVDbG9zZWQoXCJzZXNzaW9uX2dvbmVcIilcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiZXJyb3JcIiAmJiBtZXNzYWdlLmlkKSB7XG4gICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KG1lc3NhZ2UuaWQpXG5cbiAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmRlbGV0ZShtZXNzYWdlLmlkKVxuICAgICAgICBwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvciB8fCBcIlVua25vd24gd2Vic29ja2V0IGVycm9yXCIpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkfSBwYXJhbXMgLSBTdWJzY3JpcHRpb24gcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0YWJsZSBzdWJzY3JpcHRpb24ga2V5LlxuICAgKi9cbiAgX3N1YnNjcmlwdGlvbktleShjaGFubmVsLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW2NoYW5uZWwsIHBhcmFtcyB8fCBudWxsXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3QgYWxsIHBlbmRpbmcgcmVxdWVzdHMgd2hlbiB0aGUgc29ja2V0IGNsb3Nlcy4gU2NoZWR1bGVzIHJlY29ubmVjdCBpZiBlbmFibGVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25DbG9zZSA9ICgpID0+IHtcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlIHx8PSBEYXRlLm5vdygpXG5cbiAgICBmb3IgKGNvbnN0IFtpZCwge3JlamVjdH1dIG9mIHRoaXMucGVuZGluZ1JlcXVlc3RzLmVudHJpZXMoKSkge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgV2Vic29ja2V0IGNsb3NlZCBiZWZvcmUgcmVzcG9uc2UgZm9yICR7aWR9YCkpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7cmVqZWN0fSBvZiB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKFwiV2Vic29ja2V0IGNsb3NlZCBiZWZvcmUgc3Vic2NyaXB0aW9uIGFja25vd2xlZGdlbWVudFwiKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Vzc2lvbklkICYmIHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgLy8gU2Vzc2lvbiBtYXkgcmVzdW1lIHdoZW4gd2UgcmVjb25uZWN0IOKAlCBrZWVwIHRoZSBoYW5kbGVzIGFsaXZlXG4gICAgICAvLyBhbmQgZmlyZSBvbkRpc2Nvbm5lY3Qgc28gdXNlciBjb2RlIGNhbiBwYXVzZSBVSSB3b3JrLlxuICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpKSBjb25uZWN0aW9uLl9oYW5kbGVEaXNjb25uZWN0ZWQoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHN1YnNjcmlwdGlvbi5faGFuZGxlRGlzY29ubmVjdGVkKClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gcmVzdW1lIHBhdGg6IHRlYXIgZG93biBldmVyeSBsaXZlIENvbm5lY3Rpb24gLyBDaGFubmVsIHN1Yi5cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gWy4uLnRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICAgIGNvbm5lY3Rpb24uX2hhbmRsZUNsb3NlZChcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxTdWJzID0gWy4uLnRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgY2hhbm5lbFN1YnMpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLl9oYW5kbGVDbG9zZWQoXCJzZXNzaW9uX2Rlc3Ryb3llZFwiKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXNzaW9uSWQgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuY2xlYXIoKVxuICAgIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuY2xlYXIoKVxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSB1bmRlZmluZWRcblxuICAgIGlmICh0aGlzLmF1dG9SZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlUmVjb25uZWN0KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zZW5kTWVzc2FnZShwYXlsb2FkKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgaXMgbm90IG9wZW5cIilcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcblxuICAgIHRoaXMuX2RlYnVnKFwiU2VuZGluZ1wiLCBqc29uKVxuICAgIHRoaXMuc29ja2V0LnNlbmQoanNvbilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKSB7XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZXIpXG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3NjaGVkdWxlUmVjb25uZWN0KCkge1xuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuXG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLnJlY29ubmVjdERlbGF5c1tNYXRoLm1pbih0aGlzLnJlY29ubmVjdEF0dGVtcHQsIHRoaXMucmVjb25uZWN0RGVsYXlzLmxlbmd0aCAtIDEpXVxuXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgICAgdm9pZCB0aGlzLl9hdHRlbXB0UmVjb25uZWN0KClcbiAgICB9LCBkZWxheSlcblxuICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCArPSAxXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIF9hdHRlbXB0UmVjb25uZWN0KCkge1xuICAgIGlmICghdGhpcy5hdXRvUmVjb25uZWN0KSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgICAgIHRoaXMuX3Jlc3Vic2NyaWJlQWN0aXZlTGlzdGVuZXJzKClcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uUmVjb25uZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vblJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiUmVjb25uZWN0IGF0dGVtcHQgZmFpbGVkOlwiLCBlcnJvcilcblxuICAgICAgaWYgKHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgICB0aGlzLl9zY2hlZHVsZVJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLXNlbmRzIHN1YnNjcmliZSBtZXNzYWdlcyBmb3IgYWxsIGFjdGl2ZSBsaXN0ZW5lcnMgYWZ0ZXIgcmVjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZXN1YnNjcmliZUFjdGl2ZUxpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxpc3RlbmVyRW50cnldIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7XG4gICAgICAgICAgY2hhbm5lbDogbGlzdGVuZXJFbnRyeS5jaGFubmVsLFxuICAgICAgICAgIHBhcmFtczogbGlzdGVuZXJFbnRyeS5wYXJhbXMsXG4gICAgICAgICAgdHlwZTogXCJzdWJzY3JpYmVcIlxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoXCJSZS1zdWJzY3JpYmUgZmFpbGVkOlwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9kZWJ1ZyguLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLmRlYnVnKSByZXR1cm5cblxuICAgIGNvbnNvbGUuZGVidWcoXCJbVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50XVwiLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgLSBJZCB0byBwZXJzaXN0IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgc2Vzc2lvblN0b3JlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9wZXJzaXN0U2Vzc2lvbklkKHNlc3Npb25JZCkge1xuICAgIGlmICghdGhpcy5fc2Vzc2lvblN0b3JlKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9zZXNzaW9uU3RvcmUuc2V0KHNlc3Npb25JZClcblxuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXN1bHQuY2F0Y2goKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gZXJyb3IpID0+IHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLnNldCBmYWlsZWRcIiwgZXJyb3IpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9kZWJ1ZyhcInNlc3Npb25TdG9yZS5zZXQgZmFpbGVkXCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9jbGVhclBlcnNpc3RlZFNlc3Npb25JZCgpIHtcbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25TdG9yZSkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc2Vzc2lvblN0b3JlLmNsZWFyKClcblxuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXN1bHQuY2F0Y2goKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gZXJyb3IpID0+IHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmNsZWFyIGZhaWxlZFwiLCBlcnJvcikpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmNsZWFyIGZhaWxlZFwiLCBlcnJvcilcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2Uge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzcG9uc2VNZXNzYWdlID0gLyoqIEB0eXBlIHt7Ym9keT86IGFueSwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIGFueT4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgc3RhdHVzQ29kZT86IG51bWJlciwgc3RhdHVzTWVzc2FnZT86IHN0cmluZywgdHlwZT86IHN0cmluZ319ICovIChtZXNzYWdlKVxuXG4gICAgdGhpcy5ib2R5ID0gcmVzcG9uc2VNZXNzYWdlLmJvZHlcbiAgICB0aGlzLmhlYWRlcnMgPSByZXNwb25zZU1lc3NhZ2UuaGVhZGVycyB8fCB7fVxuICAgIHRoaXMuaWQgPSByZXNwb25zZU1lc3NhZ2UuaWRcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSByZXNwb25zZU1lc3NhZ2Uuc3RhdHVzQ29kZSB8fCAyMDBcbiAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSByZXNwb25zZU1lc3NhZ2Uuc3RhdHVzTWVzc2FnZSB8fCBcIk9LXCJcbiAgICB0aGlzLnR5cGUgPSByZXNwb25zZU1lc3NhZ2UudHlwZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHthbnl9IC0gVGhlIGpzb24uICAqL1xuICBqc29uKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5ib2R5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNwb25zZSBib2R5IGlzIG5vdCBhIHN0cmluZ1wiKVxuICAgIH1cblxuICAgIHJldHVybiBkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShKU09OLnBhcnNlKHRoaXMuYm9keSkpXG4gIH1cbn1cbiJdfQ==
852
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGtDQUFrQyxNQUFNLDJCQUEyQixDQUFBO0FBQzFFLE9BQU8sb0NBQW9DLE1BQU0sd0JBQXdCLENBQUE7QUFDekUsT0FBTyxFQUFDLHNDQUFzQyxFQUFDLE1BQU0sK0NBQStDLENBQUE7QUFFcEcsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUVoRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHdCQUF3QjtJQUMzQyx1SEFBdUg7SUFDdkgsZUFBZSxDQUFBO0lBQ2YsK0ZBQStGO0lBQy9GLG9CQUFvQixDQUFBO0lBQ3BCLG9KQUFvSjtJQUNwSixTQUFTLENBQUE7SUFFVDs7Ozs7Ozs7T0FRRztJQUNILFlBQVksRUFBQyxhQUFhLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFDLEdBQUcsRUFBRTtRQUN4RyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUE7UUFFL0Usc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFBO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUNoQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQUUs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R0FBRyxlQUFlLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQTtRQUNuRCxJQUFJLENBQUMsYUFBYSxHQUFHLGVBQWUsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFBO1FBQzFELElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQTtJQUNsQyxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLElBQUk7UUFDRixJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFDbEQsQ0FBQztRQUVELE9BQU8sc0NBQXNDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUN0RSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFZlbG9jaW91c1dlYnNvY2tldENsaWVudENvbm5lY3Rpb24gZnJvbSBcIi4vd2Vic29ja2V0LWNvbm5lY3Rpb24uanNcIlxuaW1wb3J0IFZlbG9jaW91c1dlYnNvY2tldENsaWVudFN1YnNjcmlwdGlvbiBmcm9tIFwiLi93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5pbXBvcnQge2Rlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL3RyYW5zcG9ydC1zZXJpYWxpemF0aW9uLmpzXCJcblxuY29uc3QgREVGQVVMVF9SRUNPTk5FQ1RfREVMQVlTID0gWzEwMDAsIDIwMDAsIDQwMDAsIDgwMDAsIDE1MDAwXVxuXG4vKipcbiAqIEEgc21hbGwgd2Vic29ja2V0IGNsaWVudCB0aGF0IG1pcnJvcnMgc2ltcGxlIEhUVFAtc3R5bGUgY2FsbHMgYW5kIGNoYW5uZWwgc3Vic2NyaXB0aW9ucy5cbiAqIFN1cHBvcnRzIG9wdGlvbmFsIGF1dG8tcmVjb25uZWN0IHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBhbmQgbGlzdGVuZXIgcmUtc3Vic2NyaXB0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnQge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtyZWplY3Q6IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCwgcmVzb2x2ZTogKHJlc3BvbnNlOiBWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZSkgPT4gdm9pZH0+fSAqL1xuICBwZW5kaW5nUmVxdWVzdHNcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7cmVqZWN0OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQsIHJlc29sdmU6ICh2YWx1ZT86IHZvaWQpID0+IHZvaWR9Pn0gKi9cbiAgcGVuZGluZ1N1YnNjcmlwdGlvbnNcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7Y2FsbGJhY2tzOiBTZXQ8KHBheWxvYWQ6IGFueSkgPT4gdm9pZD4sIGNoYW5uZWw6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkLCByZWFkeTogUHJvbWlzZTx2b2lkPn0+fSAqL1xuICBsaXN0ZW5lcnNcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmF1dG9SZWNvbm5lY3RdIC0gRW5hYmxlIGF1dG8tcmVjb25uZWN0IHdpdGggZXhwb25lbnRpYWwgYmFja29mZi5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z10gLSBXaGV0aGVyIGRlYnVnLlxuICAgKiBAcGFyYW0ge3tnZXRJc09ubGluZT86ICgpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+LCBzdWJzY3JpYmU/OiAoY2FsbGJhY2s6IChpc09ubGluZTogYm9vbGVhbikgPT4gdm9pZCkgPT4gKCgpID0+IHZvaWQpIHwge3JlbW92ZTogKCkgPT4gdm9pZH19fSBbYXJncy5uZXR3b3JrTW9uaXRvcl0gLSBPcHRpb25hbCBvbmxpbmUtc3RhdGUgYWRhcHRlci4gV2hlbiBwcm92aWRlZCwgYXV0by1yZWNvbm5lY3QgY2FuIHdhaXQgZm9yIHRoZSBuZXR3b3JrIHRvIHJlcG9ydCBvbmxpbmUgYmVmb3JlIHJlY29ubmVjdGluZywgYW5kIG9wZW4gc29ja2V0cyBhcmUgY2xvc2VkIHdoZW4gdGhlIG1vbml0b3IgcmVwb3J0cyBvZmZsaW5lLlxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbYXJncy5yZWNvbm5lY3REZWxheXNdIC0gQmFja29mZiBkZWxheXMgaW4gbXMgKGRlZmF1bHQ6IFsxMDAwLCAyMDAwLCA0MDAwLCA4MDAwLCAxNTAwMF0pLlxuICAgKiBAcGFyYW0ge3tnZXQ6ICgpID0+IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgfCBQcm9taXNlPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+LCBzZXQ6IChzZXNzaW9uSWQ6IHN0cmluZykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4sIGNsZWFyOiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPn19IFthcmdzLnNlc3Npb25TdG9yZV0gLSBPcHRpb25hbCBzZXNzaW9uSWQgcGVyc2lzdGVuY2UgaG9vay4gV2hlbiBwcm92aWRlZCwgdGhlIGNsaWVudCB3cml0ZXMgZXZlcnkgYHNlc3Npb24tZXN0YWJsaXNoZWRgIC8gYHNlc3Npb24tcmVzdW1lZGAgaWQgdmlhIGBzdG9yZS5zZXQoaWQpYCBhbmQgY2xlYXJzIGl0IG9uIGBzZXNzaW9uLWdvbmVgLiBCZWZvcmUgdGhlIGZpcnN0IGBjb25uZWN0KClgLCB0aGUgY2xpZW50IHJlYWRzIGFueSBwZXJzaXN0ZWQgaWQgdmlhIGBzdG9yZS5nZXQoKWAgYW5kIGF0dGVtcHRzIHJlc3VtcHRpb24uIEFwcHMgc2hvdWxkIGJhY2sgdGhpcyBieSB3aGF0ZXZlciBwZXJzaXN0ZW5jZSBsYXllciBzdXJ2aXZlcyBwYWdlIHJlbG9hZHMgKGxvY2FsU3RvcmFnZSwgYSBjb29raWUsIFNRTGl0ZSwgZXRjLikuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy51cmxdIEZ1bGwgd2Vic29ja2V0IFVSTCAoZGVmYXVsdDogd3M6Ly8xMjcuMC4wLjE6MzAwNi93ZWJzb2NrZXQpXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7YXV0b1JlY29ubmVjdCA9IHRydWUsIGRlYnVnID0gZmFsc2UsIG5ldHdvcmtNb25pdG9yLCByZWNvbm5lY3REZWxheXMsIHNlc3Npb25TdG9yZSwgdXJsfSA9IHt9KSB7XG4gICAgaWYgKCFnbG9iYWxUaGlzLldlYlNvY2tldCkgdGhyb3cgbmV3IEVycm9yKFwiV2ViU29ja2V0IGdsb2JhbCBpcyBub3QgYXZhaWxhYmxlXCIpXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5hdXRvUmVjb25uZWN0ID0gYXV0b1JlY29ubmVjdFxuICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyIHwgbnVsbH0gKi9cbiAgICB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlID0gbnVsbFxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCA9IDBcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLmNvbm5lY3Rpb25BdHRlbXB0cyA9IDBcbiAgICAvKiogQHR5cGUge251bWJlcltdfSAqL1xuICAgIHRoaXMucmVjb25uZWN0RGVsYXlzID0gcmVjb25uZWN0RGVsYXlzIHx8IERFRkFVTFRfUkVDT05ORUNUX0RFTEFZU1xuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsfSAqL1xuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsXG4gICAgdGhpcy51cmwgPSB1cmwgfHwgXCJ3czovLzEyNy4wLjAuMTozMDA2L3dlYnNvY2tldFwiXG4gICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgTWFwKClcbiAgICB0aGlzLm5leHRJRCA9IDFcbiAgICAvKiogQHR5cGUgeygoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCBudWxsfSAqL1xuICAgIHRoaXMub25SZWNvbm5lY3QgPSBudWxsXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5fbWV0YWRhdGEgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9uPn0gKi9cbiAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRTdWJzY3JpcHRpb24+fSAqL1xuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpXG5cbiAgICB0aGlzLl9uZXh0Q29ubmVjdGlvbklkU2VxID0gMVxuICAgIHRoaXMuX25leHRTdWJzY3JpcHRpb25JZFNlcSA9IDFcblxuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVsbH0gLSBzZXNzaW9uSWQgcmVjZWl2ZWQgZnJvbSBgc2Vzc2lvbi1lc3RhYmxpc2hlZGA7IHNlbnQgb24gcmVjb25uZWN0IGZvciByZXN1bXB0aW9uLiAqL1xuICAgIHRoaXMuX3Nlc3Npb25JZCA9IG51bGxcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gLSB0cnVlIGJldHdlZW4gYSByZWNvbm5lY3QgYW5kIHRoZSBzZXNzaW9uLXJlc3VtZWQgLyBzZXNzaW9uLWdvbmUgcmVwbHkuICovXG4gICAgdGhpcy5fYXdhaXRpbmdSZXN1bWUgPSBmYWxzZVxuXG4gICAgLyoqIEB0eXBlIHt7Z2V0OiAoKSA9PiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPiwgc2V0OiAoc2Vzc2lvbklkOiBzdHJpbmcpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LCBjbGVhcjogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59IHwgdW5kZWZpbmVkfSAqL1xuICAgIHRoaXMuX3Nlc3Npb25TdG9yZSA9IHNlc3Npb25TdG9yZVxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gLSB0cnVlIG9uY2UgdGhlIHNlc3Npb25TdG9yZSBoYXMgYmVlbiBjb25zdWx0ZWQgZm9yIGEgcmVzdG9yZWQgaWQuICovXG4gICAgdGhpcy5fc2Vzc2lvblN0b3JlUmVzdG9yZWQgPSBmYWxzZVxuXG4gICAgLyoqIEB0eXBlIHt7Z2V0SXNPbmxpbmU/OiAoKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiwgc3Vic2NyaWJlPzogKGNhbGxiYWNrOiAoaXNPbmxpbmU6IGJvb2xlYW4pID0+IHZvaWQpID0+ICgoKSA9PiB2b2lkKSB8IHtyZW1vdmU6ICgpID0+IHZvaWR9fSB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLl9uZXR3b3JrTW9uaXRvciA9IG5ldHdvcmtNb25pdG9yXG5cbiAgICAvKiogQHR5cGUge251bGwgfCAoKCkgPT4gdm9pZCkgfCB7cmVtb3ZlOiAoKSA9PiB2b2lkfX0gKi9cbiAgICB0aGlzLl9uZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbiA9IG51bGxcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gZmFsc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNPcGVuKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pXG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSAxOjEgYFdlYnNvY2tldENvbm5lY3Rpb25gIG9mIHRoZSBnaXZlbiB0eXBlIGFnYWluc3QgdGhlXG4gICAqIHNlcnZlci4gUmVxdWlyZXMgdGhlIHNvY2tldCB0byBhbHJlYWR5IGJlIGNvbm5lY3RlZCAoY2FsbFxuICAgKiBgY29ubmVjdCgpYCBmaXJzdCkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uVHlwZSAtIE5hbWUgdGhlIHNlcnZlciByZWdpc3RlcmVkIHRoZSBjbGFzcyB1bmRlci5cbiAgICogQHBhcmFtIHt7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Piwgb25Db25uZWN0PzogKCkgPT4gdm9pZCwgb25NZXNzYWdlPzogKGJvZHk6IGFueSkgPT4gdm9pZCwgb25EaXNjb25uZWN0PzogKCkgPT4gdm9pZCwgb25SZXN1bWU/OiAoKSA9PiB2b2lkLCBvbkNsb3NlPzogKHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkfX0gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9ufVxuICAgKi9cbiAgb3BlbkNvbm5lY3Rpb24oY29ubmVjdGlvblR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgdGhyb3cgbmV3IEVycm9yKFwiV2Vic29ja2V0IGlzIG5vdCBvcGVuOyBjYWxsIGNvbm5lY3QoKSBmaXJzdFwiKVxuXG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gYGMke3RoaXMuX25leHRDb25uZWN0aW9uSWRTZXErK31gXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGNvbm5lY3Rpb25UeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICAgIG9uQ29ubmVjdDogb3B0aW9ucy5vbkNvbm5lY3QsXG4gICAgICBvbk1lc3NhZ2U6IG9wdGlvbnMub25NZXNzYWdlLFxuICAgICAgb25EaXNjb25uZWN0OiBvcHRpb25zLm9uRGlzY29ubmVjdCxcbiAgICAgIG9uUmVzdW1lOiBvcHRpb25zLm9uUmVzdW1lLFxuICAgICAgb25DbG9zZTogb3B0aW9ucy5vbkNsb3NlXG4gICAgfSlcblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjb25uZWN0aW9uLW9wZW5cIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGNvbm5lY3Rpb25UeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyB8fCB7fVxuICAgIH0pXG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIGEgY29ubmVjdGlvbiBoYW5kbGUgZnJvbSB0aGUgcmVnaXN0cnkuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50Q29ubmVjdGlvbi5jbG9zZSgpYCBhZnRlciBpdCBub3RpZmllc1xuICAgKiB0aGUgc2VydmVyLCBhbmQgYnkgdGhlIHNlc3Npb24tZGVzdHJveWVkIGNsZWFudXAgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbm5lY3Rpb25JZFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkge1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhIG5hbWVkIFdlYnNvY2tldENoYW5uZWwuIElmIHRoZSBzb2NrZXQgaXMgbm90IHlldFxuICAgKiBvcGVuLCB0aGUgc3Vic2NyaXB0aW9uIGlzIHF1ZXVlZCBhbmQgc2VudCBvbmNlIGEgY29ubmVjdGlvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWxUeXBlIC0gTmFtZSB0aGUgc2VydmVyIHJlZ2lzdGVyZWQgdGhlIGNoYW5uZWwgdW5kZXIuXG4gICAqIEBwYXJhbSB7e3BhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIGxhc3RFdmVudElkPzogc3RyaW5nLCBvbk1lc3NhZ2U/OiAoYm9keTogYW55KSA9PiB2b2lkLCBvbkRpc2Nvbm5lY3Q/OiAoKSA9PiB2b2lkLCBvblJlc3VtZT86ICgpID0+IHZvaWQsIG9uQ2xvc2U/OiAocmVhc29uOiBzdHJpbmcpID0+IHZvaWR9fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge1ZlbG9jaW91c1dlYnNvY2tldENsaWVudFN1YnNjcmlwdGlvbn1cbiAgICovXG4gIHN1YnNjcmliZUNoYW5uZWwoY2hhbm5lbFR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbklkID0gYHMke3RoaXMuX25leHRTdWJzY3JpcHRpb25JZFNlcSsrfWBcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50U3Vic2NyaXB0aW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICAgY2hhbm5lbFR5cGUsXG4gICAgICBsYXN0RXZlbnRJZDogb3B0aW9ucy5sYXN0RXZlbnRJZCxcbiAgICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMsXG4gICAgICBvbk1lc3NhZ2U6IG9wdGlvbnMub25NZXNzYWdlLFxuICAgICAgb25EaXNjb25uZWN0OiBvcHRpb25zLm9uRGlzY29ubmVjdCxcbiAgICAgIG9uUmVzdW1lOiBvcHRpb25zLm9uUmVzdW1lLFxuICAgICAgb25DbG9zZTogb3B0aW9ucy5vbkNsb3NlXG4gICAgfSlcblxuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnNldChzdWJzY3JpcHRpb25JZCwgc3Vic2NyaXB0aW9uKVxuICAgIHRoaXMuX3NlbmRDaGFubmVsU3Vic2NyaWJlKHN1YnNjcmlwdGlvbilcblxuICAgIHJldHVybiBzdWJzY3JpcHRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3Vic2NyaXB0aW9uSWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVtb3ZlQ2hhbm5lbFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb25JZCkge1xuICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25JZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1ZlbG9jaW91c1dlYnNvY2tldENsaWVudFN1YnNjcmlwdGlvbn0gc3Vic2NyaXB0aW9uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3NlbmRDaGFubmVsU3Vic2NyaWJlKHN1YnNjcmlwdGlvbikge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSB8fCAhc3Vic2NyaXB0aW9uLl9uZWVkc1N1YnNjcmliZSgpKSByZXR1cm5cblxuICAgIHN1YnNjcmlwdGlvbi5fbWFya1N1YnNjcmliZVNlbnQoKVxuICAgIHRoaXMuX3NlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiY2hhbm5lbC1zdWJzY3JpYmVcIixcbiAgICAgIHN1YnNjcmlwdGlvbklkOiBzdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uSWQsXG4gICAgICBjaGFubmVsVHlwZTogc3Vic2NyaXB0aW9uLmNoYW5uZWxUeXBlLFxuICAgICAgcGFyYW1zOiBzdWJzY3JpcHRpb24ucGFyYW1zLFxuICAgICAgLi4uKHN1YnNjcmlwdGlvbi5sYXN0RXZlbnRJZCA/IHtsYXN0RXZlbnRJZDogc3Vic2NyaXB0aW9uLmxhc3RFdmVudElkfSA6IHt9KVxuICAgIH0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIF9zZW5kUGVuZGluZ0NoYW5uZWxTdWJzY3JpcHRpb25zKCkge1xuICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLl9zZW5kQ2hhbm5lbFN1YnNjcmliZShzdWJzY3JpcHRpb24pXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAqL1xuICBhc3luYyBfaXNPbmxpbmUoKSB7XG4gICAgaWYgKCF0aGlzLl9uZXR3b3JrTW9uaXRvcj8uZ2V0SXNPbmxpbmUpIHJldHVybiB0cnVlXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX25ldHdvcmtNb25pdG9yLmdldElzT25saW5lKCkgIT09IGZhbHNlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwibmV0d29ya01vbml0b3IuZ2V0SXNPbmxpbmUgZmFpbGVkXCIsIGVycm9yKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59ICovXG4gIGFzeW5jIF9zaG91bGRXYWl0Rm9yT25saW5lKCkge1xuICAgIGlmICghdGhpcy5fbmV0d29ya01vbml0b3IpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgaXNPbmxpbmUgPSBhd2FpdCB0aGlzLl9pc09ubGluZSgpXG4gICAgaWYgKGlzT25saW5lKSByZXR1cm4gZmFsc2VcblxuICAgIHRoaXMuX3dhaXRpbmdGb3JPbmxpbmUgPSB0cnVlXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ1JlY29ubmVjdCgpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX2Vuc3VyZU5ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uKCkge1xuICAgIGlmICghdGhpcy5fbmV0d29ya01vbml0b3I/LnN1YnNjcmliZSB8fCB0aGlzLl9uZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLl9uZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbiA9IHRoaXMuX25ldHdvcmtNb25pdG9yLnN1YnNjcmliZSgoaXNPbmxpbmUpID0+IHtcbiAgICAgIGlmICghdGhpcy5hdXRvUmVjb25uZWN0KSByZXR1cm5cblxuICAgICAgaWYgKGlzT25saW5lKSB7XG4gICAgICAgIGlmICghdGhpcy5fd2FpdGluZ0Zvck9ubGluZSkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5fd2FpdGluZ0Zvck9ubGluZSA9IGZhbHNlXG4gICAgICAgIHZvaWQgdGhpcy5fYXR0ZW1wdFJlY29ubmVjdCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gdHJ1ZVxuICAgICAgdGhpcy5fY2FuY2VsUGVuZGluZ1JlY29ubmVjdCgpXG5cbiAgICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgIHZvaWQgdGhpcy5kcm9wQ29ubmVjdGlvbigpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3RlYXJkb3duTmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24oKSB7XG4gICAgaWYgKCF0aGlzLl9uZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbikgcmV0dXJuXG5cbiAgICBpZiAodHlwZW9mIHRoaXMuX25ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMuX25ldHdvcmtNb25pdG9yU3Vic2NyaXB0aW9uKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24ucmVtb3ZlKClcbiAgICB9XG5cbiAgICB0aGlzLl9uZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbiA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgZ2xvYmFsIG1ldGFkYXRhIHZhbHVlIHRoYXQgaXMgc2VudCB0byB0aGUgc2VydmVyLlxuICAgKiBGb3IgV2ViU29ja2V0IGNvbm5lY3Rpb25zLCBhIG1ldGFkYXRhIHVwZGF0ZSBtZXNzYWdlIGlzIHNlbnQgaW1tZWRpYXRlbHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBNZXRhZGF0YSBrZXkuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIE1ldGFkYXRhIHZhbHVlIChudWxsIHRvIGNsZWFyKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRNZXRhZGF0YShrZXksIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9tZXRhZGF0YVtrZXldXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21ldGFkYXRhW2tleV0gPSB2YWx1ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7dHlwZTogXCJtZXRhZGF0YVwiLCBkYXRhOiB7Li4udGhpcy5fbWV0YWRhdGF9fSlcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59IC0gQ3VycmVudCBtZXRhZGF0YS4gKi9cbiAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHsuLi50aGlzLl9tZXRhZGF0YX1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiBpcyBvcGVuLlxuICAgKiBBdXRvLXJlY29ubmVjdCBhbmQgb25saW5lIGdhdGluZyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LlxuICAgKiBQYXNzIGBhdXRvUmVjb25uZWN0OiBmYWxzZWAgb3IgYHdhaXRGb3JPbmxpbmU6IGZhbHNlYCBvbmx5IHdoZW4gYSBjYWxsZXJcbiAgICogZXhwbGljaXRseSBuZWVkcyBsb3dlci1sZXZlbCBiZWhhdmlvci5cbiAgICogQHBhcmFtIHt7YXV0b1JlY29ubmVjdD86IGJvb2xlYW4sIHdhaXRGb3JPbmxpbmU/OiBib29sZWFuLCByZXNldFJlY29ubmVjdFN0YXRlPzogYm9vbGVhbn19IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY29ubmVjdCh7YXV0b1JlY29ubmVjdCA9IHRoaXMuYXV0b1JlY29ubmVjdCwgd2FpdEZvck9ubGluZSA9IHRydWUsIHJlc2V0UmVjb25uZWN0U3RhdGUgPSB0cnVlfSA9IHt9KSB7XG4gICAgdGhpcy5hdXRvUmVjb25uZWN0ID0gYXV0b1JlY29ubmVjdFxuXG4gICAgaWYgKHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgdGhpcy5fZW5zdXJlTmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24oKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gZmFsc2VcbiAgICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuICAgICAgdGhpcy5fdGVhcmRvd25OZXR3b3JrTW9uaXRvclN1YnNjcmlwdGlvbigpXG4gICAgfVxuXG4gICAgaWYgKHdhaXRGb3JPbmxpbmUgJiYgdGhpcy5hdXRvUmVjb25uZWN0ICYmICFhd2FpdCB0aGlzLl9pc09ubGluZSgpKSB7XG4gICAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHJlc2V0UmVjb25uZWN0U3RhdGUpIHtcbiAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCA9IDBcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTikgcmV0dXJuXG4gICAgaWYgKHRoaXMuY29ubmVjdFByb21pc2UpIHJldHVybiB0aGlzLmNvbm5lY3RQcm9taXNlXG5cbiAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gZmFsc2VcbiAgICB0aGlzLmNvbm5lY3Rpb25BdHRlbXB0cyArPSAxXG5cbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsKVxuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgb25PcGVuKVxuICAgICAgICB0aGlzLnNvY2tldD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uT3BlbiA9ICgpID0+IHtcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb25FcnJvciA9ICgvKiogQHR5cGUge0V2ZW50ICYge2Vycm9yPzogdW5rbm93bn19ICovIGV2ZW50KSA9PiB7XG4gICAgICAgIGNsZWFudXAoKVxuICAgICAgICBjb25zdCBlcnJvciA9IGV2ZW50Py5lcnJvciB8fCBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgY29ubmVjdGlvbiBlcnJvclwiKVxuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIG9uT3BlbilcbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKVxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5vbk1lc3NhZ2UpXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgdGhpcy5vbkNsb3NlKVxuICAgIH0pXG5cbiAgICBhd2FpdCB0aGlzLmNvbm5lY3RQcm9taXNlXG5cbiAgICAvLyBDb2xkIHJlc3RvcmUgZnJvbSBleHRlcm5hbCBwZXJzaXN0ZW5jZSAoc2Vzc2lvblN0b3JlKSBvbiB0aGVcbiAgICAvLyB2ZXJ5IGZpcnN0IGNvbm5lY3Q6IGFwcHMgd2lyZSB0aGlzIHVwIHRvIHN1cnZpdmUgYSBmdWxsIHBhZ2VcbiAgICAvLyByZWxvYWQuIEFmdGVyIHRoZSBmaXJzdCByZXN0b3JlIGF0dGVtcHQgdGhlIGluLW1lbW9yeSBjYWNoZVxuICAgIC8vIHRha2VzIG92ZXIuXG4gICAgaWYgKCF0aGlzLl9zZXNzaW9uSWQgJiYgIXRoaXMuX3Nlc3Npb25TdG9yZVJlc3RvcmVkICYmIHRoaXMuX3Nlc3Npb25TdG9yZSkge1xuICAgICAgdGhpcy5fc2Vzc2lvblN0b3JlUmVzdG9yZWQgPSB0cnVlXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0b3JlZElkID0gYXdhaXQgdGhpcy5fc2Vzc2lvblN0b3JlLmdldCgpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBzdG9yZWRJZCA9PT0gXCJzdHJpbmdcIiAmJiBzdG9yZWRJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbklkID0gc3RvcmVkSWRcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoXCJzZXNzaW9uU3RvcmUuZ2V0IGZhaWxlZFwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgY2FjaGVkIHNlc3Npb25JZCBmcm9tIGEgcHJpb3IgY29ubmVjdCwgYXNrIHRoZVxuICAgIC8vIHNlcnZlciB0byByZXN1bWUgaXQuIFRoZSBzZXJ2ZXIgcmVwbGllcyB3aXRoIGVpdGhlclxuICAgIC8vIGBzZXNzaW9uLXJlc3VtZWRgIChzdGF0ZSBwcmVzZXJ2ZWQpIG9yIGBzZXNzaW9uLWdvbmVgIChjbGllbnRcbiAgICAvLyBtdXN0IHN0YXJ0IGZyZXNoKTsgdGhlIG1lc3NhZ2UgZGlzcGF0Y2hlciBmaXJlcyB0aGUgYXBwcm9wcmlhdGVcbiAgICAvLyBsaWZlY3ljbGUgaG9va3Mgb24gbGl2ZSBDb25uZWN0aW9uIC8gQ2hhbm5lbCBoYW5kbGVzLlxuICAgIGlmICh0aGlzLl9zZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMuX2F3YWl0aW5nUmVzdW1lID0gdHJ1ZVxuICAgICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe3R5cGU6IFwic2Vzc2lvbi1yZXN1bWVcIiwgc2Vzc2lvbklkOiB0aGlzLl9zZXNzaW9uSWR9KVxuICAgICAgLy8gRmlyZSBvbkRpc2Nvbm5lY3Qgb24gbGl2ZSBoYW5kbGVzIHNvIGFwcHMgY2FuIHBhdXNlIFVJIHdvcmtcbiAgICAgIC8vIHVudGlsIHNlc3Npb24tcmVzdW1lZCAvIHNlc3Npb24tZ29uZSBhcnJpdmVzLlxuICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpKSBjb25uZWN0aW9uLl9oYW5kbGVEaXNjb25uZWN0ZWQoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHN1YnNjcmlwdGlvbi5faGFuZGxlRGlzY29ubmVjdGVkKClcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fbWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHt0eXBlOiBcIm1ldGFkYXRhXCIsIGRhdGE6IHsuLi50aGlzLl9tZXRhZGF0YX19KVxuICAgIH1cblxuICAgIGlmICghdGhpcy5fYXdhaXRpbmdSZXN1bWUpIHtcbiAgICAgIHRoaXMuX3NlbmRQZW5kaW5nQ2hhbm5lbFN1YnNjcmlwdGlvbnMoKVxuICAgIH1cbiAgICB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB3ZWJzb2NrZXQgYW5kIGNsZWFyIHBlbmRpbmcgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICB0aGlzLmF1dG9SZWNvbm5lY3QgPSBmYWxzZVxuICAgIHRoaXMuX3dhaXRpbmdGb3JPbmxpbmUgPSBmYWxzZVxuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuICAgIHRoaXMuX3RlYXJkb3duTmV0d29ya01vbml0b3JTdWJzY3JpcHRpb24oKVxuXG4gICAgaWYgKCF0aGlzLnNvY2tldCkgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7XG4gICAgICB0aGlzLnNvY2tldCA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0Py5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgICAgdGhpcy5zb2NrZXQ/LmNsb3NlKClcbiAgICB9KVxuXG4gICAgdGhpcy5zb2NrZXQgPSB1bmRlZmluZWRcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBhdXRvLXJlY29ubmVjdCBhbmQgY2xvc2UgdGhlIHdlYnNvY2tldC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBkaXNjb25uZWN0QW5kU3RvcFJlY29ubmVjdCgpIHtcbiAgICBhd2FpdCB0aGlzLmNsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgcmF3IHNvY2tldCB3aXRob3V0IGRpc2FibGluZyBhdXRvLXJlY29ubmVjdC4gVXNlZCBieSB0ZXN0cyB0b1xuICAgKiBzaW11bGF0ZSBhbiB1bmV4cGVjdGVkIG5ldHdvcmsgZHJvcCBhbmQgdmVyaWZ5IHJlY29ubmVjdGlvbiBiZWhhdmlvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgc29ja2V0IGhhcyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBkcm9wQ29ubmVjdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuc29ja2V0KSByZXR1cm5cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnNvY2tldD8uYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSlcbiAgICAgIHRoaXMuc29ja2V0Py5jbG9zZSgpXG4gICAgfSlcblxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgUE9TVCByZXF1ZXN0IG92ZXIgdGhlIHdlYnNvY2tldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge2FueX0gW2JvZHldIC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0ge3toZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPn19IFtvcHRpb25zXSAtIFJlcXVlc3Qgb3B0aW9ucyBzdWNoIGFzIGhlYWRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBwb3N0LlxuICAgKi9cbiAgYXN5bmMgcG9zdChwYXRoLCBib2R5LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KFwiUE9TVFwiLCBwYXRoLCB7Li4ub3B0aW9ucywgYm9keX0pXG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIEdFVCByZXF1ZXN0IG92ZXIgdGhlIHdlYnNvY2tldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge3toZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPn19IFtvcHRpb25zXSAtIFJlcXVlc3Qgb3B0aW9ucyBzdWNoIGFzIGhlYWRlcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBnZXQuXG4gICAqL1xuICBhc3luYyBnZXQocGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdChcIkdFVFwiLCBwYXRoLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBhIGNoYW5uZWwgZm9yIHNlcnZlci1zZW50IGV2ZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IGFueSkgPT4gdm9pZH0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAqL1xuICBvbihjaGFubmVsLCBjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLnN1YnNjcmliZShjaGFubmVsLCB7fSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHNuYXBzaG90IG9mIHRoZSBjbGllbnQncyBjb25uZWN0aW9uIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7e2Rpc2Nvbm5lY3RlZFNpbmNlOiBudW1iZXIgfCBudWxsLCBpc09wZW46IGJvb2xlYW4sIGxpc3RlbmVyQ291bnQ6IG51bWJlcn19XG4gICAqL1xuICBzdGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzY29ubmVjdGVkU2luY2U6IHRoaXMuZGlzY29ubmVjdGVkU2luY2UsXG4gICAgICBpc09wZW46ICEhdGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTixcbiAgICAgIGxpc3RlbmVyQ291bnQ6IHRoaXMubGlzdGVuZXJzLnNpemUgKyB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5zaXplXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBhIGNoYW5uZWwgZm9yIHNlcnZlci1zZW50IGV2ZW50cyB3aXRoIG9wdGlvbmFsIHBhcmFtcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2xhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gb3B0aW9ucyAtIFN1YnNjcmlwdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBhbnksIG1lc3NhZ2U/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7KCgpID0+IHZvaWQpICYge3JlYWR5OiBQcm9taXNlPHZvaWQ+fX0gLSBVbnN1YnNjcmliZSBmdW5jdGlvbiB3aXRoIHJlYWRpbmVzcyBwcm9taXNlLlxuICAgKi9cbiAgc3Vic2NyaWJlKGNoYW5uZWwsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcGFyYW1zID0gb3B0aW9ucz8ucGFyYW1zXG4gICAgY29uc3QgbGFzdEV2ZW50SWQgPSBvcHRpb25zPy5sYXN0RXZlbnRJZFxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShjaGFubmVsLCBwYXJhbXMpXG5cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhzdWJzY3JpcHRpb25LZXkpKSB7XG4gICAgICAvKiogQHR5cGUgeygoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIC8qKiBAdHlwZSB7KCh2YWx1ZT86IHZvaWQpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSAqL1xuICAgICAgbGV0IHJlc29sdmVSZWFkeVxuICAgICAgLyoqIEB0eXBlIHsoKGVycm9yOiB1bmtub3duKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCByZWplY3RSZWFkeVxuICAgICAgY29uc3QgcmVhZHkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlc29sdmVSZWFkeSA9IHJlc29sdmVcbiAgICAgICAgcmVqZWN0UmVhZHkgPSByZWplY3RcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubGlzdGVuZXJzLnNldChzdWJzY3JpcHRpb25LZXksIHtcbiAgICAgICAgY2FsbGJhY2tzOiBuZXcgU2V0KCksXG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgcmVhZHlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLnNldChzdWJzY3JpcHRpb25LZXksIHtcbiAgICAgICAgcmVqZWN0OiByZWplY3RSZWFkeSB8fCAoKCkgPT4ge30pLFxuICAgICAgICByZXNvbHZlOiByZXNvbHZlUmVhZHkgfHwgKCgpID0+IHt9KVxuICAgICAgfSlcblxuICAgICAgdm9pZCB0aGlzLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXMsIHR5cGU6IFwic3Vic2NyaWJlXCJ9KVxuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB0aGlzLl9kZWJ1ZyhcIlN1YnNjcmliZSBmYWlsZWRcIiwgZXJyb3IpKVxuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyRW50cnkgPSB0aGlzLmxpc3RlbmVycy5nZXQoc3Vic2NyaXB0aW9uS2V5KVxuXG4gICAgaWYgKCFsaXN0ZW5lckVudHJ5KSB0aHJvdyBuZXcgRXJyb3IoXCJMaXN0ZW5lcnMgbWFwIG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgbGlzdGVuZXJFbnRyeS5jYWxsYmFja3MuYWRkKGNhbGxiYWNrKVxuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICBsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spXG5cbiAgICAgIGlmIChsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShzdWJzY3JpcHRpb25LZXkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdW5zdWJzY3JpYmUucmVhZHkgPSBsaXN0ZW5lckVudHJ5LnJlYWR5XG5cbiAgICByZXR1cm4gdW5zdWJzY3JpYmVcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGFuZCB3YWl0IHVudGlsIHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VzIHRoZSBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn19IG9wdGlvbnMgLSBTdWJzY3JpcHRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogYW55LCBtZXNzYWdlPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdm9pZH0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8KCgpID0+IHZvaWQpICYge3JlYWR5OiBQcm9taXNlPHZvaWQ+fT59IC0gUmVhZHkgdW5zdWJzY3JpYmUgaGFuZGxlLlxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlQW5kV2FpdChjaGFubmVsLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5zdWJzY3JpYmUoY2hhbm5lbCwgb3B0aW9ucywgY2FsbGJhY2spXG5cbiAgICBhd2FpdCB1bnN1YnNjcmliZS5yZWFkeVxuXG4gICAgcmV0dXJuIHVuc3Vic2NyaWJlXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIEhUVFAgbWV0aG9kLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFtvcHRpb25zLmJvZHldIC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFtvcHRpb25zLmhlYWRlcnNdIC0gSGVhZGVyIGxpc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdChtZXRob2QsIHBhdGgsIHtib2R5LCBoZWFkZXJzfSA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcblxuICAgIGNvbnN0IGlkID0gYHdzLSR7dGhpcy5uZXh0SUQrK31gXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAgaWQsXG4gICAgICBtZXRob2QsXG4gICAgICBwYXRoLFxuICAgICAgdHlwZTogXCJyZXF1ZXN0XCJcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuc2V0KGlkLCB7cmVzb2x2ZSwgcmVqZWN0fSlcbiAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge01lc3NhZ2VFdmVudDxhbnk+fSBldmVudCAtIEV2ZW50IHBheWxvYWQuXG4gICAqL1xuICBvbk1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCByYXcgPSB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiA/IGV2ZW50LmRhdGEgOiBldmVudC5kYXRhPy50b1N0cmluZz8uKClcblxuICAgIGlmICghcmF3KSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBsZXQgbWVzc2FnZVxuXG4gICAgdHJ5IHtcbiAgICAgIG1lc3NhZ2UgPSBKU09OLnBhcnNlKHJhdylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fZGVidWcoXCJGYWlsZWQgdG8gcGFyc2Ugd2Vic29ja2V0IG1lc3NhZ2VcIiwgZXJyb3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7dHlwZX0gPSBtZXNzYWdlXG5cbiAgICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZVwiKSB7XG4gICAgICBjb25zdCB7aWR9ID0gbWVzc2FnZVxuICAgICAgY29uc3QgcGVuZGluZyA9IGlkID8gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KGlkKSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAocGVuZGluZykge1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUoaWQpXG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZShuZXcgVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2UobWVzc2FnZSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kZWJ1ZyhgTm8gcGVuZGluZyByZXF1ZXN0IGZvciByZXNwb25zZSBpZCAke2lkfWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInN1YnNjcmliZWRcIikge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uS2V5ID0gdGhpcy5fc3Vic2NyaXB0aW9uS2V5KG1lc3NhZ2UuY2hhbm5lbCwgbWVzc2FnZS5wYXJhbXMpXG4gICAgICBjb25zdCBwZW5kaW5nU3Vic2NyaXB0aW9uID0gdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5nZXQoc3Vic2NyaXB0aW9uS2V5KVxuXG4gICAgICBpZiAocGVuZGluZ1N1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25LZXkpXG4gICAgICAgIHBlbmRpbmdTdWJzY3JpcHRpb24ucmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImV2ZW50XCIpIHtcbiAgICAgIGNvbnN0IHtjaGFubmVsLCBwYXlsb2FkfSA9IG1lc3NhZ2VcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXJFbnRyeSBvZiB0aGlzLmxpc3RlbmVycy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAobGlzdGVuZXJFbnRyeS5jaGFubmVsICE9PSBjaGFubmVsKSBjb250aW51ZVxuXG4gICAgICAgIGxpc3RlbmVyRW50cnkuY2FsbGJhY2tzLmZvckVhY2goKC8qKiBAdHlwZSB7KHBheWxvYWQ6IGFueSwgbWVzc2FnZT86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWR9ICovIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHBheWxvYWQsIG1lc3NhZ2UpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKFwiTGlzdGVuZXIgZXJyb3JcIiwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyZXBsYXktZ2FwXCIpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShtZXNzYWdlLmNoYW5uZWwsIG1lc3NhZ2UucGFyYW1zKVxuICAgICAgY29uc3QgcGVuZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbktleSlcblxuICAgICAgaWYgKHBlbmRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uS2V5KVxuICAgICAgICBwZW5kaW5nU3Vic2NyaXB0aW9uLnJlamVjdChuZXcgRXJyb3IoYFJlcGxheSBnYXAgZm9yICR7bWVzc2FnZS5jaGFubmVsfWApKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjb25uZWN0aW9uLW9wZW5lZFwiKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuXG4gICAgICBjb25uZWN0aW9uPy5faGFuZGxlT3BlbmVkKClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1tZXNzYWdlXCIpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9ucy5nZXQobWVzc2FnZS5jb25uZWN0aW9uSWQpXG5cbiAgICAgIGNvbm5lY3Rpb24/Ll9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UuYm9keSlcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1jbG9zZWRcIikge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChtZXNzYWdlLmNvbm5lY3Rpb25JZClcblxuICAgICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuICAgICAgICBjb25uZWN0aW9uLl9oYW5kbGVDbG9zZWQobWVzc2FnZS5yZWFzb24gfHwgXCJzZXJ2ZXJfY2xvc2VcIilcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1lcnJvclwiKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuXG4gICAgICBpZiAoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUobWVzc2FnZS5jb25uZWN0aW9uSWQpXG4gICAgICAgIGNvbm5lY3Rpb24uX2hhbmRsZUNsb3NlZChgZXJyb3I6ICR7bWVzc2FnZS5tZXNzYWdlIHx8IFwiY29ubmVjdGlvbi1lcnJvclwifWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNoYW5uZWwtc3Vic2NyaWJlZFwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgc3ViPy5faGFuZGxlU3Vic2NyaWJlZCgpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNoYW5uZWwtbWVzc2FnZVwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgc3ViPy5faGFuZGxlTWVzc2FnZShtZXNzYWdlLmJvZHkpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNoYW5uZWwtdW5zdWJzY3JpYmVkXCIpIHtcbiAgICAgIGNvbnN0IHN1YiA9IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmdldChtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuXG4gICAgICBpZiAoc3ViKSB7XG4gICAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuICAgICAgICBzdWIuX2hhbmRsZUNsb3NlZChcInNlcnZlcl91bnN1YnNjcmliZVwiKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLWVycm9yXCIpIHtcbiAgICAgIGNvbnN0IHN1YiA9IHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmdldChtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuXG4gICAgICBpZiAoc3ViKSB7XG4gICAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmRlbGV0ZShtZXNzYWdlLnN1YnNjcmlwdGlvbklkKVxuICAgICAgICBzdWIuX2hhbmRsZUNsb3NlZChgZXJyb3I6ICR7bWVzc2FnZS5tZXNzYWdlIHx8IFwiY2hhbm5lbC1lcnJvclwifWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInNlc3Npb24tZXN0YWJsaXNoZWRcIikge1xuICAgICAgLy8gRmlyc3QgY29ubmVjdDogY2FjaGUgc2Vzc2lvbklkIGZvciBmdXR1cmUgcmVzdW1lIGF0dGVtcHRzLlxuICAgICAgaWYgKCF0aGlzLl9hd2FpdGluZ1Jlc3VtZSkge1xuICAgICAgICB0aGlzLl9zZXNzaW9uSWQgPSBtZXNzYWdlLnNlc3Npb25JZFxuICAgICAgICB0aGlzLl9wZXJzaXN0U2Vzc2lvbklkKG1lc3NhZ2Uuc2Vzc2lvbklkKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJzZXNzaW9uLXJlc3VtZWRcIikge1xuICAgICAgdGhpcy5fYXdhaXRpbmdSZXN1bWUgPSBmYWxzZVxuICAgICAgdGhpcy5fc2Vzc2lvbklkID0gbWVzc2FnZS5zZXNzaW9uSWRcbiAgICAgIHRoaXMuX3BlcnNpc3RTZXNzaW9uSWQobWVzc2FnZS5zZXNzaW9uSWQpXG4gICAgICB0aGlzLl9zZW5kUGVuZGluZ0NoYW5uZWxTdWJzY3JpcHRpb25zKClcbiAgICAgIC8vIEZpcmUgb25SZXN1bWUgb24gZXZlcnkgbGl2ZSBoYW5kbGUgc28gdXNlciBjb2RlIGtub3dzIHRoZVxuICAgICAgLy8gc2Vzc2lvbiBjYW1lIGJhY2sgd2l0aCBzdGF0ZSBpbnRhY3QuXG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCkpIGNvbm5lY3Rpb24uX2hhbmRsZVJlc3VtZWQoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHN1YnNjcmlwdGlvbi5faGFuZGxlUmVzdW1lZCgpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInNlc3Npb24tZ29uZVwiKSB7XG4gICAgICB0aGlzLl9hd2FpdGluZ1Jlc3VtZSA9IGZhbHNlXG4gICAgICB0aGlzLl9zZXNzaW9uSWQgPSBudWxsXG4gICAgICB0aGlzLl9jbGVhclBlcnNpc3RlZFNlc3Npb25JZCgpXG4gICAgICAvLyBUZWFyIGRvd24gZXZlcnkgbGl2ZSBoYW5kbGUg4oCUIHRoZWlyIHNlcnZlci1zaWRlIGNvdW50ZXJwYXJ0c1xuICAgICAgLy8gYXJlIGdvbmUgYW5kIG5vdGhpbmcgY2FuIGJyaW5nIHRoZW0gYmFjay5cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gWy4uLnRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSBjb25uZWN0aW9uLl9oYW5kbGVDbG9zZWQoXCJzZXNzaW9uX2dvbmVcIilcblxuICAgICAgY29uc3Qgc3VicyA9IFsuLi50aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKV1cbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHN1YnMpIHN1YnNjcmlwdGlvbi5faGFuZGxlQ2xvc2VkKFwic2Vzc2lvbl9nb25lXCIpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImVycm9yXCIgJiYgbWVzc2FnZS5pZCkge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JlcXVlc3RzLmdldChtZXNzYWdlLmlkKVxuXG4gICAgICBpZiAocGVuZGluZykge1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUobWVzc2FnZS5pZClcbiAgICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKG1lc3NhZ2UuZXJyb3IgfHwgXCJVbmtub3duIHdlYnNvY2tldCBlcnJvclwiKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZH0gcGFyYW1zIC0gU3Vic2NyaXB0aW9uIHBhcmFtcy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTdGFibGUgc3Vic2NyaXB0aW9uIGtleS5cbiAgICovXG4gIF9zdWJzY3JpcHRpb25LZXkoY2hhbm5lbCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtjaGFubmVsLCBwYXJhbXMgfHwgbnVsbF0pXG4gIH1cblxuICAvKipcbiAgICogUmVqZWN0IGFsbCBwZW5kaW5nIHJlcXVlc3RzIHdoZW4gdGhlIHNvY2tldCBjbG9zZXMuIFNjaGVkdWxlcyByZWNvbm5lY3QgaWYgZW5hYmxlZC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uQ2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSB8fD0gRGF0ZS5ub3coKVxuXG4gICAgZm9yIChjb25zdCBbaWQsIHtyZWplY3R9XSBvZiB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5lbnRyaWVzKCkpIHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYFdlYnNvY2tldCBjbG9zZWQgYmVmb3JlIHJlc3BvbnNlIGZvciAke2lkfWApKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qge3JlamVjdH0gb2YgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIldlYnNvY2tldCBjbG9zZWQgYmVmb3JlIHN1YnNjcmlwdGlvbiBhY2tub3dsZWRnZW1lbnRcIikpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Nlc3Npb25JZCAmJiB0aGlzLmF1dG9SZWNvbm5lY3QpIHtcbiAgICAgIC8vIFNlc3Npb24gbWF5IHJlc3VtZSB3aGVuIHdlIHJlY29ubmVjdCDigJQga2VlcCB0aGUgaGFuZGxlcyBhbGl2ZVxuICAgICAgLy8gYW5kIGZpcmUgb25EaXNjb25uZWN0IHNvIHVzZXIgY29kZSBjYW4gcGF1c2UgVUkgd29yay5cbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkgY29ubmVjdGlvbi5faGFuZGxlRGlzY29ubmVjdGVkKClcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSBzdWJzY3JpcHRpb24uX2hhbmRsZURpc2Nvbm5lY3RlZCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIHJlc3VtZSBwYXRoOiB0ZWFyIGRvd24gZXZlcnkgbGl2ZSBDb25uZWN0aW9uIC8gQ2hhbm5lbCBzdWIuXG4gICAgICBjb25zdCBjb25uZWN0aW9ucyA9IFsuLi50aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKV1cbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmNsZWFyKClcbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiBjb25uZWN0aW9ucykge1xuICAgICAgICBjb25uZWN0aW9uLl9oYW5kbGVDbG9zZWQoXCJzZXNzaW9uX2Rlc3Ryb3llZFwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFubmVsU3VicyA9IFsuLi50aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKV1cbiAgICAgIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIGNoYW5uZWxTdWJzKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5faGFuZGxlQ2xvc2VkKFwic2Vzc2lvbl9kZXN0cm95ZWRcIilcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2Vzc2lvbklkID0gbnVsbFxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmNsZWFyKClcbiAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG5cbiAgICBpZiAoIXRoaXMuYXV0b1JlY29ubmVjdCkgcmV0dXJuXG5cbiAgICB2b2lkIHRoaXMuX3Nob3VsZFdhaXRGb3JPbmxpbmUoKS50aGVuKChzaG91bGRXYWl0Rm9yT25saW5lKSA9PiB7XG4gICAgICBpZiAoIXNob3VsZFdhaXRGb3JPbmxpbmUpIHtcbiAgICAgICAgdGhpcy5fc2NoZWR1bGVSZWNvbm5lY3QoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zZW5kTWVzc2FnZShwYXlsb2FkKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgaXMgbm90IG9wZW5cIilcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcblxuICAgIHRoaXMuX2RlYnVnKFwiU2VuZGluZ1wiLCBqc29uKVxuICAgIHRoaXMuc29ja2V0LnNlbmQoanNvbilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKSB7XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZXIpXG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3NjaGVkdWxlUmVjb25uZWN0KCkge1xuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuXG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLnJlY29ubmVjdERlbGF5c1tNYXRoLm1pbih0aGlzLnJlY29ubmVjdEF0dGVtcHQsIHRoaXMucmVjb25uZWN0RGVsYXlzLmxlbmd0aCAtIDEpXVxuXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgICAgdm9pZCB0aGlzLl9hdHRlbXB0UmVjb25uZWN0KClcbiAgICB9LCBkZWxheSlcblxuICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCArPSAxXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIF9hdHRlbXB0UmVjb25uZWN0KCkge1xuICAgIGlmICghdGhpcy5hdXRvUmVjb25uZWN0KSByZXR1cm5cblxuICAgIGlmICghYXdhaXQgdGhpcy5faXNPbmxpbmUoKSkge1xuICAgICAgdGhpcy5fd2FpdGluZ0Zvck9ubGluZSA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl93YWl0aW5nRm9yT25saW5lID0gZmFsc2VcbiAgICAgIHRoaXMuY29ubmVjdGlvbkF0dGVtcHRzICs9IDFcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdCh7YXV0b1JlY29ubmVjdDogdGhpcy5hdXRvUmVjb25uZWN0LCByZXNldFJlY29ubmVjdFN0YXRlOiBmYWxzZSwgd2FpdEZvck9ubGluZTogZmFsc2V9KVxuICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgICAgIHRoaXMuX3Jlc3Vic2NyaWJlQWN0aXZlTGlzdGVuZXJzKClcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uUmVjb25uZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vblJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiUmVjb25uZWN0IGF0dGVtcHQgZmFpbGVkOlwiLCBlcnJvcilcblxuICAgICAgaWYgKHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgICB0aGlzLl9zY2hlZHVsZVJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLXNlbmRzIHN1YnNjcmliZSBtZXNzYWdlcyBmb3IgYWxsIGFjdGl2ZSBsaXN0ZW5lcnMgYWZ0ZXIgcmVjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZXN1YnNjcmliZUFjdGl2ZUxpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxpc3RlbmVyRW50cnldIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7XG4gICAgICAgICAgY2hhbm5lbDogbGlzdGVuZXJFbnRyeS5jaGFubmVsLFxuICAgICAgICAgIHBhcmFtczogbGlzdGVuZXJFbnRyeS5wYXJhbXMsXG4gICAgICAgICAgdHlwZTogXCJzdWJzY3JpYmVcIlxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoXCJSZS1zdWJzY3JpYmUgZmFpbGVkOlwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9kZWJ1ZyguLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLmRlYnVnKSByZXR1cm5cblxuICAgIGNvbnNvbGUuZGVidWcoXCJbVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50XVwiLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgLSBJZCB0byBwZXJzaXN0IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgc2Vzc2lvblN0b3JlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9wZXJzaXN0U2Vzc2lvbklkKHNlc3Npb25JZCkge1xuICAgIGlmICghdGhpcy5fc2Vzc2lvblN0b3JlKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9zZXNzaW9uU3RvcmUuc2V0KHNlc3Npb25JZClcblxuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXN1bHQuY2F0Y2goKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gZXJyb3IpID0+IHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLnNldCBmYWlsZWRcIiwgZXJyb3IpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9kZWJ1ZyhcInNlc3Npb25TdG9yZS5zZXQgZmFpbGVkXCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9jbGVhclBlcnNpc3RlZFNlc3Npb25JZCgpIHtcbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25TdG9yZSkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc2Vzc2lvblN0b3JlLmNsZWFyKClcblxuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXN1bHQuY2F0Y2goKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gZXJyb3IpID0+IHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmNsZWFyIGZhaWxlZFwiLCBlcnJvcikpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmNsZWFyIGZhaWxlZFwiLCBlcnJvcilcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2Uge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzcG9uc2VNZXNzYWdlID0gLyoqIEB0eXBlIHt7Ym9keT86IGFueSwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIGFueT4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgc3RhdHVzQ29kZT86IG51bWJlciwgc3RhdHVzTWVzc2FnZT86IHN0cmluZywgdHlwZT86IHN0cmluZ319ICovIChtZXNzYWdlKVxuXG4gICAgdGhpcy5ib2R5ID0gcmVzcG9uc2VNZXNzYWdlLmJvZHlcbiAgICB0aGlzLmhlYWRlcnMgPSByZXNwb25zZU1lc3NhZ2UuaGVhZGVycyB8fCB7fVxuICAgIHRoaXMuaWQgPSByZXNwb25zZU1lc3NhZ2UuaWRcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSByZXNwb25zZU1lc3NhZ2Uuc3RhdHVzQ29kZSB8fCAyMDBcbiAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSByZXNwb25zZU1lc3NhZ2Uuc3RhdHVzTWVzc2FnZSB8fCBcIk9LXCJcbiAgICB0aGlzLnR5cGUgPSByZXNwb25zZU1lc3NhZ2UudHlwZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHthbnl9IC0gVGhlIGpzb24uICAqL1xuICBqc29uKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5ib2R5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNwb25zZSBib2R5IGlzIG5vdCBhIHN0cmluZ1wiKVxuICAgIH1cblxuICAgIHJldHVybiBkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShKU09OLnBhcnNlKHRoaXMuYm9keSkpXG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.337",
6
+ "version": "1.0.339",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -16,6 +16,7 @@
16
16
  "copy:ejs": "cpy \"src/routes/**/*.ejs\" build/src/routes",
17
17
  "copy:templates": "cpy \"src/templates/**/*.js\" build/src/templates",
18
18
  "lint": "eslint",
19
+ "prepare": "npm run build",
19
20
  "release:patch": "node scripts/release-patch.js",
20
21
  "test": "node scripts/run-tests.js",
21
22
  "test:browser": "node scripts/test-browser.js",