@nlabs/reaktor 0.4.0 → 0.4.1

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 (151) hide show
  1. package/lib/actions/conversations.d.ts +14 -0
  2. package/lib/actions/conversations.js +333 -0
  3. package/lib/actions/dynamodb.js +155 -0
  4. package/lib/actions/email.js +177 -0
  5. package/lib/actions/files.js +319 -0
  6. package/lib/{data → actions}/groups.d.ts +4 -3
  7. package/lib/actions/groups.js +282 -0
  8. package/lib/actions/images.d.ts +22 -0
  9. package/lib/actions/images.js +682 -0
  10. package/lib/actions/index.js +40 -0
  11. package/lib/{data → actions}/ios.d.ts +2 -1
  12. package/lib/actions/ios.js +179 -0
  13. package/lib/actions/locations.js +112 -0
  14. package/lib/actions/messages.d.ts +13 -0
  15. package/lib/actions/messages.js +216 -0
  16. package/lib/{data → actions}/notifications.d.ts +2 -2
  17. package/lib/actions/notifications.js +63 -0
  18. package/lib/{data → actions}/payments.d.ts +2 -2
  19. package/lib/actions/payments.js +491 -0
  20. package/lib/actions/posts.d.ts +19 -0
  21. package/lib/actions/posts.js +538 -0
  22. package/lib/actions/reactions.d.ts +30 -0
  23. package/lib/actions/reactions.js +340 -0
  24. package/lib/{data → actions}/s3.d.ts +1 -1
  25. package/lib/actions/s3.js +122 -0
  26. package/lib/{data → actions}/search.d.ts +2 -2
  27. package/lib/actions/search.js +99 -0
  28. package/lib/actions/sms.js +76 -0
  29. package/lib/actions/statistics.d.ts +2 -0
  30. package/lib/actions/statistics.js +63 -0
  31. package/lib/actions/subscription.js +209 -0
  32. package/lib/actions/tags.d.ts +26 -0
  33. package/lib/actions/tags.js +340 -0
  34. package/lib/actions/users.d.ts +44 -0
  35. package/lib/actions/users.js +571 -0
  36. package/lib/{data → actions}/websockets.d.ts +1 -1
  37. package/lib/actions/websockets.js +156 -0
  38. package/lib/config.d.ts +2 -3
  39. package/lib/config.js +116 -149
  40. package/lib/index.d.ts +1 -1
  41. package/lib/index.js +23 -45
  42. package/lib/templates/email/layout.d.ts +2 -0
  43. package/lib/templates/email/layout.js +292 -0
  44. package/lib/templates/email/passwordForgot.d.ts +2 -0
  45. package/lib/templates/email/passwordForgot.js +28 -0
  46. package/lib/templates/email/passwordRecovery.d.ts +2 -0
  47. package/lib/templates/email/passwordRecovery.js +25 -0
  48. package/lib/templates/email/verifyEmail.d.ts +2 -0
  49. package/lib/templates/email/verifyEmail.js +28 -0
  50. package/lib/templates/email/welcome.d.ts +2 -0
  51. package/lib/templates/email/welcome.js +28 -0
  52. package/lib/templates/sms/passwordForgot.d.ts +2 -0
  53. package/lib/templates/sms/passwordForgot.js +14 -0
  54. package/lib/templates/sms/passwordRecovery.d.ts +2 -0
  55. package/lib/templates/sms/passwordRecovery.js +14 -0
  56. package/lib/templates/sms/verifyEmail.d.ts +2 -0
  57. package/lib/templates/sms/verifyEmail.js +14 -0
  58. package/lib/templates/sms/verifyPhone.d.ts +2 -0
  59. package/lib/templates/sms/verifyPhone.js +14 -0
  60. package/lib/templates/sms/welcome.d.ts +2 -0
  61. package/lib/templates/sms/welcome.js +14 -0
  62. package/lib/types/apps.d.ts +2 -2
  63. package/lib/types/apps.js +4 -2
  64. package/lib/types/arangodb.js +4 -2
  65. package/lib/types/auth.d.ts +4 -8
  66. package/lib/types/auth.js +4 -2
  67. package/lib/types/conversations.d.ts +3 -3
  68. package/lib/types/conversations.js +4 -2
  69. package/lib/types/email.d.ts +2 -2
  70. package/lib/types/email.js +4 -2
  71. package/lib/types/files.js +4 -2
  72. package/lib/types/google.js +4 -2
  73. package/lib/types/groups.d.ts +2 -1
  74. package/lib/types/groups.js +4 -2
  75. package/lib/types/images.d.ts +8 -5
  76. package/lib/types/images.js +4 -2
  77. package/lib/types/index.d.ts +1 -1
  78. package/lib/types/index.js +37 -227
  79. package/lib/types/locations.js +4 -2
  80. package/lib/types/messages.d.ts +12 -2
  81. package/lib/types/messages.js +4 -2
  82. package/lib/types/notifications.d.ts +2 -2
  83. package/lib/types/notifications.js +4 -2
  84. package/lib/types/payments.js +4 -2
  85. package/lib/types/posts.d.ts +18 -1
  86. package/lib/types/posts.js +4 -2
  87. package/lib/types/statistics.d.ts +3 -0
  88. package/lib/types/statistics.js +4 -0
  89. package/lib/types/tags.d.ts +6 -0
  90. package/lib/types/tags.js +4 -2
  91. package/lib/types/users.d.ts +15 -11
  92. package/lib/types/users.js +4 -2
  93. package/lib/utils/analytics.d.ts +7 -0
  94. package/lib/utils/analytics.js +101 -77
  95. package/lib/utils/arangodb.d.ts +1 -1
  96. package/lib/utils/arangodb.js +93 -114
  97. package/lib/utils/auth.js +58 -55
  98. package/lib/utils/graphql.js +38 -19
  99. package/lib/utils/index.d.ts +1 -1
  100. package/lib/utils/index.js +26 -84
  101. package/lib/utils/objects.js +44 -53
  102. package/lib/utils/session.d.ts +18 -0
  103. package/lib/utils/session.js +42 -0
  104. package/package.json +32 -30
  105. package/lib/data/conversations.d.ts +0 -8
  106. package/lib/data/conversations.js +0 -311
  107. package/lib/data/dynamodb.js +0 -206
  108. package/lib/data/email.js +0 -222
  109. package/lib/data/files.js +0 -525
  110. package/lib/data/groups.js +0 -435
  111. package/lib/data/images.d.ts +0 -22
  112. package/lib/data/images.js +0 -1051
  113. package/lib/data/index.js +0 -266
  114. package/lib/data/ios.js +0 -355
  115. package/lib/data/locations.js +0 -172
  116. package/lib/data/messages.d.ts +0 -9
  117. package/lib/data/messages.js +0 -299
  118. package/lib/data/notifications.js +0 -59
  119. package/lib/data/payments.js +0 -771
  120. package/lib/data/posts.d.ts +0 -23
  121. package/lib/data/posts.js +0 -766
  122. package/lib/data/reactions.d.ts +0 -14
  123. package/lib/data/reactions.js +0 -529
  124. package/lib/data/s3.js +0 -155
  125. package/lib/data/search.js +0 -155
  126. package/lib/data/sms.js +0 -83
  127. package/lib/data/subscription.js +0 -337
  128. package/lib/data/tags.d.ts +0 -14
  129. package/lib/data/tags.js +0 -397
  130. package/lib/data/users.d.ts +0 -20
  131. package/lib/data/users.js +0 -470
  132. package/lib/data/websockets.js +0 -250
  133. package/lib/types/reactions.d.ts +0 -17
  134. package/lib/types/reactions.js +0 -2
  135. package/lib/utils/redis.d.ts +0 -1
  136. package/lib/utils/redis.js +0 -36
  137. package/templates/email/layout.html +0 -279
  138. package/templates/email/passwordForgot.html +0 -15
  139. package/templates/email/passwordRecovery.html +0 -12
  140. package/templates/email/verifyEmail.html +0 -15
  141. package/templates/sms/passwordForgot.txt +0 -1
  142. package/templates/sms/passwordRecovery.txt +0 -1
  143. package/templates/sms/verifyEmail.txt +0 -1
  144. package/templates/sms/verifyPhone.txt +0 -1
  145. /package/lib/{data → actions}/dynamodb.d.ts +0 -0
  146. /package/lib/{data → actions}/email.d.ts +0 -0
  147. /package/lib/{data → actions}/files.d.ts +0 -0
  148. /package/lib/{data → actions}/index.d.ts +0 -0
  149. /package/lib/{data → actions}/locations.d.ts +0 -0
  150. /package/lib/{data → actions}/sms.d.ts +0 -0
  151. /package/lib/{data → actions}/subscription.d.ts +0 -0
package/lib/data/email.js DELETED
@@ -1,222 +0,0 @@
1
- "use strict";
2
-
3
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4
-
5
- require("core-js/modules/es.array.concat");
6
-
7
- require("core-js/modules/es.array.for-each");
8
-
9
- require("core-js/modules/es.date.to-string");
10
-
11
- require("core-js/modules/es.function.name");
12
-
13
- require("core-js/modules/es.object.keys");
14
-
15
- require("core-js/modules/es.object.to-string");
16
-
17
- require("core-js/modules/es.promise");
18
-
19
- require("core-js/modules/es.regexp.constructor");
20
-
21
- require("core-js/modules/es.regexp.exec");
22
-
23
- require("core-js/modules/es.regexp.to-string");
24
-
25
- require("core-js/modules/es.string.replace");
26
-
27
- require("core-js/modules/web.dom-collections.for-each");
28
-
29
- Object.defineProperty(exports, "__esModule", {
30
- value: true
31
- });
32
- exports.sendTemplate = exports.sendEmail = exports.sesSend = exports.appTemplate = void 0;
33
-
34
- var _awsSdk = _interopRequireWildcard(require("aws-sdk"));
35
-
36
- var _fs = _interopRequireDefault(require("fs"));
37
-
38
- var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
39
-
40
- var _config = require("../config");
41
-
42
- var _s = require("./s3");
43
-
44
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
45
-
46
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
47
-
48
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
49
-
50
- /**
51
- * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
52
- * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
53
- */
54
- // const eventCategory: string = 'email';
55
- var appTemplate = function appTemplate(app) {
56
- var message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
57
- var vars = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
58
- var updatedMessage = '';
59
-
60
- if (!(0, _isEmpty["default"])(app)) {
61
- updatedMessage = message.replace(/\[appName\]/g, app.name).replace(/\[appUrl\]/g, app.url).replace(/\[appEmail\]/g, app.email);
62
- }
63
-
64
- Object.keys(vars).forEach(function (key) {
65
- if (vars[key]) {
66
- updatedMessage = message.replace(new RegExp("\\[".concat(key, "\\]"), 'g'), vars[key]);
67
- }
68
- });
69
- return updatedMessage;
70
- }; // AWS::SES
71
-
72
-
73
- exports.appTemplate = appTemplate;
74
-
75
- var sesSend = function sesSend(params) {
76
- return new Promise(function (resolve, reject) {
77
- _awsSdk["default"].config.update(_config.Config.get('aws'));
78
-
79
- var ses = new _awsSdk.SES();
80
- ses.sendEmail(params, function (error, response) {
81
- if (error) {
82
- return reject(error);
83
- }
84
-
85
- return resolve(response);
86
- });
87
- });
88
- };
89
-
90
- exports.sesSend = sesSend;
91
-
92
- var sendEmail = function sendEmail(params) {
93
- var _params$app = params.app,
94
- app = _params$app === void 0 ? {} : _params$app,
95
- html = params.html,
96
- subject = params.subject,
97
- _params$subTitle = params.subTitle,
98
- subTitle = _params$subTitle === void 0 ? '' : _params$subTitle,
99
- text = params.text,
100
- _params$title = params.title,
101
- title = _params$title === void 0 ? '' : _params$title,
102
- _params$user = params.user,
103
- user = _params$user === void 0 ? {} : _params$user;
104
- var to = [user.email];
105
- var promise;
106
- var formatSubject = appTemplate(app, subject);
107
- var formatSubTitle = appTemplate(app, subTitle);
108
- var formatTitle = appTemplate(app, title);
109
- var formatText = appTemplate(app, text);
110
- var formatHtml = appTemplate(app, html);
111
- var hasCustomEmail = app._key,
112
- urlFacebook = app.urlFacebook,
113
- urlTwitter = app.urlTwitter;
114
-
115
- var parseTemplate = function parseTemplate(body) {
116
- var templateBody = appTemplate(app, body || ''); // Links
117
-
118
- var links = '';
119
- var spacer = '<td width="5"><img width="1" height="1" border="0" title="" alt="" ' + 'src="https://box.reaktor.io/images/email/spacer.gif"/></td>';
120
-
121
- if (urlFacebook) {
122
- links = "<td width=\"30\"><a href=\"".concat(urlFacebook, "\"><img width=\"30\" height=\"30\" border=\"0\" ") + 'title="Facebook" alt="Facebook" src="https://box.reaktor.io/images/email/icon-facebook.png"/></a></td>';
123
- }
124
-
125
- if (urlTwitter) {
126
- if (urlFacebook) {
127
- links += spacer;
128
- }
129
-
130
- links += "<td width=\"30\"><a href=\"".concat(urlTwitter, "\"><img width=\"30\" height=\"30\" border=\"0\" ") + 'title="Twitter" alt="Twitter" src="https://box.reaktor.io/images/email/icon-twitter.png"/></a></td>';
131
- }
132
-
133
- if (!links.length) {
134
- links += spacer;
135
- }
136
-
137
- return templateBody.replace(/\[title\]/g, formatTitle).replace(/\[subTitle\]/g, formatSubTitle).replace(/\[subject\]/g, formatSubject).replace(/\[message\]/g, formatHtml).replace(/\[links\]/g, links);
138
- };
139
-
140
- if (hasCustomEmail) {
141
- var s3Params = {
142
- Bucket: null,
143
- Key: 'apps/templates/email.html'
144
- };
145
- promise = (0, _s.s3Get)(s3Params).then(function (results) {
146
- return parseTemplate(results.Body.toString());
147
- });
148
- } else {
149
- promise = new Promise(function (resolve, reject) {
150
- _fs["default"].readFile('./templates/email/layout.html', 'utf8', function (err, data) {
151
- if (err) {
152
- return reject(err);
153
- }
154
-
155
- return resolve(parseTemplate(data));
156
- });
157
- });
158
- }
159
-
160
- return promise.then(function (parsedHtml) {
161
- var emailParams = {
162
- Destination: {
163
- ToAddresses: to
164
- },
165
- Message: {
166
- Body: {
167
- Html: {
168
- Data: parsedHtml
169
- },
170
- Text: {
171
- Data: formatText
172
- }
173
- },
174
- Subject: {
175
- Data: formatSubject
176
- }
177
- },
178
- Source: "\"".concat(app.supportName, "\" <noreply@").concat(_config.Config.get('app.url'), ">")
179
- };
180
- return sesSend(emailParams);
181
- });
182
- };
183
-
184
- exports.sendEmail = sendEmail;
185
-
186
- var sendTemplate = function sendTemplate(templateName, emailParams) {
187
- var app = emailParams.app,
188
- user = emailParams.user,
189
- subject = emailParams.subject,
190
- subTitle = emailParams.subTitle,
191
- title = emailParams.title,
192
- vars = emailParams.vars;
193
-
194
- try {
195
- var html = _fs["default"].readFileSync("./templates/email/".concat(templateName, ".html"), 'utf8');
196
-
197
- var templateHtml = appTemplate(app, html, vars);
198
-
199
- var text = _fs["default"].readFileSync("./templates/sms/".concat(templateName, ".txt"), 'utf8');
200
-
201
- var templateText = appTemplate(app, text, vars);
202
- var params = {
203
- app: app,
204
- html: templateHtml,
205
- subTitle: subTitle,
206
- subject: subject,
207
- text: templateText,
208
- title: title,
209
- user: user
210
- };
211
- return sendEmail(params).then(function () {
212
- return true;
213
- })["catch"](function () {
214
- return false;
215
- });
216
- } catch (error) {
217
- return Promise.reject(error);
218
- }
219
- };
220
-
221
- exports.sendTemplate = sendTemplate;
222
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL2VtYWlsLnRzIl0sIm5hbWVzIjpbImFwcFRlbXBsYXRlIiwiYXBwIiwibWVzc2FnZSIsInZhcnMiLCJ1cGRhdGVkTWVzc2FnZSIsInJlcGxhY2UiLCJuYW1lIiwidXJsIiwiZW1haWwiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsIlJlZ0V4cCIsInNlc1NlbmQiLCJwYXJhbXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImF3cyIsImNvbmZpZyIsInVwZGF0ZSIsIkNvbmZpZyIsImdldCIsInNlcyIsIlNFUyIsInNlbmRFbWFpbCIsImVycm9yIiwicmVzcG9uc2UiLCJodG1sIiwic3ViamVjdCIsInN1YlRpdGxlIiwidGV4dCIsInRpdGxlIiwidXNlciIsInRvIiwicHJvbWlzZSIsImZvcm1hdFN1YmplY3QiLCJmb3JtYXRTdWJUaXRsZSIsImZvcm1hdFRpdGxlIiwiZm9ybWF0VGV4dCIsImZvcm1hdEh0bWwiLCJoYXNDdXN0b21FbWFpbCIsIl9rZXkiLCJ1cmxGYWNlYm9vayIsInVybFR3aXR0ZXIiLCJwYXJzZVRlbXBsYXRlIiwiYm9keSIsInRlbXBsYXRlQm9keSIsImxpbmtzIiwic3BhY2VyIiwibGVuZ3RoIiwiczNQYXJhbXMiLCJCdWNrZXQiLCJLZXkiLCJ0aGVuIiwicmVzdWx0cyIsIkJvZHkiLCJ0b1N0cmluZyIsImZzIiwicmVhZEZpbGUiLCJlcnIiLCJkYXRhIiwicGFyc2VkSHRtbCIsImVtYWlsUGFyYW1zIiwiRGVzdGluYXRpb24iLCJUb0FkZHJlc3NlcyIsIk1lc3NhZ2UiLCJIdG1sIiwiRGF0YSIsIlRleHQiLCJTdWJqZWN0IiwiU291cmNlIiwic3VwcG9ydE5hbWUiLCJzZW5kVGVtcGxhdGUiLCJ0ZW1wbGF0ZU5hbWUiLCJyZWFkRmlsZVN5bmMiLCJ0ZW1wbGF0ZUh0bWwiLCJ0ZW1wbGF0ZVRleHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztB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TUFBQUEsSUFBSSxFQUFFZ0QsWUFGTztBQUdiOUMsTUFBQUEsUUFBUSxFQUFSQSxRQUhhO0FBSWJELE1BQUFBLE9BQU8sRUFBUEEsT0FKYTtBQUtiRSxNQUFBQSxJQUFJLEVBQUU4QyxZQUxPO0FBTWI3QyxNQUFBQSxLQUFLLEVBQUxBLEtBTmE7QUFPYkMsTUFBQUEsSUFBSSxFQUFKQTtBQVBhLEtBQWY7QUFVQSxXQUFPUixTQUFTLENBQUNYLE1BQUQsQ0FBVCxDQUNKd0MsSUFESSxDQUNDO0FBQUEsYUFBTSxJQUFOO0FBQUEsS0FERCxXQUVFO0FBQUEsYUFBTSxLQUFOO0FBQUEsS0FGRixDQUFQO0FBR0QsR0FuQkQsQ0FtQkUsT0FBTTVCLEtBQU4sRUFBYTtBQUNiLFdBQU9YLE9BQU8sQ0FBQ0UsTUFBUixDQUFlUyxLQUFmLENBQVA7QUFDRDtBQUNGLENBekJNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBhd3MsIHtTRVN9IGZyb20gJ2F3cy1zZGsnO1xuaW1wb3J0IHtHZXRPYmplY3RSZXF1ZXN0fSBmcm9tICdhd3Mtc2RrL2NsaWVudHMvczMnO1xuaW1wb3J0IHtTZW5kRW1haWxSZXF1ZXN0LCBTZW5kRW1haWxSZXNwb25zZX0gZnJvbSAnYXdzLXNkay9jbGllbnRzL3Nlcyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoL2lzRW1wdHknO1xuXG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7QXBwVHlwZX0gZnJvbSAnLi4vdHlwZXMvYXBwcyc7XG5pbXBvcnQge0VtYWlsVHlwZX0gZnJvbSAnLi4vdHlwZXMvZW1haWwnO1xuaW1wb3J0IHtzM0dldH0gZnJvbSAnLi9zMyc7XG5cbi8vIGNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICdlbWFpbCc7XG5cbmV4cG9ydCBjb25zdCBhcHBUZW1wbGF0ZSA9IChhcHA6IEFwcFR5cGUsIG1lc3NhZ2U6IHN0cmluZyA9ICcnLCB2YXJzID0ge30pOiBzdHJpbmcgPT4ge1xuICBsZXQgdXBkYXRlZE1lc3NhZ2U6IHN0cmluZyA9ICcnO1xuXG4gIGlmKCFpc0VtcHR5KGFwcCkpIHtcbiAgICB1cGRhdGVkTWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXFxbYXBwTmFtZVxcXS9nLCBhcHAubmFtZSlcbiAgICAgIC5yZXBsYWNlKC9cXFthcHBVcmxcXF0vZywgYXBwLnVybClcbiAgICAgIC5yZXBsYWNlKC9cXFthcHBFbWFpbFxcXS9nLCBhcHAuZW1haWwpO1xuICB9XG5cbiAgT2JqZWN0LmtleXModmFycykuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICBpZih2YXJzW2tleV0pIHtcbiAgICAgIHVwZGF0ZWRNZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFxbJHtrZXl9XFxcXF1gLCAnZycpLCB2YXJzW2tleV0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHVwZGF0ZWRNZXNzYWdlO1xufTtcblxuLy8gQVdTOjpTRVNcbmV4cG9ydCBjb25zdCBzZXNTZW5kID0gKHBhcmFtczogU2VuZEVtYWlsUmVxdWVzdCk6IFByb21pc2U8U2VuZEVtYWlsUmVzcG9uc2U+ID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgYXdzLmNvbmZpZy51cGRhdGUoQ29uZmlnLmdldCgnYXdzJykpO1xuICBjb25zdCBzZXM6IFNFUyA9IG5ldyBTRVMoKTtcblxuICBzZXMuc2VuZEVtYWlsKHBhcmFtcywgKGVycm9yOiBFcnJvciwgcmVzcG9uc2U6IFNlbmRFbWFpbFJlc3BvbnNlKSA9PiB7XG4gICAgaWYoZXJyb3IpIHtcbiAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSk7XG59KTtcblxuZXhwb3J0IGNvbnN0IHNlbmRFbWFpbCA9IChwYXJhbXM6IEVtYWlsVHlwZSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB7XG4gICAgYXBwID0ge30sXG4gICAgaHRtbCxcbiAgICBzdWJqZWN0LFxuICAgIHN1YlRpdGxlID0gJycsXG4gICAgdGV4dCxcbiAgICB0aXRsZSA9ICcnLFxuICAgIHVzZXIgPSB7fVxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHRvID0gW3VzZXIuZW1haWxdO1xuICBsZXQgcHJvbWlzZTtcblxuICBjb25zdCBmb3JtYXRTdWJqZWN0OiBzdHJpbmcgPSBhcHBUZW1wbGF0ZShhcHAsIHN1YmplY3QpO1xuICBjb25zdCBmb3JtYXRTdWJUaXRsZTogc3RyaW5nID0gYXBwVGVtcGxhdGUoYXBwLCBzdWJUaXRsZSk7XG4gIGNvbnN0IGZvcm1hdFRpdGxlOiBzdHJpbmcgPSBhcHBUZW1wbGF0ZShhcHAsIHRpdGxlKTtcbiAgY29uc3QgZm9ybWF0VGV4dDogc3RyaW5nID0gYXBwVGVtcGxhdGUoYXBwLCB0ZXh0KTtcbiAgY29uc3QgZm9ybWF0SHRtbDogc3RyaW5nID0gYXBwVGVtcGxhdGUoYXBwLCBodG1sKTtcbiAgY29uc3Qge19rZXk6IGhhc0N1c3RvbUVtYWlsLCB1cmxGYWNlYm9vaywgdXJsVHdpdHRlcn0gPSBhcHA7XG5cbiAgY29uc3QgcGFyc2VUZW1wbGF0ZSA9IChib2R5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZUJvZHk6IHN0cmluZyA9IGFwcFRlbXBsYXRlKGFwcCwgYm9keSB8fCAnJyk7XG5cbiAgICAvLyBMaW5rc1xuICAgIGxldCBsaW5rczogc3RyaW5nID0gJyc7XG4gICAgY29uc3Qgc3BhY2VyID0gJzx0ZCB3aWR0aD1cIjVcIj48aW1nIHdpZHRoPVwiMVwiIGhlaWdodD1cIjFcIiBib3JkZXI9XCIwXCIgdGl0bGU9XCJcIiBhbHQ9XCJcIiAnICtcbiAgICAgICdzcmM9XCJodHRwczovL2JveC5yZWFrdG9yLmlvL2ltYWdlcy9lbWFpbC9zcGFjZXIuZ2lmXCIvPjwvdGQ+JztcblxuICAgIGlmKHVybEZhY2Vib29rKSB7XG4gICAgICBsaW5rcyA9IGA8dGQgd2lkdGg9XCIzMFwiPjxhIGhyZWY9XCIke3VybEZhY2Vib29rfVwiPjxpbWcgd2lkdGg9XCIzMFwiIGhlaWdodD1cIjMwXCIgYm9yZGVyPVwiMFwiIGAgK1xuICAgICAgICAndGl0bGU9XCJGYWNlYm9va1wiIGFsdD1cIkZhY2Vib29rXCIgc3JjPVwiaHR0cHM6Ly9ib3gucmVha3Rvci5pby9pbWFnZXMvZW1haWwvaWNvbi1mYWNlYm9vay5wbmdcIi8+PC9hPjwvdGQ+JztcbiAgICB9XG5cbiAgICBpZih1cmxUd2l0dGVyKSB7XG4gICAgICBpZih1cmxGYWNlYm9vaykge1xuICAgICAgICBsaW5rcyArPSBzcGFjZXI7XG4gICAgICB9XG5cbiAgICAgIGxpbmtzICs9IGA8dGQgd2lkdGg9XCIzMFwiPjxhIGhyZWY9XCIke3VybFR3aXR0ZXJ9XCI+PGltZyB3aWR0aD1cIjMwXCIgaGVpZ2h0PVwiMzBcIiBib3JkZXI9XCIwXCIgYCArXG4gICAgICAgICd0aXRsZT1cIlR3aXR0ZXJcIiBhbHQ9XCJUd2l0dGVyXCIgc3JjPVwiaHR0cHM6Ly9ib3gucmVha3Rvci5pby9pbWFnZXMvZW1haWwvaWNvbi10d2l0dGVyLnBuZ1wiLz48L2E+PC90ZD4nO1xuICAgIH1cblxuICAgIGlmKCFsaW5rcy5sZW5ndGgpIHtcbiAgICAgIGxpbmtzICs9IHNwYWNlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGVtcGxhdGVCb2R5LnJlcGxhY2UoL1xcW3RpdGxlXFxdL2csIGZvcm1hdFRpdGxlKVxuICAgICAgLnJlcGxhY2UoL1xcW3N1YlRpdGxlXFxdL2csIGZvcm1hdFN1YlRpdGxlKVxuICAgICAgLnJlcGxhY2UoL1xcW3N1YmplY3RcXF0vZywgZm9ybWF0U3ViamVjdClcbiAgICAgIC5yZXBsYWNlKC9cXFttZXNzYWdlXFxdL2csIGZvcm1hdEh0bWwpXG4gICAgICAucmVwbGFjZSgvXFxbbGlua3NcXF0vZywgbGlua3MpO1xuICB9O1xuXG4gIGlmKGhhc0N1c3RvbUVtYWlsKSB7XG4gICAgY29uc3QgczNQYXJhbXM6IEdldE9iamVjdFJlcXVlc3QgPSB7QnVja2V0OiBudWxsLCBLZXk6ICdhcHBzL3RlbXBsYXRlcy9lbWFpbC5odG1sJ307XG4gICAgcHJvbWlzZSA9IHMzR2V0KHMzUGFyYW1zKS50aGVuKChyZXN1bHRzKSA9PiBwYXJzZVRlbXBsYXRlKHJlc3VsdHMuQm9keS50b1N0cmluZygpKSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGZzLnJlYWRGaWxlKCcuL3RlbXBsYXRlcy9lbWFpbC9sYXlvdXQuaHRtbCcsICd1dGY4JywgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzb2x2ZShwYXJzZVRlbXBsYXRlKGRhdGEpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHByb21pc2UudGhlbigocGFyc2VkSHRtbDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZW1haWxQYXJhbXM6IFNlbmRFbWFpbFJlcXVlc3QgPSB7XG4gICAgICBEZXN0aW5hdGlvbjoge1RvQWRkcmVzc2VzOiB0b30sXG4gICAgICBNZXNzYWdlOiB7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBIdG1sOiB7RGF0YTogcGFyc2VkSHRtbH0sXG4gICAgICAgICAgVGV4dDoge0RhdGE6IGZvcm1hdFRleHR9XG4gICAgICAgIH0sXG4gICAgICAgIFN1YmplY3Q6IHtEYXRhOiBmb3JtYXRTdWJqZWN0fVxuICAgICAgfSxcbiAgICAgIFNvdXJjZTogYFwiJHthcHAuc3VwcG9ydE5hbWV9XCIgPG5vcmVwbHlAJHtDb25maWcuZ2V0KCdhcHAudXJsJyl9PmBcbiAgICB9O1xuXG4gICAgcmV0dXJuIHNlc1NlbmQoZW1haWxQYXJhbXMpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZW5kVGVtcGxhdGUgPSAodGVtcGxhdGVOYW1lOiBzdHJpbmcsIGVtYWlsUGFyYW1zOiBFbWFpbFR5cGUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3Qge2FwcCwgdXNlciwgc3ViamVjdCwgc3ViVGl0bGUsIHRpdGxlLCB2YXJzfTogRW1haWxUeXBlID0gZW1haWxQYXJhbXM7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBodG1sOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoYC4vdGVtcGxhdGVzL2VtYWlsLyR7dGVtcGxhdGVOYW1lfS5odG1sYCwgJ3V0ZjgnKTtcbiAgICBjb25zdCB0ZW1wbGF0ZUh0bWw6IHN0cmluZyA9IGFwcFRlbXBsYXRlKGFwcCwgaHRtbCwgdmFycyk7XG4gICAgY29uc3QgdGV4dDogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGAuL3RlbXBsYXRlcy9zbXMvJHt0ZW1wbGF0ZU5hbWV9LnR4dGAsICd1dGY4Jyk7XG4gICAgY29uc3QgdGVtcGxhdGVUZXh0OiBzdHJpbmcgPSBhcHBUZW1wbGF0ZShhcHAsIHRleHQsIHZhcnMpO1xuXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgYXBwLFxuICAgICAgaHRtbDogdGVtcGxhdGVIdG1sLFxuICAgICAgc3ViVGl0bGUsXG4gICAgICBzdWJqZWN0LFxuICAgICAgdGV4dDogdGVtcGxhdGVUZXh0LFxuICAgICAgdGl0bGUsXG4gICAgICB1c2VyXG4gICAgfTtcblxuICAgIHJldHVybiBzZW5kRW1haWwocGFyYW1zKVxuICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICB9XG59O1xuIl19