@nlabs/reaktor 0.1.6 → 0.1.9

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.
Files changed (52) hide show
  1. package/lib/config.js +21 -12
  2. package/lib/data/conversations.js +69 -39
  3. package/lib/data/dynamodb.js +60 -27
  4. package/lib/data/email.js +50 -19
  5. package/lib/data/files.js +103 -46
  6. package/lib/data/groups.js +114 -67
  7. package/lib/data/images.js +168 -100
  8. package/lib/data/index.js +234 -24
  9. package/lib/data/ios.js +48 -23
  10. package/lib/data/locations.js +45 -29
  11. package/lib/data/messages.d.ts +2 -2
  12. package/lib/data/messages.js +105 -72
  13. package/lib/data/notifications.js +31 -14
  14. package/lib/data/payments.js +164 -114
  15. package/lib/data/posts.js +144 -87
  16. package/lib/data/reactions.js +58 -33
  17. package/lib/data/s3.js +54 -24
  18. package/lib/data/search.js +32 -19
  19. package/lib/data/sms.js +35 -15
  20. package/lib/data/subscription.js +78 -51
  21. package/lib/data/tags.js +90 -51
  22. package/lib/data/users.js +118 -70
  23. package/lib/index.js +42 -8
  24. package/lib/types/apps.js +1 -1
  25. package/lib/types/arangodb.js +1 -1
  26. package/lib/types/auth.js +1 -1
  27. package/lib/types/conversations.js +1 -1
  28. package/lib/types/email.js +1 -1
  29. package/lib/types/files.js +1 -1
  30. package/lib/types/google.js +1 -1
  31. package/lib/types/groups.js +1 -1
  32. package/lib/types/images.js +1 -1
  33. package/lib/types/index.js +210 -22
  34. package/lib/types/locations.js +1 -1
  35. package/lib/types/messages.d.ts +12 -7
  36. package/lib/types/messages.js +1 -1
  37. package/lib/types/notifications.js +1 -1
  38. package/lib/types/payments.js +1 -1
  39. package/lib/types/posts.js +1 -1
  40. package/lib/types/reactions.js +1 -1
  41. package/lib/types/tags.js +1 -1
  42. package/lib/types/users.d.ts +0 -1
  43. package/lib/types/users.js +1 -1
  44. package/lib/utils/analytics.js +23 -11
  45. package/lib/utils/arangodb.js +52 -19
  46. package/lib/utils/auth.js +31 -15
  47. package/lib/utils/graphql.js +16 -4
  48. package/lib/utils/index.js +78 -11
  49. package/lib/utils/objects.js +30 -10
  50. package/lib/utils/redis.js +21 -8
  51. package/package.json +11 -11
  52. package/index.d.ts +0 -1
@@ -1,3 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isGrouped = exports.getGroupsByReaction = exports.deleteGroup = exports.updateGroup = exports.addGroup = exports.createGroupEdge = exports.getGroupDetails = exports.getGroup = exports.getGroupListByTags = exports.getGroupListByUser = exports.getGroupList = void 0;
7
+
8
+ var _utils = require("@nlabs/utils");
9
+
10
+ var _arangojs = require("arangojs");
11
+
12
+ var _flatten = _interopRequireDefault(require("lodash/flatten"));
13
+
14
+ var _uniqBy = _interopRequireDefault(require("lodash/uniqBy"));
15
+
16
+ var _utils2 = require("../utils");
17
+
18
+ var _tags = require("./tags");
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
1
22
  function _templateObject7() {
2
23
  var data = _taggedTemplateLiteral(["FOR g IN groups\n FILTER g._key == ", "\n FOR u IN INBOUND g._id isGrouped\n FILTER u._key == ", "\n LIMIT 1\n RETURN u"]);
3
24
 
@@ -70,27 +91,21 @@ function _templateObject() {
70
91
 
71
92
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
72
93
 
73
- import { createHash, parseChar, parseId } from '@nlabs/utils';
74
- import { aql } from 'arangojs';
75
- import flatten from 'lodash/flatten';
76
- import uniqBy from 'lodash/uniqBy';
77
- import { getLimit, logError, useDb } from '../utils';
78
- import { extractTags } from './tags';
79
94
  /**
80
95
  * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
81
96
  * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
82
97
  */
83
-
84
98
  var eventCategory = 'groups';
85
- export var getGroupList = function getGroupList(context, from, to) {
99
+
100
+ var getGroupList = function getGroupList(context, from, to) {
86
101
  var action = 'getListByApp';
87
102
  var database = context.database;
88
- var limit = getLimit(from, to);
103
+ var limit = (0, _utils2.getLimit)(from, to);
89
104
  var aqlQry = "FOR g in groups\n LET users = (\n FOR u, l IN OUTBOUND g._id isGrouped\n RETURN MERGE (u, {type:l.type})\n )\n ".concat(limit.aql, "\n SORT g.added\n RETURN DISTINCT MERGE(g, {users:users})");
90
- return useDb(database).query(aqlQry).then(function (cursor) {
105
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
91
106
  return cursor.all();
92
107
  }).catch(function (error) {
93
- return logError({
108
+ return (0, _utils2.logError)({
94
109
  action: action,
95
110
  category: eventCategory,
96
111
  label: 'db_error'
@@ -99,32 +114,38 @@ export var getGroupList = function getGroupList(context, from, to) {
99
114
  });
100
115
  });
101
116
  };
102
- export var getGroupListByUser = function getGroupListByUser(context, from, to) {
117
+
118
+ exports.getGroupList = getGroupList;
119
+
120
+ var getGroupListByUser = function getGroupListByUser(context, from, to) {
103
121
  // const action: string = 'getListByUser';
104
122
  var database = context.database,
105
123
  sessionId = context.userId;
106
- var limit = getLimit(from, to);
124
+ var limit = (0, _utils2.getLimit)(from, to);
107
125
  var aqlQry = "FOR g, e IN INBOUND \"".concat("users/".concat(sessionId), "\" isGrouped\n LET users = (\n FOR u, l IN OUTBOUND g._id isGrouped\n RETURN MERGE (u, {type:l.type})\n )\n ", limit.aql, "\n SORT g.added\n RETURN DISTINCT MERGE(g, {users:users})");
108
- return useDb(database).query(aqlQry).then(function (cursor) {
126
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
109
127
  return cursor.all();
110
128
  }).catch(function (error) {
111
129
  throw error;
112
130
  });
113
131
  };
114
- export var getGroupListByTags = function getGroupListByTags(context, tags, from, to) {
132
+
133
+ exports.getGroupListByUser = getGroupListByUser;
134
+
135
+ var getGroupListByTags = function getGroupListByTags(context, tags, from, to) {
115
136
  var action = 'getListByTags';
116
137
  var database = context.database;
117
138
  return Promise.all((tags || []).map(function (tagName) {
118
- var formatTagName = parseId(tagName);
119
- var limit = getLimit(from, to);
139
+ var formatTagName = (0, _utils.parseId)(tagName);
140
+ var limit = (0, _utils2.getLimit)(from, to);
120
141
  var aqlQry = "FOR p, e IN OUTBOUND \"".concat("tags/".concat(formatTagName), "\" isTagged\n FOR u IN users\n LET likes = (\n FOR post, like IN INBOUND p._id likes\n FILTER like.value == 'like'\n RETURN like\n )\n LET dislikes = (\n FOR post, like IN INBOUND p._id likes\n FILTER like.value == 'dislike'\n RETURN like\n )\n FILTER e.type == 'post' && p.userId == u._key\n ", limit.aql, "\n SORT p.added\n RETURN DISTINCT MERGE(p, {user:u, likes:LENGTH(likes), dislikes:LENGTH(dislikes)})");
121
- return useDb(database).query(aqlQry).then(function (cursor) {
142
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
122
143
  return cursor.all();
123
144
  });
124
145
  })).then(function (results) {
125
- return uniqBy(flatten(results), '_key');
146
+ return (0, _uniqBy.default)((0, _flatten.default)(results), '_key');
126
147
  }).catch(function (error) {
127
- return logError({
148
+ return (0, _utils2.logError)({
128
149
  action: action,
129
150
  category: eventCategory,
130
151
  label: 'db_error'
@@ -133,19 +154,22 @@ export var getGroupListByTags = function getGroupListByTags(context, tags, from,
133
154
  });
134
155
  });
135
156
  };
136
- export var getGroup = function getGroup(context, itemId) {
157
+
158
+ exports.getGroupListByTags = getGroupListByTags;
159
+
160
+ var getGroup = function getGroup(context, itemId) {
137
161
  var action = 'getItem';
138
162
  var database = context.database,
139
163
  sessionId = context.userId;
140
- var formatItemId = parseId(itemId);
141
- var aqlQry = aql(_templateObject(), "users/".concat(sessionId), formatItemId);
142
- return useDb(database).query(aqlQry).then(function (cursor) {
164
+ var formatItemId = (0, _utils.parseId)(itemId);
165
+ var aqlQry = (0, _arangojs.aql)(_templateObject(), "users/".concat(sessionId), formatItemId);
166
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
143
167
  return cursor.next();
144
168
  }).then(function () {
145
169
  var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
146
170
  return group;
147
171
  }).catch(function (error) {
148
- return logError({
172
+ return (0, _utils2.logError)({
149
173
  action: action,
150
174
  category: eventCategory,
151
175
  label: 'db_error'
@@ -154,18 +178,21 @@ export var getGroup = function getGroup(context, itemId) {
154
178
  });
155
179
  });
156
180
  };
157
- export var getGroupDetails = function getGroupDetails(context, groupId) {
181
+
182
+ exports.getGroup = getGroup;
183
+
184
+ var getGroupDetails = function getGroupDetails(context, groupId) {
158
185
  var action = 'getDetails';
159
186
  var database = context.database;
160
- var formatGroupId = parseId(groupId);
161
- var aqlQry = aql(_templateObject2(), formatGroupId);
162
- return useDb(database).query(aqlQry).then(function (cursor) {
187
+ var formatGroupId = (0, _utils.parseId)(groupId);
188
+ var aqlQry = (0, _arangojs.aql)(_templateObject2(), formatGroupId);
189
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
163
190
  return cursor.next();
164
191
  }).then(function () {
165
192
  var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
166
193
  return group;
167
194
  }).catch(function (error) {
168
- return logError({
195
+ return (0, _utils2.logError)({
169
196
  action: action,
170
197
  category: eventCategory,
171
198
  label: 'db_error'
@@ -174,21 +201,24 @@ export var getGroupDetails = function getGroupDetails(context, groupId) {
174
201
  });
175
202
  });
176
203
  };
177
- export var createGroupEdge = function createGroupEdge(database, userId, groupId, type) {
204
+
205
+ exports.getGroupDetails = getGroupDetails;
206
+
207
+ var createGroupEdge = function createGroupEdge(database, userId, groupId, type) {
178
208
  var action = 'createGroupEdge';
179
- var formatUserId = parseId(userId);
180
- var formatGroupId = parseId(groupId);
181
- var formatType = parseChar(type, 16);
209
+ var formatUserId = (0, _utils.parseId)(userId);
210
+ var formatGroupId = (0, _utils.parseId)(groupId);
211
+ var formatType = (0, _utils.parseChar)(type, 16);
182
212
  var now = Date.now();
183
- var edgeCollection = useDb(database).edgeCollection('isGrouped');
184
- var edgeId = createHash("group-".concat(formatUserId, "-").concat(formatGroupId));
213
+ var edgeCollection = (0, _utils2.useDb)(database).edgeCollection('isGrouped');
214
+ var edgeId = (0, _utils.createHash)("group-".concat(formatUserId, "-").concat(formatGroupId));
185
215
  var edge = {
186
216
  _key: edgeId,
187
217
  added: now,
188
218
  type: formatType
189
219
  };
190
220
  return edgeCollection.save(edge, "users/".concat(formatUserId), "groups/".concat(formatGroupId)).catch(function (error) {
191
- return logError({
221
+ return (0, _utils2.logError)({
192
222
  action: action,
193
223
  category: eventCategory,
194
224
  label: 'db_error'
@@ -199,7 +229,10 @@ export var createGroupEdge = function createGroupEdge(database, userId, groupId,
199
229
  });
200
230
  });
201
231
  };
202
- export var addGroup = function addGroup(context) {
232
+
233
+ exports.createGroupEdge = createGroupEdge;
234
+
235
+ var addGroup = function addGroup(context) {
203
236
  var item = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
204
237
  var action = 'add';
205
238
  var database = context.database,
@@ -210,9 +243,9 @@ export var addGroup = function addGroup(context) {
210
243
  _item$name = item.name,
211
244
  name = _item$name === void 0 ? 'Untitled' : _item$name,
212
245
  type = item.type;
213
- var id = createHash("group-".concat(sessionId));
246
+ var id = (0, _utils.createHash)("group-".concat(sessionId));
214
247
  var formatDesc = description.substr(0, 640);
215
- var formatType = parseChar(type, 16) || 'private';
248
+ var formatType = (0, _utils.parseChar)(type, 16) || 'private';
216
249
  var insert = {
217
250
  _key: id,
218
251
  added: now,
@@ -221,8 +254,8 @@ export var addGroup = function addGroup(context) {
221
254
  name: name,
222
255
  type: formatType
223
256
  };
224
- var db = useDb(database);
225
- var aqlQry = aql(_templateObject3(), insert);
257
+ var db = (0, _utils2.useDb)(database);
258
+ var aqlQry = (0, _arangojs.aql)(_templateObject3(), insert);
226
259
  return db.query(aqlQry).then(function (cursor) {
227
260
  return cursor.next();
228
261
  }).then(function () {
@@ -230,13 +263,13 @@ export var addGroup = function addGroup(context) {
230
263
  var itemType = 'groups'; // Update linked tags
231
264
 
232
265
  var groupId = group._key;
233
- return extractTags(db, itemType, groupId, formatDesc).then(function () {
266
+ return (0, _tags.extractTags)(db, itemType, groupId, formatDesc).then(function () {
234
267
  return createGroupEdge(database, sessionId, groupId, 'admin').then(function () {
235
268
  return group;
236
269
  });
237
270
  });
238
271
  }).catch(function (error) {
239
- return logError({
272
+ return (0, _utils2.logError)({
240
273
  action: action,
241
274
  category: eventCategory,
242
275
  label: 'db_error'
@@ -245,7 +278,10 @@ export var addGroup = function addGroup(context) {
245
278
  });
246
279
  });
247
280
  };
248
- export var updateGroup = function updateGroup(context) {
281
+
282
+ exports.addGroup = addGroup;
283
+
284
+ var updateGroup = function updateGroup(context) {
249
285
  var item = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
250
286
  var action = 'update';
251
287
  var database = context.database;
@@ -254,7 +290,7 @@ export var updateGroup = function updateGroup(context) {
254
290
  id = item.id,
255
291
  _item$name2 = item.name,
256
292
  name = _item$name2 === void 0 ? 'Untitled' : _item$name2;
257
- var itemId = parseId(id);
293
+ var itemId = (0, _utils.parseId)(id);
258
294
  var now = Date.now();
259
295
  var formatDesc = description.substr(0, 640);
260
296
  var update = {
@@ -262,8 +298,8 @@ export var updateGroup = function updateGroup(context) {
262
298
  modified: now,
263
299
  name: name
264
300
  };
265
- var db = useDb(database);
266
- var aqlQry = aql(_templateObject4(), itemId, update);
301
+ var db = (0, _utils2.useDb)(database);
302
+ var aqlQry = (0, _arangojs.aql)(_templateObject4(), itemId, update);
267
303
  return db.query(aqlQry).then(function (cursor) {
268
304
  return cursor.next();
269
305
  }).then(function () {
@@ -271,11 +307,11 @@ export var updateGroup = function updateGroup(context) {
271
307
  var groupKey = group._key;
272
308
  var itemType = 'groups'; // Update linked tags
273
309
 
274
- return extractTags(db, itemType, groupKey, description).then(function () {
310
+ return (0, _tags.extractTags)(db, itemType, groupKey, description).then(function () {
275
311
  return group;
276
312
  });
277
313
  }).catch(function (error) {
278
- return logError({
314
+ return (0, _utils2.logError)({
279
315
  action: action,
280
316
  category: eventCategory,
281
317
  label: 'db_error'
@@ -284,18 +320,21 @@ export var updateGroup = function updateGroup(context) {
284
320
  });
285
321
  });
286
322
  };
287
- export var deleteGroup = function deleteGroup(context, itemId) {
323
+
324
+ exports.updateGroup = updateGroup;
325
+
326
+ var deleteGroup = function deleteGroup(context, itemId) {
288
327
  var action = 'delete';
289
328
  var database = context.database;
290
- var formatItemId = parseId(itemId);
291
- var aqlQry = aql(_templateObject5(), formatItemId);
292
- return useDb(database).query(aqlQry).then(function (cursor) {
329
+ var formatItemId = (0, _utils.parseId)(itemId);
330
+ var aqlQry = (0, _arangojs.aql)(_templateObject5(), formatItemId);
331
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
293
332
  return cursor.next();
294
333
  }).then(function () {
295
334
  var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
296
335
  return group;
297
336
  }).catch(function (error) {
298
- return logError({
337
+ return (0, _utils2.logError)({
299
338
  action: action,
300
339
  category: eventCategory,
301
340
  label: 'db_error'
@@ -304,18 +343,21 @@ export var deleteGroup = function deleteGroup(context, itemId) {
304
343
  });
305
344
  });
306
345
  };
307
- export var getGroupsByReaction = function getGroupsByReaction(context, reaction) {
346
+
347
+ exports.deleteGroup = deleteGroup;
348
+
349
+ var getGroupsByReaction = function getGroupsByReaction(context, reaction) {
308
350
  var action = 'getGroupsByReaction';
309
351
  var database = context.database,
310
352
  sessionId = context.userId;
311
- var formatReaction = parseChar(reaction, 32);
353
+ var formatReaction = (0, _utils.parseChar)(reaction, 32);
312
354
  var userDocId = "users/".concat(sessionId); // Query
313
355
 
314
- var aqlQry = aql(_templateObject6(), userDocId, formatReaction);
315
- return useDb(database).query(aqlQry).then(function (cursor) {
356
+ var aqlQry = (0, _arangojs.aql)(_templateObject6(), userDocId, formatReaction);
357
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
316
358
  return cursor.all();
317
359
  }).catch(function (error) {
318
- return logError({
360
+ return (0, _utils2.logError)({
319
361
  action: action,
320
362
  category: eventCategory,
321
363
  label: 'db_error'
@@ -324,12 +366,15 @@ export var getGroupsByReaction = function getGroupsByReaction(context, reaction)
324
366
  });
325
367
  });
326
368
  };
327
- export var isGrouped = function isGrouped(database, userId, groupId) {
369
+
370
+ exports.getGroupsByReaction = getGroupsByReaction;
371
+
372
+ var isGrouped = function isGrouped(database, userId, groupId) {
328
373
  var action = 'isGrouped';
329
- var formatUserId = parseId(userId);
330
- var formatGroupId = parseId(groupId);
331
- var aqlQry = aql(_templateObject7(), formatGroupId, formatUserId);
332
- return useDb(database).query(aqlQry).then(function (cursor) {
374
+ var formatUserId = (0, _utils.parseId)(userId);
375
+ var formatGroupId = (0, _utils.parseId)(groupId);
376
+ var aqlQry = (0, _arangojs.aql)(_templateObject7(), formatGroupId, formatUserId);
377
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
333
378
  return cursor.all();
334
379
  }).then(function () {
335
380
  var results = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
@@ -340,7 +385,7 @@ export var isGrouped = function isGrouped(database, userId, groupId) {
340
385
  userId: userId
341
386
  };
342
387
  }).catch(function (error) {
343
- return logError({
388
+ return (0, _utils2.logError)({
344
389
  action: action,
345
390
  category: eventCategory,
346
391
  label: 'db_error'
@@ -351,4 +396,6 @@ export var isGrouped = function isGrouped(database, userId, groupId) {
351
396
  });
352
397
  });
353
398
  };
354
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2dyb3Vwcy50cyJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwicGFyc2VDaGFyIiwicGFyc2VJZCIsImFxbCIsImZsYXR0ZW4iLCJ1bmlxQnkiLCJnZXRMaW1pdCIsImxvZ0Vycm9yIiwidXNlRGIiLCJleHRyYWN0VGFncyIsImV2ZW50Q2F0ZWdvcnkiLCJnZXRHcm91cExpc3QiLCJjb250ZXh0IiwiZnJvbSIsInRvIiwiYWN0aW9uIiwiZGF0YWJhc2UiLCJsaW1pdCIsImFxbFFyeSIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsImFsbCIsImNhdGNoIiwiZXJyb3IiLCJjYXRlZ29yeSIsImxhYmVsIiwiZ2V0R3JvdXBMaXN0QnlVc2VyIiwic2Vzc2lvbklkIiwidXNlcklkIiwiZ2V0R3JvdXBMaXN0QnlUYWdzIiwidGFncyIsIlByb21pc2UiLCJtYXAiLCJ0YWdOYW1lIiwiZm9ybWF0VGFnTmFtZSIsInJlc3VsdHMiLCJnZXRHcm91cCIsIml0ZW1JZCIsImZvcm1hdEl0ZW1JZCIsIm5leHQiLCJncm91cCIsImdldEdyb3VwRGV0YWlscyIsImdyb3VwSWQiLCJmb3JtYXRHcm91cElkIiwiY3JlYXRlR3JvdXBFZGdlIiwidHlwZSIsImZvcm1hdFVzZXJJZCIsImZvcm1hdFR5cGUiLCJub3ciLCJEYXRlIiwiZWRnZUNvbGxlY3Rpb24iLCJlZGdlSWQiLCJlZGdlIiwiX2tleSIsImFkZGVkIiwic2F2ZSIsImlkIiwiYWRkR3JvdXAiLCJpdGVtIiwiZGVzY3JpcHRpb24iLCJuYW1lIiwiZm9ybWF0RGVzYyIsInN1YnN0ciIsImluc2VydCIsIm1vZGlmaWVkIiwiZGIiLCJpdGVtVHlwZSIsInVwZGF0ZUdyb3VwIiwidXBkYXRlIiwiZ3JvdXBLZXkiLCJkZWxldGVHcm91cCIsImdldEdyb3Vwc0J5UmVhY3Rpb24iLCJyZWFjdGlvbiIsImZvcm1hdFJlYWN0aW9uIiwidXNlckRvY0lkIiwiaXNHcm91cGVkIiwiaXNWYWxpZCIsImxlbmd0aCJd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akIsUUFBUSxDQUFDO0FBQ2hDUSxNQUFBQSxNQUFNLEVBQU5BLE1BRGdDO0FBRWhDVSxNQUFBQSxRQUFRLEVBQUVmLGFBRnNCO0FBR2hDZ0IsTUFBQUEsS0FBSyxFQUFFO0FBSHlCLEtBQUQsRUFJOUJGLEtBSjhCLEVBSXZCO0FBQUNpQyxNQUFBQSxFQUFFLEVBQUU1QjtBQUFMLEtBSnVCLENBQVIsQ0FJRFQsSUFKQyxDQUlJO0FBQUEsYUFBTSxJQUFOO0FBQUEsS0FKSixDQUFsQjtBQUFBLEdBWEYsQ0FBUDtBQWdCRCxDQTNCTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VDaGFyLCBwYXJzZUlkfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWwsIERhdGFiYXNlfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9saWIvY2pzL2FxbC1xdWVyeSc7XG5pbXBvcnQge0FycmF5Q3Vyc29yfSBmcm9tICdhcmFuZ29qcy9saWIvY2pzL2N1cnNvcic7XG5pbXBvcnQgZmxhdHRlbiBmcm9tICdsb2Rhc2gvZmxhdHRlbic7XG5pbXBvcnQgdW5pcUJ5IGZyb20gJ2xvZGFzaC91bmlxQnknO1xuXG5pbXBvcnQge0FyYW5nb0RCTGltaXR9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiJztcbmltcG9ydCB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aCc7XG5pbXBvcnQge0dyb3VwRWRnZVR5cGUsIEdyb3VwVHlwZSwgR3JvdXBVc2VyVHlwZX0gZnJvbSAnLi4vdHlwZXMvZ3JvdXBzJztcbmltcG9ydCB7Z2V0TGltaXQsIGxvZ0Vycm9yLCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtleHRyYWN0VGFnc30gZnJvbSAnLi90YWdzJztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ2dyb3Vwcyc7XG5cbmV4cG9ydCBjb25zdCBnZXRHcm91cExpc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTxHcm91cFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlBcHAnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgbGltaXQ6IEFyYW5nb0RCTGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBnIGluIGdyb3Vwc1xuICAgICAgTEVUIHVzZXJzID0gKFxuICAgICAgICBGT1IgdSwgbCBJTiBPVVRCT1VORCBnLl9pZCBpc0dyb3VwZWRcbiAgICAgICAgUkVUVVJOIE1FUkdFICh1LCB7dHlwZTpsLnR5cGV9KVxuICAgICAgKVxuICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICBTT1JUIGcuYWRkZWRcbiAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShnLCB7dXNlcnM6dXNlcnN9KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHcm91cExpc3RCeVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTxHcm91cFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCBsaW1pdDogQXJhbmdvREJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIGcsIGUgSU4gSU5CT1VORCBcIiR7YHVzZXJzLyR7c2Vzc2lvbklkfWB9XCIgaXNHcm91cGVkXG4gICAgICBMRVQgdXNlcnMgPSAoXG4gICAgICAgIEZPUiB1LCBsIElOIE9VVEJPVU5EIGcuX2lkIGlzR3JvdXBlZFxuICAgICAgICBSRVRVUk4gTUVSR0UgKHUsIHt0eXBlOmwudHlwZX0pXG4gICAgICApXG4gICAgICAke2xpbWl0LmFxbH1cbiAgICAgIFNPUlQgZy5hZGRlZFxuICAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKGcsIHt1c2Vyczp1c2Vyc30pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHcm91cExpc3RCeVRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRhZ3M6IHN0cmluZ1tdLFxuICBmcm9tOiBudW1iZXIsXG4gIHRvOiBudW1iZXJcbik6IFByb21pc2U8R3JvdXBUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5VGFncyc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuXG4gIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAodGFncyB8fCBbXSkubWFwKCh0YWdOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1hdFRhZ05hbWU6IHN0cmluZyA9IHBhcnNlSWQodGFnTmFtZSk7XG4gICAgICBjb25zdCBsaW1pdDogQXJhbmdvREJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgICAgIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwLCBlIElOIE9VVEJPVU5EIFwiJHtgdGFncy8ke2Zvcm1hdFRhZ05hbWV9YH1cIiBpc1RhZ2dlZFxuICAgICAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICAgICAgTEVUIGxpa2VzID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIGxpa2UgSU4gSU5CT1VORCBwLl9pZCBsaWtlc1xuICAgICAgICAgICAgRklMVEVSIGxpa2UudmFsdWUgPT0gJ2xpa2UnXG4gICAgICAgICAgICBSRVRVUk4gbGlrZVxuICAgICAgICAgIClcbiAgICAgICAgICBMRVQgZGlzbGlrZXMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgbGlrZSBJTiBJTkJPVU5EIHAuX2lkIGxpa2VzXG4gICAgICAgICAgICBGSUxURVIgbGlrZS52YWx1ZSA9PSAnZGlzbGlrZSdcbiAgICAgICAgICAgIFJFVFVSTiBsaWtlXG4gICAgICAgICAgKVxuICAgICAgICAgIEZJTFRFUiBlLnR5cGUgPT0gJ3Bvc3QnICYmIHAudXNlcklkID09IHUuX2tleVxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7dXNlcjp1LCBsaWtlczpMRU5HVEgobGlrZXMpLCBkaXNsaWtlczpMRU5HVEgoZGlzbGlrZXMpfSlgO1xuXG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSkudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbiAgICB9KVxuICApXG4gICAgLnRoZW4oKHJlc3VsdHMpID0+IHVuaXFCeShmbGF0dGVuKHJlc3VsdHMpLCAnX2tleScpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdyb3VwID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxHcm91cFR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKGl0ZW1JZCk7XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZywgZSBJTiBJTkJPVU5EICR7YHVzZXJzLyR7c2Vzc2lvbklkfWB9IGlzR3JvdXBlZFxuICAgICAgRklMVEVSIGcuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH1cbiAgICAgIExFVCB1c2VycyA9IChcbiAgICAgICAgRk9SIHUsIGwgSU4gT1VUQk9VTkQgZy5faWQgaXNHcm91cGVkXG4gICAgICAgIFJFVFVSTiBNRVJHRSAodSwge3R5cGU6bC50eXBlfSlcbiAgICAgIClcbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShnLCB7dXNlcnM6dXNlcnN9KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGdyb3VwOiBHcm91cFR5cGUgPSB7fSkgPT4gZ3JvdXApXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R3JvdXBEZXRhaWxzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGdyb3VwSWQ6IHN0cmluZyk6IFByb21pc2U8R3JvdXBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldERldGFpbHMnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0R3JvdXBJZDogc3RyaW5nID0gcGFyc2VJZChncm91cElkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZyBJTiBncm91cHNcbiAgICAgIEZJTFRFUiBnLl9rZXkgPT0gJHtmb3JtYXRHcm91cElkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVUVVJOIGdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChncm91cDogR3JvdXBUeXBlID0ge30pID0+IGdyb3VwKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUdyb3VwRWRnZSA9IChcbiAgZGF0YWJhc2U6IHN0cmluZyxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGdyb3VwSWQ6IHN0cmluZyxcbiAgdHlwZTogc3RyaW5nXG4pOiBQcm9taXNlPEdyb3VwRWRnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnY3JlYXRlR3JvdXBFZGdlJztcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGZvcm1hdEdyb3VwSWQ6IHN0cmluZyA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4gIGNvbnN0IGZvcm1hdFR5cGU6IHN0cmluZyA9IHBhcnNlQ2hhcih0eXBlLCAxNik7XG5cbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlKS5lZGdlQ29sbGVjdGlvbignaXNHcm91cGVkJyk7XG4gIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgZ3JvdXAtJHtmb3JtYXRVc2VySWR9LSR7Zm9ybWF0R3JvdXBJZH1gKTtcblxuICBjb25zdCBlZGdlOiBhbnkgPSB7XG4gICAgX2tleTogZWRnZUlkLFxuICAgIGFkZGVkOiBub3csXG4gICAgdHlwZTogZm9ybWF0VHlwZVxuICB9O1xuXG4gIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIGB1c2Vycy8ke2Zvcm1hdFVzZXJJZH1gLCBgZ3JvdXBzLyR7Zm9ybWF0R3JvdXBJZH1gKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHtpZDogZm9ybWF0VXNlcklkfSkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkR3JvdXAgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbTogR3JvdXBUeXBlID0ge30pOiBQcm9taXNlPEdyb3VwVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qge1xuICAgIGRlc2NyaXB0aW9uID0gJycsXG4gICAgbmFtZSA9ICdVbnRpdGxlZCcsXG4gICAgdHlwZVxuICB9OiBHcm91cFR5cGUgPSBpdGVtO1xuICBjb25zdCBpZDogc3RyaW5nID0gY3JlYXRlSGFzaChgZ3JvdXAtJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGZvcm1hdERlc2M6IHN0cmluZyA9IGRlc2NyaXB0aW9uLnN1YnN0cigwLCA2NDApO1xuICBjb25zdCBmb3JtYXRUeXBlOiBzdHJpbmcgPSBwYXJzZUNoYXIodHlwZSwgMTYpIHx8ICdwcml2YXRlJztcbiAgY29uc3QgaW5zZXJ0OiBHcm91cFR5cGUgPSB7XG4gICAgX2tleTogaWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBkZXNjcmlwdGlvbjogZm9ybWF0RGVzYyxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWUsXG4gICAgdHlwZTogZm9ybWF0VHlwZVxuICB9O1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBncm91cHMgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoZ3JvdXA6IEdyb3VwVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBpdGVtVHlwZTogc3RyaW5nID0gJ2dyb3Vwcyc7XG5cbiAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgdGFnc1xuICAgICAgY29uc3Qge19rZXk6IGdyb3VwSWR9OiBHcm91cFR5cGUgPSBncm91cDtcbiAgICAgIHJldHVybiBleHRyYWN0VGFncyhkYiwgaXRlbVR5cGUsIGdyb3VwSWQsIGZvcm1hdERlc2MpXG4gICAgICAgIC50aGVuKCgpID0+IGNyZWF0ZUdyb3VwRWRnZShkYXRhYmFzZSwgc2Vzc2lvbklkLCBncm91cElkLCAnYWRtaW4nKS50aGVuKCgpID0+IGdyb3VwKSk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVHcm91cCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtOiBHcm91cFR5cGUgPSB7fSk6IFByb21pc2U8R3JvdXBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZGVzY3JpcHRpb24gPSAnJyxcbiAgICBpZCxcbiAgICBuYW1lID0gJ1VudGl0bGVkJ1xuICB9OiBHcm91cFR5cGUgPSBpdGVtO1xuICBjb25zdCBpdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaWQpO1xuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IGZvcm1hdERlc2M6IHN0cmluZyA9IGRlc2NyaXB0aW9uLnN1YnN0cigwLCA2NDApO1xuICBjb25zdCB1cGRhdGU6IGFueSA9IHtcbiAgICBkZXNjcmlwdGlvbjogZm9ybWF0RGVzYyxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWVcbiAgfTtcbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2UpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke2l0ZW1JZH0gV0lUSCAke3VwZGF0ZX0gSU4gZ3JvdXBzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGdyb3VwOiBHcm91cFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IGdyb3VwS2V5fSA9IGdyb3VwO1xuICAgICAgY29uc3QgaXRlbVR5cGU6IHN0cmluZyA9ICdncm91cHMnO1xuXG4gICAgICAvLyBVcGRhdGUgbGlua2VkIHRhZ3NcbiAgICAgIHJldHVybiBleHRyYWN0VGFncyhkYiwgaXRlbVR5cGUsIGdyb3VwS2V5LCBkZXNjcmlwdGlvbikudGhlbigoKSA9PiBncm91cCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVHcm91cCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8R3JvdXBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaXRlbUlkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZyBJTiBncm91cHNcbiAgICAgIEZJTFRFUiBnLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICBSRU1PVkUgZyBJTiBncm91cHNcbiAgICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChncm91cDogR3JvdXBUeXBlID0ge30pID0+IGdyb3VwKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdyb3Vwc0J5UmVhY3Rpb24gPSAoY29udGV4dDogQXBpQ29udGV4dCwgcmVhY3Rpb246IHN0cmluZyk6IFByb21pc2U8R3JvdXBUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0R3JvdXBzQnlSZWFjdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb246IHN0cmluZyA9IHBhcnNlQ2hhcihyZWFjdGlvbiwgMzIpO1xuICBjb25zdCB1c2VyRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuXG4gIC8vIFF1ZXJ5XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHUsIHIgSU4gT1VUQk9VTkQgJHt1c2VyRG9jSWR9IGhhc1JlYWN0aW9uXG4gICAgICBGSUxURVIgci52YWx1ZSA9PSAke2Zvcm1hdFJlYWN0aW9ufVxuICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgUkVUVVJOIHt2YWx1ZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9YDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzR3JvdXBlZCA9IChkYXRhYmFzZTogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogUHJvbWlzZTxHcm91cFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2lzR3JvdXBlZCc7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBmb3JtYXRHcm91cElkOiBzdHJpbmcgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBnIElOIGdyb3Vwc1xuICAgIEZJTFRFUiBnLl9rZXkgPT0gJHtmb3JtYXRHcm91cElkfVxuICAgIEZPUiB1IElOIElOQk9VTkQgZy5faWQgaXNHcm91cGVkXG4gICAgRklMVEVSIHUuX2tleSA9PSAke2Zvcm1hdFVzZXJJZH1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHJlc3VsdHMgPSBbXSkgPT4ge1xuICAgICAgY29uc3QgaXNWYWxpZCA9ICEhcmVzdWx0cy5sZW5ndGg7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIGlzVmFsaWQsXG4gICAgICAgIHVzZXJJZFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHtpZDogdXNlcklkfSkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuIl19
399
+
400
+ exports.isGrouped = isGrouped;
401
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2dyb3Vwcy50cyJdLCJuYW1lcyI6WyJldmVudENhdGVnb3J5IiwiZ2V0R3JvdXBMaXN0IiwiY29udGV4dCIsImZyb20iLCJ0byIsImFjdGlvbiIsImRhdGFiYXNlIiwibGltaXQiLCJhcWxRcnkiLCJhcWwiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJhbGwiLCJjYXRjaCIsImVycm9yIiwiY2F0ZWdvcnkiLCJsYWJlbCIsImdldEdyb3VwTGlzdEJ5VXNlciIsInNlc3Npb25JZCIsInVzZXJJZCIsImdldEdyb3VwTGlzdEJ5VGFncyIsInRhZ3MiLCJQcm9taXNlIiwibWFwIiwidGFnTmFtZSIsImZvcm1hdFRhZ05hbWUiLCJyZXN1bHRzIiwiZ2V0R3JvdXAiLCJpdGVtSWQiLCJmb3JtYXRJdGVtSWQiLCJuZXh0IiwiZ3JvdXAiLCJnZXRHcm91cERldGFpbHMiLCJncm91cElkIiwiZm9ybWF0R3JvdXBJZCIsImNyZWF0ZUdyb3VwRWRnZSIsInR5cGUiLCJmb3JtYXRVc2VySWQiLCJmb3JtYXRUeXBlIiwibm93IiwiRGF0ZSIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZUlkIiwiZWRnZSIsIl9rZXkiLCJhZGRlZCIsInNhdmUiLCJpZCIsImFkZEdyb3VwIiwiaXRlbSIsImRlc2NyaXB0aW9uIiwibmFtZSIsImZvcm1hdERlc2MiLCJzdWJzdHIiLCJpbnNlcnQiLCJtb2RpZmllZCIsImRiIiwiaXRlbVR5cGUiLCJ1cGRhdGVHcm91cCIsInVwZGF0ZSIsImdyb3VwS2V5IiwiZGVsZXRlR3JvdXAiLCJnZXRHcm91cHNCeVJlYWN0aW9uIiwicmVhY3Rpb24iLCJmb3JtYXRSZWFjdGlvbiIsInVzZXJEb2NJZCIsImlzR3JvdXBlZCIsImlzVmFsaWQiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFLQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QURELEVBRUpGLElBRkksQ0FFQyxZQUFrQjtBQUFBLFFBQWpCZ0IsT0FBaUIsdUVBQVAsRUFBTztBQUN0QixRQUFNeUMsT0FBTyxHQUFHLENBQUMsQ0FBQ3pDLE9BQU8sQ0FBQzBDLE1BQTFCO0FBRUEsV0FBTztBQUNMbkMsTUFBQUEsT0FBTyxFQUFQQSxPQURLO0FBRUxrQyxNQUFBQSxPQUFPLEVBQVBBLE9BRks7QUFHTGhELE1BQUFBLE1BQU0sRUFBTkE7QUFISyxLQUFQO0FBS0QsR0FWSSxFQVdKTixLQVhJLENBV0UsVUFBQ0MsS0FBRDtBQUFBLFdBQWtCLHNCQUFTO0FBQ2hDVixNQUFBQSxNQUFNLEVBQU5BLE1BRGdDO0FBRWhDVyxNQUFBQSxRQUFRLEVBQUVoQixhQUZzQjtBQUdoQ2lCLE1BQUFBLEtBQUssRUFBRTtBQUh5QixLQUFULEVBSXRCRixLQUpzQixFQUlmO0FBQUNpQyxNQUFBQSxFQUFFLEVBQUU1QjtBQUFMLEtBSmUsRUFJRFQsSUFKQyxDQUlJO0FBQUEsYUFBTSxJQUFOO0FBQUEsS0FKSixDQUFsQjtBQUFBLEdBWEYsQ0FBUDtBQWdCRCxDQTNCTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VDaGFyLCBwYXJzZUlkfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWwsIERhdGFiYXNlfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9saWIvY2pzL2FxbC1xdWVyeSc7XG5pbXBvcnQge0FycmF5Q3Vyc29yfSBmcm9tICdhcmFuZ29qcy9saWIvY2pzL2N1cnNvcic7XG5pbXBvcnQgZmxhdHRlbiBmcm9tICdsb2Rhc2gvZmxhdHRlbic7XG5pbXBvcnQgdW5pcUJ5IGZyb20gJ2xvZGFzaC91bmlxQnknO1xuXG5pbXBvcnQge0FyYW5nb0RCTGltaXR9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiJztcbmltcG9ydCB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aCc7XG5pbXBvcnQge0dyb3VwRWRnZVR5cGUsIEdyb3VwVHlwZSwgR3JvdXBVc2VyVHlwZX0gZnJvbSAnLi4vdHlwZXMvZ3JvdXBzJztcbmltcG9ydCB7Z2V0TGltaXQsIGxvZ0Vycm9yLCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtleHRyYWN0VGFnc30gZnJvbSAnLi90YWdzJztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ2dyb3Vwcyc7XG5cbmV4cG9ydCBjb25zdCBnZXRHcm91cExpc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTxHcm91cFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlBcHAnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgbGltaXQ6IEFyYW5nb0RCTGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBnIGluIGdyb3Vwc1xuICAgICAgTEVUIHVzZXJzID0gKFxuICAgICAgICBGT1IgdSwgbCBJTiBPVVRCT1VORCBnLl9pZCBpc0dyb3VwZWRcbiAgICAgICAgUkVUVVJOIE1FUkdFICh1LCB7dHlwZTpsLnR5cGV9KVxuICAgICAgKVxuICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICBTT1JUIGcuYWRkZWRcbiAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShnLCB7dXNlcnM6dXNlcnN9KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHcm91cExpc3RCeVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTxHcm91cFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCBsaW1pdDogQXJhbmdvREJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIGcsIGUgSU4gSU5CT1VORCBcIiR7YHVzZXJzLyR7c2Vzc2lvbklkfWB9XCIgaXNHcm91cGVkXG4gICAgICBMRVQgdXNlcnMgPSAoXG4gICAgICAgIEZPUiB1LCBsIElOIE9VVEJPVU5EIGcuX2lkIGlzR3JvdXBlZFxuICAgICAgICBSRVRVUk4gTUVSR0UgKHUsIHt0eXBlOmwudHlwZX0pXG4gICAgICApXG4gICAgICAke2xpbWl0LmFxbH1cbiAgICAgIFNPUlQgZy5hZGRlZFxuICAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKGcsIHt1c2Vyczp1c2Vyc30pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHcm91cExpc3RCeVRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRhZ3M6IHN0cmluZ1tdLFxuICBmcm9tOiBudW1iZXIsXG4gIHRvOiBudW1iZXJcbik6IFByb21pc2U8R3JvdXBUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5VGFncyc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuXG4gIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAodGFncyB8fCBbXSkubWFwKCh0YWdOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1hdFRhZ05hbWU6IHN0cmluZyA9IHBhcnNlSWQodGFnTmFtZSk7XG4gICAgICBjb25zdCBsaW1pdDogQXJhbmdvREJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgICAgIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwLCBlIElOIE9VVEJPVU5EIFwiJHtgdGFncy8ke2Zvcm1hdFRhZ05hbWV9YH1cIiBpc1RhZ2dlZFxuICAgICAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICAgICAgTEVUIGxpa2VzID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIGxpa2UgSU4gSU5CT1VORCBwLl9pZCBsaWtlc1xuICAgICAgICAgICAgRklMVEVSIGxpa2UudmFsdWUgPT0gJ2xpa2UnXG4gICAgICAgICAgICBSRVRVUk4gbGlrZVxuICAgICAgICAgIClcbiAgICAgICAgICBMRVQgZGlzbGlrZXMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgbGlrZSBJTiBJTkJPVU5EIHAuX2lkIGxpa2VzXG4gICAgICAgICAgICBGSUxURVIgbGlrZS52YWx1ZSA9PSAnZGlzbGlrZSdcbiAgICAgICAgICAgIFJFVFVSTiBsaWtlXG4gICAgICAgICAgKVxuICAgICAgICAgIEZJTFRFUiBlLnR5cGUgPT0gJ3Bvc3QnICYmIHAudXNlcklkID09IHUuX2tleVxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7dXNlcjp1LCBsaWtlczpMRU5HVEgobGlrZXMpLCBkaXNsaWtlczpMRU5HVEgoZGlzbGlrZXMpfSlgO1xuXG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSkudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbiAgICB9KVxuICApXG4gICAgLnRoZW4oKHJlc3VsdHMpID0+IHVuaXFCeShmbGF0dGVuKHJlc3VsdHMpLCAnX2tleScpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdyb3VwID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxHcm91cFR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKGl0ZW1JZCk7XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZywgZSBJTiBJTkJPVU5EICR7YHVzZXJzLyR7c2Vzc2lvbklkfWB9IGlzR3JvdXBlZFxuICAgICAgRklMVEVSIGcuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH1cbiAgICAgIExFVCB1c2VycyA9IChcbiAgICAgICAgRk9SIHUsIGwgSU4gT1VUQk9VTkQgZy5faWQgaXNHcm91cGVkXG4gICAgICAgIFJFVFVSTiBNRVJHRSAodSwge3R5cGU6bC50eXBlfSlcbiAgICAgIClcbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShnLCB7dXNlcnM6dXNlcnN9KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGdyb3VwOiBHcm91cFR5cGUgPSB7fSkgPT4gZ3JvdXApXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R3JvdXBEZXRhaWxzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGdyb3VwSWQ6IHN0cmluZyk6IFByb21pc2U8R3JvdXBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldERldGFpbHMnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0R3JvdXBJZDogc3RyaW5nID0gcGFyc2VJZChncm91cElkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZyBJTiBncm91cHNcbiAgICAgIEZJTFRFUiBnLl9rZXkgPT0gJHtmb3JtYXRHcm91cElkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVUVVJOIGdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChncm91cDogR3JvdXBUeXBlID0ge30pID0+IGdyb3VwKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUdyb3VwRWRnZSA9IChcbiAgZGF0YWJhc2U6IHN0cmluZyxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGdyb3VwSWQ6IHN0cmluZyxcbiAgdHlwZTogc3RyaW5nXG4pOiBQcm9taXNlPEdyb3VwRWRnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnY3JlYXRlR3JvdXBFZGdlJztcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGZvcm1hdEdyb3VwSWQ6IHN0cmluZyA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4gIGNvbnN0IGZvcm1hdFR5cGU6IHN0cmluZyA9IHBhcnNlQ2hhcih0eXBlLCAxNik7XG5cbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlKS5lZGdlQ29sbGVjdGlvbignaXNHcm91cGVkJyk7XG4gIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgZ3JvdXAtJHtmb3JtYXRVc2VySWR9LSR7Zm9ybWF0R3JvdXBJZH1gKTtcblxuICBjb25zdCBlZGdlOiBhbnkgPSB7XG4gICAgX2tleTogZWRnZUlkLFxuICAgIGFkZGVkOiBub3csXG4gICAgdHlwZTogZm9ybWF0VHlwZVxuICB9O1xuXG4gIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIGB1c2Vycy8ke2Zvcm1hdFVzZXJJZH1gLCBgZ3JvdXBzLyR7Zm9ybWF0R3JvdXBJZH1gKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHtpZDogZm9ybWF0VXNlcklkfSkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkR3JvdXAgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbTogR3JvdXBUeXBlID0ge30pOiBQcm9taXNlPEdyb3VwVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qge1xuICAgIGRlc2NyaXB0aW9uID0gJycsXG4gICAgbmFtZSA9ICdVbnRpdGxlZCcsXG4gICAgdHlwZVxuICB9OiBHcm91cFR5cGUgPSBpdGVtO1xuICBjb25zdCBpZDogc3RyaW5nID0gY3JlYXRlSGFzaChgZ3JvdXAtJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGZvcm1hdERlc2M6IHN0cmluZyA9IGRlc2NyaXB0aW9uLnN1YnN0cigwLCA2NDApO1xuICBjb25zdCBmb3JtYXRUeXBlOiBzdHJpbmcgPSBwYXJzZUNoYXIodHlwZSwgMTYpIHx8ICdwcml2YXRlJztcbiAgY29uc3QgaW5zZXJ0OiBHcm91cFR5cGUgPSB7XG4gICAgX2tleTogaWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBkZXNjcmlwdGlvbjogZm9ybWF0RGVzYyxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWUsXG4gICAgdHlwZTogZm9ybWF0VHlwZVxuICB9O1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBncm91cHMgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoZ3JvdXA6IEdyb3VwVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBpdGVtVHlwZTogc3RyaW5nID0gJ2dyb3Vwcyc7XG5cbiAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgdGFnc1xuICAgICAgY29uc3Qge19rZXk6IGdyb3VwSWR9OiBHcm91cFR5cGUgPSBncm91cDtcbiAgICAgIHJldHVybiBleHRyYWN0VGFncyhkYiwgaXRlbVR5cGUsIGdyb3VwSWQsIGZvcm1hdERlc2MpXG4gICAgICAgIC50aGVuKCgpID0+IGNyZWF0ZUdyb3VwRWRnZShkYXRhYmFzZSwgc2Vzc2lvbklkLCBncm91cElkLCAnYWRtaW4nKS50aGVuKCgpID0+IGdyb3VwKSk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVHcm91cCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtOiBHcm91cFR5cGUgPSB7fSk6IFByb21pc2U8R3JvdXBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgZGVzY3JpcHRpb24gPSAnJyxcbiAgICBpZCxcbiAgICBuYW1lID0gJ1VudGl0bGVkJ1xuICB9OiBHcm91cFR5cGUgPSBpdGVtO1xuICBjb25zdCBpdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaWQpO1xuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IGZvcm1hdERlc2M6IHN0cmluZyA9IGRlc2NyaXB0aW9uLnN1YnN0cigwLCA2NDApO1xuICBjb25zdCB1cGRhdGU6IGFueSA9IHtcbiAgICBkZXNjcmlwdGlvbjogZm9ybWF0RGVzYyxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWVcbiAgfTtcbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2UpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke2l0ZW1JZH0gV0lUSCAke3VwZGF0ZX0gSU4gZ3JvdXBzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGdyb3VwOiBHcm91cFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IGdyb3VwS2V5fSA9IGdyb3VwO1xuICAgICAgY29uc3QgaXRlbVR5cGU6IHN0cmluZyA9ICdncm91cHMnO1xuXG4gICAgICAvLyBVcGRhdGUgbGlua2VkIHRhZ3NcbiAgICAgIHJldHVybiBleHRyYWN0VGFncyhkYiwgaXRlbVR5cGUsIGdyb3VwS2V5LCBkZXNjcmlwdGlvbikudGhlbigoKSA9PiBncm91cCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVHcm91cCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8R3JvdXBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaXRlbUlkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZyBJTiBncm91cHNcbiAgICAgIEZJTFRFUiBnLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICBSRU1PVkUgZyBJTiBncm91cHNcbiAgICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChncm91cDogR3JvdXBUeXBlID0ge30pID0+IGdyb3VwKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdyb3Vwc0J5UmVhY3Rpb24gPSAoY29udGV4dDogQXBpQ29udGV4dCwgcmVhY3Rpb246IHN0cmluZyk6IFByb21pc2U8R3JvdXBUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0R3JvdXBzQnlSZWFjdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb246IHN0cmluZyA9IHBhcnNlQ2hhcihyZWFjdGlvbiwgMzIpO1xuICBjb25zdCB1c2VyRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuXG4gIC8vIFF1ZXJ5XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHUsIHIgSU4gT1VUQk9VTkQgJHt1c2VyRG9jSWR9IGhhc1JlYWN0aW9uXG4gICAgICBGSUxURVIgci52YWx1ZSA9PSAke2Zvcm1hdFJlYWN0aW9ufVxuICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgUkVUVVJOIHt2YWx1ZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9YDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzR3JvdXBlZCA9IChkYXRhYmFzZTogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogUHJvbWlzZTxHcm91cFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2lzR3JvdXBlZCc7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBmb3JtYXRHcm91cElkOiBzdHJpbmcgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBnIElOIGdyb3Vwc1xuICAgIEZJTFRFUiBnLl9rZXkgPT0gJHtmb3JtYXRHcm91cElkfVxuICAgIEZPUiB1IElOIElOQk9VTkQgZy5faWQgaXNHcm91cGVkXG4gICAgRklMVEVSIHUuX2tleSA9PSAke2Zvcm1hdFVzZXJJZH1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHJlc3VsdHMgPSBbXSkgPT4ge1xuICAgICAgY29uc3QgaXNWYWxpZCA9ICEhcmVzdWx0cy5sZW5ndGg7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIGlzVmFsaWQsXG4gICAgICAgIHVzZXJJZFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHtpZDogdXNlcklkfSkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuIl19