botframework-directlinejs 0.15.4 → 0.15.5-master.d07e655
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -36
- package/dist/directline.js +1 -1
- package/dist/stats.json +2372 -318
- package/lib/createDeferred.d.ts +1 -1
- package/lib/directLine.d.ts +9 -9
- package/lib/directLine.js +1 -1
- package/lib/directLine.mock.d.ts +3 -3
- package/lib/directLineStreaming.d.ts +6 -0
- package/lib/directLineStreaming.js +82 -42
- package/lib/streaming/NetworkInformation.d.js +6 -0
- package/lib/streaming/WebSocketClientWithNetworkInformation.d.ts +20 -0
- package/lib/streaming/WebSocketClientWithNetworkInformation.js +130 -0
- package/package.json +2 -2
package/lib/createDeferred.d.ts
CHANGED
package/lib/directLine.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ export interface Conversation {
|
|
|
31
31
|
streamUrl?: string;
|
|
32
32
|
referenceGrammarId?: string;
|
|
33
33
|
}
|
|
34
|
-
export
|
|
34
|
+
export type MediaType = "image/png" | "image/jpg" | "image/jpeg" | "image/gif" | "image/svg+xml" | "audio/mpeg" | "audio/mp4" | "video/mp4";
|
|
35
35
|
export interface Media {
|
|
36
36
|
contentType: MediaType;
|
|
37
37
|
contentUrl: string;
|
|
@@ -44,8 +44,8 @@ export interface UnknownMedia {
|
|
|
44
44
|
name?: string;
|
|
45
45
|
thumbnailUrl?: string;
|
|
46
46
|
}
|
|
47
|
-
export
|
|
48
|
-
export
|
|
47
|
+
export type CardActionTypes = "call" | "downloadFile" | "imBack" | "messageBack" | "openUrl" | "playAudio" | "playVideo" | "postBack" | "signin" | "showImage";
|
|
48
|
+
export type CardAction = CallCardAction | DownloadFileCardAction | IMBackCardAction | MessageBackCardAction | OpenURLCardAction | PlayAudioCardAction | PlayVideoCardAction | PostBackCardAction | SignInCardAction | ShowImageCardAction;
|
|
49
49
|
export interface CallCardAction {
|
|
50
50
|
image?: string;
|
|
51
51
|
title: string;
|
|
@@ -64,7 +64,7 @@ export interface IMBackCardAction {
|
|
|
64
64
|
type: "imBack";
|
|
65
65
|
value: string;
|
|
66
66
|
}
|
|
67
|
-
export
|
|
67
|
+
export type MessageBackCardAction = MessageBackWithImage | MessageBackWithTitle;
|
|
68
68
|
export interface MessageBackWithImage {
|
|
69
69
|
displayText?: string;
|
|
70
70
|
image: string;
|
|
@@ -252,9 +252,9 @@ export interface AnimationCard {
|
|
|
252
252
|
autostart?: boolean;
|
|
253
253
|
};
|
|
254
254
|
}
|
|
255
|
-
export
|
|
256
|
-
export
|
|
257
|
-
export
|
|
255
|
+
export type KnownMedia = Media | HeroCard | Thumbnail | Signin | OAuth | Receipt | AudioCard | VideoCard | AnimationCard | FlexCard | AdaptiveCard;
|
|
256
|
+
export type Attachment = KnownMedia | UnknownMedia;
|
|
257
|
+
export type UserRole = "bot" | "channel" | "user";
|
|
258
258
|
export interface User {
|
|
259
259
|
id: string;
|
|
260
260
|
name?: string;
|
|
@@ -273,7 +273,7 @@ export interface IActivity {
|
|
|
273
273
|
id?: string;
|
|
274
274
|
timestamp?: string;
|
|
275
275
|
}
|
|
276
|
-
export
|
|
276
|
+
export type AttachmentLayout = "list" | "carousel";
|
|
277
277
|
export interface Message extends IActivity {
|
|
278
278
|
type: "message";
|
|
279
279
|
text?: string;
|
|
@@ -298,7 +298,7 @@ export interface EventActivity extends IActivity {
|
|
|
298
298
|
name: string;
|
|
299
299
|
value: any;
|
|
300
300
|
}
|
|
301
|
-
export
|
|
301
|
+
export type Activity = Message | Typing | EventActivity;
|
|
302
302
|
export interface ActivityGroup {
|
|
303
303
|
activities: Activity[];
|
|
304
304
|
watermark: string;
|
package/lib/directLine.js
CHANGED
|
@@ -757,7 +757,7 @@ var DirectLine = /*#__PURE__*/function () {
|
|
|
757
757
|
clientAgent += "; ".concat(customAgent);
|
|
758
758
|
}
|
|
759
759
|
|
|
760
|
-
return "".concat(DIRECT_LINE_VERSION, " (").concat(clientAgent, " ").concat("0.15.
|
|
760
|
+
return "".concat(DIRECT_LINE_VERSION, " (").concat(clientAgent, " ").concat("0.15.5-master.d07e655", ")");
|
|
761
761
|
}
|
|
762
762
|
}, {
|
|
763
763
|
key: "setUserId",
|
package/lib/directLine.mock.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export declare const mockActivity: (text: string) => DirectLineExport.Activity;
|
|
|
5
5
|
interface ActivitySocket {
|
|
6
6
|
play: (start: number, after: number) => void;
|
|
7
7
|
}
|
|
8
|
-
export
|
|
8
|
+
export type Socket = WebSocket & ActivitySocket;
|
|
9
9
|
export interface Conversation {
|
|
10
10
|
sockets: Set<Socket>;
|
|
11
11
|
conversationId: string;
|
|
@@ -19,9 +19,9 @@ export interface Server {
|
|
|
19
19
|
export declare const mockServer: (scheduler: TestScheduler) => Server;
|
|
20
20
|
export declare const injectClose: (server: Server) => void;
|
|
21
21
|
export declare const injectNewToken: (server: Server) => void;
|
|
22
|
-
|
|
22
|
+
type ajaxType = (urlOrRequest: string | AjaxRequest) => AjaxResponse;
|
|
23
23
|
export declare const mockAjax: (server: Server, customAjax?: ajaxType) => AjaxCreationMethod;
|
|
24
|
-
|
|
24
|
+
type WebSocketConstructor = typeof WebSocket;
|
|
25
25
|
export declare const mockWebSocket: (server: Server) => WebSocketConstructor;
|
|
26
26
|
export declare const mockServices: (server: Server, scheduler: TestScheduler) => DirectLineExport.Services;
|
|
27
27
|
export {};
|
|
@@ -6,8 +6,14 @@ interface DirectLineStreamingOptions {
|
|
|
6
6
|
conversationId?: string;
|
|
7
7
|
domain: string;
|
|
8
8
|
botAgent?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Sets the [`NetworkInformation` API](https://developer.mozilla.org/en-US/docs/Web/API/Network_Information_API).
|
|
11
|
+
* When the `NetworkInformation` detect network changes or offline, it will disconnect the Web Socket and reconnect it.
|
|
12
|
+
*/
|
|
13
|
+
networkInformation?: NetworkInformation;
|
|
9
14
|
}
|
|
10
15
|
export declare class DirectLineStreaming implements IBotConnection {
|
|
16
|
+
#private;
|
|
11
17
|
connectionStatus$: BehaviorSubject<ConnectionStatus>;
|
|
12
18
|
activity$: Observable<Activity>;
|
|
13
19
|
private activitySubscriber;
|
|
@@ -13,6 +13,10 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/h
|
|
|
13
13
|
|
|
14
14
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
15
15
|
|
|
16
|
+
var _classPrivateFieldGet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldGet"));
|
|
17
|
+
|
|
18
|
+
var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldSet"));
|
|
19
|
+
|
|
16
20
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
17
21
|
|
|
18
22
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
@@ -37,6 +41,8 @@ var _crossFetch = _interopRequireDefault(require("cross-fetch"));
|
|
|
37
41
|
|
|
38
42
|
var _directLine = require("./directLine");
|
|
39
43
|
|
|
44
|
+
var _WebSocketClientWithNetworkInformation = _interopRequireDefault(require("./streaming/WebSocketClientWithNetworkInformation"));
|
|
45
|
+
|
|
40
46
|
var _excluded = ["attachments"];
|
|
41
47
|
|
|
42
48
|
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); }
|
|
@@ -46,8 +52,8 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
46
52
|
var DIRECT_LINE_VERSION = 'DirectLine/3.0';
|
|
47
53
|
var MAX_RETRY_COUNT = 3;
|
|
48
54
|
var refreshTokenLifetime = 30 * 60 * 1000; //const refreshTokenLifetime = 5000;
|
|
55
|
+
// const timeout = 20 * 1000;
|
|
49
56
|
|
|
50
|
-
var timeout = 20 * 1000;
|
|
51
57
|
var refreshTokenInterval = refreshTokenLifetime / 2;
|
|
52
58
|
|
|
53
59
|
var StreamHandler = /*#__PURE__*/function () {
|
|
@@ -112,7 +118,7 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
112
118
|
|
|
113
119
|
case 15:
|
|
114
120
|
attachment = _context.sent;
|
|
115
|
-
dataUri =
|
|
121
|
+
dataUri = 'data:text/plain;base64,' + attachment;
|
|
116
122
|
attachments.push({
|
|
117
123
|
contentType: stream.contentType,
|
|
118
124
|
contentUrl: dataUri
|
|
@@ -151,7 +157,7 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
151
157
|
value: function flush() {
|
|
152
158
|
var _this = this;
|
|
153
159
|
|
|
154
|
-
this.connectionStatus$.subscribe(function (
|
|
160
|
+
this.connectionStatus$.subscribe(function () {});
|
|
155
161
|
this.activityQueue.forEach(function (a) {
|
|
156
162
|
return _this.subscriber.next(a);
|
|
157
163
|
});
|
|
@@ -166,6 +172,8 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
166
172
|
return StreamHandler;
|
|
167
173
|
}();
|
|
168
174
|
|
|
175
|
+
var _networkInformation = /*#__PURE__*/new WeakMap();
|
|
176
|
+
|
|
169
177
|
var DirectLineStreaming = /*#__PURE__*/function () {
|
|
170
178
|
function DirectLineStreaming(options) {
|
|
171
179
|
var _this2 = this;
|
|
@@ -173,6 +181,21 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
173
181
|
(0, _classCallCheck2["default"])(this, DirectLineStreaming);
|
|
174
182
|
(0, _defineProperty2["default"])(this, "connectionStatus$", new _BehaviorSubject.BehaviorSubject(_directLine.ConnectionStatus.Uninitialized));
|
|
175
183
|
(0, _defineProperty2["default"])(this, "_botAgent", '');
|
|
184
|
+
|
|
185
|
+
_networkInformation.set(this, {
|
|
186
|
+
writable: true,
|
|
187
|
+
value: void 0
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
// Rectifies `options.networkInformation`.
|
|
191
|
+
var networkInformation = options === null || options === void 0 ? void 0 : options.networkInformation;
|
|
192
|
+
|
|
193
|
+
if (typeof networkInformation === 'undefined' || typeof networkInformation.addEventListener === 'function' && typeof networkInformation.removeEventListener === 'function' && typeof networkInformation.type === 'string') {
|
|
194
|
+
(0, _classPrivateFieldSet2["default"])(this, _networkInformation, networkInformation);
|
|
195
|
+
} else {
|
|
196
|
+
console.warn('botframework-directlinejs: "networkInformation" option specified must be a `NetworkInformation`-like instance extending `EventTarget` interface with a `type` property returning a string.');
|
|
197
|
+
}
|
|
198
|
+
|
|
176
199
|
this.token = options.token;
|
|
177
200
|
this.refreshToken()["catch"](function () {
|
|
178
201
|
_this2.connectionStatus$.next(_directLine.ConnectionStatus.ExpiredToken);
|
|
@@ -241,8 +264,8 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
241
264
|
key: "commonHeaders",
|
|
242
265
|
value: function commonHeaders() {
|
|
243
266
|
return {
|
|
244
|
-
|
|
245
|
-
|
|
267
|
+
Authorization: "Bearer ".concat(this.token),
|
|
268
|
+
'x-ms-bot-agent': this._botAgent
|
|
246
269
|
};
|
|
247
270
|
}
|
|
248
271
|
}, {
|
|
@@ -297,7 +320,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
297
320
|
_context3.prev = 9;
|
|
298
321
|
_context3.next = 12;
|
|
299
322
|
return (0, _crossFetch["default"])("".concat(this.domain, "/tokens/refresh"), {
|
|
300
|
-
method:
|
|
323
|
+
method: 'POST',
|
|
301
324
|
headers: this.commonHeaders()
|
|
302
325
|
});
|
|
303
326
|
|
|
@@ -342,7 +365,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
342
365
|
break;
|
|
343
366
|
|
|
344
367
|
case 30:
|
|
345
|
-
console.error(
|
|
368
|
+
console.error('Retries exhausted');
|
|
346
369
|
this.streamConnection.disconnect();
|
|
347
370
|
|
|
348
371
|
case 32:
|
|
@@ -368,7 +391,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
368
391
|
return _Observable.Observable["throw"](new Error('Connection is closed'));
|
|
369
392
|
}
|
|
370
393
|
|
|
371
|
-
if (activity.type ===
|
|
394
|
+
if (activity.type === 'message' && activity.attachments && activity.attachments.length > 0) {
|
|
372
395
|
return this.postMessageWithAttachments(activity);
|
|
373
396
|
}
|
|
374
397
|
|
|
@@ -394,7 +417,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
394
417
|
break;
|
|
395
418
|
}
|
|
396
419
|
|
|
397
|
-
throw new Error(
|
|
420
|
+
throw new Error('PostActivity returned ' + resp.statusCode);
|
|
398
421
|
|
|
399
422
|
case 8:
|
|
400
423
|
numberOfStreams = resp.streams.length;
|
|
@@ -404,7 +427,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
404
427
|
break;
|
|
405
428
|
}
|
|
406
429
|
|
|
407
|
-
throw new Error(
|
|
430
|
+
throw new Error('Expected one stream but got ' + numberOfStreams);
|
|
408
431
|
|
|
409
432
|
case 11:
|
|
410
433
|
_context4.next = 13;
|
|
@@ -528,7 +551,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
528
551
|
activityStream = new BFSE.SubscribableStream();
|
|
529
552
|
activityStream.write(JSON.stringify(messageWithoutAttachments), 'utf-8');
|
|
530
553
|
request.addStream(new BFSE.HttpContent({
|
|
531
|
-
type:
|
|
554
|
+
type: 'application/vnd.microsoft.activity',
|
|
532
555
|
contentLength: activityStream.length
|
|
533
556
|
}, activityStream));
|
|
534
557
|
httpContentList.forEach(function (e) {
|
|
@@ -589,7 +612,9 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
589
612
|
case 0:
|
|
590
613
|
return _context7.abrupt("return", new Promise(function (resolve, reject) {
|
|
591
614
|
_this5.connectionStatus$.subscribe(function (cs) {
|
|
592
|
-
if (cs === _directLine.ConnectionStatus.Online)
|
|
615
|
+
if (cs === _directLine.ConnectionStatus.Online) {
|
|
616
|
+
return resolve();
|
|
617
|
+
}
|
|
593
618
|
}, function (e) {
|
|
594
619
|
return reject(e);
|
|
595
620
|
});
|
|
@@ -615,7 +640,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
615
640
|
var _connectAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
616
641
|
var _this6 = this;
|
|
617
642
|
|
|
618
|
-
var re, params, urlSearchParams, wsUrl;
|
|
643
|
+
var re, params, abortController, urlSearchParams, wsUrl;
|
|
619
644
|
return _regenerator["default"].wrap(function _callee9$(_context9) {
|
|
620
645
|
while (1) {
|
|
621
646
|
switch (_context9.prev = _context9.next) {
|
|
@@ -627,13 +652,18 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
627
652
|
break;
|
|
628
653
|
}
|
|
629
654
|
|
|
630
|
-
throw
|
|
655
|
+
throw 'Domain must begin with http or https';
|
|
631
656
|
|
|
632
657
|
case 3:
|
|
633
658
|
params = {
|
|
634
659
|
token: this.token
|
|
635
660
|
};
|
|
636
|
-
|
|
661
|
+
|
|
662
|
+
if (this.conversationId) {
|
|
663
|
+
params['conversationId'] = this.conversationId;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
abortController = new AbortController();
|
|
637
667
|
urlSearchParams = new URLSearchParams(params).toString();
|
|
638
668
|
wsUrl = "".concat(this.domain.replace(re, 'ws$1'), "/conversations/connect?").concat(urlSearchParams); // This promise will resolve when it is disconnected.
|
|
639
669
|
|
|
@@ -645,12 +675,21 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
645
675
|
switch (_context8.prev = _context8.next) {
|
|
646
676
|
case 0:
|
|
647
677
|
_context8.prev = 0;
|
|
648
|
-
_this6.streamConnection = new
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
678
|
+
_this6.streamConnection = new _WebSocketClientWithNetworkInformation["default"]({
|
|
679
|
+
disconnectionHandler: resolve,
|
|
680
|
+
networkInformation: (0, _classPrivateFieldGet2["default"])(_this6, _networkInformation),
|
|
681
|
+
requestHandler: {
|
|
682
|
+
processRequest: function processRequest(streamingRequest) {
|
|
683
|
+
// If `streamConnection` is still current, allow call to `processRequest()`, otherwise, ignore calls to `processRequest()`.
|
|
684
|
+
// This prevents zombie connections from sending us requests.
|
|
685
|
+
if (abortController.signal.aborted) {
|
|
686
|
+
throw new Error('Cannot process streaming request, `streamingConnection` should be disconnected.');
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
return _this6.theStreamHandler.processRequest(streamingRequest);
|
|
690
|
+
}
|
|
691
|
+
},
|
|
692
|
+
url: wsUrl
|
|
654
693
|
});
|
|
655
694
|
_this6.queueActivities = true;
|
|
656
695
|
_context8.next = 5;
|
|
@@ -669,7 +708,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
669
708
|
break;
|
|
670
709
|
}
|
|
671
710
|
|
|
672
|
-
throw new Error(
|
|
711
|
+
throw new Error('Connection response code ' + response.statusCode);
|
|
673
712
|
|
|
674
713
|
case 11:
|
|
675
714
|
if (!(response.streams.length !== 1)) {
|
|
@@ -677,7 +716,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
677
716
|
break;
|
|
678
717
|
}
|
|
679
718
|
|
|
680
|
-
throw new Error(
|
|
719
|
+
throw new Error('Expected 1 stream but got ' + response.streams.length);
|
|
681
720
|
|
|
682
721
|
case 13:
|
|
683
722
|
_context8.next = 15;
|
|
@@ -690,6 +729,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
690
729
|
|
|
691
730
|
_this6.connectionStatus$.next(_directLine.ConnectionStatus.Online); // Wait until DL consumers have had a chance to be notified
|
|
692
731
|
// of the connection status change.
|
|
732
|
+
// This is specific to RxJS implementation of observable, which calling subscribe() after next() will still get the value.
|
|
693
733
|
|
|
694
734
|
|
|
695
735
|
_context8.next = 21;
|
|
@@ -718,9 +758,11 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
718
758
|
return function (_x6, _x7) {
|
|
719
759
|
return _ref7.apply(this, arguments);
|
|
720
760
|
};
|
|
721
|
-
}()))
|
|
761
|
+
}())["finally"](function () {
|
|
762
|
+
return abortController.abort();
|
|
763
|
+
}));
|
|
722
764
|
|
|
723
|
-
case
|
|
765
|
+
case 9:
|
|
724
766
|
case "end":
|
|
725
767
|
return _context9.stop();
|
|
726
768
|
}
|
|
@@ -754,7 +796,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
754
796
|
|
|
755
797
|
case 4:
|
|
756
798
|
if (!(numRetries > 0)) {
|
|
757
|
-
_context10.next =
|
|
799
|
+
_context10.next = 27;
|
|
758
800
|
break;
|
|
759
801
|
}
|
|
760
802
|
|
|
@@ -765,22 +807,23 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
765
807
|
return this.connectAsync();
|
|
766
808
|
|
|
767
809
|
case 10:
|
|
768
|
-
_context10.next =
|
|
810
|
+
_context10.next = 15;
|
|
769
811
|
break;
|
|
770
812
|
|
|
771
813
|
case 12:
|
|
772
814
|
_context10.prev = 12;
|
|
773
815
|
_context10.t0 = _context10["catch"](7);
|
|
816
|
+
console.error(_context10.t0);
|
|
774
817
|
|
|
775
|
-
case
|
|
818
|
+
case 15:
|
|
776
819
|
if (!(this.connectionStatus$.getValue() === _directLine.ConnectionStatus.Ended)) {
|
|
777
|
-
_context10.next =
|
|
820
|
+
_context10.next = 17;
|
|
778
821
|
break;
|
|
779
822
|
}
|
|
780
823
|
|
|
781
824
|
return _context10.abrupt("return");
|
|
782
825
|
|
|
783
|
-
case
|
|
826
|
+
case 17:
|
|
784
827
|
// Make sure we don't signal ConnectionStatus.Connecting twice or more without an actual connection.
|
|
785
828
|
// Subsequent retries should be transparent.
|
|
786
829
|
if (this.connectionStatus$.getValue() !== _directLine.ConnectionStatus.Connecting) {
|
|
@@ -791,41 +834,38 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
791
834
|
|
|
792
835
|
|
|
793
836
|
if (!(60000 < Date.now() - start)) {
|
|
794
|
-
_context10.next =
|
|
837
|
+
_context10.next = 22;
|
|
795
838
|
break;
|
|
796
839
|
}
|
|
797
840
|
|
|
798
841
|
numRetries = MAX_RETRY_COUNT;
|
|
799
|
-
_context10.next =
|
|
842
|
+
_context10.next = 25;
|
|
800
843
|
break;
|
|
801
844
|
|
|
802
|
-
case
|
|
845
|
+
case 22:
|
|
803
846
|
if (!(numRetries > 0)) {
|
|
804
|
-
_context10.next =
|
|
847
|
+
_context10.next = 25;
|
|
805
848
|
break;
|
|
806
849
|
}
|
|
807
850
|
|
|
808
|
-
_context10.next =
|
|
851
|
+
_context10.next = 25;
|
|
809
852
|
return new Promise(function (r) {
|
|
810
853
|
return setTimeout(r, _this7.getRetryDelay());
|
|
811
854
|
});
|
|
812
855
|
|
|
813
|
-
case
|
|
856
|
+
case 25:
|
|
814
857
|
_context10.next = 4;
|
|
815
858
|
break;
|
|
816
859
|
|
|
817
|
-
case
|
|
860
|
+
case 27:
|
|
818
861
|
// TODO: [TEST] Make sure FailedToConnect is reported immediately after last disconnection, should be no getRetryDelay().
|
|
819
862
|
// Failed to reconnect after multiple retries.
|
|
820
863
|
this.connectionStatus$.next(_directLine.ConnectionStatus.FailedToConnect);
|
|
821
864
|
|
|
822
|
-
case
|
|
865
|
+
case 28:
|
|
823
866
|
_context10.next = 0;
|
|
824
867
|
break;
|
|
825
868
|
|
|
826
|
-
case 29:
|
|
827
|
-
throw new Error("Failed to connect after ".concat(MAX_RETRY_COUNT, " attempts"));
|
|
828
|
-
|
|
829
869
|
case 30:
|
|
830
870
|
case "end":
|
|
831
871
|
return _context10.stop();
|
|
@@ -851,4 +891,4 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
851
891
|
}();
|
|
852
892
|
|
|
853
893
|
exports.DirectLineStreaming = DirectLineStreaming;
|
|
854
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lU3RyZWFtaW5nLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJNQVhfUkVUUllfQ09VTlQiLCJyZWZyZXNoVG9rZW5MaWZldGltZSIsInRpbWVvdXQiLCJyZWZyZXNoVG9rZW5JbnRlcnZhbCIsIlN0cmVhbUhhbmRsZXIiLCJzIiwiYyQiLCJzcSIsInN1YnNjcmliZXIiLCJjb25uZWN0aW9uU3RhdHVzJCIsInNob3VsZFF1ZXVlIiwicmVxdWVzdCIsImxvZ2dlciIsInN0cmVhbXMiLCJzdHJlYW0wIiwic2hpZnQiLCJyZWFkQXNTdHJpbmciLCJhY3Rpdml0eVNldEpzb24iLCJhY3Rpdml0eVNldCIsIkpTT04iLCJwYXJzZSIsImFjdGl2aXRpZXMiLCJsZW5ndGgiLCJlcnJvciIsIkVycm9yIiwiQkZTRSIsIlN0cmVhbWluZ1Jlc3BvbnNlIiwiY3JlYXRlIiwiYWN0aXZpdHkiLCJhdHRhY2htZW50cyIsInN0cmVhbSIsImF0dGFjaG1lbnQiLCJkYXRhVXJpIiwicHVzaCIsImNvbnRlbnRUeXBlIiwiY29udGVudFVybCIsImFjdGl2aXR5UXVldWUiLCJuZXh0Iiwic3Vic2NyaWJlIiwiY3MiLCJmb3JFYWNoIiwiYSIsImNvbXBsZXRlIiwiRGlyZWN0TGluZVN0cmVhbWluZyIsIm9wdGlvbnMiLCJCZWhhdmlvclN1YmplY3QiLCJDb25uZWN0aW9uU3RhdHVzIiwiVW5pbml0aWFsaXplZCIsInRva2VuIiwicmVmcmVzaFRva2VuIiwiRXhwaXJlZFRva2VuIiwiZG9tYWluIiwiY29udmVyc2F0aW9uSWQiLCJfYm90QWdlbnQiLCJnZXRCb3RBZ2VudCIsImJvdEFnZW50IiwicXVldWVBY3Rpdml0aWVzIiwiYWN0aXZpdHkkIiwiT2JzZXJ2YWJsZSIsImFjdGl2aXR5U3Vic2NyaWJlciIsInRoZVN0cmVhbUhhbmRsZXIiLCJjb25uZWN0RGVmZXJyZWQiLCJyZXNvbHZlIiwic2hhcmUiLCJjb25uZWN0V2l0aFJldHJ5QXN5bmMiLCJnZXRWYWx1ZSIsIkVuZGVkIiwic3RyZWFtQ29ubmVjdGlvbiIsImRpc2Nvbm5lY3QiLCJjdXN0b21BZ2VudCIsImNsaWVudEFnZW50IiwiZmlyc3RDYWxsIiwicmV0cnlDb3VudCIsIndhaXRVbnRpbE9ubGluZSIsIm51bWJlck9mQXR0ZW1wdHMiLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJtZXRob2QiLCJoZWFkZXJzIiwiY29tbW9uSGVhZGVycyIsInJlcyIsIm9rIiwianNvbiIsInN0YXR1cyIsImNvbnNvbGUiLCJzdGF0dXNUZXh0Iiwid2FybiIsInZhbHVlIiwiRmFpbGVkVG9Db25uZWN0IiwidHlwZSIsInBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIiwicmVzcCQiLCJTdHJlYW1pbmdSZXF1ZXN0Iiwic2V0Qm9keSIsInN0cmluZ2lmeSIsInNlbmQiLCJyZXNwIiwic3RhdHVzQ29kZSIsIm51bWJlck9mU3RyZWFtcyIsImlkU3RyaW5nIiwiaWQiLCJJZCIsIm1lc3NhZ2UiLCJtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIiwiaHR0cENvbnRlbnRMaXN0IiwiYWxsIiwibWFwIiwibWVkaWEiLCJhcnJheUJ1ZmZlciIsImFycmF5QnVmZmVycyIsImJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJTdWJzY3JpYmFibGVTdHJlYW0iLCJ3cml0ZSIsImh0dHBDb250ZW50IiwiSHR0cENvbnRlbnQiLCJjb250ZW50TGVuZ3RoIiwidXJsIiwiYWN0aXZpdHlTdHJlYW0iLCJhZGRTdHJlYW0iLCJlIiwicmVhZEFzSnNvbiIsInJlamVjdCIsIk9ubGluZSIsInJlIiwiUmVnRXhwIiwidGVzdCIsInBhcmFtcyIsInVybFNlYXJjaFBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInRvU3RyaW5nIiwid3NVcmwiLCJyZXBsYWNlIiwiV2ViU29ja2V0Q2xpZW50IiwicmVxdWVzdEhhbmRsZXIiLCJkaXNjb25uZWN0aW9uSGFuZGxlciIsImNvbm5lY3QiLCJyZXNwb25zZSIsInJlc3BvbnNlU3RyaW5nIiwiY29udmVyc2F0aW9uIiwiZmx1c2giLCJwcm9taXNlIiwibnVtUmV0cmllcyIsIkNvbm5lY3RpbmciLCJzdGFydCIsIkRhdGUiLCJub3ciLCJjb25uZWN0QXN5bmMiLCJnZXRSZXRyeURlbGF5IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBSUE7Ozs7Ozs7O0FBU0EsSUFBTUEsbUJBQW1CLEdBQUcsZ0JBQTVCO0FBQ0EsSUFBTUMsZUFBZSxHQUFHLENBQXhCO0FBQ0EsSUFBTUMsb0JBQW9CLEdBQUcsS0FBSyxFQUFMLEdBQVUsSUFBdkMsQyxDQUNBOztBQUNBLElBQU1DLE9BQU8sR0FBRyxLQUFLLElBQXJCO0FBQ0EsSUFBTUMsb0JBQW9CLEdBQUdGLG9CQUFvQixHQUFHLENBQXBEOztJQVVNRyxhO0FBTUoseUJBQVlDLENBQVosRUFBcUNDLEVBQXJDLEVBQXVFQyxFQUF2RSxFQUEwRjtBQUFBO0FBQUEsNERBRmpELEVBRWlEO0FBQ3hGLFNBQUtDLFVBQUwsR0FBa0JILENBQWxCO0FBQ0EsU0FBS0ksaUJBQUwsR0FBeUJILEVBQXpCO0FBQ0EsU0FBS0ksV0FBTCxHQUFtQkgsRUFBbkI7QUFDRDs7OztXQUVELHVCQUFxQkYsQ0FBckIsRUFBOEM7QUFDNUMsV0FBS0csVUFBTCxHQUFrQkgsQ0FBbEI7QUFDRDs7OzswR0FFRCxpQkFBcUJNLE9BQXJCLEVBQW9EQyxNQUFwRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDUUMsZ0JBQUFBLE9BRFIsdUNBQ3NCRixPQUFPLENBQUNFLE9BRDlCO0FBRVFDLGdCQUFBQSxPQUZSLEdBRWtCRCxPQUFPLENBQUNFLEtBQVIsRUFGbEI7QUFBQTtBQUFBLHVCQUdnQ0QsT0FBTyxDQUFDRSxZQUFSLEVBSGhDOztBQUFBO0FBR1FDLGdCQUFBQSxlQUhSO0FBSVFDLGdCQUFBQSxXQUpSLEdBSXNCQyxJQUFJLENBQUND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bnQiOlsiLy8gSW4gb3JkZXIgdG8ga2VlcCBmaWxlIHNpemUgZG93biwgb25seSBpbXBvcnQgdGhlIHBhcnRzIG9mIHJ4anMgdGhhdCB3ZSB1c2VcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcy9CZWhhdmlvclN1YmplY3QnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL09ic2VydmFibGUnO1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJ3J4anMvU3Vic2NyaWJlcic7XG5pbXBvcnQgKiBhcyBCRlNFIGZyb20gJ2JvdGZyYW1ld29yay1zdHJlYW1pbmcnO1xuaW1wb3J0IGNyZWF0ZURlZmVycmVkIGZyb20gJy4vY3JlYXRlRGVmZXJyZWQnO1xuaW1wb3J0IGZldGNoIGZyb20gJ2Nyb3NzLWZldGNoJztcblxuaW1wb3J0IHR5cGUgeyBEZWZlcnJlZCB9IGZyb20gJy4vY3JlYXRlRGVmZXJyZWQnO1xuXG5pbXBvcnQge1xuICBBY3Rpdml0eSxcbiAgQ29ubmVjdGlvblN0YXR1cyxcbiAgQ29udmVyc2F0aW9uLFxuICBJQm90Q29ubmVjdGlvbixcbiAgTWVkaWEsXG4gIE1lc3NhZ2Vcbn0gZnJvbSAnLi9kaXJlY3RMaW5lJztcblxuY29uc3QgRElSRUNUX0xJTkVfVkVSU0lPTiA9ICdEaXJlY3RMaW5lLzMuMCc7XG5jb25zdCBNQVhfUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSAzMCAqIDYwICogMTAwMDtcbi8vY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSA1MDAwO1xuY29uc3QgdGltZW91dCA9IDIwICogMTAwMDtcbmNvbnN0IHJlZnJlc2hUb2tlbkludGVydmFsID0gcmVmcmVzaFRva2VuTGlmZXRpbWUgLyAyO1xuXG5pbnRlcmZhY2UgRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMge1xuICB0b2tlbjogc3RyaW5nLFxuICBjb252ZXJzYXRpb25JZD86IHN0cmluZyxcbiAgZG9tYWluOiBzdHJpbmcsXG4gIC8vIEF0dGFjaGVkIHRvIGFsbCByZXF1ZXN0cyB0byBpZGVudGlmeSByZXF1ZXN0aW5nIGFnZW50LlxuICBib3RBZ2VudD86IHN0cmluZ1xufVxuXG5jbGFzcyBTdHJlYW1IYW5kbGVyIGltcGxlbWVudHMgQkZTRS5SZXF1ZXN0SGFuZGxlciB7XG4gIHByaXZhdGUgY29ubmVjdGlvblN0YXR1cyQ7XG4gIHByaXZhdGUgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT47XG4gIHByaXZhdGUgc2hvdWxkUXVldWU6ICgpID0+IGJvb2xlYW47XG4gIHByaXZhdGUgYWN0aXZpdHlRdWV1ZTogQXJyYXk8QWN0aXZpdHk+ID0gW107XG5cbiAgY29uc3RydWN0b3IoczogU3Vic2NyaWJlcjxBY3Rpdml0eT4sIGMkOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25TdGF0dXM+LCBzcTogKCkgPT4gYm9vbGVhbikge1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IHM7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCA9IGMkO1xuICAgIHRoaXMuc2hvdWxkUXVldWUgPSBzcTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdWJzY3JpYmVyKHM6IFN1YnNjcmliZXI8QWN0aXZpdHk+KSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gcztcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IEJGU0UuSVJlY2VpdmVSZXF1ZXN0LCBsb2dnZXI/OiBhbnkpOiBQcm9taXNlPEJGU0UuU3RyZWFtaW5nUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzdHJlYW1zID0gWy4uLnJlcXVlc3Quc3RyZWFtc107XG4gICAgY29uc3Qgc3RyZWFtMCA9IHN0cmVhbXMuc2hpZnQoKTtcbiAgICBjb25zdCBhY3Rpdml0eVNldEpzb24gPSBhd2FpdCBzdHJlYW0wLnJlYWRBc1N0cmluZygpO1xuICAgIGNvbnN0IGFjdGl2aXR5U2V0ID0gSlNPTi5wYXJzZShhY3Rpdml0eVNldEpzb24pO1xuXG4gICAgaWYgKGFjdGl2aXR5U2V0LmFjdGl2aXRpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAvLyBPbmx5IG9uZSBhY3Rpdml0eSBpcyBleHBlY3RlZCBpbiBhIHNldCBpbiBzdHJlYW1pbmdcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ3RoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBhY3Rpdml0eScpKTtcbiAgICAgIHJldHVybiBCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlLmNyZWF0ZSg1MDApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2aXR5ID0gYWN0aXZpdHlTZXQuYWN0aXZpdGllc1swXTtcblxuICAgIGlmIChzdHJlYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gWy4uLmFjdGl2aXR5LmF0dGFjaG1lbnRzXTtcblxuICAgICAgbGV0IHN0cmVhbTogQkZTRS5Db250ZW50U3RyZWFtO1xuICAgICAgd2hpbGUgKHN0cmVhbSA9IHN0cmVhbXMuc2hpZnQoKSkge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgc3RyZWFtLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhVXJpID0gXCJkYXRhOnRleHQvcGxhaW47YmFzZTY0LFwiICsgYXR0YWNobWVudDtcbiAgICAgICAgYXR0YWNobWVudHMucHVzaCh7IGNvbnRlbnRUeXBlOiBzdHJlYW0uY29udGVudFR5cGUsIGNvbnRlbnRVcmw6IGRhdGFVcmkgfSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2aXR5LmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUXVldWUoKSkge1xuICAgICAgdGhpcy5hY3Rpdml0eVF1ZXVlLnB1c2goYWN0aXZpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXIubmV4dChhY3Rpdml0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJGU0UuU3RyZWFtaW5nUmVzcG9uc2UuY3JlYXRlKDIwMCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoY3MgPT4geyB9KVxuICAgIHRoaXMuYWN0aXZpdHlRdWV1ZS5mb3JFYWNoKChhKSA9PiB0aGlzLnN1YnNjcmliZXIubmV4dChhKSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlID0gW107XG4gIH1cblxuICBwdWJsaWMgZW5kKCkge1xuICAgIHRoaXMuc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXJlY3RMaW5lU3RyZWFtaW5nIGltcGxlbWVudHMgSUJvdENvbm5lY3Rpb24ge1xuICBwdWJsaWMgY29ubmVjdGlvblN0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KENvbm5lY3Rpb25TdGF0dXMuVW5pbml0aWFsaXplZCk7XG4gIHB1YmxpYyBhY3Rpdml0eSQ6IE9ic2VydmFibGU8QWN0aXZpdHk+O1xuXG4gIHByaXZhdGUgYWN0aXZpdHlTdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PjtcbiAgcHJpdmF0ZSBjb25uZWN0RGVmZXJyZWQ6IERlZmVycmVkPHZvaWQ+O1xuICBwcml2YXRlIHRoZVN0cmVhbUhhbmRsZXI6IFN0cmVhbUhhbmRsZXI7XG5cbiAgcHJpdmF0ZSBkb21haW46IHN0cmluZztcblxuICBwcml2YXRlIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSBzdHJlYW1Db25uZWN0aW9uOiBCRlNFLldlYlNvY2tldENsaWVudDtcbiAgcHJpdmF0ZSBxdWV1ZUFjdGl2aXRpZXM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYm90QWdlbnQgPSAnJztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lU3RyZWFtaW5nT3B0aW9ucykge1xuICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuXG4gICAgdGhpcy5yZWZyZXNoVG9rZW4oKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FeHBpcmVkVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kb21haW4gPSBvcHRpb25zLmRvbWFpbjtcblxuICAgIGlmIChvcHRpb25zLmNvbnZlcnNhdGlvbklkKSB7XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gb3B0aW9ucy5jb252ZXJzYXRpb25JZDtcbiAgICB9XG5cbiAgICB0aGlzLl9ib3RBZ2VudCA9IHRoaXMuZ2V0Qm90QWdlbnQob3B0aW9ucy5ib3RBZ2VudCk7XG5cbiAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IHRydWU7XG4gICAgdGhpcy5hY3Rpdml0eSQgPSBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyAoc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT4pID0+IHtcbiAgICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlciA9IG5ldyBTdHJlYW1IYW5kbGVyKHN1YnNjcmliZXIsIHRoaXMuY29ubmVjdGlvblN0YXR1cyQsICgpID0+IHRoaXMucXVldWVBY3Rpdml0aWVzKTtcblxuICAgICAgLy8gUmVzb2x2aW5nIGNvbm5lY3REZWZlcnJlZCB3aWxsIGtpY2stb2ZmIHRoZSBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5jb25uZWN0RGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIH0pLnNoYXJlKCk7XG5cbiAgICAvLyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB3aWxsIGNyZWF0ZSB0aGUgY29ubmVjdERlZmVycmVkIG9iamVjdCByZXF1aXJlZCBpbiBhY3Rpdml0eSQuXG4gICAgdGhpcy5jb25uZWN0V2l0aFJldHJ5QXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWNvbm5lY3QoeyBjb252ZXJzYXRpb25JZCwgdG9rZW4gfSA6IENvbnZlcnNhdGlvbikge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgPT09IENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiBoYXMgZW5kZWQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbklkO1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcblxuICAgIHRoaXMuY29ubmVjdERlZmVycmVkLnJlc29sdmUoKTtcbiAgfVxuXG4gIGVuZCgpIHtcbiAgICAvLyBPbmNlIGVuZCgpIGlzIGNhbGxlZCwgbm8gcmVjb25uZWN0aW9uIGNhbiBiZSBtYWRlLlxuICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FbmRlZCk7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tbW9uSGVhZGVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJBdXRob3JpemF0aW9uXCI6IGBCZWFyZXIgJHt0aGlzLnRva2VufWAsXG4gICAgICBcIngtbXMtYm90LWFnZW50XCI6IHRoaXMuX2JvdEFnZW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Qm90QWdlbnQoY3VzdG9tQWdlbnQ6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgY2xpZW50QWdlbnQgPSAnZGlyZWN0bGluZVN0cmVhbWluZydcblxuICAgIGlmIChjdXN0b21BZ2VudCkge1xuICAgICAgY2xpZW50QWdlbnQgKz0gYDsgJHtjdXN0b21BZ2VudH1gXG4gICAgfVxuXG4gICAgcmV0dXJuIGAke0RJUkVDVF9MSU5FX1ZFUlNJT059ICgke2NsaWVudEFnZW50fSlgO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVG9rZW4oZmlyc3RDYWxsID0gdHJ1ZSwgcmV0cnlDb3VudCA9IDApIHtcbiAgICBhd2FpdCB0aGlzLndhaXRVbnRpbE9ubGluZSgpO1xuXG4gICAgbGV0IG51bWJlck9mQXR0ZW1wdHMgPSAwO1xuICAgIHdoaWxlKG51bWJlck9mQXR0ZW1wdHMgPCBNQVhfUkVUUllfQ09VTlQpIHtcbiAgICAgIG51bWJlck9mQXR0ZW1wdHMrKztcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCByZWZyZXNoVG9rZW5JbnRlcnZhbCkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5kb21haW59L3Rva2Vucy9yZWZyZXNoYCwge21ldGhvZDogXCJQT1NUXCIsIGhlYWRlcnM6IHRoaXMuY29tbW9uSGVhZGVycygpfSk7XG4gICAgICAgIGlmIChyZXMub2spIHtcbiAgICAgICAgICBudW1iZXJPZkF0dGVtcHRzID0gMDtcbiAgICAgICAgICBjb25zdCB7dG9rZW59ID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMyB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhdGFsIGVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRva2VuOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFJlZnJlc2ggYXR0ZW1wdCAjJHtudW1iZXJPZkF0dGVtcHRzfSBmYWlsZWQ6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlZnJlc2ggYXR0ZW1wdCAjJHtudW1iZXJPZkF0dGVtcHRzfSB0aHJldyBhbiBleGNlcHRpb246ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKFwiUmV0cmllcyBleGhhdXN0ZWRcIik7XG4gICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHBvc3RBY3Rpdml0eShhY3Rpdml0eTogQWN0aXZpdHkpIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC52YWx1ZSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCB8fCB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnZhbHVlID09PSBDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdCkge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdDb25uZWN0aW9uIGlzIGNsb3NlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZpdHkudHlwZSA9PT0gXCJtZXNzYWdlXCIgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMoYWN0aXZpdHkpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3AkID0gT2JzZXJ2YWJsZS5jcmVhdGUoYXN5bmMgc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUE9TVCcsICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zLycgKyB0aGlzLmNvbnZlcnNhdGlvbklkICsgJy9hY3Rpdml0aWVzJyk7XG4gICAgICByZXF1ZXN0LnNldEJvZHkoSlNPTi5zdHJpbmdpZnkoYWN0aXZpdHkpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICBpZiAocmVzcC5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihcIlBvc3RBY3Rpdml0eSByZXR1cm5lZCBcIiArIHJlc3Auc3RhdHVzQ29kZSk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mU3RyZWFtcyA9IHJlc3Auc3RyZWFtcy5sZW5ndGg7XG4gICAgICAgIGlmIChudW1iZXJPZlN0cmVhbXMgIT09IDEpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG9uZSBzdHJlYW0gYnV0IGdvdCBcIiArIG51bWJlck9mU3RyZWFtcylcbiAgICAgICAgY29uc3QgaWRTdHJpbmcgPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHtJZCA6IGlkfSA9IEpTT04ucGFyc2UoaWRTdHJpbmcpO1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXR3b3JrIGlzc3VlIHRoZW4gaXRzIGhhbmRsZWQgYnlcbiAgICAgICAgICAvLyB0aGUgZGlzY29ubmVjdGlvbkhhbmRsZXIuIEV2ZXJ5dGhpbmcgZWxzZSBjYW5cbiAgICAgICAgICAvLyBiZSByZXRyaWVkXG4gICAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3AkO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBhdHRhY2htZW50cywgLi4ubWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyB9ID0gbWVzc2FnZTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZSggc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCBodHRwQ29udGVudExpc3QgPSBbXTtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoYXR0YWNobWVudHMubWFwKGFzeW5jIGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVkaWEgPSBhdHRhY2htZW50IGFzIE1lZGlhO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gobWVkaWEuY29udGVudFVybCk7XG4gICAgICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGFycmF5QnVmZmVyOiBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKSwgbWVkaWEgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgYXJyYXlCdWZmZXJzLmZvckVhY2goKHsgYXJyYXlCdWZmZXIsIG1lZGlhIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCRlNFLlN1YnNjcmliYWJsZVN0cmVhbSgpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlKGJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCBodHRwQ29udGVudCA9IG5ldyBCRlNFLkh0dHBDb250ZW50KHsgdHlwZTogbWVkaWEuY29udGVudFR5cGUsIGNvbnRlbnRMZW5ndGg6IGJ1ZmZlci5sZW5ndGggfSwgc3RyZWFtKTtcbiAgICAgICAgICAgIGh0dHBDb250ZW50TGlzdC5wdXNoKGh0dHBDb250ZW50KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHVybCA9IGAvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zLyR7dGhpcy5jb252ZXJzYXRpb25JZH0vdXNlcnMvJHttZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzLmZyb20uaWR9L3VwbG9hZGA7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoJ1BVVCcsIHVybCk7XG4gICAgICAgICAgY29uc3QgYWN0aXZpdHlTdHJlYW0gPSBuZXcgQkZTRS5TdWJzY3JpYmFibGVTdHJlYW0oKTtcbiAgICAgICAgICBhY3Rpdml0eVN0cmVhbS53cml0ZShKU09OLnN0cmluZ2lmeShtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzKSwgJ3V0Zi04Jyk7XG4gICAgICAgICAgcmVxdWVzdC5hZGRTdHJlYW0obmV3IEJGU0UuSHR0cENvbnRlbnQoeyB0eXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuYWN0aXZpdHlcIiwgY29udGVudExlbmd0aDogYWN0aXZpdHlTdHJlYW0ubGVuZ3RoIH0sIGFjdGl2aXR5U3RyZWFtKSk7XG4gICAgICAgICAgaHR0cENvbnRlbnRMaXN0LmZvckVhY2goZSA9PiByZXF1ZXN0LmFkZFN0cmVhbShlKSk7XG5cbiAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG4gICAgICAgICAgaWYgKHJlc3Auc3RyZWFtcyAmJiByZXNwLnN0cmVhbXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKG5ldyBFcnJvcihgSW52YWxpZCBzdHJlYW0gY291bnQgJHtyZXNwLnN0cmVhbXMubGVuZ3RofWApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qge0lkOiBpZH0gPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzSnNvbjx7SWQ6IHN0cmluZ30+KCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdFVudGlsT25saW5lKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZSgoY3MpID0+IHtcbiAgICAgICAgaWYgKGNzID09PSBDb25uZWN0aW9uU3RhdHVzLk9ubGluZSkgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH0sXG4gICAgICAgIChlKSA9PiByZWplY3QoZSkpO1xuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RBc3luYygpIHtcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJ15odHRwKHM/KScpO1xuICAgIGlmICghcmUudGVzdCh0aGlzLmRvbWFpbikpIHRocm93IChcIkRvbWFpbiBtdXN0IGJlZ2luIHdpdGggaHR0cCBvciBodHRwc1wiKTtcbiAgICBjb25zdCBwYXJhbXMgPSB7dG9rZW46IHRoaXMudG9rZW59O1xuICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbklkKSBwYXJhbXNbJ2NvbnZlcnNhdGlvbklkJ10gPSB0aGlzLmNvbnZlcnNhdGlvbklkO1xuICAgIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHdzVXJsID0gYCR7dGhpcy5kb21haW4ucmVwbGFjZShyZSwgJ3dzJDEnKX0vY29udmVyc2F0aW9ucy9jb25uZWN0PyR7dXJsU2VhcmNoUGFyYW1zfWA7XG5cbiAgICAvLyBUaGlzIHByb21pc2Ugd2lsbCByZXNvbHZlIHdoZW4gaXQgaXMgZGlzY29ubmVjdGVkLlxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24gPSBuZXcgQkZTRS5XZWJTb2NrZXRDbGllbnQoe1xuICAgICAgICAgIHVybDogd3NVcmwsXG4gICAgICAgICAgcmVxdWVzdEhhbmRsZXI6IHRoaXMudGhlU3RyZWFtSGFuZGxlcixcbiAgICAgICAgICBkaXNjb25uZWN0aW9uSGFuZGxlcjogKGUpID0+IHJlc29sdmUoZSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uY29ubmVjdCgpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUE9TVCcsICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zJyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24gcmVzcG9uc2UgY29kZSBcIiArIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGggIT09IDEpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIDEgc3RyZWFtIGJ1dCBnb3QgXCIgKyByZXNwb25zZS5zdHJlYW1zLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyaW5nID0gYXdhaXQgcmVzcG9uc2Uuc3RyZWFtc1swXS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uID0gSlNPTi5wYXJzZShyZXNwb25zZVN0cmluZyk7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb24uY29udmVyc2F0aW9uSWQ7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLk9ubGluZSk7XG5cbiAgICAgICAgLy8gV2FpdCB1bnRpbCBETCBjb25zdW1lcnMgaGF2ZSBoYWQgYSBjaGFuY2UgdG8gYmUgbm90aWZpZWRcbiAgICAgICAgLy8gb2YgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIGNoYW5nZS5cbiAgICAgICAgYXdhaXQgdGhpcy53YWl0VW50aWxPbmxpbmUoKTtcbiAgICAgICAgdGhpcy50aGVTdHJlYW1IYW5kbGVyLmZsdXNoKCk7XG4gICAgICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gZmFsc2U7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB7XG4gICAgLy8gVGhpcyBmb3ItbG9vcCB3aWxsIGJyZWFrIHdoZW4gc29tZW9uZSBjYWxsIGVuZCgpIGFuZCBpdCB3aWxsIHNpZ25hbCBDb25uZWN0aW9uU3RhdHVzLkVuZGVkLlxuICAgIGZvciAoOzspIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBzaWduYWwgYW5kIHdhaXQgZm9yIHNvbWVvbmUga2lja2luZyBvZmYgdGhlIGNvbm5lY3Rpb246XG4gICAgICAvLyAtIHN1YnNjcmliZSB0byBhY3Rpdml0eSQsIG9yO1xuICAgICAgLy8gLSByZXRyaWVzIGV4aGF1c3RlZCAoRmFpbGVkVG9Db25uZWN0KSwgdGhlbiwgc29tZW9uZSBjYWxsIHJlY29ubmVjdCgpXG4gICAgICBhd2FpdCAodGhpcy5jb25uZWN0RGVmZXJyZWQgPSBjcmVhdGVEZWZlcnJlZCgpKS5wcm9taXNlO1xuXG4gICAgICBsZXQgbnVtUmV0cmllcyA9IE1BWF9SRVRSWV9DT1VOVDtcblxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG5cbiAgICAgIHdoaWxlIChudW1SZXRyaWVzID4gMCkge1xuICAgICAgICBudW1SZXRyaWVzLS07XG5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBwcm9taXNlIHdpbGwgcmVqZWN0L3Jlc29sdmUgd2hlbiBkaXNjb25uZWN0ZWQuXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0QXN5bmMoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbCBlbmQoKSB0byBicmVhayB0aGUgY29ubmVjdGlvbiwgd2Ugd2lsbCBuZXZlciBsaXN0ZW4gdG8gYW55IHJlY29ubmVjdCgpLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNpZ25hbCBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcgdHdpY2Ugb3IgbW9yZSB3aXRob3V0IGFuIGFjdHVhbCBjb25uZWN0aW9uLlxuICAgICAgICAvLyBTdWJzZXF1ZW50IHJldHJpZXMgc2hvdWxkIGJlIHRyYW5zcGFyZW50LlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpICE9PSBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpIHtcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gbGFzdGVkIGZvciBtb3JlIHRoYW4gYSBtaW51dGUsIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uIGlzIGdvb2QsIHdoaWNoIG1lYW5zOlxuICAgICAgICAvLyAtIHdlIHNob3VsZCByZXNldCB0aGUgcmV0cnkgY291bnRlciwgYW5kO1xuICAgICAgICAvLyAtIHdlIHNob3VsZCByZWNvbm5lY3QgaW1tZWRpYXRlbHkuXG4gICAgICAgIGlmICg2MDAwMCA8IERhdGUubm93KCkgLSBzdGFydCkge1xuICAgICAgICAgIG51bVJldHJpZXMgPSBNQVhfUkVUUllfQ09VTlQ7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtUmV0cmllcyA+IDApIHtcbiAgICAgICAgICAvLyBTbGVlcCBvbmx5IGlmIHdlIGFyZSBkb2luZyByZXRyeS4gT3RoZXJ3aXNlLCB3ZSBhcmUgZ29pbmcgdG8gYnJlYWsgdGhlIGxvb3AgYW5kIHNpZ25hbCBGYWlsZWRUb0Nvbm5lY3QuXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIHRoaXMuZ2V0UmV0cnlEZWxheSgpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogW1RFU1RdIE1ha2Ugc3VyZSBGYWlsZWRUb0Nvbm5lY3QgaXMgcmVwb3J0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgbGFzdCBkaXNjb25uZWN0aW9uLCBzaG91bGQgYmUgbm8gZ2V0UmV0cnlEZWxheSgpLlxuICAgICAgLy8gRmFpbGVkIHRvIHJlY29ubmVjdCBhZnRlciBtdWx0aXBsZSByZXRyaWVzLlxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0KTtcbiAgICB9XG5cbiAgICB0aHJvdyAobmV3IEVycm9yKGBGYWlsZWQgdG8gY29ubmVjdCBhZnRlciAke01BWF9SRVRSWV9DT1VOVH0gYXR0ZW1wdHNgKSk7XG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBkZWxheSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAgcHJpdmF0ZSBnZXRSZXRyeURlbGF5KCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKDMwMDAgKyBNYXRoLnJhbmRvbSgpICogMTIwMDApO1xuICB9XG59XG4iXX0=
|
|
894
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lU3RyZWFtaW5nLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJNQVhfUkVUUllfQ09VTlQiLCJyZWZyZXNoVG9rZW5MaWZldGltZSIsInJlZnJlc2hUb2tlbkludGVydmFsIiwiU3RyZWFtSGFuZGxlciIsInMiLCJjJCIsInNxIiwic3Vic2NyaWJlciIsImNvbm5lY3Rpb25TdGF0dXMkIiwic2hvdWxkUXVldWUiLCJyZXF1ZXN0IiwibG9nZ2VyIiwic3RyZWFtcyIsInN0cmVhbTAiLCJzaGlmdCIsInJlYWRBc1N0cmluZyIsImFjdGl2aXR5U2V0SnNvbiIsImFjdGl2aXR5U2V0IiwiSlNPTiIsInBhcnNlIiwiYWN0aXZpdGllcyIsImxlbmd0aCIsImVycm9yIiwiRXJyb3IiLCJCRlNFIiwiU3RyZWFtaW5nUmVzcG9uc2UiLCJjcmVhdGUiLCJhY3Rpdml0eSIsImF0dGFjaG1lbnRzIiwic3RyZWFtIiwiYXR0YWNobWVudCIsImRhdGFVcmkiLCJwdXNoIiwiY29udGVudFR5cGUiLCJjb250ZW50VXJsIiwiYWN0aXZpdHlRdWV1ZSIsIm5leHQiLCJzdWJzY3JpYmUiLCJmb3JFYWNoIiwiYSIsImNvbXBsZXRlIiwiRGlyZWN0TGluZVN0cmVhbWluZyIsIm9wdGlvbnMiLCJCZWhhdmlvclN1YmplY3QiLCJDb25uZWN0aW9uU3RhdHVzIiwiVW5pbml0aWFsaXplZCIsIm5ldHdvcmtJbmZvcm1hdGlvbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidHlwZSIsImNvbnNvbGUiLCJ3YXJuIiwidG9rZW4iLCJyZWZyZXNoVG9rZW4iLCJFeHBpcmVkVG9rZW4iLCJkb21haW4iLCJjb252ZXJzYXRpb25JZCIsIl9ib3RBZ2VudCIsImdldEJvdEFnZW50IiwiYm90QWdlbnQiLCJxdWV1ZUFjdGl2aXRpZXMiLCJhY3Rpdml0eSQiLCJPYnNlcnZhYmxlIiwiYWN0aXZpdHlTdWJzY3JpYmVyIiwidGhlU3RyZWFtSGFuZGxlciIsImNvbm5lY3REZWZlcnJlZCIsInJlc29sdmUiLCJzaGFyZSIsImNvbm5lY3RXaXRoUmV0cnlBc3luYyIsImdldFZhbHVlIiwiRW5kZWQiLCJzdHJlYW1Db25uZWN0aW9uIiwiZGlzY29ubmVjdCIsIkF1dGhvcml6YXRpb24iLCJjdXN0b21BZ2VudCIsImNsaWVudEFnZW50IiwiZmlyc3RDYWxsIiwicmV0cnlDb3VudCIsIndhaXRVbnRpbE9ubGluZSIsIm51bWJlck9mQXR0ZW1wdHMiLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJtZXRob2QiLCJoZWFkZXJzIiwiY29tbW9uSGVhZGVycyIsInJlcyIsIm9rIiwianNvbiIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJ2YWx1ZSIsIkZhaWxlZFRvQ29ubmVjdCIsInBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIiwicmVzcCQiLCJTdHJlYW1pbmdSZXF1ZXN0Iiwic2V0Qm9keSIsInN0cmluZ2lmeSIsInNlbmQiLCJyZXNwIiwic3RhdHVzQ29kZSIsIm51bWJlck9mU3RyZWFtcyIsImlkU3RyaW5nIiwiaWQiLCJJZCIsIm1lc3NhZ2UiLCJtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIiwiaHR0cENvbnRlbnRMaXN0IiwiYWxsIiwibWFwIiwibWVkaWEiLCJhcnJheUJ1ZmZlciIsImFycmF5QnVmZmVycyIsImJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJTdWJzY3JpYmFibGVTdHJlYW0iLCJ3cml0ZSIsImh0dHBDb250ZW50IiwiSHR0cENvbnRlbnQiLCJjb250ZW50TGVuZ3RoIiwidXJsIiwiYWN0aXZpdHlTdHJlYW0iLCJhZGRTdHJlYW0iLCJlIiwicmVhZEFzSnNvbiIsInJlamVjdCIsImNzIiwiT25saW5lIiwicmUiLCJSZWdFeHAiLCJ0ZXN0IiwicGFyYW1zIiwiYWJvcnRDb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwidXJsU2VhcmNoUGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwidG9TdHJpbmciLCJ3c1VybCIsInJlcGxhY2UiLCJXZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uIiwiZGlzY29ubmVjdGlvbkhhbmRsZXIiLCJyZXF1ZXN0SGFuZGxlciIsInByb2Nlc3NSZXF1ZXN0Iiwic3RyZWFtaW5nUmVxdWVzdCIsInNpZ25hbCIsImFib3J0ZWQiLCJjb25uZWN0IiwicmVzcG9uc2UiLCJyZXNwb25zZVN0cmluZyIsImNvbnZlcnNhdGlvbiIsImZsdXNoIiwiYWJvcnQiLCJwcm9taXNlIiwibnVtUmV0cmllcyIsIkNvbm5lY3RpbmciLCJzdGFydCIsIkRhdGUiLCJub3ciLCJjb25uZWN0QXN5bmMiLCJnZXRSZXRyeURlbGF5IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOzs7Ozs7OztBQUdBLElBQU1BLG1CQUFtQixHQUFHLGdCQUE1QjtBQUNBLElBQU1DLGVBQWUsR0FBRyxDQUF4QjtBQUNBLElBQU1DLG9CQUFvQixHQUFHLEtBQUssRUFBTCxHQUFVLElBQXZDLEMsQ0FDQTtBQUNBOztBQUNBLElBQU1DLG9CQUFvQixHQUFHRCxvQkFBb0IsR0FBRyxDQUFwRDs7SUFnQk1FLGE7QUFNSix5QkFBWUMsQ0FBWixFQUFxQ0MsRUFBckMsRUFBdUVDLEVBQXZFLEVBQTBGO0FBQUE7QUFBQSw0REFGakQsRUFFaUQ7QUFDeEYsU0FBS0MsVUFBTCxHQUFrQkgsQ0FBbEI7QUFDQSxTQUFLSSxpQkFBTCxHQUF5QkgsRUFBekI7QUFDQSxTQUFLSSxXQUFMLEdBQW1CSCxFQUFuQjtBQUNEOzs7O1dBRUQsdUJBQXFCRixDQUFyQixFQUE4QztBQUM1QyxXQUFLRyxVQUFMLEdBQWtCSCxDQUFsQjtBQUNEOzs7OzBHQUVELGlCQUFxQk0sT0FBckIsRUFBb0RDLE1BQXBEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNRQyxnQkFBQUEsT0FE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LGdCQUFBQSxPQUFPLENBQUM1QixLQUFSOztBQXJCUjtBQUFBLHNCQXlCVSxLQUFLZCxpQkFBTCxDQUF1QjZELFFBQXZCLE9BQXNDekIsNkJBQWlCMEIsS0F6QmpFO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBOEJNO0FBQ0E7QUFDQSxvQkFBSSxLQUFLOUQsaUJBQUwsQ0FBdUI2RCxRQUF2QixPQUFzQ3pCLDZCQUFpQitHLFVBQTNELEVBQXVFO0FBQ3JFLHVCQUFLbkosaUJBQUwsQ0FBdUI0QixJQUF2QixDQUE0QlEsNkJBQWlCK0csVUFBN0M7QUFDRCxpQkFsQ1AsQ0FvQ007QUFDQTtBQUNBOzs7QUF0Q04sc0JBdUNVLFFBQVFFLElBQUksQ0FBQ0MsR0FBTCxLQUFhRixLQXZDL0I7QUFBQTtBQUFBO0FBQUE7O0FBd0NRRixnQkFBQUEsVUFBVSxHQUFHMUosZUFBYjtBQXhDUjtBQUFBOztBQUFBO0FBQUEsc0JBeUNpQjBKLFVBQVUsR0FBRyxDQXpDOUI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSx1QkEyQ2MsSUFBSTFFLE9BQUosQ0FBWSxVQUFBQyxDQUFDO0FBQUEseUJBQUlDLFVBQVUsQ0FBQ0QsQ0FBRCxFQUFJLE1BQUksQ0FBQytFLGFBQUwsRUFBSixDQUFkO0FBQUEsaUJBQWIsQ0EzQ2Q7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBK0NJO0FBQ0E7QUFDQSxxQkFBS3hKLGlCQUFMLENBQXVCNEIsSUFBdkIsQ0FBNEJRLDZCQUFpQmdELGVBQTdDOztBQWpESjtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7OztRQXVEQTs7OztXQUNBLHlCQUF3QjtBQUN0QixhQUFPcUUsSUFBSSxDQUFDQyxLQUFMLENBQVcsT0FBT0QsSUFBSSxDQUFDRSxNQUFMLEtBQWdCLEtBQWxDLENBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEluIG9yZGVyIHRvIGtlZXAgZmlsZSBzaXplIGRvd24sIG9ubHkgaW1wb3J0IHRoZSBwYXJ0cyBvZiByeGpzIHRoYXQgd2UgdXNlXG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMvQmVoYXZpb3JTdWJqZWN0JztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcbmltcG9ydCB7IFN1YnNjcmliZXIgfSBmcm9tICdyeGpzL1N1YnNjcmliZXInO1xuaW1wb3J0ICogYXMgQkZTRSBmcm9tICdib3RmcmFtZXdvcmstc3RyZWFtaW5nJztcbmltcG9ydCBjcmVhdGVEZWZlcnJlZCBmcm9tICcuL2NyZWF0ZURlZmVycmVkJztcbmltcG9ydCBmZXRjaCBmcm9tICdjcm9zcy1mZXRjaCc7XG5cbmltcG9ydCB7IEFjdGl2aXR5LCBDb25uZWN0aW9uU3RhdHVzLCBDb252ZXJzYXRpb24sIERpcmVjdExpbmUsIElCb3RDb25uZWN0aW9uLCBNZWRpYSwgTWVzc2FnZSB9IGZyb20gJy4vZGlyZWN0TGluZSc7XG5pbXBvcnQgV2ViU29ja2V0Q2xpZW50V2l0aE5ldHdvcmtJbmZvcm1hdGlvbiBmcm9tICcuL3N0cmVhbWluZy9XZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uJztcbmltcG9ydCB0eXBlIHsgRGVmZXJyZWQgfSBmcm9tICcuL2NyZWF0ZURlZmVycmVkJztcblxuY29uc3QgRElSRUNUX0xJTkVfVkVSU0lPTiA9ICdEaXJlY3RMaW5lLzMuMCc7XG5jb25zdCBNQVhfUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSAzMCAqIDYwICogMTAwMDtcbi8vY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSA1MDAwO1xuLy8gY29uc3QgdGltZW91dCA9IDIwICogMTAwMDtcbmNvbnN0IHJlZnJlc2hUb2tlbkludGVydmFsID0gcmVmcmVzaFRva2VuTGlmZXRpbWUgLyAyO1xuXG5pbnRlcmZhY2UgRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMge1xuICB0b2tlbjogc3RyaW5nO1xuICBjb252ZXJzYXRpb25JZD86IHN0cmluZztcbiAgZG9tYWluOiBzdHJpbmc7XG4gIC8vIEF0dGFjaGVkIHRvIGFsbCByZXF1ZXN0cyB0byBpZGVudGlmeSByZXF1ZXN0aW5nIGFnZW50LlxuICBib3RBZ2VudD86IHN0cmluZztcblxuICAvKipcbiAgICogU2V0cyB0aGUgW2BOZXR3b3JrSW5mb3JtYXRpb25gIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05ldHdvcmtfSW5mb3JtYXRpb25fQVBJKS5cbiAgICogV2hlbiB0aGUgYE5ldHdvcmtJbmZvcm1hdGlvbmAgZGV0ZWN0IG5ldHdvcmsgY2hhbmdlcyBvciBvZmZsaW5lLCBpdCB3aWxsIGRpc2Nvbm5lY3QgdGhlIFdlYiBTb2NrZXQgYW5kIHJlY29ubmVjdCBpdC5cbiAgICovXG4gIG5ldHdvcmtJbmZvcm1hdGlvbj86IE5ldHdvcmtJbmZvcm1hdGlvbjtcbn1cblxuY2xhc3MgU3RyZWFtSGFuZGxlciBpbXBsZW1lbnRzIEJGU0UuUmVxdWVzdEhhbmRsZXIge1xuICBwcml2YXRlIGNvbm5lY3Rpb25TdGF0dXMkO1xuICBwcml2YXRlIHN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+O1xuICBwcml2YXRlIHNob3VsZFF1ZXVlOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIGFjdGl2aXR5UXVldWU6IEFycmF5PEFjdGl2aXR5PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHM6IFN1YnNjcmliZXI8QWN0aXZpdHk+LCBjJDogT2JzZXJ2YWJsZTxDb25uZWN0aW9uU3RhdHVzPiwgc3E6ICgpID0+IGJvb2xlYW4pIHtcbiAgICB0aGlzLnN1YnNjcmliZXIgPSBzO1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQgPSBjJDtcbiAgICB0aGlzLnNob3VsZFF1ZXVlID0gc3E7XG4gIH1cblxuICBwdWJsaWMgc2V0U3Vic2NyaWJlcihzOiBTdWJzY3JpYmVyPEFjdGl2aXR5Pikge1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IHM7XG4gIH1cblxuICBhc3luYyBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBCRlNFLklSZWNlaXZlUmVxdWVzdCwgbG9nZ2VyPzogYW55KTogUHJvbWlzZTxCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlPiB7XG4gICAgY29uc3Qgc3RyZWFtcyA9IFsuLi5yZXF1ZXN0LnN0cmVhbXNdO1xuICAgIGNvbnN0IHN0cmVhbTAgPSBzdHJlYW1zLnNoaWZ0KCk7XG4gICAgY29uc3QgYWN0aXZpdHlTZXRKc29uID0gYXdhaXQgc3RyZWFtMC5yZWFkQXNTdHJpbmcoKTtcbiAgICBjb25zdCBhY3Rpdml0eVNldCA9IEpTT04ucGFyc2UoYWN0aXZpdHlTZXRKc29uKTtcblxuICAgIGlmIChhY3Rpdml0eVNldC5hY3Rpdml0aWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgLy8gT25seSBvbmUgYWN0aXZpdHkgaXMgZXhwZWN0ZWQgaW4gYSBzZXQgaW4gc3RyZWFtaW5nXG4gICAgICB0aGlzLnN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKCd0aGVyZSBzaG91bGQgYmUgZXhhY3RseSBvbmUgYWN0aXZpdHknKSk7XG4gICAgICByZXR1cm4gQkZTRS5TdHJlYW1pbmdSZXNwb25zZS5jcmVhdGUoNTAwKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpdml0eSA9IGFjdGl2aXR5U2V0LmFjdGl2aXRpZXNbMF07XG5cbiAgICBpZiAoc3RyZWFtcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBhdHRhY2htZW50cyA9IFsuLi5hY3Rpdml0eS5hdHRhY2htZW50c107XG5cbiAgICAgIGxldCBzdHJlYW06IEJGU0UuQ29udGVudFN0cmVhbTtcbiAgICAgIHdoaWxlICgoc3RyZWFtID0gc3RyZWFtcy5zaGlmdCgpKSkge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgc3RyZWFtLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhVXJpID0gJ2RhdGE6dGV4dC9wbGFpbjtiYXNlNjQsJyArIGF0dGFjaG1lbnQ7XG4gICAgICAgIGF0dGFjaG1lbnRzLnB1c2goeyBjb250ZW50VHlwZTogc3RyZWFtLmNvbnRlbnRUeXBlLCBjb250ZW50VXJsOiBkYXRhVXJpIH0pO1xuICAgICAgfVxuXG4gICAgICBhY3Rpdml0eS5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZFF1ZXVlKCkpIHtcbiAgICAgIHRoaXMuYWN0aXZpdHlRdWV1ZS5wdXNoKGFjdGl2aXR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdWJzY3JpYmVyLm5leHQoYWN0aXZpdHkpO1xuICAgIH1cblxuICAgIHJldHVybiBCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlLmNyZWF0ZSgyMDApO1xuICB9XG5cbiAgcHVibGljIGZsdXNoKCkge1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICB0aGlzLmFjdGl2aXR5UXVldWUuZm9yRWFjaChhID0+IHRoaXMuc3Vic2NyaWJlci5uZXh0KGEpKTtcbiAgICB0aGlzLmFjdGl2aXR5UXVldWUgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBlbmQoKSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpcmVjdExpbmVTdHJlYW1pbmcgaW1wbGVtZW50cyBJQm90Q29ubmVjdGlvbiB7XG4gIHB1YmxpYyBjb25uZWN0aW9uU3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoQ29ubmVjdGlvblN0YXR1cy5VbmluaXRpYWxpemVkKTtcbiAgcHVibGljIGFjdGl2aXR5JDogT2JzZXJ2YWJsZTxBY3Rpdml0eT47XG5cbiAgcHJpdmF0ZSBhY3Rpdml0eVN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+O1xuICBwcml2YXRlIGNvbm5lY3REZWZlcnJlZDogRGVmZXJyZWQ8dm9pZD47XG4gIHByaXZhdGUgdGhlU3RyZWFtSGFuZGxlcjogU3RyZWFtSGFuZGxlcjtcblxuICBwcml2YXRlIGRvbWFpbjogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSB0b2tlbjogc3RyaW5nO1xuICBwcml2YXRlIHN0cmVhbUNvbm5lY3Rpb246IEJGU0UuV2ViU29ja2V0Q2xpZW50O1xuICBwcml2YXRlIHF1ZXVlQWN0aXZpdGllczogYm9vbGVhbjtcblxuICBwcml2YXRlIF9ib3RBZ2VudCA9ICcnO1xuXG4gICNuZXR3b3JrSW5mb3JtYXRpb246IE5ldHdvcmtJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lU3RyZWFtaW5nT3B0aW9ucykge1xuICAgIC8vIFJlY3RpZmllcyBgb3B0aW9ucy5uZXR3b3JrSW5mb3JtYXRpb25gLlxuICAgIGNvbnN0IG5ldHdvcmtJbmZvcm1hdGlvbiA9IG9wdGlvbnM/Lm5ldHdvcmtJbmZvcm1hdGlvbjtcblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBuZXR3b3JrSW5mb3JtYXRpb24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAodHlwZW9mIG5ldHdvcmtJbmZvcm1hdGlvbi5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBuZXR3b3JrSW5mb3JtYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgbmV0d29ya0luZm9ybWF0aW9uLnR5cGUgPT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgdGhpcy4jbmV0d29ya0luZm9ybWF0aW9uID0gbmV0d29ya0luZm9ybWF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstZGlyZWN0bGluZWpzOiBcIm5ldHdvcmtJbmZvcm1hdGlvblwiIG9wdGlvbiBzcGVjaWZpZWQgbXVzdCBiZSBhIGBOZXR3b3JrSW5mb3JtYXRpb25gLWxpa2UgaW5zdGFuY2UgZXh0ZW5kaW5nIGBFdmVudFRhcmdldGAgaW50ZXJmYWNlIHdpdGggYSBgdHlwZWAgcHJvcGVydHkgcmV0dXJuaW5nIGEgc3RyaW5nLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy50b2tlbiA9IG9wdGlvbnMudG9rZW47XG5cbiAgICB0aGlzLnJlZnJlc2hUb2tlbigpLmNhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkV4cGlyZWRUb2tlbik7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRvbWFpbiA9IG9wdGlvbnMuZG9tYWluO1xuXG4gICAgaWYgKG9wdGlvbnMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBvcHRpb25zLmNvbnZlcnNhdGlvbklkO1xuICAgIH1cblxuICAgIHRoaXMuX2JvdEFnZW50ID0gdGhpcy5nZXRCb3RBZ2VudChvcHRpb25zLmJvdEFnZW50KTtcblxuICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGl2aXR5JCA9IE9ic2VydmFibGUuY3JlYXRlKGFzeW5jIChzdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PikgPT4ge1xuICAgICAgdGhpcy5hY3Rpdml0eVN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuICAgICAgdGhpcy50aGVTdHJlYW1IYW5kbGVyID0gbmV3IFN0cmVhbUhhbmRsZXIoc3Vic2NyaWJlciwgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCwgKCkgPT4gdGhpcy5xdWV1ZUFjdGl2aXRpZXMpO1xuXG4gICAgICAvLyBSZXNvbHZpbmcgY29ubmVjdERlZmVycmVkIHdpbGwga2ljay1vZmYgdGhlIGNvbm5lY3Rpb24uXG4gICAgICB0aGlzLmNvbm5lY3REZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgfSkuc2hhcmUoKTtcblxuICAgIC8vIGNvbm5lY3RXaXRoUmV0cnlBc3luYygpIHdpbGwgY3JlYXRlIHRoZSBjb25uZWN0RGVmZXJyZWQgb2JqZWN0IHJlcXVpcmVkIGluIGFjdGl2aXR5JC5cbiAgICB0aGlzLmNvbm5lY3RXaXRoUmV0cnlBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHJlY29ubmVjdCh7IGNvbnZlcnNhdGlvbklkLCB0b2tlbiB9OiBDb252ZXJzYXRpb24pIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gaGFzIGVuZGVkLicpO1xuICAgIH1cblxuICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb25JZDtcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG5cbiAgICB0aGlzLmNvbm5lY3REZWZlcnJlZC5yZXNvbHZlKCk7XG4gIH1cblxuICBlbmQoKSB7XG4gICAgLy8gT25jZSBlbmQoKSBpcyBjYWxsZWQsIG5vIHJlY29ubmVjdGlvbiBjYW4gYmUgbWFkZS5cbiAgICB0aGlzLmFjdGl2aXR5U3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpO1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQuY29tcGxldGUoKTtcblxuICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1vbkhlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLnRva2VufWAsXG4gICAgICAneC1tcy1ib3QtYWdlbnQnOiB0aGlzLl9ib3RBZ2VudFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEJvdEFnZW50KGN1c3RvbUFnZW50OiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IGNsaWVudEFnZW50ID0gJ2RpcmVjdGxpbmVTdHJlYW1pbmcnO1xuXG4gICAgaWYgKGN1c3RvbUFnZW50KSB7XG4gICAgICBjbGllbnRBZ2VudCArPSBgOyAke2N1c3RvbUFnZW50fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke0RJUkVDVF9MSU5FX1ZFUlNJT059ICgke2NsaWVudEFnZW50fSlgO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVG9rZW4oZmlyc3RDYWxsID0gdHJ1ZSwgcmV0cnlDb3VudCA9IDApIHtcbiAgICBhd2FpdCB0aGlzLndhaXRVbnRpbE9ubGluZSgpO1xuXG4gICAgbGV0IG51bWJlck9mQXR0ZW1wdHMgPSAwO1xuICAgIHdoaWxlIChudW1iZXJPZkF0dGVtcHRzIDwgTUFYX1JFVFJZX0NPVU5UKSB7XG4gICAgICBudW1iZXJPZkF0dGVtcHRzKys7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgcmVmcmVzaFRva2VuSW50ZXJ2YWwpKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3RoaXMuZG9tYWlufS90b2tlbnMvcmVmcmVzaGAsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHRoaXMuY29tbW9uSGVhZGVycygpIH0pO1xuICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgbnVtYmVyT2ZBdHRlbXB0cyA9IDA7XG4gICAgICAgICAgY29uc3QgeyB0b2tlbiB9ID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMyB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhdGFsIGVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRva2VuOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFJlZnJlc2ggYXR0ZW1wdCAjJHtudW1iZXJPZkF0dGVtcHRzfSBmYWlsZWQ6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZWZyZXNoIGF0dGVtcHQgIyR7bnVtYmVyT2ZBdHRlbXB0c30gdGhyZXcgYW4gZXhjZXB0aW9uOiAke2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcignUmV0cmllcyBleGhhdXN0ZWQnKTtcbiAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcG9zdEFjdGl2aXR5KGFjdGl2aXR5OiBBY3Rpdml0eSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQudmFsdWUgPT09IENvbm5lY3Rpb25TdGF0dXMuRW5kZWQgfHxcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQudmFsdWUgPT09IENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0XG4gICAgKSB7XG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS50aHJvdyhuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkJykpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpdml0eS50eXBlID09PSAnbWVzc2FnZScgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMoYWN0aXZpdHkpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3AkID0gT2JzZXJ2YWJsZS5jcmVhdGUoYXN5bmMgc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZShcbiAgICAgICAgJ1BPU1QnLFxuICAgICAgICAnL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucy8nICsgdGhpcy5jb252ZXJzYXRpb25JZCArICcvYWN0aXZpdGllcydcbiAgICAgICk7XG4gICAgICByZXF1ZXN0LnNldEJvZHkoSlNPTi5zdHJpbmdpZnkoYWN0aXZpdHkpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICBpZiAocmVzcC5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcignUG9zdEFjdGl2aXR5IHJldHVybmVkICcgKyByZXNwLnN0YXR1c0NvZGUpO1xuICAgICAgICBjb25zdCBudW1iZXJPZlN0cmVhbXMgPSByZXNwLnN0cmVhbXMubGVuZ3RoO1xuICAgICAgICBpZiAobnVtYmVyT2ZTdHJlYW1zICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG9uZSBzdHJlYW0gYnV0IGdvdCAnICsgbnVtYmVyT2ZTdHJlYW1zKTtcbiAgICAgICAgY29uc3QgaWRTdHJpbmcgPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHsgSWQ6IGlkIH0gPSBKU09OLnBhcnNlKGlkU3RyaW5nKTtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGlkKTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXR3b3JrIGlzc3VlIHRoZW4gaXRzIGhhbmRsZWQgYnlcbiAgICAgICAgLy8gdGhlIGRpc2Nvbm5lY3Rpb25IYW5kbGVyLiBFdmVyeXRoaW5nIGVsc2UgY2FuXG4gICAgICAgIC8vIGJlIHJldHJpZWRcbiAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcCQ7XG4gIH1cblxuICBwcml2YXRlIHBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IGF0dGFjaG1lbnRzLCAuLi5tZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIH0gPSBtZXNzYWdlO1xuXG4gICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKHN1YnNjcmliZXIgPT4ge1xuICAgICAgY29uc3QgaHR0cENvbnRlbnRMaXN0ID0gW107XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVycyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgYXR0YWNobWVudHMubWFwKGFzeW5jIGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtZWRpYSA9IGF0dGFjaG1lbnQgYXMgTWVkaWE7XG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKG1lZGlhLmNvbnRlbnRVcmwpO1xuICAgICAgICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgYXJyYXlCdWZmZXI6IGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpLCBtZWRpYSB9O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGFycmF5QnVmZmVycy5mb3JFYWNoKCh7IGFycmF5QnVmZmVyLCBtZWRpYSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQkZTRS5TdWJzY3JpYmFibGVTdHJlYW0oKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZShidWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgaHR0cENvbnRlbnQgPSBuZXcgQkZTRS5IdHRwQ29udGVudCh7IHR5cGU6IG1lZGlhLmNvbnRlbnRUeXBlLCBjb250ZW50TGVuZ3RoOiBidWZmZXIubGVuZ3RoIH0sIHN0cmVhbSk7XG4gICAgICAgICAgICBodHRwQ29udGVudExpc3QucHVzaChodHRwQ29udGVudCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB1cmwgPSBgL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucy8ke3RoaXMuY29udmVyc2F0aW9uSWR9L3VzZXJzLyR7bWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cy5mcm9tLmlkfS91cGxvYWRgO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBCRlNFLlN0cmVhbWluZ1JlcXVlc3QuY3JlYXRlKCdQVVQnLCB1cmwpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2aXR5U3RyZWFtID0gbmV3IEJGU0UuU3Vic2NyaWJhYmxlU3RyZWFtKCk7XG4gICAgICAgICAgYWN0aXZpdHlTdHJlYW0ud3JpdGUoSlNPTi5zdHJpbmdpZnkobWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyksICd1dGYtOCcpO1xuICAgICAgICAgIHJlcXVlc3QuYWRkU3RyZWFtKFxuICAgICAgICAgICAgbmV3IEJGU0UuSHR0cENvbnRlbnQoXG4gICAgICAgICAgICAgIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuYWN0aXZpdHknLCBjb250ZW50TGVuZ3RoOiBhY3Rpdml0eVN0cmVhbS5sZW5ndGggfSxcbiAgICAgICAgICAgICAgYWN0aXZpdHlTdHJlYW1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGh0dHBDb250ZW50TGlzdC5mb3JFYWNoKGUgPT4gcmVxdWVzdC5hZGRTdHJlYW0oZSkpO1xuXG4gICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICAgIGlmIChyZXNwLnN0cmVhbXMgJiYgcmVzcC5zdHJlYW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoYEludmFsaWQgc3RyZWFtIGNvdW50ICR7cmVzcC5zdHJlYW1zLmxlbmd0aH1gKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgSWQ6IGlkIH0gPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzSnNvbjx7IElkOiBzdHJpbmcgfT4oKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChpZCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdFVudGlsT25saW5lKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZShcbiAgICAgICAgY3MgPT4ge1xuICAgICAgICAgIGlmIChjcyA9PT0gQ29ubmVjdGlvblN0YXR1cy5PbmxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlID0+IHJlamVjdChlKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdEFzeW5jKCkge1xuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnXmh0dHAocz8pJyk7XG5cbiAgICBpZiAoIXJlLnRlc3QodGhpcy5kb21haW4pKSB7XG4gICAgICB0aHJvdyAnRG9tYWluIG11c3QgYmVnaW4gd2l0aCBodHRwIG9yIGh0dHBzJztcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7IHRva2VuOiB0aGlzLnRva2VuIH07XG5cbiAgICBpZiAodGhpcy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgcGFyYW1zWydjb252ZXJzYXRpb25JZCddID0gdGhpcy5jb252ZXJzYXRpb25JZDtcbiAgICB9XG5cbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdXJsU2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgd3NVcmwgPSBgJHt0aGlzLmRvbWFpbi5yZXBsYWNlKHJlLCAnd3MkMScpfS9jb252ZXJzYXRpb25zL2Nvbm5lY3Q/JHt1cmxTZWFyY2hQYXJhbXN9YDtcblxuICAgIC8vIFRoaXMgcHJvbWlzZSB3aWxsIHJlc29sdmUgd2hlbiBpdCBpcyBkaXNjb25uZWN0ZWQuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbiA9IG5ldyBXZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uKHtcbiAgICAgICAgICBkaXNjb25uZWN0aW9uSGFuZGxlcjogcmVzb2x2ZSxcbiAgICAgICAgICBuZXR3b3JrSW5mb3JtYXRpb246IHRoaXMuI25ldHdvcmtJbmZvcm1hdGlvbixcbiAgICAgICAgICByZXF1ZXN0SGFuZGxlcjoge1xuICAgICAgICAgICAgcHJvY2Vzc1JlcXVlc3Q6IHN0cmVhbWluZ1JlcXVlc3QgPT4ge1xuICAgICAgICAgICAgICAvLyBJZiBgc3RyZWFtQ29ubmVjdGlvbmAgaXMgc3RpbGwgY3VycmVudCwgYWxsb3cgY2FsbCB0byBgcHJvY2Vzc1JlcXVlc3QoKWAsIG90aGVyd2lzZSwgaWdub3JlIGNhbGxzIHRvIGBwcm9jZXNzUmVxdWVzdCgpYC5cbiAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB6b21iaWUgY29ubmVjdGlvbnMgZnJvbSBzZW5kaW5nIHVzIHJlcXVlc3RzLlxuICAgICAgICAgICAgICBpZiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcHJvY2VzcyBzdHJlYW1pbmcgcmVxdWVzdCwgYHN0cmVhbWluZ0Nvbm5lY3Rpb25gIHNob3VsZCBiZSBkaXNjb25uZWN0ZWQuJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50aGVTdHJlYW1IYW5kbGVyLnByb2Nlc3NSZXF1ZXN0KHN0cmVhbWluZ1JlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXJsOiB3c1VybFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IHRydWU7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmNvbm5lY3QoKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUE9TVCcsICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zJyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiByZXNwb25zZSBjb2RlICcgKyByZXNwb25zZS5zdGF0dXNDb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdHJlYW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgMSBzdHJlYW0gYnV0IGdvdCAnICsgcmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VTdHJpbmcgPSBhd2FpdCByZXNwb25zZS5zdHJlYW1zWzBdLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBKU09OLnBhcnNlKHJlc3BvbnNlU3RyaW5nKTtcblxuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uLmNvbnZlcnNhdGlvbklkO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5PbmxpbmUpO1xuXG4gICAgICAgIC8vIFdhaXQgdW50aWwgREwgY29uc3VtZXJzIGhhdmUgaGFkIGEgY2hhbmNlIHRvIGJlIG5vdGlmaWVkXG4gICAgICAgIC8vIG9mIHRoZSBjb25uZWN0aW9uIHN0YXR1cyBjaGFuZ2UuXG4gICAgICAgIC8vIFRoaXMgaXMgc3BlY2lmaWMgdG8gUnhKUyBpbXBsZW1lbnRhdGlvbiBvZiBvYnNlcnZhYmxlLCB3aGljaCBjYWxsaW5nIHN1YnNjcmliZSgpIGFmdGVyIG5leHQoKSB3aWxsIHN0aWxsIGdldCB0aGUgdmFsdWUuXG4gICAgICAgIGF3YWl0IHRoaXMud2FpdFVudGlsT25saW5lKCk7XG5cbiAgICAgICAgdGhpcy50aGVTdHJlYW1IYW5kbGVyLmZsdXNoKCk7XG4gICAgICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KS5maW5hbGx5KCgpID0+IGFib3J0Q29udHJvbGxlci5hYm9ydCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFdpdGhSZXRyeUFzeW5jKCkge1xuICAgIC8vIFRoaXMgZm9yLWxvb3Agd2lsbCBicmVhayB3aGVuIHNvbWVvbmUgY2FsbCBlbmQoKSBhbmQgaXQgd2lsbCBzaWduYWwgQ29ubmVjdGlvblN0YXR1cy5FbmRlZC5cbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgc2lnbmFsIGFuZCB3YWl0IGZvciBzb21lb25lIGtpY2tpbmcgb2ZmIHRoZSBjb25uZWN0aW9uOlxuICAgICAgLy8gLSBzdWJzY3JpYmUgdG8gYWN0aXZpdHkkLCBvcjtcbiAgICAgIC8vIC0gcmV0cmllcyBleGhhdXN0ZWQgKEZhaWxlZFRvQ29ubmVjdCksIHRoZW4sIHNvbWVvbmUgY2FsbCByZWNvbm5lY3QoKVxuICAgICAgYXdhaXQgKHRoaXMuY29ubmVjdERlZmVycmVkID0gY3JlYXRlRGVmZXJyZWQoKSkucHJvbWlzZTtcblxuICAgICAgbGV0IG51bVJldHJpZXMgPSBNQVhfUkVUUllfQ09VTlQ7XG5cbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpO1xuXG4gICAgICB3aGlsZSAobnVtUmV0cmllcyA+IDApIHtcbiAgICAgICAgbnVtUmV0cmllcy0tO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgcHJvbWlzZSB3aWxsIHJlamVjdC9yZXNvbHZlIHdoZW4gZGlzY29ubmVjdGVkLlxuICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdEFzeW5jKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbCBlbmQoKSB0byBicmVhayB0aGUgY29ubmVjdGlvbiwgd2Ugd2lsbCBuZXZlciBsaXN0ZW4gdG8gYW55IHJlY29ubmVjdCgpLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGUgbG9vcCBpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYnJva2UuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNpZ25hbCBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcgdHdpY2Ugb3IgbW9yZSB3aXRob3V0IGFuIGFjdHVhbCBjb25uZWN0aW9uLlxuICAgICAgICAvLyBTdWJzZXF1ZW50IHJldHJpZXMgc2hvdWxkIGJlIHRyYW5zcGFyZW50LlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpICE9PSBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpIHtcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gbGFzdGVkIGZvciBtb3JlIHRoYW4gYSBtaW51dGUsIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uIGlzIGdvb2QsIHdoaWNoIG1lYW5zOlxuICAgICAgICAvLyAtIHdlIHNob3VsZCByZXNldCB0aGUgcmV0cnkgY291bnRlciwgYW5kO1xuICAgICAgICAvLyAtIHdlIHNob3VsZCByZWNvbm5lY3QgaW1tZWRpYXRlbHkuXG4gICAgICAgIGlmICg2MDAwMCA8IERhdGUubm93KCkgLSBzdGFydCkge1xuICAgICAgICAgIG51bVJldHJpZXMgPSBNQVhfUkVUUllfQ09VTlQ7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtUmV0cmllcyA+IDApIHtcbiAgICAgICAgICAvLyBTbGVlcCBvbmx5IGlmIHdlIGFyZSBkb2luZyByZXRyeS4gT3RoZXJ3aXNlLCB3ZSBhcmUgZ29pbmcgdG8gYnJlYWsgdGhlIGxvb3AgYW5kIHNpZ25hbCBGYWlsZWRUb0Nvbm5lY3QuXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIHRoaXMuZ2V0UmV0cnlEZWxheSgpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogW1RFU1RdIE1ha2Ugc3VyZSBGYWlsZWRUb0Nvbm5lY3QgaXMgcmVwb3J0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgbGFzdCBkaXNjb25uZWN0aW9uLCBzaG91bGQgYmUgbm8gZ2V0UmV0cnlEZWxheSgpLlxuICAgICAgLy8gRmFpbGVkIHRvIHJlY29ubmVjdCBhZnRlciBtdWx0aXBsZSByZXRyaWVzLlxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0KTtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBObyBjb2RlIHdpbGwgaGl0IHRoaXMgbGluZS5cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGRlbGF5IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICBwcml2YXRlIGdldFJldHJ5RGVsYXkoKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoMzAwMCArIE1hdGgucmFuZG9tKCkgKiAxMjAwMCk7XG4gIH1cbn1cbiJdfQ==
|