UNPKG

20.7 kBJavaScriptView Raw
1'use strict';
2
3var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
4
5var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
6
7var _getIterator2 = require('babel-runtime/core-js/get-iterator');
8
9var _getIterator3 = _interopRequireDefault(_getIterator2);
10
11var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
12
13var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
14
15var _createClass2 = require('babel-runtime/helpers/createClass');
16
17var _createClass3 = _interopRequireDefault(_createClass2);
18
19function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
21var ChatServiceError = require('./ChatServiceError');
22var FastMap = require('collections/fast-map');
23var Promise = require('bluebird');
24var _ = require('lodash');
25var check = require('check-types');
26
27var _require = require('./utils');
28
29var possiblyCallback = _require.possiblyCallback;
30
31// Commands arguments type and count validation.
32
33var ArgumentsValidator = function () {
34 function ArgumentsValidator(server) {
35 (0, _classCallCheck3.default)(this, ArgumentsValidator);
36
37 this.server = server;
38 this.checkers = new FastMap();
39 this.directMessagesChecker = this.server.directMessagesChecker;
40 this.roomMessagesChecker = this.server.roomMessagesChecker;
41 this.customCheckers = {
42 directMessage: [null, this.directMessagesChecker],
43 roomMessage: [null, this.roomMessagesChecker]
44 };
45 var commands = this.server.rpcRequestsNames;
46 var _iteratorNormalCompletion = true;
47 var _didIteratorError = false;
48 var _iteratorError = undefined;
49
50 try {
51 for (var _iterator = (0, _getIterator3.default)(commands), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
52 var cmd = _step.value;
53
54 this.checkers.set(cmd, this[cmd]());
55 }
56 } catch (err) {
57 _didIteratorError = true;
58 _iteratorError = err;
59 } finally {
60 try {
61 if (!_iteratorNormalCompletion && _iterator.return) {
62 _iterator.return();
63 }
64 } finally {
65 if (_didIteratorError) {
66 throw _iteratorError;
67 }
68 }
69 }
70 }
71
72 (0, _createClass3.default)(ArgumentsValidator, [{
73 key: 'checkArguments',
74 value: function checkArguments(name) {
75 var _this = this;
76
77 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
78 args[_key - 1] = arguments[_key];
79 }
80
81 var _possiblyCallback = possiblyCallback(args);
82
83 var _possiblyCallback2 = (0, _slicedToArray3.default)(_possiblyCallback, 2);
84
85 var nargs = _possiblyCallback2[0];
86 var cb = _possiblyCallback2[1];
87
88 return Promise.try(function () {
89 var checkers = _this.checkers.get(name);
90 if (!checkers) {
91 var _error = new ChatServiceError('noCommand', name);
92 return Promise.reject(_error);
93 }
94 var error = _this.checkTypes(checkers, nargs);
95 if (error) {
96 return Promise.reject(error);
97 }
98 var customCheckers = _this.customCheckers[name] || [];
99 return Promise.each(customCheckers, function (checker, idx) {
100 if (checker) {
101 return Promise.fromCallback(function (fn) {
102 return checker(nargs[idx], fn);
103 });
104 } else {
105 return Promise.resolve();
106 }
107 }).return();
108 }).asCallback(cb);
109 }
110 }, {
111 key: 'getArgsCount',
112 value: function getArgsCount(name) {
113 var checker = this.checkers.get(name);
114 return checker ? checker.length : 0;
115 }
116 }, {
117 key: 'splitArguments',
118 value: function splitArguments(name, oargs) {
119 var nargs = this.getArgsCount(name);
120 var args = _.slice(oargs, 0, nargs);
121 var restArgs = _.slice(oargs, nargs);
122 return { args: args, restArgs: restArgs };
123 }
124 }, {
125 key: 'checkMessage',
126 value: function checkMessage(msg) {
127 return check.object(msg) && check.string(msg.textMessage) && _.keys(msg).length === 1;
128 }
129 }, {
130 key: 'checkObject',
131 value: function checkObject(obj) {
132 return check.object(obj);
133 }
134 }, {
135 key: 'checkTypes',
136 value: function checkTypes(checkers, args) {
137 if (args.length !== checkers.length) {
138 return new ChatServiceError('wrongArgumentsCount', checkers.length, args.length);
139 }
140 for (var idx = 0; idx < checkers.length; idx++) {
141 var checker = checkers[idx];
142 if (!checker(args[idx])) {
143 return new ChatServiceError('badArgument', idx, args[idx]);
144 }
145 }
146 return null;
147 }
148 }, {
149 key: 'directAddToList',
150 value: function directAddToList(listName, userNames) {
151 return [check.string, check.array.of.string];
152 }
153 }, {
154 key: 'directGetAccessList',
155 value: function directGetAccessList(listName) {
156 return [check.string];
157 }
158 }, {
159 key: 'directGetWhitelistMode',
160 value: function directGetWhitelistMode() {
161 return [];
162 }
163 }, {
164 key: 'directMessage',
165 value: function directMessage(toUser, msg) {
166 return [check.string, this.directMessagesChecker ? this.checkObject : this.checkMessage];
167 }
168 }, {
169 key: 'directRemoveFromList',
170 value: function directRemoveFromList(listName, userNames) {
171 return [check.string, check.array.of.string];
172 }
173 }, {
174 key: 'directSetWhitelistMode',
175 value: function directSetWhitelistMode(mode) {
176 return [check.boolean];
177 }
178 }, {
179 key: 'listOwnSockets',
180 value: function listOwnSockets() {
181 return [];
182 }
183 }, {
184 key: 'roomAddToList',
185 value: function roomAddToList(roomName, listName, userNames) {
186 return [check.string, check.string, check.array.of.string];
187 }
188 }, {
189 key: 'roomCreate',
190 value: function roomCreate(roomName, mode) {
191 return [check.string, check.boolean];
192 }
193 }, {
194 key: 'roomDelete',
195 value: function roomDelete(roomName) {
196 return [check.string];
197 }
198 }, {
199 key: 'roomGetAccessList',
200 value: function roomGetAccessList(roomName, listName) {
201 return [check.string, check.string];
202 }
203 }, {
204 key: 'roomGetOwner',
205 value: function roomGetOwner(roomName) {
206 return [check.string];
207 }
208 }, {
209 key: 'roomGetWhitelistMode',
210 value: function roomGetWhitelistMode(roomName) {
211 return [check.string];
212 }
213 }, {
214 key: 'roomRecentHistory',
215 value: function roomRecentHistory(roomName) {
216 return [check.string];
217 }
218 }, {
219 key: 'roomHistoryGet',
220 value: function roomHistoryGet(roomName, id, limit) {
221 return [check.string, function (str) {
222 return check.greaterOrEqual(str, 0);
223 }, function (str) {
224 return check.greaterOrEqual(str, 1);
225 }];
226 }
227 }, {
228 key: 'roomHistoryInfo',
229 value: function roomHistoryInfo(roomName) {
230 return [check.string];
231 }
232 }, {
233 key: 'roomJoin',
234 value: function roomJoin(roomName) {
235 return [check.string];
236 }
237 }, {
238 key: 'roomLeave',
239 value: function roomLeave(roomName) {
240 return [check.string];
241 }
242 }, {
243 key: 'roomMessage',
244 value: function roomMessage(roomName, msg) {
245 return [check.string, this.roomMessagesChecker ? this.checkObject : this.checkMessage];
246 }
247 }, {
248 key: 'roomNotificationsInfo',
249 value: function roomNotificationsInfo(roomName) {
250 return [check.string];
251 }
252 }, {
253 key: 'roomRemoveFromList',
254 value: function roomRemoveFromList(roomName, listName, userNames) {
255 return [check.string, check.string, check.array.of.string];
256 }
257 }, {
258 key: 'roomSetWhitelistMode',
259 value: function roomSetWhitelistMode(roomName, mode) {
260 return [check.string, check.boolean];
261 }
262 }, {
263 key: 'roomUserSeen',
264 value: function roomUserSeen(roomName, userName) {
265 return [check.string, check.string];
266 }
267 }, {
268 key: 'systemMessage',
269 value: function systemMessage(data) {
270 return [function () {
271 return true;
272 }];
273 }
274 }]);
275 return ArgumentsValidator;
276}();
277
278module.exports = ArgumentsValidator;
279//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Bcmd1bWVudHNWYWxpZGF0b3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTSxtQkFBbUIsUUFBUSxvQkFBUixDQUF6QjtBQUNBLElBQU0sVUFBVSxRQUFRLHNCQUFSLENBQWhCO0FBQ0EsSUFBTSxVQUFVLFFBQVEsVUFBUixDQUFoQjtBQUNBLElBQU0sSUFBSSxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU0sUUFBUSxRQUFRLGFBQVIsQ0FBZDs7ZUFDNkIsUUFBUSxTQUFSLEM7O0lBQXJCLGdCLFlBQUEsZ0I7O0FBRVI7O0lBQ00sa0I7QUFFSiw4QkFBYSxNQUFiLEVBQXFCO0FBQUE7O0FBQ25CLFNBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxTQUFLLFFBQUwsR0FBZ0IsSUFBSSxPQUFKLEVBQWhCO0FBQ0EsU0FBSyxxQkFBTCxHQUE2QixLQUFLLE1BQUwsQ0FBWSxxQkFBekM7QUFDQSxTQUFLLG1CQUFMLEdBQTJCLEtBQUssTUFBTCxDQUFZLG1CQUF2QztBQUNBLFNBQUssY0FBTCxHQUFzQjtBQUNwQixxQkFBZSxDQUFFLElBQUYsRUFBUSxLQUFLLHFCQUFiLENBREs7QUFFcEIsbUJBQWEsQ0FBRSxJQUFGLEVBQVEsS0FBSyxtQkFBYjtBQUZPLEtBQXRCO0FBSUEsUUFBSSxXQUFXLEtBQUssTUFBTCxDQUFZLGdCQUEzQjtBQVRtQjtBQUFBO0FBQUE7O0FBQUE7QUFVbkIsc0RBQWdCLFFBQWhCLDRHQUEwQjtBQUFBLFlBQWpCLEdBQWlCOztBQUN4QixhQUFLLFFBQUwsQ0FBYyxHQUFkLENBQWtCLEdBQWxCLEVBQXVCLEtBQUssR0FBTCxHQUF2QjtBQUNEO0FBWmtCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhcEI7Ozs7bUNBRWUsSSxFQUFlO0FBQUE7O0FBQUEsd0NBQU4sSUFBTTtBQUFOLFlBQU07QUFB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QSxlQUFPLE1BQU0sY0FBTixDQUFxQixHQUFyQixFQUEwQixDQUExQixDQUFQO0FBQUEsT0FISyxDQUFQO0FBS0Q7OztvQ0FFZ0IsUSxFQUFVO0FBQ3pCLGFBQU8sQ0FDTCxNQUFNLE1BREQsQ0FBUDtBQUdEOzs7NkJBRVMsUSxFQUFVO0FBQ2xCLGFBQU8sQ0FDTCxNQUFNLE1BREQsQ0FBUDtBQUdEOzs7OEJBRVUsUSxFQUFVO0FBQ25CLGFBQU8sQ0FDTCxNQUFNLE1BREQsQ0FBUDtBQUdEOzs7Z0NBRVksUSxFQUFVLEcsRUFBSztBQUMxQixhQUFPLENBQ0wsTUFBTSxNQURELEVBRUwsS0FBSyxtQkFBTCxHQUEyQixLQUFLLFdBQWhDLEdBQThDLEtBQUssWUFGOUMsQ0FBUDtBQUlEOzs7MENBRXNCLFEsRUFBVTtBQUMvQixhQUFPLENBQ0wsTUFBTSxNQURELENBQVA7QUFHRDs7O3VDQUVtQixRLEVBQVUsUSxFQUFVLFMsRUFBVztBQUNqRCxhQUFPLENBQ0wsTUFBTSxNQURELEVBRUwsTUFBTSxNQUZELEVBR0wsTUFBTSxLQUFOLENBQVksRUFBWixDQUFlLE1BSFYsQ0FBUDtBQUtEOzs7eUNBRXFCLFEsRUFBVSxJLEVBQU07QUFDcEMsYUFBTyxDQUNMLE1BQU0sTUFERCxFQUVMLE1BQU0sT0FGRCxDQUFQO0FBSUQ7OztpQ0FFYSxRLEVBQVUsUSxFQUFVO0FBQ2hDLGFBQU8sQ0FDTCxNQUFNLE1BREQsRUFFTCxNQUFNLE1BRkQsQ0FBUDtBQUlEOzs7a0NBRWMsSSxFQUFNO0FBQ25CLGFBQU8sQ0FDTDtBQUFBLGVBQU0sSUFBTjtBQUFBLE9BREssQ0FBUDtBQUdEOzs7OztBQUdILE9BQU8sT0FBUCxHQUFpQixrQkFBakIiLCJmaWxlIjoiQXJndW1lbnRzVmFsaWRhdG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IENoYXRTZXJ2aWNlRXJyb3IgPSByZXF1aXJlKCcuL0NoYXRTZXJ2aWNlRXJyb3InKVxuY29uc3QgRmFzdE1hcCA9IHJlcXVpcmUoJ2NvbGxlY3Rpb25zL2Zhc3QtbWFwJylcbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKCdibHVlYmlyZCcpXG5jb25zdCBfID0gcmVxdWlyZSgnbG9kYXNoJylcbmNvbnN0IGNoZWNrID0gcmVxdWlyZSgnY2hlY2stdHlwZXMnKVxuY29uc3QgeyBwb3NzaWJseUNhbGxiYWNrIH0gPSByZXF1aXJlKCcuL3V0aWxzJylcblxuLy8gQ29tbWFuZHMgYXJndW1lbnRzIHR5cGUgYW5kIGNvdW50IHZhbGlkYXRpb24uXG5jbGFzcyBBcmd1bWVudHNWYWxpZGF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yIChzZXJ2ZXIpIHtcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlclxuICAgIHRoaXMuY2hlY2tlcnMgPSBuZXcgRmFzdE1hcCgpXG4gICAgdGhpcy5kaXJlY3RNZXNzYWdlc0NoZWNrZXIgPSB0aGlzLnNlcnZlci5kaXJlY3RNZXNzYWdlc0NoZWNrZXJcbiAgICB0aGlzLnJvb21NZXNzYWdlc0NoZWNrZXIgPSB0aGlzLnNlcnZlci5yb29tTWVzc2FnZXNDaGVja2VyXG4gICAgdGhpcy5jdXN0b21DaGVja2VycyA9IHtcbiAgICAgIGRpcmVjdE1lc3NhZ2U6IFsgbnVsbCwgdGhpcy5kaXJlY3RNZXNzYWdlc0NoZWNrZXIgXSxcbiAgICAgIHJvb21NZXNzYWdlOiBbIG51bGwsIHRoaXMucm9vbU1lc3NhZ2VzQ2hlY2tlciBdXG4gICAgfVxuICAgIGxldCBjb21tYW5kcyA9IHRoaXMuc2VydmVyLnJwY1JlcXVlc3RzTmFtZXNcbiAgICBmb3IgKGxldCBjbWQgb2YgY29tbWFuZHMpIHtcbiAgICAgIHRoaXMuY2hlY2tlcnMuc2V0KGNtZCwgdGhpc1tjbWRdKCkpXG4gICAgfVxuICB9XG5cbiAgY2hlY2tBcmd1bWVudHMgKG5hbWUsIC4uLmFyZ3MpIHtcbiAgICBsZXQgW25hcmdzLCBjYl0gPSBwb3NzaWJseUNhbGxiYWNrKGFyZ3MpXG4gICAgcmV0dXJuIFByb21pc2UudHJ5KCgpID0+IHtcbiAgICAgIGxldCBjaGVja2VycyA9IHRoaXMuY2hlY2tlcnMuZ2V0KG5hbWUpXG4gICAgICBpZiAoIWNoZWNrZXJzKSB7XG4gICAgICAgIGxldCBlcnJvciA9IG5ldyBDaGF0U2VydmljZUVycm9yKCdub0NvbW1hbmQnLCBuYW1lKVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgICBsZXQgZXJyb3IgPSB0aGlzLmNoZWNrVHlwZXMoY2hlY2tlcnMsIG5hcmdzKVxuICAgICAgaWYgKGVycm9yKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcikgfVxuICAgICAgbGV0IGN1c3RvbUNoZWNrZXJzID0gdGhpcy5jdXN0b21DaGVja2Vyc1tuYW1lXSB8fCBbXVxuICAgICAgcmV0dXJuIFByb21pc2UuZWFjaChjdXN0b21DaGVja2VycywgKGNoZWNrZXIsIGlkeCkgPT4ge1xuICAgICAgICBpZiAoY2hlY2tlcikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLmZyb21DYWxsYmFjayhmbiA9PiBjaGVja2VyKG5hcmdzW2lkeF0sIGZuKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgfVxuICAgICAgfSkucmV0dXJuKClcbiAgICB9KS5hc0NhbGxiYWNrKGNiKVxuICB9XG5cbiAgZ2V0QXJnc0NvdW50IChuYW1lKSB7XG4gICAgbGV0IGNoZWNrZXIgPSB0aGlzLmNoZWNrZXJzLmdldChuYW1lKVxuICAgIHJldHVybiBjaGVja2VyID8gY2hlY2tlci5sZW5ndGggOiAwXG4gIH1cblxuICBzcGxpdEFyZ3VtZW50cyAobmFtZSwgb2FyZ3MpIHtcbiAgICBsZXQgbmFyZ3MgPSB0aGlzLmdldEFyZ3NDb3VudChuYW1lKVxuICAgIGxldCBhcmdzID0gXy5zbGljZShvYXJncywgMCwgbmFyZ3MpXG4gICAgbGV0IHJlc3RBcmdzID0gXy5zbGljZShvYXJncywgbmFyZ3MpXG4gICAgcmV0dXJuIHthcmdzLCByZXN0QXJnc31cbiAgfVxuXG4gIGNoZWNrTWVzc2FnZSAobXNnKSB7XG4gICAgcmV0dXJuIGNoZWNrLm9iamVjdChtc2cpICYmXG4gICAgICBjaGVjay5zdHJpbmcobXNnLnRleHRNZXNzYWdlKSAmJlxuICAgICAgXy5rZXlzKG1zZykubGVuZ3RoID09PSAxXG4gIH1cblxuICBjaGVja09iamVjdCAob2JqKSB7XG4gICAgcmV0dXJuIGNoZWNrLm9iamVjdChvYmopXG4gIH1cblxuICBjaGVja1R5cGVzIChjaGVja2VycywgYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gY2hlY2tlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbmV3IENoYXRTZXJ2aWNlRXJyb3IoJ3dyb25nQXJndW1lbnRzQ291bnQnXG4gICAgICAgICwgY2hlY2tlcnMubGVuZ3RoLCBhcmdzLmxlbmd0aClcbiAgICB9XG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2hlY2tlcnMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgbGV0IGNoZWNrZXIgPSBjaGVja2Vyc1tpZHhdXG4gICAgICBpZiAoIWNoZWNrZXIoYXJnc1tpZHhdKSkge1xuICAgICAgICByZXR1cm4gbmV3IENoYXRTZXJ2aWNlRXJyb3IoJ2JhZEFyZ3VtZW50JywgaWR4LCBhcmdzW2lkeF0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBkaXJlY3RBZGRUb0xpc3QgKGxpc3ROYW1lLCB1c2VyTmFtZXMpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nLFxuICAgICAgY2hlY2suYXJyYXkub2Yuc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgZGlyZWN0R2V0QWNjZXNzTGlzdCAobGlzdE5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgZGlyZWN0R2V0V2hpdGVsaXN0TW9kZSAoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBkaXJlY3RNZXNzYWdlICh0b1VzZXIsIG1zZykge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICB0aGlzLmRpcmVjdE1lc3NhZ2VzQ2hlY2tlciA/IHRoaXMuY2hlY2tPYmplY3QgOiB0aGlzLmNoZWNrTWVzc2FnZVxuICAgIF1cbiAgfVxuXG4gIGRpcmVjdFJlbW92ZUZyb21MaXN0IChsaXN0TmFtZSwgdXNlck5hbWVzKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLmFycmF5Lm9mLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIGRpcmVjdFNldFdoaXRlbGlzdE1vZGUgKG1vZGUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suYm9vbGVhblxuICAgIF1cbiAgfVxuXG4gIGxpc3RPd25Tb2NrZXRzICgpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJvb21BZGRUb0xpc3QgKHJvb21OYW1lLCBsaXN0TmFtZSwgdXNlck5hbWVzKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLmFycmF5Lm9mLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIHJvb21DcmVhdGUgKHJvb21OYW1lLCBtb2RlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLmJvb2xlYW5cbiAgICBdXG4gIH1cblxuICByb29tRGVsZXRlIChyb29tTmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tR2V0QWNjZXNzTGlzdCAocm9vbU5hbWUsIGxpc3ROYW1lKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIHJvb21HZXRPd25lciAocm9vbU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgcm9vbUdldFdoaXRlbGlzdE1vZGUgKHJvb21OYW1lKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIHJvb21SZWNlbnRIaXN0b3J5IChyb29tTmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tSGlzdG9yeUdldCAocm9vbU5hbWUsIGlkLCBsaW1pdCkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBzdHIgPT4gY2hlY2suZ3JlYXRlck9yRXF1YWwoc3RyLCAwKSxcbiAgICAgIHN0ciA9PiBjaGVjay5ncmVhdGVyT3JFcXVhbChzdHIsIDEpXG4gICAgXVxuICB9XG5cbiAgcm9vbUhpc3RvcnlJbmZvIChyb29tTmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tSm9pbiAocm9vbU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgcm9vbUxlYXZlIChyb29tTmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tTWVzc2FnZSAocm9vbU5hbWUsIG1zZykge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICB0aGlzLnJvb21NZXNzYWdlc0NoZWNrZXIgPyB0aGlzLmNoZWNrT2JqZWN0IDogdGhpcy5jaGVja01lc3NhZ2VcbiAgICBdXG4gIH1cblxuICByb29tTm90aWZpY2F0aW9uc0luZm8gKHJvb21OYW1lKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIHJvb21SZW1vdmVGcm9tTGlzdCAocm9vbU5hbWUsIGxpc3ROYW1lLCB1c2VyTmFtZXMpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nLFxuICAgICAgY2hlY2suc3RyaW5nLFxuICAgICAgY2hlY2suYXJyYXkub2Yuc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgcm9vbVNldFdoaXRlbGlzdE1vZGUgKHJvb21OYW1lLCBtb2RlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLmJvb2xlYW5cbiAgICBdXG4gIH1cblxuICByb29tVXNlclNlZW4gKHJvb21OYW1lLCB1c2VyTmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5zdHJpbmdcbiAgICBdXG4gIH1cblxuICBzeXN0ZW1NZXNzYWdlIChkYXRhKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICgpID0+IHRydWVcbiAgICBdXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBcmd1bWVudHNWYWxpZGF0b3JcbiJdfQ==
\No newline at end of file