1 | ;
|
2 |
|
3 | var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
|
4 |
|
5 | var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
|
6 |
|
7 | var _getIterator2 = require('babel-runtime/core-js/get-iterator');
|
8 |
|
9 | var _getIterator3 = _interopRequireDefault(_getIterator2);
|
10 |
|
11 | var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
|
12 |
|
13 | var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
|
14 |
|
15 | var _createClass2 = require('babel-runtime/helpers/createClass');
|
16 |
|
17 | var _createClass3 = _interopRequireDefault(_createClass2);
|
18 |
|
19 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
20 |
|
21 | var ChatServiceError = require('./ChatServiceError');
|
22 | var FastMap = require('collections/fast-map');
|
23 | var Promise = require('bluebird');
|
24 | var _ = require('lodash');
|
25 | var check = require('check-types');
|
26 |
|
27 | var _require = require('./utils');
|
28 |
|
29 | var possiblyCallback = _require.possiblyCallback;
|
30 |
|
31 | // Commands arguments type and count validation.
|
32 |
|
33 | var 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 |
|
278 | module.exports = ArgumentsValidator;
|
279 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Bcmd1bWVudHNWYWxpZGF0b3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTSxtQkFBbUIsUUFBUSxvQkFBUixDQUF6QjtBQUNBLElBQU0sVUFBVSxRQUFRLHNCQUFSLENBQWhCO0FBQ0EsSUFBTSxVQUFVLFFBQVEsVUFBUixDQUFoQjtBQUNBLElBQU0sSUFBSSxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU0sUUFBUSxRQUFRLGFBQVIsQ0FBZDs7ZUFDNkIsUUFBUSxTQUFSLEM7O0lBQXJCLGdCLFlBQUEsZ0I7O0FBRVI7O0lBQ00sa0I7QUFFSiw4QkFBYSxNQUFiLEVBQXFCO0FBQUE7O0FBQ25CLFNBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxTQUFLLFFBQUwsR0FBZ0IsSUFBSSxPQUFKLEVBQWhCO0FBQ0EsU0FBSyxxQkFBTCxHQUE2QixLQUFLLE1BQUwsQ0FBWSxxQkFBekM7QUFDQSxTQUFLLG1CQUFMLEdBQTJCLEtBQUssTUFBTCxDQUFZLG1CQUF2QztBQUNBLFNBQUssY0FBTCxHQUFzQjtBQUNwQixxQkFBZSxDQUFFLElBQUYsRUFBUSxLQUFLLHFCQUFiLENBREs7QUFFcEIsbUJBQWEsQ0FBRSxJQUFGLEVBQVEsS0FBSyxtQkFBYjtBQUZPLEtBQXRCO0FBSUEsUUFBSSxXQUFXLEtBQUssTUFBTCxDQUFZLGdCQUEzQjtBQVRtQjtBQUFBO0FBQUE7O0FBQUE7QUFVbkIsc0RBQWdCLFFBQWhCLDRHQUEwQjtBQUFBLFlBQWpCLEdBQWlCOztBQUN4QixhQUFLLFFBQUwsQ0FBYyxHQUFkLENBQWtCLEdBQWxCLEVBQXVCLEtBQUssR0FBTCxHQUF2QjtBQUNEO0FBWmtCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhcEI7Ozs7bUNBRWUsSSxFQUFlO0FBQUE7O0FBQUEsd0NBQU4sSUFBTTtBQUFOLFlBQU07QUFB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QUEsZUFBTyxNQUFNLGNBQU4sQ0FBcUIsR0FBckIsRUFBMEIsQ0FBMUIsQ0FBUDtBQUFBLE9BSEssQ0FBUDtBQUtEOzs7b0NBRWdCLFEsRUFBVTtBQUN6QixhQUFPLENBQ0wsTUFBTSxNQURELENBQVA7QUFHRDs7OzZCQUVTLFEsRUFBVTtBQUNsQixhQUFPLENBQ0wsTUFBTSxNQURELENBQVA7QUFHRDs7OzhCQUVVLFEsRUFBVTtBQUNuQixhQUFPLENBQ0wsTUFBTSxNQURELENBQVA7QUFHRDs7O2dDQUVZLFEsRUFBVSxHLEVBQUs7QUFDMUIsYUFBTyxDQUNMLE1BQU0sTUFERCxFQUVMLEtBQUssbUJBQUwsR0FBMkIsS0FBSyxXQUFoQyxHQUE4QyxLQUFLLFlBRjlDLENBQVA7QUFJRDs7OzBDQUVzQixRLEVBQVU7QUFDL0IsYUFBTyxDQUNMLE1BQU0sTUFERCxDQUFQO0FBR0Q7Ozt1Q0FFbUIsUSxFQUFVLFEsRUFBVSxTLEVBQVc7QUFDakQsYUFBTyxDQUNMLE1BQU0sTUFERCxFQUVMLE1BQU0sTUFGRCxFQUdMLE1BQU0sS0FBTixDQUFZLEVBQVosQ0FBZSxNQUhWLENBQVA7QUFLRDs7O3lDQUVxQixRLEVBQVUsSSxFQUFNO0FBQ3BDLGFBQU8sQ0FDTCxNQUFNLE1BREQsRUFFTCxNQUFNLE9BRkQsQ0FBUDtBQUlEOzs7aUNBRWEsUSxFQUFVLFEsRUFBVTtBQUNoQyxhQUFPLENBQ0wsTUFBTSxNQURELEVBRUwsTUFBTSxNQUZELENBQVA7QUFJRDs7O2tDQUVjLEksRUFBTTtBQUNuQixhQUFPLENBQ0w7QUFBQSxlQUFNLElBQU47QUFBQSxPQURLLENBQVA7QUFHRDs7Ozs7QUFHSCxPQUFPLE9BQVAsR0FBaUIsa0JBQWpCIiwiZmlsZSI6IkFyZ3VtZW50c1ZhbGlkYXRvci5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBDaGF0U2VydmljZUVycm9yID0gcmVxdWlyZSgnLi9DaGF0U2VydmljZUVycm9yJylcbmNvbnN0IEZhc3RNYXAgPSByZXF1aXJlKCdjb2xsZWN0aW9ucy9mYXN0LW1hcCcpXG5jb25zdCBQcm9taXNlID0gcmVxdWlyZSgnYmx1ZWJpcmQnKVxuY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpXG5jb25zdCBjaGVjayA9IHJlcXVpcmUoJ2NoZWNrLXR5cGVzJylcbmNvbnN0IHsgcG9zc2libHlDYWxsYmFjayB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5cbi8vIENvbW1hbmRzIGFyZ3VtZW50cyB0eXBlIGFuZCBjb3VudCB2YWxpZGF0aW9uLlxuY2xhc3MgQXJndW1lbnRzVmFsaWRhdG9yIHtcblxuICBjb25zdHJ1Y3RvciAoc2VydmVyKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXJcbiAgICB0aGlzLmNoZWNrZXJzID0gbmV3IEZhc3RNYXAoKVxuICAgIHRoaXMuZGlyZWN0TWVzc2FnZXNDaGVja2VyID0gdGhpcy5zZXJ2ZXIuZGlyZWN0TWVzc2FnZXNDaGVja2VyXG4gICAgdGhpcy5yb29tTWVzc2FnZXNDaGVja2VyID0gdGhpcy5zZXJ2ZXIucm9vbU1lc3NhZ2VzQ2hlY2tlclxuICAgIHRoaXMuY3VzdG9tQ2hlY2tlcnMgPSB7XG4gICAgICBkaXJlY3RNZXNzYWdlOiBbIG51bGwsIHRoaXMuZGlyZWN0TWVzc2FnZXNDaGVja2VyIF0sXG4gICAgICByb29tTWVzc2FnZTogWyBudWxsLCB0aGlzLnJvb21NZXNzYWdlc0NoZWNrZXIgXVxuICAgIH1cbiAgICBsZXQgY29tbWFuZHMgPSB0aGlzLnNlcnZlci5ycGNSZXF1ZXN0c05hbWVzXG4gICAgZm9yIChsZXQgY21kIG9mIGNvbW1hbmRzKSB7XG4gICAgICB0aGlzLmNoZWNrZXJzLnNldChjbWQsIHRoaXNbY21kXSgpKVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrQXJndW1lbnRzIChuYW1lLCAuLi5hcmdzKSB7XG4gICAgbGV0IFtuYXJncywgY2JdID0gcG9zc2libHlDYWxsYmFjayhhcmdzKVxuICAgIHJldHVybiBQcm9taXNlLnRyeSgoKSA9PiB7XG4gICAgICBsZXQgY2hlY2tlcnMgPSB0aGlzLmNoZWNrZXJzLmdldChuYW1lKVxuICAgICAgaWYgKCFjaGVja2Vycykge1xuICAgICAgICBsZXQgZXJyb3IgPSBuZXcgQ2hhdFNlcnZpY2VFcnJvcignbm9Db21tYW5kJywgbmFtZSlcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKVxuICAgICAgfVxuICAgICAgbGV0IGVycm9yID0gdGhpcy5jaGVja1R5cGVzKGNoZWNrZXJzLCBuYXJncylcbiAgICAgIGlmIChlcnJvcikgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpIH1cbiAgICAgIGxldCBjdXN0b21DaGVja2VycyA9IHRoaXMuY3VzdG9tQ2hlY2tlcnNbbmFtZV0gfHwgW11cbiAgICAgIHJldHVybiBQcm9taXNlLmVhY2goY3VzdG9tQ2hlY2tlcnMsIChjaGVja2VyLCBpZHgpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrZXIpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5mcm9tQ2FsbGJhY2soZm4gPT4gY2hlY2tlcihuYXJnc1tpZHhdLCBmbikpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pLnJldHVybigpXG4gICAgfSkuYXNDYWxsYmFjayhjYilcbiAgfVxuXG4gIGdldEFyZ3NDb3VudCAobmFtZSkge1xuICAgIGxldCBjaGVja2VyID0gdGhpcy5jaGVja2Vycy5nZXQobmFtZSlcbiAgICByZXR1cm4gY2hlY2tlciA/IGNoZWNrZXIubGVuZ3RoIDogMFxuICB9XG5cbiAgc3BsaXRBcmd1bWVudHMgKG5hbWUsIG9hcmdzKSB7XG4gICAgbGV0IG5hcmdzID0gdGhpcy5nZXRBcmdzQ291bnQobmFtZSlcbiAgICBsZXQgYXJncyA9IF8uc2xpY2Uob2FyZ3MsIDAsIG5hcmdzKVxuICAgIGxldCByZXN0QXJncyA9IF8uc2xpY2Uob2FyZ3MsIG5hcmdzKVxuICAgIHJldHVybiB7YXJncywgcmVzdEFyZ3N9XG4gIH1cblxuICBjaGVja01lc3NhZ2UgKG1zZykge1xuICAgIHJldHVybiBjaGVjay5vYmplY3QobXNnKSAmJlxuICAgICAgY2hlY2suc3RyaW5nKG1zZy50ZXh0TWVzc2FnZSkgJiZcbiAgICAgIF8ua2V5cyhtc2cpLmxlbmd0aCA9PT0gMVxuICB9XG5cbiAgY2hlY2tPYmplY3QgKG9iaikge1xuICAgIHJldHVybiBjaGVjay5vYmplY3Qob2JqKVxuICB9XG5cbiAgY2hlY2tUeXBlcyAoY2hlY2tlcnMsIGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggIT09IGNoZWNrZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5ldyBDaGF0U2VydmljZUVycm9yKFxuICAgICAgICAnd3JvbmdBcmd1bWVudHNDb3VudCcsIGNoZWNrZXJzLmxlbmd0aCwgYXJncy5sZW5ndGgpXG4gICAgfVxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNoZWNrZXJzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgIGxldCBjaGVja2VyID0gY2hlY2tlcnNbaWR4XVxuICAgICAgaWYgKCFjaGVja2VyKGFyZ3NbaWR4XSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGF0U2VydmljZUVycm9yKCdiYWRBcmd1bWVudCcsIGlkeCwgYXJnc1tpZHhdKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZGlyZWN0QWRkVG9MaXN0IChsaXN0TmFtZSwgdXNlck5hbWVzKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLmFycmF5Lm9mLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIGRpcmVjdEdldEFjY2Vzc0xpc3QgKGxpc3ROYW1lKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIGRpcmVjdEdldFdoaXRlbGlzdE1vZGUgKCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgZGlyZWN0TWVzc2FnZSAodG9Vc2VyLCBtc2cpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nLFxuICAgICAgdGhpcy5kaXJlY3RNZXNzYWdlc0NoZWNrZXIgPyB0aGlzLmNoZWNrT2JqZWN0IDogdGhpcy5jaGVja01lc3NhZ2VcbiAgICBdXG4gIH1cblxuICBkaXJlY3RSZW1vdmVGcm9tTGlzdCAobGlzdE5hbWUsIHVzZXJOYW1lcykge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5hcnJheS5vZi5zdHJpbmdcbiAgICBdXG4gIH1cblxuICBkaXJlY3RTZXRXaGl0ZWxpc3RNb2RlIChtb2RlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLmJvb2xlYW5cbiAgICBdXG4gIH1cblxuICBsaXN0T3duU29ja2V0cyAoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByb29tQWRkVG9MaXN0IChyb29tTmFtZSwgbGlzdE5hbWUsIHVzZXJOYW1lcykge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5hcnJheS5vZi5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tQ3JlYXRlIChyb29tTmFtZSwgbW9kZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5ib29sZWFuXG4gICAgXVxuICB9XG5cbiAgcm9vbURlbGV0ZSAocm9vbU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgcm9vbUdldEFjY2Vzc0xpc3QgKHJvb21OYW1lLCBsaXN0TmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tR2V0T3duZXIgKHJvb21OYW1lKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIHJvb21HZXRXaGl0ZWxpc3RNb2RlIChyb29tTmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tUmVjZW50SGlzdG9yeSAocm9vbU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgcm9vbUhpc3RvcnlHZXQgKHJvb21OYW1lLCBpZCwgbGltaXQpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nLFxuICAgICAgc3RyID0+IGNoZWNrLmdyZWF0ZXJPckVxdWFsKHN0ciwgMCksXG4gICAgICBzdHIgPT4gY2hlY2suZ3JlYXRlck9yRXF1YWwoc3RyLCAxKVxuICAgIF1cbiAgfVxuXG4gIHJvb21IaXN0b3J5SW5mbyAocm9vbU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgcm9vbUpvaW4gKHJvb21OYW1lKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIHJvb21MZWF2ZSAocm9vbU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgcm9vbU1lc3NhZ2UgKHJvb21OYW1lLCBtc2cpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nLFxuICAgICAgdGhpcy5yb29tTWVzc2FnZXNDaGVja2VyID8gdGhpcy5jaGVja09iamVjdCA6IHRoaXMuY2hlY2tNZXNzYWdlXG4gICAgXVxuICB9XG5cbiAgcm9vbU5vdGlmaWNhdGlvbnNJbmZvIChyb29tTmFtZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmdcbiAgICBdXG4gIH1cblxuICByb29tUmVtb3ZlRnJvbUxpc3QgKHJvb21OYW1lLCBsaXN0TmFtZSwgdXNlck5hbWVzKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLnN0cmluZyxcbiAgICAgIGNoZWNrLmFycmF5Lm9mLnN0cmluZ1xuICAgIF1cbiAgfVxuXG4gIHJvb21TZXRXaGl0ZWxpc3RNb2RlIChyb29tTmFtZSwgbW9kZSkge1xuICAgIHJldHVybiBbXG4gICAgICBjaGVjay5zdHJpbmcsXG4gICAgICBjaGVjay5ib29sZWFuXG4gICAgXVxuICB9XG5cbiAgcm9vbVVzZXJTZWVuIChyb29tTmFtZSwgdXNlck5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY2hlY2suc3RyaW5nLFxuICAgICAgY2hlY2suc3RyaW5nXG4gICAgXVxuICB9XG5cbiAgc3lzdGVtTWVzc2FnZSAoZGF0YSkge1xuICAgIHJldHVybiBbXG4gICAgICAoKSA9PiB0cnVlXG4gICAgXVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQXJndW1lbnRzVmFsaWRhdG9yXG4iXX0= |
\ | No newline at end of file |