@microsoft/ocsdk 0.4.6-main.18f297e → 0.4.6-main.eb6779f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/SDK.js CHANGED
@@ -63,6 +63,8 @@ var _uuid = require("./Utils/uuid");
63
63
 
64
64
  var _waitTimeBetweenRetriesConfigs = require("./Utils/waitTimeBetweenRetriesConfigs");
65
65
 
66
+ var _httpHeadersUtils = require("./Utils/httpHeadersUtils");
67
+
66
68
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
67
69
 
68
70
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -89,6 +91,7 @@ var SDK = /*#__PURE__*/function () {
89
91
  this.logger = logger;
90
92
  (0, _defineProperty2["default"])(this, "liveChatVersion", void 0);
91
93
  (0, _defineProperty2["default"])(this, "sessionId", void 0);
94
+ (0, _defineProperty2["default"])(this, "ocUserAgent", void 0);
92
95
  (0, _defineProperty2["default"])(this, "setAuthCodeNonce", function (headers) {
93
96
  if (headers !== null && headers !== void 0 && headers.authcodenonce) {
94
97
  _this.configuration.authCodeNonce = headers === null || headers === void 0 ? void 0 : headers.authcodenonce;
@@ -152,6 +155,7 @@ var SDK = /*#__PURE__*/function () {
152
155
  _iterator.f();
153
156
  }
154
157
 
158
+ this.ocUserAgent = this.configuration.ocUserAgent;
155
159
  this.liveChatVersion = _Enums.LiveChatVersion.V2;
156
160
  }
157
161
  /**
@@ -163,7 +167,7 @@ var SDK = /*#__PURE__*/function () {
163
167
  key: "getLcwFcsDetails",
164
168
  value: function () {
165
169
  var _getLcwFcsDetails = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
166
- var timer, requestPath, method, url, axiosInstance, _this$configuration$d, response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds;
170
+ var timer, requestPath, method, url, axiosInstance, requestHeaders, _this$configuration$d, response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds;
167
171
 
168
172
  return _regenerator["default"].wrap(function _callee$(_context) {
169
173
  while (1) {
@@ -179,32 +183,35 @@ var SDK = /*#__PURE__*/function () {
179
183
  retries: this.configuration.maxRequestRetriesOnFailure,
180
184
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getChatConfig
181
185
  });
182
- _context.prev = 7;
183
- _context.next = 10;
186
+ requestHeaders = {};
187
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
188
+ _context.prev = 9;
189
+ _context.next = 12;
184
190
  return axiosInstance.get(url, {
191
+ headers: requestHeaders,
185
192
  timeout: (_this$configuration$d = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d !== void 0 ? _this$configuration$d : this.configuration.requestTimeoutConfig.getChatConfig
186
193
  });
187
194
 
188
- case 10:
195
+ case 12:
189
196
  response = _context.sent;
190
197
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
191
198
  data = response.data;
192
- this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLCWFCSDETAILSSUCCEEDED, "Get LCW FCS details succeeded", "", response, elapsedTimeInMilliseconds, requestPath, method);
199
+ this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLCWFCSDETAILSSUCCEEDED, "Get LCW FCS details succeeded", "", response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
193
200
  return _context.abrupt("return", data);
194
201
 
195
- case 17:
196
- _context.prev = 17;
197
- _context.t0 = _context["catch"](7);
202
+ case 19:
203
+ _context.prev = 19;
204
+ _context.t0 = _context["catch"](9);
198
205
  _elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
199
- this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLCWFCSDETAILSFAILED, "Get LCW FCS details failed", "", undefined, _elapsedTimeInMilliseconds, requestPath, method, _context.t0);
206
+ this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLCWFCSDETAILSFAILED, "Get LCW FCS details failed", "", undefined, _elapsedTimeInMilliseconds, requestPath, method, _context.t0, undefined, requestHeaders);
200
207
  throw _context.t0;
201
208
 
202
- case 22:
209
+ case 24:
203
210
  case "end":
204
211
  return _context.stop();
205
212
  }
206
213
  }
207
- }, _callee, this, [[7, 17]]);
214
+ }, _callee, this, [[9, 19]]);
208
215
  }));
209
216
 
210
217
  function getLcwFcsDetails() {
@@ -228,7 +235,7 @@ var SDK = /*#__PURE__*/function () {
228
235
  method,
229
236
  url,
230
237
  axiosInstance,
231
- headers,
238
+ requestHeaders,
232
239
  _this$configuration$d2,
233
240
  response,
234
241
  elapsedTimeInMilliseconds,
@@ -256,20 +263,21 @@ var SDK = /*#__PURE__*/function () {
256
263
  retries: this.configuration.maxRequestRetriesOnFailure,
257
264
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getChatConfig
258
265
  });
259
- headers = {};
266
+ requestHeaders = {};
267
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
260
268
 
261
269
  if (bypassCache) {
262
- headers = _objectSpread(_objectSpread({}, _Constants["default"].bypassCacheHeaders), headers);
270
+ requestHeaders = _objectSpread(_objectSpread({}, _Constants["default"].bypassCacheHeaders), requestHeaders);
263
271
  }
264
272
 
265
- _context2.prev = 11;
266
- _context2.next = 14;
273
+ _context2.prev = 12;
274
+ _context2.next = 15;
267
275
  return axiosInstance.get(url, {
268
- headers: headers,
276
+ headers: requestHeaders,
269
277
  timeout: (_this$configuration$d2 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d2 !== void 0 ? _this$configuration$d2 : this.configuration.requestTimeoutConfig.getChatConfig
270
278
  });
271
279
 
272
- case 14:
280
+ case 15:
273
281
  response = _context2.sent;
274
282
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
275
283
  data = response.data;
@@ -284,22 +292,22 @@ var SDK = /*#__PURE__*/function () {
284
292
  data.headers["date"] = response.headers["date"];
285
293
  }
286
294
 
287
- this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGSUCCEEDED, "Get Chat config succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
295
+ this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGSUCCEEDED, "Get Chat config succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
288
296
  return _context2.abrupt("return", data);
289
297
 
290
- case 24:
291
- _context2.prev = 24;
292
- _context2.t0 = _context2["catch"](11);
298
+ case 25:
299
+ _context2.prev = 25;
300
+ _context2.t0 = _context2["catch"](12);
293
301
  _elapsedTimeInMilliseconds2 = timer.milliSecondsElapsed;
294
- this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGFAILED, "Get Chat config failed", requestId, undefined, _elapsedTimeInMilliseconds2, requestPath, method, _context2.t0);
302
+ this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGFAILED, "Get Chat config failed", requestId, undefined, _elapsedTimeInMilliseconds2, requestPath, method, _context2.t0, undefined, requestHeaders);
295
303
  return _context2.abrupt("return", Promise.reject(_context2.t0));
296
304
 
297
- case 29:
305
+ case 30:
298
306
  case "end":
299
307
  return _context2.stop();
300
308
  }
301
309
  }
302
- }, _callee2, this, [[11, 24]]);
310
+ }, _callee2, this, [[12, 25]]);
303
311
  }));
304
312
 
305
313
  function getChatConfig(_x) {
@@ -327,7 +335,7 @@ var SDK = /*#__PURE__*/function () {
327
335
  axiosInstance,
328
336
  authenticatedUserToken,
329
337
  reconnectId,
330
- headers,
338
+ requestHeaders,
331
339
  params,
332
340
  url,
333
341
  method,
@@ -355,15 +363,16 @@ var SDK = /*#__PURE__*/function () {
355
363
  }); // Extract auth token and reconnect id from optional param
356
364
 
357
365
  authenticatedUserToken = getLWIDetailsOptionalParams.authenticatedUserToken, reconnectId = getLWIDetailsOptionalParams.reconnectId;
358
- headers = _Constants["default"].defaultHeaders; // updated auth endpoint for authenticated chats and add auth token in header
366
+ requestHeaders = _Constants["default"].defaultHeaders; // updated auth endpoint for authenticated chats and add auth token in header
359
367
 
360
368
  if (authenticatedUserToken) {
361
369
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthLiveWorkItemDetailsPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
362
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
363
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
370
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
371
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
364
372
  }
365
373
 
366
- this.setSessionIdHeader(this.sessionId, headers);
374
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
375
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
367
376
 
368
377
  if (!this.configuration.useUnauthReconnectIdSigQueryParam) {
369
378
  // Append reconnect id on the endpoint if vailable
@@ -385,7 +394,7 @@ var SDK = /*#__PURE__*/function () {
385
394
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
386
395
  method = "GET";
387
396
  options = {
388
- headers: headers,
397
+ headers: requestHeaders,
389
398
  method: method,
390
399
  url: url,
391
400
  params: params,
@@ -393,7 +402,7 @@ var SDK = /*#__PURE__*/function () {
393
402
  };
394
403
  return _context4.abrupt("return", new Promise( /*#__PURE__*/function () {
395
404
  var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(resolve, reject) {
396
- var response, elapsedTimeInMilliseconds, data, _headers, _elapsedTimeInMilliseconds3;
405
+ var response, elapsedTimeInMilliseconds, data, headers, _elapsedTimeInMilliseconds3;
397
406
 
398
407
  return _regenerator["default"].wrap(function _callee3$(_context3) {
399
408
  while (1) {
@@ -406,11 +415,11 @@ var SDK = /*#__PURE__*/function () {
406
415
  case 3:
407
416
  response = _context3.sent;
408
417
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
409
- data = response.data, _headers = response.headers;
418
+ data = response.data, headers = response.headers;
410
419
 
411
- _this2.setAuthCodeNonce(_headers);
420
+ _this2.setAuthCodeNonce(headers);
412
421
 
413
- _this2.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLWISTATUSSUCCEEDED, "Get LWI Details succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
422
+ _this2.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLWISTATUSSUCCEEDED, "Get LWI Details succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
414
423
 
415
424
  resolve(data);
416
425
  _context3.next = 17;
@@ -421,7 +430,7 @@ var SDK = /*#__PURE__*/function () {
421
430
  _context3.t0 = _context3["catch"](0);
422
431
  _elapsedTimeInMilliseconds3 = timer.milliSecondsElapsed;
423
432
 
424
- _this2.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETLWISTATUSFAILED, "Get LWI Details failed", requestId, undefined, _elapsedTimeInMilliseconds3, requestPath, method, _context3.t0);
433
+ _this2.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETLWISTATUSFAILED, "Get LWI Details failed", requestId, undefined, _elapsedTimeInMilliseconds3, requestPath, method, _context3.t0, undefined, requestHeaders);
425
434
 
426
435
  if ((0, _isExpectedAxiosError["default"])(_context3.t0, _Constants["default"].axiosTimeoutErrorCode)) {
427
436
  (0, _throwClientHTTPError["default"])();
@@ -442,7 +451,7 @@ var SDK = /*#__PURE__*/function () {
442
451
  };
443
452
  }()));
444
453
 
445
- case 18:
454
+ case 19:
446
455
  case "end":
447
456
  return _context4.stop();
448
457
  }
@@ -476,7 +485,7 @@ var SDK = /*#__PURE__*/function () {
476
485
  authenticatedUserToken,
477
486
  currentLiveChatVersion,
478
487
  refreshToken,
479
- headers,
488
+ requestHeaders,
480
489
  endpoint,
481
490
  requestPath,
482
491
  params,
@@ -508,12 +517,13 @@ var SDK = /*#__PURE__*/function () {
508
517
  requestId = (0, _uuid.uuidv4)();
509
518
  }
510
519
 
511
- headers = _Constants["default"].defaultHeaders;
520
+ requestHeaders = _Constants["default"].defaultHeaders;
521
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
512
522
  endpoint = (0, _endpointsCreators.createGetChatTokenEndpoint)(currentLiveChatVersion || this.liveChatVersion, authenticatedUserToken ? true : false);
513
523
 
514
524
  if (authenticatedUserToken) {
515
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
516
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
525
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
526
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
517
527
  }
518
528
 
519
529
  requestPath = "/".concat(endpoint, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
@@ -541,7 +551,7 @@ var SDK = /*#__PURE__*/function () {
541
551
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
542
552
  method = "GET";
543
553
  options = {
544
- headers: headers,
554
+ headers: requestHeaders,
545
555
  method: method,
546
556
  url: url,
547
557
  params: params,
@@ -556,7 +566,7 @@ var SDK = /*#__PURE__*/function () {
556
566
  });
557
567
  return _context6.abrupt("return", new Promise( /*#__PURE__*/function () {
558
568
  var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(resolve, reject) {
559
- var getChatTokenError, response, elapsedTimeInMilliseconds, data, _headers2, _response, _elapsedTimeInMilliseconds4;
569
+ var getChatTokenError, response, elapsedTimeInMilliseconds, data, headers, _response, _elapsedTimeInMilliseconds4;
560
570
 
561
571
  return _regenerator["default"].wrap(function _callee5$(_context5) {
562
572
  while (1) {
@@ -571,13 +581,13 @@ var SDK = /*#__PURE__*/function () {
571
581
  case 4:
572
582
  response = _context5.sent;
573
583
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
574
- data = response.data, _headers2 = response.headers;
584
+ data = response.data, headers = response.headers;
575
585
 
576
- _this3.setAuthCodeNonce(_headers2);
586
+ _this3.setAuthCodeNonce(headers);
577
587
 
578
- if (_headers2) {
579
- if (_headers2[_OmnichannelHTTPHeaders["default"].ocSessionId.toLowerCase()]) {
580
- _this3.sessionId = _headers2[_OmnichannelHTTPHeaders["default"].ocSessionId.toLowerCase()];
588
+ if (headers) {
589
+ if (headers[_OmnichannelHTTPHeaders["default"].ocSessionId.toLowerCase()]) {
590
+ _this3.sessionId = headers[_OmnichannelHTTPHeaders["default"].ocSessionId.toLowerCase()];
581
591
  }
582
592
  } // Resolves only if it contains chat token response which only happens on status 200
583
593
 
@@ -589,7 +599,7 @@ var SDK = /*#__PURE__*/function () {
589
599
 
590
600
  data.requestId = requestId;
591
601
 
592
- _this3.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTOKENSUCCEEDED, "Get Chat Token succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
602
+ _this3.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTOKENSUCCEEDED, "Get Chat Token succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
593
603
 
594
604
  resolve(data);
595
605
  return _context5.abrupt("return");
@@ -612,7 +622,7 @@ var SDK = /*#__PURE__*/function () {
612
622
  _context5.t0 = _context5["catch"](1);
613
623
  _elapsedTimeInMilliseconds4 = timer.milliSecondsElapsed;
614
624
 
615
- _this3.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, "Get Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds4, requestPath, method, _context5.t0);
625
+ _this3.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, "Get Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds4, requestPath, method, _context5.t0, undefined, requestHeaders);
616
626
 
617
627
  getChatTokenError = _context5.t0; // Stop retry on 429
618
628
 
@@ -662,7 +672,7 @@ var SDK = /*#__PURE__*/function () {
662
672
  };
663
673
  }()));
664
674
 
665
- case 22:
675
+ case 23:
666
676
  case "end":
667
677
  return _context6.stop();
668
678
  }
@@ -688,7 +698,7 @@ var SDK = /*#__PURE__*/function () {
688
698
  var _this$configuration$d5,
689
699
  _this4 = this;
690
700
 
691
- var timer, authenticatedUserToken, requestPath, headers, url, method, options, axiosInstance, requestId;
701
+ var timer, authenticatedUserToken, requestPath, requestHeaders, url, method, options, axiosInstance, requestId;
692
702
  return _regenerator["default"].wrap(function _callee8$(_context8) {
693
703
  while (1) {
694
704
  switch (_context8.prev = _context8.next) {
@@ -697,14 +707,15 @@ var SDK = /*#__PURE__*/function () {
697
707
  authenticatedUserToken = reconnectableChatsParams.authenticatedUserToken;
698
708
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable chat Started");
699
709
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetReconnectableChatsPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(this.omnichannelConfiguration.orgId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
700
- headers = _Constants["default"].defaultHeaders;
701
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
702
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
703
- this.setSessionIdHeader(this.sessionId, headers);
710
+ requestHeaders = _Constants["default"].defaultHeaders;
711
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
712
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
713
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
714
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
704
715
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
705
716
  method = "GET";
706
717
  options = {
707
- headers: headers,
718
+ headers: requestHeaders,
708
719
  method: method,
709
720
  url: url,
710
721
  timeout: (_this$configuration$d5 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d5 !== void 0 ? _this$configuration$d5 : this.configuration.requestTimeoutConfig.getReconnectableChats
@@ -713,7 +724,7 @@ var SDK = /*#__PURE__*/function () {
713
724
  requestId = this.omnichannelConfiguration.orgId;
714
725
  return _context8.abrupt("return", new Promise( /*#__PURE__*/function () {
715
726
  var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(resolve, reject) {
716
- var response, elapsedTimeInMilliseconds, data, _headers3, _elapsedTimeInMilliseconds5;
727
+ var response, elapsedTimeInMilliseconds, data, headers, _elapsedTimeInMilliseconds5;
717
728
 
718
729
  return _regenerator["default"].wrap(function _callee7$(_context7) {
719
730
  while (1) {
@@ -726,9 +737,9 @@ var SDK = /*#__PURE__*/function () {
726
737
  case 3:
727
738
  response = _context7.sent;
728
739
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
729
- data = response.data, _headers3 = response.headers;
740
+ data = response.data, headers = response.headers;
730
741
 
731
- _this4.setAuthCodeNonce(_headers3); // Resolves only if it contains reconnectable chats response which only happens on status 200
742
+ _this4.setAuthCodeNonce(headers); // Resolves only if it contains reconnectable chats response which only happens on status 200
732
743
 
733
744
 
734
745
  if (!data) {
@@ -736,7 +747,7 @@ var SDK = /*#__PURE__*/function () {
736
747
  break;
737
748
  }
738
749
 
739
- _this4.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats Succeeded and old session returned", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
750
+ _this4.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats Succeeded and old session returned", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
740
751
 
741
752
  resolve(data);
742
753
  return _context7.abrupt("return");
@@ -751,7 +762,7 @@ var SDK = /*#__PURE__*/function () {
751
762
  _context7.t0 = _context7["catch"](0);
752
763
  _elapsedTimeInMilliseconds5 = timer.milliSecondsElapsed;
753
764
 
754
- _this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats failed", requestId, undefined, _elapsedTimeInMilliseconds5, requestPath, method, _context7.t0);
765
+ _this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats failed", requestId, undefined, _elapsedTimeInMilliseconds5, requestPath, method, _context7.t0, undefined, requestHeaders);
755
766
 
756
767
  if ((0, _isExpectedAxiosError["default"])(_context7.t0, _Constants["default"].axiosTimeoutErrorCode)) {
757
768
  (0, _throwClientHTTPError["default"])();
@@ -773,7 +784,7 @@ var SDK = /*#__PURE__*/function () {
773
784
  };
774
785
  }()));
775
786
 
776
- case 14:
787
+ case 15:
777
788
  case "end":
778
789
  return _context8.stop();
779
790
  }
@@ -799,7 +810,7 @@ var SDK = /*#__PURE__*/function () {
799
810
  var _this$configuration$d6,
800
811
  _this5 = this;
801
812
 
802
- var timer, requestPath, headers, url, method, options, axiosInstance;
813
+ var timer, requestPath, requestHeaders, url, method, options, axiosInstance;
803
814
  return _regenerator["default"].wrap(function _callee10$(_context10) {
804
815
  while (1) {
805
816
  switch (_context10.prev = _context10.next) {
@@ -807,12 +818,13 @@ var SDK = /*#__PURE__*/function () {
807
818
  timer = _Timer.Timer.TIMER();
808
819
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnectable availability Started");
809
820
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatReconnectAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(reconnectId);
810
- headers = _Constants["default"].defaultHeaders;
811
- this.setSessionIdHeader(this.sessionId, headers);
821
+ requestHeaders = _Constants["default"].defaultHeaders;
822
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
823
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
812
824
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
813
825
  method = "GET";
814
826
  options = {
815
- headers: headers,
827
+ headers: requestHeaders,
816
828
  method: method,
817
829
  url: url,
818
830
  timeout: (_this$configuration$d6 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d6 !== void 0 ? _this$configuration$d6 : this.configuration.requestTimeoutConfig.getReconnectAvailability
@@ -840,14 +852,14 @@ var SDK = /*#__PURE__*/function () {
840
852
  break;
841
853
  }
842
854
 
843
- _this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability succeeded", undefined, response, elapsedTimeInMilliseconds, requestPath, method);
855
+ _this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability succeeded", undefined, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
844
856
 
845
857
  resolve(data);
846
858
  return _context9.abrupt("return");
847
859
 
848
860
  case 10:
849
861
  // No data found so returning null
850
- _this5.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability didn't send any valid data", undefined, response, elapsedTimeInMilliseconds, requestPath, method);
862
+ _this5.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability didn't send any valid data", undefined, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
851
863
 
852
864
  resolve();
853
865
  return _context9.abrupt("return");
@@ -857,7 +869,7 @@ var SDK = /*#__PURE__*/function () {
857
869
  _context9.t0 = _context9["catch"](0);
858
870
  _elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
859
871
 
860
- _this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect Availability failed", undefined, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _context9.t0);
872
+ _this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect Availability failed", undefined, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _context9.t0, undefined, requestHeaders);
861
873
 
862
874
  if ((0, _isExpectedAxiosError["default"])(_context9.t0, _Constants["default"].axiosTimeoutErrorCode)) {
863
875
  (0, _throwClientHTTPError["default"])();
@@ -879,7 +891,7 @@ var SDK = /*#__PURE__*/function () {
879
891
  };
880
892
  }()));
881
893
 
882
- case 10:
894
+ case 11:
883
895
  case "end":
884
896
  return _context10.stop();
885
897
  }
@@ -913,7 +925,7 @@ var SDK = /*#__PURE__*/function () {
913
925
  authenticatedUserToken,
914
926
  initContext,
915
927
  getContext,
916
- headers,
928
+ requestHeaders,
917
929
  data,
918
930
  cachObj,
919
931
  tempArr,
@@ -936,14 +948,15 @@ var SDK = /*#__PURE__*/function () {
936
948
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getAgentAvailability
937
949
  });
938
950
  authenticatedUserToken = queueAvailabilityOptionalParams.authenticatedUserToken, initContext = queueAvailabilityOptionalParams.initContext, getContext = queueAvailabilityOptionalParams.getContext;
939
- headers = _Constants["default"].defaultHeaders;
951
+ requestHeaders = _Constants["default"].defaultHeaders;
940
952
 
941
953
  if (authenticatedUserToken) {
942
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
943
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
954
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
955
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
944
956
  }
945
957
 
946
- this.setSessionIdHeader(this.sessionId, headers);
958
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
959
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
947
960
  data = initContext || {};
948
961
  cachObj = {
949
962
  "orgId": this.omnichannelConfiguration.orgId,
@@ -966,13 +979,13 @@ var SDK = /*#__PURE__*/function () {
966
979
  data.cacheKey = hash.createHash('sha256').update(JSON.stringify(cachObj)).digest('hex').toString();
967
980
 
968
981
  if (!(getContext && !window.document)) {
969
- _context12.next = 17;
982
+ _context12.next = 18;
970
983
  break;
971
984
  }
972
985
 
973
986
  return _context12.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
974
987
 
975
- case 17:
988
+ case 18:
976
989
  if (getContext) {
977
990
  data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
978
991
  data.device = _DeviceInfo.DeviceInfo.getDeviceType();
@@ -986,25 +999,25 @@ var SDK = /*#__PURE__*/function () {
986
999
 
987
1000
 
988
1001
  if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
989
- _context12.next = 21;
1002
+ _context12.next = 22;
990
1003
  break;
991
1004
  }
992
1005
 
993
1006
  return _context12.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
994
1007
 
995
- case 21:
1008
+ case 22:
996
1009
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
997
1010
  method = "POST";
998
1011
  options = {
999
1012
  data: data,
1000
- headers: headers,
1013
+ headers: requestHeaders,
1001
1014
  method: method,
1002
1015
  url: url,
1003
1016
  timeout: (_this$configuration$d7 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d7 !== void 0 ? _this$configuration$d7 : this.configuration.requestTimeoutConfig.getAgentAvailability
1004
1017
  };
1005
1018
  return _context12.abrupt("return", new Promise( /*#__PURE__*/function () {
1006
1019
  var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(resolve, reject) {
1007
- var response, elapsedTimeInMilliseconds, _data, _headers4, _elapsedTimeInMilliseconds7;
1020
+ var response, elapsedTimeInMilliseconds, _data, headers, _elapsedTimeInMilliseconds7;
1008
1021
 
1009
1022
  return _regenerator["default"].wrap(function _callee11$(_context11) {
1010
1023
  while (1) {
@@ -1017,12 +1030,12 @@ var SDK = /*#__PURE__*/function () {
1017
1030
  case 3:
1018
1031
  response = _context11.sent;
1019
1032
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1020
- _data = response.data, _headers4 = response.headers;
1033
+ _data = response.data, headers = response.headers;
1021
1034
 
1022
- _this6.setAuthCodeNonce(_headers4);
1035
+ _this6.setAuthCodeNonce(headers);
1023
1036
 
1024
1037
  if (_data) {
1025
- _this6.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSUCCEEDED, "Get agent availability succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1038
+ _this6.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSUCCEEDED, "Get agent availability succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
1026
1039
 
1027
1040
  resolve(_data);
1028
1041
  }
@@ -1035,7 +1048,7 @@ var SDK = /*#__PURE__*/function () {
1035
1048
  _context11.t0 = _context11["catch"](0);
1036
1049
  _elapsedTimeInMilliseconds7 = timer.milliSecondsElapsed;
1037
1050
 
1038
- _this6.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, "Get agent availability failed", requestId, undefined, _elapsedTimeInMilliseconds7, requestPath, method, _context11.t0);
1051
+ _this6.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, "Get agent availability failed", requestId, undefined, _elapsedTimeInMilliseconds7, requestPath, method, _context11.t0, undefined, requestHeaders);
1039
1052
 
1040
1053
  if ((0, _isExpectedAxiosError["default"])(_context11.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1041
1054
  (0, _throwClientHTTPError["default"])();
@@ -1056,7 +1069,7 @@ var SDK = /*#__PURE__*/function () {
1056
1069
  };
1057
1070
  }()));
1058
1071
 
1059
- case 25:
1072
+ case 26:
1060
1073
  case "end":
1061
1074
  return _context12.stop();
1062
1075
  }
@@ -1090,7 +1103,7 @@ var SDK = /*#__PURE__*/function () {
1090
1103
  authenticatedUserToken,
1091
1104
  initContext,
1092
1105
  getContext,
1093
- headers,
1106
+ requestHeaders,
1094
1107
  requestPath,
1095
1108
  params,
1096
1109
  data,
@@ -1113,16 +1126,17 @@ var SDK = /*#__PURE__*/function () {
1113
1126
  headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce]
1114
1127
  });
1115
1128
  reconnectId = sessionInitOptionalParams.reconnectId, authenticatedUserToken = sessionInitOptionalParams.authenticatedUserToken, initContext = sessionInitOptionalParams.initContext, getContext = sessionInitOptionalParams.getContext;
1116
- headers = _Constants["default"].defaultHeaders;
1129
+ requestHeaders = _Constants["default"].defaultHeaders;
1117
1130
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
1118
1131
 
1119
1132
  if (authenticatedUserToken) {
1120
1133
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
1121
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1122
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1134
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1135
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1123
1136
  }
1124
1137
 
1125
- this.setSessionIdHeader(this.sessionId, headers);
1138
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
1139
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
1126
1140
 
1127
1141
  if (!this.configuration.useUnauthReconnectIdSigQueryParam) {
1128
1142
  if (reconnectId) {
@@ -1143,13 +1157,13 @@ var SDK = /*#__PURE__*/function () {
1143
1157
  data = initContext || {};
1144
1158
 
1145
1159
  if (!(getContext && !window.document)) {
1146
- _context14.next = 16;
1160
+ _context14.next = 17;
1147
1161
  break;
1148
1162
  }
1149
1163
 
1150
1164
  return _context14.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
1151
1165
 
1152
- case 16:
1166
+ case 17:
1153
1167
  if (getContext) {
1154
1168
  data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
1155
1169
  data.device = _DeviceInfo.DeviceInfo.getDeviceType();
@@ -1164,18 +1178,18 @@ var SDK = /*#__PURE__*/function () {
1164
1178
 
1165
1179
 
1166
1180
  if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
1167
- _context14.next = 20;
1181
+ _context14.next = 21;
1168
1182
  break;
1169
1183
  }
1170
1184
 
1171
1185
  return _context14.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
1172
1186
 
1173
- case 20:
1187
+ case 21:
1174
1188
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1175
1189
  method = "POST";
1176
1190
  options = {
1177
1191
  data: data,
1178
- headers: headers,
1192
+ headers: requestHeaders,
1179
1193
  method: method,
1180
1194
  url: url,
1181
1195
  params: params,
@@ -1183,7 +1197,7 @@ var SDK = /*#__PURE__*/function () {
1183
1197
  };
1184
1198
  return _context14.abrupt("return", new Promise( /*#__PURE__*/function () {
1185
1199
  var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(resolve, reject) {
1186
- var response, elapsedTimeInMilliseconds, _headers5, _elapsedTimeInMilliseconds8;
1200
+ var response, elapsedTimeInMilliseconds, headers, _elapsedTimeInMilliseconds8;
1187
1201
 
1188
1202
  return _regenerator["default"].wrap(function _callee13$(_context13) {
1189
1203
  while (1) {
@@ -1196,11 +1210,11 @@ var SDK = /*#__PURE__*/function () {
1196
1210
  case 3:
1197
1211
  response = _context13.sent;
1198
1212
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1199
- _headers5 = response.headers;
1213
+ headers = response.headers;
1200
1214
 
1201
- _this7.setAuthCodeNonce(_headers5);
1215
+ _this7.setAuthCodeNonce(headers);
1202
1216
 
1203
- _this7.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, "Session Init Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, data);
1217
+ _this7.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, "Session Init Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, data, requestHeaders);
1204
1218
 
1205
1219
  resolve();
1206
1220
  _context13.next = 17;
@@ -1211,7 +1225,7 @@ var SDK = /*#__PURE__*/function () {
1211
1225
  _context13.t0 = _context13["catch"](0);
1212
1226
  _elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
1213
1227
 
1214
- _this7.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, "Session Init failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _context13.t0, data);
1228
+ _this7.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, "Session Init failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _context13.t0, data, requestHeaders);
1215
1229
 
1216
1230
  if ((0, _isExpectedAxiosError["default"])(_context13.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1217
1231
  (0, _throwClientHTTPError["default"])();
@@ -1232,7 +1246,7 @@ var SDK = /*#__PURE__*/function () {
1232
1246
  };
1233
1247
  }()));
1234
1248
 
1235
- case 24:
1249
+ case 25:
1236
1250
  case "end":
1237
1251
  return _context14.stop();
1238
1252
  }
@@ -1267,7 +1281,7 @@ var SDK = /*#__PURE__*/function () {
1267
1281
  isReconnectChat,
1268
1282
  isPersistentChat,
1269
1283
  chatId,
1270
- headers,
1284
+ requestHeaders,
1271
1285
  data,
1272
1286
  url,
1273
1287
  method,
@@ -1288,18 +1302,19 @@ var SDK = /*#__PURE__*/function () {
1288
1302
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.sessionClose
1289
1303
  });
1290
1304
  authenticatedUserToken = sessionCloseOptionalParams.authenticatedUserToken, isReconnectChat = sessionCloseOptionalParams.isReconnectChat, isPersistentChat = sessionCloseOptionalParams.isPersistentChat, chatId = sessionCloseOptionalParams.chatId;
1291
- headers = _Constants["default"].defaultHeaders;
1305
+ requestHeaders = _Constants["default"].defaultHeaders;
1292
1306
  data = {}; // eslint-disable-line @typescript-eslint/no-explicit-any
1293
1307
 
1294
1308
  data.chatId = chatId;
1295
1309
 
1296
1310
  if (authenticatedUserToken) {
1297
1311
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSessionClosePath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1298
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1299
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1312
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1313
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1300
1314
  }
1301
1315
 
1302
- this.setSessionIdHeader(this.sessionId, headers);
1316
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
1317
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
1303
1318
 
1304
1319
  if (isReconnectChat) {
1305
1320
  requestPath += "&isReconnectChat=true";
@@ -1313,14 +1328,14 @@ var SDK = /*#__PURE__*/function () {
1313
1328
  method = "POST";
1314
1329
  options = {
1315
1330
  data: data,
1316
- headers: headers,
1331
+ headers: requestHeaders,
1317
1332
  method: method,
1318
1333
  url: url,
1319
1334
  timeout: (_this$configuration$d9 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d9 !== void 0 ? _this$configuration$d9 : this.configuration.requestTimeoutConfig.sessionClose
1320
1335
  };
1321
1336
  return _context16.abrupt("return", new Promise( /*#__PURE__*/function () {
1322
1337
  var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(resolve, reject) {
1323
- var response, _headers6, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
1338
+ var response, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
1324
1339
 
1325
1340
  return _regenerator["default"].wrap(function _callee15$(_context15) {
1326
1341
  while (1) {
@@ -1332,13 +1347,13 @@ var SDK = /*#__PURE__*/function () {
1332
1347
 
1333
1348
  case 3:
1334
1349
  response = _context15.sent;
1335
- _headers6 = response.headers;
1350
+ headers = response.headers;
1336
1351
 
1337
- _this8.setAuthCodeNonce(_headers6);
1352
+ _this8.setAuthCodeNonce(headers);
1338
1353
 
1339
1354
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1340
1355
 
1341
- _this8.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, "Session Close succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1356
+ _this8.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, "Session Close succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
1342
1357
 
1343
1358
  resolve(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
1344
1359
 
@@ -1350,7 +1365,7 @@ var SDK = /*#__PURE__*/function () {
1350
1365
  _context15.t0 = _context15["catch"](0);
1351
1366
  _elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
1352
1367
 
1353
- _this8.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, "Session close failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _context15.t0);
1368
+ _this8.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, "Session close failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _context15.t0, undefined, requestHeaders);
1354
1369
 
1355
1370
  if (_context15.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1356
1371
  (0, _throwClientHTTPError["default"])();
@@ -1371,7 +1386,7 @@ var SDK = /*#__PURE__*/function () {
1371
1386
  };
1372
1387
  }()));
1373
1388
 
1374
- case 18:
1389
+ case 19:
1375
1390
  case "end":
1376
1391
  return _context16.stop();
1377
1392
  }
@@ -1398,7 +1413,7 @@ var SDK = /*#__PURE__*/function () {
1398
1413
  var _this$configuration$d10,
1399
1414
  _this9 = this;
1400
1415
 
1401
- var timer, authenticatedUserToken, chatId, requestPath, axiosInstance, headers, url, method, options;
1416
+ var timer, authenticatedUserToken, chatId, requestPath, axiosInstance, requestHeaders, url, method, options;
1402
1417
  return _regenerator["default"].wrap(function _callee18$(_context18) {
1403
1418
  while (1) {
1404
1419
  switch (_context18.prev = _context18.next) {
@@ -1413,25 +1428,26 @@ var SDK = /*#__PURE__*/function () {
1413
1428
  retries: this.configuration.maxRequestRetriesOnFailure,
1414
1429
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.validateAuthChatRecord
1415
1430
  });
1416
- headers = _Constants["default"].defaultHeaders;
1431
+ requestHeaders = _Constants["default"].defaultHeaders;
1417
1432
 
1418
1433
  if (authenticatedUserToken) {
1419
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1420
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1434
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1435
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1421
1436
  }
1422
1437
 
1423
- this.setSessionIdHeader(this.sessionId, headers);
1438
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
1439
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
1424
1440
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1425
1441
  method = "GET";
1426
1442
  options = {
1427
- headers: headers,
1443
+ headers: requestHeaders,
1428
1444
  method: method,
1429
1445
  url: url,
1430
1446
  timeout: (_this$configuration$d10 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d10 !== void 0 ? _this$configuration$d10 : this.configuration.requestTimeoutConfig.validateAuthChatRecordTimeout
1431
1447
  };
1432
1448
  return _context18.abrupt("return", new Promise( /*#__PURE__*/function () {
1433
1449
  var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(resolve, reject) {
1434
- var _response$data, response, _headers7, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
1450
+ var _response$data, response, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
1435
1451
 
1436
1452
  return _regenerator["default"].wrap(function _callee17$(_context17) {
1437
1453
  while (1) {
@@ -1443,18 +1459,18 @@ var SDK = /*#__PURE__*/function () {
1443
1459
 
1444
1460
  case 3:
1445
1461
  response = _context17.sent;
1446
- _headers7 = response.headers;
1462
+ headers = response.headers;
1447
1463
 
1448
- _this9.setAuthCodeNonce(_headers7);
1464
+ _this9.setAuthCodeNonce(headers);
1449
1465
 
1450
1466
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1451
1467
 
1452
1468
  if (((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.authChatExist) === true) {
1453
- _this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSUCCEEDED, "Validate Auth Chat Record succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1469
+ _this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSUCCEEDED, "Validate Auth Chat Record succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
1454
1470
 
1455
1471
  resolve(response.data);
1456
1472
  } else {
1457
- _this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record Failed. Record is not found or request is not authorized", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1473
+ _this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record Failed. Record is not found or request is not authorized", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
1458
1474
 
1459
1475
  reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized"));
1460
1476
  } // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -1468,7 +1484,7 @@ var SDK = /*#__PURE__*/function () {
1468
1484
  _context17.t0 = _context17["catch"](0);
1469
1485
  _elapsedTimeInMilliseconds10 = timer.milliSecondsElapsed;
1470
1486
 
1471
- _this9.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds10, requestPath, method, _context17.t0);
1487
+ _this9.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds10, requestPath, method, _context17.t0, undefined, requestHeaders);
1472
1488
 
1473
1489
  if ((0, _isExpectedAxiosError["default"])(_context17.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1474
1490
  (0, _throwClientHTTPError["default"])();
@@ -1494,7 +1510,7 @@ var SDK = /*#__PURE__*/function () {
1494
1510
  };
1495
1511
  }()));
1496
1512
 
1497
- case 13:
1513
+ case 14:
1498
1514
  case "end":
1499
1515
  return _context18.stop();
1500
1516
  }
@@ -1527,7 +1543,7 @@ var SDK = /*#__PURE__*/function () {
1527
1543
  requestPath,
1528
1544
  axiosInstance,
1529
1545
  authenticatedUserToken,
1530
- headers,
1546
+ requestHeaders,
1531
1547
  url,
1532
1548
  method,
1533
1549
  options,
@@ -1547,26 +1563,26 @@ var SDK = /*#__PURE__*/function () {
1547
1563
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.submitPostChatResponse
1548
1564
  });
1549
1565
  authenticatedUserToken = submitPostChatResponseOptionalParams.authenticatedUserToken;
1550
- headers = _Constants["default"].defaultHeaders;
1566
+ requestHeaders = _Constants["default"].defaultHeaders;
1551
1567
 
1552
1568
  if (authenticatedUserToken) {
1553
1569
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSubmitPostChatPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1554
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1555
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1570
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1571
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1556
1572
  }
1557
1573
 
1558
1574
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1559
1575
  method = "POST";
1560
1576
  options = {
1561
1577
  data: JSON.stringify(postChatResponse),
1562
- headers: headers,
1578
+ headers: requestHeaders,
1563
1579
  method: method,
1564
1580
  url: url,
1565
1581
  timeout: (_this$configuration$d11 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d11 !== void 0 ? _this$configuration$d11 : this.configuration.requestTimeoutConfig.submitPostChatResponse
1566
1582
  };
1567
1583
  return _context20.abrupt("return", new Promise( /*#__PURE__*/function () {
1568
1584
  var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(resolve, reject) {
1569
- var response, _headers8, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds11;
1585
+ var response, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds11;
1570
1586
 
1571
1587
  return _regenerator["default"].wrap(function _callee19$(_context19) {
1572
1588
  while (1) {
@@ -1578,13 +1594,13 @@ var SDK = /*#__PURE__*/function () {
1578
1594
 
1579
1595
  case 3:
1580
1596
  response = _context19.sent;
1581
- _headers8 = response.headers;
1597
+ headers = response.headers;
1582
1598
 
1583
- _this10.setAuthCodeNonce(_headers8);
1599
+ _this10.setAuthCodeNonce(headers);
1584
1600
 
1585
1601
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1586
1602
 
1587
- _this10.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, "Submit Post Chat succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1603
+ _this10.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, "Submit Post Chat succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
1588
1604
 
1589
1605
  resolve();
1590
1606
  _context19.next = 17;
@@ -1595,7 +1611,7 @@ var SDK = /*#__PURE__*/function () {
1595
1611
  _context19.t0 = _context19["catch"](0);
1596
1612
  _elapsedTimeInMilliseconds11 = timer.milliSecondsElapsed;
1597
1613
 
1598
- _this10.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, "Submit Post Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds11, requestPath, method, _context19.t0);
1614
+ _this10.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, "Submit Post Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds11, requestPath, method, _context19.t0, undefined, requestHeaders);
1599
1615
 
1600
1616
  if ((0, _isExpectedAxiosError["default"])(_context19.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1601
1617
  (0, _throwClientHTTPError["default"])();
@@ -1650,7 +1666,7 @@ var SDK = /*#__PURE__*/function () {
1650
1666
  axiosInstance,
1651
1667
  authenticatedUserToken,
1652
1668
  requestId,
1653
- headers,
1669
+ requestHeaders,
1654
1670
  url,
1655
1671
  method,
1656
1672
  options,
@@ -1676,33 +1692,34 @@ var SDK = /*#__PURE__*/function () {
1676
1692
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getSurveyInviteLink
1677
1693
  });
1678
1694
  authenticatedUserToken = getsurveyInviteLinkOptionalParams.authenticatedUserToken, requestId = getsurveyInviteLinkOptionalParams.requestId;
1679
- headers = _Constants["default"].defaultHeaders;
1695
+ requestHeaders = _Constants["default"].defaultHeaders;
1680
1696
 
1681
1697
  if (authenticatedUserToken) {
1682
1698
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetSurveyInviteLinkPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(surveyOwnerId);
1683
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1684
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1685
- headers[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
1699
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1700
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1701
+ requestHeaders[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
1686
1702
  }
1687
1703
 
1688
- this.setSessionIdHeader(this.sessionId, headers);
1704
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
1705
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
1689
1706
 
1690
1707
  if (requestId) {
1691
- headers[_OmnichannelHTTPHeaders["default"].requestId] = requestId;
1708
+ requestHeaders[_OmnichannelHTTPHeaders["default"].requestId] = requestId;
1692
1709
  }
1693
1710
 
1694
1711
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1695
1712
  method = "POST";
1696
1713
  options = {
1697
1714
  data: JSON.stringify(surveyInviteAPIRequestBody),
1698
- headers: headers,
1715
+ headers: requestHeaders,
1699
1716
  method: method,
1700
1717
  url: url,
1701
1718
  timeout: (_this$configuration$d12 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d12 !== void 0 ? _this$configuration$d12 : this.configuration.requestTimeoutConfig.getSurveyInviteLink
1702
1719
  };
1703
1720
  return _context22.abrupt("return", new Promise( /*#__PURE__*/function () {
1704
1721
  var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21(resolve, reject) {
1705
- var response, data, _headers9, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
1722
+ var response, data, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
1706
1723
 
1707
1724
  return _regenerator["default"].wrap(function _callee21$(_context21) {
1708
1725
  while (1) {
@@ -1714,13 +1731,13 @@ var SDK = /*#__PURE__*/function () {
1714
1731
 
1715
1732
  case 3:
1716
1733
  response = _context21.sent;
1717
- data = response.data, _headers9 = response.headers;
1734
+ data = response.data, headers = response.headers;
1718
1735
 
1719
- _this11.setAuthCodeNonce(_headers9);
1736
+ _this11.setAuthCodeNonce(headers);
1720
1737
 
1721
1738
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1722
1739
 
1723
- _this11.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, "Get Survey Invite Link Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1740
+ _this11.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, "Get Survey Invite Link Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
1724
1741
 
1725
1742
  resolve(data);
1726
1743
  _context21.next = 17;
@@ -1731,7 +1748,7 @@ var SDK = /*#__PURE__*/function () {
1731
1748
  _context21.t0 = _context21["catch"](0);
1732
1749
  _elapsedTimeInMilliseconds12 = timer.milliSecondsElapsed;
1733
1750
 
1734
- _this11.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, "Get Survey Invite Link failed", requestId, undefined, _elapsedTimeInMilliseconds12, requestPath, method, _context21.t0);
1751
+ _this11.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, "Get Survey Invite Link failed", requestId, undefined, _elapsedTimeInMilliseconds12, requestPath, method, _context21.t0, undefined, requestHeaders);
1735
1752
 
1736
1753
  if ((0, _isExpectedAxiosError["default"])(_context21.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1737
1754
  (0, _throwClientHTTPError["default"])();
@@ -1752,7 +1769,7 @@ var SDK = /*#__PURE__*/function () {
1752
1769
  };
1753
1770
  }()));
1754
1771
 
1755
- case 15:
1772
+ case 16:
1756
1773
  case "end":
1757
1774
  return _context22.stop();
1758
1775
  }
@@ -1787,7 +1804,7 @@ var SDK = /*#__PURE__*/function () {
1787
1804
  axiosInstance,
1788
1805
  authenticatedUserToken,
1789
1806
  currentLiveChatVersion,
1790
- headers,
1807
+ requestHeaders,
1791
1808
  url,
1792
1809
  method,
1793
1810
  options,
@@ -1807,37 +1824,38 @@ var SDK = /*#__PURE__*/function () {
1807
1824
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getChatTranscripts
1808
1825
  });
1809
1826
  authenticatedUserToken = getChatTranscriptsOptionalParams.authenticatedUserToken, currentLiveChatVersion = getChatTranscriptsOptionalParams.currentLiveChatVersion;
1810
- headers = _Constants["default"].defaultHeaders;
1811
- headers[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
1812
- headers[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
1813
- headers[_OmnichannelHTTPHeaders["default"].authorization] = token;
1827
+ requestHeaders = _Constants["default"].defaultHeaders;
1828
+ requestHeaders[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
1829
+ requestHeaders[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
1830
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authorization] = token;
1814
1831
 
1815
1832
  if (this.liveChatVersion === _Enums.LiveChatVersion.V2 || currentLiveChatVersion && currentLiveChatVersion === _Enums.LiveChatVersion.V2) {
1816
1833
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2GetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1817
1834
 
1818
1835
  if (authenticatedUserToken) {
1819
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1820
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1836
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1837
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1821
1838
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2AuthGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1822
1839
  }
1823
1840
  } else if (authenticatedUserToken) {
1824
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1825
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1841
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1842
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1826
1843
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1827
1844
  }
1828
1845
 
1829
- this.setSessionIdHeader(this.sessionId, headers);
1846
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
1847
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
1830
1848
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1831
1849
  method = "GET";
1832
1850
  options = {
1833
- headers: headers,
1851
+ headers: requestHeaders,
1834
1852
  method: method,
1835
1853
  url: url,
1836
1854
  timeout: (_this$configuration$d13 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d13 !== void 0 ? _this$configuration$d13 : this.configuration.requestTimeoutConfig.getChatTranscripts
1837
1855
  };
1838
1856
  return _context24.abrupt("return", new Promise( /*#__PURE__*/function () {
1839
1857
  var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23(resolve, reject) {
1840
- var response, elapsedTimeInMilliseconds, data, _headers10, _elapsedTimeInMilliseconds13;
1858
+ var response, elapsedTimeInMilliseconds, data, headers, _elapsedTimeInMilliseconds13;
1841
1859
 
1842
1860
  return _regenerator["default"].wrap(function _callee23$(_context23) {
1843
1861
  while (1) {
@@ -1850,11 +1868,11 @@ var SDK = /*#__PURE__*/function () {
1850
1868
  case 3:
1851
1869
  response = _context23.sent;
1852
1870
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1853
- data = response.data, _headers10 = response.headers;
1871
+ data = response.data, headers = response.headers;
1854
1872
 
1855
- _this12.setAuthCodeNonce(_headers10);
1873
+ _this12.setAuthCodeNonce(headers);
1856
1874
 
1857
- _this12.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, "Get Chat Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1875
+ _this12.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, "Get Chat Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
1858
1876
 
1859
1877
  resolve(data);
1860
1878
  _context23.next = 17;
@@ -1865,7 +1883,7 @@ var SDK = /*#__PURE__*/function () {
1865
1883
  _context23.t0 = _context23["catch"](0);
1866
1884
  _elapsedTimeInMilliseconds13 = timer.milliSecondsElapsed;
1867
1885
 
1868
- _this12.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, "Get Chat Transcript failed", requestId, undefined, _elapsedTimeInMilliseconds13, requestPath, method, _context23.t0);
1886
+ _this12.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, "Get Chat Transcript failed", requestId, undefined, _elapsedTimeInMilliseconds13, requestPath, method, _context23.t0, undefined, requestHeaders);
1869
1887
 
1870
1888
  if ((0, _isExpectedAxiosError["default"])(_context23.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1871
1889
  (0, _throwClientHTTPError["default"])();
@@ -1886,7 +1904,7 @@ var SDK = /*#__PURE__*/function () {
1886
1904
  };
1887
1905
  }()));
1888
1906
 
1889
- case 17:
1907
+ case 18:
1890
1908
  case "end":
1891
1909
  return _context24.stop();
1892
1910
  }
@@ -1920,7 +1938,7 @@ var SDK = /*#__PURE__*/function () {
1920
1938
  requestPath,
1921
1939
  axiosInstance,
1922
1940
  authenticatedUserToken,
1923
- headers,
1941
+ requestHeaders,
1924
1942
  url,
1925
1943
  method,
1926
1944
  options,
@@ -1940,30 +1958,31 @@ var SDK = /*#__PURE__*/function () {
1940
1958
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.emailTranscript
1941
1959
  });
1942
1960
  authenticatedUserToken = emailTranscriptOptionalParams.authenticatedUserToken;
1943
- headers = _Constants["default"].defaultHeaders;
1944
- headers[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
1945
- headers[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
1946
- headers[_OmnichannelHTTPHeaders["default"].authorization] = token;
1961
+ requestHeaders = _Constants["default"].defaultHeaders;
1962
+ requestHeaders[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
1963
+ requestHeaders[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
1964
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authorization] = token;
1947
1965
 
1948
1966
  if (authenticatedUserToken) {
1949
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1950
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1967
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1968
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1951
1969
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthTranscriptEmailRequestPath, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1952
1970
  }
1953
1971
 
1954
- this.setSessionIdHeader(this.sessionId, headers);
1972
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
1973
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
1955
1974
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1956
1975
  method = "POST";
1957
1976
  options = {
1958
1977
  data: JSON.stringify(emailRequestBody),
1959
- headers: headers,
1978
+ headers: requestHeaders,
1960
1979
  method: method,
1961
1980
  url: url,
1962
1981
  timeout: (_this$configuration$d14 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d14 !== void 0 ? _this$configuration$d14 : this.configuration.requestTimeoutConfig.emailTranscript
1963
1982
  };
1964
1983
  return _context26.abrupt("return", new Promise( /*#__PURE__*/function () {
1965
1984
  var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25(resolve, reject) {
1966
- var response, _headers11, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds14;
1985
+ var response, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds14;
1967
1986
 
1968
1987
  return _regenerator["default"].wrap(function _callee25$(_context25) {
1969
1988
  while (1) {
@@ -1975,13 +1994,13 @@ var SDK = /*#__PURE__*/function () {
1975
1994
 
1976
1995
  case 3:
1977
1996
  response = _context25.sent;
1978
- _headers11 = response.headers;
1997
+ headers = response.headers;
1979
1998
 
1980
- _this13.setAuthCodeNonce(_headers11);
1999
+ _this13.setAuthCodeNonce(headers);
1981
2000
 
1982
2001
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1983
2002
 
1984
- _this13.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
2003
+ _this13.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
1985
2004
 
1986
2005
  resolve();
1987
2006
  _context25.next = 17;
@@ -1992,7 +2011,7 @@ var SDK = /*#__PURE__*/function () {
1992
2011
  _context25.t0 = _context25["catch"](0);
1993
2012
  _elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
1994
2013
 
1995
- _this13.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds14, requestPath, method, _context25.t0);
2014
+ _this13.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds14, requestPath, method, _context25.t0, undefined, requestHeaders);
1996
2015
 
1997
2016
  if ((0, _isExpectedAxiosError["default"])(_context25.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1998
2017
  (0, _throwClientHTTPError["default"])();
@@ -2013,7 +2032,7 @@ var SDK = /*#__PURE__*/function () {
2013
2032
  };
2014
2033
  }()));
2015
2034
 
2016
- case 17:
2035
+ case 18:
2017
2036
  case "end":
2018
2037
  return _context26.stop();
2019
2038
  }
@@ -2039,7 +2058,7 @@ var SDK = /*#__PURE__*/function () {
2039
2058
  var _this$configuration$d15,
2040
2059
  _this14 = this;
2041
2060
 
2042
- var timer, requestPath, axiosInstance, headers, url, method, options;
2061
+ var timer, requestPath, axiosInstance, requestHeaders, url, method, options;
2043
2062
  return _regenerator["default"].wrap(function _callee28$(_context28) {
2044
2063
  while (1) {
2045
2064
  switch (_context28.prev = _context28.next) {
@@ -2057,14 +2076,15 @@ var SDK = /*#__PURE__*/function () {
2057
2076
  retries: this.configuration.maxRequestRetriesOnFailure,
2058
2077
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.fetchDataMaskingInfo
2059
2078
  });
2060
- headers = _Constants["default"].defaultHeaders;
2061
- headers[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
2062
- headers[_OmnichannelHTTPHeaders["default"].requestId] = requestId;
2063
- this.setSessionIdHeader(this.sessionId, headers);
2079
+ requestHeaders = _Constants["default"].defaultHeaders;
2080
+ requestHeaders[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
2081
+ requestHeaders[_OmnichannelHTTPHeaders["default"].requestId] = requestId;
2082
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
2083
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
2064
2084
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
2065
2085
  method = "GET";
2066
2086
  options = {
2067
- headers: headers,
2087
+ headers: requestHeaders,
2068
2088
  method: method,
2069
2089
  url: url,
2070
2090
  timeout: (_this$configuration$d15 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d15 !== void 0 ? _this$configuration$d15 : this.configuration.requestTimeoutConfig.fetchDataMaskingInfo
@@ -2086,7 +2106,7 @@ var SDK = /*#__PURE__*/function () {
2086
2106
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2087
2107
  data = response.data;
2088
2108
 
2089
- _this14.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
2109
+ _this14.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
2090
2110
 
2091
2111
  resolve(data);
2092
2112
  _context27.next = 16;
@@ -2097,7 +2117,7 @@ var SDK = /*#__PURE__*/function () {
2097
2117
  _context27.t0 = _context27["catch"](0);
2098
2118
  _elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
2099
2119
 
2100
- _this14.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context27.t0);
2120
+ _this14.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context27.t0, undefined, requestHeaders);
2101
2121
 
2102
2122
  if ((0, _isExpectedAxiosError["default"])(_context27.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2103
2123
  (0, _throwClientHTTPError["default"])();
@@ -2118,7 +2138,7 @@ var SDK = /*#__PURE__*/function () {
2118
2138
  };
2119
2139
  }()));
2120
2140
 
2121
- case 14:
2141
+ case 15:
2122
2142
  case "end":
2123
2143
  return _context28.stop();
2124
2144
  }
@@ -2151,7 +2171,7 @@ var SDK = /*#__PURE__*/function () {
2151
2171
  requestPath,
2152
2172
  axiosInstance,
2153
2173
  authenticatedUserToken,
2154
- headers,
2174
+ requestHeaders,
2155
2175
  url,
2156
2176
  method,
2157
2177
  options,
@@ -2171,29 +2191,30 @@ var SDK = /*#__PURE__*/function () {
2171
2191
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.makeSecondaryChannelEventRequest
2172
2192
  });
2173
2193
  authenticatedUserToken = secondaryChannelEventOptionalParams.authenticatedUserToken;
2174
- headers = _Constants["default"].defaultHeaders;
2175
- headers[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
2194
+ requestHeaders = _Constants["default"].defaultHeaders;
2195
+ requestHeaders[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
2176
2196
 
2177
2197
  if (authenticatedUserToken) {
2178
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
2179
- headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
2198
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
2199
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
2180
2200
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSecondaryChannelEventPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
2181
2201
  }
2182
2202
 
2183
- this.setSessionIdHeader(this.sessionId, headers);
2203
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
2204
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
2184
2205
  requestPath += "?channelId=" + _Constants["default"].defaultChannelId;
2185
2206
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
2186
2207
  method = "POST";
2187
2208
  options = {
2188
2209
  data: JSON.stringify(secondaryChannelEventRequestBody),
2189
- headers: headers,
2210
+ headers: requestHeaders,
2190
2211
  method: method,
2191
2212
  url: url,
2192
2213
  timeout: (_this$configuration$d16 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d16 !== void 0 ? _this$configuration$d16 : this.configuration.requestTimeoutConfig.makeSecondaryChannelEventRequest
2193
2214
  };
2194
2215
  return _context30.abrupt("return", new Promise( /*#__PURE__*/function () {
2195
2216
  var _ref14 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee29(resolve, reject) {
2196
- var response, _headers12, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds16;
2217
+ var response, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds16;
2197
2218
 
2198
2219
  return _regenerator["default"].wrap(function _callee29$(_context29) {
2199
2220
  while (1) {
@@ -2205,13 +2226,13 @@ var SDK = /*#__PURE__*/function () {
2205
2226
 
2206
2227
  case 3:
2207
2228
  response = _context29.sent;
2208
- _headers12 = response.headers;
2229
+ headers = response.headers;
2209
2230
 
2210
- _this15.setAuthCodeNonce(_headers12);
2231
+ _this15.setAuthCodeNonce(headers);
2211
2232
 
2212
2233
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2213
2234
 
2214
- _this15.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
2235
+ _this15.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
2215
2236
 
2216
2237
  resolve();
2217
2238
  _context29.next = 17;
@@ -2222,7 +2243,7 @@ var SDK = /*#__PURE__*/function () {
2222
2243
  _context29.t0 = _context29["catch"](0);
2223
2244
  _elapsedTimeInMilliseconds16 = timer.milliSecondsElapsed;
2224
2245
 
2225
- _this15.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds16, requestPath, method, _context29.t0);
2246
+ _this15.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds16, requestPath, method, _context29.t0, undefined, requestHeaders);
2226
2247
 
2227
2248
  if ((0, _isExpectedAxiosError["default"])(_context29.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2228
2249
  (0, _throwClientHTTPError["default"])();
@@ -2243,7 +2264,7 @@ var SDK = /*#__PURE__*/function () {
2243
2264
  };
2244
2265
  }()));
2245
2266
 
2246
- case 16:
2267
+ case 17:
2247
2268
  case "end":
2248
2269
  return _context30.stop();
2249
2270
  }
@@ -2273,7 +2294,7 @@ var SDK = /*#__PURE__*/function () {
2273
2294
  customerDisplayName,
2274
2295
  requestPath,
2275
2296
  axiosInstance,
2276
- headers,
2297
+ requestHeaders,
2277
2298
  url,
2278
2299
  method,
2279
2300
  options,
@@ -2305,18 +2326,19 @@ var SDK = /*#__PURE__*/function () {
2305
2326
  case 7:
2306
2327
  requestPath = "/".concat(_OmnichannelEndpoints["default"].SendTypingIndicatorPath, "/").concat(requestId);
2307
2328
  axiosInstance = _axios["default"].create();
2308
- headers = _Constants["default"].defaultHeaders;
2309
- headers[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
2329
+ requestHeaders = _Constants["default"].defaultHeaders;
2330
+ requestHeaders[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
2310
2331
 
2311
2332
  if (customerDisplayName) {
2312
- headers[_Constants["default"].customerDisplayName] = customerDisplayName;
2333
+ requestHeaders[_Constants["default"].customerDisplayName] = customerDisplayName;
2313
2334
  }
2314
2335
 
2315
- this.setSessionIdHeader(this.sessionId, headers);
2336
+ this.setSessionIdHeader(this.sessionId, requestHeaders);
2337
+ (0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
2316
2338
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
2317
2339
  method = "POST";
2318
2340
  options = {
2319
- headers: headers,
2341
+ headers: requestHeaders,
2320
2342
  method: method,
2321
2343
  url: url,
2322
2344
  timeout: (_this$configuration$d17 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d17 !== void 0 ? _this$configuration$d17 : this.configuration.requestTimeoutConfig.sendTypingIndicator
@@ -2337,7 +2359,7 @@ var SDK = /*#__PURE__*/function () {
2337
2359
  response = _context31.sent;
2338
2360
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2339
2361
 
2340
- _this16.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
2362
+ _this16.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
2341
2363
 
2342
2364
  resolve();
2343
2365
  _context31.next = 15;
@@ -2348,7 +2370,7 @@ var SDK = /*#__PURE__*/function () {
2348
2370
  _context31.t0 = _context31["catch"](0);
2349
2371
  _elapsedTimeInMilliseconds17 = timer.milliSecondsElapsed;
2350
2372
 
2351
- _this16.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds17, requestPath, method, _context31.t0);
2373
+ _this16.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds17, requestPath, method, _context31.t0, undefined, requestHeaders);
2352
2374
 
2353
2375
  if ((0, _isExpectedAxiosError["default"])(_context31.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2354
2376
  (0, _throwClientHTTPError["default"])();
@@ -2369,7 +2391,7 @@ var SDK = /*#__PURE__*/function () {
2369
2391
  };
2370
2392
  }()));
2371
2393
 
2372
- case 17:
2394
+ case 18:
2373
2395
  case "end":
2374
2396
  return _context32.stop();
2375
2397
  }
@@ -2400,7 +2422,7 @@ var SDK = /*#__PURE__*/function () {
2400
2422
 
2401
2423
  }, {
2402
2424
  key: "logWithLogger",
2403
- value: function logWithLogger(logLevel, telemetryEventType, description, requestId, response, elapsedTimeInMilliseconds, requestPath, method, error, requestPayload) {
2425
+ value: function logWithLogger(logLevel, telemetryEventType, description, requestId, response, elapsedTimeInMilliseconds, requestPath, method, error, requestPayload, requestHeaders) {
2404
2426
  var _response2;
2405
2427
 
2406
2428
  // eslint-disable-line @typescript-eslint/no-explicit-any
@@ -2428,6 +2450,14 @@ var SDK = /*#__PURE__*/function () {
2428
2450
  _LoggingSanitizer.LoggingSanitizer.stripGeolocation(sanitizedRequestPayload);
2429
2451
  }
2430
2452
 
2453
+ var sanitizedRequestHeaders = undefined;
2454
+
2455
+ if (requestHeaders) {
2456
+ sanitizedRequestHeaders = _objectSpread({}, requestHeaders);
2457
+
2458
+ _LoggingSanitizer.LoggingSanitizer.stripRequestHeadersSensitiveProperties(sanitizedRequestHeaders);
2459
+ }
2460
+
2431
2461
  var customData = {
2432
2462
  RequestId: requestId,
2433
2463
  Region: response === null || response === void 0 ? void 0 : response.data.Region,
@@ -2438,7 +2468,8 @@ var SDK = /*#__PURE__*/function () {
2438
2468
  ResponseStatusCode: response ? response.status : error ? (_response2 = error.response) === null || _response2 === void 0 ? void 0 : _response2.status : undefined,
2439
2469
  // eslint-disable-line @typescript-eslint/no-explicit-any
2440
2470
  ExceptionDetails: error,
2441
- RequestPayload: sanitizedRequestPayload
2471
+ RequestPayload: sanitizedRequestPayload,
2472
+ RequestHeaders: sanitizedRequestHeaders
2442
2473
  };
2443
2474
  this.logger.log(logLevel, telemetryEventType, customData, description);
2444
2475
  } // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -2475,6 +2506,7 @@ exports["default"] = SDK;
2475
2506
  defaultRequestTimeout: undefined,
2476
2507
  requestTimeoutConfig: SDK.defaultRequestTimeoutConfig,
2477
2508
  useUnauthReconnectIdSigQueryParam: false,
2478
- waitTimeBetweenRetriesConfig: _waitTimeBetweenRetriesConfigs.waitTimeBetweenRetriesConfigs
2509
+ waitTimeBetweenRetriesConfig: _waitTimeBetweenRetriesConfigs.waitTimeBetweenRetriesConfigs,
2510
+ ocUserAgent: []
2479
2511
  });
2480
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwic2Vzc2lvbklkIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9jU2Vzc2lvbklkIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJ0aW1lciIsIlRpbWVyIiwiVElNRVIiLCJsb2dXaXRoTG9nZ2VyIiwiTG9nTGV2ZWwiLCJJTkZPIiwiT0NTREtUZWxlbWV0cnlFdmVudCIsIkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxjd0Zjc0RldGFpbHNQYXRoIiwib3JnSWQiLCJtZXRob2QiLCJ1cmwiLCJvcmdVcmwiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJ3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllcyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWciLCJnZXRDaGF0Q29uZmlnIiwiZ2V0IiwidGltZW91dCIsImRlZmF1bHRSZXF1ZXN0VGltZW91dCIsInJlcXVlc3RUaW1lb3V0Q29uZmlnIiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJHRVRMQ1dGQ1NERVRBSUxTU1VDQ0VFREVEIiwiR0VUTENXRkNTREVUQUlMU0ZBSUxFRCIsInVuZGVmaW5lZCIsInJlcXVlc3RJZCIsImJ5cGFzc0NhY2hlIiwiR0VUQ0hBVENPTkZJR0ZTVEFSVEVEIiwiTGl2ZUNoYXRDb25maWdQYXRoIiwid2lkZ2V0SWQiLCJieXBhc3NDYWNoZUhlYWRlcnMiLCJHRVRDSEFUQ09ORklHU1VDQ0VFREVEIiwiR0VUQ0hBVENPTkZJR0ZBSUxFRCIsIlByb21pc2UiLCJyZWplY3QiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImhlYWRlck92ZXJ3cml0ZXMiLCJnZXRMV0lEZXRhaWxzIiwiYXV0aGVudGljYXRlZFVzZXJUb2tlbiIsInJlY29ubmVjdElkIiwiZGVmYXVsdEhlYWRlcnMiLCJMaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsInNldFNlc3Npb25JZEhlYWRlciIsInVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSIsInBhcmFtcyIsInNpZyIsIm9wdGlvbnMiLCJyZXNvbHZlIiwic2V0QXV0aENvZGVOb25jZSIsIkdFVExXSVNUQVRVU1NVQ0NFRURFRCIsIkVSUk9SIiwiR0VUTFdJU1RBVFVTRkFJTEVEIiwiYXhpb3NUaW1lb3V0RXJyb3JDb2RlIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJyZWZyZXNoVG9rZW4iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiZW5kcG9pbnQiLCJnZXRDaGF0VG9rZW4iLCJyZXRyeU9uNDI5IiwiZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSIsImdldENoYXRUb2tlbkVycm9yIiwidG9Mb3dlckNhc2UiLCJHRVRDSEFUVE9LRU5TVUNDRUVERUQiLCJzdGF0dXMiLCJub0NvbnRlbnRTdGF0dXNDb2RlIiwiR0VUQ0hBVFRPS0VORkFJTEVEIiwidG9vTWFueVJlcXVlc3RzU3RhdHVzQ29kZSIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJjb2RlIiwic2V0VGltZW91dCIsInRoZW4iLCJlcnJvciIsImdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSIsInJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUUyIsIkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aCIsImdldFJlY29ubmVjdGFibGVDaGF0cyIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsImdldFJlY29ubmVjdEF2YWlsYWJpbGl0eSIsIldBUk4iLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0QWdlbnRBdmFpbGFiaWxpdHkiLCJpbml0Q29udGV4dCIsImdldENvbnRleHQiLCJjYWNoT2JqIiwiY3VzdG9tQ29udGV4dERhdGEiLCJ0ZW1wQXJyIiwiQ3VzdG9tQ29udGV4dERhdGEiLCJzb3J0IiwiYXNzaWduIiwicG9ydGFsY29udGFjdGlkIiwiY2FjaGVLZXkiLCJoYXNoIiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaWdlc3QiLCJ0b1N0cmluZyIsIndpbmRvdyIsImRvY3VtZW50IiwiYnJvd3NlciIsIkJyb3dzZXJJbmZvIiwiZ2V0QnJvd3Nlck5hbWUiLCJkZXZpY2UiLCJEZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVHlwZSIsIm9yaWdpbnVybCIsImxvY2F0aW9uIiwiaHJlZiIsIm9zIiwiT1NJbmZvIiwiZ2V0T3NUeXBlIiwibG9jYWxlIiwiZGVmYXVsdExvY2FsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQiLCJHRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCIsInNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OSU5JVFNUQVJURUQiLCJzZXNzaW9uSW5pdCIsInNob3VsZFJldHJ5Iiwic2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIiLCJMaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05DTE9TRVNUQVJURUQiLCJMaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGgiLCJzZXNzaW9uQ2xvc2UiLCJpc1JlY29ubmVjdENoYXQiLCJpc1BlcnNpc3RlbnRDaGF0IiwiY2hhdElkIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCIsIlNFU1NJT05DTE9TRVNVQ0NFRURFRCIsIlNFU1NJT05DTE9TRUZBSUxFRCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVEIiwiTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dCIsImF1dGhDaGF0RXhpc3QiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVEIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCIsInBvc3RDaGF0UmVzcG9uc2UiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJTVUJNSVRQT1NUQ0hBVFNUQVJURUQiLCJMaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aCIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwibG9nIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsImdldFN1cnZleUludml0ZUxpbmsiLCJMaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIndpZGdldEFwcElkIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCIsIkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQiLCJ0b2tlbiIsImdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJnZXRDaGF0VHJhbnNjcmlwdHMiLCJvcmdhbml6YXRpb25JZCIsImF1dGhvcml6YXRpb24iLCJMaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJHRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCIsIkdFVENIQVRUUkFOU0NSSVBURkFJTEVEIiwiZW1haWxSZXF1ZXN0Qm9keSIsImVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIiwiRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJlbWFpbFRyYW5zY3JpcHQiLCJMaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCIsIkVNQUlMVFJBTlNDUklQVEZBSUxFRCIsIkZFVENIREFUQU1BU0tJTkdTVEFSVEVEIiwiTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGgiLCJmZXRjaERhdGFNYXNraW5nSW5mbyIsIkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQiLCJGRVRDSERBVEFNQVNLSU5HRkFJTEVEIiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVEIiwiTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwibWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QiLCJMaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiZGVmYXVsdENoYW5uZWxJZCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVEIiwic2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIiwiY3VzdG9tZXJEaXNwbGF5TmFtZSIsIlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRoIiwic2VuZFR5cGluZ0luZGljYXRvciIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQiLCJTRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVEIiwibG9nTGV2ZWwiLCJ0ZWxlbWV0cnlFdmVudFR5cGUiLCJkZXNjcmlwdGlvbiIsInJlcXVlc3RQYXlsb2FkIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwic2FuaXRpemVkUmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJzdHJpcEdlb2xvY2F0aW9uIiwiY3VzdG9tRGF0YSIsIlJlcXVlc3RJZCIsIlJlZ2lvbiIsIkVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJUcmFuc2FjdGlvbklkIiwidHJhbnNhY3Rpb25pZCIsIlJlcXVlc3RQYXRoIiwiUmVxdWVzdE1ldGhvZCIsIlJlc3BvbnNlU3RhdHVzQ29kZSIsIkV4Y2VwdGlvbkRldGFpbHMiLCJSZXF1ZXN0UGF5bG9hZCIsInN1YnN0cmluZyIsImRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztJQUVxQkEsRztBQW1DbkIsZUFBMkJDLHdCQUEzQixFQUFtTDtBQUFBOztBQUFBLFFBQTNGQyxhQUEyRix1RUFBeERGLEdBQUcsQ0FBQ0csb0JBQW9EO0FBQUEsUUFBdEJDLE1BQXNCO0FBQUE7QUFBQSxTQUF4Skgsd0JBQXdKLEdBQXhKQSx3QkFBd0o7QUFBQSxTQUEzRkMsYUFBMkYsR0FBM0ZBLGFBQTJGO0FBQUEsU0FBdEJFLE1BQXNCLEdBQXRCQSxNQUFzQjtBQUFBO0FBQUE7QUFBQSwrREF1dkN4SixVQUFDQyxPQUFELEVBQWtCO0FBQzNDLFVBQUlBLE9BQUosYUFBSUEsT0FBSixlQUFJQSxPQUFPLENBQUVDLGFBQWIsRUFBNEI7QUFDMUIsUUFBQSxLQUFJLENBQUNKLGFBQUwsQ0FBbUJLLGFBQW5CLEdBQW1DRixPQUFuQyxhQUFtQ0EsT0FBbkMsdUJBQW1DQSxPQUFPLENBQUVDLGFBQTVDO0FBQ0Q7QUFDRixLQTN2Q2tMO0FBQUEsaUVBOHZDdEosVUFBQ0UsU0FBRCxFQUFnQ0gsT0FBaEMsRUFBaUQ7QUFDNUUsVUFBSUcsU0FBSixFQUFlO0FBQ2JILFFBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCQyxX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QixDQUF0QixDQUR3QztBQUV2RHBLLEVBQUFBLHNCQUFzQixFQUFFLEVBRitCO0FBR3ZESyxFQUFBQSx1Q0FBdUMsRUFBRSxLQUhjO0FBSXZEYixFQUFBQSxzQkFBc0IsRUFBRSxLQUorQjtBQUt2RHJELEVBQUFBLDBCQUEwQixFQUFFLENBTDJCO0FBTXZETSxFQUFBQSxxQkFBcUIsRUFBRVEsU0FOZ0M7QUFPdkRQLEVBQUFBLG9CQUFvQixFQUFFckQsR0FBRyxDQUFDZ1IsMkJBUDZCO0FBUXZEL0wsRUFBQUEsaUNBQWlDLEVBQUUsS0FSb0I7QUFTdkRqQyxFQUFBQSw0QkFBNEIsRUFBRWlPO0FBVHlCLEMiLCJzb3VyY2VSb290Ijoib2NzZGs6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaGFzaCBmcm9tIFwiY3J5cHRvXCI7XG5cbmltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uLCBPQ1NES1RlbGVtZXRyeUV2ZW50IH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnLCBBeGlvc1Jlc3BvbnNlIH0gZnJvbSBcImF4aW9zXCI7XG5cbmltcG9ydCB7IEJyb3dzZXJJbmZvIH0gZnJvbSBcIi4vVXRpbHMvQnJvd3NlckluZm9cIjtcbmltcG9ydCBDb25zdGFudHMgZnJvbSBcIi4vQ29tbW9uL0NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuaW1wb3J0IHsgRGV2aWNlSW5mbyB9IGZyb20gXCIuL1V0aWxzL0RldmljZUluZm9cIjtcbmltcG9ydCBGZXRjaENoYXRUb2tlblJlc3BvbnNlIGZyb20gXCIuL01vZGVsL0ZldGNoQ2hhdFRva2VuUmVzcG9uc2VcIjtcbmltcG9ydCBJRGF0YU1hc2tpbmdJbmZvIGZyb20gXCIuL0ludGVyZmFjZXMvSURhdGFNYXNraW5nSW5mb1wiO1xuaW1wb3J0IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtc1wiO1xuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zXCJcbmltcG9ydCBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IEluaXRDb250ZXh0IGZyb20gXCIuL01vZGVsL0luaXRDb250ZXh0XCI7XG5pbXBvcnQgTG9jYWxlcyBmcm9tIFwiLi9Db21tb24vTG9jYWxlc1wiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IHsgTG9nZ2luZ1Nhbml0aXplciB9IGZyb20gXCIuL1V0aWxzL0xvZ2dpbmdTYW5pdGl6ZXJcIjtcbmltcG9ydCBPQ1NES0xvZ2dlciBmcm9tIFwiLi9Db21tb24vT0NTREtMb2dnZXJcIjtcbmltcG9ydCB7IE9TSW5mbyB9IGZyb20gXCIuL1V0aWxzL09TSW5mb1wiO1xuaW1wb3J0IE9tbmljaGFubmVsRW5kcG9pbnRzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEVuZHBvaW50c1wiO1xuaW1wb3J0IE9tbmljaGFubmVsSFRUUEhlYWRlcnMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsSFRUUEhlYWRlcnNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyIGZyb20gXCIuL0ludGVyZmFjZXMvT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlclwiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgUmVxdWVzdFRpbWVvdXRDb25maWcgfSBmcm9tIFwiLi9Db21tb24vUmVxdWVzdFRpbWVvdXRDb25maWdcIjtcbmltcG9ydCB7IFN0cmluZ01hcCB9IGZyb20gXCIuL0NvbW1vbi9NYXBwaW5nc1wiO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tIFwiLi9VdGlscy9UaW1lclwiO1xuaW1wb3J0IGF4aW9zUmV0cnkgZnJvbSBcIi4vVXRpbHMvYXhpb3NSZXRyeVwiO1xuaW1wb3J0IHsgY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQgfSBmcm9tIFwiLi9VdGlscy9lbmRwb2ludHNDcmVhdG9yc1wiO1xuaW1wb3J0IGlzRXhwZWN0ZWRBeGlvc0Vycm9yIGZyb20gXCIuL1V0aWxzL2lzRXhwZWN0ZWRBeGlvc0Vycm9yXCI7XG5pbXBvcnQgc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIgZnJvbSBcIi4vVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcIjtcbmltcG9ydCB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IgZnJvbSBcIi4vVXRpbHMvdGhyb3dDbGllbnRIVFRQRXJyb3JcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCB7IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIH0gZnJvbSBcIi4vVXRpbHMvd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3NcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMzAwMDAsXG4gICAgZ2V0TFdJRGV0YWlsczogMTUwMDAsXG4gICAgZ2V0Q2hhdFRva2VuOiAxNTAwMCxcbiAgICBzZXNzaW9uSW5pdDogMTUwMDAsXG4gICAgc2Vzc2lvbkNsb3NlOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RhYmxlQ2hhdHM6IDE1MDAwLFxuICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc3VibWl0UG9zdENoYXRSZXNwb25zZTogMTUwMDAsXG4gICAgZ2V0U3VydmV5SW52aXRlTGluazogMTUwMDAsXG4gICAgZ2V0Q2hhdFRyYW5zY3JpcHRzOiAzMDAwMCxcbiAgICBlbWFpbFRyYW5zY3JpcHQ6IDUwMDAsXG4gICAgZmV0Y2hEYXRhTWFza2luZ0luZm86IDUwMDAsXG4gICAgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3Q6IDE1MDAwLFxuICAgIGdldEFnZW50QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICBzZW5kVHlwaW5nSW5kaWNhdG9yOiA1MDAwLFxuICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiAxNTAwMFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRDb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IHtcbiAgICBhdXRoQ29kZU5vbmNlOiB1dWlkdjQoKS5zdWJzdHJpbmcoMCwgOCksXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMTAsXG4gICAgZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlOiAxMDAwMCxcbiAgICBnZXRDaGF0VG9rZW5SZXRyeU9uNDI5OiBmYWxzZSxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogMyxcbiAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0VGltZW91dENvbmZpZzogU0RLLmRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyxcbiAgICB1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW06IGZhbHNlLFxuICAgIHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWc6IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzXG4gIH07XG5cbiAgbGl2ZUNoYXRWZXJzaW9uOiBudW1iZXI7XG4gIHNlc3Npb25JZD86IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5kaXZpZHVhbCBlbmRwb2ludFRpbWVvdXQgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExDVyBGQ1MgRGV0YWlscyBvZiB0aGUgT3JnLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExjd0Zjc0RldGFpbHMoKTogUHJvbWlzZTxvYmplY3QgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgc3RhcnRlZFwiLCBcIlwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxjd0Zjc0RldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVUNDRUVERUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBzdWNjZWVkZWRcIiwgXCJcIiwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTENXRkNTREVUQUlMU0ZBSUxFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIGZhaWxlZFwiLCBcIlwiLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZTVEFSVEVELCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgIH0pO1xuXG4gICAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgICBpZiAoYnlwYXNzQ2FjaGUpIHtcbiAgICAgIGhlYWRlcnMgPSB7IC4uLkNvbnN0YW50cy5ieXBhc3NDYWNoZUhlYWRlcnMsIC4uLmhlYWRlcnMgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgfSk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgIGlmIChkYXRhLkxpdmVDaGF0VmVyc2lvbikge1xuICAgICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBkYXRhLmhlYWRlcnMgPSB7fTtcbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzICYmIHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdKSB7XG4gICAgICAgIGRhdGEuaGVhZGVyc1tcImRhdGVcIl0gPSByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRUVERUQsIFwiR2V0IENoYXQgY29uZmlnIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgICByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZBSUxFRCwgXCJHZXQgQ2hhdCBjb25maWcgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgICByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExXSSBkZXRhaWxzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgTFdJIERldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TFdJRGV0YWlscyhyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVEFSVEVELCBcIkdldCBMV0kgRGV0YWlscyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGEgZW5kcG9pbnQgZm9yIGFub255bW91cyBjaGF0cyB0byBnZXQgTFdJIERldGFpbHNcbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCBcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRMV0lEZXRhaWxzXG4gICAgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgLy8gQXBwZW5kIHJlY29ubmVjdCBpZCBvbiB0aGUgZW5kcG9pbnQgaWYgdmFpbGFibGVcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldExXSURldGFpbHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVUNDRUVERUQsIFwiR2V0IExXSSBEZXRhaWxzIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uLCByZWZyZXNoVG9rZW4gfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsIFwiR2V0IENoYXQgVG9rZW4gU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGN1cnJlbnRSZXRyeUNvdW50YCk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGNvbnN0IGVuZHBvaW50ID0gY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQoY3VycmVudExpdmVDaGF0VmVyc2lvbiBhcyBMaXZlQ2hhdFZlcnNpb24gfHwgdGhpcy5saXZlQ2hhdFZlcnNpb24sIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPyB0cnVlIDogZmFsc2UpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7ZW5kcG9pbnR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG5cbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgIH1cblxuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHBhcmFtcy5yZWZyZXNoVG9rZW4gPSAndHJ1ZSdcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUb2tlblxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLCBcbiAgICAgIHJldHJ5T240Mjk6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5LFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRUb2tlblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBsZXQgZ2V0Q2hhdFRva2VuRXJyb3I6YW55ID0gdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgICAgaWYgKGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1VDQ0VFREVELCBcIkdldCBDaGF0IFRva2VuIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNvbnRlbnQgZm9yIHJlY29ubmVjdCBjaGF0IGNhc2Ugc2hvdWxkbid0IGJlIHJldHJpZWQuXG4gICAgICAgIGlmIChyZWNvbm5lY3RJZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IENvbnN0YW50cy5ub0NvbnRlbnRTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5GQUlMRUQsIFwiR2V0IENoYXQgVG9rZW4gZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGdldENoYXRUb2tlbkVycm9yID0gZXJyb3I7XG5cbiAgICAgICAgLy8gU3RvcCByZXRyeSBvbiA0MjlcbiAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgPT09IENvbnN0YW50cy50b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlICYmICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIHJldHVybi9yZWplY3QgdG8gcmVjdXJzaXZlbHkgcmV0cnkgb24gZmFpbHVyZXMgdXAgdG8gY2hhdCB0b2tlbiByZXRyeSBjb3VudCBsaW1pdFxuICAgICAgfVxuXG4gICAgICAvLyBCYXNlIGNhc2VcbiAgICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCArIDEgPj0gdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5Q291bnQpIHtcbiAgICAgICAgaWYgKGdldENoYXRUb2tlbkVycm9yICYmIGdldENoYXRUb2tlbkVycm9yLmNvZGUgPT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChnZXRDaGF0VG9rZW5FcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHVudGlsIGl0IHJlYWNoZXMgaXRzIGxpbWl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDaGF0VG9rZW4ocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQgKyAxKS50aGVuKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgICB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUywgXCJHZXQgUmVjb25uZWN0YWJsZSBjaGF0IFN0YXJ0ZWRcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RhYmxlQ2hhdHNcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgcmVjb25uZWN0YWJsZSBjaGF0cyByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUywgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBpbiB0aGUgb2xkIHNlc3Npb25zIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkocmVjb25uZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8UmVjb25uZWN0QXZhaWxhYmlsaXR5IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdGFibGUgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVjb25uZWN0SWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdEF2YWlsYWJpbGl0eVxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IHN1Y2NlZWRlZFwiLCB1bmRlZmluZWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLldBUk4sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IGRpZG4ndCBzZW5kIGFueSB2YWxpZCBkYXRhXCIsIHVuZGVmaW5lZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRBZ2VudEF2YWlsYWJpbGl0eVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGNvbnN0IGNhY2hPYmogPSB7XG4gICAgICBcIm9yZ0lkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLFxuICAgICAgXCJ3aWRnZXRJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZFxuICAgIH1cblxuICAgIGlmIChkYXRhICYmIGRhdGEuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgIGNvbnN0IHRlbXBBcnIgPSBDdXN0b21Db250ZXh0RGF0YS5zb3J0KGRhdGEuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7IFwiY3VzdG9tQ29udGV4dFwiOiB0ZW1wQXJyIH0pO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnBvcnRhbGNvbnRhY3RpZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7IFwicG9ydGFsY29udGFjdGlkXCI6IGRhdGEucG9ydGFsY29udGFjdGlkIH0pO1xuICAgIH1cblxuICAgIGRhdGEuY2FjaGVLZXkgPSBoYXNoLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShKU09OLnN0cmluZ2lmeShjYWNoT2JqKSkuZGlnZXN0KCdoZXgnKS50b1N0cmluZygpO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRBZ2VudEF2YWlsYWJpbGl0eVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCAgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIHNlc3Npb24gdG8gb21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uSW5pdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNUQVJURUQsIFwiU2Vzc2lvbiBJbml0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uSW5pdCxcbiAgICAgIHNob3VsZFJldHJ5OiBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlcixcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtKSB7XG4gICAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCwgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgZGF0YSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsIFwiU2Vzc2lvbiBJbml0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIGRhdGEpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gY2xvc2UgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25DbG9zZShyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNUQVJURUQsIFwiU2Vzc2lvbiBDbG9zZSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2Vzc2lvbkNsb3NlXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGlzUmVjb25uZWN0Q2hhdCwgaXNQZXJzaXN0ZW50Q2hhdCwgY2hhdElkIH0gPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNVQ0NFRURFRCwgXCJTZXNzaW9uIENsb3NlIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3IgOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VGQUlMRUQsIFwiU2Vzc2lvbiBjbG9zZSBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBhdXRoIGNoYXQgcmVjb3JkIGV4aXN0cyBpbiBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZChyZXF1ZXN0SWQ6IHN0cmluZywgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCB9ID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFxuICAgIH0pO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmIChyZXNwb25zZS5kYXRhPy5hdXRoQ2hhdEV4aXN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB9IGNhdGNoIChlcnJvciA6IGFueSkge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvci50b1N0cmluZygpID09PSBcIkVycm9yOiBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDQwNFwiKSB7IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCBcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zdWJtaXRQb3N0Q2hhdFJlc3BvbnNlXG4gICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdENoYXRSZXNwb25zZSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVELCBcIlN1Ym1pdCBQb3N0IENoYXQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVEZBSUxFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3VydmV5SW52aXRlTGluayhzdXJ2ZXlPd25lcklkOiBzdHJpbmcsIHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5OiBvYmplY3QsIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtczogSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCxcbiAgICAgICAgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sXG4gICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0U3VydmV5SW52aXRlTGlua1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SWQgfSA9IGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0U3VydmV5SW52aXRlTGlua1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBjaGF0SWQgQ2hhdCB0aHJlYWQgSWQuXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUcmFuc2NyaXB0cyhyZXF1ZXN0SWQ6IHN0cmluZywgY2hhdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiB9ID0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYWlsIHRyYW5zY3JpcHQgdG8gY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBlbWFpbFJlcXVlc3RCb2R5IEVtYWlsIHJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGVtYWlsIHRyYW5zY3JpcHQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1haWxUcmFuc2NyaXB0KHJlcXVlc3RJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBlbWFpbFJlcXVlc3RCb2R5OiBvYmplY3QsIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zOiBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVEFSVEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGVtYWlsUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmVtYWlsVHJhbnNjcmlwdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGRhdGEgbWFza2luZyBpbmZvIG9mIHRoZSBvcmcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhTWFza2luZ0luZm8ocmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPElEYXRhTWFza2luZ0luZm8+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZmV0Y2hEYXRhTWFza2luZ0luZm9cbiAgICB9KTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmZldGNoRGF0YU1hc2tpbmdJbmZvXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVELCBcIkZldGNoIERhdGEgTWFza2luZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HRkFJTEVELCBcIkZldGNoIERhdGEgTWFza2luZyBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIHJlcXVlc3RQYXRoICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsICBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VuZCB0eXBpbmcgaW5kaWNhdG9yXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUeXBpbmdJbmRpY2F0b3IocmVxdWVzdElkOiBzdHJpbmcsIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb246IG51bWJlciwgc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zOiBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBhdm9pZGluZyBsb2dnaW5nIEluZm8gZm9yIHR5cGluZ2luZGljYXRvciB0byByZWR1Y2UgbG9nIHRyYWZmaWNcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGN1c3RvbWVyRGlzcGxheU5hbWUgfSA9IHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcztcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7IHRocm93IG5ldyBFcnJvcignVHlwaW5nIGluZGljYXRvciBpcyBvbmx5IHN1cHBvcnRlZCBvbiB2MicpIH1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5TZW5kVHlwaW5nSW5kaWNhdG9yUGF0aH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICBoZWFkZXJzW0NvbnN0YW50cy5jdXN0b21lckRpc3BsYXlOYW1lXSA9IGN1c3RvbWVyRGlzcGxheU5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2VuZFR5cGluZ0luZGljYXRvclxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGxvZ0xldmVsIExvZyBsZXZlbCBmb3IgbG9nZ2luZy5cbiAgICogQHBhcmFtIHRlbGVtZXRyeUV2ZW50VHlwZSBUZWxlbWV0cnkgZXZlbnQgdHlwZSBpbiB3aGljaCBldmVudCB3aWxsIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0IElEXG4gICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZVxuICAgKiBAcGFyYW0gZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyBFbGFwc2VkIHRpbWUgaW4gbXNcbiAgICogQHBhcmFtIHJlcXVlc3RQYXRoIFJlcXVlc3QgcGF0aFxuICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZFxuICAgKiBAcGFyYW0gZXJyb3IgRXJyb3JcbiAgICogQHBhcmFtIGRhdGEgRGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dXaXRoTG9nZ2VyKGxvZ0xldmVsOiBMb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlOiBPQ1NES1RlbGVtZXRyeUV2ZW50LCBkZXNjcmlwdGlvbjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcsIHJlc3BvbnNlPzogQXhpb3NSZXNwb25zZTxhbnk+LCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyLCByZXF1ZXN0UGF0aD86IHN0cmluZywgbWV0aG9kPzogc3RyaW5nLCBlcnJvcj86IHVua25vd24sIHJlcXVlc3RQYXlsb2FkPzogYW55KTogdm9pZCB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGlmICghdGhpcy5sb2dnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcXVlc3RQYXlsb2FkKSB7XG4gICAgICBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHsgLi4ucmVxdWVzdFBheWxvYWQgfTtcbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUHJlQ2hhdFJlc3BvbnNlKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwR2VvbG9jYXRpb24oc2FuaXRpemVkUmVxdWVzdFBheWxvYWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgIFJlZ2lvbjogcmVzcG9uc2U/LmRhdGEuUmVnaW9uLFxuICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlPy5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSxcbiAgICAgIFJlcXVlc3RQYXRoOiByZXF1ZXN0UGF0aCxcbiAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiBlcnJvciA/IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsXG4gICAgICBSZXF1ZXN0UGF5bG9hZDogc2FuaXRpemVkUmVxdWVzdFBheWxvYWRcbiAgICB9O1xuICAgIHRoaXMubG9nZ2VyLmxvZyhsb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlLCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldEF1dGhDb2RlTm9uY2UgPSAoaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2UpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlID0gaGVhZGVycz8uYXV0aGNvZGVub25jZTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldFNlc3Npb25JZEhlYWRlciA9IChzZXNzaW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkXSA9IHNlc3Npb25JZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
2512
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwic2Vzc2lvbklkIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9jU2Vzc2lvbklkIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwib2NVc2VyQWdlbnQiLCJsaXZlQ2hhdFZlcnNpb24iLCJMaXZlQ2hhdFZlcnNpb24iLCJWMiIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZ1dpdGhMb2dnZXIiLCJMb2dMZXZlbCIsIklORk8iLCJPQ1NES1RlbGVtZXRyeUV2ZW50IiwiR0VUTENXRkNTREVUQUlMU1NUQVJURUQiLCJyZXF1ZXN0UGF0aCIsIk9tbmljaGFubmVsRW5kcG9pbnRzIiwiTGN3RmNzRGV0YWlsc1BhdGgiLCJvcmdJZCIsIm1ldGhvZCIsInVybCIsIm9yZ1VybCIsImF4aW9zSW5zdGFuY2UiLCJheGlvcyIsImNyZWF0ZSIsInJldHJpZXMiLCJtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSIsIndhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzIiwid2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZyIsImdldENoYXRDb25maWciLCJyZXF1ZXN0SGVhZGVycyIsImdldCIsInRpbWVvdXQiLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXQiLCJyZXF1ZXN0VGltZW91dENvbmZpZyIsInJlc3BvbnNlIiwiZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIm1pbGxpU2Vjb25kc0VsYXBzZWQiLCJkYXRhIiwiR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCIsInVuZGVmaW5lZCIsIkdFVExDV0ZDU0RFVEFJTFNGQUlMRUQiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsIkdFVENIQVRDT05GSUdGU1RBUlRFRCIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIndpZGdldElkIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiR0VUQ0hBVENPTkZJR1NVQ0NFRURFRCIsIkdFVENIQVRDT05GSUdGQUlMRUQiLCJQcm9taXNlIiwicmVqZWN0IiwiZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIiwiR0VUTFdJU1RBVFVTU1RBUlRFRCIsIkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJoZWFkZXJPdmVyd3JpdGVzIiwiZ2V0TFdJRGV0YWlscyIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJzZXRTZXNzaW9uSWRIZWFkZXIiLCJ1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0iLCJwYXJhbXMiLCJzaWciLCJvcHRpb25zIiwicmVzb2x2ZSIsInNldEF1dGhDb2RlTm9uY2UiLCJHRVRMV0lTVEFUVVNTVUNDRUVERUQiLCJFUlJPUiIsIkdFVExXSVNUQVRVU0ZBSUxFRCIsImF4aW9zVGltZW91dEVycm9yQ29kZSIsImdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIiwiY3VycmVudFJldHJ5Q291bnQiLCJjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIiwicmVmcmVzaFRva2VuIiwiR0VUQ0hBVFRPS0VOU1RBUlRFRCIsImVuZHBvaW50IiwiZ2V0Q2hhdFRva2VuIiwicmV0cnlPbjQyOSIsImdldENoYXRUb2tlblJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5FcnJvciIsInRvTG93ZXJDYXNlIiwiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEIiwic3RhdHVzIiwibm9Db250ZW50U3RhdHVzQ29kZSIsIkdFVENIQVRUT0tFTkZBSUxFRCIsInRvb01hbnlSZXF1ZXN0c1N0YXR1c0NvZGUiLCJnZXRDaGF0VG9rZW5SZXRyeUNvdW50IiwiY29kZSIsInNldFRpbWVvdXQiLCJ0aGVuIiwiZXJyb3IiLCJnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUiLCJyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBQkxFQ0hBVFMiLCJMaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGgiLCJnZXRSZWNvbm5lY3RhYmxlQ2hhdHMiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFkiLCJMaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGgiLCJnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkiLCJXQVJOIiwicXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCIsIkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aCIsImdldEFnZW50QXZhaWxhYmlsaXR5IiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0IiwiY2FjaE9iaiIsImN1c3RvbUNvbnRleHREYXRhIiwidGVtcEFyciIsIkN1c3RvbUNvbnRleHREYXRhIiwic29ydCIsImFzc2lnbiIsInBvcnRhbGNvbnRhY3RpZCIsImNhY2hlS2V5IiwiaGFzaCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlnZXN0IiwidG9TdHJpbmciLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRlZmF1bHRMb2NhbGUiLCJMb2NhbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwic2Vzc2lvbkluaXQiLCJzaG91bGRSZXRyeSIsInNlc3Npb25Jbml0UmV0cnlIYW5kbGVyIiwiTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGgiLCJTRVNTSU9OSU5JVFNVQ0NFRURFRCIsIlNFU1NJT05JTklURkFJTEVEIiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwic2Vzc2lvbkNsb3NlIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCIsIkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGgiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQiLCJhdXRoQ2hhdEV4aXN0IiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQiLCJwb3N0Q2hhdFJlc3BvbnNlIiwic3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIiwiU1VCTUlUUE9TVENIQVRTVEFSVEVEIiwiTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGgiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlIiwiTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRoIiwiU1VCTUlUUE9TVENIQVRTVUNDRUVERUQiLCJTVUJNSVRQT1NUQ0hBVEZBSUxFRCIsInN1cnZleU93bmVySWQiLCJzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSIsImdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyIsImxvZyIsIkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVEIiwiU3VydmV5T3duZXJJZCIsIkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJnZXRTdXJ2ZXlJbnZpdGVMaW5rIiwiTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJ3aWRnZXRBcHBJZCIsIkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVEIiwidG9rZW4iLCJnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyIsIkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzIiwib3JnYW5pemF0aW9uSWQiLCJhdXRob3JpemF0aW9uIiwiTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJHRVRDSEFUVFJBTlNDUklQVEZBSUxFRCIsImVtYWlsUmVxdWVzdEJvZHkiLCJlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyIsIkVNQUlMVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiZW1haWxUcmFuc2NyaXB0IiwiTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJFTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJFTUFJTFRSQU5TQ1JJUFRGQUlMRUQiLCJGRVRDSERBVEFNQVNLSU5HU1RBUlRFRCIsIkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRoIiwiZmV0Y2hEYXRhTWFza2luZ0luZm8iLCJGRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVEIiwiRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCIsInNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5Iiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCIsIkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsIm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0IiwiTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsImRlZmF1bHRDaGFubmVsSWQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVEIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCIsInNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyIsImN1c3RvbWVyRGlzcGxheU5hbWUiLCJTZW5kVHlwaW5nSW5kaWNhdG9yUGF0aCIsInNlbmRUeXBpbmdJbmRpY2F0b3IiLCJTRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVEIiwiU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCIsImxvZ0xldmVsIiwidGVsZW1ldHJ5RXZlbnRUeXBlIiwiZGVzY3JpcHRpb24iLCJyZXF1ZXN0UGF5bG9hZCIsIkxvZ2dpbmdTYW5pdGl6ZXIiLCJzdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyIsInNhbml0aXplZFJlcXVlc3RQYXlsb2FkIiwic3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyIsInByZUNoYXRSZXNwb25zZSIsInN0cmlwUHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBHZW9sb2NhdGlvbiIsInNhbml0aXplZFJlcXVlc3RIZWFkZXJzIiwic3RyaXBSZXF1ZXN0SGVhZGVyc1NlbnNpdGl2ZVByb3BlcnRpZXMiLCJjdXN0b21EYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJ0cmFuc2FjdGlvbmlkIiwiUmVxdWVzdFBhdGgiLCJSZXF1ZXN0TWV0aG9kIiwiUmVzcG9uc2VTdGF0dXNDb2RlIiwiRXhjZXB0aW9uRGV0YWlscyIsIlJlcXVlc3RQYXlsb2FkIiwiUmVxdWVzdEhlYWRlcnMiLCJzdWJzdHJpbmciLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWciLCJ3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBT0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFcUJBLEc7QUFxQ25CLGVBQTJCQyx3QkFBM0IsRUFBbUw7QUFBQTs7QUFBQSxRQUEzRkMsYUFBMkYsdUVBQXhERixHQUFHLENBQUNHLG9CQUFvRDtBQUFBLFFBQXRCQyxNQUFzQjtBQUFBO0FBQUEsU0FBeEpILHdCQUF3SixHQUF4SkEsd0JBQXdKO0FBQUEsU0FBM0ZDLGFBQTJGLEdBQTNGQSxhQUEyRjtBQUFBLFNBQXRCRSxNQUFzQixHQUF0QkEsTUFBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQSwrREFtd0N4SixVQUFDQyxPQUFELEVBQWtCO0FBQzNDLFVBQUlBLE9BQUosYUFBSUEsT0FBSixlQUFJQSxPQUFPLENBQUVDLGFBQWIsRUFBNEI7QUFDMUIsUUFBQSxLQUFJLENBQUNKLGFBQUwsQ0FBbUJLLGFBQW5CLEdBQW1DRixPQUFuQyxhQUFtQ0EsT0FBbkMsdUJBQW1DQSxPQUFPLENB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O0FBSWpFbUUsRUFBQUEsV0FBVyxFQUFFLEtBSm9EO0FBS2pFVSxFQUFBQSxZQUFZLEVBQUUsS0FMbUQ7QUFNakUxRCxFQUFBQSxxQkFBcUIsRUFBRSxLQU4wQztBQU9qRUcsRUFBQUEsd0JBQXdCLEVBQUUsS0FQdUM7QUFRakUwRSxFQUFBQSxzQkFBc0IsRUFBRSxLQVJ5QztBQVNqRVcsRUFBQUEsbUJBQW1CLEVBQUUsS0FUNEM7QUFVakVTLEVBQUFBLGtCQUFrQixFQUFFLEtBVjZDO0FBV2pFWSxFQUFBQSxlQUFlLEVBQUUsSUFYZ0Q7QUFZakVNLEVBQUFBLG9CQUFvQixFQUFFLElBWjJDO0FBYWpFTyxFQUFBQSxnQ0FBZ0MsRUFBRSxLQWIrQjtBQWNqRWxILEVBQUFBLG9CQUFvQixFQUFFLEtBZDJDO0FBZWpFMEgsRUFBQUEsbUJBQW1CLEVBQUUsSUFmNEM7QUFnQmpFN0QsRUFBQUEsNkJBQTZCLEVBQUU7QUFoQmtDLEM7aUNBRGhEM0wsRywwQkFvQnNDO0FBQ3ZETyxFQUFBQSxhQUFhLEVBQUUsb0JBQVM2USxTQUFULENBQW1CLENBQW5CLEVBQXNCLENBQXRCLENBRHdDO0FBRXZEdkssRUFBQUEsc0JBQXNCLEVBQUUsRUFGK0I7QUFHdkRLLEVBQUFBLHVDQUF1QyxFQUFFLEtBSGM7QUFJdkRiLEVBQUFBLHNCQUFzQixFQUFFLEtBSitCO0FBS3ZEdEQsRUFBQUEsMEJBQTBCLEVBQUUsQ0FMMkI7QUFNdkRPLEVBQUFBLHFCQUFxQixFQUFFTyxTQU5nQztBQU92RE4sRUFBQUEsb0JBQW9CLEVBQUV2RCxHQUFHLENBQUNxUiwyQkFQNkI7QUFRdkRsTSxFQUFBQSxpQ0FBaUMsRUFBRSxLQVJvQjtBQVN2RGxDLEVBQUFBLDRCQUE0QixFQUFFcU8sNERBVHlCO0FBVXZEOVAsRUFBQUEsV0FBVyxFQUFFO0FBVjBDLEMiLCJzb3VyY2VSb290Ijoib2NzZGs6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaGFzaCBmcm9tIFwiY3J5cHRvXCI7XG5cbmltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uLCBPQ1NES1RlbGVtZXRyeUV2ZW50IH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnLCBBeGlvc1Jlc3BvbnNlIH0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBCcm93c2VySW5mbyB9IGZyb20gXCIuL1V0aWxzL0Jyb3dzZXJJbmZvXCI7XG5pbXBvcnQgQ29uc3RhbnRzIGZyb20gXCIuL0NvbW1vbi9Db25zdGFudHNcIjtcbmltcG9ydCB7IEN1c3RvbUNvbnRleHREYXRhIH0gZnJvbSBcIi4vVXRpbHMvQ3VzdG9tQ29udGV4dERhdGFcIjtcbmltcG9ydCB7IERldmljZUluZm8gfSBmcm9tIFwiLi9VdGlscy9EZXZpY2VJbmZvXCI7XG5pbXBvcnQgRmV0Y2hDaGF0VG9rZW5SZXNwb25zZSBmcm9tIFwiLi9Nb2RlbC9GZXRjaENoYXRUb2tlblJlc3BvbnNlXCI7XG5pbXBvcnQgSURhdGFNYXNraW5nSW5mbyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lEYXRhTWFza2luZ0luZm9cIjtcbmltcG9ydCBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JT21uaWNoYW5uZWxDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXNcIjtcbmltcG9ydCBJU0RLIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES1wiO1xuaW1wb3J0IElTREtDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES0NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtc1wiXG5pbXBvcnQgSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJbml0Q29udGV4dCBmcm9tIFwiLi9Nb2RlbC9Jbml0Q29udGV4dFwiO1xuaW1wb3J0IExvY2FsZXMgZnJvbSBcIi4vQ29tbW9uL0xvY2FsZXNcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vTW9kZWwvTG9nTGV2ZWxcIjtcbmltcG9ydCB7IExvZ2dpbmdTYW5pdGl6ZXIgfSBmcm9tIFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCI7XG5pbXBvcnQgT0NTREtMb2dnZXIgZnJvbSBcIi4vQ29tbW9uL09DU0RLTG9nZ2VyXCI7XG5pbXBvcnQgeyBPU0luZm8gfSBmcm9tIFwiLi9VdGlscy9PU0luZm9cIjtcbmltcG9ydCBPbW5pY2hhbm5lbEVuZHBvaW50cyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciBmcm9tIFwiLi9JbnRlcmZhY2VzL09tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXJcIjtcbmltcG9ydCBRdWV1ZUF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9RdWV1ZUF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdEF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIGZyb20gXCIuL01vZGVsL1JlY29ubmVjdE1hcHBpbmdSZWNvcmRcIjtcbmltcG9ydCB7IFJlcXVlc3RUaW1lb3V0Q29uZmlnIH0gZnJvbSBcIi4vQ29tbW9uL1JlcXVlc3RUaW1lb3V0Q29uZmlnXCI7XG5pbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi9Db21tb24vTWFwcGluZ3NcIjtcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIi4vVXRpbHMvVGltZXJcIjtcbmltcG9ydCBheGlvc1JldHJ5IGZyb20gXCIuL1V0aWxzL2F4aW9zUmV0cnlcIjtcbmltcG9ydCB7IGNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50IH0gZnJvbSBcIi4vVXRpbHMvZW5kcG9pbnRzQ3JlYXRvcnNcIjtcbmltcG9ydCBpc0V4cGVjdGVkQXhpb3NFcnJvciBmcm9tIFwiLi9VdGlscy9pc0V4cGVjdGVkQXhpb3NFcnJvclwiO1xuaW1wb3J0IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyIGZyb20gXCIuL1V0aWxzL1Nlc3Npb25Jbml0UmV0cnlIYW5kbGVyXCI7XG5pbXBvcnQgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yIGZyb20gXCIuL1V0aWxzL3Rocm93Q2xpZW50SFRUUEVycm9yXCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9VdGlscy91dWlkXCI7XG5pbXBvcnQgeyB3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyB9IGZyb20gXCIuL1V0aWxzL3dhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzXCI7XG5pbXBvcnQgeyBhZGRPY1VzZXJBZ2VudEhlYWRlciB9IGZyb20gXCIuL1V0aWxzL2h0dHBIZWFkZXJzVXRpbHNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMzAwMDAsXG4gICAgZ2V0TFdJRGV0YWlsczogMTUwMDAsXG4gICAgZ2V0Q2hhdFRva2VuOiAxNTAwMCxcbiAgICBzZXNzaW9uSW5pdDogMTUwMDAsXG4gICAgc2Vzc2lvbkNsb3NlOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RhYmxlQ2hhdHM6IDE1MDAwLFxuICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc3VibWl0UG9zdENoYXRSZXNwb25zZTogMTUwMDAsXG4gICAgZ2V0U3VydmV5SW52aXRlTGluazogMTUwMDAsXG4gICAgZ2V0Q2hhdFRyYW5zY3JpcHRzOiAzMDAwMCxcbiAgICBlbWFpbFRyYW5zY3JpcHQ6IDUwMDAsXG4gICAgZmV0Y2hEYXRhTWFza2luZ0luZm86IDUwMDAsXG4gICAgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3Q6IDE1MDAwLFxuICAgIGdldEFnZW50QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICBzZW5kVHlwaW5nSW5kaWNhdG9yOiA1MDAwLFxuICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiAxNTAwMFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRDb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IHtcbiAgICBhdXRoQ29kZU5vbmNlOiB1dWlkdjQoKS5zdWJzdHJpbmcoMCwgOCksXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMTAsXG4gICAgZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlOiAxMDAwMCxcbiAgICBnZXRDaGF0VG9rZW5SZXRyeU9uNDI5OiBmYWxzZSxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogMyxcbiAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0VGltZW91dENvbmZpZzogU0RLLmRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyxcbiAgICB1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW06IGZhbHNlLFxuICAgIHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWc6IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzLFxuICAgIG9jVXNlckFnZW50OiBbXVxuICB9O1xuXG4gIGxpdmVDaGF0VmVyc2lvbjogbnVtYmVyO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIG9jVXNlckFnZW50OiBzdHJpbmdbXTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5kaXZpZHVhbCBlbmRwb2ludFRpbWVvdXQgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9jVXNlckFnZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLm9jVXNlckFnZW50O1xuICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gTGl2ZUNoYXRWZXJzaW9uLlYyO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgTENXIEZDUyBEZXRhaWxzIG9mIHRoZSBPcmcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TGN3RmNzRGV0YWlscygpOiBQcm9taXNlPG9iamVjdCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTENXRkNTREVUQUlMU1NUQVJURUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBzdGFydGVkXCIsIFwiXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGN3RmNzRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIHN1Y2NlZWRlZFwiLCBcIlwiLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNGQUlMRUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBmYWlsZWRcIiwgXCJcIiwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjaGF0IGNvbmZpZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0Q29uZmlnKHJlcXVlc3RJZDogc3RyaW5nLCBieXBhc3NDYWNoZSA9IGZhbHNlKTogUHJvbWlzZTxvYmplY3QgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdGU1RBUlRFRCwgXCJHZXQgQ2hhdCBjb25maWcgc3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdENvbmZpZ1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9P3JlcXVlc3RJZD0ke3JlcXVlc3RJZH0mY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICB9KTtcblxuICAgIGxldCByZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmIChieXBhc3NDYWNoZSkge1xuICAgICAgcmVxdWVzdEhlYWRlcnMgPSB7IC4uLkNvbnN0YW50cy5ieXBhc3NDYWNoZUhlYWRlcnMsIC4uLnJlcXVlc3RIZWFkZXJzIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZS5nZXQodXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcblxuICAgICAgaWYgKGRhdGEuTGl2ZUNoYXRWZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gZGF0YS5MaXZlQ2hhdFZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGRhdGEuaGVhZGVycyA9IHt9O1xuICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMgJiYgcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl0pIHtcbiAgICAgICAgZGF0YS5oZWFkZXJzW1wiZGF0ZVwiXSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR1NVQ0NFRURFRCwgXCJHZXQgQ2hhdCBjb25maWcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdGQUlMRUQsIFwiR2V0IENoYXQgY29uZmlnIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1RBUlRFRCwgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0TFdJRGV0YWlsc1xuICAgIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgLy8gdXBkYXRlZCBhdXRoIGVuZHBvaW50IGZvciBhdXRoZW50aWNhdGVkIGNoYXRzIGFuZCBhZGQgYXV0aCB0b2tlbiBpbiBoZWFkZXJcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgLy8gQXBwZW5kIHJlY29ubmVjdCBpZCBvbiB0aGUgZW5kcG9pbnQgaWYgdmFpbGFibGVcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRMV0lEZXRhaWxzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1VDQ0VFREVELCBcIkdldCBMV0kgRGV0YWlscyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uLCByZWZyZXNoVG9rZW4gfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsIFwiR2V0IENoYXQgVG9rZW4gU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGN1cnJlbnRSZXRyeUNvdW50YCk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIGFzIExpdmVDaGF0VmVyc2lvbiB8fCB0aGlzLmxpdmVDaGF0VmVyc2lvbiwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA/IHRydWUgOiBmYWxzZSk7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke2VuZHBvaW50fS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtKSB7XG4gICAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9XG5cbiAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICBwYXJhbXMucmVmcmVzaFRva2VuID0gJ3RydWUnXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsIFxuICAgICAgcmV0cnlPbjQyOTogdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjksXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGxldCBnZXRDaGF0VG9rZW5FcnJvcjphbnkgPSB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgICAgICBpZiAoaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25JZCA9IGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIGNoYXQgdG9rZW4gcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVUNDRUVERUQsIFwiR2V0IENoYXQgVG9rZW4gc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VORkFJTEVELCBcIkdldCBDaGF0IFRva2VuIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBnZXRDaGF0VG9rZW5FcnJvciA9IGVycm9yO1xuXG4gICAgICAgIC8vIFN0b3AgcmV0cnkgb24gNDI5XG4gICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uc3RhdHVzID09PSBDb25zdGFudHMudG9vTWFueVJlcXVlc3RzU3RhdHVzQ29kZSAmJiAhdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyByZXR1cm4vcmVqZWN0IHRvIHJlY3Vyc2l2ZWx5IHJldHJ5IG9uIGZhaWx1cmVzIHVwIHRvIGNoYXQgdG9rZW4gcmV0cnkgY291bnQgbGltaXRcbiAgICAgIH1cblxuICAgICAgLy8gQmFzZSBjYXNlXG4gICAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgKyAxID49IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50KSB7XG4gICAgICAgIGlmIChnZXRDaGF0VG9rZW5FcnJvciAmJiBnZXRDaGF0VG9rZW5FcnJvci5jb2RlID09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZ2V0Q2hhdFRva2VuRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0cmllcyB1bnRpbCBpdCByZWFjaGVzIGl0cyBsaW1pdFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0Q2hhdFRva2VuKHJlcXVlc3RJZCwgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMsIGN1cnJlbnRSZXRyeUNvdW50ICsgMSkudGhlbigocmVzcG9uc2UpID0+IHJlc29sdmUocmVzcG9uc2UpKS5jYXRjaCgoZXJyb3IpID0+IHJlamVjdChlcnJvcikpO1xuICAgICAgfSwgdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RhYmxlQ2hhdHMocmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zOiBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zKTogUHJvbWlzZTxSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0YWJsZUNoYXRzXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIHJlY29ubmVjdGFibGUgY2hhdHMgcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgU3VjY2VlZGVkIGFuZCBvbGQgc2Vzc2lvbiByZXR1cm5lZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgaW4gdGhlIG9sZCBzZXNzaW9ucyBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eSB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3RhYmxlIGF2YWlsYWJpbGl0eSBTdGFydGVkXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlY29ubmVjdElkfWA7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHVuZGVmaW5lZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5XQVJOLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YVwiLCB1bmRlZmluZWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRBZ2VudEF2YWlsYWJpbGl0eVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgY29uc3QgY2FjaE9iaiA9IHtcbiAgICAgIFwib3JnSWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsXG4gICAgICBcIndpZGdldElkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgY29uc3QgdGVtcEFyciA9IEN1c3RvbUNvbnRleHREYXRhLnNvcnQoZGF0YS5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJjdXN0b21Db250ZXh0XCI6IHRlbXBBcnIgfSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEucG9ydGFsY29udGFjdGlkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJwb3J0YWxjb250YWN0aWRcIjogZGF0YS5wb3J0YWxjb250YWN0aWQgfSk7XG4gICAgfVxuXG4gICAgZGF0YS5jYWNoZUtleSA9IGhhc2guY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS5kaWdlc3QoJ2hleCcpLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRBZ2VudEF2YWlsYWJpbGl0eVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsICBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGEgc2Vzc2lvbiB0byBvbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25Jbml0KHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCwgXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25Jbml0LFxuICAgICAgc2hvdWxkUmV0cnk6IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyLFxuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV1cbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uSW5pdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1VDQ0VFREVELCBcIlNlc3Npb24gSW5pdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCBkYXRhLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsIFwiU2Vzc2lvbiBJbml0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIGRhdGEsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGNsb3NlIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBjbG9zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uQ2xvc2UocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVEFSVEVELCBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQsIGNoYXRJZCB9ID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsIFwiU2Vzc2lvbiBDbG9zZSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3IgOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VGQUlMRUQsIFwiU2Vzc2lvbiBjbG9zZSBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBhdXRoIGNoYXQgcmVjb3JkIGV4aXN0cyBpbiBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZChyZXF1ZXN0SWQ6IHN0cmluZywgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCB9ID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmIChyZXNwb25zZS5kYXRhPy5hdXRoQ2hhdEV4aXN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3IgOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IudG9TdHJpbmcoKSA9PT0gXCJFcnJvcjogUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSA0MDRcIikgeyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgcmVzb2x2ZSh7fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlKHJlcXVlc3RJZDogc3RyaW5nLCBwb3N0Q2hhdFJlc3BvbnNlOiBvYmplY3QsIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1RBUlRFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3RDaGF0UmVzcG9uc2UpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zdWJtaXRQb3N0Q2hhdFJlc3BvbnNlXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVUNDRUVERUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN1cnZleUludml0ZUxpbmsoc3VydmV5T3duZXJJZDogc3RyaW5nLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keTogb2JqZWN0LCBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM6IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQsXG4gICAgICAgIHsgU3VydmV5T3duZXJJZDogc3VydmV5T3duZXJJZCB9LFxuICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0U3VydmV5SW52aXRlTGlua1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCwgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdFRyYW5zY3JpcHRzXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmVtYWlsVHJhbnNjcmlwdFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkVtYWlsIFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGRhdGEgbWFza2luZyBpbmZvIG9mIHRoZSBvcmcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhTWFza2luZ0luZm8ocmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPElEYXRhTWFza2luZ0luZm8+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZmV0Y2hEYXRhTWFza2luZ0luZm9cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmZldGNoRGF0YU1hc2tpbmdJbmZvXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVELCBcIkZldGNoIERhdGEgTWFza2luZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnQgbmV0d29yayBjYWxsIHRvIE9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSBzZWNvbmRhcnlDaGFubmVsIGV2ZW50IHJlcXVlc3QgYm9keVxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0KHJlcXVlc3RJZDogc3RyaW5nLCBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keTogb2JqZWN0LCBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtczogSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICByZXF1ZXN0UGF0aCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5tYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTZW5kIHR5cGluZyBpbmRpY2F0b3JcbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFR5cGluZ0luZGljYXRvcihyZXF1ZXN0SWQ6IHN0cmluZywgY3VycmVudExpdmVDaGF0VmVyc2lvbjogbnVtYmVyLCBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM6IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIGF2b2lkaW5nIGxvZ2dpbmcgSW5mbyBmb3IgdHlwaW5naW5kaWNhdG9yIHRvIHJlZHVjZSBsb2cgdHJhZmZpY1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgY3VzdG9tZXJEaXNwbGF5TmFtZSB9ID0gc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHsgdGhyb3cgbmV3IEVycm9yKCdUeXBpbmcgaW5kaWNhdG9yIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHYyJykgfVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRofS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBpZiAoY3VzdG9tZXJEaXNwbGF5TmFtZSkge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbQ29uc3RhbnRzLmN1c3RvbWVyRGlzcGxheU5hbWVdID0gY3VzdG9tZXJEaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZW5kVHlwaW5nSW5kaWNhdG9yXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGxvZ2dpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBsb2dMZXZlbCBMb2cgbGV2ZWwgZm9yIGxvZ2dpbmcuXG4gICAqIEBwYXJhbSB0ZWxlbWV0cnlFdmVudFR5cGUgVGVsZW1ldHJ5IGV2ZW50IHR5cGUgaW4gd2hpY2ggZXZlbnQgd2lsbCBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdCBJRFxuICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2VcbiAgICogQHBhcmFtIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgRWxhcHNlZCB0aW1lIGluIG1zXG4gICAqIEBwYXJhbSByZXF1ZXN0UGF0aCBSZXF1ZXN0IHBhdGhcbiAgICogQHBhcmFtIG1ldGhvZCBNZXRob2RcbiAgICogQHBhcmFtIGVycm9yIEVycm9yXG4gICAqIEBwYXJhbSBkYXRhIERhdGFcbiAgICovXG4gIHByaXZhdGUgbG9nV2l0aExvZ2dlcihsb2dMZXZlbDogTG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZTogT0NTREtUZWxlbWV0cnlFdmVudCwgZGVzY3JpcHRpb246IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nLCByZXNwb25zZT86IEF4aW9zUmVzcG9uc2U8YW55PiwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcz86IG51bWJlciwgcmVxdWVzdFBhdGg/OiBzdHJpbmcsIG1ldGhvZD86IHN0cmluZywgZXJyb3I/OiB1bmtub3duLCByZXF1ZXN0UGF5bG9hZD86IGFueSwgcmVxdWVzdEhlYWRlcnM/OiBhbnkpOiB2b2lkIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0geyAuLi5yZXF1ZXN0UGF5bG9hZCB9O1xuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2Uoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbihzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCk7XG4gICAgfVxuXG4gICAgbGV0IHNhbml0aXplZFJlcXVlc3RIZWFkZXJzID0gdW5kZWZpbmVkO1xuICAgIGlmIChyZXF1ZXN0SGVhZGVycykge1xuICAgICAgc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMgPSB7IC4uLnJlcXVlc3RIZWFkZXJzIH07XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUmVxdWVzdEhlYWRlcnNTZW5zaXRpdmVQcm9wZXJ0aWVzKHNhbml0aXplZFJlcXVlc3RIZWFkZXJzKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICBSZWdpb246IHJlc3BvbnNlPy5kYXRhLlJlZ2lvbixcbiAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICBUcmFuc2FjdGlvbklkOiByZXNwb25zZT8uaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0sXG4gICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uc3RhdHVzIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLFxuICAgICAgUmVxdWVzdFBheWxvYWQ6IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLFxuICAgICAgUmVxdWVzdEhlYWRlcnM6IHNhbml0aXplZFJlcXVlc3RIZWFkZXJzXG4gICAgfTtcbiAgICB0aGlzLmxvZ2dlci5sb2cobG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZSwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzZXRBdXRoQ29kZU5vbmNlID0gKGhlYWRlcnM6IGFueSkgPT4ge1xuICAgIGlmIChoZWFkZXJzPy5hdXRoY29kZW5vbmNlKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSA9IGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2U7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzZXRTZXNzaW9uSWRIZWFkZXIgPSAoc2Vzc2lvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGhlYWRlcnM6IGFueSkgPT4ge1xuICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZF0gPSBzZXNzaW9uSWQ7XG4gICAgfVxuICB9XG59XG4iXX0=