botframework-directlinejs 0.15.3-master.dbb4063 → 0.15.3-master.fb239fe

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.
@@ -167,7 +167,9 @@ var DirectLineStreaming = /*#__PURE__*/function () {
167
167
  (0, _defineProperty2["default"])(this, "connectionStatus$", new _BehaviorSubject.BehaviorSubject(_directLine.ConnectionStatus.Uninitialized));
168
168
  (0, _defineProperty2["default"])(this, "_botAgent", '');
169
169
  this.token = options.token;
170
- this.refreshToken();
170
+ this.refreshToken()["catch"](function () {
171
+ _this2.connectionStatus$.next(_directLine.ConnectionStatus.ExpiredToken);
172
+ });
171
173
  this.domain = options.domain;
172
174
 
173
175
  if (options.conversationId) {
@@ -186,15 +188,26 @@ var DirectLineStreaming = /*#__PURE__*/function () {
186
188
  _this2.theStreamHandler = new StreamHandler(subscriber, _this2.connectionStatus$, function () {
187
189
  return _this2.queueActivities;
188
190
  });
191
+ _context2.prev = 2;
192
+ _context2.next = 5;
193
+ return _this2.connectWithRetryAsync();
189
194
 
190
- _this2.connectWithRetryAsync();
195
+ case 5:
196
+ _context2.next = 10;
197
+ break;
191
198
 
192
- case 3:
199
+ case 7:
200
+ _context2.prev = 7;
201
+ _context2.t0 = _context2["catch"](2);
202
+
203
+ _this2.connectionStatus$.next(_directLine.ConnectionStatus.FailedToConnect);
204
+
205
+ case 10:
193
206
  case "end":
194
207
  return _context2.stop();
195
208
  }
196
209
  }
197
- }, _callee2);
210
+ }, _callee2, null, [[2, 7]]);
198
211
  }));
199
212
 
200
213
  return function (_x3) {
@@ -205,13 +218,33 @@ var DirectLineStreaming = /*#__PURE__*/function () {
205
218
 
206
219
  (0, _createClass2["default"])(DirectLineStreaming, [{
207
220
  key: "reconnect",
208
- value: function reconnect(_ref2) {
209
- var conversationId = _ref2.conversationId,
210
- token = _ref2.token;
211
- this.conversationId = conversationId;
212
- this.token = token;
213
- this.connectAsync();
214
- }
221
+ value: function () {
222
+ var _reconnect = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref2) {
223
+ var conversationId, token;
224
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
225
+ while (1) {
226
+ switch (_context3.prev = _context3.next) {
227
+ case 0:
228
+ conversationId = _ref2.conversationId, token = _ref2.token;
229
+ this.conversationId = conversationId;
230
+ this.token = token;
231
+ _context3.next = 5;
232
+ return this.connectAsync();
233
+
234
+ case 5:
235
+ case "end":
236
+ return _context3.stop();
237
+ }
238
+ }
239
+ }, _callee3, this);
240
+ }));
241
+
242
+ function reconnect(_x4) {
243
+ return _reconnect.apply(this, arguments);
244
+ }
245
+
246
+ return reconnect;
247
+ }()
215
248
  }, {
216
249
  key: "end",
217
250
  value: function end() {
@@ -241,22 +274,22 @@ var DirectLineStreaming = /*#__PURE__*/function () {
241
274
  }, {
242
275
  key: "refreshToken",
243
276
  value: function () {
244
- var _refreshToken = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
277
+ var _refreshToken = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
245
278
  var firstCall,
246
279
  retryCount,
247
280
  numberOfAttempts,
248
281
  res,
249
282
  _yield$res$json,
250
283
  token,
251
- _args3 = arguments;
284
+ _args4 = arguments;
252
285
 
253
- return _regenerator["default"].wrap(function _callee3$(_context3) {
286
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
254
287
  while (1) {
255
- switch (_context3.prev = _context3.next) {
288
+ switch (_context4.prev = _context4.next) {
256
289
  case 0:
257
- firstCall = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : true;
258
- retryCount = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : 0;
259
- _context3.next = 4;
290
+ firstCall = _args4.length > 0 && _args4[0] !== undefined ? _args4[0] : true;
291
+ retryCount = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : 0;
292
+ _context4.next = 4;
260
293
  return this.waitUntilOnline();
261
294
 
262
295
  case 4:
@@ -264,41 +297,41 @@ var DirectLineStreaming = /*#__PURE__*/function () {
264
297
 
265
298
  case 5:
266
299
  if (!(numberOfAttempts < MAX_RETRY_COUNT)) {
267
- _context3.next = 30;
300
+ _context4.next = 30;
268
301
  break;
269
302
  }
270
303
 
271
304
  numberOfAttempts++;
272
- _context3.next = 9;
305
+ _context4.next = 9;
273
306
  return new Promise(function (r) {
274
307
  return setTimeout(r, refreshTokenInterval);
275
308
  });
276
309
 
277
310
  case 9:
278
- _context3.prev = 9;
279
- _context3.next = 12;
311
+ _context4.prev = 9;
312
+ _context4.next = 12;
280
313
  return (0, _crossFetch["default"])("".concat(this.domain, "/tokens/refresh"), {
281
314
  method: "POST",
282
315
  headers: this.commonHeaders()
283
316
  });
284
317
 
285
318
  case 12:
286
- res = _context3.sent;
319
+ res = _context4.sent;
287
320
 
288
321
  if (!res.ok) {
289
- _context3.next = 22;
322
+ _context4.next = 22;
290
323
  break;
291
324
  }
292
325
 
293
326
  numberOfAttempts = 0;
294
- _context3.next = 17;
327
+ _context4.next = 17;
295
328
  return res.json();
296
329
 
297
330
  case 17:
298
- _yield$res$json = _context3.sent;
331
+ _yield$res$json = _context4.sent;
299
332
  token = _yield$res$json.token;
300
333
  this.token = token;
301
- _context3.next = 23;
334
+ _context4.next = 23;
302
335
  break;
303
336
 
304
337
  case 22:
@@ -310,16 +343,16 @@ var DirectLineStreaming = /*#__PURE__*/function () {
310
343
  }
311
344
 
312
345
  case 23:
313
- _context3.next = 28;
346
+ _context4.next = 28;
314
347
  break;
315
348
 
316
349
  case 25:
317
- _context3.prev = 25;
318
- _context3.t0 = _context3["catch"](9);
319
- console.warn("Refresh attempt #".concat(numberOfAttempts, " threw an exception: ").concat(_context3.t0));
350
+ _context4.prev = 25;
351
+ _context4.t0 = _context4["catch"](9);
352
+ console.warn("Refresh attempt #".concat(numberOfAttempts, " threw an exception: ").concat(_context4.t0));
320
353
 
321
354
  case 28:
322
- _context3.next = 5;
355
+ _context4.next = 5;
323
356
  break;
324
357
 
325
358
  case 30:
@@ -328,10 +361,10 @@ var DirectLineStreaming = /*#__PURE__*/function () {
328
361
 
329
362
  case 32:
330
363
  case "end":
331
- return _context3.stop();
364
+ return _context4.stop();
332
365
  }
333
366
  }
334
- }, _callee3, this, [[9, 25]]);
367
+ }, _callee4, this, [[9, 25]]);
335
368
  }));
336
369
 
337
370
  function refreshToken() {
@@ -350,24 +383,24 @@ var DirectLineStreaming = /*#__PURE__*/function () {
350
383
  }
351
384
 
352
385
  var resp$ = _Observable.Observable.create( /*#__PURE__*/function () {
353
- var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(subscriber) {
386
+ var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(subscriber) {
354
387
  var request, resp, numberOfStreams, idString, _JSON$parse, id;
355
388
 
356
- return _regenerator["default"].wrap(function _callee4$(_context4) {
389
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
357
390
  while (1) {
358
- switch (_context4.prev = _context4.next) {
391
+ switch (_context5.prev = _context5.next) {
359
392
  case 0:
360
393
  request = BFSE.StreamingRequest.create('POST', '/v3/directline/conversations/' + _this3.conversationId + '/activities');
361
394
  request.setBody(JSON.stringify(activity));
362
- _context4.next = 4;
395
+ _context5.next = 4;
363
396
  return _this3.streamConnection.send(request);
364
397
 
365
398
  case 4:
366
- resp = _context4.sent;
367
- _context4.prev = 5;
399
+ resp = _context5.sent;
400
+ _context5.prev = 5;
368
401
 
369
402
  if (!(resp.statusCode !== 200)) {
370
- _context4.next = 8;
403
+ _context5.next = 8;
371
404
  break;
372
405
  }
373
406
 
@@ -377,42 +410,42 @@ var DirectLineStreaming = /*#__PURE__*/function () {
377
410
  numberOfStreams = resp.streams.length;
378
411
 
379
412
  if (!(numberOfStreams !== 1)) {
380
- _context4.next = 11;
413
+ _context5.next = 11;
381
414
  break;
382
415
  }
383
416
 
384
417
  throw new Error("Expected one stream but got " + numberOfStreams);
385
418
 
386
419
  case 11:
387
- _context4.next = 13;
420
+ _context5.next = 13;
388
421
  return resp.streams[0].readAsString();
389
422
 
390
423
  case 13:
391
- idString = _context4.sent;
424
+ idString = _context5.sent;
392
425
  _JSON$parse = JSON.parse(idString), id = _JSON$parse.Id;
393
- return _context4.abrupt("return", subscriber.next(id));
426
+ return _context5.abrupt("return", subscriber.next(id));
394
427
 
395
428
  case 18:
396
- _context4.prev = 18;
397
- _context4.t0 = _context4["catch"](5);
429
+ _context5.prev = 18;
430
+ _context5.t0 = _context5["catch"](5);
398
431
  // If there is a network issue then its handled by
399
432
  // the disconnectionHandler. Everything else can
400
433
  // be retried
401
- console.warn(_context4.t0);
434
+ console.warn(_context5.t0);
402
435
 
403
436
  _this3.streamConnection.disconnect();
404
437
 
405
- return _context4.abrupt("return", subscriber.error(_context4.t0));
438
+ return _context5.abrupt("return", subscriber.error(_context5.t0));
406
439
 
407
440
  case 23:
408
441
  case "end":
409
- return _context4.stop();
442
+ return _context5.stop();
410
443
  }
411
444
  }
412
- }, _callee4, null, [[5, 18]]);
445
+ }, _callee5, null, [[5, 18]]);
413
446
  }));
414
447
 
415
- return function (_x4) {
448
+ return function (_x5) {
416
449
  return _ref3.apply(this, arguments);
417
450
  };
418
451
  }());
@@ -428,43 +461,43 @@ var DirectLineStreaming = /*#__PURE__*/function () {
428
461
  messageWithoutAttachments = (0, _objectWithoutProperties2["default"])(message, _excluded);
429
462
  return _Observable.Observable.create(function (subscriber) {
430
463
  var httpContentList = [];
431
- (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
464
+ (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
432
465
  var arrayBuffers, url, request, activityStream, resp, _yield$resp$streams$, id;
433
466
 
434
- return _regenerator["default"].wrap(function _callee6$(_context6) {
467
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
435
468
  while (1) {
436
- switch (_context6.prev = _context6.next) {
469
+ switch (_context7.prev = _context7.next) {
437
470
  case 0:
438
- _context6.prev = 0;
439
- _context6.next = 3;
471
+ _context7.prev = 0;
472
+ _context7.next = 3;
440
473
  return Promise.all(attachments.map( /*#__PURE__*/function () {
441
- var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(attachment) {
474
+ var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(attachment) {
442
475
  var media, res;
443
- return _regenerator["default"].wrap(function _callee5$(_context5) {
476
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
444
477
  while (1) {
445
- switch (_context5.prev = _context5.next) {
478
+ switch (_context6.prev = _context6.next) {
446
479
  case 0:
447
480
  media = attachment;
448
- _context5.next = 3;
481
+ _context6.next = 3;
449
482
  return (0, _crossFetch["default"])(media.contentUrl);
450
483
 
451
484
  case 3:
452
- res = _context5.sent;
485
+ res = _context6.sent;
453
486
 
454
487
  if (!res.ok) {
455
- _context5.next = 12;
488
+ _context6.next = 12;
456
489
  break;
457
490
  }
458
491
 
459
- _context5.next = 7;
492
+ _context6.next = 7;
460
493
  return res.arrayBuffer();
461
494
 
462
495
  case 7:
463
- _context5.t0 = _context5.sent;
464
- _context5.t1 = media;
465
- return _context5.abrupt("return", {
466
- arrayBuffer: _context5.t0,
467
- media: _context5.t1
496
+ _context6.t0 = _context6.sent;
497
+ _context6.t1 = media;
498
+ return _context6.abrupt("return", {
499
+ arrayBuffer: _context6.t0,
500
+ media: _context6.t1
468
501
  });
469
502
 
470
503
  case 12:
@@ -472,19 +505,19 @@ var DirectLineStreaming = /*#__PURE__*/function () {
472
505
 
473
506
  case 13:
474
507
  case "end":
475
- return _context5.stop();
508
+ return _context6.stop();
476
509
  }
477
510
  }
478
- }, _callee5);
511
+ }, _callee6);
479
512
  }));
480
513
 
481
- return function (_x5) {
514
+ return function (_x6) {
482
515
  return _ref5.apply(this, arguments);
483
516
  };
484
517
  }()));
485
518
 
486
519
  case 3:
487
- arrayBuffers = _context6.sent;
520
+ arrayBuffers = _context7.sent;
488
521
  arrayBuffers.forEach(function (_ref6) {
489
522
  var arrayBuffer = _ref6.arrayBuffer,
490
523
  media = _ref6.media;
@@ -511,59 +544,59 @@ var DirectLineStreaming = /*#__PURE__*/function () {
511
544
  httpContentList.forEach(function (e) {
512
545
  return request.addStream(e);
513
546
  });
514
- _context6.next = 13;
547
+ _context7.next = 13;
515
548
  return _this4.streamConnection.send(request);
516
549
 
517
550
  case 13:
518
- resp = _context6.sent;
551
+ resp = _context7.sent;
519
552
 
520
553
  if (!(resp.streams && resp.streams.length !== 1)) {
521
- _context6.next = 18;
554
+ _context7.next = 18;
522
555
  break;
523
556
  }
524
557
 
525
558
  subscriber.error(new Error("Invalid stream count ".concat(resp.streams.length)));
526
- _context6.next = 23;
559
+ _context7.next = 23;
527
560
  break;
528
561
 
529
562
  case 18:
530
- _context6.next = 20;
563
+ _context7.next = 20;
531
564
  return resp.streams[0].readAsJson();
532
565
 
533
566
  case 20:
534
- _yield$resp$streams$ = _context6.sent;
567
+ _yield$resp$streams$ = _context7.sent;
535
568
  id = _yield$resp$streams$.Id;
536
569
  subscriber.next(id);
537
570
 
538
571
  case 23:
539
- _context6.next = 28;
572
+ _context7.next = 28;
540
573
  break;
541
574
 
542
575
  case 25:
543
- _context6.prev = 25;
544
- _context6.t0 = _context6["catch"](0);
545
- subscriber.error(_context6.t0);
576
+ _context7.prev = 25;
577
+ _context7.t0 = _context7["catch"](0);
578
+ subscriber.error(_context7.t0);
546
579
 
547
580
  case 28:
548
581
  case "end":
549
- return _context6.stop();
582
+ return _context7.stop();
550
583
  }
551
584
  }
552
- }, _callee6, null, [[0, 25]]);
585
+ }, _callee7, null, [[0, 25]]);
553
586
  }))();
554
587
  });
555
588
  }
556
589
  }, {
557
590
  key: "waitUntilOnline",
558
591
  value: function () {
559
- var _waitUntilOnline = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
592
+ var _waitUntilOnline = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
560
593
  var _this5 = this;
561
594
 
562
- return _regenerator["default"].wrap(function _callee7$(_context7) {
595
+ return _regenerator["default"].wrap(function _callee8$(_context8) {
563
596
  while (1) {
564
- switch (_context7.prev = _context7.next) {
597
+ switch (_context8.prev = _context8.next) {
565
598
  case 0:
566
- return _context7.abrupt("return", new Promise(function (resolve, reject) {
599
+ return _context8.abrupt("return", new Promise(function (resolve, reject) {
567
600
  _this5.connectionStatus$.subscribe(function (cs) {
568
601
  if (cs === _directLine.ConnectionStatus.Online) return resolve();
569
602
  }, function (e) {
@@ -573,10 +606,10 @@ var DirectLineStreaming = /*#__PURE__*/function () {
573
606
 
574
607
  case 1:
575
608
  case "end":
576
- return _context7.stop();
609
+ return _context8.stop();
577
610
  }
578
611
  }
579
- }, _callee7);
612
+ }, _callee8);
580
613
  }));
581
614
 
582
615
  function waitUntilOnline() {
@@ -588,18 +621,18 @@ var DirectLineStreaming = /*#__PURE__*/function () {
588
621
  }, {
589
622
  key: "connectAsync",
590
623
  value: function () {
591
- var _connectAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
624
+ var _connectAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
592
625
  var _this6 = this;
593
626
 
594
627
  var re, params, urlSearchParams, wsUrl;
595
- return _regenerator["default"].wrap(function _callee9$(_context9) {
628
+ return _regenerator["default"].wrap(function _callee10$(_context10) {
596
629
  while (1) {
597
- switch (_context9.prev = _context9.next) {
630
+ switch (_context10.prev = _context10.next) {
598
631
  case 0:
599
632
  re = new RegExp('^http(s?)');
600
633
 
601
634
  if (re.test(this.domain)) {
602
- _context9.next = 3;
635
+ _context10.next = 3;
603
636
  break;
604
637
  }
605
638
 
@@ -612,14 +645,14 @@ var DirectLineStreaming = /*#__PURE__*/function () {
612
645
  if (this.conversationId) params['conversationId'] = this.conversationId;
613
646
  urlSearchParams = new URLSearchParams(params).toString();
614
647
  wsUrl = "".concat(this.domain.replace(re, 'ws$1'), "/conversations/connect?").concat(urlSearchParams);
615
- return _context9.abrupt("return", new Promise( /*#__PURE__*/function () {
616
- var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(resolve, reject) {
648
+ return _context10.abrupt("return", new Promise( /*#__PURE__*/function () {
649
+ var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(resolve, reject) {
617
650
  var request, response, responseString, conversation;
618
- return _regenerator["default"].wrap(function _callee8$(_context8) {
651
+ return _regenerator["default"].wrap(function _callee9$(_context9) {
619
652
  while (1) {
620
- switch (_context8.prev = _context8.next) {
653
+ switch (_context9.prev = _context9.next) {
621
654
  case 0:
622
- _context8.prev = 0;
655
+ _context9.prev = 0;
623
656
  _this6.streamConnection = new BFSE.WebSocketClient({
624
657
  url: wsUrl,
625
658
  requestHandler: _this6.theStreamHandler,
@@ -628,19 +661,19 @@ var DirectLineStreaming = /*#__PURE__*/function () {
628
661
  }
629
662
  });
630
663
  _this6.queueActivities = true;
631
- _context8.next = 5;
664
+ _context9.next = 5;
632
665
  return _this6.streamConnection.connect();
633
666
 
634
667
  case 5:
635
668
  request = BFSE.StreamingRequest.create('POST', '/v3/directline/conversations');
636
- _context8.next = 8;
669
+ _context9.next = 8;
637
670
  return _this6.streamConnection.send(request);
638
671
 
639
672
  case 8:
640
- response = _context8.sent;
673
+ response = _context9.sent;
641
674
 
642
675
  if (!(response.statusCode !== 200)) {
643
- _context8.next = 11;
676
+ _context9.next = 11;
644
677
  break;
645
678
  }
646
679
 
@@ -648,18 +681,18 @@ var DirectLineStreaming = /*#__PURE__*/function () {
648
681
 
649
682
  case 11:
650
683
  if (!(response.streams.length !== 1)) {
651
- _context8.next = 13;
684
+ _context9.next = 13;
652
685
  break;
653
686
  }
654
687
 
655
688
  throw new Error("Expected 1 stream but got " + response.streams.length);
656
689
 
657
690
  case 13:
658
- _context8.next = 15;
691
+ _context9.next = 15;
659
692
  return response.streams[0].readAsString();
660
693
 
661
694
  case 15:
662
- responseString = _context8.sent;
695
+ responseString = _context9.sent;
663
696
  conversation = JSON.parse(responseString);
664
697
  _this6.conversationId = conversation.conversationId;
665
698
 
@@ -667,40 +700,40 @@ var DirectLineStreaming = /*#__PURE__*/function () {
667
700
  // of the connection status change.
668
701
 
669
702
 
670
- _context8.next = 21;
703
+ _context9.next = 21;
671
704
  return _this6.waitUntilOnline();
672
705
 
673
706
  case 21:
674
707
  _this6.theStreamHandler.flush();
675
708
 
676
709
  _this6.queueActivities = false;
677
- _context8.next = 28;
710
+ _context9.next = 28;
678
711
  break;
679
712
 
680
713
  case 25:
681
- _context8.prev = 25;
682
- _context8.t0 = _context8["catch"](0);
683
- reject(_context8.t0);
714
+ _context9.prev = 25;
715
+ _context9.t0 = _context9["catch"](0);
716
+ reject(_context9.t0);
684
717
 
685
718
  case 28:
686
719
  case "end":
687
- return _context8.stop();
720
+ return _context9.stop();
688
721
  }
689
722
  }
690
- }, _callee8, null, [[0, 25]]);
723
+ }, _callee9, null, [[0, 25]]);
691
724
  }));
692
725
 
693
- return function (_x6, _x7) {
726
+ return function (_x7, _x8) {
694
727
  return _ref7.apply(this, arguments);
695
728
  };
696
729
  }()));
697
730
 
698
731
  case 8:
699
732
  case "end":
700
- return _context9.stop();
733
+ return _context10.stop();
701
734
  }
702
735
  }
703
- }, _callee9, this);
736
+ }, _callee10, this);
704
737
  }));
705
738
 
706
739
  function connectAsync() {
@@ -712,79 +745,79 @@ var DirectLineStreaming = /*#__PURE__*/function () {
712
745
  }, {
713
746
  key: "connectWithRetryAsync",
714
747
  value: function () {
715
- var _connectWithRetryAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
748
+ var _connectWithRetryAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
716
749
  var _this7 = this;
717
750
 
718
751
  var numRetries, start, res;
719
- return _regenerator["default"].wrap(function _callee10$(_context10) {
752
+ return _regenerator["default"].wrap(function _callee11$(_context11) {
720
753
  while (1) {
721
- switch (_context10.prev = _context10.next) {
754
+ switch (_context11.prev = _context11.next) {
722
755
  case 0:
723
756
  numRetries = MAX_RETRY_COUNT;
724
757
 
725
758
  case 1:
726
759
  if (!(numRetries > 0)) {
727
- _context10.next = 26;
760
+ _context11.next = 26;
728
761
  break;
729
762
  }
730
763
 
731
764
  numRetries--;
732
765
  start = Date.now();
733
- _context10.prev = 4;
766
+ _context11.prev = 4;
734
767
  this.connectionStatus$.next(_directLine.ConnectionStatus.Connecting);
735
- _context10.next = 8;
768
+ _context11.next = 8;
736
769
  return this.connectAsync();
737
770
 
738
771
  case 8:
739
- res = _context10.sent;
772
+ res = _context11.sent;
740
773
 
741
774
  if (!(this.connectionStatus$.getValue() === _directLine.ConnectionStatus.Ended)) {
742
- _context10.next = 12;
775
+ _context11.next = 12;
743
776
  break;
744
777
  }
745
778
 
746
779
  console.warn('Connection end');
747
- return _context10.abrupt("break", 26);
780
+ return _context11.abrupt("break", 26);
748
781
 
749
782
  case 12:
750
783
  console.warn("Retrying connection ".concat(res));
751
784
 
752
785
  if (!(60000 < Date.now() - start)) {
753
- _context10.next = 16;
786
+ _context11.next = 16;
754
787
  break;
755
788
  }
756
789
 
757
790
  // reset the retry counter and retry immediately
758
791
  // if the connection lasted for more than a minute
759
792
  numRetries = MAX_RETRY_COUNT;
760
- return _context10.abrupt("continue", 1);
793
+ return _context11.abrupt("continue", 1);
761
794
 
762
795
  case 16:
763
- _context10.next = 22;
796
+ _context11.next = 22;
764
797
  break;
765
798
 
766
799
  case 18:
767
- _context10.prev = 18;
768
- _context10.t0 = _context10["catch"](4);
769
- console.error("Failed to connect ".concat(_context10.t0));
770
- throw _context10.t0;
800
+ _context11.prev = 18;
801
+ _context11.t0 = _context11["catch"](4);
802
+ console.error("Failed to connect ".concat(_context11.t0));
803
+ throw _context11.t0;
771
804
 
772
805
  case 22:
773
- _context10.next = 24;
806
+ _context11.next = 24;
774
807
  return new Promise(function (r) {
775
808
  return setTimeout(r, _this7.getRetryDelay());
776
809
  });
777
810
 
778
811
  case 24:
779
- _context10.next = 1;
812
+ _context11.next = 1;
780
813
  break;
781
814
 
782
815
  case 26:
783
816
  case "end":
784
- return _context10.stop();
817
+ return _context11.stop();
785
818
  }
786
819
  }
787
- }, _callee10, this, [[4, 18]]);
820
+ }, _callee11, this, [[4, 18]]);
788
821
  }));
789
822
 
790
823
  function connectWithRetryAsync() {
@@ -804,4 +837,4 @@ var DirectLineStreaming = /*#__PURE__*/function () {
804
837
  }();
805
838
 
806
839
  exports.DirectLineStreaming = DirectLineStreaming;
807
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lU3RyZWFtaW5nLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJNQVhfUkVUUllfQ09VTlQiLCJyZWZyZXNoVG9rZW5MaWZldGltZSIsInRpbWVvdXQiLCJyZWZyZXNoVG9rZW5JbnRlcnZhbCIsIlN0cmVhbUhhbmRsZXIiLCJzIiwiYyQiLCJzcSIsInN1YnNjcmliZXIiLCJjb25uZWN0aW9uU3RhdHVzJCIsInNob3VsZFF1ZXVlIiwicmVxdWVzdCIsImxvZ2dlciIsInN0cmVhbXMiLCJzdHJlYW0wIiwic2hpZnQiLCJyZWFkQXNTdHJpbmciLCJhY3Rpdml0eVNldEpzb24iLCJhY3Rpdml0eVNldCIsIkpTT04iLCJwYXJzZSIsImFjdGl2aXRpZXMiLCJsZW5ndGgiLCJlcnJvciIsIkVycm9yIiwiQkZTRSIsIlN0cmVhbWluZ1Jlc3BvbnNlIiwiY3JlYXRlIiwiYWN0aXZpdHkiLCJhdHRhY2htZW50cyIsInN0cmVhbSIsImF0dGFjaG1lbnQiLCJkYXRhVXJpIiwicHVzaCIsImNvbnRlbnRUeXBlIiwiY29udGVudFVybCIsImFjdGl2aXR5UXVldWUiLCJuZXh0Iiwic3Vic2NyaWJlIiwiY3MiLCJmb3JFYWNoIiwiYSIsIkRpcmVjdExpbmVTdHJlYW1pbmciLCJvcHRpb25zIiwiQmVoYXZpb3JTdWJqZWN0IiwiQ29ubmVjdGlvblN0YXR1cyIsIlVuaW5pdGlhbGl6ZWQiLCJ0b2tlbiIsInJlZnJlc2hUb2tlbiIsImRvbWFpbiIsImNvbnZlcnNhdGlvbklkIiwiX2JvdEFnZW50IiwiZ2V0Qm90QWdlbnQiLCJib3RBZ2VudCIsInF1ZXVlQWN0aXZpdGllcyIsImFjdGl2aXR5JCIsIk9ic2VydmFibGUiLCJhY3Rpdml0eVN1YnNjcmliZXIiLCJ0aGVTdHJlYW1IYW5kbGVyIiwiY29ubmVjdFdpdGhSZXRyeUFzeW5jIiwic2hhcmUiLCJjb25uZWN0QXN5bmMiLCJFbmRlZCIsInN0cmVhbUNvbm5lY3Rpb24iLCJkaXNjb25uZWN0IiwiY3VzdG9tQWdlbnQiLCJjbGllbnRBZ2VudCIsImZpcnN0Q2FsbCIsInJldHJ5Q291bnQiLCJ3YWl0VW50aWxPbmxpbmUiLCJudW1iZXJPZkF0dGVtcHRzIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0IiwibWV0aG9kIiwiaGVhZGVycyIsImNvbW1vbkhlYWRlcnMiLCJyZXMiLCJvayIsImpzb24iLCJzdGF0dXMiLCJjb25zb2xlIiwic3RhdHVzVGV4dCIsIndhcm4iLCJ0eXBlIiwicG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMiLCJyZXNwJCIsIlN0cmVhbWluZ1JlcXVlc3QiLCJzZXRCb2R5Iiwic3RyaW5naWZ5Iiwic2VuZCIsInJlc3AiLCJzdGF0dXNDb2RlIiwibnVtYmVyT2ZTdHJlYW1zIiwiaWRTdHJpbmciLCJpZCIsIklkIiwibWVzc2FnZSIsIm1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMiLCJodHRwQ29udGVudExpc3QiLCJhbGwiLCJtYXAiLCJtZWRpYSIsImFycmF5QnVmZmVyIiwiYXJyYXlCdWZmZXJzIiwiYnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsImxvZyIsIlN1YnNjcmliYWJsZVN0cmVhbSIsIndyaXRlIiwiaHR0cENvbnRlbnQiLCJIdHRwQ29udGVudCIsImNvbnRlbnRMZW5ndGgiLCJ1cmwiLCJhY3Rpdml0eVN0cmVhbSIsImFkZFN0cmVhbSIsImUiLCJyZWFkQXNKc29uIiwicmVzb2x2ZSIsInJlamVjdCIsIk9ubGluZSIsInJlIiwiUmVnRXhwIiwidGVzdCIsInBhcmFtcyIsInVybFNlYXJjaFBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInRvU3RyaW5nIiwid3NVcmwiLCJyZXBsYWNlIiwiV2ViU29ja2V0Q2xpZW50IiwicmVxdWVzdEhhbmRsZXIiLCJkaXNjb25uZWN0aW9uSGFuZGxlciIsImNvbm5lY3QiLCJyZXNwb25zZSIsInJlc3BvbnNlU3RyaW5nIiwiY29udmVyc2F0aW9uIiwiZmx1c2giLCJudW1SZXRyaWVzIiwic3RhcnQiLCJEYXRlIiwibm93IiwiQ29ubmVjdGluZyIsImdldFZhbHVlIiwiZ2V0UmV0cnlEZWxheSIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUVBOzs7Ozs7OztBQVNBLElBQU1BLG1CQUFtQixHQUFHLGdCQUE1QjtBQUNBLElBQU1DLGVBQWUsR0FBRyxDQUF4QjtBQUNBLElBQU1DLG9CQUFvQixHQUFHLEtBQUssRUFBTCxHQUFVLElBQXZDLEMsQ0FDQTs7QUFDQSxJQUFNQyxPQUFPLEdBQUcsS0FBSyxJQUFyQjtBQUNBLElBQU1DLG9CQUFvQixHQUFHRixvQkFBb0IsR0FBRyxDQUFwRDs7SUFVTUcsYTtBQU1KLHlCQUFZQyxDQUFaLEVBQXFDQyxFQUFyQyxFQUF1RUMsRUFBdkUsRUFBMEY7QUFBQTtBQUFBLDREQUZqRCxFQUVpRDtBQUN4RixTQUFLQyxVQUFMLEdBQWtCSCxDQUFsQjtBQUNBLFNBQUtJLGlCQUFMLEdBQXlCSCxFQUF6QjtBQUNBLFNBQUtJLFdBQUwsR0FBbUJILEVBQW5CO0FBQ0Q7Ozs7V0FFRCx1QkFBcUJGLENBQXJCLEVBQThDO0FBQzVDLFdBQUtHLFVBQUwsR0FBa0JILENBQWxCO0FBQ0Q7Ozs7MEdBRUQsaUJBQXFCTSxPQUFyQixFQUFvREMsTUFBcEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1FDLGdCQUFBQSxPQURSLHVDQUNzQkYsT0FBTyxDQUFDRSxPQUQ5QjtBQUVRQyxnQkFBQUEsT0FGUixHQUVrQkQsT0FBTyxDQUFDRSxLQUFSLEVBRmxCO0FBQUE7QUFBQSx1QkFHZ0NELE9BQU8sQ0FBQ0UsWUFBUixFQUhoQzs7QUFBQTtBQUdRQyxnQkFBQUEsZUFIUjtBQUlRQyxnQkFBQUEsV0FKUixHQUlzQkMsSUFBSSxDQUFDQyxLQUFMLENBQVdILGVBQVgsQ0FKdEI7O0FBQUEsc0JBTU1DLFdBQVcsQ0FBQ0csVUFBWixDQUF1QkMsTUFBdkIsS0FBa0MsQ0FOeEM7QUFB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dCB0aGUgcGFydHMgb2YgcnhqcyB0aGF0IHdlIHVzZVxuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcy9TdWJzY3JpYmVyJztcbmltcG9ydCAqIGFzIEJGU0UgZnJvbSAnYm90ZnJhbWV3b3JrLXN0cmVhbWluZyc7XG5pbXBvcnQgZmV0Y2ggZnJvbSAnY3Jvc3MtZmV0Y2gnO1xuXG5pbXBvcnQge1xuICBBY3Rpdml0eSxcbiAgQ29ubmVjdGlvblN0YXR1cyxcbiAgQ29udmVyc2F0aW9uLFxuICBJQm90Q29ubmVjdGlvbixcbiAgTWVkaWEsXG4gIE1lc3NhZ2Vcbn0gZnJvbSAnLi9kaXJlY3RMaW5lJztcblxuY29uc3QgRElSRUNUX0xJTkVfVkVSU0lPTiA9ICdEaXJlY3RMaW5lLzMuMCc7XG5jb25zdCBNQVhfUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSAzMCAqIDYwICogMTAwMDtcbi8vY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSA1MDAwO1xuY29uc3QgdGltZW91dCA9IDIwICogMTAwMDtcbmNvbnN0IHJlZnJlc2hUb2tlbkludGVydmFsID0gcmVmcmVzaFRva2VuTGlmZXRpbWUgLyAyO1xuXG5pbnRlcmZhY2UgRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMge1xuICB0b2tlbjogc3RyaW5nLFxuICBjb252ZXJzYXRpb25JZD86IHN0cmluZyxcbiAgZG9tYWluOiBzdHJpbmcsXG4gIC8vIEF0dGFjaGVkIHRvIGFsbCByZXF1ZXN0cyB0byBpZGVudGlmeSByZXF1ZXN0aW5nIGFnZW50LlxuICBib3RBZ2VudD86IHN0cmluZ1xufVxuXG5jbGFzcyBTdHJlYW1IYW5kbGVyIGltcGxlbWVudHMgQkZTRS5SZXF1ZXN0SGFuZGxlciB7XG4gIHByaXZhdGUgY29ubmVjdGlvblN0YXR1cyQ7XG4gIHByaXZhdGUgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT47XG4gIHByaXZhdGUgc2hvdWxkUXVldWU6ICgpID0+IGJvb2xlYW47XG4gIHByaXZhdGUgYWN0aXZpdHlRdWV1ZTogQXJyYXk8QWN0aXZpdHk+ID0gW107XG5cbiAgY29uc3RydWN0b3IoczogU3Vic2NyaWJlcjxBY3Rpdml0eT4sIGMkOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25TdGF0dXM+LCBzcTogKCkgPT4gYm9vbGVhbikge1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IHM7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCA9IGMkO1xuICAgIHRoaXMuc2hvdWxkUXVldWUgPSBzcTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdWJzY3JpYmVyKHM6IFN1YnNjcmliZXI8QWN0aXZpdHk+KSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gcztcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IEJGU0UuSVJlY2VpdmVSZXF1ZXN0LCBsb2dnZXI/OiBhbnkpOiBQcm9taXNlPEJGU0UuU3RyZWFtaW5nUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzdHJlYW1zID0gWy4uLnJlcXVlc3Quc3RyZWFtc107XG4gICAgY29uc3Qgc3RyZWFtMCA9IHN0cmVhbXMuc2hpZnQoKTtcbiAgICBjb25zdCBhY3Rpdml0eVNldEpzb24gPSBhd2FpdCBzdHJlYW0wLnJlYWRBc1N0cmluZygpO1xuICAgIGNvbnN0IGFjdGl2aXR5U2V0ID0gSlNPTi5wYXJzZShhY3Rpdml0eVNldEpzb24pO1xuXG4gICAgaWYgKGFjdGl2aXR5U2V0LmFjdGl2aXRpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAvLyBPbmx5IG9uZSBhY3Rpdml0eSBpcyBleHBlY3RlZCBpbiBhIHNldCBpbiBzdHJlYW1pbmdcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ3RoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBhY3Rpdml0eScpKTtcbiAgICAgIHJldHVybiBCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlLmNyZWF0ZSg1MDApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2aXR5ID0gYWN0aXZpdHlTZXQuYWN0aXZpdGllc1swXTtcblxuICAgIGlmIChzdHJlYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gWy4uLmFjdGl2aXR5LmF0dGFjaG1lbnRzXTtcblxuICAgICAgbGV0IHN0cmVhbTogQkZTRS5Db250ZW50U3RyZWFtO1xuICAgICAgd2hpbGUgKHN0cmVhbSA9IHN0cmVhbXMuc2hpZnQoKSkge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgc3RyZWFtLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhVXJpID0gXCJkYXRhOnRleHQvcGxhaW47YmFzZTY0LFwiICsgYXR0YWNobWVudDtcbiAgICAgICAgYXR0YWNobWVudHMucHVzaCh7IGNvbnRlbnRUeXBlOiBzdHJlYW0uY29udGVudFR5cGUsIGNvbnRlbnRVcmw6IGRhdGFVcmkgfSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2aXR5LmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUXVldWUoKSkge1xuICAgICAgdGhpcy5hY3Rpdml0eVF1ZXVlLnB1c2goYWN0aXZpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXIubmV4dChhY3Rpdml0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJGU0UuU3RyZWFtaW5nUmVzcG9uc2UuY3JlYXRlKDIwMCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoY3MgPT4geyB9KVxuICAgIHRoaXMuYWN0aXZpdHlRdWV1ZS5mb3JFYWNoKChhKSA9PiB0aGlzLnN1YnNjcmliZXIubmV4dChhKSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlID0gW107XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpcmVjdExpbmVTdHJlYW1pbmcgaW1wbGVtZW50cyBJQm90Q29ubmVjdGlvbiB7XG4gIHB1YmxpYyBjb25uZWN0aW9uU3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoQ29ubmVjdGlvblN0YXR1cy5VbmluaXRpYWxpemVkKTtcbiAgcHVibGljIGFjdGl2aXR5JDogT2JzZXJ2YWJsZTxBY3Rpdml0eT47XG5cbiAgcHJpdmF0ZSBhY3Rpdml0eVN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+O1xuICBwcml2YXRlIHRoZVN0cmVhbUhhbmRsZXI6IFN0cmVhbUhhbmRsZXI7XG5cbiAgcHJpdmF0ZSBkb21haW46IHN0cmluZztcblxuICBwcml2YXRlIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSBzdHJlYW1Db25uZWN0aW9uOiBCRlNFLldlYlNvY2tldENsaWVudDtcbiAgcHJpdmF0ZSBxdWV1ZUFjdGl2aXRpZXM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYm90QWdlbnQgPSAnJztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lU3RyZWFtaW5nT3B0aW9ucykge1xuICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuXG4gICAgdGhpcy5yZWZyZXNoVG9rZW4oKTtcblxuICAgIHRoaXMuZG9tYWluID0gb3B0aW9ucy5kb21haW47XG5cbiAgICBpZiAob3B0aW9ucy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IG9wdGlvbnMuY29udmVyc2F0aW9uSWQ7XG4gICAgfVxuXG4gICAgdGhpcy5fYm90QWdlbnQgPSB0aGlzLmdldEJvdEFnZW50KG9wdGlvbnMuYm90QWdlbnQpO1xuXG4gICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSB0cnVlO1xuICAgIHRoaXMuYWN0aXZpdHkkID0gT2JzZXJ2YWJsZS5jcmVhdGUoYXN5bmMgKHN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+KSA9PiB7XG4gICAgICB0aGlzLmFjdGl2aXR5U3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gICAgICB0aGlzLnRoZVN0cmVhbUhhbmRsZXIgPSBuZXcgU3RyZWFtSGFuZGxlcihzdWJzY3JpYmVyLCB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLCAoKSA9PiB0aGlzLnF1ZXVlQWN0aXZpdGllcyk7XG4gICAgICB0aGlzLmNvbm5lY3RXaXRoUmV0cnlBc3luYygpO1xuICAgIH0pLnNoYXJlKCk7XG4gIH1cblxuICBwdWJsaWMgcmVjb25uZWN0KHsgY29udmVyc2F0aW9uSWQsIHRva2VuIH0gOiBDb252ZXJzYXRpb24pIHtcbiAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuY29ubmVjdEFzeW5jKCk7XG4gIH1cblxuICBlbmQoKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpO1xuICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1vbkhlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwiQXV0aG9yaXphdGlvblwiOiBgQmVhcmVyICR7dGhpcy50b2tlbn1gLFxuICAgICAgXCJ4LW1zLWJvdC1hZ2VudFwiOiB0aGlzLl9ib3RBZ2VudFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEJvdEFnZW50KGN1c3RvbUFnZW50OiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IGNsaWVudEFnZW50ID0gJ2RpcmVjdGxpbmVTdHJlYW1pbmcnXG5cbiAgICBpZiAoY3VzdG9tQWdlbnQpIHtcbiAgICAgIGNsaWVudEFnZW50ICs9IGA7ICR7Y3VzdG9tQWdlbnR9YFxuICAgIH1cblxuICAgIHJldHVybiBgJHtESVJFQ1RfTElORV9WRVJTSU9OfSAoJHtjbGllbnRBZ2VudH0pYDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaFRva2VuKGZpcnN0Q2FsbCA9IHRydWUsIHJldHJ5Q291bnQgPSAwKSB7XG4gICAgYXdhaXQgdGhpcy53YWl0VW50aWxPbmxpbmUoKTtcblxuICAgIGxldCBudW1iZXJPZkF0dGVtcHRzID0gMDtcbiAgICB3aGlsZShudW1iZXJPZkF0dGVtcHRzIDwgTUFYX1JFVFJZX0NPVU5UKSB7XG4gICAgICBudW1iZXJPZkF0dGVtcHRzKys7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgcmVmcmVzaFRva2VuSW50ZXJ2YWwpKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3RoaXMuZG9tYWlufS90b2tlbnMvcmVmcmVzaGAsIHttZXRob2Q6IFwiUE9TVFwiLCBoZWFkZXJzOiB0aGlzLmNvbW1vbkhlYWRlcnMoKX0pO1xuICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgbnVtYmVyT2ZBdHRlbXB0cyA9IDA7XG4gICAgICAgICAgY29uc3Qge3Rva2VufSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDMgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYXRhbCBlcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0b2tlbjogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBSZWZyZXNoIGF0dGVtcHQgIyR7bnVtYmVyT2ZBdHRlbXB0c30gZmFpbGVkOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZWZyZXNoIGF0dGVtcHQgIyR7bnVtYmVyT2ZBdHRlbXB0c30gdGhyZXcgYW4gZXhjZXB0aW9uOiAke2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcihcIlJldHJpZXMgZXhoYXVzdGVkXCIpO1xuICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwb3N0QWN0aXZpdHkoYWN0aXZpdHk6IEFjdGl2aXR5KSB7XG4gICAgaWYgKGFjdGl2aXR5LnR5cGUgPT09IFwibWVzc2FnZVwiICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzKGFjdGl2aXR5KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwJCA9IE9ic2VydmFibGUuY3JlYXRlKGFzeW5jIHN1YnNjcmliZXIgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoJ1BPU1QnLCAnL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucy8nICsgdGhpcy5jb252ZXJzYXRpb25JZCArICcvYWN0aXZpdGllcycpO1xuICAgICAgcmVxdWVzdC5zZXRCb2R5KEpTT04uc3RyaW5naWZ5KGFjdGl2aXR5KSk7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChyZXNwLnN0YXR1c0NvZGUgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdEFjdGl2aXR5IHJldHVybmVkIFwiICsgcmVzcC5zdGF0dXNDb2RlKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZTdHJlYW1zID0gcmVzcC5zdHJlYW1zLmxlbmd0aDtcbiAgICAgICAgaWYgKG51bWJlck9mU3RyZWFtcyAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgb25lIHN0cmVhbSBidXQgZ290IFwiICsgbnVtYmVyT2ZTdHJlYW1zKVxuICAgICAgICBjb25zdCBpZFN0cmluZyA9IGF3YWl0IHJlc3Auc3RyZWFtc1swXS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3Qge0lkIDogaWR9ID0gSlNPTi5wYXJzZShpZFN0cmluZyk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXR3b3JrIGlzc3VlIHRoZW4gaXRzIGhhbmRsZWQgYnlcbiAgICAgICAgICAvLyB0aGUgZGlzY29ubmVjdGlvbkhhbmRsZXIuIEV2ZXJ5dGhpbmcgZWxzZSBjYW5cbiAgICAgICAgICAvLyBiZSByZXRyaWVkXG4gICAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3AkO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBhdHRhY2htZW50cywgLi4ubWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyB9ID0gbWVzc2FnZTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZSggc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCBodHRwQ29udGVudExpc3QgPSBbXTtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoYXR0YWNobWVudHMubWFwKGFzeW5jIGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVkaWEgPSBhdHRhY2htZW50IGFzIE1lZGlhO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gobWVkaWEuY29udGVudFVybCk7XG4gICAgICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGFycmF5QnVmZmVyOiBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKSwgbWVkaWEgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgYXJyYXlCdWZmZXJzLmZvckVhY2goKHsgYXJyYXlCdWZmZXIsIG1lZGlhIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQkZTRS5TdWJzY3JpYmFibGVTdHJlYW0oKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZShidWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgaHR0cENvbnRlbnQgPSBuZXcgQkZTRS5IdHRwQ29udGVudCh7IHR5cGU6IG1lZGlhLmNvbnRlbnRUeXBlLCBjb250ZW50TGVuZ3RoOiBidWZmZXIubGVuZ3RoIH0sIHN0cmVhbSk7XG4gICAgICAgICAgICBodHRwQ29udGVudExpc3QucHVzaChodHRwQ29udGVudCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB1cmwgPSBgL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucy8ke3RoaXMuY29udmVyc2F0aW9uSWR9L3VzZXJzLyR7bWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cy5mcm9tLmlkfS91cGxvYWRgO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBCRlNFLlN0cmVhbWluZ1JlcXVlc3QuY3JlYXRlKCdQVVQnLCB1cmwpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2aXR5U3RyZWFtID0gbmV3IEJGU0UuU3Vic2NyaWJhYmxlU3RyZWFtKCk7XG4gICAgICAgICAgYWN0aXZpdHlTdHJlYW0ud3JpdGUoSlNPTi5zdHJpbmdpZnkobWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyksICd1dGYtOCcpO1xuICAgICAgICAgIHJlcXVlc3QuYWRkU3RyZWFtKG5ldyBCRlNFLkh0dHBDb250ZW50KHsgdHlwZTogXCJhcHBsaWNhdGlvbi92bmQubWljcm9zb2Z0LmFjdGl2aXR5XCIsIGNvbnRlbnRMZW5ndGg6IGFjdGl2aXR5U3RyZWFtLmxlbmd0aCB9LCBhY3Rpdml0eVN0cmVhbSkpO1xuICAgICAgICAgIGh0dHBDb250ZW50TGlzdC5mb3JFYWNoKGUgPT4gcmVxdWVzdC5hZGRTdHJlYW0oZSkpO1xuXG4gICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICAgIGlmIChyZXNwLnN0cmVhbXMgJiYgcmVzcC5zdHJlYW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoYEludmFsaWQgc3RyZWFtIGNvdW50ICR7cmVzcC5zdHJlYW1zLmxlbmd0aH1gKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHtJZDogaWR9ID0gYXdhaXQgcmVzcC5zdHJlYW1zWzBdLnJlYWRBc0pzb24oKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0VW50aWxPbmxpbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQuc3Vic2NyaWJlKChjcykgPT4ge1xuICAgICAgICBpZiAoY3MgPT09IENvbm5lY3Rpb25TdGF0dXMuT25saW5lKSByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgfSxcbiAgICAgICAgKGUpID0+IHJlamVjdChlKSk7XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdEFzeW5jKCkge1xuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnXmh0dHAocz8pJyk7XG4gICAgaWYgKCFyZS50ZXN0KHRoaXMuZG9tYWluKSkgdGhyb3cgKFwiRG9tYWluIG11c3QgYmVnaW4gd2l0aCBodHRwIG9yIGh0dHBzXCIpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHt0b2tlbjogdGhpcy50b2tlbn07XG4gICAgaWYgKHRoaXMuY29udmVyc2F0aW9uSWQpIHBhcmFtc1snY29udmVyc2F0aW9uSWQnXSA9IHRoaXMuY29udmVyc2F0aW9uSWQ7XG4gICAgY29uc3QgdXJsU2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgd3NVcmwgPSBgJHt0aGlzLmRvbWFpbi5yZXBsYWNlKHJlLCAnd3MkMScpfS9jb252ZXJzYXRpb25zL2Nvbm5lY3Q/JHt1cmxTZWFyY2hQYXJhbXN9YDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24gPSBuZXcgQkZTRS5XZWJTb2NrZXRDbGllbnQoe1xuICAgICAgICAgIHVybDogd3NVcmwsXG4gICAgICAgICAgcmVxdWVzdEhhbmRsZXI6IHRoaXMudGhlU3RyZWFtSGFuZGxlcixcbiAgICAgICAgICBkaXNjb25uZWN0aW9uSGFuZGxlcjogKGUpID0+IHJlc29sdmUoZSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uY29ubmVjdCgpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUE9TVCcsICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zJyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24gcmVzcG9uc2UgY29kZSBcIiArIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGggIT09IDEpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIDEgc3RyZWFtIGJ1dCBnb3QgXCIgKyByZXNwb25zZS5zdHJlYW1zLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyaW5nID0gYXdhaXQgcmVzcG9uc2Uuc3RyZWFtc1swXS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uID0gSlNPTi5wYXJzZShyZXNwb25zZVN0cmluZyk7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb24uY29udmVyc2F0aW9uSWQ7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLk9ubGluZSk7XG5cbiAgICAgICAgLy8gV2FpdCB1bnRpbCBETCBjb25zdW1lcnMgaGF2ZSBoYWQgYSBjaGFuY2UgdG8gYmUgbm90aWZpZWRcbiAgICAgICAgLy8gb2YgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIGNoYW5nZS5cbiAgICAgICAgYXdhaXQgdGhpcy53YWl0VW50aWxPbmxpbmUoKTtcbiAgICAgICAgdGhpcy50aGVTdHJlYW1IYW5kbGVyLmZsdXNoKCk7XG4gICAgICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gZmFsc2U7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB7XG4gICAgbGV0IG51bVJldHJpZXMgPSBNQVhfUkVUUllfQ09VTlQ7XG4gICAgd2hpbGUgKG51bVJldHJpZXMgPiAwKSB7XG4gICAgICBudW1SZXRyaWVzLS07XG4gICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jb25uZWN0QXN5bmMoKTtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCl7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdDb25uZWN0aW9uIGVuZCcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihgUmV0cnlpbmcgY29ubmVjdGlvbiAke3Jlc31gKTtcbiAgICAgICAgaWYgKDYwMDAwIDwgRGF0ZS5ub3coKSAtIHN0YXJ0KSB7XG4gICAgICAgICAgLy8gcmVzZXQgdGhlIHJldHJ5IGNvdW50ZXIgYW5kIHJldHJ5IGltbWVkaWF0ZWx5XG4gICAgICAgICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gbGFzdGVkIGZvciBtb3JlIHRoYW4gYSBtaW51dGVcbiAgICAgICAgICBudW1SZXRyaWVzID0gTUFYX1JFVFJZX0NPVU5UO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNvbm5lY3QgJHtlcnJ9YCk7XG4gICAgICAgIHRocm93KGVycik7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCB0aGlzLmdldFJldHJ5RGVsYXkoKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGRlbGF5IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICBwcml2YXRlIGdldFJldHJ5RGVsYXkoKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoMzAwMCArIE1hdGgucmFuZG9tKCkgKiAxMjAwMCk7XG4gIH1cbn1cbiJdfQ==
840
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lU3RyZWFtaW5nLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJNQVhfUkVUUllfQ09VTlQiLCJyZWZyZXNoVG9rZW5MaWZldGltZSIsInRpbWVvdXQiLCJyZWZyZXNoVG9rZW5JbnRlcnZhbCIsIlN0cmVhbUhhbmRsZXIiLCJzIiwiYyQiLCJzcSIsInN1YnNjcmliZXIiLCJjb25uZWN0aW9uU3RhdHVzJCIsInNob3VsZFF1ZXVlIiwicmVxdWVzdCIsImxvZ2dlciIsInN0cmVhbXMiLCJzdHJlYW0wIiwic2hpZnQiLCJyZWFkQXNTdHJpbmciLCJhY3Rpdml0eVNldEpzb24iLCJhY3Rpdml0eVNldCIsIkpTT04iLCJwYXJzZSIsImFjdGl2aXRpZXMiLCJsZW5ndGgiLCJlcnJvciIsIkVycm9yIiwiQkZTRSIsIlN0cmVhbWluZ1Jlc3BvbnNlIiwiY3JlYXRlIiwiYWN0aXZpdHkiLCJhdHRhY2htZW50cyIsInN0cmVhbSIsImF0dGFjaG1lbnQiLCJkYXRhVXJpIiwicHVzaCIsImNvbnRlbnRUeXBlIiwiY29udGVudFVybCIsImFjdGl2aXR5UXVldWUiLCJuZXh0Iiwic3Vic2NyaWJlIiwiY3MiLCJmb3JFYWNoIiwiYSIsIkRpcmVjdExpbmVTdHJlYW1pbmciLCJvcHRpb25zIiwiQmVoYXZpb3JTdWJqZWN0IiwiQ29ubmVjdGlvblN0YXR1cyIsIlVuaW5pdGlhbGl6ZWQiLCJ0b2tlbiIsInJlZnJlc2hUb2tlbiIsIkV4cGlyZWRUb2tlbiIsImRvbWFpbiIsImNvbnZlcnNhdGlvbklkIiwiX2JvdEFnZW50IiwiZ2V0Qm90QWdlbnQiLCJib3RBZ2VudCIsInF1ZXVlQWN0aXZpdGllcyIsImFjdGl2aXR5JCIsIk9ic2VydmFibGUiLCJhY3Rpdml0eVN1YnNjcmliZXIiLCJ0aGVTdHJlYW1IYW5kbGVyIiwiY29ubmVjdFdpdGhSZXRyeUFzeW5jIiwiRmFpbGVkVG9Db25uZWN0Iiwic2hhcmUiLCJjb25uZWN0QXN5bmMiLCJFbmRlZCIsInN0cmVhbUNvbm5lY3Rpb24iLCJkaXNjb25uZWN0IiwiY3VzdG9tQWdlbnQiLCJjbGllbnRBZ2VudCIsImZpcnN0Q2FsbCIsInJldHJ5Q291bnQiLCJ3YWl0VW50aWxPbmxpbmUiLCJudW1iZXJPZkF0dGVtcHRzIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0IiwibWV0aG9kIiwiaGVhZGVycyIsImNvbW1vbkhlYWRlcnMiLCJyZXMiLCJvayIsImpzb24iLCJzdGF0dXMiLCJjb25zb2xlIiwic3RhdHVzVGV4dCIsIndhcm4iLCJ0eXBlIiwicG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMiLCJyZXNwJCIsIlN0cmVhbWluZ1JlcXVlc3QiLCJzZXRCb2R5Iiwic3RyaW5naWZ5Iiwic2VuZCIsInJlc3AiLCJzdGF0dXNDb2RlIiwibnVtYmVyT2ZTdHJlYW1zIiwiaWRTdHJpbmciLCJpZCIsIklkIiwibWVzc2FnZSIsIm1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMiLCJodHRwQ29udGVudExpc3QiLCJhbGwiLCJtYXAiLCJtZWRpYSIsImFycmF5QnVmZmVyIiwiYXJyYXlCdWZmZXJzIiwiYnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsImxvZyIsIlN1YnNjcmliYWJsZVN0cmVhbSIsIndyaXRlIiwiaHR0cENvbnRlbnQiLCJIdHRwQ29udGVudCIsImNvbnRlbnRMZW5ndGgiLCJ1cmwiLCJhY3Rpdml0eVN0cmVhbSIsImFkZFN0cmVhbSIsImUiLCJyZWFkQXNKc29uIiwicmVzb2x2ZSIsInJlamVjdCIsIk9ubGluZSIsInJlIiwiUmVnRXhwIiwidGVzdCIsInBhcmFtcyIsInVybFNlYXJjaFBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInRvU3RyaW5nIiwid3NVcmwiLCJyZXBsYWNlIiwiV2ViU29ja2V0Q2xpZW50IiwicmVxdWVzdEhhbmRsZXIiLCJkaXNjb25uZWN0aW9uSGFuZGxlciIsImNvbm5lY3QiLCJyZXNwb25zZSIsInJlc3BvbnNlU3RyaW5nIiwiY29udmVyc2F0aW9uIiwiZmx1c2giLCJudW1SZXRyaWVzIiwic3RhcnQiLCJEYXRlIiwibm93IiwiQ29ubmVjdGluZyIsImdldFZhbHVlIiwiZ2V0UmV0cnlEZWxheSIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUVBOzs7Ozs7OztBQVNBLElBQU1BLG1CQUFtQixHQUFHLGdCQUE1QjtBQUNBLElBQU1DLGVBQWUsR0FBRyxDQUF4QjtBQUNBLElBQU1DLG9CQUFvQixHQUFHLEtBQUssRUFBTCxHQUFVLElBQXZDLEMsQ0FDQTs7QUFDQSxJQUFNQyxPQUFPLEdBQUcsS0FBSyxJQUFyQjtBQUNBLElBQU1DLG9CQUFvQixHQUFHRixvQkFBb0IsR0FBRyxDQUFwRDs7SUFVTUcsYTtBQU1KLHlCQUFZQyxDQUFaLEVBQXFDQyxFQUFyQyxFQUF1RUMsRUFBdkUsRUFBMEY7QUFBQTtBQUFBLDREQUZqRCxFQUVpRDtBQUN4RixTQUFLQyxVQUFMLEdBQWtCSCxDQUFsQjtBQUNBLFNBQUtJLGlCQUFMLEdBQXlCSCxFQUF6QjtBQUNBLFNBQUtJLFdBQUwsR0FBbUJILEVBQW5CO0FBQ0Q7Ozs7V0FFRCx1QkFBcUJGLENBQXJCLEVBQThDO0FBQzVDLFdBQUtHLFVBQUwsR0FBa0JILENBQWxCO0FBQ0Q7Ozs7MEdBRUQsaUJBQXFCTSxPQUFyQixFQUFvREMsTUFBcEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1FDLGdCQUFBQSxPQURSLHVDQUNzQkYsT0FBTyxDQUFDRSxPQUQ5QjtBQUVRQyxnQkFBQUEsT0FGUixHQUVrQkQsT0FBTyxDQUFDRSxLQUFSLEVBRmxCO0FBQUE7QUFBQSx1QkFHZ0NELE9BQU8sQ0FBQ0UsWUFBUixFQUhoQzs7QUFBQTtBQUdRQyxnQkFBQUEsZUFIUjtBQUlRQyxnQkFBQUEsV0FKUixHQUlzQkMsSUFBSSxDQUFDQyxLQUFMLENBQVdILGVBQVgsQ0FKdEI7O0FBQUEsc0JBTU1DLFdBQVcsQ0FBQ0cs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QUMsQ0FBQztBQUFBLHlCQUFJQyxVQUFVLENBQUNELENBQUQsRUFBSSxNQUFJLENBQUN5RSxhQUFMLEVBQUosQ0FBZDtBQUFBLGlCQUFiLENBeEJWOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7O1FBNEJBOzs7O1dBQ0EseUJBQXdCO0FBQ3RCLGFBQU9DLElBQUksQ0FBQ0MsS0FBTCxDQUFXLE9BQU9ELElBQUksQ0FBQ0UsTUFBTCxLQUFnQixLQUFsQyxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbiBvcmRlciB0byBrZWVwIGZpbGUgc2l6ZSBkb3duLCBvbmx5IGltcG9ydCB0aGUgcGFydHMgb2YgcnhqcyB0aGF0IHdlIHVzZVxuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcy9TdWJzY3JpYmVyJztcbmltcG9ydCAqIGFzIEJGU0UgZnJvbSAnYm90ZnJhbWV3b3JrLXN0cmVhbWluZyc7XG5pbXBvcnQgZmV0Y2ggZnJvbSAnY3Jvc3MtZmV0Y2gnO1xuXG5pbXBvcnQge1xuICBBY3Rpdml0eSxcbiAgQ29ubmVjdGlvblN0YXR1cyxcbiAgQ29udmVyc2F0aW9uLFxuICBJQm90Q29ubmVjdGlvbixcbiAgTWVkaWEsXG4gIE1lc3NhZ2Vcbn0gZnJvbSAnLi9kaXJlY3RMaW5lJztcblxuY29uc3QgRElSRUNUX0xJTkVfVkVSU0lPTiA9ICdEaXJlY3RMaW5lLzMuMCc7XG5jb25zdCBNQVhfUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSAzMCAqIDYwICogMTAwMDtcbi8vY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSA1MDAwO1xuY29uc3QgdGltZW91dCA9IDIwICogMTAwMDtcbmNvbnN0IHJlZnJlc2hUb2tlbkludGVydmFsID0gcmVmcmVzaFRva2VuTGlmZXRpbWUgLyAyO1xuXG5pbnRlcmZhY2UgRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMge1xuICB0b2tlbjogc3RyaW5nLFxuICBjb252ZXJzYXRpb25JZD86IHN0cmluZyxcbiAgZG9tYWluOiBzdHJpbmcsXG4gIC8vIEF0dGFjaGVkIHRvIGFsbCByZXF1ZXN0cyB0byBpZGVudGlmeSByZXF1ZXN0aW5nIGFnZW50LlxuICBib3RBZ2VudD86IHN0cmluZ1xufVxuXG5jbGFzcyBTdHJlYW1IYW5kbGVyIGltcGxlbWVudHMgQkZTRS5SZXF1ZXN0SGFuZGxlciB7XG4gIHByaXZhdGUgY29ubmVjdGlvblN0YXR1cyQ7XG4gIHByaXZhdGUgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT47XG4gIHByaXZhdGUgc2hvdWxkUXVldWU6ICgpID0+IGJvb2xlYW47XG4gIHByaXZhdGUgYWN0aXZpdHlRdWV1ZTogQXJyYXk8QWN0aXZpdHk+ID0gW107XG5cbiAgY29uc3RydWN0b3IoczogU3Vic2NyaWJlcjxBY3Rpdml0eT4sIGMkOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25TdGF0dXM+LCBzcTogKCkgPT4gYm9vbGVhbikge1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IHM7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCA9IGMkO1xuICAgIHRoaXMuc2hvdWxkUXVldWUgPSBzcTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdWJzY3JpYmVyKHM6IFN1YnNjcmliZXI8QWN0aXZpdHk+KSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gcztcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IEJGU0UuSVJlY2VpdmVSZXF1ZXN0LCBsb2dnZXI/OiBhbnkpOiBQcm9taXNlPEJGU0UuU3RyZWFtaW5nUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzdHJlYW1zID0gWy4uLnJlcXVlc3Quc3RyZWFtc107XG4gICAgY29uc3Qgc3RyZWFtMCA9IHN0cmVhbXMuc2hpZnQoKTtcbiAgICBjb25zdCBhY3Rpdml0eVNldEpzb24gPSBhd2FpdCBzdHJlYW0wLnJlYWRBc1N0cmluZygpO1xuICAgIGNvbnN0IGFjdGl2aXR5U2V0ID0gSlNPTi5wYXJzZShhY3Rpdml0eVNldEpzb24pO1xuXG4gICAgaWYgKGFjdGl2aXR5U2V0LmFjdGl2aXRpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAvLyBPbmx5IG9uZSBhY3Rpdml0eSBpcyBleHBlY3RlZCBpbiBhIHNldCBpbiBzdHJlYW1pbmdcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ3RoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBhY3Rpdml0eScpKTtcbiAgICAgIHJldHVybiBCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlLmNyZWF0ZSg1MDApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2aXR5ID0gYWN0aXZpdHlTZXQuYWN0aXZpdGllc1swXTtcblxuICAgIGlmIChzdHJlYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gWy4uLmFjdGl2aXR5LmF0dGFjaG1lbnRzXTtcblxuICAgICAgbGV0IHN0cmVhbTogQkZTRS5Db250ZW50U3RyZWFtO1xuICAgICAgd2hpbGUgKHN0cmVhbSA9IHN0cmVhbXMuc2hpZnQoKSkge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgc3RyZWFtLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhVXJpID0gXCJkYXRhOnRleHQvcGxhaW47YmFzZTY0LFwiICsgYXR0YWNobWVudDtcbiAgICAgICAgYXR0YWNobWVudHMucHVzaCh7IGNvbnRlbnRUeXBlOiBzdHJlYW0uY29udGVudFR5cGUsIGNvbnRlbnRVcmw6IGRhdGFVcmkgfSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2aXR5LmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUXVldWUoKSkge1xuICAgICAgdGhpcy5hY3Rpdml0eVF1ZXVlLnB1c2goYWN0aXZpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXIubmV4dChhY3Rpdml0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJGU0UuU3RyZWFtaW5nUmVzcG9uc2UuY3JlYXRlKDIwMCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoY3MgPT4geyB9KVxuICAgIHRoaXMuYWN0aXZpdHlRdWV1ZS5mb3JFYWNoKChhKSA9PiB0aGlzLnN1YnNjcmliZXIubmV4dChhKSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlID0gW107XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpcmVjdExpbmVTdHJlYW1pbmcgaW1wbGVtZW50cyBJQm90Q29ubmVjdGlvbiB7XG4gIHB1YmxpYyBjb25uZWN0aW9uU3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoQ29ubmVjdGlvblN0YXR1cy5VbmluaXRpYWxpemVkKTtcbiAgcHVibGljIGFjdGl2aXR5JDogT2JzZXJ2YWJsZTxBY3Rpdml0eT47XG5cbiAgcHJpdmF0ZSBhY3Rpdml0eVN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+O1xuICBwcml2YXRlIHRoZVN0cmVhbUhhbmRsZXI6IFN0cmVhbUhhbmRsZXI7XG5cbiAgcHJpdmF0ZSBkb21haW46IHN0cmluZztcblxuICBwcml2YXRlIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSBzdHJlYW1Db25uZWN0aW9uOiBCRlNFLldlYlNvY2tldENsaWVudDtcbiAgcHJpdmF0ZSBxdWV1ZUFjdGl2aXRpZXM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYm90QWdlbnQgPSAnJztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lU3RyZWFtaW5nT3B0aW9ucykge1xuICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuXG4gICAgdGhpcy5yZWZyZXNoVG9rZW4oKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FeHBpcmVkVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kb21haW4gPSBvcHRpb25zLmRvbWFpbjtcblxuICAgIGlmIChvcHRpb25zLmNvbnZlcnNhdGlvbklkKSB7XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gb3B0aW9ucy5jb252ZXJzYXRpb25JZDtcbiAgICB9XG5cbiAgICB0aGlzLl9ib3RBZ2VudCA9IHRoaXMuZ2V0Qm90QWdlbnQob3B0aW9ucy5ib3RBZ2VudCk7XG5cbiAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IHRydWU7XG4gICAgdGhpcy5hY3Rpdml0eSQgPSBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyAoc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT4pID0+IHtcbiAgICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlciA9IG5ldyBTdHJlYW1IYW5kbGVyKHN1YnNjcmliZXIsIHRoaXMuY29ubmVjdGlvblN0YXR1cyQsICgpID0+IHRoaXMucXVldWVBY3Rpdml0aWVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0V2l0aFJldHJ5QXN5bmMoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdCk7XG4gICAgICB9XG4gICAgfSkuc2hhcmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWNvbm5lY3QoeyBjb252ZXJzYXRpb25JZCwgdG9rZW4gfSA6IENvbnZlcnNhdGlvbikge1xuICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb25JZDtcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG5cbiAgICBhd2FpdCB0aGlzLmNvbm5lY3RBc3luYygpO1xuICB9XG5cbiAgZW5kKCkge1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkVuZGVkKTtcbiAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21tb25IZWFkZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBcIkF1dGhvcml6YXRpb25cIjogYEJlYXJlciAke3RoaXMudG9rZW59YCxcbiAgICAgIFwieC1tcy1ib3QtYWdlbnRcIjogdGhpcy5fYm90QWdlbnRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCb3RBZ2VudChjdXN0b21BZ2VudDogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBjbGllbnRBZ2VudCA9ICdkaXJlY3RsaW5lU3RyZWFtaW5nJ1xuXG4gICAgaWYgKGN1c3RvbUFnZW50KSB7XG4gICAgICBjbGllbnRBZ2VudCArPSBgOyAke2N1c3RvbUFnZW50fWBcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7RElSRUNUX0xJTkVfVkVSU0lPTn0gKCR7Y2xpZW50QWdlbnR9KWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUb2tlbihmaXJzdENhbGwgPSB0cnVlLCByZXRyeUNvdW50ID0gMCkge1xuICAgIGF3YWl0IHRoaXMud2FpdFVudGlsT25saW5lKCk7XG5cbiAgICBsZXQgbnVtYmVyT2ZBdHRlbXB0cyA9IDA7XG4gICAgd2hpbGUobnVtYmVyT2ZBdHRlbXB0cyA8IE1BWF9SRVRSWV9DT1VOVCkge1xuICAgICAgbnVtYmVyT2ZBdHRlbXB0cysrO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIHJlZnJlc2hUb2tlbkludGVydmFsKSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmRvbWFpbn0vdG9rZW5zL3JlZnJlc2hgLCB7bWV0aG9kOiBcIlBPU1RcIiwgaGVhZGVyczogdGhpcy5jb21tb25IZWFkZXJzKCl9KTtcbiAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgIG51bWJlck9mQXR0ZW1wdHMgPSAwO1xuICAgICAgICAgIGNvbnN0IHt0b2tlbn0gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAzIHx8IHJlcy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmF0YWwgZXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdG9rZW46ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgUmVmcmVzaCBhdHRlbXB0ICMke251bWJlck9mQXR0ZW1wdHN9IGZhaWxlZDogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgUmVmcmVzaCBhdHRlbXB0ICMke251bWJlck9mQXR0ZW1wdHN9IHRocmV3IGFuIGV4Y2VwdGlvbjogJHtlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoXCJSZXRyaWVzIGV4aGF1c3RlZFwiKTtcbiAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcG9zdEFjdGl2aXR5KGFjdGl2aXR5OiBBY3Rpdml0eSkge1xuICAgIGlmIChhY3Rpdml0eS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBhY3Rpdml0eS5hdHRhY2htZW50cyAmJiBhY3Rpdml0eS5hdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhhY3Rpdml0eSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcCQgPSBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyBzdWJzY3JpYmVyID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBCRlNFLlN0cmVhbWluZ1JlcXVlc3QuY3JlYXRlKCdQT1NUJywgJy92My9kaXJlY3RsaW5lL2NvbnZlcnNhdGlvbnMvJyArIHRoaXMuY29udmVyc2F0aW9uSWQgKyAnL2FjdGl2aXRpZXMnKTtcbiAgICAgIHJlcXVlc3Quc2V0Qm9keShKU09OLnN0cmluZ2lmeShhY3Rpdml0eSkpO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVzcC5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihcIlBvc3RBY3Rpdml0eSByZXR1cm5lZCBcIiArIHJlc3Auc3RhdHVzQ29kZSk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mU3RyZWFtcyA9IHJlc3Auc3RyZWFtcy5sZW5ndGg7XG4gICAgICAgIGlmIChudW1iZXJPZlN0cmVhbXMgIT09IDEpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG9uZSBzdHJlYW0gYnV0IGdvdCBcIiArIG51bWJlck9mU3RyZWFtcylcbiAgICAgICAgY29uc3QgaWRTdHJpbmcgPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHtJZCA6IGlkfSA9IEpTT04ucGFyc2UoaWRTdHJpbmcpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KGlkKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbmV0d29yayBpc3N1ZSB0aGVuIGl0cyBoYW5kbGVkIGJ5XG4gICAgICAgICAgLy8gdGhlIGRpc2Nvbm5lY3Rpb25IYW5kbGVyLiBFdmVyeXRoaW5nIGVsc2UgY2FuXG4gICAgICAgICAgLy8gYmUgcmV0cmllZFxuICAgICAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXNwJDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMobWVzc2FnZTogTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgYXR0YWNobWVudHMsIC4uLm1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMgfSA9IG1lc3NhZ2U7XG5cbiAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUoIHN1YnNjcmliZXIgPT4ge1xuICAgICAgY29uc3QgaHR0cENvbnRlbnRMaXN0ID0gW107XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVycyA9IGF3YWl0IFByb21pc2UuYWxsKGF0dGFjaG1lbnRzLm1hcChhc3luYyBhdHRhY2htZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhID0gYXR0YWNobWVudCBhcyBNZWRpYTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKG1lZGlhLmNvbnRlbnRVcmwpO1xuICAgICAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgICAgICByZXR1cm4geyBhcnJheUJ1ZmZlcjogYXdhaXQgcmVzLmFycmF5QnVmZmVyKCksIG1lZGlhIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIGFycmF5QnVmZmVycy5mb3JFYWNoKCh7IGFycmF5QnVmZmVyLCBtZWRpYSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhidWZmZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJGU0UuU3Vic2NyaWJhYmxlU3RyZWFtKCk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGUoYnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGh0dHBDb250ZW50ID0gbmV3IEJGU0UuSHR0cENvbnRlbnQoeyB0eXBlOiBtZWRpYS5jb250ZW50VHlwZSwgY29udGVudExlbmd0aDogYnVmZmVyLmxlbmd0aCB9LCBzdHJlYW0pO1xuICAgICAgICAgICAgaHR0cENvbnRlbnRMaXN0LnB1c2goaHR0cENvbnRlbnQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdXJsID0gYC92My9kaXJlY3RsaW5lL2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbklkfS91c2Vycy8ke21lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMuZnJvbS5pZH0vdXBsb2FkYDtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUFVUJywgdXJsKTtcbiAgICAgICAgICBjb25zdCBhY3Rpdml0eVN0cmVhbSA9IG5ldyBCRlNFLlN1YnNjcmliYWJsZVN0cmVhbSgpO1xuICAgICAgICAgIGFjdGl2aXR5U3RyZWFtLndyaXRlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMpLCAndXRmLTgnKTtcbiAgICAgICAgICByZXF1ZXN0LmFkZFN0cmVhbShuZXcgQkZTRS5IdHRwQ29udGVudCh7IHR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5hY3Rpdml0eVwiLCBjb250ZW50TGVuZ3RoOiBhY3Rpdml0eVN0cmVhbS5sZW5ndGggfSwgYWN0aXZpdHlTdHJlYW0pKTtcbiAgICAgICAgICBodHRwQ29udGVudExpc3QuZm9yRWFjaChlID0+IHJlcXVlc3QuYWRkU3RyZWFtKGUpKTtcblxuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uc2VuZChyZXF1ZXN0KTtcbiAgICAgICAgICBpZiAocmVzcC5zdHJlYW1zICYmIHJlc3Auc3RyZWFtcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKGBJbnZhbGlkIHN0cmVhbSBjb3VudCAke3Jlc3Auc3RyZWFtcy5sZW5ndGh9YCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7SWQ6IGlkfSA9IGF3YWl0IHJlc3Auc3RyZWFtc1swXS5yZWFkQXNKc29uKCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdFVudGlsT25saW5lKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZSgoY3MpID0+IHtcbiAgICAgICAgaWYgKGNzID09PSBDb25uZWN0aW9uU3RhdHVzLk9ubGluZSkgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH0sXG4gICAgICAgIChlKSA9PiByZWplY3QoZSkpO1xuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RBc3luYygpIHtcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJ15odHRwKHM/KScpO1xuICAgIGlmICghcmUudGVzdCh0aGlzLmRvbWFpbikpIHRocm93IChcIkRvbWFpbiBtdXN0IGJlZ2luIHdpdGggaHR0cCBvciBodHRwc1wiKTtcbiAgICBjb25zdCBwYXJhbXMgPSB7dG9rZW46IHRoaXMudG9rZW59O1xuICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbklkKSBwYXJhbXNbJ2NvbnZlcnNhdGlvbklkJ10gPSB0aGlzLmNvbnZlcnNhdGlvbklkO1xuICAgIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHdzVXJsID0gYCR7dGhpcy5kb21haW4ucmVwbGFjZShyZSwgJ3dzJDEnKX0vY29udmVyc2F0aW9ucy9jb25uZWN0PyR7dXJsU2VhcmNoUGFyYW1zfWA7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uID0gbmV3IEJGU0UuV2ViU29ja2V0Q2xpZW50KHtcbiAgICAgICAgICB1cmw6IHdzVXJsLFxuICAgICAgICAgIHJlcXVlc3RIYW5kbGVyOiB0aGlzLnRoZVN0cmVhbUhhbmRsZXIsXG4gICAgICAgICAgZGlzY29ubmVjdGlvbkhhbmRsZXI6IChlKSA9PiByZXNvbHZlKGUpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmNvbm5lY3QoKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoJ1BPU1QnLCAnL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucycpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uIHJlc3BvbnNlIGNvZGUgXCIgKyByZXNwb25zZS5zdGF0dXNDb2RlKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0cmVhbXMubGVuZ3RoICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCAxIHN0cmVhbSBidXQgZ290IFwiICsgcmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCByZXNwb25zZVN0cmluZyA9IGF3YWl0IHJlc3BvbnNlLnN0cmVhbXNbMF0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IEpTT04ucGFyc2UocmVzcG9uc2VTdHJpbmcpO1xuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uLmNvbnZlcnNhdGlvbklkO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5PbmxpbmUpO1xuXG4gICAgICAgIC8vIFdhaXQgdW50aWwgREwgY29uc3VtZXJzIGhhdmUgaGFkIGEgY2hhbmNlIHRvIGJlIG5vdGlmaWVkXG4gICAgICAgIC8vIG9mIHRoZSBjb25uZWN0aW9uIHN0YXR1cyBjaGFuZ2UuXG4gICAgICAgIGF3YWl0IHRoaXMud2FpdFVudGlsT25saW5lKCk7XG4gICAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlci5mbHVzaCgpO1xuICAgICAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IGZhbHNlO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFdpdGhSZXRyeUFzeW5jKCkge1xuICAgIGxldCBudW1SZXRyaWVzID0gTUFYX1JFVFJZX0NPVU5UO1xuICAgIHdoaWxlIChudW1SZXRyaWVzID4gMCkge1xuICAgICAgbnVtUmV0cmllcy0tO1xuICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY29ubmVjdEFzeW5jKCk7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgPT09IENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpe1xuICAgICAgICAgIGNvbnNvbGUud2FybignQ29ubmVjdGlvbiBlbmQnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oYFJldHJ5aW5nIGNvbm5lY3Rpb24gJHtyZXN9YCk7XG4gICAgICAgIGlmICg2MDAwMCA8IERhdGUubm93KCkgLSBzdGFydCkge1xuICAgICAgICAgIC8vIHJlc2V0IHRoZSByZXRyeSBjb3VudGVyIGFuZCByZXRyeSBpbW1lZGlhdGVseVxuICAgICAgICAgIC8vIGlmIHRoZSBjb25uZWN0aW9uIGxhc3RlZCBmb3IgbW9yZSB0aGFuIGEgbWludXRlXG4gICAgICAgICAgbnVtUmV0cmllcyA9IE1BWF9SRVRSWV9DT1VOVDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjb25uZWN0ICR7ZXJyfWApO1xuICAgICAgICB0aHJvdyhlcnIpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgdGhpcy5nZXRSZXRyeURlbGF5KCkpKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBkZWxheSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAgcHJpdmF0ZSBnZXRSZXRyeURlbGF5KCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKDMwMDAgKyBNYXRoLnJhbmRvbSgpICogMTIwMDApO1xuICB9XG59XG4iXX0=