@lotus-tree/fg-notation 1.1.4 → 1.2.0

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.
package/README.md CHANGED
@@ -23,20 +23,21 @@ https://user-images.githubusercontent.com/19596334/149458504-baf906a3-87da-4d92-
23
23
  https://user-images.githubusercontent.com/19596334/149458508-1dcf89fb-a83e-44bb-a6a0-9549771c6082.mp4
24
24
 
25
25
  ## Available games
26
- | Game | Name |
27
- |---------------------|------|
28
- | Blazblue | bb |
29
- | Dragonball Fighterz | dbz |
30
- | DNF Duel | dnf |
31
- | Granblue Versus | gbf |
32
- | Guilty Gear | gg |
33
- | King of Fighters | kof |
34
- | Mortal Kombat | mk |
35
- | Soul Calibur | sc |
36
- | Street Fighter | sf |
37
- | Skullgirlz | sg |
38
- | Them Fighting Herds | tfh |
39
- | Tekken | tkn |
26
+ | Game | Name |
27
+ |----------------------------|-------|
28
+ | Blazblue | bb |
29
+ | Blazblue: Cross Tag Battle | bbtag |
30
+ | Dragonball Fighterz | dbz |
31
+ | DNF Duel | dnf |
32
+ | Granblue Versus | gbf |
33
+ | Guilty Gear | gg |
34
+ | King of Fighters | kof |
35
+ | Mortal Kombat | mk |
36
+ | Soul Calibur | sc |
37
+ | Street Fighter | sf |
38
+ | Skullgirlz | sg |
39
+ | Them Fighting Herds | tfh |
40
+ | Tekken | tkn |
40
41
 
41
42
  ## Add to your server
42
43
  Use [this link](https://discord.com/oauth2/authorize?client_id=928539052834177024&scope=bot&permissions=34816) to add this bot to your Discord server
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/dev/index.js CHANGED
@@ -9,10 +9,10 @@ exports["default"] = void 0;
9
9
 
10
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
11
 
12
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
12
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
13
 
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
16
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
17
 
18
18
  var _sharp = _interopRequireDefault(require("sharp"));
@@ -25,6 +25,8 @@ var _sequelize = require("sequelize");
25
25
 
26
26
  var _bent = _interopRequireDefault(require("bent"));
27
27
 
28
+ var _info = require("./info.json");
29
+
28
30
  var getJSON = (0, _bent["default"])('json');
29
31
 
30
32
  var imgPath = _path["default"].join(__dirname, 'img');
@@ -77,27 +79,55 @@ _glob["default"].sync(_path["default"].join(imgPath, 'basic/**'), {
77
79
  }).forEach(function (p) {
78
80
  var input = p.split('/').pop().replace('.png', '');
79
81
  basicInputs.set(input, p);
80
- });
82
+ var alias = _info.aliases.inputs.basic[input];
81
83
 
82
- basicInputs.set('>>', _path["default"].join(imgPath, 'basic/doubleforward.png'));
84
+ if (alias) {
85
+ alias.forEach(function (i) {
86
+ basicInputs.set(i, p);
87
+ if (_info.sizes[input]) _info.sizes[i] = _info.sizes[input];
88
+ });
89
+ }
90
+ });
83
91
 
84
- _glob["default"].sync(_path["default"].join(imgPath, 'games/**'), {
85
- nodir: true
86
- }).forEach(function (p) {
92
+ _glob["default"].sync(_path["default"].join(imgPath, 'games/*')).forEach(function (p) {
87
93
  var _path$parse = _path["default"].parse(_path["default"].relative(_path["default"].join(imgPath, 'games'), p)),
88
- dir = _path$parse.dir,
89
- name = _path$parse.name;
94
+ base = _path$parse.base;
95
+
96
+ gameInputs.set(base, new Map());
90
97
 
91
- if (!gameInputs.has(dir)) gameInputs.set(dir, new Map());
92
- gameInputs.get(dir).set(name, p);
98
+ _glob["default"].sync(_path["default"].join(imgPath, 'games', base, '**'), {
99
+ nodir: true
100
+ }).forEach(function (input) {
101
+ var _path$parse2 = _path["default"].parse(input),
102
+ name = _path$parse2.name;
103
+
104
+ gameInputs.get(base).set(name, input);
105
+ });
106
+
107
+ var alias = _info.aliases.inputs.games[base];
108
+
109
+ if (alias) {
110
+ for (var _i = 0, _Object$entries = Object.entries(alias); _i < _Object$entries.length; _i++) {
111
+ var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
112
+ a = _Object$entries$_i[0],
113
+ s = _Object$entries$_i[1];
114
+
115
+ gameInputs.get(base).set(a, s);
116
+ }
117
+ }
93
118
  });
94
119
 
95
120
  function solveInput(inputs, input) {
96
- if (inputs.has(input)) return [input];
121
+ if (inputs.has(input)) return isString(inputs.get(input)) ? [input] : inputs.get(input);
97
122
 
98
123
  for (var i = 0; i < input.length; i++) {
99
124
  var s1 = input.slice(0, 0 - i);
100
- if (inputs.has(s1)) return [s1].concat((0, _toConsumableArray2["default"])(solveInput(inputs, input.slice(0 - i))));
125
+
126
+ if (inputs.has(s1)) {
127
+ var result = inputs.get(s1);
128
+ var remaining = solveInput(inputs, input.slice(0 - i));
129
+ return isString(result) ? [s1].concat((0, _toConsumableArray2["default"])(remaining)) : [].concat((0, _toConsumableArray2["default"])(result), (0, _toConsumableArray2["default"])(remaining));
130
+ }
101
131
  }
102
132
 
103
133
  throw new Error("Cannot find \"".concat(input, "\" as a recognizable input"));
@@ -109,37 +139,61 @@ function sendInput(_x, _x2, _x3, _x4) {
109
139
 
110
140
  function _sendInput() {
111
141
  _sendInput = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(inputs, result, message, caption) {
112
- var canvas;
142
+ var width, images, left, canvas;
113
143
  return _regenerator["default"].wrap(function _callee7$(_context7) {
114
144
  while (1) {
115
145
  switch (_context7.prev = _context7.next) {
116
146
  case 0:
117
- _context7.next = 2;
118
- return (0, _sharp["default"])({
147
+ width = result.map(function (it) {
148
+ return _info.sizes[it] || 152;
149
+ }).reduce(function (a, b) {
150
+ return a + b;
151
+ }, 0);
152
+ images = [];
153
+ left = 0;
154
+ result.forEach(function (it, index) {
155
+ var size = _info.sizes[it] || 152;
156
+ images.push({
157
+ input: inputs.get(it),
158
+ left: left,
159
+ top: Math.floor((152 - size) / 2)
160
+ });
161
+ left += size;
162
+ });
163
+ canvas = (0, _sharp["default"])({
119
164
  create: {
120
- width: 152 * result.length,
165
+ width: width,
121
166
  height: 152,
122
167
  channels: 4,
123
168
  background: 'transparent'
124
169
  }
125
- }).composite(result.map(function (it, index) {
126
- return {
127
- input: inputs.get(it),
128
- left: index * 152,
129
- top: 0,
130
- width: 152,
131
- height: 152
132
- };
133
- })).png().toBuffer();
170
+ }).png().composite(images);
171
+ _context7.next = 7;
172
+ return canvas.toBuffer();
134
173
 
135
- case 2:
174
+ case 7:
136
175
  canvas = _context7.sent;
176
+
177
+ if (!(result.length < 12)) {
178
+ _context7.next = 12;
179
+ break;
180
+ }
181
+
182
+ _context7.next = 11;
183
+ return (0, _sharp["default"])(canvas).resize({
184
+ height: 55
185
+ }).png().toBuffer();
186
+
187
+ case 11:
188
+ canvas = _context7.sent;
189
+
190
+ case 12:
137
191
  return _context7.abrupt("return", message.reply({
138
192
  content: caption,
139
193
  files: [canvas]
140
194
  }));
141
195
 
142
- case 4:
196
+ case 13:
143
197
  case "end":
144
198
  return _context7.stop();
145
199
  }
@@ -149,13 +203,14 @@ function _sendInput() {
149
203
  return _sendInput.apply(this, arguments);
150
204
  }
151
205
 
152
- var builtin = {
153
- 37: {
154
- game: 'sf',
155
- caption: '***LETS GO JUSTIN!***',
156
- input: '6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk'
157
- }
158
- };
206
+ function checkGame(game) {
207
+ return gameInputs.has(game) ? game : _info.aliases.games[game];
208
+ }
209
+
210
+ function isString(x) {
211
+ return Object.prototype.toString.call(x) === '[object String]';
212
+ }
213
+
159
214
  var _default = {
160
215
  name: 'fg-notation',
161
216
  about: {
@@ -207,7 +262,7 @@ var _default = {
207
262
  }
208
263
 
209
264
  name = message.content.split(' ').pop().replace(prefix, '');
210
- _context.t0 = builtin[name];
265
+ _context.t0 = _info.builtin[name];
211
266
 
212
267
  if (_context.t0) {
213
268
  _context.next = 12;
@@ -249,7 +304,7 @@ var _default = {
249
304
  example: 'fgi sf 236P 214K',
250
305
  execute: function () {
251
306
  var _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref, _ref2) {
252
- var param, message, _param, game, i1, inputs, result;
307
+ var param, message, _param, gameInput, i1, game, inputs, result;
253
308
 
254
309
  return _regenerator["default"].wrap(function _callee2$(_context2) {
255
310
  while (1) {
@@ -257,9 +312,9 @@ var _default = {
257
312
  case 0:
258
313
  param = _ref.param;
259
314
  message = _ref2.message;
260
- _param = (0, _slicedToArray2["default"])(param, 3), game = _param[1], i1 = _param[2];
315
+ _param = (0, _slicedToArray2["default"])(param, 3), gameInput = _param[1], i1 = _param[2];
261
316
 
262
- if (!(!game || !i1)) {
317
+ if (!(!gameInput || !i1)) {
263
318
  _context2.next = 5;
264
319
  break;
265
320
  }
@@ -267,21 +322,27 @@ var _default = {
267
322
  return _context2.abrupt("return", message.reply('Missing arguments. Example: >fgi sf 236P 214K'));
268
323
 
269
324
  case 5:
325
+ game = checkGame(gameInput);
326
+
270
327
  if (gameInputs.has(game)) {
271
- _context2.next = 7;
328
+ _context2.next = 8;
272
329
  break;
273
330
  }
274
331
 
275
332
  return _context2.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
276
333
 
277
- case 7:
278
- inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
279
- result = param.slice(2).map(function (i) {
280
- return solveInput(inputs, i.toLowerCase());
281
- }).flat();
282
- sendInput(inputs, result, message);
334
+ case 8:
335
+ try {
336
+ inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
337
+ result = param.slice(2).map(function (i) {
338
+ return solveInput(inputs, i.toLowerCase());
339
+ }).flat();
340
+ sendInput(inputs, result, message);
341
+ } catch (err) {
342
+ message.reply(err.message);
343
+ }
283
344
 
284
- case 10:
345
+ case 9:
285
346
  case "end":
286
347
  return _context2.stop();
287
348
  }
@@ -302,7 +363,7 @@ var _default = {
302
363
  example: 'fgi sf testName 236P 214K',
303
364
  execute: function () {
304
365
  var _execute2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3, _ref4) {
305
- var param, sequelize, message, _param2, game, name, i1, inputs, input;
366
+ var param, sequelize, message, _param2, gameInput, name, i1, game, inputs, input;
306
367
 
307
368
  return _regenerator["default"].wrap(function _callee3$(_context3) {
308
369
  while (1) {
@@ -310,9 +371,9 @@ var _default = {
310
371
  case 0:
311
372
  param = _ref3.param, sequelize = _ref3.sequelize;
312
373
  message = _ref4.message;
313
- _param2 = (0, _slicedToArray2["default"])(param, 4), game = _param2[1], name = _param2[2], i1 = _param2[3];
374
+ _param2 = (0, _slicedToArray2["default"])(param, 4), gameInput = _param2[1], name = _param2[2], i1 = _param2[3];
314
375
 
315
- if (!(!game || !name || !i1)) {
376
+ if (!(!gameInput || !name || !i1)) {
316
377
  _context3.next = 5;
317
378
  break;
318
379
  }
@@ -320,19 +381,22 @@ var _default = {
320
381
  return _context3.abrupt("return", message.reply('Missing arguments. Example: >fgi sf testName 236P 214K'));
321
382
 
322
383
  case 5:
384
+ game = checkGame(gameInput);
385
+
323
386
  if (gameInputs.has(game)) {
324
- _context3.next = 7;
387
+ _context3.next = 8;
325
388
  break;
326
389
  }
327
390
 
328
391
  return _context3.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
329
392
 
330
- case 7:
393
+ case 8:
394
+ _context3.prev = 8;
331
395
  inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
332
396
  input = param.slice(3).map(function (i) {
333
397
  return solveInput(inputs, i.toLowerCase());
334
398
  }).flat().join(' ');
335
- _context3.next = 11;
399
+ _context3.next = 13;
336
400
  return sequelize.models.fginput.create({
337
401
  guild: message.guild.id,
338
402
  name: name,
@@ -341,15 +405,22 @@ var _default = {
341
405
  input: input
342
406
  });
343
407
 
344
- case 11:
408
+ case 13:
345
409
  message.channel.send("Saved command \"".concat(input, "\" as \"").concat(name, "\""));
410
+ _context3.next = 19;
411
+ break;
346
412
 
347
- case 12:
413
+ case 16:
414
+ _context3.prev = 16;
415
+ _context3.t0 = _context3["catch"](8);
416
+ message.reply(_context3.t0.message);
417
+
418
+ case 19:
348
419
  case "end":
349
420
  return _context3.stop();
350
421
  }
351
422
  }
352
- }, _callee3);
423
+ }, _callee3, null, [[8, 16]]);
353
424
  }));
354
425
 
355
426
  function execute(_x7, _x8) {
@@ -488,4 +559,5 @@ var _default = {
488
559
  }
489
560
  }
490
561
  };
491
- exports["default"] = _default;
562
+ exports["default"] = _default;
563
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJnZXRKU09OIiwiaW1nUGF0aCIsInBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwiYmFzaWNJbnB1dHMiLCJNYXAiLCJnYW1lSW5wdXRzIiwiZ2xvc3NhcnkiLCJ0ZXJtcyIsImdldEdsb3NzYXJ5Iiwic2V0SW50ZXJ2YWwiLCJyZXN1bHQiLCJ0ZW1wRyIsInRlbXBUIiwiZm9yRWFjaCIsImkiLCJ0ZXJtIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwiZ2xvYiIsInN5bmMiLCJub2RpciIsInAiLCJpbnB1dCIsInNwbGl0IiwicG9wIiwicmVwbGFjZSIsInNldCIsImFsaWFzIiwiYWxpYXNlcyIsImlucHV0cyIsImJhc2ljIiwic2l6ZXMiLCJwYXJzZSIsInJlbGF0aXZlIiwiYmFzZSIsIm5hbWUiLCJnZXQiLCJnYW1lcyIsIk9iamVjdCIsImVudHJpZXMiLCJhIiwicyIsInNvbHZlSW5wdXQiLCJoYXMiLCJpc1N0cmluZyIsImxlbmd0aCIsInMxIiwic2xpY2UiLCJyZW1haW5pbmciLCJFcnJvciIsInNlbmRJbnB1dCIsIm1lc3NhZ2UiLCJjYXB0aW9uIiwid2lkdGgiLCJtYXAiLCJpdCIsInJlZHVjZSIsImIiLCJpbWFnZXMiLCJsZWZ0IiwiaW5kZXgiLCJzaXplIiwidG9wIiwiTWF0aCIsImZsb29yIiwiY2FudmFzIiwiY3JlYXRlIiwiaGVpZ2h0IiwiY2hhbm5lbHMiLCJiYWNrZ3JvdW5kIiwicG5nIiwiY29tcG9zaXRlIiwidG9CdWZmZXIiLCJyZXNpemUiLCJyZXBseSIsImNvbnRlbnQiLCJmaWxlcyIsImNoZWNrR2FtZSIsImdhbWUiLCJ4IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiYWJvdXQiLCJ2YWx1ZSIsImludGVudHMiLCJwYXJ0aWFscyIsInByZWxvYWQiLCJzZXF1ZWxpemUiLCJkZWZpbmUiLCJndWlsZCIsInR5cGUiLCJEYXRhVHlwZXMiLCJTVFJJTkciLCJwcmltYXJ5S2V5IiwiY3JlYXRlZEJ5IiwiZXZlbnRzIiwibWVzc2FnZUNyZWF0ZSIsImdsb2JhbCIsImNsaWVudCIsImNvbmZpZyIsImF1dGhvciIsImlkIiwidXNlciIsIm1lbWJlciIsImd1aWxkSWQiLCJwcmVmaXgiLCJzdGFydHNXaXRoIiwiYnVpbHRpbiIsIm1vZGVscyIsImZnaW5wdXQiLCJmaW5kT25lIiwid2hlcmUiLCJyb3ciLCJjb21tYW5kcyIsImZnaSIsInVzYWdlIiwiZGVzYyIsImV4YW1wbGUiLCJleGVjdXRlIiwicGFyYW0iLCJnYW1lSW5wdXQiLCJpMSIsIkFycmF5IiwiZnJvbSIsImtleXMiLCJmbGF0IiwiZXJyIiwiZmdzYXZlIiwiY2hhbm5lbCIsInNlbmQiLCJmZ2NhcHRpb24iLCJzYXZlIiwiZmdnbG9zc2FyeSIsInBhcmFtcyIsInNlYXJjaCIsImZpbHRlciIsImluY2x1ZGVzIiwidXJsIiwiZGVmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUVBLElBQU1BLE9BQU8sR0FBRyxzQkFBSyxNQUFMLENBQWhCOztBQUNBLElBQU1DLE9BQU8sR0FBR0MsaUJBQUtDLElBQUwsQ0FBVUMsU0FBVixFQUFxQixLQUFyQixDQUFoQjs7QUFDQSxJQUFNQyxXQUFXLEdBQUcsSUFBSUMsR0FBSixFQUFwQjtBQUNBLElBQU1DLFVBQVUsR0FBRyxJQUFJRCxHQUFKLEVBQW5CO0FBRUEsSUFBSUUsUUFBUSxHQUFHLEVBQWY7QUFDQSxJQUFJQyxLQUFLLEdBQUcsRUFBWjtBQUVBQyxXQUFXO0FBQ1hDLFdBQVcsQ0FBQ0QsV0FBRCxFQUFjLElBQUksRUFBSixHQUFTLElBQXZCLENBQVg7O1NBRWVBLFc7Ozs7OytGQUFmO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQ3VCVixPQUFPLENBQUMsK0NBQUQsQ0FEOUI7O0FBQUE7QUFDUVksWUFBQUEsTUFEUjtBQUVRQyxZQUFBQSxLQUZSLEdBRWdCLEVBRmhCO0FBR1FDLFlBQUFBLEtBSFIsR0FHZ0IsRUFIaEI7QUFLRUYsWUFBQUEsTUFBTSxDQUFDRyxPQUFQLENBQWUsVUFBQUMsQ0FBQyxFQUFJO0FBQ2xCLGtCQUFNQyxJQUFJLEdBQUdELENBQUMsQ0FBQ0MsSUFBRixDQUFPQyxXQUFQLEVBQWI7QUFDQUwsY0FBQUEsS0FBSyxDQUFDSSxJQUFELENBQUwsR0FBY0QsQ0FBZDtBQUNBRixjQUFBQSxLQUFLLENBQUNLLElBQU4sQ0FBV0YsSUFBWDtBQUNELGFBSkQ7QUFNQVQsWUFBQUEsUUFBUSxHQUFHSyxLQUFYO0FBQ0FKLFlBQUFBLEtBQUssR0FBR0ssS0FBUjs7QUFaRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHOzs7O0FBZUFNLGlCQUFLQyxJQUFMLENBQVVuQixpQkFBS0MsSUFBTCxDQUFVRixPQUFWLEVBQW1CLFVBQW5CLENBQVYsRUFBMEM7QUFBRXFCLEVBQUFBLEtBQUssRUFBRTtBQUFULENBQTFDLEVBQ0dQLE9BREgsQ0FDVyxVQUFBUSxDQUFDLEVBQUk7QUFDWixNQUFNQyxLQUFLLEdBQUdELENBQUMsQ0FBQ0UsS0FBRixDQUFRLEdBQVIsRUFBYUMsR0FBYixHQUFtQkMsT0FBbkIsQ0FBMkIsTUFBM0IsRUFBbUMsRUFBbkMsQ0FBZDtBQUNBdEIsRUFBQUEsV0FBVyxDQUFDdUIsR0FBWixDQUFnQkosS0FBaEIsRUFBdUJELENBQXZCO0FBRUEsTUFBTU0sS0FBSyxHQUFHQyxjQUFRQyxNQUFSLENBQWVDLEtBQWYsQ0FBcUJSLEtBQXJCLENBQWQ7O0FBQ0EsTUFBSUssS0FBSixFQUFXO0FBQ1RBLElBQUFBLEtBQUssQ0FBQ2QsT0FBTixDQUFjLFVBQUFDLENBQUMsRUFBSTtBQUNqQlgsTUFBQUEsV0FBVyxDQUFDdUIsR0FBWixDQUFnQlosQ0FBaEIsRUFBbUJPLENBQW5CO0FBQ0EsVUFBSVUsWUFBTVQsS0FBTixDQUFKLEVBQWtCUyxZQUFNakIsQ0FBTixJQUFXaUIsWUFBTVQsS0FBTixDQUFYO0FBQ25CLEtBSEQ7QUFJRDtBQUNGLENBWkg7O0FBY0FKLGlCQUFLQyxJQUFMLENBQVVuQixpQkFBS0MsSUFBTCxDQUFVRixPQUFWLEVBQW1CLFNBQW5CLENBQVYsRUFDR2MsT0FESCxDQUNXLFVBQUFRLENBQUMsRUFBSTtBQUNaLG9CQUFpQnJCLGlCQUFLZ0MsS0FBTCxDQUFXaEMsaUJBQUtpQyxRQUFMLENBQWNqQyxpQkFBS0MsSUFBTCxDQUFVRixPQUFWLEVBQW1CLE9BQW5CLENBQWQsRUFBMkNzQixDQUEzQyxDQUFYLENBQWpCO0FBQUEsTUFBUWEsSUFBUixlQUFRQSxJQUFSOztBQUNBN0IsRUFBQUEsVUFBVSxDQUFDcUIsR0FBWCxDQUFlUSxJQUFmLEVBQXFCLElBQUk5QixHQUFKLEVBQXJCOztBQUVBYyxtQkFBS0MsSUFBTCxDQUFVbkIsaUJBQUtDLElBQUwsQ0FBVUYsT0FBVixFQUFtQixPQUFuQixFQUE0Qm1DLElBQTVCLEVBQWtDLElBQWxDLENBQVYsRUFBbUQ7QUFBRWQsSUFBQUEsS0FBSyxFQUFFO0FBQVQsR0FBbkQsRUFDR1AsT0FESCxDQUNXLFVBQUFTLEtBQUssRUFBSTtBQUNoQix1QkFBaUJ0QixpQkFBS2dDLEtBQUwsQ0FBV1YsS0FBWCxDQUFqQjtBQUFBLFFBQVFhLElBQVIsZ0JBQVFBLElBQVI7O0FBQ0E5QixJQUFBQSxVQUFVLENBQUMrQixHQUFYLENBQWVGLElBQWYsRUFBcUJSLEdBQXJCLENBQXlCUyxJQUF6QixFQUErQmIsS0FBL0I7QUFDRCxHQUpIOztBQU1BLE1BQU1LLEtBQUssR0FBR0MsY0FBUUMsTUFBUixDQUFlUSxLQUFmLENBQXFCSCxJQUFyQixDQUFkOztBQUVBLE1BQUlQLEtBQUosRUFBVztBQUNULHVDQUFxQlcsTUFBTSxDQUFDQyxPQUFQLENBQWVaLEtBQWYsQ0FBckIscUNBQTRDO0FBQXZDO0FBQUEsVUFBT2EsQ0FBUDtBQUFBLFVBQVVDLENBQVY7O0FBQ0hwQyxNQUFBQSxVQUFVLENBQUMrQixHQUFYLENBQWVGLElBQWYsRUFBcUJSLEdBQXJCLENBQXlCYyxDQUF6QixFQUE0QkMsQ0FBNUI7QUFDRDtBQUNGO0FBQ0YsQ0FsQkg7O0FBb0JBLFNBQVNDLFVBQVQsQ0FBcUJiLE1BQXJCLEVBQTZCUCxLQUE3QixFQUFvQztBQUNsQyxNQUFJTyxNQUFNLENBQUNjLEdBQVAsQ0FBV3JCLEtBQVgsQ0FBSixFQUF1QixPQUFPc0IsUUFBUSxDQUFDZixNQUFNLENBQUNPLEdBQVAsQ0FBV2QsS0FBWCxDQUFELENBQVIsR0FBOEIsQ0FBQ0EsS0FBRCxDQUE5QixHQUF3Q08sTUFBTSxDQUFDTyxHQUFQLENBQVdkLEtBQVgsQ0FBL0M7O0FBRXZCLE9BQUssSUFBSVIsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR1EsS0FBSyxDQUFDdUIsTUFBMUIsRUFBa0MvQixDQUFDLEVBQW5DLEVBQXVDO0FBQ3JDLFFBQU1nQyxFQUFFLEdBQUd4QixLQUFLLENBQUN5QixLQUFOLENBQVksQ0FBWixFQUFlLElBQUlqQyxDQUFuQixDQUFYOztBQUVBLFFBQUllLE1BQU0sQ0FBQ2MsR0FBUCxDQUFXRyxFQUFYLENBQUosRUFBb0I7QUFDbEIsVUFBTXBDLE1BQU0sR0FBR21CLE1BQU0sQ0FBQ08sR0FBUCxDQUFXVSxFQUFYLENBQWY7QUFDQSxVQUFNRSxTQUFTLEdBQUdOLFVBQVUsQ0FBQ2IsTUFBRCxFQUFTUCxLQUFLLENBQUN5QixLQUFOLENBQVksSUFBSWpDLENBQWhCLENBQVQsQ0FBNUI7QUFFQSxhQUFPOEIsUUFBUSxDQUFDbEMsTUFBRCxDQUFSLElBQW9Cb0MsRUFBcEIsNkNBQTJCRSxTQUEzQixtREFBNEN0QyxNQUE1Qyx1Q0FBdURzQyxTQUF2RCxFQUFQO0FBQ0Q7QUFDRjs7QUFFRCxRQUFNLElBQUlDLEtBQUoseUJBQTBCM0IsS0FBMUIsZ0NBQU47QUFDRDs7U0FFYzRCLFM7Ozs7OzZGQUFmLGtCQUEwQnJCLE1BQTFCLEVBQWtDbkIsTUFBbEMsRUFBMEN5QyxPQUExQyxFQUFtREMsT0FBbkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1FDLFlBQUFBLEtBRFIsR0FDZ0IzQyxNQUFNLENBQUM0QyxHQUFQLENBQVcsVUFBQUMsRUFBRTtBQUFBLHFCQUFJeEIsWUFBTXdCLEVBQU4sS0FBYSxHQUFqQjtBQUFBLGFBQWIsRUFBbUNDLE1BQW5DLENBQTBDLFVBQUNoQixDQUFELEVBQUlpQixDQUFKO0FBQUEscUJBQVVqQixDQUFDLEdBQUdpQixDQUFkO0FBQUEsYUFBMUMsRUFBMkQsQ0FBM0QsQ0FEaEI7QUFFUUMsWUFBQUEsTUFGUixHQUVpQixFQUZqQjtBQUdNQyxZQUFBQSxJQUhOLEdBR2EsQ0FIYjtBQUtFakQsWUFBQUEsTUFBTSxDQUFDRyxPQUFQLENBQWUsVUFBQzBDLEVBQUQsRUFBS0ssS0FBTCxFQUFlO0FBQzVCLGtCQUFNQyxJQUFJLEdBQUc5QixZQUFNd0IsRUFBTixLQUFhLEdBQTFCO0FBQ0FHLGNBQUFBLE1BQU0sQ0FBQ3pDLElBQVAsQ0FBWTtBQUFFSyxnQkFBQUEsS0FBSyxFQUFFTyxNQUFNLENBQUNPLEdBQVAsQ0FBV21CLEVBQVgsQ0FBVDtBQUF5QkksZ0JBQUFBLElBQUksRUFBSkEsSUFBekI7QUFBK0JHLGdCQUFBQSxHQUFHLEVBQUVDLElBQUksQ0FBQ0MsS0FBTCxDQUFXLENBQUMsTUFBTUgsSUFBUCxJQUFlLENBQTFCO0FBQXBDLGVBQVo7QUFDQUYsY0FBQUEsSUFBSSxJQUFJRSxJQUFSO0FBQ0QsYUFKRDtBQU1JSSxZQUFBQSxNQVhOLEdBV2UsdUJBQU07QUFBRUMsY0FBQUEsTUFBTSxFQUFFO0FBQUViLGdCQUFBQSxLQUFLLEVBQUxBLEtBQUY7QUFBU2MsZ0JBQUFBLE1BQU0sRUFBRSxHQUFqQjtBQUFzQkMsZ0JBQUFBLFFBQVEsRUFBRSxDQUFoQztBQUFtQ0MsZ0JBQUFBLFVBQVUsRUFBRTtBQUEvQztBQUFWLGFBQU4sRUFDVkMsR0FEVSxHQUVWQyxTQUZVLENBRUFiLE1BRkEsQ0FYZjtBQUFBO0FBQUEsbUJBZWlCTyxNQUFNLENBQUNPLFFBQVAsRUFmakI7O0FBQUE7QUFlRVAsWUFBQUEsTUFmRjs7QUFBQSxrQkFpQk12RCxNQUFNLENBQUNtQyxNQUFQLEdBQWdCLEVBakJ0QjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLG1CQWlCeUMsdUJBQU1vQixNQUFOLEVBQWNRLE1BQWQsQ0FBcUI7QUFBRU4sY0FBQUEsTUFBTSxFQUFFO0FBQVYsYUFBckIsRUFBcUNHLEdBQXJDLEdBQTJDRSxRQUEzQyxFQWpCekM7O0FBQUE7QUFpQjBCUCxZQUFBQSxNQWpCMUI7O0FBQUE7QUFBQSw4Q0FtQlNkLE9BQU8sQ0FBQ3VCLEtBQVIsQ0FBYztBQUFFQyxjQUFBQSxPQUFPLEVBQUV2QixPQUFYO0FBQW9Cd0IsY0FBQUEsS0FBSyxFQUFFLENBQUNYLE1BQUQ7QUFBM0IsYUFBZCxDQW5CVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHOzs7O0FBc0JBLFNBQVNZLFNBQVQsQ0FBb0JDLElBQXBCLEVBQTBCO0FBQ3hCLFNBQU96RSxVQUFVLENBQUNzQyxHQUFYLENBQWVtQyxJQUFmLElBQXVCQSxJQUF2QixHQUE4QmxELGNBQVFTLEtBQVIsQ0FBY3lDLElBQWQsQ0FBckM7QUFDRDs7QUFFRCxTQUFTbEMsUUFBVCxDQUFtQm1DLENBQW5CLEVBQXNCO0FBQ3BCLFNBQU96QyxNQUFNLENBQUMwQyxTQUFQLENBQWlCQyxRQUFqQixDQUEwQkMsSUFBMUIsQ0FBK0JILENBQS9CLE1BQXNDLGlCQUE3QztBQUNEOztlQUVjO0FBQ2I1QyxFQUFBQSxJQUFJLEVBQUUsYUFETztBQUViZ0QsRUFBQUEsS0FBSyxFQUFFO0FBQ0xoRCxJQUFBQSxJQUFJLEVBQUUsYUFERDtBQUVMaUQsSUFBQUEsS0FBSyxFQUFFO0FBRkYsR0FGTTtBQU1iQyxFQUFBQSxPQUFPLEVBQUUsQ0FBQyxnQkFBRCxDQU5JO0FBT2JDLEVBQUFBLFFBQVEsRUFBRSxDQUFDLFNBQUQsQ0FQRztBQVNiQyxFQUFBQSxPQUFPLEVBQUUsaUJBQUFDLFNBQVMsRUFBSTtBQUNwQkEsSUFBQUEsU0FBUyxDQUFDQyxNQUFWLENBQWlCLFNBQWpCLEVBQTRCO0FBQzFCQyxNQUFBQSxLQUFLLEVBQUU7QUFDTEMsUUFBQUEsSUFBSSxFQUFFQyxxQkFBVUMsTUFEWDtBQUVMQyxRQUFBQSxVQUFVLEVBQUU7QUFGUCxPQURtQjtBQUsxQjNELE1BQUFBLElBQUksRUFBRTtBQUNKd0QsUUFBQUEsSUFBSSxFQUFFQyxxQkFBVUMsTUFEWjtBQUVKQyxRQUFBQSxVQUFVLEVBQUU7QUFGUixPQUxvQjtBQVMxQkMsTUFBQUEsU0FBUyxFQUFFSCxxQkFBVUMsTUFUSztBQVUxQmYsTUFBQUEsSUFBSSxFQUFFYyxxQkFBVUMsTUFWVTtBQVcxQnpDLE1BQUFBLE9BQU8sRUFBRXdDLHFCQUFVQyxNQVhPO0FBWTFCdkUsTUFBQUEsS0FBSyxFQUFFc0UscUJBQVVDO0FBWlMsS0FBNUI7QUFjRCxHQXhCWTtBQTBCYkcsRUFBQUEsTUFBTSxFQUFFO0FBQ0FDLElBQUFBLGFBREEseUJBQ2VDLE1BRGYsRUFDdUIvQyxPQUR2QixFQUNnQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUM1QmdELGdCQUFBQSxNQUQ0QixHQUNFRCxNQURGLENBQzVCQyxNQUQ0QixFQUNwQkMsTUFEb0IsR0FDRUYsTUFERixDQUNwQkUsTUFEb0IsRUFDWlosU0FEWSxHQUNFVSxNQURGLENBQ1pWLFNBRFk7O0FBQUEsc0JBRWhDckMsT0FBTyxDQUFDa0QsTUFBUixDQUFlQyxFQUFmLEtBQXNCSCxNQUFNLENBQUNJLElBQVAsQ0FBWUQsRUFBbEMsSUFBd0MsQ0FBQ25ELE9BQU8sQ0FBQ3FELE1BRmpCO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBSTlCQyxnQkFBQUEsT0FKOEIsR0FJcEJ0RCxPQUFPLENBQUNzRCxPQUpZO0FBSzVCQyxnQkFBQUEsTUFMNEIsR0FLakJOLE1BQU0sQ0FBQ0ssT0FBRCxDQUxXLENBSzVCQyxNQUw0Qjs7QUFBQSxxQkFPaEN2RCxPQUFPLENBQUN3QixPQUFSLENBQWdCZ0MsVUFBaEIsQ0FBMkJELE1BQTNCLENBUGdDO0FBQUE7QUFBQTtBQUFBOztBQVE1QnZFLGdCQUFBQSxJQVI0QixHQVFyQmdCLE9BQU8sQ0FBQ3dCLE9BQVIsQ0FBZ0JwRCxLQUFoQixDQUFzQixHQUF0QixFQUEyQkMsR0FBM0IsR0FBaUNDLE9BQWpDLENBQXlDaUYsTUFBekMsRUFBaUQsRUFBakQsQ0FScUI7QUFBQSw4QkFTdEJFLGNBQVF6RSxJQUFSLENBVHNCOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsdUJBVTFCcUQsU0FBUyxDQUFDcUIsTUFBVixDQUFpQkMsT0FBakIsQ0FBeUJDLE9BQXpCLENBQWlDO0FBQ3JDQyxrQkFBQUEsS0FBSyxFQUFFO0FBQUV0QixvQkFBQUEsS0FBSyxFQUFFdkMsT0FBTyxDQUFDdUMsS0FBUixDQUFjWSxFQUF2QjtBQUEyQm5FLG9CQUFBQSxJQUFJLEVBQUpBO0FBQTNCO0FBRDhCLGlCQUFqQyxDQVYwQjs7QUFBQTtBQUFBOztBQUFBO0FBUzVCOEUsZ0JBQUFBLEdBVDRCOztBQWVsQyxvQkFBSUEsR0FBSixFQUFTO0FBQ0RwRixrQkFBQUEsTUFEQyxHQUNRLElBQUl6QixHQUFKLCtDQUFZRCxXQUFaLHVDQUE0QkUsVUFBVSxDQUFDK0IsR0FBWCxDQUFlNkUsR0FBRyxDQUFDbkMsSUFBbkIsQ0FBNUIsR0FEUjtBQUVQNUIsa0JBQUFBLFNBQVMsQ0FBQ3JCLE1BQUQsRUFBU29GLEdBQUcsQ0FBQzNGLEtBQUosQ0FBVUMsS0FBVixDQUFnQixHQUFoQixDQUFULEVBQStCNEIsT0FBL0IsRUFBd0M4RCxHQUFHLENBQUM3RCxPQUE1QyxDQUFUO0FBQ0Q7O0FBbEJpQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW9CckM7QUFyQkssR0ExQks7QUFrRGI4RCxFQUFBQSxRQUFRLEVBQUU7QUFDUkMsSUFBQUEsR0FBRyxFQUFFO0FBQ0hDLE1BQUFBLEtBQUssRUFBRSxxQkFESjtBQUVIQyxNQUFBQSxJQUFJLEVBQUUseUNBRkg7QUFHSEMsTUFBQUEsT0FBTyxFQUFFLGtCQUhOO0FBSUhDLE1BQUFBLE9BQU87QUFBQSxxR0FBRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQVNDLGtCQUFBQSxLQUFULFFBQVNBLEtBQVQ7QUFBb0JyRSxrQkFBQUEsT0FBcEIsU0FBb0JBLE9BQXBCO0FBQUEsMkRBQ21CcUUsS0FEbkIsTUFDRUMsU0FERixjQUNhQyxFQURiOztBQUFBLHdCQUVILENBQUNELFNBQUQsSUFBYyxDQUFDQyxFQUZaO0FBQUE7QUFBQTtBQUFBOztBQUFBLG9EQUV1QnZFLE9BQU8sQ0FBQ3VCLEtBQVIsQ0FBYywrQ0FBZCxDQUZ2Qjs7QUFBQTtBQUlESSxrQkFBQUEsSUFKQyxHQUlNRCxTQUFTLENBQUM0QyxTQUFELENBSmY7O0FBQUEsc0JBS0ZwSCxVQUFVLENBQUNzQyxHQUFYLENBQWVtQyxJQUFmLENBTEU7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0RBSzJCM0IsT0FBTyxDQUFDdUIsS0FBUixhQUFrQkksSUFBbEIsc0RBQWlFNkMsS0FBSyxDQUFDQyxJQUFOLENBQVd2SCxVQUFVLENBQUN3SCxJQUFYLEVBQVgsRUFBOEI1SCxJQUE5QixDQUFtQyxHQUFuQyxDQUFqRSxFQUwzQjs7QUFBQTtBQU9QLHNCQUFJO0FBQ0k0QixvQkFBQUEsTUFESixHQUNhLElBQUl6QixHQUFKLCtDQUFZRCxXQUFaLHVDQUE0QkUsVUFBVSxDQUFDK0IsR0FBWCxDQUFlMEMsSUFBZixDQUE1QixHQURiO0FBRUlwRSxvQkFBQUEsTUFGSixHQUVhOEcsS0FBSyxDQUFDekUsS0FBTixDQUFZLENBQVosRUFBZU8sR0FBZixDQUFtQixVQUFBeEMsQ0FBQztBQUFBLDZCQUFJNEIsVUFBVSxDQUFDYixNQUFELEVBQVNmLENBQUMsQ0FBQ0UsV0FBRixFQUFULENBQWQ7QUFBQSxxQkFBcEIsRUFBNkQ4RyxJQUE3RCxFQUZiO0FBSUY1RSxvQkFBQUEsU0FBUyxDQUFDckIsTUFBRCxFQUFTbkIsTUFBVCxFQUFpQnlDLE9BQWpCLENBQVQ7QUFDRCxtQkFMRCxDQUtFLE9BQU80RSxHQUFQLEVBQVk7QUFDWjVFLG9CQUFBQSxPQUFPLENBQUN1QixLQUFSLENBQWNxRCxHQUFHLENBQUM1RSxPQUFsQjtBQUNEOztBQWRNO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQUY7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFKSixLQURHO0FBc0JSNkUsSUFBQUEsTUFBTSxFQUFFO0FBQ05aLE1BQUFBLEtBQUssRUFBRSwrQkFERDtBQUVOQyxNQUFBQSxJQUFJLEVBQUUsdUNBRkE7QUFHTkMsTUFBQUEsT0FBTyxFQUFFLDJCQUhIO0FBSU5DLE1BQUFBLE9BQU87QUFBQSxzR0FBRTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQVNDLGtCQUFBQSxLQUFULFNBQVNBLEtBQVQsRUFBZ0JoQyxTQUFoQixTQUFnQkEsU0FBaEI7QUFBK0JyQyxrQkFBQUEsT0FBL0IsU0FBK0JBLE9BQS9CO0FBQUEsNERBQ3lCcUUsS0FEekIsTUFDRUMsU0FERixlQUNhdEYsSUFEYixlQUNtQnVGLEVBRG5COztBQUFBLHdCQUVILENBQUNELFNBQUQsSUFBYyxDQUFDdEYsSUFBZixJQUF1QixDQUFDdUYsRUFGckI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0RBRWdDdkUsT0FBTyxDQUFDdUIsS0FBUixDQUFjLHdEQUFkLENBRmhDOztBQUFBO0FBSURJLGtCQUFBQSxJQUpDLEdBSU1ELFNBQVMsQ0FBQzRDLFNBQUQsQ0FKZjs7QUFBQSxzQkFLRnBILFVBQVUsQ0FBQ3NDLEdBQVgsQ0FBZW1DLElBQWYsQ0FMRTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxvREFLMkIzQixPQUFPLENBQUN1QixLQUFSLGFBQWtCSSxJQUFsQixzREFBaUU2QyxLQUFLLENBQUNDLElBQU4sQ0FBV3ZILFVBQVUsQ0FBQ3dILElBQVgsRUFBWCxFQUE4QjVILElBQTlCLENBQW1DLEdBQW5DLENBQWpFLEVBTDNCOztBQUFBO0FBQUE7QUFRQzRCLGtCQUFBQSxNQVJELEdBUVUsSUFBSXpCLEdBQUosK0NBQVlELFdBQVosdUNBQTRCRSxVQUFVLENBQUMrQixHQUFYLENBQWUwQyxJQUFmLENBQTVCLEdBUlY7QUFTQ3hELGtCQUFBQSxLQVRELEdBU1NrRyxLQUFLLENBQUN6RSxLQUFOLENBQVksQ0FBWixFQUFlTyxHQUFmLENBQW1CLFVBQUF4QyxDQUFDO0FBQUEsMkJBQUk0QixVQUFVLENBQUNiLE1BQUQsRUFBU2YsQ0FBQyxDQUFDRSxXQUFGLEVBQVQsQ0FBZDtBQUFBLG1CQUFwQixFQUE2RDhHLElBQTdELEdBQW9FN0gsSUFBcEUsQ0FBeUUsR0FBekUsQ0FUVDtBQUFBO0FBQUEseUJBV0N1RixTQUFTLENBQUNxQixNQUFWLENBQWlCQyxPQUFqQixDQUF5QjVDLE1BQXpCLENBQWdDO0FBQUV3QixvQkFBQUEsS0FBSyxFQUFFdkMsT0FBTyxDQUFDdUMsS0FBUixDQUFjWSxFQUF2QjtBQUEyQm5FLG9CQUFBQSxJQUFJLEVBQUpBLElBQTNCO0FBQWlDNEQsb0JBQUFBLFNBQVMsRUFBRTVDLE9BQU8sQ0FBQ2tELE1BQVIsQ0FBZUMsRUFBM0Q7QUFBK0R4QixvQkFBQUEsSUFBSSxFQUFKQSxJQUEvRDtBQUFxRXhELG9CQUFBQSxLQUFLLEVBQUxBO0FBQXJFLG1CQUFoQyxDQVhEOztBQUFBO0FBYUw2QixrQkFBQUEsT0FBTyxDQUFDOEUsT0FBUixDQUFnQkMsSUFBaEIsMkJBQXVDNUcsS0FBdkMscUJBQXFEYSxJQUFyRDtBQWJLO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBZUxnQixrQkFBQUEsT0FBTyxDQUFDdUIsS0FBUixDQUFjLGFBQUl2QixPQUFsQjs7QUFmSztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQUFGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBSkQsS0F0QkE7QUE2Q1JnRixJQUFBQSxTQUFTLEVBQUU7QUFDVGYsTUFBQUEsS0FBSyxFQUFFLDRCQURFO0FBRVRDLE1BQUFBLElBQUksRUFBRSx5Q0FGRztBQUdUQyxNQUFBQSxPQUFPLEVBQUUsc0NBSEE7QUFJVEMsTUFBQUEsT0FBTztBQUFBLHNHQUFFO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBU0Msa0JBQUFBLEtBQVQsU0FBU0EsS0FBVCxFQUFnQmhDLFNBQWhCLFNBQWdCQSxTQUFoQjtBQUErQnJDLGtCQUFBQSxPQUEvQixTQUErQkEsT0FBL0I7QUFBQSw0REFDY3FFLEtBRGQsTUFDRXJGLElBREYsZUFDUXVGLEVBRFI7O0FBQUEsd0JBRUgsQ0FBQ3ZGLElBQUQsSUFBUyxDQUFDdUYsRUFGUDtBQUFBO0FBQUE7QUFBQTs7QUFBQSxvREFFa0J2RSxPQUFPLENBQUN1QixLQUFSLENBQWMsNkRBQWQsQ0FGbEI7O0FBQUE7QUFBQTtBQUFBLHlCQUlXYyxTQUFTLENBQUNxQixNQUFWLENBQWlCQyxPQUFqQixDQUF5QkMsT0FBekIsQ0FBaUM7QUFDakRDLG9CQUFBQSxLQUFLLEVBQUU7QUFBRXRCLHNCQUFBQSxLQUFLLEVBQUV2QyxPQUFPLENBQUN1QyxLQUFSLENBQWNZLEVBQXZCO0FBQTJCbkUsc0JBQUFBLElBQUksRUFBSkE7QUFBM0I7QUFEMEMsbUJBQWpDLENBSlg7O0FBQUE7QUFJRDhFLGtCQUFBQSxHQUpDOztBQUFBLHNCQVFGQSxHQVJFO0FBQUE7QUFBQTtBQUFBOztBQUFBLG9EQVFVOUQsT0FBTyxDQUFDdUIsS0FBUixhQUFrQnZDLElBQWxCLGtDQVJWOztBQUFBO0FBU1A4RSxrQkFBQUEsR0FBRyxDQUFDN0QsT0FBSixHQUFjb0UsS0FBSyxDQUFDekUsS0FBTixDQUFZLENBQVosRUFBZTlDLElBQWYsQ0FBb0IsR0FBcEIsQ0FBZDtBQVRPO0FBQUEseUJBVURnSCxHQUFHLENBQUNtQixJQUFKLEVBVkM7O0FBQUE7QUFZUGpGLGtCQUFBQSxPQUFPLENBQUM4RSxPQUFSLENBQWdCQyxJQUFoQiwwQ0FBc0QvRixJQUF0RDs7QUFaTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQUFGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBSkUsS0E3Q0g7QUFnRVJrRyxJQUFBQSxVQUFVLEVBQUU7QUFDVmpCLE1BQUFBLEtBQUssRUFBRSwwQkFERztBQUVWQyxNQUFBQSxJQUFJLEVBQUUsMENBRkk7QUFHVkMsTUFBQUEsT0FBTyxFQUFFLDZCQUhDO0FBSVZDLE1BQUFBLE9BQU87QUFBQSxzR0FBRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBU0Msa0JBQUFBLEtBQVQsU0FBU0EsS0FBVCxFQUFnQmhDLFNBQWhCLFNBQWdCQSxTQUFoQjtBQUErQnJDLGtCQUFBQSxPQUEvQixTQUErQkEsT0FBL0I7QUFDRG1GLGtCQUFBQSxNQURDLEdBQ1FkLEtBQUssQ0FBQ3pFLEtBQU4sQ0FBWSxDQUFaLENBRFI7O0FBQUEsd0JBRUh1RixNQUFNLENBQUN6RixNQUFQLEtBQWtCLENBRmY7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0RBRXlCTSxPQUFPLENBQUN1QixLQUFSLENBQWMsNERBQWQsQ0FGekI7O0FBQUE7QUFJRDZELGtCQUFBQSxNQUpDLEdBSVFELE1BQU0sQ0FBQ3JJLElBQVAsQ0FBWSxHQUFaLEVBQWlCZSxXQUFqQixFQUpSO0FBS0ROLGtCQUFBQSxNQUxDLEdBS1FILEtBQUssQ0FBQ2lJLE1BQU4sQ0FBYSxVQUFBMUgsQ0FBQztBQUFBLDJCQUFJQSxDQUFDLENBQUMySCxRQUFGLENBQVdGLE1BQVgsQ0FBSjtBQUFBLG1CQUFkLENBTFI7QUFNREcsa0JBQUFBLEdBTkMsMkNBTXNDSixNQUFNLENBQUNySSxJQUFQLENBQVksS0FBWixFQUFtQmUsV0FBbkIsRUFOdEM7O0FBQUEsd0JBUUhOLE1BQU0sQ0FBQ21DLE1BQVAsS0FBa0IsQ0FSZjtBQUFBO0FBQUE7QUFBQTs7QUFBQSxvREFReUJNLE9BQU8sQ0FBQ3VCLEtBQVIsa0JBQXVCNkQsTUFBdkIsa0JBUnpCOztBQUFBO0FBQUEsd0JBU0g3SCxNQUFNLENBQUNtQyxNQUFQLEtBQWtCLENBVGY7QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0RBU3lCTSxPQUFPLENBQUN1QixLQUFSLGNBQXVCcEUsUUFBUSxDQUFDSSxNQUFNLENBQUMsQ0FBRCxDQUFQLENBQVIsQ0FBb0JpSSxHQUEzQyx5QkFBZ0VELEdBQWhFLE9BVHpCOztBQUFBO0FBV1B2RixrQkFBQUEsT0FBTyxDQUFDdUIsS0FBUixpQ0FBdUNnRSxHQUF2Qzs7QUFYTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQUFGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBSkc7QUFoRUo7QUFsREcsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaGFycCBmcm9tICdzaGFycCdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGdsb2IgZnJvbSAnZ2xvYidcclxuaW1wb3J0IHsgRGF0YVR5cGVzIH0gZnJvbSAnc2VxdWVsaXplJ1xyXG5pbXBvcnQgYmVudCBmcm9tICdiZW50J1xyXG5cclxuaW1wb3J0IHsgc2l6ZXMsIGFsaWFzZXMsIGJ1aWx0aW4gfSBmcm9tICcuL2luZm8uanNvbidcclxuXHJcbmNvbnN0IGdldEpTT04gPSBiZW50KCdqc29uJylcclxuY29uc3QgaW1nUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdpbWcnKVxyXG5jb25zdCBiYXNpY0lucHV0cyA9IG5ldyBNYXAoKVxyXG5jb25zdCBnYW1lSW5wdXRzID0gbmV3IE1hcCgpXHJcblxyXG5sZXQgZ2xvc3NhcnkgPSB7fVxyXG5sZXQgdGVybXMgPSBbXVxyXG5cclxuZ2V0R2xvc3NhcnkoKVxyXG5zZXRJbnRlcnZhbChnZXRHbG9zc2FyeSwgNSAqIDYwICogMTAwMClcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldEdsb3NzYXJ5ICgpIHtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRKU09OKCdodHRwczovL2dsb3NzYXJ5LmluZmlsLm5ldC9qc29uL2dsb3NzYXJ5Lmpzb24nKVxyXG4gIGNvbnN0IHRlbXBHID0ge31cclxuICBjb25zdCB0ZW1wVCA9IFtdXHJcblxyXG4gIHJlc3VsdC5mb3JFYWNoKGkgPT4ge1xyXG4gICAgY29uc3QgdGVybSA9IGkudGVybS50b0xvd2VyQ2FzZSgpXHJcbiAgICB0ZW1wR1t0ZXJtXSA9IGlcclxuICAgIHRlbXBULnB1c2godGVybSlcclxuICB9KVxyXG5cclxuICBnbG9zc2FyeSA9IHRlbXBHXHJcbiAgdGVybXMgPSB0ZW1wVFxyXG59XHJcblxyXG5nbG9iLnN5bmMocGF0aC5qb2luKGltZ1BhdGgsICdiYXNpYy8qKicpLCB7IG5vZGlyOiB0cnVlIH0pXHJcbiAgLmZvckVhY2gocCA9PiB7XHJcbiAgICBjb25zdCBpbnB1dCA9IHAuc3BsaXQoJy8nKS5wb3AoKS5yZXBsYWNlKCcucG5nJywgJycpXHJcbiAgICBiYXNpY0lucHV0cy5zZXQoaW5wdXQsIHApXHJcblxyXG4gICAgY29uc3QgYWxpYXMgPSBhbGlhc2VzLmlucHV0cy5iYXNpY1tpbnB1dF1cclxuICAgIGlmIChhbGlhcykge1xyXG4gICAgICBhbGlhcy5mb3JFYWNoKGkgPT4ge1xyXG4gICAgICAgIGJhc2ljSW5wdXRzLnNldChpLCBwKVxyXG4gICAgICAgIGlmIChzaXplc1tpbnB1dF0pIHNpemVzW2ldID0gc2l6ZXNbaW5wdXRdXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbmdsb2Iuc3luYyhwYXRoLmpvaW4oaW1nUGF0aCwgJ2dhbWVzLyonKSlcclxuICAuZm9yRWFjaChwID0+IHtcclxuICAgIGNvbnN0IHsgYmFzZSB9ID0gcGF0aC5wYXJzZShwYXRoLnJlbGF0aXZlKHBhdGguam9pbihpbWdQYXRoLCAnZ2FtZXMnKSwgcCkpXHJcbiAgICBnYW1lSW5wdXRzLnNldChiYXNlLCBuZXcgTWFwKCkpXHJcblxyXG4gICAgZ2xvYi5zeW5jKHBhdGguam9pbihpbWdQYXRoLCAnZ2FtZXMnLCBiYXNlLCAnKionKSwgeyBub2RpcjogdHJ1ZSB9KVxyXG4gICAgICAuZm9yRWFjaChpbnB1dCA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBwYXRoLnBhcnNlKGlucHV0KVxyXG4gICAgICAgIGdhbWVJbnB1dHMuZ2V0KGJhc2UpLnNldChuYW1lLCBpbnB1dClcclxuICAgICAgfSlcclxuXHJcbiAgICBjb25zdCBhbGlhcyA9IGFsaWFzZXMuaW5wdXRzLmdhbWVzW2Jhc2VdXHJcblxyXG4gICAgaWYgKGFsaWFzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgW2EsIHNdIG9mIE9iamVjdC5lbnRyaWVzKGFsaWFzKSkge1xyXG4gICAgICAgIGdhbWVJbnB1dHMuZ2V0KGJhc2UpLnNldChhLCBzKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbmZ1bmN0aW9uIHNvbHZlSW5wdXQgKGlucHV0cywgaW5wdXQpIHtcclxuICBpZiAoaW5wdXRzLmhhcyhpbnB1dCkpIHJldHVybiBpc1N0cmluZyhpbnB1dHMuZ2V0KGlucHV0KSkgPyBbaW5wdXRdIDogaW5wdXRzLmdldChpbnB1dClcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3QgczEgPSBpbnB1dC5zbGljZSgwLCAwIC0gaSlcclxuXHJcbiAgICBpZiAoaW5wdXRzLmhhcyhzMSkpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gaW5wdXRzLmdldChzMSlcclxuICAgICAgY29uc3QgcmVtYWluaW5nID0gc29sdmVJbnB1dChpbnB1dHMsIGlucHV0LnNsaWNlKDAgLSBpKSlcclxuXHJcbiAgICAgIHJldHVybiBpc1N0cmluZyhyZXN1bHQpID8gW3MxLCAuLi5yZW1haW5pbmddIDogWy4uLnJlc3VsdCwgLi4ucmVtYWluaW5nXVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBcIiR7aW5wdXR9XCIgYXMgYSByZWNvZ25pemFibGUgaW5wdXRgKVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBzZW5kSW5wdXQgKGlucHV0cywgcmVzdWx0LCBtZXNzYWdlLCBjYXB0aW9uKSB7XHJcbiAgY29uc3Qgd2lkdGggPSByZXN1bHQubWFwKGl0ID0+IHNpemVzW2l0XSB8fCAxNTIpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApXHJcbiAgY29uc3QgaW1hZ2VzID0gW11cclxuICBsZXQgbGVmdCA9IDBcclxuXHJcbiAgcmVzdWx0LmZvckVhY2goKGl0LCBpbmRleCkgPT4ge1xyXG4gICAgY29uc3Qgc2l6ZSA9IHNpemVzW2l0XSB8fCAxNTJcclxuICAgIGltYWdlcy5wdXNoKHsgaW5wdXQ6IGlucHV0cy5nZXQoaXQpLCBsZWZ0LCB0b3A6IE1hdGguZmxvb3IoKDE1MiAtIHNpemUpIC8gMikgfSlcclxuICAgIGxlZnQgKz0gc2l6ZVxyXG4gIH0pXHJcblxyXG4gIGxldCBjYW52YXMgPSBzaGFycCh7IGNyZWF0ZTogeyB3aWR0aCwgaGVpZ2h0OiAxNTIsIGNoYW5uZWxzOiA0LCBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnIH0gfSlcclxuICAgIC5wbmcoKVxyXG4gICAgLmNvbXBvc2l0ZShpbWFnZXMpXHJcblxyXG4gIGNhbnZhcyA9IGF3YWl0IGNhbnZhcy50b0J1ZmZlcigpXHJcblxyXG4gIGlmIChyZXN1bHQubGVuZ3RoIDwgMTIpIGNhbnZhcyA9IGF3YWl0IHNoYXJwKGNhbnZhcykucmVzaXplKHsgaGVpZ2h0OiA1NSB9KS5wbmcoKS50b0J1ZmZlcigpXHJcblxyXG4gIHJldHVybiBtZXNzYWdlLnJlcGx5KHsgY29udGVudDogY2FwdGlvbiwgZmlsZXM6IFtjYW52YXNdIH0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrR2FtZSAoZ2FtZSkge1xyXG4gIHJldHVybiBnYW1lSW5wdXRzLmhhcyhnYW1lKSA/IGdhbWUgOiBhbGlhc2VzLmdhbWVzW2dhbWVdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU3RyaW5nICh4KSB7XHJcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIG5hbWU6ICdmZy1ub3RhdGlvbicsXHJcbiAgYWJvdXQ6IHtcclxuICAgIG5hbWU6ICdGRyBOb3RhdGlvbicsXHJcbiAgICB2YWx1ZTogJ1tJbnN0cnVjdGlvbnMgYW5kIHNvdXJjZSBjb2RlXShodHRwczovL2xvdHVzLmNoaXRvd2FybG9jay5jb20vZmdub3RhdGlvbilcXG5bSW5maWxcXCdzIEZpZ2h0aW5nIEdhbWUgR2xvc3NhcnldKGh0dHBzOi8vZ2xvc3NhcnkuaW5maWwubmV0KVxcbltNYWdpY2lhblN0dWZmXFwncyBGaWdodGhpbmcgR2FtZSBub3RhdGlvbnMgZW1vdGVzXShodHRwczovL3R3aXR0ZXIuY29tL01hZ2ljaWFuU3R1ZmYvc3RhdHVzLzE0Nzc5MzEwNTQ0ODQ4OTM2OTcpJ1xyXG4gIH0sXHJcbiAgaW50ZW50czogWydHVUlMRF9NRVNTQUdFUyddLFxyXG4gIHBhcnRpYWxzOiBbJ01FU1NBR0UnXSxcclxuXHJcbiAgcHJlbG9hZDogc2VxdWVsaXplID0+IHtcclxuICAgIHNlcXVlbGl6ZS5kZWZpbmUoJ2ZnaW5wdXQnLCB7XHJcbiAgICAgIGd1aWxkOiB7XHJcbiAgICAgICAgdHlwZTogRGF0YVR5cGVzLlNUUklORyxcclxuICAgICAgICBwcmltYXJ5S2V5OiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIG5hbWU6IHtcclxuICAgICAgICB0eXBlOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICAgIHByaW1hcnlLZXk6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY3JlYXRlZEJ5OiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBnYW1lOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBjYXB0aW9uOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBpbnB1dDogRGF0YVR5cGVzLlNUUklOR1xyXG4gICAgfSlcclxuICB9LFxyXG5cclxuICBldmVudHM6IHtcclxuICAgIGFzeW5jIG1lc3NhZ2VDcmVhdGUgKGdsb2JhbCwgbWVzc2FnZSkge1xyXG4gICAgICBjb25zdCB7IGNsaWVudCwgY29uZmlnLCBzZXF1ZWxpemUgfSA9IGdsb2JhbFxyXG4gICAgICBpZiAobWVzc2FnZS5hdXRob3IuaWQgPT09IGNsaWVudC51c2VyLmlkIHx8ICFtZXNzYWdlLm1lbWJlcikgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBndWlsZElkID0gbWVzc2FnZS5ndWlsZElkXHJcbiAgICAgIGNvbnN0IHsgcHJlZml4IH0gPSBjb25maWdbZ3VpbGRJZF1cclxuXHJcbiAgICAgIGlmIChtZXNzYWdlLmNvbnRlbnQuc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IG1lc3NhZ2UuY29udGVudC5zcGxpdCgnICcpLnBvcCgpLnJlcGxhY2UocHJlZml4LCAnJylcclxuICAgICAgICBjb25zdCByb3cgPSBidWlsdGluW25hbWVdIHx8IChcclxuICAgICAgICAgIGF3YWl0IHNlcXVlbGl6ZS5tb2RlbHMuZmdpbnB1dC5maW5kT25lKHtcclxuICAgICAgICAgICAgd2hlcmU6IHsgZ3VpbGQ6IG1lc3NhZ2UuZ3VpbGQuaWQsIG5hbWUgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0cyA9IG5ldyBNYXAoWy4uLmJhc2ljSW5wdXRzLCAuLi5nYW1lSW5wdXRzLmdldChyb3cuZ2FtZSldKVxyXG4gICAgICAgICAgc2VuZElucHV0KGlucHV0cywgcm93LmlucHV0LnNwbGl0KCcgJyksIG1lc3NhZ2UsIHJvdy5jYXB0aW9uKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIGNvbW1hbmRzOiB7XHJcbiAgICBmZ2k6IHtcclxuICAgICAgdXNhZ2U6ICdmZ2kgW2dhbWVdIFtpbnB1dHNdJyxcclxuICAgICAgZGVzYzogJ0NvbnZlcnRzIGEgbGlzdCBvZiBpbnB1dHMgaW50byBhbiBpbWFnZScsXHJcbiAgICAgIGV4YW1wbGU6ICdmZ2kgc2YgMjM2UCAyMTRLJyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0gfSwgeyBtZXNzYWdlIH0pID0+IHtcclxuICAgICAgICBjb25zdCBbLCBnYW1lSW5wdXQsIGkxXSA9IHBhcmFtXHJcbiAgICAgICAgaWYgKCFnYW1lSW5wdXQgfHwgIWkxKSByZXR1cm4gbWVzc2FnZS5yZXBseSgnTWlzc2luZyBhcmd1bWVudHMuIEV4YW1wbGU6ID5mZ2kgc2YgMjM2UCAyMTRLJylcclxuXHJcbiAgICAgICAgY29uc3QgZ2FtZSA9IGNoZWNrR2FtZShnYW1lSW5wdXQpXHJcbiAgICAgICAgaWYgKCFnYW1lSW5wdXRzLmhhcyhnYW1lKSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoYFwiJHtnYW1lfVwiIGlzIG5vdCBhIHZhbGlkIGdhbWUuIEF2YWlsYWJsZSBnYW1lczogJHtBcnJheS5mcm9tKGdhbWVJbnB1dHMua2V5cygpKS5qb2luKCcgJyl9YClcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0cyA9IG5ldyBNYXAoWy4uLmJhc2ljSW5wdXRzLCAuLi5nYW1lSW5wdXRzLmdldChnYW1lKV0pXHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJhbS5zbGljZSgyKS5tYXAoaSA9PiBzb2x2ZUlucHV0KGlucHV0cywgaS50b0xvd2VyQ2FzZSgpKSkuZmxhdCgpXHJcblxyXG4gICAgICAgICAgc2VuZElucHV0KGlucHV0cywgcmVzdWx0LCBtZXNzYWdlKVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgbWVzc2FnZS5yZXBseShlcnIubWVzc2FnZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBmZ3NhdmU6IHtcclxuICAgICAgdXNhZ2U6ICdmZ3NhdmUgW2dhbWVdIFtuYW1lXSBbaW5wdXRzXScsXHJcbiAgICAgIGRlc2M6ICdTYXZlcyBhIGxpc3Qgb2YgaW5wdXRzIGludG8gYSBjb21tYW5kJyxcclxuICAgICAgZXhhbXBsZTogJ2ZnaSBzZiB0ZXN0TmFtZSAyMzZQIDIxNEsnLFxyXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXJhbSwgc2VxdWVsaXplIH0sIHsgbWVzc2FnZSB9KSA9PiB7XHJcbiAgICAgICAgY29uc3QgWywgZ2FtZUlucHV0LCBuYW1lLCBpMV0gPSBwYXJhbVxyXG4gICAgICAgIGlmICghZ2FtZUlucHV0IHx8ICFuYW1lIHx8ICFpMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoJ01pc3NpbmcgYXJndW1lbnRzLiBFeGFtcGxlOiA+ZmdpIHNmIHRlc3ROYW1lIDIzNlAgMjE0SycpXHJcblxyXG4gICAgICAgIGNvbnN0IGdhbWUgPSBjaGVja0dhbWUoZ2FtZUlucHV0KVxyXG4gICAgICAgIGlmICghZ2FtZUlucHV0cy5oYXMoZ2FtZSkpIHJldHVybiBtZXNzYWdlLnJlcGx5KGBcIiR7Z2FtZX1cIiBpcyBub3QgYSB2YWxpZCBnYW1lLiBBdmFpbGFibGUgZ2FtZXM6ICR7QXJyYXkuZnJvbShnYW1lSW5wdXRzLmtleXMoKSkuam9pbignICcpfWApXHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBpbnB1dHMgPSBuZXcgTWFwKFsuLi5iYXNpY0lucHV0cywgLi4uZ2FtZUlucHV0cy5nZXQoZ2FtZSldKVxyXG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBwYXJhbS5zbGljZSgzKS5tYXAoaSA9PiBzb2x2ZUlucHV0KGlucHV0cywgaS50b0xvd2VyQ2FzZSgpKSkuZmxhdCgpLmpvaW4oJyAnKVxyXG5cclxuICAgICAgICAgIGF3YWl0IHNlcXVlbGl6ZS5tb2RlbHMuZmdpbnB1dC5jcmVhdGUoeyBndWlsZDogbWVzc2FnZS5ndWlsZC5pZCwgbmFtZSwgY3JlYXRlZEJ5OiBtZXNzYWdlLmF1dGhvci5pZCwgZ2FtZSwgaW5wdXQgfSlcclxuXHJcbiAgICAgICAgICBtZXNzYWdlLmNoYW5uZWwuc2VuZChgU2F2ZWQgY29tbWFuZCBcIiR7aW5wdXR9XCIgYXMgXCIke25hbWV9XCJgKVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgbWVzc2FnZS5yZXBseShlcnIubWVzc2FnZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBmZ2NhcHRpb246IHtcclxuICAgICAgdXNhZ2U6ICdmZ2NhcHRpb24gW25hbWVdIFtjYXB0aW9uXScsXHJcbiAgICAgIGRlc2M6ICdBZGRzIGEgY2FwdGlvbiB0byBhIHNhdmVkIGlucHV0IGNvbW1hbmQnLFxyXG4gICAgICBleGFtcGxlOiAnZmdjYXB0aW9uIHRlc3ROYW1lIFRoaXMgaXMgYSBjYXB0aW9uJyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0sIHNlcXVlbGl6ZSB9LCB7IG1lc3NhZ2UgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IFssIG5hbWUsIGkxXSA9IHBhcmFtXHJcbiAgICAgICAgaWYgKCFuYW1lIHx8ICFpMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoJ01pc3NpbmcgYXJndW1lbnRzLiBFeGFtcGxlOiA+ZmdpIHRlc3ROYW1lIFRoaXMgaXMgYSBjYXB0aW9uJylcclxuXHJcbiAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgc2VxdWVsaXplLm1vZGVscy5mZ2lucHV0LmZpbmRPbmUoe1xyXG4gICAgICAgICAgd2hlcmU6IHsgZ3VpbGQ6IG1lc3NhZ2UuZ3VpbGQuaWQsIG5hbWUgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIGlmICghcm93KSByZXR1cm4gbWVzc2FnZS5yZXBseShgXCIke25hbWV9XCIgaXMgbm90IGEgc2F2ZWQgaW5wdXQgbGlzdGApXHJcbiAgICAgICAgcm93LmNhcHRpb24gPSBwYXJhbS5zbGljZSgyKS5qb2luKCcgJylcclxuICAgICAgICBhd2FpdCByb3cuc2F2ZSgpXHJcblxyXG4gICAgICAgIG1lc3NhZ2UuY2hhbm5lbC5zZW5kKGBTYXZlZCBjYXB0aW9uIGZvciBpbnB1dCBsaXN0IFwiJHtuYW1lfVwiYClcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGZnZ2xvc3Nhcnk6IHtcclxuICAgICAgdXNhZ2U6ICdmZ2dsb3NzYXJ5IFtzZWFyY2ggdGVybV0nLFxyXG4gICAgICBkZXNjOiAnU2VhcmNoZXMgZm9yIGEgdGVybSBvbiBJbmZpbFxcJ3MgR2xvc3NhcnknLFxyXG4gICAgICBleGFtcGxlOiAnZmdnbG9zc2FyeSBtZXhpY2FuIHVwcGVyY3V0JyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0sIHNlcXVlbGl6ZSB9LCB7IG1lc3NhZ2UgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtLnNsaWNlKDEpXHJcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHJldHVybiBtZXNzYWdlLnJlcGx5KCdNaXNzaW5nIHNlYXJjaCB0ZXJtLiBFeGFtcGxlOiA+ZmdnbG9zc2FyeSBtZXhpY2FuIHVwcGVyY3V0JylcclxuXHJcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gcGFyYW1zLmpvaW4oJyAnKS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGVybXMuZmlsdGVyKGkgPT4gaS5pbmNsdWRlcyhzZWFyY2gpKVxyXG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL2dsb3NzYXJ5LmluZmlsLm5ldC8/dD0ke3BhcmFtcy5qb2luKCclMjAnKS50b0xvd2VyQ2FzZSgpfWBcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHJldHVybiBtZXNzYWdlLnJlcGx5KGBUZXJtIFwiJHtzZWFyY2h9XCIgbm90IGZvdW5kYClcclxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoYFxcYFxcYFxcYCR7Z2xvc3NhcnlbcmVzdWx0WzBdXS5kZWZ9XFxgXFxgXFxgU291cmNlOiA8JHt1cmx9PmApXHJcblxyXG4gICAgICAgIG1lc3NhZ2UucmVwbHkoYE11bHRpcGxlIHRlcm1zIGZvdW5kOiAke3VybH1gKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
package/dev/info.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "sizes": { "+": 55 },
3
+
4
+ "builtin": {
5
+ "37": {
6
+ "game": "sf",
7
+ "caption": "***LETS GO JUSTIN!***",
8
+ "input": "6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk"
9
+ }
10
+ },
11
+
12
+ "aliases": {
13
+ "games": {
14
+ "bbt": "bbtag",
15
+ "db": "dbz"
16
+ },
17
+
18
+ "inputs": {
19
+ "basic": {
20
+ "doubleforward": [">>"]
21
+ },
22
+
23
+ "games": {
24
+ "bbtag": {
25
+ "throw": ["b","+","c"],
26
+ "crb": ["d","+","p"],
27
+ "airdash": ["a","+","b"],
28
+ "reversal": ["a","+","d"]
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/lib/index.js CHANGED
@@ -9,10 +9,10 @@ exports["default"] = void 0;
9
9
 
10
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
11
 
12
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
12
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
13
 
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
16
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
17
 
18
18
  var _sharp = _interopRequireDefault(require("sharp"));
@@ -25,6 +25,8 @@ var _sequelize = require("sequelize");
25
25
 
26
26
  var _bent = _interopRequireDefault(require("bent"));
27
27
 
28
+ var _info = require("./info.json");
29
+
28
30
  var getJSON = (0, _bent["default"])('json');
29
31
 
30
32
  var imgPath = _path["default"].join(__dirname, 'img');
@@ -77,27 +79,55 @@ _glob["default"].sync(_path["default"].join(imgPath, 'basic/**'), {
77
79
  }).forEach(function (p) {
78
80
  var input = p.split('/').pop().replace('.png', '');
79
81
  basicInputs.set(input, p);
80
- });
82
+ var alias = _info.aliases.inputs.basic[input];
81
83
 
82
- basicInputs.set('>>', _path["default"].join(imgPath, 'basic/doubleforward.png'));
84
+ if (alias) {
85
+ alias.forEach(function (i) {
86
+ basicInputs.set(i, p);
87
+ if (_info.sizes[input]) _info.sizes[i] = _info.sizes[input];
88
+ });
89
+ }
90
+ });
83
91
 
84
- _glob["default"].sync(_path["default"].join(imgPath, 'games/**'), {
85
- nodir: true
86
- }).forEach(function (p) {
92
+ _glob["default"].sync(_path["default"].join(imgPath, 'games/*')).forEach(function (p) {
87
93
  var _path$parse = _path["default"].parse(_path["default"].relative(_path["default"].join(imgPath, 'games'), p)),
88
- dir = _path$parse.dir,
89
- name = _path$parse.name;
94
+ base = _path$parse.base;
95
+
96
+ gameInputs.set(base, new Map());
90
97
 
91
- if (!gameInputs.has(dir)) gameInputs.set(dir, new Map());
92
- gameInputs.get(dir).set(name, p);
98
+ _glob["default"].sync(_path["default"].join(imgPath, 'games', base, '**'), {
99
+ nodir: true
100
+ }).forEach(function (input) {
101
+ var _path$parse2 = _path["default"].parse(input),
102
+ name = _path$parse2.name;
103
+
104
+ gameInputs.get(base).set(name, input);
105
+ });
106
+
107
+ var alias = _info.aliases.inputs.games[base];
108
+
109
+ if (alias) {
110
+ for (var _i = 0, _Object$entries = Object.entries(alias); _i < _Object$entries.length; _i++) {
111
+ var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
112
+ a = _Object$entries$_i[0],
113
+ s = _Object$entries$_i[1];
114
+
115
+ gameInputs.get(base).set(a, s);
116
+ }
117
+ }
93
118
  });
94
119
 
95
120
  function solveInput(inputs, input) {
96
- if (inputs.has(input)) return [input];
121
+ if (inputs.has(input)) return isString(inputs.get(input)) ? [input] : inputs.get(input);
97
122
 
98
123
  for (var i = 0; i < input.length; i++) {
99
124
  var s1 = input.slice(0, 0 - i);
100
- if (inputs.has(s1)) return [s1].concat((0, _toConsumableArray2["default"])(solveInput(inputs, input.slice(0 - i))));
125
+
126
+ if (inputs.has(s1)) {
127
+ var result = inputs.get(s1);
128
+ var remaining = solveInput(inputs, input.slice(0 - i));
129
+ return isString(result) ? [s1].concat((0, _toConsumableArray2["default"])(remaining)) : [].concat((0, _toConsumableArray2["default"])(result), (0, _toConsumableArray2["default"])(remaining));
130
+ }
101
131
  }
102
132
 
103
133
  throw new Error("Cannot find \"".concat(input, "\" as a recognizable input"));
@@ -109,37 +139,61 @@ function sendInput(_x, _x2, _x3, _x4) {
109
139
 
110
140
  function _sendInput() {
111
141
  _sendInput = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(inputs, result, message, caption) {
112
- var canvas;
142
+ var width, images, left, canvas;
113
143
  return _regenerator["default"].wrap(function _callee7$(_context7) {
114
144
  while (1) {
115
145
  switch (_context7.prev = _context7.next) {
116
146
  case 0:
117
- _context7.next = 2;
118
- return (0, _sharp["default"])({
147
+ width = result.map(function (it) {
148
+ return _info.sizes[it] || 152;
149
+ }).reduce(function (a, b) {
150
+ return a + b;
151
+ }, 0);
152
+ images = [];
153
+ left = 0;
154
+ result.forEach(function (it, index) {
155
+ var size = _info.sizes[it] || 152;
156
+ images.push({
157
+ input: inputs.get(it),
158
+ left: left,
159
+ top: Math.floor((152 - size) / 2)
160
+ });
161
+ left += size;
162
+ });
163
+ canvas = (0, _sharp["default"])({
119
164
  create: {
120
- width: 152 * result.length,
165
+ width: width,
121
166
  height: 152,
122
167
  channels: 4,
123
168
  background: 'transparent'
124
169
  }
125
- }).composite(result.map(function (it, index) {
126
- return {
127
- input: inputs.get(it),
128
- left: index * 152,
129
- top: 0,
130
- width: 152,
131
- height: 152
132
- };
133
- })).png().toBuffer();
170
+ }).png().composite(images);
171
+ _context7.next = 7;
172
+ return canvas.toBuffer();
134
173
 
135
- case 2:
174
+ case 7:
136
175
  canvas = _context7.sent;
176
+
177
+ if (!(result.length < 12)) {
178
+ _context7.next = 12;
179
+ break;
180
+ }
181
+
182
+ _context7.next = 11;
183
+ return (0, _sharp["default"])(canvas).resize({
184
+ height: 55
185
+ }).png().toBuffer();
186
+
187
+ case 11:
188
+ canvas = _context7.sent;
189
+
190
+ case 12:
137
191
  return _context7.abrupt("return", message.reply({
138
192
  content: caption,
139
193
  files: [canvas]
140
194
  }));
141
195
 
142
- case 4:
196
+ case 13:
143
197
  case "end":
144
198
  return _context7.stop();
145
199
  }
@@ -149,13 +203,14 @@ function _sendInput() {
149
203
  return _sendInput.apply(this, arguments);
150
204
  }
151
205
 
152
- var builtin = {
153
- 37: {
154
- game: 'sf',
155
- caption: '***LETS GO JUSTIN!***',
156
- input: '6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk'
157
- }
158
- };
206
+ function checkGame(game) {
207
+ return gameInputs.has(game) ? game : _info.aliases.games[game];
208
+ }
209
+
210
+ function isString(x) {
211
+ return Object.prototype.toString.call(x) === '[object String]';
212
+ }
213
+
159
214
  var _default = {
160
215
  name: 'fg-notation',
161
216
  about: {
@@ -207,7 +262,7 @@ var _default = {
207
262
  }
208
263
 
209
264
  name = message.content.split(' ').pop().replace(prefix, '');
210
- _context.t0 = builtin[name];
265
+ _context.t0 = _info.builtin[name];
211
266
 
212
267
  if (_context.t0) {
213
268
  _context.next = 12;
@@ -249,7 +304,7 @@ var _default = {
249
304
  example: 'fgi sf 236P 214K',
250
305
  execute: function () {
251
306
  var _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref, _ref2) {
252
- var param, message, _param, game, i1, inputs, result;
307
+ var param, message, _param, gameInput, i1, game, inputs, result;
253
308
 
254
309
  return _regenerator["default"].wrap(function _callee2$(_context2) {
255
310
  while (1) {
@@ -257,9 +312,9 @@ var _default = {
257
312
  case 0:
258
313
  param = _ref.param;
259
314
  message = _ref2.message;
260
- _param = (0, _slicedToArray2["default"])(param, 3), game = _param[1], i1 = _param[2];
315
+ _param = (0, _slicedToArray2["default"])(param, 3), gameInput = _param[1], i1 = _param[2];
261
316
 
262
- if (!(!game || !i1)) {
317
+ if (!(!gameInput || !i1)) {
263
318
  _context2.next = 5;
264
319
  break;
265
320
  }
@@ -267,21 +322,27 @@ var _default = {
267
322
  return _context2.abrupt("return", message.reply('Missing arguments. Example: >fgi sf 236P 214K'));
268
323
 
269
324
  case 5:
325
+ game = checkGame(gameInput);
326
+
270
327
  if (gameInputs.has(game)) {
271
- _context2.next = 7;
328
+ _context2.next = 8;
272
329
  break;
273
330
  }
274
331
 
275
332
  return _context2.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
276
333
 
277
- case 7:
278
- inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
279
- result = param.slice(2).map(function (i) {
280
- return solveInput(inputs, i.toLowerCase());
281
- }).flat();
282
- sendInput(inputs, result, message);
334
+ case 8:
335
+ try {
336
+ inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
337
+ result = param.slice(2).map(function (i) {
338
+ return solveInput(inputs, i.toLowerCase());
339
+ }).flat();
340
+ sendInput(inputs, result, message);
341
+ } catch (err) {
342
+ message.reply(err.message);
343
+ }
283
344
 
284
- case 10:
345
+ case 9:
285
346
  case "end":
286
347
  return _context2.stop();
287
348
  }
@@ -302,7 +363,7 @@ var _default = {
302
363
  example: 'fgi sf testName 236P 214K',
303
364
  execute: function () {
304
365
  var _execute2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3, _ref4) {
305
- var param, sequelize, message, _param2, game, name, i1, inputs, input;
366
+ var param, sequelize, message, _param2, gameInput, name, i1, game, inputs, input;
306
367
 
307
368
  return _regenerator["default"].wrap(function _callee3$(_context3) {
308
369
  while (1) {
@@ -310,9 +371,9 @@ var _default = {
310
371
  case 0:
311
372
  param = _ref3.param, sequelize = _ref3.sequelize;
312
373
  message = _ref4.message;
313
- _param2 = (0, _slicedToArray2["default"])(param, 4), game = _param2[1], name = _param2[2], i1 = _param2[3];
374
+ _param2 = (0, _slicedToArray2["default"])(param, 4), gameInput = _param2[1], name = _param2[2], i1 = _param2[3];
314
375
 
315
- if (!(!game || !name || !i1)) {
376
+ if (!(!gameInput || !name || !i1)) {
316
377
  _context3.next = 5;
317
378
  break;
318
379
  }
@@ -320,19 +381,22 @@ var _default = {
320
381
  return _context3.abrupt("return", message.reply('Missing arguments. Example: >fgi sf testName 236P 214K'));
321
382
 
322
383
  case 5:
384
+ game = checkGame(gameInput);
385
+
323
386
  if (gameInputs.has(game)) {
324
- _context3.next = 7;
387
+ _context3.next = 8;
325
388
  break;
326
389
  }
327
390
 
328
391
  return _context3.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
329
392
 
330
- case 7:
393
+ case 8:
394
+ _context3.prev = 8;
331
395
  inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
332
396
  input = param.slice(3).map(function (i) {
333
397
  return solveInput(inputs, i.toLowerCase());
334
398
  }).flat().join(' ');
335
- _context3.next = 11;
399
+ _context3.next = 13;
336
400
  return sequelize.models.fginput.create({
337
401
  guild: message.guild.id,
338
402
  name: name,
@@ -341,15 +405,22 @@ var _default = {
341
405
  input: input
342
406
  });
343
407
 
344
- case 11:
408
+ case 13:
345
409
  message.channel.send("Saved command \"".concat(input, "\" as \"").concat(name, "\""));
410
+ _context3.next = 19;
411
+ break;
346
412
 
347
- case 12:
413
+ case 16:
414
+ _context3.prev = 16;
415
+ _context3.t0 = _context3["catch"](8);
416
+ message.reply(_context3.t0.message);
417
+
418
+ case 19:
348
419
  case "end":
349
420
  return _context3.stop();
350
421
  }
351
422
  }
352
- }, _callee3);
423
+ }, _callee3, null, [[8, 16]]);
353
424
  }));
354
425
 
355
426
  function execute(_x7, _x8) {
package/lib/info.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "sizes": { "+": 55 },
3
+
4
+ "builtin": {
5
+ "37": {
6
+ "game": "sf",
7
+ "caption": "***LETS GO JUSTIN!***",
8
+ "input": "6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk"
9
+ }
10
+ },
11
+
12
+ "aliases": {
13
+ "games": {
14
+ "bbt": "bbtag",
15
+ "db": "dbz"
16
+ },
17
+
18
+ "inputs": {
19
+ "basic": {
20
+ "doubleforward": [">>"]
21
+ },
22
+
23
+ "games": {
24
+ "bbtag": {
25
+ "throw": ["b","+","c"],
26
+ "crb": ["d","+","p"],
27
+ "airdash": ["a","+","b"],
28
+ "reversal": ["a","+","d"]
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }
package/package.json CHANGED
@@ -1,20 +1,22 @@
1
1
  {
2
2
  "name": "@lotus-tree/fg-notation",
3
- "version": "1.1.4",
3
+ "version": "1.2.0",
4
4
  "main": "lib/index.js",
5
5
  "module": "src/index.js",
6
6
  "scripts": {
7
7
  "run-babel": "babel --delete-dir-on-start --copy-files src",
8
8
  "build": "yarn run run-babel --out-dir lib",
9
- "dev": "yarn run run-babel --watch --out-dir dev",
9
+ "dev": "yarn run run-babel --watch --source-maps inline --out-dir dev",
10
10
  "prepublishOnly": "yarn build"
11
11
  },
12
12
  "dependencies": {
13
- "@lotus-tree/command-handler": "^2.1.0",
14
13
  "bent": "^7.3.12",
15
14
  "glob": "^7.2.0",
16
15
  "sharp": "^0.29.3"
17
16
  },
17
+ "peerDependencies": {
18
+ "@lotus-tree/command-handler": "^2.1.0"
19
+ },
18
20
  "devDependencies": {
19
21
  "@babel/cli": "^7.16.7",
20
22
  "@babel/core": "^7.16.7",
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/src/index.js CHANGED
@@ -4,6 +4,8 @@ import glob from 'glob'
4
4
  import { DataTypes } from 'sequelize'
5
5
  import bent from 'bent'
6
6
 
7
+ import { sizes, aliases, builtin } from './info.json'
8
+
7
9
  const getJSON = bent('json')
8
10
  const imgPath = path.join(__dirname, 'img')
9
11
  const basicInputs = new Map()
@@ -34,46 +36,81 @@ glob.sync(path.join(imgPath, 'basic/**'), { nodir: true })
34
36
  .forEach(p => {
35
37
  const input = p.split('/').pop().replace('.png', '')
36
38
  basicInputs.set(input, p)
37
- })
38
39
 
39
- basicInputs.set('>>', path.join(imgPath, 'basic/doubleforward.png'))
40
+ const alias = aliases.inputs.basic[input]
41
+ if (alias) {
42
+ alias.forEach(i => {
43
+ basicInputs.set(i, p)
44
+ if (sizes[input]) sizes[i] = sizes[input]
45
+ })
46
+ }
47
+ })
40
48
 
41
- glob.sync(path.join(imgPath, 'games/**'), { nodir: true })
49
+ glob.sync(path.join(imgPath, 'games/*'))
42
50
  .forEach(p => {
43
- const { dir, name } = path.parse(path.relative(path.join(imgPath, 'games'), p))
51
+ const { base } = path.parse(path.relative(path.join(imgPath, 'games'), p))
52
+ gameInputs.set(base, new Map())
53
+
54
+ glob.sync(path.join(imgPath, 'games', base, '**'), { nodir: true })
55
+ .forEach(input => {
56
+ const { name } = path.parse(input)
57
+ gameInputs.get(base).set(name, input)
58
+ })
59
+
60
+ const alias = aliases.inputs.games[base]
44
61
 
45
- if (!gameInputs.has(dir)) gameInputs.set(dir, new Map())
46
- gameInputs.get(dir).set(name, p)
62
+ if (alias) {
63
+ for (const [a, s] of Object.entries(alias)) {
64
+ gameInputs.get(base).set(a, s)
65
+ }
66
+ }
47
67
  })
48
68
 
49
69
  function solveInput (inputs, input) {
50
- if (inputs.has(input)) return [input]
70
+ if (inputs.has(input)) return isString(inputs.get(input)) ? [input] : inputs.get(input)
51
71
 
52
72
  for (let i = 0; i < input.length; i++) {
53
73
  const s1 = input.slice(0, 0 - i)
54
- if (inputs.has(s1)) return [s1, ...solveInput(inputs, input.slice(0 - i))]
74
+
75
+ if (inputs.has(s1)) {
76
+ const result = inputs.get(s1)
77
+ const remaining = solveInput(inputs, input.slice(0 - i))
78
+
79
+ return isString(result) ? [s1, ...remaining] : [...result, ...remaining]
80
+ }
55
81
  }
56
82
 
57
83
  throw new Error(`Cannot find "${input}" as a recognizable input`)
58
84
  }
59
85
 
60
86
  async function sendInput (inputs, result, message, caption) {
61
- const canvas = await sharp({ create: { width: 152 * result.length, height: 152, channels: 4, background: 'transparent' } })
62
- .composite(result.map((it, index) =>
63
- ({ input: inputs.get(it), left: index * 152, top: 0, width: 152, height: 152 })
64
- ))
87
+ const width = result.map(it => sizes[it] || 152).reduce((a, b) => a + b, 0)
88
+ const images = []
89
+ let left = 0
90
+
91
+ result.forEach((it, index) => {
92
+ const size = sizes[it] || 152
93
+ images.push({ input: inputs.get(it), left, top: Math.floor((152 - size) / 2) })
94
+ left += size
95
+ })
96
+
97
+ let canvas = sharp({ create: { width, height: 152, channels: 4, background: 'transparent' } })
65
98
  .png()
66
- .toBuffer()
99
+ .composite(images)
100
+
101
+ canvas = await canvas.toBuffer()
102
+
103
+ if (result.length < 12) canvas = await sharp(canvas).resize({ height: 55 }).png().toBuffer()
67
104
 
68
105
  return message.reply({ content: caption, files: [canvas] })
69
106
  }
70
107
 
71
- const builtin = {
72
- 37: {
73
- game: 'sf',
74
- caption: '***LETS GO JUSTIN!***',
75
- input: '6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk'
76
- }
108
+ function checkGame (game) {
109
+ return gameInputs.has(game) ? game : aliases.games[game]
110
+ }
111
+
112
+ function isString (x) {
113
+ return Object.prototype.toString.call(x) === '[object String]'
77
114
  }
78
115
 
79
116
  export default {
@@ -132,14 +169,20 @@ export default {
132
169
  desc: 'Converts a list of inputs into an image',
133
170
  example: 'fgi sf 236P 214K',
134
171
  execute: async ({ param }, { message }) => {
135
- const [, game, i1] = param
136
- if (!game || !i1) return message.reply('Missing arguments. Example: >fgi sf 236P 214K')
172
+ const [, gameInput, i1] = param
173
+ if (!gameInput || !i1) return message.reply('Missing arguments. Example: >fgi sf 236P 214K')
174
+
175
+ const game = checkGame(gameInput)
137
176
  if (!gameInputs.has(game)) return message.reply(`"${game}" is not a valid game. Available games: ${Array.from(gameInputs.keys()).join(' ')}`)
138
177
 
139
- const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
140
- const result = param.slice(2).map(i => solveInput(inputs, i.toLowerCase())).flat()
178
+ try {
179
+ const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
180
+ const result = param.slice(2).map(i => solveInput(inputs, i.toLowerCase())).flat()
141
181
 
142
- sendInput(inputs, result, message)
182
+ sendInput(inputs, result, message)
183
+ } catch (err) {
184
+ message.reply(err.message)
185
+ }
143
186
  }
144
187
  },
145
188
  fgsave: {
@@ -147,16 +190,22 @@ export default {
147
190
  desc: 'Saves a list of inputs into a command',
148
191
  example: 'fgi sf testName 236P 214K',
149
192
  execute: async ({ param, sequelize }, { message }) => {
150
- const [, game, name, i1] = param
151
- if (!game || !name || !i1) return message.reply('Missing arguments. Example: >fgi sf testName 236P 214K')
193
+ const [, gameInput, name, i1] = param
194
+ if (!gameInput || !name || !i1) return message.reply('Missing arguments. Example: >fgi sf testName 236P 214K')
195
+
196
+ const game = checkGame(gameInput)
152
197
  if (!gameInputs.has(game)) return message.reply(`"${game}" is not a valid game. Available games: ${Array.from(gameInputs.keys()).join(' ')}`)
153
198
 
154
- const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
155
- const input = param.slice(3).map(i => solveInput(inputs, i.toLowerCase())).flat().join(' ')
199
+ try {
200
+ const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
201
+ const input = param.slice(3).map(i => solveInput(inputs, i.toLowerCase())).flat().join(' ')
156
202
 
157
- await sequelize.models.fginput.create({ guild: message.guild.id, name, createdBy: message.author.id, game, input })
203
+ await sequelize.models.fginput.create({ guild: message.guild.id, name, createdBy: message.author.id, game, input })
158
204
 
159
- message.channel.send(`Saved command "${input}" as "${name}"`)
205
+ message.channel.send(`Saved command "${input}" as "${name}"`)
206
+ } catch (err) {
207
+ message.reply(err.message)
208
+ }
160
209
  }
161
210
  },
162
211
  fgcaption: {
package/src/info.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "sizes": { "+": 55 },
3
+
4
+ "builtin": {
5
+ "37": {
6
+ "game": "sf",
7
+ "caption": "***LETS GO JUSTIN!***",
8
+ "input": "6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk"
9
+ }
10
+ },
11
+
12
+ "aliases": {
13
+ "games": {
14
+ "bbt": "bbtag",
15
+ "db": "dbz"
16
+ },
17
+
18
+ "inputs": {
19
+ "basic": {
20
+ "doubleforward": [">>"]
21
+ },
22
+
23
+ "games": {
24
+ "bbtag": {
25
+ "throw": ["b","+","c"],
26
+ "crb": ["d","+","p"],
27
+ "airdash": ["a","+","b"],
28
+ "reversal": ["a","+","d"]
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }