botframework-directlinejs 0.15.6-master.bb3d7ee → 0.15.6

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.
@@ -1,33 +1,25 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.mockServices = exports.mockWebSocket = exports.mockAjax = exports.injectNewToken = exports.injectClose = exports.mockServer = exports.mockActivity = void 0;
9
-
10
8
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
9
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
-
16
11
  var _rxjs = require("rxjs");
17
-
18
12
  var _url = require("url");
19
-
20
13
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
21
-
22
14
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
23
-
24
15
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
25
-
26
16
  // MOCK helpers
17
+
27
18
  var notImplemented = function notImplemented() {
28
19
  throw new Error('not implemented');
29
- }; // MOCK Activity
20
+ };
30
21
 
22
+ // MOCK Activity
31
23
 
32
24
  var mockActivity = function mockActivity(text) {
33
25
  return {
@@ -37,12 +29,11 @@ var mockActivity = function mockActivity(text) {
37
29
  },
38
30
  text: text
39
31
  };
40
- }; // MOCK DirectLine Server (shared state used by Observable.ajax and WebSocket mocks)
41
-
32
+ };
42
33
 
34
+ // MOCK DirectLine Server (shared state used by Observable.ajax and WebSocket mocks)
43
35
  exports.mockActivity = mockActivity;
44
36
  var tokenPrefix = 'token';
45
-
46
37
  var mockServer = function mockServer(scheduler) {
47
38
  return {
48
39
  scheduler: scheduler,
@@ -54,66 +45,52 @@ var mockServer = function mockServer(scheduler) {
54
45
  }
55
46
  };
56
47
  };
57
-
58
48
  exports.mockServer = mockServer;
59
-
60
49
  var tokenResponse = function tokenResponse(server, request) {
61
50
  var headers = request.headers;
62
51
  var authorization = headers['Authorization'];
63
-
64
52
  if (authorization === "Bearer ".concat(server.conversation.token)) {
65
53
  return null;
66
54
  }
67
-
68
55
  var response = {
69
56
  status: 403
70
57
  };
71
58
  return response;
72
59
  };
73
-
74
60
  var injectClose = function injectClose(server) {
75
61
  return server.conversation.sockets.forEach(function (s) {
76
62
  return s.onclose(new CloseEvent('close'));
77
63
  });
78
64
  };
79
-
80
65
  exports.injectClose = injectClose;
81
-
82
66
  var injectNewToken = function injectNewToken(server) {
83
67
  var conversation = server.conversation;
84
68
  var suffix = Number.parseInt(conversation.token.substring(tokenPrefix.length), 10) + 1;
85
69
  conversation.token = tokenPrefix + suffix;
86
70
  };
87
-
88
71
  exports.injectNewToken = injectNewToken;
89
72
  var keyWatermark = 'watermark';
90
-
91
73
  // MOCK Observable.ajax (uses shared state in Server)
74
+
92
75
  var mockAjax = function mockAjax(server, customAjax) {
93
76
  var uriBase = new _url.URL('https://directline.botframework.com/v3/directline/');
94
-
95
77
  var createStreamUrl = function createStreamUrl(watermark) {
96
78
  var uri = new _url.URL('conversations/stream', uriBase);
97
-
98
79
  if (watermark > 0) {
99
80
  var params = new _url.URLSearchParams();
100
81
  params.append(keyWatermark, watermark.toString(10));
101
82
  uri.search = params.toString();
102
83
  }
103
-
104
84
  return uri.toString();
105
85
  };
106
-
107
86
  var jax = customAjax || function (urlOrRequest) {
108
87
  if (typeof urlOrRequest === 'string') {
109
88
  throw new Error();
110
89
  }
111
-
112
90
  var uri = new _url.URL(urlOrRequest.url);
113
91
  var pathname = uri.pathname,
114
- searchParams = uri.searchParams;
92
+ searchParams = uri.searchParams;
115
93
  var parts = pathname.split('/');
116
-
117
94
  if (parts[3] === 'tokens' && parts[4] === 'refresh') {
118
95
  var response = {
119
96
  response: {
@@ -122,11 +99,9 @@ var mockAjax = function mockAjax(server, customAjax) {
122
99
  };
123
100
  return response;
124
101
  }
125
-
126
102
  if (parts[3] !== 'conversations') {
127
103
  throw new Error();
128
104
  }
129
-
130
105
  if (parts.length === 4) {
131
106
  var conversation = {
132
107
  conversationId: server.conversation.conversationId,
@@ -138,38 +113,29 @@ var mockAjax = function mockAjax(server, customAjax) {
138
113
  };
139
114
  return _response;
140
115
  }
141
-
142
116
  if (parts[4] !== server.conversation.conversationId) {
143
117
  throw new Error();
144
118
  }
145
-
146
119
  if (parts[5] === 'activities') {
147
120
  var responseToken = tokenResponse(server, urlOrRequest);
148
-
149
121
  if (responseToken !== null) {
150
122
  return responseToken;
151
123
  }
152
-
153
124
  var activity = urlOrRequest.body;
154
-
155
- var _after = server.conversation.history.push(activity);
156
-
157
- var _start = _after - 1;
158
-
125
+ var after = server.conversation.history.push(activity);
126
+ var start = after - 1;
159
127
  var _iterator = _createForOfIteratorHelper(server.conversation.sockets),
160
- _step;
161
-
128
+ _step;
162
129
  try {
163
130
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
164
131
  var socket = _step.value;
165
- socket.play(_start, _after);
132
+ socket.play(start, after);
166
133
  }
167
134
  } catch (err) {
168
135
  _iterator.e(err);
169
136
  } finally {
170
137
  _iterator.f();
171
138
  }
172
-
173
139
  var _response2 = {
174
140
  response: {
175
141
  id: 'messageId'
@@ -178,29 +144,23 @@ var mockAjax = function mockAjax(server, customAjax) {
178
144
  return _response2;
179
145
  } else if (parts.length === 5) {
180
146
  var _responseToken = tokenResponse(server, urlOrRequest);
181
-
182
147
  if (_responseToken !== null) {
183
148
  return _responseToken;
184
149
  }
185
-
186
150
  var watermark = searchParams.get('watermark');
187
-
188
- var _start2 = Number.parseInt(watermark, 10);
189
-
151
+ var _start = Number.parseInt(watermark, 10);
190
152
  var _conversation = {
191
153
  conversationId: server.conversation.conversationId,
192
154
  token: server.conversation.token,
193
- streamUrl: createStreamUrl(_start2)
155
+ streamUrl: createStreamUrl(_start)
194
156
  };
195
157
  var _response3 = {
196
158
  response: _conversation
197
159
  };
198
160
  return _response3;
199
161
  }
200
-
201
162
  throw new Error();
202
163
  };
203
-
204
164
  var method = function method(urlOrRequest) {
205
165
  return new _rxjs.Observable(function (subscriber) {
206
166
  try {
@@ -211,7 +171,6 @@ var mockAjax = function mockAjax(server, customAjax) {
211
171
  }
212
172
  });
213
173
  };
214
-
215
174
  var properties = {
216
175
  get: function get(url, headers) {
217
176
  return notImplemented();
@@ -233,18 +192,15 @@ var mockAjax = function mockAjax(server, customAjax) {
233
192
  }
234
193
  };
235
194
  return Object.assign(method, properties);
236
- }; // MOCK WebSocket (uses shared state in Server)
237
-
195
+ };
238
196
 
197
+ // MOCK WebSocket (uses shared state in Server)
239
198
  exports.mockAjax = mockAjax;
240
-
241
199
  var mockWebSocket = function mockWebSocket(server) {
242
- var _class, _temp;
243
-
244
- return _temp = _class = /*#__PURE__*/function () {
200
+ var _class;
201
+ return _class = /*#__PURE__*/function () {
245
202
  function MockWebSocket(url, protocols) {
246
203
  var _this = this;
247
-
248
204
  (0, _classCallCheck2["default"])(this, MockWebSocket);
249
205
  (0, _defineProperty2["default"])(this, "binaryType", 'arraybuffer');
250
206
  (0, _defineProperty2["default"])(this, "bufferedAmount", 0);
@@ -259,21 +215,16 @@ var mockWebSocket = function mockWebSocket(server) {
259
215
  server.scheduler.schedule(function () {
260
216
  _this.readyState = WebSocket.CONNECTING;
261
217
  server.conversation.sockets.add(_this);
262
-
263
218
  _this.onopen(new Event('open'));
264
-
265
219
  _this.readyState = WebSocket.OPEN;
266
220
  var uri = new _url.URL(url);
267
221
  var watermark = uri.searchParams.get(keyWatermark);
268
-
269
222
  if (watermark !== null) {
270
- var _start3 = Number.parseInt(watermark, 10);
271
-
272
- _this.play(_start3, server.conversation.history.length);
223
+ var start = Number.parseInt(watermark, 10);
224
+ _this.play(start, server.conversation.history.length);
273
225
  }
274
226
  });
275
227
  }
276
-
277
228
  (0, _createClass2["default"])(MockWebSocket, [{
278
229
  key: "play",
279
230
  value: function play(start, after) {
@@ -317,12 +268,11 @@ var mockWebSocket = function mockWebSocket(server) {
317
268
  }
318
269
  }]);
319
270
  return MockWebSocket;
320
- }(), (0, _defineProperty2["default"])(_class, "CLOSED", WebSocket.CLOSED), (0, _defineProperty2["default"])(_class, "CLOSING", WebSocket.CLOSING), (0, _defineProperty2["default"])(_class, "CONNECTING", WebSocket.CONNECTING), (0, _defineProperty2["default"])(_class, "OPEN", WebSocket.OPEN), _temp;
321
- }; // MOCK services (top-level aggregation of all mocks)
322
-
271
+ }(), (0, _defineProperty2["default"])(_class, "CLOSED", WebSocket.CLOSED), (0, _defineProperty2["default"])(_class, "CLOSING", WebSocket.CLOSING), (0, _defineProperty2["default"])(_class, "CONNECTING", WebSocket.CONNECTING), (0, _defineProperty2["default"])(_class, "OPEN", WebSocket.OPEN), _class;
272
+ };
323
273
 
274
+ // MOCK services (top-level aggregation of all mocks)
324
275
  exports.mockWebSocket = mockWebSocket;
325
-
326
276
  var mockServices = function mockServices(server, scheduler) {
327
277
  return {
328
278
  scheduler: scheduler,
@@ -333,6 +283,5 @@ var mockServices = function mockServices(server, scheduler) {
333
283
  }
334
284
  };
335
285
  };
336
-
337
286
  exports.mockServices = mockServices;
338
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lLm1vY2sudHMiXSwibmFtZXMiOlsibm90SW1wbGVtZW50ZWQiLCJFcnJvciIsIm1vY2tBY3Rpdml0eSIsInRleHQiLCJ0eXBlIiwiZnJvbSIsImlkIiwidG9rZW5QcmVmaXgiLCJtb2NrU2VydmVyIiwic2NoZWR1bGVyIiwiY29udmVyc2F0aW9uIiwic29ja2V0cyIsIlNldCIsImNvbnZlcnNhdGlvbklkIiwiaGlzdG9yeSIsInRva2VuIiwidG9rZW5SZXNwb25zZSIsInNlcnZlciIsInJlcXVlc3QiLCJoZWFkZXJzIiwiYXV0aG9yaXphdGlvbiIsInJlc3BvbnNlIiwic3RhdHVzIiwiaW5qZWN0Q2xvc2UiLCJmb3JFYWNoIiwicyIsIm9uY2xvc2UiLCJDbG9zZUV2ZW50IiwiaW5qZWN0TmV3VG9rZW4iLCJzdWZmaXgiLCJOdW1iZXIiLCJwYXJzZUludCIsInN1YnN0cmluZyIsImxlbmd0aCIsImtleVdhdGVybWFyayIsIm1vY2tBamF4IiwiY3VzdG9tQWpheCIsInVyaUJhc2UiLCJVUkwiLCJjcmVhdGVTdHJlYW1VcmwiLCJ3YXRlcm1hcmsiLCJ1cmkiLCJwYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJhcHBlbmQiLCJ0b1N0cmluZyIsInNlYXJjaCIsImpheCIsInVybE9yUmVxdWVzdCIsInVybCIsInBhdGhuYW1lIiwic2VhcmNoUGFyYW1zIiwicGFydHMiLCJzcGxpdCIsInN0cmVhbVVybCIsInJlc3BvbnNlVG9rZW4iLCJhY3Rpdml0eSIsImJvZHkiLCJhZnRlciIsInB1c2giLCJzdGFydCIsInNvY2tldCIsInBsYXkiLCJnZXQiLCJtZXRob2QiLCJPYnNlcnZhYmxlIiwic3Vic2NyaWJlciIsIm5leHQiLCJjb21wbGV0ZSIsImVycm9yIiwicHJvcGVydGllcyIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImdldEpTT04iLCJPYmplY3QiLCJhc3NpZ24iLCJtb2NrV2ViU29ja2V0IiwicHJvdG9jb2xzIiwiV2ViU29ja2V0IiwiQ0xPU0VEIiwiQ0xPU0lORyIsIkNPTk5FQ1RJTkciLCJPUEVOIiwic2NoZWR1bGUiLCJyZWFkeVN0YXRlIiwiYWRkIiwib25vcGVuIiwiRXZlbnQiLCJhY3Rpdml0aWVzIiwic2xpY2UiLCJhY3Rpdml0eUdyb3VwIiwibWVzc2FnZSIsIk1lc3NhZ2VFdmVudCIsImRhdGEiLCJKU09OIiwic3RyaW5naWZ5Iiwib25tZXNzYWdlIiwiY29kZSIsInJlYXNvbiIsIm1vY2tTZXJ2aWNlcyIsImFqYXgiLCJyYW5kb20iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUNBOztBQUVBOzs7Ozs7OztBQUVBO0FBRUEsSUFBTUEsY0FBYyxHQUFHLFNBQWpCQSxjQUFpQixHQUFhO0FBQUUsUUFBTSxJQUFJQyxLQUFKLENBQVUsaUJBQVYsQ0FBTjtBQUFvQyxDQUExRSxDLENBRUE7OztBQUVPLElBQU1DLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUNDLElBQUQ7QUFBQSxTQUE4QztBQUFFQyxJQUFBQSxJQUFJLEVBQUUsU0FBUjtBQUFtQkMsSUFBQUEsSUFBSSxFQUFFO0FBQUVDLE1BQUFBLEVBQUUsRUFBRTtBQUFOLEtBQXpCO0FBQTJDSCxJQUFBQSxJQUFJLEVBQUpBO0FBQTNDLEdBQTlDO0FBQUEsQ0FBckIsQyxDQUVQOzs7O0FBb0JBLElBQU1JLFdBQVcsR0FBRyxPQUFwQjs7QUFFTyxJQUFNQyxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFDQyxTQUFEO0FBQUEsU0FBdUM7QUFDL0RBLElBQUFBLFNBQVMsRUFBVEEsU0FEK0Q7QUFFL0RDLElBQUFBLFlBQVksRUFBRTtBQUNaQyxNQUFBQSxPQUFPLEVBQUUsSUFBSUMsR0FBSixFQURHO0FBRVpDLE1BQUFBLGNBQWMsRUFBRSxpQkFGSjtBQUdaQyxNQUFBQSxPQUFPLEVBQUUsRUFIRztBQUlaQyxNQUFBQSxLQUFLLEVBQUVSLFdBQVcsR0FBRztBQUpUO0FBRmlELEdBQXZDO0FBQUEsQ0FBbkI7Ozs7QUFVUCxJQUFNUyxhQUFhLEdBQUcsU0FBaEJBLGFB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aEI7QUFBQTtBQUFBLGFBNER6QiwrQkFBc0I7QUFBRSxjQUFNLElBQUlBLEtBQUosRUFBTjtBQUFvQjtBQTVEbkI7QUFBQTtBQUFBLGFBNkR6Qix5QkFBeUI7QUFBRSxjQUFNLElBQUlBLEtBQUosRUFBTjtBQUFvQjtBQTdEdEI7QUFBQTtBQUFBLDBEQStEVDhFLFNBQVMsQ0FBQ0MsTUEvREQsdURBZ0VSRCxTQUFTLENBQUNFLE9BaEVGLDBEQWlFTEYsU0FBUyxDQUFDRyxVQWpFTCxvREFrRVhILFNBQVMsQ0FBQ0ksSUFsRUM7QUFBQSxDQUF0QixDLENBcUVQOzs7OztBQUVPLElBQU1pQixZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDbkYsTUFBRCxFQUFpQlIsU0FBakI7QUFBQSxTQUEwRTtBQUNwR0EsSUFBQUEsU0FBUyxFQUFUQSxTQURvRztBQUVwR3NFLElBQUFBLFNBQVMsRUFBRUYsYUFBYSxDQUFDNUQsTUFBRCxDQUY0RTtBQUdwR29GLElBQUFBLElBQUksRUFBRWxFLFFBQVEsQ0FBQ2xCLE1BQUQsQ0FIc0Y7QUFJcEdxRixJQUFBQSxNQUFNLEVBQUU7QUFBQSxhQUFNLENBQU47QUFBQTtBQUo0RixHQUExRTtBQUFBLENBQXJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgRGlyZWN0TGluZUV4cG9ydCBmcm9tIFwiLi9kaXJlY3RMaW5lXCI7XG5pbXBvcnQgeyBUZXN0U2NoZWR1bGVyLCBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEFqYXhDcmVhdGlvbk1ldGhvZCwgQWpheFJlcXVlc3QsIEFqYXhSZXNwb25zZSB9IGZyb20gXCJyeGpzL29ic2VydmFibGUvZG9tL0FqYXhPYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyBVUkwsIFVSTFNlYXJjaFBhcmFtcyB9IGZyb20gJ3VybCc7XG5cbi8vIE1PQ0sgaGVscGVyc1xuXG5jb25zdCBub3RJbXBsZW1lbnRlZCA9ICgpOiBuZXZlciA9PiB7IHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykgfTtcblxuLy8gTU9DSyBBY3Rpdml0eVxuXG5leHBvcnQgY29uc3QgbW9ja0FjdGl2aXR5ID0gKHRleHQ6IHN0cmluZyk6IERpcmVjdExpbmVFeHBvcnQuQWN0aXZpdHkgPT4gKHsgdHlwZTogJ21lc3NhZ2UnLCBmcm9tOiB7IGlkOiAnc2VuZGVyJyB9LCB0ZXh0IH0pO1xuXG4vLyBNT0NLIERpcmVjdExpbmUgU2VydmVyIChzaGFyZWQgc3RhdGUgdXNlZCBieSBPYnNlcnZhYmxlLmFqYXggYW5kIFdlYlNvY2tldCBtb2NrcylcblxuaW50ZXJmYWNlIEFjdGl2aXR5U29ja2V0IHtcbiAgcGxheTogKHN0YXJ0OiBudW1iZXIsIGFmdGVyOiBudW1iZXIpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIFNvY2tldCA9IFdlYlNvY2tldCAmIEFjdGl2aXR5U29ja2V0O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnNhdGlvbiB7XG4gIHNvY2tldHM6IFNldDxTb2NrZXQ+O1xuICBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICBoaXN0b3J5OiBBcnJheTxEaXJlY3RMaW5lRXhwb3J0LkFjdGl2aXR5PjtcbiAgdG9rZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXIge1xuICBzY2hlZHVsZXI6IFRlc3RTY2hlZHVsZXI7XG4gIGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uO1xufVxuXG5jb25zdCB0b2tlblByZWZpeCA9ICd0b2tlbic7XG5cbmV4cG9ydCBjb25zdCBtb2NrU2VydmVyID0gKHNjaGVkdWxlcjogVGVzdFNjaGVkdWxlcik6IFNlcnZlciA9PiAoe1xuICBzY2hlZHVsZXIsXG4gIGNvbnZlcnNhdGlvbjoge1xuICAgIHNvY2tldHM6IG5ldyBTZXQ8U29ja2V0PigpLFxuICAgIGNvbnZlcnNhdGlvbklkOiAnT25lQ29udmVyc2F0aW9uJyxcbiAgICBoaXN0b3J5OiBbXSxcbiAgICB0b2tlbjogdG9rZW5QcmVmaXggKyAnMScsXG4gIH1cbn0pO1xuXG5jb25zdCB0b2tlblJlc3BvbnNlID0gKHNlcnZlcjogU2VydmVyLCByZXF1ZXN0OiBBamF4UmVxdWVzdCk6IEFqYXhSZXNwb25zZSB8IG51bGwgPT4ge1xuICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlcXVlc3Q7XG4gIGNvbnN0IGF1dGhvcml6YXRpb24gPSBoZWFkZXJzWydBdXRob3JpemF0aW9uJ107XG4gIGlmIChhdXRob3JpemF0aW9uID09PSBgQmVhcmVyICR7c2VydmVyLmNvbnZlcnNhdGlvbi50b2tlbn1gKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCByZXNwb25zZTogUGFydGlhbDxBamF4UmVzcG9uc2U+ID0ge1xuICAgIHN0YXR1czogNDAzLFxuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlIGFzIEFqYXhSZXNwb25zZTtcbn1cblxuZXhwb3J0IGNvbnN0IGluamVjdENsb3NlID0gKHNlcnZlcjogU2VydmVyKTogdm9pZCA9PlxuICBzZXJ2ZXIuY29udmVyc2F0aW9uLnNvY2tldHMuZm9yRWFjaChzID0+IHMub25jbG9zZShuZXcgQ2xvc2VFdmVudCgnY2xvc2UnKSkpO1xuXG5leHBvcnQgY29uc3QgaW5qZWN0TmV3VG9rZW4gPSAoc2VydmVyOiBTZXJ2ZXIpOiB2b2lkID0+IHtcbiAgY29uc3QgeyBjb252ZXJzYXRpb24gfSA9IHNlcnZlcjtcbiAgY29uc3Qgc3VmZml4ID0gTnVtYmVyLnBhcnNlSW50KGNvbnZlcnNhdGlvbi50b2tlbi5zdWJzdHJpbmcodG9rZW5QcmVmaXgubGVuZ3RoKSwgMTApICsgMVxuICBjb252ZXJzYXRpb24udG9rZW4gPSB0b2tlblByZWZpeCArIHN1ZmZpeDtcbn1cblxuY29uc3Qga2V5V2F0ZXJtYXJrID0gJ3dhdGVybWFyayc7XG5cbnR5cGUgYWpheFR5cGUgPSAodXJsT3JSZXF1ZXN0OiBzdHJpbmcgfCBBamF4UmVxdWVzdCkgPT4gQWpheFJlc3BvbnNlO1xuXG4vLyBNT0NLIE9ic2VydmFibGUuYWpheCAodXNlcyBzaGFyZWQgc3RhdGUgaW4gU2VydmVyKVxuXG5leHBvcnQgY29uc3QgbW9ja0FqYXggPSAoc2VydmVyOiBTZXJ2ZXIsIGN1c3RvbUFqYXg/OiBhamF4VHlwZSk6IEFqYXhDcmVhdGlvbk1ldGhvZCA9PiB7XG5cbiAgY29uc3QgdXJpQmFzZSA9IG5ldyBVUkwoJ2h0dHBzOi8vZGlyZWN0bGluZS5ib3RmcmFtZXdvcmsuY29tL3YzL2RpcmVjdGxpbmUvJyk7XG4gIGNvbnN0IGNyZWF0ZVN0cmVhbVVybCA9ICh3YXRlcm1hcms6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgdXJpID0gbmV3IFVSTCgnY29udmVyc2F0aW9ucy9zdHJlYW0nLCB1cmlCYXNlKTtcbiAgICBpZiAod2F0ZXJtYXJrID4gMCkge1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgcGFyYW1zLmFwcGVuZChrZXlXYXRlcm1hcmssIHdhdGVybWFyay50b1N0cmluZygxMCkpO1xuICAgICAgdXJpLnNlYXJjaCA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHJldHVybiB1cmkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGNvbnN0IGpheCA9IGN1c3RvbUFqYXggfHwgKCh1cmxPclJlcXVlc3Q6IHN0cmluZyB8IEFqYXhSZXF1ZXN0KTogQWpheFJlc3BvbnNlID0+IHtcbiAgICBpZiAodHlwZW9mIHVybE9yUmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cblxuICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodXJsT3JSZXF1ZXN0LnVybCk7XG5cbiAgICBjb25zdCB7IHBhdGhuYW1lLCBzZWFyY2hQYXJhbXMgfSA9IHVyaTtcblxuICAgIGNvbnN0IHBhcnRzID0gcGF0aG5hbWUuc3BsaXQoJy8nKTtcblxuICAgIGlmIChwYXJ0c1szXSA9PT0gJ3Rva2VucycgJiYgcGFydHNbNF0gPT09ICdyZWZyZXNoJykge1xuXG4gICAgICBjb25zdCByZXNwb25zZTogUGFydGlhbDxBamF4UmVzcG9uc2U+ID0ge1xuICAgICAgICByZXNwb25zZTogeyB0b2tlbjogc2VydmVyLmNvbnZlcnNhdGlvbi50b2tlbiB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcmVzcG9uc2UgYXMgQWpheFJlc3BvbnNlO1xuICAgIH1cblxuICAgIGlmIChwYXJ0c1szXSAhPT0gJ2NvbnZlcnNhdGlvbnMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICBpZiAocGFydHMubGVuZ3RoID09PSA0KSB7XG4gICAgICBjb25zdCBjb252ZXJzYXRpb246IERpcmVjdExpbmVFeHBvcnQuQ29udmVyc2F0aW9uID0ge1xuICAgICAgICBjb252ZXJzYXRpb25JZDogc2VydmVyLmNvbnZlcnNhdGlvbi5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgdG9rZW46IHNlcnZlci5jb252ZXJzYXRpb24udG9rZW4sXG4gICAgICAgIHN0cmVhbVVybDogY3JlYXRlU3RyZWFtVXJsKDApLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2U6IFBhcnRpYWw8QWpheFJlc3BvbnNlPiA9IHtcbiAgICAgICAgcmVzcG9uc2U6IGNvbnZlcnNhdGlvbixcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIEFqYXhSZXNwb25zZTtcbiAgICB9XG5cbiAgICBpZiAocGFydHNbNF0gIT09IHNlcnZlci5jb252ZXJzYXRpb24uY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cblxuICAgIGlmIChwYXJ0c1s1XSA9PT0gJ2FjdGl2aXRpZXMnKSB7XG4gICAgICBjb25zdCByZXNwb25zZVRva2VuID0gdG9rZW5SZXNwb25zZShzZXJ2ZXIsIHVybE9yUmVxdWVzdCk7XG4gICAgICBpZiAocmVzcG9uc2VUb2tlbiAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VUb2tlbjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWN0aXZpdHk6IERpcmVjdExpbmVFeHBvcnQuQWN0aXZpdHkgPSB1cmxPclJlcXVlc3QuYm9keTtcblxuICAgICAgY29uc3QgYWZ0ZXIgPSBzZXJ2ZXIuY29udmVyc2F0aW9uLmhpc3RvcnkucHVzaChhY3Rpdml0eSk7XG4gICAgICBjb25zdCBzdGFydCA9IGFmdGVyIC0gMTtcblxuICAgICAgZm9yIChjb25zdCBzb2NrZXQgb2Ygc2VydmVyLmNvbnZlcnNhdGlvbi5zb2NrZXRzKSB7XG4gICAgICAgIHNvY2tldC5wbGF5KHN0YXJ0LCBhZnRlcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBQYXJ0aWFsPEFqYXhSZXNwb25zZT4gPSB7XG4gICAgICAgIHJlc3BvbnNlOiB7IGlkOiAnbWVzc2FnZUlkJyB9LFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzcG9uc2UgYXMgQWpheFJlc3BvbnNlO1xuICAgIH1cbiAgICBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT09IDUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlVG9rZW4gPSB0b2tlblJlc3BvbnNlKHNlcnZlciwgdXJsT3JSZXF1ZXN0KTtcbiAgICAgIGlmIChyZXNwb25zZVRva2VuICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZVRva2VuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3YXRlcm1hcmsgPSBzZWFyY2hQYXJhbXMuZ2V0KCd3YXRlcm1hcmsnKTtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gTnVtYmVyLnBhcnNlSW50KHdhdGVybWFyaywgMTApO1xuXG4gICAgICBjb25zdCBjb252ZXJzYXRpb246IERpcmVjdExpbmVFeHBvcnQuQ29udmVyc2F0aW9uID0ge1xuICAgICAgICBjb252ZXJzYXRpb25JZDogc2VydmVyLmNvbnZlcnNhdGlvbi5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgdG9rZW46IHNlcnZlci5jb252ZXJzYXRpb24udG9rZW4sXG4gICAgICAgIHN0cmVhbVVybDogY3JlYXRlU3RyZWFtVXJsKHN0YXJ0KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBQYXJ0aWFsPEFqYXhSZXNwb25zZT4gPSB7XG4gICAgICAgIHJlc3BvbnNlOiBjb252ZXJzYXRpb24sXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZSBhcyBBamF4UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gIH0pO1xuXG4gIGNvbnN0IG1ldGhvZCA9ICh1cmxPclJlcXVlc3Q6IHN0cmluZyB8IEFqYXhSZXF1ZXN0KTogT2JzZXJ2YWJsZTxBamF4UmVzcG9uc2U+ID0+XG4gICAgbmV3IE9ic2VydmFibGU8QWpheFJlc3BvbnNlPihzdWJzY3JpYmVyID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN1YnNjcmliZXIubmV4dChqYXgodXJsT3JSZXF1ZXN0KSk7XG4gICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB0eXBlIFZhbHVlVHlwZTxULCBWPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIFYgPyBUW0tdIDogbmV2ZXI7XG4gIH1cblxuICB0eXBlIFByb3BlcnRpZXMgPSBWYWx1ZVR5cGU8QWpheENyZWF0aW9uTWV0aG9kLCBGdW5jdGlvbj47XG5cbiAgY29uc3QgcHJvcGVydGllczogUHJvcGVydGllcyA9IHtcbiAgICBnZXQ6ICh1cmw6IHN0cmluZywgaGVhZGVycz86IE9iamVjdCk6IE9ic2VydmFibGU8QWpheFJlc3BvbnNlPiA9PiBub3RJbXBsZW1lbnRlZCgpLFxuICAgIHBvc3Q6ICh1cmw6IHN0cmluZywgYm9keT86IGFueSwgaGVhZGVycz86IE9iamVjdCk6IE9ic2VydmFibGU8QWpheFJlc3BvbnNlPiA9PiBub3RJbXBsZW1lbnRlZCgpLFxuICAgIHB1dDogKHVybDogc3RyaW5nLCBib2R5PzogYW55LCBoZWFkZXJzPzogT2JqZWN0KTogT2JzZXJ2YWJsZTxBamF4UmVzcG9uc2U+ID0+IG5vdEltcGxlbWVudGVkKCksXG4gICAgcGF0Y2g6ICh1cmw6IHN0cmluZywgYm9keT86IGFueSwgaGVhZGVycz86IE9iamVjdCk6IE9ic2VydmFibGU8QWpheFJlc3BvbnNlPiA9PiBub3RJbXBsZW1lbnRlZCgpLFxuICAgIGRlbGV0ZTogKHVybDogc3RyaW5nLCBoZWFkZXJzPzogT2JqZWN0KTogT2JzZXJ2YWJsZTxBamF4UmVzcG9uc2U+ID0+IG5vdEltcGxlbWVudGVkKCksXG4gICAgZ2V0SlNPTjogKHVybDogc3RyaW5nLCBoZWFkZXJzPzogT2JqZWN0KSA9PiBub3RJbXBsZW1lbnRlZCgpLFxuICB9O1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKG1ldGhvZCwgcHJvcGVydGllcyk7XG59XG5cbi8vIE1PQ0sgV2ViU29ja2V0ICh1c2VzIHNoYXJlZCBzdGF0ZSBpbiBTZXJ2ZXIpXG5cbnR5cGUgV2ViU29ja2V0Q29uc3RydWN0b3IgPSB0eXBlb2YgV2ViU29ja2V0O1xudHlwZSBFdmVudEhhbmRsZXI8RSBleHRlbmRzIEV2ZW50PiA9ICh0aGlzOiBXZWJTb2NrZXQsIGV2OiBFKSA9PiBhbnk7XG5cbmV4cG9ydCBjb25zdCBtb2NrV2ViU29ja2V0ID0gKHNlcnZlcjogU2VydmVyKTogV2ViU29ja2V0Q29uc3RydWN0b3IgPT5cbiAgY2xhc3MgTW9ja1dlYlNvY2tldCBpbXBsZW1lbnRzIFdlYlNvY2tldCwgQWN0aXZpdHlTb2NrZXQge1xuICAgIGNvbnN0cnVjdG9yKHVybDogc3RyaW5nLCBwcm90b2NvbHM/OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuXG4gICAgICBzZXJ2ZXIuc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNPTk5FQ1RJTkc7XG4gICAgICAgIHNlcnZlci5jb252ZXJzYXRpb24uc29ja2V0cy5hZGQodGhpcyk7XG4gICAgICAgIHRoaXMub25vcGVuKG5ldyBFdmVudCgnb3BlbicpKTtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gV2ViU29ja2V0Lk9QRU47XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodXJsKTtcbiAgICAgICAgY29uc3Qgd2F0ZXJtYXJrID0gdXJpLnNlYXJjaFBhcmFtcy5nZXQoa2V5V2F0ZXJtYXJrKVxuICAgICAgICBpZiAod2F0ZXJtYXJrICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPSBOdW1iZXIucGFyc2VJbnQod2F0ZXJtYXJrLCAxMCk7XG4gICAgICAgICAgdGhpcy5wbGF5KHN0YXJ0LCBzZXJ2ZXIuY29udmVyc2F0aW9uLmhpc3RvcnkubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcGxheShzdGFydDogbnVtYmVyLCBhZnRlcjogbnVtYmVyKSB7XG5cbiAgICAgIGNvbnN0IHsgY29udmVyc2F0aW9uOiB7IGhpc3RvcnkgfSB9ID0gc2VydmVyO1xuICAgICAgY29uc3QgYWN0aXZpdGllcyA9IGhpc3Rvcnkuc2xpY2Uoc3RhcnQsIGFmdGVyKTtcbiAgICAgIGNvbnN0IHdhdGVybWFyayA9IGhpc3RvcnkubGVuZ3RoLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBhY3Rpdml0eUdyb3VwOiBEaXJlY3RMaW5lRXhwb3J0LkFjdGl2aXR5R3JvdXAgPSB7XG4gICAgICAgIGFjdGl2aXRpZXMsXG4gICAgICAgIHdhdGVybWFyayxcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlRXZlbnQoJ3R5cGUnLCB7IGRhdGE6IEpTT04uc3RyaW5naWZ5KGFjdGl2aXR5R3JvdXApIH0pO1xuXG4gICAgICB0aGlzLm9ubWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBiaW5hcnlUeXBlOiBCaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICByZWFkb25seSBidWZmZXJlZEFtb3VudDogbnVtYmVyID0gMDtcbiAgICByZWFkb25seSBleHRlbnNpb25zOiBzdHJpbmcgPSAnJztcbiAgICByZWFkb25seSBwcm90b2NvbDogc3RyaW5nID0gJ2h0dHBzJztcbiAgICByZWFkeVN0YXRlOiBudW1iZXIgPSBXZWJTb2NrZXQuQ0xPU0VEO1xuICAgIHJlYWRvbmx5IHVybDogc3RyaW5nID0gJyc7XG4gICAgcmVhZG9ubHkgQ0xPU0VEOiBudW1iZXIgPSBXZWJTb2NrZXQuQ0xPU0VEO1xuICAgIHJlYWRvbmx5IENMT1NJTkc6IG51bWJlciA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgIHJlYWRvbmx5IENPTk5FQ1RJTkc6IG51bWJlciA9IFdlYlNvY2tldC5DT05ORUNUSU5HO1xuICAgIHJlYWRvbmx5IE9QRU46IG51bWJlciA9IFdlYlNvY2tldC5PUEVOO1xuXG4gICAgb25jbG9zZTogRXZlbnRIYW5kbGVyPENsb3NlRXZlbnQ+O1xuICAgIG9uZXJyb3I6IEV2ZW50SGFuZGxlcjxFdmVudD47XG4gICAgb25tZXNzYWdlOiBFdmVudEhhbmRsZXI8TWVzc2FnZUV2ZW50PjtcbiAgICBvbm9wZW46IEV2ZW50SGFuZGxlcjxFdmVudD47XG5cbiAgICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgICAgdGhpcy5vbmNsb3NlKG5ldyBDbG9zZUV2ZW50KCdjbG9zZScpKVxuICAgICAgc2VydmVyLmNvbnZlcnNhdGlvbi5zb2NrZXRzLmRlbGV0ZSh0aGlzKTtcbiAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TRUQ7XG4gICAgfVxuXG4gICAgc2VuZChkYXRhOiBzdHJpbmcgfCBBcnJheUJ1ZmZlckxpa2UgfCBCbG9iIHwgQXJyYXlCdWZmZXJWaWV3KTogdm9pZCB7XG4gICAgfVxuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcigpIHsgdGhyb3cgbmV3IEVycm9yKCk7IH1cbiAgICByZW1vdmVFdmVudExpc3RlbmVyKCkgeyB0aHJvdyBuZXcgRXJyb3IoKTsgfVxuICAgIGRpc3BhdGNoRXZlbnQoKTogYm9vbGVhbiB7IHRocm93IG5ldyBFcnJvcigpOyB9XG5cbiAgICBzdGF0aWMgQ0xPU0VEID0gV2ViU29ja2V0LkNMT1NFRDtcbiAgICBzdGF0aWMgQ0xPU0lORyA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgIHN0YXRpYyBDT05ORUNUSU5HID0gV2ViU29ja2V0LkNPTk5FQ1RJTkc7XG4gICAgc3RhdGljIE9QRU4gPSBXZWJTb2NrZXQuT1BFTjtcbiAgfTtcblxuLy8gTU9DSyBzZXJ2aWNlcyAodG9wLWxldmVsIGFnZ3JlZ2F0aW9uIG9mIGFsbCBtb2NrcylcblxuZXhwb3J0IGNvbnN0IG1vY2tTZXJ2aWNlcyA9IChzZXJ2ZXI6IFNlcnZlciwgc2NoZWR1bGVyOiBUZXN0U2NoZWR1bGVyKTogRGlyZWN0TGluZUV4cG9ydC5TZXJ2aWNlcyA9PiAoe1xuICBzY2hlZHVsZXIsXG4gIFdlYlNvY2tldDogbW9ja1dlYlNvY2tldChzZXJ2ZXIpLFxuICBhamF4OiBtb2NrQWpheChzZXJ2ZXIpLFxuICByYW5kb206ICgpID0+IDAsXG59KTtcbiJdfQ==
287
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcnhqcyIsInJlcXVpcmUiLCJfdXJsIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJvIiwiYWxsb3dBcnJheUxpa2UiLCJpdCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiaSIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImUiLCJfZSIsImYiLCJUeXBlRXJyb3IiLCJub3JtYWxDb21wbGV0aW9uIiwiZGlkRXJyIiwiZXJyIiwiY2FsbCIsInN0ZXAiLCJuZXh0IiwiX2UyIiwibWluTGVuIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJhcnIiLCJsZW4iLCJhcnIyIiwibm90SW1wbGVtZW50ZWQiLCJFcnJvciIsIm1vY2tBY3Rpdml0eSIsInRleHQiLCJ0eXBlIiwiaWQiLCJleHBvcnRzIiwidG9rZW5QcmVmaXgiLCJtb2NrU2VydmVyIiwic2NoZWR1bGVyIiwiY29udmVyc2F0aW9uIiwic29ja2V0cyIsIlNldCIsImNvbnZlcnNhdGlvbklkIiwiaGlzdG9yeSIsInRva2VuIiwidG9rZW5SZXNwb25zZSIsInNlcnZlciIsInJlcXVlc3QiLCJoZWFkZXJzIiwiYXV0aG9yaXphdGlvbiIsImNvbmNhdCIsInJlc3BvbnNlIiwic3RhdHVzIiwiaW5qZWN0Q2xvc2UiLCJmb3JFYWNoIiwib25jbG9zZSIsIkNsb3NlRXZlbnQiLCJpbmplY3ROZXdUb2tlbiIsInN1ZmZpeCIsIk51bWJlciIsInBhcnNlSW50Iiwic3Vic3RyaW5nIiwia2V5V2F0ZXJtYXJrIiwibW9ja0FqYXgiLCJjdXN0b21BamF4IiwidXJpQmFzZSIsIlVSTCIsImNyZWF0ZVN0cmVhbVVybCIsIndhdGVybWFyayIsInVyaSIsInBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsImFwcGVuZCIsInNlYXJjaCIsImpheCIsInVybE9yUmVxdWVzdCIsInVybCIsInBhdGhuYW1lIiwic2VhcmNoUGFyYW1zIiwicGFydHMiLCJzcGxpdCIsInN0cmVhbVVybCIsInJlc3BvbnNlVG9rZW4iLCJhY3Rpdml0eSIsImJvZHkiLCJhZnRlciIsInB1c2giLCJzdGFydCIsIl9pdGVyYXRvciIsIl9zdGVwIiwic29ja2V0IiwicGxheSIsImdldCIsIm1ldGhvZCIsIk9ic2VydmFibGUiLCJzdWJzY3JpYmVyIiwiY29tcGxldGUiLCJlcnJvciIsInByb3BlcnRpZXMiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJfZGVsZXRlIiwiZ2V0SlNPTiIsImFzc2lnbiIsIm1vY2tXZWJTb2NrZXQiLCJfY2xhc3MiLCJNb2NrV2ViU29ja2V0IiwicHJvdG9jb2xzIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2RlZmluZVByb3BlcnR5MiIsIldlYlNvY2tldCIsIkNMT1NFRCIsIkNMT1NJTkciLCJDT05ORUNUSU5HIiwiT1BFTiIsInNjaGVkdWxlIiwicmVhZHlTdGF0ZSIsImFkZCIsIm9ub3BlbiIsIkV2ZW50IiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsImFjdGl2aXRpZXMiLCJhY3Rpdml0eUdyb3VwIiwibWVzc2FnZSIsIk1lc3NhZ2VFdmVudCIsImRhdGEiLCJKU09OIiwic3RyaW5naWZ5Iiwib25tZXNzYWdlIiwiY2xvc2UiLCJjb2RlIiwicmVhc29uIiwic2VuZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZGlzcGF0Y2hFdmVudCIsIm1vY2tTZXJ2aWNlcyIsImFqYXgiLCJyYW5kb20iXSwic291cmNlcyI6WyIuLi9zcmMvZGlyZWN0TGluZS5tb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERpcmVjdExpbmVFeHBvcnQgZnJvbSBcIi4vZGlyZWN0TGluZVwiO1xuaW1wb3J0IHsgVGVzdFNjaGVkdWxlciwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBBamF4Q3JlYXRpb25NZXRob2QsIEFqYXhSZXF1ZXN0LCBBamF4UmVzcG9uc2UgfSBmcm9tIFwicnhqcy9vYnNlcnZhYmxlL2RvbS9BamF4T2JzZXJ2YWJsZVwiO1xuaW1wb3J0IHsgVVJMLCBVUkxTZWFyY2hQYXJhbXMgfSBmcm9tICd1cmwnO1xuXG4vLyBNT0NLIGhlbHBlcnNcblxuY29uc3Qgbm90SW1wbGVtZW50ZWQgPSAoKTogbmV2ZXIgPT4geyB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpIH07XG5cbi8vIE1PQ0sgQWN0aXZpdHlcblxuZXhwb3J0IGNvbnN0IG1vY2tBY3Rpdml0eSA9ICh0ZXh0OiBzdHJpbmcpOiBEaXJlY3RMaW5lRXhwb3J0LkFjdGl2aXR5ID0+ICh7IHR5cGU6ICdtZXNzYWdlJywgZnJvbTogeyBpZDogJ3NlbmRlcicgfSwgdGV4dCB9KTtcblxuLy8gTU9DSyBEaXJlY3RMaW5lIFNlcnZlciAoc2hhcmVkIHN0YXRlIHVzZWQgYnkgT2JzZXJ2YWJsZS5hamF4IGFuZCBXZWJTb2NrZXQgbW9ja3MpXG5cbmludGVyZmFjZSBBY3Rpdml0eVNvY2tldCB7XG4gIHBsYXk6IChzdGFydDogbnVtYmVyLCBhZnRlcjogbnVtYmVyKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBTb2NrZXQgPSBXZWJTb2NrZXQgJiBBY3Rpdml0eVNvY2tldDtcblxuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzYXRpb24ge1xuICBzb2NrZXRzOiBTZXQ8U29ja2V0PjtcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgaGlzdG9yeTogQXJyYXk8RGlyZWN0TGluZUV4cG9ydC5BY3Rpdml0eT47XG4gIHRva2VuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyIHtcbiAgc2NoZWR1bGVyOiBUZXN0U2NoZWR1bGVyO1xuICBjb252ZXJzYXRpb246IENvbnZlcnNhdGlvbjtcbn1cblxuY29uc3QgdG9rZW5QcmVmaXggPSAndG9rZW4nO1xuXG5leHBvcnQgY29uc3QgbW9ja1NlcnZlciA9IChzY2hlZHVsZXI6IFRlc3RTY2hlZHVsZXIpOiBTZXJ2ZXIgPT4gKHtcbiAgc2NoZWR1bGVyLFxuICBjb252ZXJzYXRpb246IHtcbiAgICBzb2NrZXRzOiBuZXcgU2V0PFNvY2tldD4oKSxcbiAgICBjb252ZXJzYXRpb25JZDogJ09uZUNvbnZlcnNhdGlvbicsXG4gICAgaGlzdG9yeTogW10sXG4gICAgdG9rZW46IHRva2VuUHJlZml4ICsgJzEnLFxuICB9XG59KTtcblxuY29uc3QgdG9rZW5SZXNwb25zZSA9IChzZXJ2ZXI6IFNlcnZlciwgcmVxdWVzdDogQWpheFJlcXVlc3QpOiBBamF4UmVzcG9uc2UgfCBudWxsID0+IHtcbiAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXF1ZXN0O1xuICBjb25zdCBhdXRob3JpemF0aW9uID0gaGVhZGVyc1snQXV0aG9yaXphdGlvbiddO1xuICBpZiAoYXV0aG9yaXphdGlvbiA9PT0gYEJlYXJlciAke3NlcnZlci5jb252ZXJzYXRpb24udG9rZW59YCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2U6IFBhcnRpYWw8QWpheFJlc3BvbnNlPiA9IHtcbiAgICBzdGF0dXM6IDQwMyxcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZSBhcyBBamF4UmVzcG9uc2U7XG59XG5cbmV4cG9ydCBjb25zdCBpbmplY3RDbG9zZSA9IChzZXJ2ZXI6IFNlcnZlcik6IHZvaWQgPT5cbiAgc2VydmVyLmNvbnZlcnNhdGlvbi5zb2NrZXRzLmZvckVhY2gocyA9PiBzLm9uY2xvc2UobmV3IENsb3NlRXZlbnQoJ2Nsb3NlJykpKTtcblxuZXhwb3J0IGNvbnN0IGluamVjdE5ld1Rva2VuID0gKHNlcnZlcjogU2VydmVyKTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgY29udmVyc2F0aW9uIH0gPSBzZXJ2ZXI7XG4gIGNvbnN0IHN1ZmZpeCA9IE51bWJlci5wYXJzZUludChjb252ZXJzYXRpb24udG9rZW4uc3Vic3RyaW5nKHRva2VuUHJlZml4Lmxlbmd0aCksIDEwKSArIDFcbiAgY29udmVyc2F0aW9uLnRva2VuID0gdG9rZW5QcmVmaXggKyBzdWZmaXg7XG59XG5cbmNvbnN0IGtleVdhdGVybWFyayA9ICd3YXRlcm1hcmsnO1xuXG50eXBlIGFqYXhUeXBlID0gKHVybE9yUmVxdWVzdDogc3RyaW5nIHwgQWpheFJlcXVlc3QpID0+IEFqYXhSZXNwb25zZTtcblxuLy8gTU9DSyBPYnNlcnZhYmxlLmFqYXggKHVzZXMgc2hhcmVkIHN0YXRlIGluIFNlcnZlcilcblxuZXhwb3J0IGNvbnN0IG1vY2tBamF4ID0gKHNlcnZlcjogU2VydmVyLCBjdXN0b21BamF4PzogYWpheFR5cGUpOiBBamF4Q3JlYXRpb25NZXRob2QgPT4ge1xuXG4gIGNvbnN0IHVyaUJhc2UgPSBuZXcgVVJMKCdodHRwczovL2RpcmVjdGxpbmUuYm90ZnJhbWV3b3JrLmNvbS92My9kaXJlY3RsaW5lLycpO1xuICBjb25zdCBjcmVhdGVTdHJlYW1VcmwgPSAod2F0ZXJtYXJrOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwoJ2NvbnZlcnNhdGlvbnMvc3RyZWFtJywgdXJpQmFzZSk7XG4gICAgaWYgKHdhdGVybWFyayA+IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgIHBhcmFtcy5hcHBlbmQoa2V5V2F0ZXJtYXJrLCB3YXRlcm1hcmsudG9TdHJpbmcoMTApKTtcbiAgICAgIHVyaS5zZWFyY2ggPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXJpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBjb25zdCBqYXggPSBjdXN0b21BamF4IHx8ICgodXJsT3JSZXF1ZXN0OiBzdHJpbmcgfCBBamF4UmVxdWVzdCk6IEFqYXhSZXNwb25zZSA9PiB7XG4gICAgaWYgKHR5cGVvZiB1cmxPclJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHVybE9yUmVxdWVzdC51cmwpO1xuXG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoUGFyYW1zIH0gPSB1cmk7XG5cbiAgICBjb25zdCBwYXJ0cyA9IHBhdGhuYW1lLnNwbGl0KCcvJyk7XG5cbiAgICBpZiAocGFydHNbM10gPT09ICd0b2tlbnMnICYmIHBhcnRzWzRdID09PSAncmVmcmVzaCcpIHtcblxuICAgICAgY29uc3QgcmVzcG9uc2U6IFBhcnRpYWw8QWpheFJlc3BvbnNlPiA9IHtcbiAgICAgICAgcmVzcG9uc2U6IHsgdG9rZW46IHNlcnZlci5jb252ZXJzYXRpb24udG9rZW4gfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIEFqYXhSZXNwb25zZTtcbiAgICB9XG5cbiAgICBpZiAocGFydHNbM10gIT09ICdjb252ZXJzYXRpb25zJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgY29uc3QgY29udmVyc2F0aW9uOiBEaXJlY3RMaW5lRXhwb3J0LkNvbnZlcnNhdGlvbiA9IHtcbiAgICAgICAgY29udmVyc2F0aW9uSWQ6IHNlcnZlci5jb252ZXJzYXRpb24uY29udmVyc2F0aW9uSWQsXG4gICAgICAgIHRva2VuOiBzZXJ2ZXIuY29udmVyc2F0aW9uLnRva2VuLFxuICAgICAgICBzdHJlYW1Vcmw6IGNyZWF0ZVN0cmVhbVVybCgwKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBQYXJ0aWFsPEFqYXhSZXNwb25zZT4gPSB7XG4gICAgICAgIHJlc3BvbnNlOiBjb252ZXJzYXRpb24sXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZSBhcyBBamF4UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzWzRdICE9PSBzZXJ2ZXIuY29udmVyc2F0aW9uLmNvbnZlcnNhdGlvbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICBpZiAocGFydHNbNV0gPT09ICdhY3Rpdml0aWVzJykge1xuICAgICAgY29uc3QgcmVzcG9uc2VUb2tlbiA9IHRva2VuUmVzcG9uc2Uoc2VydmVyLCB1cmxPclJlcXVlc3QpO1xuICAgICAgaWYgKHJlc3BvbnNlVG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlVG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjdGl2aXR5OiBEaXJlY3RMaW5lRXhwb3J0LkFjdGl2aXR5ID0gdXJsT3JSZXF1ZXN0LmJvZHk7XG5cbiAgICAgIGNvbnN0IGFmdGVyID0gc2VydmVyLmNvbnZlcnNhdGlvbi5oaXN0b3J5LnB1c2goYWN0aXZpdHkpO1xuICAgICAgY29uc3Qgc3RhcnQgPSBhZnRlciAtIDE7XG5cbiAgICAgIGZvciAoY29uc3Qgc29ja2V0IG9mIHNlcnZlci5jb252ZXJzYXRpb24uc29ja2V0cykge1xuICAgICAgICBzb2NrZXQucGxheShzdGFydCwgYWZ0ZXIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZTogUGFydGlhbDxBamF4UmVzcG9uc2U+ID0ge1xuICAgICAgICByZXNwb25zZTogeyBpZDogJ21lc3NhZ2VJZCcgfSxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3BvbnNlIGFzIEFqYXhSZXNwb25zZTtcbiAgICB9XG4gICAgZWxzZSBpZiAocGFydHMubGVuZ3RoID09PSA1KSB7XG4gICAgICBjb25zdCByZXNwb25zZVRva2VuID0gdG9rZW5SZXNwb25zZShzZXJ2ZXIsIHVybE9yUmVxdWVzdCk7XG4gICAgICBpZiAocmVzcG9uc2VUb2tlbiAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VUb2tlbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2F0ZXJtYXJrID0gc2VhcmNoUGFyYW1zLmdldCgnd2F0ZXJtYXJrJyk7XG4gICAgICBjb25zdCBzdGFydCA9IE51bWJlci5wYXJzZUludCh3YXRlcm1hcmssIDEwKTtcblxuICAgICAgY29uc3QgY29udmVyc2F0aW9uOiBEaXJlY3RMaW5lRXhwb3J0LkNvbnZlcnNhdGlvbiA9IHtcbiAgICAgICAgY29udmVyc2F0aW9uSWQ6IHNlcnZlci5jb252ZXJzYXRpb24uY29udmVyc2F0aW9uSWQsXG4gICAgICAgIHRva2VuOiBzZXJ2ZXIuY29udmVyc2F0aW9uLnRva2VuLFxuICAgICAgICBzdHJlYW1Vcmw6IGNyZWF0ZVN0cmVhbVVybChzdGFydCksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXNwb25zZTogUGFydGlhbDxBamF4UmVzcG9uc2U+ID0ge1xuICAgICAgICByZXNwb25zZTogY29udmVyc2F0aW9uLFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzcG9uc2UgYXMgQWpheFJlc3BvbnNlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcigpO1xuICB9KTtcblxuICBjb25zdCBtZXRob2QgPSAodXJsT3JSZXF1ZXN0OiBzdHJpbmcgfCBBamF4UmVxdWVzdCk6IE9ic2VydmFibGU8QWpheFJlc3BvbnNlPiA9PlxuICAgIG5ldyBPYnNlcnZhYmxlPEFqYXhSZXNwb25zZT4oc3Vic2NyaWJlciA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoamF4KHVybE9yUmVxdWVzdCkpO1xuICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgdHlwZSBWYWx1ZVR5cGU8VCwgVj4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBWID8gVFtLXSA6IG5ldmVyO1xuICB9XG5cbiAgdHlwZSBQcm9wZXJ0aWVzID0gVmFsdWVUeXBlPEFqYXhDcmVhdGlvbk1ldGhvZCwgRnVuY3Rpb24+O1xuXG4gIGNvbnN0IHByb3BlcnRpZXM6IFByb3BlcnRpZXMgPSB7XG4gICAgZ2V0OiAodXJsOiBzdHJpbmcsIGhlYWRlcnM/OiBPYmplY3QpOiBPYnNlcnZhYmxlPEFqYXhSZXNwb25zZT4gPT4gbm90SW1wbGVtZW50ZWQoKSxcbiAgICBwb3N0OiAodXJsOiBzdHJpbmcsIGJvZHk/OiBhbnksIGhlYWRlcnM/OiBPYmplY3QpOiBPYnNlcnZhYmxlPEFqYXhSZXNwb25zZT4gPT4gbm90SW1wbGVtZW50ZWQoKSxcbiAgICBwdXQ6ICh1cmw6IHN0cmluZywgYm9keT86IGFueSwgaGVhZGVycz86IE9iamVjdCk6IE9ic2VydmFibGU8QWpheFJlc3BvbnNlPiA9PiBub3RJbXBsZW1lbnRlZCgpLFxuICAgIHBhdGNoOiAodXJsOiBzdHJpbmcsIGJvZHk/OiBhbnksIGhlYWRlcnM/OiBPYmplY3QpOiBPYnNlcnZhYmxlPEFqYXhSZXNwb25zZT4gPT4gbm90SW1wbGVtZW50ZWQoKSxcbiAgICBkZWxldGU6ICh1cmw6IHN0cmluZywgaGVhZGVycz86IE9iamVjdCk6IE9ic2VydmFibGU8QWpheFJlc3BvbnNlPiA9PiBub3RJbXBsZW1lbnRlZCgpLFxuICAgIGdldEpTT046ICh1cmw6IHN0cmluZywgaGVhZGVycz86IE9iamVjdCkgPT4gbm90SW1wbGVtZW50ZWQoKSxcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihtZXRob2QsIHByb3BlcnRpZXMpO1xufVxuXG4vLyBNT0NLIFdlYlNvY2tldCAodXNlcyBzaGFyZWQgc3RhdGUgaW4gU2VydmVyKVxuXG50eXBlIFdlYlNvY2tldENvbnN0cnVjdG9yID0gdHlwZW9mIFdlYlNvY2tldDtcbnR5cGUgRXZlbnRIYW5kbGVyPEUgZXh0ZW5kcyBFdmVudD4gPSAodGhpczogV2ViU29ja2V0LCBldjogRSkgPT4gYW55O1xuXG5leHBvcnQgY29uc3QgbW9ja1dlYlNvY2tldCA9IChzZXJ2ZXI6IFNlcnZlcik6IFdlYlNvY2tldENvbnN0cnVjdG9yID0+XG4gIGNsYXNzIE1vY2tXZWJTb2NrZXQgaW1wbGVtZW50cyBXZWJTb2NrZXQsIEFjdGl2aXR5U29ja2V0IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmw6IHN0cmluZywgcHJvdG9jb2xzPzogc3RyaW5nIHwgc3RyaW5nW10pIHtcblxuICAgICAgc2VydmVyLnNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DT05ORUNUSU5HO1xuICAgICAgICBzZXJ2ZXIuY29udmVyc2F0aW9uLnNvY2tldHMuYWRkKHRoaXMpO1xuICAgICAgICB0aGlzLm9ub3BlbihuZXcgRXZlbnQoJ29wZW4nKSk7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5PUEVOO1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHVybCk7XG4gICAgICAgIGNvbnN0IHdhdGVybWFyayA9IHVyaS5zZWFyY2hQYXJhbXMuZ2V0KGtleVdhdGVybWFyaylcbiAgICAgICAgaWYgKHdhdGVybWFyayAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTnVtYmVyLnBhcnNlSW50KHdhdGVybWFyaywgMTApO1xuICAgICAgICAgIHRoaXMucGxheShzdGFydCwgc2VydmVyLmNvbnZlcnNhdGlvbi5oaXN0b3J5Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHBsYXkoc3RhcnQ6IG51bWJlciwgYWZ0ZXI6IG51bWJlcikge1xuXG4gICAgICBjb25zdCB7IGNvbnZlcnNhdGlvbjogeyBoaXN0b3J5IH0gfSA9IHNlcnZlcjtcbiAgICAgIGNvbnN0IGFjdGl2aXRpZXMgPSBoaXN0b3J5LnNsaWNlKHN0YXJ0LCBhZnRlcik7XG4gICAgICBjb25zdCB3YXRlcm1hcmsgPSBoaXN0b3J5Lmxlbmd0aC50b1N0cmluZygpO1xuICAgICAgY29uc3QgYWN0aXZpdHlHcm91cDogRGlyZWN0TGluZUV4cG9ydC5BY3Rpdml0eUdyb3VwID0ge1xuICAgICAgICBhY3Rpdml0aWVzLFxuICAgICAgICB3YXRlcm1hcmssXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZUV2ZW50KCd0eXBlJywgeyBkYXRhOiBKU09OLnN0cmluZ2lmeShhY3Rpdml0eUdyb3VwKSB9KTtcblxuICAgICAgdGhpcy5vbm1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgYmluYXJ5VHlwZTogQmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgcmVhZG9ubHkgYnVmZmVyZWRBbW91bnQ6IG51bWJlciA9IDA7XG4gICAgcmVhZG9ubHkgZXh0ZW5zaW9uczogc3RyaW5nID0gJyc7XG4gICAgcmVhZG9ubHkgcHJvdG9jb2w6IHN0cmluZyA9ICdodHRwcyc7XG4gICAgcmVhZHlTdGF0ZTogbnVtYmVyID0gV2ViU29ja2V0LkNMT1NFRDtcbiAgICByZWFkb25seSB1cmw6IHN0cmluZyA9ICcnO1xuICAgIHJlYWRvbmx5IENMT1NFRDogbnVtYmVyID0gV2ViU29ja2V0LkNMT1NFRDtcbiAgICByZWFkb25seSBDTE9TSU5HOiBudW1iZXIgPSBXZWJTb2NrZXQuQ0xPU0lORztcbiAgICByZWFkb25seSBDT05ORUNUSU5HOiBudW1iZXIgPSBXZWJTb2NrZXQuQ09OTkVDVElORztcbiAgICByZWFkb25seSBPUEVOOiBudW1iZXIgPSBXZWJTb2NrZXQuT1BFTjtcblxuICAgIG9uY2xvc2U6IEV2ZW50SGFuZGxlcjxDbG9zZUV2ZW50PjtcbiAgICBvbmVycm9yOiBFdmVudEhhbmRsZXI8RXZlbnQ+O1xuICAgIG9ubWVzc2FnZTogRXZlbnRIYW5kbGVyPE1lc3NhZ2VFdmVudD47XG4gICAgb25vcGVuOiBFdmVudEhhbmRsZXI8RXZlbnQ+O1xuXG4gICAgY2xvc2UoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcbiAgICAgIHRoaXMub25jbG9zZShuZXcgQ2xvc2VFdmVudCgnY2xvc2UnKSlcbiAgICAgIHNlcnZlci5jb252ZXJzYXRpb24uc29ja2V0cy5kZWxldGUodGhpcyk7XG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0VEO1xuICAgIH1cblxuICAgIHNlbmQoZGF0YTogc3RyaW5nIHwgQXJyYXlCdWZmZXJMaWtlIHwgQmxvYiB8IEFycmF5QnVmZmVyVmlldyk6IHZvaWQge1xuICAgIH1cblxuICAgIGFkZEV2ZW50TGlzdGVuZXIoKSB7IHRocm93IG5ldyBFcnJvcigpOyB9XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigpIHsgdGhyb3cgbmV3IEVycm9yKCk7IH1cbiAgICBkaXNwYXRjaEV2ZW50KCk6IGJvb2xlYW4geyB0aHJvdyBuZXcgRXJyb3IoKTsgfVxuXG4gICAgc3RhdGljIENMT1NFRCA9IFdlYlNvY2tldC5DTE9TRUQ7XG4gICAgc3RhdGljIENMT1NJTkcgPSBXZWJTb2NrZXQuQ0xPU0lORztcbiAgICBzdGF0aWMgQ09OTkVDVElORyA9IFdlYlNvY2tldC5DT05ORUNUSU5HO1xuICAgIHN0YXRpYyBPUEVOID0gV2ViU29ja2V0Lk9QRU47XG4gIH07XG5cbi8vIE1PQ0sgc2VydmljZXMgKHRvcC1sZXZlbCBhZ2dyZWdhdGlvbiBvZiBhbGwgbW9ja3MpXG5cbmV4cG9ydCBjb25zdCBtb2NrU2VydmljZXMgPSAoc2VydmVyOiBTZXJ2ZXIsIHNjaGVkdWxlcjogVGVzdFNjaGVkdWxlcik6IERpcmVjdExpbmVFeHBvcnQuU2VydmljZXMgPT4gKHtcbiAgc2NoZWR1bGVyLFxuICBXZWJTb2NrZXQ6IG1vY2tXZWJTb2NrZXQoc2VydmVyKSxcbiAgYWpheDogbW9ja0FqYXgoc2VydmVyKSxcbiAgcmFuZG9tOiAoKSA9PiAwLFxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFDQSxJQUFBQSxLQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxJQUFBLEdBQUFELE9BQUE7QUFBMkMsU0FBQUUs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