diff --git a/src/client/images/abilityIcons.png b/src/client/images/abilityIcons.png
index 0f6de171..9885cd34 100644
Binary files a/src/client/images/abilityIcons.png and b/src/client/images/abilityIcons.png differ
diff --git a/src/client/images/abilityIcons.pyxel b/src/client/images/abilityIcons.pyxel
index 8ee1518c..a5ef4277 100644
Binary files a/src/client/images/abilityIcons.pyxel and b/src/client/images/abilityIcons.pyxel differ
diff --git a/src/client/images/characters.png b/src/client/images/characters.png
index 0c07522b..3c12b312 100644
Binary files a/src/client/images/characters.png and b/src/client/images/characters.png differ
diff --git a/src/client/images/characters.pyxel b/src/client/images/characters.pyxel
index 0badcd83..8e0267fb 100644
Binary files a/src/client/images/characters.pyxel and b/src/client/images/characters.pyxel differ
diff --git a/src/client/js/components/components.js b/src/client/js/components/components.js
index e0b343f6..8a223654 100644
--- a/src/client/js/components/components.js
+++ b/src/client/js/components/components.js
@@ -31,7 +31,7 @@ define([
if (cpn.type)
templates.push(tpl);
if (cpn.extends)
- extenders.push(tpl);
+ extenders.push({ extends: cpn.extends, tpl });
res();
});
@@ -49,7 +49,7 @@ define([
templates.forEach(t => {
const extensions = extenders.filter(e => e.extends === t.type);
- extensions.forEach(e => $.extend(true, t, e));
+ extensions.forEach(e => $.extend(true, t, e.tpl));
t.eventList = {};
t.hookEvent = hookEvent;
diff --git a/src/client/js/misc/physics.js b/src/client/js/misc/physics.js
index 3a24bd17..f3b49199 100644
--- a/src/client/js/misc/physics.js
+++ b/src/client/js/misc/physics.js
@@ -1,7 +1,9 @@
define([
- 'js/misc/distanceToPolygon'
+ 'js/misc/distanceToPolygon',
+ 'js/system/events'
], function (
- distanceToPolygon
+ distanceToPolygon,
+ events
) {
return {
grid: null,
@@ -10,6 +12,8 @@ define([
height: 0,
init: function (collisionMap) {
+ events.on('resetPhysics', this.reset.bind(this));
+
this.width = collisionMap.length;
this.height = collisionMap[0].length;
@@ -22,6 +26,13 @@ define([
}
},
+ reset: function () {
+ this.width = 0;
+ this.height = 0;
+
+ this.grid = [];
+ },
+
isTileBlocking: function (x, y, mob, obj) {
if ((x < 0) || (y < 0) || (x >= this.width) | (y >= this.height))
return true;
diff --git a/src/client/js/misc/statTranslations.js b/src/client/js/misc/statTranslations.js
index 90f4c1d0..ba7d86c1 100644
--- a/src/client/js/misc/statTranslations.js
+++ b/src/client/js/misc/statTranslations.js
@@ -52,7 +52,7 @@ define([
attackSpeed: 'attack speed',
castSpeed: 'cast speed',
- lifeOnHit: 'life gained on hit',
+ lifeOnHit: 'life gained on dealing physical damage',
auraReserveMultiplier: 'aura mana reservation multiplier',
diff --git a/src/client/js/objects/objBase.js b/src/client/js/objects/objBase.js
index e66f480b..c84747ec 100644
--- a/src/client/js/objects/objBase.js
+++ b/src/client/js/objects/objBase.js
@@ -174,7 +174,7 @@ define([
offEvents: function () {
if (this.pather)
- this.pather.onDeath();
+ this.pather.resetPath();
for (let e in this.eventCallbacks)
this.eventCallbacks[e].forEach(c => events.off(e, c));
diff --git a/src/client/js/objects/objects.js b/src/client/js/objects/objects.js
index fdc98bcd..33ffbbd2 100644
--- a/src/client/js/objects/objects.js
+++ b/src/client/js/objects/objects.js
@@ -15,11 +15,15 @@ define([
objects: [],
init: function () {
- events.on('onGetObject', this.onGetObject.bind(this));
- events.on('onRezone', this.onRezone.bind(this));
events.on('onChangeHoverTile', this.getLocation.bind(this));
- events.on('onTilesVisible', this.onTilesVisible.bind(this));
- events.on('onToggleNameplates', this.onToggleNameplates.bind(this));
+
+ [
+ 'onGetObject',
+ 'onTilesVisible',
+ 'onToggleNameplates',
+ 'destroyAllObjects'
+ ]
+ .forEach(e => events.on(e, this[e].bind(this)));
},
getLocation: function (x, y) {
@@ -87,20 +91,14 @@ define([
return list[fromIndex];
},
- onRezone: function (oldZone) {
- let objects = this.objects;
- let oLen = objects.length;
- for (let i = 0; i < oLen; i++) {
- let o = objects[i];
+ destroyAllObjects: function () {
+ this.objects.forEach(o => {
+ o.destroy();
+ });
- if (oldZone === null)
- o.destroy();
- else if (o.zoneId === oldZone)
- o.destroy();
- }
+ this.objects.length = 0;
- if (window.player)
- window.player.offEvents();
+ window?.player?.offEvents();
},
onGetObject: function (obj) {
diff --git a/src/client/js/rendering/helpers/resetRenderer.js b/src/client/js/rendering/helpers/resetRenderer.js
new file mode 100644
index 00000000..99fc8209
--- /dev/null
+++ b/src/client/js/rendering/helpers/resetRenderer.js
@@ -0,0 +1,45 @@
+define([
+ 'js/rendering/spritePool'
+], function (
+ spritePool
+) {
+ return function () {
+ let map = this.map;
+ let w = this.w = map.length;
+ let h = this.h = map[0].length;
+
+ this.stage.removeChild(this.layers.hiders);
+ this.layers.hiders = new PIXI.Container();
+ this.layers.hiders.layer = 'hiders';
+ this.stage.addChild(this.layers.hiders);
+
+ let container = this.layers.tileSprites;
+ this.stage.removeChild(container);
+
+ this.layers.tileSprites = container = new PIXI.Container();
+ container.layer = 'tiles';
+ this.stage.addChild(container);
+
+ this.stage.children.sort((a, b) => {
+ if (a.layer === 'hiders')
+ return 1;
+ else if (b.layer === 'hiders')
+ return -1;
+ else if (a.layer === 'tiles')
+ return -1;
+ else if (b.layer === 'tiles')
+ return 1;
+ return 0;
+ });
+
+ spritePool.clean();
+
+ this.sprites = _.get2dArray(w, h, 'array');
+
+ this.map = [];
+ this.w = 0;
+ this.h = 0;
+
+ delete this.moveTo;
+ };
+});
diff --git a/src/client/js/rendering/renderer.js b/src/client/js/rendering/renderer.js
index c8ef3486..71a567fa 100644
--- a/src/client/js/rendering/renderer.js
+++ b/src/client/js/rendering/renderer.js
@@ -8,7 +8,8 @@ define([
'js/rendering/shaders/outline',
'js/rendering/spritePool',
'js/system/globals',
- 'js/rendering/renderLoginBackground'
+ 'js/rendering/renderLoginBackground',
+ 'js/rendering/helpers/resetRenderer'
], function (
resources,
events,
@@ -19,7 +20,8 @@ define([
shaderOutline,
spritePool,
globals,
- renderLoginBackground
+ renderLoginBackground,
+ resetRenderer
) {
const mRandom = Math.random.bind(Math);
@@ -84,6 +86,7 @@ define([
events.on('onGetMap', this.onGetMap.bind(this));
events.on('onToggleFullscreen', this.toggleScreen.bind(this));
events.on('onMoveSpeedChange', this.adaptCameraMoveSpeed.bind(this));
+ events.on('resetRenderer', resetRenderer.bind(this));
this.width = $('body').width();
this.height = $('body').height();
diff --git a/src/client/js/system/client.js b/src/client/js/system/client.js
index 4e92ec57..ed28c285 100644
--- a/src/client/js/system/client.js
+++ b/src/client/js/system/client.js
@@ -18,7 +18,38 @@ define([
this.socket.on('event', this.onEvent.bind(this));
this.socket.on('events', this.onEvents.bind(this));
this.socket.on('dc', this.onDisconnect.bind(this));
+
+ Object.entries(this.processAction).forEach(([k, v]) => {
+ this.processAction[k] = v.bind(this);
+ });
+ },
+
+ onRezoneStart: function () {
+ //Fired for mods to listen to
+ events.emit('rezoneStart');
+
+ events.emit('destroyAllObjects');
+ events.emit('resetRenderer');
+ events.emit('resetPhysics');
+ events.emit('clearUis');
+
+ client.request({
+ threadModule: 'rezoneManager',
+ method: 'clientAck',
+ data: {}
+ });
+ },
+
+ onGetMap: function ([msg]) {
+ events.emit('onGetMap', msg);
+
+ client.request({
+ threadModule: 'instancer',
+ method: 'clientAck',
+ data: {}
+ });
},
+
onConnected: function (onReady) {
if (this.doneConnect)
this.onDisconnect();
@@ -28,45 +59,67 @@ define([
if (onReady)
onReady();
},
+
onDisconnect: function () {
window.location = window.location;
},
+
onHandshake: function () {
events.emit('onHandshake');
this.socket.emit('handshake');
},
+
request: function (msg) {
this.socket.emit('request', msg, msg.callback);
},
- onEvent: function (response) {
- events.emit(response.event, response.data);
- },
- onEvents: function (response) {
- //If we get objects, self needs to be first
- // otherwise we might create the object (setting his position or attack animation)
- // before instantiating it
- let oList = response.onGetObject;
- if (oList) {
- let prepend = oList.filter(o => o.self);
- oList.spliceWhere(o => prepend.some(p => p === o));
- oList.unshift.apply(oList, prepend);
- }
- for (let e in response) {
- let r = response[e];
+ processAction: {
+ default: function (eventName, msgs) {
+ msgs.forEach(m => events.emit(eventName, m));
+ },
- //Certain messages expect to be performed last (because the object they act on hasn't been created when they get queued)
- r.sort(function (a, b) {
- if (a.performLast)
- return 1;
- else if (b.performLast)
- return -1;
- return 0;
- });
+ rezoneStart: function (eventName, msgs) {
+ events.emit('rezoneStart');
+
+ events.emit('destroyAllObjects');
+ events.emit('resetRenderer');
+ events.emit('resetPhysics');
+ events.emit('clearUis');
- r.forEach(function (o) {
- events.emit(e, o);
+ client.request({
+ threadModule: 'rezoneManager',
+ method: 'clientAck',
+ data: {}
});
+ },
+
+ getMap: function (eventName, msgs) {
+ events.emit('onBuildIngameUis');
+ events.emit('onGetMap', msgs[0]);
+ },
+
+ onGetObject: function (eventName, msgs) {
+ const prepend = msgs.filter(o => o.self);
+ msgs.spliceWhere(o => prepend.some(p => p === o));
+ msgs.unshift.apply(msgs, prepend);
+
+ this.processAction.default(eventName, msgs);
+ }
+ },
+
+ onEvent: function ({ event: eventName, data: eventData }) {
+ const handler = this.processAction[eventName] || this.processAction.default;
+
+ handler(eventName, [eventData]);
+ },
+
+ onEvents: function (response) {
+ for (let eventName in response) {
+ const eventMsgs = response[eventName];
+
+ const handler = this.processAction[eventName] || this.processAction.default;
+
+ handler(eventName, eventMsgs);
}
}
};
diff --git a/src/client/package.json b/src/client/package.json
index 6d51d70b..ce64147b 100644
--- a/src/client/package.json
+++ b/src/client/package.json
@@ -1,6 +1,6 @@
{
"name": "isleward_client",
- "version": "0.10.5",
+ "version": "0.10.6",
"description": "isleward",
"dependencies": {
},
diff --git a/src/client/ui/factory.js b/src/client/ui/factory.js
index 282e066a..9d02b76a 100644
--- a/src/client/ui/factory.js
+++ b/src/client/ui/factory.js
@@ -14,12 +14,13 @@ define([
return {
uis: [],
root: '',
+ ingameUisBuilt: false,
init: function (root) {
if (root)
this.root = root + '/';
- events.on('onEnterGame', this.onEnterGame.bind(this));
+ events.on('onBuildIngameUis', this.onBuildIngameUis.bind(this));
events.on('onUiKeyDown', this.onUiKeyDown.bind(this));
events.on('onResize', this.onResize.bind(this));
@@ -31,39 +32,40 @@ define([
});
},
- onEnterGame: async function () {
- events.clearQueue();
+ onBuildIngameUis: async function () {
+ if (!this.ingameUisBuilt) {
+ events.clearQueue();
- await Promise.all(
- globals.clientConfig.uiList.map(u => {
- const uiType = u.path ? u.path.split('/').pop() : u;
+ await Promise.all(
+ globals.clientConfig.uiList.map(u => {
+ const uiType = u.path ? u.path.split('/').pop() : u;
- return new Promise(res => {
- const doneCheck = () => {
- const isDone = this.uis.some(ui => ui.type === uiType);
- if (isDone) {
- res();
+ return new Promise(res => {
+ const doneCheck = () => {
+ const isDone = this.uis.some(ui => ui.type === uiType);
+ if (isDone) {
+ res();
- return;
- }
+ return;
+ }
- setTimeout(doneCheck, 100);
- };
+ setTimeout(doneCheck, 100);
+ };
- this.build(uiType, { path: u.path });
+ this.build(uiType, { path: u.path });
- doneCheck();
- });
- })
- );
+ doneCheck();
+ });
+ })
+ );
+
+ this.ingameUisBuilt = true;
+ }
client.request({
- cpn: 'player',
- method: 'performAction',
- data: {
- cpn: 'player',
- method: 'notifyServerUiReady'
- }
+ threadModule: 'instancer',
+ method: 'clientAck',
+ data: {}
});
},
@@ -169,6 +171,16 @@ define([
}
},
+ exitGame: function () {
+ $('[class^="ui"]:not(.ui-container)').toArray().forEach(el => {
+ let ui = $(el).data('ui');
+ if (ui && ui.destroy)
+ ui.destroy();
+ });
+
+ this.ingameUisBuilt = false;
+ },
+
getUi: function (type) {
return this.uis.find(u => u.type === type);
}
diff --git a/src/client/ui/templates/buffs/buffs.js b/src/client/ui/templates/buffs/buffs.js
deleted file mode 100644
index 73340c51..00000000
--- a/src/client/ui/templates/buffs/buffs.js
+++ /dev/null
@@ -1,59 +0,0 @@
-define([
- 'js/system/events',
- 'html!ui/templates/buffs/template',
- 'css!ui/templates/buffs/styles',
- 'html!ui/templates/buffs/templateBuff'
-], function (
- events,
- template,
- styles,
- templateBuff
-) {
- let icons = {
- stunned: [4, 0],
- regenHp: [3, 1],
- regenMana: [4, 1],
- swiftness: [5, 1],
- stealth: [7, 0],
- reflectDamage: [2, 1],
- holyVengeance: [4, 0]
- };
-
- return {
- tpl: template,
-
- icons: {},
-
- postRender: function () {
- this.onEvent('onGetBuff', this.onGetBuff.bind(this));
- this.onEvent('onRemoveBuff', this.onRemoveBuff.bind(this));
- },
-
- onGetBuff: function (buff) {
- let icon = icons[buff.type];
- if (!icon)
- return;
-
- let imgX = icon[0] * -32;
- let imgY = icon[1] * -32;
-
- let html = templateBuff;
- let el = $(html).appendTo(this.el)
- .find('.inner')
- .css({
- background: 'url(../../../images/statusIcons.png) ' + imgX + 'px ' + imgY + 'px'
- });
-
- this.icons[buff.id] = el.parent();
- },
-
- onRemoveBuff: function (buff) {
- let el = this.icons[buff.id];
- if (!el)
- return;
-
- el.remove();
- delete this.icons[buff.id];
- }
- };
-});
diff --git a/src/client/ui/templates/buffs/styles.css b/src/client/ui/templates/buffs/styles.css
deleted file mode 100644
index 00ca7319..00000000
--- a/src/client/ui/templates/buffs/styles.css
+++ /dev/null
@@ -1 +0,0 @@
-.uiBuffs{position:absolute;left:16px;top:104px}.uiBuffs .icon{width:40px;height:40px;padding:4px;background-color:rgba(49,33,54,.75);margin-right:16px;float:left}.uiBuffs .icon .inner{width:32px;height:32px;background:url(../../../images/statusIcons.png) 0 0}.mobile .uiBuffs{left:316px;top:10px}
\ No newline at end of file
diff --git a/src/client/ui/templates/buffs/template.html b/src/client/ui/templates/buffs/template.html
deleted file mode 100644
index 6201230f..00000000
--- a/src/client/ui/templates/buffs/template.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/client/ui/templates/characters/characters.js b/src/client/ui/templates/characters/characters.js
index 139c2c9f..cb236b13 100644
--- a/src/client/ui/templates/characters/characters.js
+++ b/src/client/ui/templates/characters/characters.js
@@ -97,7 +97,6 @@ define([
onPlay: function () {
this.el.removeClass('disabled');
this.destroy();
- events.emit('onEnterGame');
},
onNewClick: function () {
diff --git a/src/client/ui/templates/createCharacter/createCharacter.js b/src/client/ui/templates/createCharacter/createCharacter.js
index 56a9508a..f91d6e64 100644
--- a/src/client/ui/templates/createCharacter/createCharacter.js
+++ b/src/client/ui/templates/createCharacter/createCharacter.js
@@ -151,7 +151,6 @@ define([
if (!result) {
this.clear();
this.destroy();
- events.emit('onEnterGame');
} else
this.el.find('.message').html(result);
},
diff --git a/src/client/ui/templates/death/death.js b/src/client/ui/templates/death/death.js
index 0d132c46..f2a53b3b 100644
--- a/src/client/ui/templates/death/death.js
+++ b/src/client/ui/templates/death/death.js
@@ -20,14 +20,14 @@ define([
this.onEvent('onPermadeath', this.onPermadeath.bind(this));
this.find('.btn-logout').on('click', this.onLogout.bind(this));
- this.find('.btn-respawn').on('click', this.onRespawn.bind(this));
+ this.find('.btn-respawn').on('click', this.performRespawn.bind(this));
},
onLogout: function () {
$('.uiMainMenu').data('ui').charSelect();
},
- onRespawn: function () {
+ performRespawn: function () {
events.emit('onHideOverlay', this.el);
this.hide(true);
diff --git a/src/client/ui/templates/effects/effects.js b/src/client/ui/templates/effects/effects.js
new file mode 100644
index 00000000..09128752
--- /dev/null
+++ b/src/client/ui/templates/effects/effects.js
@@ -0,0 +1,54 @@
+define([
+ 'html!ui/templates/effects/template',
+ 'css!ui/templates/effects/styles',
+ 'html!ui/templates/effects/templateEffect'
+], function (
+ template,
+ styles,
+ templateEffect
+) {
+ return {
+ tpl: template,
+
+ icons: {},
+
+ postRender: function () {
+ this.onEvent('onGetEffectIcon', this.onGetEffectIcon.bind(this));
+ this.onEvent('onRemoveEffectIcon', this.onRemoveEffectIcon.bind(this));
+ },
+
+ buildIcon: function (config) {
+ let { icon, url } = config;
+
+ if (!url)
+ url = '../../../images/statusIcons.png';
+
+ let imgX = icon[0] * -32;
+ let imgY = icon[1] * -32;
+
+ let html = templateEffect;
+ let el = $(html).appendTo(this.el)
+ .find('.inner')
+ .css({
+ background: `url(${url}) ${imgX}px ${imgY}px`
+ });
+
+ return el.parent();
+ },
+
+ onGetEffectIcon: function (config) {
+ let el = this.buildIcon(config);
+
+ this.icons[config.id] = el;
+ },
+
+ onRemoveEffectIcon: function (config) {
+ let el = this.icons[config.id];
+ if (!el)
+ return;
+
+ el.remove();
+ delete this.icons[config.id];
+ }
+ };
+});
diff --git a/src/client/ui/templates/effects/styles.css b/src/client/ui/templates/effects/styles.css
new file mode 100644
index 00000000..507b50d1
--- /dev/null
+++ b/src/client/ui/templates/effects/styles.css
@@ -0,0 +1 @@
+.uiEffects{position:absolute;left:16px;top:104px}.uiEffects .icon{width:40px;height:40px;padding:4px;background-color:rgba(49,33,54,.75);margin-right:16px;float:left}.uiEffects .icon .inner{width:32px;height:32px;background:url(../../../images/statusIcons.png) 0 0}.mobile .uiEffects{left:316px;top:10px}
\ No newline at end of file
diff --git a/src/client/ui/templates/buffs/styles.less b/src/client/ui/templates/effects/styles.less
similarity index 91%
rename from src/client/ui/templates/buffs/styles.less
rename to src/client/ui/templates/effects/styles.less
index 3ec1066f..104844d5 100644
--- a/src/client/ui/templates/buffs/styles.less
+++ b/src/client/ui/templates/effects/styles.less
@@ -1,6 +1,6 @@
@import "../../../css/colors.less";
-.uiBuffs {
+.uiEffects {
position: absolute;
left: 16px;
top: 104px;
@@ -23,7 +23,7 @@
}
-.mobile .uiBuffs {
+.mobile .uiEffects {
left: 316px;
top: 10px;
}
diff --git a/src/client/ui/templates/effects/template.html b/src/client/ui/templates/effects/template.html
new file mode 100644
index 00000000..886b4c6c
--- /dev/null
+++ b/src/client/ui/templates/effects/template.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/client/ui/templates/buffs/templateBuff.html b/src/client/ui/templates/effects/templateEffect.html
similarity index 56%
rename from src/client/ui/templates/buffs/templateBuff.html
rename to src/client/ui/templates/effects/templateEffect.html
index 1fcd0b63..836047bf 100644
--- a/src/client/ui/templates/buffs/templateBuff.html
+++ b/src/client/ui/templates/effects/templateEffect.html
@@ -1,3 +1,3 @@
-
+
diff --git a/src/client/ui/templates/events/events.js b/src/client/ui/templates/events/events.js
index 1a7c8ba2..7aa870c3 100644
--- a/src/client/ui/templates/events/events.js
+++ b/src/client/ui/templates/events/events.js
@@ -26,7 +26,7 @@ define([
this.find('.btnCollapse').on('click', this.toggleButtons.bind(this));
}
- this.onEvent('onRezone', this.onRezone.bind(this));
+ this.onEvent('clearUis', this.clear.bind(this));
this.onEvent('onObtainEvent', this.onObtainEvent.bind(this));
this.onEvent('onRemoveEvent', this.onRemoveEvent.bind(this));
@@ -37,7 +37,7 @@ define([
this.onToggleEventsVisibility(config.showEvents);
},
- onRezone: function () {
+ clear: function () {
this.list = [];
this.el.find('.list').empty();
},
diff --git a/src/client/ui/templates/inventory/inventory.js b/src/client/ui/templates/inventory/inventory.js
index 1669071c..3427767c 100644
--- a/src/client/ui/templates/inventory/inventory.js
+++ b/src/client/ui/templates/inventory/inventory.js
@@ -328,17 +328,17 @@ define([
ctxConfig.push(menuItems.divider);
}
- if ((!item.eq) && (!item.active)) {
- if (!item.quest) {
- if ((window.player.stash.active) && (!item.noStash))
- ctxConfig.push(menuItems.stash);
+ if (!item.eq && !item.active && !item.quest) {
+ const isAtStash = window.player.serverActions.hasAction('openStash');
- if (!item.noDrop)
- ctxConfig.push(menuItems.drop);
+ if (isAtStash && !item.noStash)
+ ctxConfig.push(menuItems.stash);
- if ((!item.material) && (!item.noSalvage))
- ctxConfig.push(menuItems.salvage);
- }
+ if (!item.noDrop)
+ ctxConfig.push(menuItems.drop);
+
+ if (!item.material && !item.noSalvage)
+ ctxConfig.push(menuItems.salvage);
}
if (item.quantity > 1 && !item.quest)
diff --git a/src/client/ui/templates/login/template.html b/src/client/ui/templates/login/template.html
index 4767c033..d62be9ef 100644
--- a/src/client/ui/templates/login/template.html
+++ b/src/client/ui/templates/login/template.html
@@ -11,11 +11,11 @@
- [ Latest Release Notes ]
+ [ Latest Release Notes ]
- v0.10.5
+ v0.10.6
diff --git a/src/client/ui/templates/mainMenu/mainMenu.js b/src/client/ui/templates/mainMenu/mainMenu.js
index 5b79e5ad..a7ac296b 100644
--- a/src/client/ui/templates/mainMenu/mainMenu.js
+++ b/src/client/ui/templates/mainMenu/mainMenu.js
@@ -58,17 +58,17 @@ define([
},
onCharSelect: function () {
- renderer.clean();
- objects.onRezone();
+ events.emit('destroyAllObjects');
+ events.emit('resetRenderer');
+ events.emit('resetPhysics');
+
renderer.buildTitleScreen();
sound.unload();
events.emit('onShowCharacterSelect');
- $('[class^="ui"]:not(.ui-container)').toArray().forEach(el => {
- let ui = $(el).data('ui');
- if (ui && ui.destroy)
- ui.destroy();
- });
+
+ factory.exitGame();
+
factory.build('characters', {});
},
diff --git a/src/client/ui/templates/quests/quests.js b/src/client/ui/templates/quests/quests.js
index e83d688e..c4fd1fa2 100644
--- a/src/client/ui/templates/quests/quests.js
+++ b/src/client/ui/templates/quests/quests.js
@@ -25,7 +25,7 @@ define([
this.find('.btnCollapse').on('click', this.toggleButtons.bind(this));
}
- this.onEvent('onRezone', this.onRezone.bind(this));
+ this.onEvent('clearUis', this.clear.bind(this));
this.onEvent('onObtainQuest', this.onObtainQuest.bind(this));
this.onEvent('onUpdateQuest', this.onUpdateQuest.bind(this));
@@ -35,7 +35,7 @@ define([
this.onToggleQuestsVisibility(config.showQuests);
},
- onRezone: function () {
+ clear: function () {
this.quests = [];
this.el.find('.list').empty();
},
diff --git a/src/client/ui/templates/stash/stash.js b/src/client/ui/templates/stash/stash.js
index 04d856ed..1f1cb5b2 100644
--- a/src/client/ui/templates/stash/stash.js
+++ b/src/client/ui/templates/stash/stash.js
@@ -22,33 +22,38 @@ define([
hoverItem: null,
items: [],
+ maxItems: null,
modal: true,
hasClose: true,
postRender: function () {
- this.onEvent('onGetStashItems', this.onGetStashItems.bind(this));
- this.onEvent('onDestroyStashItems', this.onDestroyStashItems.bind(this));
- this.onEvent('onKeyDown', this.onKeyDown.bind(this));
- this.onEvent('onKeyUp', this.onKeyUp.bind(this));
- this.onEvent('onOpenStash', this.toggle.bind(this));
+ [
+ 'onKeyUp',
+ 'onKeyDown',
+ 'onOpenStash',
+ 'onAddStashItems',
+ 'onRemoveStashItems'
+ ]
+ .forEach(e => {
+ this.onEvent(e, this[e].bind(this));
+ });
},
build: function () {
- this.el.removeClass('scrolls');
- if (window.player.stash.maxItems > 50)
- this.el.addClass('scrolls');
+ const { el, maxItems, items } = this;
- let container = this.el.find('.grid')
- .empty();
+ el.removeClass('scrolls');
+ if (maxItems > 50)
+ el.addClass('scrolls');
- let items = this.items;
- let iLen = Math.max(items.length, window.player.stash.maxItems);
+ const container = this.el.find('.grid').empty();
- for (let i = 0; i < iLen; i++) {
- let item = items[i];
+ const renderItemCount = Math.max(items.length, maxItems);
- let itemEl = renderItem(container, item);
+ for (let i = 0; i < renderItemCount; i++) {
+ const item = items[i];
+ const itemEl = renderItem(container, item);
if (!item)
continue;
@@ -126,14 +131,28 @@ define([
this.build();
},
- onDestroyStashItems: function (itemIds) {
- itemIds.forEach(function (id) {
- let item = this.items.find(i => i.id === id);
+ onAddStashItems: function (addItems) {
+ const { items } = this;
+
+ addItems.forEach(newItem => {
+ const existIndex = items.findIndex(i => i.id === newItem.id);
+ if (existIndex !== -1)
+ items.splice(existIndex, 1, newItem);
+ else
+ items.push(newItem);
+ });
+ },
+
+ onRemoveStashItems: function (removeItemIds) {
+ const { items } = this;
+
+ removeItemIds.forEach(id => {
+ const item = items.find(i => i.id === id);
if (item === this.hoverItem)
this.hideTooltip();
- this.items.spliceWhere(i => i.id === id);
- }, this);
+ items.spliceWhere(i => i.id === id);
+ });
if (this.shown)
this.build();
@@ -155,8 +174,12 @@ define([
events.emit('onHideContextMenu');
},
- onOpenStash: function () {
- this.build();
+ onOpenStash: function ({ items, maxItems }) {
+ this.maxItems = maxItems;
+
+ this.show();
+
+ this.onGetStashItems(items);
},
beforeDestroy: function () {
diff --git a/src/client/ui/templates/talk/talk.js b/src/client/ui/templates/talk/talk.js
index 47191bac..617c0f9a 100644
--- a/src/client/ui/templates/talk/talk.js
+++ b/src/client/ui/templates/talk/talk.js
@@ -18,11 +18,7 @@ define([
postRender: function () {
this.onEvent('onGetTalk', this.onGetTalk.bind(this));
- this.onEvent('onRezone', this.onRezone.bind(this));
- },
-
- onRezone: function () {
- this.hide();
+ this.onEvent('clearUis', this.hide.bind(this));
},
onGetTalk: function (dialogue) {
diff --git a/src/server/.eslintrc b/src/server/.eslintrc
index cf00716e..5165c488 100644
--- a/src/server/.eslintrc
+++ b/src/server/.eslintrc
@@ -58,7 +58,9 @@
"leaderboard": false,
"clientConfig": false,
"random": false,
- "consts": false
+ "consts": false,
+ "rezoneManager": false,
+ "eventManager": false
},
"rules": {
diff --git a/src/server/clientComponents/effects.js b/src/server/clientComponents/effects.js
index 06341b6e..503fc3d2 100644
--- a/src/server/clientComponents/effects.js
+++ b/src/server/clientComponents/effects.js
@@ -1,135 +1,127 @@
define([
- 'js/rendering/renderer'
+ 'js/system/events',
+ 'js/rendering/numbers'
], function (
- renderer
+ events,
+ numbers
) {
- let auras = {
- reflectDamage: 0,
- stealth: 1,
- regenHp: 9,
- regenMana: 10,
- swiftness: 11,
- holyVengeance: 8,
- rare: 16
+ const defaultBuffIcons = {
+ stunned: [4, 0]
};
- return {
- type: 'effects',
+ const effectBase = {
+ init: function () {
+ this.defaultDamageText(false);
- alpha: 0,
- alphaDir: 0.0025,
+ if (this.self && defaultBuffIcons[this.type]) {
+ events.emit('onGetEffectIcon', {
+ id: this.id,
+ icon: defaultBuffIcons[this.type]
+ });
+ }
+ },
- alphaMax: 0.6,
- alphaMin: 0.35,
+ destroy: function () {
+ if (!this.obj.destroyed)
+ this.defaultDamageText(true);
- alphaCutoff: 0.4,
+ if (this.self && defaultBuffIcons[this.type]) {
+ events.emit('onRemoveEffectIcon', {
+ id: this.id
+ });
+ }
+ },
+
+ defaultDamageText: function (removing) {
+ numbers.onGetDamage({
+ id: this.obj.id,
+ event: true,
+ text: (removing ? '-' : '+') + this.type
+ });
+ }
+ };
+
+ return {
+ type: 'effects',
effects: [],
+ templates: {
+
+ },
+
init: function (blueprint) {
- this.effects = this.effects
- .filter(e => auras[e] !== null)
- .map(e => {
- return {
- name: e,
- sprite: renderer.buildObject({
- layerName: 'effects',
- sheetName: 'auras',
- x: this.obj.x,
- y: this.obj.y + 1,
- w: scale * 3,
- h: scale * 3,
- cell: auras[e]
- })
- };
- });
+ this.effects = this.effects.map(e => this.buildEffect(e));
},
+
+ buildEffect: function (data) {
+ let template = this.templates[data.type] || {};
+
+ let effect = $.extend(true, {}, effectBase, template, data);
+
+ effect.self = !!this.obj.self;
+ effect.obj = this.obj;
+
+ if (effect.init)
+ effect.init();
+
+ return effect;
+ },
+
extend: function (blueprint) {
if (blueprint.addEffects) {
- blueprint.addEffects = blueprint.addEffects
- .filter(e => {
- return (auras[e] !== null);
- })
- .map(e => {
- return {
- name: e,
- sprite: renderer.buildObject({
- layerName: 'effects',
- sheetName: 'auras',
- x: this.obj.x,
- y: this.obj.y + 1,
- w: scale * 3,
- h: scale * 3,
- cell: auras[e]
- })
- };
- });
+ blueprint.addEffects = blueprint.addEffects.map(e => this.buildEffect(e));
this.effects.push.apply(this.effects, blueprint.addEffects || []);
}
if (blueprint.removeEffects) {
- blueprint.removeEffects.forEach(r => {
- let effect = this.effects.find(e => e.name === r);
+ blueprint.removeEffects.forEach(removeId => {
+ let effect = this.effects.find(e => e.id === removeId);
if (!effect)
return;
- renderer.destroyObject({
- layerName: 'effects',
- sprite: effect.sprite
- });
+ if (effect.destroy)
+ effect.destroy();
- this.effects.spliceFirstWhere(e => e.name === r);
+ this.effects.spliceFirstWhere(e => e.id === removeId);
});
}
- },
-
- update: function () {
- this.alpha += this.alphaDir;
- if ((this.alphaDir > 0) && (this.alpha >= this.alphaMax)) {
- this.alpha = this.alphaMax;
- this.alphaDir *= -1;
- } else if ((this.alphaDir < 0) && (this.alpha <= this.alphaMin)) {
- this.alpha = this.alphaMin;
- this.alphaDir *= -1;
- }
+ if (blueprint.extendEffects) {
+ blueprint.extendEffects.forEach(u => {
+ let effect = this.effects.find(e => e.id === u.id);
- let x = this.obj.x;
- let y = this.obj.y;
+ if (!effect)
+ return;
- let useAlpha = this.alpha;
- if (useAlpha < this.alphaCutoff)
- useAlpha = 0;
- else {
- useAlpha -= this.alphaCutoff;
- useAlpha /= (this.alphaMax - this.alphaCutoff);
+ if (effect.extend)
+ effect.extend(u.data);
+ else {
+ for (let p in u.data)
+ effect[p] = u.data[p];
+ }
+ });
}
+ },
+ update: function () {
this.effects.forEach(e => {
- renderer.setSpritePosition({
- x,
- y: y + 1,
- sprite: e.sprite
- });
-
- e.sprite.alpha = useAlpha;
-
- e.sprite.visible = this.obj.isVisible;
+ if (e.update)
+ e.update();
});
},
setVisible: function (visible) {
this.effects.forEach(e => {
- e.sprite.visible = visible;
+ if (e.setVisible)
+ e.setVisible(visible);
});
},
destroy: function () {
this.effects.forEach(e => {
- renderer.destroyObject({
- layerName: 'effects',
- sprite: e.sprite
- });
+ if (e.destroy)
+ e.destroy();
});
}
};
diff --git a/src/server/clientComponents/effects/auras.js b/src/server/clientComponents/effects/auras.js
new file mode 100644
index 00000000..f09ba3b8
--- /dev/null
+++ b/src/server/clientComponents/effects/auras.js
@@ -0,0 +1,136 @@
+define([
+ 'js/rendering/renderer',
+ 'js/system/events'
+], function (
+ renderer,
+ events
+) {
+ const auras = {
+ reflectDamage: 0,
+ stealth: 1,
+ regenHp: 9,
+ regenMana: 10,
+ swiftness: 11,
+ holyVengeance: 8,
+ rare: 16
+ };
+ const buffIcons = {
+ regenHp: [3, 1],
+ regenMana: [4, 1],
+ swiftness: [5, 1],
+ stealth: [7, 0],
+ reflectDamage: [2, 1],
+ holyVengeance: [4, 0]
+ };
+
+ let templates = {};
+
+ Object.keys(auras).forEach(type => {
+ let cell = auras[type];
+
+ templates[type] = {
+ sprite: null,
+
+ alpha: 0,
+ alphaDir: 0.0025,
+
+ alphaMax: 0.6,
+ alphaMin: 0.35,
+
+ alphaCutoff: 0.4,
+
+ init: function () {
+ this.sprite = renderer.buildObject({
+ layerName: 'effects',
+ sheetName: 'auras',
+ x: this.obj.x,
+ y: this.obj.y + 1,
+ w: scale * 3,
+ h: scale * 3,
+ cell: cell
+ });
+
+ this.defaultDamageText();
+
+ if (this.self && buffIcons[type]) {
+ events.emit('onGetEffectIcon', {
+ id: this.id,
+ icon: buffIcons[type]
+ });
+ }
+ },
+
+ getAlpha: function () {
+ let listAuras = this.obj.effects.effects.filter(e => auras[e.type]);
+ let first = listAuras[0];
+
+ // The first aura in the list should do all the updating so that all auras pulse together
+ if (first === this) {
+ this.alpha += this.alphaDir;
+ if ((this.alphaDir > 0) && (this.alpha >= this.alphaMax)) {
+ this.alpha = this.alphaMax;
+ this.alphaDir *= -1;
+ } else if ((this.alphaDir < 0) && (this.alpha <= this.alphaMin)) {
+ this.alpha = this.alphaMin;
+ this.alphaDir *= -1;
+ }
+ } else {
+ this.alpha = first.alpha;
+ this.alphaDir = first.alphaDir;
+ }
+
+ let useAlpha = this.alpha;
+ if (useAlpha < this.alphaCutoff)
+ useAlpha = 0;
+ else {
+ useAlpha -= this.alphaCutoff;
+ useAlpha /= (this.alphaMax - this.alphaCutoff);
+ }
+
+ return useAlpha;
+ },
+
+ update: function () {
+ let useAlpha = this.getAlpha();
+
+ let x = this.obj.x;
+ let y = this.obj.y;
+
+ renderer.setSpritePosition({
+ x,
+ y: y + 1,
+ sprite: this.sprite
+ });
+
+ this.sprite.alpha = useAlpha;
+
+ this.sprite.visible = this.obj.isVisible;
+ },
+
+ destroy: function () {
+ renderer.destroyObject({
+ layerName: 'effects',
+ sprite: this.sprite
+ });
+
+ this.defaultDamageText(true);
+
+ if (this.self && buffIcons[type]) {
+ events.emit('onRemoveEffectIcon', {
+ id: this.id
+ });
+ }
+ },
+
+ setVisible: function (visible) {
+ this.sprite.visible = visible;
+ }
+ };
+ });
+
+ return {
+ templates: {
+ ...templates
+ }
+ };
+});
diff --git a/src/server/clientComponents/gatherer.js b/src/server/clientComponents/gatherer.js
index 0f3a81f1..8df1a5cb 100644
--- a/src/server/clientComponents/gatherer.js
+++ b/src/server/clientComponents/gatherer.js
@@ -13,7 +13,6 @@ define([
init: function () {
this.obj.on('onKeyDown', this.onKeyDown.bind(this));
- this.hookEvent('onRezone', this.onRezone.bind(this));
},
extend: function (msg) {
@@ -53,13 +52,6 @@ define([
}
},
- onRezone: function () {
- this.extend({
- progress: 100,
- action: 'Fishing'
- });
- },
-
onKeyDown: function (key) {
if (key !== 'g')
return;
diff --git a/src/server/clientComponents/pather.js b/src/server/clientComponents/pather.js
index 4b48c58d..48fe5414 100644
--- a/src/server/clientComponents/pather.js
+++ b/src/server/clientComponents/pather.js
@@ -27,9 +27,9 @@ define([
lastY: 0,
init: function () {
- events.on('onRespawn', this.onDeath.bind(this));
- events.on('onDeath', this.onDeath.bind(this));
- events.on('onClearQueue', this.onDeath.bind(this));
+ events.on('teleportToPosition', this.resetPath.bind(this));
+ events.on('onDeath', this.resetPath.bind(this));
+ events.on('onClearQueue', this.resetPath.bind(this));
this.pathPos.x = round(this.obj.x);
this.pathPos.y = round(this.obj.y);
@@ -46,7 +46,7 @@ define([
this.path = [];
},
- onDeath: function () {
+ resetPath: function () {
this.clearPath();
this.pathPos.x = round(this.obj.x);
diff --git a/src/server/clientComponents/player.js b/src/server/clientComponents/player.js
index d65aa0e2..36d576f2 100644
--- a/src/server/clientComponents/player.js
+++ b/src/server/clientComponents/player.js
@@ -29,7 +29,7 @@ define([
obj.addComponent('serverActions');
obj.addComponent('pather');
- this.hookEvent('onRespawn', this.onRespawn.bind(this));
+ this.hookEvent('teleportToPosition', this.teleportToPosition.bind(this));
events.emit('onGetPortrait', obj.portrait);
},
@@ -74,7 +74,7 @@ define([
}, instant);
},
- onRespawn: function ({ x, y }) {
+ teleportToPosition: function ({ x, y }) {
this.positionCamera(x, y, true);
sound.update(x, y);
},
diff --git a/src/server/clientComponents/serverActions.js b/src/server/clientComponents/serverActions.js
index b1bc09a5..2c7c2763 100644
--- a/src/server/clientComponents/serverActions.js
+++ b/src/server/clientComponents/serverActions.js
@@ -14,6 +14,10 @@ define([
this.hookEvent('onKeyUp', this.onKeyUp.bind(this));
},
+ hasAction: function (actionId) {
+ return this.actions.some(a => a.id === actionId);
+ },
+
onKeyUp: function (key) {
this.actions.forEach(function (a) {
if (a.key !== key)
diff --git a/src/server/clientComponents/stash.js b/src/server/clientComponents/stash.js
index 7e51bf1a..0ae7e4ce 100644
--- a/src/server/clientComponents/stash.js
+++ b/src/server/clientComponents/stash.js
@@ -1,49 +1,7 @@
-define([
- 'js/system/events'
-], function (
- events
-) {
+define([], function () {
return {
type: 'stash',
- active: false,
-
- items: null,
-
- init: function () {
- events.emit('onGetStashItems', this.items);
- },
-
- extend: function (blueprint) {
- if (blueprint.has('active'))
- this.active = blueprint.active;
-
- if (blueprint.getItems) {
- let items = this.items;
- let newItems = blueprint.getItems || [];
- let nLen = newItems.length;
-
- for (let i = 0; i < nLen; i++) {
- let nItem = newItems[i];
- let nId = nItem.id;
-
- let findItem = items.find(f => f.id === nId);
- if (findItem) {
- $.extend(true, findItem, nItem);
-
- newItems.splice(i, 1);
- i--;
- nLen--;
- }
- }
-
- this.items.push.apply(this.items, blueprint.getItems || []);
-
- events.emit('onGetStashItems', this.items);
- }
-
- if (blueprint.destroyItems)
- events.emit('onDestroyStashItems', blueprint.destroyItems);
- }
+ init: function () {}
};
});
diff --git a/src/server/components/aggro.js b/src/server/components/aggro.js
index bd46374a..df67e17b 100644
--- a/src/server/components/aggro.js
+++ b/src/server/components/aggro.js
@@ -403,5 +403,9 @@ module.exports = {
clearIgnoreList: function () {
this.ignoreList = [];
+ },
+
+ isInCombat: function () {
+ return this.list.length > 0;
}
};
diff --git a/src/server/components/auth.js b/src/server/components/auth.js
index 5e5117e5..bbe21089 100644
--- a/src/server/components/auth.js
+++ b/src/server/components/auth.js
@@ -93,6 +93,9 @@ module.exports = {
doSave: async function (callback, saveStash = true) {
const simple = this.obj.getSimple(true, true);
+ delete simple.destroyed;
+ delete simple.forceDestroy;
+
simple.components.spliceWhere(f => (f.type === 'stash'));
await io.setAsync({
@@ -111,10 +114,15 @@ module.exports = {
},
doSaveStash: async function () {
+ const { username, obj: { stash } } = this;
+
+ if (!stash.changed)
+ return;
+
await io.setAsync({
- key: this.username,
+ key: username,
table: 'stash',
- value: this.obj.stash.serialize(),
+ value: stash.serialize(),
clean: true,
serialize: true
});
@@ -174,7 +182,6 @@ module.exports = {
this.characters[charName] = character;
await this.getCustomChannels(character);
- await this.getStash();
await this.verifySkin(character);
@@ -341,8 +348,13 @@ module.exports = {
register: async function (msg) {
let credentials = msg.data;
- if ((credentials.username === '') || (credentials.password === '')) {
+ if (credentials.username === '' || credentials.password === '') {
msg.callback(messages.login.allFields);
+
+ return;
+ } else if (credentials.username.length > 32) {
+ msg.callback(messages.login.maxUsernameLength);
+
return;
}
diff --git a/src/server/components/effects.js b/src/server/components/effects.js
index b1e1ca74..59656719 100644
--- a/src/server/components/effects.js
+++ b/src/server/components/effects.js
@@ -110,14 +110,14 @@ module.exports = {
let effect = effects[i];
if (!forceDestroy) {
if (effect.persist) {
- this.syncRemove(effect.id, effect.type);
+ this.syncRemove(effect.id);
continue;
}
}
this.destroyEffect(effect);
- this.syncRemove(effect.id, effect.type);
+ this.syncRemove(effect.id);
effects.splice(i, 1);
eLen--;
i--;
@@ -137,36 +137,40 @@ module.exports = {
},
addEffect: function (options, source) {
+ //Skip 0-duration effects
if ((options.has('ttl')) && (options.ttl === 0))
return;
options.caster = options.caster || source;
+ //"X of Y in Z" cc resist check
if (!options.force && !this.canApplyEffect(options.type))
return;
- if (!options.new) {
- let exists = this.effects.find(e => e.type === options.type);
- if (exists) {
- exists.ttl += options.ttl;
+ let oldEffect = this.effects.find(e => e.type === options.type);
- for (let p in options) {
- if (p === 'ttl')
- continue;
-
- exists[p] = options[p];
- }
-
- return exists;
- }
+ //If there is no existing effect or the effect is not stackable, make a new effect
+ if (!oldEffect || !oldEffect.shouldStack)
+ return this.buildEffect(options);
+
+ //If the effect is stackable and the new effect should stack, stack with the old effect
+ let shouldStack = oldEffect.shouldStack(options);
+ if (shouldStack && oldEffect.incrementStack) {
+ oldEffect.incrementStack(options);
+ return oldEffect;
}
+ //Otherwise make a new effect
+ return this.buildEffect(options);
+ },
+
+ getTypeTemplate: function (type) {
let typeTemplate = null;
- if (options.type) {
- let type = options.type[0].toUpperCase() + options.type.substr(1);
+ if (type) {
+ let capitalizedType = type[0].toUpperCase() + type.substr(1);
let result = {
type: type,
- url: 'config/effects/effect' + type + '.js'
+ url: 'config/effects/effect' + capitalizedType + '.js'
};
this.obj.instance.eventEmitter.emit('onBeforeGetEffect', result);
@@ -174,84 +178,77 @@ module.exports = {
}
let builtEffect = extend({}, effectTemplate, typeTemplate);
+ return builtEffect;
+ },
+
+ buildEffect: function (options) {
+ let builtEffect = this.getTypeTemplate(options.type);
+
for (let p in options)
builtEffect[p] = options[p];
builtEffect.obj = this.obj;
builtEffect.id = this.nextId++;
- builtEffect.noMsg = options.noMsg;
+ builtEffect.silent = options.silent;
if (builtEffect.init)
builtEffect.init(options.source);
this.effects.push(builtEffect);
- if (!options.noMsg) {
- this.obj.instance.syncer.queue('onGetBuff', {
- type: options.type,
- id: builtEffect.id
- }, [this.obj.serverId]);
-
- this.obj.instance.syncer.queue('onGetDamage', {
- id: this.obj.id,
- event: true,
- text: '+' + options.type
- }, -1);
-
- this.obj.syncer.setArray(false, 'effects', 'addEffects', options.type);
- }
+ if (!options.silent)
+ this.obj.syncer.setArray(false, 'effects', 'addEffects', builtEffect.simplify());
this.obj.instance.eventEmitter.emit('onAddEffect', this.obj, builtEffect);
return builtEffect;
},
- syncRemove: function (id, type, noMsg) {
- if ((noMsg) || (!type))
+ syncExtend: function (id, data) {
+ let effect = this.effects.find(e => e.id === id);
+ if (!effect)
+ return;
+
+ //Never sync silent effects
+ if (effect.silent)
return;
- this.obj.instance.syncer.queue('onRemoveBuff', {
- id: id
- }, [this.obj.serverId]);
+ this.obj.syncer.setArray(true, 'effects', 'extendEffects', {
+ id,
+ data
+ });
+ },
+
+ syncRemove: function (id) {
+ let effect = this.effects.find(e => e.id === id);
+
+ if (!effect)
+ return;
- this.obj.instance.syncer.queue('onGetDamage', {
- id: this.obj.id,
- event: true,
- text: '-' + type
- }, -1);
+ if (effect.silent)
+ return;
- this.obj.syncer.setArray(false, 'effects', 'removeEffects', type);
+ this.obj.syncer.setArray(false, 'effects', 'removeEffects', id);
},
- removeEffect: function (checkEffect, noMsg) {
- let effects = this.effects;
- let eLen = effects.length;
- for (let i = 0; i < eLen; i++) {
- let effect = effects[i];
- if (effect === checkEffect) {
- this.destroyEffect(effect);
+ removeEffect: function (id) {
+ const effect = this.effects.find(e => e.id === id);
- this.syncRemove(effect.id, effect.type, noMsg || effect.noMsg);
- effects.splice(i, 1);
+ //It's possible that something else has removed the effect
+ if (!effect)
+ return;
- return;
- }
- }
+ this.destroyEffect(effect);
+
+ this.syncRemove(effect.id);
+
+ this.effects.spliceWhere(e => e.id === id);
},
- removeEffectByName: function (effectName, noMsg) {
- let effects = this.effects;
- let eLen = effects.length;
- for (let i = 0; i < eLen; i++) {
- let effect = effects[i];
- if (effect.type === effectName) {
- this.destroyEffect(effect);
- this.syncRemove(effect.id, effect.type, noMsg || effects.noMsg);
- effects.splice(i, 1);
-
- return effect;
- }
- }
+ removeEffectByType: function (type) {
+ const effects = this.effects.filter(e => e.type === type);
+
+ effects.forEach(e => this.removeEffect(e.id));
},
getEffectByType: function (effectType) {
@@ -293,23 +290,22 @@ module.exports = {
for (let i = 0; i < eLen; i++) {
let e = effects[i];
- if (e.ttl > 0) {
+ if (e.ttl > 0)
e.ttl--;
- if (e.ttl === 0)
- e.destroyed = true;
- }
+ else if (e.ttl === 0)
+ e.destroyed = true;
if (e.update)
e.update();
if (e.destroyed) {
+ this.destroyEffect(e);
+
+ this.syncRemove(e.id);
+
effects.splice(i, 1);
eLen--;
i--;
-
- this.destroyEffect(e);
-
- this.syncRemove(e.id, e.type, e.noMsg);
}
}
diff --git a/src/server/components/extensions/socialCommands.js b/src/server/components/extensions/socialCommands.js
index d3e11464..5cef379d 100644
--- a/src/server/components/extensions/socialCommands.js
+++ b/src/server/components/extensions/socialCommands.js
@@ -549,7 +549,7 @@ module.exports = {
die: function () {
this.obj.stats.takeDamage({
- amount: 99999
+ amount: 20000000
}, 1, this.obj);
},
diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js
index 7c4a9abc..f1f3b8c4 100644
--- a/src/server/components/inventory.js
+++ b/src/server/components/inventory.js
@@ -272,19 +272,16 @@ module.exports = {
this.obj.syncer.setArray(true, 'inventory', 'getItems', item);
},
- stashItem: function (id) {
- let item = this.findItem(id);
+ stashItem: async function (id) {
+ const item = this.findItem(id);
if (!item || item.quest || item.noStash)
return;
delete item.pos;
- let stash = this.obj.stash;
- if (!stash.active)
- return;
-
- let clonedItem = extend({}, item);
- const success = stash.deposit(clonedItem);
+ const stash = this.obj.stash;
+ const clonedItem = extend({}, item);
+ const success = await stash.deposit(clonedItem);
if (!success)
return;
diff --git a/src/server/components/mob.js b/src/server/components/mob.js
index 51c1533c..735b9fbb 100644
--- a/src/server/components/mob.js
+++ b/src/server/components/mob.js
@@ -98,6 +98,8 @@ module.exports = {
patrol: null,
patrolTargetNode: 0,
+ needLos: null,
+
init: function (blueprint) {
this.physics = this.obj.instance.physics;
@@ -111,6 +113,7 @@ module.exports = {
this.maxChaseDistance = blueprint.maxChaseDistance;
},
+ /* eslint-disable-next-line max-lines-per-function */
update: function () {
let obj = this.obj;
@@ -121,20 +124,22 @@ module.exports = {
//Have we reached home?
if (this.goHome) {
let distanceFromHome = Math.max(abs(this.originX - obj.x), abs(this.originY - obj.y));
- if (!distanceFromHome)
+ if (!distanceFromHome) {
this.goHome = false;
- }
-
- //Are we too far from home?
- if ((!this.goHome) && (!obj.follower) && (target)) {
- if (!this.canChase(target)) {
- obj.clearQueue();
- obj.aggro.unAggro(target);
- target = obj.aggro.getHighest();
+ obj.spellbook.resetRotation();
}
}
if (!this.goHome) {
+ //Are we too far from home?
+ if (!obj.follower && target) {
+ if (!this.canChase(target)) {
+ obj.clearQueue();
+ obj.aggro.unAggro(target);
+ target = obj.aggro.getHighest();
+ }
+ }
+
if ((target) && (target !== obj) && ((!obj.follower) || (obj.follower.master !== target))) {
//If we just started attacking, patrols need to know where home is
if (!this.target && this.patrol) {
@@ -145,10 +150,11 @@ module.exports = {
//Are we in fight mode?
this.fight(target);
return;
- } else if ((!target) && (this.target)) {
+ } else if (!target && this.target) {
//Is fight mode over?
this.target = null;
obj.clearQueue();
+ obj.spellbook.resetRotation();
if (canPathHome(this))
this.goHome = true;
@@ -251,8 +257,8 @@ module.exports = {
let ty = ~~target.y;
let distance = max(abs(x - tx), abs(y - ty));
- let furthestAttackRange = obj.spellbook.getFurthestRange(null, true);
- let furthestStayRange = obj.spellbook.getFurthestRange(null, false);
+ let furthestAttackRange = obj.spellbook.getFurthestRange(target, true);
+ let furthestStayRange = obj.spellbook.getFurthestRange(target, false);
let doesCollide = null;
let hasLos = null;
@@ -263,18 +269,20 @@ module.exports = {
hasLos = this.physics.hasLos(x, y, tx, ty);
//Maybe we don't care if the mob has LoS
if (hasLos || this.needLos === false) {
- if (((obj.follower) && (obj.follower.master.player)) || (rnd() < 0.65)) {
- let spell = obj.spellbook.getRandomSpell(target);
- let success = obj.spellbook.cast({
- spell: spell,
- target: target
- });
- //null means we don't have LoS
- if (success !== null)
- return;
- hasLos = false;
- } else
+ let spell = obj.spellbook.getSpellToCast(target);
+ if (!spell)
return;
+
+ let success = obj.spellbook.cast({
+ spell: spell.id,
+ target
+ });
+
+ //null means we don't have LoS
+ if (success !== null)
+ return;
+
+ hasLos = false;
}
}
} else if (furthestAttackRange === 0) {
diff --git a/src/server/components/player.js b/src/server/components/player.js
index 4af46950..d5d04e32 100644
--- a/src/server/components/player.js
+++ b/src/server/components/player.js
@@ -70,9 +70,7 @@ module.exports = {
faction: 'players'
});
obj.addComponent('gatherer');
- obj.addComponent('stash', {
- items: character.stash
- });
+ obj.addComponent('stash');
let blueprintEffects = character.components.find(c => c.type === 'effects') || {};
if (blueprintEffects.effects) {
@@ -235,7 +233,7 @@ module.exports = {
obj.instance.physics.addObject(obj, obj.x, obj.y);
- obj.instance.syncer.queue('onRespawn', {
+ obj.instance.syncer.queue('teleportToPosition', {
x: obj.x,
y: obj.y
}, [obj.serverId]);
@@ -276,11 +274,5 @@ module.exports = {
msg.data.data.callbackId = atlas.registerCallback(msg.callback);
atlas.performAction(this.obj, msg.data);
- },
-
- notifyServerUiReady: function () {
- this.obj.instance.eventEmitter.emit('onPlayerUiReady', {
- obj: this.obj
- });
}
};
diff --git a/src/server/components/portal.js b/src/server/components/portal.js
index c6dd7371..e0545206 100644
--- a/src/server/components/portal.js
+++ b/src/server/components/portal.js
@@ -16,18 +16,20 @@ module.exports = {
this.patronLevel = ~~blueprint.patron;
},
- collisionEnter: async function (obj) {
+ collisionEnter: function (obj) {
if (!obj.player)
return;
- const { toZone: zoneName, toPos, toRelativePos } = this;
+ (async () => {
+ const { toZone: zoneName, toPos, toRelativePos } = this;
- await sendObjToZone({
- obj,
- invokingObj: this,
- zoneName,
- toPos,
- toRelativePos
- });
+ await sendObjToZone({
+ obj,
+ invokingObj: this,
+ zoneName,
+ toPos,
+ toRelativePos
+ });
+ })();
}
};
diff --git a/src/server/components/portal/sendObjToZone.js b/src/server/components/portal/sendObjToZone.js
index a2b4c4dd..7c53204c 100644
--- a/src/server/components/portal/sendObjToZone.js
+++ b/src/server/components/portal/sendObjToZone.js
@@ -1,9 +1,19 @@
-const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos }) => {
- const { serverId, instance: { physics, syncer: globalSyncer } } = obj;
+const fixPosition = (obj, toPos, toRelativePos, invokingObj) => {
+ if (toPos) {
+ obj.x = toPos.x;
+ obj.y = toPos.y;
+ } else if (toRelativePos) {
+ obj.x = invokingObj.obj.x + toRelativePos.x;
+ obj.y = invokingObj.obj.y + toRelativePos.y;
+ }
+};
- globalSyncer.flushForTarget(serverId);
+const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos }) => {
+ const { serverId, instance: { syncer: globalSyncer, physics } } = obj;
if (obj.zoneName === zoneName) {
+ globalSyncer.flushForTarget(serverId);
+
physics.removeObject(obj, obj.x, obj.y);
if (toRelativePos) {
@@ -18,7 +28,7 @@ const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos
physics.addObject(obj, obj.x, obj.y);
- globalSyncer.queue('onRespawn', {
+ globalSyncer.queue('teleportToPosition', {
x: obj.x,
y: obj.y
}, [obj.serverId]);
@@ -26,28 +36,41 @@ const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos
return;
}
- obj.fireEvent('beforeRezone');
-
- obj.destroyed = true;
+ //We set this before saving so that objects aren't saved ON portals
+ obj.zoneName = zoneName;
+ fixPosition(obj, toPos, toRelativePos, invokingObj);
+ //Destroy, flush events and notify other objects
+ globalSyncer.processDestroyedObject(obj);
await obj.auth.doSave();
+ //We have to do this again. This is because onCollisionEnter in portal is not blocking (even though it is async)
+ // So physics will carry on and allow the obj to move onto the next tile (changing the position while we save above)
+ fixPosition(obj, toPos, toRelativePos, invokingObj);
+
+ //Test code, remove later
+ Object.entries(globalSyncer.buffer).forEach(([k, v]) => {
+ v.forEach(e => {
+ if (e.to.includes(serverId)) {
+ /* eslint-disable-next-line */
+ console.log('Found event', k, 'for rezoning object');
+ }
+ });
+ });
+
const simpleObj = obj.getSimple(true, false, true);
+ simpleObj.destroyed = false;
+ simpleObj.forceDestroy = false;
- if (toPos) {
- simpleObj.x = toPos.x;
- simpleObj.y = toPos.y;
- } else if (toRelativePos) {
- simpleObj.x = invokingObj.obj.x + toRelativePos.x;
- simpleObj.y = invokingObj.obj.y + toRelativePos.y;
- }
+ rezoneManager.stageRezone(simpleObj, zoneName);
process.send({
- method: 'rezone',
- id: obj.serverId,
- args: {
- obj: simpleObj,
- newZone: zoneName
+ method: 'events',
+ data: {
+ rezoneStart: [{
+ obj: { msg: {} },
+ to: [serverId]
+ }]
}
});
};
diff --git a/src/server/components/social.js b/src/server/components/social.js
index c7c60da0..fc0692a7 100644
--- a/src/server/components/social.js
+++ b/src/server/components/social.js
@@ -86,7 +86,7 @@ module.exports = {
return;
let source = cons.players.find(c => c.id === sourceId);
- if (!source)
+ if (!source || !source.social)
return;
source.social.sendMessage('invite sent', 'color-yellowB');
diff --git a/src/server/components/social/rezone.js b/src/server/components/social/rezone.js
index e3edbc07..d5caeb12 100644
--- a/src/server/components/social/rezone.js
+++ b/src/server/components/social/rezone.js
@@ -3,6 +3,9 @@ const sendObjToZone = require('../portal/sendObjToZone');
module.exports = (cpnSocial, targetZone) => {
const { obj } = cpnSocial;
+ if (obj.zoneName === targetZone)
+ return;
+
sendObjToZone({
obj,
zoneName: targetZone
diff --git a/src/server/components/spellbook.js b/src/server/components/spellbook.js
index a1cbf0e8..4f15ea71 100644
--- a/src/server/components/spellbook.js
+++ b/src/server/components/spellbook.js
@@ -3,6 +3,11 @@ let animations = require('../config/animations');
let playerSpells = require('../config/spells');
let playerSpellsConfig = require('../config/spellsConfig');
+//Helpers
+const rotationManager = require('./spellbook/rotationManager');
+
+//Component
+
module.exports = {
type: 'spellbook',
@@ -16,6 +21,8 @@ module.exports = {
callbacks: [],
+ rotation: null,
+
init: function (blueprint) {
this.objects = this.obj.instance.objects;
this.physics = this.obj.instance.physics;
@@ -24,7 +31,22 @@ module.exports = {
(blueprint.spells || []).forEach(s => this.addSpell(s, -1));
+ if (blueprint.rotation) {
+ const { duration, spells } = blueprint.rotation;
+
+ this.rotation = {
+ currentTick: 0,
+ duration,
+ spells
+ };
+ }
+
delete blueprint.spells;
+
+ //External helpers that should form part of the component
+ this.getSpellToCast = rotationManager.getSpellToCast.bind(null, this);
+ this.getFurthestRange = rotationManager.getFurthestRange.bind(null, this);
+ this.resetRotation = rotationManager.resetRotation.bind(null, this);
},
transfer: function () {
@@ -243,17 +265,6 @@ module.exports = {
});
},
- getRandomSpell: function (target) {
- const valid = this.spells.filter(s => {
- return (!s.selfCast && !s.procCast && !s.castOnDeath && s.canCast(target));
- });
-
- if (!valid.length)
- return null;
-
- return valid[~~(Math.random() * valid.length)].id;
- },
-
getTarget: function (spell, action) {
let target = action.target;
@@ -289,7 +300,7 @@ module.exports = {
}
}
- if (spell.spellType === 'buff') {
+ if (spell.spellType === 'buff' || spell.spellType === 'heal') {
if (this.obj.aggro.faction !== target.aggro.faction)
return;
} else if (target.aggro && !this.obj.aggro.canAttack(target)) {
@@ -339,6 +350,7 @@ module.exports = {
return false;
action.target = this.getTarget(spell, action);
+
//If a target has become nonSelectable, we need to stop attacks that are queued/auto
if (!action.target || action.target.nonSelectable)
return false;
@@ -445,25 +457,6 @@ module.exports = {
return this.closestRange;
},
- getFurthestRange: function (spellNum, checkCanCast) {
- if (spellNum)
- return this.spells[spellNum].range;
-
- let spells = this.spells;
- let sLen = spells.length;
- let furthest = 0;
- for (let i = 0; i < sLen; i++) {
- let spell = spells[i];
- if (spell.procCast || spell.castOnDeath)
- continue;
-
- if (spell.range > furthest && (!checkCanCast || spell.canCast()))
- furthest = spell.range;
- }
-
- return furthest;
- },
-
getCooldowns: function () {
let cds = [];
this.spells.forEach(
@@ -480,6 +473,9 @@ module.exports = {
let didCast = false;
const isCasting = this.isCasting();
+ if (this.rotation)
+ rotationManager.tick(this);
+
this.spells.forEach(s => {
let auto = s.autoActive;
if (auto) {
diff --git a/src/server/components/spellbook/rotationManager.js b/src/server/components/spellbook/rotationManager.js
new file mode 100644
index 00000000..c902120d
--- /dev/null
+++ b/src/server/components/spellbook/rotationManager.js
@@ -0,0 +1,131 @@
+const getDefaultRotationSpell = rotationSpells => {
+ const spells = rotationSpells.filter(s => !s.atRotationTicks);
+
+ if (!spells.length)
+ return;
+
+ if (spells.length === 1)
+ return spells[0];
+
+ const randomSpell = spells[~~(Math.random() * spells.length)];
+
+ return randomSpell;
+};
+
+//Mobs that define rotations (normally bosses) use this method to determine their spell choices
+const getRotationSpell = (source, target) => {
+ const { spells, rotation: { currentTick, spells: rotationSpells } } = source;
+
+ //Find spell matching current tick
+ let rotationEntry = rotationSpells.find(s => s.atRotationTicks?.includes(currentTick));
+
+ if (!rotationEntry)
+ rotationEntry = getDefaultRotationSpell(rotationSpells);
+
+ if (!rotationEntry)
+ return;
+
+ //Don't cast anything
+ if (rotationEntry.spellIndex === -1)
+ return;
+
+ const useSpell = spells[rotationEntry.spellIndex];
+
+ //Todo: We should set cdMax and manaCost to 0 of rotation spells (unless there's a mana drain mechanic)
+ // later and we want to allow that on bosses
+ useSpell.cd = 0;
+ useSpell.manaCost = 0;
+ if (!useSpell.selfCast && !useSpell.canCast(target))
+ return getDefaultRotationSpell(rotationSpells);
+
+ return useSpell;
+};
+
+//Mobs without rune rotations (normally the case) simple select any random spell that is valid
+const getRandomSpell = (source, target) => {
+ const valid = source.spells.filter(s => {
+ return (!s.selfCast && !s.procCast && !s.castOnDeath && s.canCast(target));
+ });
+
+ if (!valid.length)
+ return null;
+
+ return valid[~~(Math.random() * valid.length)];
+};
+
+const getSpellToCast = (source, target) => {
+ if (source.rotation)
+ return getRotationSpell(source, target);
+
+ const { obj: { follower } } = source;
+
+ //Mobs don't cast all the time but player followers do
+ if (!follower?.master?.player && Math.random() >= 0.65)
+ return;
+
+ return getRandomSpell(source, target);
+};
+
+const tick = source => {
+ if (!source.obj.aggro.isInCombat())
+ return;
+
+ const { rotation } = source;
+
+ rotation.currentTick++;
+
+ if (rotation.currentTick === rotation.duration)
+ rotation.currentTick = 1;
+};
+
+//Gets the range we need to be at to cast a specific rotation spell
+const getFurthestRangeRotation = (source, target, checkCanCast) => {
+ const spell = getRotationSpell(source, target);
+
+ if (!spell)
+ return 0;
+
+ return spell.range;
+};
+
+/*
+ This is used by mobs when in combat mode,
+ * When checkCanCast is true, we want to see if we can cast right now
+ * When checkCanCast is false, we want to see if there is a spell we could cast in the near future
+ -> This could be a spell that is currently on cooldown, or that the mob has insufficient mana for
+ ---> Even though mobs don't need mana for spells at the moment
+ -> Ultimately, this means the mob should not move, just wait
+*/
+const getFurthestRange = (source, target, checkCanCast) => {
+ const { spells, rotation } = source;
+
+ if (rotation)
+ return getFurthestRangeRotation(source, target, checkCanCast);
+
+ let sLen = spells.length;
+ let furthest = 0;
+ for (let i = 0; i < sLen; i++) {
+ let spell = spells[i];
+ if (spell.procCast || spell.castOnDeath)
+ continue;
+
+ if (spell.range > furthest && (!checkCanCast || spell.canCast()))
+ furthest = spell.range;
+ }
+
+ return furthest;
+};
+
+const resetRotation = source => {
+ if (!source.rotation)
+ return;
+
+ source.rotation.currentTick = 0;
+};
+
+module.exports = {
+ tick,
+ resetRotation,
+ getSpellToCast,
+ getFurthestRange
+};
diff --git a/src/server/components/stash.js b/src/server/components/stash.js
index 129294a9..21fe119b 100644
--- a/src/server/components/stash.js
+++ b/src/server/components/stash.js
@@ -1,127 +1,138 @@
+//System
+const eventEmitter = require('../misc/events');
+
+//Helpers
+const fixes = require('../fixes/fixes');
const cpnInventory = require('./inventory');
const { isItemStackable } = require('./inventory/helpers');
+//Config
const maxItemsBase = 50;
+//Component
module.exports = {
type: 'stash',
active: false,
- items: [],
+ items: null,
changed: false,
maxItems: maxItemsBase,
- init: function (blueprint) {
- let items = blueprint.items || [];
- let iLen = items.length;
- for (let i = 0; i < iLen; i++)
- this.getItem(items[i]);
+ init: function (blueprint) {},
+
+ getItemsFromDb: async function () {
+ const { obj } = this;
+
+ this.items = await io.getAsync({
+ key: obj.account,
+ table: 'stash',
+ isArray: true,
+ clean: true
+ });
- delete blueprint.items;
+ fixes.fixStash(this.items);
- this.blueprint = blueprint;
+ await eventEmitter.emit('onAfterGetStash', {
+ obj: obj,
+ stash: this.items
+ });
},
getItem: function (item) {
- //Material?
- let exists = false;
+ const { items } = this;
+
if (isItemStackable(item)) {
- let existItem = this.items.find(i => i.name === item.name);
+ const existItem = items.find(i => i.name === item.name);
if (existItem) {
- exists = true;
if (!existItem.quantity)
existItem.quantity = 1;
- existItem.quantity += (item.quantity || 1);
+
+ existItem.quantity += (+item.quantity || 1);
//We modify the old object because it gets sent to the client
item.id = existItem.id;
item.quantity = existItem.quantity;
item = existItem;
+
+ return;
}
}
//Get next id
- if (!exists) {
- let id = 0;
- let items = this.items;
- let iLen = items.length;
- for (let i = 0; i < iLen; i++) {
- let fItem = items[i];
- if (fItem.id >= id)
- id = fItem.id + 1;
- }
- item.id = id;
- }
+ let id = 0;
+ items.forEach(i => {
+ if (i.id >= id)
+ id = i.id + 1;
+ });
+ item.id = id;
- if (!exists)
- this.items.push(item);
+ items.push(item);
},
- deposit: function (item) {
- if (!this.active)
+ deposit: async function (item) {
+ if (!this.items)
+ await this.getItemsFromDb();
+
+ const { active, items, maxItems, obj } = this;
+
+ if (!active)
return;
- else if (this.items.length >= this.maxItems) {
- let isStackable = this.items.some(stashedItem => item.name === stashedItem.name && (isItemStackable(stashedItem)));
+
+ else if (items.length >= maxItems) {
+ const isStackable = items.some(stashedItem => item.name === stashedItem.name && isItemStackable(stashedItem));
if (!isStackable) {
const message = 'You do not have room in your stash to deposit that item';
- this.obj.social.notifySelf({ message });
+ obj.social.notifySelf({ message });
return;
}
}
- this.getItem(item);
-
- this.obj.syncer.setArray(true, 'stash', 'getItems', item);
this.changed = true;
- return true;
- },
-
- destroyItem: function (id) {
- let item = this.items.find(i => i.id === id);
- if (!item)
- return;
+ this.getItem(item);
- this.items.spliceWhere(i => i === item);
+ const sendItem = cpnInventory.simplifyItem.call({ obj: {} }, item);
- this.obj.syncer.setArray(true, 'stash', 'destroyItems', id);
+ obj.instance.syncer.queue('onAddStashItems', [sendItem], [obj.serverId]);
- this.changed = true;
+ return true;
},
withdraw: function (id) {
- if (!this.active)
+ const { active, items, obj } = this;
+
+ if (!active)
return;
- let item = this.items.find(i => i.id === id);
+ let item = items.find(i => i.id === id);
if (!item)
return;
- else if (!this.obj.inventory.hasSpace(item)) {
+ else if (!obj.inventory.hasSpace(item)) {
const message = 'You do not have room in your inventory to withdraw that item';
- this.obj.social.notifySelf({ message });
+ obj.social.notifySelf({ message });
return;
}
- this.obj.inventory.getItem(item);
- this.items.spliceWhere(i => i === item);
+ this.changed = true;
- this.obj.syncer.setArray(true, 'stash', 'destroyItems', id);
+ obj.inventory.getItem(item);
+ items.spliceWhere(i => i === item);
- this.changed = true;
+ obj.instance.syncer.queue('onRemoveStashItems', [id], [obj.serverId]);
},
setActive: function (active) {
- let obj = this.obj;
+ const { obj } = this;
this.active = active;
- obj.syncer.set(true, 'stash', 'active', this.active);
const actionType = active ? 'addActions' : 'removeActions';
obj.syncer.setArray(true, 'serverActions', actionType, {
+ id: 'openStash',
key: 'u',
action: {
targetId: obj.id,
@@ -130,34 +141,53 @@ module.exports = {
}
});
+ if (!this.active)
+ return;
+
let msg = 'Press U to access your Shared Stash';
- this.obj.instance.syncer.queue('onGetAnnouncement', {
- src: this.obj.id,
+ obj.instance.syncer.queue('onGetAnnouncement', {
+ src: obj.id,
msg: msg
}, [obj.serverId]);
-
- if (this.active && this.items.length > this.maxItems) {
- const message = `You have more than ${this.maxItems} items in your stash. In the future, these items will be lost.`;
- obj.social.notifySelf({ message });
- }
},
- open: function () {
- const { active, obj } = this;
+ open: async function () {
+ if (!this.items)
+ await this.getItemsFromDb();
- if (active)
- obj.instance.syncer.queue('onOpenStash', {}, [obj.serverId]);
+ const { obj, active, maxItems, items } = this;
+
+ if (!active)
+ return;
+
+ const sendItems = items.map(i => cpnInventory.simplifyItem.call({ obj: {} }, i));
+
+ const msg = {
+ maxItems,
+ items: sendItems
+ };
+
+ obj.instance.syncer.queue('onOpenStash', msg, [obj.serverId]);
+
+ if (items.length > maxItems) {
+ const message = `You have more than ${maxItems} items in your stash. In the future, these items will be lost.`;
+ obj.social.notifySelf({ message });
+ }
},
simplify: function (self) {
if (!self)
return null;
+ return { type: 'stash' };
+ },
+
+ simplifyTransfer: function () {
+ const { type, items } = this;
+
return {
- type: 'stash',
- active: this.active,
- items: this.items,
- maxItems: this.maxItems
+ type,
+ items
};
},
diff --git a/src/server/components/stats.js b/src/server/components/stats.js
index 9c0eb015..1b094f5f 100644
--- a/src/server/components/stats.js
+++ b/src/server/components/stats.js
@@ -629,7 +629,8 @@ module.exports = {
source: source.id,
heal: true,
amount: amount,
- crit: heal.crit
+ crit: heal.crit,
+ element: heal.element
}, recipients);
}
@@ -776,6 +777,9 @@ module.exports = {
},
afterDealDamage: function (damageEvent, target) {
+ if (damageEvent.element)
+ return;
+
const { obj, values: { lifeOnHit } } = this;
if (target === obj || !lifeOnHit)
diff --git a/src/server/config/clientConfig.js b/src/server/config/clientConfig.js
index a2f3934d..6b6a2d47 100644
--- a/src/server/config/clientConfig.js
+++ b/src/server/config/clientConfig.js
@@ -44,7 +44,8 @@ const config = {
'images/tiles.png': 8,
'images/walls.png': 8,
'images/objects.png': 8,
- 'images/mobs.png': 8
+ 'images/mobs.png': 8,
+ 'images/characters.png': 8
},
blockingTileIndices: [
6, 7, 54, 55, 62, 63, 154, 189, 190, 192, 193, 194, 195, 196, 197
@@ -147,7 +148,7 @@ const config = {
//Table Sides
103, 110, 118, 126,
//Wall-mounted plants
- 120, 122, 140,
+ 120, 121,
//Ship oars
140, 143,
//Ship Cannons
@@ -173,7 +174,7 @@ const config = {
'party',
'help',
'dialogue',
- 'buffs',
+ 'effects',
'tooltips',
'tooltipInfo',
'tooltipItem',
@@ -221,6 +222,11 @@ module.exports = {
});
});
+ config.clientComponents.push({
+ extends: 'effects',
+ path: 'server/clientComponents/effects/auras.js'
+ });
+
events.emit('onBeforeGetClientConfig', config);
//Deprecated
diff --git a/src/server/config/effects/effectStunned.js b/src/server/config/effects/effectStunned.js
index 45c701dc..ccb46557 100644
--- a/src/server/config/effects/effectStunned.js
+++ b/src/server/config/effects/effectStunned.js
@@ -2,7 +2,8 @@ module.exports = {
type: 'stunned',
init: function () {
- this.obj.spellbook.stopCasting();
+ if (this.obj.spellbook)
+ this.obj.spellbook.stopCasting();
},
events: {
diff --git a/src/server/config/effects/effectTemplate.js b/src/server/config/effects/effectTemplate.js
index 24ef084b..166759ef 100644
--- a/src/server/config/effects/effectTemplate.js
+++ b/src/server/config/effects/effectTemplate.js
@@ -1,4 +1,15 @@
module.exports = {
+ syncExtend: function (data) {
+ let effects = this.obj.effects;
+ effects.syncExtend(this.id, data);
+ },
+
+ isFirstOfType: function () {
+ let effects = this.obj.effects;
+ let firstOfType = effects.find(f => f.type === this.type);
+ return (firstOfType.id === this);
+ },
+
save: function () {
if (!this.persist)
return null;
@@ -19,6 +30,9 @@ module.exports = {
},
simplify: function () {
- return this.type;
+ return {
+ id: this.id,
+ type: this.type
+ };
}
};
diff --git a/src/server/config/serverConfig.js b/src/server/config/serverConfig.js
index b04099c6..0ab213e6 100644
--- a/src/server/config/serverConfig.js
+++ b/src/server/config/serverConfig.js
@@ -1,5 +1,5 @@
module.exports = {
- version: '0.10.5',
+ version: '0.10.6',
port: 4000,
startupMessage: 'Server: ready',
defaultZone: 'fjolarok',
diff --git a/src/server/config/skins.js b/src/server/config/skins.js
index a6025a13..b674330a 100644
--- a/src/server/config/skins.js
+++ b/src/server/config/skins.js
@@ -18,11 +18,6 @@ const config = {
sprite: [2, 0],
defaultSpirit: 'bear',
default: true
- },
- //Faction Skins
- 'gaekatlan-druid': {
- name: 'Gaekatlan Druid',
- sprite: [0, 1]
}
};
diff --git a/src/server/config/spells.js b/src/server/config/spells.js
index fb5e84f8..6a9be26d 100644
--- a/src/server/config/spells.js
+++ b/src/server/config/spells.js
@@ -212,6 +212,57 @@ let spells = [{
randomSpeed: true,
chance: 0.02
}
+}, {
+ name: 'Healing Touch',
+ description: 'Restore health to a friendly target.',
+ type: 'singleTargetHeal',
+ spellType: 'heal',
+ icon: [0, 3],
+ animation: 'raiseStaff',
+ particles: {
+ scale: {
+ start: {
+ min: 6,
+ max: 16
+ },
+ end: {
+ min: 0,
+ max: 4
+ }
+ },
+ speed: {
+ start: {
+ min: 2,
+ max: 12
+ },
+ end: {
+ min: 0,
+ max: 4
+ }
+ },
+ lifetime: {
+ min: 1,
+ max: 3
+ },
+ alpha: {
+ start: 0.45,
+ end: 0
+ },
+ color: {
+ start: ['ffeb38', 'fcfcfc'],
+ end: ['fcfcfc', 'faac45']
+ },
+ spawnType: 'circle',
+ spawnCircle: {
+ x: 0,
+ y: 0,
+ r: 12
+ },
+ randomScale: true,
+ randomColor: true,
+ randomSpeed: true,
+ chance: 0.02
+ }
}, {
name: 'Holy Vengeance',
description: 'Grants holy vengeance to a friendly target. For the duration of the effect, dealing damage will also heal the attacker.',
diff --git a/src/server/config/spells/spellAura.js b/src/server/config/spells/spellAura.js
index 7036683b..f0bb5feb 100644
--- a/src/server/config/spells/spellAura.js
+++ b/src/server/config/spells/spellAura.js
@@ -69,7 +69,7 @@ module.exports = {
if (distance > range) {
if (effect) {
delete effects[m];
- obj.effects.removeEffect(effect);
+ obj.effects.removeEffect(effect.id);
}
return;
@@ -85,8 +85,7 @@ module.exports = {
type: this.effect,
amount: amount,
caster: this.obj,
- ttl: -1,
- new: true
+ ttl: -1
});
});
@@ -96,7 +95,7 @@ module.exports = {
delete effects[serverId];
const obj = objects.find(f => ~~f.serverId === ~~serverId);
if (obj)
- obj.effects.removeEffect(effect);
+ obj.effects.removeEffect(effect.id);
}
});
},
@@ -117,7 +116,7 @@ module.exports = {
return;
}
- obj.effects.removeEffect(effect);
+ obj.effects.removeEffect(effect.id);
delete effects[m];
}, this);
}
diff --git a/src/server/config/spells/spellCharge.js b/src/server/config/spells/spellCharge.js
index ec2577fd..7b7a394c 100644
--- a/src/server/config/spells/spellCharge.js
+++ b/src/server/config/spells/spellCharge.js
@@ -55,19 +55,10 @@ module.exports = {
type: 'stunned'
});
- if (targetEffect) {
- this.obj.instance.syncer.queue('onGetDamage', {
- id: target.id,
- event: true,
- text: 'stunned'
- }, -1);
- }
-
let selfEffect = this.obj.effects.addEffect({
type: 'stunned',
- noMsg: true,
- force: true,
- new: true
+ silent: true,
+ force: true
});
const moveAnimationEffect = {
@@ -115,7 +106,7 @@ module.exports = {
obj.instance.physics.addObject(obj, obj.x, obj.y);
- obj.effects.removeEffect(selfEffect, true);
+ obj.effects.removeEffect(selfEffect.id);
this.obj.aggro.move();
diff --git a/src/server/config/spells/spellFireblast.js b/src/server/config/spells/spellFireblast.js
index 288ecf8d..ad90f442 100644
--- a/src/server/config/spells/spellFireblast.js
+++ b/src/server/config/spells/spellFireblast.js
@@ -115,8 +115,7 @@ module.exports = {
const targetEffect = m.effects.addEffect({
type: 'stunned',
- noMsg: true,
- new: true
+ silent: true
});
//If targetEffect is undefined, it means that the target has become resistant
@@ -147,7 +146,7 @@ module.exports = {
},
endEffect: function (target, targetPos, targetEffect) {
- target.effects.removeEffect(targetEffect, true);
+ target.effects.removeEffect(targetEffect.id);
target.instance.physics.removeObject(target, target.x, target.y);
diff --git a/src/server/config/spells/spellIceSpear.js b/src/server/config/spells/spellIceSpear.js
index 0d80f9e6..e54dd0e0 100644
--- a/src/server/config/spells/spellIceSpear.js
+++ b/src/server/config/spells/spellIceSpear.js
@@ -54,19 +54,11 @@ module.exports = {
if (this.obj.destroyed)
return;
- let targetEffect = target.effects.addEffect({
+ target.effects.addEffect({
type: 'slowed',
ttl: this.freezeDuration
});
- if (targetEffect) {
- this.obj.instance.syncer.queue('onGetDamage', {
- id: target.id,
- event: true,
- text: 'slowed'
- }, -1);
- }
-
let damage = this.getDamage(target);
target.stats.takeDamage(damage, this.threatMult, this.obj);
}
diff --git a/src/server/config/spells/spellReflectDamage.js b/src/server/config/spells/spellReflectDamage.js
index e9f8a7a4..d0734285 100644
--- a/src/server/config/spells/spellReflectDamage.js
+++ b/src/server/config/spells/spellReflectDamage.js
@@ -36,6 +36,6 @@ module.exports = {
let obj = this.obj;
- obj.effects.removeEffect(selfEffect);
+ obj.effects.removeEffect(selfEffect.id);
}
};
diff --git a/src/server/config/spells/spellSingleTargetHeal.js b/src/server/config/spells/spellSingleTargetHeal.js
new file mode 100644
index 00000000..939aeb94
--- /dev/null
+++ b/src/server/config/spells/spellSingleTargetHeal.js
@@ -0,0 +1,41 @@
+module.exports = {
+ type: 'singleTargetHeal',
+
+ cdMax: 20,
+ manaCost: 0,
+ range: 9,
+
+ healing: 1,
+
+ needLos: true,
+ targetFriendly: true,
+
+ spellType: 'heal',
+ particleDuration: 10,
+
+ cast: function (action) {
+ const target = action.target;
+ const { x, y } = target;
+
+ const amount = this.getDamage(target, true);
+ target.stats.getHp(amount, this.obj);
+
+ const effect = {
+ x,
+ y,
+ components: [{
+ type: 'particles',
+ //This ttl is in frames (each frame is roughly 1000 / 60 ms)
+ ttl: (1000 / 60) * this.particleDuration,
+ destroyObject: true,
+ blueprint: this.particles
+ }]
+ };
+
+ this.obj.instance.syncer.queue('onGetObject', effect, -1);
+
+ this.sendBump(target);
+
+ return true;
+ }
+};
diff --git a/src/server/config/spells/spellStealth.js b/src/server/config/spells/spellStealth.js
index 22ad77e0..afd6d4a8 100644
--- a/src/server/config/spells/spellStealth.js
+++ b/src/server/config/spells/spellStealth.js
@@ -8,6 +8,8 @@ module.exports = {
targetGround: true,
+ effect: null,
+
cast: function (action) {
//Clear Aggro
this.obj.aggro.die();
@@ -15,10 +17,10 @@ module.exports = {
let ttl = this.duration * consts.tickTime;
let endCallback = this.queueCallback(this.endEffect.bind(this), ttl - 50);
- this.obj.effects.addEffect({
+ this.effect = this.obj.effects.addEffect({
type: 'stealth',
endCallback: endCallback
- });
+ });
return true;
},
@@ -28,7 +30,7 @@ module.exports = {
let obj = this.obj;
- obj.effects.removeEffectByName('stealth');
+ obj.effects.removeEffect(this.effect.id);
this.obj.aggro.move();
}
};
diff --git a/src/server/config/spells/spellTrailDash.js b/src/server/config/spells/spellTrailDash.js
index 8fb06fe8..966a39ac 100644
--- a/src/server/config/spells/spellTrailDash.js
+++ b/src/server/config/spells/spellTrailDash.js
@@ -164,7 +164,7 @@ module.exports = {
this.castingEffect = this.obj.effects.addEffect({
type: 'casting',
- noMsg: true
+ silent: true
});
this.casting = true;
diff --git a/src/server/config/spellsConfig.js b/src/server/config/spellsConfig.js
index 832a81ec..a865fef4 100644
--- a/src/server/config/spellsConfig.js
+++ b/src/server/config/spellsConfig.js
@@ -76,9 +76,9 @@ let spells = {
statType: 'int',
statMult: 1,
element: 'holy',
- cdMax: 5,
+ cdMax: 15,
castTimeMax: 4,
- manaCost: 8,
+ manaCost: 12,
range: 9,
radius: 3,
random: {
@@ -87,6 +87,19 @@ let spells = {
}
},
+ 'healing touch': {
+ statType: 'int',
+ statMult: 1,
+ element: 'holy',
+ cdMax: 5,
+ castTimeMax: 3,
+ manaCost: 8,
+ range: 9,
+ random: {
+ healing: [1, 3]
+ }
+ },
+
slash: {
statType: 'str',
statMult: 1,
@@ -130,7 +143,6 @@ let spells = {
cdMax: 12,
castTimeMax: 2,
manaCost: 7,
- noDrop: true,
random: {
i_range: [1, 2.5],
damage: [4, 18]
@@ -156,7 +168,6 @@ let spells = {
castTimeMax: 3,
range: 10,
manaCost: 7,
- noDrop: true,
random: {
damage: [8, 35],
i_stunDuration: [4, 7]
@@ -167,11 +178,12 @@ let spells = {
statMult: 1,
manaCost: 14,
needLos: true,
- cdMax: 20,
+ cdMax: 15,
castTimeMax: 0,
range: 9,
+ isAttack: true,
random: {
- damage: [3, 16],
+ damage: [3, 18],
i_delay: [1, 4]
},
negativeStats: [
@@ -219,7 +231,7 @@ let spells = {
auraRange: 9,
effect: 'swiftness',
random: {
- chance: [5, 10]
+ chance: [8, 20]
}
}
diff --git a/src/server/events/phases/phaseGiveRewards.js b/src/server/events/phases/phaseGiveRewards.js
index 866fa66d..d4941b92 100644
--- a/src/server/events/phases/phaseGiveRewards.js
+++ b/src/server/events/phases/phaseGiveRewards.js
@@ -1,6 +1,6 @@
module.exports = {
init: function (event) {
- const { config, rewards, eventManager } = event;
+ const { config, rewards, eventManager: eManager } = event;
const { name: eventName, rewardSenderName } = config;
@@ -26,7 +26,7 @@ module.exports = {
});
if ((config.events) && (config.events.afterGiveRewards))
- config.events.afterGiveRewards(eventManager, config);
+ config.events.afterGiveRewards(eManager, config);
this.end = true;
}
diff --git a/src/server/misc/messages.js b/src/server/misc/messages.js
index 3dedcf04..21d08662 100644
--- a/src/server/misc/messages.js
+++ b/src/server/misc/messages.js
@@ -5,7 +5,8 @@ module.exports = {
allFields: 'please complete all fields',
illegal: 'illegal characters in username',
incorrect: 'invalid username and password',
- charExists: 'character name is taken'
+ charExists: 'character name is taken',
+ maxUsernameLength: 'username may not be longer than 32 characters'
},
createCharacter: {
nameLength: 'name must be between 3 and 12 characters'
diff --git a/src/server/mods/class-necromancer/index.js b/src/server/mods/class-necromancer/index.js
index 23509459..db4823e2 100644
--- a/src/server/mods/class-necromancer/index.js
+++ b/src/server/mods/class-necromancer/index.js
@@ -126,7 +126,7 @@ module.exports = {
range: 1,
random: {
damage: [4, 14],
- healPercent: [10, 30]
+ healPercent: [2, 15]
}
};
diff --git a/src/server/objects/objBase.js b/src/server/objects/objBase.js
index c9397c01..a7726b3a 100644
--- a/src/server/objects/objBase.js
+++ b/src/server/objects/objBase.js
@@ -277,7 +277,7 @@ module.exports = {
},
performMove: function (action) {
- const { x: xOld, y: yOld, syncer, aggro, mob, instance: { physics } } = this;
+ const { x: xOld, y: yOld, syncer, aggro, instance: { physics } } = this;
const { maxDistance = 1, force, data } = action;
const { x: xNew, y: yNew } = data;
@@ -309,26 +309,16 @@ module.exports = {
return false;
}
- //Don't allow mob overlap during combat
- if (mob && mob.target) {
- this.x = xNew;
- this.y = yNew;
+ this.x = xNew;
+ this.y = yNew;
- if (physics.addObject(this, xNew, yNew))
- physics.removeObject(this, xOld, yOld);
- else {
- this.x = xOld;
- this.y = yOld;
-
- return false;
- }
- } else {
+ if (physics.addObject(this, xNew, yNew, xOld, yOld))
physics.removeObject(this, xOld, yOld, xNew, yNew);
+ else {
+ this.x = xOld;
+ this.y = yOld;
- this.x = xNew;
- this.y = yNew;
-
- physics.addObject(this, xNew, yNew, xOld, yOld);
+ return false;
}
//We can't use xNew and yNew because addObject could have changed the position (like entering a building interior with stairs)
diff --git a/src/server/objects/objects.js b/src/server/objects/objects.js
index 9f9a4374..57b825b8 100644
--- a/src/server/objects/objects.js
+++ b/src/server/objects/objects.js
@@ -203,64 +203,87 @@ module.exports = {
return newO;
},
- sendEvent: function (msg) {
- let player = this.objects.find(p => p.id === msg.id);
- if (!player)
+
+ sendEvent: function (msg, { name: sourceZone }) {
+ const { id, data } = msg;
+
+ const player = this.objects.find(p => p.id === id);
+ if (!player || player.zoneName !== sourceZone)
return;
player.socket.emit('event', {
- event: msg.data.event,
- data: msg.data.data
+ event: data.event,
+ data: data.data
});
},
- sendEvents: function (msg) {
- let players = {};
- let objects = this.objects;
- let data = msg.data;
+ sendEvents: function ({ data }, { name: sourceZone }) {
+ const { objects } = this;
+
+ //Store will contain all events to be sent to players
+ const store = {};
+
for (let e in data) {
- let event = data[e];
- let eLen = event.length;
+ const event = data[e];
+ const eLen = event.length;
for (let j = 0; j < eLen; j++) {
- let eventEntry = event[j];
-
- let obj = eventEntry.obj;
-
- if (e !== 'serverModule') {
- let to = eventEntry.to;
- let toLen = to.length;
- for (let i = 0; i < toLen; i++) {
- let toId = to[i];
-
- let player = players[toId];
- if (!player) {
- let findPlayer = objects.find(o => o.id === toId);
- if (!findPlayer)
- continue;
- else {
- player = (players[toId] = {
- socket: findPlayer.socket,
- events: {}
- });
- }
+ const eventEntry = event[j];
+
+ const { obj: eventObj, to } = eventEntry;
+
+ if (e === 'serverModule') {
+ const { method, msg } = eventObj;
+
+ if (Array.isArray(msg))
+ global[eventObj.module][method](...msg);
+ else
+ global[eventObj.module][method](msg);
+
+ continue;
+ }
+
+ const toLen = to.length;
+ for (let i = 0; i < toLen; i++) {
+ const toId = to[i];
+
+ let storeEntry = store[toId];
+ if (!storeEntry) {
+ const playerObj = objects.find(o => o.id === toId);
+
+ if (!playerObj || playerObj.zoneName !== sourceZone) {
+ io.setAsync({
+ key: new Date(),
+ table: 'error',
+ value: `ignoring ${e}`
+ });
+
+ continue;
}
- let eventList = player.events[e] || (player.events[e] = []);
- eventList.push(obj);
+ store[toId] = {
+ obj: playerObj,
+ events: { [e]: [eventObj] }
+ };
+
+ continue;
}
- } else if (obj.msg instanceof Array)
- global[obj.module][obj.method](...obj.msg);
- else
- global[obj.module][obj.method](obj.msg);
+
+ if (!storeEntry.events[e])
+ storeEntry.events[e] = [];
+
+ storeEntry.events[e].push(eventObj);
+ }
}
}
- for (let p in players) {
- let player = players[p];
- player.socket.emit('events', player.events);
+ for (let p in store) {
+ const { obj: { socket }, events } = store[p];
+
+ socket.emit('events', events);
}
},
+
updateObject: async function (msg) {
let player = this.objects.find(p => p.id === msg.serverId);
if (!player)
@@ -324,6 +347,13 @@ module.exports = {
if ((o.update) && (!o.destroyed))
o.update();
+ //When objects are sent to other zones, we destroy them immediately (thhrough sendObjToZone)
+ if (o.forceDestroy) {
+ i--;
+ len--;
+ continue;
+ }
+
if (o.ttl) {
o.ttl--;
if (!o.ttl)
diff --git a/src/server/package-lock.json b/src/server/package-lock.json
index d022b0eb..90ba298e 100644
--- a/src/server/package-lock.json
+++ b/src/server/package-lock.json
@@ -1,8 +1,2566 @@
{
"name": "isleward_server",
- "version": "0.10.4",
- "lockfileVersion": 1,
+ "version": "0.10.6",
+ "lockfileVersion": 2,
"requires": true,
+ "packages": {
+ "": {
+ "name": "isleward_server",
+ "version": "0.10.6",
+ "dependencies": {
+ "axios": "^0.22.0",
+ "bcrypt-nodejs": "0.0.3",
+ "compression": "^1.7.4",
+ "express": "^4.17.1",
+ "express-minify": "^1.0.0",
+ "image-size": "^1.0.0",
+ "rethinkdbdash": "^2.3.31",
+ "socket.io": "^4.2.0",
+ "universal-analytics": "^0.5.1"
+ },
+ "devDependencies": {
+ "babel-eslint": "^10.1.0",
+ "eslint": "^7.32.0",
+ "eslint-plugin-prettier": "^4.0.0",
+ "eslint-plugin-requirejs": "^4.0.1"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.9.4",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz",
+ "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.9.0",
+ "jsesc": "^2.5.1",
+ "lodash": "^4.17.13",
+ "source-map": "^0.5.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
+ "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.8.3",
+ "@babel/template": "^7.8.3",
+ "@babel/types": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/helper-get-function-arity": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
+ "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
+ "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz",
+ "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==",
+ "dev": true
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
+ "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.9.0",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.9.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
+ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.8.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+ "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.8.3",
+ "@babel/parser": "^7.8.6",
+ "@babel/types": "^7.8.6"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz",
+ "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.8.3",
+ "@babel/generator": "^7.9.0",
+ "@babel/helper-function-name": "^7.8.3",
+ "@babel/helper-split-export-declaration": "^7.8.3",
+ "@babel/parser": "^7.9.0",
+ "@babel/types": "^7.9.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.13"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@babel/types": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz",
+ "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.9.0",
+ "lodash": "^4.17.13",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+ "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^13.9.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.11.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
+ "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+ "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.0",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz",
+ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==",
+ "dev": true
+ },
+ "node_modules/@types/component-emitter": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
+ "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg=="
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
+ },
+ "node_modules/@types/cors": {
+ "version": "2.8.12",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
+ "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
+ },
+ "node_modules/@types/node": {
+ "version": "16.10.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz",
+ "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ=="
+ },
+ "node_modules/accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "dependencies": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/axios": {
+ "version": "0.22.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.22.0.tgz",
+ "integrity": "sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==",
+ "dependencies": {
+ "follow-redirects": "^1.14.4"
+ }
+ },
+ "node_modules/babel-eslint": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
+ "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+ "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.7.0",
+ "@babel/traverse": "^7.7.0",
+ "@babel/types": "^7.7.0",
+ "eslint-visitor-keys": "^1.0.0",
+ "resolve": "^1.12.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "eslint": ">= 4.12.1"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base64-arraybuffer": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
+ "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+ "engines": {
+ "node": "^4.5.0 || >= 5.9"
+ }
+ },
+ "node_modules/bcrypt-nodejs": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz",
+ "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=",
+ "deprecated": "bcrypt-nodejs is no longer actively maintained. Please use bcrypt or bcryptjs. See https://github.com/kelektiv/node.bcrypt.js/wiki/bcrypt-vs-brypt.js to learn more about these two options"
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
+ "node_modules/body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "dependencies": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/clean-css": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
+ "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "dependencies": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "dependencies": {
+ "safe-buffer": "5.1.2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/engine.io": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.1.tgz",
+ "integrity": "sha512-hyNxjVgWp619QMfqi/+/6/LQF+ueOIWeVOza3TeyvxUGjeT9U/xPkkHW/NJNuhbStrxMujEoMadoc2EY7DDEnw==",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.4.1",
+ "cors": "~2.8.5",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~4.0.0",
+ "ws": "~7.4.2"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/engine.io-parser": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.3.tgz",
+ "integrity": "sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==",
+ "dependencies": {
+ "base64-arraybuffer": "0.1.4"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/engine.io/node_modules/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/engine.io/node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/engine.io/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "7.32.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+ "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.3",
+ "@humanwhocodes/config-array": "^0.5.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.1.2",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.9",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
+ "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.28.0",
+ "prettier": ">=2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-requirejs": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-requirejs/-/eslint-plugin-requirejs-4.0.1.tgz",
+ "integrity": "sha512-7SCBeOZha5E1TGRxbfvNypG0/1Da3gonaT8IeWfNN9iUriamtnwXrGwYipEFr/yMHNCHRpua4LL/7DSov6aUEQ==",
+ "dev": true,
+ "dependencies": {
+ "ignore": "5.0.5"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "eslint": ">=3.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-requirejs/node_modules/ignore": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.5.tgz",
+ "integrity": "sha512-kOC8IUb8HSDMVcYrDVezCxpJkzSQWTAzf3olpKM6o9rM5zpojx23O0Fl8Wr4+qJ6ZbPEHqf1fdwev/DS7v7pmA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
+ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint/node_modules/@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/eslint/node_modules/@babel/helper-validator-identifier": {
+ "version": "7.15.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
+ "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/eslint/node_modules/@babel/highlight": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/eslint/node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint/node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.11.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
+ "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/espree": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "dependencies": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express-minify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/express-minify/-/express-minify-1.0.0.tgz",
+ "integrity": "sha512-04/iYxB79jGeNZBBkbAW7L7FMG4Wtu78F1SayXIKiJD6MfqYnOI3DD8no7QOntgedYCdYUpj+Skg8QWR/2WnMQ==",
+ "dependencies": {
+ "clean-css": "^4.1.7",
+ "on-headers": "^1.0.1",
+ "uglify-js": "^3.0.28"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+ "dev": true
+ },
+ "node_modules/fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
+ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.14.8",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz",
+ "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/image-size": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz",
+ "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==",
+ "dependencies": {
+ "queue": "6.0.2"
+ },
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+ "dev": true
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.43.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
+ "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.26",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
+ "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
+ "dependencies": {
+ "mime-db": "1.43.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+ "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+ "dependencies": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/queue": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
+ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
+ "dependencies": {
+ "inherits": "~2.0.3"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "dependencies": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "dependencies": {
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rethinkdbdash": {
+ "version": "2.3.31",
+ "resolved": "https://registry.npmjs.org/rethinkdbdash/-/rethinkdbdash-2.3.31.tgz",
+ "integrity": "sha512-6nXrKFjdg2Ug0YpdmPWSvyD/2EisHnFNt4FWZ74dcXGK48ievSv+cNFTmVv+KjLi6I9CCf6w4CKZ6yCYTfMfdQ==",
+ "dependencies": {
+ "bluebird": ">= 3.0.1"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+ },
+ "node_modules/serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/socket.io": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.2.0.tgz",
+ "integrity": "sha512-sjlGfMmnaWvTRVxGRGWyhd9ctpg4APxWAxu85O/SxekkxHhfxmePWZbaYCkeX5QQX0z1YEnKOlNt6w82E4Nzug==",
+ "dependencies": {
+ "@types/cookie": "^0.4.1",
+ "@types/cors": "^2.8.12",
+ "@types/node": ">=10.0.0",
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "debug": "~4.3.2",
+ "engine.io": "~5.2.0",
+ "socket.io-adapter": "~2.3.2",
+ "socket.io-parser": "~4.0.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/socket.io-adapter": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.2.tgz",
+ "integrity": "sha512-PBZpxUPYjmoogY0aoaTmo1643JelsaS1CiAwNjRVdrI0X9Seuc19Y2Wife8k88avW6haG8cznvwbubAZwH4Mtg=="
+ },
+ "node_modules/socket.io-parser": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
+ "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
+ "dependencies": {
+ "@types/component-emitter": "^1.2.10",
+ "component-emitter": "~1.3.0",
+ "debug": "~4.3.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/socket.io-parser/node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/socket.io-parser/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/socket.io/node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/socket.io/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/table": {
+ "version": "6.7.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz",
+ "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.6.3",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz",
+ "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/uglify-js": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz",
+ "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==",
+ "dependencies": {
+ "commander": "~2.20.3",
+ "source-map": "~0.6.1"
+ },
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/universal-analytics": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.5.1.tgz",
+ "integrity": "sha512-raLjYsNQmJbK0o8veSU9GXA5XG/YhfuZDzWCAB4SNDnPI4ozXLrbFSDZiRENdOFEIUqmdUTYcaQCOa0Y36EtsQ==",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "uuid": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=12.18.2"
+ }
+ },
+ "node_modules/universal-analytics/node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/universal-analytics/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/ws": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ },
"dependencies": {
"@babel/code-frame": {
"version": "7.8.3",
@@ -145,6 +2703,7 @@
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
"integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+ "dev": true,
"requires": {
"ajv": "^6.12.4",
"debug": "^4.1.1",
@@ -157,21 +2716,11 @@
"strip-json-comments": "^3.1.1"
},
"dependencies": {
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
"debug": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
"requires": {
"ms": "2.1.2"
}
@@ -180,6 +2729,7 @@
"version": "13.11.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
"integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
+ "dev": true,
"requires": {
"type-fest": "^0.20.2"
}
@@ -187,7 +2737,8 @@
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
}
}
},
@@ -195,6 +2746,7 @@
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
"integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+ "dev": true,
"requires": {
"@humanwhocodes/object-schema": "^1.2.0",
"debug": "^4.1.1",
@@ -205,6 +2757,7 @@
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
"requires": {
"ms": "2.1.2"
}
@@ -212,14 +2765,16 @@
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
}
}
},
"@humanwhocodes/object-schema": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz",
- "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w=="
+ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==",
+ "dev": true
},
"@types/component-emitter": {
"version": "1.2.10",
@@ -253,17 +2808,21 @@
"acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
},
"acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "requires": {}
},
"ajv": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
- "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -274,17 +2833,20 @@
"ansi-colors": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
},
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
"requires": {
"color-convert": "^1.9.0"
}
@@ -293,6 +2855,7 @@
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
@@ -302,38 +2865,11 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- },
"astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
- },
- "aws4": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
- "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
},
"axios": {
"version": "0.22.0",
@@ -360,7 +2896,8 @@
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
},
"base64-arraybuffer": {
"version": "0.1.4",
@@ -377,14 +2914,6 @@
"resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz",
"integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs="
},
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
"bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
@@ -418,6 +2947,7 @@
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -431,12 +2961,8 @@
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
},
"chalk": {
"version": "2.4.2",
@@ -461,6 +2987,7 @@
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
"requires": {
"color-name": "1.1.3"
}
@@ -468,15 +2995,8 @@
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "requires": {
- "delayed-stream": "~1.0.0"
- }
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
},
"commander": {
"version": "2.20.3",
@@ -513,7 +3033,8 @@
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
},
"content-disposition": {
"version": "0.5.3",
@@ -538,11 +3059,6 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
"cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
@@ -556,20 +3072,13 @@
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
"requires": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
}
},
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -581,12 +3090,8 @@
"deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
},
"depd": {
"version": "1.1.2",
@@ -602,19 +3107,11 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
"requires": {
"esutils": "^2.0.2"
}
},
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -623,7 +3120,8 @@
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
},
"encodeurl": {
"version": "1.0.2",
@@ -631,9 +3129,9 @@
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"engine.io": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.0.tgz",
- "integrity": "sha512-d1DexkQx87IFr1FLuV+0f5kAm1Hk1uOVijLOb+D1sDO2QMb7YjE02VHtZtxo7xIXMgcWLb+vl3HRT0rI9tr4jQ==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.2.1.tgz",
+ "integrity": "sha512-hyNxjVgWp619QMfqi/+/6/LQF+ueOIWeVOza3TeyvxUGjeT9U/xPkkHW/NJNuhbStrxMujEoMadoc2EY7DDEnw==",
"requires": {
"accepts": "~1.3.4",
"base64id": "2.0.0",
@@ -676,6 +3174,7 @@
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
"integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
"requires": {
"ansi-colors": "^4.1.1"
}
@@ -695,6 +3194,7 @@
"version": "7.32.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
"integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
+ "dev": true,
"requires": {
"@babel/code-frame": "7.12.11",
"@eslint/eslintrc": "^0.4.3",
@@ -742,6 +3242,7 @@
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
"integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "dev": true,
"requires": {
"@babel/highlight": "^7.10.4"
}
@@ -749,12 +3250,14 @@
"@babel/helper-validator-identifier": {
"version": "7.15.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
- "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w=="
+ "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
+ "dev": true
},
"@babel/highlight": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
"integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+ "dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.14.5",
"chalk": "^2.0.0",
@@ -765,6 +3268,7 @@
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
@@ -774,7 +3278,8 @@
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
}
}
},
@@ -782,6 +3287,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -791,6 +3297,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -799,6 +3306,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"requires": {
"has-flag": "^4.0.0"
}
@@ -809,6 +3317,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -816,12 +3325,14 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
},
"debug": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
"requires": {
"ms": "2.1.2"
}
@@ -829,22 +3340,26 @@
"escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
},
"eslint-visitor-keys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
},
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
},
"globals": {
"version": "13.11.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
"integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
+ "dev": true,
"requires": {
"type-fest": "^0.20.2"
}
@@ -852,12 +3367,14 @@
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
}
}
},
@@ -891,6 +3408,7 @@
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
"requires": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
@@ -900,6 +3418,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
"integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
"requires": {
"eslint-visitor-keys": "^1.1.0"
}
@@ -907,12 +3426,14 @@
"eslint-visitor-keys": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
- "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A=="
+ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
+ "dev": true
},
"espree": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+ "dev": true,
"requires": {
"acorn": "^7.4.0",
"acorn-jsx": "^5.3.1",
@@ -922,19 +3443,22 @@
"eslint-visitor-keys": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
}
}
},
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
},
"esquery": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
"requires": {
"estraverse": "^5.1.0"
},
@@ -942,7 +3466,8 @@
"estraverse": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
- "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
}
}
},
@@ -950,6 +3475,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
"requires": {
"estraverse": "^5.2.0"
},
@@ -957,19 +3483,22 @@
"estraverse": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
- "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
}
}
},
"estraverse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
},
"esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
},
"etag": {
"version": "1.8.1",
@@ -1023,20 +3552,11 @@
"uglify-js": "^3.0.28"
}
},
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
- },
"fast-deep-equal": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
- "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
+ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+ "dev": true
},
"fast-diff": {
"version": "1.2.0",
@@ -1047,17 +3567,20 @@
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
},
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
},
"file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
"requires": {
"flat-cache": "^3.0.4"
}
@@ -1080,6 +3603,7 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
"requires": {
"flatted": "^3.1.0",
"rimraf": "^3.0.2"
@@ -1088,27 +3612,13 @@
"flatted": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
- "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA=="
+ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
+ "dev": true
},
"follow-redirects": {
- "version": "1.14.4",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz",
- "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g=="
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
+ "version": "1.14.8",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz",
+ "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA=="
},
"forwarded": {
"version": "0.1.2",
@@ -1123,25 +3633,20 @@
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
},
"functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "requires": {
- "assert-plus": "^1.0.0"
- }
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
},
"glob": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
"integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -1155,6 +3660,7 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
"requires": {
"is-glob": "^4.0.1"
}
@@ -1165,24 +3671,11 @@
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
},
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
- },
- "har-validator": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
- "requires": {
- "ajv": "^6.5.5",
- "har-schema": "^2.0.0"
- }
- },
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
},
"http-errors": {
"version": "1.7.2",
@@ -1196,16 +3689,6 @@
"toidentifier": "1.0.0"
}
},
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -1217,7 +3700,8 @@
"ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
},
"image-size": {
"version": "1.0.0",
@@ -1231,6 +3715,7 @@
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
"requires": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
@@ -1239,12 +3724,14 @@
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
@@ -1263,96 +3750,69 @@
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
},
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
},
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
"requires": {
"is-extglob": "^2.1.1"
}
},
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
- },
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
},
"js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
}
},
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
- },
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
- },
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
},
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
},
"levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
"requires": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
@@ -1367,22 +3827,26 @@
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
- "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
+ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+ "dev": true
},
"lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
},
"lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM="
+ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+ "dev": true
},
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
"requires": {
"yallist": "^4.0.0"
}
@@ -1424,6 +3888,7 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -1436,18 +3901,14 @@
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
},
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
- },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -1470,6 +3931,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
"requires": {
"wrappy": "1"
}
@@ -1478,6 +3940,7 @@
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
"requires": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
@@ -1491,6 +3954,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
"requires": {
"callsites": "^3.0.0"
}
@@ -1503,12 +3967,14 @@
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
},
"path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
},
"path-parse": {
"version": "1.0.7",
@@ -1521,15 +3987,11 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
- },
"prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
},
"prettier-linter-helpers": {
"version": "1.0.0",
@@ -1543,7 +4005,8 @@
"progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
},
"proxy-addr": {
"version": "2.0.6",
@@ -1554,15 +4017,11 @@
"ipaddr.js": "1.9.1"
}
},
- "psl": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
- "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
- },
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
},
"qs": {
"version": "6.7.0",
@@ -1603,46 +4062,14 @@
"regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
- "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg=="
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "dependencies": {
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
- }
- }
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
},
"require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
},
"resolve": {
"version": "1.15.1",
@@ -1656,7 +4083,8 @@
"resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
},
"rethinkdbdash": {
"version": "2.3.31",
@@ -1670,6 +4098,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
"requires": {
"glob": "^7.1.3"
}
@@ -1688,6 +4117,7 @@
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
@@ -1739,6 +4169,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
"requires": {
"shebang-regex": "^3.0.0"
}
@@ -1746,12 +4177,14 @@
"shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
},
"slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
"integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"astral-regex": "^2.0.0",
@@ -1762,6 +4195,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -1770,6 +4204,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -1777,7 +4212,8 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
}
}
},
@@ -1850,23 +4286,8 @@
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
},
"statuses": {
"version": "1.5.0",
@@ -1877,6 +4298,7 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
"requires": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -1887,6 +4309,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
"requires": {
"ansi-regex": "^5.0.1"
}
@@ -1894,12 +4317,14 @@
"strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
"requires": {
"has-flag": "^3.0.0"
}
@@ -1908,6 +4333,7 @@
"version": "6.7.2",
"resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz",
"integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==",
+ "dev": true,
"requires": {
"ajv": "^8.0.1",
"lodash.clonedeep": "^4.5.0",
@@ -1921,6 +4347,7 @@
"version": "8.6.3",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz",
"integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==",
+ "dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
@@ -1931,14 +4358,16 @@
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
}
}
},
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
},
"to-fast-properties": {
"version": "2.0.0",
@@ -1951,32 +4380,11 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
- },
"type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
"requires": {
"prelude-ls": "^1.2.1"
}
@@ -1984,7 +4392,8 @@
"type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
},
"type-is": {
"version": "1.6.18",
@@ -2005,19 +4414,18 @@
}
},
"universal-analytics": {
- "version": "0.4.23",
- "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz",
- "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==",
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.5.1.tgz",
+ "integrity": "sha512-raLjYsNQmJbK0o8veSU9GXA5XG/YhfuZDzWCAB4SNDnPI4ozXLrbFSDZiRENdOFEIUqmdUTYcaQCOa0Y36EtsQ==",
"requires": {
"debug": "^4.1.1",
- "request": "^2.88.2",
- "uuid": "^3.0.0"
+ "uuid": "^8.0.0"
},
"dependencies": {
"debug": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
- "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
"requires": {
"ms": "2.1.2"
}
@@ -2038,6 +4446,7 @@
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "dev": true,
"requires": {
"punycode": "^2.1.0"
}
@@ -2048,34 +4457,26 @@
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
},
"v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA=="
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
"which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
"requires": {
"isexe": "^2.0.0"
}
@@ -2083,22 +4484,26 @@
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
},
"ws": {
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
- "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "requires": {}
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
}
}
diff --git a/src/server/package.json b/src/server/package.json
index a80b9c08..17c49a9a 100644
--- a/src/server/package.json
+++ b/src/server/package.json
@@ -1,6 +1,6 @@
{
"name": "isleward_server",
- "version": "0.10.5",
+ "version": "0.10.6",
"description": "isleward",
"dependencies": {
"axios": "^0.22.0",
@@ -11,7 +11,7 @@
"image-size": "^1.0.0",
"rethinkdbdash": "^2.3.31",
"socket.io": "^4.2.0",
- "universal-analytics": "^0.4.23"
+ "universal-analytics": "^0.5.1"
},
"devDependencies": {
"babel-eslint": "^10.1.0",
diff --git a/src/server/security/connections.js b/src/server/security/connections.js
index 7bd04b83..61ae3ee5 100644
--- a/src/server/security/connections.js
+++ b/src/server/security/connections.js
@@ -77,8 +77,11 @@ module.exports = {
(['getCharacterList', 'getCharacter', 'deleteCharacter'].indexOf(msg.method) === -1)
) ||
(
- (player.dead) &&
- (msg.data.method !== 'respawn')
+ player.dead &&
+ !(
+ (msg.method === 'performAction' && ['respawn'].includes(msg.data.method)) ||
+ (msg.method === 'clientAck')
+ )
)
)
return;
diff --git a/src/server/security/routerConfig.js b/src/server/security/routerConfig.js
index 5038f287..966b6dee 100644
--- a/src/server/security/routerConfig.js
+++ b/src/server/security/routerConfig.js
@@ -18,13 +18,14 @@ const routerConfig = {
wardrobe: ['open', 'apply'],
stats: ['respawn'],
passives: ['tickNode', 'untickNode'],
- workbench: ['open', 'craft', 'getRecipe'],
- player: ['notifyServerUiReady']
+ workbench: ['open', 'craft', 'getRecipe']
},
globalAllowed: {
clientConfig: ['getClientConfig'],
leaderboard: ['requestList'],
- cons: ['unzone']
+ cons: ['unzone'],
+ rezoneManager: ['clientAck'],
+ instancer: ['clientAck']
},
allowTargetId: {
door: ['lock', 'unlock'],
diff --git a/src/server/world/atlas.js b/src/server/world/atlas.js
index 709818be..c91d5f5e 100644
--- a/src/server/world/atlas.js
+++ b/src/server/world/atlas.js
@@ -128,15 +128,16 @@ module.exports = {
mapList.mapList.filter(m => !m.disabled).forEach(m => this.spawnMap(m));
},
spawnMap: function (map) {
- let worker = childProcess.fork('./world/worker');
- let thread = {
+ const worker = childProcess.fork('./world/worker', [map.name]);
+
+ const thread = {
id: this.nextId++,
name: map.name,
path: map.path,
- worker: worker
+ worker
};
- let onMessage = this.onMessage.bind(this, thread);
+ const onMessage = this.onMessage.bind(this, thread);
worker.on('message', function (m) {
onMessage(m);
});
@@ -174,11 +175,11 @@ module.exports = {
},
event: function (thread, message) {
- objects.sendEvent(message);
+ objects.sendEvent(message, thread);
},
events: function (thread, message) {
- objects.sendEvents(message);
+ objects.sendEvents(message, thread);
},
object: function (thread, message) {
diff --git a/src/server/world/instancer.js b/src/server/world/instancer.js
index 4cf535d3..59c1a669 100644
--- a/src/server/world/instancer.js
+++ b/src/server/world/instancer.js
@@ -13,6 +13,9 @@ let eventEmitter = require('../misc/events');
const mods = require('../misc/mods');
const transactions = require('../security/transactions');
+//Own helpers
+const { stageZoneIn, unstageZoneIn, clientAck } = require('./instancer/handshakes');
+
module.exports = {
instances: [],
zoneId: -1,
@@ -65,6 +68,9 @@ module.exports = {
[resourceSpawner, syncer, objects, questBuilder, events].forEach(i => i.init(fakeInstance));
this.tick();
+
+ this.clientAck = clientAck;
+ eventEmitter.on('removeObject', unstageZoneIn);
},
startRegen: function (respawnMap, respawnPos) {
@@ -211,21 +217,24 @@ module.exports = {
obj.spawn = map.spawn;
- syncer.queue('onGetMap', map.clientMap, [obj.serverId]);
+ stageZoneIn(msg);
- if (!msg.transfer)
- objects.addObject(obj, this.onAddObject.bind(this));
- else {
- let o = objects.transferObject(obj);
- questBuilder.obtain(o);
- eventEmitter.emit('onAfterPlayerEnterZone', o);
- }
+ process.send({
+ method: 'events',
+ data: {
+ getMap: [{
+ obj: map.clientMap,
+ to: [obj.serverId]
+ }]
+ }
+ });
},
+ //This function fires when the player logs in the first time, not upon rezone
onAddObject: function (obj) {
if (obj.player) {
obj.stats.onLogin();
- eventEmitter.emit('onAfterPlayerEnterZone', obj);
+ eventEmitter.emit('onAfterPlayerEnterZone', obj, { isTransfer: false });
}
questBuilder.obtain(obj);
@@ -302,6 +311,10 @@ module.exports = {
return;
}
+ //We fire this event because even though an object might be destroyed already,
+ // mods and modules might have staged events/actions we need to clear
+ eventEmitter.emit('removeObject', { obj: msg.obj });
+
let obj = msg.obj;
obj = objects.find(o => o.serverId === obj.id);
if (!obj) {
diff --git a/src/server/world/instancer/handshakes.js b/src/server/world/instancer/handshakes.js
new file mode 100644
index 00000000..c4c6a8ce
--- /dev/null
+++ b/src/server/world/instancer/handshakes.js
@@ -0,0 +1,49 @@
+//Local State
+const stagedZoneIns = [];
+
+//Methods
+
+//Fired when an object is removed through a socket dc
+// We do this because a client might DC during rezone handshake
+const unstageZoneIn = msg => {
+ stagedZoneIns.spliceWhere(s => s.obj.serverId === msg.obj.id);
+};
+
+const stageZoneIn = msg => {
+ const { serverId } = msg.obj;
+
+ stagedZoneIns.spliceWhere(o => o.obj.serverId === serverId);
+
+ stagedZoneIns.push(msg);
+};
+
+const doZoneIn = function (staged) {
+ const { onAddObject, instances: [ { objects, questBuilder, eventEmitter } ] } = instancer;
+
+ const { transfer: isTransfer, obj } = staged;
+
+ if (!isTransfer)
+ objects.addObject(obj, onAddObject.bind(instancer));
+ else {
+ let o = objects.transferObject(obj);
+ questBuilder.obtain(o);
+ eventEmitter.emit('onAfterPlayerEnterZone', o, { isTransfer });
+ }
+};
+
+const clientAck = msg => {
+ const staged = stagedZoneIns.find(s => s.obj.serverId === msg.sourceId);
+ if (!staged)
+ return;
+
+ stagedZoneIns.spliceWhere(s => s === staged);
+
+ doZoneIn(staged);
+};
+
+//Exports
+module.exports = {
+ unstageZoneIn,
+ stageZoneIn,
+ clientAck
+};
diff --git a/src/server/world/map.js b/src/server/world/map.js
index 07d250e8..776223e4 100644
--- a/src/server/world/map.js
+++ b/src/server/world/map.js
@@ -85,8 +85,13 @@ module.exports = {
try {
chats = require('../' + this.path + '/' + this.name + '/chats');
} catch (e) {}
- if (chats)
- this.zone.chats = chats;
+
+ if (chats) {
+ if (this.zone.chats)
+ extend(this.zone.chats, chats);
+ else
+ this.zone.chats = chats;
+ }
let dialogues = null;
try {
diff --git a/src/server/world/mobBuilder.js b/src/server/world/mobBuilder.js
index 1f63faab..a5cb9bfa 100644
--- a/src/server/world/mobBuilder.js
+++ b/src/server/world/mobBuilder.js
@@ -50,6 +50,8 @@ module.exports = {
if (cpnMob.patrol)
cpnMob.walkDistance = 1;
+ cpnMob.needLos = blueprint.needLos;
+
let spells = extend([], blueprint.spells);
spells.forEach(s => {
if (!s.animation && mob.sheetName === 'mobs' && animations.mobs[mob.cell])
@@ -179,21 +181,6 @@ module.exports = {
s.dmgMult = s.name ? dmgMult / 3 : dmgMult;
s.statType = preferStat;
s.manaCost = 0;
-
- /*if (mob.name.toLowerCase().includes('stinktooth')) {
- mob.stats.values.critChance = 0;
- mob.stats.values.attackCritChance = 0;
- mob.stats.values.spellCritChance = 0;
-
- const n = mob.name + '-' + s.type;
- if (!track[n])
- track[n] = [];
-
- track[n].push(~~s.getDamage(mob, true).amount);
- track[n].sort((a, b) => a - b);
- console.log(track);
- console.log('');
- }*/
});
//Hack to disallow low level mobs from having any lifeOnHit
diff --git a/src/server/world/rezoneManager.js b/src/server/world/rezoneManager.js
new file mode 100644
index 00000000..08bf8a97
--- /dev/null
+++ b/src/server/world/rezoneManager.js
@@ -0,0 +1,55 @@
+//Imports
+const eventEmitter = require('../misc/events');
+
+//Local State
+const stagedRezones = [];
+
+//Methods
+
+//Fired when an object is removed through a socket dc
+// We do this because a client might DC during rezone handshake
+const unstageRezone = msg => {
+ stagedRezones.spliceWhere(s => s.simplifiedObj.serverId === msg.obj.id);
+};
+
+const stageRezone = (simplifiedObj, targetZone) => {
+ const { serverId } = simplifiedObj;
+
+ stagedRezones.spliceWhere(o => o.simplifiedObj.serverId === serverId);
+
+ stagedRezones.push({ simplifiedObj, targetZone });
+};
+
+const doRezone = stagedRezone => {
+ const { simplifiedObj, targetZone } = stagedRezone;
+
+ process.send({
+ method: 'rezone',
+ id: simplifiedObj.serverId,
+ args: {
+ obj: simplifiedObj,
+ newZone: targetZone
+ }
+ });
+};
+
+const clientAck = msg => {
+ const staged = stagedRezones.find(s => s.simplifiedObj.serverId === msg.sourceId);
+ if (!staged)
+ return;
+
+ stagedRezones.spliceWhere(s => s === staged);
+
+ doRezone(staged);
+};
+
+const init = () => {
+ eventEmitter.on('removeObject', unstageRezone);
+};
+
+//Exports
+module.exports = {
+ init,
+ stageRezone,
+ clientAck
+};
diff --git a/src/server/world/spawners.js b/src/server/world/spawners.js
index 3cad19bd..22fd59ca 100644
--- a/src/server/world/spawners.js
+++ b/src/server/world/spawners.js
@@ -60,7 +60,6 @@ module.exports = {
this.syncer.queue('onGetObject', {
id: obj.id,
- performLast: true,
components: [spawnAnimation]
}, -1);
}
diff --git a/src/server/world/syncer.js b/src/server/world/syncer.js
index 4b1affde..f46704e9 100644
--- a/src/server/world/syncer.js
+++ b/src/server/world/syncer.js
@@ -180,6 +180,35 @@ module.exports = {
}
},
+ processDestroyedObject: function (obj) {
+ const { objects, queue } = this;
+ const { id, serverId } = obj;
+
+ obj.destroyed = true;
+
+ //We mark forceDestroy to tell objects that we're destroying an object outside of the
+ // syncer's update method
+ obj.forceDestroy = true;
+
+ const msg = {
+ id: id,
+ destroyed: true
+ };
+
+ objects.removeObject(obj);
+
+ this.flushForTarget(serverId);
+
+ const fnQueueMsg = queue.bind(this, 'onGetObject');
+
+ //Find any players that have seen this obj
+ objects
+ .filter(o => !o.destroyed && o?.player?.hasSeen(id))
+ .forEach(o => {
+ fnQueueMsg(msg, [o.serverId]);
+ });
+ },
+
send: function () {
if (!this.dirty)
return;
diff --git a/src/server/world/worker.js b/src/server/world/worker.js
index 456782e0..360090c1 100644
--- a/src/server/world/worker.js
+++ b/src/server/world/worker.js
@@ -5,6 +5,7 @@ global.consts = require('../config/consts');
global.instancer = require('./instancer');
global.eventManager = require('../events/events');
global.clientConfig = require('../config/clientConfig');
+global.rezoneManager = require('./rezoneManager');
const components = require('../components/components');
const mods = require('../misc/mods');
@@ -21,6 +22,8 @@ const itemEffects = require('../items/itemEffects');
const profanities = require('../misc/profanities');
const eventEmitter = require('../misc/events');
+instancer.mapName = process.argv[2];
+
let onCpnsReady = async function () {
factions.init();
skins.init();
@@ -33,6 +36,8 @@ let onCpnsReady = async function () {
recipes.init();
itemEffects.init();
profanities.init();
+ rezoneManager.init();
+
await clientConfig.init();
process.send({