@nlabs/reaktor 0.1.12 → 0.1.14

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 (50) hide show
  1. package/lib/config.js +138 -0
  2. package/lib/data/conversations.js +228 -0
  3. package/lib/data/dynamodb.js +172 -0
  4. package/lib/data/email.js +194 -0
  5. package/lib/data/files.js +463 -0
  6. package/lib/data/groups.js +401 -0
  7. package/lib/data/images.js +841 -0
  8. package/lib/data/index.js +234 -0
  9. package/lib/data/ios.js +327 -0
  10. package/lib/data/locations.js +148 -0
  11. package/lib/data/messages.js +281 -0
  12. package/lib/data/notifications.js +59 -0
  13. package/lib/data/payments.js +798 -0
  14. package/lib/data/posts.js +637 -0
  15. package/lib/data/reactions.js +243 -0
  16. package/lib/data/s3.js +133 -0
  17. package/lib/data/search.js +111 -0
  18. package/lib/data/sms.js +79 -0
  19. package/lib/data/subscription.js +311 -0
  20. package/lib/data/tags.js +343 -0
  21. package/lib/data/users.js +415 -0
  22. package/lib/index.js +42 -0
  23. package/lib/types/apps.js +2 -0
  24. package/lib/types/arangodb.js +2 -0
  25. package/lib/types/auth.js +2 -0
  26. package/lib/types/conversations.js +2 -0
  27. package/lib/types/email.js +2 -0
  28. package/lib/types/files.js +2 -0
  29. package/lib/types/google.js +2 -0
  30. package/lib/types/groups.js +2 -0
  31. package/lib/types/images.js +2 -0
  32. package/lib/types/index.js +210 -0
  33. package/lib/types/locations.js +2 -0
  34. package/lib/types/messages.js +2 -0
  35. package/lib/types/notifications.js +2 -0
  36. package/lib/types/payments.js +2 -0
  37. package/lib/types/posts.js +2 -0
  38. package/lib/types/reactions.js +2 -0
  39. package/lib/types/tags.js +2 -0
  40. package/lib/types/users.js +2 -0
  41. package/lib/utils/analytics.js +59 -0
  42. package/lib/utils/arangodb.d.ts +0 -1
  43. package/lib/utils/arangodb.js +122 -0
  44. package/lib/utils/auth.d.ts +0 -2
  45. package/lib/utils/auth.js +55 -0
  46. package/lib/utils/graphql.js +19 -0
  47. package/lib/utils/index.js +78 -0
  48. package/lib/utils/objects.js +54 -0
  49. package/lib/utils/redis.js +28 -0
  50. package/package.json +7 -7
@@ -0,0 +1,343 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.extractTags = exports.linkTags = exports.createTagEdge = exports.createTag = exports.deleteTag = exports.updateTag = exports.tagPost = exports.addTag = exports.getTag = exports.getTagList = void 0;
7
+
8
+ var _utils = require("@nlabs/utils");
9
+
10
+ var _arangojs = require("arangojs");
11
+
12
+ var _words = _interopRequireDefault(require("lodash/words"));
13
+
14
+ var _utils2 = require("../utils");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
17
+
18
+ function _templateObject5() {
19
+ var data = _taggedTemplateLiteral(["REMOVE {_key:", "} IN isTagged"]);
20
+
21
+ _templateObject5 = function _templateObject5() {
22
+ return data;
23
+ };
24
+
25
+ return data;
26
+ }
27
+
28
+ function _templateObject4() {
29
+ var data = _taggedTemplateLiteral(["UPSERT {_key: ", "}\n INSERT ", "\n UPDATE {}\n IN tags RETURN NEW"]);
30
+
31
+ _templateObject4 = function _templateObject4() {
32
+ return data;
33
+ };
34
+
35
+ return data;
36
+ }
37
+
38
+ function _templateObject3() {
39
+ var data = _taggedTemplateLiteral(["FOR t IN tags\n FILTER t._key == ", "\n REMOVE t IN tags\n RETURN OLD"]);
40
+
41
+ _templateObject3 = function _templateObject3() {
42
+ return data;
43
+ };
44
+
45
+ return data;
46
+ }
47
+
48
+ function _templateObject2() {
49
+ var data = _taggedTemplateLiteral(["UPSERT {_key: ", "}\n INSERT ", "\n UPDATE ", "\n IN tags RETURN NEW"]);
50
+
51
+ _templateObject2 = function _templateObject2() {
52
+ return data;
53
+ };
54
+
55
+ return data;
56
+ }
57
+
58
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
59
+
60
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
61
+
62
+ function _templateObject() {
63
+ var data = _taggedTemplateLiteral(["INSERT ", " IN tags RETURN NEW"]);
64
+
65
+ _templateObject = function _templateObject() {
66
+ return data;
67
+ };
68
+
69
+ return data;
70
+ }
71
+
72
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
73
+
74
+ var eventCategory = 'tags';
75
+
76
+ var getTagList = function getTagList(context) {
77
+ var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
78
+ var to = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 30;
79
+ var action = 'getList';
80
+ var database = context.database,
81
+ sessionId = context.userId;
82
+ var limit = (0, _utils2.getLimit)(from, to);
83
+ var aqlQry = "FOR t IN tagList\n FILTER t.userId == \"".concat(sessionId, "\"\n ").concat(limit.aql, "\n SORT t.added\n RETURN t");
84
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
85
+ return cursor.all();
86
+ }).then(function () {
87
+ var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
88
+ return list;
89
+ })["catch"](function (error) {
90
+ return (0, _utils2.logError)({
91
+ action: action,
92
+ category: eventCategory,
93
+ label: 'db_error'
94
+ }, error, {}).then(function () {
95
+ return null;
96
+ })["catch"](function (error) {
97
+ return Promise.reject(error);
98
+ });
99
+ });
100
+ };
101
+
102
+ exports.getTagList = getTagList;
103
+
104
+ var getTag = function getTag(context, tagId) {
105
+ var action = 'getItem';
106
+ var database = context.database;
107
+ var formatId = JSON.stringify((0, _utils.parseId)(tagId));
108
+ var aqlQry = "FOR t IN tags\n FILTER t._key == ".concat(formatId, "\n LIMIT 1\n RETURN t");
109
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
110
+ return cursor.next();
111
+ }).then(function () {
112
+ var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
113
+ return tag;
114
+ })["catch"](function (error) {
115
+ return (0, _utils2.logError)({
116
+ action: action,
117
+ category: eventCategory,
118
+ label: 'db_error'
119
+ }, error, {}).then(function () {
120
+ return null;
121
+ })["catch"](function (error) {
122
+ return Promise.reject(error);
123
+ });
124
+ });
125
+ };
126
+
127
+ exports.getTag = getTag;
128
+
129
+ var addTag = function addTag(context, tag) {
130
+ var action = 'add';
131
+ var database = context.database,
132
+ sessionId = context.userId;
133
+ var now = Date.now();
134
+ var formatId = (0, _utils.createHash)("tag-".concat(sessionId));
135
+ var description = tag.description,
136
+ name = tag.name;
137
+ var insert = {
138
+ _key: formatId,
139
+ added: now,
140
+ description: (0, _utils.parseVarChar)(description, 64),
141
+ modified: now,
142
+ name: (0, _utils.parseVarChar)(name, 32)
143
+ };
144
+ var aqlQry = (0, _arangojs.aql)(_templateObject(), insert);
145
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
146
+ return cursor.next();
147
+ }).then(function () {
148
+ var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
149
+ return tag;
150
+ })["catch"](function (error) {
151
+ return (0, _utils2.logError)({
152
+ action: action,
153
+ category: eventCategory,
154
+ label: 'db_error'
155
+ }, error, {}).then(function () {
156
+ return null;
157
+ })["catch"](function (error) {
158
+ return Promise.reject(error);
159
+ });
160
+ });
161
+ };
162
+
163
+ exports.addTag = addTag;
164
+
165
+ var tagPost = function tagPost(context, tagId, postId) {
166
+ var action = 'tagPost';
167
+ var database = context.database,
168
+ sessionId = context.userId;
169
+ var added = Date.now();
170
+ var edgeId = (0, _utils.createHash)("tagPost-".concat(sessionId));
171
+ var edgeCollection = (0, _utils2.useDb)(database).edgeCollection('isTagged');
172
+ var edge = {
173
+ _key: edgeId,
174
+ added: added
175
+ };
176
+ return edgeCollection.save(edge, "tags/".concat(tagId), "posts/".concat(postId)).then(function () {
177
+ var post = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
178
+ return post;
179
+ })["catch"](function (error) {
180
+ return (0, _utils2.logError)({
181
+ action: action,
182
+ category: eventCategory,
183
+ label: 'db_error'
184
+ }, error, {}).then(function () {
185
+ return null;
186
+ })["catch"](function (error) {
187
+ return Promise.reject(error);
188
+ });
189
+ });
190
+ };
191
+
192
+ exports.tagPost = tagPost;
193
+
194
+ var updateTag = function updateTag(context) {
195
+ var item = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
196
+ var action = 'update';
197
+ var database = context.database;
198
+ var now = Date.now();
199
+ var description = item.description,
200
+ id = item.id,
201
+ name = item.name;
202
+ var formatName = (0, _utils.parseVarChar)(name, 32);
203
+ var update = {
204
+ description: (0, _utils.parseVarChar)(description, 64),
205
+ modified: now,
206
+ name: formatName
207
+ };
208
+ var formatId = (0, _utils.parseId)(id);
209
+ var tagId = !formatId ? (0, _utils.createHash)("tag-".concat(formatName.toLowerCase()), null) : formatId;
210
+
211
+ var insert = _objectSpread({}, update, {
212
+ _key: tagId,
213
+ added: now
214
+ });
215
+
216
+ var aqlQry = (0, _arangojs.aql)(_templateObject2(), tagId, insert, update);
217
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
218
+ return cursor.next();
219
+ }).then(function () {
220
+ var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
221
+ return tag;
222
+ })["catch"](function (error) {
223
+ return (0, _utils2.logError)({
224
+ action: action,
225
+ category: eventCategory,
226
+ label: 'db_error'
227
+ }, error, {}).then(function () {
228
+ return null;
229
+ })["catch"](function (error) {
230
+ return Promise.reject(error);
231
+ });
232
+ });
233
+ };
234
+
235
+ exports.updateTag = updateTag;
236
+
237
+ var deleteTag = function deleteTag(context, tagId) {
238
+ var action = 'delete';
239
+ var database = context.database;
240
+ var formatTagId = (0, _utils.parseId)(tagId);
241
+ var aqlQry = (0, _arangojs.aql)(_templateObject3(), formatTagId);
242
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
243
+ return cursor.next();
244
+ }).then(function () {
245
+ var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
246
+ return tag;
247
+ })["catch"](function (error) {
248
+ return (0, _utils2.logError)({
249
+ action: action,
250
+ category: eventCategory,
251
+ label: 'db_error'
252
+ }, error, {}).then(function () {
253
+ return null;
254
+ })["catch"](function (error) {
255
+ return Promise.reject(error);
256
+ });
257
+ });
258
+ };
259
+
260
+ exports.deleteTag = deleteTag;
261
+
262
+ var createTag = function createTag(db, tagName) {
263
+ var tagId = (0, _utils.createHash)("tag-".concat(tagName));
264
+ var insert = {
265
+ _key: tagId,
266
+ added: Date.now(),
267
+ name: tagName
268
+ };
269
+ var aqlQry = (0, _arangojs.aql)(_templateObject4(), tagId, insert);
270
+ return db.query(aqlQry).then(function (cursor) {
271
+ return cursor.next();
272
+ }).then(function () {
273
+ var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
274
+ return tag;
275
+ })["catch"](function (error) {
276
+ throw error;
277
+ });
278
+ };
279
+
280
+ exports.createTag = createTag;
281
+
282
+ var createTagEdge = function createTagEdge(db, tag, itemType, itemId) {
283
+ var edgeCollection = db.edgeCollection('isTagged');
284
+ var tagId = tag._id,
285
+ tagKey = tag._key;
286
+ var edgeId = (0, _utils.createHash)("tag-".concat(itemType, "-").concat(tagKey, "-").concat(itemId));
287
+ var edge = {
288
+ _key: edgeId,
289
+ added: Date.now(),
290
+ type: itemType
291
+ };
292
+ return edgeCollection.save(edge, tagId, "".concat(itemType, "/").concat(itemId)).then(function () {
293
+ return tag;
294
+ });
295
+ };
296
+
297
+ exports.createTagEdge = createTagEdge;
298
+
299
+ var linkTags = function linkTags(db, tagNames, itemType, itemId) {
300
+ return Promise.all(tagNames.map(function (tagId) {
301
+ return createTag(db, tagId).then(function (tag) {
302
+ return createTagEdge(db, tag, itemType, itemId);
303
+ });
304
+ }));
305
+ };
306
+
307
+ exports.linkTags = linkTags;
308
+
309
+ var extractTags = function extractTags(db, itemType, itemId, content) {
310
+ var tags = (0, _words["default"])(content, /#[a-zA-Z\d-]+/g).map(function (tag) {
311
+ return (0, _utils.parseId)(tag);
312
+ });
313
+ var edgeCollection = db.edgeCollection('isTagged');
314
+ return edgeCollection.inEdges(itemId).then(function (edges) {
315
+ if (edges.length) {
316
+ // Remove linked edges
317
+ return Promise.all(edges.map(function (edge) {
318
+ var edgeKey = edge._key;
319
+ var aqlQry = (0, _arangojs.aql)(_templateObject5(), edgeKey);
320
+ return db.query(aqlQry)["catch"](function (error) {
321
+ throw error;
322
+ });
323
+ })).then(function () {
324
+ if (tags.length) {
325
+ // Create tags
326
+ return linkTags(db, tags, itemType, itemId);
327
+ }
328
+
329
+ return [];
330
+ });
331
+ } else if (tags.length) {
332
+ // Create tags
333
+ return linkTags(db, tags, itemType, itemId);
334
+ }
335
+
336
+ return [];
337
+ })["catch"](function (error) {
338
+ throw error;
339
+ });
340
+ };
341
+
342
+ exports.extractTags = extractTags;
343
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3RhZ3MudHMiXSwibmFtZXMiOlsiZXZlbnRDYXRlZ29yeSIsImdldFRhZ0xpc3QiLCJjb250ZXh0IiwiZnJvbSIsInRvIiwiYWN0aW9uIiwiZGF0YWJhc2UiLCJzZXNzaW9uSWQiLCJ1c2VySWQiLCJsaW1pdCIsImFxbFFyeSIsImFxbCIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsImFsbCIsImxpc3QiLCJlcnJvciIsImNhdGVnb3J5IiwibGFiZWwiLCJQcm9taXNlIiwicmVqZWN0IiwiZ2V0VGFnIiwidGFnSWQiLCJmb3JtYXRJZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJuZXh0IiwidGFnIiwiYWRkVGFnIiwibm93IiwiRGF0ZSIsImRlc2NyaXB0aW9uIiwibmFtZSIsImluc2VydCIsIl9rZXkiLCJhZGRlZCIsIm1vZGlmaWVkIiwidGFnUG9zdCIsInBvc3RJZCIsImVkZ2VJZCIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZSIsInNhdmUiLCJwb3N0IiwidXBkYXRlVGFnIiwiaXRlbSIsImlkIiwiZm9ybWF0TmFtZSIsInVwZGF0ZSIsInRvTG93ZXJDYXNlIiwiZGVsZXRlVGFnIiwiZm9ybWF0VGFnSWQiLCJjcmVhdGVUYWciLCJkYiIsInRhZ05hbWUiLCJjcmVhdGVUYWdFZGdlIiwiaXRlbVR5cGUiLCJpdGVtSWQiLCJfaWQiLCJ0YWdLZXkiLCJ0eXBlIiwibGlua1RhZ3MiLCJ0YWdOYW1lcyIsIm1hcCIsImV4dHJhY3RUYWdzIiwiY29udGVudCIsInRhZ3MiLCJpbkVkZ2VzIiwiZWRnZXMiLCJsZW5ndGgiLCJlZGdlS2V5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBSUE7O0FBQ0E7O0FBR0E7O0FBTUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLGFBQXFCLEdBQUcsTUFBOUI7O0FBRU8sSUFBTUMsVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQ0MsT0FB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KiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZCwgcGFyc2VWYXJDaGFyfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWwsIERhdGFiYXNlLCBFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvbGliL2Nqcy9hcWwtcXVlcnknO1xuaW1wb3J0IHtBcnJheUN1cnNvcn0gZnJvbSAnYXJhbmdvanMvbGliL2Nqcy9jdXJzb3InO1xuaW1wb3J0IHdvcmRzIGZyb20gJ2xvZGFzaC93b3Jkcyc7XG5cbmltcG9ydCB7QXJhbmdvREJMaW1pdH0gZnJvbSAnLi4vdHlwZXMvYXJhbmdvZGInO1xuaW1wb3J0IHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoJztcbmltcG9ydCB7UG9zdFR5cGV9IGZyb20gJy4uL3R5cGVzL3Bvc3RzJztcbmltcG9ydCB7VGFnVHlwZX0gZnJvbSAnLi4vdHlwZXMvdGFncyc7XG5pbXBvcnQge2dldExpbWl0LCBsb2dFcnJvciwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ3RhZ3MnO1xuXG5leHBvcnQgY29uc3QgZ2V0VGFnTGlzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBmcm9tOiBudW1iZXIgPSAwLCB0bzogbnVtYmVyID0gMzApOiBQcm9taXNlPFRhZ1R5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0JztcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCBsaW1pdDogQXJhbmdvREJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHQgSU4gdGFnTGlzdFxuICAgICAgRklMVEVSIHQudXNlcklkID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICR7bGltaXQuYXFsfVxuICAgICAgU09SVCB0LmFkZGVkXG4gICAgICBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigobGlzdCA9IFtdKSA9PiBsaXN0KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHt9KS50aGVuKCgpID0+IG51bGwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGFnID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRhZ0lkOiBzdHJpbmcpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJZDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocGFyc2VJZCh0YWdJZCkpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdCBJTiB0YWdzXG4gICAgICBGSUxURVIgdC5fa2V5ID09ICR7Zm9ybWF0SWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHRhZyA9IHt9KSA9PiB0YWcpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRUYWcgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdGFnOiBUYWdUeXBlKTogUHJvbWlzZTxUYWdUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCBmb3JtYXRJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgdGFnLSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCB7ZGVzY3JpcHRpb24sIG5hbWV9ID0gdGFnO1xuXG4gIGNvbnN0IGluc2VydDogYW55ID0ge1xuICAgIF9rZXk6IGZvcm1hdElkLFxuICAgIGFkZGVkOiBub3csXG4gICAgZGVzY3JpcHRpb246IHBhcnNlVmFyQ2hhcihkZXNjcmlwdGlvbiwgNjQpLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VWYXJDaGFyKG5hbWUsIDMyKVxuICB9O1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiB0YWdzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh0YWc6IFRhZ1R5cGUgPSB7fSkgPT4gdGFnKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHt9KS50aGVuKCgpID0+IG51bGwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG59O1xuXG5leHBvcnQgY29uc3QgdGFnUG9zdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0YWdJZCwgcG9zdElkKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICd0YWdQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCBhZGRlZDogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGB0YWdQb3N0LSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSB1c2VEYihkYXRhYmFzZSkuZWRnZUNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG4gIGNvbnN0IGVkZ2U6IGFueSA9IHtfa2V5OiBlZGdlSWQsIGFkZGVkfTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCBgdGFncy8ke3RhZ0lkfWAsIGBwb3N0cy8ke3Bvc3RJZH1gKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiBwb3N0KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHt9KS50aGVuKCgpID0+IG51bGwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVGFnID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW06IFRhZ1R5cGUgPSB7fSk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICd1cGRhdGUnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCB7ZGVzY3JpcHRpb24sIGlkLCBuYW1lfSA9IGl0ZW07XG4gIGNvbnN0IGZvcm1hdE5hbWU6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihuYW1lLCAzMik7XG5cbiAgY29uc3QgdXBkYXRlOiBUYWdUeXBlID0ge1xuICAgIGRlc2NyaXB0aW9uOiBwYXJzZVZhckNoYXIoZGVzY3JpcHRpb24sIDY0KSxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWU6IGZvcm1hdE5hbWVcbiAgfTtcblxuICBjb25zdCBmb3JtYXRJZDogc3RyaW5nID0gcGFyc2VJZChpZCk7XG4gIGNvbnN0IHRhZ0lkOiBzdHJpbmcgPSAhZm9ybWF0SWQgPyBjcmVhdGVIYXNoKGB0YWctJHtmb3JtYXROYW1lLnRvTG93ZXJDYXNlKCl9YCwgbnVsbCkgOiBmb3JtYXRJZDtcblxuICBjb25zdCBpbnNlcnQ6IFRhZ1R5cGUgPSB7XG4gICAgLi4udXBkYXRlLFxuICAgIF9rZXk6IHRhZ0lkLFxuICAgIGFkZGVkOiBub3dcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQge19rZXk6ICR7dGFnSWR9fVxuICAgICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgICAgVVBEQVRFICR7dXBkYXRlfVxuICAgICAgSU4gdGFncyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodGFnID0ge30pID0+IHRhZylcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCB7fSkudGhlbigoKSA9PiBudWxsKS5jYXRjaCgoZXJyb3IpID0+IFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVRhZyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0YWdJZDogc3RyaW5nKTogUHJvbWlzZTxUYWdUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRUYWdJZDogc3RyaW5nID0gcGFyc2VJZCh0YWdJZCk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHQgSU4gdGFnc1xuICAgIEZJTFRFUiB0Ll9rZXkgPT0gJHtmb3JtYXRUYWdJZH1cbiAgICBSRU1PVkUgdCBJTiB0YWdzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHRhZzogVGFnVHlwZSA9IHt9KSA9PiB0YWcpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUYWcgPSAoZGI6IERhdGFiYXNlLCB0YWdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgdGFnSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYHRhZy0ke3RhZ05hbWV9YCk7XG4gIGNvbnN0IGluc2VydDogVGFnVHlwZSA9IHtcbiAgICBfa2V5OiB0YWdJZCxcbiAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICBuYW1lOiB0YWdOYW1lXG4gIH07XG5cbiAgY29uc3QgYXFsUXJ5ID0gYXFsYFVQU0VSVCB7X2tleTogJHt0YWdJZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSB7fVxuICAgIElOIHRhZ3MgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodGFnID0ge30pID0+IHRhZylcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlVGFnRWRnZSA9IChkYjogRGF0YWJhc2UsIHRhZzogVGFnVHlwZSwgaXRlbVR5cGU6IHN0cmluZywgaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb24gPSBkYi5lZGdlQ29sbGVjdGlvbignaXNUYWdnZWQnKTtcbiAgY29uc3Qge19pZDogdGFnSWQsIF9rZXk6IHRhZ0tleX0gPSB0YWc7XG4gIGNvbnN0IGVkZ2VJZCA9IGNyZWF0ZUhhc2goYHRhZy0ke2l0ZW1UeXBlfS0ke3RhZ0tleX0tJHtpdGVtSWR9YCk7XG4gIGNvbnN0IGVkZ2U6IGFueSA9IHtcbiAgICBfa2V5OiBlZGdlSWQsXG4gICAgYWRkZWQ6IERhdGUubm93KCksXG4gICAgdHlwZTogaXRlbVR5cGVcbiAgfTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCB0YWdJZCwgYCR7aXRlbVR5cGV9LyR7aXRlbUlkfWApLnRoZW4oKCkgPT4gdGFnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBsaW5rVGFncyA9IChkYjogRGF0YWJhc2UsIHRhZ05hbWVzOiBzdHJpbmdbXSwgaXRlbVR5cGU6IHN0cmluZywgaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPFRhZ1R5cGVbXT4gPT5cbiAgUHJvbWlzZS5hbGwoXG4gICAgdGFnTmFtZXMubWFwKCh0YWdJZDogc3RyaW5nKSA9PiBjcmVhdGVUYWcoZGIsIHRhZ0lkKVxuICAgICAgLnRoZW4oKHRhZzogVGFnVHlwZSkgPT4gY3JlYXRlVGFnRWRnZShkYiwgdGFnLCBpdGVtVHlwZSwgaXRlbUlkKSkpXG4gICk7XG5cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RUYWdzID0gKGRiOiBEYXRhYmFzZSwgaXRlbVR5cGU6IHN0cmluZywgaXRlbUlkLCBjb250ZW50KTogUHJvbWlzZTxUYWdUeXBlW10+ID0+IHtcbiAgY29uc3QgdGFnczogc3RyaW5nW10gPSB3b3Jkcyhjb250ZW50LCAvI1thLXpBLVpcXGQtXSsvZykubWFwKCh0YWc6IHN0cmluZykgPT4gcGFyc2VJZCh0YWcpKTtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb24gPSBkYi5lZGdlQ29sbGVjdGlvbignaXNUYWdnZWQnKTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uaW5FZGdlcyhpdGVtSWQpXG4gICAgLnRoZW4oKGVkZ2VzKSA9PiB7XG4gICAgICBpZihlZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGxpbmtlZCBlZGdlc1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZWRnZXMubWFwKChlZGdlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7X2tleTogZWRnZUtleX0gPSBlZGdlO1xuICAgICAgICAgICAgY29uc3QgYXFsUXJ5ID0gYXFsYFJFTU9WRSB7X2tleToke2VkZ2VLZXl9fSBJTiBpc1RhZ2dlZGA7XG4gICAgICAgICAgICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KS5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYodGFncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRhZ3NcbiAgICAgICAgICAgICAgcmV0dXJuIGxpbmtUYWdzKGRiLCB0YWdzLCBpdGVtVHlwZSwgaXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZih0YWdzLmxlbmd0aCkge1xuICAgICAgICAvLyBDcmVhdGUgdGFnc1xuICAgICAgICByZXR1cm4gbGlua1RhZ3MoZGIsIHRhZ3MsIGl0ZW1UeXBlLCBpdGVtSWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcbiJdfQ==