@microsoft/ocsdk 0.3.1-main.b56c728 → 0.3.1-main.b5fd74f
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/CHANGELOG.md +9 -0
- package/dist/SDK.js +52897 -1774
- package/dist/SDK.min.js +14 -1
- package/lib/Common/Constants.d.ts +2 -0
- package/lib/Common/Constants.js +3 -1
- package/lib/Common/Constants.js.map +1 -1
- package/lib/Common/Enums.d.ts +3 -3
- package/lib/Common/Enums.js +4 -4
- package/lib/Common/OmnichannelEndpoints.d.ts +1 -1
- package/lib/Common/OmnichannelEndpoints.js +2 -2
- package/lib/Interfaces/IAxiosRetryOptions.d.ts +4 -0
- package/lib/Interfaces/ISDK.d.ts +1 -1
- package/lib/Interfaces/ISDKConfiguration.d.ts +6 -1
- package/lib/Model/IOCSDKLogData.d.ts +3 -0
- package/lib/Model/InitContext.d.ts +5 -0
- package/lib/Model/InitContext.js +4 -1
- package/lib/Model/InitContext.js.map +1 -1
- package/lib/SDK.d.ts +1 -1
- package/lib/SDK.js +475 -386
- package/lib/SDK.js.map +1 -1
- package/lib/Utils/CustomContextData.d.ts +5 -0
- package/lib/Utils/CustomContextData.js +57 -0
- package/lib/Utils/CustomContextData.js.map +1 -0
- package/lib/Utils/LoggingSanitizer.d.ts +3 -0
- package/lib/Utils/LoggingSanitizer.js +67 -5
- package/lib/Utils/LoggingSanitizer.js.map +1 -1
- package/lib/Utils/TelemetryHelper.js +8 -3
- package/lib/Utils/TelemetryHelper.js.map +1 -1
- package/lib/Utils/axiosRetry.js +24 -3
- package/lib/Utils/axiosRetry.js.map +1 -1
- package/lib/Utils/sleep.d.ts +2 -0
- package/lib/Utils/sleep.js +16 -0
- package/lib/Utils/sleep.js.map +1 -0
- package/package.json +2 -2
package/lib/SDK.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
+
var _typeof3 = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
5
7
|
Object.defineProperty(exports, "__esModule", {
|
|
6
8
|
value: true
|
|
7
9
|
});
|
|
@@ -47,6 +49,14 @@ var _axiosRetry = _interopRequireDefault(require("./Utils/axiosRetry"));
|
|
|
47
49
|
|
|
48
50
|
var _uuid = require("./Utils/uuid");
|
|
49
51
|
|
|
52
|
+
var hash = _interopRequireWildcard(require("crypto"));
|
|
53
|
+
|
|
54
|
+
var _CustomContextData = require("./Utils/CustomContextData");
|
|
55
|
+
|
|
56
|
+
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); }
|
|
57
|
+
|
|
58
|
+
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; }
|
|
59
|
+
|
|
50
60
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
51
61
|
|
|
52
62
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
@@ -78,7 +88,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
78
88
|
|
|
79
89
|
if (!this.configuration.hasOwnProperty(key)) {
|
|
80
90
|
// eslint-disable-line no-prototype-builtins
|
|
81
|
-
|
|
91
|
+
this.configuration["".concat(key)] = SDK.defaultConfiguration["".concat(key)];
|
|
82
92
|
}
|
|
83
93
|
} // Validate channelId
|
|
84
94
|
|
|
@@ -365,8 +375,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
365
375
|
reconnectId,
|
|
366
376
|
authenticatedUserToken,
|
|
367
377
|
currentLiveChatVersion,
|
|
378
|
+
description,
|
|
379
|
+
customData,
|
|
368
380
|
headers,
|
|
369
|
-
|
|
381
|
+
requestPath,
|
|
382
|
+
queryParams,
|
|
383
|
+
url,
|
|
384
|
+
method,
|
|
370
385
|
options,
|
|
371
386
|
axiosInstance,
|
|
372
387
|
_args5 = arguments;
|
|
@@ -381,9 +396,11 @@ var SDK = /*#__PURE__*/function () {
|
|
|
381
396
|
reconnectId = getChatTokenOptionalParams.reconnectId, authenticatedUserToken = getChatTokenOptionalParams.authenticatedUserToken, currentLiveChatVersion = getChatTokenOptionalParams.currentLiveChatVersion;
|
|
382
397
|
|
|
383
398
|
if (this.logger) {
|
|
384
|
-
|
|
399
|
+
description = "Get Chat Token Started";
|
|
400
|
+
customData = {
|
|
385
401
|
RequestId: requestId
|
|
386
|
-
}
|
|
402
|
+
};
|
|
403
|
+
this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTOKENSTARTED, customData, description);
|
|
387
404
|
}
|
|
388
405
|
|
|
389
406
|
if (!(currentRetryCount < 0)) {
|
|
@@ -399,39 +416,43 @@ var SDK = /*#__PURE__*/function () {
|
|
|
399
416
|
}
|
|
400
417
|
|
|
401
418
|
headers = _Constants["default"].defaultHeaders;
|
|
402
|
-
|
|
419
|
+
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
403
420
|
|
|
404
421
|
if (this.liveChatVersion === _Enums.LiveChatVersion.V2 || currentLiveChatVersion && currentLiveChatVersion === _Enums.LiveChatVersion.V2) {
|
|
405
|
-
|
|
422
|
+
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2GetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
406
423
|
|
|
407
424
|
if (authenticatedUserToken) {
|
|
408
|
-
|
|
425
|
+
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2AuthGetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
409
426
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
410
427
|
}
|
|
411
428
|
} else {
|
|
412
429
|
if (authenticatedUserToken) {
|
|
413
|
-
|
|
430
|
+
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
414
431
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
415
432
|
}
|
|
416
433
|
}
|
|
417
434
|
|
|
418
435
|
if (reconnectId) {
|
|
419
|
-
|
|
436
|
+
requestPath += "/".concat(reconnectId);
|
|
420
437
|
}
|
|
421
438
|
|
|
422
|
-
|
|
439
|
+
queryParams = "channelId=".concat(this.omnichannelConfiguration.channelId);
|
|
440
|
+
requestPath += "?".concat(queryParams);
|
|
441
|
+
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
442
|
+
method = "GET";
|
|
423
443
|
options = {
|
|
424
444
|
headers: headers,
|
|
425
|
-
method:
|
|
426
|
-
url:
|
|
445
|
+
method: method,
|
|
446
|
+
url: url
|
|
427
447
|
};
|
|
428
448
|
axiosInstance = _axios["default"].create();
|
|
429
449
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
430
|
-
retries: this.configuration.maxRequestRetriesOnFailure
|
|
450
|
+
retries: this.configuration.maxRequestRetriesOnFailure,
|
|
451
|
+
retryOn429: this.configuration.getChatTokenRetryOn429
|
|
431
452
|
});
|
|
432
453
|
return _context5.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
433
454
|
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(resolve, reject) {
|
|
434
|
-
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds2;
|
|
455
|
+
var response, elapsedTimeInMilliseconds, data, _customData, _description, _elapsedTimeInMilliseconds2, _customData2, _description2;
|
|
435
456
|
|
|
436
457
|
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
437
458
|
while (1) {
|
|
@@ -454,12 +475,18 @@ var SDK = /*#__PURE__*/function () {
|
|
|
454
475
|
data.requestId = requestId;
|
|
455
476
|
|
|
456
477
|
if (_this2.logger) {
|
|
457
|
-
|
|
478
|
+
_customData = {
|
|
458
479
|
RequestId: requestId,
|
|
459
480
|
Region: response.data.Region,
|
|
460
481
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
461
|
-
TransactionId: response.headers["transaction-id"]
|
|
462
|
-
|
|
482
|
+
TransactionId: response.headers["transaction-id"],
|
|
483
|
+
RequestPath: requestPath,
|
|
484
|
+
RequestMethod: method,
|
|
485
|
+
ResponseStatusCode: response.status
|
|
486
|
+
};
|
|
487
|
+
_description = "Get Chat Token Succeeded";
|
|
488
|
+
|
|
489
|
+
_this2.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTOKENSUCCEEDED, _customData, _description);
|
|
463
490
|
}
|
|
464
491
|
|
|
465
492
|
resolve(data);
|
|
@@ -475,7 +502,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
475
502
|
return _context4.abrupt("return");
|
|
476
503
|
|
|
477
504
|
case 14:
|
|
478
|
-
_context4.next =
|
|
505
|
+
_context4.next = 28;
|
|
479
506
|
break;
|
|
480
507
|
|
|
481
508
|
case 16:
|
|
@@ -484,7 +511,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
484
511
|
_elapsedTimeInMilliseconds2 = timer.milliSecondsElapsed;
|
|
485
512
|
|
|
486
513
|
if (!_this2.logger) {
|
|
487
|
-
_context4.next =
|
|
514
|
+
_context4.next = 25;
|
|
488
515
|
break;
|
|
489
516
|
}
|
|
490
517
|
|
|
@@ -492,26 +519,39 @@ var SDK = /*#__PURE__*/function () {
|
|
|
492
519
|
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context4.t0);
|
|
493
520
|
|
|
494
521
|
case 22:
|
|
495
|
-
|
|
522
|
+
_customData2 = {
|
|
496
523
|
RequestId: requestId,
|
|
497
524
|
ExceptionDetails: _context4.t0,
|
|
498
|
-
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds2
|
|
499
|
-
|
|
525
|
+
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds2,
|
|
526
|
+
RequestPath: requestPath,
|
|
527
|
+
RequestMethod: method,
|
|
528
|
+
ResponseStatusCode: _context4.t0.response.status // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
500
529
|
|
|
501
|
-
|
|
530
|
+
};
|
|
531
|
+
_description2 = "Get Chat Token Failed";
|
|
532
|
+
|
|
533
|
+
_this2.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, _customData2, _description2);
|
|
534
|
+
|
|
535
|
+
case 25:
|
|
536
|
+
if (!(_context4.t0.response.status === _Constants["default"].tooManyRequestsStatusCode && !_this2.configuration.getChatTokenRetryOn429)) {
|
|
537
|
+
_context4.next = 28;
|
|
538
|
+
break;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
502
542
|
reject(_context4.t0);
|
|
503
543
|
return _context4.abrupt("return");
|
|
504
544
|
|
|
505
|
-
case
|
|
545
|
+
case 28:
|
|
506
546
|
if (!(currentRetryCount + 1 >= _this2.configuration.getChatTokenRetryCount)) {
|
|
507
|
-
_context4.next =
|
|
547
|
+
_context4.next = 31;
|
|
508
548
|
break;
|
|
509
549
|
}
|
|
510
550
|
|
|
511
551
|
reject(new Error("The retry for getchattoken has exceeded its max value of ".concat(_this2.configuration.getChatTokenRetryCount)));
|
|
512
552
|
return _context4.abrupt("return");
|
|
513
553
|
|
|
514
|
-
case
|
|
554
|
+
case 31:
|
|
515
555
|
// Retries until it reaches its limit
|
|
516
556
|
setTimeout(function () {
|
|
517
557
|
_this2.getChatToken(requestId, getChatTokenOptionalParams, currentRetryCount + 1).then(function (response) {
|
|
@@ -521,7 +561,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
521
561
|
});
|
|
522
562
|
}, _this2.configuration.getChatTokenTimeBetweenRetriesOnFailure);
|
|
523
563
|
|
|
524
|
-
case
|
|
564
|
+
case 32:
|
|
525
565
|
case "end":
|
|
526
566
|
return _context4.stop();
|
|
527
567
|
}
|
|
@@ -534,7 +574,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
534
574
|
};
|
|
535
575
|
}()));
|
|
536
576
|
|
|
537
|
-
case
|
|
577
|
+
case 20:
|
|
538
578
|
case "end":
|
|
539
579
|
return _context5.stop();
|
|
540
580
|
}
|
|
@@ -795,15 +835,15 @@ var SDK = /*#__PURE__*/function () {
|
|
|
795
835
|
return getReconnectAvailability;
|
|
796
836
|
}()
|
|
797
837
|
/**
|
|
798
|
-
*
|
|
838
|
+
*
|
|
799
839
|
* @param requestId: RequestId to use for session init.
|
|
800
840
|
* @param queueAvailabilityOptionalParams: Optional parameters for session init.
|
|
801
841
|
*/
|
|
802
842
|
|
|
803
843
|
}, {
|
|
804
|
-
key: "
|
|
844
|
+
key: "getAgentAvailability",
|
|
805
845
|
value: function () {
|
|
806
|
-
var
|
|
846
|
+
var _getAgentAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(requestId) {
|
|
807
847
|
var _this5 = this;
|
|
808
848
|
|
|
809
849
|
var queueAvailabilityOptionalParams,
|
|
@@ -815,6 +855,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
815
855
|
getContext,
|
|
816
856
|
headers,
|
|
817
857
|
data,
|
|
858
|
+
cachObj,
|
|
859
|
+
tempArr,
|
|
818
860
|
options,
|
|
819
861
|
_args11 = arguments;
|
|
820
862
|
return _regenerator["default"].wrap(function _callee11$(_context11) {
|
|
@@ -825,12 +867,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
825
867
|
timer = _Timer.Timer.TIMER();
|
|
826
868
|
|
|
827
869
|
if (this.logger) {
|
|
828
|
-
this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.
|
|
870
|
+
this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSTARTED, {
|
|
829
871
|
RequestId: requestId
|
|
830
|
-
}, "Get
|
|
872
|
+
}, "Get agent availability started");
|
|
831
873
|
}
|
|
832
874
|
|
|
833
|
-
endpoint = "".concat(this.omnichannelConfiguration.orgUrl, "/").concat(_OmnichannelEndpoints["default"].
|
|
875
|
+
endpoint = "".concat(this.omnichannelConfiguration.orgUrl, "/").concat(_OmnichannelEndpoints["default"].GetAgentAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=lcw");
|
|
834
876
|
axiosInstance = _axios["default"].create();
|
|
835
877
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
836
878
|
retries: this.configuration.maxRequestRetriesOnFailure
|
|
@@ -843,15 +885,34 @@ var SDK = /*#__PURE__*/function () {
|
|
|
843
885
|
}
|
|
844
886
|
|
|
845
887
|
data = initContext || {};
|
|
888
|
+
cachObj = {
|
|
889
|
+
"orgId": this.omnichannelConfiguration.orgId,
|
|
890
|
+
"widgetId": this.omnichannelConfiguration.widgetId
|
|
891
|
+
};
|
|
892
|
+
|
|
893
|
+
if (data && data.customContextData) {
|
|
894
|
+
tempArr = _CustomContextData.CustomContextData.sort(data.customContextData);
|
|
895
|
+
Object.assign(cachObj, {
|
|
896
|
+
"customContext": tempArr
|
|
897
|
+
});
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
if (data.portalcontactid) {
|
|
901
|
+
Object.assign(cachObj, {
|
|
902
|
+
"portalcontactid": data.portalcontactid
|
|
903
|
+
});
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
data.cacheKey = hash.createHash('sha256').update(JSON.stringify(cachObj)).digest('hex').toString();
|
|
846
907
|
|
|
847
908
|
if (!(getContext && !window.document)) {
|
|
848
|
-
_context11.next =
|
|
909
|
+
_context11.next = 16;
|
|
849
910
|
break;
|
|
850
911
|
}
|
|
851
912
|
|
|
852
913
|
return _context11.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
|
|
853
914
|
|
|
854
|
-
case
|
|
915
|
+
case 16:
|
|
855
916
|
if (getContext) {
|
|
856
917
|
data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
|
|
857
918
|
data.device = _DeviceInfo.DeviceInfo.getDeviceType();
|
|
@@ -865,13 +926,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
865
926
|
|
|
866
927
|
|
|
867
928
|
if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
|
|
868
|
-
_context11.next =
|
|
929
|
+
_context11.next = 20;
|
|
869
930
|
break;
|
|
870
931
|
}
|
|
871
932
|
|
|
872
933
|
return _context11.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
|
|
873
934
|
|
|
874
|
-
case
|
|
935
|
+
case 20:
|
|
875
936
|
options = {
|
|
876
937
|
data: data,
|
|
877
938
|
headers: headers,
|
|
@@ -897,12 +958,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
897
958
|
|
|
898
959
|
if (_data) {
|
|
899
960
|
if (_this5.logger) {
|
|
900
|
-
_this5.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.
|
|
961
|
+
_this5.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSUCCEEDED, {
|
|
901
962
|
RequestId: requestId,
|
|
902
963
|
Region: response.data.Region,
|
|
903
964
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
904
965
|
TransactionId: response.headers["transaction-id"]
|
|
905
|
-
}, "Get
|
|
966
|
+
}, "Get agent availability Succeeded");
|
|
906
967
|
}
|
|
907
968
|
|
|
908
969
|
resolve(_data);
|
|
@@ -925,11 +986,11 @@ var SDK = /*#__PURE__*/function () {
|
|
|
925
986
|
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context10.t0);
|
|
926
987
|
|
|
927
988
|
case 15:
|
|
928
|
-
_this5.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.
|
|
989
|
+
_this5.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, {
|
|
929
990
|
RequestId: requestId,
|
|
930
991
|
ExceptionDetails: _context10.t0,
|
|
931
992
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds5
|
|
932
|
-
}, "Get
|
|
993
|
+
}, "Get agent availability failed");
|
|
933
994
|
|
|
934
995
|
case 16:
|
|
935
996
|
reject(_context10.t0);
|
|
@@ -947,7 +1008,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
947
1008
|
};
|
|
948
1009
|
}()));
|
|
949
1010
|
|
|
950
|
-
case
|
|
1011
|
+
case 22:
|
|
951
1012
|
case "end":
|
|
952
1013
|
return _context11.stop();
|
|
953
1014
|
}
|
|
@@ -955,11 +1016,11 @@ var SDK = /*#__PURE__*/function () {
|
|
|
955
1016
|
}, _callee11, this);
|
|
956
1017
|
}));
|
|
957
1018
|
|
|
958
|
-
function
|
|
959
|
-
return
|
|
1019
|
+
function getAgentAvailability(_x14) {
|
|
1020
|
+
return _getAgentAvailability.apply(this, arguments);
|
|
960
1021
|
}
|
|
961
1022
|
|
|
962
|
-
return
|
|
1023
|
+
return getAgentAvailability;
|
|
963
1024
|
}()
|
|
964
1025
|
/**
|
|
965
1026
|
* Starts a session to omnichannel.
|
|
@@ -970,32 +1031,47 @@ var SDK = /*#__PURE__*/function () {
|
|
|
970
1031
|
}, {
|
|
971
1032
|
key: "sessionInit",
|
|
972
1033
|
value: function () {
|
|
973
|
-
var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
974
|
-
var _this6 = this;
|
|
975
|
-
|
|
1034
|
+
var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(requestId) {
|
|
976
1035
|
var sessionInitOptionalParams,
|
|
977
1036
|
timer,
|
|
1037
|
+
description,
|
|
1038
|
+
customData,
|
|
978
1039
|
axiosInstance,
|
|
979
1040
|
reconnectId,
|
|
980
1041
|
authenticatedUserToken,
|
|
981
1042
|
initContext,
|
|
982
1043
|
getContext,
|
|
983
1044
|
headers,
|
|
984
|
-
|
|
1045
|
+
requestPath,
|
|
1046
|
+
queryParams,
|
|
1047
|
+
url,
|
|
985
1048
|
data,
|
|
1049
|
+
method,
|
|
986
1050
|
options,
|
|
987
|
-
|
|
988
|
-
|
|
1051
|
+
response,
|
|
1052
|
+
elapsedTimeInMilliseconds,
|
|
1053
|
+
requestPayload,
|
|
1054
|
+
_customData3,
|
|
1055
|
+
_description3,
|
|
1056
|
+
_elapsedTimeInMilliseconds6,
|
|
1057
|
+
_requestPayload,
|
|
1058
|
+
_customData4,
|
|
1059
|
+
_description4,
|
|
1060
|
+
_args12 = arguments;
|
|
1061
|
+
|
|
1062
|
+
return _regenerator["default"].wrap(function _callee12$(_context12) {
|
|
989
1063
|
while (1) {
|
|
990
|
-
switch (
|
|
1064
|
+
switch (_context12.prev = _context12.next) {
|
|
991
1065
|
case 0:
|
|
992
|
-
sessionInitOptionalParams =
|
|
1066
|
+
sessionInitOptionalParams = _args12.length > 1 && _args12[1] !== undefined ? _args12[1] : {};
|
|
993
1067
|
timer = _Timer.Timer.TIMER();
|
|
994
1068
|
|
|
995
1069
|
if (this.logger) {
|
|
996
|
-
|
|
1070
|
+
description = "Session Init Started";
|
|
1071
|
+
customData = {
|
|
997
1072
|
RequestId: requestId
|
|
998
|
-
}
|
|
1073
|
+
};
|
|
1074
|
+
this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSTARTED, customData, description);
|
|
999
1075
|
}
|
|
1000
1076
|
|
|
1001
1077
|
axiosInstance = _axios["default"].create();
|
|
@@ -1004,28 +1080,30 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1004
1080
|
});
|
|
1005
1081
|
reconnectId = sessionInitOptionalParams.reconnectId, authenticatedUserToken = sessionInitOptionalParams.authenticatedUserToken, initContext = sessionInitOptionalParams.initContext, getContext = sessionInitOptionalParams.getContext;
|
|
1006
1082
|
headers = _Constants["default"].defaultHeaders;
|
|
1007
|
-
|
|
1083
|
+
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
1008
1084
|
|
|
1009
1085
|
if (authenticatedUserToken) {
|
|
1010
|
-
|
|
1086
|
+
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
1011
1087
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
1012
1088
|
}
|
|
1013
1089
|
|
|
1014
1090
|
if (reconnectId) {
|
|
1015
|
-
|
|
1091
|
+
requestPath += "/".concat(reconnectId);
|
|
1016
1092
|
}
|
|
1017
1093
|
|
|
1018
|
-
|
|
1094
|
+
queryParams = "channelId=".concat(this.omnichannelConfiguration.channelId);
|
|
1095
|
+
requestPath += "?".concat(queryParams);
|
|
1096
|
+
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
1019
1097
|
data = initContext || {};
|
|
1020
1098
|
|
|
1021
1099
|
if (!(getContext && !window.document)) {
|
|
1022
|
-
|
|
1100
|
+
_context12.next = 16;
|
|
1023
1101
|
break;
|
|
1024
1102
|
}
|
|
1025
1103
|
|
|
1026
|
-
return
|
|
1104
|
+
return _context12.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
|
|
1027
1105
|
|
|
1028
|
-
case
|
|
1106
|
+
case 16:
|
|
1029
1107
|
if (getContext) {
|
|
1030
1108
|
data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
|
|
1031
1109
|
data.device = _DeviceInfo.DeviceInfo.getDeviceType();
|
|
@@ -1040,90 +1118,100 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1040
1118
|
|
|
1041
1119
|
|
|
1042
1120
|
if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
|
|
1043
|
-
|
|
1121
|
+
_context12.next = 20;
|
|
1044
1122
|
break;
|
|
1045
1123
|
}
|
|
1046
1124
|
|
|
1047
|
-
return
|
|
1125
|
+
return _context12.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
|
|
1048
1126
|
|
|
1049
|
-
case
|
|
1127
|
+
case 20:
|
|
1128
|
+
method = "POST";
|
|
1050
1129
|
options = {
|
|
1051
1130
|
data: data,
|
|
1052
1131
|
headers: headers,
|
|
1053
|
-
method:
|
|
1054
|
-
url:
|
|
1132
|
+
method: method,
|
|
1133
|
+
url: url
|
|
1055
1134
|
};
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1135
|
+
_context12.prev = 22;
|
|
1136
|
+
_context12.next = 25;
|
|
1137
|
+
return axiosInstance(options);
|
|
1059
1138
|
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
switch (_context12.prev = _context12.next) {
|
|
1063
|
-
case 0:
|
|
1064
|
-
_context12.prev = 0;
|
|
1065
|
-
_context12.next = 3;
|
|
1066
|
-
return axiosInstance(options);
|
|
1139
|
+
case 25:
|
|
1140
|
+
response = _context12.sent;
|
|
1067
1141
|
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1142
|
+
if (this.logger) {
|
|
1143
|
+
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1144
|
+
requestPayload = _objectSpread({}, data);
|
|
1071
1145
|
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
Region: response.data.Region,
|
|
1076
|
-
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
1077
|
-
TransactionId: response.headers["transaction-id"]
|
|
1078
|
-
}, "Session Init Succeeded");
|
|
1079
|
-
}
|
|
1146
|
+
if (requestPayload.customContextData) {
|
|
1147
|
+
_LoggingSanitizer.LoggingSanitizer.stripCustomContextDataValues(requestPayload.customContextData);
|
|
1148
|
+
}
|
|
1080
1149
|
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1150
|
+
if (requestPayload.preChatResponse) {
|
|
1151
|
+
_LoggingSanitizer.LoggingSanitizer.stripPreChatResponse(requestPayload.preChatResponse);
|
|
1152
|
+
}
|
|
1084
1153
|
|
|
1085
|
-
|
|
1086
|
-
_context12.prev = 9;
|
|
1087
|
-
_context12.t0 = _context12["catch"](0);
|
|
1088
|
-
_elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
|
|
1154
|
+
_LoggingSanitizer.LoggingSanitizer.stripGeolocation(requestPayload);
|
|
1089
1155
|
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1156
|
+
_customData3 = {
|
|
1157
|
+
RequestId: requestId,
|
|
1158
|
+
Region: response.data.Region,
|
|
1159
|
+
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
1160
|
+
TransactionId: response.headers["transaction-id"],
|
|
1161
|
+
RequestPayload: requestPayload,
|
|
1162
|
+
RequestPath: requestPath,
|
|
1163
|
+
RequestMethod: method,
|
|
1164
|
+
ResponseStatusCode: response.status
|
|
1165
|
+
};
|
|
1166
|
+
_description3 = "Session Init Succeeded";
|
|
1167
|
+
this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, _customData3, _description3);
|
|
1168
|
+
}
|
|
1094
1169
|
|
|
1095
|
-
|
|
1096
|
-
|
|
1170
|
+
_context12.next = 34;
|
|
1171
|
+
break;
|
|
1097
1172
|
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds6
|
|
1103
|
-
}, "Session Init Failed");
|
|
1173
|
+
case 29:
|
|
1174
|
+
_context12.prev = 29;
|
|
1175
|
+
_context12.t0 = _context12["catch"](22);
|
|
1176
|
+
_elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
|
|
1104
1177
|
|
|
1105
|
-
|
|
1106
|
-
|
|
1178
|
+
if (this.logger) {
|
|
1179
|
+
_requestPayload = _objectSpread({}, data);
|
|
1107
1180
|
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
}
|
|
1181
|
+
if (_requestPayload.customContextData) {
|
|
1182
|
+
_LoggingSanitizer.LoggingSanitizer.stripCustomContextDataValues(_requestPayload.customContextData);
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
if (_requestPayload.preChatResponse) {
|
|
1186
|
+
_LoggingSanitizer.LoggingSanitizer.stripPreChatResponse(_requestPayload.preChatResponse);
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
_LoggingSanitizer.LoggingSanitizer.stripGeolocation(_requestPayload);
|
|
1190
|
+
|
|
1191
|
+
_LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context12.t0);
|
|
1192
|
+
|
|
1193
|
+
_customData4 = {
|
|
1194
|
+
RequestId: requestId,
|
|
1195
|
+
ExceptionDetails: _context12.t0,
|
|
1196
|
+
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds6,
|
|
1197
|
+
RequestPayload: _requestPayload,
|
|
1198
|
+
RequestPath: requestPath,
|
|
1199
|
+
RequestMethod: method,
|
|
1200
|
+
ResponseStatusCode: _context12.t0.response.status // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
1115
1201
|
|
|
1116
|
-
return function (_x18, _x19) {
|
|
1117
|
-
return _ref6.apply(this, arguments);
|
|
1118
1202
|
};
|
|
1119
|
-
|
|
1203
|
+
_description4 = "Session Init Failed";
|
|
1204
|
+
this.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, _customData4, _description4);
|
|
1205
|
+
}
|
|
1120
1206
|
|
|
1121
|
-
|
|
1207
|
+
throw _context12.t0;
|
|
1208
|
+
|
|
1209
|
+
case 34:
|
|
1122
1210
|
case "end":
|
|
1123
|
-
return
|
|
1211
|
+
return _context12.stop();
|
|
1124
1212
|
}
|
|
1125
1213
|
}
|
|
1126
|
-
},
|
|
1214
|
+
}, _callee12, this, [[22, 29]]);
|
|
1127
1215
|
}));
|
|
1128
1216
|
|
|
1129
1217
|
function sessionInit(_x17) {
|
|
@@ -1141,8 +1229,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1141
1229
|
}, {
|
|
1142
1230
|
key: "sessionClose",
|
|
1143
1231
|
value: function () {
|
|
1144
|
-
var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1145
|
-
var
|
|
1232
|
+
var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(requestId) {
|
|
1233
|
+
var _this6 = this;
|
|
1146
1234
|
|
|
1147
1235
|
var sessionCloseOptionalParams,
|
|
1148
1236
|
timer,
|
|
@@ -1155,12 +1243,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1155
1243
|
headers,
|
|
1156
1244
|
data,
|
|
1157
1245
|
options,
|
|
1158
|
-
|
|
1159
|
-
return _regenerator["default"].wrap(function
|
|
1246
|
+
_args14 = arguments;
|
|
1247
|
+
return _regenerator["default"].wrap(function _callee14$(_context14) {
|
|
1160
1248
|
while (1) {
|
|
1161
|
-
switch (
|
|
1249
|
+
switch (_context14.prev = _context14.next) {
|
|
1162
1250
|
case 0:
|
|
1163
|
-
sessionCloseOptionalParams =
|
|
1251
|
+
sessionCloseOptionalParams = _args14.length > 1 && _args14[1] !== undefined ? _args14[1] : {};
|
|
1164
1252
|
timer = _Timer.Timer.TIMER();
|
|
1165
1253
|
|
|
1166
1254
|
if (this.logger) {
|
|
@@ -1199,24 +1287,24 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1199
1287
|
method: "POST",
|
|
1200
1288
|
url: endpoint
|
|
1201
1289
|
};
|
|
1202
|
-
return
|
|
1203
|
-
var
|
|
1290
|
+
return _context14.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1291
|
+
var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(resolve, reject) {
|
|
1204
1292
|
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds7;
|
|
1205
1293
|
|
|
1206
|
-
return _regenerator["default"].wrap(function
|
|
1294
|
+
return _regenerator["default"].wrap(function _callee13$(_context13) {
|
|
1207
1295
|
while (1) {
|
|
1208
|
-
switch (
|
|
1296
|
+
switch (_context13.prev = _context13.next) {
|
|
1209
1297
|
case 0:
|
|
1210
|
-
|
|
1211
|
-
|
|
1298
|
+
_context13.prev = 0;
|
|
1299
|
+
_context13.next = 3;
|
|
1212
1300
|
return axiosInstance(options);
|
|
1213
1301
|
|
|
1214
1302
|
case 3:
|
|
1215
|
-
response =
|
|
1303
|
+
response = _context13.sent;
|
|
1216
1304
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1217
1305
|
|
|
1218
|
-
if (
|
|
1219
|
-
|
|
1306
|
+
if (_this6.logger) {
|
|
1307
|
+
_this6.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, {
|
|
1220
1308
|
RequestId: requestId,
|
|
1221
1309
|
Region: response.data.Region,
|
|
1222
1310
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1225,26 +1313,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1225
1313
|
}
|
|
1226
1314
|
|
|
1227
1315
|
resolve();
|
|
1228
|
-
|
|
1316
|
+
_context13.next = 17;
|
|
1229
1317
|
break;
|
|
1230
1318
|
|
|
1231
1319
|
case 9:
|
|
1232
|
-
|
|
1233
|
-
|
|
1320
|
+
_context13.prev = 9;
|
|
1321
|
+
_context13.t0 = _context13["catch"](0);
|
|
1234
1322
|
_elapsedTimeInMilliseconds7 = timer.milliSecondsElapsed;
|
|
1235
1323
|
|
|
1236
|
-
if (!
|
|
1237
|
-
|
|
1324
|
+
if (!_this6.logger) {
|
|
1325
|
+
_context13.next = 16;
|
|
1238
1326
|
break;
|
|
1239
1327
|
}
|
|
1240
1328
|
|
|
1241
|
-
|
|
1242
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1329
|
+
_context13.next = 15;
|
|
1330
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context13.t0);
|
|
1243
1331
|
|
|
1244
1332
|
case 15:
|
|
1245
|
-
|
|
1333
|
+
_this6.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, {
|
|
1246
1334
|
RequestId: requestId,
|
|
1247
|
-
ExceptionDetails:
|
|
1335
|
+
ExceptionDetails: _context13.t0,
|
|
1248
1336
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds7
|
|
1249
1337
|
}, "Session Close Failed");
|
|
1250
1338
|
|
|
@@ -1253,26 +1341,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1253
1341
|
|
|
1254
1342
|
case 17:
|
|
1255
1343
|
case "end":
|
|
1256
|
-
return
|
|
1344
|
+
return _context13.stop();
|
|
1257
1345
|
}
|
|
1258
1346
|
}
|
|
1259
|
-
},
|
|
1347
|
+
}, _callee13, null, [[0, 9]]);
|
|
1260
1348
|
}));
|
|
1261
1349
|
|
|
1262
|
-
return function (
|
|
1263
|
-
return
|
|
1350
|
+
return function (_x19, _x20) {
|
|
1351
|
+
return _ref6.apply(this, arguments);
|
|
1264
1352
|
};
|
|
1265
1353
|
}()));
|
|
1266
1354
|
|
|
1267
1355
|
case 15:
|
|
1268
1356
|
case "end":
|
|
1269
|
-
return
|
|
1357
|
+
return _context14.stop();
|
|
1270
1358
|
}
|
|
1271
1359
|
}
|
|
1272
|
-
},
|
|
1360
|
+
}, _callee14, this);
|
|
1273
1361
|
}));
|
|
1274
1362
|
|
|
1275
|
-
function sessionClose(
|
|
1363
|
+
function sessionClose(_x18) {
|
|
1276
1364
|
return _sessionClose.apply(this, arguments);
|
|
1277
1365
|
}
|
|
1278
1366
|
|
|
@@ -1287,12 +1375,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1287
1375
|
}, {
|
|
1288
1376
|
key: "validateAuthChatRecord",
|
|
1289
1377
|
value: function () {
|
|
1290
|
-
var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1378
|
+
var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(requestId, validateAuthChatRecordOptionalParams) {
|
|
1291
1379
|
var timer, authenticatedUserToken, chatId, endpoint, axiosInstance, headers, options, _response$data, response, elapsedTimeInMilliseconds, _this$logger, _this$logger2, _this$logger3, _elapsedTimeInMilliseconds8;
|
|
1292
1380
|
|
|
1293
|
-
return _regenerator["default"].wrap(function
|
|
1381
|
+
return _regenerator["default"].wrap(function _callee15$(_context15) {
|
|
1294
1382
|
while (1) {
|
|
1295
|
-
switch (
|
|
1383
|
+
switch (_context15.prev = _context15.next) {
|
|
1296
1384
|
case 0:
|
|
1297
1385
|
timer = _Timer.Timer.TIMER();
|
|
1298
1386
|
|
|
@@ -1319,16 +1407,16 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1319
1407
|
method: "GET",
|
|
1320
1408
|
url: endpoint
|
|
1321
1409
|
};
|
|
1322
|
-
|
|
1323
|
-
|
|
1410
|
+
_context15.prev = 9;
|
|
1411
|
+
_context15.next = 12;
|
|
1324
1412
|
return axiosInstance(options);
|
|
1325
1413
|
|
|
1326
1414
|
case 12:
|
|
1327
|
-
response =
|
|
1415
|
+
response = _context15.sent;
|
|
1328
1416
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1329
1417
|
|
|
1330
1418
|
if (!(((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.authChatExist) === true)) {
|
|
1331
|
-
|
|
1419
|
+
_context15.next = 19;
|
|
1332
1420
|
break;
|
|
1333
1421
|
}
|
|
1334
1422
|
|
|
@@ -1338,7 +1426,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1338
1426
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
1339
1427
|
TransactionId: response.headers["transaction-id"]
|
|
1340
1428
|
}, "Validate Auth Chat Record Succeeded");
|
|
1341
|
-
return
|
|
1429
|
+
return _context15.abrupt("return", Promise.resolve(response.data));
|
|
1342
1430
|
|
|
1343
1431
|
case 19:
|
|
1344
1432
|
(_this$logger2 = this.logger) === null || _this$logger2 === void 0 ? void 0 : _this$logger2.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, {
|
|
@@ -1348,45 +1436,45 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1348
1436
|
TransactionId: response.headers["transaction-id"],
|
|
1349
1437
|
ErrorCode: response.status
|
|
1350
1438
|
}, "Validate Auth Chat Record Failed. Record is not found or request is not authorized");
|
|
1351
|
-
return
|
|
1439
|
+
return _context15.abrupt("return", Promise.reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized")));
|
|
1352
1440
|
|
|
1353
1441
|
case 21:
|
|
1354
|
-
|
|
1442
|
+
_context15.next = 34;
|
|
1355
1443
|
break;
|
|
1356
1444
|
|
|
1357
1445
|
case 23:
|
|
1358
|
-
|
|
1359
|
-
|
|
1446
|
+
_context15.prev = 23;
|
|
1447
|
+
_context15.t0 = _context15["catch"](9);
|
|
1360
1448
|
_elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
|
|
1361
|
-
|
|
1362
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1449
|
+
_context15.next = 28;
|
|
1450
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context15.t0);
|
|
1363
1451
|
|
|
1364
1452
|
case 28:
|
|
1365
1453
|
(_this$logger3 = this.logger) === null || _this$logger3 === void 0 ? void 0 : _this$logger3.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, {
|
|
1366
1454
|
RequestId: requestId,
|
|
1367
|
-
ExceptionDetails:
|
|
1455
|
+
ExceptionDetails: _context15.t0,
|
|
1368
1456
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds8
|
|
1369
1457
|
}, "Validate Auth Chat Record Failed");
|
|
1370
1458
|
|
|
1371
|
-
if (!(
|
|
1372
|
-
|
|
1459
|
+
if (!(_context15.t0.toString() === "Error: Request failed with status code 404")) {
|
|
1460
|
+
_context15.next = 33;
|
|
1373
1461
|
break;
|
|
1374
1462
|
}
|
|
1375
1463
|
|
|
1376
|
-
return
|
|
1464
|
+
return _context15.abrupt("return", Promise.resolve({}));
|
|
1377
1465
|
|
|
1378
1466
|
case 33:
|
|
1379
|
-
return
|
|
1467
|
+
return _context15.abrupt("return", Promise.reject());
|
|
1380
1468
|
|
|
1381
1469
|
case 34:
|
|
1382
1470
|
case "end":
|
|
1383
|
-
return
|
|
1471
|
+
return _context15.stop();
|
|
1384
1472
|
}
|
|
1385
1473
|
}
|
|
1386
|
-
},
|
|
1474
|
+
}, _callee15, this, [[9, 23]]);
|
|
1387
1475
|
}));
|
|
1388
1476
|
|
|
1389
|
-
function validateAuthChatRecord(
|
|
1477
|
+
function validateAuthChatRecord(_x21, _x22) {
|
|
1390
1478
|
return _validateAuthChatRecord.apply(this, arguments);
|
|
1391
1479
|
}
|
|
1392
1480
|
|
|
@@ -1402,8 +1490,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1402
1490
|
}, {
|
|
1403
1491
|
key: "submitPostChatResponse",
|
|
1404
1492
|
value: function () {
|
|
1405
|
-
var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1406
|
-
var
|
|
1493
|
+
var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(requestId, postChatResponse) {
|
|
1494
|
+
var _this7 = this;
|
|
1407
1495
|
|
|
1408
1496
|
var submitPostChatResponseOptionalParams,
|
|
1409
1497
|
timer,
|
|
@@ -1412,12 +1500,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1412
1500
|
authenticatedUserToken,
|
|
1413
1501
|
headers,
|
|
1414
1502
|
options,
|
|
1415
|
-
|
|
1416
|
-
return _regenerator["default"].wrap(function
|
|
1503
|
+
_args17 = arguments;
|
|
1504
|
+
return _regenerator["default"].wrap(function _callee17$(_context17) {
|
|
1417
1505
|
while (1) {
|
|
1418
|
-
switch (
|
|
1506
|
+
switch (_context17.prev = _context17.next) {
|
|
1419
1507
|
case 0:
|
|
1420
|
-
submitPostChatResponseOptionalParams =
|
|
1508
|
+
submitPostChatResponseOptionalParams = _args17.length > 2 && _args17[2] !== undefined ? _args17[2] : {};
|
|
1421
1509
|
timer = _Timer.Timer.TIMER();
|
|
1422
1510
|
|
|
1423
1511
|
if (this.logger) {
|
|
@@ -1445,24 +1533,24 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1445
1533
|
method: "POST",
|
|
1446
1534
|
url: endpoint
|
|
1447
1535
|
};
|
|
1448
|
-
return
|
|
1449
|
-
var
|
|
1536
|
+
return _context17.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1537
|
+
var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(resolve, reject) {
|
|
1450
1538
|
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
|
|
1451
1539
|
|
|
1452
|
-
return _regenerator["default"].wrap(function
|
|
1540
|
+
return _regenerator["default"].wrap(function _callee16$(_context16) {
|
|
1453
1541
|
while (1) {
|
|
1454
|
-
switch (
|
|
1542
|
+
switch (_context16.prev = _context16.next) {
|
|
1455
1543
|
case 0:
|
|
1456
|
-
|
|
1457
|
-
|
|
1544
|
+
_context16.prev = 0;
|
|
1545
|
+
_context16.next = 3;
|
|
1458
1546
|
return axiosInstance(options);
|
|
1459
1547
|
|
|
1460
1548
|
case 3:
|
|
1461
|
-
response =
|
|
1549
|
+
response = _context16.sent;
|
|
1462
1550
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1463
1551
|
|
|
1464
|
-
if (
|
|
1465
|
-
|
|
1552
|
+
if (_this7.logger) {
|
|
1553
|
+
_this7.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, {
|
|
1466
1554
|
RequestId: requestId,
|
|
1467
1555
|
Region: response.data.Region,
|
|
1468
1556
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1471,26 +1559,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1471
1559
|
}
|
|
1472
1560
|
|
|
1473
1561
|
resolve();
|
|
1474
|
-
|
|
1562
|
+
_context16.next = 17;
|
|
1475
1563
|
break;
|
|
1476
1564
|
|
|
1477
1565
|
case 9:
|
|
1478
|
-
|
|
1479
|
-
|
|
1566
|
+
_context16.prev = 9;
|
|
1567
|
+
_context16.t0 = _context16["catch"](0);
|
|
1480
1568
|
_elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
|
|
1481
1569
|
|
|
1482
|
-
if (!
|
|
1483
|
-
|
|
1570
|
+
if (!_this7.logger) {
|
|
1571
|
+
_context16.next = 16;
|
|
1484
1572
|
break;
|
|
1485
1573
|
}
|
|
1486
1574
|
|
|
1487
|
-
|
|
1488
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1575
|
+
_context16.next = 15;
|
|
1576
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context16.t0);
|
|
1489
1577
|
|
|
1490
1578
|
case 15:
|
|
1491
|
-
|
|
1579
|
+
_this7.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, {
|
|
1492
1580
|
RequestId: requestId,
|
|
1493
|
-
ExceptionDetails:
|
|
1581
|
+
ExceptionDetails: _context16.t0,
|
|
1494
1582
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds9
|
|
1495
1583
|
}, "Submit Post Chat Failed");
|
|
1496
1584
|
|
|
@@ -1499,26 +1587,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1499
1587
|
|
|
1500
1588
|
case 17:
|
|
1501
1589
|
case "end":
|
|
1502
|
-
return
|
|
1590
|
+
return _context16.stop();
|
|
1503
1591
|
}
|
|
1504
1592
|
}
|
|
1505
|
-
},
|
|
1593
|
+
}, _callee16, null, [[0, 9]]);
|
|
1506
1594
|
}));
|
|
1507
1595
|
|
|
1508
|
-
return function (
|
|
1509
|
-
return
|
|
1596
|
+
return function (_x25, _x26) {
|
|
1597
|
+
return _ref7.apply(this, arguments);
|
|
1510
1598
|
};
|
|
1511
1599
|
}()));
|
|
1512
1600
|
|
|
1513
1601
|
case 11:
|
|
1514
1602
|
case "end":
|
|
1515
|
-
return
|
|
1603
|
+
return _context17.stop();
|
|
1516
1604
|
}
|
|
1517
1605
|
}
|
|
1518
|
-
},
|
|
1606
|
+
}, _callee17, this);
|
|
1519
1607
|
}));
|
|
1520
1608
|
|
|
1521
|
-
function submitPostChatResponse(
|
|
1609
|
+
function submitPostChatResponse(_x23, _x24) {
|
|
1522
1610
|
return _submitPostChatResponse.apply(this, arguments);
|
|
1523
1611
|
}
|
|
1524
1612
|
|
|
@@ -1534,8 +1622,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1534
1622
|
}, {
|
|
1535
1623
|
key: "getSurveyInviteLink",
|
|
1536
1624
|
value: function () {
|
|
1537
|
-
var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1538
|
-
var
|
|
1625
|
+
var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(surveyOwnerId, surveyInviteAPIRequestBody) {
|
|
1626
|
+
var _this8 = this;
|
|
1539
1627
|
|
|
1540
1628
|
var getsurveyInviteLinkOptionalParams,
|
|
1541
1629
|
timer,
|
|
@@ -1545,12 +1633,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1545
1633
|
requestId,
|
|
1546
1634
|
headers,
|
|
1547
1635
|
options,
|
|
1548
|
-
|
|
1549
|
-
return _regenerator["default"].wrap(function
|
|
1636
|
+
_args19 = arguments;
|
|
1637
|
+
return _regenerator["default"].wrap(function _callee19$(_context19) {
|
|
1550
1638
|
while (1) {
|
|
1551
|
-
switch (
|
|
1639
|
+
switch (_context19.prev = _context19.next) {
|
|
1552
1640
|
case 0:
|
|
1553
|
-
getsurveyInviteLinkOptionalParams =
|
|
1641
|
+
getsurveyInviteLinkOptionalParams = _args19.length > 2 && _args19[2] !== undefined ? _args19[2] : {};
|
|
1554
1642
|
timer = _Timer.Timer.TIMER();
|
|
1555
1643
|
|
|
1556
1644
|
if (this.logger) {
|
|
@@ -1583,25 +1671,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1583
1671
|
method: "POST",
|
|
1584
1672
|
url: endpoint
|
|
1585
1673
|
};
|
|
1586
|
-
return
|
|
1587
|
-
var
|
|
1674
|
+
return _context19.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1675
|
+
var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(resolve, reject) {
|
|
1588
1676
|
var response, data, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
|
|
1589
1677
|
|
|
1590
|
-
return _regenerator["default"].wrap(function
|
|
1678
|
+
return _regenerator["default"].wrap(function _callee18$(_context18) {
|
|
1591
1679
|
while (1) {
|
|
1592
|
-
switch (
|
|
1680
|
+
switch (_context18.prev = _context18.next) {
|
|
1593
1681
|
case 0:
|
|
1594
|
-
|
|
1595
|
-
|
|
1682
|
+
_context18.prev = 0;
|
|
1683
|
+
_context18.next = 3;
|
|
1596
1684
|
return axiosInstance(options);
|
|
1597
1685
|
|
|
1598
1686
|
case 3:
|
|
1599
|
-
response =
|
|
1687
|
+
response = _context18.sent;
|
|
1600
1688
|
data = response.data;
|
|
1601
1689
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1602
1690
|
|
|
1603
|
-
if (
|
|
1604
|
-
|
|
1691
|
+
if (_this8.logger) {
|
|
1692
|
+
_this8.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, {
|
|
1605
1693
|
Region: response.data.Region,
|
|
1606
1694
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
1607
1695
|
TransactionId: response.headers["transaction-id"]
|
|
@@ -1609,25 +1697,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1609
1697
|
}
|
|
1610
1698
|
|
|
1611
1699
|
resolve(data);
|
|
1612
|
-
|
|
1700
|
+
_context18.next = 18;
|
|
1613
1701
|
break;
|
|
1614
1702
|
|
|
1615
1703
|
case 10:
|
|
1616
|
-
|
|
1617
|
-
|
|
1704
|
+
_context18.prev = 10;
|
|
1705
|
+
_context18.t0 = _context18["catch"](0);
|
|
1618
1706
|
_elapsedTimeInMilliseconds10 = timer.milliSecondsElapsed;
|
|
1619
1707
|
|
|
1620
|
-
if (!
|
|
1621
|
-
|
|
1708
|
+
if (!_this8.logger) {
|
|
1709
|
+
_context18.next = 17;
|
|
1622
1710
|
break;
|
|
1623
1711
|
}
|
|
1624
1712
|
|
|
1625
|
-
|
|
1626
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1713
|
+
_context18.next = 16;
|
|
1714
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context18.t0);
|
|
1627
1715
|
|
|
1628
1716
|
case 16:
|
|
1629
|
-
|
|
1630
|
-
ExceptionDetails:
|
|
1717
|
+
_this8.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, {
|
|
1718
|
+
ExceptionDetails: _context18.t0,
|
|
1631
1719
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds10
|
|
1632
1720
|
}, "Get Survey Invite Link Failed");
|
|
1633
1721
|
|
|
@@ -1636,26 +1724,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1636
1724
|
|
|
1637
1725
|
case 18:
|
|
1638
1726
|
case "end":
|
|
1639
|
-
return
|
|
1727
|
+
return _context18.stop();
|
|
1640
1728
|
}
|
|
1641
1729
|
}
|
|
1642
|
-
},
|
|
1730
|
+
}, _callee18, null, [[0, 10]]);
|
|
1643
1731
|
}));
|
|
1644
1732
|
|
|
1645
|
-
return function (
|
|
1646
|
-
return
|
|
1733
|
+
return function (_x29, _x30) {
|
|
1734
|
+
return _ref8.apply(this, arguments);
|
|
1647
1735
|
};
|
|
1648
1736
|
}()));
|
|
1649
1737
|
|
|
1650
1738
|
case 12:
|
|
1651
1739
|
case "end":
|
|
1652
|
-
return
|
|
1740
|
+
return _context19.stop();
|
|
1653
1741
|
}
|
|
1654
1742
|
}
|
|
1655
|
-
},
|
|
1743
|
+
}, _callee19, this);
|
|
1656
1744
|
}));
|
|
1657
1745
|
|
|
1658
|
-
function getSurveyInviteLink(
|
|
1746
|
+
function getSurveyInviteLink(_x27, _x28) {
|
|
1659
1747
|
return _getSurveyInviteLink.apply(this, arguments);
|
|
1660
1748
|
}
|
|
1661
1749
|
|
|
@@ -1672,8 +1760,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1672
1760
|
}, {
|
|
1673
1761
|
key: "getChatTranscripts",
|
|
1674
1762
|
value: function () {
|
|
1675
|
-
var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1676
|
-
var
|
|
1763
|
+
var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21(requestId, chatId, token) {
|
|
1764
|
+
var _this9 = this;
|
|
1677
1765
|
|
|
1678
1766
|
var getChatTranscriptsOptionalParams,
|
|
1679
1767
|
timer,
|
|
@@ -1683,12 +1771,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1683
1771
|
currentLiveChatVersion,
|
|
1684
1772
|
headers,
|
|
1685
1773
|
options,
|
|
1686
|
-
|
|
1687
|
-
return _regenerator["default"].wrap(function
|
|
1774
|
+
_args21 = arguments;
|
|
1775
|
+
return _regenerator["default"].wrap(function _callee21$(_context21) {
|
|
1688
1776
|
while (1) {
|
|
1689
|
-
switch (
|
|
1777
|
+
switch (_context21.prev = _context21.next) {
|
|
1690
1778
|
case 0:
|
|
1691
|
-
getChatTranscriptsOptionalParams =
|
|
1779
|
+
getChatTranscriptsOptionalParams = _args21.length > 3 && _args21[3] !== undefined ? _args21[3] : {};
|
|
1692
1780
|
timer = _Timer.Timer.TIMER();
|
|
1693
1781
|
|
|
1694
1782
|
if (this.logger) {
|
|
@@ -1723,25 +1811,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1723
1811
|
method: "GET",
|
|
1724
1812
|
url: endpoint
|
|
1725
1813
|
};
|
|
1726
|
-
return
|
|
1727
|
-
var
|
|
1814
|
+
return _context21.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1815
|
+
var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(resolve, reject) {
|
|
1728
1816
|
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds11;
|
|
1729
1817
|
|
|
1730
|
-
return _regenerator["default"].wrap(function
|
|
1818
|
+
return _regenerator["default"].wrap(function _callee20$(_context20) {
|
|
1731
1819
|
while (1) {
|
|
1732
|
-
switch (
|
|
1820
|
+
switch (_context20.prev = _context20.next) {
|
|
1733
1821
|
case 0:
|
|
1734
|
-
|
|
1735
|
-
|
|
1822
|
+
_context20.prev = 0;
|
|
1823
|
+
_context20.next = 3;
|
|
1736
1824
|
return axiosInstance(options);
|
|
1737
1825
|
|
|
1738
1826
|
case 3:
|
|
1739
|
-
response =
|
|
1827
|
+
response = _context20.sent;
|
|
1740
1828
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1741
1829
|
data = response.data;
|
|
1742
1830
|
|
|
1743
|
-
if (
|
|
1744
|
-
|
|
1831
|
+
if (_this9.logger) {
|
|
1832
|
+
_this9.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, {
|
|
1745
1833
|
RequestId: requestId,
|
|
1746
1834
|
Region: response.data.Region,
|
|
1747
1835
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1750,54 +1838,54 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1750
1838
|
}
|
|
1751
1839
|
|
|
1752
1840
|
resolve(data);
|
|
1753
|
-
|
|
1841
|
+
_context20.next = 18;
|
|
1754
1842
|
break;
|
|
1755
1843
|
|
|
1756
1844
|
case 10:
|
|
1757
|
-
|
|
1758
|
-
|
|
1845
|
+
_context20.prev = 10;
|
|
1846
|
+
_context20.t0 = _context20["catch"](0);
|
|
1759
1847
|
_elapsedTimeInMilliseconds11 = timer.milliSecondsElapsed;
|
|
1760
1848
|
|
|
1761
|
-
if (!
|
|
1762
|
-
|
|
1849
|
+
if (!_this9.logger) {
|
|
1850
|
+
_context20.next = 17;
|
|
1763
1851
|
break;
|
|
1764
1852
|
}
|
|
1765
1853
|
|
|
1766
|
-
|
|
1767
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1854
|
+
_context20.next = 16;
|
|
1855
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context20.t0);
|
|
1768
1856
|
|
|
1769
1857
|
case 16:
|
|
1770
|
-
|
|
1858
|
+
_this9.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, {
|
|
1771
1859
|
RequestId: requestId,
|
|
1772
|
-
ExceptionDetails:
|
|
1860
|
+
ExceptionDetails: _context20.t0,
|
|
1773
1861
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds11
|
|
1774
1862
|
}, "Get Chat Transcript Failed");
|
|
1775
1863
|
|
|
1776
1864
|
case 17:
|
|
1777
|
-
reject(
|
|
1865
|
+
reject(_context20.t0);
|
|
1778
1866
|
|
|
1779
1867
|
case 18:
|
|
1780
1868
|
case "end":
|
|
1781
|
-
return
|
|
1869
|
+
return _context20.stop();
|
|
1782
1870
|
}
|
|
1783
1871
|
}
|
|
1784
|
-
},
|
|
1872
|
+
}, _callee20, null, [[0, 10]]);
|
|
1785
1873
|
}));
|
|
1786
1874
|
|
|
1787
|
-
return function (
|
|
1788
|
-
return
|
|
1875
|
+
return function (_x34, _x35) {
|
|
1876
|
+
return _ref9.apply(this, arguments);
|
|
1789
1877
|
};
|
|
1790
1878
|
}()));
|
|
1791
1879
|
|
|
1792
1880
|
case 14:
|
|
1793
1881
|
case "end":
|
|
1794
|
-
return
|
|
1882
|
+
return _context21.stop();
|
|
1795
1883
|
}
|
|
1796
1884
|
}
|
|
1797
|
-
},
|
|
1885
|
+
}, _callee21, this);
|
|
1798
1886
|
}));
|
|
1799
1887
|
|
|
1800
|
-
function getChatTranscripts(
|
|
1888
|
+
function getChatTranscripts(_x31, _x32, _x33) {
|
|
1801
1889
|
return _getChatTranscripts.apply(this, arguments);
|
|
1802
1890
|
}
|
|
1803
1891
|
|
|
@@ -1814,8 +1902,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1814
1902
|
}, {
|
|
1815
1903
|
key: "emailTranscript",
|
|
1816
1904
|
value: function () {
|
|
1817
|
-
var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1818
|
-
var
|
|
1905
|
+
var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23(requestId, token, emailRequestBody) {
|
|
1906
|
+
var _this10 = this;
|
|
1819
1907
|
|
|
1820
1908
|
var emailTranscriptOptionalParams,
|
|
1821
1909
|
timer,
|
|
@@ -1824,12 +1912,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1824
1912
|
authenticatedUserToken,
|
|
1825
1913
|
headers,
|
|
1826
1914
|
options,
|
|
1827
|
-
|
|
1828
|
-
return _regenerator["default"].wrap(function
|
|
1915
|
+
_args23 = arguments;
|
|
1916
|
+
return _regenerator["default"].wrap(function _callee23$(_context23) {
|
|
1829
1917
|
while (1) {
|
|
1830
|
-
switch (
|
|
1918
|
+
switch (_context23.prev = _context23.next) {
|
|
1831
1919
|
case 0:
|
|
1832
|
-
emailTranscriptOptionalParams =
|
|
1920
|
+
emailTranscriptOptionalParams = _args23.length > 3 && _args23[3] !== undefined ? _args23[3] : {};
|
|
1833
1921
|
timer = _Timer.Timer.TIMER();
|
|
1834
1922
|
|
|
1835
1923
|
if (this.logger) {
|
|
@@ -1859,24 +1947,24 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1859
1947
|
method: "POST",
|
|
1860
1948
|
url: endpoint
|
|
1861
1949
|
};
|
|
1862
|
-
return
|
|
1863
|
-
var
|
|
1950
|
+
return _context23.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1951
|
+
var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22(resolve, reject) {
|
|
1864
1952
|
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
|
|
1865
1953
|
|
|
1866
|
-
return _regenerator["default"].wrap(function
|
|
1954
|
+
return _regenerator["default"].wrap(function _callee22$(_context22) {
|
|
1867
1955
|
while (1) {
|
|
1868
|
-
switch (
|
|
1956
|
+
switch (_context22.prev = _context22.next) {
|
|
1869
1957
|
case 0:
|
|
1870
|
-
|
|
1871
|
-
|
|
1958
|
+
_context22.prev = 0;
|
|
1959
|
+
_context22.next = 3;
|
|
1872
1960
|
return axiosInstance(options);
|
|
1873
1961
|
|
|
1874
1962
|
case 3:
|
|
1875
|
-
response =
|
|
1963
|
+
response = _context22.sent;
|
|
1876
1964
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1877
1965
|
|
|
1878
|
-
if (
|
|
1879
|
-
|
|
1966
|
+
if (_this10.logger) {
|
|
1967
|
+
_this10.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, {
|
|
1880
1968
|
RequestId: requestId,
|
|
1881
1969
|
Region: response.data.Region,
|
|
1882
1970
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -1885,26 +1973,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1885
1973
|
}
|
|
1886
1974
|
|
|
1887
1975
|
resolve();
|
|
1888
|
-
|
|
1976
|
+
_context22.next = 17;
|
|
1889
1977
|
break;
|
|
1890
1978
|
|
|
1891
1979
|
case 9:
|
|
1892
|
-
|
|
1893
|
-
|
|
1980
|
+
_context22.prev = 9;
|
|
1981
|
+
_context22.t0 = _context22["catch"](0);
|
|
1894
1982
|
_elapsedTimeInMilliseconds12 = timer.milliSecondsElapsed;
|
|
1895
1983
|
|
|
1896
|
-
if (!
|
|
1897
|
-
|
|
1984
|
+
if (!_this10.logger) {
|
|
1985
|
+
_context22.next = 16;
|
|
1898
1986
|
break;
|
|
1899
1987
|
}
|
|
1900
1988
|
|
|
1901
|
-
|
|
1902
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
1989
|
+
_context22.next = 15;
|
|
1990
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context22.t0);
|
|
1903
1991
|
|
|
1904
1992
|
case 15:
|
|
1905
|
-
|
|
1993
|
+
_this10.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, {
|
|
1906
1994
|
RequestId: requestId,
|
|
1907
|
-
ExceptionDetails:
|
|
1995
|
+
ExceptionDetails: _context22.t0,
|
|
1908
1996
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds12
|
|
1909
1997
|
}, "Email Transcript Failed");
|
|
1910
1998
|
|
|
@@ -1913,26 +2001,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1913
2001
|
|
|
1914
2002
|
case 17:
|
|
1915
2003
|
case "end":
|
|
1916
|
-
return
|
|
2004
|
+
return _context22.stop();
|
|
1917
2005
|
}
|
|
1918
2006
|
}
|
|
1919
|
-
},
|
|
2007
|
+
}, _callee22, null, [[0, 9]]);
|
|
1920
2008
|
}));
|
|
1921
2009
|
|
|
1922
|
-
return function (
|
|
1923
|
-
return
|
|
2010
|
+
return function (_x39, _x40) {
|
|
2011
|
+
return _ref10.apply(this, arguments);
|
|
1924
2012
|
};
|
|
1925
2013
|
}()));
|
|
1926
2014
|
|
|
1927
2015
|
case 14:
|
|
1928
2016
|
case "end":
|
|
1929
|
-
return
|
|
2017
|
+
return _context23.stop();
|
|
1930
2018
|
}
|
|
1931
2019
|
}
|
|
1932
|
-
},
|
|
2020
|
+
}, _callee23, this);
|
|
1933
2021
|
}));
|
|
1934
2022
|
|
|
1935
|
-
function emailTranscript(
|
|
2023
|
+
function emailTranscript(_x36, _x37, _x38) {
|
|
1936
2024
|
return _emailTranscript.apply(this, arguments);
|
|
1937
2025
|
}
|
|
1938
2026
|
|
|
@@ -1946,13 +2034,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1946
2034
|
}, {
|
|
1947
2035
|
key: "fetchDataMaskingInfo",
|
|
1948
2036
|
value: function () {
|
|
1949
|
-
var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1950
|
-
var
|
|
2037
|
+
var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25(requestId) {
|
|
2038
|
+
var _this11 = this;
|
|
1951
2039
|
|
|
1952
2040
|
var timer, endpoint, axiosInstance, headers, options;
|
|
1953
|
-
return _regenerator["default"].wrap(function
|
|
2041
|
+
return _regenerator["default"].wrap(function _callee25$(_context25) {
|
|
1954
2042
|
while (1) {
|
|
1955
|
-
switch (
|
|
2043
|
+
switch (_context25.prev = _context25.next) {
|
|
1956
2044
|
case 0:
|
|
1957
2045
|
timer = _Timer.Timer.TIMER();
|
|
1958
2046
|
|
|
@@ -1979,25 +2067,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1979
2067
|
method: "GET",
|
|
1980
2068
|
url: endpoint
|
|
1981
2069
|
};
|
|
1982
|
-
return
|
|
1983
|
-
var
|
|
2070
|
+
return _context25.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2071
|
+
var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24(resolve, reject) {
|
|
1984
2072
|
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds13;
|
|
1985
2073
|
|
|
1986
|
-
return _regenerator["default"].wrap(function
|
|
2074
|
+
return _regenerator["default"].wrap(function _callee24$(_context24) {
|
|
1987
2075
|
while (1) {
|
|
1988
|
-
switch (
|
|
2076
|
+
switch (_context24.prev = _context24.next) {
|
|
1989
2077
|
case 0:
|
|
1990
|
-
|
|
1991
|
-
|
|
2078
|
+
_context24.prev = 0;
|
|
2079
|
+
_context24.next = 3;
|
|
1992
2080
|
return axiosInstance(options);
|
|
1993
2081
|
|
|
1994
2082
|
case 3:
|
|
1995
|
-
response =
|
|
2083
|
+
response = _context24.sent;
|
|
1996
2084
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1997
2085
|
data = response.data;
|
|
1998
2086
|
|
|
1999
|
-
if (
|
|
2000
|
-
|
|
2087
|
+
if (_this11.logger) {
|
|
2088
|
+
_this11.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, {
|
|
2001
2089
|
RequestId: requestId,
|
|
2002
2090
|
Region: response.data.Region,
|
|
2003
2091
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -2006,26 +2094,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2006
2094
|
}
|
|
2007
2095
|
|
|
2008
2096
|
resolve(data);
|
|
2009
|
-
|
|
2097
|
+
_context24.next = 18;
|
|
2010
2098
|
break;
|
|
2011
2099
|
|
|
2012
2100
|
case 10:
|
|
2013
|
-
|
|
2014
|
-
|
|
2101
|
+
_context24.prev = 10;
|
|
2102
|
+
_context24.t0 = _context24["catch"](0);
|
|
2015
2103
|
_elapsedTimeInMilliseconds13 = timer.milliSecondsElapsed;
|
|
2016
2104
|
|
|
2017
|
-
if (!
|
|
2018
|
-
|
|
2105
|
+
if (!_this11.logger) {
|
|
2106
|
+
_context24.next = 17;
|
|
2019
2107
|
break;
|
|
2020
2108
|
}
|
|
2021
2109
|
|
|
2022
|
-
|
|
2023
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
2110
|
+
_context24.next = 16;
|
|
2111
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context24.t0);
|
|
2024
2112
|
|
|
2025
2113
|
case 16:
|
|
2026
|
-
|
|
2114
|
+
_this11.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, {
|
|
2027
2115
|
RequestId: requestId,
|
|
2028
|
-
ExceptionDetails:
|
|
2116
|
+
ExceptionDetails: _context24.t0,
|
|
2029
2117
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds13
|
|
2030
2118
|
}, "Fetch Data Masking Failed");
|
|
2031
2119
|
|
|
@@ -2034,26 +2122,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2034
2122
|
|
|
2035
2123
|
case 18:
|
|
2036
2124
|
case "end":
|
|
2037
|
-
return
|
|
2125
|
+
return _context24.stop();
|
|
2038
2126
|
}
|
|
2039
2127
|
}
|
|
2040
|
-
},
|
|
2128
|
+
}, _callee24, null, [[0, 10]]);
|
|
2041
2129
|
}));
|
|
2042
2130
|
|
|
2043
|
-
return function (
|
|
2044
|
-
return
|
|
2131
|
+
return function (_x42, _x43) {
|
|
2132
|
+
return _ref11.apply(this, arguments);
|
|
2045
2133
|
};
|
|
2046
2134
|
}()));
|
|
2047
2135
|
|
|
2048
2136
|
case 11:
|
|
2049
2137
|
case "end":
|
|
2050
|
-
return
|
|
2138
|
+
return _context25.stop();
|
|
2051
2139
|
}
|
|
2052
2140
|
}
|
|
2053
|
-
},
|
|
2141
|
+
}, _callee25, this);
|
|
2054
2142
|
}));
|
|
2055
2143
|
|
|
2056
|
-
function fetchDataMaskingInfo(
|
|
2144
|
+
function fetchDataMaskingInfo(_x41) {
|
|
2057
2145
|
return _fetchDataMaskingInfo.apply(this, arguments);
|
|
2058
2146
|
}
|
|
2059
2147
|
|
|
@@ -2069,7 +2157,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2069
2157
|
}, {
|
|
2070
2158
|
key: "makeSecondaryChannelEventRequest",
|
|
2071
2159
|
value: function () {
|
|
2072
|
-
var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
2160
|
+
var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(requestId, secondaryChannelEventRequestBody) {
|
|
2073
2161
|
var secondaryChannelEventOptionalParams,
|
|
2074
2162
|
timer,
|
|
2075
2163
|
endpoint,
|
|
@@ -2081,13 +2169,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2081
2169
|
elapsedTimeInMilliseconds,
|
|
2082
2170
|
data,
|
|
2083
2171
|
_elapsedTimeInMilliseconds14,
|
|
2084
|
-
|
|
2172
|
+
_args26 = arguments;
|
|
2085
2173
|
|
|
2086
|
-
return _regenerator["default"].wrap(function
|
|
2174
|
+
return _regenerator["default"].wrap(function _callee26$(_context26) {
|
|
2087
2175
|
while (1) {
|
|
2088
|
-
switch (
|
|
2176
|
+
switch (_context26.prev = _context26.next) {
|
|
2089
2177
|
case 0:
|
|
2090
|
-
secondaryChannelEventOptionalParams =
|
|
2178
|
+
secondaryChannelEventOptionalParams = _args26.length > 2 && _args26[2] !== undefined ? _args26[2] : {};
|
|
2091
2179
|
timer = _Timer.Timer.TIMER();
|
|
2092
2180
|
|
|
2093
2181
|
if (this.logger) {
|
|
@@ -2117,12 +2205,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2117
2205
|
method: "POST",
|
|
2118
2206
|
url: endpoint
|
|
2119
2207
|
};
|
|
2120
|
-
|
|
2121
|
-
|
|
2208
|
+
_context26.prev = 12;
|
|
2209
|
+
_context26.next = 15;
|
|
2122
2210
|
return axiosInstance(options);
|
|
2123
2211
|
|
|
2124
2212
|
case 15:
|
|
2125
|
-
response =
|
|
2213
|
+
response = _context26.sent;
|
|
2126
2214
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2127
2215
|
data = response.data;
|
|
2128
2216
|
|
|
@@ -2135,41 +2223,41 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2135
2223
|
}, "Secondary Channel Event Request Succeeded");
|
|
2136
2224
|
}
|
|
2137
2225
|
|
|
2138
|
-
|
|
2226
|
+
_context26.next = 29;
|
|
2139
2227
|
break;
|
|
2140
2228
|
|
|
2141
2229
|
case 21:
|
|
2142
|
-
|
|
2143
|
-
|
|
2230
|
+
_context26.prev = 21;
|
|
2231
|
+
_context26.t0 = _context26["catch"](12);
|
|
2144
2232
|
_elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
|
|
2145
2233
|
|
|
2146
2234
|
if (!this.logger) {
|
|
2147
|
-
|
|
2235
|
+
_context26.next = 28;
|
|
2148
2236
|
break;
|
|
2149
2237
|
}
|
|
2150
2238
|
|
|
2151
|
-
|
|
2152
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
2239
|
+
_context26.next = 27;
|
|
2240
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context26.t0);
|
|
2153
2241
|
|
|
2154
2242
|
case 27:
|
|
2155
2243
|
this.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, {
|
|
2156
2244
|
RequestId: requestId,
|
|
2157
|
-
ExceptionDetails:
|
|
2245
|
+
ExceptionDetails: _context26.t0,
|
|
2158
2246
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds14
|
|
2159
2247
|
}, "Secondary Channel Event Request Failed");
|
|
2160
2248
|
|
|
2161
2249
|
case 28:
|
|
2162
|
-
throw
|
|
2250
|
+
throw _context26.t0;
|
|
2163
2251
|
|
|
2164
2252
|
case 29:
|
|
2165
2253
|
case "end":
|
|
2166
|
-
return
|
|
2254
|
+
return _context26.stop();
|
|
2167
2255
|
}
|
|
2168
2256
|
}
|
|
2169
|
-
},
|
|
2257
|
+
}, _callee26, this, [[12, 21]]);
|
|
2170
2258
|
}));
|
|
2171
2259
|
|
|
2172
|
-
function makeSecondaryChannelEventRequest(
|
|
2260
|
+
function makeSecondaryChannelEventRequest(_x44, _x45) {
|
|
2173
2261
|
return _makeSecondaryChannelEventRequest.apply(this, arguments);
|
|
2174
2262
|
}
|
|
2175
2263
|
|
|
@@ -2182,8 +2270,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2182
2270
|
}, {
|
|
2183
2271
|
key: "sendTypingIndicator",
|
|
2184
2272
|
value: function () {
|
|
2185
|
-
var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
2186
|
-
var
|
|
2273
|
+
var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(requestId, currentLiveChatVersion) {
|
|
2274
|
+
var _this12 = this;
|
|
2187
2275
|
|
|
2188
2276
|
var sendTypingIndicatorOptionalParams,
|
|
2189
2277
|
timer,
|
|
@@ -2192,26 +2280,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2192
2280
|
axiosInstance,
|
|
2193
2281
|
headers,
|
|
2194
2282
|
options,
|
|
2195
|
-
|
|
2196
|
-
return _regenerator["default"].wrap(function
|
|
2283
|
+
_args28 = arguments;
|
|
2284
|
+
return _regenerator["default"].wrap(function _callee28$(_context28) {
|
|
2197
2285
|
while (1) {
|
|
2198
|
-
switch (
|
|
2286
|
+
switch (_context28.prev = _context28.next) {
|
|
2199
2287
|
case 0:
|
|
2200
|
-
sendTypingIndicatorOptionalParams =
|
|
2288
|
+
sendTypingIndicatorOptionalParams = _args28.length > 2 && _args28[2] !== undefined ? _args28[2] : {};
|
|
2201
2289
|
|
|
2202
2290
|
if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
|
|
2203
|
-
|
|
2291
|
+
_context28.next = 3;
|
|
2204
2292
|
break;
|
|
2205
2293
|
}
|
|
2206
2294
|
|
|
2207
|
-
return
|
|
2295
|
+
return _context28.abrupt("return", Promise.resolve());
|
|
2208
2296
|
|
|
2209
2297
|
case 3:
|
|
2210
2298
|
timer = _Timer.Timer.TIMER();
|
|
2211
2299
|
customerDisplayName = sendTypingIndicatorOptionalParams.customerDisplayName;
|
|
2212
2300
|
|
|
2213
2301
|
if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
|
|
2214
|
-
|
|
2302
|
+
_context28.next = 7;
|
|
2215
2303
|
break;
|
|
2216
2304
|
}
|
|
2217
2305
|
|
|
@@ -2232,25 +2320,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2232
2320
|
method: "POST",
|
|
2233
2321
|
url: endpoint
|
|
2234
2322
|
};
|
|
2235
|
-
return
|
|
2236
|
-
var
|
|
2323
|
+
return _context28.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2324
|
+
var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(resolve, reject) {
|
|
2237
2325
|
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds15;
|
|
2238
2326
|
|
|
2239
|
-
return _regenerator["default"].wrap(function
|
|
2327
|
+
return _regenerator["default"].wrap(function _callee27$(_context27) {
|
|
2240
2328
|
while (1) {
|
|
2241
|
-
switch (
|
|
2329
|
+
switch (_context27.prev = _context27.next) {
|
|
2242
2330
|
case 0:
|
|
2243
|
-
|
|
2244
|
-
|
|
2331
|
+
_context27.prev = 0;
|
|
2332
|
+
_context27.next = 3;
|
|
2245
2333
|
return axiosInstance(options);
|
|
2246
2334
|
|
|
2247
2335
|
case 3:
|
|
2248
|
-
response =
|
|
2336
|
+
response = _context27.sent;
|
|
2249
2337
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2250
2338
|
data = response.data;
|
|
2251
2339
|
|
|
2252
|
-
if (
|
|
2253
|
-
|
|
2340
|
+
if (_this12.logger) {
|
|
2341
|
+
_this12.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, {
|
|
2254
2342
|
RequestId: requestId,
|
|
2255
2343
|
Region: data.Region,
|
|
2256
2344
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
@@ -2259,54 +2347,54 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2259
2347
|
}
|
|
2260
2348
|
|
|
2261
2349
|
resolve();
|
|
2262
|
-
|
|
2350
|
+
_context27.next = 18;
|
|
2263
2351
|
break;
|
|
2264
2352
|
|
|
2265
2353
|
case 10:
|
|
2266
|
-
|
|
2267
|
-
|
|
2354
|
+
_context27.prev = 10;
|
|
2355
|
+
_context27.t0 = _context27["catch"](0);
|
|
2268
2356
|
_elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
|
|
2269
2357
|
|
|
2270
|
-
if (!
|
|
2271
|
-
|
|
2358
|
+
if (!_this12.logger) {
|
|
2359
|
+
_context27.next = 17;
|
|
2272
2360
|
break;
|
|
2273
2361
|
}
|
|
2274
2362
|
|
|
2275
|
-
|
|
2276
|
-
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(
|
|
2363
|
+
_context27.next = 16;
|
|
2364
|
+
return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context27.t0);
|
|
2277
2365
|
|
|
2278
2366
|
case 16:
|
|
2279
|
-
|
|
2367
|
+
_this12.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, {
|
|
2280
2368
|
RequestId: requestId,
|
|
2281
|
-
ExceptionDetails:
|
|
2369
|
+
ExceptionDetails: _context27.t0,
|
|
2282
2370
|
ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds15
|
|
2283
2371
|
}, "Send Typing Indicator Failed");
|
|
2284
2372
|
|
|
2285
2373
|
case 17:
|
|
2286
|
-
reject(
|
|
2374
|
+
reject(_context27.t0);
|
|
2287
2375
|
|
|
2288
2376
|
case 18:
|
|
2289
2377
|
case "end":
|
|
2290
|
-
return
|
|
2378
|
+
return _context27.stop();
|
|
2291
2379
|
}
|
|
2292
2380
|
}
|
|
2293
|
-
},
|
|
2381
|
+
}, _callee27, null, [[0, 10]]);
|
|
2294
2382
|
}));
|
|
2295
2383
|
|
|
2296
|
-
return function (
|
|
2297
|
-
return
|
|
2384
|
+
return function (_x48, _x49) {
|
|
2385
|
+
return _ref12.apply(this, arguments);
|
|
2298
2386
|
};
|
|
2299
2387
|
}()));
|
|
2300
2388
|
|
|
2301
2389
|
case 14:
|
|
2302
2390
|
case "end":
|
|
2303
|
-
return
|
|
2391
|
+
return _context28.stop();
|
|
2304
2392
|
}
|
|
2305
2393
|
}
|
|
2306
|
-
},
|
|
2394
|
+
}, _callee28, this);
|
|
2307
2395
|
}));
|
|
2308
2396
|
|
|
2309
|
-
function sendTypingIndicator(
|
|
2397
|
+
function sendTypingIndicator(_x46, _x47) {
|
|
2310
2398
|
return _sendTypingIndicator.apply(this, arguments);
|
|
2311
2399
|
}
|
|
2312
2400
|
|
|
@@ -2318,8 +2406,9 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2318
2406
|
|
|
2319
2407
|
exports["default"] = SDK;
|
|
2320
2408
|
(0, _defineProperty2["default"])(SDK, "defaultConfiguration", {
|
|
2321
|
-
getChatTokenRetryCount:
|
|
2409
|
+
getChatTokenRetryCount: 10,
|
|
2322
2410
|
getChatTokenTimeBetweenRetriesOnFailure: 10000,
|
|
2411
|
+
getChatTokenRetryOn429: false,
|
|
2323
2412
|
maxRequestRetriesOnFailure: 3
|
|
2324
2413
|
});
|
|
2325
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiRXJyb3IiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJDaGFubmVsSWQiLCJpbmNsdWRlcyIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZyIsIkxvZ0xldmVsIiwiSU5GTyIsIk9DU0RLVGVsZW1ldHJ5RXZlbnQiLCJHRVRDSEFUQ09ORklHIiwiUmVxdWVzdElkIiwiZW5kcG9pbnQiLCJvcmdVcmwiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJoZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJWMiIsIkdFVENIQVRDT05GSUdTVUNDRVNTIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib3B0aW9ucyIsIm1ldGhvZCIsInVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJFeGNlcHRpb25EZXRhaWxzIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEIiwic3RhdHVzIiwibm9Db250ZW50U3RhdHVzQ29kZSIsIkdFVENIQVRUT0tFTkZBSUxFRCIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJzZXRUaW1lb3V0IiwiZ2V0Q2hhdFRva2VuIiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwidHJhbnNhY3Rpb25pZCIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsIldBUk4iLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUUVVFVUVBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0UXVldWVBdmFpbGFiaWxpdHlQYXRoIiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0Iiwid2luZG93IiwiZG9jdW1lbnQiLCJicm93c2VyIiwiQnJvd3NlckluZm8iLCJnZXRCcm93c2VyTmFtZSIsImRldmljZSIsIkRldmljZUluZm8iLCJnZXREZXZpY2VUeXBlIiwib3JpZ2ludXJsIiwibG9jYXRpb24iLCJocmVmIiwib3MiLCJPU0luZm8iLCJnZXRPc1R5cGUiLCJsb2NhbGUiLCJkZWZhdWx0TG9jYWxlIiwiTG9jYWxlcyIsInN1cHBvcnRlZExvY2FsZXMiLCJHRVRRVUVVRUFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIkdFVFFVRVVFQVZBSUxBQklMSVRZRkFJTEVEIiwic2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05JTklUU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRoIiwiU0VTU0lPTklOSVRTVUNDRUVERUQiLCJTRVNTSU9OSU5JVEZBSUxFRCIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTkNMT1NFU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aCIsImlzUmVjb25uZWN0Q2hhdCIsImlzUGVyc2lzdGVudENoYXQiLCJjaGF0SWQiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRoIiwiU0VTU0lPTkNMT1NFU1VDQ0VFREVEIiwiU0VTU0lPTkNMT1NFRkFJTEVEIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwiRXJyb3JDb2RlIiwidG9TdHJpbmciLCJwb3N0Q2hhdFJlc3BvbnNlIiwic3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIiwiU1VCTUlUUE9TVENIQVRTVEFSVEVEIiwiTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGgiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJKU09OIiwic3RyaW5naWZ5IiwiU1VCTUlUUE9TVENIQVRTVUNDRUVERUQiLCJTVUJNSVRQT1NUQ0hBVEZBSUxFRCIsInN1cnZleU93bmVySWQiLCJzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSIsImdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyIsIkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVEIiwiU3VydmV5T3duZXJJZCIsIkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJMaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIndpZGdldEFwcElkIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCIsIkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQiLCJ0b2tlbiIsImdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJvcmdhbml6YXRpb25JZCIsImF1dGhvcml6YXRpb24iLCJMaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJHRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCIsIkdFVENIQVRUUkFOU0NSSVBURkFJTEVEIiwiZW1haWxSZXF1ZXN0Qm9keSIsImVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIiwiRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJMaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCIsIkVNQUlMVFJBTlNDUklQVEZBSUxFRCIsIkZFVENIREFUQU1BU0tJTkdTVEFSVEVEIiwiTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGgiLCJGRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVEIiwiRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCIsInNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5Iiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCIsIkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJkZWZhdWx0Q2hhbm5lbElkIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJTRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVEIiwiU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBb0JBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7SUFFcUJBLEc7QUFTbkIsZUFBMkJDLHdCQUEzQixFQUFtTDtBQUFBLFFBQTNGQyxhQUEyRix1RUFBeERGLEdBQUcsQ0FBQ0csb0JBQW9EO0FBQUEsUUFBdEJDLE1BQXNCO0FB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Ly8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFubmVsSWQsIExpdmVDaGF0VmVyc2lvbiB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IElEYXRhTWFza2luZ0luZm8gZnJvbSBcIi4vSW50ZXJmYWNlcy9JRGF0YU1hc2tpbmdJbmZvXCI7XG5pbXBvcnQgSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSU9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zXCI7XG5pbXBvcnQgSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXNcIlxuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSW5pdENvbnRleHQgZnJvbSBcIi4vTW9kZWwvSW5pdENvbnRleHRcIjtcbmltcG9ydCBMb2NhbGVzIGZyb20gXCIuL0NvbW1vbi9Mb2NhbGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nU2FuaXRpemVyIH0gZnJvbSBcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IE9DU0RLTG9nZ2VyIGZyb20gXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiO1xuaW1wb3J0IHsgT0NTREtUZWxlbWV0cnlFdmVudCB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSBcIi4vVXRpbHMvT1NJbmZvXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxFbmRwb2ludHMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxIVFRQSGVhZGVycyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSBcIi4vQ29tbW9uL01hcHBpbmdzXCI7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gXCIuL1V0aWxzL1RpbWVyXCI7XG5pbXBvcnQgYXhpb3NSZXRyeSBmcm9tIFwiLi9VdGlscy9heGlvc1JldHJ5XCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9VdGlscy91dWlkXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNESyBpbXBsZW1lbnRzIElTREsge1xuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0Q29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMzUsXG4gICAgZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlOiAxMDAwMCxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogM1xuICB9O1xuICBcbiAgbGl2ZUNoYXRWZXJzaW9uOiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb21uaWNoYW5uZWxDb25maWd1cmF0aW9uOiBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uLCBwcml2YXRlIGNvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uLCBwcml2YXRlIGxvZ2dlcj86IE9DU0RLTG9nZ2VyKSB7XG4gICAgLy8gU2V0cyB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgcGFzc2VkIGNvbmZpZ3VyYXRpb24gaXMgZW1wdHkgb3IgaXMgbm90IGFuIG9iamVjdFxuICAgIGlmICghT2JqZWN0LmtleXModGhpcy5jb25maWd1cmF0aW9uKS5sZW5ndGggfHwgdHlwZW9mIChjb25maWd1cmF0aW9uKSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIFNESyBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBTREtDb25maWd1cmF0aW9uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgY29uc3QgeyBjaGFubmVsSWQgfSA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQ2hhbm5lbElkKS5pbmNsdWRlcyhjaGFubmVsSWQgYXMgQ2hhbm5lbElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWxJZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob21uaWNoYW5uZWxDb25maWd1cmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUcsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWR9LFxuICAgICAgICBcIkdldCBDaGF0IENvbmZpZyBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfT9yZXF1ZXN0SWQ9JHtyZXF1ZXN0SWR9JmNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgICBpZiAoYnlwYXNzQ2FjaGUpIHtcbiAgICAgIGhlYWRlcnMgPSB7IC4uLkNvbnN0YW50cy5ieXBhc3NDYWNoZUhlYWRlcnMsIC4uLmhlYWRlcnMgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldChlbmRwb2ludCwge1xuICAgICAgaGVhZGVycyxcbiAgICB9KTtcbiAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgIGlmIChkYXRhLkxpdmVDaGF0VmVyc2lvbiAmJiBkYXRhLkxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgIH1cbiAgICBkYXRhLmhlYWRlcnMgPSB7fTtcbiAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgZGF0YS5oZWFkZXJzW1wiZGF0ZVwiXSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRVNTLFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBjb25maWcgc3VjY2VlZGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExXSSBkZXRhaWxzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgTFdJIERldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TFdJRGV0YWlscyhyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgcmVjb25uZWN0IGlkIG9uIHRoZSBlbmRwb2ludCBpZiB2YWlsYWJsZVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgZW5kcG9pbnQgKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIGVuZHBvaW50ICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgZmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBjaGF0IHRva2VuIGZyb20gT21uaWNoYW5uZWwgdG8gam9pbiBUMSB0aHJlYWQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIGdldGNoYXR0b2tlbiAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRva2VuLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUb2tlbihyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyA9IHt9LCBjdXJyZW50UmV0cnlDb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8RmV0Y2hDaGF0VG9rZW5SZXNwb25zZT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzXG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzOyAgXG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICBlbmRwb2ludCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIGNoYXQgdG9rZW4gcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICAgIFwiR2V0IENoYXQgVG9rZW4gU3VjY2VlZGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNvbnRlbnQgZm9yIHJlY29ubmVjdCBjaGF0IGNhc2Ugc2hvdWxkbid0IGJlIHJldHJpZWQuXG4gICAgICAgIGlmIChyZWNvbm5lY3RJZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IENvbnN0YW50cy5ub0NvbnRlbnRTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTkZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IENoYXQgVG9rZW4gRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQmFzZSBjYXNlXG4gICAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgKyAxID49IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50KSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRoZSByZXRyeSBmb3IgZ2V0Y2hhdHRva2VuIGhhcyBleGNlZWRlZCBpdHMgbWF4IHZhbHVlIG9mICR7dGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5Q291bnR9YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHJpZXMgdW50aWwgaXQgcmVhY2hlcyBpdHMgbGltaXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmdldENoYXRUb2tlbihyZXF1ZXN0SWQsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zLCBjdXJyZW50UmV0cnlDb3VudCArIDEpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNvbHZlKHJlc3BvbnNlKSkuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKTtcbiAgICAgIH0sIHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0YWJsZUNoYXRzKHJlY29ubmVjdGFibGVDaGF0c1BhcmFtczogSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyk6IFByb21pc2U8UmVjb25uZWN0TWFwcGluZ1JlY29yZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcztcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBjaGF0IFN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIHJlY29ubmVjdGFibGUgY2hhdHMgcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgICBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgaW4gdGhlIG9sZCBzZXNzaW9ucyBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUyxcbiAgICAgICAgICAgIHsgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgICAvKipcbiAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkocmVjb25uZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8UmVjb25uZWN0QXZhaWxhYmlsaXR5PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IHN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlY29ubmVjdElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgICBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuV0FSTixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSB9LFxuICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFF1ZXVlQXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFFVRVVFQVZBSUxBQklMSVRZU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBxdWV1ZSBhdmFpbGFiaWxpdHkgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRRdWV1ZUF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHthdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHtkYXRhfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZihkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRRVUVVRUFWQUlMQUJJTElUWVNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICAgIFwiR2V0IHF1ZXVlIGF2YWlsYWJpbGl0eSBTdWNjZWVkZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFFVRVVFQVZBSUxBQklMSVRZRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgcXVldWUgYXZhaWxhYmlsaXR5IGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIHNlc3Npb24gdG8gb21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uSW5pdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgZW5kcG9pbnQgKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIGVuZHBvaW50ICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlNlc3Npb24gSW5pdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIlNlc3Npb24gSW5pdCBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gY2xvc2UgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25DbG9zZShyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQsIGNoYXRJZH0gPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWNvbm5lY3RDaGF0KSB7XG4gICAgICBlbmRwb2ludCArPSBgJmlzUmVjb25uZWN0Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBpZiAoaXNQZXJzaXN0ZW50Q2hhdCl7XG4gICAgICBlbmRwb2ludCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIENsb3NlIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIENsb3NlIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGF1dGggY2hhdCByZWNvcmQgZXhpc3RzIGluIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkKHJlcXVlc3RJZDogc3RyaW5nLCB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCB9ID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBpZiAocmVzcG9uc2UuZGF0YT8uYXV0aENoYXRFeGlzdCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmxvZ2dlcj8ubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdWNjZWVkZWRcIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZ2dlcj8ubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSwgRXJyb3JDb2RlOiByZXNwb25zZS5zdGF0dXN9LFxuICAgICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgdGhpcy5sb2dnZXI/LmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkXCIpO1xuICAgICAgICBpZiAoZXJyb3IudG9TdHJpbmcoKSA9PT0gXCJFcnJvcjogUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSA0MDRcIikgeyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTdWJtaXQgUG9zdCBDaGF0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3RDaGF0UmVzcG9uc2UpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiU3VibWl0IFBvc3QgQ2hhdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIlN1Ym1pdCBQb3N0IENoYXQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTdXJ2ZXlJbnZpdGVMaW5rKHN1cnZleU93bmVySWQ6IHN0cmluZywgc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHk6IG9iamVjdCwgZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zOiBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVELFxuICAgICAgICB7IFN1cnZleU93bmVySWQ6IHN1cnZleU93bmVySWQgfSxcbiAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuICkge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdElkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIH0sXG4gICAgICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBjaGF0SWQgQ2hhdCB0aHJlYWQgSWQuXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUcmFuc2NyaXB0cyhyZXF1ZXN0SWQ6IHN0cmluZywgY2hhdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKXtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gOyAgICAgIFxuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYWlsIHRyYW5zY3JpcHQgdG8gY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBlbWFpbFJlcXVlc3RCb2R5IEVtYWlsIHJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGVtYWlsIHRyYW5zY3JpcHQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1haWxUcmFuc2NyaXB0KHJlcXVlc3RJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBlbWFpbFJlcXVlc3RCb2R5OiBvYmplY3QsIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zOiBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJFbWFpbCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJFbWFpbCBUcmFuc2NyaXB0IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGRhdGEgbWFza2luZyBpbmZvIG9mIHRoZSBvcmcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhTWFza2luZ0luZm8ocmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPElEYXRhTWFza2luZ0luZm8+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiRmV0Y2ggRGF0YSBNYXNraW5nIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50IG5ldHdvcmsgY2FsbCB0byBPbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudFxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkgc2Vjb25kYXJ5Q2hhbm5lbCBldmVudCByZXF1ZXN0IGJvZHlcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHk6IG9iamVjdCwgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM6IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICB9XG5cbiAgICBlbmRwb2ludCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IGRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3VjY2VlZGVkXCIpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7ICAgXG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBpZiAoY3VzdG9tZXJEaXNwbGF5TmFtZSkge1xuICAgICAgaGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiBkYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59Il19
|
|
2414
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZyIsIkxvZ0xldmVsIiwiSU5GTyIsIk9DU0RLVGVsZW1ldHJ5RXZlbnQiLCJHRVRDSEFUQ09ORklHIiwiUmVxdWVzdElkIiwiZW5kcG9pbnQiLCJvcmdVcmwiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJoZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJWMiIsIkdFVENIQVRDT05GSUdTVUNDRVNTIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib3B0aW9ucyIsIm1ldGhvZCIsInVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJFeGNlcHRpb25EZXRhaWxzIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJkZXNjcmlwdGlvbiIsImN1c3RvbURhdGEiLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJMaXZlQ2hhdEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyR2V0Q2hhdFRva2VuUGF0aCIsIkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRva2VuUGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUb2tlblBhdGgiLCJxdWVyeVBhcmFtcyIsInJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5SZXRyeU9uNDI5IiwiUmVxdWVzdFBhdGgiLCJSZXF1ZXN0TWV0aG9kIiwiUmVzcG9uc2VTdGF0dXNDb2RlIiwic3RhdHVzIiwiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEIiwibm9Db250ZW50U3RhdHVzQ29kZSIsIkdFVENIQVRUT0tFTkZBSUxFRCIsInRvb01hbnlSZXF1ZXN0c1N0YXR1c0NvZGUiLCJnZXRDaGF0VG9rZW5SZXRyeUNvdW50Iiwic2V0VGltZW91dCIsImdldENoYXRUb2tlbiIsInRoZW4iLCJlcnJvciIsImdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSIsInJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUUyIsIkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aCIsInRyYW5zYWN0aW9uaWQiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFkiLCJMaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGgiLCJXQVJOIiwicXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCIsIkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aCIsImluaXRDb250ZXh0IiwiZ2V0Q29udGV4dCIsImNhY2hPYmoiLCJjdXN0b21Db250ZXh0RGF0YSIsInRlbXBBcnIiLCJDdXN0b21Db250ZXh0RGF0YSIsInNvcnQiLCJhc3NpZ24iLCJwb3J0YWxjb250YWN0aWQiLCJjYWNoZUtleSIsImhhc2giLCJjcmVhdGVIYXNoIiwidXBkYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRpZ2VzdCIsInRvU3RyaW5nIiwid2luZG93IiwiZG9jdW1lbnQiLCJicm93c2VyIiwiQnJvd3NlckluZm8iLCJnZXRCcm93c2VyTmFtZSIsImRldmljZSIsIkRldmljZUluZm8iLCJnZXREZXZpY2VUeXBlIiwib3JpZ2ludXJsIiwibG9jYXRpb24iLCJocmVmIiwib3MiLCJPU0luZm8iLCJnZXRPc1R5cGUiLCJsb2NhbGUiLCJkZWZhdWx0TG9jYWxlIiwiTG9jYWxlcyIsInN1cHBvcnRlZExvY2FsZXMiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVEIiwic2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05JTklUU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRoIiwicmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJzdHJpcEdlb2xvY2F0aW9uIiwiUmVxdWVzdFBheWxvYWQiLCJTRVNTSU9OSU5JVFNVQ0NFRURFRCIsIlNFU1NJT05JTklURkFJTEVEIiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCIsIkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGgiLCJhdXRoQ2hhdEV4aXN0IiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQiLCJFcnJvckNvZGUiLCJwb3N0Q2hhdFJlc3BvbnNlIiwic3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIiwiU1VCTUlUUE9TVENIQVRTVEFSVEVEIiwiTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGgiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsIkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQiLCJGRVRDSERBVEFNQVNLSU5HRkFJTEVEIiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVEIiwiTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsImRlZmF1bHRDaGFubmVsSWQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVEIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCIsInNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyIsImN1c3RvbWVyRGlzcGxheU5hbWUiLCJTZW5kVHlwaW5nSW5kaWNhdG9yUGF0aCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQiLCJTRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVEIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQW9CQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztJQUVxQkEsRztBQVVuQixlQUEyQkMsd0JBQTNCLEVBQW1MO0FBQUEsUUFBM0ZDLGFBQTJGLHVFQUF4REYsR0FBRyxDQUFDRyxvQkFBb0Q7QUFBQSxRQUF0QkMsTUFBc0I7QUFBQTtBQUFBLFNBQXhKSCx3QkFBd0osR0FBeEpBLHdCQUF3SjtBQUFBLFNBQTNGQyxhQUEyRixHQUEzRkEsYUFBMkY7QUFBQSxTQUF0QkUsTUFBc0IsR0FBdEJBLE1BQXNCO0FBQUE7O0FBQ2pMO0FBQ0EsUUFBSSxDQUFDQyxNQUFNLENBQUNDLElBQVAsQ0FBWSxLQUFLSixhQUFqQixFQUFnQ0ssTUFBakMsSUFBMkMseUJBQVFMLGFBQVIsTUFBMkIsUUFBMUUsRUFBb0Y7QUFDbEYsV0FBS0EsYUFBTCxHQUFxQkYsR0FBRyxDQUFDRyxvQkFBekI7QUFDRCxLQUpnTCxDQU1qTDs7O0FBQ0Esb0NBQWtCRSxNQUFNLENBQUNDLElBQVAsQ0FBWU4sR0FBRyxDQUFDRyxvQkFBaEIsQ0FBbEIsa0NBQXlEO0FBQXBELFVBQU1LLEdBQUcsbUJBQVQ7O0FBQ0gsVUFBSSxDQUFDLEtBQUtOLGFBQUwsQ0FBbUJPLGNBQW5CLENBQWtDRCxHQUFsQyxDQUFMLEVBQTZDO0FBQUU7QUFDN0MsYUFBS04sYUFB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dXJjZVJvb3QiOiJvY3NkazovLy8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFubmVsSWQsIExpdmVDaGF0VmVyc2lvbiB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IElEYXRhTWFza2luZ0luZm8gZnJvbSBcIi4vSW50ZXJmYWNlcy9JRGF0YU1hc2tpbmdJbmZvXCI7XG5pbXBvcnQgSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSU9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zXCI7XG5pbXBvcnQgSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXNcIlxuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSW5pdENvbnRleHQgZnJvbSBcIi4vTW9kZWwvSW5pdENvbnRleHRcIjtcbmltcG9ydCBMb2NhbGVzIGZyb20gXCIuL0NvbW1vbi9Mb2NhbGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nU2FuaXRpemVyIH0gZnJvbSBcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IE9DU0RLTG9nZ2VyIGZyb20gXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiO1xuaW1wb3J0IHsgT0NTREtUZWxlbWV0cnlFdmVudCB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSBcIi4vVXRpbHMvT1NJbmZvXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxFbmRwb2ludHMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxIVFRQSGVhZGVycyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSBcIi4vQ29tbW9uL01hcHBpbmdzXCI7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gXCIuL1V0aWxzL1RpbWVyXCI7XG5pbXBvcnQgYXhpb3NSZXRyeSBmcm9tIFwiLi9VdGlscy9heGlvc1JldHJ5XCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9VdGlscy91dWlkXCI7XG5pbXBvcnQgKiBhcyBoYXNoIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IEN1c3RvbUNvbnRleHREYXRhIH0gZnJvbSBcIi4vVXRpbHMvQ3VzdG9tQ29udGV4dERhdGFcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRDb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IHtcbiAgICBnZXRDaGF0VG9rZW5SZXRyeUNvdW50OiAxMCxcbiAgICBnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmU6IDEwMDAwLFxuICAgIGdldENoYXRUb2tlblJldHJ5T240Mjk6IGZhbHNlLFxuICAgIG1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlOiAzXG4gIH07XG5cbiAgbGl2ZUNoYXRWZXJzaW9uOiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb21uaWNoYW5uZWxDb25maWd1cmF0aW9uOiBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uLCBwcml2YXRlIGNvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uLCBwcml2YXRlIGxvZ2dlcj86IE9DU0RLTG9nZ2VyKSB7XG4gICAgLy8gU2V0cyB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgcGFzc2VkIGNvbmZpZ3VyYXRpb24gaXMgZW1wdHkgb3IgaXMgbm90IGFuIG9iamVjdFxuICAgIGlmICghT2JqZWN0LmtleXModGhpcy5jb25maWd1cmF0aW9uKS5sZW5ndGggfHwgdHlwZW9mIChjb25maWd1cmF0aW9uKSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIFNESyBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbltgJHtrZXl9YF0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUcsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWR9LFxuICAgICAgICBcIkdldCBDaGF0IENvbmZpZyBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfT9yZXF1ZXN0SWQ9JHtyZXF1ZXN0SWR9JmNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgICBpZiAoYnlwYXNzQ2FjaGUpIHtcbiAgICAgIGhlYWRlcnMgPSB7IC4uLkNvbnN0YW50cy5ieXBhc3NDYWNoZUhlYWRlcnMsIC4uLmhlYWRlcnMgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldChlbmRwb2ludCwge1xuICAgICAgaGVhZGVycyxcbiAgICB9KTtcbiAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgIGlmIChkYXRhLkxpdmVDaGF0VmVyc2lvbiAmJiBkYXRhLkxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgIH1cbiAgICBkYXRhLmhlYWRlcnMgPSB7fTtcbiAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgZGF0YS5oZWFkZXJzW1wiZGF0ZVwiXSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRVNTLFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBjb25maWcgc3VjY2VlZGVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExXSSBkZXRhaWxzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgTFdJIERldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TFdJRGV0YWlscyhyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgcmVjb25uZWN0IGlkIG9uIHRoZSBlbmRwb2ludCBpZiB2YWlsYWJsZVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgZW5kcG9pbnQgKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIGVuZHBvaW50ICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJHZXQgTFdJIERldGFpbHMgZmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBjaGF0IHRva2VuIGZyb20gT21uaWNoYW5uZWwgdG8gam9pbiBUMSB0aHJlYWQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIGdldGNoYXR0b2tlbiAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRva2VuLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUb2tlbihyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyA9IHt9LCBjdXJyZW50UmV0cnlDb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8RmV0Y2hDaGF0VG9rZW5SZXNwb25zZT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzXG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIjtcbiAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICAgIFJlcXVlc3RJZDogcmVxdWVzdElkLFxuICAgICAgfVxuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1RBUlRFRCwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBgY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgcmVxdWVzdFBhdGggKz0gYD8ke3F1ZXJ5UGFyYW1zfWA7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybFxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSwgcmV0cnlPbjQyOTogdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjkgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIGNoYXQgdG9rZW4gcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcblxuICAgICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRGF0YSA9IHtcbiAgICAgICAgICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sXG4gICAgICAgICAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSxcbiAgICAgICAgICAgICAgUmVxdWVzdFBhdGg6IHJlcXVlc3RQYXRoLFxuICAgICAgICAgICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IFwiR2V0IENoYXQgVG9rZW4gU3VjY2VlZGVkXCI7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gY29udGVudCBmb3IgcmVjb25uZWN0IGNoYXQgY2FzZSBzaG91bGRuJ3QgYmUgcmV0cmllZC5cbiAgICAgICAgaWYgKHJlY29ubmVjdElkICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gQ29uc3RhbnRzLm5vQ29udGVudFN0YXR1c0NvZGUpIHtcbiAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG5cbiAgICAgICAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICAgICAgICBFeGNlcHRpb25EZXRhaWxzOiBlcnJvcixcbiAgICAgICAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICAgICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlLnN0YXR1cyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBcIkdldCBDaGF0IFRva2VuIEZhaWxlZFwiO1xuXG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTkZBSUxFRCwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcCByZXRyeSBvbiA0MjlcbiAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLnJlc3BvbnNlLnN0YXR1cyA9PT0gQ29uc3RhbnRzLnRvb01hbnlSZXF1ZXN0c1N0YXR1c0NvZGUgJiYgIXRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gcmV0dXJuL3JlamVjdCB0byByZWN1cnNpdmVseSByZXRyeSBvbiBmYWlsdXJlcyB1cCB0byBjaGF0IHRva2VuIHJldHJ5IGNvdW50IGxpbWl0XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2UgY2FzZVxuICAgICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50ICsgMSA+PSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaGUgcmV0cnkgZm9yIGdldGNoYXR0b2tlbiBoYXMgZXhjZWVkZWQgaXRzIG1heCB2YWx1ZSBvZiAke3RoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50fWApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHVudGlsIGl0IHJlYWNoZXMgaXRzIGxpbWl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDaGF0VG9rZW4ocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQgKyAxKS50aGVuKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgICB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIGluIHRoZSBvbGQgc2Vzc2lvbnMgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gICAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RJZH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksXG4gICAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBTdWNjZWVkZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLldBUk4sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGEuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICAgICAgeyBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHthdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBjb25zdCBjYWNoT2JqID0ge1xuICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgIFwid2lkZ2V0SWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWRcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICBjb25zdCB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGEuc29ydChkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwge1wiY3VzdG9tQ29udGV4dFwiOiB0ZW1wQXJyfSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEucG9ydGFsY29udGFjdGlkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwge1wicG9ydGFsY29udGFjdGlkXCI6IGRhdGEucG9ydGFsY29udGFjdGlkfSk7XG4gICAgfVxuXG4gICAgZGF0YS5jYWNoZUtleSA9IGhhc2guY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS5kaWdlc3QoJ2hleCcpLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHtkYXRhfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZihkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICAgIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdWNjZWVkZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIHNlc3Npb24gdG8gb21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uSW5pdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiO1xuICAgICAgY29uc3QgY3VzdG9tRGF0YSA9IHtcbiAgICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNUQVJURUQsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBgY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgcmVxdWVzdFBhdGggKz0gYD8ke3F1ZXJ5UGFyYW1zfWA7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuXG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG5cbiAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHsuLi5kYXRhfTtcblxuICAgICAgICBpZiAocmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMocmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2UocmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbihyZXF1ZXN0UGF5bG9hZCk7XG5cbiAgICAgICAgY29uc3QgY3VzdG9tRGF0YSA9IHtcbiAgICAgICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgICAgICBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLFxuICAgICAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdLFxuICAgICAgICAgIFJlcXVlc3RQYXlsb2FkOiByZXF1ZXN0UGF5bG9hZCxcbiAgICAgICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICAgICAgUmVxdWVzdE1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBcIlNlc3Npb24gSW5pdCBTdWNjZWVkZWRcIjtcblxuICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gey4uLmRhdGF9O1xuXG4gICAgICAgIGlmIChyZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhyZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKSB7XG4gICAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFByZUNoYXRSZXNwb25zZShyZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEdlb2xvY2F0aW9uKHJlcXVlc3RQYXlsb2FkKTtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG5cbiAgICAgICAgY29uc3QgY3VzdG9tRGF0YSA9IHtcbiAgICAgICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgICAgICBFeGNlcHRpb25EZXRhaWxzOiBlcnJvcixcbiAgICAgICAgICBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIFJlcXVlc3RQYXlsb2FkOiByZXF1ZXN0UGF5bG9hZCxcbiAgICAgICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICAgICAgUmVxdWVzdE1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogKGVycm9yIGFzIGFueSkucmVzcG9uc2Uuc3RhdHVzIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gXCJTZXNzaW9uIEluaXQgRmFpbGVkXCI7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVEZBSUxFRCwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGNsb3NlIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBjbG9zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uQ2xvc2UocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTZXNzaW9uIENsb3NlIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWR9ID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgY29uc3QgZGF0YTogYW55ID0ge307IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGRhdGEuY2hhdElkID0gY2hhdElkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgaWYgKGlzUmVjb25uZWN0Q2hhdCkge1xuICAgICAgZW5kcG9pbnQgKz0gYCZpc1JlY29ubmVjdENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyc2lzdGVudENoYXQpe1xuICAgICAgZW5kcG9pbnQgKz0gYCZpc1BlcnNpc3RlbnRDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiU2Vzc2lvbiBDbG9zZSBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgICAgIFwiU2Vzc2lvbiBDbG9zZSBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBhdXRoIGNoYXQgcmVjb3JkIGV4aXN0cyBpbiBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZChyZXF1ZXN0SWQ6IHN0cmluZywgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXI/LmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3VjY2VlZGVkXCIpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dnZXI/LmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0sIEVycm9yQ29kZTogcmVzcG9uc2Uuc3RhdHVzfSxcbiAgICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgIHRoaXMubG9nZ2VyPy5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZFwiKTtcbiAgICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlKHJlcXVlc3RJZDogc3RyaW5nLCBwb3N0Q2hhdFJlc3BvbnNlOiBvYmplY3QsIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlN1Ym1pdCBQb3N0IENoYXQgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJTdWJtaXQgUG9zdCBDaGF0IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3VydmV5SW52aXRlTGluayhzdXJ2ZXlPd25lcklkOiBzdHJpbmcsIHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5OiBvYmplY3QsIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtczogSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCxcbiAgICAgICAgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sXG4gICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlcXVlc3RJZCB9ID0gZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zO1xuXG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbiApIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVELFxuICAgICAgICAgICAgeyBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBDaGF0IFRyYW5zY3JpcHQgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKHRoaXMubGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIgfHwgKGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gJiYgY3VycmVudExpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSl7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIkdldCBDaGF0IFRyYW5zY3JpcHQgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVEZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWFpbCB0cmFuc2NyaXB0IHRvIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZW1haWxSZXF1ZXN0Qm9keSBFbWFpbCByZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBlbWFpbCB0cmFuc2NyaXB0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVtYWlsVHJhbnNjcmlwdChyZXF1ZXN0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZW1haWxSZXF1ZXN0Qm9keTogb2JqZWN0LCBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtczogSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZW1haWxSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiRW1haWwgVHJhbnNjcmlwdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJFbWFpbCBUcmFuc2NyaXB0IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJGZXRjaCBEYXRhIE1hc2tpbmcgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIkZldGNoIERhdGEgTWFza2luZyBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkZldGNoIERhdGEgTWFza2luZyBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgfVxuXG4gICAgZW5kcG9pbnQgKz0gXCI/Y2hhbm5lbElkPVwiICsgQ29uc3RhbnRzLmRlZmF1bHRDaGFubmVsSWQ7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQsXG4gICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiBkYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQsXG4gICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBGYWlsZWRcIik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKiogU2VuZCB0eXBpbmcgaW5kaWNhdG9yXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUeXBpbmdJbmRpY2F0b3IocmVxdWVzdElkOiBzdHJpbmcsIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb246IG51bWJlciwgc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zOiBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBhdm9pZGluZyBsb2dnaW5nIEluZm8gZm9yIHR5cGluZ2luZGljYXRvciB0byByZWR1Y2UgbG9nIHRyYWZmaWNcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGN1c3RvbWVyRGlzcGxheU5hbWUgfSA9IHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcztcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7IHRocm93IG5ldyBFcnJvcignVHlwaW5nIGluZGljYXRvciBpcyBvbmx5IHN1cHBvcnRlZCBvbiB2MicpIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5TZW5kVHlwaW5nSW5kaWNhdG9yUGF0aH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICBoZWFkZXJzW0NvbnN0YW50cy5jdXN0b21lckRpc3BsYXlOYW1lXSA9IGN1c3RvbWVyRGlzcGxheU5hbWU7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IGRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|