@sinequa/assistant 3.1.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -58,8 +58,8 @@ export class WebSocketChatService extends ChatService {
58
58
  * It can be overridden by the app config
59
59
  */
60
60
  getRequestsUrl() {
61
- if (this.chatConfig$.value.globalSettings.websocketEndpoint) {
62
- this.REQUEST_URL = this.chatConfig$.value.globalSettings.websocketEndpoint;
61
+ if (this.chatConfig$.value.connectionSettings.websocketEndpoint) {
62
+ this.REQUEST_URL = this.chatConfig$.value.connectionSettings.websocketEndpoint;
63
63
  }
64
64
  else {
65
65
  throw new Error(`The property 'websocketEndpoint' must be provided when attempting to use 'WebSocket' in assistant instance`);
@@ -73,7 +73,7 @@ export class WebSocketChatService extends ChatService {
73
73
  modelsSubject.complete();
74
74
  });
75
75
  // Send the request to get the list of models
76
- this.connection.invoke('ListModels', { debug: this.chatConfig$.value.debug })
76
+ this.connection.invoke('ListModels', { debug: this.chatConfig$.value.defaultValues.debug })
77
77
  .catch(error => {
78
78
  console.error('Error invoking ListModels:', error);
79
79
  modelsSubject.complete();
@@ -84,12 +84,12 @@ export class WebSocketChatService extends ChatService {
84
84
  listFunctions() {
85
85
  const functionsSubject = new Subject();
86
86
  this.connection.on('ListFunctions', (res) => {
87
- this.functions = res.functions;
87
+ this.functions = res.functions?.filter(func => func.enabled);
88
88
  functionsSubject.next(this.functions);
89
89
  functionsSubject.complete();
90
90
  });
91
91
  // Send the request to get the list of functions
92
- this.connection.invoke('ListFunctions', { debug: this.chatConfig$.value.debug })
92
+ this.connection.invoke('ListFunctions', { debug: this.chatConfig$.value.defaultValues.debug })
93
93
  .catch(error => {
94
94
  console.error('Error invoking ListFunctions:', error);
95
95
  functionsSubject.complete();
@@ -97,22 +97,28 @@ export class WebSocketChatService extends ChatService {
97
97
  });
98
98
  return functionsSubject.asObservable();
99
99
  }
100
- fetch(messages, query = this.searchService.query) {
100
+ fetch(messages, query) {
101
101
  // Start streaming by invoking the Chat method
102
102
  this.streaming$.next(true);
103
103
  // Prepare the payload to send to the Chat method
104
104
  const data = {
105
105
  history: messages,
106
- functions: this.chatConfig$.value.functions,
107
- debug: this.chatConfig$.value.debug,
108
- serviceSettings: this.chatConfig$.value.serviceSettings,
109
- contextSettings: {
110
- ...this.chatConfig$.value.contextSettings,
106
+ functions: this.chatConfig$.value.defaultValues.functions?.filter(func => func.enabled).map(func => func.name),
107
+ debug: this.chatConfig$.value.defaultValues.debug,
108
+ serviceSettings: {
109
+ service_id: this.chatConfig$.value.defaultValues.service_id,
110
+ model_id: this.chatConfig$.value.defaultValues.model_id,
111
+ top_p: this.chatConfig$.value.defaultValues.top_p,
112
+ temperature: this.chatConfig$.value.defaultValues.temperature,
113
+ max_tokens: this.chatConfig$.value.defaultValues.max_tokens,
114
+ ...this.chatConfig$.value.additionalServiceSettings
115
+ },
116
+ appQuery: {
111
117
  app: this.appService.appName,
112
118
  query
113
119
  }
114
120
  };
115
- if (this.chatConfig$.value.saveChats) {
121
+ if (this.chatConfig$.value.savedChatSettings.enabled) {
116
122
  data.instanceId = this.chatInstanceId;
117
123
  data.savedChatId = this.savedChatId;
118
124
  }
@@ -132,7 +138,7 @@ export class WebSocketChatService extends ChatService {
132
138
  );
133
139
  // Invoke the Chat method
134
140
  this.connection.invoke('Chat', data)
135
- .then(() => this.notifyAudit(this.chatHistory, this.chatConfig$.value.serviceSettings.service_id)) // When the server indicates it has successfully finished invoking the method, notify the audit service with the recent chat history
141
+ .then(() => this.notifyAudit(this.chatHistory, this.chatConfig$.value.defaultValues.service_id)) // When the server indicates it has successfully finished invoking the method, notify the audit service with the recent chat history
136
142
  .catch(error => {
137
143
  console.error('Error invoking Chat:', error);
138
144
  return Promise.resolve(); // Return a resolved promise to handle the error and prevent unhandled promise rejection
@@ -171,7 +177,7 @@ export class WebSocketChatService extends ChatService {
171
177
  listSavedChat() {
172
178
  const data = {
173
179
  instanceId: this.chatInstanceId,
174
- debug: this.chatConfig$.value.debug
180
+ debug: this.chatConfig$.value.defaultValues.debug
175
181
  };
176
182
  this.connection.on('SavedChatList', (res) => {
177
183
  this.savedChats$.next(res.savedChats); // emits the result to the savedChats$ subject
@@ -188,7 +194,7 @@ export class WebSocketChatService extends ChatService {
188
194
  const data = {
189
195
  instanceId: this.chatInstanceId,
190
196
  savedChatId: id,
191
- debug: this.chatConfig$.value.debug
197
+ debug: this.chatConfig$.value.defaultValues.debug
192
198
  };
193
199
  this.connection.on('SavedChatGet', (res) => {
194
200
  savedChatSubject.next(res.savedChat);
@@ -203,12 +209,33 @@ export class WebSocketChatService extends ChatService {
203
209
  });
204
210
  return savedChatSubject.asObservable();
205
211
  }
212
+ updateSavedChat(id, name) {
213
+ const updateSavedChatSubject = new Subject();
214
+ const data = {
215
+ instanceId: this.chatInstanceId,
216
+ savedChatId: id,
217
+ title: name,
218
+ debug: this.chatConfig$.value.defaultValues.debug
219
+ };
220
+ this.connection.on('SavedChatUpdate', (res) => {
221
+ updateSavedChatSubject.next(res.savedChat);
222
+ updateSavedChatSubject.complete();
223
+ });
224
+ // Invoke the method SavedChatUpdate
225
+ this.connection.invoke('SavedChatUpdate', data)
226
+ .catch(error => {
227
+ console.error('Error invoking SavedChatUpdate:', error);
228
+ updateSavedChatSubject.complete();
229
+ return Promise.resolve();
230
+ });
231
+ return updateSavedChatSubject.asObservable();
232
+ }
206
233
  deleteSavedChat(ids) {
207
234
  const deleteSavedChatSubject = new Subject();
208
235
  const data = {
209
236
  instanceId: this.chatInstanceId,
210
237
  SavedChatIds: ids,
211
- debug: this.chatConfig$.value.debug
238
+ debug: this.chatConfig$.value.defaultValues.debug
212
239
  };
213
240
  this.connection.on('SavedChatDelete', (res) => {
214
241
  deleteSavedChatSubject.next(res.deleteCount);
@@ -370,7 +397,7 @@ export class WebSocketChatService extends ChatService {
370
397
  return this.signalRService.stopConnection(this.connection);
371
398
  }
372
399
  getTransports() {
373
- switch (this.chatConfig$.value?.globalSettings.signalRTransport) {
400
+ switch (this.chatConfig$.value?.connectionSettings.signalRTransport) {
374
401
  case "WebSockets":
375
402
  return HttpTransportType.WebSockets;
376
403
  case "ServerSentEvents":
@@ -382,7 +409,7 @@ export class WebSocketChatService extends ChatService {
382
409
  }
383
410
  }
384
411
  getLogLevel() {
385
- switch (this.chatConfig$.value?.globalSettings.signalRLogLevel) {
412
+ switch (this.chatConfig$.value?.connectionSettings.signalRLogLevel) {
386
413
  case "Critical":
387
414
  return LogLevel.Critical; // Log level for diagnostic messages that indicate a failure that will terminate the entire application.
388
415
  case "Debug":
@@ -427,4 +454,4 @@ WebSocketChatService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0",
427
454
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WebSocketChatService, decorators: [{
428
455
  type: Injectable
429
456
  }], ctorParameters: function () { return []; } });
430
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3dlYnNvY2tldC1jaGF0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFxQixpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBaUIsUUFBUSxFQUFrQixNQUFNLG9CQUFvQixDQUFDO0FBRWhHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBR3BKLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxXQUFXO0lBZ0JuRDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBZEgscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQyxDQUFDLG9DQUFvQztRQUM1RSx1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDLENBQUMsc0NBQXNDO1FBRS9FLG9CQUFlLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFOUQsY0FBUyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBQzdDLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFFYixnQkFBVyxHQUE0QixFQUFFLENBQUM7UUFFM0MsbUJBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzQywwQkFBcUIs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Q0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxJQUFJLEVBQUU7U0FDakcsQ0FBQTtJQUNILENBQUM7O2lIQTFmVSxvQkFBb0I7cUhBQXBCLG9CQUFvQjsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2xvZ2luXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9uT3B0aW9ucywgU2lnbmFsUldlYlNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS93ZWItc2VydmljZXNcIjtcbmltcG9ydCB7IEh0dHBUcmFuc3BvcnRUeXBlLCBIdWJDb25uZWN0aW9uLCBMb2dMZXZlbCwgTWVzc2FnZUhlYWRlcnMgfSBmcm9tIFwiQG1pY3Jvc29mdC9zaWduYWxyXCI7XG5pbXBvcnQgeyBBY3Rpb25NZXNzYWdlLCBBY3Rpb25SZXN1bHRFdmVudCwgQWN0aW9uU3RhcnRFdmVudCwgQWN0aW9uU3RvcEV2ZW50LCBNZXNzYWdlRXZlbnQsIENoYXRNZXNzYWdlLCBDaGF0UGF5bG9hZCwgQ2hhdFJlc3BvbnNlLCBHbGxtRnVuY3Rpb24sIEdsbG1Nb2RlbERlc2NyaXB0aW9uLCBNZXNzYWdlSGFuZGxlciwgSGlzdG9yeUV2ZW50LCBFcnJvckV2ZW50LCBRdW90YUV2ZW50LCBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIENvbnRleHRNZXNzYWdlRXZlbnQsIFNhdmVkQ2hhdEhpc3RvcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tIFwiLi9jaGF0LnNlcnZpY2VcIjtcbmltcG9ydCB7IG1lcmdlLCBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YmplY3QsIGNhdGNoRXJyb3IsIGZpbHRlciwgZm9ya0pvaW4sIG1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFwLCB0aHJvd0Vycm9yLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0Q2hhdFNlcnZpY2UgZXh0ZW5kcyBDaGF0U2VydmljZSB7XG5cbiAgcHVibGljIGNvbm5lY3Rpb246IEh1YkNvbm5lY3Rpb24gfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBjb25uZWN0aW9uQnVpbHQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGJ1aWx0XG4gIHB1YmxpYyBjb25uZWN0aW9uU3RhcnRlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpOyAvLyBFbWl0IHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgc3RhcnRlZFxuXG4gIHByaXZhdGUgbWVzc2FnZUhhbmRsZXJzOiBNYXA8c3RyaW5nLCBNZXNzYWdlSGFuZGxlcjxhbnk+PiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIGFjdGlvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBBY3Rpb25NZXNzYWdlPigpO1xuICBwcml2YXRlIGNvbnRlbnQgPSBcIlwiO1xuICBwcml2YXRlIGV4ZWN1dGlvblRpbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBhdHRhY2htZW50czogQ2hhdENvbnRleHRBdHRhY2htZW50W10gPSBbXTtcblxuICBwdWJsaWMgc2lnbmFsUlNlcnZpY2UgPSBpbmplY3QoU2lnbmFsUldlYlNlcnZpY2UpO1xuICBwdWJsaWMgYXV0aGVudGljYXRpb25TZXJ2aWNlID0gaW5qZWN0KEF1dGhlbnRpY2F0aW9uU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjaGF0IHByb2Nlc3MgYWZ0ZXIgdGhlIGxvZ2luIGlzIGNvbXBsZXRlLlxuICAgKiBJdCBpbmNsdWRlcyBidWlsZGluZyBhbmQgc3RhcnRpbmcgYSBjb25uZWN0aW9uLCBleGVjdXRpbmcgcGFyYWxsZWwgcmVxdWVzdHMgZm9yIG1vZGVscyBhbmQgZnVuY3Rpb25zLCBhbmQgaGFuZGxpbmcgZXJyb3JzIGR1cmluZyB0aGUgcHJvY2Vzcy5cbiAgICpcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZTxib29sZWFuPiBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgaW5pdCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5sb2dpblNlcnZpY2UuZXZlbnRzLnBpcGUoXG4gICAgICBmaWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gJ2xvZ2luLWNvbXBsZXRlJyksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5nZXRSZXF1ZXN0c1VybCgpKSxcbiAgICAgIC8vIEJ1aWxkIHRoZSBjb25uZWN0aW9uIGFuZCBoYW5kbGUgdGhlIGNvbXBsZXRpb24gd2l0aCB0aGUgY29ubmVjdGlvbkJ1aWx0JCBzdWJqZWN0XG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5idWlsZENvbm5lY3Rpb24oKSksXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRNZXNzYWdlSGFuZGxlcnMoKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uQnVpbHQkLm5leHQoKTtcbiAgICAgIH0pLFxuICAgICAgLy8gU3RhcnQgdGhlIGNvbm5lY3Rpb24gYW5kIGhhbmRsZSB0aGUgY29tcGxldGlvbiB3aXRoIHRoZSBjb25uZWN0aW9uU3RhcnRlZCQgc3ViamVjdFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc3RhcnRDb25uZWN0aW9uKCkpLFxuICAgICAgLy8gRXhlY3V0ZSBwYXJhbGxlbCByZXF1ZXN0cyBmb3IgbW9kZWxzIGFuZCBmdW5jdGlvbnNcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXJ0ZWQkLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFtcbiAgICAgICAgICB0aGlzLmxpc3RNb2RlbHMoKSxcbiAgICAgICAgICB0aGlzLmxpc3RGdW5jdGlvbnMoKVxuICAgICAgICBdKVxuICAgICAgfSksXG4gICAgICAvLyBNYXAgdGhlIHJlc3VsdHMgb2YgcGFyYWxsZWwgcmVxdWVzdHMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzc1xuICAgICAgbWFwKChbbW9kZWxzLCBmdW5jdGlvbnNdKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdFByb2Nlc3MkLm5leHQodHJ1ZSk7XG4gICAgICAgIHJldHVybiAhIW1vZGVscyAmJiAhIWZ1bmN0aW9uc1xuICAgICAgfSksXG4gICAgICAvLyBBbnkgZXJyb3JzIGR1cmluZyB0aGUgcHJvY2VzcyBhcmUgY2F1Z2h0LCBsb2dnZWQsIGFuZCByZS10aHJvd24gdG8gcHJvcGFnYXRlIHRoZSBlcnJvciBmdXJ0aGVyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBvY2N1cnJlZDonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pLFxuICAgICAgLy8gQ2FjaGUgYW5kIHJlcGxheSB0aGUgZW1pdHRlZCB2YWx1ZSBmb3Igc3Vic2VxdWVudCBzdWJzY3JpYmVyc1xuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgYXNzaXN0YW50IGVuZHBvaW50IHRvIHVzZSBmb3IgdGhlIHdlYnNvY2tldCByZXF1ZXN0c1xuICAgKiBJdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwIGNvbmZpZ1xuICAgKi9cbiAgZ2V0UmVxdWVzdHNVcmwoKSB7XG4gICAgaWYgKHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmdsb2JhbFNldHRpbmdzLndlYnNvY2tldEVuZHBvaW50KSB7XG4gICAgICB0aGlzLlJFUVVFU1RfVVJMID0gdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZ2xvYmFsU2V0dGluZ3Mud2Vic29ja2V0RW5kcG9pbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5ICd3ZWJzb2NrZXRFbmRwb2ludCcgbXVzdCBiZSBwcm92aWRlZCB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlICdXZWJTb2NrZXQnIGluIGFzc2lzdGFudCBpbnN0YW5jZWApO1xuICAgIH1cbiAgfVxuXG4gIGxpc3RNb2RlbHMoKTogT2JzZXJ2YWJsZTxHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbW9kZWxzU3ViamVjdCA9IG5ldyBTdWJqZWN0PEdsbG1Nb2RlbERlc2NyaXB0aW9uW10gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdMaXN0TW9kZWxzJywgKHJlcykgPT4ge1xuICAgICAgdGhpcy5tb2RlbHMgPSByZXMubW9kZWxzPy5maWx0ZXIobW9kZWwgPT4gISFtb2RlbC5lbmFibGUpO1xuICAgICAgbW9kZWxzU3ViamVjdC5uZXh0KHRoaXMubW9kZWxzKTtcbiAgICAgIG1vZGVsc1N1YmplY3QuY29tcGxldGUoKVxuICAgIH0pO1xuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdCB0byBnZXQgdGhlIGxpc3Qgb2YgbW9kZWxzXG4gICAgdGhpcy5jb25uZWN0aW9uIS5pbnZva2UoJ0xpc3RNb2RlbHMnLCB7IGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWJ1ZyB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgTGlzdE1vZGVsczonLCBlcnJvcik7XG4gICAgICAgIG1vZGVsc1N1YmplY3QuY29tcGxldGUoKVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25cbiAgICAgIH0pXG5cbiAgICByZXR1cm4gbW9kZWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGxpc3RGdW5jdGlvbnMoKTogT2JzZXJ2YWJsZTxHbGxtRnVuY3Rpb25bXSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGZ1bmN0aW9uc1N1YmplY3QgPSBuZXcgU3ViamVjdDxHbGxtRnVuY3Rpb25bXSB8IHVuZGVmaW5lZD4oKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiEub24oJ0xpc3RGdW5jdGlvbnMnLCAocmVzKSA9PiB7XG4gICAgICB0aGlzLmZ1bmN0aW9ucyA9IHJlcy5mdW5jdGlvbnM7XG4gICAgICBmdW5jdGlvbnNTdWJqZWN0Lm5leHQodGhpcy5mdW5jdGlvbnMpO1xuICAgICAgZnVuY3Rpb25zU3ViamVjdC5jb21wbGV0ZSgpXG4gICAgfSk7XG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0IHRvIGdldCB0aGUgbGlzdCBvZiBmdW5jdGlvbnNcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnTGlzdEZ1bmN0aW9ucycsIHsgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlYnVnIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBMaXN0RnVuY3Rpb25zOicsIGVycm9yKTtcbiAgICAgICAgZnVuY3Rpb25zU3ViamVjdC5jb21wbGV0ZSgpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gUmV0dXJuIGEgcmVzb2x2ZWQgcHJvbWlzZSB0byBoYW5kbGUgdGhlIGVycm9yIGFuZCBwcmV2ZW50IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvblxuICAgICAgfSlcblxuICAgIHJldHVybiBmdW5jdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZmV0Y2gobWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIHF1ZXJ5ID0gdGhpcy5zZWFyY2hTZXJ2aWNlLnF1ZXJ5KTogT2JzZXJ2YWJsZTxDaGF0UmVzcG9uc2U+IHtcbiAgICAvLyBTdGFydCBzdHJlYW1pbmcgYnkgaW52b2tpbmcgdGhlIENoYXQgbWV0aG9kXG4gICAgdGhpcy5zdHJlYW1pbmckLm5leHQodHJ1ZSk7XG5cbiAgICAvLyBQcmVwYXJlIHRoZSBwYXlsb2FkIHRvIHNlbmQgdG8gdGhlIENoYXQgbWV0aG9kXG4gICAgY29uc3QgZGF0YTogQ2hhdFBheWxvYWQgPSB7XG4gICAgICBoaXN0b3J5OiBtZXNzYWdlcyxcbiAgICAgIGZ1bmN0aW9uczogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZnVuY3Rpb25zLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlYnVnLFxuICAgICAgc2VydmljZVNldHRpbmdzOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5zZXJ2aWNlU2V0dGluZ3MsXG4gICAgICBjb250ZXh0U2V0dGluZ3M6IHtcbiAgICAgICAgLi4udGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuY29udGV4dFNldHRpbmdzLFxuICAgICAgICBhcHA6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgICBxdWVyeVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuc2F2ZUNoYXRzKSB7XG4gICAgICBkYXRhLmluc3RhbmNlSWQgPSB0aGlzLmNoYXRJbnN0YW5jZUlkO1xuICAgICAgZGF0YS5zYXZlZENoYXRJZCA9IHRoaXMuc2F2ZWRDaGF0SWQ7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlOiBDaGF0TWVzc2FnZSA9IHtyb2xlOiBcImFzc2lzdGFudFwiLCBjb250ZW50OiBcIlwiLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRydWV9fTsgLy8gaGVyZSBkaXNwbGF5OiB0cnVlIGlzIG5lZWRlZCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHNob3cgdGhlIHByb2dyZXNzXG5cbiAgICAvLyBDcmVhdGUgYSBTdWJqZWN0IHRvIHNpZ25hbCBjb21wbGV0aW9uXG4gICAgY29uc3QgY29tcGxldGlvbiQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLy8gQ3JlYXRlIG9ic2VydmFibGVzIGZvciBlYWNoIG5vbi1nbG9iYWwgaGFuZGxlciBpbiB0aGUgbWVzc2FnZUhhbmRsZXJzIG1hcCAoZGVmYXVsdCBhbmQgZXZlbnR1YWwgY3VzdG9tIG9uZXMpIG9uY2UgaXQgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBodWIgY29ubmVjdGlvblxuICAgIGNvbnN0IG9ic2VydmFibGVzID0gQXJyYXlcbiAgICAgIC5mcm9tKHRoaXMubWVzc2FnZUhhbmRsZXJzLmVudHJpZXMoKSlcbiAgICAgIC5maWx0ZXIoKFtldmVudE5hbWUsIGV2ZW50SGFuZGxlcl0pID0+ICFldmVudEhhbmRsZXIuaXNHbG9iYWxIYW5kbGVyKVxuICAgICAgLm1hcCgoW2V2ZW50TmFtZSwgZXZlbnRIYW5kbGVyXSkgPT4ge1xuICAgICAgICByZXR1cm4gZnJvbUV2ZW50PGFueT4odGhpcy5jb25uZWN0aW9uISwgZXZlbnROYW1lKS5waXBlKFxuICAgICAgICAgIG1hcCgoZXZlbnQpID0+IGV2ZW50SGFuZGxlci5oYW5kbGVyKGV2ZW50KSkgLy8gRXhlY3V0ZSB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGVyXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIC8vIFRoZW4gbWVyZ2UgdGhlbSBpbnRvIGEgc2luZ2xlIG9ic2VydmFibGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIHN0cmVhbWluZyBiZWhhdmlvclxuICAgIGNvbnN0IGNvbWJpbmVkJCA9IG1lcmdlKC4uLm9ic2VydmFibGVzKS5waXBlKFxuICAgICAgdGFrZVVudGlsKGNvbXBsZXRpb24kKSAvLyBDb21wbGV0ZSB0aGUgb2JzZXJ2YWJsZSB3aGVuIGNvbXBsZXRpb24kIGVtaXRzXG4gICAgKTtcblxuICAgIC8vIEludm9rZSB0aGUgQ2hhdCBtZXRob2RcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnQ2hhdCcsIGRhdGEpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLm5vdGlmeUF1ZGl0KHRoaXMuY2hhdEhpc3RvcnkhLCB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5zZXJ2aWNlU2V0dGluZ3Muc2VydmljZV9pZCkpIC8vIFdoZW4gdGhlIHNlcnZlciBpbmRpY2F0ZXMgaXQgaGFzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCBpbnZva2luZyB0aGUgbWV0aG9kLCBub3RpZnkgdGhlIGF1ZGl0IHNlcnZpY2Ugd2l0aCB0aGUgcmVjZW50IGNoYXQgaGlzdG9yeVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgQ2hhdDonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gUmV0dXJuIGEgcmVzb2x2ZWQgcHJvbWlzZSB0byBoYW5kbGUgdGhlIGVycm9yIGFuZCBwcmV2ZW50IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvblxuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5zdHJlYW1pbmckLm5leHQoZmFsc2UpOyAvLyBDb21wbGV0ZSBzdHJlYW1pbmcgcmVnYXJkbGVzcyBvZiBzdWNjZXNzIG9yIGVycm9yXG4gICAgICAgIHRoaXMuYWN0aW9uTWFwLmNsZWFyKCk7IC8vIENsZWFyIHRoZSBhY3Rpb25NYXBcbiAgICAgICAgdGhpcy5jb250ZW50ID0gXCJcIjsgLy8gQ2xlYXIgdGhlIGNvbnRlbnRcbiAgICAgICAgdGhpcy5hdHRhY2htZW50cyA9IFtdOyAvLyBDbGVhciB0aGUgYXR0YWNobWVudHNcbiAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lID0gXCJcIjsgLy8gQ2xlYXIgdGhlIGV4ZWN1dGlvblRpbWVcbiAgICAgICAgY29tcGxldGlvbiQubmV4dCgpOyAvLyBFbWl0IGEgc2lnbmFsIHRvIGNvbXBsZXRlIHRoZSBvYnNlcnZhYmxlc1xuICAgICAgICBjb21wbGV0aW9uJC5jb21wbGV0ZSgpOyAvLyBDb21wbGV0ZSB0aGUgc3ViamVjdFxuICAgICAgfSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIG1lcmdlZCBvYnNlcnZhYmxlc1xuICAgIHJldHVybiBjb21iaW5lZCQucGlwZShcbiAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgIC8vIERlZmluZSAkcHJvZ3Jlc3MgZnJvbSB0aGUgYWN0aW9uTWFwXG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMuYWN0aW9uTWFwLnZhbHVlcygpKTtcbiAgICAgICAgY29uc3QgJHByb2dyZXNzID0gYWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gYWN0aW9ucy5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBhLmRpc3BsYXlOYW1lID8/IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGEuZGlzcGxheVZhbHVlID8/IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGEuZXhlY3V0aW9uVGltZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiBhLmV4ZWN1dGlvblRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gRGVmaW5lIHRoZSBhdHRhY2htZW50IHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlc3BvbnNlIG1lc3NhZ2VcbiAgICAgICAgY29uc3QgJGF0dGFjaG1lbnQgPSB0aGlzLmF0dGFjaG1lbnRzO1xuXG4gICAgICAgIC8vIEFzIHNvb24gYXMgdGhlIGZpcnN0IGNvbnRlbnQgb3IgJHByb2dyZXNzIGlzIGRlZmluZWQsIHRoZSBhc3Npc3RhbnQgaXMgY29uc2lkZXJlZCBhcyBzdHJlYW1pbmdcbiAgICAgICAgaWYoISF0aGlzLmNvbnRlbnQgfHwgJHByb2dyZXNzIHx8ICRhdHRhY2htZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXNwb25zZSA9IHsuLi5yZXNwb25zZSwgY29udGVudDogdGhpcy5jb250ZW50LCBhZGRpdGlvbmFsUHJvcGVydGllczogey4uLnJlc3BvbnNlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLCAkcHJvZ3Jlc3MsICRhdHRhY2htZW50fSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSByZXN1bHRcbiAgICAgICAgcmV0dXJuIHsgaGlzdG9yeTogWy4uLm1lc3NhZ2VzLCByZXNwb25zZV0sIGV4ZWN1dGlvblRpbWU6IHRoaXMuZXhlY3V0aW9uVGltZSB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbGlzdFNhdmVkQ2hhdCgpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWJ1Z1xuICAgIH07XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdTYXZlZENoYXRMaXN0JywgKHJlcykgPT4ge1xuICAgICAgdGhpcy5zYXZlZENoYXRzJC5uZXh0KHJlcy5zYXZlZENoYXRzKTsgLy8gZW1pdHMgdGhlIHJlc3VsdCB0byB0aGUgc2F2ZWRDaGF0cyQgc3ViamVjdFxuICAgIH0pO1xuXG4gICAgLy8gSW52b2tlIHRoZSBtZXRob2QgU2F2ZWRDaGF0TGlzdFxuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdTYXZlZENoYXRMaXN0JywgZGF0YSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGludm9raW5nIFNhdmVkQ2hhdExpc3Q6JywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldFNhdmVkQ2hhdChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTYXZlZENoYXRIaXN0b3J5IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc2F2ZWRDaGF0U3ViamVjdCA9IG5ldyBTdWJqZWN0PFNhdmVkQ2hhdEhpc3RvcnkgfCB1bmRlZmluZWQ+KCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgIHNhdmVkQ2hhdElkOiBpZCxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWJ1Z1xuICAgIH07XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdTYXZlZENoYXRHZXQnLCAocmVzKSA9PiB7XG4gICAgICBzYXZlZENoYXRTdWJqZWN0Lm5leHQocmVzLnNhdmVkQ2hhdCk7XG4gICAgICBzYXZlZENoYXRTdWJqZWN0LmNvbXBsZXRlKClcbiAgICB9KTtcblxuICAgIC8vIEludm9rZSB0aGUgbWV0aG9kIFNhdmVkQ2hhdEdldFxuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdTYXZlZENoYXRHZXQnLCBkYXRhKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgU2F2ZWRDaGF0R2V0OicsIGVycm9yKTtcbiAgICAgICAgc2F2ZWRDaGF0U3ViamVjdC5jb21wbGV0ZSgpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0pXG5cbiAgICByZXR1cm4gc2F2ZWRDaGF0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGRlbGV0ZVNhdmVkQ2hhdChpZHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBjb25zdCBkZWxldGVTYXZlZENoYXRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBTYXZlZENoYXRJZHM6IGlkcyxcbiAgICAgIGRlYnVnOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWJ1Z1xuICAgIH07XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdTYXZlZENoYXREZWxldGUnLCAocmVzKSA9PiB7XG4gICAgICBkZWxldGVTYXZlZENoYXRTdWJqZWN0Lm5leHQocmVzLmRlbGV0ZUNvdW50KTtcbiAgICAgIGRlbGV0ZVNhdmVkQ2hhdFN1YmplY3QuY29tcGxldGUoKTtcbiAgICB9KTtcblxuICAgIC8vIEludm9rZSB0aGUgbWV0aG9kIFNhdmVkQ2hhdERlbGV0ZVxuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdTYXZlZENoYXREZWxldGUnLCBkYXRhKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgU2F2ZWRDaGF0RGVsZXRlOicsIGVycm9yKTtcbiAgICAgICAgZGVsZXRlU2F2ZWRDaGF0U3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9KVxuXG4gICAgcmV0dXJuIGRlbGV0ZVNhdmVkQ2hhdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBvdXQtb2YtdGhlLWJveCBoYW5kbGVyc1xuICAgKiBJdCBpcyBhIHBsYWNlaG9sZGVyIGZvciBub24tc3RyZWFtaW5nIHNjZW5hcmlvcywgd2hlcmUgeW91IGludm9rZSBhIHNwZWNpZmljIGh1YiBtZXRob2QsIGFuZCB0aGUgc2VydmVyIHJlc3BvbmRzIHdpdGggYSBzaW5nbGUgbWVzc2FnZSBvciBhIHJlc3VsdFxuICAgKi9cbiAgaW5pdE1lc3NhZ2VIYW5kbGVycygpIHtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJEZWJ1Z1wiLFxuICAgICAgeyBoYW5kbGVyOiAoZGVidWc6IGFueSkgPT4gY29uc29sZS5sb2coZGVidWcpLFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IHRydWVcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXG4gICAgICBcIkFjdGlvblN0YXJ0XCIsXG4gICAgICB7IGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblN0YXJ0RXZlbnQpID0+IHRoaXMuYWN0aW9uTWFwLnNldChhY3Rpb24uZ3VpZCwgYWN0aW9uKSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiQWN0aW9uUmVzdWx0XCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblJlc3VsdEV2ZW50KSA9PiB0aGlzLmFjdGlvbk1hcC5zZXQoYWN0aW9uLmd1aWQsIHsgLi4udGhpcy5hY3Rpb25NYXAuZ2V0KGFjdGlvbi5ndWlkKSwgLi4uYWN0aW9uIH0pLFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJBY3Rpb25TdG9wXCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblN0b3BFdmVudCkgPT4gdGhpcy5hY3Rpb25NYXAuc2V0KGFjdGlvbi5ndWlkLCB7IC4uLnRoaXMuYWN0aW9uTWFwLmdldChhY3Rpb24uZ3VpZCksIC4uLmFjdGlvbiB9KSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiQ29udGV4dE1lc3NhZ2VcIixcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IENvbnRleHRNZXNzYWdlRXZlbnQpID0+IHRoaXMuYXR0YWNobWVudHMucHVzaChtZXNzYWdlLm1ldGFkYXRhKSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiTWVzc2FnZVwiLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogTWVzc2FnZUV2ZW50KSA9PiB0aGlzLmNvbnRlbnQgKz0gbWVzc2FnZSA/PyBcIlwiLFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJIaXN0b3J5XCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChoaXN0b3J5OiBIaXN0b3J5RXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmNoYXRIaXN0b3J5ID0gaGlzdG9yeS5oaXN0b3J5XG4gICAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lID0gaGlzdG9yeS5leGVjdXRpb25UaW1lO1xuICAgICAgICB9LFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJFcnJvclwiLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoZXJyb3I6IEVycm9yRXZlbnQpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiB0cnVlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJRdW90YVwiLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUXVvdGFFdmVudCkgPT4ge1xuICAgICAgICAgIGlmKG1lc3NhZ2UucXVvdGEubWF4UXVvdGFSZWFjaGVkKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgU29ycnksIHlvdSBoYXZlIGV4Y2VlZGVkIHRoZSBhbGxvd2VkIHF1b3RhLiBQbGVhc2UgcmV0cnkgc3RhcnRpbmcgZnJvbSAke3RoaXMuZm9ybWF0RGF0ZVRpbWUobWVzc2FnZS5xdW90YS5uZXh0UmVzZXRVVEMpfS5gO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcihtc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiB0cnVlXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBhbmQgcmVnaXN0ZXIgdGhlIGVudGlyZSBtZXNzYWdlSGFuZGxlcnMgbWFwIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIG1hcCB3aXRoIHRoZSBkZWZhdWx0IG9uZVxuICAgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJzXG4gICAqL1xuICBvdmVycmlkZU1lc3NhZ2VIYW5kbGVyczxUPihtZXNzYWdlSGFuZGxlcnM6IE1hcDxzdHJpbmcsIE1lc3NhZ2VIYW5kbGVyPFQ+Pikge1xuICAgIC8vIENsZWFyIHRoZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZ2xvYmFsIGNoYXQgaGFuZGxlcnMgYmVmb3JlIG1lcmdpbmcgdGhlIG5ldyBvbmVzXG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlcnMuZm9yRWFjaCgoZXZlbnRIYW5kbGVyLCBldmVudE5hbWUpID0+IHtcbiAgICAgIGlmKGV2ZW50SGFuZGxlci5pc0dsb2JhbEhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZU1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBNZXJnZSB0aGUgbmV3IGV2ZW50IGhhbmRsZXJzIHdpdGggdGhlIGV4aXN0aW5nIG9uZXNcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IG5ldyBNYXAoWy4uLnRoaXMubWVzc2FnZUhhbmRsZXJzLCAuLi5tZXNzYWdlSGFuZGxlcnNdKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBnbG9iYWwgY2hhdCBoYW5kbGVycyBhbW9uZyB0aGUgbWVyZ2VkIG1hcFxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzLmZvckVhY2goKGV2ZW50SGFuZGxlciwgZXZlbnROYW1lKSA9PiB7XG4gICAgICBpZihldmVudEhhbmRsZXIuaXNHbG9iYWxIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgZXZlbnQuXG4gICAqIElmIGEgbGlzdGVuZXIgZm9yIHRoaXMgc2FtZSBldmVudCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBvdmVycmlkZGVuLlxuICAgKiBJZiB0aGUgbGlzdGVuZXIgaGFzIFwiaXNDaGF0R2xvYmFsSGFuZGxlclwiIHNldCB0byB0cnVlLCBpdCB3aWxsIGJlIHJlZ2lzdGVyZWQgdG8gdGhlIGh1YiBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIE5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHJlY2VpdmVkXG4gICAqL1xuICBhZGRNZXNzYWdlSGFuZGxlcjxUPihldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPikge1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzLnNldChldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgaWYoZXZlbnRIYW5kbGVyLmlzR2xvYmFsSGFuZGxlcikge1xuICAgICAgdGhpcy5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHluYW1pY2FsbHkgcmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBldmVudC5cbiAgICogSWYgYSBsaXN0ZW5lciBmb3IgdGhpcyBldmVudCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBvdmVycmlkZGVuLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIE5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHJlY2VpdmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlcjxUPihldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPikge1xuICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIk5vIGNvbm5lY3Rpb24gZm91bmQgdG8gcmVnaXN0ZXIgdGhlIGxpc3RlbmVyXCIgKyBldmVudE5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbi5vbihldmVudE5hbWUsIChkYXRhOiBUKSA9PiB7XG4gICAgICBldmVudEhhbmRsZXIuaGFuZGxlcihkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBldmVudCBmcm9tIHRoZSBtZXNzYWdlSGFuZGxlcnMgbWFwIGFuZCB1bnN1YnNjcmliZSBmcm9tIHJlY2VpdmluZyBtZXNzYWdlcyBmb3IgdGhpcyBldmVudCBmcm9tIHRoZSBTaWduYWxSIGh1Yi5cbiAgICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZvclxuICAgKi9cbiAgcmVtb3ZlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHJlY2VpdmluZyBtZXNzYWdlcyBmb3IgYSBzcGVjaWZpYyBldmVudCBmcm9tIHRoZSBTaWduYWxSIGh1Yi5cbiAgICogQUxMIGl0cyByZWxhdGVkIGxpc3RlbmVycyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBodWIgY29ubmVjdGlvblxuICAgKiBUaGlzIGlzIG5lZWRlZCB0byBwcmV2ZW50IGFjY3VtdWxhdGluZyBvbGQgbGlzdGVuZXJzIHdoZW4gb3ZlcnJpZGluZyB0aGUgZW50aXJlIG1lc3NhZ2VIYW5kbGVycyBtYXBcbiAgICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIHVuc3Vic2NyaWJlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9mZihldmVudE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29ubmVjdGlvbiB0byB0aGUgc2lnbmFsUiB3ZWJzb2NrZXQgYW5kIHJlZ2lzdGVyIGRlZmF1bHQgbGlzdGVuZXJzIHRvIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlcnZlciBodWIgY2xhc3NcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uLiBJdCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICAgKiBAcGFyYW0gbG9nTGV2ZWwgRGVmaW5lIHRoZSBsb2cgbGV2ZWwgZGlzcGxheWVkIGluIHRoZSBjb25zb2xlXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGJ1aWx0XG4gICAqL1xuICBidWlsZENvbm5lY3Rpb24ob3B0aW9ucz86IENvbm5lY3Rpb25PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5SRVFVRVNUX1VSTCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJObyBlbmRwb2ludCBwcm92aWRlZCB0byBjb25uZWN0IHRoZSB3ZWJzb2NrZXQgdG9cIikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvZ0xldmVsID0gdGhpcy5nZXRMb2dMZXZlbCgpO1xuICAgICAgdGhpcy5jb25uZWN0aW9uID0gdGhpcy5zaWduYWxSU2VydmljZS5idWlsZENvbm5lY3Rpb24odGhpcy5SRVFVRVNUX1VSTCwgey4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnN9LCBsb2dMZXZlbCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIGNvbm5lY3Rpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgc3RhcnRlZFxuICAgKi9cbiAgc3RhcnRDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbFJTZXJ2aWNlLnN0YXJ0Q29ubmVjdGlvbih0aGlzLmNvbm5lY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIGNvbm5lY3Rpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgc3RvcHBlZFxuICAgKi9cbiAgc3RvcENvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUlNlcnZpY2Uuc3RvcENvbm5lY3Rpb24odGhpcy5jb25uZWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJhbnNwb3J0cygpOiBIdHRwVHJhbnNwb3J0VHlwZSB7XG4gICAgc3dpdGNoICh0aGlzLmNoYXRDb25maWckLnZhbHVlPy5nbG9iYWxTZXR0aW5ncy5zaWduYWxSVHJhbnNwb3J0KSB7XG4gICAgICBjYXNlIFwiV2ViU29ja2V0c1wiOlxuICAgICAgICByZXR1cm4gSHR0cFRyYW5zcG9ydFR5cGUuV2ViU29ja2V0cztcbiAgICAgIGNhc2UgXCJTZXJ2ZXJTZW50RXZlbnRzXCI6XG4gICAgICAgIHJldHVybiBIdHRwVHJhbnNwb3J0VHlwZS5TZXJ2ZXJTZW50RXZlbnRzO1xuICAgICAgY2FzZSBcIkxvbmdQb2xsaW5nXCI6XG4gICAgICAgIHJldHVybiBIdHRwVHJhbnNwb3J0VHlwZS5Mb25nUG9sbGluZztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBIdHRwVHJhbnNwb3J0VHlwZS5Ob25lO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9nTGV2ZWwoKTogTG9nTGV2ZWwge1xuICAgIHN3aXRjaCAodGhpcy5jaGF0Q29uZmlnJC52YWx1ZT8uZ2xvYmFsU2V0dGluZ3Muc2lnbmFsUkxvZ0xldmVsKSB7XG4gICAgICBjYXNlIFwiQ3JpdGljYWxcIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLkNyaXRpY2FsOyAvLyBMb2cgbGV2ZWwgZm9yIGRpYWdub3N0aWMgbWVzc2FnZXMgdGhhdCBpbmRpY2F0ZSBhIGZhaWx1cmUgdGhhdCB3aWxsIHRlcm1pbmF0ZSB0aGUgZW50aXJlIGFwcGxpY2F0aW9uLlxuICAgICAgY2FzZSBcIkRlYnVnXCI6XG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5EZWJ1ZzsgLy8gTG9nIGxldmVsIGZvciBsb3cgc2V2ZXJpdHkgZGlhZ25vc3RpYyBtZXNzYWdlcy5cbiAgICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuRXJyb3I7IC8vIExvZyBsZXZlbCBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGF0IGluZGljYXRlIGEgZmFpbHVyZSBpbiB0aGUgY3VycmVudCBvcGVyYXRpb24uXG4gICAgICBjYXNlIFwiSW5mb3JtYXRpb25cIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLkluZm9ybWF0aW9uOyAvLyBMb2cgbGV2ZWwgZm9yIGluZm9ybWF0aW9uYWwgZGlhZ25vc3RpYyBtZXNzYWdlcy5cbiAgICAgIGNhc2UgXCJOb25lXCI6XG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5Ob25lOyAvLyBUaGUgaGlnaGVzdCBwb3NzaWJsZSBsb2cgbGV2ZWwuIFVzZWQgd2hlbiBjb25maWd1cmluZyBsb2dnaW5nIHRvIGluZGljYXRlIHRoYXQgbm8gbG9nIG1lc3NhZ2VzIHNob3VsZCBiZSBlbWl0dGVkLlxuICAgICAgY2FzZSBcIlRyYWNlXCI6XG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5UcmFjZTsgLy8gTG9nIGxldmVsIGZvciB2ZXJ5IGxvdyBzZXZlcml0eSBkaWFnbm9zdGljIG1lc3NhZ2VzLlxuICAgICAgY2FzZSBcIldhcm5pbmdcIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLldhcm5pbmc7IC8vIExvZyBsZXZlbCBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGF0IGluZGljYXRlIGEgbm9uLWZhdGFsIHByb2JsZW0uXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuTm9uZTsgLy8gVGhlIGhpZ2hlc3QgcG9zc2libGUgbG9nIGxldmVsLiBVc2VkIHdoZW4gY29uZmlndXJpbmcgbG9nZ2luZyB0byBpbmRpY2F0ZSB0aGF0IG5vIGxvZyBtZXNzYWdlcyBzaG91bGQgYmUgZW1pdHRlZC5cbiAgICB9XG4gIH1cblxuICBnZXQgZGVmYXVsdE9wdGlvbnMoKTogQ29ubmVjdGlvbk9wdGlvbnMge1xuICAgIGxldCBoZWFkZXJzOiBNZXNzYWdlSGVhZGVycyA9IHtcbiAgICAgIFwic2luZXF1YS1mb3JjZS1jYW1lbC1jYXNlXCI6IFwidHJ1ZVwiLFxuICAgICAgXCJ4LWxhbmd1YWdlXCI6IHRoaXMuaW50bFNlcnZpY2UuY3VycmVudExvY2FsZS5uYW1lLFxuICAgICAgXCJ1aS1sYW5ndWFnZVwiOiB0aGlzLmludGxTZXJ2aWNlLmN1cnJlbnRMb2NhbGUubmFtZSxcbiAgICB9O1xuICAgIGlmICh0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZXNzZWRDcmVkZW50aWFscykge1xuICAgICAgaGVhZGVycyA9IHsuLi5oZWFkZXJzLCBcInNpbmVxdWEtY3NyZi10b2tlblwiOiB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZXNzZWRDcmVkZW50aWFscy5kYXRhLmNzcmZUb2tlbn07XG4gICAgfTtcbiAgICAvLyBGb3IgdGhlIGZpcnN0IEdFVCByZXF1ZXN0IHNlbnQgYnkgc2lnbmFsUiB0byBzdGFydCBhIFdlYlNvY2tldCBwcm90b2NvbCxcbiAgICAvLyBhcyBmYXIgYXMgd2Uga25vdywgc2lnbmFsUiBvbmx5IGxldHMgdXMgdHdlYWsgdGhlIHJlcXVlc3Qgd2l0aCB0aGlzIGFjY2VzcyB0b2tlbiBmYWN0b3J5XG4gICAgLy8gc28gd2UgcGFzcyBhbG9uZyB0aGUgU2luZXF1YSBDU1JGIHRva2VuIHRvIHBhc3MgdGhlIENTUkYgY2hlY2suLlxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc3BvcnQ6IHRoaXMuZ2V0VHJhbnNwb3J0cygpLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGFjY2Vzc1Rva2VuRmFjdG9yeTogKCkgPT4gdGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2UucHJvY2Vzc2VkQ3JlZGVudGlhbHM/LmRhdGE/LmNzcmZUb2tlbiB8fCBcIlwiXG4gICAgfVxuICB9XG59XG4iXX0=
457
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L3dlYnNvY2tldC1jaGF0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFxQixpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWxGLE9BQU8sRUFBRSxpQkFBaUIsRUFBaUIsUUFBUSxFQUFrQixNQUFNLG9CQUFvQixDQUFDO0FBRWhHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBR3BKLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxXQUFXO0lBZ0JuRDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBZEgscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQyxDQUFDLG9DQUFvQztRQUM1RSx1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDLENBQUMsc0NBQXNDO1FBRS9FLG9CQUFlLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFFOUQsY0FBUyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBQzdDLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFFYixnQkFBVyxHQUE0QixFQUFFLENBQUM7UUFFM0MsbUJBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzQywwQkFBcUIs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QUFJLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLEVBQUU7WUFDbkQsT0FBTyxHQUFHLEVBQUMsR0FBRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQztTQUM5RztRQUFBLENBQUM7UUFDRiwyRUFBMkU7UUFDM0UsMkZBQTJGO1FBQzNGLG1FQUFtRTtRQUNuRSxPQUFPO1lBQ0wsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDL0IsZUFBZSxFQUFFLElBQUk7WUFDckIsT0FBTztZQUNQLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxJQUFJLEVBQUU7U0FDakcsQ0FBQTtJQUNILENBQUM7O2lIQTFoQlUsb0JBQW9CO3FIQUFwQixvQkFBb0I7MkZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9sb2dpblwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbk9wdGlvbnMsIFNpZ25hbFJXZWJTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2FwcC11dGlsc1wiO1xuaW1wb3J0IHsgSHR0cFRyYW5zcG9ydFR5cGUsIEh1YkNvbm5lY3Rpb24sIExvZ0xldmVsLCBNZXNzYWdlSGVhZGVycyB9IGZyb20gXCJAbWljcm9zb2Z0L3NpZ25hbHJcIjtcbmltcG9ydCB7IEFjdGlvbk1lc3NhZ2UsIEFjdGlvblJlc3VsdEV2ZW50LCBBY3Rpb25TdGFydEV2ZW50LCBBY3Rpb25TdG9wRXZlbnQsIE1lc3NhZ2VFdmVudCwgQ2hhdE1lc3NhZ2UsIENoYXRQYXlsb2FkLCBDaGF0UmVzcG9uc2UsIEdsbG1GdW5jdGlvbiwgR2xsbU1vZGVsRGVzY3JpcHRpb24sIE1lc3NhZ2VIYW5kbGVyLCBIaXN0b3J5RXZlbnQsIEVycm9yRXZlbnQsIFF1b3RhRXZlbnQsIENoYXRDb250ZXh0QXR0YWNobWVudCwgQ29udGV4dE1lc3NhZ2VFdmVudCwgU2F2ZWRDaGF0SGlzdG9yeSwgU2F2ZWRDaGF0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4vY2hhdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBtZXJnZSwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBjYXRjaEVycm9yLCBmaWx0ZXIsIGZvcmtKb2luLCBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCwgdGhyb3dFcnJvciwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldENoYXRTZXJ2aWNlIGV4dGVuZHMgQ2hhdFNlcnZpY2Uge1xuXG4gIHB1YmxpYyBjb25uZWN0aW9uOiBIdWJDb25uZWN0aW9uIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgY29ubmVjdGlvbkJ1aWx0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7IC8vIEVtaXQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBidWlsdFxuICBwdWJsaWMgY29ubmVjdGlvblN0YXJ0ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTsgLy8gRW1pdCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHN0YXJ0ZWRcblxuICBwcml2YXRlIG1lc3NhZ2VIYW5kbGVyczogTWFwPHN0cmluZywgTWVzc2FnZUhhbmRsZXI8YW55Pj4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSBhY3Rpb25NYXAgPSBuZXcgTWFwPHN0cmluZywgQWN0aW9uTWVzc2FnZT4oKTtcbiAgcHJpdmF0ZSBjb250ZW50ID0gXCJcIjtcbiAgcHJpdmF0ZSBleGVjdXRpb25UaW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgYXR0YWNobWVudHM6IENoYXRDb250ZXh0QXR0YWNobWVudFtdID0gW107XG5cbiAgcHVibGljIHNpZ25hbFJTZXJ2aWNlID0gaW5qZWN0KFNpZ25hbFJXZWJTZXJ2aWNlKTtcbiAgcHVibGljIGF1dGhlbnRpY2F0aW9uU2VydmljZSA9IGluamVjdChBdXRoZW50aWNhdGlvblNlcnZpY2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgY2hhdCBwcm9jZXNzIGFmdGVyIHRoZSBsb2dpbiBpcyBjb21wbGV0ZS5cbiAgICogSXQgaW5jbHVkZXMgYnVpbGRpbmcgYW5kIHN0YXJ0aW5nIGEgY29ubmVjdGlvbiwgZXhlY3V0aW5nIHBhcmFsbGVsIHJlcXVlc3RzIGZvciBtb2RlbHMgYW5kIGZ1bmN0aW9ucywgYW5kIGhhbmRsaW5nIGVycm9ycyBkdXJpbmcgdGhlIHByb2Nlc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGU8Ym9vbGVhbj4gaW5kaWNhdGluZyB0aGUgc3VjY2VzcyBvZiB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy5cbiAgICovXG4gIGluaXQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMubG9naW5TZXJ2aWNlLmV2ZW50cy5waXBlKFxuICAgICAgZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09ICdsb2dpbi1jb21wbGV0ZScpLFxuICAgICAgdGFwKCgpID0+IHRoaXMuZ2V0UmVxdWVzdHNVcmwoKSksXG4gICAgICAvLyBCdWlsZCB0aGUgY29ubmVjdGlvbiBhbmQgaGFuZGxlIHRoZSBjb21wbGV0aW9uIHdpdGggdGhlIGNvbm5lY3Rpb25CdWlsdCQgc3ViamVjdFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuYnVpbGRDb25uZWN0aW9uKCkpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgdGhpcy5pbml0TWVzc2FnZUhhbmRsZXJzKCk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbkJ1aWx0JC5uZXh0KCk7XG4gICAgICB9KSxcbiAgICAgIC8vIFN0YXJ0IHRoZSBjb25uZWN0aW9uIGFuZCBoYW5kbGUgdGhlIGNvbXBsZXRpb24gd2l0aCB0aGUgY29ubmVjdGlvblN0YXJ0ZWQkIHN1YmplY3RcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnN0YXJ0Q29ubmVjdGlvbigpKSxcbiAgICAgIC8vIEV4ZWN1dGUgcGFyYWxsZWwgcmVxdWVzdHMgZm9yIG1vZGVscyBhbmQgZnVuY3Rpb25zXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGFydGVkJC5uZXh0KCk7XG4gICAgICAgIHJldHVybiBmb3JrSm9pbihbXG4gICAgICAgICAgdGhpcy5saXN0TW9kZWxzKCksXG4gICAgICAgICAgdGhpcy5saXN0RnVuY3Rpb25zKClcbiAgICAgICAgXSlcbiAgICAgIH0pLFxuICAgICAgLy8gTWFwIHRoZSByZXN1bHRzIG9mIHBhcmFsbGVsIHJlcXVlc3RzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3NcbiAgICAgIG1hcCgoW21vZGVscywgZnVuY3Rpb25zXSkgPT4ge1xuICAgICAgICB0aGlzLmluaXRQcm9jZXNzJC5uZXh0KHRydWUpO1xuICAgICAgICByZXR1cm4gISFtb2RlbHMgJiYgISFmdW5jdGlvbnNcbiAgICAgIH0pLFxuICAgICAgLy8gQW55IGVycm9ycyBkdXJpbmcgdGhlIHByb2Nlc3MgYXJlIGNhdWdodCwgbG9nZ2VkLCBhbmQgcmUtdGhyb3duIHRvIHByb3BhZ2F0ZSB0aGUgZXJyb3IgZnVydGhlclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJyZWQ6JywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KSxcbiAgICAgIC8vIENhY2hlIGFuZCByZXBsYXkgdGhlIGVtaXR0ZWQgdmFsdWUgZm9yIHN1YnNlcXVlbnQgc3Vic2NyaWJlcnNcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgdGhlIGFzc2lzdGFudCBlbmRwb2ludCB0byB1c2UgZm9yIHRoZSB3ZWJzb2NrZXQgcmVxdWVzdHNcbiAgICogSXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGFwcCBjb25maWdcbiAgICovXG4gIGdldFJlcXVlc3RzVXJsKCkge1xuICAgIGlmICh0aGlzLmNoYXRDb25maWckLnZhbHVlIS5jb25uZWN0aW9uU2V0dGluZ3Mud2Vic29ja2V0RW5kcG9pbnQpIHtcbiAgICAgIHRoaXMuUkVRVUVTVF9VUkwgPSB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5jb25uZWN0aW9uU2V0dGluZ3Mud2Vic29ja2V0RW5kcG9pbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5ICd3ZWJzb2NrZXRFbmRwb2ludCcgbXVzdCBiZSBwcm92aWRlZCB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlICdXZWJTb2NrZXQnIGluIGFzc2lzdGFudCBpbnN0YW5jZWApO1xuICAgIH1cbiAgfVxuXG4gIGxpc3RNb2RlbHMoKTogT2JzZXJ2YWJsZTxHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbW9kZWxzU3ViamVjdCA9IG5ldyBTdWJqZWN0PEdsbG1Nb2RlbERlc2NyaXB0aW9uW10gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdMaXN0TW9kZWxzJywgKHJlcykgPT4ge1xuICAgICAgdGhpcy5tb2RlbHMgPSAocmVzLm1vZGVscyBhcyBHbGxtTW9kZWxEZXNjcmlwdGlvbltdIHwgdW5kZWZpbmVkKT8uZmlsdGVyKG1vZGVsID0+ICEhbW9kZWwuZW5hYmxlKTtcbiAgICAgIG1vZGVsc1N1YmplY3QubmV4dCh0aGlzLm1vZGVscyk7XG4gICAgICBtb2RlbHNTdWJqZWN0LmNvbXBsZXRlKClcbiAgICB9KTtcblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3QgdG8gZ2V0IHRoZSBsaXN0IG9mIG1vZGVsc1xuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdMaXN0TW9kZWxzJywgeyBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1ZyB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgTGlzdE1vZGVsczonLCBlcnJvcik7XG4gICAgICAgIG1vZGVsc1N1YmplY3QuY29tcGxldGUoKVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25cbiAgICAgIH0pXG5cbiAgICByZXR1cm4gbW9kZWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGxpc3RGdW5jdGlvbnMoKTogT2JzZXJ2YWJsZTxHbGxtRnVuY3Rpb25bXSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGZ1bmN0aW9uc1N1YmplY3QgPSBuZXcgU3ViamVjdDxHbGxtRnVuY3Rpb25bXSB8IHVuZGVmaW5lZD4oKTtcblxuICAgIHRoaXMuY29ubmVjdGlvbiEub24oJ0xpc3RGdW5jdGlvbnMnLCAocmVzKSA9PiB7XG4gICAgICB0aGlzLmZ1bmN0aW9ucyA9IChyZXMuZnVuY3Rpb25zIGFzIEdsbG1GdW5jdGlvbltdIHwgdW5kZWZpbmVkKT8uZmlsdGVyKGZ1bmMgPT4gZnVuYy5lbmFibGVkKTtcbiAgICAgIGZ1bmN0aW9uc1N1YmplY3QubmV4dCh0aGlzLmZ1bmN0aW9ucyk7XG4gICAgICBmdW5jdGlvbnNTdWJqZWN0LmNvbXBsZXRlKClcbiAgICB9KTtcblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3QgdG8gZ2V0IHRoZSBsaXN0IG9mIGZ1bmN0aW9uc1xuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdMaXN0RnVuY3Rpb25zJywgeyBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1ZyB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgTGlzdEZ1bmN0aW9uczonLCBlcnJvcik7XG4gICAgICAgIGZ1bmN0aW9uc1N1YmplY3QuY29tcGxldGUoKVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFJldHVybiBhIHJlc29sdmVkIHByb21pc2UgdG8gaGFuZGxlIHRoZSBlcnJvciBhbmQgcHJldmVudCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25cbiAgICAgIH0pXG5cbiAgICByZXR1cm4gZnVuY3Rpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGZldGNoKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLCBxdWVyeTogUXVlcnkpOiBPYnNlcnZhYmxlPENoYXRSZXNwb25zZT4ge1xuICAgIC8vIFN0YXJ0IHN0cmVhbWluZyBieSBpbnZva2luZyB0aGUgQ2hhdCBtZXRob2RcbiAgICB0aGlzLnN0cmVhbWluZyQubmV4dCh0cnVlKTtcblxuICAgIC8vIFByZXBhcmUgdGhlIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgQ2hhdCBtZXRob2RcbiAgICBjb25zdCBkYXRhOiBDaGF0UGF5bG9hZCA9IHtcbiAgICAgIGhpc3Rvcnk6IG1lc3NhZ2VzLFxuICAgICAgZnVuY3Rpb25zOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLmZ1bmN0aW9ucz8uZmlsdGVyKGZ1bmMgPT4gZnVuYy5lbmFibGVkKS5tYXAoZnVuYyA9PiBmdW5jLm5hbWUpLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZGVidWcsXG4gICAgICBzZXJ2aWNlU2V0dGluZ3M6IHtcbiAgICAgICAgc2VydmljZV9pZDogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLFxuICAgICAgICBtb2RlbF9pZDogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5tb2RlbF9pZCxcbiAgICAgICAgdG9wX3A6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMudG9wX3AsXG4gICAgICAgIHRlbXBlcmF0dXJlOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLnRlbXBlcmF0dXJlLFxuICAgICAgICBtYXhfdG9rZW5zOiB0aGlzLmNoYXRDb25maWckLnZhbHVlIS5kZWZhdWx0VmFsdWVzLm1heF90b2tlbnMsXG4gICAgICAgIC4uLnRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmFkZGl0aW9uYWxTZXJ2aWNlU2V0dGluZ3NcbiAgICAgIH0sXG4gICAgICBhcHBRdWVyeToge1xuICAgICAgICBhcHA6IHRoaXMuYXBwU2VydmljZS5hcHBOYW1lLFxuICAgICAgICBxdWVyeVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgZGF0YS5pbnN0YW5jZUlkID0gdGhpcy5jaGF0SW5zdGFuY2VJZDtcbiAgICAgIGRhdGEuc2F2ZWRDaGF0SWQgPSB0aGlzLnNhdmVkQ2hhdElkO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTogQ2hhdE1lc3NhZ2UgPSB7cm9sZTogXCJhc3Npc3RhbnRcIiwgY29udGVudDogXCJcIiwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiB0cnVlfX07IC8vIGhlcmUgZGlzcGxheTogdHJ1ZSBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBzaG93IHRoZSBwcm9ncmVzc1xuXG4gICAgLy8gQ3JlYXRlIGEgU3ViamVjdCB0byBzaWduYWwgY29tcGxldGlvblxuICAgIGNvbnN0IGNvbXBsZXRpb24kID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8vIENyZWF0ZSBvYnNlcnZhYmxlcyBmb3IgZWFjaCBub24tZ2xvYmFsIGhhbmRsZXIgaW4gdGhlIG1lc3NhZ2VIYW5kbGVycyBtYXAgKGRlZmF1bHQgYW5kIGV2ZW50dWFsIGN1c3RvbSBvbmVzKSBvbmNlIGl0IGlzIHRyaWdnZXJlZCBieSB0aGUgaHViIGNvbm5lY3Rpb25cbiAgICBjb25zdCBvYnNlcnZhYmxlcyA9IEFycmF5XG4gICAgICAuZnJvbSh0aGlzLm1lc3NhZ2VIYW5kbGVycy5lbnRyaWVzKCkpXG4gICAgICAuZmlsdGVyKChbZXZlbnROYW1lLCBldmVudEhhbmRsZXJdKSA9PiAhZXZlbnRIYW5kbGVyLmlzR2xvYmFsSGFuZGxlcilcbiAgICAgIC5tYXAoKFtldmVudE5hbWUsIGV2ZW50SGFuZGxlcl0pID0+IHtcbiAgICAgICAgcmV0dXJuIGZyb21FdmVudDxhbnk+KHRoaXMuY29ubmVjdGlvbiEsIGV2ZW50TmFtZSkucGlwZShcbiAgICAgICAgICBtYXAoKGV2ZW50KSA9PiBldmVudEhhbmRsZXIuaGFuZGxlcihldmVudCkpIC8vIEV4ZWN1dGUgdGhlIGNvcnJlc3BvbmRpbmcgaGFuZGxlclxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAvLyBUaGVuIG1lcmdlIHRoZW0gaW50byBhIHNpbmdsZSBvYnNlcnZhYmxlIGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBzdHJlYW1pbmcgYmVoYXZpb3JcbiAgICBjb25zdCBjb21iaW5lZCQgPSBtZXJnZSguLi5vYnNlcnZhYmxlcykucGlwZShcbiAgICAgIHRha2VVbnRpbChjb21wbGV0aW9uJCkgLy8gQ29tcGxldGUgdGhlIG9ic2VydmFibGUgd2hlbiBjb21wbGV0aW9uJCBlbWl0c1xuICAgICk7XG5cbiAgICAvLyBJbnZva2UgdGhlIENoYXQgbWV0aG9kXG4gICAgdGhpcy5jb25uZWN0aW9uIS5pbnZva2UoJ0NoYXQnLCBkYXRhKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5ub3RpZnlBdWRpdCh0aGlzLmNoYXRIaXN0b3J5ISwgdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkKSkgLy8gV2hlbiB0aGUgc2VydmVyIGluZGljYXRlcyBpdCBoYXMgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIGludm9raW5nIHRoZSBtZXRob2QsIG5vdGlmeSB0aGUgYXVkaXQgc2VydmljZSB3aXRoIHRoZSByZWNlbnQgY2hhdCBoaXN0b3J5XG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBDaGF0OicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyAvLyBSZXR1cm4gYSByZXNvbHZlZCBwcm9taXNlIHRvIGhhbmRsZSB0aGUgZXJyb3IgYW5kIHByZXZlbnQgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uXG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0cmVhbWluZyQubmV4dChmYWxzZSk7IC8vIENvbXBsZXRlIHN0cmVhbWluZyByZWdhcmRsZXNzIG9mIHN1Y2Nlc3Mgb3IgZXJyb3JcbiAgICAgICAgdGhpcy5hY3Rpb25NYXAuY2xlYXIoKTsgLy8gQ2xlYXIgdGhlIGFjdGlvbk1hcFxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBcIlwiOyAvLyBDbGVhciB0aGUgY29udGVudFxuICAgICAgICB0aGlzLmF0dGFjaG1lbnRzID0gW107IC8vIENsZWFyIHRoZSBhdHRhY2htZW50c1xuICAgICAgICB0aGlzLmV4ZWN1dGlvblRpbWUgPSBcIlwiOyAvLyBDbGVhciB0aGUgZXhlY3V0aW9uVGltZVxuICAgICAgICBjb21wbGV0aW9uJC5uZXh0KCk7IC8vIEVtaXQgYSBzaWduYWwgdG8gY29tcGxldGUgdGhlIG9ic2VydmFibGVzXG4gICAgICAgIGNvbXBsZXRpb24kLmNvbXBsZXRlKCk7IC8vIENvbXBsZXRlIHRoZSBzdWJqZWN0XG4gICAgICB9KTtcblxuICAgIC8vIFJldHVybiB0aGUgbWVyZ2VkIG9ic2VydmFibGVzXG4gICAgcmV0dXJuIGNvbWJpbmVkJC5waXBlKFxuICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgLy8gRGVmaW5lICRwcm9ncmVzcyBmcm9tIHRoZSBhY3Rpb25NYXBcbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IEFycmF5LmZyb20odGhpcy5hY3Rpb25NYXAudmFsdWVzKCkpO1xuICAgICAgICBjb25zdCAkcHJvZ3Jlc3MgPSBhY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhY3Rpb25zLm1hcCgoYSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGEuZGlzcGxheU5hbWUgPz8gXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogYS5kaXNwbGF5VmFsdWUgPz8gXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogYS5leGVjdXRpb25UaW1lICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IGEuZXhlY3V0aW9uVGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBEZWZpbmUgdGhlIGF0dGFjaG1lbnQgdXNlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZVxuICAgICAgICBjb25zdCAkYXR0YWNobWVudCA9IHRoaXMuYXR0YWNobWVudHM7XG5cbiAgICAgICAgLy8gQXMgc29vbiBhcyB0aGUgZmlyc3QgY29udGVudCBvciAkcHJvZ3Jlc3MgaXMgZGVmaW5lZCwgdGhlIGFzc2lzdGFudCBpcyBjb25zaWRlcmVkIGFzIHN0cmVhbWluZ1xuICAgICAgICBpZighIXRoaXMuY29udGVudCB8fCAkcHJvZ3Jlc3MgfHwgJGF0dGFjaG1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3BvbnNlID0gey4uLnJlc3BvbnNlLCBjb250ZW50OiB0aGlzLmNvbnRlbnQsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7Li4ucmVzcG9uc2UuYWRkaXRpb25hbFByb3BlcnRpZXMsICRwcm9ncmVzcywgJGF0dGFjaG1lbnR9IH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdFxuICAgICAgICByZXR1cm4geyBoaXN0b3J5OiBbLi4ubWVzc2FnZXMsIHJlc3BvbnNlXSwgZXhlY3V0aW9uVGltZTogdGhpcy5leGVjdXRpb25UaW1lIH07XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBsaXN0U2F2ZWRDaGF0KCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZGVidWdcbiAgICB9O1xuXG4gICAgdGhpcy5jb25uZWN0aW9uIS5vbignU2F2ZWRDaGF0TGlzdCcsIChyZXMpID0+IHtcbiAgICAgIHRoaXMuc2F2ZWRDaGF0cyQubmV4dChyZXMuc2F2ZWRDaGF0cyk7IC8vIGVtaXRzIHRoZSByZXN1bHQgdG8gdGhlIHNhdmVkQ2hhdHMkIHN1YmplY3RcbiAgICB9KTtcblxuICAgIC8vIEludm9rZSB0aGUgbWV0aG9kIFNhdmVkQ2hhdExpc3RcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnU2F2ZWRDaGF0TGlzdCcsIGRhdGEpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbnZva2luZyBTYXZlZENoYXRMaXN0OicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRTYXZlZENoYXQoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U2F2ZWRDaGF0SGlzdG9yeSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHNhdmVkQ2hhdFN1YmplY3QgPSBuZXcgU3ViamVjdDxTYXZlZENoYXRIaXN0b3J5IHwgdW5kZWZpbmVkPigpO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGluc3RhbmNlSWQ6IHRoaXMuY2hhdEluc3RhbmNlSWQsXG4gICAgICBzYXZlZENoYXRJZDogaWQsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdTYXZlZENoYXRHZXQnLCAocmVzKSA9PiB7XG4gICAgICBzYXZlZENoYXRTdWJqZWN0Lm5leHQocmVzLnNhdmVkQ2hhdCk7XG4gICAgICBzYXZlZENoYXRTdWJqZWN0LmNvbXBsZXRlKClcbiAgICB9KTtcblxuICAgIC8vIEludm9rZSB0aGUgbWV0aG9kIFNhdmVkQ2hhdEdldFxuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdTYXZlZENoYXRHZXQnLCBkYXRhKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgU2F2ZWRDaGF0R2V0OicsIGVycm9yKTtcbiAgICAgICAgc2F2ZWRDaGF0U3ViamVjdC5jb21wbGV0ZSgpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0pXG5cbiAgICByZXR1cm4gc2F2ZWRDaGF0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHVwZGF0ZVNhdmVkQ2hhdChpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNhdmVkQ2hhdD4ge1xuICAgIGNvbnN0IHVwZGF0ZVNhdmVkQ2hhdFN1YmplY3QgPSBuZXcgU3ViamVjdDxTYXZlZENoYXQ+KCk7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaW5zdGFuY2VJZDogdGhpcy5jaGF0SW5zdGFuY2VJZCxcbiAgICAgIHNhdmVkQ2hhdElkOiBpZCxcbiAgICAgIHRpdGxlOiBuYW1lLFxuICAgICAgZGVidWc6IHRoaXMuY2hhdENvbmZpZyQudmFsdWUhLmRlZmF1bHRWYWx1ZXMuZGVidWdcbiAgICB9O1xuXG4gICAgdGhpcy5jb25uZWN0aW9uIS5vbignU2F2ZWRDaGF0VXBkYXRlJywgKHJlcykgPT4ge1xuICAgICAgdXBkYXRlU2F2ZWRDaGF0U3ViamVjdC5uZXh0KHJlcy5zYXZlZENoYXQpO1xuICAgICAgdXBkYXRlU2F2ZWRDaGF0U3ViamVjdC5jb21wbGV0ZSgpXG4gICAgfSk7XG5cbiAgICAvLyBJbnZva2UgdGhlIG1ldGhvZCBTYXZlZENoYXRVcGRhdGVcbiAgICB0aGlzLmNvbm5lY3Rpb24hLmludm9rZSgnU2F2ZWRDaGF0VXBkYXRlJywgZGF0YSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGludm9raW5nIFNhdmVkQ2hhdFVwZGF0ZTonLCBlcnJvcik7XG4gICAgICAgIHVwZGF0ZVNhdmVkQ2hhdFN1YmplY3QuY29tcGxldGUoKVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9KVxuXG4gICAgcmV0dXJuIHVwZGF0ZVNhdmVkQ2hhdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBkZWxldGVTYXZlZENoYXQoaWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgY29uc3QgZGVsZXRlU2F2ZWRDaGF0U3ViamVjdCA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmNoYXRJbnN0YW5jZUlkLFxuICAgICAgU2F2ZWRDaGF0SWRzOiBpZHMsXG4gICAgICBkZWJ1ZzogdGhpcy5jaGF0Q29uZmlnJC52YWx1ZSEuZGVmYXVsdFZhbHVlcy5kZWJ1Z1xuICAgIH07XG5cbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9uKCdTYXZlZENoYXREZWxldGUnLCAocmVzKSA9PiB7XG4gICAgICBkZWxldGVTYXZlZENoYXRTdWJqZWN0Lm5leHQocmVzLmRlbGV0ZUNvdW50KTtcbiAgICAgIGRlbGV0ZVNhdmVkQ2hhdFN1YmplY3QuY29tcGxldGUoKTtcbiAgICB9KTtcblxuICAgIC8vIEludm9rZSB0aGUgbWV0aG9kIFNhdmVkQ2hhdERlbGV0ZVxuICAgIHRoaXMuY29ubmVjdGlvbiEuaW52b2tlKCdTYXZlZENoYXREZWxldGUnLCBkYXRhKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW52b2tpbmcgU2F2ZWRDaGF0RGVsZXRlOicsIGVycm9yKTtcbiAgICAgICAgZGVsZXRlU2F2ZWRDaGF0U3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9KVxuXG4gICAgcmV0dXJuIGRlbGV0ZVNhdmVkQ2hhdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBvdXQtb2YtdGhlLWJveCBoYW5kbGVyc1xuICAgKiBJdCBpcyBhIHBsYWNlaG9sZGVyIGZvciBub24tc3RyZWFtaW5nIHNjZW5hcmlvcywgd2hlcmUgeW91IGludm9rZSBhIHNwZWNpZmljIGh1YiBtZXRob2QsIGFuZCB0aGUgc2VydmVyIHJlc3BvbmRzIHdpdGggYSBzaW5nbGUgbWVzc2FnZSBvciBhIHJlc3VsdFxuICAgKi9cbiAgaW5pdE1lc3NhZ2VIYW5kbGVycygpIHtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJEZWJ1Z1wiLFxuICAgICAgeyBoYW5kbGVyOiAoZGVidWc6IGFueSkgPT4gY29uc29sZS5sb2coZGVidWcpLFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IHRydWVcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXG4gICAgICBcIkFjdGlvblN0YXJ0XCIsXG4gICAgICB7IGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblN0YXJ0RXZlbnQpID0+IHRoaXMuYWN0aW9uTWFwLnNldChhY3Rpb24uZ3VpZCwgYWN0aW9uKSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiQWN0aW9uUmVzdWx0XCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblJlc3VsdEV2ZW50KSA9PiB0aGlzLmFjdGlvbk1hcC5zZXQoYWN0aW9uLmd1aWQsIHsgLi4udGhpcy5hY3Rpb25NYXAuZ2V0KGFjdGlvbi5ndWlkKSwgLi4uYWN0aW9uIH0pLFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJBY3Rpb25TdG9wXCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChhY3Rpb246IEFjdGlvblN0b3BFdmVudCkgPT4gdGhpcy5hY3Rpb25NYXAuc2V0KGFjdGlvbi5ndWlkLCB7IC4uLnRoaXMuYWN0aW9uTWFwLmdldChhY3Rpb24uZ3VpZCksIC4uLmFjdGlvbiB9KSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiQ29udGV4dE1lc3NhZ2VcIixcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IENvbnRleHRNZXNzYWdlRXZlbnQpID0+IHRoaXMuYXR0YWNobWVudHMucHVzaChtZXNzYWdlLm1ldGFkYXRhKSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcbiAgICAgIFwiTWVzc2FnZVwiLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogTWVzc2FnZUV2ZW50KSA9PiB0aGlzLmNvbnRlbnQgKz0gbWVzc2FnZSA/PyBcIlwiLFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJIaXN0b3J5XCIsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6IChoaXN0b3J5OiBIaXN0b3J5RXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLmNoYXRIaXN0b3J5ID0gaGlzdG9yeS5oaXN0b3J5XG4gICAgICAgICAgdGhpcy5leGVjdXRpb25UaW1lID0gaGlzdG9yeS5leGVjdXRpb25UaW1lO1xuICAgICAgICB9LFxuICAgICAgICBpc0dsb2JhbEhhbmRsZXI6IGZhbHNlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJFcnJvclwiLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoZXJyb3I6IEVycm9yRXZlbnQpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLmVycm9yKGVycm9yKTtcbiAgICAgICAgfSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiB0cnVlXG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFxuICAgICAgXCJRdW90YVwiLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUXVvdGFFdmVudCkgPT4ge1xuICAgICAgICAgIGlmKG1lc3NhZ2UucXVvdGEubWF4UXVvdGFSZWFjaGVkKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgU29ycnksIHlvdSBoYXZlIGV4Y2VlZGVkIHRoZSBhbGxvd2VkIHF1b3RhLiBQbGVhc2UgcmV0cnkgc3RhcnRpbmcgZnJvbSAke3RoaXMuZm9ybWF0RGF0ZVRpbWUobWVzc2FnZS5xdW90YS5uZXh0UmVzZXRVVEMpfS5gO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zU2VydmljZS5lcnJvcihtc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaXNHbG9iYWxIYW5kbGVyOiB0cnVlXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBhbmQgcmVnaXN0ZXIgdGhlIGVudGlyZSBtZXNzYWdlSGFuZGxlcnMgbWFwIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIG1hcCB3aXRoIHRoZSBkZWZhdWx0IG9uZVxuICAgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJzXG4gICAqL1xuICBvdmVycmlkZU1lc3NhZ2VIYW5kbGVyczxUPihtZXNzYWdlSGFuZGxlcnM6IE1hcDxzdHJpbmcsIE1lc3NhZ2VIYW5kbGVyPFQ+Pikge1xuICAgIC8vIENsZWFyIHRoZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZ2xvYmFsIGNoYXQgaGFuZGxlcnMgYmVmb3JlIG1lcmdpbmcgdGhlIG5ldyBvbmVzXG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlcnMuZm9yRWFjaCgoZXZlbnRIYW5kbGVyLCBldmVudE5hbWUpID0+IHtcbiAgICAgIGlmKGV2ZW50SGFuZGxlci5pc0dsb2JhbEhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZU1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBNZXJnZSB0aGUgbmV3IGV2ZW50IGhhbmRsZXJzIHdpdGggdGhlIGV4aXN0aW5nIG9uZXNcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IG5ldyBNYXAoWy4uLnRoaXMubWVzc2FnZUhhbmRsZXJzLCAuLi5tZXNzYWdlSGFuZGxlcnNdKTtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBnbG9iYWwgY2hhdCBoYW5kbGVycyBhbW9uZyB0aGUgbWVyZ2VkIG1hcFxuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzLmZvckVhY2goKGV2ZW50SGFuZGxlciwgZXZlbnROYW1lKSA9PiB7XG4gICAgICBpZihldmVudEhhbmRsZXIuaXNHbG9iYWxIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgZXZlbnQuXG4gICAqIElmIGEgbGlzdGVuZXIgZm9yIHRoaXMgc2FtZSBldmVudCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBvdmVycmlkZGVuLlxuICAgKiBJZiB0aGUgbGlzdGVuZXIgaGFzIFwiaXNDaGF0R2xvYmFsSGFuZGxlclwiIHNldCB0byB0cnVlLCBpdCB3aWxsIGJlIHJlZ2lzdGVyZWQgdG8gdGhlIGh1YiBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIE5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHJlY2VpdmVkXG4gICAqL1xuICBhZGRNZXNzYWdlSGFuZGxlcjxUPihldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPikge1xuICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzLnNldChldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgaWYoZXZlbnRIYW5kbGVyLmlzR2xvYmFsSGFuZGxlcikge1xuICAgICAgdGhpcy5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHluYW1pY2FsbHkgcmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBldmVudC5cbiAgICogSWYgYSBsaXN0ZW5lciBmb3IgdGhpcyBldmVudCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBvdmVycmlkZGVuLlxuICAgKiBAcGFyYW0gZXZlbnROYW1lIE5hbWUgb2YgdGhlIGV2ZW50IHRvIHJlZ2lzdGVyIGEgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgVGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIHJlY2VpdmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlcjxUPihldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPikge1xuICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIk5vIGNvbm5lY3Rpb24gZm91bmQgdG8gcmVnaXN0ZXIgdGhlIGxpc3RlbmVyXCIgKyBldmVudE5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbi5vbihldmVudE5hbWUsIChkYXRhOiBUKSA9PiB7XG4gICAgICBldmVudEhhbmRsZXIuaGFuZGxlcihkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBldmVudCBmcm9tIHRoZSBtZXNzYWdlSGFuZGxlcnMgbWFwIGFuZCB1bnN1YnNjcmliZSBmcm9tIHJlY2VpdmluZyBtZXNzYWdlcyBmb3IgdGhpcyBldmVudCBmcm9tIHRoZSBTaWduYWxSIGh1Yi5cbiAgICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZvclxuICAgKi9cbiAgcmVtb3ZlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHJlY2VpdmluZyBtZXNzYWdlcyBmb3IgYSBzcGVjaWZpYyBldmVudCBmcm9tIHRoZSBTaWduYWxSIGh1Yi5cbiAgICogQUxMIGl0cyByZWxhdGVkIGxpc3RlbmVycyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBodWIgY29ubmVjdGlvblxuICAgKiBUaGlzIGlzIG5lZWRlZCB0byBwcmV2ZW50IGFjY3VtdWxhdGluZyBvbGQgbGlzdGVuZXJzIHdoZW4gb3ZlcnJpZGluZyB0aGUgZW50aXJlIG1lc3NhZ2VIYW5kbGVycyBtYXBcbiAgICogQHBhcmFtIGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIHVuc3Vic2NyaWJlTWVzc2FnZUhhbmRsZXIoZXZlbnROYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb24hLm9mZihldmVudE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29ubmVjdGlvbiB0byB0aGUgc2lnbmFsUiB3ZWJzb2NrZXQgYW5kIHJlZ2lzdGVyIGRlZmF1bHQgbGlzdGVuZXJzIHRvIHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIHNlcnZlciBodWIgY2xhc3NcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25uZWN0aW9uLiBJdCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICAgKiBAcGFyYW0gbG9nTGV2ZWwgRGVmaW5lIHRoZSBsb2cgbGV2ZWwgZGlzcGxheWVkIGluIHRoZSBjb25zb2xlXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGJ1aWx0XG4gICAqL1xuICBidWlsZENvbm5lY3Rpb24ob3B0aW9ucz86IENvbm5lY3Rpb25PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5SRVFVRVNUX1VSTCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJObyBlbmRwb2ludCBwcm92aWRlZCB0byBjb25uZWN0IHRoZSB3ZWJzb2NrZXQgdG9cIikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvZ0xldmVsID0gdGhpcy5nZXRMb2dMZXZlbCgpO1xuICAgICAgdGhpcy5jb25uZWN0aW9uID0gdGhpcy5zaWduYWxSU2VydmljZS5idWlsZENvbm5lY3Rpb24odGhpcy5SRVFVRVNUX1VSTCwgey4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnN9LCBsb2dMZXZlbCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIGNvbm5lY3Rpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgc3RhcnRlZFxuICAgKi9cbiAgc3RhcnRDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbFJTZXJ2aWNlLnN0YXJ0Q29ubmVjdGlvbih0aGlzLmNvbm5lY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIGNvbm5lY3Rpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgc3RvcHBlZFxuICAgKi9cbiAgc3RvcENvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUlNlcnZpY2Uuc3RvcENvbm5lY3Rpb24odGhpcy5jb25uZWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJhbnNwb3J0cygpOiBIdHRwVHJhbnNwb3J0VHlwZSB7XG4gICAgc3dpdGNoICh0aGlzLmNoYXRDb25maWckLnZhbHVlPy5jb25uZWN0aW9uU2V0dGluZ3Muc2lnbmFsUlRyYW5zcG9ydCkge1xuICAgICAgY2FzZSBcIldlYlNvY2tldHNcIjpcbiAgICAgICAgcmV0dXJuIEh0dHBUcmFuc3BvcnRUeXBlLldlYlNvY2tldHM7XG4gICAgICBjYXNlIFwiU2VydmVyU2VudEV2ZW50c1wiOlxuICAgICAgICByZXR1cm4gSHR0cFRyYW5zcG9ydFR5cGUuU2VydmVyU2VudEV2ZW50cztcbiAgICAgIGNhc2UgXCJMb25nUG9sbGluZ1wiOlxuICAgICAgICByZXR1cm4gSHR0cFRyYW5zcG9ydFR5cGUuTG9uZ1BvbGxpbmc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gSHR0cFRyYW5zcG9ydFR5cGUuTm9uZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldExvZ0xldmVsKCk6IExvZ0xldmVsIHtcbiAgICBzd2l0Y2ggKHRoaXMuY2hhdENvbmZpZyQudmFsdWU/LmNvbm5lY3Rpb25TZXR0aW5ncy5zaWduYWxSTG9nTGV2ZWwpIHtcbiAgICAgIGNhc2UgXCJDcml0aWNhbFwiOlxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuQ3JpdGljYWw7IC8vIExvZyBsZXZlbCBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcyB0aGF0IGluZGljYXRlIGEgZmFpbHVyZSB0aGF0IHdpbGwgdGVybWluYXRlIHRoZSBlbnRpcmUgYXBwbGljYXRpb24uXG4gICAgICBjYXNlIFwiRGVidWdcIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLkRlYnVnOyAvLyBMb2cgbGV2ZWwgZm9yIGxvdyBzZXZlcml0eSBkaWFnbm9zdGljIG1lc3NhZ2VzLlxuICAgICAgY2FzZSBcIkVycm9yXCI6XG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5FcnJvcjsgLy8gTG9nIGxldmVsIGZvciBkaWFnbm9zdGljIG1lc3NhZ2VzIHRoYXQgaW5kaWNhdGUgYSBmYWlsdXJlIGluIHRoZSBjdXJyZW50IG9wZXJhdGlvbi5cbiAgICAgIGNhc2UgXCJJbmZvcm1hdGlvblwiOlxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuSW5mb3JtYXRpb247IC8vIExvZyBsZXZlbCBmb3IgaW5mb3JtYXRpb25hbCBkaWFnbm9zdGljIG1lc3NhZ2VzLlxuICAgICAgY2FzZSBcIk5vbmVcIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLk5vbmU7IC8vIFRoZSBoaWdoZXN0IHBvc3NpYmxlIGxvZyBsZXZlbC4gVXNlZCB3aGVuIGNvbmZpZ3VyaW5nIGxvZ2dpbmcgdG8gaW5kaWNhdGUgdGhhdCBubyBsb2cgbWVzc2FnZXMgc2hvdWxkIGJlIGVtaXR0ZWQuXG4gICAgICBjYXNlIFwiVHJhY2VcIjpcbiAgICAgICAgcmV0dXJuIExvZ0xldmVsLlRyYWNlOyAvLyBMb2cgbGV2ZWwgZm9yIHZlcnkgbG93IHNldmVyaXR5IGRpYWdub3N0aWMgbWVzc2FnZXMuXG4gICAgICBjYXNlIFwiV2FybmluZ1wiOlxuICAgICAgICByZXR1cm4gTG9nTGV2ZWwuV2FybmluZzsgLy8gTG9nIGxldmVsIGZvciBkaWFnbm9zdGljIG1lc3NhZ2VzIHRoYXQgaW5kaWNhdGUgYSBub24tZmF0YWwgcHJvYmxlbS5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBMb2dMZXZlbC5Ob25lOyAvLyBUaGUgaGlnaGVzdCBwb3NzaWJsZSBsb2cgbGV2ZWwuIFVzZWQgd2hlbiBjb25maWd1cmluZyBsb2dnaW5nIHRvIGluZGljYXRlIHRoYXQgbm8gbG9nIG1lc3NhZ2VzIHNob3VsZCBiZSBlbWl0dGVkLlxuICAgIH1cbiAgfVxuXG4gIGdldCBkZWZhdWx0T3B0aW9ucygpOiBDb25uZWN0aW9uT3B0aW9ucyB7XG4gICAgbGV0IGhlYWRlcnM6IE1lc3NhZ2VIZWFkZXJzID0ge1xuICAgICAgXCJzaW5lcXVhLWZvcmNlLWNhbWVsLWNhc2VcIjogXCJ0cnVlXCIsXG4gICAgICBcIngtbGFuZ3VhZ2VcIjogdGhpcy5pbnRsU2VydmljZS5jdXJyZW50TG9jYWxlLm5hbWUsXG4gICAgICBcInVpLWxhbmd1YWdlXCI6IHRoaXMuaW50bFNlcnZpY2UuY3VycmVudExvY2FsZS5uYW1lLFxuICAgIH07XG4gICAgaWYgKHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLnByb2Nlc3NlZENyZWRlbnRpYWxzKSB7XG4gICAgICBoZWFkZXJzID0gey4uLmhlYWRlcnMsIFwic2luZXF1YS1jc3JmLXRva2VuXCI6IHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLnByb2Nlc3NlZENyZWRlbnRpYWxzLmRhdGEuY3NyZlRva2VufTtcbiAgICB9O1xuICAgIC8vIEZvciB0aGUgZmlyc3QgR0VUIHJlcXVlc3Qgc2VudCBieSBzaWduYWxSIHRvIHN0YXJ0IGEgV2ViU29ja2V0IHByb3RvY29sLFxuICAgIC8vIGFzIGZhciBhcyB3ZSBrbm93LCBzaWduYWxSIG9ubHkgbGV0cyB1cyB0d2VhayB0aGUgcmVxdWVzdCB3aXRoIHRoaXMgYWNjZXNzIHRva2VuIGZhY3RvcnlcbiAgICAvLyBzbyB3ZSBwYXNzIGFsb25nIHRoZSBTaW5lcXVhIENTUkYgdG9rZW4gdG8gcGFzcyB0aGUgQ1NSRiBjaGVjay4uXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zcG9ydDogdGhpcy5nZXRUcmFuc3BvcnRzKCksXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYWNjZXNzVG9rZW5GYWN0b3J5OiAoKSA9PiB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZS5wcm9jZXNzZWRDcmVkZW50aWFscz8uZGF0YT8uY3NyZlRva2VuIHx8IFwiXCJcbiAgICB9XG4gIH1cbn1cbiJdfQ==