From 6261de583bd20c9c7db15765a679e294a31b55fe Mon Sep 17 00:00:00 2001 From: William Makley Date: Sat, 12 Oct 2019 21:11:37 -0400 Subject: [PATCH 01/23] Fix typo (change DECK_DEFINITONS to DECK_DEFINITIONS) --- cards.js | 2 +- logic.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cards.js b/cards.js index 5e66d169..cab36daf 100644 --- a/cards.js +++ b/cards.js @@ -36,7 +36,7 @@ DECKS = , "Wind Demon": {name: "Wind Demon", class: "Wind Demon"} }; -DECK_DEFINITONS = +DECK_DEFINITIONS = [ { class: "Ancient Artillery" , cards: diff --git a/logic.js b/logic.js index bb8a9fcc..fe3abcee 100644 --- a/logic.js +++ b/logic.js @@ -2,7 +2,7 @@ var do_shuffles = true; var visible_ability_decks = []; var modifier_deck = null; -var deck_definitions = load_definition(DECK_DEFINITONS); +var deck_definitions = load_definition(DECK_DEFINITIONS); var DECK_TYPES = { From 830a6cfd8128e2d567b0d806a0ed4d647f4252a1 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sat, 12 Oct 2019 21:18:04 -0400 Subject: [PATCH 02/23] add .editorconfig --- .editorconfig | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..9e7e9fbb --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf From 643fea48c5e2e37b6e5e129d48af8c994cc3e5f0 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 08:19:15 -0400 Subject: [PATCH 03/23] apparently the line endings are crlf --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 9e7e9fbb..188673a5 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,4 +5,4 @@ indent_size = 4 indent_style = space insert_final_newline = true trim_trailing_whitespace = true -end_of_line = lf +end_of_line = crlf From 59177cf33d93db0450a8da9ba1d7573b5c400eff Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 08:21:21 -0400 Subject: [PATCH 04/23] ignore .idea --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3809d123..aadb5ada 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ _config.yml app.manifest -web.config \ No newline at end of file +web.config +.idea From b2b71aaa770cae3a51b614e60ef6083fe56e81ab Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 08:22:31 -0400 Subject: [PATCH 05/23] make crlf the default only for .js and .html --- .editorconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.editorconfig b/.editorconfig index 188673a5..3f673483 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,4 +5,7 @@ indent_size = 4 indent_style = space insert_final_newline = true trim_trailing_whitespace = true +end_of_line = lf + +[{*.js,*.html}] end_of_line = crlf From 7c62505a6845ee373c47d7074228ab4e106a5095 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 08:19:53 -0400 Subject: [PATCH 06/23] fix implicit global variable --- logic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logic.js b/logic.js index bb8a9fcc..2f162a29 100644 --- a/logic.js +++ b/logic.js @@ -159,7 +159,7 @@ function create_ability_card_front(initiative, name, shuffle, lines, attack, mov current_parent = list_item; } - text = expand_string(line.trim(), attack, move, range); + var text = expand_string(line.trim(), attack, move, range); current_parent.insertAdjacentHTML("beforeend", text); } From 7c3cee27dc98fbba3034fa9453887ea1a2535e66 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 08:19:53 -0400 Subject: [PATCH 07/23] fix implicit global variable --- logic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logic.js b/logic.js index bb8a9fcc..2f162a29 100644 --- a/logic.js +++ b/logic.js @@ -159,7 +159,7 @@ function create_ability_card_front(initiative, name, shuffle, lines, attack, mov current_parent = list_item; } - text = expand_string(line.trim(), attack, move, range); + var text = expand_string(line.trim(), attack, move, range); current_parent.insertAdjacentHTML("beforeend", text); } From 713d2e68dafe68615f5bda4f83ac9979cb27b704 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 13:06:10 -0400 Subject: [PATCH 08/23] fix more implicit globals --- ui.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ui.js b/ui.js index d90a58b4..bd7a027a 100644 --- a/ui.js +++ b/ui.js @@ -2,6 +2,7 @@ function activate_tab(tabs, pages, activetab) { + var key; for (key in tabs) { tabs[key].className = (key == activetab) ? "" : "inactive"; @@ -31,9 +32,9 @@ function init_ui() decks: document.getElementById("deckspage") }; - settingspane = document.getElementById("settingspane"); - settingsbtn = document.getElementById("settingsbtn"); - cancelarea = document.getElementById("cancelarea"); + var settingspane = document.getElementById("settingspane"); + var settingsbtn = document.getElementById("settingsbtn"); + var cancelarea = document.getElementById("cancelarea"); scenariotab.onclick = function(e) { From d32ffe63836b1d57c3ee09c8e7e5890fb0ef7720 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 16:49:10 -0400 Subject: [PATCH 09/23] WIP initial webpack implementation --- .gitignore | 1 + README.md | 4 +- .../Philosopher-Bold.ttf | Bin .../PirataOne-Gloomhaven.ttf | Bin app.webmanifest => dist/app.webmanifest | 0 {images => dist/images}/add_target.svg | 0 {images => dist/images}/air.svg | 0 {images => dist/images}/any_element.svg | 0 {images => dist/images}/aoe-4-with-black.svg | 0 .../images}/aoe-circle-with-middle-black.svg | 0 .../images}/aoe-circle-with-side-black.svg | 0 {images => dist/images}/aoe-circle.svg | 0 .../images}/aoe-line-3-with-black.svg | 0 .../images}/aoe-line-4-with-black.svg | 0 .../images}/aoe-line-6-with-black.svg | 0 .../aoe-triangle-2-side-with-black.svg | 0 .../images}/aoe-triangle-2-side.svg | 0 .../aoe-triangle-3-side-with-corner-black.svg | 0 {images => dist/images}/aoe1.svg | 0 {images => dist/images}/aoe2.svg | 0 {images => dist/images}/attack.svg | 0 {images => dist/images}/attack_mod_+0.jpg | Bin {images => dist/images}/attack_mod_+1.jpg | Bin {images => dist/images}/attack_mod_+2.jpg | Bin {images => dist/images}/attack_mod_-1.jpg | Bin {images => dist/images}/attack_mod_-2.jpg | Bin {images => dist/images}/attack_mod_2x.jpg | Bin {images => dist/images}/attack_mod_back.jpg | Bin {images => dist/images}/attack_mod_bless.jpg | Bin {images => dist/images}/attack_mod_curse.jpg | Bin {images => dist/images}/attack_mod_null.jpg | Bin {images => dist/images}/back.jpg | Bin {images => dist/images}/back.svg | 0 {images => dist/images}/bless.svg | 0 {images => dist/images}/curse.svg | 0 {images => dist/images}/dark.svg | 0 {images => dist/images}/disarm.svg | 0 {images => dist/images}/draw-two.svg | 0 {images => dist/images}/earth.svg | 0 .../images}/elderDrake.special1Area.svg | 0 {images => dist/images}/fire.svg | 0 {images => dist/images}/fly.svg | 0 {images => dist/images}/front.jpg | Bin {images => dist/images}/heal.svg | 0 {images => dist/images}/ice.svg | 0 {images => dist/images}/icon.png | Bin {images => dist/images}/immobilize.svg | 0 .../images}/inoxBodyguard.special1Area.svg | 0 {images => dist/images}/invisibility.svg | 0 {images => dist/images}/jump.svg | 0 {images => dist/images}/light.svg | 0 {images => dist/images}/loot.svg | 0 {images => dist/images}/minus-circle.svg | 0 {images => dist/images}/move.svg | 0 {images => dist/images}/muddle.svg | 0 {images => dist/images}/pierce.svg | 0 {images => dist/images}/plus-circle.svg | 0 {images => dist/images}/poison.svg | 0 {images => dist/images}/push.svg | 0 {images => dist/images}/range.svg | 0 {images => dist/images}/retaliate.svg | 0 {images => dist/images}/settings.svg | 0 {images => dist/images}/shield.svg | 0 {images => dist/images}/shuffle-black.svg | 0 {images => dist/images}/shuffle.svg | 0 .../images}/sightlessEye.special1Area.svg | 0 .../images}/sightlessEye.special2Area.svg | 0 {images => dist/images}/strengthen.svg | 0 {images => dist/images}/stun.svg | 0 {images => dist/images}/target.svg | 0 {images => dist/images}/use_element.svg | 0 {images => dist/images}/wound.svg | 0 index.html => dist/index.html | 23 +- dist/main.js | 1 + gen-manifest.sh | 2 +- package-lock.json | 3684 +++++++++++++++++ package.json | 28 + cards.css => src/cards.css | 22 +- cards.js => src/cards.js | 0 src/index.js | 7 + logic.js => src/logic.js | 2 +- macros.js => src/macros.js | 446 +- modifiers.js => src/modifiers.js | 0 monster_stats.js => src/monster_stats.js | 0 scenarios.js => src/scenarios.js | 0 style.css => src/style.css | 0 ui.js => src/ui.js | 122 +- util.js => src/util.js | 0 88 files changed, 4031 insertions(+), 311 deletions(-) rename Philosopher-Bold.ttf => dist/Philosopher-Bold.ttf (100%) rename PirataOne-Gloomhaven.ttf => dist/PirataOne-Gloomhaven.ttf (100%) rename app.webmanifest => dist/app.webmanifest (100%) rename {images => dist/images}/add_target.svg (100%) rename {images => dist/images}/air.svg (100%) rename {images => dist/images}/any_element.svg (100%) rename {images => dist/images}/aoe-4-with-black.svg (100%) rename {images => dist/images}/aoe-circle-with-middle-black.svg (100%) rename {images => dist/images}/aoe-circle-with-side-black.svg (100%) rename {images => dist/images}/aoe-circle.svg (100%) rename {images => dist/images}/aoe-line-3-with-black.svg (100%) rename {images => dist/images}/aoe-line-4-with-black.svg (100%) rename {images => dist/images}/aoe-line-6-with-black.svg (100%) rename {images => dist/images}/aoe-triangle-2-side-with-black.svg (100%) rename {images => dist/images}/aoe-triangle-2-side.svg (100%) rename {images => dist/images}/aoe-triangle-3-side-with-corner-black.svg (100%) rename {images => dist/images}/aoe1.svg (100%) rename {images => dist/images}/aoe2.svg (100%) rename {images => dist/images}/attack.svg (100%) rename {images => dist/images}/attack_mod_+0.jpg (100%) rename {images => dist/images}/attack_mod_+1.jpg (100%) rename {images => dist/images}/attack_mod_+2.jpg (100%) rename {images => dist/images}/attack_mod_-1.jpg (100%) rename {images => dist/images}/attack_mod_-2.jpg (100%) rename {images => dist/images}/attack_mod_2x.jpg (100%) rename {images => dist/images}/attack_mod_back.jpg (100%) rename {images => dist/images}/attack_mod_bless.jpg (100%) rename {images => dist/images}/attack_mod_curse.jpg (100%) rename {images => dist/images}/attack_mod_null.jpg (100%) rename {images => dist/images}/back.jpg (100%) rename {images => dist/images}/back.svg (100%) rename {images => dist/images}/bless.svg (100%) rename {images => dist/images}/curse.svg (100%) rename {images => dist/images}/dark.svg (100%) rename {images => dist/images}/disarm.svg (100%) rename {images => dist/images}/draw-two.svg (100%) rename {images => dist/images}/earth.svg (100%) rename {images => dist/images}/elderDrake.special1Area.svg (100%) rename {images => dist/images}/fire.svg (100%) rename {images => dist/images}/fly.svg (100%) rename {images => dist/images}/front.jpg (100%) rename {images => dist/images}/heal.svg (100%) rename {images => dist/images}/ice.svg (100%) rename {images => dist/images}/icon.png (100%) rename {images => dist/images}/immobilize.svg (100%) rename {images => dist/images}/inoxBodyguard.special1Area.svg (100%) rename {images => dist/images}/invisibility.svg (100%) rename {images => dist/images}/jump.svg (100%) rename {images => dist/images}/light.svg (100%) rename {images => dist/images}/loot.svg (100%) rename {images => dist/images}/minus-circle.svg (100%) rename {images => dist/images}/move.svg (100%) rename {images => dist/images}/muddle.svg (100%) rename {images => dist/images}/pierce.svg (100%) rename {images => dist/images}/plus-circle.svg (100%) rename {images => dist/images}/poison.svg (100%) rename {images => dist/images}/push.svg (100%) rename {images => dist/images}/range.svg (100%) rename {images => dist/images}/retaliate.svg (100%) rename {images => dist/images}/settings.svg (100%) rename {images => dist/images}/shield.svg (100%) rename {images => dist/images}/shuffle-black.svg (100%) rename {images => dist/images}/shuffle.svg (100%) rename {images => dist/images}/sightlessEye.special1Area.svg (100%) rename {images => dist/images}/sightlessEye.special2Area.svg (100%) rename {images => dist/images}/strengthen.svg (100%) rename {images => dist/images}/stun.svg (100%) rename {images => dist/images}/target.svg (100%) rename {images => dist/images}/use_element.svg (100%) rename {images => dist/images}/wound.svg (100%) rename index.html => dist/index.html (71%) create mode 100644 dist/main.js create mode 100644 package-lock.json create mode 100644 package.json rename cards.css => src/cards.css (94%) rename cards.js => src/cards.js (100%) create mode 100644 src/index.js rename logic.js => src/logic.js (97%) rename macros.js => src/macros.js (71%) rename modifiers.js => src/modifiers.js (100%) rename monster_stats.js => src/monster_stats.js (100%) rename scenarios.js => src/scenarios.js (100%) rename style.css => src/style.css (100%) rename ui.js => src/ui.js (94%) rename util.js => src/util.js (100%) diff --git a/.gitignore b/.gitignore index aadb5ada..da2be57a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ _config.yml app.manifest web.config .idea +node_modules diff --git a/README.md b/README.md index 91e3ef6e..e6caaffb 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ You can run it from the web directly on - - + + - - - - - - - - + + + + + + + + + - +
    diff --git a/dist/main.js b/dist/main.js new file mode 100644 index 00000000..23c287ea --- /dev/null +++ b/dist/main.js @@ -0,0 +1 @@ +!function(e){var t={};function n(i){if(t[i])return t[i].exports;var a=t[i]={i:i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(i,a,function(t){return e[t]}.bind(null,a));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t);var i=!0,a=[],s=null,r=function(e){for(var t={},n=0;n0){var _=document.createElement("span");_.className="healthElite",_.innerText="HP "+c[1],d.appendChild(_)}var m=document.createElement("span");if(m.className="initiative",m.innerText=e,d.appendChild(m),n){var f=document.createElement("img");f.src="images/shuffle.svg",d.appendChild(f)}var h=0,p=d;i=remove_empty_strings(i);for(var v=0;v=0;)E+=1,g=g.substr(1);for(var b=E-h;h!=E;)if(b>0){var k=document.createElement("ul");i.length>5&&(k.style.fontSize=100-2.5*i.length+"%"),p.appendChild(k),p=k;var S=document.createElement("li");p.appendChild(S),p=S,h+=1}else p=(p=p.parentElement).parentElement,h-=1;if(h>0&&b<=0){p=p.parentElement;S=document.createElement("li");p.appendChild(S),p=S}var C=expand_string(g.trim(),a,s,r);p.insertAdjacentHTML("beforeend",C)}return d}function _(e,t,n){var a=r[e];a.name=t,a.level=n;for(var s=JSON.parse(get_from_storage(t)),c={class:a.class,name:a.name,type:l.ABILITY,draw_pile:[],discard:[],move:[0,0],attack:[0,0],range:[0,0],level:a.level,health:[0,0]},_=0;_0){var e=this.discard[this.discard.length-1],t=e.starting_lines,n=[];if(this.is_boss()){var i=[];t.forEach((function(e){i=i.concat(special_to_lines(e,c.special1,c.special2))})),t=i,this.immunities&&(n=n.concat(immunities_to_lines(this.immunities))),this.notes&&(n=n.concat(notes_to_lines(this.notes)))}else this.attributes&&(n=n.concat(attributes_to_lines(this.attributes)));e.paint_front_card(this.get_real_name(),t.concat(n),this.attack,this.move,this.range,this.level,this.health),e.ui.set_depth(-3),e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}f(this)},c.draw_top_card=function(){var e=this.draw_pile[0].starting_lines,t=[];if(this.is_boss()){var n=[];e.forEach((function(e){n=n.concat(special_to_lines(e,c.special1,c.special2))})),e=n,this.immunities&&(t=t.concat(immunities_to_lines(this.immunities))),this.notes&&(t=t.concat(notes_to_lines(this.notes)))}else this.attributes&&(t=t.concat(attributes_to_lines(this.attributes)));this.draw_pile[0].paint_front_card(this.get_real_name(),e.concat(t),this.attack,this.move,this.range,this.level,this.health),f(this)},c.must_reshuffle=function(){return!this.draw_pile.length||(i&&this.discard.length?this.discard[0].shuffle_next:void 0)},c.set_stats_monster=function(e){this.attack=e.attack,this.move=e.move,this.range=e.range,this.attributes=e.attributes,this.health=e.health},c.set_stats_boss=function(e){this.attack=e.attack,this.move=e.move,this.range=e.range,this.special1=e.special1,this.special2=e.special2,this.immunities=e.immunities,this.notes=e.notes,this.health=e.health},c.get_real_name=function(){return this.name?this.name:this.class},c.is_boss=function(){return this.class==DECKS.Boss.class},c.set_card_piles=function(e,t){for(var n=0;n0&&e.discard[0].ui.addClass("lift"),E(n=e.draw_pile.shift(n),pull_animation=!0),e.discard.unshift(n)}function E(e,t){e.ui.set_depth(-3),t&&e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}function b(e){e.must_reshuffle()?p(e,!0):a.forEach((function(t){t.class==e.class&&(t.draw_top_card(),g(t))})),write_to_storage(e.name,JSON.stringify(e))}function k(e){e.clean_discard_pile(),p(e,!0),document.body.dispatchEvent(new CustomEvent(c.MODIFIER_DECK_SHUFFLE_REQUIRED,{detail:{shuffle:!1}}))}function S(e){e.clean_advantage_deck(),e.must_reshuffle()?k(e):(g(e),document.body.dispatchEvent(new CustomEvent(c.MODIFIER_CARD_DRAWN,{detail:{card_type:e.discard[0].card_type,count:e.count(e.discard[0].card_type)}})),e.shuffle_end_of_round()&&document.body.dispatchEvent(new CustomEvent(c.MODIFIER_DECK_SHUFFLE_REQUIRED,{detail:{shuffle:!0}}))),write_to_storage("modifier_deck",JSON.stringify(e))}function C(e){var t;1==e.draw_pile.length?(S(e),t=e.discard[0],k(e),E(t=e.draw_pile.shift(t),pull_animation=!1),e.discard.unshift(t),S(e)):0==e.draw_pile.length?(e.clean_advantage_deck(),k(e),S(e),t=e.discard[0],S(e)):(S(e),t=e.discard[0],S(e)),e.discard[0].ui.addClass("right"),t.ui.addClass("left"),e.advantage_to_clean=!0}function y(e){return{ui:new d(function(e){var t=document.createElement("img");t.className="cover",t.src=e;var n=document.createElement("div");return n.className="card modifier front",n.appendChild(t),n}(e.image),function(){var e=document.createElement("div");return e.className="card modifier back",e}()),card_type:e.type,shuffle_next_round:e.shuffle}}function w(){s.shuffle_end_of_round()&&(s.clean_advantage_deck(),k(s)),write_to_storage("modifier_deck",JSON.stringify(s))}function T(e,t){var n=document.getElementById("tableau");document.getElementById("currentdeckslist").innerHTML="";var i=a.filter((function(n){return!t||0==e.filter((function(e){return e.name==n.name&&e.level==n.level})).length})),r=e.filter((function(e){return!t||0==a.filter((function(t){return e.name==t.name&&e.level==t.level})).length}));if(s)t||(n.removeChild(document.getElementById("modifier-container")),I(),O(n,s,t));else if(I(),O(n,s,t),t){for(var l=JSON.parse(get_from_storage("modifier_deck")),d=N("curse",l),o=N("bless",l),u=0;u-1&&a.splice(e,1),n.removeChild(l)},e.is_boss()?"Boss"!=e.get_real_name()&&e.set_stats_boss((i=e.get_real_name(),s=e.level,i=i.replace("Boss: ",""),{attack:[MONSTER_STATS.bosses[i].level[s].attack],move:[MONSTER_STATS.bosses[i].level[s].move],range:[MONSTER_STATS.bosses[i].level[s].range],special1:MONSTER_STATS.bosses[i].level[s].special1,special2:MONSTER_STATS.bosses[i].level[s].special2,immunities:MONSTER_STATS.bosses[i].level[s].immunities,notes:MONSTER_STATS.bosses[i].level[s].notes,health:[MONSTER_STATS.bosses[i].level[s].health]})):e.set_stats_monster(function(e,t){return{attack:[MONSTER_STATS.monsters[e].level[t].normal.attack,MONSTER_STATS.monsters[e].level[t].elite.attack],move:[MONSTER_STATS.monsters[e].level[t].normal.move,MONSTER_STATS.monsters[e].level[t].elite.move],range:[MONSTER_STATS.monsters[e].level[t].normal.range,MONSTER_STATS.monsters[e].level[t].elite.range],attributes:[MONSTER_STATS.monsters[e].level[t].normal.attributes,MONSTER_STATS.monsters[e].level[t].elite.attributes],health:[MONSTER_STATS.monsters[e].level[t].normal.health,MONSTER_STATS.monsters[e].level[t].elite.health]}}(e.get_real_name(),e.level)),p(e),t?e.draw_top_discard():f(e),a.push(e);var c=document.getElementById("currentdeckslist"),d=document.createElement("li");d.className="currentdeck",c.appendChild(d);var o=document.createElement("a");o.id="switch-"+r,o.href="#switch-"+r,o.innerText=e.get_real_name(),o.title="Click to show/hide deck",o.addEventListener("click",(function(e){var t=document.getElementById(this.id.replace("switch-",""));t.className="hiddendeck"==t.className?"card-container":"hiddendeck"}),!1),d.appendChild(o)})),h()}function I(){s=function(){var e={name:"Monster modifier deck",type:l.MODIFIER,draw_pile:[],discard:[],advantage_to_clean:!1,draw_top_discard:function(){if(this.discard.length>0){var e=this.discard[this.discard.length-1];e.ui.set_depth(-3),e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}f(this)}};e.count=function(e){return this.draw_pile.filter((function(t){return t.card_type===e})).length}.bind(e),e.remove_card=function(t){for(var n=0;n0}.bind(e),e.must_reshuffle=function(){return!this.draw_pile.length}.bind(e),e.clean_discard_pile=function(){for(var t=0;t7?7:this.spinner.value},n.set_value=function(e){this.spinner.value=e>7?7:e},n}function x(){var e={};e.ul=document.createElement("ul"),e.ul.className="selectionlist",e.checkboxes={},e.level_selectors={},e.global_level_selector=null;var t=document.createElement("li"),n=new R("Select global level ",!0);t.appendChild(n.html),e.global_level_selector=n;var i=create_input("button","applylevel","Apply All","");for(key in i.input.onclick=function(){for(key in e.level_selectors)e.level_selectors[key].set_value(e.global_level_selector.get_selection())},t.appendChild(i.root),e.ul.appendChild(t),DECKS){var a=DECKS[key].name;t=document.createElement("li"),i=create_input("checkbox","deck",a,a);t.appendChild(i.root);var s=new R(" with level ",!0);t.appendChild(s.html),e.ul.appendChild(t),e.checkboxes[a]=i.input,e.level_selectors[a]=s}return e.get_selection=function(){return dict_values(this.checkboxes).filter(is_checked).map(input_value)},e.get_selected_decks=function(){var t=this.get_selection();return concat_arrays(t.map(function(t){var n=t in DECKS?DECKS[t]:[];return n.level=e.level_selectors[t].get_selection(),n}.bind(this)))},e.set_selection=function(t){dict_values(this.checkboxes).forEach((function(e){e.checked=!1})),t.forEach(function(t){var n=this.checkboxes[t.name];n&&(n.checked=!0,e.level_selectors[t.name].set_value(t.level))}.bind(this))},e}function D(e){var t={};t.ul=document.createElement("ul"),t.ul.className="selectionlist",t.spinner=null,t.decks={},t.special_rules={},t.level_selector=null,t.level_selector=new R("Select level",!1),t.ul.appendChild(t.level_selector.html);for(var n=0;n=0&&e==SPECIAL_RULES.living_corpse_two_levels_extra.affected_deck?Math.min(7,parseInt(i)+parseInt(SPECIAL_RULES.living_corpse_two_levels_extra.extra_levels)):i},t.get_scenario_decks=function(){return this.decks[this.get_selection()].map((function(e){return DECKS[e.name]?e.class=DECKS[e.name].class:-1!=e.name.indexOf("Boss")&&(e.class=DECKS.Boss.class),e.level=t.get_level(e.name,t.get_special_rules()),e}))},t.get_special_rules=function(){return this.special_rules[this.get_selection()]},t}function M(e,t,n){var i;for(i in e)e[i].className=i==n?"":"inactive";for(i in t)t[i].className=i==n?"tabbody":"inactive tabbody"}function A(e,t,n){e.className=n?"pane":"pane inactive",t.style.display=n?"initial":"none"}document.addEventListener("DOMContentLoaded",(function(){var e,t,n,i,s,r,l,c;e=document.getElementById("deckspage"),t=document.getElementById("scenariospage"),n=document.getElementById("applydecks"),i=document.getElementById("applyscenario"),s=document.getElementById("applyload"),r=document.getElementById("showmodifierdeck"),l=new x,c=new D(SCENARIO_DEFINITIONS),e.insertAdjacentElement("afterbegin",l.ul),t.insertAdjacentElement("afterbegin",c.ul),n.onclick=function(){localStorage.clear();var e=l.get_selected_decks();write_to_storage("selected_deck_names",JSON.stringify(e)),T(e.map((function(e){return _(e.class,e.name,e.level)})),!0);var t=document.getElementById("showmodifierdeck-deckspage"),n=document.getElementById("modifier-container");t.checked?n.style.display="block":n.style.display="none"},i.onclick=function(){try{localStorage.clear()}catch(e){return void console.error("Local storage is required")}var e=c.get_scenario_decks();write_to_storage("selected_deck_names",JSON.stringify(e)),l.set_selection(e),T(e.map((function(e){return _(e.class,e.name,e.level)})),!1);var t=document.getElementById("modifier-container");r.checked?t.style.display="block":t.style.display="none",show_settingspane(settingspane,cancelarea,!1)},s.onclick=function(){var e=JSON.parse(get_from_storage("selected_deck_names"));l.set_selection(e),T(e.map((function(e){return _(e.class,e.name,e.level)})),!0);var t=document.getElementById("modifier-container");r.checked?t.style.display="block":t.style.display="none"},window.onresize=h.bind(null,a),function(){var e={scenarios:document.getElementById("scenariotab"),decks:document.getElementById("deckstab")},t={scenarios:document.getElementById("scenariospage"),decks:document.getElementById("deckspage")},n=document.getElementById("settingspane"),i=document.getElementById("settingsbtn"),a=document.getElementById("cancelarea");scenariotab.onclick=function(n){M(e,t,"scenarios")},deckstab.onclick=function(n){M(e,t,"decks")},i.onclick=function(e){A(n,a,!0)},a.onclick=function(e){A(n,a,!1)},M(e,t,"scenarios")}()}))}]); \ No newline at end of file diff --git a/gen-manifest.sh b/gen-manifest.sh index f27c8296..ee931e4b 100755 --- a/gen-manifest.sh +++ b/gen-manifest.sh @@ -12,5 +12,5 @@ git ls-tree --full-tree -r --name-only HEAD | grep -v \ -e app.manifest \ -e gen-manifest.sh \ -e README.md \ - | sort >> app.manifest + | sort >> dist/app.manifest diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..4cce1f8c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3684 @@ +{ + "name": "gloomycompanion", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "bluebird": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", + "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "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" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "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, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "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==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "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==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "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=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "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 + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "optional": true, + "requires": { + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "optional": true + } + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "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" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "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==" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "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=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "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==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "terser": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.8.tgz", + "integrity": "sha512-otmIRlRVmLChAWsnSFNO0Bfk6YySuBp6G9qrHiJwlLDd4mxe2ta4sjI7TzIR+W1nBMjilzrMcPOz9pSusgx3hQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "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==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.1.tgz", + "integrity": "sha512-ak7u4tUu/U63sCVxA571IuPZO/Q0pZ9cEXKg+R/woxkDzVovq57uB6L2Hlg/pC8LCU+TWpvtcYwsstivQwMJmw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + } + }, + "webpack-cli": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.9.tgz", + "integrity": "sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..f58211f0 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "gloomycompanion", + "version": "1.0.0", + "description": "This is a web-app for managing the monster ability decks in the board game [Gloomhaven](https://boardgamegeek.com/boardgame/174430/gloomhaven)", + "private": true, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/wmakley/gloomycompanion.git" + }, + "keywords": [ + "Gloomhaven" + ], + "author": "William Makley", + "license": "ISC", + "bugs": { + "url": "https://github.com/wmakley/gloomycompanion/issues" + }, + "homepage": "https://github.com/wmakley/gloomycompanion#readme", + "dependencies": { + "webpack": "^4.41.1" + }, + "devDependencies": { + "webpack-cli": "^3.3.9" + } +} diff --git a/cards.css b/src/cards.css similarity index 94% rename from cards.css rename to src/cards.css index bf321fe6..2f321f8b 100644 --- a/cards.css +++ b/src/cards.css @@ -2,13 +2,13 @@ @font-face { font-family: Philosopher; - src: url(Philosopher-Bold.ttf); + src: url(../dist/Philosopher-Bold.ttf); } @font-face { font-family: PirataOne; - src: url(PirataOne-Gloomhaven.ttf); + src: url(../dist/PirataOne-Gloomhaven.ttf); } @media only screen and (min-height: 500px) and (orientation: portrait) { @@ -100,19 +100,19 @@ .background.curse { - background-image: url(images/curse.svg); + background-image: url(../dist/images/curse.svg); } .background.bless { - background-image: url(images/bless.svg); + background-image: url(../dist/images/bless.svg); } .counter-icon.shuffle { background-repeat: no-repeat; background-position: center center; - background-image: url(images/shuffle-black.svg); + background-image: url(../dist/images/shuffle-black.svg); background-size: 50%; cursor: pointer; @@ -153,14 +153,14 @@ { opacity: 0.7; text-indent: -999em; - background: url(images/plus-circle.svg) center center no-repeat; + background: url(../dist/images/plus-circle.svg) center center no-repeat; } .decrement.button { opacity: 0.7; text-indent: -999em; - background: url(images/minus-circle.svg) center center no-repeat; + background: url(../dist/images/minus-circle.svg) center center no-repeat; } .draw-two.button @@ -173,7 +173,7 @@ background-repeat: no-repeat; background-position: center center; background-size: 50%; - background-image: url(images/draw-two.svg); + background-image: url(../dist/images/draw-two.svg); cursor: pointer; } @@ -317,17 +317,17 @@ .card.ability.front { - background-image: url(images/front.jpg); + background-image: url(../dist/images/front.jpg); } .card.ability.back { - background-image: url(images/back.jpg); + background-image: url(../dist/images/back.jpg); } .card.modifier.back { - background-image: url(images/attack_mod_back.jpg); + background-image: url(../dist/images/attack_mod_back.jpg); } .card.modifier.front img.cover diff --git a/cards.js b/src/cards.js similarity index 100% rename from cards.js rename to src/cards.js diff --git a/src/index.js b/src/index.js new file mode 100644 index 00000000..7deea64c --- /dev/null +++ b/src/index.js @@ -0,0 +1,7 @@ +import { init } from './logic.js' +import { init_ui } from './ui.js' + +document.addEventListener('DOMContentLoaded', function () { + init() + init_ui() +}) diff --git a/logic.js b/src/logic.js similarity index 97% rename from logic.js rename to src/logic.js index fd8fcf79..f2c42e73 100644 --- a/logic.js +++ b/src/logic.js @@ -1122,7 +1122,7 @@ function ScenarioList(scenarios) { return scenariolist; } -function init() { +export function init() { var deckspage = document.getElementById("deckspage"); var scenariospage = document.getElementById("scenariospage"); var applydeckbtn = document.getElementById("applydecks"); diff --git a/macros.js b/src/macros.js similarity index 71% rename from macros.js rename to src/macros.js index 1c743d19..f53e8748 100644 --- a/macros.js +++ b/src/macros.js @@ -1,223 +1,223 @@ -/* Macros used in card text, alphabetical order */ -MACROS = - { "%air%": "" - , "%any%": "" - , "%aoe-4-with-black%": "" - , "%aoe-circle%": "
    " - , "%aoe-circle-with-middle-black%": "
    " - , "%aoe-circle-with-side-black%": "" - , "%aoe-line-3-with-black%": "
    " - , "%aoe-line-4-with-black%": "
    " - , "%aoe-line-6-with-black%": "
" - , "%aoe-triangle-2-side%": "
" - , "%aoe-triangle-2-side-with-black%": "
" - , "%aoe-triangle-3-side-with-corner-black%": "
" - , "%attack%": "Attack " - , "%bless%": "BLESS " - , "%boss-aoe-elder-drake-sp1%": "
" - , "%boss-aoe-inox-bodyguard-sp1%": "
" - , "%boss-aoe-sightless-eye-sp1%": "
" - , "%boss-aoe-sightless-eye-sp2%": "
" - , "%curse%": "CURSE " - , "%dark%": "" - , "%disarm%": "DISARM " - , "%earth%": "" - , "%fire%": "" - , "%heal%": "Heal " - , "%ice%": "" - , "%immobilize%": "IMMOBILIZE " - , "%invisible%": "INVISIBLE " - , "%jump%": "Jump " - , "%light%": "" - , "%loot%": "Loot " - , "%move%": "Move " - , "%muddle%": "MUDDLE " - , "%pierce%": "PIERCE " - , "%poison%": "POISON " - , "%pull%": "PULL " - , "%push%": "PUSH " - , "%range%": "Range " - , "%retaliate%": "Retaliate " - , "%shield%": "Shield " - , "%flying%": "" - , "%strengthen%": "STRENGTHEN " - , "%stun%": "STUN " - , "%target%": "Target " - , "%use_element%": "" - , "%wound%": "WOUND " - }; - -function expand_macro(macro) -{ - var key = macro.toLowerCase(); - if (key in MACROS) - { - return MACROS[key]; - } - else - { - return macro; - } -} - -function expand_stat(s, stat, value) -{ - var re = new RegExp("%" + stat + "% (\\+|-)(\\d*)", "g"); - var line_parsed = re.exec(s); - - var has_elite_value = (value.length == 2); - var normal_attack = value[0]; - //Check in case of bosses with text in the attack (C+1) - re = new RegExp("(\\d*)(\\+|-)?([a-zA-Z]+)", "i"); - var extra_text_for_particular_bosses = ""; - var value_parsed = re.exec(String(normal_attack)); - if (value_parsed && value_parsed[3]) - { - var symbol = (value_parsed[2] == "-") ? "-" : "+"; - extra_text_for_particular_bosses = value_parsed[3] + symbol; - normal_attack = (value_parsed[1] !== "") ? parseInt(value_parsed[1]) : 0; - } - - if (line_parsed) { - if (line_parsed[1] === "+") - { - var value_normal = normal_attack + parseInt(line_parsed[2]); - if (has_elite_value) - { - var value_elite = value[1] + parseInt(line_parsed[2]); - return ("%" + stat + "% " + value_normal + " / " + value_elite + ""); - } else - { - return ("%" + stat + "% " + extra_text_for_particular_bosses + value_normal); - } - } else if (line_parsed[1] === "-") - { - var value_normal = normal_attack - parseInt(line_parsed[2]); - if (has_elite_value) - { - var value_elite = value[1] - parseInt(line_parsed[2]); - return ("%" + stat + "% " + value_normal + " / " + value_elite + ""); - } else - { - return ("%" + stat + "% " + extra_text_for_particular_bosses + value_normal); - } - } - } - - return s; -} - -function attributes_to_lines(attributes) -{ - if (!attributes || (attributes[0].length == 0 && attributes[1].length == 0)) - { - return []; - } else - { - // To make it more readable, group 3 elements in the same row abd naje them small - var attributes_lines = ["* Attributes"]; - - // Write common attributes in white - var normal_attributes_lines = []; - var line = 0; - for (var i=0; i" + line.replace(/(,\s$)/g, "") + "" : "";})); - } -} - -function immunities_to_lines(immunities) -{ - if (!immunities) - { - return []; - } else - { - // To make it more readable, group 3 elements in the same row abd naje them small - var immunities_lines = []; - var line = 0; - for (var i=0; i" + line.replace(/(,\s$)/g, "") + ""})); - } -} - -function notes_to_lines(notes) -{ - return ["* Notes: " + notes + ""]; -} - -function expand_special(s, special_value) -{ - var value = ""; - - return special_value.map(function(line){ - return ("* " + line); - }); -} - -function special_to_lines(s, special1, special2) -{ - if (special1 && s.indexOf("Special 1") !== -1) - { - s = expand_special(s, special1); - } - if (special1 && s.indexOf("Special 2") !== -1) - { - s = expand_special(s, special2); - } - - return s; -} - -function expand_string(s, attack, move, range) -{ - var re = new RegExp("%(attack|move|range)% (\\+|-)(\\d*)", "g"); - - while (found = re.exec(s)) - { - if (found[1] === "attack") - { - s = s.replace(found[0], expand_stat(found[0], "attack", attack)); - } else if (found[1] === "move") - { - s = s.replace(found[0], expand_stat(found[0], "move", move)); - } else if (found[1] === "range") - { - s = s.replace(found[0], expand_stat(found[0], "range", range)); - } - } - - return s.replace(/%[^%]*%/gi, expand_macro); -} +/* Macros used in card text, alphabetical order */ +MACROS = + { "%air%": "" + , "%any%": "" + , "%aoe-4-with-black%": "" + , "%aoe-circle%": "
" + , "%aoe-circle-with-middle-black%": "
" + , "%aoe-circle-with-side-black%": "" + , "%aoe-line-3-with-black%": "
" + , "%aoe-line-4-with-black%": "
" + , "%aoe-line-6-with-black%": "
" + , "%aoe-triangle-2-side%": "
" + , "%aoe-triangle-2-side-with-black%": "
" + , "%aoe-triangle-3-side-with-corner-black%": "
" + , "%attack%": "Attack " + , "%bless%": "BLESS " + , "%boss-aoe-elder-drake-sp1%": "
" + , "%boss-aoe-inox-bodyguard-sp1%": "
" + , "%boss-aoe-sightless-eye-sp1%": "
" + , "%boss-aoe-sightless-eye-sp2%": "
" + , "%curse%": "CURSE " + , "%dark%": "" + , "%disarm%": "DISARM " + , "%earth%": "" + , "%fire%": "" + , "%heal%": "Heal " + , "%ice%": "" + , "%immobilize%": "IMMOBILIZE " + , "%invisible%": "INVISIBLE " + , "%jump%": "Jump " + , "%light%": "" + , "%loot%": "Loot " + , "%move%": "Move " + , "%muddle%": "MUDDLE " + , "%pierce%": "PIERCE " + , "%poison%": "POISON " + , "%pull%": "PULL " + , "%push%": "PUSH " + , "%range%": "Range " + , "%retaliate%": "Retaliate " + , "%shield%": "Shield " + , "%flying%": "" + , "%strengthen%": "STRENGTHEN " + , "%stun%": "STUN " + , "%target%": "Target " + , "%use_element%": "" + , "%wound%": "WOUND " + }; + +function expand_macro(macro) +{ + var key = macro.toLowerCase(); + if (key in MACROS) + { + return MACROS[key]; + } + else + { + return macro; + } +} + +function expand_stat(s, stat, value) +{ + var re = new RegExp("%" + stat + "% (\\+|-)(\\d*)", "g"); + var line_parsed = re.exec(s); + + var has_elite_value = (value.length == 2); + var normal_attack = value[0]; + //Check in case of bosses with text in the attack (C+1) + re = new RegExp("(\\d*)(\\+|-)?([a-zA-Z]+)", "i"); + var extra_text_for_particular_bosses = ""; + var value_parsed = re.exec(String(normal_attack)); + if (value_parsed && value_parsed[3]) + { + var symbol = (value_parsed[2] == "-") ? "-" : "+"; + extra_text_for_particular_bosses = value_parsed[3] + symbol; + normal_attack = (value_parsed[1] !== "") ? parseInt(value_parsed[1]) : 0; + } + + if (line_parsed) { + if (line_parsed[1] === "+") + { + var value_normal = normal_attack + parseInt(line_parsed[2]); + if (has_elite_value) + { + var value_elite = value[1] + parseInt(line_parsed[2]); + return ("%" + stat + "% " + value_normal + " / " + value_elite + ""); + } else + { + return ("%" + stat + "% " + extra_text_for_particular_bosses + value_normal); + } + } else if (line_parsed[1] === "-") + { + var value_normal = normal_attack - parseInt(line_parsed[2]); + if (has_elite_value) + { + var value_elite = value[1] - parseInt(line_parsed[2]); + return ("%" + stat + "% " + value_normal + " / " + value_elite + ""); + } else + { + return ("%" + stat + "% " + extra_text_for_particular_bosses + value_normal); + } + } + } + + return s; +} + +function attributes_to_lines(attributes) +{ + if (!attributes || (attributes[0].length == 0 && attributes[1].length == 0)) + { + return []; + } else + { + // To make it more readable, group 3 elements in the same row abd naje them small + var attributes_lines = ["* Attributes"]; + + // Write common attributes in white + var normal_attributes_lines = []; + var line = 0; + for (var i=0; i" + line.replace(/(,\s$)/g, "") + "" : "";})); + } +} + +function immunities_to_lines(immunities) +{ + if (!immunities) + { + return []; + } else + { + // To make it more readable, group 3 elements in the same row abd naje them small + var immunities_lines = []; + var line = 0; + for (var i=0; i" + line.replace(/(,\s$)/g, "") + ""})); + } +} + +function notes_to_lines(notes) +{ + return ["* Notes: " + notes + ""]; +} + +function expand_special(s, special_value) +{ + var value = ""; + + return special_value.map(function(line){ + return ("* " + line); + }); +} + +function special_to_lines(s, special1, special2) +{ + if (special1 && s.indexOf("Special 1") !== -1) + { + s = expand_special(s, special1); + } + if (special1 && s.indexOf("Special 2") !== -1) + { + s = expand_special(s, special2); + } + + return s; +} + +function expand_string(s, attack, move, range) +{ + var re = new RegExp("%(attack|move|range)% (\\+|-)(\\d*)", "g"); + + while (found = re.exec(s)) + { + if (found[1] === "attack") + { + s = s.replace(found[0], expand_stat(found[0], "attack", attack)); + } else if (found[1] === "move") + { + s = s.replace(found[0], expand_stat(found[0], "move", move)); + } else if (found[1] === "range") + { + s = s.replace(found[0], expand_stat(found[0], "range", range)); + } + } + + return s.replace(/%[^%]*%/gi, expand_macro); +} diff --git a/modifiers.js b/src/modifiers.js similarity index 100% rename from modifiers.js rename to src/modifiers.js diff --git a/monster_stats.js b/src/monster_stats.js similarity index 100% rename from monster_stats.js rename to src/monster_stats.js diff --git a/scenarios.js b/src/scenarios.js similarity index 100% rename from scenarios.js rename to src/scenarios.js diff --git a/style.css b/src/style.css similarity index 100% rename from style.css rename to src/style.css diff --git a/ui.js b/src/ui.js similarity index 94% rename from ui.js rename to src/ui.js index bd7a027a..959f4c81 100644 --- a/ui.js +++ b/src/ui.js @@ -1,62 +1,60 @@ - - -function activate_tab(tabs, pages, activetab) -{ - var key; - for (key in tabs) - { - tabs[key].className = (key == activetab) ? "" : "inactive"; - } - for (key in pages) - { - pages[key].className = (key == activetab) ? "tabbody" : "inactive tabbody"; - } -} - -function show_settingspane(pane, cancelarea, show) -{ - pane.className = show ? "pane" : "pane inactive"; - cancelarea.style.display = show ? "initial" : "none"; -} - -function init_ui() -{ - var tabs = - { - scenarios: document.getElementById("scenariotab"), - decks: document.getElementById("deckstab") - }; - var pages = - { - scenarios: document.getElementById("scenariospage"), - decks: document.getElementById("deckspage") - }; - - var settingspane = document.getElementById("settingspane"); - var settingsbtn = document.getElementById("settingsbtn"); - var cancelarea = document.getElementById("cancelarea"); - - scenariotab.onclick = function(e) - { - activate_tab(tabs, pages, "scenarios"); - } - - deckstab.onclick = function(e) - { - activate_tab(tabs, pages, "decks"); - } - - settingsbtn.onclick = function(e) - { - show_settingspane(settingspane, cancelarea, true); - } - - cancelarea.onclick = function(e) - { - show_settingspane(settingspane, cancelarea, false); - } - - activate_tab(tabs, pages, "scenarios"); - -} - + +function activate_tab(tabs, pages, activetab) +{ + var key; + for (key in tabs) + { + tabs[key].className = (key == activetab) ? "" : "inactive"; + } + for (key in pages) + { + pages[key].className = (key == activetab) ? "tabbody" : "inactive tabbody"; + } +} + +function show_settingspane(pane, cancelarea, show) +{ + pane.className = show ? "pane" : "pane inactive"; + cancelarea.style.display = show ? "initial" : "none"; +} + +export function init_ui() +{ + var tabs = + { + scenarios: document.getElementById("scenariotab"), + decks: document.getElementById("deckstab") + }; + var pages = + { + scenarios: document.getElementById("scenariospage"), + decks: document.getElementById("deckspage") + }; + + var settingspane = document.getElementById("settingspane"); + var settingsbtn = document.getElementById("settingsbtn"); + var cancelarea = document.getElementById("cancelarea"); + + scenariotab.onclick = function(e) + { + activate_tab(tabs, pages, "scenarios"); + } + + deckstab.onclick = function(e) + { + activate_tab(tabs, pages, "decks"); + } + + settingsbtn.onclick = function(e) + { + show_settingspane(settingspane, cancelarea, true); + } + + cancelarea.onclick = function(e) + { + show_settingspane(settingspane, cancelarea, false); + } + + activate_tab(tabs, pages, "scenarios"); + +} diff --git a/util.js b/src/util.js similarity index 100% rename from util.js rename to src/util.js From 50dbbcee84c67bf26872c5c7e8d797dc6e0c7cc9 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 08:19:53 -0400 Subject: [PATCH 10/23] fix implicit global variables --- logic.js | 6 +++--- ui.js | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/logic.js b/logic.js index bb8a9fcc..482e47ad 100644 --- a/logic.js +++ b/logic.js @@ -159,7 +159,7 @@ function create_ability_card_front(initiative, name, shuffle, lines, attack, mov current_parent = list_item; } - text = expand_string(line.trim(), attack, move, range); + var text = expand_string(line.trim(), attack, move, range); current_parent.insertAdjacentHTML("beforeend", text); } @@ -421,7 +421,7 @@ function flip_up_top_card(deck) { } var card = deck.draw_pile.shift(card); - send_to_discard(card, pull_animation = true); + send_to_discard(card, true); deck.discard.unshift(card); } @@ -507,7 +507,7 @@ function double_draw(deck) { advantage_card = deck.discard[0]; reshuffle_modifier_deck(deck); advantage_card = deck.draw_pile.shift(advantage_card); - send_to_discard(advantage_card, pull_animation = false); + send_to_discard(advantage_card, false); deck.discard.unshift(advantage_card); draw_modifier_card(deck); } diff --git a/ui.js b/ui.js index d90a58b4..bd7a027a 100644 --- a/ui.js +++ b/ui.js @@ -2,6 +2,7 @@ function activate_tab(tabs, pages, activetab) { + var key; for (key in tabs) { tabs[key].className = (key == activetab) ? "" : "inactive"; @@ -31,9 +32,9 @@ function init_ui() decks: document.getElementById("deckspage") }; - settingspane = document.getElementById("settingspane"); - settingsbtn = document.getElementById("settingsbtn"); - cancelarea = document.getElementById("cancelarea"); + var settingspane = document.getElementById("settingspane"); + var settingsbtn = document.getElementById("settingsbtn"); + var cancelarea = document.getElementById("cancelarea"); scenariotab.onclick = function(e) { From ab6cb218a4fd2be956370b639a6e52572670482e Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 16:53:20 -0400 Subject: [PATCH 11/23] avoid variable re-declaration May be controversial. I would use the original style with let and const, not with var. --- logic.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/logic.js b/logic.js index 482e47ad..12c66ff8 100644 --- a/logic.js +++ b/logic.js @@ -335,12 +335,14 @@ function load_ability_deck(deck_class, deck_name, level) { } function place_deck(deck, container) { - for (var i = 0; i < deck.draw_pile.length; i++) { - var card = deck.draw_pile[i]; + var i; + var card; + for (i = 0; i < deck.draw_pile.length; i++) { + card = deck.draw_pile[i]; card.ui.attach(container); } - for (var i = 0; i < deck.discard.length; i++) { - var card = deck.discard[i]; + for (i = 0; i < deck.discard.length; i++) { + card = deck.discard[i]; card.ui.attach(container); } deck.deck_space = container; From 33e2dd2591b23ce0322045ac2a40b5f9c7df54ea Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 17:00:45 -0400 Subject: [PATCH 12/23] shift does not take any arguments --- logic.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/logic.js b/logic.js index 12c66ff8..0f249156 100644 --- a/logic.js +++ b/logic.js @@ -422,7 +422,7 @@ function flip_up_top_card(deck) { deck.discard[0].ui.addClass("lift"); } - var card = deck.draw_pile.shift(card); + var card = deck.draw_pile.shift(); send_to_discard(card, true); deck.discard.unshift(card); } @@ -508,7 +508,7 @@ function double_draw(deck) { draw_modifier_card(deck); advantage_card = deck.discard[0]; reshuffle_modifier_deck(deck); - advantage_card = deck.draw_pile.shift(advantage_card); + advantage_card = deck.draw_pile.shift(); send_to_discard(advantage_card, false); deck.discard.unshift(advantage_card); draw_modifier_card(deck); From ad971bcb99ab9a63ef5557de6fe0f8ef4122ba13 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 17:19:03 -0400 Subject: [PATCH 13/23] fix more implicit variable re-declaration --- logic.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/logic.js b/logic.js index 0f249156..716938a6 100644 --- a/logic.js +++ b/logic.js @@ -317,12 +317,13 @@ function load_ability_deck(deck_class, deck_name, level) { } deck.set_card_piles = function (draw_pile, discard_pile) { - for (var i = 0; i < draw_pile.length; i++) { + var i; + for (i = 0; i < draw_pile.length; i++) { this.draw_pile[i].shuffle_next = draw_pile[i].shuffle_next; this.draw_pile[i].initiative = draw_pile[i].initiative; this.draw_pile[i].starting_lines = draw_pile[i].starting_lines; } - for (var i = 0; i < discard_pile.length; i++) { + for (i = 0; i < discard_pile.length; i++) { this.discard[i].shuffle_next = discard_pile[i].shuffle_next; this.discard[i].initiative = discard_pile[i].initiative; this.discard[i].starting_lines = discard_pile[i].starting_lines; @@ -411,8 +412,9 @@ function shuffle_deck(deck, include_discards) { } function flip_up_top_card(deck) { + var card; for (var i = 0; i < deck.discard.length; i++) { - var card = deck.discard[i]; + card = deck.discard[i]; card.ui.removeClass("lift"); card.ui.removeClass("pull"); card.ui.push_down(); @@ -422,7 +424,7 @@ function flip_up_top_card(deck) { deck.discard[0].ui.addClass("lift"); } - var card = deck.draw_pile.shift(); + card = deck.draw_pile.shift(); send_to_discard(card, true); deck.discard.unshift(card); } @@ -1004,6 +1006,7 @@ function DeckList() { var dom_dict = create_input("button", "applylevel", "Apply All", ""); dom_dict.input.onclick = function () { + var key; for (key in decklist.level_selectors) { decklist.level_selectors[key].set_value(decklist.global_level_selector.get_selection()); } @@ -1012,6 +1015,7 @@ function DeckList() { decklist.ul.appendChild(listitem); + var key; for (key in DECKS) { var real_name = DECKS[key].name; var listitem = document.createElement("li"); From 4b9f3b78f0df086673064cef58dd4ed09866fd66 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 13 Oct 2019 17:19:25 -0400 Subject: [PATCH 14/23] fix typo --- logic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logic.js b/logic.js index 716938a6..9d2a525e 100644 --- a/logic.js +++ b/logic.js @@ -583,7 +583,7 @@ function load_modifier_deck() { deck.add_card = function (card_type) { // Rulebook p. 23: "a maximum of only 10 curse [and 10 bless] cards can be placed into any one deck" if (this.count(card_type) < 10) { - // TOOD: Brittle + // TODO: Brittle deck.draw_pile.push(define_modifier_card(MODIFIER_CARDS[card_type.toUpperCase()])); force_repaint_deck(deck); From c4c9114195d3c2d6cc74b698e34ba1ddfbe08186 Mon Sep 17 00:00:00 2001 From: William Makley Date: Mon, 14 Oct 2019 09:31:28 -0400 Subject: [PATCH 15/23] replace all == with === to avoid accidental type coercion --- logic.js | 34 +++++++++++++++++----------------- ui.js | 4 ++-- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/logic.js b/logic.js index 9d2a525e..d7a2ebcc 100644 --- a/logic.js +++ b/logic.js @@ -120,7 +120,7 @@ function create_ability_card_front(initiative, name, shuffle, lines, attack, mov } var diff = new_depth - current_depth; - while (current_depth != new_depth) { + while (current_depth !== new_depth) { if (diff > 0) { // Need one level lower, create
    var list = document.createElement("ul"); @@ -313,7 +313,7 @@ function load_ability_deck(deck_class, deck_name, level) { } deck.is_boss = function () { - return this.class == DECKS["Boss"].class; + return this.class === DECKS["Boss"].class; } deck.set_card_piles = function (draw_pile, discard_pile) { @@ -380,7 +380,7 @@ function reshuffle(deck, include_discards) { // This way we keep sync several decks from the same class visible_ability_decks.forEach(function (visible_deck) { - if ((visible_deck !== deck) && (visible_deck.class == deck.class)) { + if ((visible_deck !== deck) && (visible_deck.class === deck.class)) { var real_name = visible_deck.get_real_name(); shuffle_deck(visible_deck, include_discards); visible_deck.set_card_piles(deck.draw_pile, deck.discard); @@ -449,7 +449,7 @@ function draw_ability_card(deck) { } else { visible_ability_decks.forEach(function (visible_deck) { - if (visible_deck.class == deck.class) { + if (visible_deck.class === deck.class) { visible_deck.draw_top_card(); flip_up_top_card(visible_deck); } @@ -506,7 +506,7 @@ function double_draw(deck) { // Case there was 1 card in draw_pile when we clicked "draw 2". // now we should draw, save that card, reshuffle, and // draw the next - if (deck.draw_pile.length == 1) { + if (deck.draw_pile.length === 1) { draw_modifier_card(deck); advantage_card = deck.discard[0]; reshuffle_modifier_deck(deck); @@ -518,7 +518,7 @@ function double_draw(deck) { // Case there were 0 cards in draw_pile when we clicked "draw 2". // we should reshuffle, draw 1 and send it to advantage_place, // draw the next - else if (deck.draw_pile.length == 0) { + else if (deck.draw_pile.length === 0) { // This is in case the previous draw was double as well deck.clean_advantage_deck(); reshuffle_modifier_deck(deck); @@ -567,7 +567,7 @@ function load_modifier_deck() { deck.remove_card = function (card_type) { for (var i = 0; i < deck.draw_pile.length; i++) { - if (deck.draw_pile[i].card_type == card_type) { + if (deck.draw_pile[i].card_type === card_type) { deck.draw_pile.splice(i, 1); reshuffle(deck, false); @@ -606,8 +606,8 @@ function load_modifier_deck() { deck.clean_discard_pile = function () { for (var i = 0; i < deck.discard.length; i++) { - if (this.discard[i].card_type == CARD_TYPES_MODIFIER.BLESS - || this.discard[i].card_type == CARD_TYPES_MODIFIER.CURSE) { + if (this.discard[i].card_type === CARD_TYPES_MODIFIER.BLESS + || this.discard[i].card_type === CARD_TYPES_MODIFIER.CURSE) { //Delete this curse/bless that has been used this.discard.splice(i, 1); i--; @@ -749,14 +749,14 @@ function apply_deck_selection(decks, preserve_existing_deck_state) { document.getElementById("currentdeckslist").innerHTML = ""; var decks_to_remove = visible_ability_decks.filter(function (visible_deck) { return !preserve_existing_deck_state || (decks.filter(function (deck) { - return ((deck.name == visible_deck.name) && (deck.level == visible_deck.level)) - }).length == 0); + return ((deck.name === visible_deck.name) && (deck.level === visible_deck.level)) + }).length === 0); }); var decks_to_add = decks.filter(function (deck) { return !preserve_existing_deck_state || (visible_ability_decks.filter(function (visible_deck) { - return ((deck.name == visible_deck.name) && (deck.level == visible_deck.level)) - }).length == 0); + return ((deck.name === visible_deck.name) && (deck.level === visible_deck.level)) + }).length === 0); }); if (!modifier_deck) { @@ -820,7 +820,7 @@ function apply_deck_selection(decks, preserve_existing_deck_state) { if (deck.is_boss()) { // We don't want stats if someone selects Boss on the deck tab - if (deck.get_real_name() != "Boss") { + if (deck.get_real_name() !== "Boss") { deck.set_stats_boss(get_boss_stats(deck.get_real_name(), deck.level)); } } else { @@ -846,7 +846,7 @@ function apply_deck_selection(decks, preserve_existing_deck_state) { label.title = "Click to show/hide deck"; label.addEventListener("click", function(e){ var d = document.getElementById(this.id.replace("switch-","")); - d.className = (d.className == "hiddendeck") ? "card-container" : "hiddendeck"; + d.className = (d.className === "hiddendeck") ? "card-container" : "hiddendeck"; }, false) list_item.appendChild(label); }); @@ -1102,7 +1102,7 @@ function ScenarioList(scenarios) { var base_level = scenariolist.level_selector.get_selection(); - if ((special_rules.indexOf(SPECIAL_RULES.living_corpse_two_levels_extra) >= 0) && (deck_name == SPECIAL_RULES.living_corpse_two_levels_extra.affected_deck)) { + if ((special_rules.indexOf(SPECIAL_RULES.living_corpse_two_levels_extra) >= 0) && (deck_name === SPECIAL_RULES.living_corpse_two_levels_extra.affected_deck)) { return Math.min(7, (parseInt(base_level) + parseInt(SPECIAL_RULES.living_corpse_two_levels_extra.extra_levels))); } else { return base_level; @@ -1113,7 +1113,7 @@ function ScenarioList(scenarios) { return (this.decks[this.get_selection()].map(function (deck) { if (DECKS[deck.name]) { deck.class = DECKS[deck.name].class; - } else if (deck.name.indexOf("Boss") != -1) { + } else if (deck.name.indexOf("Boss") !== -1) { deck.class = DECKS["Boss"].class; } deck.level = scenariolist.get_level(deck.name, scenariolist.get_special_rules()); diff --git a/ui.js b/ui.js index bd7a027a..e1989eec 100644 --- a/ui.js +++ b/ui.js @@ -5,11 +5,11 @@ function activate_tab(tabs, pages, activetab) var key; for (key in tabs) { - tabs[key].className = (key == activetab) ? "" : "inactive"; + tabs[key].className = (key === activetab) ? "" : "inactive"; } for (key in pages) { - pages[key].className = (key == activetab) ? "tabbody" : "inactive tabbody"; + pages[key].className = (key === activetab) ? "tabbody" : "inactive tabbody"; } } From fc5105d715323c5f397a0c031bc27ee9d443daba Mon Sep 17 00:00:00 2001 From: William Makley Date: Mon, 14 Oct 2019 09:45:33 -0400 Subject: [PATCH 16/23] zIndex property is a string, so let's be explicit about the type coercion that is going on --- logic.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/logic.js b/logic.js index d7a2ebcc..9cec44fe 100644 --- a/logic.js +++ b/logic.js @@ -31,13 +31,16 @@ function UICard(front_element, back_element) { }; card.set_depth = function (z) { + z = z.toString(); this.back.style.zIndex = z; this.front.style.zIndex = z; } card.push_down = function () { - this.back.style.zIndex -= 1; - this.front.style.zIndex -= 1; + var backZIndex = parseInt(this.back.style.zIndex, 10); + var frontZIndex = parseInt(this.front.style.zIndex, 10); + this.back.style.zIndex = (backZIndex - 1).toString(); + this.front.style.zIndex = (frontZIndex - 1).toString(); } card.addClass = function (class_name) { From 1a9b05bec5210f6ac748c2599a049d2016bcdc16 Mon Sep 17 00:00:00 2001 From: William Makley Date: Mon, 14 Oct 2019 15:03:57 -0400 Subject: [PATCH 17/23] completely rework app to use webpack, const/let, and ES6 modules and fix a few small bugs --- .editorconfig | 3 + README.md | 15 +- {src => dist}/cards.css | 22 +- dist/index.html | 14 +- dist/main.js | 2 +- {src => dist}/style.css | 0 gen-manifest.sh | 2 + package-lock.json | 2094 ++++- package.json | 8 +- src/.eslintrc.js | 17 + src/cards.js | 6 +- src/logic.js | 417 +- src/macros.js | 75 +- src/modifiers.js | 94 +- src/monster_stats.js | 16528 +++++++++++++++++++------------------- src/scenarios.js | 6 +- src/ui.js | 32 +- src/util.js | 220 +- webpack.config.js | 13 + 19 files changed, 10854 insertions(+), 8714 deletions(-) rename {src => dist}/cards.css (94%) rename {src => dist}/style.css (100%) create mode 100644 src/.eslintrc.js create mode 100644 webpack.config.js diff --git a/.editorconfig b/.editorconfig index 3f673483..8c832f5d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,3 +9,6 @@ end_of_line = lf [{*.js,*.html}] end_of_line = crlf + +[package.json] +indent_size = 2 diff --git a/README.md b/README.md index e6caaffb..c1a93724 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,25 @@ # Gloomy Companion +## About the fork + +I want to add the following features: + +1. Sort monster decks by initiative. +2. Sort player icons in between the monster decks. + +In the process I ended up implementing webpack and ES6 and fixing small bugs. + +## Original intro + This is a web-app for managing the monster ability decks in the board game [Gloomhaven](https://boardgamegeek.com/boardgame/174430/gloomhaven) You can run it from the web directly on . You can also download it and run it locally without internet connection. Click __Clone or download__ above, then __Download ZIP__. Unpack the ZIP and start the app by opening `index.html`. -If you want to add new cards, you need to update [`cards.js`](src/cards.js). The decks has the following syntax: +If you want to add new cards, you need to update [`cards.js`](src/cards.js). The decks have the following syntax: -```json +```javascript { name: "Name of monster" , cards: [ [false, "42", "* First line", "** sub-line 1", "** sub-line 2", "* Second line"] diff --git a/src/cards.css b/dist/cards.css similarity index 94% rename from src/cards.css rename to dist/cards.css index 2f321f8b..bf321fe6 100644 --- a/src/cards.css +++ b/dist/cards.css @@ -2,13 +2,13 @@ @font-face { font-family: Philosopher; - src: url(../dist/Philosopher-Bold.ttf); + src: url(Philosopher-Bold.ttf); } @font-face { font-family: PirataOne; - src: url(../dist/PirataOne-Gloomhaven.ttf); + src: url(PirataOne-Gloomhaven.ttf); } @media only screen and (min-height: 500px) and (orientation: portrait) { @@ -100,19 +100,19 @@ .background.curse { - background-image: url(../dist/images/curse.svg); + background-image: url(images/curse.svg); } .background.bless { - background-image: url(../dist/images/bless.svg); + background-image: url(images/bless.svg); } .counter-icon.shuffle { background-repeat: no-repeat; background-position: center center; - background-image: url(../dist/images/shuffle-black.svg); + background-image: url(images/shuffle-black.svg); background-size: 50%; cursor: pointer; @@ -153,14 +153,14 @@ { opacity: 0.7; text-indent: -999em; - background: url(../dist/images/plus-circle.svg) center center no-repeat; + background: url(images/plus-circle.svg) center center no-repeat; } .decrement.button { opacity: 0.7; text-indent: -999em; - background: url(../dist/images/minus-circle.svg) center center no-repeat; + background: url(images/minus-circle.svg) center center no-repeat; } .draw-two.button @@ -173,7 +173,7 @@ background-repeat: no-repeat; background-position: center center; background-size: 50%; - background-image: url(../dist/images/draw-two.svg); + background-image: url(images/draw-two.svg); cursor: pointer; } @@ -317,17 +317,17 @@ .card.ability.front { - background-image: url(../dist/images/front.jpg); + background-image: url(images/front.jpg); } .card.ability.back { - background-image: url(../dist/images/back.jpg); + background-image: url(images/back.jpg); } .card.modifier.back { - background-image: url(../dist/images/attack_mod_back.jpg); + background-image: url(images/attack_mod_back.jpg); } .card.modifier.front img.cover diff --git a/dist/index.html b/dist/index.html index 51a07765..97f69af5 100644 --- a/dist/index.html +++ b/dist/index.html @@ -5,23 +5,15 @@ - - + + - - - - - - - - - +
    diff --git a/dist/main.js b/dist/main.js index 23c287ea..9ddce782 100644 --- a/dist/main.js +++ b/dist/main.js @@ -1 +1 @@ -!function(e){var t={};function n(i){if(t[i])return t[i].exports;var a=t[i]={i:i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(i,a,function(t){return e[t]}.bind(null,a));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t);var i=!0,a=[],s=null,r=function(e){for(var t={},n=0;n0){var _=document.createElement("span");_.className="healthElite",_.innerText="HP "+c[1],d.appendChild(_)}var m=document.createElement("span");if(m.className="initiative",m.innerText=e,d.appendChild(m),n){var f=document.createElement("img");f.src="images/shuffle.svg",d.appendChild(f)}var h=0,p=d;i=remove_empty_strings(i);for(var v=0;v=0;)E+=1,g=g.substr(1);for(var b=E-h;h!=E;)if(b>0){var k=document.createElement("ul");i.length>5&&(k.style.fontSize=100-2.5*i.length+"%"),p.appendChild(k),p=k;var S=document.createElement("li");p.appendChild(S),p=S,h+=1}else p=(p=p.parentElement).parentElement,h-=1;if(h>0&&b<=0){p=p.parentElement;S=document.createElement("li");p.appendChild(S),p=S}var C=expand_string(g.trim(),a,s,r);p.insertAdjacentHTML("beforeend",C)}return d}function _(e,t,n){var a=r[e];a.name=t,a.level=n;for(var s=JSON.parse(get_from_storage(t)),c={class:a.class,name:a.name,type:l.ABILITY,draw_pile:[],discard:[],move:[0,0],attack:[0,0],range:[0,0],level:a.level,health:[0,0]},_=0;_0){var e=this.discard[this.discard.length-1],t=e.starting_lines,n=[];if(this.is_boss()){var i=[];t.forEach((function(e){i=i.concat(special_to_lines(e,c.special1,c.special2))})),t=i,this.immunities&&(n=n.concat(immunities_to_lines(this.immunities))),this.notes&&(n=n.concat(notes_to_lines(this.notes)))}else this.attributes&&(n=n.concat(attributes_to_lines(this.attributes)));e.paint_front_card(this.get_real_name(),t.concat(n),this.attack,this.move,this.range,this.level,this.health),e.ui.set_depth(-3),e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}f(this)},c.draw_top_card=function(){var e=this.draw_pile[0].starting_lines,t=[];if(this.is_boss()){var n=[];e.forEach((function(e){n=n.concat(special_to_lines(e,c.special1,c.special2))})),e=n,this.immunities&&(t=t.concat(immunities_to_lines(this.immunities))),this.notes&&(t=t.concat(notes_to_lines(this.notes)))}else this.attributes&&(t=t.concat(attributes_to_lines(this.attributes)));this.draw_pile[0].paint_front_card(this.get_real_name(),e.concat(t),this.attack,this.move,this.range,this.level,this.health),f(this)},c.must_reshuffle=function(){return!this.draw_pile.length||(i&&this.discard.length?this.discard[0].shuffle_next:void 0)},c.set_stats_monster=function(e){this.attack=e.attack,this.move=e.move,this.range=e.range,this.attributes=e.attributes,this.health=e.health},c.set_stats_boss=function(e){this.attack=e.attack,this.move=e.move,this.range=e.range,this.special1=e.special1,this.special2=e.special2,this.immunities=e.immunities,this.notes=e.notes,this.health=e.health},c.get_real_name=function(){return this.name?this.name:this.class},c.is_boss=function(){return this.class==DECKS.Boss.class},c.set_card_piles=function(e,t){for(var n=0;n0&&e.discard[0].ui.addClass("lift"),E(n=e.draw_pile.shift(n),pull_animation=!0),e.discard.unshift(n)}function E(e,t){e.ui.set_depth(-3),t&&e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}function b(e){e.must_reshuffle()?p(e,!0):a.forEach((function(t){t.class==e.class&&(t.draw_top_card(),g(t))})),write_to_storage(e.name,JSON.stringify(e))}function k(e){e.clean_discard_pile(),p(e,!0),document.body.dispatchEvent(new CustomEvent(c.MODIFIER_DECK_SHUFFLE_REQUIRED,{detail:{shuffle:!1}}))}function S(e){e.clean_advantage_deck(),e.must_reshuffle()?k(e):(g(e),document.body.dispatchEvent(new CustomEvent(c.MODIFIER_CARD_DRAWN,{detail:{card_type:e.discard[0].card_type,count:e.count(e.discard[0].card_type)}})),e.shuffle_end_of_round()&&document.body.dispatchEvent(new CustomEvent(c.MODIFIER_DECK_SHUFFLE_REQUIRED,{detail:{shuffle:!0}}))),write_to_storage("modifier_deck",JSON.stringify(e))}function C(e){var t;1==e.draw_pile.length?(S(e),t=e.discard[0],k(e),E(t=e.draw_pile.shift(t),pull_animation=!1),e.discard.unshift(t),S(e)):0==e.draw_pile.length?(e.clean_advantage_deck(),k(e),S(e),t=e.discard[0],S(e)):(S(e),t=e.discard[0],S(e)),e.discard[0].ui.addClass("right"),t.ui.addClass("left"),e.advantage_to_clean=!0}function y(e){return{ui:new d(function(e){var t=document.createElement("img");t.className="cover",t.src=e;var n=document.createElement("div");return n.className="card modifier front",n.appendChild(t),n}(e.image),function(){var e=document.createElement("div");return e.className="card modifier back",e}()),card_type:e.type,shuffle_next_round:e.shuffle}}function w(){s.shuffle_end_of_round()&&(s.clean_advantage_deck(),k(s)),write_to_storage("modifier_deck",JSON.stringify(s))}function T(e,t){var n=document.getElementById("tableau");document.getElementById("currentdeckslist").innerHTML="";var i=a.filter((function(n){return!t||0==e.filter((function(e){return e.name==n.name&&e.level==n.level})).length})),r=e.filter((function(e){return!t||0==a.filter((function(t){return e.name==t.name&&e.level==t.level})).length}));if(s)t||(n.removeChild(document.getElementById("modifier-container")),I(),O(n,s,t));else if(I(),O(n,s,t),t){for(var l=JSON.parse(get_from_storage("modifier_deck")),d=N("curse",l),o=N("bless",l),u=0;u-1&&a.splice(e,1),n.removeChild(l)},e.is_boss()?"Boss"!=e.get_real_name()&&e.set_stats_boss((i=e.get_real_name(),s=e.level,i=i.replace("Boss: ",""),{attack:[MONSTER_STATS.bosses[i].level[s].attack],move:[MONSTER_STATS.bosses[i].level[s].move],range:[MONSTER_STATS.bosses[i].level[s].range],special1:MONSTER_STATS.bosses[i].level[s].special1,special2:MONSTER_STATS.bosses[i].level[s].special2,immunities:MONSTER_STATS.bosses[i].level[s].immunities,notes:MONSTER_STATS.bosses[i].level[s].notes,health:[MONSTER_STATS.bosses[i].level[s].health]})):e.set_stats_monster(function(e,t){return{attack:[MONSTER_STATS.monsters[e].level[t].normal.attack,MONSTER_STATS.monsters[e].level[t].elite.attack],move:[MONSTER_STATS.monsters[e].level[t].normal.move,MONSTER_STATS.monsters[e].level[t].elite.move],range:[MONSTER_STATS.monsters[e].level[t].normal.range,MONSTER_STATS.monsters[e].level[t].elite.range],attributes:[MONSTER_STATS.monsters[e].level[t].normal.attributes,MONSTER_STATS.monsters[e].level[t].elite.attributes],health:[MONSTER_STATS.monsters[e].level[t].normal.health,MONSTER_STATS.monsters[e].level[t].elite.health]}}(e.get_real_name(),e.level)),p(e),t?e.draw_top_discard():f(e),a.push(e);var c=document.getElementById("currentdeckslist"),d=document.createElement("li");d.className="currentdeck",c.appendChild(d);var o=document.createElement("a");o.id="switch-"+r,o.href="#switch-"+r,o.innerText=e.get_real_name(),o.title="Click to show/hide deck",o.addEventListener("click",(function(e){var t=document.getElementById(this.id.replace("switch-",""));t.className="hiddendeck"==t.className?"card-container":"hiddendeck"}),!1),d.appendChild(o)})),h()}function I(){s=function(){var e={name:"Monster modifier deck",type:l.MODIFIER,draw_pile:[],discard:[],advantage_to_clean:!1,draw_top_discard:function(){if(this.discard.length>0){var e=this.discard[this.discard.length-1];e.ui.set_depth(-3),e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}f(this)}};e.count=function(e){return this.draw_pile.filter((function(t){return t.card_type===e})).length}.bind(e),e.remove_card=function(t){for(var n=0;n0}.bind(e),e.must_reshuffle=function(){return!this.draw_pile.length}.bind(e),e.clean_discard_pile=function(){for(var t=0;t7?7:this.spinner.value},n.set_value=function(e){this.spinner.value=e>7?7:e},n}function x(){var e={};e.ul=document.createElement("ul"),e.ul.className="selectionlist",e.checkboxes={},e.level_selectors={},e.global_level_selector=null;var t=document.createElement("li"),n=new R("Select global level ",!0);t.appendChild(n.html),e.global_level_selector=n;var i=create_input("button","applylevel","Apply All","");for(key in i.input.onclick=function(){for(key in e.level_selectors)e.level_selectors[key].set_value(e.global_level_selector.get_selection())},t.appendChild(i.root),e.ul.appendChild(t),DECKS){var a=DECKS[key].name;t=document.createElement("li"),i=create_input("checkbox","deck",a,a);t.appendChild(i.root);var s=new R(" with level ",!0);t.appendChild(s.html),e.ul.appendChild(t),e.checkboxes[a]=i.input,e.level_selectors[a]=s}return e.get_selection=function(){return dict_values(this.checkboxes).filter(is_checked).map(input_value)},e.get_selected_decks=function(){var t=this.get_selection();return concat_arrays(t.map(function(t){var n=t in DECKS?DECKS[t]:[];return n.level=e.level_selectors[t].get_selection(),n}.bind(this)))},e.set_selection=function(t){dict_values(this.checkboxes).forEach((function(e){e.checked=!1})),t.forEach(function(t){var n=this.checkboxes[t.name];n&&(n.checked=!0,e.level_selectors[t.name].set_value(t.level))}.bind(this))},e}function D(e){var t={};t.ul=document.createElement("ul"),t.ul.className="selectionlist",t.spinner=null,t.decks={},t.special_rules={},t.level_selector=null,t.level_selector=new R("Select level",!1),t.ul.appendChild(t.level_selector.html);for(var n=0;n=0&&e==SPECIAL_RULES.living_corpse_two_levels_extra.affected_deck?Math.min(7,parseInt(i)+parseInt(SPECIAL_RULES.living_corpse_two_levels_extra.extra_levels)):i},t.get_scenario_decks=function(){return this.decks[this.get_selection()].map((function(e){return DECKS[e.name]?e.class=DECKS[e.name].class:-1!=e.name.indexOf("Boss")&&(e.class=DECKS.Boss.class),e.level=t.get_level(e.name,t.get_special_rules()),e}))},t.get_special_rules=function(){return this.special_rules[this.get_selection()]},t}function M(e,t,n){var i;for(i in e)e[i].className=i==n?"":"inactive";for(i in t)t[i].className=i==n?"tabbody":"inactive tabbody"}function A(e,t,n){e.className=n?"pane":"pane inactive",t.style.display=n?"initial":"none"}document.addEventListener("DOMContentLoaded",(function(){var e,t,n,i,s,r,l,c;e=document.getElementById("deckspage"),t=document.getElementById("scenariospage"),n=document.getElementById("applydecks"),i=document.getElementById("applyscenario"),s=document.getElementById("applyload"),r=document.getElementById("showmodifierdeck"),l=new x,c=new D(SCENARIO_DEFINITIONS),e.insertAdjacentElement("afterbegin",l.ul),t.insertAdjacentElement("afterbegin",c.ul),n.onclick=function(){localStorage.clear();var e=l.get_selected_decks();write_to_storage("selected_deck_names",JSON.stringify(e)),T(e.map((function(e){return _(e.class,e.name,e.level)})),!0);var t=document.getElementById("showmodifierdeck-deckspage"),n=document.getElementById("modifier-container");t.checked?n.style.display="block":n.style.display="none"},i.onclick=function(){try{localStorage.clear()}catch(e){return void console.error("Local storage is required")}var e=c.get_scenario_decks();write_to_storage("selected_deck_names",JSON.stringify(e)),l.set_selection(e),T(e.map((function(e){return _(e.class,e.name,e.level)})),!1);var t=document.getElementById("modifier-container");r.checked?t.style.display="block":t.style.display="none",show_settingspane(settingspane,cancelarea,!1)},s.onclick=function(){var e=JSON.parse(get_from_storage("selected_deck_names"));l.set_selection(e),T(e.map((function(e){return _(e.class,e.name,e.level)})),!0);var t=document.getElementById("modifier-container");r.checked?t.style.display="block":t.style.display="none"},window.onresize=h.bind(null,a),function(){var e={scenarios:document.getElementById("scenariotab"),decks:document.getElementById("deckstab")},t={scenarios:document.getElementById("scenariospage"),decks:document.getElementById("deckspage")},n=document.getElementById("settingspane"),i=document.getElementById("settingsbtn"),a=document.getElementById("cancelarea");scenariotab.onclick=function(n){M(e,t,"scenarios")},deckstab.onclick=function(n){M(e,t,"decks")},i.onclick=function(e){A(n,a,!0)},a.onclick=function(e){A(n,a,!1)},M(e,t,"scenarios")}()}))}]); \ No newline at end of file +!function(e){var a={};function t(n){if(a[n])return a[n].exports;var l=a[n]={i:n,l:!1,exports:{}};return e[n].call(l.exports,l,l.exports,t),l.l=!0,l.exports}t.m=e,t.c=a,t.d=function(e,a,n){t.o(e,a)||Object.defineProperty(e,a,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,a){if(1&a&&(e=t(e)),8&a)return e;if(4&a&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&a&&"string"!=typeof e)for(var l in e)t.d(n,l,function(a){return e[a]}.bind(null,l));return n},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)},t.p="",t(t.s=0)}([function(e,a,t){"use strict";t.r(a);const n={"Ancient Artillery":{name:"Ancient Artillery",class:"Ancient Artillery"},"Bandit Archer":{name:"Bandit Archer",class:"Archer"},"Bandit Guard":{name:"Bandit Guard",class:"Guard"},"Black Imp":{name:"Black Imp",class:"Imp"},Boss:{name:"Boss",class:"Boss"},"Cave Bear":{name:"Cave Bear",class:"Cave Bear"},"City Archer":{name:"City Archer",class:"Archer"},"City Guard":{name:"City Guard",class:"Guard"},Cultist:{name:"Cultist",class:"Cultist"},"Deep Terror":{name:"Deep Terror",class:"Deep Terror"},"Earth Demon":{name:"Earth Demon",class:"Earth Demon"},"Flame Demon":{name:"Flame Demon",class:"Flame Demon"},"Forest Imp":{name:"Forest Imp",class:"Imp"},"Frost Demon":{name:"Frost Demon",class:"Frost Demon"},"Giant Viper":{name:"Giant Viper",class:"Giant Viper"},"Harrower Infester":{name:"Harrower Infester",class:"Harrower Infester"},Hound:{name:"Hound",class:"Hound"},"Inox Archer":{name:"Inox Archer",class:"Archer"},"Inox Guard":{name:"Inox Guard",class:"Guard"},"Inox Shaman":{name:"Inox Shaman",class:"Shaman"},"Living Bones":{name:"Living Bones",class:"Living Bones"},"Living Corpse":{name:"Living Corpse",class:"Living Corpse"},"Living Spirit":{name:"Living Spirit",class:"Living Spirit"},Lurker:{name:"Lurker",class:"Lurker"},"Night Demon":{name:"Night Demon",class:"Night Demon"},Ooze:{name:"Ooze",class:"Ooze"},"Rending Drake":{name:"Rending Drake",class:"Rending Drake"},"Savvas Icestorm":{name:"Savvas Icestorm",class:"Savvas Icestorm"},"Savvas Lavaflow":{name:"Savvas Lavaflow",class:"Savvas Lavaflow"},"Spitting Drake":{name:"Spitting Drake",class:"Spitting Drake"},"Stone Golem":{name:"Stone Golem",class:"Stone Golem"},"Sun Demon":{name:"Sun Demon",class:"Sun Demon"},"Vermling Scout":{name:"Vermling Scout",class:"Scout"},"Vermling Shaman":{name:"Vermling Shaman",class:"Shaman"},"Wind Demon":{name:"Wind Demon",class:"Wind Demon"}},l={BLESS:"bless",CURSE:"curse",PLUS0:"plus0",PLUS1:"plus1",PLUS2:"plus2",MINUS1:"minus1",MINUS2:"minus2",NULL:"null",DOUBLE:"double"},i={BLESS:{type:l.BLESS,shuffle:!1,image:"images/attack_mod_bless.jpg"},CURSE:{type:l.CURSE,shuffle:!1,image:"images/attack_mod_curse.jpg"},PLUS0:{type:l.PLUS0,shuffle:!1,image:"images/attack_mod_+0.jpg"},PLUS1:{type:l.PLUS1,shuffle:!1,image:"images/attack_mod_+1.jpg"},PLUS2:{type:l.PLUS2,shuffle:!1,image:"images/attack_mod_+2.jpg"},MINUS1:{type:l.MINUS1,shuffle:!1,image:"images/attack_mod_-1.jpg"},MINUS2:{type:l.MINUS2,shuffle:!1,image:"images/attack_mod_-2.jpg"},NULL:{type:l.NULL,shuffle:!0,image:"images/attack_mod_null.jpg"},DOUBLE:{type:l.DOUBLE,shuffle:!0,image:"images/attack_mod_2x.jpg"}},s=[i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS1,i.PLUS1,i.PLUS1,i.PLUS1,i.PLUS1,i.MINUS1,i.MINUS1,i.MINUS1,i.MINUS1,i.MINUS1,i.PLUS2,i.MINUS2,i.NULL,i.DOUBLE],r={monsters:{"Ancient Artillery":{level:[{level:0,normal:{health:4,move:0,attack:2,range:4,attributes:[]},elite:{health:7,move:0,attack:3,range:5,attributes:[]}},{level:1,normal:{health:6,move:0,attack:2,range:4,attributes:[]},elite:{health:9,move:0,attack:3,range:5,attributes:[]}},{level:2,normal:{health:7,move:0,attack:2,range:5,attributes:[]},elite:{health:11,move:0,attack:3,range:6,attributes:[]}},{level:3,normal:{health:8,move:0,attack:3,range:5,attributes:[]},elite:{health:13,move:0,attack:4,range:6,attributes:[]}},{level:4,normal:{health:9,move:0,attack:4,range:5,attributes:[]},elite:{health:13,move:0,attack:4,range:6,attributes:["%target% 2"]}},{level:5,normal:{health:11,move:0,attack:4,range:6,attributes:[]},elite:{health:15,move:0,attack:4,range:7,attributes:["%target% 2"]}},{level:6,normal:{health:14,move:0,attack:4,range:6,attributes:[]},elite:{health:16,move:0,attack:5,range:7,attributes:["%target% 2"]}},{level:7,normal:{health:16,move:0,attack:4,range:7,attributes:[]},elite:{health:20,move:0,attack:5,range:7,attributes:["%target% 2"]}}]},"Bandit Archer":{level:[{level:0,normal:{health:4,move:2,attack:2,range:3,attributes:[]},elite:{health:6,move:2,attack:3,range:3,attributes:[]}},{level:1,normal:{health:5,move:2,attack:2,range:4,attributes:[]},elite:{health:7,move:2,attack:3,range:5,attributes:[]}},{level:2,normal:{health:6,move:3,attack:2,range:4,attributes:[]},elite:{health:9,move:3,attack:3,range:5,attributes:[]}},{level:3,normal:{health:6,move:3,attack:3,range:4,attributes:[]},elite:{health:10,move:3,attack:4,range:5,attributes:[]}},{level:4,normal:{health:8,move:3,attack:3,range:4,attributes:[]},elite:{health:10,move:3,attack:4,range:6,attributes:["%poison%"]}},{level:5,normal:{health:10,move:3,attack:3,range:5,attributes:[]},elite:{health:12,move:4,attack:4,range:6,attributes:["%poison%"]}},{level:6,normal:{health:10,move:3,attack:4,range:5,attributes:[]},elite:{health:13,move:4,attack:5,range:6,attributes:["%poison%"]}},{level:7,normal:{health:13,move:3,attack:4,range:5,attributes:[]},elite:{health:17,move:4,attack:5,range:6,attributes:["%poison%"]}}]},"Bandit Guard":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:[]},elite:{health:9,move:2,attack:3,range:0,attributes:[]}},{level:1,normal:{health:6,move:3,attack:2,range:0,attributes:[]},elite:{health:9,move:2,attack:3,range:0,attributes:["%shield% 1"]}},{level:2,normal:{health:6,move:3,attack:3,range:0,attributes:[]},elite:{health:10,move:2,attack:4,range:0,attributes:["%shield% 1"]}},{level:3,normal:{health:9,move:3,attack:3,range:0,attributes:[]},elite:{health:10,move:3,attack:4,range:0,attributes:["%shield% 2"]}},{level:4,normal:{health:10,move:4,attack:3,range:0,attributes:[]},elite:{health:11,move:3,attack:4,range:0,attributes:["%muddle%","%shield% 2"]}},{level:5,normal:{health:11,move:4,attack:4,range:0,attributes:[]},elite:{health:12,move:3,attack:5,range:0,attributes:["%muddle%","%shield% 2"]}},{level:6,normal:{health:14,move:4,attack:4,range:0,attributes:[]},elite:{health:14,move:4,attack:5,range:0,attributes:["%muddle%","%shield% 2"]}},{level:7,normal:{health:16,move:5,attack:4,range:0,attributes:[]},elite:{health:14,move:3,attack:5,range:0,attributes:["%muddle%","%shield% 3"]}}]},"Black Imp":{level:[{level:0,normal:{health:3,move:1,attack:1,range:3,attributes:[]},elite:{health:4,move:1,attack:2,range:3,attributes:["%poison%"]}},{level:1,normal:{health:4,move:1,attack:1,range:3,attributes:["%poison%"]},elite:{health:6,move:1,attack:2,range:3,attributes:["%poison%"]}},{level:2,normal:{health:5,move:1,attack:1,range:4,attributes:["%poison%"]},elite:{health:8,move:1,attack:2,range:4,attributes:["%poison%"]}},{level:3,normal:{health:5,move:1,attack:2,range:4,attributes:["%poison%"]},elite:{health:8,move:1,attack:3,range:4,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:4,normal:{health:7,move:1,attack:2,range:4,attributes:["%poison%"]},elite:{health:11,move:1,attack:3,range:4,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:5,normal:{health:9,move:1,attack:2,range:4,attributes:["%poison%"]},elite:{health:12,move:1,attack:3,range:5,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:6,normal:{health:10,move:1,attack:3,range:4,attributes:["%poison%"]},elite:{health:14,move:1,attack:4,range:5,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:7,normal:{health:12,move:1,attack:3,range:4,attributes:["%poison%"]},elite:{health:17,move:1,attack:4,range:5,attributes:["Attackers gain Disadvantage","%poison%"]}}]},"Cave Bear":{level:[{level:0,normal:{health:7,move:3,attack:3,range:0,attributes:[]},elite:{health:11,move:3,attack:4,range:0,attributes:[]}},{level:1,normal:{health:9,move:3,attack:3,range:0,attributes:[]},elite:{health:14,move:3,attack:4,range:0,attributes:[]}},{level:2,normal:{health:11,move:4,attack:3,range:0,attributes:[]},elite:{health:17,move:4,attack:4,range:0,attributes:[]}},{level:3,normal:{health:13,move:4,attack:4,range:0,attributes:[]},elite:{health:20,move:4,attack:5,range:0,attributes:[]}},{level:4,normal:{health:16,move:4,attack:4,range:0,attributes:[]},elite:{health:21,move:5,attack:5,range:0,attributes:["%wound%"]}},{level:5,normal:{health:17,move:5,attack:4,range:0,attributes:["%wound%"]},elite:{health:24,move:5,attack:6,range:0,attributes:["%wound%"]}},{level:6,normal:{health:19,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:28,move:5,attack:7,range:0,attributes:["%wound%"]}},{level:7,normal:{health:22,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:33,move:5,attack:7,range:0,attributes:["%wound%"]}}]},"City Archer":{level:[{level:0,normal:{health:4,move:1,attack:2,range:3,attributes:[]},elite:{health:6,move:1,attack:3,range:4,attributes:[]}},{level:1,normal:{health:5,move:1,attack:2,range:4,attributes:[]},elite:{health:6,move:1,attack:3,range:5,attributes:["%pierce% 1","%shield% 1"]}},{level:2,normal:{health:6,move:1,attack:3,range:4,attributes:[]},elite:{health:7,move:1,attack:4,range:5,attributes:["%pierce% 2","%shield% 1"]}},{level:3,normal:{health:6,move:2,attack:3,range:4,attributes:["%shield% 1"]},elite:{health:8,move:2,attack:4,range:5,attributes:["%pierce% 2","%shield% 2"]}},{level:4,normal:{health:8,move:2,attack:3,range:5,attributes:["%shield% 1"]},elite:{health:10,move:2,attack:4,range:6,attributes:["%pierce% 2","%shield% 2"]}},{level:5,normal:{health:9,move:2,attack:4,range:5,attributes:["%shield% 1"]},elite:{health:11,move:2,attack:5,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:6,normal:{health:9,move:3,attack:4,range:5,attributes:["%shield% 2"]},elite:{health:12,move:3,attack:6,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:7,normal:{health:10,move:3,attack:4,range:6,attributes:["%shield% 2"]},elite:{health:13,move:3,attack:6,range:7,attributes:["%pierce% 3","%shield% 3"]}}]},"City Guard":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:[]},elite:{health:6,move:2,attack:3,range:0,attributes:["%shield% 1"]}},{level:1,normal:{health:5,move:2,attack:2,range:0,attributes:["%shield% 1"]},elite:{health:6,move:2,attack:3,range:0,attributes:["%shield% 2"]}},{level:2,normal:{health:7,move:2,attack:2,range:0,attributes:["%shield% 1"]},elite:{health:9,move:2,attack:3,range:0,attributes:["%shield% 2"]}},{level:3,normal:{health:8,move:2,attack:3,range:0,attributes:["%shield% 1"]},elite:{health:9,move:2,attack:4,range:0,attributes:["%retaliate% 1","%shield% 2"]}},{level:4,normal:{health:9,move:3,attack:3,range:0,attributes:["%shield% 1"]},elite:{health:10,move:3,attack:4,range:0,attributes:["%retaliate% 2","%shield% 2"]}},{level:5,normal:{health:10,move:3,attack:3,range:0,attributes:["%shield% 2"]},elite:{health:12,move:3,attack:4,range:0,attributes:["%retaliate% 2","%shield% 3"]}},{level:6,normal:{health:11,move:3,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:13,move:3,attack:5,range:0,attributes:["%retaliate% 3","%shield% 3"]}},{level:7,normal:{health:13,move:3,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:14,move:3,attack:6,range:0,attributes:["%retaliate% 3","%shield% 3"]}}]},Cultist:{level:[{level:0,normal:{health:4,move:2,attack:1,range:0,attributes:[]},elite:{health:7,move:2,attack:2,range:0,attributes:[]}},{level:1,normal:{health:5,move:2,attack:1,range:0,attributes:[]},elite:{health:9,move:2,attack:2,range:0,attributes:[]}},{level:2,normal:{health:7,move:2,attack:1,range:0,attributes:[]},elite:{health:12,move:2,attack:2,range:0,attributes:[]}},{level:3,normal:{health:9,move:3,attack:1,range:0,attributes:[]},elite:{health:13,move:3,attack:2,range:0,attributes:["%curse%"]}},{level:4,normal:{health:10,move:3,attack:2,range:0,attributes:[]},elite:{health:15,move:3,attack:3,range:0,attributes:["%curse%"]}},{level:5,normal:{health:11,move:3,attack:2,range:0,attributes:["%curse%"]},elite:{health:18,move:3,attack:3,range:0,attributes:["%curse%"]}},{level:6,normal:{health:14,move:3,attack:2,range:0,attributes:["%curse%"]},elite:{health:22,move:3,attack:3,range:0,attributes:["%curse%"]}},{level:7,normal:{health:15,move:3,attack:3,range:0,attributes:["%curse%"]},elite:{health:25,move:3,attack:4,range:0,attributes:["%curse%"]}}]},"Deep Terror":{level:[{level:0,normal:{health:3,move:0,attack:2,range:0,attributes:[]},elite:{health:5,move:0,attack:3,range:0,attributes:[]}},{level:1,normal:{health:4,move:0,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:6,move:0,attack:3,range:0,attributes:["%retaliate% 1"]}},{level:2,normal:{health:4,move:0,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:7,move:0,attack:4,range:0,attributes:["%retaliate% 1"]}},{level:3,normal:{health:5,move:0,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:8,move:0,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:4,normal:{health:6,move:0,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:9,move:0,attack:5,range:0,attributes:["%retaliate% 2"]}},{level:5,normal:{health:7,move:0,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:11,move:0,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:8,move:0,attack:5,range:0,attributes:["%retaliate% 3"]},elite:{health:13,move:0,attack:6,range:0,attributes:["%retaliate% 3"]}},{level:7,normal:{health:9,move:0,attack:5,range:0,attributes:["%retaliate% 4"]},elite:{health:15,move:0,attack:6,range:0,attributes:["%retaliate% 4"]}}]},"Earth Demon":{level:[{level:0,normal:{health:7,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:2,attack:4,range:0,attributes:[]}},{level:1,normal:{health:9,move:1,attack:3,range:0,attributes:[]},elite:{health:13,move:2,attack:4,range:0,attributes:[]}},{level:2,normal:{health:12,move:1,attack:3,range:0,attributes:[]},elite:{health:18,move:2,attack:4,range:0,attributes:[]}},{level:3,normal:{health:13,move:2,attack:3,range:0,attributes:[]},elite:{health:20,move:2,attack:4,range:0,attributes:["%immobilize%"]}},{level:4,normal:{health:15,move:2,attack:4,range:0,attributes:[]},elite:{health:21,move:3,attack:5,range:0,attributes:["%immobilize%"]}},{level:5,normal:{health:17,move:2,attack:4,range:0,attributes:["%immobilize%"]},elite:{health:25,move:3,attack:5,range:0,attributes:["%immobilize%"]}},{level:6,normal:{health:20,move:2,attack:4,range:0,attributes:["%immobilize%"]},elite:{health:27,move:3,attack:6,range:0,attributes:["%immobilize%"]}},{level:7,normal:{health:22,move:3,attack:4,range:0,attributes:["%immobilize%"]},elite:{health:32,move:3,attack:6,range:0,attributes:["%immobilize%"]}}]},"Flame Demon":{level:[{level:0,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:3,move:3,attack:2,range:3,attributes:["%flying%","%shield% 3"]}},{level:1,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 3"]},elite:{health:3,move:3,attack:2,range:4,attributes:["%flying%","%retaliate% 2: %range% 2","%shield% 4"]}},{level:2,normal:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 3"]},elite:{health:4,move:3,attack:3,range:4,attributes:["%flying%","%retaliate% 3: %range% 2","%shield% 4"]}},{level:3,normal:{health:3,move:3,attack:3,range:4,attributes:["%flying%","%retaliate% 2: %range% 2","%shield% 3"]},elite:{health:5,move:3,attack:3,range:5,attributes:["%flying%","%retaliate% 3: %range% 3","%shield% 4"]}},{level:4,normal:{health:3,move:4,attack:3,range:4,attributes:["%flying%","%retaliate% 3: %range% 2","%shield% 3"]},elite:{health:5,move:4,attack:4,range:5,attributes:["%flying%","%retaliate% 4: %range% 3","%shield% 4"]}},{level:5,normal:{health:4,move:4,attack:3,range:4,attributes:["%flying%","%retaliate% 3: %range% 2","%shield% 4"]},elite:{health:6,move:4,attack:4,range:5,attributes:["%flying%","%retaliate% 4: %range% 3","%shield% 5"]}},{level:6,normal:{health:4,move:4,attack:4,range:4,attributes:["%flying%","%retaliate% 4: %range% 2","%shield% 4"]},elite:{health:7,move:4,attack:5,range:5,attributes:["%flying%","%retaliate% 5: %range% 3","%shield% 5"]}},{level:7,normal:{health:5,move:4,attack:4,range:5,attributes:["%flying%","%retaliate% 4: %range% 3","%shield% 4"]},elite:{health:8,move:4,attack:5,range:6,attributes:["%flying%","%retaliate% 5: %range% 4","%shield% 5"]}}]},"Frost Demon":{level:[{level:0,normal:{health:5,move:2,attack:3,range:0,attributes:[]},elite:{health:10,move:3,attack:3,range:0,attributes:[]}},{level:1,normal:{health:6,move:2,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:10,move:3,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:7,move:3,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:12,move:4,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:8,move:3,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:14,move:4,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:4,normal:{health:10,move:3,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:18,move:4,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:5,normal:{health:11,move:3,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:20,move:4,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:12,move:3,attack:5,range:0,attributes:["%retaliate% 3"]},elite:{health:22,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:7,normal:{health:14,move:3,attack:5,range:0,attributes:["%retaliate% 3"]},elite:{health:25,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}}]},"Forest Imp":{level:[{level:0,normal:{health:1,move:3,attack:1,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:4,move:3,attack:1,range:3,attributes:["%flying%","%shield% 1"]}},{level:1,normal:{health:2,move:3,attack:1,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:5,move:3,attack:2,range:3,attributes:["%flying%","%shield% 1"]}},{level:2,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:6,move:3,attack:2,range:3,attributes:["%flying%","%curse%","%shield% 1"]}},{level:3,normal:{health:3,move:4,attack:2,range:4,attributes:["%flying%","%shield% 1"]},elite:{health:7,move:4,attack:2,range:4,attributes:["%flying%","%curse%","%shield% 1"]}},{level:4,normal:{health:3,move:4,attack:2,range:4,attributes:["%flying%","%shield% 2"]},elite:{health:7,move:4,attack:2,range:4,attributes:["%flying%","%curse%","%shield% 2"]}},{level:5,normal:{health:4,move:4,attack:2,range:4,attributes:["%flying%","%curse%","%shield% 2"]},elite:{health:8,move:4,attack:3,range:4,attributes:["%flying%","%curse%","%shield% 2"]}},{level:6,normal:{health:4,move:4,attack:3,range:4,attributes:["%flying%","%curse%","%shield% 2"]},elite:{health:9,move:4,attack:4,range:4,attributes:["%flying%","%curse%","%shield% 2"]}},{level:7,normal:{health:6,move:4,attack:3,range:4,attributes:["%flying%","%curse%","%shield% 2"]},elite:{health:11,move:4,attack:4,range:4,attributes:["%flying%","%curse%","%shield% 2"]}}]},"Giant Viper":{level:[{level:0,normal:{health:2,move:2,attack:1,range:0,attributes:["%poison%"]},elite:{health:3,move:2,attack:2,range:0,attributes:["%poison%"]}},{level:1,normal:{health:3,move:2,attack:1,range:0,attributes:["%poison%"]},elite:{health:5,move:2,attack:2,range:0,attributes:["%poison%"]}},{level:2,normal:{health:4,move:3,attack:1,range:0,attributes:["%poison%"]},elite:{health:7,move:3,attack:2,range:0,attributes:["%poison%"]}},{level:3,normal:{health:4,move:3,attack:2,range:0,attributes:["%poison%"]},elite:{health:8,move:3,attack:3,range:0,attributes:["%poison%"]}},{level:4,normal:{health:6,move:3,attack:2,range:0,attributes:["%poison%"]},elite:{health:11,move:3,attack:3,range:0,attributes:["%poison%"]}},{level:5,normal:{health:7,move:3,attack:3,range:0,attributes:["%poison%"]},elite:{health:13,move:4,attack:3,range:0,attributes:["%poison%"]}},{level:6,normal:{health:8,move:4,attack:3,range:0,attributes:["%poison%"]},elite:{health:14,move:4,attack:4,range:0,attributes:["%poison%"]}},{level:7,normal:{health:10,move:4,attack:3,range:0,attributes:["%poison%"]},elite:{health:17,move:4,attack:4,range:0,attributes:["%poison%"]}}]},"Harrower Infester":{level:[{level:0,normal:{health:6,move:2,attack:2,range:0,attributes:[]},elite:{health:12,move:2,attack:2,range:0,attributes:[]}},{level:1,normal:{health:7,move:2,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:12,move:3,attack:2,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:8,move:2,attack:2,range:0,attributes:["%retaliate% 2"]},elite:{health:14,move:3,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:10,move:2,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:17,move:3,attack:3,range:0,attributes:["%retaliate% 3"]}},{level:4,normal:{health:12,move:3,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:19,move:3,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:5,normal:{health:12,move:3,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:21,move:3,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:15,move:3,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:22,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:7,normal:{health:17,move:3,attack:4,range:0,attributes:["%retaliate% 4"]},elite:{health:26,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}}]},Hound:{level:[{level:0,normal:{health:4,move:3,attack:2,range:0,attributes:[]},elite:{health:6,move:5,attack:2,range:0,attributes:[]}},{level:1,normal:{health:4,move:4,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:6,move:5,attack:2,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:6,move:4,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:7,move:5,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:8,move:4,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:8,move:5,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:4,normal:{health:8,move:4,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:11,move:5,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:5,normal:{health:9,move:4,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:12,move:5,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:11,move:5,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:15,move:6,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:7,normal:{health:15,move:5,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:15,move:6,attack:5,range:0,attributes:["%retaliate% 4"]}}]},"Inox Archer":{level:[{level:0,normal:{health:5,move:2,attack:2,range:2,attributes:[]},elite:{health:7,move:2,attack:3,range:3,attributes:[]}},{level:1,normal:{health:6,move:2,attack:2,range:3,attributes:[]},elite:{health:8,move:2,attack:3,range:4,attributes:[]}},{level:2,normal:{health:8,move:2,attack:2,range:3,attributes:[]},elite:{health:11,move:2,attack:3,range:4,attributes:[]}},{level:3,normal:{health:9,move:2,attack:3,range:3,attributes:[]},elite:{health:13,move:2,attack:4,range:4,attributes:[]}},{level:4,normal:{health:10,move:3,attack:3,range:3,attributes:[]},elite:{health:14,move:3,attack:4,range:4,attributes:["%wound%"]}},{level:5,normal:{health:12,move:3,attack:3,range:4,attributes:[]},elite:{health:17,move:3,attack:4,range:5,attributes:["%wound%"]}},{level:6,normal:{health:12,move:3,attack:4,range:4,attributes:["%wound%"]},elite:{health:19,move:3,attack:5,range:5,attributes:["%wound%"]}},{level:7,normal:{health:15,move:3,attack:4,range:4,attributes:["%wound%"]},elite:{health:23,move:3,attack:5,range:5,attributes:["%wound%"]}}]},"Inox Guard":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:[]},elite:{health:9,move:1,attack:3,range:0,attributes:["%retaliate% 1"]}},{level:1,normal:{health:8,move:2,attack:2,range:0,attributes:[]},elite:{health:10,move:2,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:9,move:2,attack:3,range:0,attributes:[]},elite:{health:12,move:2,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:11,move:3,attack:3,range:0,attributes:[]},elite:{health:15,move:2,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:4,normal:{health:12,move:3,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:17,move:2,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:5,normal:{health:13,move:3,attack:4,range:0,attributes:["%retaliate% 1"]},elite:{health:19,move:2,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:6,normal:{health:16,move:3,attack:4,range:0,attributes:["%retaliate% 1"]},elite:{health:21,move:3,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:7,normal:{health:19,move:3,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:23,move:3,attack:6,range:0,attributes:["%retaliate% 4"]}}]},"Inox Shaman":{level:[{level:0,normal:{health:4,move:1,attack:2,range:3,attributes:[]},elite:{health:6,move:2,attack:3,range:3,attributes:[]}},{level:1,normal:{health:6,move:1,attack:2,range:3,attributes:[]},elite:{health:9,move:2,attack:3,range:3,attributes:[]}},{level:2,normal:{health:7,move:2,attack:2,range:3,attributes:[]},elite:{health:11,move:3,attack:3,range:3,attributes:[]}},{level:3,normal:{health:9,move:2,attack:2,range:4,attributes:[]},elite:{health:14,move:3,attack:3,range:4,attributes:[]}},{level:4,normal:{health:10,move:2,attack:3,range:4,attributes:[]},elite:{health:16,move:3,attack:4,range:4,attributes:[]}},{level:5,normal:{health:13,move:2,attack:3,range:4,attributes:[]},elite:{health:20,move:3,attack:4,range:4,attributes:[]}},{level:6,normal:{health:15,move:3,attack:3,range:4,attributes:[]},elite:{health:24,move:4,attack:4,range:4,attributes:[]}},{level:7,normal:{health:16,move:3,attack:4,range:4,attributes:[]},elite:{health:27,move:4,attack:5,range:4,attributes:[]}}]},"Living Bones":{level:[{level:0,normal:{health:5,move:2,attack:1,range:0,attributes:["%target% 2"]},elite:{health:6,move:4,attack:2,range:0,attributes:["%target% 2"]}},{level:1,normal:{health:5,move:3,attack:1,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:6,move:4,attack:2,range:0,attributes:["%target% 3","%shield% 1"]}},{level:2,normal:{health:5,move:3,attack:2,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:7,move:4,attack:3,range:0,attributes:["%target% 3","%shield% 1"]}},{level:3,normal:{health:7,move:3,attack:2,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:10,move:4,attack:3,range:0,attributes:["%target% 3","%shield% 1"]}},{level:4,normal:{health:7,move:3,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:11,move:4,attack:4,range:0,attributes:["%target% 3","%shield% 1"]}},{level:5,normal:{health:9,move:3,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:11,move:4,attack:4,range:0,attributes:["%target% 3","%shield% 2"]}},{level:6,normal:{health:10,move:4,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:11,move:6,attack:4,range:0,attributes:["%target% 3","%shield% 2"]}},{level:7,normal:{health:13,move:4,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:14,move:6,attack:4,range:0,attributes:["%target% 3","%shield% 2"]}}]},"Living Corpse":{level:[{level:0,normal:{health:5,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:1,attack:3,range:0,attributes:[]}},{level:1,normal:{health:7,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:1,attack:4,range:0,attributes:[]}},{level:2,normal:{health:9,move:1,attack:3,range:0,attributes:[]},elite:{health:13,move:1,attack:4,range:0,attributes:[]}},{level:3,normal:{health:10,move:1,attack:4,range:0,attributes:[]},elite:{health:13,move:2,attack:5,range:0,attributes:[]}},{level:4,normal:{health:11,move:2,attack:4,range:0,attributes:[]},elite:{health:15,move:2,attack:5,range:0,attributes:["%poison%"]}},{level:5,normal:{health:13,move:2,attack:4,range:0,attributes:[]},elite:{health:17,move:2,attack:6,range:0,attributes:["%poison%"]}},{level:6,normal:{health:14,move:2,attack:4,range:0,attributes:["%poison%"]},elite:{health:21,move:2,attack:6,range:0,attributes:["%poison%"]}},{level:7,normal:{health:15,move:2,attack:5,range:0,attributes:["%poison%"]},elite:{health:25,move:2,attack:6,range:0,attributes:["%poison%"]}}]},"Living Spirit":{level:[{level:0,normal:{health:2,move:2,attack:2,range:2,attributes:["%flying%","%shield% 1"]},elite:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 2"]}},{level:1,normal:{health:2,move:2,attack:2,range:2,attributes:["%flying%","%shield% 2"]},elite:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 3"]}},{level:2,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:3,move:4,attack:3,range:4,attributes:["%flying%","%shield% 3"]}},{level:3,normal:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:4,move:4,attack:4,range:4,attributes:["%flying%","%shield% 3"]}},{level:4,normal:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 3"]},elite:{health:4,move:4,attack:4,range:4,attributes:["%flying%","%shield% 4"]}},{level:5,normal:{health:4,move:3,attack:3,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:6,move:4,attack:4,range:4,attributes:["%flying%","%shield% 4"]}},{level:6,normal:{health:4,move:3,attack:4,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:7,move:4,attack:5,range:5,attributes:["%flying%","%shield% 4"]}},{level:7,normal:{health:6,move:3,attack:4,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:9,move:4,attack:5,range:5,attributes:["%flying%","%shield% 4"]}}]},Lurker:{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:["%target% 2"]},elite:{health:7,move:2,attack:3,range:0,attributes:["%target% 2","%shield% 1"]}},{level:1,normal:{health:7,move:2,attack:2,range:0,attributes:["%target% 2","%pierce% 1"]},elite:{health:9,move:2,attack:3,range:0,attributes:["%target% 2","%pierce% 1","%shield% 1"]}},{level:2,normal:{health:9,move:3,attack:2,range:0,attributes:["%target% 2","%pierce% 1"]},elite:{health:12,move:3,attack:3,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]}},{level:3,normal:{health:10,move:3,attack:3,range:0,attributes:["%target% 2","%pierce% 2"]},elite:{health:14,move:3,attack:4,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]}},{level:4,normal:{health:10,move:3,attack:3,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]},elite:{health:14,move:3,attack:4,range:0,attributes:["%target% 2","%pierce% 3","%shield% 2"]}},{level:5,normal:{health:11,move:3,attack:4,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]},elite:{health:15,move:3,attack:5,range:0,attributes:["%target% 2","%pierce% 3","%shield% 2"]}},{level:6,normal:{health:12,move:4,attack:4,range:0,attributes:["%target% 2","%pierce% 3","%shield% 1"]},elite:{health:16,move:4,attack:5,range:0,attributes:["%target% 2","%pierce% 4","%shield% 2"]}},{level:7,normal:{health:14,move:4,attack:4,range:0,attributes:["%target% 2","%pierce% 3","%shield% 1"]},elite:{health:18,move:4,attack:5,range:0,attributes:["%target% 2","%pierce% 4","%shield% 2"]}}]},Ooze:{level:[{level:0,normal:{health:4,move:1,attack:2,range:2,attributes:[]},elite:{health:8,move:1,attack:2,range:3,attributes:[]}},{level:1,normal:{health:5,move:1,attack:2,range:2,attributes:["%shield% 1"]},elite:{health:9,move:1,attack:2,range:3,attributes:["%shield% 1"]}},{level:2,normal:{health:7,move:1,attack:2,range:3,attributes:["%shield% 1"]},elite:{health:11,move:1,attack:3,range:3,attributes:["%shield% 1"]}},{level:3,normal:{health:8,move:1,attack:3,range:3,attributes:["%shield% 1"]},elite:{health:11,move:2,attack:3,range:4,attributes:["%poison%","%shield% 1"]}},{level:4,normal:{health:9,move:2,attack:3,range:3,attributes:["%shield% 1"]},elite:{health:13,move:2,attack:4,range:4,attributes:["%poison%","%shield% 1"]}},{level:5,normal:{health:10,move:2,attack:3,range:3,attributes:["%poison%","%shield% 1"]},elite:{health:15,move:3,attack:4,range:4,attributes:["%poison%","%shield% 1"]}},{level:6,normal:{health:12,move:2,attack:4,range:3,attributes:["%poison%","%shield% 1"]},elite:{health:16,move:3,attack:4,range:4,attributes:["%poison%","%shield% 2"]}},{level:7,normal:{health:14,move:2,attack:4,range:3,attributes:["%poison%","%shield% 1"]},elite:{health:18,move:3,attack:5,range:4,attributes:["%poison%","%shield% 2"]}}]},"Night Demon":{level:[{level:0,normal:{health:3,move:3,attack:3,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:5,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]}},{level:1,normal:{health:5,move:3,attack:3,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:8,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]}},{level:2,normal:{health:6,move:3,attack:4,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:11,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]}},{level:3,normal:{health:7,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:13,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]}},{level:4,normal:{health:8,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:15,move:5,attack:5,range:0,attributes:["Attackers gain Disadvantage"]}},{level:5,normal:{health:11,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:17,move:5,attack:6,range:0,attributes:["Attackers gain Disadvantage"]}},{level:6,normal:{health:14,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:21,move:5,attack:6,range:0,attributes:["Attackers gain Disadvantage"]}},{level:7,normal:{health:15,move:4,attack:6,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:21,move:5,attack:8,range:0,attributes:["Attackers gain Disadvantage"]}}]},"Rending Drake":{level:[{level:0,normal:{health:5,move:3,attack:3,range:0,attributes:[]},elite:{health:7,move:4,attack:4,range:0,attributes:[]}},{level:1,normal:{health:6,move:3,attack:3,range:0,attributes:["%wound%"]},elite:{health:7,move:4,attack:5,range:0,attributes:["%wound%"]}},{level:2,normal:{health:7,move:4,attack:3,range:0,attributes:["%wound%"]},elite:{health:9,move:5,attack:5,range:0,attributes:["%wound%"]}},{level:3,normal:{health:7,move:4,attack:4,range:0,attributes:["%wound%"]},elite:{health:10,move:5,attack:6,range:0,attributes:["%wound%"]}},{level:4,normal:{health:9,move:4,attack:4,range:0,attributes:["%wound%"]},elite:{health:11,move:6,attack:6,range:0,attributes:["%wound%"]}},{level:5,normal:{health:10,move:4,attack:5,range:0,attributes:["%wound%"]},elite:{health:14,move:6,attack:6,range:0,attributes:["%wound%"]}},{level:6,normal:{health:11,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:15,move:6,attack:7,range:0,attributes:["%wound%"]}},{level:7,normal:{health:14,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:18,move:6,attack:7,range:0,attributes:["%wound%"]}}]},"Savvas Icestorm":{level:[{level:0,normal:{health:7,move:2,attack:2,range:3,attributes:["%pierce% 3"]},elite:{health:12,move:2,attack:3,range:4,attributes:["%pierce% 3"]}},{level:1,normal:{health:10,move:2,attack:2,range:4,attributes:["%pierce% 3"]},elite:{health:12,move:2,attack:3,range:5,attributes:["%pierce% 3","%shield% 1"]}},{level:2,normal:{health:12,move:3,attack:2,range:4,attributes:["%pierce% 3"]},elite:{health:15,move:3,attack:3,range:5,attributes:["%pierce% 3","%shield% 1"]}},{level:3,normal:{health:12,move:3,attack:3,range:4,attributes:["%pierce% 3","%shield% 1"]},elite:{health:18,move:3,attack:4,range:6,attributes:["%pierce% 3","%shield% 1"]}},{level:4,normal:{health:14,move:3,attack:3,range:5,attributes:["%pierce% 3","%shield% 1"]},elite:{health:19,move:4,attack:4,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:5,normal:{health:16,move:3,attack:4,range:5,attributes:["%pierce% 3","%shield% 1"]},elite:{health:21,move:4,attack:5,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:6,normal:{health:16,move:3,attack:4,range:5,attributes:["%pierce% 3","%shield% 2"]},elite:{health:23,move:4,attack:6,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:7,normal:{health:17,move:4,attack:4,range:6,attributes:["%pierce% 3","%shield% 2"]},elite:{health:24,move:4,attack:6,range:6,attributes:["%pierce% 4","%shield% 3"]}}]},"Savvas Lavaflow":{level:[{level:0,normal:{health:8,move:3,attack:2,range:0,attributes:[]},elite:{health:13,move:3,attack:3,range:0,attributes:[]}},{level:1,normal:{health:9,move:3,attack:2,range:0,attributes:["%poison%"]},elite:{health:15,move:3,attack:3,range:0,attributes:["%wound%"]}},{level:2,normal:{health:11,move:3,attack:3,range:0,attributes:["%poison%"]},elite:{health:18,move:3,attack:3,range:0,attributes:["%poison%","%wound%"]}},{level:3,normal:{health:14,move:3,attack:3,range:0,attributes:["%poison%"]},elite:{health:21,move:3,attack:4,range:0,attributes:["%poison%","%wound%"]}},{level:4,normal:{health:16,move:3,attack:4,range:0,attributes:["%poison%"]},elite:{health:24,move:4,attack:4,range:0,attributes:["%poison%","%wound%"]}},{level:5,normal:{health:18,move:3,attack:4,range:0,attributes:["%poison%","%wound%"]},elite:{health:27,move:4,attack:5,range:0,attributes:["%poison%","%wound%"]}},{level:6,normal:{health:20,move:4,attack:4,range:0,attributes:["%poison%","%wound%"]},elite:{health:30,move:4,attack:6,range:0,attributes:["%poison%","%wound%"]}},{level:7,normal:{health:24,move:4,attack:4,range:0,attributes:["%poison%","%wound%"]},elite:{health:35,move:4,attack:6,range:0,attributes:["%poison%","%wound%"]}}]},"Spitting Drake":{level:[{level:0,normal:{health:5,move:3,attack:3,range:3,attributes:["%flying%"]},elite:{health:8,move:3,attack:4,range:4,attributes:["%flying%"]}},{level:1,normal:{health:6,move:3,attack:3,range:3,attributes:["%flying%"]},elite:{health:9,move:3,attack:4,range:4,attributes:["%flying%","%muddle%"]}},{level:2,normal:{health:8,move:3,attack:3,range:3,attributes:["%flying%","%muddle%"]},elite:{health:10,move:3,attack:5,range:4,attributes:["%flying%","%muddle%"]}},{level:3,normal:{health:8,move:3,attack:4,range:4,attributes:["%flying%","%muddle%"]},elite:{health:12,move:3,attack:5,range:5,attributes:["%flying%","%muddle%"]}},{level:4,normal:{health:9,move:4,attack:4,range:4,attributes:["%flying%","%muddle%"]},elite:{health:14,move:4,attack:5,range:5,attributes:["%flying%","%muddle%"]}},{level:5,normal:{health:12,move:4,attack:4,range:4,attributes:["%flying%","%muddle%"]},elite:{health:16,move:4,attack:6,range:5,attributes:["%flying%","%muddle%"]}},{level:6,normal:{health:13,move:4,attack:5,range:4,attributes:["%flying%","%muddle%"]},elite:{health:19,move:4,attack:6,range:5,attributes:["%flying%","%muddle%"]}},{level:7,normal:{health:16,move:4,attack:5,range:4,attributes:["%flying%","%muddle%"]},elite:{health:21,move:4,attack:7,range:5,attributes:["%flying%","%muddle%"]}}]},"Stone Golem":{level:[{level:0,normal:{health:10,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:2,attack:4,range:0,attributes:["%shield% 1"]}},{level:1,normal:{health:10,move:1,attack:3,range:0,attributes:["%shield% 1"]},elite:{health:11,move:2,attack:4,range:0,attributes:["%shield% 2"]}},{level:2,normal:{health:11,move:1,attack:4,range:0,attributes:["%shield% 1"]},elite:{health:14,move:2,attack:5,range:0,attributes:["%shield% 2"]}},{level:3,normal:{health:11,move:1,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:15,move:2,attack:5,range:0,attributes:["%shield% 3"]}},{level:4,normal:{health:12,move:2,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:17,move:2,attack:6,range:0,attributes:["%shield% 3"]}},{level:5,normal:{health:13,move:2,attack:5,range:0,attributes:["%shield% 2"]},elite:{health:19,move:3,attack:6,range:0,attributes:["%shield% 3"]}},{level:6,normal:{health:16,move:2,attack:5,range:0,attributes:["%shield% 2"]},elite:{health:20,move:3,attack:7,range:0,attributes:["%shield% 3"]}},{level:7,normal:{health:16,move:2,attack:5,range:0,attributes:["%shield% 3"]},elite:{health:21,move:3,attack:7,range:0,attributes:["%shield% 4"]}}]},"Sun Demon":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:9,move:2,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:1,normal:{health:7,move:2,attack:2,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:12,move:2,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:2,normal:{health:9,move:2,attack:2,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:13,move:2,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:3,normal:{health:10,move:2,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:15,move:3,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:4,normal:{health:11,move:3,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:16,move:3,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:5,normal:{health:11,move:3,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 2"]},elite:{health:16,move:3,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 2"]}},{level:6,normal:{health:12,move:3,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 2"]},elite:{health:18,move:4,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 2"]}},{level:7,normal:{health:15,move:3,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 2"]},elite:{health:22,move:4,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 2"]}}]},"Vermling Scout":{level:[{level:0,normal:{health:2,move:3,attack:1,range:0,attributes:[]},elite:{health:4,move:3,attack:2,range:0,attributes:[]}},{level:1,normal:{health:3,move:3,attack:1,range:0,attributes:[]},elite:{health:5,move:3,attack:2,range:0,attributes:[]}},{level:2,normal:{health:3,move:3,attack:2,range:0,attributes:[]},elite:{health:5,move:4,attack:3,range:0,attributes:[]}},{level:3,normal:{health:5,move:3,attack:2,range:0,attributes:[]},elite:{health:7,move:4,attack:3,range:0,attributes:[]}},{level:4,normal:{health:6,move:3,attack:3,range:0,attributes:[]},elite:{health:8,move:4,attack:4,range:0,attributes:[]}},{level:5,normal:{health:8,move:3,attack:3,range:0,attributes:[]},elite:{health:11,move:4,attack:4,range:0,attributes:[]}},{level:6,normal:{health:9,move:4,attack:3,range:0,attributes:[]},elite:{health:12,move:5,attack:4,range:0,attributes:[]}},{level:7,normal:{health:11,move:4,attack:3,range:0,attributes:[]},elite:{health:15,move:5,attack:4,range:0,attributes:[]}}]},"Vermling Shaman":{level:[{level:0,normal:{health:2,move:2,attack:1,range:3,attributes:["%shield% 2"]},elite:{health:3,move:3,attack:2,range:3,attributes:["%shield% 2"]}},{level:1,normal:{health:2,move:2,attack:1,range:3,attributes:["%shield% 3"]},elite:{health:3,move:3,attack:2,range:3,attributes:["%shield% 3"]}},{level:2,normal:{health:3,move:2,attack:1,range:4,attributes:["%shield% 3"]},elite:{health:4,move:3,attack:2,range:4,attributes:["%shield% 3"]}},{level:3,normal:{health:3,move:2,attack:2,range:4,attributes:["%shield% 3"]},elite:{health:5,move:3,attack:3,range:4,attributes:["%shield% 3"]}},{level:4,normal:{health:3,move:3,attack:2,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:5,move:3,attack:3,range:4,attributes:["%muddle%","%shield% 4"]}},{level:5,normal:{health:4,move:3,attack:3,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:6,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 4"]}},{level:6,normal:{health:5,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:6,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 5"]}},{level:7,normal:{health:7,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:8,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 5"]}}]},"Wind Demon":{level:[{level:0,normal:{health:3,move:3,attack:2,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:5,move:4,attack:3,range:4,attributes:["%flying%","%shield% 1"]}},{level:1,normal:{health:3,move:3,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:5,move:4,attack:3,range:4,attributes:["%flying%","%shield% 2"]}},{level:2,normal:{health:4,move:4,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:7,move:5,attack:3,range:4,attributes:["%flying%","%shield% 2"]}},{level:3,normal:{health:5,move:4,attack:3,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:8,move:5,attack:4,range:4,attributes:["%flying%","%shield% 2"]}},{level:4,normal:{health:7,move:4,attack:3,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:8,move:5,attack:4,range:4,attributes:["%flying%","%disarm%","%shield% 2"]}},{level:5,normal:{health:9,move:4,attack:3,range:4,attributes:["%flying%","%shield% 2"]},elite:{health:11,move:5,attack:4,range:4,attributes:["%flying%","%disarm%","%shield% 2"]}},{level:6,normal:{health:10,move:4,attack:3,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:12,move:5,attack:4,range:4,attributes:["%flying%","%disarm%","%shield% 3"]}},{level:7,normal:{health:11,move:4,attack:4,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:13,move:5,attack:5,range:4,attributes:["%flying%","%disarm%","%shield% 3"]}}]}},bosses:{"Bandit Commander":{level:[{level:0,health:"8xC",move:3,attack:3,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:1,health:"10xC",move:3,attack:3,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:2,health:"12xC",move:4,attack:3,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:3,health:"13xC",move:4,attack:4,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:4,health:"15xC",move:4,attack:4,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:5,health:"16xC",move:5,attack:5,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:6,health:"19xC",move:5,attack:5,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:7,health:"23xC",move:5,attack:5,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""}]},"The Betrayer":{level:[{level:0,health:"10xC",move:3,attack:4,range:3,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:1,health:"12xC",move:3,attack:5,range:3,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:2,health:"14xC",move:3,attack:6,range:4,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:3,health:"16xC",move:4,attack:7,range:4,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:4,health:"18xC",move:4,attack:8,range:4,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:5,health:"20xC",move:5,attack:8,range:5,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:6,health:"23xC",move:5,attack:9,range:5,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:7,health:"27xC",move:5,attack:9,range:5,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""}]},"Captain of the Guard":{level:[{level:0,health:"7xC",move:2,attack:3,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:1,health:"9xC",move:2,attack:3,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:2,health:"11xC",move:2,attack:4,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:3,health:"14xC",move:3,attack:4,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:4,health:"16xC",move:3,attack:5,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:5,health:"20xC",move:3,attack:5,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:6,health:"21xC",move:4,attack:6,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:7,health:"25xC",move:4,attack:6,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""}]},"The Colorless":{level:[{level:0,health:"9xC",move:3,attack:2,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 4, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:1,health:"10xC",move:3,attack:3,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 4, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:2,health:"11xC",move:4,attack:3,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 5, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:3,health:"12xC",move:4,attack:4,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 5, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:4,health:"14xC",move:4,attack:4,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 6, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:5,health:"15xC",move:4,attack:5,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 6, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:6,health:"17xC",move:4,attack:6,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 7, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:7,health:"19xC",move:5,attack:7,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 7, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""}]},"Dark Rider":{level:[{level:0,health:"9xC",move:2,attack:"3+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:1,health:"10xC",move:3,attack:"3+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:2,health:"12xC",move:3,attack:"3+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:3,health:"13xC",move:3,attack:"4+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:4,health:"15xC",move:3,attack:"4+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:5,health:"16xC",move:3,attack:"5+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:6,health:"16xC",move:4,attack:"5+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:7,health:"18xC",move:4,attack:"6+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"}]},"Elder Drake":{level:[{level:0,health:"11xC",move:0,attack:3,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:1,health:"12xC",move:0,attack:4,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:2,health:"15xC",move:0,attack:4,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:3,health:"16xC",move:0,attack:5,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:4,health:"20xC",move:0,attack:5,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:5,health:"22xC",move:0,attack:6,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:6,health:"27xC",move:0,attack:6,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:7,health:"29xC",move:0,attack:7,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""}]},"The Gloom":{level:[{level:0,health:"20xC",move:2,attack:5,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:1,health:"25xC",move:2,attack:5,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:2,health:"29xC",move:2,attack:6,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:3,health:"35xC",move:2,attack:6,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:4,health:"39xC",move:3,attack:7,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:5,health:"46xC",move:3,attack:7,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:6,health:"50xC",move:3,attack:8,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:7,health:"56xC",move:3,attack:9,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""}]},"Inox Bodyguard":{level:[{level:0,health:"6xC",move:2,attack:"C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 3"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:1,health:"7xC",move:2,attack:"1+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 3"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:2,health:"9xC",move:2,attack:"1+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 3"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:3,health:"10xC",move:3,attack:"2+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 4"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:4,health:"11xC",move:3,attack:"2+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 4"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:5,health:"13xC",move:3,attack:"3+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 5"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:6,health:"15xC",move:4,attack:"3+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 5"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:7,health:"17xC",move:4,attack:"4+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 5"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"}]},Jekserah:{level:[{level:0,health:"6xC",move:2,attack:2,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:1,health:"7xC",move:2,attack:3,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:2,health:"9xC",move:3,attack:3,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:3,health:"12xC",move:4,attack:4,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:4,health:"13xC",move:4,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:5,health:"15xC",move:5,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:6,health:"18xC",move:5,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:7,health:"22xC",move:5,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""}]},"Merciless Overseer":{level:[{level:0,health:"6xC",move:2,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:1,health:"8xC",move:2,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:2,health:"9xC",move:3,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:3,health:"11xC",move:3,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:4,health:"12xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:5,health:"14xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:6,health:"16xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:7,health:"19xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"}]},"Prime Demon":{level:[{level:0,health:"8xC",move:3,attack:4,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:1,health:"9xC",move:4,attack:4,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:2,health:"10xC",move:4,attack:5,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:3,health:"12xC",move:4,attack:6,range:0,special1:["Throne moves","Summon Demon","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:4,health:"14xC",move:5,attack:6,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:5,health:"16xC",move:5,attack:7,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:6,health:"20xC",move:5,attack:7,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:7,health:"22xC",move:5,attack:8,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""}]},"The Sightless Eye":{level:[{level:0,health:"7xC",move:0,attack:5,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:1,health:"8xC",move:0,attack:6,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:2,health:"10xC",move:0,attack:6,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:3,health:"11xC",move:0,attack:7,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:4,health:"14xC",move:0,attack:7,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:5,health:"15xC",move:0,attack:8,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:6,health:"18xC",move:0,attack:8,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:7,health:"20xC",move:0,attack:9,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""}]},"Winged Horror":{level:[{level:0,health:"6xC",move:3,attack:3,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:1,health:"7xC",move:4,attack:3,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:2,health:"8xC",move:4,attack:4,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:3,health:"10xC",move:4,attack:4,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:4,health:"12xC",move:5,attack:4,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:5,health:"14xC",move:5,attack:5,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:6,health:"17xC",move:5,attack:5,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:7,health:"20xC",move:5,attack:5,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""}]}}},o={living_corpse_two_levels_extra:{description:"All living corpses are two levels higher than the scenario level, up to a max of 7",affected_deck:"Living Corpse",extra_levels:2}},m=[{name:"#1 Black Barrow",decks:[{name:"Bandit Guard",deck_name:"Guard"},{name:"Bandit Archer",deck_name:"Archer"},{name:"Living Bones",deck_name:"Living Bones"}]},{name:"#2 Barrow Lair",decks:[{name:"Bandit Archer"},{name:"Boss: Bandit Commander"},{name:"Living Bones"},{name:"Living Corpse"}]},{name:"#3 Inox Encampment",decks:[{name:"Inox Guard"},{name:"Inox Archer"},{name:"Inox Shaman"}]},{name:"#4 Crypt of the Damned",decks:[{name:"Living Bones"},{name:"Bandit Archer"},{name:"Cultist"},{name:"Earth Demon"},{name:"Wind Demon"}]},{name:"#5 Ruinous Crypt",decks:[{name:"Cultist"},{name:"Living Bones"},{name:"Night Demon"},{name:"Flame Demon"},{name:"Frost Demon"}]},{name:"#6 Decaying Crypt",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Living Spirit"}]},{name:"#7 Vibrant Grotto",decks:[{name:"Forest Imp"},{name:"Cave Bear"},{name:"Inox Shaman"},{name:"Earth Demon"}]},{name:"#8 Gloomhaven Warehouse",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Boss: Inox Bodyguard"}]},{name:"#9 Diamond Mine",decks:[{name:"Hound"},{name:"Vermling Scout"},{name:"Boss: Merciless Overseer"}]},{name:"#10 Plane of Elemental Power",decks:[{name:"Flame Demon"},{name:"Earth Demon"},{name:"Sun Demon"}]},{name:"#11 Gloomhaven Square A",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"City Guard"},{name:"City Archer"},{name:"Boss: Captain of the Guard"}]},{name:"#12 Gloomhaven Square B",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Cultist"},{name:"City Guard"},{name:"City Archer"},{name:"Boss: Jekserah"}]},{name:"#13 Temple of the Seer",decks:[{name:"Stone Golem"},{name:"Cave Bear"},{name:"Living Spirit"},{name:"Spitting Drake"}]},{name:"#14 Frozen Hollow",decks:[{name:"Hound"},{name:"Living Spirit"},{name:"Frost Demon"}]},{name:"#15 Shrine of Strength",decks:[{name:"Stone Golem"},{name:"Savvas Icestorm"},{name:"Frost Demon"},{name:"Wind Demon"},{name:"Harrower Infester"}]},{name:"#16 Mountain Pass",decks:[{name:"Earth Demon"},{name:"Wind Demon"},{name:"Inox Guard"},{name:"Inox Archer"}]},{name:"#17 Lost Island",decks:[{name:"Vermling Scout"},{name:"Vermling Shaman"},{name:"Cave Bear"}]},{name:"#18 Abandoned Sewers",decks:[{name:"Giant Viper"},{name:"Ooze"},{name:"Vermling Scout"}]},{name:"#19 Forgotten Crypt",decks:[{name:"Cultist"},{name:"Living Bones"},{name:"Living Spirit"},{name:"Living Corpse"}]},{name:"#20 Necromancer's Sanctum",decks:[{name:"Living Bones"},{name:"Cultist"},{name:"Night Demon"},{name:"Living Corpse"},{name:"Boss: Jekserah"}]},{name:"#21 Infernal Throne",decks:[{name:"Sun Demon"},{name:"Frost Demon"},{name:"Night Demon"},{name:"Wind Demon"},{name:"Earth Demon"},{name:"Flame Demon"},{name:"Boss: Prime Demon"}]},{name:"#22 Temple of the Elements",decks:[{name:"Living Bones"},{name:"Cultist"},{name:"Earth Demon"},{name:"Flame Demon"},{name:"Frost Demon"},{name:"Wind Demon"}]},{name:"#23 Deep Ruins",decks:[{name:"Stone Golem"},{name:"Ancient Artillery"},{name:"Living Bones"},{name:"Living Spirit"}]},{name:"#24 Echo Chamber",decks:[{name:"Rending Drake"},{name:"Ooze"},{name:"Living Spirit"}]},{name:"#25 Icecrag Ascent",decks:[{name:"Hound"},{name:"Rending Drake"},{name:"Spitting Drake"}]},{name:"#26 Ancient Cistern",decks:[{name:"Living Corpse"},{name:"Ooze"},{name:"Night Demon"},{name:"Black Imp"}]},{name:"#27 Ruinous Rift",decks:[{name:"Night Demon"},{name:"Wind Demon"},{name:"Frost Demon"},{name:"Sun Demon"},{name:"Earth Demon"},{name:"Flame Demon"}]},{name:"#28 Outer Ritual Chamber",decks:[{name:"Living Corpse"},{name:"Cultist"},{name:"Living Bones"},{name:"Night Demon"},{name:"Sun Demon"}],special_rules:[o.living_corpse_two_levels_extra]},{name:"#29 Sanctuary of Gloom",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Living Spirit"},{name:"Black Imp"}]},{name:"#30 Shrine of the Depths",decks:[{name:"Ooze"},{name:"Lurker"},{name:"Deep Terror"}]},{name:"#31 Plane of the Night",decks:[{name:"Deep Terror"},{name:"Night Demon"},{name:"Black Imp"}]},{name:"#32 Decrepit Wood",decks:[{name:"Harrower Infester"},{name:"Giant Viper"},{name:"Deep Terror"},{name:"Black Imp"}]},{name:"#33 Savvas Armory",decks:[{name:"Savvas Icestorm"},{name:"Savvas Lavaflow"},{name:"Frost Demon"},{name:"Flame Demon"},{name:"Wind Demon"},{name:"Earth Demon"}]},{name:"#34 Scorched Summit",decks:[{name:"Rending Drake"},{name:"Spitting Drake"},{name:"Boss: Elder Drake"}]},{name:"#35 Gloomhaven Battlements A",decks:[{name:"Flame Demon"},{name:"Frost Demon"},{name:"Earth Demon"},{name:"Wind Demon"},{name:"City Archer"},{name:"City Guard"},{name:"Boss: Captain of the Guard"}]},{name:"#36 Gloomhaven Battlements B",decks:[{name:"Flame Demon"},{name:"Frost Demon"},{name:"Earth Demon"},{name:"Wind Demon"},{name:"City Archer"},{name:"Boss: Prime Demon"}]},{name:"#37 Doom Trench",decks:[{name:"Lurker"},{name:"Deep Terror"},{name:"Harrower Infester"}]},{name:"#38 Slave Pens",decks:[{name:"Inox Guard"},{name:"Inox Archer"},{name:"Inox Shaman"},{name:"Stone Golem"}]},{name:"#39 Treacherous Divide",decks:[{name:"Cave Bear"},{name:"Frost Demon"},{name:"Spitting Drake"},{name:"Cultist"},{name:"Living Bones"}]},{name:"#40 Ancient Defense Network",decks:[{name:"Living Corpse"},{name:"Flame Demon"},{name:"Cave Bear"},{name:"Stone Golem"},{name:"Forest Imp"}]},{name:"#41 Timeworn Tomb",decks:[{name:"Ancient Artillery"},{name:"Living Corpse"},{name:"Living Spirit"},{name:"Stone Golem"}]},{name:"#42 Realm of the Voice",decks:[{name:"Night Demon"},{name:"Wind Demon"},{name:"Living Spirit"}]},{name:"#43 - Drake Nest",decks:[{name:"Flame Demon"},{name:"Rending Drake"},{name:"Spitting Drake"}]},{name:"#44 Tribal Assault",decks:[{name:"Inox Guard"},{name:"Inox Archer"},{name:"Hound"},{name:"Inox Shaman"}]},{name:"#45 Rebel Swamp",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Hound"}]},{name:"#46 Nightmare Peak",decks:[{name:"Night Demon"},{name:"Frost Demon"},{name:"Wind Demon"},{name:"Savvas Icestorm"},{name:"Boss: Winged Horror"}]},{name:"#47 Lair of the Unseeing Eye",decks:[{name:"Lurker"},{name:"Deep Terror"},{name:"Harrower Infester"},{name:"Boss: The Sightless Eye"}]},{name:"#48 - Shadow Weald",decks:[{name:"Forest Imp"},{name:"Earth Demon"},{name:"Harrower Infester"},{name:"Boss: Dark Rider"}]},{name:"#49 Rebel's Stand",decks:[{name:"Giant Viper"},{name:"City Archer"},{name:"City Guard"},{name:"Ancient Artillery"}]},{name:"#50 Ghost Fortress",decks:[{name:"Night Demon"},{name:"Sun Demon"},{name:"Earth Demon"}]},{name:"#51 The Void",decks:[{name:"Boss: The Gloom"}]},{name:"#52 Noxious Cellar",decks:[{name:"Spitting Drake"},{name:"Ooze"},{name:"Vermling Scout"},{name:"Living Corpse"},{name:"Vermling Shaman"}]},{name:"#53 Crypt Basement",decks:[{name:"Ooze"},{name:"Living Corpse"},{name:"Living Spirit"},{name:"Living Bones"},{name:"Giant Viper"}]},{name:"#54 Palace of Ice",decks:[{name:"Cave Bear"},{name:"Living Spirit"},{name:"Frost Demon"},{name:"Harrower Infester"}]},{name:"#55 Foggy Thicket",decks:[]},{name:"#56 Bandit's Wood",decks:[{name:"Hound"},{name:"Bandit Archer"},{name:"Rending Drake"},{name:"Bandit Guard"}]},{name:"#57 Investigation",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Hound"}]},{name:"#58 Bloody Shack",decks:[{name:"Earth Demon"},{name:"Harrower Infester"},{name:"Black Imp"},{name:"City Guard"}]},{name:"#59 Forgotten Grove",decks:[{name:"Cave Bear"},{name:"Hound"},{name:"Forest Imp"}]},{name:"#60 Alchemy Lab",decks:[{name:"Ooze"},{name:"Giant Viper"},{name:"Hound"},{name:"Rending Drake"},{name:"Spitting Drake"}]},{name:"#61 Fading Lighthouse",decks:[{name:"Ooze"},{name:"Giant Viper"},{name:"Frost Demon"},{name:"Flame Demon"}]},{name:"#62 Pit of Souls",decks:[{name:"Living Bones"},{name:"Living Spirit"}]},{name:"#63 Magma Pit",decks:[{name:"Vermling Scout"},{name:"Inox Guard"},{name:"Inox Archer"},{name:"Flame Demon"}]},{name:"#64 Underwater Lagoon",decks:[{name:"Ooze"},{name:"Forest Imp"},{name:"Rending Drake"}]},{name:"#65 Sulfur Mine",decks:[{name:"Vermling Scout"},{name:"Hound"},{name:"Inox Shaman"}]},{name:"#66 Clockwork Cove",decks:[{name:"Ooze"},{name:"Ancient Artillery"},{name:"Living Spirit"},{name:"Stone Golem"}]},{name:"#67 Arcane Library",decks:[{name:"Forest Imp"},{name:"Cave Bear"},{name:"Stone Golem"}]},{name:"#68 Toxic Moor",decks:[{name:"Rending Drake"},{name:"Black Imp"},{name:"Giant Viper"},{name:"Living Corpse"}]},{name:"#69 Well of the Unfortunate",decks:[{name:"Vermling Scout"},{name:"Vermling Shaman"},{name:"Forest Imp"},{name:"Stone Golem"},{name:"Living Spirit"}]},{name:"#70 Chained Isle",decks:[{name:"Night Demon"},{name:"Wind Demon"},{name:"Living Spirit"}]},{name:"#71 Windswept Highlands",decks:[{name:"Spitting Drake"},{name:"Wind Demon"},{name:"Sun Demon"}]},{name:"#72 Oozing Grove",decks:[{name:"Ooze"},{name:"Forest Imp"},{name:"Giant Viper"}]},{name:"#73 Rockslide Ridge",decks:[{name:"Hound"},{name:"Inox Archer"},{name:"Ancient Artillery"},{name:"Inox Guard"},{name:"Inox Shaman"}]},{name:"#74 Merchant Ship",decks:[{name:"Bandit Guard"},{name:"Bandit Archer"},{name:"Lurker"},{name:"Deep Terror"}]},{name:"#75 Overgrown Graveyard",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Living Spirit"}]},{name:"#76 Harrower Hive",decks:[{name:"Giant Viper"},{name:"Living Bones"},{name:"Night Demon"},{name:"Harrower Infester"}]},{name:"#77 Vault of Secrets",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Stone Golem"},{name:"Hound"}]},{name:"#78 Sacrifice Pit",decks:[{name:"Bandit Guard"},{name:"Bandit Archer"},{name:"Cultist"},{name:"Living Bones"},{name:"Black Imp"}]},{name:"#79 Lost Temple",decks:[{name:"Stone Golem"},{name:"Giant Viper"},{name:"Boss: The Betrayer"}]},{name:"#80 Vigil Keep",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Ancient Artillery"},{name:"Hound"}]},{name:"#81 Temple of the Eclipse",decks:[{name:"Night Demon"},{name:"Sun Demon"},{name:"Stone Golem"},{name:"Ancient Artillery"},{name:"Boss: The Colorless"}]},{name:"#82 Burning Mountain",decks:[{name:"Earth Demon"},{name:"Flame Demon"},{name:"Stone Golem"}]},{name:"#83 Shadows Within",decks:[{name:"Hound"},{name:"Cultist"},{name:"Living Bones"},{name:"Living Spirit"},{name:"Flame Demon"}]},{name:"#84 Crystalline Cave",decks:[{name:"Flame Demon"},{name:"Frost Demon"},{name:"Earth Demon"}]},{name:"#85 Sun Temple",decks:[{name:"Hound"},{name:"Black Imp"},{name:"Night Demon"},{name:"Sun Demon"}]},{name:"#86 Harried Village",decks:[{name:"Cave Bear"},{name:"Vermling Shaman"},{name:"Vermling Scout"},{name:"Lurker"}]},{name:"#87 Corrupted Cove",decks:[{name:"Lurker"},{name:"Deep Terror"},{name:"Ooze"},{name:"Black Imp"}]},{name:"#88 Plane of Water",decks:[{name:"Frost Demon"},{name:"Ooze"},{name:"Lurker"}]},{name:"#89 Syndicate Hideout",decks:[{name:"Bandit Archer"},{name:"Bandit Guard"},{name:"Cultist"},{name:"Giant Viper"}]},{name:"#90 Demonic Rift",decks:[{name:"Earth Demon"},{name:"Wind Demon"},{name:"Night Demon"},{name:"Living Spirit"}]},{name:"#91 Wild Melee",decks:[{name:"Cave Bear"},{name:"Hound"},{name:"Bandit Guard"},{name:"Bandit Archer"},{name:"Living Spirit"}]},{name:"#92 Back Alley Brawl",decks:[{name:"Bandit Guard"},{name:"City Guard"},{name:"Inox Guard"},{name:"Bandit Archer"},{name:"City Archer"},{name:"Savvas Lavaflow"},{name:"Flame Demon"},{name:"Earth Demon"}]},{name:"#93 Sunken Vessel",decks:[{name:"Lurker"},{name:"Frost Demon"},{name:"Living Spirit"}]},{name:"#94 Vermling Nest",decks:[{name:"Hound"},{name:"Vermling Scout"},{name:"Vermling Shaman"},{name:"Cave Bear"}]},{name:"#95 Payment Due",decks:[{name:"Deep Terror"},{name:"Flame Demon"},{name:"Earth Demon"},{name:"Savvas Lavaflow"}]}],c={"%air%":"","%any%":"","%aoe-4-with-black%":"","%aoe-circle%":"
    ","%aoe-circle-with-middle-black%":"
    ","%aoe-circle-with-side-black%":"","%aoe-line-3-with-black%":"
    ","%aoe-line-4-with-black%":"
    ","%aoe-line-6-with-black%":"
    ","%aoe-triangle-2-side%":"
    ","%aoe-triangle-2-side-with-black%":"
    ","%aoe-triangle-3-side-with-corner-black%":"
    ","%attack%":"Attack ","%bless%":"BLESS ","%boss-aoe-elder-drake-sp1%":"
    ","%boss-aoe-inox-bodyguard-sp1%":"
    ","%boss-aoe-sightless-eye-sp1%":"
    ","%boss-aoe-sightless-eye-sp2%":"
    ","%curse%":"CURSE ","%dark%":"","%disarm%":"DISARM ","%earth%":"","%fire%":"","%heal%":"Heal ","%ice%":"","%immobilize%":"IMMOBILIZE ","%invisible%":"INVISIBLE ","%jump%":"Jump ","%light%":"","%loot%":"Loot ","%move%":"Move ","%muddle%":"MUDDLE ","%pierce%":"PIERCE ","%poison%":"POISON ","%pull%":"PULL ","%push%":"PUSH ","%range%":"Range ","%retaliate%":"Retaliate ","%shield%":"Shield ","%flying%":"","%strengthen%":"STRENGTHEN ","%stun%":"STUN ","%target%":"Target ","%use_element%":"","%wound%":"WOUND "};function h(e){const a=e.toLowerCase();return a in c?c[a]:e}function u(e,a,t){let n=new RegExp("%"+a+"% (\\+|-)(\\d*)","g");const l=n.exec(e),i=2===t.length;let s=t[0],r="";const o=(n=new RegExp("(\\d*)([+\\-])?([a-zA-Z]+)","i")).exec(String(s));if(o&&o[3]){const e="-"===o[2]?"-":"+";r=o[3]+e,s=""!==o[1]?parseInt(o[1]):0}if(l){if("+"===l[1]){const e=s+parseInt(l[2]);if(i){return"%"+a+"% "+e+" / "+(t[1]+parseInt(l[2]))+""}return"%"+a+"% "+r+e}if("-"===l[1]){const e=s-parseInt(l[2]);if(i){return"%"+a+"% "+e+" / "+(t[1]-parseInt(l[2]))+""}return"%"+a+"% "+r+e}}return e}function d(e){if(!e||0===e[0].length&&0===e[1].length)return[];{let a=["* Attributes"];const t=[];let n=0;for(let a=0;a"+e.replace(/(,\s$)/g,"")+"":""})))}}function v(e){if(e){const a=[];let t=0;for(let n=0;n"+e.replace(/(,\s$)/g,"")+""})))}return[]}function g(e){return["* Notes: "+e+""]}function k(e,a){return a.map((function(e){return"* "+e}))}function p(e,a,t){return a&&-1!==e.indexOf("Special 1")&&(e=k(0,a)),a&&-1!==e.indexOf("Special 2")&&(e=k(0,t)),e}function b(e,a,t,n){const l=new RegExp("%(attack|move|range)% ([+\\-])(\\d*)","g");let i=l.exec(e);for(;i;)"attack"===i[1]?e=e.replace(i[0],u(i[0],"attack",a)):"move"===i[1]?e=e.replace(i[0],u(i[0],"move",t)):"range"===i[1]&&(e=e.replace(i[0],u(i[0],"range",n))),i=l.exec(e);return e.replace(/%[^%]*%/gi,h)}function f(e,a,t){for(let a in e)e[a].className=a===t?"":"inactive";for(let e in a)a[e].className=e===t?"tabbody":"inactive tabbody"}function S(e,a,t){e.className=t?"pane":"pane inactive",a.style.display=t?"initial":"none"}const _={};function C(e,a,t){t?e.classList.add(a):e.classList.remove(a)}function y(e,a,t,n){const l=document.createElement("input");l.type=e,l.name=a,l.value=t;const i=document.createTextNode(n),s=document.createElement("label");return s.appendChild(l),s.appendChild(i),{root:s,input:l}}function D(e){const a=[];for(let t in e)a.push(e[t]);return a}function w(e){return"checked"in e&&e.checked}function x(e){return"value"in e?e.value:""}function L(e,a){try{localStorage.setItem(e,a)}catch(e){console.error("Local storage is required")}}function A(e){try{return localStorage.getItem(e)}catch(e){console.error("Local storage is required")}}function I(e,a){for(let t=0;t Create a 3 damage trap in an adjacent empty hex closest to an enemy "],[!0,"29","* %move% +0","* %attack% -1","** %range% +1","** %immobilize%"]]},{class:"Boss",cards:[[!1,"11","* Special 2"],[!1,"14","* Special 2"],[!0,"17","* Special 2"],[!0,"85","* Special 1"],[!1,"79","* Special 1"],[!1,"73","* Special 1"],[!1,"36","* %move% +0","* %attack% +0"],[!1,"52","* %move% -1","* %attack% -1","** %range% 3","** %target% 2"]]},{class:"Cave Bear",cards:[[!1,"13","* %move% +1","* %attack% -1"],[!1,"14","* %move% -1","* %attack% -1","** %immobilize%"],[!0,"34","* %attack% +1","** %wound%"],[!1,"41","* %move% +0","* %attack% +0"],[!1,"60","* %move% -1","* %attack% +1"],[!0,"80","* %attack% -1","* %move% -2","* %attack% -1","** %wound%"],[!1,"61","* %move% +0","* %attack% -1","** %target% 2"],[!1,"03","* %shield% 1","* %retaliate% 2","* %heal% 2","** Self"]]},{class:"Cultist",cards:[[!1,"10","* %move% -1","* %attack% -1","* On Death:","** %attack% +2 %aoe-circle-with-middle-black%"],[!1,"10","* %move% -1","* %attack% -1","* On Death:","** %attack% +2 %aoe-circle-with-middle-black%"],[!1,"27","* %move% +0","* %attack% +0"],[!1,"27","* %move% +0","* %attack% +0"],[!1,"39","* %move% -1","* %attack% +0","* %heal% 1","** Self"],[!0,"63","* Summon normal Living Bones","* Cultist suffers 2 damage."],[!0,"63","* Summon normal Living Bones","* Cultist suffers 2 damage."],[!1,"31","* %move% -1","* %heal% 3","** %range% 3"]]},{class:"Deep Terror",cards:[[!1,"65","* %attack% +0","** %range% 3","** %target% 3","** %curse%"],[!0,"60","* %attack% +0 %aoe-line-6-with-black%","** %pierce% 3"],[!0,"60","* %attack% +0 %aoe-line-6-with-black%","** %pierce% 3"],[!1,"84","* %attack% -1","** Target all adjacent enemies","* %attack% +0","** %range% 4","** %wound%"],[!1,"75","* %attack% +0","** %poison%","* %attack% -1","** %range% 5","** %immobilize%"],[!1,"75","* %attack% -2","** Target all adjacent enemies","** %disarm%","* %attack% +0","** %range% 3","** %target% 2"],[!1,"96","* %attack% -2","** %range% 6","** Summon normal Deep Terror in a hex adjacent to the target"],[!1,"54","* %wound% and %poison%","** Target all adjacent enemies","* %attack% +0","** %range% 4"]]},{class:"Earth Demon",cards:[[!0,"40","* %heal% 3","** Self","* %earth%%use_element%: %immobilize% Target all enemies within %range% 3"],[!0,"42","* %move% +1","* %attack% -1"],[!1,"62","* %move% +0","* %attack% +0","* %earth%"],[!1,"71","* %attack% +0","** %range% 4","** %earth%%use_element%: %target% 2"],[!1,"83","* %move% -1","* %attack% +1","* %earth%"],[!1,"93","* %move% -1","* %attack% -1","** Target all adjacent enemies","* %earth%%use_element%: %push% 1"],[!1,"79","* %move% +1","* %attack% +0","** %air%%use_element%: -2 %attack%"],[!1,"87","* %move% +0","* %attack% -1
    %aoe-4-with-black%
    ","* %any%%use_element%: %earth%"]]},{class:"Flame Demon",cards:[[!1,"03","* %move% +1","* %attack% -1","** %range% +0","* %fire%"],[!1,"24","* %move% +0","* %attack% +0","** %range% +0","* %fire%"],[!0,"46","* %attack% +0","** %range% +0","** %fire%%use_element%: %aoe-circle%"],[!1,"49","* %attack% +0 %aoe-line-3-with-black%","**
    %fire%%use_element%: +1 %attack%
    %wound%
    "],[!1,"67","* %move% -1","* %attack% +1","** %range% -1","* %fire%"],[!1,"77","* %attack% +0","** Target all adjacent enemies","** %ice%%use_element%:Flame Demon suffers 1 damage."],[!0,"30","*
    %fire%%use_element%: All adjacent enemies
    suffer 2 damage.
    ","* %move% +0","* %attack% -2","** %range% +0","** %wound%","** %target% 2"],[!1,"08","* %move% -1","* Create a 4 damage trap in an adjacent empty hex closest to an enemy ","* %any%%use_element%: %fire%"]]},{class:"Frost Demon",cards:[[!1,"18","* %immobilize%","** Target all enemies within %range% 2","* %ice%%use_element%: %heal% 3
    Self
    "],[!1,"38","* %move% +1","* %attack% -1"],[!1,"58","* %move% +0","* %attack% +0"],[!1,"58","* %move% -1","* %attack% +0","** %range% 2","** %ice%%use_element%: +2 %attack%, +1 %range%"],[!0,"78","* %move% -1","* %attack% +0 %aoe-triangle-2-side-with-black%","* %ice%"],[!0,"78","* %move% -1","* %attack% +0 %aoe-triangle-2-side-with-black%","* %ice%"],[!1,"58","* %move% -1","* %attack% -1","** %pierce% 3","* %any%%use_element%: %ice%"],[!1,"18","* %shield% 2","* %move% +1","* %fire%%use_element%: Frost Demon suffers 1 damage"]]},{class:"Giant Viper",cards:[[!0,"32","* %move% +0","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Giant Viper's allies."],[!0,"32","* %move% +0","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Giant Viper's allies."],[!1,"11","* %shield% 1","* %attack% -1"],[!1,"43","* %move% +1","** %jump%","* %attack% -1","** Target all adjacent enemies."],[!1,"58","* %move% -1","* %attack% +1"],[!1,"58","* %move% +1","** %jump%","* %attack% -1","** All attacks targeting Giant Viper this round gain Disadvantage."],[!1,"43","* %move% -1","** %jump%","* %attack% +0","** %target% 2"],[!1,"23","* %move% -1","* %attack% -1","** %immobilize%","* %attack% -1"]]},{class:"Guard",cards:[[!0,"15","* %shield% 1","* %retaliate% 2"],[!1,"30","* %move% +1","* %attack% -1"],[!1,"35","* %move% -1","* %attack% +0","** %range% 2"],[!1,"50","* %move% +0","* %attack% +0"],[!1,"50","* %move% +0","* %attack% +0"],[!1,"70","* %move% -1","* %attack% +1"],[!1,"55","* %move% -1","* %attack% +0","* %strengthen%","** Self"],[!0,"15","* %shield% 1","* %attack% +0","** %poison%"]]},{class:"Harrower Infester",cards:[[!1,"38","* %move% -1","* %attack% +1","** %target% 2"],[!1,"07","* %move% +0","* %attack% -1","** %poison%","* %dark%"],[!1,"16","* %move% -1","* %attack% -1","* %heal% 5","** Self"],[!1,"16","* %attack% +2","** %immobilize%","* %retaliate% 2"],[!0,"02","* %shield% 2","* %retaliate% 2","** %range% 3"],[!1,"30","* %move% -1","* %attack% +0 %aoe-line-4-with-black%",'** %dark%%use_element%: Perform "%heal% 2, Self"
    for each target damaged'],[!1,"38","* %move% +0","* %attack% -1","** %target% 2","** %dark%%use_element%: +2 %attack%, %disarm%"],[!0,"07","* %attack% -1","** %range% 3","** %muddle%","* %heal% 4","** Self"]]},{class:"Hound",cards:[[!1,"06","* %move% -1","* %attack% +0","** %immobilize%"],[!1,"07","* %move% +0","* %muddle%","** Target all adjacent enemies"],[!0,"19","* %move% +1","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Hound's allies"],[!0,"19","* %move% +1","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Hound's allies"],[!1,"26","* %move% +0","* %attack% +0"],[!1,"26","* %move% +0","* %attack% +0"],[!1,"83","* %move% -2","* %attack% +1"],[!1,"72","* %attack% -1","** %pierce% 2","* %move% -2","* %attack% -1","** %pierce% 2"]]},{class:"Imp",cards:[[!1,"05","* %shield% 5","* %heal% 1","** Self"],[!1,"37","* %move% +0","* %attack% +0","** %range% +0"],[!1,"37","* %move% +0","* %attack% +0","** %range% +0"],[!1,"42","* %move% +1","* %heal% 2","** %range% 3"],[!0,"43","* %move% +0","* %attack% -1","** %range% +0, %target% 2, %poison%"],[!1,"76","* %move% -1","* %attack% +1","** %range% +0"],[!0,"43","* %move% +0","* %attack% -1","** %range% +0, %target% 2, %curse%"],[!1,"24","* %strengthen%","** Affect all allies within %range% 2","* %muddle%","** Target all enemies within %range% 2"]]},{class:"Living Bones",cards:[[!1,"64","* %move% -1","* %attack% +1"],[!0,"20","* %move% -2","* %attack% +0","* %heal% 2","** Self"],[!1,"25","* %move% +1","* %attack% -1"],[!1,"45","* %move% +0","* %attack% +0"],[!1,"45","* %move% +0","* %attack% +0"],[!1,"81","* %attack% +2"],[!1,"74","* %move% +0","* %attack% +0","** Target one enemy with all attacks"],[!0,"12","* %shield% 1","* %heal% 2","** Self"]]},{class:"Living Corpse",cards:[[!1,"21","* %move% +1","* %muddle% and %immobilize%","** Target one adjacent enemy"],[!1,"47","* %move% +1","* %attack% -1"],[!0,"66","* %move% +0","* %attack% +0"],[!0,"66","* %move% +0","* %attack% +0"],[!1,"82","* %move% -1","* %attack% +1"],[!1,"91","* %move% +1","* Living Corpse suffers 1 damage."],[!1,"71","* %move% +0","* %attack% +1","* %poison%","** Target all adjacent enemies"],[!1,"32","* %attack% +2","** %push% 1","* Living Corpse suffers 1 damage."]]},{class:"Living Spirit",cards:[[!0,"22","* %move% -1","* %attack% -1","** %range% +0","** %muddle%"],[!0,"33","* %move% +0","* %attack% -1","** %range% +0","** Target all enemies within range"],[!1,"48","* %move% +0","* %attack% +0","** %range% +0"],[!1,"48","* %move% +0","* %attack% +0","** %range% +0"],[!1,"61","* %attack% +0","** %range% -1","** %target% 2"],[!1,"75","* %move% -1","* %attack% +1","** %range% -1","* %heal% 1","** Self"],[!1,"55","* %move% +0","* %curse%","** %range% +0","** Target all enemies within range","* %ice%"],[!1,"67","* %move% -1","* %attack% +1","** %range% +0","** %ice%%use_element%: %stun%"]]},{class:"Lurker",cards:[[!0,"11","* %shield% 1","** %ice%%use_element%: %shield% 2 instead","* %wound%","** Target all adjacent enemies"],[!1,"28","* %move% +1","* %attack% -1"],[!1,"38","* %move% +0","* %attack% +0"],[!1,"38","* %move% +0","* %attack% +0","** Target one enemy with all attacks"],[!1,"61","* %move% -1","* %attack% +1"],[!1,"64","* %attack% +1","** Target all adjacent enemies"],[!1,"41","* %ice%%use_element%: %strengthen%","** Self","* %move% +0","* %attack% -1","** %wound%"],[!0,"23","* %shield% 1","* %move% +0","* %attack% -1","* %ice%"]]},{class:"Night Demon",cards:[[!1,"04","* %move% +1","* %attack% -1","* %dark%"],[!1,"07","* %move% +1","* %attack% -1","* %dark%%use_element%: %invisible%","** Self"],[!1,"22","* %move% +0","* %attack% +0","* %dark%"],[!1,"26","* %attack% -2","** %range% 3","** %target% 3","** %dark%%use_element%: %muddle%"],[!0,"46","* %move% -1","* %attack% +1","** %dark%%use_element%: +2 %attack%"],[!0,"41","* %move% -1","* %attack% +1","* %dark%"],[!1,"35","* %attack% -1","* %attack% -1","** %pierce% 2","* %light%%use_element%: %curse%","** Self"],[!1,"15","* %move% +0","* %attack% -1","* All adjacent enemies and allies suffer 1 damage.","* %any%%use_element%: %dark%"]]},{class:"Ooze",cards:[[!1,"36","* %move% +1","* %attack% -1","** %range% +0"],[!1,"57","* %move% +0","* %attack% +0","** %range% +0"],[!1,"59","* %attack% +0","** %range% +0","** %target% 2","** %poison%"],[!1,"66","* %move% -1","* %attack% +1","** %range% +1"],[!0,"94","* Ooze suffers 2 damage ","** Summons normal Ooze with a hit point value equal to the summoning Ooze's current hit point value (limited by a normal Ooze's specified maximum hit point value)"],[!0,"94","* Ooze suffers 2 damage ","** Summons normal Ooze with a hit point value equal to the summoning Ooze's current hit point value (limited by a normal Ooze's specified maximum hit point value)"],[!1,"85","* %push% 1 and","* %poison%","** Target all adjacent enemies","* %attack% +1","** %range% -1"],[!1,"66","* %move% -1","* %loot% 1","* %heal% 2","** Self"]]},{class:"Rending Drake",cards:[[!1,"12","* %move% +1","* %attack% -1"],[!0,"13","* %attack% -1","* %move% -1","* %attack% -1"],[!1,"25","* %move% +0","* %attack% +0"],[!1,"39","* %move% -1","* %attack% +1"],[!1,"54","* %move% -2","* %attack% -1","** %range% 3","** %target% 2","** %poison%"],[!1,"59","* %move% -2","* %attack% +1","** %target% 2"],[!1,"06","* %shield% 2","* %heal% 2","** Self","* %strengthen%","** Self"],[!0,"72","* %attack% -1","* %attack% -1","* %attack% -2"]]},{class:"Savvas Icestorm",cards:[[!1,"70","* %push% 2","** Target all adjacent enemies","** %air%%use_element%: %push% 4 instead","* %attack% +1","** %range% +1"],[!1,"98","* Summon normal Wind Demon","* %air%"],[!1,"98","* Summon normal Frost Demon","* %ice%"],[!1,"19","* %move% +0","* %attack% -1","** %range% -1","* %shield% 1","** Affect self and all allies within %range% 2","* %ice%"],[!1,"14","* %attack% +0","** %range% +0","** %ice%%use_element%: +2 %attack%, %immobilize%","* %retaliate% 2","* %air%"],[!1,"14","* %shield% 4","* %heal% 2","** %range% 3","** %ice%%use_element%: +3 %heal%","* %air%%use_element%: %attack% +0"],[!0,"47","* %disarm%","** Target all adjacent enemies","* %move% +0","* %attack% -1","** %range% +0","* %air%"],[!0,"35","* %move% -1","* %attack% -1 %aoe-triangle-3-side-with-corner-black% ","* %ice%"]]},{class:"Savvas Lavaflow",cards:[[!1,"97","* Summon normal Flame Demon","* %fire%"],[!1,"97","* Summon normal Earth Demon","* %earth%"],[!1,"22","* %move% +1","* %attack% -1","** Target all adjacent enemies","* %fire%%use_element%: %retaliate% 3"],[!0,"68","* %move% -1","* %attack% +1","** %range% 3","** All allies and enemies adjacent to the target suffer 2 damage.","* %earth%"],[!1,"41","* %move% +0","* %attack% -1 %aoe-line-4-with-black% ","** %earth%%use_element%: +2 %attack%, %immobilize%"],[!1,"51","* All enemies suffer 2 damage.","* %fire%%use_element%: %wound% all enemies","* %earth%%use_element%: %disarm% all enemies"],[!1,"31","* %heal% 4","** %range% 3","** %earth%%use_element%: %target% 3"],[!0,"68","* %move% -1","* %attack% -1","** %range% 3","** %target% 2","* %fire%"]]},{class:"Scout",cards:[[!1,"29","* %move% -1","* %attack% -1","** %range% 3"],[!1,"40","* %move% +1","* %attack% -1"],[!1,"53","* %move% +0","* %attack% +0"],[!1,"54","* %move% -2","* %attack% +0","** %range% 3","** %poison%"],[!1,"69","* %move% -1","* %attack% +1"],[!0,"92","* %attack% +2","** %poison% "],[!0,"35","* %move% +1","** %jump%","* %loot% 1"],[!1,"79","* %attack% -1","** %range% 4","** %target% 2"]]},{class:"Shaman",cards:[[!1,"08","* %move% +0","* %attack% -1","** %range% +0","** %disarm%"],[!1,"08","* %move% -1","* %attack% +0","** %range% +0","** %immobilize%"],[!0,"23","* %move% +0","* %heal% 3","** %range% 3"],[!0,"23","* %move% +0","* %heal% 3","** %range% 3"],[!1,"62","* %move% +0","* %attack% +0","** %range% +0"],[!1,"74","* %move% -1","* %attack% +1","** %range% +0"],[!1,"89","* %move% -1","* %heal% 1","** Affect all adjacent allies","* %bless%","** Self"],[!1,"09","* %move% +1","* %attack% -1","** %range% +0, %curse%, %target% 2"]]},{class:"Spitting Drake",cards:[[!1,"32","* %move% +1","* %attack% -1","** %range% +0"],[!1,"52","* %move% +0","* %attack% +0","** %range% +0"],[!0,"57","* %move% +0","* %attack% -1 %aoe-triangle-2-side%","** %range% +0"],[!1,"27","* %attack% +0","** %range% +0, %target% 2, %poison%"],[!1,"87","* %move% -1","* %attack% +1","** %range% +0"],[!1,"89","* %attack% -2","** %range% +0","** %stun%"],[!1,"06","* %shield% 2","* %heal% 2","** Self","* %strengthen%","** Self"],[!0,"89","* %move% -1","* %attack% -2 %aoe-circle%","** %range% +0","** %poison%"]]},{class:"Stone Golem",cards:[[!1,"11","* %retaliate% 3","** %range% 3"],[!1,"28","* %move% +1","* %attack% +0","* Stone Golem suffers 1 damage."],[!0,"51","* %move% +1","* %attack% -1"],[!1,"65","* %move% +0","* %attack% +0"],[!1,"72","* %attack% +1","** %range% 3","* Stone Golem suffers 2 damage"],[!0,"90","* %move% -1","* %attack% +1"],[!1,"28","* %move% +1","* %attack% -2","** %range% 3","** %pull% 2","** %immobilize%"],[!1,"83","* %move% +0","* %attack% -1","** Target all adjacent enemies"]]},{class:"Sun Demon",cards:[[!0,"17","* %heal% 3","** %range% 3","** %light%%use_element%: Target all allies within range instead"],[!1,"36","* %move% +0","* %attack% +0","** Target all adjacent enemies","* %light%"],[!1,"36","* %move% +0","* %attack% +0","** Target all adjacent enemies","* %light%"],[!1,"68","* %move% +0","* %attack% +1","* %light%"],[!0,"73","* %move% +0","* %attack% +1","* %light%%use_element%: %heal% 3","** Self"],[!1,"95","* %move% -1","* %attack% +0","** %range% 4","** %light%%use_element%: Target all enemies within range"],[!1,"88","* %move% -1","* %attack% -1","** Target all adjacent enemies","* %dark%%use_element%: %muddle%","** Self"],[!1,"50","* %move% +0","* %attack% +0","** %range% 3","* %any%%use_element%: %light%"]]},{class:"Wind Demon",cards:[[!1,"09","* %attack% -1","** %range% +0","* %heal% 1","** Self","* %air%%use_element%: %invisible%
    Self"],[!0,"21","* %move% +0","* %attack% +0","** %range% +0, %pull% 1","* %air%"],[!0,"21","* %move% +0","* %attack% +0","** %range% +0, %pull% 1","* %air%"],[!1,"29","* %move% +0","* %attack% -1","** %range% +0, %target% 2","** %air%%use_element%: %push% 2"],[!1,"37","* %move% +0","* %attack% +0
    %aoe-4-with-black%
    ","** %air%%use_element%: +1 Attack
    %aoe-circle-with-side-black%
    "],[!1,"43","* %move% -1","* %attack% +1","** %range% +0","** %air%%use_element%: %target% 2"],[!1,"43","* %push% 1","** Target all adjacent enemies","* %attack% +0","** %range% +0","** %earth%%use_element%: -2 %range%"],[!1,"02","* %shield% 1","* %move% -1","* %attack% -1","** %range% +0","* %any%%use_element%: %air%"]]}]),z={MODIFIER:"modifier",ABILITY:"ability",BOSS:"boss"},G={MODIFIER_CARD_DRAWN:"modifierCardDrawn",MODIFIER_DECK_SHUFFLE_REQUIRED:"modfierDeckShuffleRequired"};function F(e,a){const t={};return t.back=a,t.front=e,t.flip_up=function(e){C(this.back,"up",!e),C(this.back,"down",e),C(this.front,"up",e),C(this.front,"down",!e)},t.set_depth=function(e){e=e.toString(),this.back.style.zIndex=e,this.front.style.zIndex=e},t.push_down=function(){const e=parseInt(this.back.style.zIndex,10),a=parseInt(this.front.style.zIndex,10);this.back.style.zIndex=(e-1).toString(),this.front.style.zIndex=(a-1).toString()},t.addClass=function(e){this.front.classList.add(e),this.back.classList.add(e)},t.removeClass=function(e){this.front.classList.remove(e),this.back.classList.remove(e)},t.attach=function(e){e.appendChild(this.back),e.appendChild(this.front)},t.flip_up(!1),t}function O(e,a){const t=document.createElement("div");t.className="card ability back down";const n=document.createElement("span");return n.className="name",n.innerText=e+"-"+a,t.appendChild(n),t}function V(e,a,t,n,l,i,s,r,o){const m=document.createElement("div");m.className="card ability front down";const c=document.createElement("span");c.className="name",c.innerText=a+"-"+r,m.appendChild(c);const h=document.createElement("span");if(h.className="healthNormal",h.innerText="HP "+o[0],m.appendChild(h),o[1]>0){const e=document.createElement("span");e.className="healthElite",e.innerText="HP "+o[1],m.appendChild(e)}const u=document.createElement("span");if(u.className="initiative",u.innerText=e,m.appendChild(u),t){const e=document.createElement("img");e.src="images/shuffle.svg",m.appendChild(e)}let d=0,v=m;n=n.filter(Boolean);for(let e=0;e=0;)t+=1,a=a.substr(1);const r=t-d;for(;d!==t;)if(r>0){const e=document.createElement("ul");n.length>5&&(e.style.fontSize=100-2.5*n.length+"%"),v.appendChild(e),v=e;const a=document.createElement("li");v.appendChild(a),v=a,d+=1}else v=(v=v.parentElement).parentElement,d-=1;if(d>0&&r<=0){v=v.parentElement;const e=document.createElement("li");v.appendChild(e),v=e}const o=b(a.trim(),l,i,s);v.insertAdjacentHTML("beforeend",o)}return m}function j(e,a,t){const l=N[e];l.name=a,l.level=t;const i=JSON.parse(A(a)),s={class:l.class,name:l.name,type:z.ABILITY,draw_pile:[],discard:[],move:[0,0],attack:[0,0],range:[0,0],level:l.level,health:[0,0]};for(let e=0;e0){const e=this.discard[this.discard.length-1];let a=e.starting_lines,t=[];if(this.is_boss()){let e=[];a.forEach((function(a){e=e.concat(p(a,s.special1,s.special2))})),a=e,this.immunities&&(t=t.concat(v(this.immunities))),this.notes&&(t=t.concat(g(this.notes)))}else this.attributes&&(t=t.concat(d(this.attributes)));e.paint_front_card(this.get_real_name(),a.concat(t),this.attack,this.move,this.range,this.level,this.health),e.ui.set_depth(-3),e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}R(this)},s.draw_top_card=function(){let e=this.draw_pile[0].starting_lines,a=[];if(this.is_boss()){let t=[];e.forEach((function(e){t=t.concat(p(e,s.special1,s.special2))})),e=t,this.immunities&&(a=a.concat(v(this.immunities))),this.notes&&(a=a.concat(g(this.notes)))}else this.attributes&&(a=a.concat(d(this.attributes)));this.draw_pile[0].paint_front_card(this.get_real_name(),e.concat(a),this.attack,this.move,this.range,this.level,this.health),R(this)},s.must_reshuffle=function(){return!this.draw_pile.length||(B&&this.discard.length?this.discard[0].shuffle_next:void 0)},s.set_stats_monster=function(e){this.attack=e.attack,this.move=e.move,this.range=e.range,this.attributes=e.attributes,this.health=e.health},s.set_stats_boss=function(e){this.attack=e.attack,this.move=e.move,this.range=e.range,this.special1=e.special1,this.special2=e.special2,this.immunities=e.immunities,this.notes=e.notes,this.health=e.health},s.get_real_name=function(){return this.name?this.name:this.class},s.is_boss=function(){return this.class===n.Boss.class},s.set_card_piles=function(e,a){for(let a=0;a0&&e.discard[0].ui.addClass("lift");const a=e.draw_pile.shift();J(a,!0),e.discard.unshift(a)}function J(e,a){e.ui.set_depth(-3),a&&e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}function X(e){e.must_reshuffle()?U(e,!0):E.forEach((function(a){a.class===e.class&&(a.draw_top_card(),W(a))})),L(e.name,JSON.stringify(e))}function q(e){e.clean_discard_pile(),U(e,!0),document.body.dispatchEvent(new CustomEvent(G.MODIFIER_DECK_SHUFFLE_REQUIRED,{detail:{shuffle:!1}}))}function Z(e){e.clean_advantage_deck(),e.must_reshuffle()?q(e):(W(e),document.body.dispatchEvent(new CustomEvent(G.MODIFIER_CARD_DRAWN,{detail:{card_type:e.discard[0].card_type,count:e.count(e.discard[0].card_type)}})),e.shuffle_end_of_round()&&document.body.dispatchEvent(new CustomEvent(G.MODIFIER_DECK_SHUFFLE_REQUIRED,{detail:{shuffle:!0}}))),L("modifier_deck",JSON.stringify(e))}function K(e){let a;1===e.draw_pile.length?(Z(e),a=e.discard[0],q(e),J(a=e.draw_pile.shift(),!1),e.discard.unshift(a),Z(e)):0===e.draw_pile.length?(e.clean_advantage_deck(),q(e),Z(e),a=e.discard[0],Z(e)):(Z(e),a=e.discard[0],Z(e)),e.discard[0].ui.addClass("right"),a.ui.addClass("left"),e.advantage_to_clean=!0}function Q(e){return{ui:new F(function(e){const a=document.createElement("img");a.className="cover",a.src=e;const t=document.createElement("div");return t.className="card modifier front",t.appendChild(a),t}(e.image),function(){const e=document.createElement("div");return e.className="card modifier back",e}()),card_type:e.type,shuffle_next_round:e.shuffle}}function $(){T.shuffle_end_of_round()&&(T.clean_advantage_deck(),q(T)),L("modifier_deck",JSON.stringify(T))}function Y(e,a){const t=document.getElementById("tableau");document.getElementById("currentdeckslist").innerHTML="";const n=E.filter((function(t){return!a||0===e.filter((function(e){return e.name===t.name&&e.level===t.level})).length})),l=e.filter((function(e){return!a||0===E.filter((function(a){return e.name===a.name&&e.level===a.level})).length}));if(T)a||(t.removeChild(document.getElementById("modifier-container")),ee(),te(t,T,a));else if(ee(),te(t,T,a),a){const e=JSON.parse(A("modifier_deck")),a=ae("curse",e),t=ae("bless",e);for(let e=0;e-1&&E.splice(e,1),t.removeChild(l)},e.is_boss()?"Boss"!==e.get_real_name()&&e.set_stats_boss((i=e.get_real_name(),s=e.level,i=i.replace("Boss: ",""),{attack:[r.bosses[i].level[s].attack],move:[r.bosses[i].level[s].move],range:[r.bosses[i].level[s].range],special1:r.bosses[i].level[s].special1,special2:r.bosses[i].level[s].special2,immunities:r.bosses[i].level[s].immunities,notes:r.bosses[i].level[s].notes,health:[r.bosses[i].level[s].health]})):e.set_stats_monster(function(e,a){return{attack:[r.monsters[e].level[a].normal.attack,r.monsters[e].level[a].elite.attack],move:[r.monsters[e].level[a].normal.move,r.monsters[e].level[a].elite.move],range:[r.monsters[e].level[a].normal.range,r.monsters[e].level[a].elite.range],attributes:[r.monsters[e].level[a].normal.attributes,r.monsters[e].level[a].elite.attributes],health:[r.monsters[e].level[a].normal.health,r.monsters[e].level[a].elite.health]}}(e.get_real_name(),e.level)),U(e),a?e.draw_top_discard():R(e),E.push(e);const o=document.getElementById("currentdeckslist"),m=document.createElement("li");m.className="currentdeck",o.appendChild(m);const c=document.createElement("a");c.id="switch-"+n,c.href="#switch-"+n,c.innerText=e.get_real_name(),c.title="Click to show/hide deck",c.addEventListener("click",(function(){const e=document.getElementById(this.id.replace("switch-",""));e.className="hiddendeck"===e.className?"card-container":"hiddendeck"}),!1),m.appendChild(c)})),M()}function ee(){T=function(){const e={name:"Monster modifier deck",type:z.MODIFIER,draw_pile:[],discard:[],advantage_to_clean:!1,draw_top_discard:function(){if(this.discard.length>0){const e=this.discard[this.discard.length-1];e.ui.set_depth(-3),e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}R(this)}};e.count=function(e){return this.draw_pile.filter((function(a){return a.card_type===e})).length}.bind(e),e.remove_card=function(a){for(let t=0;t0}.bind(e),e.must_reshuffle=function(){return!this.draw_pile.length}.bind(e),e.clean_discard_pile=function(){for(let a=0;a7?7:this.spinner.value},t.set_value=function(e){this.spinner.value=e>7?7:e},t}function le(){const e={};e.ul=document.createElement("ul"),e.ul.className="selectionlist",e.checkboxes={},e.level_selectors={},e.global_level_selector=null;const a=document.createElement("li"),t=new ne("Select global level ",!0);a.appendChild(t.html),e.global_level_selector=t;const l=y("button","applylevel","Apply All","");l.input.onclick=function(){for(let a in e.level_selectors)e.level_selectors[a].set_value(e.global_level_selector.get_selection())},a.appendChild(l.root),e.ul.appendChild(a);for(let a in n){const t=n[a].name,l=document.createElement("li"),i=y("checkbox","deck",t,t);l.appendChild(i.root);const s=new ne(" with level ",!0);l.appendChild(s.html),e.ul.appendChild(l),e.checkboxes[t]=i.input,e.level_selectors[t]=s}return e.get_selection=function(){return D(this.checkboxes).filter(w).map(x)},e.get_selected_decks=function(){const a=this.get_selection();var t;return t=a.map(function(a){const t=a in n?n[a]:[];return t.level=e.level_selectors[a].get_selection(),t}.bind(this)),Array.prototype.concat.apply([],t)},e.set_selection=function(a){D(this.checkboxes).forEach((function(e){e.checked=!1})),a.forEach(function(a){const t=this.checkboxes[a.name];t&&(t.checked=!0,e.level_selectors[a.name].set_value(a.level))}.bind(this))},e}function ie(e){const a={};a.ul=document.createElement("ul"),a.ul.className="selectionlist",a.spinner=null,a.decks={},a.special_rules={},a.level_selector=null,a.level_selector=new ne("Select level",!1),a.ul.appendChild(a.level_selector.html);for(let t=0;t=0&&e===o.living_corpse_two_levels_extra.affected_deck?Math.min(7,parseInt(n)+o.living_corpse_two_levels_extra.extra_levels):n},a.get_scenario_decks=function(){return this.decks[this.get_selection()].map((function(e){return n[e.name]?e.class=n[e.name].class:-1!==e.name.indexOf("Boss")&&(e.class=n.Boss.class),e.level=a.get_level(e.name,a.get_special_rules()),e}))},a.get_special_rules=function(){return this.special_rules[this.get_selection()]},a}document.addEventListener("DOMContentLoaded",(function(){!function(){const e=document.getElementById("deckspage"),a=document.getElementById("scenariospage"),t=document.getElementById("applydecks"),n=document.getElementById("applyscenario"),l=document.getElementById("applyload"),i=document.getElementById("showmodifierdeck"),s=new le,r=new ie(m);e.insertAdjacentElement("afterbegin",s.ul),a.insertAdjacentElement("afterbegin",r.ul),t.onclick=function(){localStorage.clear();const e=s.get_selected_decks();L("selected_deck_names",JSON.stringify(e)),Y(e.map((function(e){return j(e.class,e.name,e.level)})),!0);const a=document.getElementById("showmodifierdeck-deckspage"),t=document.getElementById("modifier-container");a.checked?t.style.display="block":t.style.display="none"},n.onclick=function(){try{localStorage.clear()}catch(e){return void console.error("Local storage is required")}const e=r.get_scenario_decks();L("selected_deck_names",JSON.stringify(e)),s.set_selection(e),Y(e.map((function(e){return j(e.class,e.name,e.level)})),!1);const a=document.getElementById("modifier-container");i.checked?a.style.display="block":a.style.display="none",S(_.settingspane,_.cancelarea,!1)},l.onclick=function(){const e=JSON.parse(A("selected_deck_names"));s.set_selection(e),Y(e.map((function(e){return j(e.class,e.name,e.level)})),!0);const a=document.getElementById("modifier-container");i.checked?a.style.display="block":a.style.display="none"},window.onresize=M.bind(null,E)}(),function(){const e={scenarios:document.getElementById("scenariotab"),decks:document.getElementById("deckstab")},a={scenarios:document.getElementById("scenariospage"),decks:document.getElementById("deckspage")};_.settingspane=document.getElementById("settingspane"),_.settingsbtn=document.getElementById("settingsbtn"),_.cancelarea=document.getElementById("cancelarea"),e.scenarios.onclick=function(){f(e,a,"scenarios")},e.decks.onclick=function(){f(e,a,"decks")},_.settingsbtn.onclick=function(){S(_.settingspane,_.cancelarea,!0)},_.cancelarea.onclick=function(){S(_.settingspane,_.cancelarea,!1)},f(e,a,"scenarios")}()}))}]); \ No newline at end of file diff --git a/src/style.css b/dist/style.css similarity index 100% rename from src/style.css rename to dist/style.css diff --git a/gen-manifest.sh b/gen-manifest.sh index ee931e4b..642145fe 100755 --- a/gen-manifest.sh +++ b/gen-manifest.sh @@ -1,4 +1,6 @@ #!/bin/sh +# +# TODO: not updated for webpack cat << EOF > app.manifest CACHE MANIFEST diff --git a/package-lock.json b/package-lock.json index 4cce1f8c..fc667ef4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,55 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.7.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.12.tgz", + "integrity": "sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ==", + "dev": true + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -172,11 +221,27 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, "acorn": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", + "dev": true + }, "ajv": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", @@ -198,6 +263,24 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", @@ -237,6 +320,15 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, + "argparse": { + "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" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -252,6 +344,27 @@ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -296,11 +409,29 @@ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -366,6 +497,12 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -386,6 +523,46 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -507,6 +684,12 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -517,6 +700,12 @@ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, "cacache": { "version": "12.0.3", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", @@ -555,6 +744,12 @@ "unset-value": "^1.0.0" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -583,6 +778,12 @@ } } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -645,6 +846,21 @@ } } }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -656,6 +872,12 @@ "wrap-ansi": "^5.1.0" } }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -695,6 +917,30 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "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" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -711,6 +957,12 @@ "typedarray": "^0.0.6" } }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", @@ -724,6 +976,33 @@ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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==", + "dev": true + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -841,6 +1120,45 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, + "deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", + "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -878,6 +1196,27 @@ } } }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -887,12 +1226,24 @@ "minimalistic-assert": "^1.0.0" } }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -903,6 +1254,40 @@ "randombytes": "^2.0.0" } }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "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" + } + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -919,6 +1304,12 @@ "stream-shift": "^1.0.0" } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, "elliptic": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", @@ -944,6 +1335,12 @@ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -981,12 +1378,105 @@ "prr": "~1.0.1" } }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, "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 }, + "eslint": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.5.1.tgz", + "integrity": "sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.2", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.4.1", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "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 + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", @@ -996,6 +1486,55 @@ "estraverse": "^4.1.1" } }, + "eslint-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } + }, + "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 + }, + "espree": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", + "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-jsx": "^5.0.2", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "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==", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", @@ -1009,11 +1548,38 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, "events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -1079,6 +1645,52 @@ "homedir-polyfill": "^1.0.1" } }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + } + } + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -1098,6 +1710,17 @@ } } }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -1167,11 +1790,44 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "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 + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -1193,6 +1849,21 @@ } } }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "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" + } + }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -1223,6 +1894,34 @@ "resolve-dir": "^1.0.1" } }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -1232,11 +1931,43 @@ "readable-stream": "^2.3.6" } }, + "follow-redirects": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -1245,6 +1976,12 @@ "map-cache": "^0.2.2" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -1751,6 +2488,18 @@ } } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "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=", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1838,11 +2587,53 @@ "which": "^1.2.14" } }, + "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 + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -1915,11 +2706,94 @@ "parse-passwd": "^1.0.0" } }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", @@ -1930,6 +2804,30 @@ "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, + "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 + }, + "import-fresh": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "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 + } + } + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -1970,6 +2868,66 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", @@ -1982,6 +2940,30 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -2000,6 +2982,12 @@ } } }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -2031,6 +3019,12 @@ } } }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -2090,6 +3084,30 @@ } } }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2098,6 +3116,21 @@ "isobject": "^3.0.1" } }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -2130,6 +3163,22 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, + "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 + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -2140,6 +3189,18 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "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 + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -2148,6 +3209,12 @@ "minimist": "^1.2.0" } }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -2162,6 +3229,16 @@ "invert-kv": "^2.0.0" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -2186,6 +3263,18 @@ "path-exists": "^3.0.0" } }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "loglevel": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", + "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2240,6 +3329,12 @@ "safe-buffer": "^5.1.2" } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, "mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", @@ -2260,6 +3355,18 @@ "readable-stream": "^2.0.1" } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -2289,6 +3396,27 @@ "brorand": "^1.0.1" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -2387,6 +3515,28 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -2411,6 +3561,18 @@ "to-regex": "^3.0.1" } }, + "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 + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", @@ -2422,6 +3584,12 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -2473,6 +3641,12 @@ "path-key": "^2.0.0" } }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2506,6 +3680,18 @@ } } }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -2522,7 +3708,28 @@ "isobject": "^3.0.1" } }, - "once": { + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "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==", + "dev": true + }, + "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", @@ -2530,6 +3737,55 @@ "wrappy": "1" } }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + } + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -2546,6 +3802,12 @@ "mem": "^4.0.0" } }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -2580,6 +3842,21 @@ "p-limit": "^2.0.0" } }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -2600,6 +3877,15 @@ "readable-stream": "^2.1.5" } }, + "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, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-asn1": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", @@ -2619,6 +3905,12 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -2644,12 +3936,24 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, + "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=", + "dev": true + }, "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", @@ -2667,6 +3971,21 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -2675,11 +3994,28 @@ "find-up": "^3.0.0" } }, + "portfinder": { + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.24.tgz", + "integrity": "sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + } + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -2690,11 +4026,27 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -2748,6 +4100,12 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -2758,6 +4116,12 @@ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -2775,6 +4139,32 @@ "safe-buffer": "^5.1.0" } }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -2808,6 +4198,21 @@ "safe-regex": "^1.1.0" } }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -2835,6 +4240,12 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, "resolve-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", @@ -2878,11 +4289,27 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -2900,6 +4327,15 @@ "inherits": "^2.0.1" } }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -2908,6 +4344,15 @@ "aproba": "^1.1.1" } }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2921,6 +4366,12 @@ "ret": "~0.1.10" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -2931,16 +4382,113 @@ "ajv-keywords": "^3.1.0" } }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, "serialize-javascript": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -2973,6 +4521,12 @@ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", @@ -3003,6 +4557,17 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -3100,6 +4665,56 @@ } } }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "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 + } + } + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -3143,6 +4758,78 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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 + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -3151,6 +4838,12 @@ "extend-shallow": "^3.0.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -3178,6 +4871,12 @@ } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -3247,6 +4946,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -3256,6 +4961,18 @@ "has-flag": "^3.0.0" } }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -3301,6 +5018,18 @@ } } }, + "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 + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -3310,6 +5039,12 @@ "xtend": "~4.0.1" } }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, "timers-browserify": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", @@ -3318,6 +5053,15 @@ "setimmediate": "^1.0.4" } }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -3361,6 +5105,12 @@ "repeat-string": "^1.6.1" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -3371,6 +5121,25 @@ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -3403,6 +5172,12 @@ "imurmurhash": "^0.1.4" } }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -3473,6 +5248,16 @@ } } }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -3498,12 +5283,30 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true + }, "v8-compile-cache": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", "dev": true }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, "vm-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", @@ -3519,6 +5322,15 @@ "neo-async": "^2.5.0" } }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, "webpack": { "version": "4.41.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.1.tgz", @@ -3581,6 +5393,245 @@ } } }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.2.tgz", + "integrity": "sha512-0xxogS7n5jHDQWy0WST0q6Ykp7UGj4YvWh+HVN71JoE7BwPxMZrwgraBvmdEMbDVMBzF0u+mEzn8TQzBm5NYJQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.4", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.24", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "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==", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -3597,6 +5648,23 @@ } } }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -3612,6 +5680,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -3636,6 +5710,24 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index f58211f0..6ad6ce00 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "description": "This is a web-app for managing the monster ability decks in the board game [Gloomhaven](https://boardgamegeek.com/boardgame/174430/gloomhaven)", "private": true, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "build": "webpack --mode=production", + "test": "echo \"Error: no test specified\" && exit 1", + "dev-server": "webpack-dev-server" }, "repository": { "type": "git", @@ -23,6 +25,8 @@ "webpack": "^4.41.1" }, "devDependencies": { - "webpack-cli": "^3.3.9" + "eslint": "^6.5.1", + "webpack-cli": "^3.3.9", + "webpack-dev-server": "^3.8.2" } } diff --git a/src/.eslintrc.js b/src/.eslintrc.js new file mode 100644 index 00000000..edadc674 --- /dev/null +++ b/src/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { + "env": { + "browser": true, + "es6": true + }, + "extends": "eslint:recommended", + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "rules": { + } +}; \ No newline at end of file diff --git a/src/cards.js b/src/cards.js index cab36daf..3eab52bd 100644 --- a/src/cards.js +++ b/src/cards.js @@ -1,4 +1,4 @@ -DECKS = +export const DECKS = { "Ancient Artillery": {name: "Ancient Artillery", class: "Ancient Artillery"} , "Bandit Archer": {name: "Bandit Archer", class: "Archer"} , "Bandit Guard": {name: "Bandit Guard", class: "Guard"} @@ -36,7 +36,7 @@ DECKS = , "Wind Demon": {name: "Wind Demon", class: "Wind Demon"} }; -DECK_DEFINITIONS = +export const DECK_DEFINITIONS = [ { class: "Ancient Artillery" , cards: @@ -58,7 +58,7 @@ DECK_DEFINITIONS = , [false, "44", "* %move% -1", "* %attack% +1", "** %range% +0"] , [false, "56", "* %attack% -1", "** %range% +0", "** %target% 2"] , [true, "68", "* %attack% +1", "** %range% +1"] - , [false, "14", "* %move% -1", "* %attack% -1", , "** %range% +0", "* Create a 3 damage trap in an adjacent empty hex closest to an enemy "] + , [false, "14", "* %move% -1", "* %attack% -1", "** %range% +0", "* Create a 3 damage trap in an adjacent empty hex closest to an enemy "] , [true, "29", "* %move% +0", "* %attack% -1", "** %range% +1", "** %immobilize%"] ] }, diff --git a/src/logic.js b/src/logic.js index 5cdb2616..7e873cf4 100644 --- a/src/logic.js +++ b/src/logic.js @@ -1,33 +1,41 @@ +import { DECKS, DECK_DEFINITIONS } from './cards' +import { CARD_TYPES_MODIFIER, MODIFIER_CARDS, MODIFIER_DECK } from './modifiers' +import { MONSTER_STATS } from "./monster_stats" +import { SCENARIO_DEFINITIONS, SPECIAL_RULES } from "./scenarios" +import * as macros from './macros' +import * as ui from './ui' +import * as util from './util' + //TODO Adding an extra Guard deck will reshuffle the first one, End of round with multiple Archers, resize text, worth to show common and elite_only attributes?, shield and retaliate only when shown (apparently, attribtues are active at the beginning of the turn, and active after initiative) -var do_shuffles = true; -var visible_ability_decks = []; -var modifier_deck = null; -var deck_definitions = load_definition(DECK_DEFINITIONS); +const do_shuffles = true; +const visible_ability_decks = []; +let modifier_deck = null; +const deck_definitions = load_definition(DECK_DEFINITIONS); -var DECK_TYPES = +const DECK_TYPES = { MODIFIER: "modifier", ABILITY: "ability", BOSS: "boss" }; -var EVENT_NAMES = { +const EVENT_NAMES = { MODIFIER_CARD_DRAWN: "modifierCardDrawn", MODIFIER_DECK_SHUFFLE_REQUIRED: "modfierDeckShuffleRequired" }; function UICard(front_element, back_element) { - var card = {}; + const card = {}; card.back = back_element; card.front = front_element; card.flip_up = function (faceup) { - toggle_class(this.back, "up", !faceup); - toggle_class(this.back, "down", faceup); + util.toggle_class(this.back, "up", !faceup); + util.toggle_class(this.back, "down", faceup); - toggle_class(this.front, "up", faceup); - toggle_class(this.front, "down", !faceup); + util.toggle_class(this.front, "up", faceup); + util.toggle_class(this.front, "down", !faceup); }; card.set_depth = function (z) { @@ -37,8 +45,8 @@ function UICard(front_element, back_element) { } card.push_down = function () { - var backZIndex = parseInt(this.back.style.zIndex, 10); - var frontZIndex = parseInt(this.front.style.zIndex, 10); + const backZIndex = parseInt(this.back.style.zIndex, 10); + const frontZIndex = parseInt(this.front.style.zIndex, 10); this.back.style.zIndex = (backZIndex - 1).toString(); this.front.style.zIndex = (frontZIndex - 1).toString(); } @@ -64,10 +72,10 @@ function UICard(front_element, back_element) { } function create_ability_card_back(name, level) { - var card = document.createElement("div"); + const card = document.createElement("div"); card.className = "card ability back down"; - var name_span = document.createElement("span"); + const name_span = document.createElement("span"); name_span.className = "name"; name_span.innerText = name + "-" + level; card.appendChild(name_span); @@ -76,57 +84,57 @@ function create_ability_card_back(name, level) { } function create_ability_card_front(initiative, name, shuffle, lines, attack, move, range, level, health) { - var card = document.createElement("div"); + const card = document.createElement("div"); card.className = "card ability front down"; - var name_span = document.createElement("span"); + const name_span = document.createElement("span"); name_span.className = "name"; name_span.innerText = name + "-" + level; card.appendChild(name_span); - var healthNormal_span = document.createElement("span"); + const healthNormal_span = document.createElement("span"); healthNormal_span.className = "healthNormal"; healthNormal_span.innerText = "HP " + health[0]; card.appendChild(healthNormal_span); if ( health[1] > 0 ) { - var healthElite_span = document.createElement("span"); + const healthElite_span = document.createElement("span"); healthElite_span.className = "healthElite"; healthElite_span.innerText = "HP " + health[1]; card.appendChild(healthElite_span); } - var initiative_span = document.createElement("span"); + const initiative_span = document.createElement("span"); initiative_span.className = "initiative"; initiative_span.innerText = initiative; card.appendChild(initiative_span); if (shuffle) { - var shuffle_img = document.createElement("img"); + const shuffle_img = document.createElement("img"); shuffle_img.src = "images/shuffle.svg"; card.appendChild(shuffle_img); } - var current_depth = 0; - var current_parent = card; + let current_depth = 0; + let current_parent = card; - lines = remove_empty_strings(lines); - for (var i = 0; i < lines.length; i++) { - var line = lines[i]; + lines = util.remove_empty_strings(lines); + for (let i = 0; i < lines.length; i++) { + let line = lines[i]; - var new_depth = 0; + let new_depth = 0; while (line.indexOf("*") >= 0) { new_depth += 1; line = line.substr(1); } - var diff = new_depth - current_depth; + const diff = new_depth - current_depth; while (current_depth !== new_depth) { if (diff > 0) { // Need one level lower, create
      - var list = document.createElement("ul"); + const list = document.createElement("ul"); // Dynamically adapt the size to the line length. I found this the sweet spot to read all the cards if (lines.length > 5) { list.style.fontSize = (100 - (lines.length * 2.5)) + "%"; @@ -135,7 +143,7 @@ function create_ability_card_front(initiative, name, shuffle, lines, attack, mov current_parent = list; // Create
    • - var list_item = document.createElement("li"); + const list_item = document.createElement("li"); current_parent.appendChild(list_item); current_parent = list_item; @@ -157,12 +165,12 @@ function create_ability_card_front(initiative, name, shuffle, lines, attack, mov current_parent = current_parent.parentElement; // create sibling
    • - var list_item = document.createElement("li"); + const list_item = document.createElement("li"); current_parent.appendChild(list_item); current_parent = list_item; } - var text = expand_string(line.trim(), attack, move, range); + const text = macros.expand_string(line.trim(), attack, move, range); current_parent.insertAdjacentHTML("beforeend", text); } @@ -170,14 +178,14 @@ function create_ability_card_front(initiative, name, shuffle, lines, attack, mov } function load_ability_deck(deck_class, deck_name, level) { - var deck_definition = deck_definitions[deck_class]; + const deck_definition = deck_definitions[deck_class]; deck_definition.name = deck_name; deck_definition.level = level; - var loaded_deck = JSON.parse(get_from_storage(deck_name)); + const loaded_deck = JSON.parse(util.get_from_storage(deck_name)); - var deck = { + const deck = { class: deck_definition.class, name: deck_definition.name, type: DECK_TYPES.ABILITY, @@ -190,18 +198,18 @@ function load_ability_deck(deck_class, deck_name, level) { health: [0,0] } - for (var i = 0; i < deck_definition.cards.length; i++) { - var definition = deck_definition.cards[i]; - var shuffle = definition[0]; - var initiative = definition[1]; - var lines = definition.slice(2); + for (let i = 0; i < deck_definition.cards.length; i++) { + const definition = deck_definition.cards[i]; + const shuffle = definition[0]; + const initiative = definition[1]; + const lines = definition.slice(2); - var empty_front = document.createElement("div"); + const empty_front = document.createElement("div"); empty_front.className = "card ability front down"; - var card_front = empty_front; - var card_back = create_ability_card_back(deck.name, deck.level); + const card_front = empty_front; + const card_back = create_ability_card_back(deck.name, deck.level); - var card = { + const card = { id: deck.name + '_' + i, ui: new UICard(card_front, card_back), shuffle_next: shuffle, @@ -212,7 +220,7 @@ function load_ability_deck(deck_class, deck_name, level) { card.paint_front_card = function (name, lines, attack, move, range, level, health) { this.ui.front = create_ability_card_front(this.initiative, name, this.shuffle_next, lines, attack, move, range, level, health); } - if (loaded_deck && find_in_discard(loaded_deck.discard, card.id)) { + if (loaded_deck && util.find_in_discard(loaded_deck.discard, card.id)) { deck.discard.push(card); } else { deck.draw_pile.push(card); @@ -220,25 +228,25 @@ function load_ability_deck(deck_class, deck_name, level) { } deck.draw_top_discard = function() { if (this.discard.length > 0) { - var card = this.discard[this.discard.length-1]; - var cards_lines = card.starting_lines; - var extra_lines = []; + const card = this.discard[this.discard.length-1]; + let cards_lines = card.starting_lines; + let extra_lines = []; if (this.is_boss()) { - var new_lines = []; + let new_lines = []; cards_lines.forEach(function (line) { - new_lines = new_lines.concat(special_to_lines(line, deck.special1, deck.special2)); + new_lines = new_lines.concat(macros.special_to_lines(line, deck.special1, deck.special2)); }); cards_lines = new_lines; if (this.immunities) { - extra_lines = extra_lines.concat(immunities_to_lines(this.immunities)); + extra_lines = extra_lines.concat(macros.immunities_to_lines(this.immunities)); } if (this.notes) { - extra_lines = extra_lines.concat(notes_to_lines(this.notes)); + extra_lines = extra_lines.concat(macros.notes_to_lines(this.notes)); } } else { if (this.attributes) { - extra_lines = extra_lines.concat(attributes_to_lines(this.attributes)); + extra_lines = extra_lines.concat(macros.attributes_to_lines(this.attributes)); } } @@ -256,24 +264,24 @@ function load_ability_deck(deck_class, deck_name, level) { deck.draw_top_card = function () { - var cards_lines = this.draw_pile[0].starting_lines; - var extra_lines = []; + let cards_lines = this.draw_pile[0].starting_lines; + let extra_lines = []; if (this.is_boss()) { - var new_lines = []; + let new_lines = []; cards_lines.forEach(function (line) { - new_lines = new_lines.concat(special_to_lines(line, deck.special1, deck.special2)); + new_lines = new_lines.concat(macros.special_to_lines(line, deck.special1, deck.special2)); }); cards_lines = new_lines; if (this.immunities) { - extra_lines = extra_lines.concat(immunities_to_lines(this.immunities)); + extra_lines = extra_lines.concat(macros.immunities_to_lines(this.immunities)); } if (this.notes) { - extra_lines = extra_lines.concat(notes_to_lines(this.notes)); + extra_lines = extra_lines.concat(macros.notes_to_lines(this.notes)); } } else { if (this.attributes) { - extra_lines = extra_lines.concat(attributes_to_lines(this.attributes)); + extra_lines = extra_lines.concat(macros.attributes_to_lines(this.attributes)); } } @@ -320,33 +328,30 @@ function load_ability_deck(deck_class, deck_name, level) { } deck.set_card_piles = function (draw_pile, discard_pile) { - var i; - for (i = 0; i < draw_pile.length; i++) { + for (let i = 0; i < draw_pile.length; i++) { this.draw_pile[i].shuffle_next = draw_pile[i].shuffle_next; this.draw_pile[i].initiative = draw_pile[i].initiative; this.draw_pile[i].starting_lines = draw_pile[i].starting_lines; } - for (i = 0; i < discard_pile.length; i++) { + for (let i = 0; i < discard_pile.length; i++) { this.discard[i].shuffle_next = discard_pile[i].shuffle_next; this.discard[i].initiative = discard_pile[i].initiative; this.discard[i].starting_lines = discard_pile[i].starting_lines; } } - write_to_storage(deck.name, JSON.stringify(deck)); + util.write_to_storage(deck.name, JSON.stringify(deck)); return deck; } function place_deck(deck, container) { - var i; - var card; - for (i = 0; i < deck.draw_pile.length; i++) { - card = deck.draw_pile[i]; + for (let i = 0; i < deck.draw_pile.length; i++) { + const card = deck.draw_pile[i]; card.ui.attach(container); } - for (i = 0; i < deck.discard.length; i++) { - card = deck.discard[i]; + for (let i = 0; i < deck.discard.length; i++) { + const card = deck.discard[i]; card.ui.attach(container); } deck.deck_space = container; @@ -354,24 +359,24 @@ function place_deck(deck, container) { function force_repaint_deck(deck) { prevent_pull_animation(deck); - var space = deck.deck_space; - remove_child(space); + const space = deck.deck_space; + util.remove_child(space); place_deck(deck, space); } // This should be dynamic dependant on lines per card function refresh_ui() { - var actual_card_height = 296; - var base_font_size = 26.6; + const actual_card_height = 296; + const base_font_size = 26.6; - var tableau = document.getElementById("tableau"); - var cards = tableau.getElementsByClassName("card"); - for (var i = 1; i < cards.length; i++) { + const tableau = document.getElementById("tableau"); + const cards = tableau.getElementsByClassName("card"); + for (let i = 1; i < cards.length; i++) { if (cards[i].className.indexOf("ability") !== -1) { - var scale = cards[i].getBoundingClientRect().height / actual_card_height; - var scaled_font_size = base_font_size * scale; + const scale = cards[i].getBoundingClientRect().height / actual_card_height; + const scaled_font_size = base_font_size * scale; - var font_pixel_size = Math.min(scaled_font_size, base_font_size); + const font_pixel_size = Math.min(scaled_font_size, base_font_size); tableau.style.fontSize = font_pixel_size + "px"; break; } @@ -384,7 +389,6 @@ function reshuffle(deck, include_discards) { // This way we keep sync several decks from the same class visible_ability_decks.forEach(function (visible_deck) { if ((visible_deck !== deck) && (visible_deck.class === deck.class)) { - var real_name = visible_deck.get_real_name(); shuffle_deck(visible_deck, include_discards); visible_deck.set_card_piles(deck.draw_pile, deck.discard); } @@ -397,10 +401,10 @@ function shuffle_deck(deck, include_discards) { deck.discard = []; } - shuffle_list(deck.draw_pile); + util.shuffle_list(deck.draw_pile); - for (var i = 0; i < deck.draw_pile.length; i++) { - var card = deck.draw_pile[i]; + for (let i = 0; i < deck.draw_pile.length; i++) { + const card = deck.draw_pile[i]; card.ui.removeClass("lift"); card.ui.removeClass("pull"); @@ -415,9 +419,8 @@ function shuffle_deck(deck, include_discards) { } function flip_up_top_card(deck) { - var card; - for (var i = 0; i < deck.discard.length; i++) { - card = deck.discard[i]; + for (let i = 0; i < deck.discard.length; i++) { + const card = deck.discard[i]; card.ui.removeClass("lift"); card.ui.removeClass("pull"); card.ui.push_down(); @@ -427,7 +430,7 @@ function flip_up_top_card(deck) { deck.discard[0].ui.addClass("lift"); } - card = deck.draw_pile.shift(); + const card = deck.draw_pile.shift(); send_to_discard(card, true); deck.discard.unshift(card); } @@ -458,7 +461,7 @@ function draw_ability_card(deck) { } }); } - write_to_storage(deck.name, JSON.stringify(deck)); + util.write_to_storage(deck.name, JSON.stringify(deck)); } function prevent_pull_animation(deck) { @@ -501,11 +504,11 @@ function draw_modifier_card(deck) { document.body.dispatchEvent(new CustomEvent(EVENT_NAMES.MODIFIER_DECK_SHUFFLE_REQUIRED, { detail: { shuffle: true } })); } } - write_to_storage("modifier_deck", JSON.stringify(deck)); + util.write_to_storage("modifier_deck", JSON.stringify(deck)); } function double_draw(deck) { - var advantage_card; + let advantage_card; // Case there was 1 card in draw_pile when we clicked "draw 2". // now we should draw, save that card, reshuffle, and // draw the next @@ -541,7 +544,7 @@ function double_draw(deck) { } function load_modifier_deck() { - var deck = + const deck = { name: "Monster modifier deck", type: DECK_TYPES.MODIFIER, @@ -552,7 +555,7 @@ function load_modifier_deck() { deck.draw_top_discard = function() { if (this.discard.length > 0) { - var card = this.discard[this.discard.length-1]; + const card = this.discard[this.discard.length-1]; card.ui.set_depth(-3); card.ui.addClass("pull"); card.ui.flip_up(true); @@ -569,7 +572,7 @@ function load_modifier_deck() { }.bind(deck); deck.remove_card = function (card_type) { - for (var i = 0; i < deck.draw_pile.length; i++) { + for (let i = 0; i < deck.draw_pile.length; i++) { if (deck.draw_pile[i].card_type === card_type) { deck.draw_pile.splice(i, 1); reshuffle(deck, false); @@ -578,7 +581,7 @@ function load_modifier_deck() { break; } } - write_to_storage("modifier_deck", JSON.stringify(modifier_deck)); + util.write_to_storage("modifier_deck", JSON.stringify(modifier_deck)); return this.count(card_type); }.bind(deck); @@ -592,7 +595,7 @@ function load_modifier_deck() { force_repaint_deck(deck); reshuffle(deck, false); } - write_to_storage("modifier_deck", JSON.stringify(modifier_deck)); + util.write_to_storage("modifier_deck", JSON.stringify(modifier_deck)); return this.count(card_type); }.bind(deck); @@ -608,7 +611,7 @@ function load_modifier_deck() { }.bind(deck); deck.clean_discard_pile = function () { - for (var i = 0; i < deck.discard.length; i++) { + for (let i = 0; i < deck.discard.length; i++) { if (this.discard[i].card_type === CARD_TYPES_MODIFIER.BLESS || this.discard[i].card_type === CARD_TYPES_MODIFIER.CURSE) { //Delete this curse/bless that has been used @@ -630,10 +633,10 @@ function load_modifier_deck() { deck.discard[1].ui.removeClass("left"); } }.bind(deck); - var loaded_deck = JSON.parse(get_from_storage("modifier_deck")); + const loaded_deck = JSON.parse(util.get_from_storage("modifier_deck")); MODIFIER_DECK.forEach(function (card_definition) { - var card = define_modifier_card(card_definition); + const card = define_modifier_card(card_definition); if (loaded_deck && find_in_discard_and_remove(loaded_deck.discard,card.card_type)) { deck.discard.push(card); } else { @@ -645,7 +648,7 @@ function load_modifier_deck() { } function find_in_discard_and_remove(discard, card_type) { - for (var i=0; i < discard.length; i++) { + for (let i=0; i < discard.length; i++) { if (discard[i].card_type === card_type) { return discard.splice(i,1); } @@ -654,18 +657,18 @@ function find_in_discard_and_remove(discard, card_type) { } function create_modifier_card_back() { - var card = document.createElement("div"); + const card = document.createElement("div"); card.className = "card modifier back"; return card; } function create_modifier_card_front(card_url) { - var img = document.createElement("img"); + const img = document.createElement("img"); img.className = "cover"; img.src = card_url; - var card = document.createElement("div"); + const card = document.createElement("div"); card.className = "card modifier front"; card.appendChild(img); @@ -673,10 +676,10 @@ function create_modifier_card_front(card_url) { } function define_modifier_card(card_definition) { - var card_front = create_modifier_card_front(card_definition.image); - var card_back = create_modifier_card_back(); + const card_front = create_modifier_card_front(card_definition.image); + const card_back = create_modifier_card_back(); - var card = { + const card = { ui: new UICard(card_front, card_back), card_type: card_definition.type, shuffle_next_round: card_definition.shuffle @@ -690,13 +693,13 @@ function end_round() { modifier_deck.clean_advantage_deck(); reshuffle_modifier_deck(modifier_deck); } - write_to_storage("modifier_deck", JSON.stringify(modifier_deck)); + util.write_to_storage("modifier_deck", JSON.stringify(modifier_deck)); } function load_definition(card_database) { - var decks = {}; - for (var i = 0; i < card_database.length; i++) { - var definition = card_database[i]; + const decks = {}; + for (let i = 0; i < card_database.length; i++) { + const definition = card_database[i]; decks[definition.class] = definition; } @@ -704,20 +707,20 @@ function load_definition(card_database) { } function get_monster_stats(name, level) { - var attack = [MONSTER_STATS["monsters"][name]["level"][level]["normal"]["attack"], + const attack = [MONSTER_STATS["monsters"][name]["level"][level]["normal"]["attack"], MONSTER_STATS["monsters"][name]["level"][level]["elite"]["attack"] ]; - var move = [MONSTER_STATS["monsters"][name]["level"][level]["normal"]["move"], + const move = [MONSTER_STATS["monsters"][name]["level"][level]["normal"]["move"], MONSTER_STATS["monsters"][name]["level"][level]["elite"]["move"] ]; - var range = [MONSTER_STATS["monsters"][name]["level"][level]["normal"]["range"], + const range = [MONSTER_STATS["monsters"][name]["level"][level]["normal"]["range"], MONSTER_STATS["monsters"][name]["level"][level]["elite"]["range"] ]; - var attributes = [MONSTER_STATS["monsters"][name]["level"][level]["normal"]["attributes"], + const attributes = [MONSTER_STATS["monsters"][name]["level"][level]["normal"]["attributes"], MONSTER_STATS["monsters"][name]["level"][level]["elite"]["attributes"] ]; - var health = [ MONSTER_STATS["monsters"][name]["level"][level]["normal"]["health"], + const health = [ MONSTER_STATS["monsters"][name]["level"][level]["normal"]["health"], MONSTER_STATS["monsters"][name]["level"][level]["elite"]["health"] ]; @@ -726,14 +729,14 @@ function get_monster_stats(name, level) { function get_boss_stats(name, level) { name = name.replace("Boss: ", ""); - var attack = [MONSTER_STATS["bosses"][name]["level"][level]["attack"]]; - var move = [MONSTER_STATS["bosses"][name]["level"][level]["move"]]; - var range = [MONSTER_STATS["bosses"][name]["level"][level]["range"]]; - var special1 = MONSTER_STATS["bosses"][name]["level"][level]["special1"]; - var special2 = MONSTER_STATS["bosses"][name]["level"][level]["special2"]; - var immunities = MONSTER_STATS["bosses"][name]["level"][level]["immunities"]; - var notes = MONSTER_STATS["bosses"][name]["level"][level]["notes"]; - var health = [MONSTER_STATS["bosses"][name]["level"][level]["health"]]; + const attack = [MONSTER_STATS["bosses"][name]["level"][level]["attack"]]; + const move = [MONSTER_STATS["bosses"][name]["level"][level]["move"]]; + const range = [MONSTER_STATS["bosses"][name]["level"][level]["range"]]; + const special1 = MONSTER_STATS["bosses"][name]["level"][level]["special1"]; + const special2 = MONSTER_STATS["bosses"][name]["level"][level]["special2"]; + const immunities = MONSTER_STATS["bosses"][name]["level"][level]["immunities"]; + const notes = MONSTER_STATS["bosses"][name]["level"][level]["notes"]; + const health = [MONSTER_STATS["bosses"][name]["level"][level]["health"]]; return { "attack": attack, @@ -748,15 +751,15 @@ function get_boss_stats(name, level) { } function apply_deck_selection(decks, preserve_existing_deck_state) { - var container = document.getElementById("tableau"); + const container = document.getElementById("tableau"); document.getElementById("currentdeckslist").innerHTML = ""; - var decks_to_remove = visible_ability_decks.filter(function (visible_deck) { + const decks_to_remove = visible_ability_decks.filter(function (visible_deck) { return !preserve_existing_deck_state || (decks.filter(function (deck) { return ((deck.name === visible_deck.name) && (deck.level === visible_deck.level)) }).length === 0); }); - var decks_to_add = decks.filter(function (deck) { + const decks_to_add = decks.filter(function (deck) { return !preserve_existing_deck_state || (visible_ability_decks.filter(function (visible_deck) { return ((deck.name === visible_deck.name) && (deck.level === visible_deck.level)) }).length === 0); @@ -766,13 +769,13 @@ function apply_deck_selection(decks, preserve_existing_deck_state) { init_modifier_deck(); add_modifier_deck(container, modifier_deck,preserve_existing_deck_state); if (preserve_existing_deck_state) { - var loaded_modifier_deck = JSON.parse(get_from_storage("modifier_deck")); - var curses = count_type("curse", loaded_modifier_deck); - var blessings = count_type("bless", loaded_modifier_deck); - for (var i =0; i < blessings; i++) { + const loaded_modifier_deck = JSON.parse(util.get_from_storage("modifier_deck")); + const curses = count_type("curse", loaded_modifier_deck); + const blessings = count_type("bless", loaded_modifier_deck); + for (let i =0; i < blessings; i++) { modifier_deck.add_card("bless"); } - for (var i =0; i < curses; i++) { + for (let i =0; i < curses; i++) { modifier_deck.add_card("curse"); } modifier_deck.draw_top_discard(); @@ -785,15 +788,15 @@ function apply_deck_selection(decks, preserve_existing_deck_state) { init_modifier_deck(); add_modifier_deck(container, modifier_deck,preserve_existing_deck_state); } - write_to_storage("modifier_deck", JSON.stringify(modifier_deck)); + util.write_to_storage("modifier_deck", JSON.stringify(modifier_deck)); decks_to_remove.forEach(function (deck) { deck.discard_deck(); }); decks_to_add.forEach(function (deck) { - var deckid = deck.get_real_name().replace(/\s+/g, ''); - var deck_space = document.createElement("div"); + const deckid = deck.get_real_name().replace(/\s+/g, ''); + const deck_space = document.createElement("div"); deck_space.id = deckid; deck_space.addEventListener('contextmenu', function(e) { this.className = "hiddendeck"; @@ -807,12 +810,12 @@ function apply_deck_selection(decks, preserve_existing_deck_state) { place_deck(deck, deck_space); reshuffle(deck, !preserve_existing_deck_state); if (preserve_existing_deck_state) { - + // TODO: NOOP? } deck_space.onclick = draw_ability_card.bind(null, deck); deck.discard_deck = function () { - var index = visible_ability_decks.indexOf(this); + const index = visible_ability_decks.indexOf(this); if (index > -1) { visible_ability_decks.splice(index, 1); @@ -838,17 +841,17 @@ function apply_deck_selection(decks, preserve_existing_deck_state) { } visible_ability_decks.push(deck); - var currentdeckslist = document.getElementById("currentdeckslist"); - var list_item = document.createElement("li"); + const currentdeckslist = document.getElementById("currentdeckslist"); + const list_item = document.createElement("li"); list_item.className = "currentdeck"; currentdeckslist.appendChild(list_item); - var label = document.createElement("a"); + const label = document.createElement("a"); label.id = "switch-" + deckid; label.href = "#switch-" + deckid label.innerText = deck.get_real_name(); label.title = "Click to show/hide deck"; - label.addEventListener("click", function(e){ - var d = document.getElementById(this.id.replace("switch-","")); + label.addEventListener("click", function(){ + const d = document.getElementById(this.id.replace("switch-","")); d.className = (d.className === "hiddendeck") ? "card-container" : "hiddendeck"; }, false) list_item.appendChild(label); @@ -863,9 +866,9 @@ function init_modifier_deck() { } function count_type(type, deck) { - var count = 0; + let count = 0; if (deck) { - for (var i = 0; i < deck.draw_pile.length; i++) { + for (let i = 0; i < deck.draw_pile.length; i++) { if (deck.draw_pile[i].card_type === type) { count++; } @@ -877,7 +880,7 @@ function count_type(type, deck) { function add_modifier_deck(container, deck, preserve_discards) { function create_counter(card_type, increment_func, decrement_func, title) { function create_button(class_name, text, func, text_element) { - var button = document.createElement("div"); + const button = document.createElement("div"); button.className = class_name + " button"; button.innerText = text; @@ -888,15 +891,15 @@ function add_modifier_deck(container, deck, preserve_discards) { return button; } - var widget_container = document.createElement("div"); + const widget_container = document.createElement("div"); widget_container.className = "counter-icon"; widget_container.title = title; - var background = document.createElement("div"); + const background = document.createElement("div"); background.className = "background " + card_type; widget_container.appendChild(background); - var text_element = document.createElement("div"); + const text_element = document.createElement("div"); text_element.className = "icon-text"; text_element.innerText = "0"; @@ -922,17 +925,17 @@ function add_modifier_deck(container, deck, preserve_discards) { } } - var modifier_container = document.createElement("div"); + const modifier_container = document.createElement("div"); modifier_container.className = "card-container"; modifier_container.id = "modifier-container"; - var button_div = document.createElement("div"); + const button_div = document.createElement("div"); button_div.className = "modifier-deck-column-1"; button_div.appendChild(create_counter("bless", deck.add_card, deck.remove_card, "Bless cards")); button_div.appendChild(create_counter("curse", deck.add_card, deck.remove_card, "Curse cards")); - var end_round_div = document.createElement("div"); + const end_round_div = document.createElement("div"); end_round_div.className = "counter-icon shuffle not-required"; end_round_div.onclick = end_round; end_round_div.title = "Click to end round and shuffle"; @@ -940,14 +943,14 @@ function add_modifier_deck(container, deck, preserve_discards) { document.body.addEventListener(EVENT_NAMES.MODIFIER_DECK_SHUFFLE_REQUIRED, indicate_shuffle_required); - var deck_column = document.createElement("div"); + const deck_column = document.createElement("div"); deck_column.className = "modifier-deck-column-2"; - var deck_space = document.createElement("div"); + const deck_space = document.createElement("div"); deck_space.className = "card-container modifier"; deck_space.title = "Click to draw one card"; - var draw_two_button = document.createElement("div"); + const draw_two_button = document.createElement("div"); draw_two_button.className = "button draw-two"; draw_two_button.onclick = double_draw.bind(null, modifier_deck); draw_two_button.title = "Click to draw two cards"; @@ -967,18 +970,18 @@ function add_modifier_deck(container, deck, preserve_discards) { } function LevelSelector(text, inline) { - var max_level = 7; - var level = {}; + const max_level = 7; + const level = {}; level.html = inline ? document.createElement("span") : document.createElement("ul"); level.html.className = "selectionlist"; - var listitem = inline ? document.createElement("label") : document.createElement("li"); + const listitem = inline ? document.createElement("label") : document.createElement("li"); listitem.innerText = text; level.html.appendChild(listitem); - var level_spinner = create_input("number", "scenario_number", "1", ""); - level_spinner.input.min = 0; - level_spinner.input.max = max_level; + const level_spinner = util.create_input("number", "scenario_number", "1", ""); + level_spinner.input.min = "0"; + level_spinner.input.max = max_level.toString(); level.html.appendChild(level_spinner.input); level.spinner = level_spinner.input; @@ -994,7 +997,7 @@ function LevelSelector(text, inline) { } function DeckList() { - var decklist = {}; + const decklist = {}; decklist.ul = document.createElement("ul"); decklist.ul.className = "selectionlist"; decklist.checkboxes = {}; @@ -1002,15 +1005,14 @@ function DeckList() { decklist.global_level_selector = null; - var listitem = document.createElement("li"); - var global_level_selector = new LevelSelector("Select global level ", true); + const listitem = document.createElement("li"); + const global_level_selector = new LevelSelector("Select global level ", true); listitem.appendChild(global_level_selector.html); decklist.global_level_selector = global_level_selector; - var dom_dict = create_input("button", "applylevel", "Apply All", ""); + const dom_dict = util.create_input("button", "applylevel", "Apply All", ""); dom_dict.input.onclick = function () { - var key; - for (key in decklist.level_selectors) { + for (let key in decklist.level_selectors) { decklist.level_selectors[key].set_value(decklist.global_level_selector.get_selection()); } }; @@ -1018,31 +1020,28 @@ function DeckList() { decklist.ul.appendChild(listitem); - var key; - for (key in DECKS) { - var real_name = DECKS[key].name; - var listitem = document.createElement("li"); - var dom_dict = create_input("checkbox", "deck", real_name, real_name); + for (let key in DECKS) { + const real_name = DECKS[key].name; + const listitem = document.createElement("li"); + const dom_dict = util.create_input("checkbox", "deck", real_name, real_name); listitem.appendChild(dom_dict.root); - var level_selector = new LevelSelector(" with level ", true); + const level_selector = new LevelSelector(" with level ", true); listitem.appendChild(level_selector.html); decklist.ul.appendChild(listitem); decklist.checkboxes[real_name] = dom_dict.input; decklist.level_selectors[real_name] = level_selector; - } - ; decklist.get_selection = function () { - return dict_values(this.checkboxes).filter(is_checked).map(input_value); + return util.dict_values(this.checkboxes).filter(util.is_checked).map(util.input_value); } decklist.get_selected_decks = function () { - var selected_checkbox = this.get_selection(); - var selected_decks = concat_arrays(selected_checkbox.map(function (name) { - var deck = ((name in DECKS) ? DECKS[name] : []); + const selected_checkbox = this.get_selection(); + const selected_decks = util.concat_arrays(selected_checkbox.map(function (name) { + const deck = ((name in DECKS) ? DECKS[name] : []); deck.level = decklist.level_selectors[name].get_selection(); return deck; }.bind(this))); @@ -1050,12 +1049,12 @@ function DeckList() { } decklist.set_selection = function (selected_deck_names) { - dict_values(this.checkboxes).forEach(function (checkbox) { + util.dict_values(this.checkboxes).forEach(function (checkbox) { checkbox.checked = false; }); selected_deck_names.forEach(function (deck_names) { - var checkbox = this.checkboxes[deck_names.name]; + const checkbox = this.checkboxes[deck_names.name]; if (checkbox) { checkbox.checked = true; decklist.level_selectors[deck_names.name].set_value(deck_names.level); @@ -1067,7 +1066,7 @@ function DeckList() { } function ScenarioList(scenarios) { - var scenariolist = {}; + const scenariolist = {}; scenariolist.ul = document.createElement("ul"); scenariolist.ul.className = "selectionlist"; scenariolist.spinner = null; @@ -1079,34 +1078,34 @@ function ScenarioList(scenarios) { scenariolist.ul.appendChild(scenariolist.level_selector.html); - for (var i = 0; i < scenarios.length; i++) { - var scenario = scenarios[i]; + for (let i = 0; i < scenarios.length; i++) { + const scenario = scenarios[i]; scenariolist.decks[i] = scenario.decks; scenariolist.special_rules[i] = scenario.special_rules ? scenario.special_rules : ""; } - var listitem = document.createElement("li"); + const listitem = document.createElement("li"); listitem.innerText = "Select scenario number"; scenariolist.ul.appendChild(listitem); - var scenario_spinner = create_input("number", "scenario_number", "1", ""); - scenario_spinner.input.min = 1; + const scenario_spinner = util.create_input("number", "scenario_number", "1", ""); + scenario_spinner.input.min = "1"; scenario_spinner.input.max = scenarios.length; scenariolist.ul.appendChild(scenario_spinner.input); scenariolist.spinner = scenario_spinner.input; scenariolist.get_selection = function () { // We're using the scenario index that is zero-based, but the scenario list is 1-based - var current_value = scenariolist.spinner.value - 1; + const current_value = scenariolist.spinner.value - 1; return Math.min(current_value, scenarios.length + 1); } scenariolist.get_level = function (deck_name, special_rules) { - var base_level = scenariolist.level_selector.get_selection(); + const base_level = scenariolist.level_selector.get_selection(); if ((special_rules.indexOf(SPECIAL_RULES.living_corpse_two_levels_extra) >= 0) && (deck_name === SPECIAL_RULES.living_corpse_two_levels_extra.affected_deck)) { - return Math.min(7, (parseInt(base_level) + parseInt(SPECIAL_RULES.living_corpse_two_levels_extra.extra_levels))); + return Math.min(7, (parseInt(base_level) + SPECIAL_RULES.living_corpse_two_levels_extra.extra_levels)); } else { return base_level; } @@ -1132,29 +1131,29 @@ function ScenarioList(scenarios) { } export function init() { - var deckspage = document.getElementById("deckspage"); - var scenariospage = document.getElementById("scenariospage"); - var applydeckbtn = document.getElementById("applydecks"); - var applyscenariobtn = document.getElementById("applyscenario"); - var applyloadbtn = document.getElementById("applyload"); - var showmodifierdeck = document.getElementById("showmodifierdeck"); + const deckspage = document.getElementById("deckspage"); + const scenariospage = document.getElementById("scenariospage"); + const applydeckbtn = document.getElementById("applydecks"); + const applyscenariobtn = document.getElementById("applyscenario"); + const applyloadbtn = document.getElementById("applyload"); + const showmodifierdeck = document.getElementById("showmodifierdeck"); - var decklist = new DeckList(); - var scenariolist = new ScenarioList(SCENARIO_DEFINITIONS); + const decklist = new DeckList(); + const scenariolist = new ScenarioList(SCENARIO_DEFINITIONS); deckspage.insertAdjacentElement("afterbegin", decklist.ul); scenariospage.insertAdjacentElement("afterbegin", scenariolist.ul); applydeckbtn.onclick = function () { localStorage.clear(); - var selected_deck_names = decklist.get_selected_decks(); - write_to_storage("selected_deck_names", JSON.stringify(selected_deck_names)); - var selected_decks = selected_deck_names.map(function (deck_names) { + const selected_deck_names = decklist.get_selected_decks(); + util.write_to_storage("selected_deck_names", JSON.stringify(selected_deck_names)); + const selected_decks = selected_deck_names.map(function (deck_names) { return load_ability_deck(deck_names.class, deck_names.name, deck_names.level); }); apply_deck_selection(selected_decks, true); - var showmodifierdeck_deckspage = document.getElementById("showmodifierdeck-deckspage"); - var modifier_deck_section = document.getElementById("modifier-container"); + const showmodifierdeck_deckspage = document.getElementById("showmodifierdeck-deckspage"); + const modifier_deck_section = document.getElementById("modifier-container"); if(!showmodifierdeck_deckspage.checked){ modifier_deck_section.style.display = "none"; } @@ -1165,14 +1164,14 @@ export function init() { applyscenariobtn.onclick = function () { try { localStorage.clear(); } catch (e) { console.error('Local storage is required'); return; } - var selected_deck_names = scenariolist.get_scenario_decks(); - write_to_storage("selected_deck_names", JSON.stringify(selected_deck_names)); + const selected_deck_names = scenariolist.get_scenario_decks(); + util.write_to_storage("selected_deck_names", JSON.stringify(selected_deck_names)); decklist.set_selection(selected_deck_names); - var selected_decks = selected_deck_names.map(function (deck_names) { + const selected_decks = selected_deck_names.map(function (deck_names) { return load_ability_deck(deck_names.class, deck_names.name, deck_names.level); }); apply_deck_selection(selected_decks, false); - var modifier_deck_section = document.getElementById("modifier-container"); + const modifier_deck_section = document.getElementById("modifier-container"); if(!showmodifierdeck.checked){ modifier_deck_section.style.display = "none"; } @@ -1181,17 +1180,17 @@ export function init() { } // assume user is ready to go, so hide the Settings menu - show_settingspane(settingspane, cancelarea, false); + ui.show_settingspane(ui.widgets.settingspane, ui.widgets.cancelarea, false); }; applyloadbtn.onclick = function () { - var selected_deck_names = JSON.parse(get_from_storage("selected_deck_names")); + const selected_deck_names = JSON.parse(util.get_from_storage("selected_deck_names")); decklist.set_selection(selected_deck_names); - var selected_decks = selected_deck_names.map(function (deck_names) { + const selected_decks = selected_deck_names.map(function (deck_names) { return load_ability_deck(deck_names.class, deck_names.name, deck_names.level); }); apply_deck_selection(selected_decks, true); - var modifier_deck_section = document.getElementById("modifier-container"); + const modifier_deck_section = document.getElementById("modifier-container"); if(!showmodifierdeck.checked){ modifier_deck_section.style.display = "none"; } diff --git a/src/macros.js b/src/macros.js index f53e8748..fc802e2a 100644 --- a/src/macros.js +++ b/src/macros.js @@ -1,5 +1,5 @@ /* Macros used in card text, alphabetical order */ -MACROS = +const MACROS = { "%air%": "" , "%any%": "" , "%aoe-4-with-black%": "" @@ -49,7 +49,7 @@ MACROS = function expand_macro(macro) { - var key = macro.toLowerCase(); + const key = macro.toLowerCase(); if (key in MACROS) { return MACROS[key]; @@ -62,18 +62,18 @@ function expand_macro(macro) function expand_stat(s, stat, value) { - var re = new RegExp("%" + stat + "% (\\+|-)(\\d*)", "g"); - var line_parsed = re.exec(s); + let re = new RegExp("%" + stat + "% (\\+|-)(\\d*)", "g"); + const line_parsed = re.exec(s); - var has_elite_value = (value.length == 2); - var normal_attack = value[0]; + const has_elite_value = (value.length === 2); + let normal_attack = value[0]; //Check in case of bosses with text in the attack (C+1) - re = new RegExp("(\\d*)(\\+|-)?([a-zA-Z]+)", "i"); - var extra_text_for_particular_bosses = ""; - var value_parsed = re.exec(String(normal_attack)); + re = new RegExp("(\\d*)([+\\-])?([a-zA-Z]+)", "i"); + let extra_text_for_particular_bosses = ""; + const value_parsed = re.exec(String(normal_attack)); if (value_parsed && value_parsed[3]) { - var symbol = (value_parsed[2] == "-") ? "-" : "+"; + const symbol = (value_parsed[2] === "-") ? "-" : "+"; extra_text_for_particular_bosses = value_parsed[3] + symbol; normal_attack = (value_parsed[1] !== "") ? parseInt(value_parsed[1]) : 0; } @@ -81,10 +81,10 @@ function expand_stat(s, stat, value) if (line_parsed) { if (line_parsed[1] === "+") { - var value_normal = normal_attack + parseInt(line_parsed[2]); + const value_normal = normal_attack + parseInt(line_parsed[2]); if (has_elite_value) { - var value_elite = value[1] + parseInt(line_parsed[2]); + const value_elite = value[1] + parseInt(line_parsed[2]); return ("%" + stat + "% " + value_normal + " / " + value_elite + ""); } else { @@ -92,10 +92,10 @@ function expand_stat(s, stat, value) } } else if (line_parsed[1] === "-") { - var value_normal = normal_attack - parseInt(line_parsed[2]); + const value_normal = normal_attack - parseInt(line_parsed[2]); if (has_elite_value) { - var value_elite = value[1] - parseInt(line_parsed[2]); + const value_elite = value[1] - parseInt(line_parsed[2]); return ("%" + stat + "% " + value_normal + " / " + value_elite + ""); } else { @@ -107,23 +107,23 @@ function expand_stat(s, stat, value) return s; } -function attributes_to_lines(attributes) +export function attributes_to_lines(attributes) { - if (!attributes || (attributes[0].length == 0 && attributes[1].length == 0)) + if (!attributes || (attributes[0].length === 0 && attributes[1].length === 0)) { return []; } else { // To make it more readable, group 3 elements in the same row abd naje them small - var attributes_lines = ["* Attributes"]; + let attributes_lines = ["* Attributes"]; // Write common attributes in white - var normal_attributes_lines = []; - var line = 0; - for (var i=0; i Notes: " + notes + ""]; } function expand_special(s, special_value) { - var value = ""; - return special_value.map(function(line){ return ("* " + line); }); } -function special_to_lines(s, special1, special2) +export function special_to_lines(s, special1, special2) { if (special1 && s.indexOf("Special 1") !== -1) { @@ -201,11 +199,11 @@ function special_to_lines(s, special1, special2) return s; } -function expand_string(s, attack, move, range) +export function expand_string(s, attack, move, range) { - var re = new RegExp("%(attack|move|range)% (\\+|-)(\\d*)", "g"); - - while (found = re.exec(s)) + const re = new RegExp("%(attack|move|range)% ([+\\-])(\\d*)", "g"); + let found = re.exec(s); + while (found) { if (found[1] === "attack") { @@ -217,6 +215,7 @@ function expand_string(s, attack, move, range) { s = s.replace(found[0], expand_stat(found[0], "range", range)); } + found = re.exec(s) } return s.replace(/%[^%]*%/gi, expand_macro); diff --git a/src/modifiers.js b/src/modifiers.js index 08332cb7..7a0668c2 100644 --- a/src/modifiers.js +++ b/src/modifiers.js @@ -1,47 +1,47 @@ -var CARD_TYPES_MODIFIER = -{ - BLESS: "bless", - CURSE: "curse", - PLUS0: "plus0", - PLUS1: "plus1", - PLUS2: "plus2", - MINUS1: "minus1", - MINUS2: "minus2", - NULL: "null", - DOUBLE: "double" -}; - -var MODIFIER_CARDS = - { BLESS: { 'type': CARD_TYPES_MODIFIER.BLESS, 'shuffle': false, 'image': 'images/attack_mod_bless.jpg' } - , CURSE: { 'type': CARD_TYPES_MODIFIER.CURSE, 'shuffle': false, 'image': 'images/attack_mod_curse.jpg' } - , PLUS0: { 'type': CARD_TYPES_MODIFIER.PLUS0, 'shuffle': false, 'image': 'images/attack_mod_+0.jpg' } - , PLUS1: { 'type': CARD_TYPES_MODIFIER.PLUS1, 'shuffle': false, 'image': 'images/attack_mod_+1.jpg' } - , PLUS2: { 'type': CARD_TYPES_MODIFIER.PLUS2, 'shuffle': false, 'image': 'images/attack_mod_+2.jpg' } - , MINUS1: { 'type': CARD_TYPES_MODIFIER.MINUS1, 'shuffle': false, 'image': 'images/attack_mod_-1.jpg' } - , MINUS2: { 'type': CARD_TYPES_MODIFIER.MINUS2, 'shuffle': false, 'image': 'images/attack_mod_-2.jpg' } - , NULL: { 'type': CARD_TYPES_MODIFIER.NULL, 'shuffle': true, 'image': 'images/attack_mod_null.jpg' } - , DOUBLE: { 'type': CARD_TYPES_MODIFIER.DOUBLE, 'shuffle': true, 'image': 'images/attack_mod_2x.jpg' } - }; - -var MODIFIER_DECK = - [ MODIFIER_CARDS.PLUS0, - , MODIFIER_CARDS.PLUS0, - , MODIFIER_CARDS.PLUS0, - , MODIFIER_CARDS.PLUS0, - , MODIFIER_CARDS.PLUS0, - , MODIFIER_CARDS.PLUS0, - , MODIFIER_CARDS.PLUS1, - , MODIFIER_CARDS.PLUS1, - , MODIFIER_CARDS.PLUS1, - , MODIFIER_CARDS.PLUS1, - , MODIFIER_CARDS.PLUS1, - , MODIFIER_CARDS.MINUS1, - , MODIFIER_CARDS.MINUS1, - , MODIFIER_CARDS.MINUS1, - , MODIFIER_CARDS.MINUS1, - , MODIFIER_CARDS.MINUS1, - , MODIFIER_CARDS.PLUS2, - , MODIFIER_CARDS.MINUS2, - , MODIFIER_CARDS.NULL, - , MODIFIER_CARDS.DOUBLE, - ]; \ No newline at end of file +export const CARD_TYPES_MODIFIER = +{ + BLESS: "bless", + CURSE: "curse", + PLUS0: "plus0", + PLUS1: "plus1", + PLUS2: "plus2", + MINUS1: "minus1", + MINUS2: "minus2", + NULL: "null", + DOUBLE: "double" +}; + +export const MODIFIER_CARDS = + { BLESS: { 'type': CARD_TYPES_MODIFIER.BLESS, 'shuffle': false, 'image': 'images/attack_mod_bless.jpg' } + , CURSE: { 'type': CARD_TYPES_MODIFIER.CURSE, 'shuffle': false, 'image': 'images/attack_mod_curse.jpg' } + , PLUS0: { 'type': CARD_TYPES_MODIFIER.PLUS0, 'shuffle': false, 'image': 'images/attack_mod_+0.jpg' } + , PLUS1: { 'type': CARD_TYPES_MODIFIER.PLUS1, 'shuffle': false, 'image': 'images/attack_mod_+1.jpg' } + , PLUS2: { 'type': CARD_TYPES_MODIFIER.PLUS2, 'shuffle': false, 'image': 'images/attack_mod_+2.jpg' } + , MINUS1: { 'type': CARD_TYPES_MODIFIER.MINUS1, 'shuffle': false, 'image': 'images/attack_mod_-1.jpg' } + , MINUS2: { 'type': CARD_TYPES_MODIFIER.MINUS2, 'shuffle': false, 'image': 'images/attack_mod_-2.jpg' } + , NULL: { 'type': CARD_TYPES_MODIFIER.NULL, 'shuffle': true, 'image': 'images/attack_mod_null.jpg' } + , DOUBLE: { 'type': CARD_TYPES_MODIFIER.DOUBLE, 'shuffle': true, 'image': 'images/attack_mod_2x.jpg' } + }; + +export const MODIFIER_DECK = + [ MODIFIER_CARDS.PLUS0 + , MODIFIER_CARDS.PLUS0 + , MODIFIER_CARDS.PLUS0 + , MODIFIER_CARDS.PLUS0 + , MODIFIER_CARDS.PLUS0 + , MODIFIER_CARDS.PLUS0 + , MODIFIER_CARDS.PLUS1 + , MODIFIER_CARDS.PLUS1 + , MODIFIER_CARDS.PLUS1 + , MODIFIER_CARDS.PLUS1 + , MODIFIER_CARDS.PLUS1 + , MODIFIER_CARDS.MINUS1 + , MODIFIER_CARDS.MINUS1 + , MODIFIER_CARDS.MINUS1 + , MODIFIER_CARDS.MINUS1 + , MODIFIER_CARDS.MINUS1 + , MODIFIER_CARDS.PLUS2 + , MODIFIER_CARDS.MINUS2 + , MODIFIER_CARDS.NULL + , MODIFIER_CARDS.DOUBLE + ]; diff --git a/src/monster_stats.js b/src/monster_stats.js index 6278ee86..d802bf02 100644 --- a/src/monster_stats.js +++ b/src/monster_stats.js @@ -1,8264 +1,8264 @@ -SPECIAL_VALUES = -{ - "X": "X = Hexes moved", - "C": "C = Number of Characters", - "V": "V = Number of Scouts present" -} - -MONSTER_STATS = { - "monsters": { - "Ancient Artillery": { - "level": [ - { - "level": 0, - "normal": { - "health": 4, - "move": 0, - "attack": 2, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 7, - "move": 0, - "attack": 3, - "range": 5, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 6, - "move": 0, - "attack": 2, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 9, - "move": 0, - "attack": 3, - "range": 5, - "attributes": [] - } - }, - { - "level": 2, - "normal": { - "health": 7, - "move": 0, - "attack": 2, - "range": 5, - "attributes": [] - }, - "elite": { - "health": 11, - "move": 0, - "attack": 3, - "range": 6, - "attributes": [] - } - }, - { - "level": 3, - "normal": { - "health": 8, - "move": 0, - "attack": 3, - "range": 5, - "attributes": [] - }, - "elite": { - "health": 13, - "move": 0, - "attack": 4, - "range": 6, - "attributes": [] - } - }, - { - "level": 4, - "normal": { - "health": 9, - "move": 0, - "attack": 4, - "range": 5, - "attributes": [] - }, - "elite": { - "health": 13, - "move": 0, - "attack": 4, - "range": 6, - "attributes": [ - "%target% 2" - ] - } - }, - { - "level": 5, - "normal": { - "health": 11, - "move": 0, - "attack": 4, - "range": 6, - "attributes": [] - }, - "elite": { - "health": 15, - "move": 0, - "attack": 4, - "range": 7, - "attributes": [ - "%target% 2" - ] - } - }, - { - "level": 6, - "normal": { - "health": 14, - "move": 0, - "attack": 4, - "range": 6, - "attributes": [] - }, - "elite": { - "health": 16, - "move": 0, - "attack": 5, - "range": 7, - "attributes": [ - "%target% 2" - ] - } - }, - { - "level": 7, - "normal": { - "health": 16, - "move": 0, - "attack": 4, - "range": 7, - "attributes": [] - }, - "elite": { - "health": 20, - "move": 0, - "attack": 5, - "range": 7, - "attributes": [ - "%target% 2" - ] - } - } - ] - }, - "Bandit Archer": { - "level": [ - { - "level": 0, - "normal": { - "health": 4, - "move": 2, - "attack": 2, - "range": 3, - "attributes": [] - }, - "elite": { - "health": 6, - "move": 2, - "attack": 3, - "range": 3, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 5, - "move": 2, - "attack": 2, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 7, - "move": 2, - "attack": 3, - "range": 5, - "attributes": [] - } - }, - { - "level": 2, - "normal": { - "health": 6, - "move": 3, - "attack": 2, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 9, - "move": 3, - "attack": 3, - "range": 5, - "attributes": [] - } - }, - { - "level": 3, - "normal": { - "health": 6, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 10, - "move": 3, - "attack": 4, - "range": 5, - "attributes": [] - } - }, - { - "level": 4, - "normal": { - "health": 8, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 10, - "move": 3, - "attack": 4, - "range": 6, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 5, - "normal": { - "health": 10, - "move": 3, - "attack": 3, - "range": 5, - "attributes": [] - }, - "elite": { - "health": 12, - "move": 4, - "attack": 4, - "range": 6, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 6, - "normal": { - "health": 10, - "move": 3, - "attack": 4, - "range": 5, - "attributes": [] - }, - "elite": { - "health": 13, - "move": 4, - "attack": 5, - "range": 6, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 7, - "normal": { - "health": 13, - "move": 3, - "attack": 4, - "range": 5, - "attributes": [] - }, - "elite": { - "health": 17, - "move": 4, - "attack": 5, - "range": 6, - "attributes": [ - "%poison%" - ] - } - } - ] - }, - "Bandit Guard": { - "level": [ - { - "level": 0, - "normal": { - "health": 5, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 9, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 6, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 9, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%shield% 1" - ] - } - }, - { - "level": 2, - "normal": { - "health": 6, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 10, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%shield% 1" - ] - } - }, - { - "level": 3, - "normal": { - "health": 9, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 10, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%shield% 2" - ] - } - }, - { - "level": 4, - "normal": { - "health": 10, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 11, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%muddle%", - "%shield% 2" - ] - } - }, - { - "level": 5, - "normal": { - "health": 11, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 12, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%muddle%", - "%shield% 2" - ] - } - }, - { - "level": 6, - "normal": { - "health": 14, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 14, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%muddle%", - "%shield% 2" - ] - } - }, - { - "level": 7, - "normal": { - "health": 16, - "move": 5, - "attack": 4, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 14, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%muddle%", - "%shield% 3" - ] - } - } - ] - }, - "Black Imp": { - "level": [ - { - "level": 0, - "normal": { - "health": 3, - "move": 1, - "attack": 1, - "range": 3, - "attributes": [] - }, - "elite": { - "health": 4, - "move": 1, - "attack": 2, - "range": 3, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 1, - "normal": { - "health": 4, - "move": 1, - "attack": 1, - "range": 3, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 6, - "move": 1, - "attack": 2, - "range": 3, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 2, - "normal": { - "health": 5, - "move": 1, - "attack": 1, - "range": 4, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 8, - "move": 1, - "attack": 2, - "range": 4, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 3, - "normal": { - "health": 5, - "move": 1, - "attack": 2, - "range": 4, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 8, - "move": 1, - "attack": 3, - "range": 4, - "attributes": [ - "Attackers gain Disadvantage", - "%poison%" - ] - } - }, - { - "level": 4, - "normal": { - "health": 7, - "move": 1, - "attack": 2, - "range": 4, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 11, - "move": 1, - "attack": 3, - "range": 4, - "attributes": [ - "Attackers gain Disadvantage", - "%poison%" - ] - } - }, - { - "level": 5, - "normal": { - "health": 9, - "move": 1, - "attack": 2, - "range": 4, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 12, - "move": 1, - "attack": 3, - "range": 5, - "attributes": [ - "Attackers gain Disadvantage", - "%poison%" - ] - } - }, - { - "level": 6, - "normal": { - "health": 10, - "move": 1, - "attack": 3, - "range": 4, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 14, - "move": 1, - "attack": 4, - "range": 5, - "attributes": [ - "Attackers gain Disadvantage", - "%poison%" - ] - } - }, - { - "level": 7, - "normal": { - "health": 12, - "move": 1, - "attack": 3, - "range": 4, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 17, - "move": 1, - "attack": 4, - "range": 5, - "attributes": [ - "Attackers gain Disadvantage", - "%poison%" - ] - } - } - ] - }, - "Cave Bear": { - "level": [ - { - "level": 0, - "normal": { - "health": 7, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 11, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 9, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 14, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 2, - "normal": { - "health": 11, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 17, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 3, - "normal": { - "health": 13, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 20, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [] - } - }, - { - "level": 4, - "normal": { - "health": 16, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 21, - "move": 5, - "attack": 5, - "range": 0, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 5, - "normal": { - "health": 17, - "move": 5, - "attack": 4, - "range": 0, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 24, - "move": 5, - "attack": 6, - "range": 0, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 6, - "normal": { - "health": 19, - "move": 5, - "attack": 5, - "range": 0, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 28, - "move": 5, - "attack": 7, - "range": 0, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 7, - "normal": { - "health": 22, - "move": 5, - "attack": 5, - "range": 0, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 33, - "move": 5, - "attack": 7, - "range": 0, - "attributes": [ - "%wound%" - ] - } - } - ] - }, - "City Archer": { - "level": [ - { - "level": 0, - "normal": { - "health": 4, - "move": 1, - "attack": 2, - "range": 3, - "attributes": [] - }, - "elite": { - "health": 6, - "move": 1, - "attack": 3, - "range": 4, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 5, - "move": 1, - "attack": 2, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 6, - "move": 1, - "attack": 3, - "range": 5, - "attributes": [ - "%pierce% 1", - "%shield% 1" - ] - } - }, - { - "level": 2, - "normal": { - "health": 6, - "move": 1, - "attack": 3, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 7, - "move": 1, - "attack": 4, - "range": 5, - "attributes": [ - "%pierce% 2", - "%shield% 1" - ] - } - }, - { - "level": 3, - "normal": { - "health": 6, - "move": 2, - "attack": 3, - "range": 4, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 8, - "move": 2, - "attack": 4, - "range": 5, - "attributes": [ - "%pierce% 2", - "%shield% 2" - ] - } - }, - { - "level": 4, - "normal": { - "health": 8, - "move": 2, - "attack": 3, - "range": 5, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 10, - "move": 2, - "attack": 4, - "range": 6, - "attributes": [ - "%pierce% 2", - "%shield% 2" - ] - } - }, - { - "level": 5, - "normal": { - "health": 9, - "move": 2, - "attack": 4, - "range": 5, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 11, - "move": 2, - "attack": 5, - "range": 6, - "attributes": [ - "%pierce% 3", - "%shield% 2" - ] - } - }, - { - "level": 6, - "normal": { - "health": 9, - "move": 3, - "attack": 4, - "range": 5, - "attributes": [ - "%shield% 2" - ] - }, - "elite": { - "health": 12, - "move": 3, - "attack": 6, - "range": 6, - "attributes": [ - "%pierce% 3", - "%shield% 2" - ] - } - }, - { - "level": 7, - "normal": { - "health": 10, - "move": 3, - "attack": 4, - "range": 6, - "attributes": [ - "%shield% 2" - ] - }, - "elite": { - "health": 13, - "move": 3, - "attack": 6, - "range": 7, - "attributes": [ - "%pierce% 3", - "%shield% 3" - ] - } - } - ] - }, - "City Guard": { - "level": [ - { - "level": 0, - "normal": { - "health": 5, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 6, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%shield% 1" - ] - } - }, - { - "level": 1, - "normal": { - "health": 5, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 6, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%shield% 2" - ] - } - }, - { - "level": 2, - "normal": { - "health": 7, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 9, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%shield% 2" - ] - } - }, - { - "level": 3, - "normal": { - "health": 8, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 9, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 1", - "%shield% 2" - ] - } - }, - { - "level": 4, - "normal": { - "health": 9, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 10, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 2", - "%shield% 2" - ] - } - }, - { - "level": 5, - "normal": { - "health": 10, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%shield% 2" - ] - }, - "elite": { - "health": 12, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 2", - "%shield% 3" - ] - } - }, - { - "level": 6, - "normal": { - "health": 11, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%shield% 2" - ] - }, - "elite": { - "health": 13, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 3", - "%shield% 3" - ] - } - }, - { - "level": 7, - "normal": { - "health": 13, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%shield% 2" - ] - }, - "elite": { - "health": 14, - "move": 3, - "attack": 6, - "range": 0, - "attributes": [ - "%retaliate% 3", - "%shield% 3" - ] - } - } - ] - }, - "Cultist": { - "level": [ - { - "level": 0, - "normal": { - "health": 4, - "move": 2, - "attack": 1, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 7, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 5, - "move": 2, - "attack": 1, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 9, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [] - } - }, - { - "level": 2, - "normal": { - "health": 7, - "move": 2, - "attack": 1, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 12, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [] - } - }, - { - "level": 3, - "normal": { - "health": 9, - "move": 3, - "attack": 1, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 13, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [ - "%curse%" - ] - } - }, - { - "level": 4, - "normal": { - "health": 10, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 15, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%curse%" - ] - } - }, - { - "level": 5, - "normal": { - "health": 11, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [ - "%curse%" - ] - }, - "elite": { - "health": 18, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%curse%" - ] - } - }, - { - "level": 6, - "normal": { - "health": 14, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [ - "%curse%" - ] - }, - "elite": { - "health": 22, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%curse%" - ] - } - }, - { - "level": 7, - "normal": { - "health": 15, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%curse%" - ] - }, - "elite": { - "health": 25, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%curse%" - ] - } - } - ] - }, - "Deep Terror": { - "level": [ - { - "level": 0, - "normal": { - "health": 3, - "move": 0, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 5, - "move": 0, - "attack": 3, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 4, - "move": 0, - "attack": 2, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - }, - "elite": { - "health": 6, - "move": 0, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - } - }, - { - "level": 2, - "normal": { - "health": 4, - "move": 0, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - }, - "elite": { - "health": 7, - "move": 0, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - } - }, - { - "level": 3, - "normal": { - "health": 5, - "move": 0, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 8, - "move": 0, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 4, - "normal": { - "health": 6, - "move": 0, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 9, - "move": 0, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 5, - "normal": { - "health": 7, - "move": 0, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - }, - "elite": { - "health": 11, - "move": 0, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 6, - "normal": { - "health": 8, - "move": 0, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - }, - "elite": { - "health": 13, - "move": 0, - "attack": 6, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 7, - "normal": { - "health": 9, - "move": 0, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 4" - ] - }, - "elite": { - "health": 15, - "move": 0, - "attack": 6, - "range": 0, - "attributes": [ - "%retaliate% 4" - ] - } - } - ] - }, - "Earth Demon": { - "level": [ - { - "level": 0, - "normal": { - "health": 7, - "move": 1, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 10, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 9, - "move": 1, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 13, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 2, - "normal": { - "health": 12, - "move": 1, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 18, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 3, - "normal": { - "health": 13, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 20, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%immobilize%" - ] - } - }, - { - "level": 4, - "normal": { - "health": 15, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 21, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%immobilize%" - ] - } - }, - { - "level": 5, - "normal": { - "health": 17, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%immobilize%" - ] - }, - "elite": { - "health": 25, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%immobilize%" - ] - } - }, - { - "level": 6, - "normal": { - "health": 20, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%immobilize%" - ] - }, - "elite": { - "health": 27, - "move": 3, - "attack": 6, - "range": 0, - "attributes": [ - "%immobilize%" - ] - } - }, - { - "level": 7, - "normal": { - "health": 22, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%immobilize%" - ] - }, - "elite": { - "health": 32, - "move": 3, - "attack": 6, - "range": 0, - "attributes": [ - "%immobilize%" - ] - } - } - ] - }, - "Flame Demon": { - "level": [ - { - "level": 0, - "normal": { - "health": 2, - "move": 3, - "attack": 2, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 2" - ] - }, - "elite": { - "health": 3, - "move": 3, - "attack": 2, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 3" - ] - } - }, - { - "level": 1, - "normal": { - "health": 2, - "move": 3, - "attack": 2, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 3" - ] - }, - "elite": { - "health": 3, - "move": 3, - "attack": 2, - "range": 4, - "attributes": [ - "%flying%", - "%retaliate% 2: %range% 2", - "%shield% 4" - ] - } - }, - { - "level": 2, - "normal": { - "health": 3, - "move": 3, - "attack": 3, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 3" - ] - }, - "elite": { - "health": 4, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%retaliate% 3: %range% 2", - "%shield% 4" - ] - } - }, - { - "level": 3, - "normal": { - "health": 3, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%retaliate% 2: %range% 2", - "%shield% 3" - ] - }, - "elite": { - "health": 5, - "move": 3, - "attack": 3, - "range": 5, - "attributes": [ - "%flying%", - "%retaliate% 3: %range% 3", - "%shield% 4" - ] - } - }, - { - "level": 4, - "normal": { - "health": 3, - "move": 4, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%retaliate% 3: %range% 2", - "%shield% 3" - ] - }, - "elite": { - "health": 5, - "move": 4, - "attack": 4, - "range": 5, - "attributes": [ - "%flying%", - "%retaliate% 4: %range% 3", - "%shield% 4" - ] - } - }, - { - "level": 5, - "normal": { - "health": 4, - "move": 4, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%retaliate% 3: %range% 2", - "%shield% 4" - ] - }, - "elite": { - "health": 6, - "move": 4, - "attack": 4, - "range": 5, - "attributes": [ - "%flying%", - "%retaliate% 4: %range% 3", - "%shield% 5" - ] - } - }, - { - "level": 6, - "normal": { - "health": 4, - "move": 4, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%retaliate% 4: %range% 2", - "%shield% 4" - ] - }, - "elite": { - "health": 7, - "move": 4, - "attack": 5, - "range": 5, - "attributes": [ - "%flying%", - "%retaliate% 5: %range% 3", - "%shield% 5" - ] - } - }, - { - "level": 7, - "normal": { - "health": 5, - "move": 4, - "attack": 4, - "range": 5, - "attributes": [ - "%flying%", - "%retaliate% 4: %range% 3", - "%shield% 4" - ] - }, - "elite": { - "health": 8, - "move": 4, - "attack": 5, - "range": 6, - "attributes": [ - "%flying%", - "%retaliate% 5: %range% 4", - "%shield% 5" - ] - } - } - ] - }, - "Frost Demon": { - "level": [ - { - "level": 0, - "normal": { - "health": 5, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 10, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 6, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - }, - "elite": { - "health": 10, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 2, - "normal": { - "health": 7, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 12, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 3, - "normal": { - "health": 8, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 14, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 4, - "normal": { - "health": 10, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 18, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 5, - "normal": { - "health": 11, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - }, - "elite": { - "health": 20, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 6, - "normal": { - "health": 12, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - }, - "elite": { - "health": 22, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 4" - ] - } - }, - { - "level": 7, - "normal": { - "health": 14, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - }, - "elite": { - "health": 25, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 4" - ] - } - } - ] - }, - "Forest Imp": { - "level": [ - { - "level": 0, - "normal": { - "health": 1, - "move": 3, - "attack": 1, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 1" - ] - }, - "elite": { - "health": 4, - "move": 3, - "attack": 1, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 1" - ] - } - }, - { - "level": 1, - "normal": { - "health": 2, - "move": 3, - "attack": 1, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 1" - ] - }, - "elite": { - "health": 5, - "move": 3, - "attack": 2, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 1" - ] - } - }, - { - "level": 2, - "normal": { - "health": 2, - "move": 3, - "attack": 2, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 1" - ] - }, - "elite": { - "health": 6, - "move": 3, - "attack": 2, - "range": 3, - "attributes": [ - "%flying%", - "%curse%", - "%shield% 1" - ] - } - }, - { - "level": 3, - "normal": { - "health": 3, - "move": 4, - "attack": 2, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 1" - ] - }, - "elite": { - "health": 7, - "move": 4, - "attack": 2, - "range": 4, - "attributes": [ - "%flying%", - "%curse%", - "%shield% 1" - ] - } - }, - { - "level": 4, - "normal": { - "health": 3, - "move": 4, - "attack": 2, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 2" - ] - }, - "elite": { - "health": 7, - "move": 4, - "attack": 2, - "range": 4, - "attributes": [ - "%flying%", - "%curse%", - "%shield% 2" - ] - } - }, - { - "level": 5, - "normal": { - "health": 4, - "move": 4, - "attack": 2, - "range": 4, - "attributes": [ - "%flying%", - "%curse%", - "%shield% 2" - ] - }, - "elite": { - "health": 8, - "move": 4, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%curse%", - "%shield% 2" - ] - } - }, - { - "level": 6, - "normal": { - "health": 4, - "move": 4, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%curse%", - "%shield% 2" - ] - }, - "elite": { - "health": 9, - "move": 4, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%curse%", - "%shield% 2" - ] - } - }, - { - "level": 7, - "normal": { - "health": 6, - "move": 4, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%curse%", - "%shield% 2" - ] - }, - "elite": { - "health": 11, - "move": 4, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%curse%", - "%shield% 2" - ] - } - } - ] - }, - "Giant Viper": { - "level": [ - { - "level": 0, - "normal": { - "health": 2, - "move": 2, - "attack": 1, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 3, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 1, - "normal": { - "health": 3, - "move": 2, - "attack": 1, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 5, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 2, - "normal": { - "health": 4, - "move": 3, - "attack": 1, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 7, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 3, - "normal": { - "health": 4, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 8, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 4, - "normal": { - "health": 6, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 11, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 5, - "normal": { - "health": 7, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 13, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 6, - "normal": { - "health": 8, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 14, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 7, - "normal": { - "health": 10, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 17, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%poison%" - ] - } - } - ] - }, - "Harrower Infester": { - "level": [ - { - "level": 0, - "normal": { - "health": 6, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 12, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 7, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - }, - "elite": { - "health": 12, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 2, - "normal": { - "health": 8, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 14, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 3, - "normal": { - "health": 10, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 17, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 4, - "normal": { - "health": 12, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 19, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 5, - "normal": { - "health": 12, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - }, - "elite": { - "health": 21, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 6, - "normal": { - "health": 15, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - }, - "elite": { - "health": 22, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 4" - ] - } - }, - { - "level": 7, - "normal": { - "health": 17, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 4" - ] - }, - "elite": { - "health": 26, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 4" - ] - } - } - ] - }, - "Hound": { - "level": [ - { - "level": 0, - "normal": { - "health": 4, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 6, - "move": 5, - "attack": 2, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 4, - "move": 4, - "attack": 2, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - }, - "elite": { - "health": 6, - "move": 5, - "attack": 2, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 2, - "normal": { - "health": 6, - "move": 4, - "attack": 2, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - }, - "elite": { - "health": 7, - "move": 5, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 3, - "normal": { - "health": 8, - "move": 4, - "attack": 2, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - }, - "elite": { - "health": 8, - "move": 5, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 4, - "normal": { - "health": 8, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - }, - "elite": { - "health": 11, - "move": 5, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 5, - "normal": { - "health": 9, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 12, - "move": 5, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 6, - "normal": { - "health": 11, - "move": 5, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 15, - "move": 6, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 7, - "normal": { - "health": 15, - "move": 5, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 15, - "move": 6, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 4" - ] - } - } - ] - }, - "Inox Archer": { - "level": [ - { - "level": 0, - "normal": { - "health": 5, - "move": 2, - "attack": 2, - "range": 2, - "attributes": [] - }, - "elite": { - "health": 7, - "move": 2, - "attack": 3, - "range": 3, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 6, - "move": 2, - "attack": 2, - "range": 3, - "attributes": [] - }, - "elite": { - "health": 8, - "move": 2, - "attack": 3, - "range": 4, - "attributes": [] - } - }, - { - "level": 2, - "normal": { - "health": 8, - "move": 2, - "attack": 2, - "range": 3, - "attributes": [] - }, - "elite": { - "health": 11, - "move": 2, - "attack": 3, - "range": 4, - "attributes": [] - } - }, - { - "level": 3, - "normal": { - "health": 9, - "move": 2, - "attack": 3, - "range": 3, - "attributes": [] - }, - "elite": { - "health": 13, - "move": 2, - "attack": 4, - "range": 4, - "attributes": [] - } - }, - { - "level": 4, - "normal": { - "health": 10, - "move": 3, - "attack": 3, - "range": 3, - "attributes": [] - }, - "elite": { - "health": 14, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 5, - "normal": { - "health": 12, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 17, - "move": 3, - "attack": 4, - "range": 5, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 6, - "normal": { - "health": 12, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 19, - "move": 3, - "attack": 5, - "range": 5, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 7, - "normal": { - "health": 15, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 23, - "move": 3, - "attack": 5, - "range": 5, - "attributes": [ - "%wound%" - ] - } - } - ] - }, - "Inox Guard": { - "level": [ - { - "level": 0, - "normal": { - "health": 5, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 9, - "move": 1, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - } - }, - { - "level": 1, - "normal": { - "health": 8, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 10, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 2, - "normal": { - "health": 9, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 12, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - } - }, - { - "level": 3, - "normal": { - "health": 11, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 15, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 4, - "normal": { - "health": 12, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - }, - "elite": { - "health": 17, - "move": 2, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 3" - ] - } - }, - { - "level": 5, - "normal": { - "health": 13, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - }, - "elite": { - "health": 19, - "move": 2, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 4" - ] - } - }, - { - "level": 6, - "normal": { - "health": 16, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 1" - ] - }, - "elite": { - "health": 21, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%retaliate% 4" - ] - } - }, - { - "level": 7, - "normal": { - "health": 19, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%retaliate% 2" - ] - }, - "elite": { - "health": 23, - "move": 3, - "attack": 6, - "range": 0, - "attributes": [ - "%retaliate% 4" - ] - } - } - ] - }, - "Inox Shaman": { - "level": [ - { - "level": 0, - "normal": { - "health": 4, - "move": 1, - "attack": 2, - "range": 3, - "attributes": [] - }, - "elite": { - "health": 6, - "move": 2, - "attack": 3, - "range": 3, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 6, - "move": 1, - "attack": 2, - "range": 3, - "attributes": [] - }, - "elite": { - "health": 9, - "move": 2, - "attack": 3, - "range": 3, - "attributes": [] - } - }, - { - "level": 2, - "normal": { - "health": 7, - "move": 2, - "attack": 2, - "range": 3, - "attributes": [] - }, - "elite": { - "health": 11, - "move": 3, - "attack": 3, - "range": 3, - "attributes": [] - } - }, - { - "level": 3, - "normal": { - "health": 9, - "move": 2, - "attack": 2, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 14, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [] - } - }, - { - "level": 4, - "normal": { - "health": 10, - "move": 2, - "attack": 3, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 16, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [] - } - }, - { - "level": 5, - "normal": { - "health": 13, - "move": 2, - "attack": 3, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 20, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [] - } - }, - { - "level": 6, - "normal": { - "health": 15, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 24, - "move": 4, - "attack": 4, - "range": 4, - "attributes": [] - } - }, - { - "level": 7, - "normal": { - "health": 16, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [] - }, - "elite": { - "health": 27, - "move": 4, - "attack": 5, - "range": 4, - "attributes": [] - } - } - ] - }, - "Living Bones": { - "level": [ - { - "level": 0, - "normal": { - "health": 5, - "move": 2, - "attack": 1, - "range": 0, - "attributes": [ - "%target% 2" - ] - }, - "elite": { - "health": 6, - "move": 4, - "attack": 2, - "range": 0, - "attributes": [ - "%target% 2" - ] - } - }, - { - "level": 1, - "normal": { - "health": 5, - "move": 3, - "attack": 1, - "range": 0, - "attributes": [ - "%target% 2", - "%shield% 1" - ] - }, - "elite": { - "health": 6, - "move": 4, - "attack": 2, - "range": 0, - "attributes": [ - "%target% 3", - "%shield% 1" - ] - } - }, - { - "level": 2, - "normal": { - "health": 5, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [ - "%target% 2", - "%shield% 1" - ] - }, - "elite": { - "health": 7, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [ - "%target% 3", - "%shield% 1" - ] - } - }, - { - "level": 3, - "normal": { - "health": 7, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [ - "%target% 2", - "%shield% 1" - ] - }, - "elite": { - "health": 10, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [ - "%target% 3", - "%shield% 1" - ] - } - }, - { - "level": 4, - "normal": { - "health": 7, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%target% 2", - "%shield% 1" - ] - }, - "elite": { - "health": 11, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%target% 3", - "%shield% 1" - ] - } - }, - { - "level": 5, - "normal": { - "health": 9, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%target% 2", - "%shield% 1" - ] - }, - "elite": { - "health": 11, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%target% 3", - "%shield% 2" - ] - } - }, - { - "level": 6, - "normal": { - "health": 10, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [ - "%target% 2", - "%shield% 1" - ] - }, - "elite": { - "health": 11, - "move": 6, - "attack": 4, - "range": 0, - "attributes": [ - "%target% 3", - "%shield% 2" - ] - } - }, - { - "level": 7, - "normal": { - "health": 13, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [ - "%target% 2", - "%shield% 1" - ] - }, - "elite": { - "health": 14, - "move": 6, - "attack": 4, - "range": 0, - "attributes": [ - "%target% 3", - "%shield% 2" - ] - } - } - ] - }, - "Living Corpse": { - "level": [ - { - "level": 0, - "normal": { - "health": 5, - "move": 1, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 10, - "move": 1, - "attack": 3, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 7, - "move": 1, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 10, - "move": 1, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 2, - "normal": { - "health": 9, - "move": 1, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 13, - "move": 1, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 3, - "normal": { - "health": 10, - "move": 1, - "attack": 4, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 13, - "move": 2, - "attack": 5, - "range": 0, - "attributes": [] - } - }, - { - "level": 4, - "normal": { - "health": 11, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 15, - "move": 2, - "attack": 5, - "range": 0, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 5, - "normal": { - "health": 13, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 17, - "move": 2, - "attack": 6, - "range": 0, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 6, - "normal": { - "health": 14, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 21, - "move": 2, - "attack": 6, - "range": 0, - "attributes": [ - "%poison%" - ] - } - }, - { - "level": 7, - "normal": { - "health": 15, - "move": 2, - "attack": 5, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 25, - "move": 2, - "attack": 6, - "range": 0, - "attributes": [ - "%poison%" - ] - } - } - ] - }, - "Living Spirit": { - "level": [ - { - "level": 0, - "normal": { - "health": 2, - "move": 2, - "attack": 2, - "range": 2, - "attributes": [ - "%flying%", - "%shield% 1" - ] - }, - "elite": { - "health": 3, - "move": 3, - "attack": 3, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 2" - ] - } - }, - { - "level": 1, - "normal": { - "health": 2, - "move": 2, - "attack": 2, - "range": 2, - "attributes": [ - "%flying%", - "%shield% 2" - ] - }, - "elite": { - "health": 3, - "move": 3, - "attack": 3, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 3" - ] - } - }, - { - "level": 2, - "normal": { - "health": 2, - "move": 3, - "attack": 2, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 2" - ] - }, - "elite": { - "health": 3, - "move": 4, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 3" - ] - } - }, - { - "level": 3, - "normal": { - "health": 3, - "move": 3, - "attack": 3, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 2" - ] - }, - "elite": { - "health": 4, - "move": 4, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 3" - ] - } - }, - { - "level": 4, - "normal": { - "health": 3, - "move": 3, - "attack": 3, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 3" - ] - }, - "elite": { - "health": 4, - "move": 4, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 4" - ] - } - }, - { - "level": 5, - "normal": { - "health": 4, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 3" - ] - }, - "elite": { - "health": 6, - "move": 4, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 4" - ] - } - }, - { - "level": 6, - "normal": { - "health": 4, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 3" - ] - }, - "elite": { - "health": 7, - "move": 4, - "attack": 5, - "range": 5, - "attributes": [ - "%flying%", - "%shield% 4" - ] - } - }, - { - "level": 7, - "normal": { - "health": 6, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 3" - ] - }, - "elite": { - "health": 9, - "move": 4, - "attack": 5, - "range": 5, - "attributes": [ - "%flying%", - "%shield% 4" - ] - } - } - ] - }, - "Lurker": { - "level": [ - { - "level": 0, - "normal": { - "health": 5, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [ - "%target% 2" - ] - }, - "elite": { - "health": 7, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%target% 2", - "%shield% 1" - ] - } - }, - { - "level": 1, - "normal": { - "health": 7, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 1" - ] - }, - "elite": { - "health": 9, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 1", - "%shield% 1" - ] - } - }, - { - "level": 2, - "normal": { - "health": 9, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 1" - ] - }, - "elite": { - "health": 12, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 2", - "%shield% 1" - ] - } - }, - { - "level": 3, - "normal": { - "health": 10, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 2" - ] - }, - "elite": { - "health": 14, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 2", - "%shield% 1" - ] - } - }, - { - "level": 4, - "normal": { - "health": 10, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 2", - "%shield% 1" - ] - }, - "elite": { - "health": 14, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 3", - "%shield% 2" - ] - } - }, - { - "level": 5, - "normal": { - "health": 11, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 2", - "%shield% 1" - ] - }, - "elite": { - "health": 15, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 3", - "%shield% 2" - ] - } - }, - { - "level": 6, - "normal": { - "health": 12, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 3", - "%shield% 1" - ] - }, - "elite": { - "health": 16, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 4", - "%shield% 2" - ] - } - }, - { - "level": 7, - "normal": { - "health": 14, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 3", - "%shield% 1" - ] - }, - "elite": { - "health": 18, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%target% 2", - "%pierce% 4", - "%shield% 2" - ] - } - } - ] - }, - "Ooze": { - "level": [ - { - "level": 0, - "normal": { - "health": 4, - "move": 1, - "attack": 2, - "range": 2, - "attributes": [] - }, - "elite": { - "health": 8, - "move": 1, - "attack": 2, - "range": 3, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 5, - "move": 1, - "attack": 2, - "range": 2, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 9, - "move": 1, - "attack": 2, - "range": 3, - "attributes": [ - "%shield% 1" - ] - } - }, - { - "level": 2, - "normal": { - "health": 7, - "move": 1, - "attack": 2, - "range": 3, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 11, - "move": 1, - "attack": 3, - "range": 3, - "attributes": [ - "%shield% 1" - ] - } - }, - { - "level": 3, - "normal": { - "health": 8, - "move": 1, - "attack": 3, - "range": 3, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 11, - "move": 2, - "attack": 3, - "range": 4, - "attributes": [ - "%poison%", - "%shield% 1" - ] - } - }, - { - "level": 4, - "normal": { - "health": 9, - "move": 2, - "attack": 3, - "range": 3, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 13, - "move": 2, - "attack": 4, - "range": 4, - "attributes": [ - "%poison%", - "%shield% 1" - ] - } - }, - { - "level": 5, - "normal": { - "health": 10, - "move": 2, - "attack": 3, - "range": 3, - "attributes": [ - "%poison%", - "%shield% 1" - ] - }, - "elite": { - "health": 15, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%poison%", - "%shield% 1" - ] - } - }, - { - "level": 6, - "normal": { - "health": 12, - "move": 2, - "attack": 4, - "range": 3, - "attributes": [ - "%poison%", - "%shield% 1" - ] - }, - "elite": { - "health": 16, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%poison%", - "%shield% 2" - ] - } - }, - { - "level": 7, - "normal": { - "health": 14, - "move": 2, - "attack": 4, - "range": 3, - "attributes": [ - "%poison%", - "%shield% 1" - ] - }, - "elite": { - "health": 18, - "move": 3, - "attack": 5, - "range": 4, - "attributes": [ - "%poison%", - "%shield% 2" - ] - } - } - ] - }, - "Night Demon": { - "level": [ - { - "level": 0, - "normal": { - "health": 3, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - }, - "elite": { - "health": 5, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - } - }, - { - "level": 1, - "normal": { - "health": 5, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - }, - "elite": { - "health": 8, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - } - }, - { - "level": 2, - "normal": { - "health": 6, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - }, - "elite": { - "health": 11, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - } - }, - { - "level": 3, - "normal": { - "health": 7, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - }, - "elite": { - "health": 13, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - } - }, - { - "level": 4, - "normal": { - "health": 8, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - }, - "elite": { - "health": 15, - "move": 5, - "attack": 5, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - } - }, - { - "level": 5, - "normal": { - "health": 11, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - }, - "elite": { - "health": 17, - "move": 5, - "attack": 6, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - } - }, - { - "level": 6, - "normal": { - "health": 14, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - }, - "elite": { - "health": 21, - "move": 5, - "attack": 6, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - } - }, - { - "level": 7, - "normal": { - "health": 15, - "move": 4, - "attack": 6, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - }, - "elite": { - "health": 21, - "move": 5, - "attack": 8, - "range": 0, - "attributes": [ - "Attackers gain Disadvantage" - ] - } - } - ] - }, - "Rending Drake": { - "level": [ - { - "level": 0, - "normal": { - "health": 5, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 7, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 6, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 7, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 2, - "normal": { - "health": 7, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 9, - "move": 5, - "attack": 5, - "range": 0, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 3, - "normal": { - "health": 7, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 10, - "move": 5, - "attack": 6, - "range": 0, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 4, - "normal": { - "health": 9, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 11, - "move": 6, - "attack": 6, - "range": 0, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 5, - "normal": { - "health": 10, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 14, - "move": 6, - "attack": 6, - "range": 0, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 6, - "normal": { - "health": 11, - "move": 5, - "attack": 5, - "range": 0, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 15, - "move": 6, - "attack": 7, - "range": 0, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 7, - "normal": { - "health": 14, - "move": 5, - "attack": 5, - "range": 0, - "attributes": [ - "%wound%" - ] - }, - "elite": { - "health": 18, - "move": 6, - "attack": 7, - "range": 0, - "attributes": [ - "%wound%" - ] - } - } - ] - }, - "Savvas Icestorm": { - "level": [ - { - "level": 0, - "normal": { - "health": 7, - "move": 2, - "attack": 2, - "range": 3, - "attributes": [ - "%pierce% 3" - ] - }, - "elite": { - "health": 12, - "move": 2, - "attack": 3, - "range": 4, - "attributes": [ - "%pierce% 3" - ] - } - }, - { - "level": 1, - "normal": { - "health": 10, - "move": 2, - "attack": 2, - "range": 4, - "attributes": [ - "%pierce% 3" - ] - }, - "elite": { - "health": 12, - "move": 2, - "attack": 3, - "range": 5, - "attributes": [ - "%pierce% 3", - "%shield% 1" - ] - } - }, - { - "level": 2, - "normal": { - "health": 12, - "move": 3, - "attack": 2, - "range": 4, - "attributes": [ - "%pierce% 3" - ] - }, - "elite": { - "health": 15, - "move": 3, - "attack": 3, - "range": 5, - "attributes": [ - "%pierce% 3", - "%shield% 1" - ] - } - }, - { - "level": 3, - "normal": { - "health": 12, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [ - "%pierce% 3", - "%shield% 1" - ] - }, - "elite": { - "health": 18, - "move": 3, - "attack": 4, - "range": 6, - "attributes": [ - "%pierce% 3", - "%shield% 1" - ] - } - }, - { - "level": 4, - "normal": { - "health": 14, - "move": 3, - "attack": 3, - "range": 5, - "attributes": [ - "%pierce% 3", - "%shield% 1" - ] - }, - "elite": { - "health": 19, - "move": 4, - "attack": 4, - "range": 6, - "attributes": [ - "%pierce% 3", - "%shield% 2" - ] - } - }, - { - "level": 5, - "normal": { - "health": 16, - "move": 3, - "attack": 4, - "range": 5, - "attributes": [ - "%pierce% 3", - "%shield% 1" - ] - }, - "elite": { - "health": 21, - "move": 4, - "attack": 5, - "range": 6, - "attributes": [ - "%pierce% 3", - "%shield% 2" - ] - } - }, - { - "level": 6, - "normal": { - "health": 16, - "move": 3, - "attack": 4, - "range": 5, - "attributes": [ - "%pierce% 3", - "%shield% 2" - ] - }, - "elite": { - "health": 23, - "move": 4, - "attack": 6, - "range": 6, - "attributes": [ - "%pierce% 3", - "%shield% 2" - ] - } - }, - { - "level": 7, - "normal": { - "health": 17, - "move": 4, - "attack": 4, - "range": 6, - "attributes": [ - "%pierce% 3", - "%shield% 2" - ] - }, - "elite": { - "health": 24, - "move": 4, - "attack": 6, - "range": 6, - "attributes": [ - "%pierce% 4", - "%shield% 3" - ] - } - } - ] - }, - "Savvas Lavaflow": { - "level": [ - { - "level": 0, - "normal": { - "health": 8, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 13, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 9, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 15, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%wound%" - ] - } - }, - { - "level": 2, - "normal": { - "health": 11, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 18, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%poison%", - "%wound%" - ] - } - }, - { - "level": 3, - "normal": { - "health": 14, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 21, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%poison%", - "%wound%" - ] - } - }, - { - "level": 4, - "normal": { - "health": 16, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%poison%" - ] - }, - "elite": { - "health": 24, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%poison%", - "%wound%" - ] - } - }, - { - "level": 5, - "normal": { - "health": 18, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%poison%", - "%wound%" - ] - }, - "elite": { - "health": 27, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%poison%", - "%wound%" - ] - } - }, - { - "level": 6, - "normal": { - "health": 20, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%poison%", - "%wound%" - ] - }, - "elite": { - "health": 30, - "move": 4, - "attack": 6, - "range": 0, - "attributes": [ - "%poison%", - "%wound%" - ] - } - }, - { - "level": 7, - "normal": { - "health": 24, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [ - "%poison%", - "%wound%" - ] - }, - "elite": { - "health": 35, - "move": 4, - "attack": 6, - "range": 0, - "attributes": [ - "%poison%", - "%wound%" - ] - } - } - ] - }, - "Spitting Drake": { - "level": [ - { - "level": 0, - "normal": { - "health": 5, - "move": 3, - "attack": 3, - "range": 3, - "attributes": [ - "%flying%"] - }, - "elite": { - "health": 8, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%"] - } - }, - { - "level": 1, - "normal": { - "health": 6, - "move": 3, - "attack": 3, - "range": 3, - "attributes": [ - "%flying%"] - }, - "elite": { - "health": 9, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%muddle%" - ] - } - }, - { - "level": 2, - "normal": { - "health": 8, - "move": 3, - "attack": 3, - "range": 3, - "attributes": [ - "%flying%", - "%muddle%" - ] - }, - "elite": { - "health": 10, - "move": 3, - "attack": 5, - "range": 4, - "attributes": [ - "%flying%", - "%muddle%" - ] - } - }, - { - "level": 3, - "normal": { - "health": 8, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%muddle%" - ] - }, - "elite": { - "health": 12, - "move": 3, - "attack": 5, - "range": 5, - "attributes": [ - "%flying%", - "%muddle%" - ] - } - }, - { - "level": 4, - "normal": { - "health": 9, - "move": 4, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%muddle%" - ] - }, - "elite": { - "health": 14, - "move": 4, - "attack": 5, - "range": 5, - "attributes": [ - "%flying%", - "%muddle%" - ] - } - }, - { - "level": 5, - "normal": { - "health": 12, - "move": 4, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%muddle%" - ] - }, - "elite": { - "health": 16, - "move": 4, - "attack": 6, - "range": 5, - "attributes": [ - "%flying%", - "%muddle%" - ] - } - }, - { - "level": 6, - "normal": { - "health": 13, - "move": 4, - "attack": 5, - "range": 4, - "attributes": [ - "%flying%", - "%muddle%" - ] - }, - "elite": { - "health": 19, - "move": 4, - "attack": 6, - "range": 5, - "attributes": [ - "%flying%", - "%muddle%" - ] - } - }, - { - "level": 7, - "normal": { - "health": 16, - "move": 4, - "attack": 5, - "range": 4, - "attributes": [ - "%flying%", - "%muddle%" - ] - }, - "elite": { - "health": 21, - "move": 4, - "attack": 7, - "range": 5, - "attributes": [ - "%flying%", - "%muddle%" - ] - } - } - ] - }, - "Stone Golem": { - "level": [ - { - "level": 0, - "normal": { - "health": 10, - "move": 1, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 10, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%shield% 1" - ] - } - }, - { - "level": 1, - "normal": { - "health": 10, - "move": 1, - "attack": 3, - "range": 0, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 11, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%shield% 2" - ] - } - }, - { - "level": 2, - "normal": { - "health": 11, - "move": 1, - "attack": 4, - "range": 0, - "attributes": [ - "%shield% 1" - ] - }, - "elite": { - "health": 14, - "move": 2, - "attack": 5, - "range": 0, - "attributes": [ - "%shield% 2" - ] - } - }, - { - "level": 3, - "normal": { - "health": 11, - "move": 1, - "attack": 4, - "range": 0, - "attributes": [ - "%shield% 2" - ] - }, - "elite": { - "health": 15, - "move": 2, - "attack": 5, - "range": 0, - "attributes": [ - "%shield% 3" - ] - } - }, - { - "level": 4, - "normal": { - "health": 12, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%shield% 2" - ] - }, - "elite": { - "health": 17, - "move": 2, - "attack": 6, - "range": 0, - "attributes": [ - "%shield% 3" - ] - } - }, - { - "level": 5, - "normal": { - "health": 13, - "move": 2, - "attack": 5, - "range": 0, - "attributes": [ - "%shield% 2" - ] - }, - "elite": { - "health": 19, - "move": 3, - "attack": 6, - "range": 0, - "attributes": [ - "%shield% 3" - ] - } - }, - { - "level": 6, - "normal": { - "health": 16, - "move": 2, - "attack": 5, - "range": 0, - "attributes": [ - "%shield% 2" - ] - }, - "elite": { - "health": 20, - "move": 3, - "attack": 7, - "range": 0, - "attributes": [ - "%shield% 3" - ] - } - }, - { - "level": 7, - "normal": { - "health": 16, - "move": 2, - "attack": 5, - "range": 0, - "attributes": [ - "%shield% 3" - ] - }, - "elite": { - "health": 21, - "move": 3, - "attack": 7, - "range": 0, - "attributes": [ - "%shield% 4" - ] - } - } - ] - }, - "Sun Demon": { - "level": [ - { - "level": 0, - "normal": { - "health": 5, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 1" - ] - }, - "elite": { - "health": 9, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 1" - ] - } - }, - { - "level": 1, - "normal": { - "health": 7, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 1" - ] - }, - "elite": { - "health": 12, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 1" - ] - } - }, - { - "level": 2, - "normal": { - "health": 9, - "move": 2, - "attack": 2, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 1" - ] - }, - "elite": { - "health": 13, - "move": 2, - "attack": 4, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 1" - ] - } - }, - { - "level": 3, - "normal": { - "health": 10, - "move": 2, - "attack": 3, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 1" - ] - }, - "elite": { - "health": 15, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 1" - ] - } - }, - { - "level": 4, - "normal": { - "health": 11, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 1" - ] - }, - "elite": { - "health": 16, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 1" - ] - } - }, - { - "level": 5, - "normal": { - "health": 11, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 2" - ] - }, - "elite": { - "health": 16, - "move": 3, - "attack": 5, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 2" - ] - } - }, - { - "level": 6, - "normal": { - "health": 12, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 2" - ] - }, - "elite": { - "health": 18, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 2" - ] - } - }, - { - "level": 7, - "normal": { - "health": 15, - "move": 3, - "attack": 4, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 2" - ] - }, - "elite": { - "health": 22, - "move": 4, - "attack": 5, - "range": 0, - "attributes": [ - "%flying%", - "Advantage", - "%shield% 2" - ] - } - } - ] - }, - "Vermling Scout": { - "level": [ - { - "level": 0, - "normal": { - "health": 2, - "move": 3, - "attack": 1, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 4, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [] - } - }, - { - "level": 1, - "normal": { - "health": 3, - "move": 3, - "attack": 1, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 5, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [] - } - }, - { - "level": 2, - "normal": { - "health": 3, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 5, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [] - } - }, - { - "level": 3, - "normal": { - "health": 5, - "move": 3, - "attack": 2, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 7, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [] - } - }, - { - "level": 4, - "normal": { - "health": 6, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 8, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 5, - "normal": { - "health": 8, - "move": 3, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 11, - "move": 4, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 6, - "normal": { - "health": 9, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 12, - "move": 5, - "attack": 4, - "range": 0, - "attributes": [] - } - }, - { - "level": 7, - "normal": { - "health": 11, - "move": 4, - "attack": 3, - "range": 0, - "attributes": [] - }, - "elite": { - "health": 15, - "move": 5, - "attack": 4, - "range": 0, - "attributes": [] - } - } - ] - }, - "Vermling Shaman": { - "level": [ - { - "level": 0, - "normal": { - "health": 2, - "move": 2, - "attack": 1, - "range": 3, - "attributes": [ - "%shield% 2" - ] - }, - "elite": { - "health": 3, - "move": 3, - "attack": 2, - "range": 3, - "attributes": [ - "%shield% 2" - ] - } - }, - { - "level": 1, - "normal": { - "health": 2, - "move": 2, - "attack": 1, - "range": 3, - "attributes": [ - "%shield% 3" - ] - }, - "elite": { - "health": 3, - "move": 3, - "attack": 2, - "range": 3, - "attributes": [ - "%shield% 3" - ] - } - }, - { - "level": 2, - "normal": { - "health": 3, - "move": 2, - "attack": 1, - "range": 4, - "attributes": [ - "%shield% 3" - ] - }, - "elite": { - "health": 4, - "move": 3, - "attack": 2, - "range": 4, - "attributes": [ - "%shield% 3" - ] - } - }, - { - "level": 3, - "normal": { - "health": 3, - "move": 2, - "attack": 2, - "range": 4, - "attributes": [ - "%shield% 3" - ] - }, - "elite": { - "health": 5, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [ - "%shield% 3" - ] - } - }, - { - "level": 4, - "normal": { - "health": 3, - "move": 3, - "attack": 2, - "range": 4, - "attributes": [ - "%muddle%", - "%shield% 3" - ] - }, - "elite": { - "health": 5, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [ - "%muddle%", - "%shield% 4" - ] - } - }, - { - "level": 5, - "normal": { - "health": 4, - "move": 3, - "attack": 3, - "range": 4, - "attributes": [ - "%muddle%", - "%shield% 3" - ] - }, - "elite": { - "health": 6, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%muddle%", - "%shield% 4" - ] - } - }, - { - "level": 6, - "normal": { - "health": 5, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%muddle%", - "%shield% 3" - ] - }, - "elite": { - "health": 6, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%muddle%", - "%shield% 5" - ] - } - }, - { - "level": 7, - "normal": { - "health": 7, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%muddle%", - "%shield% 3" - ] - }, - "elite": { - "health": 8, - "move": 3, - "attack": 4, - "range": 4, - "attributes": [ - "%muddle%", - "%shield% 5" - ] - } - } - ] - }, - "Wind Demon": { - "level": [ - { - "level": 0, - "normal": { - "health": 3, - "move": 3, - "attack": 2, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 1" - ] - }, - "elite": { - "health": 5, - "move": 4, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 1" - ] - } - }, - { - "level": 1, - "normal": { - "health": 3, - "move": 3, - "attack": 2, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 2" - ] - }, - "elite": { - "health": 5, - "move": 4, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 2" - ] - } - }, - { - "level": 2, - "normal": { - "health": 4, - "move": 4, - "attack": 2, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 2" - ] - }, - "elite": { - "health": 7, - "move": 5, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 2" - ] - } - }, - { - "level": 3, - "normal": { - "health": 5, - "move": 4, - "attack": 3, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 2" - ] - }, - "elite": { - "health": 8, - "move": 5, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 2" - ] - } - }, - { - "level": 4, - "normal": { - "health": 7, - "move": 4, - "attack": 3, - "range": 3, - "attributes": [ - "%flying%", - "%shield% 2" - ] - }, - "elite": { - "health": 8, - "move": 5, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%disarm%", - "%shield% 2" - ] - } - }, - { - "level": 5, - "normal": { - "health": 9, - "move": 4, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 2" - ] - }, - "elite": { - "health": 11, - "move": 5, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%disarm%", - "%shield% 2" - ] - } - }, - { - "level": 6, - "normal": { - "health": 10, - "move": 4, - "attack": 3, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 3" - ] - }, - "elite": { - "health": 12, - "move": 5, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%disarm%", - "%shield% 3" - ] - } - }, - { - "level": 7, - "normal": { - "health": 11, - "move": 4, - "attack": 4, - "range": 4, - "attributes": [ - "%flying%", - "%shield% 3" - ] - }, - "elite": { - "health": 13, - "move": 5, - "attack": 5, - "range": 4, - "attributes": [ - "%flying%", - "%disarm%", - "%shield% 3" - ] - } - } - ] - } - }, - "bosses": { - "Bandit Commander": { - "level": [ - { - "level": 0, - "health": "8xC", - "move": 3, - "attack": 3, - "range": 0, - "special1": [ - "Move to next door and reveal room" - ], - "special2": [ - "Summon Living Bones" - ], - "immunities": [ - "%stun%", - "%immobilize%", - "%curse%" - ], - "notes": "" - }, - { - "level": 1, - "health": "10xC", - "move": 3, - "attack": 3, - "range": 0, - "special1": [ - "Move to next door and reveal room" - ], - "special2": [ - "Summon Living Bones" - ], - "immunities": [ - "%stun%", - "%immobilize%", - "%curse%" - ], - "notes": "" - }, - { - "level": 2, - "health": "12xC", - "move": 4, - "attack": 3, - "range": 0, - "special1": [ - "Move to next door and reveal room" - ], - "special2": [ - "Summon Living Bones" - ], - "immunities": [ - "%stun%", - "%immobilize%", - "%curse%" - ], - "notes": "" - }, - { - "level": 3, - "health": "13xC", - "move": 4, - "attack": 4, - "range": 0, - "special1": [ - "Move to next door and reveal room" - ], - "special2": [ - "Summon Living Bones" - ], - "immunities": [ - "%stun%", - "%immobilize%", - "%curse%" - ], - "notes": "" - }, - { - "level": 4, - "health": "15xC", - "move": 4, - "attack": 4, - "range": 0, - "special1": [ - "Move to next door and reveal room" - ], - "special2": [ - "Summon Living Bones" - ], - "immunities": [ - "%stun%", - "%immobilize%", - "%curse%" - ], - "notes": "" - }, - { - "level": 5, - "health": "16xC", - "move": 5, - "attack": 5, - "range": 0, - "special1": [ - "Move to next door and reveal room" - ], - "special2": [ - "Summon Living Bones" - ], - "immunities": [ - "%stun%", - "%immobilize%", - "%curse%" - ], - "notes": "" - }, - { - "level": 6, - "health": "19xC", - "move": 5, - "attack": 5, - "range": 0, - "special1": [ - "Move to next door and reveal room" - ], - "special2": [ - "Summon Living Bones" - ], - "immunities": [ - "%stun%", - "%immobilize%", - "%curse%" - ], - "notes": "" - }, - { - "level": 7, - "health": "23xC", - "move": 5, - "attack": 5, - "range": 0, - "special1": [ - "Move to next door and reveal room" - ], - "special2": [ - "Summon Living Bones" - ], - "immunities": [ - "%stun%", - "%immobilize%", - "%curse%" - ], - "notes": "" - } - ] - }, - "The Betrayer": { - "level": [ - { - "level": 0, - "health": "10xC", - "move": 3, - "attack": 4, - "range": 3, - "special1": [ - "Summon Giant Viper and Fear" - ], - "special2": [ - "Mind Control" - ], - "immunities": [ - "%wound%", - "%poison%", - "%stun%", - "%disarm%", - "%curse%" - ], - "notes": "" - }, - { - "level": 1, - "health": "12xC", - "move": 3, - "attack": 5, - "range": 3, - "special1": [ - "Summon Giant Viper and Fear" - ], - "special2": [ - "Mind Control" - ], - "immunities": [ - "%wound%", - "%poison%", - "%stun%", - "%disarm%", - "%curse%" - ], - "notes": "" - }, - { - "level": 2, - "health": "14xC", - "move": 3, - "attack": 6, - "range": 4, - "special1": [ - "Summon Giant Viper and Fear" - ], - "special2": [ - "Mind Control" - ], - "immunities": [ - "%wound%", - "%poison%", - "%stun%", - "%disarm%", - "%curse%" - ], - "notes": "" - }, - { - "level": 3, - "health": "16xC", - "move": 4, - "attack": 7, - "range": 4, - "special1": [ - "Summon Giant Viper and Fear" - ], - "special2": [ - "Mind Control" - ], - "immunities": [ - "%wound%", - "%poison%", - "%stun%", - "%disarm%", - "%curse%" - ], - "notes": "" - }, - { - "level": 4, - "health": "18xC", - "move": 4, - "attack": 8, - "range": 4, - "special1": [ - "Summon Giant Viper and Fear" - ], - "special2": [ - "Mind Control" - ], - "immunities": [ - "%wound%", - "%poison%", - "%stun%", - "%disarm%", - "%curse%" - ], - "notes": "" - }, - { - "level": 5, - "health": "20xC", - "move": 5, - "attack": 8, - "range": 5, - "special1": [ - "Summon Giant Viper and Fear" - ], - "special2": [ - "Mind Control" - ], - "immunities": [ - "%wound%", - "%poison%", - "%stun%", - "%disarm%", - "%curse%" - ], - "notes": "" - }, - { - "level": 6, - "health": "23xC", - "move": 5, - "attack": 9, - "range": 5, - "special1": [ - "Summon Giant Viper and Fear" - ], - "special2": [ - "Mind Control" - ], - "immunities": [ - "%wound%", - "%poison%", - "%stun%", - "%disarm%", - "%curse%" - ], - "notes": "" - }, - { - "level": 7, - "health": "27xC", - "move": 5, - "attack": 9, - "range": 5, - "special1": [ - "Summon Giant Viper and Fear" - ], - "special2": [ - "Mind Control" - ], - "immunities": [ - "%wound%", - "%poison%", - "%stun%", - "%disarm%", - "%curse%" - ], - "notes": "" - } - ] - }, - "Captain of the Guard": { - "level": [ - { - "level": 0, - "health": "7xC", - "move": 2, - "attack": 3, - "range": 0, - "special1": [ - "%heal% 2, Affect self and all allies" - ], - "special2": [ - "All allies add +1 Attack to all attacks this round", - "%attack% +1" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 1, - "health": "9xC", - "move": 2, - "attack": 3, - "range": 0, - "special1": [ - "%heal% 2, Affect self and all allies" - ], - "special2": [ - "All allies add +1 Attack to all attacks this round", - "%attack% +1" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 2, - "health": "11xC", - "move": 2, - "attack": 4, - "range": 0, - "special1": [ - "%heal% 2, Affect self and all allies" - ], - "special2": [ - "All allies add +1 Attack to all attacks this round", - "%attack% +1" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 3, - "health": "14xC", - "move": 3, - "attack": 4, - "range": 0, - "special1": [ - "%heal% 2, Affect self and all allies" - ], - "special2": [ - "All allies add +1 Attack to all attacks this round", - "%attack% +1" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 4, - "health": "16xC", - "move": 3, - "attack": 5, - "range": 0, - "special1": [ - "%heal% 2, Affect self and all allies" - ], - "special2": [ - "All allies add +1 Attack to all attacks this round", - "%attack% +1" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 5, - "health": "20xC", - "move": 3, - "attack": 5, - "range": 0, - "special1": [ - "%heal% 2, Affect self and all allies" - ], - "special2": [ - "All allies add +1 Attack to all attacks this round", - "%attack% +1" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 6, - "health": "21xC", - "move": 4, - "attack": 6, - "range": 0, - "special1": [ - "%heal% 2, Affect self and all allies" - ], - "special2": [ - "All allies add +1 Attack to all attacks this round", - "%attack% +1" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 7, - "health": "25xC", - "move": 4, - "attack": 6, - "range": 0, - "special1": [ - "%heal% 2, Affect self and all allies" - ], - "special2": [ - "All allies add +1 Attack to all attacks this round", - "%attack% +1" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%muddle%", - "%stun%" - ], - "notes": "" - } - ] - }, - "The Colorless": { - "level": [ - { - "level": 0, - "health": "9xC", - "move": 3, - "attack": 2, - "range": 0, - "special1": [ - "%dark%%use_element%: Summon Night Demon", - "%invisible%, Self" - ], - "special2": [ - "%light%%use_element%: Summon Sun Demon", - "%heal% 4, Self", - "%shield% 1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%muddle%", - "%stun%", - "%disarm%" - ], - "notes": "" - }, - { - "level": 1, - "health": "10xC", - "move": 3, - "attack": 3, - "range": 0, - "special1": [ - "%dark%%use_element%: Summon Night Demon", - "%invisible%, Self" - ], - "special2": [ - "%light%%use_element%: Summon Sun Demon", - "%heal% 4, Self", - "%shield% 1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%muddle%", - "%stun%", - "%disarm%" - ], - "notes": "" - }, - { - "level": 2, - "health": "11xC", - "move": 4, - "attack": 3, - "range": 0, - "special1": [ - "%dark%%use_element%: Summon Night Demon", - "%invisible%, Self" - ], - "special2": [ - "%light%%use_element%: Summon Sun Demon", - "%heal% 5, Self", - "%shield% 1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%muddle%", - "%stun%", - "%disarm%" - ], - "notes": "" - }, - { - "level": 3, - "health": "12xC", - "move": 4, - "attack": 4, - "range": 0, - "special1": [ - "%dark%%use_element%: Summon Night Demon", - "%invisible%, Self" - ], - "special2": [ - "%light%%use_element%: Summon Sun Demon", - "%heal% 5, Self", - "%shield% 1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%muddle%", - "%stun%", - "%disarm%" - ], - "notes": "" - }, - { - "level": 4, - "health": "14xC", - "move": 4, - "attack": 4, - "range": 0, - "special1": [ - "%dark%%use_element%: Summon Night Demon", - "%invisible%, Self" - ], - "special2": [ - "%light%%use_element%: Summon Sun Demon", - "%heal% 6, Self", - "%shield% 1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%muddle%", - "%stun%", - "%disarm%" - ], - "notes": "" - }, - { - "level": 5, - "health": "15xC", - "move": 4, - "attack": 5, - "range": 0, - "special1": [ - "%dark%%use_element%: Summon Night Demon", - "%invisible%, Self" - ], - "special2": [ - "%light%%use_element%: Summon Sun Demon", - "%heal% 6, Self", - "%shield% 1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%muddle%", - "%stun%", - "%disarm%" - ], - "notes": "" - }, - { - "level": 6, - "health": "17xC", - "move": 4, - "attack": 6, - "range": 0, - "special1": [ - "%dark%%use_element%: Summon Night Demon", - "%invisible%, Self" - ], - "special2": [ - "%light%%use_element%: Summon Sun Demon", - "%heal% 7, Self", - "%shield% 1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%muddle%", - "%stun%", - "%disarm%" - ], - "notes": "" - }, - { - "level": 7, - "health": "19xC", - "move": 5, - "attack": 7, - "range": 0, - "special1": [ - "%dark%%use_element%: Summon Night Demon", - "%invisible%, Self" - ], - "special2": [ - "%light%%use_element%: Summon Sun Demon", - "%heal% 7, Self", - "%shield% 1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%muddle%", - "%stun%", - "%disarm%" - ], - "notes": "" - } - ] - }, - "Dark Rider": { - "level": [ - { - "level": 0, - "health": "9xC", - "move": 2, - "attack": "3+X", - "range": 0, - "special1": [ - "%move% +2", - "%attack% +0" - ], - "special2": [ - "%move% +0", - "Summon Imp", - "%attack% -1" - ], - "immunities": [ - "%immobilize%", - "%poison%", - "%stun%", - "%disarm%" - ], - "notes": "X = Hexes moved" - }, - { - "level": 1, - "health": "10xC", - "move": 3, - "attack": "3+X", - "range": 0, - "special1": [ - "%move% +2", - "%attack% +0" - ], - "special2": [ - "%move% +0", - "Summon Imp", - "%attack% -1" - ], - "immunities": [ - "%immobilize%", - "%poison%", - "%stun%", - "%disarm%" - ], - "notes": "X = Hexes moved" - }, - { - "level": 2, - "health": "12xC", - "move": 3, - "attack": "3+X", - "range": 0, - "special1": [ - "%move% +2", - "%attack% +0" - ], - "special2": [ - "%move% +0", - "Summon Imp", - "%attack% -1" - ], - "immunities": [ - "%immobilize%", - "%poison%", - "%stun%", - "%disarm%" - ], - "notes": "X = Hexes moved" - }, - { - "level": 3, - "health": "13xC", - "move": 3, - "attack": "4+X", - "range": 0, - "special1": [ - "%move% +2", - "%attack% +0" - ], - "special2": [ - "%move% +0", - "Summon Imp", - "%attack% -1" - ], - "immunities": [ - "%immobilize%", - "%poison%", - "%stun%", - "%disarm%" - ], - "notes": "X = Hexes moved" - }, - { - "level": 4, - "health": "15xC", - "move": 3, - "attack": "4+X", - "range": 0, - "special1": [ - "%move% +2", - "%attack% +0" - ], - "special2": [ - "%move% +0", - "Summon Imp", - "%attack% -1" - ], - "immunities": [ - "%immobilize%", - "%poison%", - "%stun%", - "%disarm%" - ], - "notes": "X = Hexes moved" - }, - { - "level": 5, - "health": "16xC", - "move": 3, - "attack": "5+X", - "range": 0, - "special1": [ - "%move% +2", - "%attack% +0" - ], - "special2": [ - "%move% +0", - "Summon Imp", - "%attack% -1" - ], - "immunities": [ - "%immobilize%", - "%poison%", - "%stun%", - "%disarm%" - ], - "notes": "X = Hexes moved" - }, - { - "level": 6, - "health": "16xC", - "move": 4, - "attack": "5+X", - "range": 0, - "special1": [ - "%move% +2", - "%attack% +0" - ], - "special2": [ - "%move% +0", - "Summon Imp", - "%attack% -1" - ], - "immunities": [ - "%immobilize%", - "%poison%", - "%stun%", - "%disarm%" - ], - "notes": "X = Hexes moved" - }, - { - "level": 7, - "health": "18xC", - "move": 4, - "attack": "6+X", - "range": 0, - "special1": [ - "%move% +2", - "%attack% +0" - ], - "special2": [ - "%move% +0", - "Summon Imp", - "%attack% -1" - ], - "immunities": [ - "%immobilize%", - "%poison%", - "%stun%", - "%disarm%" - ], - "notes": "X = Hexes moved" - } - ] - }, - "Elder Drake": { - "level": [ - { - "level": 0, - "health": "11xC", - "move": 0, - "attack": 3, - "range": 0, - "special1": [ - "%attack% +0 %boss-aoe-elder-drake-sp1%" - ], - "special2": [ - "Summon 2 Zephyrs and %move%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%stun%" - ], - "notes": "" - }, - { - "level": 1, - "health": "12xC", - "move": 0, - "attack": 4, - "range": 0, - "special1": [ - "%attack% +0 %boss-aoe-elder-drake-sp1%" - ], - "special2": [ - "Summon 2 Zephyrs and %move%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%stun%" - ], - "notes": "" - }, - { - "level": 2, - "health": "15xC", - "move": 0, - "attack": 4, - "range": 0, - "special1": [ - "%attack% +0 %boss-aoe-elder-drake-sp1%" - ], - "special2": [ - "Summon 2 Zephyrs and %move%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%stun%" - ], - "notes": "" - }, - { - "level": 3, - "health": "16xC", - "move": 0, - "attack": 5, - "range": 0, - "special1": [ - "%attack% +0 %boss-aoe-elder-drake-sp1%" - ], - "special2": [ - "Summon 2 Zephyrs and %move%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%stun%" - ], - "notes": "" - }, - { - "level": 4, - "health": "20xC", - "move": 0, - "attack": 5, - "range": 0, - "special1": [ - "%attack% +0 %boss-aoe-elder-drake-sp1%" - ], - "special2": [ - "Summon 2 Zephyrs and %move%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%stun%" - ], - "notes": "" - }, - { - "level": 5, - "health": "22xC", - "move": 0, - "attack": 6, - "range": 0, - "special1": [ - "%attack% +0 %boss-aoe-elder-drake-sp1%" - ], - "special2": [ - "Summon 2 Zephyrs and %move%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%stun%" - ], - "notes": "" - }, - { - "level": 6, - "health": "27xC", - "move": 0, - "attack": 6, - "range": 0, - "special1": [ - "%attack% +0 %boss-aoe-elder-drake-sp1%" - ], - "special2": [ - "Summon 2 Zephyrs and %move%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%stun%" - ], - "notes": "" - }, - { - "level": 7, - "health": "29xC", - "move": 0, - "attack": 7, - "range": 0, - "special1": [ - "%attack% +0 %boss-aoe-elder-drake-sp1%" - ], - "special2": [ - "Summon 2 Zephyrs and %move%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%stun%" - ], - "notes": "" - } - ] - }, - "The Gloom": { - "level": [ - { - "level": 0, - "health": "20xC", - "move": 2, - "attack": 5, - "range": 0, - "special1": [ - "%move% +9", - "%attack% +9" - ], - "special2": [ - "Teleport", - "%attack% +1", - "%range% 5", - "%poison%", - "%wound%", - "%stun%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 1, - "health": "25xC", - "move": 2, - "attack": 5, - "range": 0, - "special1": [ - "%move% +9", - "%attack% +9" - ], - "special2": [ - "Teleport", - "%attack% +1", - "%range% 5", - "%poison%", - "%wound%", - "%stun%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 2, - "health": "29xC", - "move": 2, - "attack": 6, - "range": 0, - "special1": [ - "%move% +9", - "%attack% +9" - ], - "special2": [ - "Teleport", - "%attack% +1", - "%range% 5", - "%poison%", - "%wound%", - "%stun%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 3, - "health": "35xC", - "move": 2, - "attack": 6, - "range": 0, - "special1": [ - "%move% +9", - "%attack% +9" - ], - "special2": [ - "Teleport", - "%attack% +1", - "%range% 5", - "%poison%", - "%wound%", - "%stun%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 4, - "health": "39xC", - "move": 3, - "attack": 7, - "range": 0, - "special1": [ - "%move% +9", - "%attack% +9" - ], - "special2": [ - "Teleport", - "%attack% +1", - "%range% 5", - "%poison%", - "%wound%", - "%stun%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 5, - "health": "46xC", - "move": 3, - "attack": 7, - "range": 0, - "special1": [ - "%move% +9", - "%attack% +9" - ], - "special2": [ - "Teleport", - "%attack% +1", - "%range% 5", - "%poison%", - "%wound%", - "%stun%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 6, - "health": "50xC", - "move": 3, - "attack": 8, - "range": 0, - "special1": [ - "%move% +9", - "%attack% +9" - ], - "special2": [ - "Teleport", - "%attack% +1", - "%range% 5", - "%poison%", - "%wound%", - "%stun%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 7, - "health": "56xC", - "move": 3, - "attack": 9, - "range": 0, - "special1": [ - "%move% +9", - "%attack% +9" - ], - "special2": [ - "Teleport", - "%attack% +1", - "%range% 5", - "%poison%", - "%wound%", - "%stun%" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - } - ] - }, - "Inox Bodyguard": { - "level": [ - { - "level": 0, - "health": "6xC", - "move": 2, - "attack": "C", - "range": 0, - "special1": [ - "%move% -1", - "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" - ], - "special2": [ - "%move% +0", - "%attack% +0", - "%retaliate% 3" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%" - ], - "notes": "C = Number of Characters" - }, - { - "level": 1, - "health": "7xC", - "move": 2, - "attack": "1+C", - "range": 0, - "special1": [ - "%move% -1", - "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" - ], - "special2": [ - "%move% +0", - "%attack% +0", - "%retaliate% 3" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%" - ], - "notes": "C = Number of Characters" - }, - { - "level": 2, - "health": "9xC", - "move": 2, - "attack": "1+C", - "range": 0, - "special1": [ - "%move% -1", - "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" - ], - "special2": [ - "%move% +0", - "%attack% +0", - "%retaliate% 3" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%" - ], - "notes": "C = Number of Characters" - }, - { - "level": 3, - "health": "10xC", - "move": 3, - "attack": "2+C", - "range": 0, - "special1": [ - "%move% -1", - "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" - ], - "special2": [ - "%move% +0", - "%attack% +0", - "%retaliate% 4" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%" - ], - "notes": "C = Number of Characters" - }, - { - "level": 4, - "health": "11xC", - "move": 3, - "attack": "2+C", - "range": 0, - "special1": [ - "%move% -1", - "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" - ], - "special2": [ - "%move% +0", - "%attack% +0", - "%retaliate% 4" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%" - ], - "notes": "C = Number of Characters" - }, - { - "level": 5, - "health": "13xC", - "move": 3, - "attack": "3+C", - "range": 0, - "special1": [ - "%move% -1", - "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" - ], - "special2": [ - "%move% +0", - "%attack% +0", - "%retaliate% 5" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%" - ], - "notes": "C = Number of Characters" - }, - { - "level": 6, - "health": "15xC", - "move": 4, - "attack": "3+C", - "range": 0, - "special1": [ - "%move% -1", - "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" - ], - "special2": [ - "%move% +0", - "%attack% +0", - "%retaliate% 5" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%" - ], - "notes": "C = Number of Characters" - }, - { - "level": 7, - "health": "17xC", - "move": 4, - "attack": "4+C", - "range": 0, - "special1": [ - "%move% -1", - "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" - ], - "special2": [ - "%move% +0", - "%attack% +0", - "%retaliate% 5" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%" - ], - "notes": "C = Number of Characters" - } - ] - }, - "Jekserah": { - "level": [ - { - "level": 0, - "health": "6xC", - "move": 2, - "attack": 2, - "range": 0, - "special1": [ - "Summon Living Bones", - "%attack% -1, Target all adjacent enemies" - ], - "special2": [ - "Summon Living Corpse", - "%move% -1", - "%attack% +2" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "" - }, - { - "level": 1, - "health": "7xC", - "move": 2, - "attack": 3, - "range": 0, - "special1": [ - "Summon Living Bones", - "%attack% -1, Target all adjacent enemies" - ], - "special2": [ - "Summon Living Corpse", - "%move% -1", - "%attack% +2" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "" - }, - { - "level": 2, - "health": "9xC", - "move": 3, - "attack": 3, - "range": 0, - "special1": [ - "Summon Living Bones", - "%attack% -1, Target all adjacent enemies" - ], - "special2": [ - "Summon Living Corpse", - "%move% -1", - "%attack% +2" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "" - }, - { - "level": 3, - "health": "12xC", - "move": 4, - "attack": 4, - "range": 0, - "special1": [ - "Summon Living Bones", - "%attack% -1, Target all adjacent enemies" - ], - "special2": [ - "Summon Living Corpse", - "%move% -1", - "%attack% +2" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "" - }, - { - "level": 4, - "health": "13xC", - "move": 4, - "attack": 5, - "range": 0, - "special1": [ - "Summon Living Bones", - "%attack% -1, Target all adjacent enemies" - ], - "special2": [ - "Summon Living Corpse", - "%move% -1", - "%attack% +2" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "" - }, - { - "level": 5, - "health": "15xC", - "move": 5, - "attack": 5, - "range": 0, - "special1": [ - "Summon Living Bones", - "%attack% -1, Target all adjacent enemies" - ], - "special2": [ - "Summon Living Corpse", - "%move% -1", - "%attack% +2" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "" - }, - { - "level": 6, - "health": "18xC", - "move": 5, - "attack": 5, - "range": 0, - "special1": [ - "Summon Living Bones", - "%attack% -1, Target all adjacent enemies" - ], - "special2": [ - "Summon Living Corpse", - "%move% -1", - "%attack% +2" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "" - }, - { - "level": 7, - "health": "22xC", - "move": 5, - "attack": 5, - "range": 0, - "special1": [ - "Summon Living Bones", - "%attack% -1, Target all adjacent enemies" - ], - "special2": [ - "Summon Living Corpse", - "%move% -1", - "%attack% +2" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "" - } - ] - }, - "Merciless Overseer": { - "level": [ - { - "level": 0, - "health": "6xC", - "move": 2, - "attack": "V", - "range": 0, - "special1": [ - "All Scouts act again" - ], - "special2": [ - "Summon Vermling Scout" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "V = Number of Scouts present" - }, - { - "level": 1, - "health": "8xC", - "move": 2, - "attack": "V", - "range": 0, - "special1": [ - "All Scouts act again" - ], - "special2": [ - "Summon Vermling Scout" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "V = Number of Scouts present" - }, - { - "level": 2, - "health": "9xC", - "move": 3, - "attack": "V", - "range": 0, - "special1": [ - "All Scouts act again" - ], - "special2": [ - "Summon Vermling Scout" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "V = Number of Scouts present" - }, - { - "level": 3, - "health": "11xC", - "move": 3, - "attack": "V", - "range": 0, - "special1": [ - "All Scouts act again" - ], - "special2": [ - "Summon Vermling Scout" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "V = Number of Scouts present" - }, - { - "level": 4, - "health": "12xC", - "move": 4, - "attack": "V", - "range": 0, - "special1": [ - "All Scouts act again" - ], - "special2": [ - "Summon Vermling Scout" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "V = Number of Scouts present" - }, - { - "level": 5, - "health": "14xC", - "move": 4, - "attack": "V", - "range": 0, - "special1": [ - "All Scouts act again" - ], - "special2": [ - "Summon Vermling Scout" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "V = Number of Scouts present" - }, - { - "level": 6, - "health": "16xC", - "move": 4, - "attack": "V", - "range": 0, - "special1": [ - "All Scouts act again" - ], - "special2": [ - "Summon Vermling Scout" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "V = Number of Scouts present" - }, - { - "level": 7, - "health": "19xC", - "move": 4, - "attack": "V", - "range": 0, - "special1": [ - "All Scouts act again" - ], - "special2": [ - "Summon Vermling Scout" - ], - "immunities": [ - "%disarm%", - "%wound%", - "%curse%", - "%stun%" - ], - "notes": "V = Number of Scouts present" - } - ] - }, - "Prime Demon": { - "level": [ - { - "level": 0, - "health": "8xC", - "move": 3, - "attack": 4, - "range": 0, - "special1": [ - "Throne moves", - "Summon Demon (Special 1)", - "%move% +2", - "%attack% -1" - ], - "special2": [ - "Throne moves", - "Summon Demon (Special 2)", - "%move% +2", - "%attack% -1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 1, - "health": "9xC", - "move": 4, - "attack": 4, - "range": 0, - "special1": [ - "Throne moves", - "Summon Demon (Special 1)", - "%move% +2", - "%attack% -1" - ], - "special2": [ - "Throne moves", - "Summon Demon (Special 2)", - "%move% +2", - "%attack% -1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 2, - "health": "10xC", - "move": 4, - "attack": 5, - "range": 0, - "special1": [ - "Throne moves", - "Summon Demon (Special 1)", - "%move% +2", - "%attack% -1" - ], - "special2": [ - "Throne moves", - "Summon Demon (Special 2)", - "%move% +2", - "%attack% -1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 3, - "health": "12xC", - "move": 4, - "attack": 6, - "range": 0, - "special1": [ - "Throne moves", - "Summon Demon", - "%move% +2", - "%attack% -1" - ], - "special2": [ - "Throne moves", - "Summon Demon", - "%move% +2", - "%attack% -1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 4, - "health": "14xC", - "move": 5, - "attack": 6, - "range": 0, - "special1": [ - "Throne moves", - "Summon Demon (Special 1)", - "%move% +2", - "%attack% -1" - ], - "special2": [ - "Throne moves", - "Summon Demon (Special 2)", - "%move% +2", - "%attack% -1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 5, - "health": "16xC", - "move": 5, - "attack": 7, - "range": 0, - "special1": [ - "Throne moves", - "Summon Demon (Special 1)", - "%move% +2", - "%attack% -1" - ], - "special2": [ - "Throne moves", - "Summon Demon (Special 2)", - "%move% +2", - "%attack% -1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 6, - "health": "20xC", - "move": 5, - "attack": 7, - "range": 0, - "special1": [ - "Throne moves", - "Summon Demon (Special 1)", - "%move% +2", - "%attack% -1" - ], - "special2": [ - "Throne moves", - "Summon Demon (Special 2)", - "%move% +2", - "%attack% -1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%" - ], - "notes": "" - }, - { - "level": 7, - "health": "22xC", - "move": 5, - "attack": 8, - "range": 0, - "special1": [ - "Throne moves", - "Summon Demon (Special 1)", - "%move% +2", - "%attack% -1" - ], - "special2": [ - "Throne moves", - "Summon Demon (Special 2)", - "%move% +2", - "%attack% -1" - ], - "immunities": [ - "%wound%", - "%poison%", - "%disarm%", - "%immobilize%", - "%muddle%", - "%stun%" - ], - "notes": "" - } - ] - }, - "The Sightless Eye": { - "level": [ - { - "level": 0, - "health": "7xC", - "move": 0, - "attack": 5, - "range": 3, - "special1": [ - "Summon Deep Terror", - "%attack% -3 %boss-aoe-sightless-eye-sp1%" - ], - "special2": [ - "Summon Deep Terror", - "%attack% -2 %boss-aoe-sightless-eye-sp2%" - ], - "immunities": [ - "%stun%", - "%disarm%", - "%curse%", - "%muddle%" - ], - "notes": "" - }, - { - "level": 1, - "health": "8xC", - "move": 0, - "attack": 6, - "range": 3, - "special1": [ - "Summon Deep Terror", - "%attack% -3 %boss-aoe-sightless-eye-sp1%" - ], - "special2": [ - "Summon Deep Terror", - "%attack% -2 %boss-aoe-sightless-eye-sp2%" - ], - "immunities": [ - "%stun%", - "%disarm%", - "%curse%", - "%muddle%" - ], - "notes": "" - }, - { - "level": 2, - "health": "10xC", - "move": 0, - "attack": 6, - "range": 3, - "special1": [ - "Summon Deep Terror", - "%attack% -3 %boss-aoe-sightless-eye-sp1%" - ], - "special2": [ - "Summon Deep Terror", - "%attack% -2 %boss-aoe-sightless-eye-sp2%" - ], - "immunities": [ - "%stun%", - "%disarm%", - "%curse%", - "%muddle%" - ], - "notes": "" - }, - { - "level": 3, - "health": "11xC", - "move": 0, - "attack": 7, - "range": 3, - "special1": [ - "Summon Deep Terror", - "%attack% -3 %boss-aoe-sightless-eye-sp1%" - ], - "special2": [ - "Summon Deep Terror", - "%attack% -2 %boss-aoe-sightless-eye-sp2%" - ], - "immunities": [ - "%stun%", - "%disarm%", - "%curse%", - "%muddle%" - ], - "notes": "" - }, - { - "level": 4, - "health": "14xC", - "move": 0, - "attack": 7, - "range": 3, - "special1": [ - "Summon Deep Terror", - "%attack% -3 %boss-aoe-sightless-eye-sp1%" - ], - "special2": [ - "Summon Deep Terror", - "%attack% -2 %boss-aoe-sightless-eye-sp2%" - ], - "immunities": [ - "%stun%", - "%disarm%", - "%curse%", - "%muddle%" - ], - "notes": "" - }, - { - "level": 5, - "health": "15xC", - "move": 0, - "attack": 8, - "range": 3, - "special1": [ - "Summon Deep Terror", - "%attack% -3 %boss-aoe-sightless-eye-sp1%" - ], - "special2": [ - "Summon Deep Terror", - "%attack% -2 %boss-aoe-sightless-eye-sp2%" - ], - "immunities": [ - "%stun%", - "%disarm%", - "%curse%", - "%muddle%" - ], - "notes": "" - }, - { - "level": 6, - "health": "18xC", - "move": 0, - "attack": 8, - "range": 3, - "special1": [ - "Summon Deep Terror", - "%attack% -3 %boss-aoe-sightless-eye-sp1%" - ], - "special2": [ - "Summon Deep Terror", - "%attack% -2 %boss-aoe-sightless-eye-sp2%" - ], - "immunities": [ - "%stun%", - "%disarm%", - "%curse%", - "%muddle%" - ], - "notes": "" - }, - { - "level": 7, - "health": "20xC", - "move": 0, - "attack": 9, - "range": 3, - "special1": [ - "Summon Deep Terror", - "%attack% -3 %boss-aoe-sightless-eye-sp1%" - ], - "special2": [ - "Summon Deep Terror", - "%attack% -2 %boss-aoe-sightless-eye-sp2%" - ], - "immunities": [ - "%stun%", - "%disarm%", - "%curse%", - "%muddle%" - ], - "notes": "" - } - ] - }, - "Winged Horror": { - "level": [ - { - "level": 0, - "health": "6xC", - "move": 3, - "attack": 3, - "range": 0, - "special1": [ - "%attack% -1, Target all adjacent enemies", - "%attack% +0, %range% 3", - "Hatch eggs" - ], - "special2": [ - "Summon C eggs", - "%move% -1", - "%attack% +0" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 1, - "health": "7xC", - "move": 4, - "attack": 3, - "range": 0, - "special1": [ - "%attack% -1, Target all adjacent enemies", - "%attack% +0, %range% 3", - "Hatch eggs" - ], - "special2": [ - "Summon C eggs", - "%move% -1", - "%attack% +0" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 2, - "health": "8xC", - "move": 4, - "attack": 4, - "range": 0, - "special1": [ - "%attack% -1, Target all adjacent enemies", - "%attack% +0, %range% 3", - "Hatch eggs" - ], - "special2": [ - "Summon C eggs", - "%move% -1", - "%attack% +0" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 3, - "health": "10xC", - "move": 4, - "attack": 4, - "range": 0, - "special1": [ - "%attack% -1, Target all adjacent enemies", - "%attack% +0, %range% 3", - "Hatch eggs" - ], - "special2": [ - "Summon C eggs", - "%move% -1", - "%attack% +0" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 4, - "health": "12xC", - "move": 5, - "attack": 4, - "range": 0, - "special1": [ - "%attack% -1, Target all adjacent enemies", - "%attack% +0, %range% 3", - "Hatch eggs" - ], - "special2": [ - "Summon C eggs", - "%move% -1", - "%attack% +0" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 5, - "health": "14xC", - "move": 5, - "attack": 5, - "range": 0, - "special1": [ - "%attack% -1, Target all adjacent enemies", - "%attack% +0, %range% 3", - "Hatch eggs" - ], - "special2": [ - "Summon C eggs", - "%move% -1", - "%attack% +0" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 6, - "health": "17xC", - "move": 5, - "attack": 5, - "range": 0, - "special1": [ - "%attack% -1, Target all adjacent enemies", - "%attack% +0, %range% 3", - "Hatch eggs" - ], - "special2": [ - "Summon C eggs", - "%move% -1", - "%attack% +0" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - }, - { - "level": 7, - "health": "20xC", - "move": 5, - "attack": 5, - "range": 0, - "special1": [ - "%attack% -1, Target all adjacent enemies", - "%attack% +0, %range% 3", - "Hatch eggs" - ], - "special2": [ - "Summon C eggs", - "%move% -1", - "%attack% +0" - ], - "immunities": [ - "%disarm%", - "%poison%", - "%muddle%", - "%stun%", - "%curse%" - ], - "notes": "" - } - ] - } - } -}; +export const SPECIAL_VALUES = +{ + "X": "X = Hexes moved", + "C": "C = Number of Characters", + "V": "V = Number of Scouts present" +} + +export const MONSTER_STATS = { + "monsters": { + "Ancient Artillery": { + "level": [ + { + "level": 0, + "normal": { + "health": 4, + "move": 0, + "attack": 2, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 7, + "move": 0, + "attack": 3, + "range": 5, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 6, + "move": 0, + "attack": 2, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 9, + "move": 0, + "attack": 3, + "range": 5, + "attributes": [] + } + }, + { + "level": 2, + "normal": { + "health": 7, + "move": 0, + "attack": 2, + "range": 5, + "attributes": [] + }, + "elite": { + "health": 11, + "move": 0, + "attack": 3, + "range": 6, + "attributes": [] + } + }, + { + "level": 3, + "normal": { + "health": 8, + "move": 0, + "attack": 3, + "range": 5, + "attributes": [] + }, + "elite": { + "health": 13, + "move": 0, + "attack": 4, + "range": 6, + "attributes": [] + } + }, + { + "level": 4, + "normal": { + "health": 9, + "move": 0, + "attack": 4, + "range": 5, + "attributes": [] + }, + "elite": { + "health": 13, + "move": 0, + "attack": 4, + "range": 6, + "attributes": [ + "%target% 2" + ] + } + }, + { + "level": 5, + "normal": { + "health": 11, + "move": 0, + "attack": 4, + "range": 6, + "attributes": [] + }, + "elite": { + "health": 15, + "move": 0, + "attack": 4, + "range": 7, + "attributes": [ + "%target% 2" + ] + } + }, + { + "level": 6, + "normal": { + "health": 14, + "move": 0, + "attack": 4, + "range": 6, + "attributes": [] + }, + "elite": { + "health": 16, + "move": 0, + "attack": 5, + "range": 7, + "attributes": [ + "%target% 2" + ] + } + }, + { + "level": 7, + "normal": { + "health": 16, + "move": 0, + "attack": 4, + "range": 7, + "attributes": [] + }, + "elite": { + "health": 20, + "move": 0, + "attack": 5, + "range": 7, + "attributes": [ + "%target% 2" + ] + } + } + ] + }, + "Bandit Archer": { + "level": [ + { + "level": 0, + "normal": { + "health": 4, + "move": 2, + "attack": 2, + "range": 3, + "attributes": [] + }, + "elite": { + "health": 6, + "move": 2, + "attack": 3, + "range": 3, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 5, + "move": 2, + "attack": 2, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 7, + "move": 2, + "attack": 3, + "range": 5, + "attributes": [] + } + }, + { + "level": 2, + "normal": { + "health": 6, + "move": 3, + "attack": 2, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 9, + "move": 3, + "attack": 3, + "range": 5, + "attributes": [] + } + }, + { + "level": 3, + "normal": { + "health": 6, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 10, + "move": 3, + "attack": 4, + "range": 5, + "attributes": [] + } + }, + { + "level": 4, + "normal": { + "health": 8, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 10, + "move": 3, + "attack": 4, + "range": 6, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 5, + "normal": { + "health": 10, + "move": 3, + "attack": 3, + "range": 5, + "attributes": [] + }, + "elite": { + "health": 12, + "move": 4, + "attack": 4, + "range": 6, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 6, + "normal": { + "health": 10, + "move": 3, + "attack": 4, + "range": 5, + "attributes": [] + }, + "elite": { + "health": 13, + "move": 4, + "attack": 5, + "range": 6, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 7, + "normal": { + "health": 13, + "move": 3, + "attack": 4, + "range": 5, + "attributes": [] + }, + "elite": { + "health": 17, + "move": 4, + "attack": 5, + "range": 6, + "attributes": [ + "%poison%" + ] + } + } + ] + }, + "Bandit Guard": { + "level": [ + { + "level": 0, + "normal": { + "health": 5, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 9, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 6, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 9, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%shield% 1" + ] + } + }, + { + "level": 2, + "normal": { + "health": 6, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 10, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%shield% 1" + ] + } + }, + { + "level": 3, + "normal": { + "health": 9, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 10, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%shield% 2" + ] + } + }, + { + "level": 4, + "normal": { + "health": 10, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 11, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%muddle%", + "%shield% 2" + ] + } + }, + { + "level": 5, + "normal": { + "health": 11, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 12, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%muddle%", + "%shield% 2" + ] + } + }, + { + "level": 6, + "normal": { + "health": 14, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 14, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%muddle%", + "%shield% 2" + ] + } + }, + { + "level": 7, + "normal": { + "health": 16, + "move": 5, + "attack": 4, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 14, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%muddle%", + "%shield% 3" + ] + } + } + ] + }, + "Black Imp": { + "level": [ + { + "level": 0, + "normal": { + "health": 3, + "move": 1, + "attack": 1, + "range": 3, + "attributes": [] + }, + "elite": { + "health": 4, + "move": 1, + "attack": 2, + "range": 3, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 1, + "normal": { + "health": 4, + "move": 1, + "attack": 1, + "range": 3, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 6, + "move": 1, + "attack": 2, + "range": 3, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 2, + "normal": { + "health": 5, + "move": 1, + "attack": 1, + "range": 4, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 8, + "move": 1, + "attack": 2, + "range": 4, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 3, + "normal": { + "health": 5, + "move": 1, + "attack": 2, + "range": 4, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 8, + "move": 1, + "attack": 3, + "range": 4, + "attributes": [ + "Attackers gain Disadvantage", + "%poison%" + ] + } + }, + { + "level": 4, + "normal": { + "health": 7, + "move": 1, + "attack": 2, + "range": 4, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 11, + "move": 1, + "attack": 3, + "range": 4, + "attributes": [ + "Attackers gain Disadvantage", + "%poison%" + ] + } + }, + { + "level": 5, + "normal": { + "health": 9, + "move": 1, + "attack": 2, + "range": 4, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 12, + "move": 1, + "attack": 3, + "range": 5, + "attributes": [ + "Attackers gain Disadvantage", + "%poison%" + ] + } + }, + { + "level": 6, + "normal": { + "health": 10, + "move": 1, + "attack": 3, + "range": 4, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 14, + "move": 1, + "attack": 4, + "range": 5, + "attributes": [ + "Attackers gain Disadvantage", + "%poison%" + ] + } + }, + { + "level": 7, + "normal": { + "health": 12, + "move": 1, + "attack": 3, + "range": 4, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 17, + "move": 1, + "attack": 4, + "range": 5, + "attributes": [ + "Attackers gain Disadvantage", + "%poison%" + ] + } + } + ] + }, + "Cave Bear": { + "level": [ + { + "level": 0, + "normal": { + "health": 7, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 11, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 9, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 14, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 2, + "normal": { + "health": 11, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 17, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 3, + "normal": { + "health": 13, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 20, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [] + } + }, + { + "level": 4, + "normal": { + "health": 16, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 21, + "move": 5, + "attack": 5, + "range": 0, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 5, + "normal": { + "health": 17, + "move": 5, + "attack": 4, + "range": 0, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 24, + "move": 5, + "attack": 6, + "range": 0, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 6, + "normal": { + "health": 19, + "move": 5, + "attack": 5, + "range": 0, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 28, + "move": 5, + "attack": 7, + "range": 0, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 7, + "normal": { + "health": 22, + "move": 5, + "attack": 5, + "range": 0, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 33, + "move": 5, + "attack": 7, + "range": 0, + "attributes": [ + "%wound%" + ] + } + } + ] + }, + "City Archer": { + "level": [ + { + "level": 0, + "normal": { + "health": 4, + "move": 1, + "attack": 2, + "range": 3, + "attributes": [] + }, + "elite": { + "health": 6, + "move": 1, + "attack": 3, + "range": 4, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 5, + "move": 1, + "attack": 2, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 6, + "move": 1, + "attack": 3, + "range": 5, + "attributes": [ + "%pierce% 1", + "%shield% 1" + ] + } + }, + { + "level": 2, + "normal": { + "health": 6, + "move": 1, + "attack": 3, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 7, + "move": 1, + "attack": 4, + "range": 5, + "attributes": [ + "%pierce% 2", + "%shield% 1" + ] + } + }, + { + "level": 3, + "normal": { + "health": 6, + "move": 2, + "attack": 3, + "range": 4, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 8, + "move": 2, + "attack": 4, + "range": 5, + "attributes": [ + "%pierce% 2", + "%shield% 2" + ] + } + }, + { + "level": 4, + "normal": { + "health": 8, + "move": 2, + "attack": 3, + "range": 5, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 10, + "move": 2, + "attack": 4, + "range": 6, + "attributes": [ + "%pierce% 2", + "%shield% 2" + ] + } + }, + { + "level": 5, + "normal": { + "health": 9, + "move": 2, + "attack": 4, + "range": 5, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 11, + "move": 2, + "attack": 5, + "range": 6, + "attributes": [ + "%pierce% 3", + "%shield% 2" + ] + } + }, + { + "level": 6, + "normal": { + "health": 9, + "move": 3, + "attack": 4, + "range": 5, + "attributes": [ + "%shield% 2" + ] + }, + "elite": { + "health": 12, + "move": 3, + "attack": 6, + "range": 6, + "attributes": [ + "%pierce% 3", + "%shield% 2" + ] + } + }, + { + "level": 7, + "normal": { + "health": 10, + "move": 3, + "attack": 4, + "range": 6, + "attributes": [ + "%shield% 2" + ] + }, + "elite": { + "health": 13, + "move": 3, + "attack": 6, + "range": 7, + "attributes": [ + "%pierce% 3", + "%shield% 3" + ] + } + } + ] + }, + "City Guard": { + "level": [ + { + "level": 0, + "normal": { + "health": 5, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 6, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%shield% 1" + ] + } + }, + { + "level": 1, + "normal": { + "health": 5, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 6, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%shield% 2" + ] + } + }, + { + "level": 2, + "normal": { + "health": 7, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 9, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%shield% 2" + ] + } + }, + { + "level": 3, + "normal": { + "health": 8, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 9, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 1", + "%shield% 2" + ] + } + }, + { + "level": 4, + "normal": { + "health": 9, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 10, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 2", + "%shield% 2" + ] + } + }, + { + "level": 5, + "normal": { + "health": 10, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%shield% 2" + ] + }, + "elite": { + "health": 12, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 2", + "%shield% 3" + ] + } + }, + { + "level": 6, + "normal": { + "health": 11, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%shield% 2" + ] + }, + "elite": { + "health": 13, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 3", + "%shield% 3" + ] + } + }, + { + "level": 7, + "normal": { + "health": 13, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%shield% 2" + ] + }, + "elite": { + "health": 14, + "move": 3, + "attack": 6, + "range": 0, + "attributes": [ + "%retaliate% 3", + "%shield% 3" + ] + } + } + ] + }, + "Cultist": { + "level": [ + { + "level": 0, + "normal": { + "health": 4, + "move": 2, + "attack": 1, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 7, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 5, + "move": 2, + "attack": 1, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 9, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [] + } + }, + { + "level": 2, + "normal": { + "health": 7, + "move": 2, + "attack": 1, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 12, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [] + } + }, + { + "level": 3, + "normal": { + "health": 9, + "move": 3, + "attack": 1, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 13, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [ + "%curse%" + ] + } + }, + { + "level": 4, + "normal": { + "health": 10, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 15, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%curse%" + ] + } + }, + { + "level": 5, + "normal": { + "health": 11, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [ + "%curse%" + ] + }, + "elite": { + "health": 18, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%curse%" + ] + } + }, + { + "level": 6, + "normal": { + "health": 14, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [ + "%curse%" + ] + }, + "elite": { + "health": 22, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%curse%" + ] + } + }, + { + "level": 7, + "normal": { + "health": 15, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%curse%" + ] + }, + "elite": { + "health": 25, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%curse%" + ] + } + } + ] + }, + "Deep Terror": { + "level": [ + { + "level": 0, + "normal": { + "health": 3, + "move": 0, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 5, + "move": 0, + "attack": 3, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 4, + "move": 0, + "attack": 2, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + }, + "elite": { + "health": 6, + "move": 0, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + } + }, + { + "level": 2, + "normal": { + "health": 4, + "move": 0, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + }, + "elite": { + "health": 7, + "move": 0, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + } + }, + { + "level": 3, + "normal": { + "health": 5, + "move": 0, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 8, + "move": 0, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 4, + "normal": { + "health": 6, + "move": 0, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 9, + "move": 0, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 5, + "normal": { + "health": 7, + "move": 0, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + }, + "elite": { + "health": 11, + "move": 0, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 6, + "normal": { + "health": 8, + "move": 0, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + }, + "elite": { + "health": 13, + "move": 0, + "attack": 6, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 7, + "normal": { + "health": 9, + "move": 0, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 4" + ] + }, + "elite": { + "health": 15, + "move": 0, + "attack": 6, + "range": 0, + "attributes": [ + "%retaliate% 4" + ] + } + } + ] + }, + "Earth Demon": { + "level": [ + { + "level": 0, + "normal": { + "health": 7, + "move": 1, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 10, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 9, + "move": 1, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 13, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 2, + "normal": { + "health": 12, + "move": 1, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 18, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 3, + "normal": { + "health": 13, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 20, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%immobilize%" + ] + } + }, + { + "level": 4, + "normal": { + "health": 15, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 21, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%immobilize%" + ] + } + }, + { + "level": 5, + "normal": { + "health": 17, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%immobilize%" + ] + }, + "elite": { + "health": 25, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%immobilize%" + ] + } + }, + { + "level": 6, + "normal": { + "health": 20, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%immobilize%" + ] + }, + "elite": { + "health": 27, + "move": 3, + "attack": 6, + "range": 0, + "attributes": [ + "%immobilize%" + ] + } + }, + { + "level": 7, + "normal": { + "health": 22, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%immobilize%" + ] + }, + "elite": { + "health": 32, + "move": 3, + "attack": 6, + "range": 0, + "attributes": [ + "%immobilize%" + ] + } + } + ] + }, + "Flame Demon": { + "level": [ + { + "level": 0, + "normal": { + "health": 2, + "move": 3, + "attack": 2, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 2" + ] + }, + "elite": { + "health": 3, + "move": 3, + "attack": 2, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 3" + ] + } + }, + { + "level": 1, + "normal": { + "health": 2, + "move": 3, + "attack": 2, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 3" + ] + }, + "elite": { + "health": 3, + "move": 3, + "attack": 2, + "range": 4, + "attributes": [ + "%flying%", + "%retaliate% 2: %range% 2", + "%shield% 4" + ] + } + }, + { + "level": 2, + "normal": { + "health": 3, + "move": 3, + "attack": 3, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 3" + ] + }, + "elite": { + "health": 4, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%retaliate% 3: %range% 2", + "%shield% 4" + ] + } + }, + { + "level": 3, + "normal": { + "health": 3, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%retaliate% 2: %range% 2", + "%shield% 3" + ] + }, + "elite": { + "health": 5, + "move": 3, + "attack": 3, + "range": 5, + "attributes": [ + "%flying%", + "%retaliate% 3: %range% 3", + "%shield% 4" + ] + } + }, + { + "level": 4, + "normal": { + "health": 3, + "move": 4, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%retaliate% 3: %range% 2", + "%shield% 3" + ] + }, + "elite": { + "health": 5, + "move": 4, + "attack": 4, + "range": 5, + "attributes": [ + "%flying%", + "%retaliate% 4: %range% 3", + "%shield% 4" + ] + } + }, + { + "level": 5, + "normal": { + "health": 4, + "move": 4, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%retaliate% 3: %range% 2", + "%shield% 4" + ] + }, + "elite": { + "health": 6, + "move": 4, + "attack": 4, + "range": 5, + "attributes": [ + "%flying%", + "%retaliate% 4: %range% 3", + "%shield% 5" + ] + } + }, + { + "level": 6, + "normal": { + "health": 4, + "move": 4, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%retaliate% 4: %range% 2", + "%shield% 4" + ] + }, + "elite": { + "health": 7, + "move": 4, + "attack": 5, + "range": 5, + "attributes": [ + "%flying%", + "%retaliate% 5: %range% 3", + "%shield% 5" + ] + } + }, + { + "level": 7, + "normal": { + "health": 5, + "move": 4, + "attack": 4, + "range": 5, + "attributes": [ + "%flying%", + "%retaliate% 4: %range% 3", + "%shield% 4" + ] + }, + "elite": { + "health": 8, + "move": 4, + "attack": 5, + "range": 6, + "attributes": [ + "%flying%", + "%retaliate% 5: %range% 4", + "%shield% 5" + ] + } + } + ] + }, + "Frost Demon": { + "level": [ + { + "level": 0, + "normal": { + "health": 5, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 10, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 6, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + }, + "elite": { + "health": 10, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 2, + "normal": { + "health": 7, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 12, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 3, + "normal": { + "health": 8, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 14, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 4, + "normal": { + "health": 10, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 18, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 5, + "normal": { + "health": 11, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + }, + "elite": { + "health": 20, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 6, + "normal": { + "health": 12, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + }, + "elite": { + "health": 22, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 4" + ] + } + }, + { + "level": 7, + "normal": { + "health": 14, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + }, + "elite": { + "health": 25, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 4" + ] + } + } + ] + }, + "Forest Imp": { + "level": [ + { + "level": 0, + "normal": { + "health": 1, + "move": 3, + "attack": 1, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 1" + ] + }, + "elite": { + "health": 4, + "move": 3, + "attack": 1, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 1" + ] + } + }, + { + "level": 1, + "normal": { + "health": 2, + "move": 3, + "attack": 1, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 1" + ] + }, + "elite": { + "health": 5, + "move": 3, + "attack": 2, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 1" + ] + } + }, + { + "level": 2, + "normal": { + "health": 2, + "move": 3, + "attack": 2, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 1" + ] + }, + "elite": { + "health": 6, + "move": 3, + "attack": 2, + "range": 3, + "attributes": [ + "%flying%", + "%curse%", + "%shield% 1" + ] + } + }, + { + "level": 3, + "normal": { + "health": 3, + "move": 4, + "attack": 2, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 1" + ] + }, + "elite": { + "health": 7, + "move": 4, + "attack": 2, + "range": 4, + "attributes": [ + "%flying%", + "%curse%", + "%shield% 1" + ] + } + }, + { + "level": 4, + "normal": { + "health": 3, + "move": 4, + "attack": 2, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 2" + ] + }, + "elite": { + "health": 7, + "move": 4, + "attack": 2, + "range": 4, + "attributes": [ + "%flying%", + "%curse%", + "%shield% 2" + ] + } + }, + { + "level": 5, + "normal": { + "health": 4, + "move": 4, + "attack": 2, + "range": 4, + "attributes": [ + "%flying%", + "%curse%", + "%shield% 2" + ] + }, + "elite": { + "health": 8, + "move": 4, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%curse%", + "%shield% 2" + ] + } + }, + { + "level": 6, + "normal": { + "health": 4, + "move": 4, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%curse%", + "%shield% 2" + ] + }, + "elite": { + "health": 9, + "move": 4, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%curse%", + "%shield% 2" + ] + } + }, + { + "level": 7, + "normal": { + "health": 6, + "move": 4, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%curse%", + "%shield% 2" + ] + }, + "elite": { + "health": 11, + "move": 4, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%curse%", + "%shield% 2" + ] + } + } + ] + }, + "Giant Viper": { + "level": [ + { + "level": 0, + "normal": { + "health": 2, + "move": 2, + "attack": 1, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 3, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 1, + "normal": { + "health": 3, + "move": 2, + "attack": 1, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 5, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 2, + "normal": { + "health": 4, + "move": 3, + "attack": 1, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 7, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 3, + "normal": { + "health": 4, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 8, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 4, + "normal": { + "health": 6, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 11, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 5, + "normal": { + "health": 7, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 13, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 6, + "normal": { + "health": 8, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 14, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 7, + "normal": { + "health": 10, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 17, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%poison%" + ] + } + } + ] + }, + "Harrower Infester": { + "level": [ + { + "level": 0, + "normal": { + "health": 6, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 12, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 7, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + }, + "elite": { + "health": 12, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 2, + "normal": { + "health": 8, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 14, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 3, + "normal": { + "health": 10, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 17, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 4, + "normal": { + "health": 12, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 19, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 5, + "normal": { + "health": 12, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + }, + "elite": { + "health": 21, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 6, + "normal": { + "health": 15, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + }, + "elite": { + "health": 22, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 4" + ] + } + }, + { + "level": 7, + "normal": { + "health": 17, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 4" + ] + }, + "elite": { + "health": 26, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 4" + ] + } + } + ] + }, + "Hound": { + "level": [ + { + "level": 0, + "normal": { + "health": 4, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 6, + "move": 5, + "attack": 2, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 4, + "move": 4, + "attack": 2, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + }, + "elite": { + "health": 6, + "move": 5, + "attack": 2, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 2, + "normal": { + "health": 6, + "move": 4, + "attack": 2, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + }, + "elite": { + "health": 7, + "move": 5, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 3, + "normal": { + "health": 8, + "move": 4, + "attack": 2, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + }, + "elite": { + "health": 8, + "move": 5, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 4, + "normal": { + "health": 8, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + }, + "elite": { + "health": 11, + "move": 5, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 5, + "normal": { + "health": 9, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 12, + "move": 5, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 6, + "normal": { + "health": 11, + "move": 5, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 15, + "move": 6, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 7, + "normal": { + "health": 15, + "move": 5, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 15, + "move": 6, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 4" + ] + } + } + ] + }, + "Inox Archer": { + "level": [ + { + "level": 0, + "normal": { + "health": 5, + "move": 2, + "attack": 2, + "range": 2, + "attributes": [] + }, + "elite": { + "health": 7, + "move": 2, + "attack": 3, + "range": 3, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 6, + "move": 2, + "attack": 2, + "range": 3, + "attributes": [] + }, + "elite": { + "health": 8, + "move": 2, + "attack": 3, + "range": 4, + "attributes": [] + } + }, + { + "level": 2, + "normal": { + "health": 8, + "move": 2, + "attack": 2, + "range": 3, + "attributes": [] + }, + "elite": { + "health": 11, + "move": 2, + "attack": 3, + "range": 4, + "attributes": [] + } + }, + { + "level": 3, + "normal": { + "health": 9, + "move": 2, + "attack": 3, + "range": 3, + "attributes": [] + }, + "elite": { + "health": 13, + "move": 2, + "attack": 4, + "range": 4, + "attributes": [] + } + }, + { + "level": 4, + "normal": { + "health": 10, + "move": 3, + "attack": 3, + "range": 3, + "attributes": [] + }, + "elite": { + "health": 14, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 5, + "normal": { + "health": 12, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 17, + "move": 3, + "attack": 4, + "range": 5, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 6, + "normal": { + "health": 12, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 19, + "move": 3, + "attack": 5, + "range": 5, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 7, + "normal": { + "health": 15, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 23, + "move": 3, + "attack": 5, + "range": 5, + "attributes": [ + "%wound%" + ] + } + } + ] + }, + "Inox Guard": { + "level": [ + { + "level": 0, + "normal": { + "health": 5, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 9, + "move": 1, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + } + }, + { + "level": 1, + "normal": { + "health": 8, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 10, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 2, + "normal": { + "health": 9, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 12, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + } + }, + { + "level": 3, + "normal": { + "health": 11, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 15, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 4, + "normal": { + "health": 12, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + }, + "elite": { + "health": 17, + "move": 2, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 3" + ] + } + }, + { + "level": 5, + "normal": { + "health": 13, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + }, + "elite": { + "health": 19, + "move": 2, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 4" + ] + } + }, + { + "level": 6, + "normal": { + "health": 16, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 1" + ] + }, + "elite": { + "health": 21, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%retaliate% 4" + ] + } + }, + { + "level": 7, + "normal": { + "health": 19, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%retaliate% 2" + ] + }, + "elite": { + "health": 23, + "move": 3, + "attack": 6, + "range": 0, + "attributes": [ + "%retaliate% 4" + ] + } + } + ] + }, + "Inox Shaman": { + "level": [ + { + "level": 0, + "normal": { + "health": 4, + "move": 1, + "attack": 2, + "range": 3, + "attributes": [] + }, + "elite": { + "health": 6, + "move": 2, + "attack": 3, + "range": 3, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 6, + "move": 1, + "attack": 2, + "range": 3, + "attributes": [] + }, + "elite": { + "health": 9, + "move": 2, + "attack": 3, + "range": 3, + "attributes": [] + } + }, + { + "level": 2, + "normal": { + "health": 7, + "move": 2, + "attack": 2, + "range": 3, + "attributes": [] + }, + "elite": { + "health": 11, + "move": 3, + "attack": 3, + "range": 3, + "attributes": [] + } + }, + { + "level": 3, + "normal": { + "health": 9, + "move": 2, + "attack": 2, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 14, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [] + } + }, + { + "level": 4, + "normal": { + "health": 10, + "move": 2, + "attack": 3, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 16, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [] + } + }, + { + "level": 5, + "normal": { + "health": 13, + "move": 2, + "attack": 3, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 20, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [] + } + }, + { + "level": 6, + "normal": { + "health": 15, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 24, + "move": 4, + "attack": 4, + "range": 4, + "attributes": [] + } + }, + { + "level": 7, + "normal": { + "health": 16, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [] + }, + "elite": { + "health": 27, + "move": 4, + "attack": 5, + "range": 4, + "attributes": [] + } + } + ] + }, + "Living Bones": { + "level": [ + { + "level": 0, + "normal": { + "health": 5, + "move": 2, + "attack": 1, + "range": 0, + "attributes": [ + "%target% 2" + ] + }, + "elite": { + "health": 6, + "move": 4, + "attack": 2, + "range": 0, + "attributes": [ + "%target% 2" + ] + } + }, + { + "level": 1, + "normal": { + "health": 5, + "move": 3, + "attack": 1, + "range": 0, + "attributes": [ + "%target% 2", + "%shield% 1" + ] + }, + "elite": { + "health": 6, + "move": 4, + "attack": 2, + "range": 0, + "attributes": [ + "%target% 3", + "%shield% 1" + ] + } + }, + { + "level": 2, + "normal": { + "health": 5, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [ + "%target% 2", + "%shield% 1" + ] + }, + "elite": { + "health": 7, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [ + "%target% 3", + "%shield% 1" + ] + } + }, + { + "level": 3, + "normal": { + "health": 7, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [ + "%target% 2", + "%shield% 1" + ] + }, + "elite": { + "health": 10, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [ + "%target% 3", + "%shield% 1" + ] + } + }, + { + "level": 4, + "normal": { + "health": 7, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%target% 2", + "%shield% 1" + ] + }, + "elite": { + "health": 11, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%target% 3", + "%shield% 1" + ] + } + }, + { + "level": 5, + "normal": { + "health": 9, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%target% 2", + "%shield% 1" + ] + }, + "elite": { + "health": 11, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%target% 3", + "%shield% 2" + ] + } + }, + { + "level": 6, + "normal": { + "health": 10, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [ + "%target% 2", + "%shield% 1" + ] + }, + "elite": { + "health": 11, + "move": 6, + "attack": 4, + "range": 0, + "attributes": [ + "%target% 3", + "%shield% 2" + ] + } + }, + { + "level": 7, + "normal": { + "health": 13, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [ + "%target% 2", + "%shield% 1" + ] + }, + "elite": { + "health": 14, + "move": 6, + "attack": 4, + "range": 0, + "attributes": [ + "%target% 3", + "%shield% 2" + ] + } + } + ] + }, + "Living Corpse": { + "level": [ + { + "level": 0, + "normal": { + "health": 5, + "move": 1, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 10, + "move": 1, + "attack": 3, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 7, + "move": 1, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 10, + "move": 1, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 2, + "normal": { + "health": 9, + "move": 1, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 13, + "move": 1, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 3, + "normal": { + "health": 10, + "move": 1, + "attack": 4, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 13, + "move": 2, + "attack": 5, + "range": 0, + "attributes": [] + } + }, + { + "level": 4, + "normal": { + "health": 11, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 15, + "move": 2, + "attack": 5, + "range": 0, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 5, + "normal": { + "health": 13, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 17, + "move": 2, + "attack": 6, + "range": 0, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 6, + "normal": { + "health": 14, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 21, + "move": 2, + "attack": 6, + "range": 0, + "attributes": [ + "%poison%" + ] + } + }, + { + "level": 7, + "normal": { + "health": 15, + "move": 2, + "attack": 5, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 25, + "move": 2, + "attack": 6, + "range": 0, + "attributes": [ + "%poison%" + ] + } + } + ] + }, + "Living Spirit": { + "level": [ + { + "level": 0, + "normal": { + "health": 2, + "move": 2, + "attack": 2, + "range": 2, + "attributes": [ + "%flying%", + "%shield% 1" + ] + }, + "elite": { + "health": 3, + "move": 3, + "attack": 3, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 2" + ] + } + }, + { + "level": 1, + "normal": { + "health": 2, + "move": 2, + "attack": 2, + "range": 2, + "attributes": [ + "%flying%", + "%shield% 2" + ] + }, + "elite": { + "health": 3, + "move": 3, + "attack": 3, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 3" + ] + } + }, + { + "level": 2, + "normal": { + "health": 2, + "move": 3, + "attack": 2, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 2" + ] + }, + "elite": { + "health": 3, + "move": 4, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 3" + ] + } + }, + { + "level": 3, + "normal": { + "health": 3, + "move": 3, + "attack": 3, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 2" + ] + }, + "elite": { + "health": 4, + "move": 4, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 3" + ] + } + }, + { + "level": 4, + "normal": { + "health": 3, + "move": 3, + "attack": 3, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 3" + ] + }, + "elite": { + "health": 4, + "move": 4, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 4" + ] + } + }, + { + "level": 5, + "normal": { + "health": 4, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 3" + ] + }, + "elite": { + "health": 6, + "move": 4, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 4" + ] + } + }, + { + "level": 6, + "normal": { + "health": 4, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 3" + ] + }, + "elite": { + "health": 7, + "move": 4, + "attack": 5, + "range": 5, + "attributes": [ + "%flying%", + "%shield% 4" + ] + } + }, + { + "level": 7, + "normal": { + "health": 6, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 3" + ] + }, + "elite": { + "health": 9, + "move": 4, + "attack": 5, + "range": 5, + "attributes": [ + "%flying%", + "%shield% 4" + ] + } + } + ] + }, + "Lurker": { + "level": [ + { + "level": 0, + "normal": { + "health": 5, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [ + "%target% 2" + ] + }, + "elite": { + "health": 7, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%target% 2", + "%shield% 1" + ] + } + }, + { + "level": 1, + "normal": { + "health": 7, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 1" + ] + }, + "elite": { + "health": 9, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 1", + "%shield% 1" + ] + } + }, + { + "level": 2, + "normal": { + "health": 9, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 1" + ] + }, + "elite": { + "health": 12, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 2", + "%shield% 1" + ] + } + }, + { + "level": 3, + "normal": { + "health": 10, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 2" + ] + }, + "elite": { + "health": 14, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 2", + "%shield% 1" + ] + } + }, + { + "level": 4, + "normal": { + "health": 10, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 2", + "%shield% 1" + ] + }, + "elite": { + "health": 14, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 3", + "%shield% 2" + ] + } + }, + { + "level": 5, + "normal": { + "health": 11, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 2", + "%shield% 1" + ] + }, + "elite": { + "health": 15, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 3", + "%shield% 2" + ] + } + }, + { + "level": 6, + "normal": { + "health": 12, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 3", + "%shield% 1" + ] + }, + "elite": { + "health": 16, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 4", + "%shield% 2" + ] + } + }, + { + "level": 7, + "normal": { + "health": 14, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 3", + "%shield% 1" + ] + }, + "elite": { + "health": 18, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%target% 2", + "%pierce% 4", + "%shield% 2" + ] + } + } + ] + }, + "Ooze": { + "level": [ + { + "level": 0, + "normal": { + "health": 4, + "move": 1, + "attack": 2, + "range": 2, + "attributes": [] + }, + "elite": { + "health": 8, + "move": 1, + "attack": 2, + "range": 3, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 5, + "move": 1, + "attack": 2, + "range": 2, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 9, + "move": 1, + "attack": 2, + "range": 3, + "attributes": [ + "%shield% 1" + ] + } + }, + { + "level": 2, + "normal": { + "health": 7, + "move": 1, + "attack": 2, + "range": 3, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 11, + "move": 1, + "attack": 3, + "range": 3, + "attributes": [ + "%shield% 1" + ] + } + }, + { + "level": 3, + "normal": { + "health": 8, + "move": 1, + "attack": 3, + "range": 3, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 11, + "move": 2, + "attack": 3, + "range": 4, + "attributes": [ + "%poison%", + "%shield% 1" + ] + } + }, + { + "level": 4, + "normal": { + "health": 9, + "move": 2, + "attack": 3, + "range": 3, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 13, + "move": 2, + "attack": 4, + "range": 4, + "attributes": [ + "%poison%", + "%shield% 1" + ] + } + }, + { + "level": 5, + "normal": { + "health": 10, + "move": 2, + "attack": 3, + "range": 3, + "attributes": [ + "%poison%", + "%shield% 1" + ] + }, + "elite": { + "health": 15, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%poison%", + "%shield% 1" + ] + } + }, + { + "level": 6, + "normal": { + "health": 12, + "move": 2, + "attack": 4, + "range": 3, + "attributes": [ + "%poison%", + "%shield% 1" + ] + }, + "elite": { + "health": 16, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%poison%", + "%shield% 2" + ] + } + }, + { + "level": 7, + "normal": { + "health": 14, + "move": 2, + "attack": 4, + "range": 3, + "attributes": [ + "%poison%", + "%shield% 1" + ] + }, + "elite": { + "health": 18, + "move": 3, + "attack": 5, + "range": 4, + "attributes": [ + "%poison%", + "%shield% 2" + ] + } + } + ] + }, + "Night Demon": { + "level": [ + { + "level": 0, + "normal": { + "health": 3, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + }, + "elite": { + "health": 5, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + } + }, + { + "level": 1, + "normal": { + "health": 5, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + }, + "elite": { + "health": 8, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + } + }, + { + "level": 2, + "normal": { + "health": 6, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + }, + "elite": { + "health": 11, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + } + }, + { + "level": 3, + "normal": { + "health": 7, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + }, + "elite": { + "health": 13, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + } + }, + { + "level": 4, + "normal": { + "health": 8, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + }, + "elite": { + "health": 15, + "move": 5, + "attack": 5, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + } + }, + { + "level": 5, + "normal": { + "health": 11, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + }, + "elite": { + "health": 17, + "move": 5, + "attack": 6, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + } + }, + { + "level": 6, + "normal": { + "health": 14, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + }, + "elite": { + "health": 21, + "move": 5, + "attack": 6, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + } + }, + { + "level": 7, + "normal": { + "health": 15, + "move": 4, + "attack": 6, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + }, + "elite": { + "health": 21, + "move": 5, + "attack": 8, + "range": 0, + "attributes": [ + "Attackers gain Disadvantage" + ] + } + } + ] + }, + "Rending Drake": { + "level": [ + { + "level": 0, + "normal": { + "health": 5, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 7, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 6, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 7, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 2, + "normal": { + "health": 7, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 9, + "move": 5, + "attack": 5, + "range": 0, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 3, + "normal": { + "health": 7, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 10, + "move": 5, + "attack": 6, + "range": 0, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 4, + "normal": { + "health": 9, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 11, + "move": 6, + "attack": 6, + "range": 0, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 5, + "normal": { + "health": 10, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 14, + "move": 6, + "attack": 6, + "range": 0, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 6, + "normal": { + "health": 11, + "move": 5, + "attack": 5, + "range": 0, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 15, + "move": 6, + "attack": 7, + "range": 0, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 7, + "normal": { + "health": 14, + "move": 5, + "attack": 5, + "range": 0, + "attributes": [ + "%wound%" + ] + }, + "elite": { + "health": 18, + "move": 6, + "attack": 7, + "range": 0, + "attributes": [ + "%wound%" + ] + } + } + ] + }, + "Savvas Icestorm": { + "level": [ + { + "level": 0, + "normal": { + "health": 7, + "move": 2, + "attack": 2, + "range": 3, + "attributes": [ + "%pierce% 3" + ] + }, + "elite": { + "health": 12, + "move": 2, + "attack": 3, + "range": 4, + "attributes": [ + "%pierce% 3" + ] + } + }, + { + "level": 1, + "normal": { + "health": 10, + "move": 2, + "attack": 2, + "range": 4, + "attributes": [ + "%pierce% 3" + ] + }, + "elite": { + "health": 12, + "move": 2, + "attack": 3, + "range": 5, + "attributes": [ + "%pierce% 3", + "%shield% 1" + ] + } + }, + { + "level": 2, + "normal": { + "health": 12, + "move": 3, + "attack": 2, + "range": 4, + "attributes": [ + "%pierce% 3" + ] + }, + "elite": { + "health": 15, + "move": 3, + "attack": 3, + "range": 5, + "attributes": [ + "%pierce% 3", + "%shield% 1" + ] + } + }, + { + "level": 3, + "normal": { + "health": 12, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [ + "%pierce% 3", + "%shield% 1" + ] + }, + "elite": { + "health": 18, + "move": 3, + "attack": 4, + "range": 6, + "attributes": [ + "%pierce% 3", + "%shield% 1" + ] + } + }, + { + "level": 4, + "normal": { + "health": 14, + "move": 3, + "attack": 3, + "range": 5, + "attributes": [ + "%pierce% 3", + "%shield% 1" + ] + }, + "elite": { + "health": 19, + "move": 4, + "attack": 4, + "range": 6, + "attributes": [ + "%pierce% 3", + "%shield% 2" + ] + } + }, + { + "level": 5, + "normal": { + "health": 16, + "move": 3, + "attack": 4, + "range": 5, + "attributes": [ + "%pierce% 3", + "%shield% 1" + ] + }, + "elite": { + "health": 21, + "move": 4, + "attack": 5, + "range": 6, + "attributes": [ + "%pierce% 3", + "%shield% 2" + ] + } + }, + { + "level": 6, + "normal": { + "health": 16, + "move": 3, + "attack": 4, + "range": 5, + "attributes": [ + "%pierce% 3", + "%shield% 2" + ] + }, + "elite": { + "health": 23, + "move": 4, + "attack": 6, + "range": 6, + "attributes": [ + "%pierce% 3", + "%shield% 2" + ] + } + }, + { + "level": 7, + "normal": { + "health": 17, + "move": 4, + "attack": 4, + "range": 6, + "attributes": [ + "%pierce% 3", + "%shield% 2" + ] + }, + "elite": { + "health": 24, + "move": 4, + "attack": 6, + "range": 6, + "attributes": [ + "%pierce% 4", + "%shield% 3" + ] + } + } + ] + }, + "Savvas Lavaflow": { + "level": [ + { + "level": 0, + "normal": { + "health": 8, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 13, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 9, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 15, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%wound%" + ] + } + }, + { + "level": 2, + "normal": { + "health": 11, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 18, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%poison%", + "%wound%" + ] + } + }, + { + "level": 3, + "normal": { + "health": 14, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 21, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%poison%", + "%wound%" + ] + } + }, + { + "level": 4, + "normal": { + "health": 16, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%poison%" + ] + }, + "elite": { + "health": 24, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%poison%", + "%wound%" + ] + } + }, + { + "level": 5, + "normal": { + "health": 18, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%poison%", + "%wound%" + ] + }, + "elite": { + "health": 27, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%poison%", + "%wound%" + ] + } + }, + { + "level": 6, + "normal": { + "health": 20, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%poison%", + "%wound%" + ] + }, + "elite": { + "health": 30, + "move": 4, + "attack": 6, + "range": 0, + "attributes": [ + "%poison%", + "%wound%" + ] + } + }, + { + "level": 7, + "normal": { + "health": 24, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [ + "%poison%", + "%wound%" + ] + }, + "elite": { + "health": 35, + "move": 4, + "attack": 6, + "range": 0, + "attributes": [ + "%poison%", + "%wound%" + ] + } + } + ] + }, + "Spitting Drake": { + "level": [ + { + "level": 0, + "normal": { + "health": 5, + "move": 3, + "attack": 3, + "range": 3, + "attributes": [ + "%flying%"] + }, + "elite": { + "health": 8, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%"] + } + }, + { + "level": 1, + "normal": { + "health": 6, + "move": 3, + "attack": 3, + "range": 3, + "attributes": [ + "%flying%"] + }, + "elite": { + "health": 9, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%muddle%" + ] + } + }, + { + "level": 2, + "normal": { + "health": 8, + "move": 3, + "attack": 3, + "range": 3, + "attributes": [ + "%flying%", + "%muddle%" + ] + }, + "elite": { + "health": 10, + "move": 3, + "attack": 5, + "range": 4, + "attributes": [ + "%flying%", + "%muddle%" + ] + } + }, + { + "level": 3, + "normal": { + "health": 8, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%muddle%" + ] + }, + "elite": { + "health": 12, + "move": 3, + "attack": 5, + "range": 5, + "attributes": [ + "%flying%", + "%muddle%" + ] + } + }, + { + "level": 4, + "normal": { + "health": 9, + "move": 4, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%muddle%" + ] + }, + "elite": { + "health": 14, + "move": 4, + "attack": 5, + "range": 5, + "attributes": [ + "%flying%", + "%muddle%" + ] + } + }, + { + "level": 5, + "normal": { + "health": 12, + "move": 4, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%muddle%" + ] + }, + "elite": { + "health": 16, + "move": 4, + "attack": 6, + "range": 5, + "attributes": [ + "%flying%", + "%muddle%" + ] + } + }, + { + "level": 6, + "normal": { + "health": 13, + "move": 4, + "attack": 5, + "range": 4, + "attributes": [ + "%flying%", + "%muddle%" + ] + }, + "elite": { + "health": 19, + "move": 4, + "attack": 6, + "range": 5, + "attributes": [ + "%flying%", + "%muddle%" + ] + } + }, + { + "level": 7, + "normal": { + "health": 16, + "move": 4, + "attack": 5, + "range": 4, + "attributes": [ + "%flying%", + "%muddle%" + ] + }, + "elite": { + "health": 21, + "move": 4, + "attack": 7, + "range": 5, + "attributes": [ + "%flying%", + "%muddle%" + ] + } + } + ] + }, + "Stone Golem": { + "level": [ + { + "level": 0, + "normal": { + "health": 10, + "move": 1, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 10, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%shield% 1" + ] + } + }, + { + "level": 1, + "normal": { + "health": 10, + "move": 1, + "attack": 3, + "range": 0, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 11, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%shield% 2" + ] + } + }, + { + "level": 2, + "normal": { + "health": 11, + "move": 1, + "attack": 4, + "range": 0, + "attributes": [ + "%shield% 1" + ] + }, + "elite": { + "health": 14, + "move": 2, + "attack": 5, + "range": 0, + "attributes": [ + "%shield% 2" + ] + } + }, + { + "level": 3, + "normal": { + "health": 11, + "move": 1, + "attack": 4, + "range": 0, + "attributes": [ + "%shield% 2" + ] + }, + "elite": { + "health": 15, + "move": 2, + "attack": 5, + "range": 0, + "attributes": [ + "%shield% 3" + ] + } + }, + { + "level": 4, + "normal": { + "health": 12, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%shield% 2" + ] + }, + "elite": { + "health": 17, + "move": 2, + "attack": 6, + "range": 0, + "attributes": [ + "%shield% 3" + ] + } + }, + { + "level": 5, + "normal": { + "health": 13, + "move": 2, + "attack": 5, + "range": 0, + "attributes": [ + "%shield% 2" + ] + }, + "elite": { + "health": 19, + "move": 3, + "attack": 6, + "range": 0, + "attributes": [ + "%shield% 3" + ] + } + }, + { + "level": 6, + "normal": { + "health": 16, + "move": 2, + "attack": 5, + "range": 0, + "attributes": [ + "%shield% 2" + ] + }, + "elite": { + "health": 20, + "move": 3, + "attack": 7, + "range": 0, + "attributes": [ + "%shield% 3" + ] + } + }, + { + "level": 7, + "normal": { + "health": 16, + "move": 2, + "attack": 5, + "range": 0, + "attributes": [ + "%shield% 3" + ] + }, + "elite": { + "health": 21, + "move": 3, + "attack": 7, + "range": 0, + "attributes": [ + "%shield% 4" + ] + } + } + ] + }, + "Sun Demon": { + "level": [ + { + "level": 0, + "normal": { + "health": 5, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 1" + ] + }, + "elite": { + "health": 9, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 1" + ] + } + }, + { + "level": 1, + "normal": { + "health": 7, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 1" + ] + }, + "elite": { + "health": 12, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 1" + ] + } + }, + { + "level": 2, + "normal": { + "health": 9, + "move": 2, + "attack": 2, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 1" + ] + }, + "elite": { + "health": 13, + "move": 2, + "attack": 4, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 1" + ] + } + }, + { + "level": 3, + "normal": { + "health": 10, + "move": 2, + "attack": 3, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 1" + ] + }, + "elite": { + "health": 15, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 1" + ] + } + }, + { + "level": 4, + "normal": { + "health": 11, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 1" + ] + }, + "elite": { + "health": 16, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 1" + ] + } + }, + { + "level": 5, + "normal": { + "health": 11, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 2" + ] + }, + "elite": { + "health": 16, + "move": 3, + "attack": 5, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 2" + ] + } + }, + { + "level": 6, + "normal": { + "health": 12, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 2" + ] + }, + "elite": { + "health": 18, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 2" + ] + } + }, + { + "level": 7, + "normal": { + "health": 15, + "move": 3, + "attack": 4, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 2" + ] + }, + "elite": { + "health": 22, + "move": 4, + "attack": 5, + "range": 0, + "attributes": [ + "%flying%", + "Advantage", + "%shield% 2" + ] + } + } + ] + }, + "Vermling Scout": { + "level": [ + { + "level": 0, + "normal": { + "health": 2, + "move": 3, + "attack": 1, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 4, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [] + } + }, + { + "level": 1, + "normal": { + "health": 3, + "move": 3, + "attack": 1, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 5, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [] + } + }, + { + "level": 2, + "normal": { + "health": 3, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 5, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [] + } + }, + { + "level": 3, + "normal": { + "health": 5, + "move": 3, + "attack": 2, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 7, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [] + } + }, + { + "level": 4, + "normal": { + "health": 6, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 8, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 5, + "normal": { + "health": 8, + "move": 3, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 11, + "move": 4, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 6, + "normal": { + "health": 9, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 12, + "move": 5, + "attack": 4, + "range": 0, + "attributes": [] + } + }, + { + "level": 7, + "normal": { + "health": 11, + "move": 4, + "attack": 3, + "range": 0, + "attributes": [] + }, + "elite": { + "health": 15, + "move": 5, + "attack": 4, + "range": 0, + "attributes": [] + } + } + ] + }, + "Vermling Shaman": { + "level": [ + { + "level": 0, + "normal": { + "health": 2, + "move": 2, + "attack": 1, + "range": 3, + "attributes": [ + "%shield% 2" + ] + }, + "elite": { + "health": 3, + "move": 3, + "attack": 2, + "range": 3, + "attributes": [ + "%shield% 2" + ] + } + }, + { + "level": 1, + "normal": { + "health": 2, + "move": 2, + "attack": 1, + "range": 3, + "attributes": [ + "%shield% 3" + ] + }, + "elite": { + "health": 3, + "move": 3, + "attack": 2, + "range": 3, + "attributes": [ + "%shield% 3" + ] + } + }, + { + "level": 2, + "normal": { + "health": 3, + "move": 2, + "attack": 1, + "range": 4, + "attributes": [ + "%shield% 3" + ] + }, + "elite": { + "health": 4, + "move": 3, + "attack": 2, + "range": 4, + "attributes": [ + "%shield% 3" + ] + } + }, + { + "level": 3, + "normal": { + "health": 3, + "move": 2, + "attack": 2, + "range": 4, + "attributes": [ + "%shield% 3" + ] + }, + "elite": { + "health": 5, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [ + "%shield% 3" + ] + } + }, + { + "level": 4, + "normal": { + "health": 3, + "move": 3, + "attack": 2, + "range": 4, + "attributes": [ + "%muddle%", + "%shield% 3" + ] + }, + "elite": { + "health": 5, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [ + "%muddle%", + "%shield% 4" + ] + } + }, + { + "level": 5, + "normal": { + "health": 4, + "move": 3, + "attack": 3, + "range": 4, + "attributes": [ + "%muddle%", + "%shield% 3" + ] + }, + "elite": { + "health": 6, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%muddle%", + "%shield% 4" + ] + } + }, + { + "level": 6, + "normal": { + "health": 5, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%muddle%", + "%shield% 3" + ] + }, + "elite": { + "health": 6, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%muddle%", + "%shield% 5" + ] + } + }, + { + "level": 7, + "normal": { + "health": 7, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%muddle%", + "%shield% 3" + ] + }, + "elite": { + "health": 8, + "move": 3, + "attack": 4, + "range": 4, + "attributes": [ + "%muddle%", + "%shield% 5" + ] + } + } + ] + }, + "Wind Demon": { + "level": [ + { + "level": 0, + "normal": { + "health": 3, + "move": 3, + "attack": 2, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 1" + ] + }, + "elite": { + "health": 5, + "move": 4, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 1" + ] + } + }, + { + "level": 1, + "normal": { + "health": 3, + "move": 3, + "attack": 2, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 2" + ] + }, + "elite": { + "health": 5, + "move": 4, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 2" + ] + } + }, + { + "level": 2, + "normal": { + "health": 4, + "move": 4, + "attack": 2, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 2" + ] + }, + "elite": { + "health": 7, + "move": 5, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 2" + ] + } + }, + { + "level": 3, + "normal": { + "health": 5, + "move": 4, + "attack": 3, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 2" + ] + }, + "elite": { + "health": 8, + "move": 5, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 2" + ] + } + }, + { + "level": 4, + "normal": { + "health": 7, + "move": 4, + "attack": 3, + "range": 3, + "attributes": [ + "%flying%", + "%shield% 2" + ] + }, + "elite": { + "health": 8, + "move": 5, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%disarm%", + "%shield% 2" + ] + } + }, + { + "level": 5, + "normal": { + "health": 9, + "move": 4, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 2" + ] + }, + "elite": { + "health": 11, + "move": 5, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%disarm%", + "%shield% 2" + ] + } + }, + { + "level": 6, + "normal": { + "health": 10, + "move": 4, + "attack": 3, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 3" + ] + }, + "elite": { + "health": 12, + "move": 5, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%disarm%", + "%shield% 3" + ] + } + }, + { + "level": 7, + "normal": { + "health": 11, + "move": 4, + "attack": 4, + "range": 4, + "attributes": [ + "%flying%", + "%shield% 3" + ] + }, + "elite": { + "health": 13, + "move": 5, + "attack": 5, + "range": 4, + "attributes": [ + "%flying%", + "%disarm%", + "%shield% 3" + ] + } + } + ] + } + }, + "bosses": { + "Bandit Commander": { + "level": [ + { + "level": 0, + "health": "8xC", + "move": 3, + "attack": 3, + "range": 0, + "special1": [ + "Move to next door and reveal room" + ], + "special2": [ + "Summon Living Bones" + ], + "immunities": [ + "%stun%", + "%immobilize%", + "%curse%" + ], + "notes": "" + }, + { + "level": 1, + "health": "10xC", + "move": 3, + "attack": 3, + "range": 0, + "special1": [ + "Move to next door and reveal room" + ], + "special2": [ + "Summon Living Bones" + ], + "immunities": [ + "%stun%", + "%immobilize%", + "%curse%" + ], + "notes": "" + }, + { + "level": 2, + "health": "12xC", + "move": 4, + "attack": 3, + "range": 0, + "special1": [ + "Move to next door and reveal room" + ], + "special2": [ + "Summon Living Bones" + ], + "immunities": [ + "%stun%", + "%immobilize%", + "%curse%" + ], + "notes": "" + }, + { + "level": 3, + "health": "13xC", + "move": 4, + "attack": 4, + "range": 0, + "special1": [ + "Move to next door and reveal room" + ], + "special2": [ + "Summon Living Bones" + ], + "immunities": [ + "%stun%", + "%immobilize%", + "%curse%" + ], + "notes": "" + }, + { + "level": 4, + "health": "15xC", + "move": 4, + "attack": 4, + "range": 0, + "special1": [ + "Move to next door and reveal room" + ], + "special2": [ + "Summon Living Bones" + ], + "immunities": [ + "%stun%", + "%immobilize%", + "%curse%" + ], + "notes": "" + }, + { + "level": 5, + "health": "16xC", + "move": 5, + "attack": 5, + "range": 0, + "special1": [ + "Move to next door and reveal room" + ], + "special2": [ + "Summon Living Bones" + ], + "immunities": [ + "%stun%", + "%immobilize%", + "%curse%" + ], + "notes": "" + }, + { + "level": 6, + "health": "19xC", + "move": 5, + "attack": 5, + "range": 0, + "special1": [ + "Move to next door and reveal room" + ], + "special2": [ + "Summon Living Bones" + ], + "immunities": [ + "%stun%", + "%immobilize%", + "%curse%" + ], + "notes": "" + }, + { + "level": 7, + "health": "23xC", + "move": 5, + "attack": 5, + "range": 0, + "special1": [ + "Move to next door and reveal room" + ], + "special2": [ + "Summon Living Bones" + ], + "immunities": [ + "%stun%", + "%immobilize%", + "%curse%" + ], + "notes": "" + } + ] + }, + "The Betrayer": { + "level": [ + { + "level": 0, + "health": "10xC", + "move": 3, + "attack": 4, + "range": 3, + "special1": [ + "Summon Giant Viper and Fear" + ], + "special2": [ + "Mind Control" + ], + "immunities": [ + "%wound%", + "%poison%", + "%stun%", + "%disarm%", + "%curse%" + ], + "notes": "" + }, + { + "level": 1, + "health": "12xC", + "move": 3, + "attack": 5, + "range": 3, + "special1": [ + "Summon Giant Viper and Fear" + ], + "special2": [ + "Mind Control" + ], + "immunities": [ + "%wound%", + "%poison%", + "%stun%", + "%disarm%", + "%curse%" + ], + "notes": "" + }, + { + "level": 2, + "health": "14xC", + "move": 3, + "attack": 6, + "range": 4, + "special1": [ + "Summon Giant Viper and Fear" + ], + "special2": [ + "Mind Control" + ], + "immunities": [ + "%wound%", + "%poison%", + "%stun%", + "%disarm%", + "%curse%" + ], + "notes": "" + }, + { + "level": 3, + "health": "16xC", + "move": 4, + "attack": 7, + "range": 4, + "special1": [ + "Summon Giant Viper and Fear" + ], + "special2": [ + "Mind Control" + ], + "immunities": [ + "%wound%", + "%poison%", + "%stun%", + "%disarm%", + "%curse%" + ], + "notes": "" + }, + { + "level": 4, + "health": "18xC", + "move": 4, + "attack": 8, + "range": 4, + "special1": [ + "Summon Giant Viper and Fear" + ], + "special2": [ + "Mind Control" + ], + "immunities": [ + "%wound%", + "%poison%", + "%stun%", + "%disarm%", + "%curse%" + ], + "notes": "" + }, + { + "level": 5, + "health": "20xC", + "move": 5, + "attack": 8, + "range": 5, + "special1": [ + "Summon Giant Viper and Fear" + ], + "special2": [ + "Mind Control" + ], + "immunities": [ + "%wound%", + "%poison%", + "%stun%", + "%disarm%", + "%curse%" + ], + "notes": "" + }, + { + "level": 6, + "health": "23xC", + "move": 5, + "attack": 9, + "range": 5, + "special1": [ + "Summon Giant Viper and Fear" + ], + "special2": [ + "Mind Control" + ], + "immunities": [ + "%wound%", + "%poison%", + "%stun%", + "%disarm%", + "%curse%" + ], + "notes": "" + }, + { + "level": 7, + "health": "27xC", + "move": 5, + "attack": 9, + "range": 5, + "special1": [ + "Summon Giant Viper and Fear" + ], + "special2": [ + "Mind Control" + ], + "immunities": [ + "%wound%", + "%poison%", + "%stun%", + "%disarm%", + "%curse%" + ], + "notes": "" + } + ] + }, + "Captain of the Guard": { + "level": [ + { + "level": 0, + "health": "7xC", + "move": 2, + "attack": 3, + "range": 0, + "special1": [ + "%heal% 2, Affect self and all allies" + ], + "special2": [ + "All allies add +1 Attack to all attacks this round", + "%attack% +1" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 1, + "health": "9xC", + "move": 2, + "attack": 3, + "range": 0, + "special1": [ + "%heal% 2, Affect self and all allies" + ], + "special2": [ + "All allies add +1 Attack to all attacks this round", + "%attack% +1" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 2, + "health": "11xC", + "move": 2, + "attack": 4, + "range": 0, + "special1": [ + "%heal% 2, Affect self and all allies" + ], + "special2": [ + "All allies add +1 Attack to all attacks this round", + "%attack% +1" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 3, + "health": "14xC", + "move": 3, + "attack": 4, + "range": 0, + "special1": [ + "%heal% 2, Affect self and all allies" + ], + "special2": [ + "All allies add +1 Attack to all attacks this round", + "%attack% +1" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 4, + "health": "16xC", + "move": 3, + "attack": 5, + "range": 0, + "special1": [ + "%heal% 2, Affect self and all allies" + ], + "special2": [ + "All allies add +1 Attack to all attacks this round", + "%attack% +1" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 5, + "health": "20xC", + "move": 3, + "attack": 5, + "range": 0, + "special1": [ + "%heal% 2, Affect self and all allies" + ], + "special2": [ + "All allies add +1 Attack to all attacks this round", + "%attack% +1" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 6, + "health": "21xC", + "move": 4, + "attack": 6, + "range": 0, + "special1": [ + "%heal% 2, Affect self and all allies" + ], + "special2": [ + "All allies add +1 Attack to all attacks this round", + "%attack% +1" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 7, + "health": "25xC", + "move": 4, + "attack": 6, + "range": 0, + "special1": [ + "%heal% 2, Affect self and all allies" + ], + "special2": [ + "All allies add +1 Attack to all attacks this round", + "%attack% +1" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%muddle%", + "%stun%" + ], + "notes": "" + } + ] + }, + "The Colorless": { + "level": [ + { + "level": 0, + "health": "9xC", + "move": 3, + "attack": 2, + "range": 0, + "special1": [ + "%dark%%use_element%: Summon Night Demon", + "%invisible%, Self" + ], + "special2": [ + "%light%%use_element%: Summon Sun Demon", + "%heal% 4, Self", + "%shield% 1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%muddle%", + "%stun%", + "%disarm%" + ], + "notes": "" + }, + { + "level": 1, + "health": "10xC", + "move": 3, + "attack": 3, + "range": 0, + "special1": [ + "%dark%%use_element%: Summon Night Demon", + "%invisible%, Self" + ], + "special2": [ + "%light%%use_element%: Summon Sun Demon", + "%heal% 4, Self", + "%shield% 1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%muddle%", + "%stun%", + "%disarm%" + ], + "notes": "" + }, + { + "level": 2, + "health": "11xC", + "move": 4, + "attack": 3, + "range": 0, + "special1": [ + "%dark%%use_element%: Summon Night Demon", + "%invisible%, Self" + ], + "special2": [ + "%light%%use_element%: Summon Sun Demon", + "%heal% 5, Self", + "%shield% 1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%muddle%", + "%stun%", + "%disarm%" + ], + "notes": "" + }, + { + "level": 3, + "health": "12xC", + "move": 4, + "attack": 4, + "range": 0, + "special1": [ + "%dark%%use_element%: Summon Night Demon", + "%invisible%, Self" + ], + "special2": [ + "%light%%use_element%: Summon Sun Demon", + "%heal% 5, Self", + "%shield% 1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%muddle%", + "%stun%", + "%disarm%" + ], + "notes": "" + }, + { + "level": 4, + "health": "14xC", + "move": 4, + "attack": 4, + "range": 0, + "special1": [ + "%dark%%use_element%: Summon Night Demon", + "%invisible%, Self" + ], + "special2": [ + "%light%%use_element%: Summon Sun Demon", + "%heal% 6, Self", + "%shield% 1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%muddle%", + "%stun%", + "%disarm%" + ], + "notes": "" + }, + { + "level": 5, + "health": "15xC", + "move": 4, + "attack": 5, + "range": 0, + "special1": [ + "%dark%%use_element%: Summon Night Demon", + "%invisible%, Self" + ], + "special2": [ + "%light%%use_element%: Summon Sun Demon", + "%heal% 6, Self", + "%shield% 1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%muddle%", + "%stun%", + "%disarm%" + ], + "notes": "" + }, + { + "level": 6, + "health": "17xC", + "move": 4, + "attack": 6, + "range": 0, + "special1": [ + "%dark%%use_element%: Summon Night Demon", + "%invisible%, Self" + ], + "special2": [ + "%light%%use_element%: Summon Sun Demon", + "%heal% 7, Self", + "%shield% 1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%muddle%", + "%stun%", + "%disarm%" + ], + "notes": "" + }, + { + "level": 7, + "health": "19xC", + "move": 5, + "attack": 7, + "range": 0, + "special1": [ + "%dark%%use_element%: Summon Night Demon", + "%invisible%, Self" + ], + "special2": [ + "%light%%use_element%: Summon Sun Demon", + "%heal% 7, Self", + "%shield% 1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%muddle%", + "%stun%", + "%disarm%" + ], + "notes": "" + } + ] + }, + "Dark Rider": { + "level": [ + { + "level": 0, + "health": "9xC", + "move": 2, + "attack": "3+X", + "range": 0, + "special1": [ + "%move% +2", + "%attack% +0" + ], + "special2": [ + "%move% +0", + "Summon Imp", + "%attack% -1" + ], + "immunities": [ + "%immobilize%", + "%poison%", + "%stun%", + "%disarm%" + ], + "notes": "X = Hexes moved" + }, + { + "level": 1, + "health": "10xC", + "move": 3, + "attack": "3+X", + "range": 0, + "special1": [ + "%move% +2", + "%attack% +0" + ], + "special2": [ + "%move% +0", + "Summon Imp", + "%attack% -1" + ], + "immunities": [ + "%immobilize%", + "%poison%", + "%stun%", + "%disarm%" + ], + "notes": "X = Hexes moved" + }, + { + "level": 2, + "health": "12xC", + "move": 3, + "attack": "3+X", + "range": 0, + "special1": [ + "%move% +2", + "%attack% +0" + ], + "special2": [ + "%move% +0", + "Summon Imp", + "%attack% -1" + ], + "immunities": [ + "%immobilize%", + "%poison%", + "%stun%", + "%disarm%" + ], + "notes": "X = Hexes moved" + }, + { + "level": 3, + "health": "13xC", + "move": 3, + "attack": "4+X", + "range": 0, + "special1": [ + "%move% +2", + "%attack% +0" + ], + "special2": [ + "%move% +0", + "Summon Imp", + "%attack% -1" + ], + "immunities": [ + "%immobilize%", + "%poison%", + "%stun%", + "%disarm%" + ], + "notes": "X = Hexes moved" + }, + { + "level": 4, + "health": "15xC", + "move": 3, + "attack": "4+X", + "range": 0, + "special1": [ + "%move% +2", + "%attack% +0" + ], + "special2": [ + "%move% +0", + "Summon Imp", + "%attack% -1" + ], + "immunities": [ + "%immobilize%", + "%poison%", + "%stun%", + "%disarm%" + ], + "notes": "X = Hexes moved" + }, + { + "level": 5, + "health": "16xC", + "move": 3, + "attack": "5+X", + "range": 0, + "special1": [ + "%move% +2", + "%attack% +0" + ], + "special2": [ + "%move% +0", + "Summon Imp", + "%attack% -1" + ], + "immunities": [ + "%immobilize%", + "%poison%", + "%stun%", + "%disarm%" + ], + "notes": "X = Hexes moved" + }, + { + "level": 6, + "health": "16xC", + "move": 4, + "attack": "5+X", + "range": 0, + "special1": [ + "%move% +2", + "%attack% +0" + ], + "special2": [ + "%move% +0", + "Summon Imp", + "%attack% -1" + ], + "immunities": [ + "%immobilize%", + "%poison%", + "%stun%", + "%disarm%" + ], + "notes": "X = Hexes moved" + }, + { + "level": 7, + "health": "18xC", + "move": 4, + "attack": "6+X", + "range": 0, + "special1": [ + "%move% +2", + "%attack% +0" + ], + "special2": [ + "%move% +0", + "Summon Imp", + "%attack% -1" + ], + "immunities": [ + "%immobilize%", + "%poison%", + "%stun%", + "%disarm%" + ], + "notes": "X = Hexes moved" + } + ] + }, + "Elder Drake": { + "level": [ + { + "level": 0, + "health": "11xC", + "move": 0, + "attack": 3, + "range": 0, + "special1": [ + "%attack% +0 %boss-aoe-elder-drake-sp1%" + ], + "special2": [ + "Summon 2 Zephyrs and %move%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%stun%" + ], + "notes": "" + }, + { + "level": 1, + "health": "12xC", + "move": 0, + "attack": 4, + "range": 0, + "special1": [ + "%attack% +0 %boss-aoe-elder-drake-sp1%" + ], + "special2": [ + "Summon 2 Zephyrs and %move%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%stun%" + ], + "notes": "" + }, + { + "level": 2, + "health": "15xC", + "move": 0, + "attack": 4, + "range": 0, + "special1": [ + "%attack% +0 %boss-aoe-elder-drake-sp1%" + ], + "special2": [ + "Summon 2 Zephyrs and %move%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%stun%" + ], + "notes": "" + }, + { + "level": 3, + "health": "16xC", + "move": 0, + "attack": 5, + "range": 0, + "special1": [ + "%attack% +0 %boss-aoe-elder-drake-sp1%" + ], + "special2": [ + "Summon 2 Zephyrs and %move%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%stun%" + ], + "notes": "" + }, + { + "level": 4, + "health": "20xC", + "move": 0, + "attack": 5, + "range": 0, + "special1": [ + "%attack% +0 %boss-aoe-elder-drake-sp1%" + ], + "special2": [ + "Summon 2 Zephyrs and %move%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%stun%" + ], + "notes": "" + }, + { + "level": 5, + "health": "22xC", + "move": 0, + "attack": 6, + "range": 0, + "special1": [ + "%attack% +0 %boss-aoe-elder-drake-sp1%" + ], + "special2": [ + "Summon 2 Zephyrs and %move%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%stun%" + ], + "notes": "" + }, + { + "level": 6, + "health": "27xC", + "move": 0, + "attack": 6, + "range": 0, + "special1": [ + "%attack% +0 %boss-aoe-elder-drake-sp1%" + ], + "special2": [ + "Summon 2 Zephyrs and %move%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%stun%" + ], + "notes": "" + }, + { + "level": 7, + "health": "29xC", + "move": 0, + "attack": 7, + "range": 0, + "special1": [ + "%attack% +0 %boss-aoe-elder-drake-sp1%" + ], + "special2": [ + "Summon 2 Zephyrs and %move%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%stun%" + ], + "notes": "" + } + ] + }, + "The Gloom": { + "level": [ + { + "level": 0, + "health": "20xC", + "move": 2, + "attack": 5, + "range": 0, + "special1": [ + "%move% +9", + "%attack% +9" + ], + "special2": [ + "Teleport", + "%attack% +1", + "%range% 5", + "%poison%", + "%wound%", + "%stun%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 1, + "health": "25xC", + "move": 2, + "attack": 5, + "range": 0, + "special1": [ + "%move% +9", + "%attack% +9" + ], + "special2": [ + "Teleport", + "%attack% +1", + "%range% 5", + "%poison%", + "%wound%", + "%stun%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 2, + "health": "29xC", + "move": 2, + "attack": 6, + "range": 0, + "special1": [ + "%move% +9", + "%attack% +9" + ], + "special2": [ + "Teleport", + "%attack% +1", + "%range% 5", + "%poison%", + "%wound%", + "%stun%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 3, + "health": "35xC", + "move": 2, + "attack": 6, + "range": 0, + "special1": [ + "%move% +9", + "%attack% +9" + ], + "special2": [ + "Teleport", + "%attack% +1", + "%range% 5", + "%poison%", + "%wound%", + "%stun%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 4, + "health": "39xC", + "move": 3, + "attack": 7, + "range": 0, + "special1": [ + "%move% +9", + "%attack% +9" + ], + "special2": [ + "Teleport", + "%attack% +1", + "%range% 5", + "%poison%", + "%wound%", + "%stun%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 5, + "health": "46xC", + "move": 3, + "attack": 7, + "range": 0, + "special1": [ + "%move% +9", + "%attack% +9" + ], + "special2": [ + "Teleport", + "%attack% +1", + "%range% 5", + "%poison%", + "%wound%", + "%stun%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 6, + "health": "50xC", + "move": 3, + "attack": 8, + "range": 0, + "special1": [ + "%move% +9", + "%attack% +9" + ], + "special2": [ + "Teleport", + "%attack% +1", + "%range% 5", + "%poison%", + "%wound%", + "%stun%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 7, + "health": "56xC", + "move": 3, + "attack": 9, + "range": 0, + "special1": [ + "%move% +9", + "%attack% +9" + ], + "special2": [ + "Teleport", + "%attack% +1", + "%range% 5", + "%poison%", + "%wound%", + "%stun%" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + } + ] + }, + "Inox Bodyguard": { + "level": [ + { + "level": 0, + "health": "6xC", + "move": 2, + "attack": "C", + "range": 0, + "special1": [ + "%move% -1", + "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" + ], + "special2": [ + "%move% +0", + "%attack% +0", + "%retaliate% 3" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%" + ], + "notes": "C = Number of Characters" + }, + { + "level": 1, + "health": "7xC", + "move": 2, + "attack": "1+C", + "range": 0, + "special1": [ + "%move% -1", + "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" + ], + "special2": [ + "%move% +0", + "%attack% +0", + "%retaliate% 3" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%" + ], + "notes": "C = Number of Characters" + }, + { + "level": 2, + "health": "9xC", + "move": 2, + "attack": "1+C", + "range": 0, + "special1": [ + "%move% -1", + "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" + ], + "special2": [ + "%move% +0", + "%attack% +0", + "%retaliate% 3" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%" + ], + "notes": "C = Number of Characters" + }, + { + "level": 3, + "health": "10xC", + "move": 3, + "attack": "2+C", + "range": 0, + "special1": [ + "%move% -1", + "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" + ], + "special2": [ + "%move% +0", + "%attack% +0", + "%retaliate% 4" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%" + ], + "notes": "C = Number of Characters" + }, + { + "level": 4, + "health": "11xC", + "move": 3, + "attack": "2+C", + "range": 0, + "special1": [ + "%move% -1", + "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" + ], + "special2": [ + "%move% +0", + "%attack% +0", + "%retaliate% 4" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%" + ], + "notes": "C = Number of Characters" + }, + { + "level": 5, + "health": "13xC", + "move": 3, + "attack": "3+C", + "range": 0, + "special1": [ + "%move% -1", + "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" + ], + "special2": [ + "%move% +0", + "%attack% +0", + "%retaliate% 5" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%" + ], + "notes": "C = Number of Characters" + }, + { + "level": 6, + "health": "15xC", + "move": 4, + "attack": "3+C", + "range": 0, + "special1": [ + "%move% -1", + "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" + ], + "special2": [ + "%move% +0", + "%attack% +0", + "%retaliate% 5" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%" + ], + "notes": "C = Number of Characters" + }, + { + "level": 7, + "health": "17xC", + "move": 4, + "attack": "4+C", + "range": 0, + "special1": [ + "%move% -1", + "%attack% -1 %boss-aoe-inox-bodyguard-sp1%" + ], + "special2": [ + "%move% +0", + "%attack% +0", + "%retaliate% 5" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%" + ], + "notes": "C = Number of Characters" + } + ] + }, + "Jekserah": { + "level": [ + { + "level": 0, + "health": "6xC", + "move": 2, + "attack": 2, + "range": 0, + "special1": [ + "Summon Living Bones", + "%attack% -1, Target all adjacent enemies" + ], + "special2": [ + "Summon Living Corpse", + "%move% -1", + "%attack% +2" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "" + }, + { + "level": 1, + "health": "7xC", + "move": 2, + "attack": 3, + "range": 0, + "special1": [ + "Summon Living Bones", + "%attack% -1, Target all adjacent enemies" + ], + "special2": [ + "Summon Living Corpse", + "%move% -1", + "%attack% +2" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "" + }, + { + "level": 2, + "health": "9xC", + "move": 3, + "attack": 3, + "range": 0, + "special1": [ + "Summon Living Bones", + "%attack% -1, Target all adjacent enemies" + ], + "special2": [ + "Summon Living Corpse", + "%move% -1", + "%attack% +2" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "" + }, + { + "level": 3, + "health": "12xC", + "move": 4, + "attack": 4, + "range": 0, + "special1": [ + "Summon Living Bones", + "%attack% -1, Target all adjacent enemies" + ], + "special2": [ + "Summon Living Corpse", + "%move% -1", + "%attack% +2" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "" + }, + { + "level": 4, + "health": "13xC", + "move": 4, + "attack": 5, + "range": 0, + "special1": [ + "Summon Living Bones", + "%attack% -1, Target all adjacent enemies" + ], + "special2": [ + "Summon Living Corpse", + "%move% -1", + "%attack% +2" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "" + }, + { + "level": 5, + "health": "15xC", + "move": 5, + "attack": 5, + "range": 0, + "special1": [ + "Summon Living Bones", + "%attack% -1, Target all adjacent enemies" + ], + "special2": [ + "Summon Living Corpse", + "%move% -1", + "%attack% +2" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "" + }, + { + "level": 6, + "health": "18xC", + "move": 5, + "attack": 5, + "range": 0, + "special1": [ + "Summon Living Bones", + "%attack% -1, Target all adjacent enemies" + ], + "special2": [ + "Summon Living Corpse", + "%move% -1", + "%attack% +2" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "" + }, + { + "level": 7, + "health": "22xC", + "move": 5, + "attack": 5, + "range": 0, + "special1": [ + "Summon Living Bones", + "%attack% -1, Target all adjacent enemies" + ], + "special2": [ + "Summon Living Corpse", + "%move% -1", + "%attack% +2" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "" + } + ] + }, + "Merciless Overseer": { + "level": [ + { + "level": 0, + "health": "6xC", + "move": 2, + "attack": "V", + "range": 0, + "special1": [ + "All Scouts act again" + ], + "special2": [ + "Summon Vermling Scout" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "V = Number of Scouts present" + }, + { + "level": 1, + "health": "8xC", + "move": 2, + "attack": "V", + "range": 0, + "special1": [ + "All Scouts act again" + ], + "special2": [ + "Summon Vermling Scout" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "V = Number of Scouts present" + }, + { + "level": 2, + "health": "9xC", + "move": 3, + "attack": "V", + "range": 0, + "special1": [ + "All Scouts act again" + ], + "special2": [ + "Summon Vermling Scout" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "V = Number of Scouts present" + }, + { + "level": 3, + "health": "11xC", + "move": 3, + "attack": "V", + "range": 0, + "special1": [ + "All Scouts act again" + ], + "special2": [ + "Summon Vermling Scout" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "V = Number of Scouts present" + }, + { + "level": 4, + "health": "12xC", + "move": 4, + "attack": "V", + "range": 0, + "special1": [ + "All Scouts act again" + ], + "special2": [ + "Summon Vermling Scout" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "V = Number of Scouts present" + }, + { + "level": 5, + "health": "14xC", + "move": 4, + "attack": "V", + "range": 0, + "special1": [ + "All Scouts act again" + ], + "special2": [ + "Summon Vermling Scout" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "V = Number of Scouts present" + }, + { + "level": 6, + "health": "16xC", + "move": 4, + "attack": "V", + "range": 0, + "special1": [ + "All Scouts act again" + ], + "special2": [ + "Summon Vermling Scout" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "V = Number of Scouts present" + }, + { + "level": 7, + "health": "19xC", + "move": 4, + "attack": "V", + "range": 0, + "special1": [ + "All Scouts act again" + ], + "special2": [ + "Summon Vermling Scout" + ], + "immunities": [ + "%disarm%", + "%wound%", + "%curse%", + "%stun%" + ], + "notes": "V = Number of Scouts present" + } + ] + }, + "Prime Demon": { + "level": [ + { + "level": 0, + "health": "8xC", + "move": 3, + "attack": 4, + "range": 0, + "special1": [ + "Throne moves", + "Summon Demon (Special 1)", + "%move% +2", + "%attack% -1" + ], + "special2": [ + "Throne moves", + "Summon Demon (Special 2)", + "%move% +2", + "%attack% -1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 1, + "health": "9xC", + "move": 4, + "attack": 4, + "range": 0, + "special1": [ + "Throne moves", + "Summon Demon (Special 1)", + "%move% +2", + "%attack% -1" + ], + "special2": [ + "Throne moves", + "Summon Demon (Special 2)", + "%move% +2", + "%attack% -1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 2, + "health": "10xC", + "move": 4, + "attack": 5, + "range": 0, + "special1": [ + "Throne moves", + "Summon Demon (Special 1)", + "%move% +2", + "%attack% -1" + ], + "special2": [ + "Throne moves", + "Summon Demon (Special 2)", + "%move% +2", + "%attack% -1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 3, + "health": "12xC", + "move": 4, + "attack": 6, + "range": 0, + "special1": [ + "Throne moves", + "Summon Demon", + "%move% +2", + "%attack% -1" + ], + "special2": [ + "Throne moves", + "Summon Demon", + "%move% +2", + "%attack% -1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 4, + "health": "14xC", + "move": 5, + "attack": 6, + "range": 0, + "special1": [ + "Throne moves", + "Summon Demon (Special 1)", + "%move% +2", + "%attack% -1" + ], + "special2": [ + "Throne moves", + "Summon Demon (Special 2)", + "%move% +2", + "%attack% -1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 5, + "health": "16xC", + "move": 5, + "attack": 7, + "range": 0, + "special1": [ + "Throne moves", + "Summon Demon (Special 1)", + "%move% +2", + "%attack% -1" + ], + "special2": [ + "Throne moves", + "Summon Demon (Special 2)", + "%move% +2", + "%attack% -1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 6, + "health": "20xC", + "move": 5, + "attack": 7, + "range": 0, + "special1": [ + "Throne moves", + "Summon Demon (Special 1)", + "%move% +2", + "%attack% -1" + ], + "special2": [ + "Throne moves", + "Summon Demon (Special 2)", + "%move% +2", + "%attack% -1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%" + ], + "notes": "" + }, + { + "level": 7, + "health": "22xC", + "move": 5, + "attack": 8, + "range": 0, + "special1": [ + "Throne moves", + "Summon Demon (Special 1)", + "%move% +2", + "%attack% -1" + ], + "special2": [ + "Throne moves", + "Summon Demon (Special 2)", + "%move% +2", + "%attack% -1" + ], + "immunities": [ + "%wound%", + "%poison%", + "%disarm%", + "%immobilize%", + "%muddle%", + "%stun%" + ], + "notes": "" + } + ] + }, + "The Sightless Eye": { + "level": [ + { + "level": 0, + "health": "7xC", + "move": 0, + "attack": 5, + "range": 3, + "special1": [ + "Summon Deep Terror", + "%attack% -3 %boss-aoe-sightless-eye-sp1%" + ], + "special2": [ + "Summon Deep Terror", + "%attack% -2 %boss-aoe-sightless-eye-sp2%" + ], + "immunities": [ + "%stun%", + "%disarm%", + "%curse%", + "%muddle%" + ], + "notes": "" + }, + { + "level": 1, + "health": "8xC", + "move": 0, + "attack": 6, + "range": 3, + "special1": [ + "Summon Deep Terror", + "%attack% -3 %boss-aoe-sightless-eye-sp1%" + ], + "special2": [ + "Summon Deep Terror", + "%attack% -2 %boss-aoe-sightless-eye-sp2%" + ], + "immunities": [ + "%stun%", + "%disarm%", + "%curse%", + "%muddle%" + ], + "notes": "" + }, + { + "level": 2, + "health": "10xC", + "move": 0, + "attack": 6, + "range": 3, + "special1": [ + "Summon Deep Terror", + "%attack% -3 %boss-aoe-sightless-eye-sp1%" + ], + "special2": [ + "Summon Deep Terror", + "%attack% -2 %boss-aoe-sightless-eye-sp2%" + ], + "immunities": [ + "%stun%", + "%disarm%", + "%curse%", + "%muddle%" + ], + "notes": "" + }, + { + "level": 3, + "health": "11xC", + "move": 0, + "attack": 7, + "range": 3, + "special1": [ + "Summon Deep Terror", + "%attack% -3 %boss-aoe-sightless-eye-sp1%" + ], + "special2": [ + "Summon Deep Terror", + "%attack% -2 %boss-aoe-sightless-eye-sp2%" + ], + "immunities": [ + "%stun%", + "%disarm%", + "%curse%", + "%muddle%" + ], + "notes": "" + }, + { + "level": 4, + "health": "14xC", + "move": 0, + "attack": 7, + "range": 3, + "special1": [ + "Summon Deep Terror", + "%attack% -3 %boss-aoe-sightless-eye-sp1%" + ], + "special2": [ + "Summon Deep Terror", + "%attack% -2 %boss-aoe-sightless-eye-sp2%" + ], + "immunities": [ + "%stun%", + "%disarm%", + "%curse%", + "%muddle%" + ], + "notes": "" + }, + { + "level": 5, + "health": "15xC", + "move": 0, + "attack": 8, + "range": 3, + "special1": [ + "Summon Deep Terror", + "%attack% -3 %boss-aoe-sightless-eye-sp1%" + ], + "special2": [ + "Summon Deep Terror", + "%attack% -2 %boss-aoe-sightless-eye-sp2%" + ], + "immunities": [ + "%stun%", + "%disarm%", + "%curse%", + "%muddle%" + ], + "notes": "" + }, + { + "level": 6, + "health": "18xC", + "move": 0, + "attack": 8, + "range": 3, + "special1": [ + "Summon Deep Terror", + "%attack% -3 %boss-aoe-sightless-eye-sp1%" + ], + "special2": [ + "Summon Deep Terror", + "%attack% -2 %boss-aoe-sightless-eye-sp2%" + ], + "immunities": [ + "%stun%", + "%disarm%", + "%curse%", + "%muddle%" + ], + "notes": "" + }, + { + "level": 7, + "health": "20xC", + "move": 0, + "attack": 9, + "range": 3, + "special1": [ + "Summon Deep Terror", + "%attack% -3 %boss-aoe-sightless-eye-sp1%" + ], + "special2": [ + "Summon Deep Terror", + "%attack% -2 %boss-aoe-sightless-eye-sp2%" + ], + "immunities": [ + "%stun%", + "%disarm%", + "%curse%", + "%muddle%" + ], + "notes": "" + } + ] + }, + "Winged Horror": { + "level": [ + { + "level": 0, + "health": "6xC", + "move": 3, + "attack": 3, + "range": 0, + "special1": [ + "%attack% -1, Target all adjacent enemies", + "%attack% +0, %range% 3", + "Hatch eggs" + ], + "special2": [ + "Summon C eggs", + "%move% -1", + "%attack% +0" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 1, + "health": "7xC", + "move": 4, + "attack": 3, + "range": 0, + "special1": [ + "%attack% -1, Target all adjacent enemies", + "%attack% +0, %range% 3", + "Hatch eggs" + ], + "special2": [ + "Summon C eggs", + "%move% -1", + "%attack% +0" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 2, + "health": "8xC", + "move": 4, + "attack": 4, + "range": 0, + "special1": [ + "%attack% -1, Target all adjacent enemies", + "%attack% +0, %range% 3", + "Hatch eggs" + ], + "special2": [ + "Summon C eggs", + "%move% -1", + "%attack% +0" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 3, + "health": "10xC", + "move": 4, + "attack": 4, + "range": 0, + "special1": [ + "%attack% -1, Target all adjacent enemies", + "%attack% +0, %range% 3", + "Hatch eggs" + ], + "special2": [ + "Summon C eggs", + "%move% -1", + "%attack% +0" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 4, + "health": "12xC", + "move": 5, + "attack": 4, + "range": 0, + "special1": [ + "%attack% -1, Target all adjacent enemies", + "%attack% +0, %range% 3", + "Hatch eggs" + ], + "special2": [ + "Summon C eggs", + "%move% -1", + "%attack% +0" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 5, + "health": "14xC", + "move": 5, + "attack": 5, + "range": 0, + "special1": [ + "%attack% -1, Target all adjacent enemies", + "%attack% +0, %range% 3", + "Hatch eggs" + ], + "special2": [ + "Summon C eggs", + "%move% -1", + "%attack% +0" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 6, + "health": "17xC", + "move": 5, + "attack": 5, + "range": 0, + "special1": [ + "%attack% -1, Target all adjacent enemies", + "%attack% +0, %range% 3", + "Hatch eggs" + ], + "special2": [ + "Summon C eggs", + "%move% -1", + "%attack% +0" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + }, + { + "level": 7, + "health": "20xC", + "move": 5, + "attack": 5, + "range": 0, + "special1": [ + "%attack% -1, Target all adjacent enemies", + "%attack% +0, %range% 3", + "Hatch eggs" + ], + "special2": [ + "Summon C eggs", + "%move% -1", + "%attack% +0" + ], + "immunities": [ + "%disarm%", + "%poison%", + "%muddle%", + "%stun%", + "%curse%" + ], + "notes": "" + } + ] + } + } +}; diff --git a/src/scenarios.js b/src/scenarios.js index 14ba880a..d86a9f66 100644 --- a/src/scenarios.js +++ b/src/scenarios.js @@ -1,5 +1,5 @@ //special_rules should be treated with some kind of macro that recognises them and applies them when loading -SPECIAL_RULES = +export const SPECIAL_RULES = { living_corpse_two_levels_extra: { "description": "All living corpses are two levels higher than the scenario level, up to a max of 7", @@ -9,7 +9,7 @@ SPECIAL_RULES = }; -SCENARIO_DEFINITIONS = +export const SCENARIO_DEFINITIONS = [ { name: "#1 Black Barrow" , decks: [ {"name": "Bandit Guard", "deck_name": "Guard"} @@ -295,7 +295,7 @@ SCENARIO_DEFINITIONS = , {"name": "Earth Demon"} , {"name": "Wind Demon"} , {"name": "City Archer"} - , {"name": "City Guard"} + , {"name": "City Guard"} , {"name": "Boss: Captain of the Guard"} ] }, diff --git a/src/ui.js b/src/ui.js index 015f0b4e..07d26636 100644 --- a/src/ui.js +++ b/src/ui.js @@ -1,59 +1,59 @@ function activate_tab(tabs, pages, activetab) { - var key; - for (key in tabs) + for (let key in tabs) { tabs[key].className = (key === activetab) ? "" : "inactive"; } - for (key in pages) + for (let key in pages) { pages[key].className = (key === activetab) ? "tabbody" : "inactive tabbody"; } } -function show_settingspane(pane, cancelarea, show) +export function show_settingspane(pane, cancelarea, show) { pane.className = show ? "pane" : "pane inactive"; cancelarea.style.display = show ? "initial" : "none"; } +export const widgets = {} + export function init_ui() { - var tabs = + const tabs = { scenarios: document.getElementById("scenariotab"), decks: document.getElementById("deckstab") }; - var pages = + const pages = { scenarios: document.getElementById("scenariospage"), decks: document.getElementById("deckspage") }; - var settingspane = document.getElementById("settingspane"); - var settingsbtn = document.getElementById("settingsbtn"); - var cancelarea = document.getElementById("cancelarea"); + widgets.settingspane = document.getElementById("settingspane"); + widgets.settingsbtn = document.getElementById("settingsbtn"); + widgets.cancelarea = document.getElementById("cancelarea"); - scenariotab.onclick = function(e) + tabs.scenarios.onclick = function() { activate_tab(tabs, pages, "scenarios"); } - deckstab.onclick = function(e) + tabs.decks.onclick = function() { activate_tab(tabs, pages, "decks"); } - settingsbtn.onclick = function(e) + widgets.settingsbtn.onclick = function() { - show_settingspane(settingspane, cancelarea, true); + show_settingspane(widgets.settingspane, widgets.cancelarea, true); } - cancelarea.onclick = function(e) + widgets.cancelarea.onclick = function() { - show_settingspane(settingspane, cancelarea, false); + show_settingspane(widgets.settingspane, widgets.cancelarea, false); } activate_tab(tabs, pages, "scenarios"); - } diff --git a/src/util.js b/src/util.js index a92fdbb0..e4ab8ea8 100644 --- a/src/util.js +++ b/src/util.js @@ -1,106 +1,114 @@ - -function shuffle_list(l) -{ - for (var i = 0; i < l.length-1; i++) - { - // Based on https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Implementation_errors - var switch_index = i + Math.floor(Math.random() * (l.length - i)); - var tmp = l[switch_index]; - l[switch_index] = l[i]; - l[i] = tmp; - } -} - -function toggle_class(element, class_name, enable_class) -{ - if (enable_class) - { - element.classList.add(class_name); - } - else - { - element.classList.remove(class_name); - } -} - -function remove_child(myNode) -{ - while (myNode.firstChild) - { - myNode.removeChild(myNode.firstChild); - } -} - -function create_input(type, name, value, text) -{ - var input = document.createElement("input"); - input.type = type; - input.name = name; - input.value = value; - - var textnode = document.createTextNode(text); - - var label = document.createElement("label"); - label.appendChild(input); - label.appendChild(textnode); - - return {'root': label, 'input': input}; -} - -function create_button(type, id, value) -{ - var button = document.createElement("input"); - button.type = type; - button.id = id; - button.value = value; - - return button; -} - -function dict_values(dict) -{ - var values = []; - for (key in dict) { - values.push(dict[key]); - } - - return values; -} - -function concat_arrays(arrays) -{ - return Array.prototype.concat.apply([], arrays); -} - -function is_checked(input) -{ - return (('checked' in input) ? input.checked : false); -} - -function input_value(input) -{ - return (('value' in input) ? input.value : ''); -} - -function remove_empty_strings(array) -{ - return array.filter(Boolean); -} - -function write_to_storage(name, value) { - try { localStorage.setItem(name, value); } catch (e) { console.error('Local storage is required'); return; } - // console.info("Local storage write:", name, value); -} - -function get_from_storage(name) { - try { return localStorage.getItem(name); } catch (e) { console.error('Local storage is required'); return; } -} - -function find_in_discard(discard, id) { - for (var i=0; i < discard.length; i++) { - if (discard[i].id === id) { - return discard[i]; - } - } - return null; -} + +export function shuffle_list(l) +{ + for (let i = 0; i < l.length-1; i++) + { + // Based on https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Implementation_errors + const switch_index = i + Math.floor(Math.random() * (l.length - i)); + const tmp = l[switch_index]; + l[switch_index] = l[i]; + l[i] = tmp; + } +} + +export function toggle_class(element, class_name, enable_class) +{ + if (enable_class) + { + element.classList.add(class_name); + } + else + { + element.classList.remove(class_name); + } +} + +export function remove_child(myNode) +{ + while (myNode.firstChild) + { + myNode.removeChild(myNode.firstChild); + } +} + +export function create_input(type, name, value, text) +{ + const input = document.createElement("input"); + input.type = type; + input.name = name; + input.value = value; + + const textnode = document.createTextNode(text); + + const label = document.createElement("label"); + label.appendChild(input); + label.appendChild(textnode); + + return {'root': label, 'input': input}; +} + +export function create_button(type, id, value) +{ + const button = document.createElement("input"); + button.type = type; + button.id = id; + button.value = value; + + return button; +} + +export function dict_values(dict) +{ + const values = []; + for (let key in dict) { + values.push(dict[key]); + } + + return values; +} + +export function concat_arrays(arrays) +{ + return Array.prototype.concat.apply([], arrays); +} + +export function is_checked(input) +{ + return (('checked' in input) ? input.checked : false); +} + +export function input_value(input) +{ + return (('value' in input) ? input.value : ''); +} + +export function remove_empty_strings(array) +{ + return array.filter(Boolean); +} + +export function write_to_storage(name, value) { + try { + localStorage.setItem(name, value); + } catch (e) { + console.error('Local storage is required'); + } + // console.info("Local storage write:", name, value); +} + +export function get_from_storage(name) { + try { + return localStorage.getItem(name); + } catch (e) { + console.error('Local storage is required'); + } +} + +export function find_in_discard(discard, id) { + for (let i=0; i < discard.length; i++) { + if (discard[i].id === id) { + return discard[i]; + } + } + return null; +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..035dae3a --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,13 @@ +const path = require('path'); + +module.exports = { + entry: './src/index.js', + output: { + filename: 'main.js', + path: path.resolve(__dirname, 'dist'), + }, + + devServer: { + disableHostCheck: true + } +}; From 7f025f4f63ffebfd0ea0ee64dd4fe86ff9dc4ed8 Mon Sep 17 00:00:00 2001 From: William Makley Date: Wed, 16 Oct 2019 19:09:46 -0400 Subject: [PATCH 18/23] set license to MIT (for what it's worth) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6ad6ce00..d2a2c38a 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "Gloomhaven" ], "author": "William Makley", - "license": "ISC", + "license": "MIT", "bugs": { "url": "https://github.com/wmakley/gloomycompanion/issues" }, From 70cd07e67e0a3609b61dc92e07268b80ed82ca82 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sun, 20 Oct 2019 19:58:28 -0400 Subject: [PATCH 19/23] allow serving index.html via webpack-dev-server --- webpack.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webpack.config.js b/webpack.config.js index 035dae3a..7018f2e6 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -8,6 +8,7 @@ module.exports = { }, devServer: { - disableHostCheck: true + disableHostCheck: true, + contentBase: './dist' } }; From 32779df89d732aaa9d36c069f36e0aee88eda429 Mon Sep 17 00:00:00 2001 From: William Makley Date: Thu, 24 Oct 2019 20:41:45 -0400 Subject: [PATCH 20/23] fix image references --- src/macros.js | 90 +++++++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/src/macros.js b/src/macros.js index fc802e2a..d449f0b7 100644 --- a/src/macros.js +++ b/src/macros.js @@ -1,50 +1,50 @@ /* Macros used in card text, alphabetical order */ const MACROS = - { "%air%": "" - , "%any%": "" - , "%aoe-4-with-black%": "" - , "%aoe-circle%": "
      " - , "%aoe-circle-with-middle-black%": "
      " - , "%aoe-circle-with-side-black%": "" - , "%aoe-line-3-with-black%": "
      " - , "%aoe-line-4-with-black%": "
      " - , "%aoe-line-6-with-black%": "" - , "%aoe-triangle-2-side%": "
      " - , "%aoe-triangle-2-side-with-black%": "
      " - , "%aoe-triangle-3-side-with-corner-black%": "
      " - , "%attack%": "Attack " - , "%bless%": "BLESS " - , "%boss-aoe-elder-drake-sp1%": "
      " - , "%boss-aoe-inox-bodyguard-sp1%": "
      " - , "%boss-aoe-sightless-eye-sp1%": "
      " - , "%boss-aoe-sightless-eye-sp2%": "
      " - , "%curse%": "CURSE " - , "%dark%": "" - , "%disarm%": "DISARM " - , "%earth%": "" - , "%fire%": "" - , "%heal%": "Heal " - , "%ice%": "" - , "%immobilize%": "IMMOBILIZE " - , "%invisible%": "INVISIBLE " - , "%jump%": "Jump " - , "%light%": "" - , "%loot%": "Loot " - , "%move%": "Move " - , "%muddle%": "MUDDLE " - , "%pierce%": "PIERCE " - , "%poison%": "POISON " - , "%pull%": "PULL " - , "%push%": "PUSH " - , "%range%": "Range " - , "%retaliate%": "Retaliate " - , "%shield%": "Shield " - , "%flying%": "" - , "%strengthen%": "STRENGTHEN " - , "%stun%": "STUN " - , "%target%": "Target " - , "%use_element%": "" - , "%wound%": "WOUND " + { "%air%": "" + , "%any%": "" + , "%aoe-4-with-black%": "" + , "%aoe-circle%": "
      " + , "%aoe-circle-with-middle-black%": "
      " + , "%aoe-circle-with-side-black%": "" + , "%aoe-line-3-with-black%": "
      " + , "%aoe-line-4-with-black%": "
      " + , "%aoe-line-6-with-black%": "" + , "%aoe-triangle-2-side%": "
      " + , "%aoe-triangle-2-side-with-black%": "
      " + , "%aoe-triangle-3-side-with-corner-black%": "
      " + , "%attack%": "Attack " + , "%bless%": "BLESS " + , "%boss-aoe-elder-drake-sp1%": "
      " + , "%boss-aoe-inox-bodyguard-sp1%": "
      " + , "%boss-aoe-sightless-eye-sp1%": "
      " + , "%boss-aoe-sightless-eye-sp2%": "
      " + , "%curse%": "CURSE " + , "%dark%": "" + , "%disarm%": "DISARM " + , "%earth%": "" + , "%fire%": "" + , "%heal%": "Heal " + , "%ice%": "" + , "%immobilize%": "IMMOBILIZE " + , "%invisible%": "INVISIBLE " + , "%jump%": "Jump " + , "%light%": "" + , "%loot%": "Loot " + , "%move%": "Move " + , "%muddle%": "MUDDLE " + , "%pierce%": "PIERCE " + , "%poison%": "POISON " + , "%pull%": "PULL " + , "%push%": "PUSH " + , "%range%": "Range " + , "%retaliate%": "Retaliate " + , "%shield%": "Shield " + , "%flying%": "" + , "%strengthen%": "STRENGTHEN " + , "%stun%": "STUN " + , "%target%": "Target " + , "%use_element%": "" + , "%wound%": "WOUND " }; function expand_macro(macro) From 4219e8131c5544a2d4377c80c041f8e4f67243ab Mon Sep 17 00:00:00 2001 From: William Makley Date: Thu, 24 Oct 2019 21:06:45 -0400 Subject: [PATCH 21/23] attempt to improve PWA features and add a service worker --- .gitignore | 1 - README.md | 5 ++- dist/app.webmanifest | 12 ------- dist/index.html | 5 +-- dist/main.js | 2 +- dist/manifest.json | 19 ++++++++++ dist/service-worker.js | 79 ++++++++++++++++++++++++++++++++++++++++++ gen-manifest.sh | 18 ---------- src/index.js | 7 ++++ webpack.config.js | 2 +- 10 files changed, 112 insertions(+), 38 deletions(-) delete mode 100644 dist/app.webmanifest create mode 100644 dist/manifest.json create mode 100644 dist/service-worker.js delete mode 100755 gen-manifest.sh diff --git a/.gitignore b/.gitignore index da2be57a..77cb8737 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ _config.yml -app.manifest web.config .idea node_modules diff --git a/README.md b/README.md index c1a93724..ef475b72 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,5 @@ A single `*` means a top-level action. Double asterisk `**` means it modifies th ## Development * Clone the repository -* Run the [`gen-manifest.sh`](gen-manifest.sh) script (Linux and MacOS only; you'll have to make the `app.manifest` by hand if you are running Windows) - -Any time a source/asset file is added or removed, re-run the above manifest generation script. Or manually make the appropriate change to the manifest instead. +* `npm ci` +* `npm run dev-server` diff --git a/dist/app.webmanifest b/dist/app.webmanifest deleted file mode 100644 index 1687628c..00000000 --- a/dist/app.webmanifest +++ /dev/null @@ -1,12 +0,0 @@ -{ - "start_url": "index.html", - "display": "standalone", - "icons": [ - { - "src": "images/icon.png", - "sizes": "192x192", - "type": "image/png" - } - ] -} - diff --git a/dist/index.html b/dist/index.html index 97f69af5..19657244 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1,10 +1,10 @@ - + Gloomy Companion - + @@ -13,6 +13,7 @@ + diff --git a/dist/main.js b/dist/main.js index 9ddce782..0c87e9cc 100644 --- a/dist/main.js +++ b/dist/main.js @@ -1 +1 @@ -!function(e){var a={};function t(n){if(a[n])return a[n].exports;var l=a[n]={i:n,l:!1,exports:{}};return e[n].call(l.exports,l,l.exports,t),l.l=!0,l.exports}t.m=e,t.c=a,t.d=function(e,a,n){t.o(e,a)||Object.defineProperty(e,a,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,a){if(1&a&&(e=t(e)),8&a)return e;if(4&a&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&a&&"string"!=typeof e)for(var l in e)t.d(n,l,function(a){return e[a]}.bind(null,l));return n},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)},t.p="",t(t.s=0)}([function(e,a,t){"use strict";t.r(a);const n={"Ancient Artillery":{name:"Ancient Artillery",class:"Ancient Artillery"},"Bandit Archer":{name:"Bandit Archer",class:"Archer"},"Bandit Guard":{name:"Bandit Guard",class:"Guard"},"Black Imp":{name:"Black Imp",class:"Imp"},Boss:{name:"Boss",class:"Boss"},"Cave Bear":{name:"Cave Bear",class:"Cave Bear"},"City Archer":{name:"City Archer",class:"Archer"},"City Guard":{name:"City Guard",class:"Guard"},Cultist:{name:"Cultist",class:"Cultist"},"Deep Terror":{name:"Deep Terror",class:"Deep Terror"},"Earth Demon":{name:"Earth Demon",class:"Earth Demon"},"Flame Demon":{name:"Flame Demon",class:"Flame Demon"},"Forest Imp":{name:"Forest Imp",class:"Imp"},"Frost Demon":{name:"Frost Demon",class:"Frost Demon"},"Giant Viper":{name:"Giant Viper",class:"Giant Viper"},"Harrower Infester":{name:"Harrower Infester",class:"Harrower Infester"},Hound:{name:"Hound",class:"Hound"},"Inox Archer":{name:"Inox Archer",class:"Archer"},"Inox Guard":{name:"Inox Guard",class:"Guard"},"Inox Shaman":{name:"Inox Shaman",class:"Shaman"},"Living Bones":{name:"Living Bones",class:"Living Bones"},"Living Corpse":{name:"Living Corpse",class:"Living Corpse"},"Living Spirit":{name:"Living Spirit",class:"Living Spirit"},Lurker:{name:"Lurker",class:"Lurker"},"Night Demon":{name:"Night Demon",class:"Night Demon"},Ooze:{name:"Ooze",class:"Ooze"},"Rending Drake":{name:"Rending Drake",class:"Rending Drake"},"Savvas Icestorm":{name:"Savvas Icestorm",class:"Savvas Icestorm"},"Savvas Lavaflow":{name:"Savvas Lavaflow",class:"Savvas Lavaflow"},"Spitting Drake":{name:"Spitting Drake",class:"Spitting Drake"},"Stone Golem":{name:"Stone Golem",class:"Stone Golem"},"Sun Demon":{name:"Sun Demon",class:"Sun Demon"},"Vermling Scout":{name:"Vermling Scout",class:"Scout"},"Vermling Shaman":{name:"Vermling Shaman",class:"Shaman"},"Wind Demon":{name:"Wind Demon",class:"Wind Demon"}},l={BLESS:"bless",CURSE:"curse",PLUS0:"plus0",PLUS1:"plus1",PLUS2:"plus2",MINUS1:"minus1",MINUS2:"minus2",NULL:"null",DOUBLE:"double"},i={BLESS:{type:l.BLESS,shuffle:!1,image:"images/attack_mod_bless.jpg"},CURSE:{type:l.CURSE,shuffle:!1,image:"images/attack_mod_curse.jpg"},PLUS0:{type:l.PLUS0,shuffle:!1,image:"images/attack_mod_+0.jpg"},PLUS1:{type:l.PLUS1,shuffle:!1,image:"images/attack_mod_+1.jpg"},PLUS2:{type:l.PLUS2,shuffle:!1,image:"images/attack_mod_+2.jpg"},MINUS1:{type:l.MINUS1,shuffle:!1,image:"images/attack_mod_-1.jpg"},MINUS2:{type:l.MINUS2,shuffle:!1,image:"images/attack_mod_-2.jpg"},NULL:{type:l.NULL,shuffle:!0,image:"images/attack_mod_null.jpg"},DOUBLE:{type:l.DOUBLE,shuffle:!0,image:"images/attack_mod_2x.jpg"}},s=[i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS1,i.PLUS1,i.PLUS1,i.PLUS1,i.PLUS1,i.MINUS1,i.MINUS1,i.MINUS1,i.MINUS1,i.MINUS1,i.PLUS2,i.MINUS2,i.NULL,i.DOUBLE],r={monsters:{"Ancient Artillery":{level:[{level:0,normal:{health:4,move:0,attack:2,range:4,attributes:[]},elite:{health:7,move:0,attack:3,range:5,attributes:[]}},{level:1,normal:{health:6,move:0,attack:2,range:4,attributes:[]},elite:{health:9,move:0,attack:3,range:5,attributes:[]}},{level:2,normal:{health:7,move:0,attack:2,range:5,attributes:[]},elite:{health:11,move:0,attack:3,range:6,attributes:[]}},{level:3,normal:{health:8,move:0,attack:3,range:5,attributes:[]},elite:{health:13,move:0,attack:4,range:6,attributes:[]}},{level:4,normal:{health:9,move:0,attack:4,range:5,attributes:[]},elite:{health:13,move:0,attack:4,range:6,attributes:["%target% 2"]}},{level:5,normal:{health:11,move:0,attack:4,range:6,attributes:[]},elite:{health:15,move:0,attack:4,range:7,attributes:["%target% 2"]}},{level:6,normal:{health:14,move:0,attack:4,range:6,attributes:[]},elite:{health:16,move:0,attack:5,range:7,attributes:["%target% 2"]}},{level:7,normal:{health:16,move:0,attack:4,range:7,attributes:[]},elite:{health:20,move:0,attack:5,range:7,attributes:["%target% 2"]}}]},"Bandit Archer":{level:[{level:0,normal:{health:4,move:2,attack:2,range:3,attributes:[]},elite:{health:6,move:2,attack:3,range:3,attributes:[]}},{level:1,normal:{health:5,move:2,attack:2,range:4,attributes:[]},elite:{health:7,move:2,attack:3,range:5,attributes:[]}},{level:2,normal:{health:6,move:3,attack:2,range:4,attributes:[]},elite:{health:9,move:3,attack:3,range:5,attributes:[]}},{level:3,normal:{health:6,move:3,attack:3,range:4,attributes:[]},elite:{health:10,move:3,attack:4,range:5,attributes:[]}},{level:4,normal:{health:8,move:3,attack:3,range:4,attributes:[]},elite:{health:10,move:3,attack:4,range:6,attributes:["%poison%"]}},{level:5,normal:{health:10,move:3,attack:3,range:5,attributes:[]},elite:{health:12,move:4,attack:4,range:6,attributes:["%poison%"]}},{level:6,normal:{health:10,move:3,attack:4,range:5,attributes:[]},elite:{health:13,move:4,attack:5,range:6,attributes:["%poison%"]}},{level:7,normal:{health:13,move:3,attack:4,range:5,attributes:[]},elite:{health:17,move:4,attack:5,range:6,attributes:["%poison%"]}}]},"Bandit Guard":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:[]},elite:{health:9,move:2,attack:3,range:0,attributes:[]}},{level:1,normal:{health:6,move:3,attack:2,range:0,attributes:[]},elite:{health:9,move:2,attack:3,range:0,attributes:["%shield% 1"]}},{level:2,normal:{health:6,move:3,attack:3,range:0,attributes:[]},elite:{health:10,move:2,attack:4,range:0,attributes:["%shield% 1"]}},{level:3,normal:{health:9,move:3,attack:3,range:0,attributes:[]},elite:{health:10,move:3,attack:4,range:0,attributes:["%shield% 2"]}},{level:4,normal:{health:10,move:4,attack:3,range:0,attributes:[]},elite:{health:11,move:3,attack:4,range:0,attributes:["%muddle%","%shield% 2"]}},{level:5,normal:{health:11,move:4,attack:4,range:0,attributes:[]},elite:{health:12,move:3,attack:5,range:0,attributes:["%muddle%","%shield% 2"]}},{level:6,normal:{health:14,move:4,attack:4,range:0,attributes:[]},elite:{health:14,move:4,attack:5,range:0,attributes:["%muddle%","%shield% 2"]}},{level:7,normal:{health:16,move:5,attack:4,range:0,attributes:[]},elite:{health:14,move:3,attack:5,range:0,attributes:["%muddle%","%shield% 3"]}}]},"Black Imp":{level:[{level:0,normal:{health:3,move:1,attack:1,range:3,attributes:[]},elite:{health:4,move:1,attack:2,range:3,attributes:["%poison%"]}},{level:1,normal:{health:4,move:1,attack:1,range:3,attributes:["%poison%"]},elite:{health:6,move:1,attack:2,range:3,attributes:["%poison%"]}},{level:2,normal:{health:5,move:1,attack:1,range:4,attributes:["%poison%"]},elite:{health:8,move:1,attack:2,range:4,attributes:["%poison%"]}},{level:3,normal:{health:5,move:1,attack:2,range:4,attributes:["%poison%"]},elite:{health:8,move:1,attack:3,range:4,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:4,normal:{health:7,move:1,attack:2,range:4,attributes:["%poison%"]},elite:{health:11,move:1,attack:3,range:4,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:5,normal:{health:9,move:1,attack:2,range:4,attributes:["%poison%"]},elite:{health:12,move:1,attack:3,range:5,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:6,normal:{health:10,move:1,attack:3,range:4,attributes:["%poison%"]},elite:{health:14,move:1,attack:4,range:5,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:7,normal:{health:12,move:1,attack:3,range:4,attributes:["%poison%"]},elite:{health:17,move:1,attack:4,range:5,attributes:["Attackers gain Disadvantage","%poison%"]}}]},"Cave Bear":{level:[{level:0,normal:{health:7,move:3,attack:3,range:0,attributes:[]},elite:{health:11,move:3,attack:4,range:0,attributes:[]}},{level:1,normal:{health:9,move:3,attack:3,range:0,attributes:[]},elite:{health:14,move:3,attack:4,range:0,attributes:[]}},{level:2,normal:{health:11,move:4,attack:3,range:0,attributes:[]},elite:{health:17,move:4,attack:4,range:0,attributes:[]}},{level:3,normal:{health:13,move:4,attack:4,range:0,attributes:[]},elite:{health:20,move:4,attack:5,range:0,attributes:[]}},{level:4,normal:{health:16,move:4,attack:4,range:0,attributes:[]},elite:{health:21,move:5,attack:5,range:0,attributes:["%wound%"]}},{level:5,normal:{health:17,move:5,attack:4,range:0,attributes:["%wound%"]},elite:{health:24,move:5,attack:6,range:0,attributes:["%wound%"]}},{level:6,normal:{health:19,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:28,move:5,attack:7,range:0,attributes:["%wound%"]}},{level:7,normal:{health:22,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:33,move:5,attack:7,range:0,attributes:["%wound%"]}}]},"City Archer":{level:[{level:0,normal:{health:4,move:1,attack:2,range:3,attributes:[]},elite:{health:6,move:1,attack:3,range:4,attributes:[]}},{level:1,normal:{health:5,move:1,attack:2,range:4,attributes:[]},elite:{health:6,move:1,attack:3,range:5,attributes:["%pierce% 1","%shield% 1"]}},{level:2,normal:{health:6,move:1,attack:3,range:4,attributes:[]},elite:{health:7,move:1,attack:4,range:5,attributes:["%pierce% 2","%shield% 1"]}},{level:3,normal:{health:6,move:2,attack:3,range:4,attributes:["%shield% 1"]},elite:{health:8,move:2,attack:4,range:5,attributes:["%pierce% 2","%shield% 2"]}},{level:4,normal:{health:8,move:2,attack:3,range:5,attributes:["%shield% 1"]},elite:{health:10,move:2,attack:4,range:6,attributes:["%pierce% 2","%shield% 2"]}},{level:5,normal:{health:9,move:2,attack:4,range:5,attributes:["%shield% 1"]},elite:{health:11,move:2,attack:5,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:6,normal:{health:9,move:3,attack:4,range:5,attributes:["%shield% 2"]},elite:{health:12,move:3,attack:6,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:7,normal:{health:10,move:3,attack:4,range:6,attributes:["%shield% 2"]},elite:{health:13,move:3,attack:6,range:7,attributes:["%pierce% 3","%shield% 3"]}}]},"City Guard":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:[]},elite:{health:6,move:2,attack:3,range:0,attributes:["%shield% 1"]}},{level:1,normal:{health:5,move:2,attack:2,range:0,attributes:["%shield% 1"]},elite:{health:6,move:2,attack:3,range:0,attributes:["%shield% 2"]}},{level:2,normal:{health:7,move:2,attack:2,range:0,attributes:["%shield% 1"]},elite:{health:9,move:2,attack:3,range:0,attributes:["%shield% 2"]}},{level:3,normal:{health:8,move:2,attack:3,range:0,attributes:["%shield% 1"]},elite:{health:9,move:2,attack:4,range:0,attributes:["%retaliate% 1","%shield% 2"]}},{level:4,normal:{health:9,move:3,attack:3,range:0,attributes:["%shield% 1"]},elite:{health:10,move:3,attack:4,range:0,attributes:["%retaliate% 2","%shield% 2"]}},{level:5,normal:{health:10,move:3,attack:3,range:0,attributes:["%shield% 2"]},elite:{health:12,move:3,attack:4,range:0,attributes:["%retaliate% 2","%shield% 3"]}},{level:6,normal:{health:11,move:3,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:13,move:3,attack:5,range:0,attributes:["%retaliate% 3","%shield% 3"]}},{level:7,normal:{health:13,move:3,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:14,move:3,attack:6,range:0,attributes:["%retaliate% 3","%shield% 3"]}}]},Cultist:{level:[{level:0,normal:{health:4,move:2,attack:1,range:0,attributes:[]},elite:{health:7,move:2,attack:2,range:0,attributes:[]}},{level:1,normal:{health:5,move:2,attack:1,range:0,attributes:[]},elite:{health:9,move:2,attack:2,range:0,attributes:[]}},{level:2,normal:{health:7,move:2,attack:1,range:0,attributes:[]},elite:{health:12,move:2,attack:2,range:0,attributes:[]}},{level:3,normal:{health:9,move:3,attack:1,range:0,attributes:[]},elite:{health:13,move:3,attack:2,range:0,attributes:["%curse%"]}},{level:4,normal:{health:10,move:3,attack:2,range:0,attributes:[]},elite:{health:15,move:3,attack:3,range:0,attributes:["%curse%"]}},{level:5,normal:{health:11,move:3,attack:2,range:0,attributes:["%curse%"]},elite:{health:18,move:3,attack:3,range:0,attributes:["%curse%"]}},{level:6,normal:{health:14,move:3,attack:2,range:0,attributes:["%curse%"]},elite:{health:22,move:3,attack:3,range:0,attributes:["%curse%"]}},{level:7,normal:{health:15,move:3,attack:3,range:0,attributes:["%curse%"]},elite:{health:25,move:3,attack:4,range:0,attributes:["%curse%"]}}]},"Deep Terror":{level:[{level:0,normal:{health:3,move:0,attack:2,range:0,attributes:[]},elite:{health:5,move:0,attack:3,range:0,attributes:[]}},{level:1,normal:{health:4,move:0,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:6,move:0,attack:3,range:0,attributes:["%retaliate% 1"]}},{level:2,normal:{health:4,move:0,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:7,move:0,attack:4,range:0,attributes:["%retaliate% 1"]}},{level:3,normal:{health:5,move:0,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:8,move:0,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:4,normal:{health:6,move:0,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:9,move:0,attack:5,range:0,attributes:["%retaliate% 2"]}},{level:5,normal:{health:7,move:0,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:11,move:0,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:8,move:0,attack:5,range:0,attributes:["%retaliate% 3"]},elite:{health:13,move:0,attack:6,range:0,attributes:["%retaliate% 3"]}},{level:7,normal:{health:9,move:0,attack:5,range:0,attributes:["%retaliate% 4"]},elite:{health:15,move:0,attack:6,range:0,attributes:["%retaliate% 4"]}}]},"Earth Demon":{level:[{level:0,normal:{health:7,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:2,attack:4,range:0,attributes:[]}},{level:1,normal:{health:9,move:1,attack:3,range:0,attributes:[]},elite:{health:13,move:2,attack:4,range:0,attributes:[]}},{level:2,normal:{health:12,move:1,attack:3,range:0,attributes:[]},elite:{health:18,move:2,attack:4,range:0,attributes:[]}},{level:3,normal:{health:13,move:2,attack:3,range:0,attributes:[]},elite:{health:20,move:2,attack:4,range:0,attributes:["%immobilize%"]}},{level:4,normal:{health:15,move:2,attack:4,range:0,attributes:[]},elite:{health:21,move:3,attack:5,range:0,attributes:["%immobilize%"]}},{level:5,normal:{health:17,move:2,attack:4,range:0,attributes:["%immobilize%"]},elite:{health:25,move:3,attack:5,range:0,attributes:["%immobilize%"]}},{level:6,normal:{health:20,move:2,attack:4,range:0,attributes:["%immobilize%"]},elite:{health:27,move:3,attack:6,range:0,attributes:["%immobilize%"]}},{level:7,normal:{health:22,move:3,attack:4,range:0,attributes:["%immobilize%"]},elite:{health:32,move:3,attack:6,range:0,attributes:["%immobilize%"]}}]},"Flame Demon":{level:[{level:0,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:3,move:3,attack:2,range:3,attributes:["%flying%","%shield% 3"]}},{level:1,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 3"]},elite:{health:3,move:3,attack:2,range:4,attributes:["%flying%","%retaliate% 2: %range% 2","%shield% 4"]}},{level:2,normal:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 3"]},elite:{health:4,move:3,attack:3,range:4,attributes:["%flying%","%retaliate% 3: %range% 2","%shield% 4"]}},{level:3,normal:{health:3,move:3,attack:3,range:4,attributes:["%flying%","%retaliate% 2: %range% 2","%shield% 3"]},elite:{health:5,move:3,attack:3,range:5,attributes:["%flying%","%retaliate% 3: %range% 3","%shield% 4"]}},{level:4,normal:{health:3,move:4,attack:3,range:4,attributes:["%flying%","%retaliate% 3: %range% 2","%shield% 3"]},elite:{health:5,move:4,attack:4,range:5,attributes:["%flying%","%retaliate% 4: %range% 3","%shield% 4"]}},{level:5,normal:{health:4,move:4,attack:3,range:4,attributes:["%flying%","%retaliate% 3: %range% 2","%shield% 4"]},elite:{health:6,move:4,attack:4,range:5,attributes:["%flying%","%retaliate% 4: %range% 3","%shield% 5"]}},{level:6,normal:{health:4,move:4,attack:4,range:4,attributes:["%flying%","%retaliate% 4: %range% 2","%shield% 4"]},elite:{health:7,move:4,attack:5,range:5,attributes:["%flying%","%retaliate% 5: %range% 3","%shield% 5"]}},{level:7,normal:{health:5,move:4,attack:4,range:5,attributes:["%flying%","%retaliate% 4: %range% 3","%shield% 4"]},elite:{health:8,move:4,attack:5,range:6,attributes:["%flying%","%retaliate% 5: %range% 4","%shield% 5"]}}]},"Frost Demon":{level:[{level:0,normal:{health:5,move:2,attack:3,range:0,attributes:[]},elite:{health:10,move:3,attack:3,range:0,attributes:[]}},{level:1,normal:{health:6,move:2,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:10,move:3,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:7,move:3,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:12,move:4,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:8,move:3,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:14,move:4,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:4,normal:{health:10,move:3,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:18,move:4,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:5,normal:{health:11,move:3,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:20,move:4,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:12,move:3,attack:5,range:0,attributes:["%retaliate% 3"]},elite:{health:22,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:7,normal:{health:14,move:3,attack:5,range:0,attributes:["%retaliate% 3"]},elite:{health:25,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}}]},"Forest Imp":{level:[{level:0,normal:{health:1,move:3,attack:1,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:4,move:3,attack:1,range:3,attributes:["%flying%","%shield% 1"]}},{level:1,normal:{health:2,move:3,attack:1,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:5,move:3,attack:2,range:3,attributes:["%flying%","%shield% 1"]}},{level:2,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:6,move:3,attack:2,range:3,attributes:["%flying%","%curse%","%shield% 1"]}},{level:3,normal:{health:3,move:4,attack:2,range:4,attributes:["%flying%","%shield% 1"]},elite:{health:7,move:4,attack:2,range:4,attributes:["%flying%","%curse%","%shield% 1"]}},{level:4,normal:{health:3,move:4,attack:2,range:4,attributes:["%flying%","%shield% 2"]},elite:{health:7,move:4,attack:2,range:4,attributes:["%flying%","%curse%","%shield% 2"]}},{level:5,normal:{health:4,move:4,attack:2,range:4,attributes:["%flying%","%curse%","%shield% 2"]},elite:{health:8,move:4,attack:3,range:4,attributes:["%flying%","%curse%","%shield% 2"]}},{level:6,normal:{health:4,move:4,attack:3,range:4,attributes:["%flying%","%curse%","%shield% 2"]},elite:{health:9,move:4,attack:4,range:4,attributes:["%flying%","%curse%","%shield% 2"]}},{level:7,normal:{health:6,move:4,attack:3,range:4,attributes:["%flying%","%curse%","%shield% 2"]},elite:{health:11,move:4,attack:4,range:4,attributes:["%flying%","%curse%","%shield% 2"]}}]},"Giant Viper":{level:[{level:0,normal:{health:2,move:2,attack:1,range:0,attributes:["%poison%"]},elite:{health:3,move:2,attack:2,range:0,attributes:["%poison%"]}},{level:1,normal:{health:3,move:2,attack:1,range:0,attributes:["%poison%"]},elite:{health:5,move:2,attack:2,range:0,attributes:["%poison%"]}},{level:2,normal:{health:4,move:3,attack:1,range:0,attributes:["%poison%"]},elite:{health:7,move:3,attack:2,range:0,attributes:["%poison%"]}},{level:3,normal:{health:4,move:3,attack:2,range:0,attributes:["%poison%"]},elite:{health:8,move:3,attack:3,range:0,attributes:["%poison%"]}},{level:4,normal:{health:6,move:3,attack:2,range:0,attributes:["%poison%"]},elite:{health:11,move:3,attack:3,range:0,attributes:["%poison%"]}},{level:5,normal:{health:7,move:3,attack:3,range:0,attributes:["%poison%"]},elite:{health:13,move:4,attack:3,range:0,attributes:["%poison%"]}},{level:6,normal:{health:8,move:4,attack:3,range:0,attributes:["%poison%"]},elite:{health:14,move:4,attack:4,range:0,attributes:["%poison%"]}},{level:7,normal:{health:10,move:4,attack:3,range:0,attributes:["%poison%"]},elite:{health:17,move:4,attack:4,range:0,attributes:["%poison%"]}}]},"Harrower Infester":{level:[{level:0,normal:{health:6,move:2,attack:2,range:0,attributes:[]},elite:{health:12,move:2,attack:2,range:0,attributes:[]}},{level:1,normal:{health:7,move:2,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:12,move:3,attack:2,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:8,move:2,attack:2,range:0,attributes:["%retaliate% 2"]},elite:{health:14,move:3,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:10,move:2,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:17,move:3,attack:3,range:0,attributes:["%retaliate% 3"]}},{level:4,normal:{health:12,move:3,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:19,move:3,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:5,normal:{health:12,move:3,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:21,move:3,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:15,move:3,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:22,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:7,normal:{health:17,move:3,attack:4,range:0,attributes:["%retaliate% 4"]},elite:{health:26,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}}]},Hound:{level:[{level:0,normal:{health:4,move:3,attack:2,range:0,attributes:[]},elite:{health:6,move:5,attack:2,range:0,attributes:[]}},{level:1,normal:{health:4,move:4,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:6,move:5,attack:2,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:6,move:4,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:7,move:5,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:8,move:4,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:8,move:5,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:4,normal:{health:8,move:4,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:11,move:5,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:5,normal:{health:9,move:4,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:12,move:5,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:11,move:5,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:15,move:6,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:7,normal:{health:15,move:5,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:15,move:6,attack:5,range:0,attributes:["%retaliate% 4"]}}]},"Inox Archer":{level:[{level:0,normal:{health:5,move:2,attack:2,range:2,attributes:[]},elite:{health:7,move:2,attack:3,range:3,attributes:[]}},{level:1,normal:{health:6,move:2,attack:2,range:3,attributes:[]},elite:{health:8,move:2,attack:3,range:4,attributes:[]}},{level:2,normal:{health:8,move:2,attack:2,range:3,attributes:[]},elite:{health:11,move:2,attack:3,range:4,attributes:[]}},{level:3,normal:{health:9,move:2,attack:3,range:3,attributes:[]},elite:{health:13,move:2,attack:4,range:4,attributes:[]}},{level:4,normal:{health:10,move:3,attack:3,range:3,attributes:[]},elite:{health:14,move:3,attack:4,range:4,attributes:["%wound%"]}},{level:5,normal:{health:12,move:3,attack:3,range:4,attributes:[]},elite:{health:17,move:3,attack:4,range:5,attributes:["%wound%"]}},{level:6,normal:{health:12,move:3,attack:4,range:4,attributes:["%wound%"]},elite:{health:19,move:3,attack:5,range:5,attributes:["%wound%"]}},{level:7,normal:{health:15,move:3,attack:4,range:4,attributes:["%wound%"]},elite:{health:23,move:3,attack:5,range:5,attributes:["%wound%"]}}]},"Inox Guard":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:[]},elite:{health:9,move:1,attack:3,range:0,attributes:["%retaliate% 1"]}},{level:1,normal:{health:8,move:2,attack:2,range:0,attributes:[]},elite:{health:10,move:2,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:9,move:2,attack:3,range:0,attributes:[]},elite:{health:12,move:2,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:11,move:3,attack:3,range:0,attributes:[]},elite:{health:15,move:2,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:4,normal:{health:12,move:3,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:17,move:2,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:5,normal:{health:13,move:3,attack:4,range:0,attributes:["%retaliate% 1"]},elite:{health:19,move:2,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:6,normal:{health:16,move:3,attack:4,range:0,attributes:["%retaliate% 1"]},elite:{health:21,move:3,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:7,normal:{health:19,move:3,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:23,move:3,attack:6,range:0,attributes:["%retaliate% 4"]}}]},"Inox Shaman":{level:[{level:0,normal:{health:4,move:1,attack:2,range:3,attributes:[]},elite:{health:6,move:2,attack:3,range:3,attributes:[]}},{level:1,normal:{health:6,move:1,attack:2,range:3,attributes:[]},elite:{health:9,move:2,attack:3,range:3,attributes:[]}},{level:2,normal:{health:7,move:2,attack:2,range:3,attributes:[]},elite:{health:11,move:3,attack:3,range:3,attributes:[]}},{level:3,normal:{health:9,move:2,attack:2,range:4,attributes:[]},elite:{health:14,move:3,attack:3,range:4,attributes:[]}},{level:4,normal:{health:10,move:2,attack:3,range:4,attributes:[]},elite:{health:16,move:3,attack:4,range:4,attributes:[]}},{level:5,normal:{health:13,move:2,attack:3,range:4,attributes:[]},elite:{health:20,move:3,attack:4,range:4,attributes:[]}},{level:6,normal:{health:15,move:3,attack:3,range:4,attributes:[]},elite:{health:24,move:4,attack:4,range:4,attributes:[]}},{level:7,normal:{health:16,move:3,attack:4,range:4,attributes:[]},elite:{health:27,move:4,attack:5,range:4,attributes:[]}}]},"Living Bones":{level:[{level:0,normal:{health:5,move:2,attack:1,range:0,attributes:["%target% 2"]},elite:{health:6,move:4,attack:2,range:0,attributes:["%target% 2"]}},{level:1,normal:{health:5,move:3,attack:1,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:6,move:4,attack:2,range:0,attributes:["%target% 3","%shield% 1"]}},{level:2,normal:{health:5,move:3,attack:2,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:7,move:4,attack:3,range:0,attributes:["%target% 3","%shield% 1"]}},{level:3,normal:{health:7,move:3,attack:2,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:10,move:4,attack:3,range:0,attributes:["%target% 3","%shield% 1"]}},{level:4,normal:{health:7,move:3,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:11,move:4,attack:4,range:0,attributes:["%target% 3","%shield% 1"]}},{level:5,normal:{health:9,move:3,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:11,move:4,attack:4,range:0,attributes:["%target% 3","%shield% 2"]}},{level:6,normal:{health:10,move:4,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:11,move:6,attack:4,range:0,attributes:["%target% 3","%shield% 2"]}},{level:7,normal:{health:13,move:4,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:14,move:6,attack:4,range:0,attributes:["%target% 3","%shield% 2"]}}]},"Living Corpse":{level:[{level:0,normal:{health:5,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:1,attack:3,range:0,attributes:[]}},{level:1,normal:{health:7,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:1,attack:4,range:0,attributes:[]}},{level:2,normal:{health:9,move:1,attack:3,range:0,attributes:[]},elite:{health:13,move:1,attack:4,range:0,attributes:[]}},{level:3,normal:{health:10,move:1,attack:4,range:0,attributes:[]},elite:{health:13,move:2,attack:5,range:0,attributes:[]}},{level:4,normal:{health:11,move:2,attack:4,range:0,attributes:[]},elite:{health:15,move:2,attack:5,range:0,attributes:["%poison%"]}},{level:5,normal:{health:13,move:2,attack:4,range:0,attributes:[]},elite:{health:17,move:2,attack:6,range:0,attributes:["%poison%"]}},{level:6,normal:{health:14,move:2,attack:4,range:0,attributes:["%poison%"]},elite:{health:21,move:2,attack:6,range:0,attributes:["%poison%"]}},{level:7,normal:{health:15,move:2,attack:5,range:0,attributes:["%poison%"]},elite:{health:25,move:2,attack:6,range:0,attributes:["%poison%"]}}]},"Living Spirit":{level:[{level:0,normal:{health:2,move:2,attack:2,range:2,attributes:["%flying%","%shield% 1"]},elite:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 2"]}},{level:1,normal:{health:2,move:2,attack:2,range:2,attributes:["%flying%","%shield% 2"]},elite:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 3"]}},{level:2,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:3,move:4,attack:3,range:4,attributes:["%flying%","%shield% 3"]}},{level:3,normal:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:4,move:4,attack:4,range:4,attributes:["%flying%","%shield% 3"]}},{level:4,normal:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 3"]},elite:{health:4,move:4,attack:4,range:4,attributes:["%flying%","%shield% 4"]}},{level:5,normal:{health:4,move:3,attack:3,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:6,move:4,attack:4,range:4,attributes:["%flying%","%shield% 4"]}},{level:6,normal:{health:4,move:3,attack:4,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:7,move:4,attack:5,range:5,attributes:["%flying%","%shield% 4"]}},{level:7,normal:{health:6,move:3,attack:4,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:9,move:4,attack:5,range:5,attributes:["%flying%","%shield% 4"]}}]},Lurker:{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:["%target% 2"]},elite:{health:7,move:2,attack:3,range:0,attributes:["%target% 2","%shield% 1"]}},{level:1,normal:{health:7,move:2,attack:2,range:0,attributes:["%target% 2","%pierce% 1"]},elite:{health:9,move:2,attack:3,range:0,attributes:["%target% 2","%pierce% 1","%shield% 1"]}},{level:2,normal:{health:9,move:3,attack:2,range:0,attributes:["%target% 2","%pierce% 1"]},elite:{health:12,move:3,attack:3,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]}},{level:3,normal:{health:10,move:3,attack:3,range:0,attributes:["%target% 2","%pierce% 2"]},elite:{health:14,move:3,attack:4,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]}},{level:4,normal:{health:10,move:3,attack:3,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]},elite:{health:14,move:3,attack:4,range:0,attributes:["%target% 2","%pierce% 3","%shield% 2"]}},{level:5,normal:{health:11,move:3,attack:4,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]},elite:{health:15,move:3,attack:5,range:0,attributes:["%target% 2","%pierce% 3","%shield% 2"]}},{level:6,normal:{health:12,move:4,attack:4,range:0,attributes:["%target% 2","%pierce% 3","%shield% 1"]},elite:{health:16,move:4,attack:5,range:0,attributes:["%target% 2","%pierce% 4","%shield% 2"]}},{level:7,normal:{health:14,move:4,attack:4,range:0,attributes:["%target% 2","%pierce% 3","%shield% 1"]},elite:{health:18,move:4,attack:5,range:0,attributes:["%target% 2","%pierce% 4","%shield% 2"]}}]},Ooze:{level:[{level:0,normal:{health:4,move:1,attack:2,range:2,attributes:[]},elite:{health:8,move:1,attack:2,range:3,attributes:[]}},{level:1,normal:{health:5,move:1,attack:2,range:2,attributes:["%shield% 1"]},elite:{health:9,move:1,attack:2,range:3,attributes:["%shield% 1"]}},{level:2,normal:{health:7,move:1,attack:2,range:3,attributes:["%shield% 1"]},elite:{health:11,move:1,attack:3,range:3,attributes:["%shield% 1"]}},{level:3,normal:{health:8,move:1,attack:3,range:3,attributes:["%shield% 1"]},elite:{health:11,move:2,attack:3,range:4,attributes:["%poison%","%shield% 1"]}},{level:4,normal:{health:9,move:2,attack:3,range:3,attributes:["%shield% 1"]},elite:{health:13,move:2,attack:4,range:4,attributes:["%poison%","%shield% 1"]}},{level:5,normal:{health:10,move:2,attack:3,range:3,attributes:["%poison%","%shield% 1"]},elite:{health:15,move:3,attack:4,range:4,attributes:["%poison%","%shield% 1"]}},{level:6,normal:{health:12,move:2,attack:4,range:3,attributes:["%poison%","%shield% 1"]},elite:{health:16,move:3,attack:4,range:4,attributes:["%poison%","%shield% 2"]}},{level:7,normal:{health:14,move:2,attack:4,range:3,attributes:["%poison%","%shield% 1"]},elite:{health:18,move:3,attack:5,range:4,attributes:["%poison%","%shield% 2"]}}]},"Night Demon":{level:[{level:0,normal:{health:3,move:3,attack:3,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:5,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]}},{level:1,normal:{health:5,move:3,attack:3,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:8,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]}},{level:2,normal:{health:6,move:3,attack:4,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:11,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]}},{level:3,normal:{health:7,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:13,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]}},{level:4,normal:{health:8,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:15,move:5,attack:5,range:0,attributes:["Attackers gain Disadvantage"]}},{level:5,normal:{health:11,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:17,move:5,attack:6,range:0,attributes:["Attackers gain Disadvantage"]}},{level:6,normal:{health:14,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:21,move:5,attack:6,range:0,attributes:["Attackers gain Disadvantage"]}},{level:7,normal:{health:15,move:4,attack:6,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:21,move:5,attack:8,range:0,attributes:["Attackers gain Disadvantage"]}}]},"Rending Drake":{level:[{level:0,normal:{health:5,move:3,attack:3,range:0,attributes:[]},elite:{health:7,move:4,attack:4,range:0,attributes:[]}},{level:1,normal:{health:6,move:3,attack:3,range:0,attributes:["%wound%"]},elite:{health:7,move:4,attack:5,range:0,attributes:["%wound%"]}},{level:2,normal:{health:7,move:4,attack:3,range:0,attributes:["%wound%"]},elite:{health:9,move:5,attack:5,range:0,attributes:["%wound%"]}},{level:3,normal:{health:7,move:4,attack:4,range:0,attributes:["%wound%"]},elite:{health:10,move:5,attack:6,range:0,attributes:["%wound%"]}},{level:4,normal:{health:9,move:4,attack:4,range:0,attributes:["%wound%"]},elite:{health:11,move:6,attack:6,range:0,attributes:["%wound%"]}},{level:5,normal:{health:10,move:4,attack:5,range:0,attributes:["%wound%"]},elite:{health:14,move:6,attack:6,range:0,attributes:["%wound%"]}},{level:6,normal:{health:11,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:15,move:6,attack:7,range:0,attributes:["%wound%"]}},{level:7,normal:{health:14,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:18,move:6,attack:7,range:0,attributes:["%wound%"]}}]},"Savvas Icestorm":{level:[{level:0,normal:{health:7,move:2,attack:2,range:3,attributes:["%pierce% 3"]},elite:{health:12,move:2,attack:3,range:4,attributes:["%pierce% 3"]}},{level:1,normal:{health:10,move:2,attack:2,range:4,attributes:["%pierce% 3"]},elite:{health:12,move:2,attack:3,range:5,attributes:["%pierce% 3","%shield% 1"]}},{level:2,normal:{health:12,move:3,attack:2,range:4,attributes:["%pierce% 3"]},elite:{health:15,move:3,attack:3,range:5,attributes:["%pierce% 3","%shield% 1"]}},{level:3,normal:{health:12,move:3,attack:3,range:4,attributes:["%pierce% 3","%shield% 1"]},elite:{health:18,move:3,attack:4,range:6,attributes:["%pierce% 3","%shield% 1"]}},{level:4,normal:{health:14,move:3,attack:3,range:5,attributes:["%pierce% 3","%shield% 1"]},elite:{health:19,move:4,attack:4,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:5,normal:{health:16,move:3,attack:4,range:5,attributes:["%pierce% 3","%shield% 1"]},elite:{health:21,move:4,attack:5,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:6,normal:{health:16,move:3,attack:4,range:5,attributes:["%pierce% 3","%shield% 2"]},elite:{health:23,move:4,attack:6,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:7,normal:{health:17,move:4,attack:4,range:6,attributes:["%pierce% 3","%shield% 2"]},elite:{health:24,move:4,attack:6,range:6,attributes:["%pierce% 4","%shield% 3"]}}]},"Savvas Lavaflow":{level:[{level:0,normal:{health:8,move:3,attack:2,range:0,attributes:[]},elite:{health:13,move:3,attack:3,range:0,attributes:[]}},{level:1,normal:{health:9,move:3,attack:2,range:0,attributes:["%poison%"]},elite:{health:15,move:3,attack:3,range:0,attributes:["%wound%"]}},{level:2,normal:{health:11,move:3,attack:3,range:0,attributes:["%poison%"]},elite:{health:18,move:3,attack:3,range:0,attributes:["%poison%","%wound%"]}},{level:3,normal:{health:14,move:3,attack:3,range:0,attributes:["%poison%"]},elite:{health:21,move:3,attack:4,range:0,attributes:["%poison%","%wound%"]}},{level:4,normal:{health:16,move:3,attack:4,range:0,attributes:["%poison%"]},elite:{health:24,move:4,attack:4,range:0,attributes:["%poison%","%wound%"]}},{level:5,normal:{health:18,move:3,attack:4,range:0,attributes:["%poison%","%wound%"]},elite:{health:27,move:4,attack:5,range:0,attributes:["%poison%","%wound%"]}},{level:6,normal:{health:20,move:4,attack:4,range:0,attributes:["%poison%","%wound%"]},elite:{health:30,move:4,attack:6,range:0,attributes:["%poison%","%wound%"]}},{level:7,normal:{health:24,move:4,attack:4,range:0,attributes:["%poison%","%wound%"]},elite:{health:35,move:4,attack:6,range:0,attributes:["%poison%","%wound%"]}}]},"Spitting Drake":{level:[{level:0,normal:{health:5,move:3,attack:3,range:3,attributes:["%flying%"]},elite:{health:8,move:3,attack:4,range:4,attributes:["%flying%"]}},{level:1,normal:{health:6,move:3,attack:3,range:3,attributes:["%flying%"]},elite:{health:9,move:3,attack:4,range:4,attributes:["%flying%","%muddle%"]}},{level:2,normal:{health:8,move:3,attack:3,range:3,attributes:["%flying%","%muddle%"]},elite:{health:10,move:3,attack:5,range:4,attributes:["%flying%","%muddle%"]}},{level:3,normal:{health:8,move:3,attack:4,range:4,attributes:["%flying%","%muddle%"]},elite:{health:12,move:3,attack:5,range:5,attributes:["%flying%","%muddle%"]}},{level:4,normal:{health:9,move:4,attack:4,range:4,attributes:["%flying%","%muddle%"]},elite:{health:14,move:4,attack:5,range:5,attributes:["%flying%","%muddle%"]}},{level:5,normal:{health:12,move:4,attack:4,range:4,attributes:["%flying%","%muddle%"]},elite:{health:16,move:4,attack:6,range:5,attributes:["%flying%","%muddle%"]}},{level:6,normal:{health:13,move:4,attack:5,range:4,attributes:["%flying%","%muddle%"]},elite:{health:19,move:4,attack:6,range:5,attributes:["%flying%","%muddle%"]}},{level:7,normal:{health:16,move:4,attack:5,range:4,attributes:["%flying%","%muddle%"]},elite:{health:21,move:4,attack:7,range:5,attributes:["%flying%","%muddle%"]}}]},"Stone Golem":{level:[{level:0,normal:{health:10,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:2,attack:4,range:0,attributes:["%shield% 1"]}},{level:1,normal:{health:10,move:1,attack:3,range:0,attributes:["%shield% 1"]},elite:{health:11,move:2,attack:4,range:0,attributes:["%shield% 2"]}},{level:2,normal:{health:11,move:1,attack:4,range:0,attributes:["%shield% 1"]},elite:{health:14,move:2,attack:5,range:0,attributes:["%shield% 2"]}},{level:3,normal:{health:11,move:1,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:15,move:2,attack:5,range:0,attributes:["%shield% 3"]}},{level:4,normal:{health:12,move:2,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:17,move:2,attack:6,range:0,attributes:["%shield% 3"]}},{level:5,normal:{health:13,move:2,attack:5,range:0,attributes:["%shield% 2"]},elite:{health:19,move:3,attack:6,range:0,attributes:["%shield% 3"]}},{level:6,normal:{health:16,move:2,attack:5,range:0,attributes:["%shield% 2"]},elite:{health:20,move:3,attack:7,range:0,attributes:["%shield% 3"]}},{level:7,normal:{health:16,move:2,attack:5,range:0,attributes:["%shield% 3"]},elite:{health:21,move:3,attack:7,range:0,attributes:["%shield% 4"]}}]},"Sun Demon":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:9,move:2,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:1,normal:{health:7,move:2,attack:2,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:12,move:2,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:2,normal:{health:9,move:2,attack:2,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:13,move:2,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:3,normal:{health:10,move:2,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:15,move:3,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:4,normal:{health:11,move:3,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:16,move:3,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:5,normal:{health:11,move:3,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 2"]},elite:{health:16,move:3,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 2"]}},{level:6,normal:{health:12,move:3,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 2"]},elite:{health:18,move:4,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 2"]}},{level:7,normal:{health:15,move:3,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 2"]},elite:{health:22,move:4,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 2"]}}]},"Vermling Scout":{level:[{level:0,normal:{health:2,move:3,attack:1,range:0,attributes:[]},elite:{health:4,move:3,attack:2,range:0,attributes:[]}},{level:1,normal:{health:3,move:3,attack:1,range:0,attributes:[]},elite:{health:5,move:3,attack:2,range:0,attributes:[]}},{level:2,normal:{health:3,move:3,attack:2,range:0,attributes:[]},elite:{health:5,move:4,attack:3,range:0,attributes:[]}},{level:3,normal:{health:5,move:3,attack:2,range:0,attributes:[]},elite:{health:7,move:4,attack:3,range:0,attributes:[]}},{level:4,normal:{health:6,move:3,attack:3,range:0,attributes:[]},elite:{health:8,move:4,attack:4,range:0,attributes:[]}},{level:5,normal:{health:8,move:3,attack:3,range:0,attributes:[]},elite:{health:11,move:4,attack:4,range:0,attributes:[]}},{level:6,normal:{health:9,move:4,attack:3,range:0,attributes:[]},elite:{health:12,move:5,attack:4,range:0,attributes:[]}},{level:7,normal:{health:11,move:4,attack:3,range:0,attributes:[]},elite:{health:15,move:5,attack:4,range:0,attributes:[]}}]},"Vermling Shaman":{level:[{level:0,normal:{health:2,move:2,attack:1,range:3,attributes:["%shield% 2"]},elite:{health:3,move:3,attack:2,range:3,attributes:["%shield% 2"]}},{level:1,normal:{health:2,move:2,attack:1,range:3,attributes:["%shield% 3"]},elite:{health:3,move:3,attack:2,range:3,attributes:["%shield% 3"]}},{level:2,normal:{health:3,move:2,attack:1,range:4,attributes:["%shield% 3"]},elite:{health:4,move:3,attack:2,range:4,attributes:["%shield% 3"]}},{level:3,normal:{health:3,move:2,attack:2,range:4,attributes:["%shield% 3"]},elite:{health:5,move:3,attack:3,range:4,attributes:["%shield% 3"]}},{level:4,normal:{health:3,move:3,attack:2,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:5,move:3,attack:3,range:4,attributes:["%muddle%","%shield% 4"]}},{level:5,normal:{health:4,move:3,attack:3,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:6,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 4"]}},{level:6,normal:{health:5,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:6,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 5"]}},{level:7,normal:{health:7,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:8,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 5"]}}]},"Wind Demon":{level:[{level:0,normal:{health:3,move:3,attack:2,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:5,move:4,attack:3,range:4,attributes:["%flying%","%shield% 1"]}},{level:1,normal:{health:3,move:3,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:5,move:4,attack:3,range:4,attributes:["%flying%","%shield% 2"]}},{level:2,normal:{health:4,move:4,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:7,move:5,attack:3,range:4,attributes:["%flying%","%shield% 2"]}},{level:3,normal:{health:5,move:4,attack:3,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:8,move:5,attack:4,range:4,attributes:["%flying%","%shield% 2"]}},{level:4,normal:{health:7,move:4,attack:3,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:8,move:5,attack:4,range:4,attributes:["%flying%","%disarm%","%shield% 2"]}},{level:5,normal:{health:9,move:4,attack:3,range:4,attributes:["%flying%","%shield% 2"]},elite:{health:11,move:5,attack:4,range:4,attributes:["%flying%","%disarm%","%shield% 2"]}},{level:6,normal:{health:10,move:4,attack:3,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:12,move:5,attack:4,range:4,attributes:["%flying%","%disarm%","%shield% 3"]}},{level:7,normal:{health:11,move:4,attack:4,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:13,move:5,attack:5,range:4,attributes:["%flying%","%disarm%","%shield% 3"]}}]}},bosses:{"Bandit Commander":{level:[{level:0,health:"8xC",move:3,attack:3,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:1,health:"10xC",move:3,attack:3,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:2,health:"12xC",move:4,attack:3,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:3,health:"13xC",move:4,attack:4,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:4,health:"15xC",move:4,attack:4,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:5,health:"16xC",move:5,attack:5,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:6,health:"19xC",move:5,attack:5,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:7,health:"23xC",move:5,attack:5,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""}]},"The Betrayer":{level:[{level:0,health:"10xC",move:3,attack:4,range:3,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:1,health:"12xC",move:3,attack:5,range:3,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:2,health:"14xC",move:3,attack:6,range:4,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:3,health:"16xC",move:4,attack:7,range:4,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:4,health:"18xC",move:4,attack:8,range:4,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:5,health:"20xC",move:5,attack:8,range:5,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:6,health:"23xC",move:5,attack:9,range:5,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:7,health:"27xC",move:5,attack:9,range:5,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""}]},"Captain of the Guard":{level:[{level:0,health:"7xC",move:2,attack:3,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:1,health:"9xC",move:2,attack:3,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:2,health:"11xC",move:2,attack:4,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:3,health:"14xC",move:3,attack:4,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:4,health:"16xC",move:3,attack:5,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:5,health:"20xC",move:3,attack:5,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:6,health:"21xC",move:4,attack:6,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:7,health:"25xC",move:4,attack:6,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""}]},"The Colorless":{level:[{level:0,health:"9xC",move:3,attack:2,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 4, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:1,health:"10xC",move:3,attack:3,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 4, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:2,health:"11xC",move:4,attack:3,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 5, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:3,health:"12xC",move:4,attack:4,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 5, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:4,health:"14xC",move:4,attack:4,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 6, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:5,health:"15xC",move:4,attack:5,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 6, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:6,health:"17xC",move:4,attack:6,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 7, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:7,health:"19xC",move:5,attack:7,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 7, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""}]},"Dark Rider":{level:[{level:0,health:"9xC",move:2,attack:"3+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:1,health:"10xC",move:3,attack:"3+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:2,health:"12xC",move:3,attack:"3+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:3,health:"13xC",move:3,attack:"4+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:4,health:"15xC",move:3,attack:"4+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:5,health:"16xC",move:3,attack:"5+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:6,health:"16xC",move:4,attack:"5+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:7,health:"18xC",move:4,attack:"6+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"}]},"Elder Drake":{level:[{level:0,health:"11xC",move:0,attack:3,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:1,health:"12xC",move:0,attack:4,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:2,health:"15xC",move:0,attack:4,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:3,health:"16xC",move:0,attack:5,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:4,health:"20xC",move:0,attack:5,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:5,health:"22xC",move:0,attack:6,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:6,health:"27xC",move:0,attack:6,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:7,health:"29xC",move:0,attack:7,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""}]},"The Gloom":{level:[{level:0,health:"20xC",move:2,attack:5,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:1,health:"25xC",move:2,attack:5,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:2,health:"29xC",move:2,attack:6,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:3,health:"35xC",move:2,attack:6,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:4,health:"39xC",move:3,attack:7,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:5,health:"46xC",move:3,attack:7,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:6,health:"50xC",move:3,attack:8,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:7,health:"56xC",move:3,attack:9,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""}]},"Inox Bodyguard":{level:[{level:0,health:"6xC",move:2,attack:"C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 3"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:1,health:"7xC",move:2,attack:"1+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 3"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:2,health:"9xC",move:2,attack:"1+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 3"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:3,health:"10xC",move:3,attack:"2+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 4"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:4,health:"11xC",move:3,attack:"2+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 4"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:5,health:"13xC",move:3,attack:"3+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 5"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:6,health:"15xC",move:4,attack:"3+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 5"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:7,health:"17xC",move:4,attack:"4+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 5"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"}]},Jekserah:{level:[{level:0,health:"6xC",move:2,attack:2,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:1,health:"7xC",move:2,attack:3,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:2,health:"9xC",move:3,attack:3,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:3,health:"12xC",move:4,attack:4,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:4,health:"13xC",move:4,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:5,health:"15xC",move:5,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:6,health:"18xC",move:5,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:7,health:"22xC",move:5,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""}]},"Merciless Overseer":{level:[{level:0,health:"6xC",move:2,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:1,health:"8xC",move:2,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:2,health:"9xC",move:3,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:3,health:"11xC",move:3,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:4,health:"12xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:5,health:"14xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:6,health:"16xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:7,health:"19xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"}]},"Prime Demon":{level:[{level:0,health:"8xC",move:3,attack:4,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:1,health:"9xC",move:4,attack:4,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:2,health:"10xC",move:4,attack:5,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:3,health:"12xC",move:4,attack:6,range:0,special1:["Throne moves","Summon Demon","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:4,health:"14xC",move:5,attack:6,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:5,health:"16xC",move:5,attack:7,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:6,health:"20xC",move:5,attack:7,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:7,health:"22xC",move:5,attack:8,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""}]},"The Sightless Eye":{level:[{level:0,health:"7xC",move:0,attack:5,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:1,health:"8xC",move:0,attack:6,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:2,health:"10xC",move:0,attack:6,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:3,health:"11xC",move:0,attack:7,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:4,health:"14xC",move:0,attack:7,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:5,health:"15xC",move:0,attack:8,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:6,health:"18xC",move:0,attack:8,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:7,health:"20xC",move:0,attack:9,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""}]},"Winged Horror":{level:[{level:0,health:"6xC",move:3,attack:3,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:1,health:"7xC",move:4,attack:3,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:2,health:"8xC",move:4,attack:4,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:3,health:"10xC",move:4,attack:4,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:4,health:"12xC",move:5,attack:4,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:5,health:"14xC",move:5,attack:5,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:6,health:"17xC",move:5,attack:5,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:7,health:"20xC",move:5,attack:5,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""}]}}},o={living_corpse_two_levels_extra:{description:"All living corpses are two levels higher than the scenario level, up to a max of 7",affected_deck:"Living Corpse",extra_levels:2}},m=[{name:"#1 Black Barrow",decks:[{name:"Bandit Guard",deck_name:"Guard"},{name:"Bandit Archer",deck_name:"Archer"},{name:"Living Bones",deck_name:"Living Bones"}]},{name:"#2 Barrow Lair",decks:[{name:"Bandit Archer"},{name:"Boss: Bandit Commander"},{name:"Living Bones"},{name:"Living Corpse"}]},{name:"#3 Inox Encampment",decks:[{name:"Inox Guard"},{name:"Inox Archer"},{name:"Inox Shaman"}]},{name:"#4 Crypt of the Damned",decks:[{name:"Living Bones"},{name:"Bandit Archer"},{name:"Cultist"},{name:"Earth Demon"},{name:"Wind Demon"}]},{name:"#5 Ruinous Crypt",decks:[{name:"Cultist"},{name:"Living Bones"},{name:"Night Demon"},{name:"Flame Demon"},{name:"Frost Demon"}]},{name:"#6 Decaying Crypt",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Living Spirit"}]},{name:"#7 Vibrant Grotto",decks:[{name:"Forest Imp"},{name:"Cave Bear"},{name:"Inox Shaman"},{name:"Earth Demon"}]},{name:"#8 Gloomhaven Warehouse",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Boss: Inox Bodyguard"}]},{name:"#9 Diamond Mine",decks:[{name:"Hound"},{name:"Vermling Scout"},{name:"Boss: Merciless Overseer"}]},{name:"#10 Plane of Elemental Power",decks:[{name:"Flame Demon"},{name:"Earth Demon"},{name:"Sun Demon"}]},{name:"#11 Gloomhaven Square A",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"City Guard"},{name:"City Archer"},{name:"Boss: Captain of the Guard"}]},{name:"#12 Gloomhaven Square B",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Cultist"},{name:"City Guard"},{name:"City Archer"},{name:"Boss: Jekserah"}]},{name:"#13 Temple of the Seer",decks:[{name:"Stone Golem"},{name:"Cave Bear"},{name:"Living Spirit"},{name:"Spitting Drake"}]},{name:"#14 Frozen Hollow",decks:[{name:"Hound"},{name:"Living Spirit"},{name:"Frost Demon"}]},{name:"#15 Shrine of Strength",decks:[{name:"Stone Golem"},{name:"Savvas Icestorm"},{name:"Frost Demon"},{name:"Wind Demon"},{name:"Harrower Infester"}]},{name:"#16 Mountain Pass",decks:[{name:"Earth Demon"},{name:"Wind Demon"},{name:"Inox Guard"},{name:"Inox Archer"}]},{name:"#17 Lost Island",decks:[{name:"Vermling Scout"},{name:"Vermling Shaman"},{name:"Cave Bear"}]},{name:"#18 Abandoned Sewers",decks:[{name:"Giant Viper"},{name:"Ooze"},{name:"Vermling Scout"}]},{name:"#19 Forgotten Crypt",decks:[{name:"Cultist"},{name:"Living Bones"},{name:"Living Spirit"},{name:"Living Corpse"}]},{name:"#20 Necromancer's Sanctum",decks:[{name:"Living Bones"},{name:"Cultist"},{name:"Night Demon"},{name:"Living Corpse"},{name:"Boss: Jekserah"}]},{name:"#21 Infernal Throne",decks:[{name:"Sun Demon"},{name:"Frost Demon"},{name:"Night Demon"},{name:"Wind Demon"},{name:"Earth Demon"},{name:"Flame Demon"},{name:"Boss: Prime Demon"}]},{name:"#22 Temple of the Elements",decks:[{name:"Living Bones"},{name:"Cultist"},{name:"Earth Demon"},{name:"Flame Demon"},{name:"Frost Demon"},{name:"Wind Demon"}]},{name:"#23 Deep Ruins",decks:[{name:"Stone Golem"},{name:"Ancient Artillery"},{name:"Living Bones"},{name:"Living Spirit"}]},{name:"#24 Echo Chamber",decks:[{name:"Rending Drake"},{name:"Ooze"},{name:"Living Spirit"}]},{name:"#25 Icecrag Ascent",decks:[{name:"Hound"},{name:"Rending Drake"},{name:"Spitting Drake"}]},{name:"#26 Ancient Cistern",decks:[{name:"Living Corpse"},{name:"Ooze"},{name:"Night Demon"},{name:"Black Imp"}]},{name:"#27 Ruinous Rift",decks:[{name:"Night Demon"},{name:"Wind Demon"},{name:"Frost Demon"},{name:"Sun Demon"},{name:"Earth Demon"},{name:"Flame Demon"}]},{name:"#28 Outer Ritual Chamber",decks:[{name:"Living Corpse"},{name:"Cultist"},{name:"Living Bones"},{name:"Night Demon"},{name:"Sun Demon"}],special_rules:[o.living_corpse_two_levels_extra]},{name:"#29 Sanctuary of Gloom",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Living Spirit"},{name:"Black Imp"}]},{name:"#30 Shrine of the Depths",decks:[{name:"Ooze"},{name:"Lurker"},{name:"Deep Terror"}]},{name:"#31 Plane of the Night",decks:[{name:"Deep Terror"},{name:"Night Demon"},{name:"Black Imp"}]},{name:"#32 Decrepit Wood",decks:[{name:"Harrower Infester"},{name:"Giant Viper"},{name:"Deep Terror"},{name:"Black Imp"}]},{name:"#33 Savvas Armory",decks:[{name:"Savvas Icestorm"},{name:"Savvas Lavaflow"},{name:"Frost Demon"},{name:"Flame Demon"},{name:"Wind Demon"},{name:"Earth Demon"}]},{name:"#34 Scorched Summit",decks:[{name:"Rending Drake"},{name:"Spitting Drake"},{name:"Boss: Elder Drake"}]},{name:"#35 Gloomhaven Battlements A",decks:[{name:"Flame Demon"},{name:"Frost Demon"},{name:"Earth Demon"},{name:"Wind Demon"},{name:"City Archer"},{name:"City Guard"},{name:"Boss: Captain of the Guard"}]},{name:"#36 Gloomhaven Battlements B",decks:[{name:"Flame Demon"},{name:"Frost Demon"},{name:"Earth Demon"},{name:"Wind Demon"},{name:"City Archer"},{name:"Boss: Prime Demon"}]},{name:"#37 Doom Trench",decks:[{name:"Lurker"},{name:"Deep Terror"},{name:"Harrower Infester"}]},{name:"#38 Slave Pens",decks:[{name:"Inox Guard"},{name:"Inox Archer"},{name:"Inox Shaman"},{name:"Stone Golem"}]},{name:"#39 Treacherous Divide",decks:[{name:"Cave Bear"},{name:"Frost Demon"},{name:"Spitting Drake"},{name:"Cultist"},{name:"Living Bones"}]},{name:"#40 Ancient Defense Network",decks:[{name:"Living Corpse"},{name:"Flame Demon"},{name:"Cave Bear"},{name:"Stone Golem"},{name:"Forest Imp"}]},{name:"#41 Timeworn Tomb",decks:[{name:"Ancient Artillery"},{name:"Living Corpse"},{name:"Living Spirit"},{name:"Stone Golem"}]},{name:"#42 Realm of the Voice",decks:[{name:"Night Demon"},{name:"Wind Demon"},{name:"Living Spirit"}]},{name:"#43 - Drake Nest",decks:[{name:"Flame Demon"},{name:"Rending Drake"},{name:"Spitting Drake"}]},{name:"#44 Tribal Assault",decks:[{name:"Inox Guard"},{name:"Inox Archer"},{name:"Hound"},{name:"Inox Shaman"}]},{name:"#45 Rebel Swamp",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Hound"}]},{name:"#46 Nightmare Peak",decks:[{name:"Night Demon"},{name:"Frost Demon"},{name:"Wind Demon"},{name:"Savvas Icestorm"},{name:"Boss: Winged Horror"}]},{name:"#47 Lair of the Unseeing Eye",decks:[{name:"Lurker"},{name:"Deep Terror"},{name:"Harrower Infester"},{name:"Boss: The Sightless Eye"}]},{name:"#48 - Shadow Weald",decks:[{name:"Forest Imp"},{name:"Earth Demon"},{name:"Harrower Infester"},{name:"Boss: Dark Rider"}]},{name:"#49 Rebel's Stand",decks:[{name:"Giant Viper"},{name:"City Archer"},{name:"City Guard"},{name:"Ancient Artillery"}]},{name:"#50 Ghost Fortress",decks:[{name:"Night Demon"},{name:"Sun Demon"},{name:"Earth Demon"}]},{name:"#51 The Void",decks:[{name:"Boss: The Gloom"}]},{name:"#52 Noxious Cellar",decks:[{name:"Spitting Drake"},{name:"Ooze"},{name:"Vermling Scout"},{name:"Living Corpse"},{name:"Vermling Shaman"}]},{name:"#53 Crypt Basement",decks:[{name:"Ooze"},{name:"Living Corpse"},{name:"Living Spirit"},{name:"Living Bones"},{name:"Giant Viper"}]},{name:"#54 Palace of Ice",decks:[{name:"Cave Bear"},{name:"Living Spirit"},{name:"Frost Demon"},{name:"Harrower Infester"}]},{name:"#55 Foggy Thicket",decks:[]},{name:"#56 Bandit's Wood",decks:[{name:"Hound"},{name:"Bandit Archer"},{name:"Rending Drake"},{name:"Bandit Guard"}]},{name:"#57 Investigation",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Hound"}]},{name:"#58 Bloody Shack",decks:[{name:"Earth Demon"},{name:"Harrower Infester"},{name:"Black Imp"},{name:"City Guard"}]},{name:"#59 Forgotten Grove",decks:[{name:"Cave Bear"},{name:"Hound"},{name:"Forest Imp"}]},{name:"#60 Alchemy Lab",decks:[{name:"Ooze"},{name:"Giant Viper"},{name:"Hound"},{name:"Rending Drake"},{name:"Spitting Drake"}]},{name:"#61 Fading Lighthouse",decks:[{name:"Ooze"},{name:"Giant Viper"},{name:"Frost Demon"},{name:"Flame Demon"}]},{name:"#62 Pit of Souls",decks:[{name:"Living Bones"},{name:"Living Spirit"}]},{name:"#63 Magma Pit",decks:[{name:"Vermling Scout"},{name:"Inox Guard"},{name:"Inox Archer"},{name:"Flame Demon"}]},{name:"#64 Underwater Lagoon",decks:[{name:"Ooze"},{name:"Forest Imp"},{name:"Rending Drake"}]},{name:"#65 Sulfur Mine",decks:[{name:"Vermling Scout"},{name:"Hound"},{name:"Inox Shaman"}]},{name:"#66 Clockwork Cove",decks:[{name:"Ooze"},{name:"Ancient Artillery"},{name:"Living Spirit"},{name:"Stone Golem"}]},{name:"#67 Arcane Library",decks:[{name:"Forest Imp"},{name:"Cave Bear"},{name:"Stone Golem"}]},{name:"#68 Toxic Moor",decks:[{name:"Rending Drake"},{name:"Black Imp"},{name:"Giant Viper"},{name:"Living Corpse"}]},{name:"#69 Well of the Unfortunate",decks:[{name:"Vermling Scout"},{name:"Vermling Shaman"},{name:"Forest Imp"},{name:"Stone Golem"},{name:"Living Spirit"}]},{name:"#70 Chained Isle",decks:[{name:"Night Demon"},{name:"Wind Demon"},{name:"Living Spirit"}]},{name:"#71 Windswept Highlands",decks:[{name:"Spitting Drake"},{name:"Wind Demon"},{name:"Sun Demon"}]},{name:"#72 Oozing Grove",decks:[{name:"Ooze"},{name:"Forest Imp"},{name:"Giant Viper"}]},{name:"#73 Rockslide Ridge",decks:[{name:"Hound"},{name:"Inox Archer"},{name:"Ancient Artillery"},{name:"Inox Guard"},{name:"Inox Shaman"}]},{name:"#74 Merchant Ship",decks:[{name:"Bandit Guard"},{name:"Bandit Archer"},{name:"Lurker"},{name:"Deep Terror"}]},{name:"#75 Overgrown Graveyard",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Living Spirit"}]},{name:"#76 Harrower Hive",decks:[{name:"Giant Viper"},{name:"Living Bones"},{name:"Night Demon"},{name:"Harrower Infester"}]},{name:"#77 Vault of Secrets",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Stone Golem"},{name:"Hound"}]},{name:"#78 Sacrifice Pit",decks:[{name:"Bandit Guard"},{name:"Bandit Archer"},{name:"Cultist"},{name:"Living Bones"},{name:"Black Imp"}]},{name:"#79 Lost Temple",decks:[{name:"Stone Golem"},{name:"Giant Viper"},{name:"Boss: The Betrayer"}]},{name:"#80 Vigil Keep",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Ancient Artillery"},{name:"Hound"}]},{name:"#81 Temple of the Eclipse",decks:[{name:"Night Demon"},{name:"Sun Demon"},{name:"Stone Golem"},{name:"Ancient Artillery"},{name:"Boss: The Colorless"}]},{name:"#82 Burning Mountain",decks:[{name:"Earth Demon"},{name:"Flame Demon"},{name:"Stone Golem"}]},{name:"#83 Shadows Within",decks:[{name:"Hound"},{name:"Cultist"},{name:"Living Bones"},{name:"Living Spirit"},{name:"Flame Demon"}]},{name:"#84 Crystalline Cave",decks:[{name:"Flame Demon"},{name:"Frost Demon"},{name:"Earth Demon"}]},{name:"#85 Sun Temple",decks:[{name:"Hound"},{name:"Black Imp"},{name:"Night Demon"},{name:"Sun Demon"}]},{name:"#86 Harried Village",decks:[{name:"Cave Bear"},{name:"Vermling Shaman"},{name:"Vermling Scout"},{name:"Lurker"}]},{name:"#87 Corrupted Cove",decks:[{name:"Lurker"},{name:"Deep Terror"},{name:"Ooze"},{name:"Black Imp"}]},{name:"#88 Plane of Water",decks:[{name:"Frost Demon"},{name:"Ooze"},{name:"Lurker"}]},{name:"#89 Syndicate Hideout",decks:[{name:"Bandit Archer"},{name:"Bandit Guard"},{name:"Cultist"},{name:"Giant Viper"}]},{name:"#90 Demonic Rift",decks:[{name:"Earth Demon"},{name:"Wind Demon"},{name:"Night Demon"},{name:"Living Spirit"}]},{name:"#91 Wild Melee",decks:[{name:"Cave Bear"},{name:"Hound"},{name:"Bandit Guard"},{name:"Bandit Archer"},{name:"Living Spirit"}]},{name:"#92 Back Alley Brawl",decks:[{name:"Bandit Guard"},{name:"City Guard"},{name:"Inox Guard"},{name:"Bandit Archer"},{name:"City Archer"},{name:"Savvas Lavaflow"},{name:"Flame Demon"},{name:"Earth Demon"}]},{name:"#93 Sunken Vessel",decks:[{name:"Lurker"},{name:"Frost Demon"},{name:"Living Spirit"}]},{name:"#94 Vermling Nest",decks:[{name:"Hound"},{name:"Vermling Scout"},{name:"Vermling Shaman"},{name:"Cave Bear"}]},{name:"#95 Payment Due",decks:[{name:"Deep Terror"},{name:"Flame Demon"},{name:"Earth Demon"},{name:"Savvas Lavaflow"}]}],c={"%air%":"","%any%":"","%aoe-4-with-black%":"","%aoe-circle%":"
      ","%aoe-circle-with-middle-black%":"
      ","%aoe-circle-with-side-black%":"","%aoe-line-3-with-black%":"
      ","%aoe-line-4-with-black%":"
      ","%aoe-line-6-with-black%":"","%aoe-triangle-2-side%":"
      ","%aoe-triangle-2-side-with-black%":"
      ","%aoe-triangle-3-side-with-corner-black%":"
      ","%attack%":"Attack ","%bless%":"BLESS ","%boss-aoe-elder-drake-sp1%":"
      ","%boss-aoe-inox-bodyguard-sp1%":"
      ","%boss-aoe-sightless-eye-sp1%":"
      ","%boss-aoe-sightless-eye-sp2%":"
      ","%curse%":"CURSE ","%dark%":"","%disarm%":"DISARM ","%earth%":"","%fire%":"","%heal%":"Heal ","%ice%":"","%immobilize%":"IMMOBILIZE ","%invisible%":"INVISIBLE ","%jump%":"Jump ","%light%":"","%loot%":"Loot ","%move%":"Move ","%muddle%":"MUDDLE ","%pierce%":"PIERCE ","%poison%":"POISON ","%pull%":"PULL ","%push%":"PUSH ","%range%":"Range ","%retaliate%":"Retaliate ","%shield%":"Shield ","%flying%":"","%strengthen%":"STRENGTHEN ","%stun%":"STUN ","%target%":"Target ","%use_element%":"","%wound%":"WOUND "};function h(e){const a=e.toLowerCase();return a in c?c[a]:e}function u(e,a,t){let n=new RegExp("%"+a+"% (\\+|-)(\\d*)","g");const l=n.exec(e),i=2===t.length;let s=t[0],r="";const o=(n=new RegExp("(\\d*)([+\\-])?([a-zA-Z]+)","i")).exec(String(s));if(o&&o[3]){const e="-"===o[2]?"-":"+";r=o[3]+e,s=""!==o[1]?parseInt(o[1]):0}if(l){if("+"===l[1]){const e=s+parseInt(l[2]);if(i){return"%"+a+"% "+e+" / "+(t[1]+parseInt(l[2]))+""}return"%"+a+"% "+r+e}if("-"===l[1]){const e=s-parseInt(l[2]);if(i){return"%"+a+"% "+e+" / "+(t[1]-parseInt(l[2]))+""}return"%"+a+"% "+r+e}}return e}function d(e){if(!e||0===e[0].length&&0===e[1].length)return[];{let a=["* Attributes"];const t=[];let n=0;for(let a=0;a"+e.replace(/(,\s$)/g,"")+"":""})))}}function v(e){if(e){const a=[];let t=0;for(let n=0;n"+e.replace(/(,\s$)/g,"")+""})))}return[]}function g(e){return["* Notes: "+e+""]}function k(e,a){return a.map((function(e){return"* "+e}))}function p(e,a,t){return a&&-1!==e.indexOf("Special 1")&&(e=k(0,a)),a&&-1!==e.indexOf("Special 2")&&(e=k(0,t)),e}function b(e,a,t,n){const l=new RegExp("%(attack|move|range)% ([+\\-])(\\d*)","g");let i=l.exec(e);for(;i;)"attack"===i[1]?e=e.replace(i[0],u(i[0],"attack",a)):"move"===i[1]?e=e.replace(i[0],u(i[0],"move",t)):"range"===i[1]&&(e=e.replace(i[0],u(i[0],"range",n))),i=l.exec(e);return e.replace(/%[^%]*%/gi,h)}function f(e,a,t){for(let a in e)e[a].className=a===t?"":"inactive";for(let e in a)a[e].className=e===t?"tabbody":"inactive tabbody"}function S(e,a,t){e.className=t?"pane":"pane inactive",a.style.display=t?"initial":"none"}const _={};function C(e,a,t){t?e.classList.add(a):e.classList.remove(a)}function y(e,a,t,n){const l=document.createElement("input");l.type=e,l.name=a,l.value=t;const i=document.createTextNode(n),s=document.createElement("label");return s.appendChild(l),s.appendChild(i),{root:s,input:l}}function D(e){const a=[];for(let t in e)a.push(e[t]);return a}function w(e){return"checked"in e&&e.checked}function x(e){return"value"in e?e.value:""}function L(e,a){try{localStorage.setItem(e,a)}catch(e){console.error("Local storage is required")}}function A(e){try{return localStorage.getItem(e)}catch(e){console.error("Local storage is required")}}function I(e,a){for(let t=0;t Create a 3 damage trap in an adjacent empty hex closest to an enemy "],[!0,"29","* %move% +0","* %attack% -1","** %range% +1","** %immobilize%"]]},{class:"Boss",cards:[[!1,"11","* Special 2"],[!1,"14","* Special 2"],[!0,"17","* Special 2"],[!0,"85","* Special 1"],[!1,"79","* Special 1"],[!1,"73","* Special 1"],[!1,"36","* %move% +0","* %attack% +0"],[!1,"52","* %move% -1","* %attack% -1","** %range% 3","** %target% 2"]]},{class:"Cave Bear",cards:[[!1,"13","* %move% +1","* %attack% -1"],[!1,"14","* %move% -1","* %attack% -1","** %immobilize%"],[!0,"34","* %attack% +1","** %wound%"],[!1,"41","* %move% +0","* %attack% +0"],[!1,"60","* %move% -1","* %attack% +1"],[!0,"80","* %attack% -1","* %move% -2","* %attack% -1","** %wound%"],[!1,"61","* %move% +0","* %attack% -1","** %target% 2"],[!1,"03","* %shield% 1","* %retaliate% 2","* %heal% 2","** Self"]]},{class:"Cultist",cards:[[!1,"10","* %move% -1","* %attack% -1","* On Death:","** %attack% +2 %aoe-circle-with-middle-black%"],[!1,"10","* %move% -1","* %attack% -1","* On Death:","** %attack% +2 %aoe-circle-with-middle-black%"],[!1,"27","* %move% +0","* %attack% +0"],[!1,"27","* %move% +0","* %attack% +0"],[!1,"39","* %move% -1","* %attack% +0","* %heal% 1","** Self"],[!0,"63","* Summon normal Living Bones","* Cultist suffers 2 damage."],[!0,"63","* Summon normal Living Bones","* Cultist suffers 2 damage."],[!1,"31","* %move% -1","* %heal% 3","** %range% 3"]]},{class:"Deep Terror",cards:[[!1,"65","* %attack% +0","** %range% 3","** %target% 3","** %curse%"],[!0,"60","* %attack% +0 %aoe-line-6-with-black%","** %pierce% 3"],[!0,"60","* %attack% +0 %aoe-line-6-with-black%","** %pierce% 3"],[!1,"84","* %attack% -1","** Target all adjacent enemies","* %attack% +0","** %range% 4","** %wound%"],[!1,"75","* %attack% +0","** %poison%","* %attack% -1","** %range% 5","** %immobilize%"],[!1,"75","* %attack% -2","** Target all adjacent enemies","** %disarm%","* %attack% +0","** %range% 3","** %target% 2"],[!1,"96","* %attack% -2","** %range% 6","** Summon normal Deep Terror in a hex adjacent to the target"],[!1,"54","* %wound% and %poison%","** Target all adjacent enemies","* %attack% +0","** %range% 4"]]},{class:"Earth Demon",cards:[[!0,"40","* %heal% 3","** Self","* %earth%%use_element%: %immobilize% Target all enemies within %range% 3"],[!0,"42","* %move% +1","* %attack% -1"],[!1,"62","* %move% +0","* %attack% +0","* %earth%"],[!1,"71","* %attack% +0","** %range% 4","** %earth%%use_element%: %target% 2"],[!1,"83","* %move% -1","* %attack% +1","* %earth%"],[!1,"93","* %move% -1","* %attack% -1","** Target all adjacent enemies","* %earth%%use_element%: %push% 1"],[!1,"79","* %move% +1","* %attack% +0","** %air%%use_element%: -2 %attack%"],[!1,"87","* %move% +0","* %attack% -1
      %aoe-4-with-black%
      ","* %any%%use_element%: %earth%"]]},{class:"Flame Demon",cards:[[!1,"03","* %move% +1","* %attack% -1","** %range% +0","* %fire%"],[!1,"24","* %move% +0","* %attack% +0","** %range% +0","* %fire%"],[!0,"46","* %attack% +0","** %range% +0","** %fire%%use_element%: %aoe-circle%"],[!1,"49","* %attack% +0 %aoe-line-3-with-black%","**
      %fire%%use_element%: +1 %attack%
      %wound%
      "],[!1,"67","* %move% -1","* %attack% +1","** %range% -1","* %fire%"],[!1,"77","* %attack% +0","** Target all adjacent enemies","** %ice%%use_element%:Flame Demon suffers 1 damage."],[!0,"30","*
      %fire%%use_element%: All adjacent enemies
      suffer 2 damage.
      ","* %move% +0","* %attack% -2","** %range% +0","** %wound%","** %target% 2"],[!1,"08","* %move% -1","* Create a 4 damage trap in an adjacent empty hex closest to an enemy ","* %any%%use_element%: %fire%"]]},{class:"Frost Demon",cards:[[!1,"18","* %immobilize%","** Target all enemies within %range% 2","* %ice%%use_element%: %heal% 3
      Self
      "],[!1,"38","* %move% +1","* %attack% -1"],[!1,"58","* %move% +0","* %attack% +0"],[!1,"58","* %move% -1","* %attack% +0","** %range% 2","** %ice%%use_element%: +2 %attack%, +1 %range%"],[!0,"78","* %move% -1","* %attack% +0 %aoe-triangle-2-side-with-black%","* %ice%"],[!0,"78","* %move% -1","* %attack% +0 %aoe-triangle-2-side-with-black%","* %ice%"],[!1,"58","* %move% -1","* %attack% -1","** %pierce% 3","* %any%%use_element%: %ice%"],[!1,"18","* %shield% 2","* %move% +1","* %fire%%use_element%: Frost Demon suffers 1 damage"]]},{class:"Giant Viper",cards:[[!0,"32","* %move% +0","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Giant Viper's allies."],[!0,"32","* %move% +0","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Giant Viper's allies."],[!1,"11","* %shield% 1","* %attack% -1"],[!1,"43","* %move% +1","** %jump%","* %attack% -1","** Target all adjacent enemies."],[!1,"58","* %move% -1","* %attack% +1"],[!1,"58","* %move% +1","** %jump%","* %attack% -1","** All attacks targeting Giant Viper this round gain Disadvantage."],[!1,"43","* %move% -1","** %jump%","* %attack% +0","** %target% 2"],[!1,"23","* %move% -1","* %attack% -1","** %immobilize%","* %attack% -1"]]},{class:"Guard",cards:[[!0,"15","* %shield% 1","* %retaliate% 2"],[!1,"30","* %move% +1","* %attack% -1"],[!1,"35","* %move% -1","* %attack% +0","** %range% 2"],[!1,"50","* %move% +0","* %attack% +0"],[!1,"50","* %move% +0","* %attack% +0"],[!1,"70","* %move% -1","* %attack% +1"],[!1,"55","* %move% -1","* %attack% +0","* %strengthen%","** Self"],[!0,"15","* %shield% 1","* %attack% +0","** %poison%"]]},{class:"Harrower Infester",cards:[[!1,"38","* %move% -1","* %attack% +1","** %target% 2"],[!1,"07","* %move% +0","* %attack% -1","** %poison%","* %dark%"],[!1,"16","* %move% -1","* %attack% -1","* %heal% 5","** Self"],[!1,"16","* %attack% +2","** %immobilize%","* %retaliate% 2"],[!0,"02","* %shield% 2","* %retaliate% 2","** %range% 3"],[!1,"30","* %move% -1","* %attack% +0 %aoe-line-4-with-black%",'** %dark%%use_element%: Perform "%heal% 2, Self"
      for each target damaged'],[!1,"38","* %move% +0","* %attack% -1","** %target% 2","** %dark%%use_element%: +2 %attack%, %disarm%"],[!0,"07","* %attack% -1","** %range% 3","** %muddle%","* %heal% 4","** Self"]]},{class:"Hound",cards:[[!1,"06","* %move% -1","* %attack% +0","** %immobilize%"],[!1,"07","* %move% +0","* %muddle%","** Target all adjacent enemies"],[!0,"19","* %move% +1","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Hound's allies"],[!0,"19","* %move% +1","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Hound's allies"],[!1,"26","* %move% +0","* %attack% +0"],[!1,"26","* %move% +0","* %attack% +0"],[!1,"83","* %move% -2","* %attack% +1"],[!1,"72","* %attack% -1","** %pierce% 2","* %move% -2","* %attack% -1","** %pierce% 2"]]},{class:"Imp",cards:[[!1,"05","* %shield% 5","* %heal% 1","** Self"],[!1,"37","* %move% +0","* %attack% +0","** %range% +0"],[!1,"37","* %move% +0","* %attack% +0","** %range% +0"],[!1,"42","* %move% +1","* %heal% 2","** %range% 3"],[!0,"43","* %move% +0","* %attack% -1","** %range% +0, %target% 2, %poison%"],[!1,"76","* %move% -1","* %attack% +1","** %range% +0"],[!0,"43","* %move% +0","* %attack% -1","** %range% +0, %target% 2, %curse%"],[!1,"24","* %strengthen%","** Affect all allies within %range% 2","* %muddle%","** Target all enemies within %range% 2"]]},{class:"Living Bones",cards:[[!1,"64","* %move% -1","* %attack% +1"],[!0,"20","* %move% -2","* %attack% +0","* %heal% 2","** Self"],[!1,"25","* %move% +1","* %attack% -1"],[!1,"45","* %move% +0","* %attack% +0"],[!1,"45","* %move% +0","* %attack% +0"],[!1,"81","* %attack% +2"],[!1,"74","* %move% +0","* %attack% +0","** Target one enemy with all attacks"],[!0,"12","* %shield% 1","* %heal% 2","** Self"]]},{class:"Living Corpse",cards:[[!1,"21","* %move% +1","* %muddle% and %immobilize%","** Target one adjacent enemy"],[!1,"47","* %move% +1","* %attack% -1"],[!0,"66","* %move% +0","* %attack% +0"],[!0,"66","* %move% +0","* %attack% +0"],[!1,"82","* %move% -1","* %attack% +1"],[!1,"91","* %move% +1","* Living Corpse suffers 1 damage."],[!1,"71","* %move% +0","* %attack% +1","* %poison%","** Target all adjacent enemies"],[!1,"32","* %attack% +2","** %push% 1","* Living Corpse suffers 1 damage."]]},{class:"Living Spirit",cards:[[!0,"22","* %move% -1","* %attack% -1","** %range% +0","** %muddle%"],[!0,"33","* %move% +0","* %attack% -1","** %range% +0","** Target all enemies within range"],[!1,"48","* %move% +0","* %attack% +0","** %range% +0"],[!1,"48","* %move% +0","* %attack% +0","** %range% +0"],[!1,"61","* %attack% +0","** %range% -1","** %target% 2"],[!1,"75","* %move% -1","* %attack% +1","** %range% -1","* %heal% 1","** Self"],[!1,"55","* %move% +0","* %curse%","** %range% +0","** Target all enemies within range","* %ice%"],[!1,"67","* %move% -1","* %attack% +1","** %range% +0","** %ice%%use_element%: %stun%"]]},{class:"Lurker",cards:[[!0,"11","* %shield% 1","** %ice%%use_element%: %shield% 2 instead","* %wound%","** Target all adjacent enemies"],[!1,"28","* %move% +1","* %attack% -1"],[!1,"38","* %move% +0","* %attack% +0"],[!1,"38","* %move% +0","* %attack% +0","** Target one enemy with all attacks"],[!1,"61","* %move% -1","* %attack% +1"],[!1,"64","* %attack% +1","** Target all adjacent enemies"],[!1,"41","* %ice%%use_element%: %strengthen%","** Self","* %move% +0","* %attack% -1","** %wound%"],[!0,"23","* %shield% 1","* %move% +0","* %attack% -1","* %ice%"]]},{class:"Night Demon",cards:[[!1,"04","* %move% +1","* %attack% -1","* %dark%"],[!1,"07","* %move% +1","* %attack% -1","* %dark%%use_element%: %invisible%","** Self"],[!1,"22","* %move% +0","* %attack% +0","* %dark%"],[!1,"26","* %attack% -2","** %range% 3","** %target% 3","** %dark%%use_element%: %muddle%"],[!0,"46","* %move% -1","* %attack% +1","** %dark%%use_element%: +2 %attack%"],[!0,"41","* %move% -1","* %attack% +1","* %dark%"],[!1,"35","* %attack% -1","* %attack% -1","** %pierce% 2","* %light%%use_element%: %curse%","** Self"],[!1,"15","* %move% +0","* %attack% -1","* All adjacent enemies and allies suffer 1 damage.","* %any%%use_element%: %dark%"]]},{class:"Ooze",cards:[[!1,"36","* %move% +1","* %attack% -1","** %range% +0"],[!1,"57","* %move% +0","* %attack% +0","** %range% +0"],[!1,"59","* %attack% +0","** %range% +0","** %target% 2","** %poison%"],[!1,"66","* %move% -1","* %attack% +1","** %range% +1"],[!0,"94","* Ooze suffers 2 damage ","** Summons normal Ooze with a hit point value equal to the summoning Ooze's current hit point value (limited by a normal Ooze's specified maximum hit point value)"],[!0,"94","* Ooze suffers 2 damage ","** Summons normal Ooze with a hit point value equal to the summoning Ooze's current hit point value (limited by a normal Ooze's specified maximum hit point value)"],[!1,"85","* %push% 1 and","* %poison%","** Target all adjacent enemies","* %attack% +1","** %range% -1"],[!1,"66","* %move% -1","* %loot% 1","* %heal% 2","** Self"]]},{class:"Rending Drake",cards:[[!1,"12","* %move% +1","* %attack% -1"],[!0,"13","* %attack% -1","* %move% -1","* %attack% -1"],[!1,"25","* %move% +0","* %attack% +0"],[!1,"39","* %move% -1","* %attack% +1"],[!1,"54","* %move% -2","* %attack% -1","** %range% 3","** %target% 2","** %poison%"],[!1,"59","* %move% -2","* %attack% +1","** %target% 2"],[!1,"06","* %shield% 2","* %heal% 2","** Self","* %strengthen%","** Self"],[!0,"72","* %attack% -1","* %attack% -1","* %attack% -2"]]},{class:"Savvas Icestorm",cards:[[!1,"70","* %push% 2","** Target all adjacent enemies","** %air%%use_element%: %push% 4 instead","* %attack% +1","** %range% +1"],[!1,"98","* Summon normal Wind Demon","* %air%"],[!1,"98","* Summon normal Frost Demon","* %ice%"],[!1,"19","* %move% +0","* %attack% -1","** %range% -1","* %shield% 1","** Affect self and all allies within %range% 2","* %ice%"],[!1,"14","* %attack% +0","** %range% +0","** %ice%%use_element%: +2 %attack%, %immobilize%","* %retaliate% 2","* %air%"],[!1,"14","* %shield% 4","* %heal% 2","** %range% 3","** %ice%%use_element%: +3 %heal%","* %air%%use_element%: %attack% +0"],[!0,"47","* %disarm%","** Target all adjacent enemies","* %move% +0","* %attack% -1","** %range% +0","* %air%"],[!0,"35","* %move% -1","* %attack% -1 %aoe-triangle-3-side-with-corner-black% ","* %ice%"]]},{class:"Savvas Lavaflow",cards:[[!1,"97","* Summon normal Flame Demon","* %fire%"],[!1,"97","* Summon normal Earth Demon","* %earth%"],[!1,"22","* %move% +1","* %attack% -1","** Target all adjacent enemies","* %fire%%use_element%: %retaliate% 3"],[!0,"68","* %move% -1","* %attack% +1","** %range% 3","** All allies and enemies adjacent to the target suffer 2 damage.","* %earth%"],[!1,"41","* %move% +0","* %attack% -1 %aoe-line-4-with-black% ","** %earth%%use_element%: +2 %attack%, %immobilize%"],[!1,"51","* All enemies suffer 2 damage.","* %fire%%use_element%: %wound% all enemies","* %earth%%use_element%: %disarm% all enemies"],[!1,"31","* %heal% 4","** %range% 3","** %earth%%use_element%: %target% 3"],[!0,"68","* %move% -1","* %attack% -1","** %range% 3","** %target% 2","* %fire%"]]},{class:"Scout",cards:[[!1,"29","* %move% -1","* %attack% -1","** %range% 3"],[!1,"40","* %move% +1","* %attack% -1"],[!1,"53","* %move% +0","* %attack% +0"],[!1,"54","* %move% -2","* %attack% +0","** %range% 3","** %poison%"],[!1,"69","* %move% -1","* %attack% +1"],[!0,"92","* %attack% +2","** %poison% "],[!0,"35","* %move% +1","** %jump%","* %loot% 1"],[!1,"79","* %attack% -1","** %range% 4","** %target% 2"]]},{class:"Shaman",cards:[[!1,"08","* %move% +0","* %attack% -1","** %range% +0","** %disarm%"],[!1,"08","* %move% -1","* %attack% +0","** %range% +0","** %immobilize%"],[!0,"23","* %move% +0","* %heal% 3","** %range% 3"],[!0,"23","* %move% +0","* %heal% 3","** %range% 3"],[!1,"62","* %move% +0","* %attack% +0","** %range% +0"],[!1,"74","* %move% -1","* %attack% +1","** %range% +0"],[!1,"89","* %move% -1","* %heal% 1","** Affect all adjacent allies","* %bless%","** Self"],[!1,"09","* %move% +1","* %attack% -1","** %range% +0, %curse%, %target% 2"]]},{class:"Spitting Drake",cards:[[!1,"32","* %move% +1","* %attack% -1","** %range% +0"],[!1,"52","* %move% +0","* %attack% +0","** %range% +0"],[!0,"57","* %move% +0","* %attack% -1 %aoe-triangle-2-side%","** %range% +0"],[!1,"27","* %attack% +0","** %range% +0, %target% 2, %poison%"],[!1,"87","* %move% -1","* %attack% +1","** %range% +0"],[!1,"89","* %attack% -2","** %range% +0","** %stun%"],[!1,"06","* %shield% 2","* %heal% 2","** Self","* %strengthen%","** Self"],[!0,"89","* %move% -1","* %attack% -2 %aoe-circle%","** %range% +0","** %poison%"]]},{class:"Stone Golem",cards:[[!1,"11","* %retaliate% 3","** %range% 3"],[!1,"28","* %move% +1","* %attack% +0","* Stone Golem suffers 1 damage."],[!0,"51","* %move% +1","* %attack% -1"],[!1,"65","* %move% +0","* %attack% +0"],[!1,"72","* %attack% +1","** %range% 3","* Stone Golem suffers 2 damage"],[!0,"90","* %move% -1","* %attack% +1"],[!1,"28","* %move% +1","* %attack% -2","** %range% 3","** %pull% 2","** %immobilize%"],[!1,"83","* %move% +0","* %attack% -1","** Target all adjacent enemies"]]},{class:"Sun Demon",cards:[[!0,"17","* %heal% 3","** %range% 3","** %light%%use_element%: Target all allies within range instead"],[!1,"36","* %move% +0","* %attack% +0","** Target all adjacent enemies","* %light%"],[!1,"36","* %move% +0","* %attack% +0","** Target all adjacent enemies","* %light%"],[!1,"68","* %move% +0","* %attack% +1","* %light%"],[!0,"73","* %move% +0","* %attack% +1","* %light%%use_element%: %heal% 3","** Self"],[!1,"95","* %move% -1","* %attack% +0","** %range% 4","** %light%%use_element%: Target all enemies within range"],[!1,"88","* %move% -1","* %attack% -1","** Target all adjacent enemies","* %dark%%use_element%: %muddle%","** Self"],[!1,"50","* %move% +0","* %attack% +0","** %range% 3","* %any%%use_element%: %light%"]]},{class:"Wind Demon",cards:[[!1,"09","* %attack% -1","** %range% +0","* %heal% 1","** Self","* %air%%use_element%: %invisible%
      Self"],[!0,"21","* %move% +0","* %attack% +0","** %range% +0, %pull% 1","* %air%"],[!0,"21","* %move% +0","* %attack% +0","** %range% +0, %pull% 1","* %air%"],[!1,"29","* %move% +0","* %attack% -1","** %range% +0, %target% 2","** %air%%use_element%: %push% 2"],[!1,"37","* %move% +0","* %attack% +0
      %aoe-4-with-black%
      ","** %air%%use_element%: +1 Attack
      %aoe-circle-with-side-black%
      "],[!1,"43","* %move% -1","* %attack% +1","** %range% +0","** %air%%use_element%: %target% 2"],[!1,"43","* %push% 1","** Target all adjacent enemies","* %attack% +0","** %range% +0","** %earth%%use_element%: -2 %range%"],[!1,"02","* %shield% 1","* %move% -1","* %attack% -1","** %range% +0","* %any%%use_element%: %air%"]]}]),z={MODIFIER:"modifier",ABILITY:"ability",BOSS:"boss"},G={MODIFIER_CARD_DRAWN:"modifierCardDrawn",MODIFIER_DECK_SHUFFLE_REQUIRED:"modfierDeckShuffleRequired"};function F(e,a){const t={};return t.back=a,t.front=e,t.flip_up=function(e){C(this.back,"up",!e),C(this.back,"down",e),C(this.front,"up",e),C(this.front,"down",!e)},t.set_depth=function(e){e=e.toString(),this.back.style.zIndex=e,this.front.style.zIndex=e},t.push_down=function(){const e=parseInt(this.back.style.zIndex,10),a=parseInt(this.front.style.zIndex,10);this.back.style.zIndex=(e-1).toString(),this.front.style.zIndex=(a-1).toString()},t.addClass=function(e){this.front.classList.add(e),this.back.classList.add(e)},t.removeClass=function(e){this.front.classList.remove(e),this.back.classList.remove(e)},t.attach=function(e){e.appendChild(this.back),e.appendChild(this.front)},t.flip_up(!1),t}function O(e,a){const t=document.createElement("div");t.className="card ability back down";const n=document.createElement("span");return n.className="name",n.innerText=e+"-"+a,t.appendChild(n),t}function V(e,a,t,n,l,i,s,r,o){const m=document.createElement("div");m.className="card ability front down";const c=document.createElement("span");c.className="name",c.innerText=a+"-"+r,m.appendChild(c);const h=document.createElement("span");if(h.className="healthNormal",h.innerText="HP "+o[0],m.appendChild(h),o[1]>0){const e=document.createElement("span");e.className="healthElite",e.innerText="HP "+o[1],m.appendChild(e)}const u=document.createElement("span");if(u.className="initiative",u.innerText=e,m.appendChild(u),t){const e=document.createElement("img");e.src="images/shuffle.svg",m.appendChild(e)}let d=0,v=m;n=n.filter(Boolean);for(let e=0;e=0;)t+=1,a=a.substr(1);const r=t-d;for(;d!==t;)if(r>0){const e=document.createElement("ul");n.length>5&&(e.style.fontSize=100-2.5*n.length+"%"),v.appendChild(e),v=e;const a=document.createElement("li");v.appendChild(a),v=a,d+=1}else v=(v=v.parentElement).parentElement,d-=1;if(d>0&&r<=0){v=v.parentElement;const e=document.createElement("li");v.appendChild(e),v=e}const o=b(a.trim(),l,i,s);v.insertAdjacentHTML("beforeend",o)}return m}function j(e,a,t){const l=N[e];l.name=a,l.level=t;const i=JSON.parse(A(a)),s={class:l.class,name:l.name,type:z.ABILITY,draw_pile:[],discard:[],move:[0,0],attack:[0,0],range:[0,0],level:l.level,health:[0,0]};for(let e=0;e0){const e=this.discard[this.discard.length-1];let a=e.starting_lines,t=[];if(this.is_boss()){let e=[];a.forEach((function(a){e=e.concat(p(a,s.special1,s.special2))})),a=e,this.immunities&&(t=t.concat(v(this.immunities))),this.notes&&(t=t.concat(g(this.notes)))}else this.attributes&&(t=t.concat(d(this.attributes)));e.paint_front_card(this.get_real_name(),a.concat(t),this.attack,this.move,this.range,this.level,this.health),e.ui.set_depth(-3),e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}R(this)},s.draw_top_card=function(){let e=this.draw_pile[0].starting_lines,a=[];if(this.is_boss()){let t=[];e.forEach((function(e){t=t.concat(p(e,s.special1,s.special2))})),e=t,this.immunities&&(a=a.concat(v(this.immunities))),this.notes&&(a=a.concat(g(this.notes)))}else this.attributes&&(a=a.concat(d(this.attributes)));this.draw_pile[0].paint_front_card(this.get_real_name(),e.concat(a),this.attack,this.move,this.range,this.level,this.health),R(this)},s.must_reshuffle=function(){return!this.draw_pile.length||(B&&this.discard.length?this.discard[0].shuffle_next:void 0)},s.set_stats_monster=function(e){this.attack=e.attack,this.move=e.move,this.range=e.range,this.attributes=e.attributes,this.health=e.health},s.set_stats_boss=function(e){this.attack=e.attack,this.move=e.move,this.range=e.range,this.special1=e.special1,this.special2=e.special2,this.immunities=e.immunities,this.notes=e.notes,this.health=e.health},s.get_real_name=function(){return this.name?this.name:this.class},s.is_boss=function(){return this.class===n.Boss.class},s.set_card_piles=function(e,a){for(let a=0;a0&&e.discard[0].ui.addClass("lift");const a=e.draw_pile.shift();J(a,!0),e.discard.unshift(a)}function J(e,a){e.ui.set_depth(-3),a&&e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}function X(e){e.must_reshuffle()?U(e,!0):E.forEach((function(a){a.class===e.class&&(a.draw_top_card(),W(a))})),L(e.name,JSON.stringify(e))}function q(e){e.clean_discard_pile(),U(e,!0),document.body.dispatchEvent(new CustomEvent(G.MODIFIER_DECK_SHUFFLE_REQUIRED,{detail:{shuffle:!1}}))}function Z(e){e.clean_advantage_deck(),e.must_reshuffle()?q(e):(W(e),document.body.dispatchEvent(new CustomEvent(G.MODIFIER_CARD_DRAWN,{detail:{card_type:e.discard[0].card_type,count:e.count(e.discard[0].card_type)}})),e.shuffle_end_of_round()&&document.body.dispatchEvent(new CustomEvent(G.MODIFIER_DECK_SHUFFLE_REQUIRED,{detail:{shuffle:!0}}))),L("modifier_deck",JSON.stringify(e))}function K(e){let a;1===e.draw_pile.length?(Z(e),a=e.discard[0],q(e),J(a=e.draw_pile.shift(),!1),e.discard.unshift(a),Z(e)):0===e.draw_pile.length?(e.clean_advantage_deck(),q(e),Z(e),a=e.discard[0],Z(e)):(Z(e),a=e.discard[0],Z(e)),e.discard[0].ui.addClass("right"),a.ui.addClass("left"),e.advantage_to_clean=!0}function Q(e){return{ui:new F(function(e){const a=document.createElement("img");a.className="cover",a.src=e;const t=document.createElement("div");return t.className="card modifier front",t.appendChild(a),t}(e.image),function(){const e=document.createElement("div");return e.className="card modifier back",e}()),card_type:e.type,shuffle_next_round:e.shuffle}}function $(){T.shuffle_end_of_round()&&(T.clean_advantage_deck(),q(T)),L("modifier_deck",JSON.stringify(T))}function Y(e,a){const t=document.getElementById("tableau");document.getElementById("currentdeckslist").innerHTML="";const n=E.filter((function(t){return!a||0===e.filter((function(e){return e.name===t.name&&e.level===t.level})).length})),l=e.filter((function(e){return!a||0===E.filter((function(a){return e.name===a.name&&e.level===a.level})).length}));if(T)a||(t.removeChild(document.getElementById("modifier-container")),ee(),te(t,T,a));else if(ee(),te(t,T,a),a){const e=JSON.parse(A("modifier_deck")),a=ae("curse",e),t=ae("bless",e);for(let e=0;e-1&&E.splice(e,1),t.removeChild(l)},e.is_boss()?"Boss"!==e.get_real_name()&&e.set_stats_boss((i=e.get_real_name(),s=e.level,i=i.replace("Boss: ",""),{attack:[r.bosses[i].level[s].attack],move:[r.bosses[i].level[s].move],range:[r.bosses[i].level[s].range],special1:r.bosses[i].level[s].special1,special2:r.bosses[i].level[s].special2,immunities:r.bosses[i].level[s].immunities,notes:r.bosses[i].level[s].notes,health:[r.bosses[i].level[s].health]})):e.set_stats_monster(function(e,a){return{attack:[r.monsters[e].level[a].normal.attack,r.monsters[e].level[a].elite.attack],move:[r.monsters[e].level[a].normal.move,r.monsters[e].level[a].elite.move],range:[r.monsters[e].level[a].normal.range,r.monsters[e].level[a].elite.range],attributes:[r.monsters[e].level[a].normal.attributes,r.monsters[e].level[a].elite.attributes],health:[r.monsters[e].level[a].normal.health,r.monsters[e].level[a].elite.health]}}(e.get_real_name(),e.level)),U(e),a?e.draw_top_discard():R(e),E.push(e);const o=document.getElementById("currentdeckslist"),m=document.createElement("li");m.className="currentdeck",o.appendChild(m);const c=document.createElement("a");c.id="switch-"+n,c.href="#switch-"+n,c.innerText=e.get_real_name(),c.title="Click to show/hide deck",c.addEventListener("click",(function(){const e=document.getElementById(this.id.replace("switch-",""));e.className="hiddendeck"===e.className?"card-container":"hiddendeck"}),!1),m.appendChild(c)})),M()}function ee(){T=function(){const e={name:"Monster modifier deck",type:z.MODIFIER,draw_pile:[],discard:[],advantage_to_clean:!1,draw_top_discard:function(){if(this.discard.length>0){const e=this.discard[this.discard.length-1];e.ui.set_depth(-3),e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}R(this)}};e.count=function(e){return this.draw_pile.filter((function(a){return a.card_type===e})).length}.bind(e),e.remove_card=function(a){for(let t=0;t0}.bind(e),e.must_reshuffle=function(){return!this.draw_pile.length}.bind(e),e.clean_discard_pile=function(){for(let a=0;a7?7:this.spinner.value},t.set_value=function(e){this.spinner.value=e>7?7:e},t}function le(){const e={};e.ul=document.createElement("ul"),e.ul.className="selectionlist",e.checkboxes={},e.level_selectors={},e.global_level_selector=null;const a=document.createElement("li"),t=new ne("Select global level ",!0);a.appendChild(t.html),e.global_level_selector=t;const l=y("button","applylevel","Apply All","");l.input.onclick=function(){for(let a in e.level_selectors)e.level_selectors[a].set_value(e.global_level_selector.get_selection())},a.appendChild(l.root),e.ul.appendChild(a);for(let a in n){const t=n[a].name,l=document.createElement("li"),i=y("checkbox","deck",t,t);l.appendChild(i.root);const s=new ne(" with level ",!0);l.appendChild(s.html),e.ul.appendChild(l),e.checkboxes[t]=i.input,e.level_selectors[t]=s}return e.get_selection=function(){return D(this.checkboxes).filter(w).map(x)},e.get_selected_decks=function(){const a=this.get_selection();var t;return t=a.map(function(a){const t=a in n?n[a]:[];return t.level=e.level_selectors[a].get_selection(),t}.bind(this)),Array.prototype.concat.apply([],t)},e.set_selection=function(a){D(this.checkboxes).forEach((function(e){e.checked=!1})),a.forEach(function(a){const t=this.checkboxes[a.name];t&&(t.checked=!0,e.level_selectors[a.name].set_value(a.level))}.bind(this))},e}function ie(e){const a={};a.ul=document.createElement("ul"),a.ul.className="selectionlist",a.spinner=null,a.decks={},a.special_rules={},a.level_selector=null,a.level_selector=new ne("Select level",!1),a.ul.appendChild(a.level_selector.html);for(let t=0;t=0&&e===o.living_corpse_two_levels_extra.affected_deck?Math.min(7,parseInt(n)+o.living_corpse_two_levels_extra.extra_levels):n},a.get_scenario_decks=function(){return this.decks[this.get_selection()].map((function(e){return n[e.name]?e.class=n[e.name].class:-1!==e.name.indexOf("Boss")&&(e.class=n.Boss.class),e.level=a.get_level(e.name,a.get_special_rules()),e}))},a.get_special_rules=function(){return this.special_rules[this.get_selection()]},a}document.addEventListener("DOMContentLoaded",(function(){!function(){const e=document.getElementById("deckspage"),a=document.getElementById("scenariospage"),t=document.getElementById("applydecks"),n=document.getElementById("applyscenario"),l=document.getElementById("applyload"),i=document.getElementById("showmodifierdeck"),s=new le,r=new ie(m);e.insertAdjacentElement("afterbegin",s.ul),a.insertAdjacentElement("afterbegin",r.ul),t.onclick=function(){localStorage.clear();const e=s.get_selected_decks();L("selected_deck_names",JSON.stringify(e)),Y(e.map((function(e){return j(e.class,e.name,e.level)})),!0);const a=document.getElementById("showmodifierdeck-deckspage"),t=document.getElementById("modifier-container");a.checked?t.style.display="block":t.style.display="none"},n.onclick=function(){try{localStorage.clear()}catch(e){return void console.error("Local storage is required")}const e=r.get_scenario_decks();L("selected_deck_names",JSON.stringify(e)),s.set_selection(e),Y(e.map((function(e){return j(e.class,e.name,e.level)})),!1);const a=document.getElementById("modifier-container");i.checked?a.style.display="block":a.style.display="none",S(_.settingspane,_.cancelarea,!1)},l.onclick=function(){const e=JSON.parse(A("selected_deck_names"));s.set_selection(e),Y(e.map((function(e){return j(e.class,e.name,e.level)})),!0);const a=document.getElementById("modifier-container");i.checked?a.style.display="block":a.style.display="none"},window.onresize=M.bind(null,E)}(),function(){const e={scenarios:document.getElementById("scenariotab"),decks:document.getElementById("deckstab")},a={scenarios:document.getElementById("scenariospage"),decks:document.getElementById("deckspage")};_.settingspane=document.getElementById("settingspane"),_.settingsbtn=document.getElementById("settingsbtn"),_.cancelarea=document.getElementById("cancelarea"),e.scenarios.onclick=function(){f(e,a,"scenarios")},e.decks.onclick=function(){f(e,a,"decks")},_.settingsbtn.onclick=function(){S(_.settingspane,_.cancelarea,!0)},_.cancelarea.onclick=function(){S(_.settingspane,_.cancelarea,!1)},f(e,a,"scenarios")}()}))}]); \ No newline at end of file +!function(e){var a={};function t(n){if(a[n])return a[n].exports;var l=a[n]={i:n,l:!1,exports:{}};return e[n].call(l.exports,l,l.exports,t),l.l=!0,l.exports}t.m=e,t.c=a,t.d=function(e,a,n){t.o(e,a)||Object.defineProperty(e,a,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,a){if(1&a&&(e=t(e)),8&a)return e;if(4&a&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&a&&"string"!=typeof e)for(var l in e)t.d(n,l,function(a){return e[a]}.bind(null,l));return n},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)},t.p="",t(t.s=0)}([function(e,a,t){"use strict";t.r(a);const n={"Ancient Artillery":{name:"Ancient Artillery",class:"Ancient Artillery"},"Bandit Archer":{name:"Bandit Archer",class:"Archer"},"Bandit Guard":{name:"Bandit Guard",class:"Guard"},"Black Imp":{name:"Black Imp",class:"Imp"},Boss:{name:"Boss",class:"Boss"},"Cave Bear":{name:"Cave Bear",class:"Cave Bear"},"City Archer":{name:"City Archer",class:"Archer"},"City Guard":{name:"City Guard",class:"Guard"},Cultist:{name:"Cultist",class:"Cultist"},"Deep Terror":{name:"Deep Terror",class:"Deep Terror"},"Earth Demon":{name:"Earth Demon",class:"Earth Demon"},"Flame Demon":{name:"Flame Demon",class:"Flame Demon"},"Forest Imp":{name:"Forest Imp",class:"Imp"},"Frost Demon":{name:"Frost Demon",class:"Frost Demon"},"Giant Viper":{name:"Giant Viper",class:"Giant Viper"},"Harrower Infester":{name:"Harrower Infester",class:"Harrower Infester"},Hound:{name:"Hound",class:"Hound"},"Inox Archer":{name:"Inox Archer",class:"Archer"},"Inox Guard":{name:"Inox Guard",class:"Guard"},"Inox Shaman":{name:"Inox Shaman",class:"Shaman"},"Living Bones":{name:"Living Bones",class:"Living Bones"},"Living Corpse":{name:"Living Corpse",class:"Living Corpse"},"Living Spirit":{name:"Living Spirit",class:"Living Spirit"},Lurker:{name:"Lurker",class:"Lurker"},"Night Demon":{name:"Night Demon",class:"Night Demon"},Ooze:{name:"Ooze",class:"Ooze"},"Rending Drake":{name:"Rending Drake",class:"Rending Drake"},"Savvas Icestorm":{name:"Savvas Icestorm",class:"Savvas Icestorm"},"Savvas Lavaflow":{name:"Savvas Lavaflow",class:"Savvas Lavaflow"},"Spitting Drake":{name:"Spitting Drake",class:"Spitting Drake"},"Stone Golem":{name:"Stone Golem",class:"Stone Golem"},"Sun Demon":{name:"Sun Demon",class:"Sun Demon"},"Vermling Scout":{name:"Vermling Scout",class:"Scout"},"Vermling Shaman":{name:"Vermling Shaman",class:"Shaman"},"Wind Demon":{name:"Wind Demon",class:"Wind Demon"}},l={BLESS:"bless",CURSE:"curse",PLUS0:"plus0",PLUS1:"plus1",PLUS2:"plus2",MINUS1:"minus1",MINUS2:"minus2",NULL:"null",DOUBLE:"double"},i={BLESS:{type:l.BLESS,shuffle:!1,image:"images/attack_mod_bless.jpg"},CURSE:{type:l.CURSE,shuffle:!1,image:"images/attack_mod_curse.jpg"},PLUS0:{type:l.PLUS0,shuffle:!1,image:"images/attack_mod_+0.jpg"},PLUS1:{type:l.PLUS1,shuffle:!1,image:"images/attack_mod_+1.jpg"},PLUS2:{type:l.PLUS2,shuffle:!1,image:"images/attack_mod_+2.jpg"},MINUS1:{type:l.MINUS1,shuffle:!1,image:"images/attack_mod_-1.jpg"},MINUS2:{type:l.MINUS2,shuffle:!1,image:"images/attack_mod_-2.jpg"},NULL:{type:l.NULL,shuffle:!0,image:"images/attack_mod_null.jpg"},DOUBLE:{type:l.DOUBLE,shuffle:!0,image:"images/attack_mod_2x.jpg"}},s=[i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS0,i.PLUS1,i.PLUS1,i.PLUS1,i.PLUS1,i.PLUS1,i.MINUS1,i.MINUS1,i.MINUS1,i.MINUS1,i.MINUS1,i.PLUS2,i.MINUS2,i.NULL,i.DOUBLE],r={monsters:{"Ancient Artillery":{level:[{level:0,normal:{health:4,move:0,attack:2,range:4,attributes:[]},elite:{health:7,move:0,attack:3,range:5,attributes:[]}},{level:1,normal:{health:6,move:0,attack:2,range:4,attributes:[]},elite:{health:9,move:0,attack:3,range:5,attributes:[]}},{level:2,normal:{health:7,move:0,attack:2,range:5,attributes:[]},elite:{health:11,move:0,attack:3,range:6,attributes:[]}},{level:3,normal:{health:8,move:0,attack:3,range:5,attributes:[]},elite:{health:13,move:0,attack:4,range:6,attributes:[]}},{level:4,normal:{health:9,move:0,attack:4,range:5,attributes:[]},elite:{health:13,move:0,attack:4,range:6,attributes:["%target% 2"]}},{level:5,normal:{health:11,move:0,attack:4,range:6,attributes:[]},elite:{health:15,move:0,attack:4,range:7,attributes:["%target% 2"]}},{level:6,normal:{health:14,move:0,attack:4,range:6,attributes:[]},elite:{health:16,move:0,attack:5,range:7,attributes:["%target% 2"]}},{level:7,normal:{health:16,move:0,attack:4,range:7,attributes:[]},elite:{health:20,move:0,attack:5,range:7,attributes:["%target% 2"]}}]},"Bandit Archer":{level:[{level:0,normal:{health:4,move:2,attack:2,range:3,attributes:[]},elite:{health:6,move:2,attack:3,range:3,attributes:[]}},{level:1,normal:{health:5,move:2,attack:2,range:4,attributes:[]},elite:{health:7,move:2,attack:3,range:5,attributes:[]}},{level:2,normal:{health:6,move:3,attack:2,range:4,attributes:[]},elite:{health:9,move:3,attack:3,range:5,attributes:[]}},{level:3,normal:{health:6,move:3,attack:3,range:4,attributes:[]},elite:{health:10,move:3,attack:4,range:5,attributes:[]}},{level:4,normal:{health:8,move:3,attack:3,range:4,attributes:[]},elite:{health:10,move:3,attack:4,range:6,attributes:["%poison%"]}},{level:5,normal:{health:10,move:3,attack:3,range:5,attributes:[]},elite:{health:12,move:4,attack:4,range:6,attributes:["%poison%"]}},{level:6,normal:{health:10,move:3,attack:4,range:5,attributes:[]},elite:{health:13,move:4,attack:5,range:6,attributes:["%poison%"]}},{level:7,normal:{health:13,move:3,attack:4,range:5,attributes:[]},elite:{health:17,move:4,attack:5,range:6,attributes:["%poison%"]}}]},"Bandit Guard":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:[]},elite:{health:9,move:2,attack:3,range:0,attributes:[]}},{level:1,normal:{health:6,move:3,attack:2,range:0,attributes:[]},elite:{health:9,move:2,attack:3,range:0,attributes:["%shield% 1"]}},{level:2,normal:{health:6,move:3,attack:3,range:0,attributes:[]},elite:{health:10,move:2,attack:4,range:0,attributes:["%shield% 1"]}},{level:3,normal:{health:9,move:3,attack:3,range:0,attributes:[]},elite:{health:10,move:3,attack:4,range:0,attributes:["%shield% 2"]}},{level:4,normal:{health:10,move:4,attack:3,range:0,attributes:[]},elite:{health:11,move:3,attack:4,range:0,attributes:["%muddle%","%shield% 2"]}},{level:5,normal:{health:11,move:4,attack:4,range:0,attributes:[]},elite:{health:12,move:3,attack:5,range:0,attributes:["%muddle%","%shield% 2"]}},{level:6,normal:{health:14,move:4,attack:4,range:0,attributes:[]},elite:{health:14,move:4,attack:5,range:0,attributes:["%muddle%","%shield% 2"]}},{level:7,normal:{health:16,move:5,attack:4,range:0,attributes:[]},elite:{health:14,move:3,attack:5,range:0,attributes:["%muddle%","%shield% 3"]}}]},"Black Imp":{level:[{level:0,normal:{health:3,move:1,attack:1,range:3,attributes:[]},elite:{health:4,move:1,attack:2,range:3,attributes:["%poison%"]}},{level:1,normal:{health:4,move:1,attack:1,range:3,attributes:["%poison%"]},elite:{health:6,move:1,attack:2,range:3,attributes:["%poison%"]}},{level:2,normal:{health:5,move:1,attack:1,range:4,attributes:["%poison%"]},elite:{health:8,move:1,attack:2,range:4,attributes:["%poison%"]}},{level:3,normal:{health:5,move:1,attack:2,range:4,attributes:["%poison%"]},elite:{health:8,move:1,attack:3,range:4,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:4,normal:{health:7,move:1,attack:2,range:4,attributes:["%poison%"]},elite:{health:11,move:1,attack:3,range:4,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:5,normal:{health:9,move:1,attack:2,range:4,attributes:["%poison%"]},elite:{health:12,move:1,attack:3,range:5,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:6,normal:{health:10,move:1,attack:3,range:4,attributes:["%poison%"]},elite:{health:14,move:1,attack:4,range:5,attributes:["Attackers gain Disadvantage","%poison%"]}},{level:7,normal:{health:12,move:1,attack:3,range:4,attributes:["%poison%"]},elite:{health:17,move:1,attack:4,range:5,attributes:["Attackers gain Disadvantage","%poison%"]}}]},"Cave Bear":{level:[{level:0,normal:{health:7,move:3,attack:3,range:0,attributes:[]},elite:{health:11,move:3,attack:4,range:0,attributes:[]}},{level:1,normal:{health:9,move:3,attack:3,range:0,attributes:[]},elite:{health:14,move:3,attack:4,range:0,attributes:[]}},{level:2,normal:{health:11,move:4,attack:3,range:0,attributes:[]},elite:{health:17,move:4,attack:4,range:0,attributes:[]}},{level:3,normal:{health:13,move:4,attack:4,range:0,attributes:[]},elite:{health:20,move:4,attack:5,range:0,attributes:[]}},{level:4,normal:{health:16,move:4,attack:4,range:0,attributes:[]},elite:{health:21,move:5,attack:5,range:0,attributes:["%wound%"]}},{level:5,normal:{health:17,move:5,attack:4,range:0,attributes:["%wound%"]},elite:{health:24,move:5,attack:6,range:0,attributes:["%wound%"]}},{level:6,normal:{health:19,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:28,move:5,attack:7,range:0,attributes:["%wound%"]}},{level:7,normal:{health:22,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:33,move:5,attack:7,range:0,attributes:["%wound%"]}}]},"City Archer":{level:[{level:0,normal:{health:4,move:1,attack:2,range:3,attributes:[]},elite:{health:6,move:1,attack:3,range:4,attributes:[]}},{level:1,normal:{health:5,move:1,attack:2,range:4,attributes:[]},elite:{health:6,move:1,attack:3,range:5,attributes:["%pierce% 1","%shield% 1"]}},{level:2,normal:{health:6,move:1,attack:3,range:4,attributes:[]},elite:{health:7,move:1,attack:4,range:5,attributes:["%pierce% 2","%shield% 1"]}},{level:3,normal:{health:6,move:2,attack:3,range:4,attributes:["%shield% 1"]},elite:{health:8,move:2,attack:4,range:5,attributes:["%pierce% 2","%shield% 2"]}},{level:4,normal:{health:8,move:2,attack:3,range:5,attributes:["%shield% 1"]},elite:{health:10,move:2,attack:4,range:6,attributes:["%pierce% 2","%shield% 2"]}},{level:5,normal:{health:9,move:2,attack:4,range:5,attributes:["%shield% 1"]},elite:{health:11,move:2,attack:5,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:6,normal:{health:9,move:3,attack:4,range:5,attributes:["%shield% 2"]},elite:{health:12,move:3,attack:6,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:7,normal:{health:10,move:3,attack:4,range:6,attributes:["%shield% 2"]},elite:{health:13,move:3,attack:6,range:7,attributes:["%pierce% 3","%shield% 3"]}}]},"City Guard":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:[]},elite:{health:6,move:2,attack:3,range:0,attributes:["%shield% 1"]}},{level:1,normal:{health:5,move:2,attack:2,range:0,attributes:["%shield% 1"]},elite:{health:6,move:2,attack:3,range:0,attributes:["%shield% 2"]}},{level:2,normal:{health:7,move:2,attack:2,range:0,attributes:["%shield% 1"]},elite:{health:9,move:2,attack:3,range:0,attributes:["%shield% 2"]}},{level:3,normal:{health:8,move:2,attack:3,range:0,attributes:["%shield% 1"]},elite:{health:9,move:2,attack:4,range:0,attributes:["%retaliate% 1","%shield% 2"]}},{level:4,normal:{health:9,move:3,attack:3,range:0,attributes:["%shield% 1"]},elite:{health:10,move:3,attack:4,range:0,attributes:["%retaliate% 2","%shield% 2"]}},{level:5,normal:{health:10,move:3,attack:3,range:0,attributes:["%shield% 2"]},elite:{health:12,move:3,attack:4,range:0,attributes:["%retaliate% 2","%shield% 3"]}},{level:6,normal:{health:11,move:3,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:13,move:3,attack:5,range:0,attributes:["%retaliate% 3","%shield% 3"]}},{level:7,normal:{health:13,move:3,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:14,move:3,attack:6,range:0,attributes:["%retaliate% 3","%shield% 3"]}}]},Cultist:{level:[{level:0,normal:{health:4,move:2,attack:1,range:0,attributes:[]},elite:{health:7,move:2,attack:2,range:0,attributes:[]}},{level:1,normal:{health:5,move:2,attack:1,range:0,attributes:[]},elite:{health:9,move:2,attack:2,range:0,attributes:[]}},{level:2,normal:{health:7,move:2,attack:1,range:0,attributes:[]},elite:{health:12,move:2,attack:2,range:0,attributes:[]}},{level:3,normal:{health:9,move:3,attack:1,range:0,attributes:[]},elite:{health:13,move:3,attack:2,range:0,attributes:["%curse%"]}},{level:4,normal:{health:10,move:3,attack:2,range:0,attributes:[]},elite:{health:15,move:3,attack:3,range:0,attributes:["%curse%"]}},{level:5,normal:{health:11,move:3,attack:2,range:0,attributes:["%curse%"]},elite:{health:18,move:3,attack:3,range:0,attributes:["%curse%"]}},{level:6,normal:{health:14,move:3,attack:2,range:0,attributes:["%curse%"]},elite:{health:22,move:3,attack:3,range:0,attributes:["%curse%"]}},{level:7,normal:{health:15,move:3,attack:3,range:0,attributes:["%curse%"]},elite:{health:25,move:3,attack:4,range:0,attributes:["%curse%"]}}]},"Deep Terror":{level:[{level:0,normal:{health:3,move:0,attack:2,range:0,attributes:[]},elite:{health:5,move:0,attack:3,range:0,attributes:[]}},{level:1,normal:{health:4,move:0,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:6,move:0,attack:3,range:0,attributes:["%retaliate% 1"]}},{level:2,normal:{health:4,move:0,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:7,move:0,attack:4,range:0,attributes:["%retaliate% 1"]}},{level:3,normal:{health:5,move:0,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:8,move:0,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:4,normal:{health:6,move:0,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:9,move:0,attack:5,range:0,attributes:["%retaliate% 2"]}},{level:5,normal:{health:7,move:0,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:11,move:0,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:8,move:0,attack:5,range:0,attributes:["%retaliate% 3"]},elite:{health:13,move:0,attack:6,range:0,attributes:["%retaliate% 3"]}},{level:7,normal:{health:9,move:0,attack:5,range:0,attributes:["%retaliate% 4"]},elite:{health:15,move:0,attack:6,range:0,attributes:["%retaliate% 4"]}}]},"Earth Demon":{level:[{level:0,normal:{health:7,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:2,attack:4,range:0,attributes:[]}},{level:1,normal:{health:9,move:1,attack:3,range:0,attributes:[]},elite:{health:13,move:2,attack:4,range:0,attributes:[]}},{level:2,normal:{health:12,move:1,attack:3,range:0,attributes:[]},elite:{health:18,move:2,attack:4,range:0,attributes:[]}},{level:3,normal:{health:13,move:2,attack:3,range:0,attributes:[]},elite:{health:20,move:2,attack:4,range:0,attributes:["%immobilize%"]}},{level:4,normal:{health:15,move:2,attack:4,range:0,attributes:[]},elite:{health:21,move:3,attack:5,range:0,attributes:["%immobilize%"]}},{level:5,normal:{health:17,move:2,attack:4,range:0,attributes:["%immobilize%"]},elite:{health:25,move:3,attack:5,range:0,attributes:["%immobilize%"]}},{level:6,normal:{health:20,move:2,attack:4,range:0,attributes:["%immobilize%"]},elite:{health:27,move:3,attack:6,range:0,attributes:["%immobilize%"]}},{level:7,normal:{health:22,move:3,attack:4,range:0,attributes:["%immobilize%"]},elite:{health:32,move:3,attack:6,range:0,attributes:["%immobilize%"]}}]},"Flame Demon":{level:[{level:0,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:3,move:3,attack:2,range:3,attributes:["%flying%","%shield% 3"]}},{level:1,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 3"]},elite:{health:3,move:3,attack:2,range:4,attributes:["%flying%","%retaliate% 2: %range% 2","%shield% 4"]}},{level:2,normal:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 3"]},elite:{health:4,move:3,attack:3,range:4,attributes:["%flying%","%retaliate% 3: %range% 2","%shield% 4"]}},{level:3,normal:{health:3,move:3,attack:3,range:4,attributes:["%flying%","%retaliate% 2: %range% 2","%shield% 3"]},elite:{health:5,move:3,attack:3,range:5,attributes:["%flying%","%retaliate% 3: %range% 3","%shield% 4"]}},{level:4,normal:{health:3,move:4,attack:3,range:4,attributes:["%flying%","%retaliate% 3: %range% 2","%shield% 3"]},elite:{health:5,move:4,attack:4,range:5,attributes:["%flying%","%retaliate% 4: %range% 3","%shield% 4"]}},{level:5,normal:{health:4,move:4,attack:3,range:4,attributes:["%flying%","%retaliate% 3: %range% 2","%shield% 4"]},elite:{health:6,move:4,attack:4,range:5,attributes:["%flying%","%retaliate% 4: %range% 3","%shield% 5"]}},{level:6,normal:{health:4,move:4,attack:4,range:4,attributes:["%flying%","%retaliate% 4: %range% 2","%shield% 4"]},elite:{health:7,move:4,attack:5,range:5,attributes:["%flying%","%retaliate% 5: %range% 3","%shield% 5"]}},{level:7,normal:{health:5,move:4,attack:4,range:5,attributes:["%flying%","%retaliate% 4: %range% 3","%shield% 4"]},elite:{health:8,move:4,attack:5,range:6,attributes:["%flying%","%retaliate% 5: %range% 4","%shield% 5"]}}]},"Frost Demon":{level:[{level:0,normal:{health:5,move:2,attack:3,range:0,attributes:[]},elite:{health:10,move:3,attack:3,range:0,attributes:[]}},{level:1,normal:{health:6,move:2,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:10,move:3,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:7,move:3,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:12,move:4,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:8,move:3,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:14,move:4,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:4,normal:{health:10,move:3,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:18,move:4,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:5,normal:{health:11,move:3,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:20,move:4,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:12,move:3,attack:5,range:0,attributes:["%retaliate% 3"]},elite:{health:22,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:7,normal:{health:14,move:3,attack:5,range:0,attributes:["%retaliate% 3"]},elite:{health:25,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}}]},"Forest Imp":{level:[{level:0,normal:{health:1,move:3,attack:1,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:4,move:3,attack:1,range:3,attributes:["%flying%","%shield% 1"]}},{level:1,normal:{health:2,move:3,attack:1,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:5,move:3,attack:2,range:3,attributes:["%flying%","%shield% 1"]}},{level:2,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:6,move:3,attack:2,range:3,attributes:["%flying%","%curse%","%shield% 1"]}},{level:3,normal:{health:3,move:4,attack:2,range:4,attributes:["%flying%","%shield% 1"]},elite:{health:7,move:4,attack:2,range:4,attributes:["%flying%","%curse%","%shield% 1"]}},{level:4,normal:{health:3,move:4,attack:2,range:4,attributes:["%flying%","%shield% 2"]},elite:{health:7,move:4,attack:2,range:4,attributes:["%flying%","%curse%","%shield% 2"]}},{level:5,normal:{health:4,move:4,attack:2,range:4,attributes:["%flying%","%curse%","%shield% 2"]},elite:{health:8,move:4,attack:3,range:4,attributes:["%flying%","%curse%","%shield% 2"]}},{level:6,normal:{health:4,move:4,attack:3,range:4,attributes:["%flying%","%curse%","%shield% 2"]},elite:{health:9,move:4,attack:4,range:4,attributes:["%flying%","%curse%","%shield% 2"]}},{level:7,normal:{health:6,move:4,attack:3,range:4,attributes:["%flying%","%curse%","%shield% 2"]},elite:{health:11,move:4,attack:4,range:4,attributes:["%flying%","%curse%","%shield% 2"]}}]},"Giant Viper":{level:[{level:0,normal:{health:2,move:2,attack:1,range:0,attributes:["%poison%"]},elite:{health:3,move:2,attack:2,range:0,attributes:["%poison%"]}},{level:1,normal:{health:3,move:2,attack:1,range:0,attributes:["%poison%"]},elite:{health:5,move:2,attack:2,range:0,attributes:["%poison%"]}},{level:2,normal:{health:4,move:3,attack:1,range:0,attributes:["%poison%"]},elite:{health:7,move:3,attack:2,range:0,attributes:["%poison%"]}},{level:3,normal:{health:4,move:3,attack:2,range:0,attributes:["%poison%"]},elite:{health:8,move:3,attack:3,range:0,attributes:["%poison%"]}},{level:4,normal:{health:6,move:3,attack:2,range:0,attributes:["%poison%"]},elite:{health:11,move:3,attack:3,range:0,attributes:["%poison%"]}},{level:5,normal:{health:7,move:3,attack:3,range:0,attributes:["%poison%"]},elite:{health:13,move:4,attack:3,range:0,attributes:["%poison%"]}},{level:6,normal:{health:8,move:4,attack:3,range:0,attributes:["%poison%"]},elite:{health:14,move:4,attack:4,range:0,attributes:["%poison%"]}},{level:7,normal:{health:10,move:4,attack:3,range:0,attributes:["%poison%"]},elite:{health:17,move:4,attack:4,range:0,attributes:["%poison%"]}}]},"Harrower Infester":{level:[{level:0,normal:{health:6,move:2,attack:2,range:0,attributes:[]},elite:{health:12,move:2,attack:2,range:0,attributes:[]}},{level:1,normal:{health:7,move:2,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:12,move:3,attack:2,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:8,move:2,attack:2,range:0,attributes:["%retaliate% 2"]},elite:{health:14,move:3,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:10,move:2,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:17,move:3,attack:3,range:0,attributes:["%retaliate% 3"]}},{level:4,normal:{health:12,move:3,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:19,move:3,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:5,normal:{health:12,move:3,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:21,move:3,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:15,move:3,attack:4,range:0,attributes:["%retaliate% 3"]},elite:{health:22,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:7,normal:{health:17,move:3,attack:4,range:0,attributes:["%retaliate% 4"]},elite:{health:26,move:4,attack:5,range:0,attributes:["%retaliate% 4"]}}]},Hound:{level:[{level:0,normal:{health:4,move:3,attack:2,range:0,attributes:[]},elite:{health:6,move:5,attack:2,range:0,attributes:[]}},{level:1,normal:{health:4,move:4,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:6,move:5,attack:2,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:6,move:4,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:7,move:5,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:8,move:4,attack:2,range:0,attributes:["%retaliate% 1"]},elite:{health:8,move:5,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:4,normal:{health:8,move:4,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:11,move:5,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:5,normal:{health:9,move:4,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:12,move:5,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:6,normal:{health:11,move:5,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:15,move:6,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:7,normal:{health:15,move:5,attack:3,range:0,attributes:["%retaliate% 2"]},elite:{health:15,move:6,attack:5,range:0,attributes:["%retaliate% 4"]}}]},"Inox Archer":{level:[{level:0,normal:{health:5,move:2,attack:2,range:2,attributes:[]},elite:{health:7,move:2,attack:3,range:3,attributes:[]}},{level:1,normal:{health:6,move:2,attack:2,range:3,attributes:[]},elite:{health:8,move:2,attack:3,range:4,attributes:[]}},{level:2,normal:{health:8,move:2,attack:2,range:3,attributes:[]},elite:{health:11,move:2,attack:3,range:4,attributes:[]}},{level:3,normal:{health:9,move:2,attack:3,range:3,attributes:[]},elite:{health:13,move:2,attack:4,range:4,attributes:[]}},{level:4,normal:{health:10,move:3,attack:3,range:3,attributes:[]},elite:{health:14,move:3,attack:4,range:4,attributes:["%wound%"]}},{level:5,normal:{health:12,move:3,attack:3,range:4,attributes:[]},elite:{health:17,move:3,attack:4,range:5,attributes:["%wound%"]}},{level:6,normal:{health:12,move:3,attack:4,range:4,attributes:["%wound%"]},elite:{health:19,move:3,attack:5,range:5,attributes:["%wound%"]}},{level:7,normal:{health:15,move:3,attack:4,range:4,attributes:["%wound%"]},elite:{health:23,move:3,attack:5,range:5,attributes:["%wound%"]}}]},"Inox Guard":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:[]},elite:{health:9,move:1,attack:3,range:0,attributes:["%retaliate% 1"]}},{level:1,normal:{health:8,move:2,attack:2,range:0,attributes:[]},elite:{health:10,move:2,attack:3,range:0,attributes:["%retaliate% 2"]}},{level:2,normal:{health:9,move:2,attack:3,range:0,attributes:[]},elite:{health:12,move:2,attack:4,range:0,attributes:["%retaliate% 2"]}},{level:3,normal:{health:11,move:3,attack:3,range:0,attributes:[]},elite:{health:15,move:2,attack:4,range:0,attributes:["%retaliate% 3"]}},{level:4,normal:{health:12,move:3,attack:3,range:0,attributes:["%retaliate% 1"]},elite:{health:17,move:2,attack:5,range:0,attributes:["%retaliate% 3"]}},{level:5,normal:{health:13,move:3,attack:4,range:0,attributes:["%retaliate% 1"]},elite:{health:19,move:2,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:6,normal:{health:16,move:3,attack:4,range:0,attributes:["%retaliate% 1"]},elite:{health:21,move:3,attack:5,range:0,attributes:["%retaliate% 4"]}},{level:7,normal:{health:19,move:3,attack:4,range:0,attributes:["%retaliate% 2"]},elite:{health:23,move:3,attack:6,range:0,attributes:["%retaliate% 4"]}}]},"Inox Shaman":{level:[{level:0,normal:{health:4,move:1,attack:2,range:3,attributes:[]},elite:{health:6,move:2,attack:3,range:3,attributes:[]}},{level:1,normal:{health:6,move:1,attack:2,range:3,attributes:[]},elite:{health:9,move:2,attack:3,range:3,attributes:[]}},{level:2,normal:{health:7,move:2,attack:2,range:3,attributes:[]},elite:{health:11,move:3,attack:3,range:3,attributes:[]}},{level:3,normal:{health:9,move:2,attack:2,range:4,attributes:[]},elite:{health:14,move:3,attack:3,range:4,attributes:[]}},{level:4,normal:{health:10,move:2,attack:3,range:4,attributes:[]},elite:{health:16,move:3,attack:4,range:4,attributes:[]}},{level:5,normal:{health:13,move:2,attack:3,range:4,attributes:[]},elite:{health:20,move:3,attack:4,range:4,attributes:[]}},{level:6,normal:{health:15,move:3,attack:3,range:4,attributes:[]},elite:{health:24,move:4,attack:4,range:4,attributes:[]}},{level:7,normal:{health:16,move:3,attack:4,range:4,attributes:[]},elite:{health:27,move:4,attack:5,range:4,attributes:[]}}]},"Living Bones":{level:[{level:0,normal:{health:5,move:2,attack:1,range:0,attributes:["%target% 2"]},elite:{health:6,move:4,attack:2,range:0,attributes:["%target% 2"]}},{level:1,normal:{health:5,move:3,attack:1,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:6,move:4,attack:2,range:0,attributes:["%target% 3","%shield% 1"]}},{level:2,normal:{health:5,move:3,attack:2,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:7,move:4,attack:3,range:0,attributes:["%target% 3","%shield% 1"]}},{level:3,normal:{health:7,move:3,attack:2,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:10,move:4,attack:3,range:0,attributes:["%target% 3","%shield% 1"]}},{level:4,normal:{health:7,move:3,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:11,move:4,attack:4,range:0,attributes:["%target% 3","%shield% 1"]}},{level:5,normal:{health:9,move:3,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:11,move:4,attack:4,range:0,attributes:["%target% 3","%shield% 2"]}},{level:6,normal:{health:10,move:4,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:11,move:6,attack:4,range:0,attributes:["%target% 3","%shield% 2"]}},{level:7,normal:{health:13,move:4,attack:3,range:0,attributes:["%target% 2","%shield% 1"]},elite:{health:14,move:6,attack:4,range:0,attributes:["%target% 3","%shield% 2"]}}]},"Living Corpse":{level:[{level:0,normal:{health:5,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:1,attack:3,range:0,attributes:[]}},{level:1,normal:{health:7,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:1,attack:4,range:0,attributes:[]}},{level:2,normal:{health:9,move:1,attack:3,range:0,attributes:[]},elite:{health:13,move:1,attack:4,range:0,attributes:[]}},{level:3,normal:{health:10,move:1,attack:4,range:0,attributes:[]},elite:{health:13,move:2,attack:5,range:0,attributes:[]}},{level:4,normal:{health:11,move:2,attack:4,range:0,attributes:[]},elite:{health:15,move:2,attack:5,range:0,attributes:["%poison%"]}},{level:5,normal:{health:13,move:2,attack:4,range:0,attributes:[]},elite:{health:17,move:2,attack:6,range:0,attributes:["%poison%"]}},{level:6,normal:{health:14,move:2,attack:4,range:0,attributes:["%poison%"]},elite:{health:21,move:2,attack:6,range:0,attributes:["%poison%"]}},{level:7,normal:{health:15,move:2,attack:5,range:0,attributes:["%poison%"]},elite:{health:25,move:2,attack:6,range:0,attributes:["%poison%"]}}]},"Living Spirit":{level:[{level:0,normal:{health:2,move:2,attack:2,range:2,attributes:["%flying%","%shield% 1"]},elite:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 2"]}},{level:1,normal:{health:2,move:2,attack:2,range:2,attributes:["%flying%","%shield% 2"]},elite:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 3"]}},{level:2,normal:{health:2,move:3,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:3,move:4,attack:3,range:4,attributes:["%flying%","%shield% 3"]}},{level:3,normal:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:4,move:4,attack:4,range:4,attributes:["%flying%","%shield% 3"]}},{level:4,normal:{health:3,move:3,attack:3,range:3,attributes:["%flying%","%shield% 3"]},elite:{health:4,move:4,attack:4,range:4,attributes:["%flying%","%shield% 4"]}},{level:5,normal:{health:4,move:3,attack:3,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:6,move:4,attack:4,range:4,attributes:["%flying%","%shield% 4"]}},{level:6,normal:{health:4,move:3,attack:4,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:7,move:4,attack:5,range:5,attributes:["%flying%","%shield% 4"]}},{level:7,normal:{health:6,move:3,attack:4,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:9,move:4,attack:5,range:5,attributes:["%flying%","%shield% 4"]}}]},Lurker:{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:["%target% 2"]},elite:{health:7,move:2,attack:3,range:0,attributes:["%target% 2","%shield% 1"]}},{level:1,normal:{health:7,move:2,attack:2,range:0,attributes:["%target% 2","%pierce% 1"]},elite:{health:9,move:2,attack:3,range:0,attributes:["%target% 2","%pierce% 1","%shield% 1"]}},{level:2,normal:{health:9,move:3,attack:2,range:0,attributes:["%target% 2","%pierce% 1"]},elite:{health:12,move:3,attack:3,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]}},{level:3,normal:{health:10,move:3,attack:3,range:0,attributes:["%target% 2","%pierce% 2"]},elite:{health:14,move:3,attack:4,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]}},{level:4,normal:{health:10,move:3,attack:3,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]},elite:{health:14,move:3,attack:4,range:0,attributes:["%target% 2","%pierce% 3","%shield% 2"]}},{level:5,normal:{health:11,move:3,attack:4,range:0,attributes:["%target% 2","%pierce% 2","%shield% 1"]},elite:{health:15,move:3,attack:5,range:0,attributes:["%target% 2","%pierce% 3","%shield% 2"]}},{level:6,normal:{health:12,move:4,attack:4,range:0,attributes:["%target% 2","%pierce% 3","%shield% 1"]},elite:{health:16,move:4,attack:5,range:0,attributes:["%target% 2","%pierce% 4","%shield% 2"]}},{level:7,normal:{health:14,move:4,attack:4,range:0,attributes:["%target% 2","%pierce% 3","%shield% 1"]},elite:{health:18,move:4,attack:5,range:0,attributes:["%target% 2","%pierce% 4","%shield% 2"]}}]},Ooze:{level:[{level:0,normal:{health:4,move:1,attack:2,range:2,attributes:[]},elite:{health:8,move:1,attack:2,range:3,attributes:[]}},{level:1,normal:{health:5,move:1,attack:2,range:2,attributes:["%shield% 1"]},elite:{health:9,move:1,attack:2,range:3,attributes:["%shield% 1"]}},{level:2,normal:{health:7,move:1,attack:2,range:3,attributes:["%shield% 1"]},elite:{health:11,move:1,attack:3,range:3,attributes:["%shield% 1"]}},{level:3,normal:{health:8,move:1,attack:3,range:3,attributes:["%shield% 1"]},elite:{health:11,move:2,attack:3,range:4,attributes:["%poison%","%shield% 1"]}},{level:4,normal:{health:9,move:2,attack:3,range:3,attributes:["%shield% 1"]},elite:{health:13,move:2,attack:4,range:4,attributes:["%poison%","%shield% 1"]}},{level:5,normal:{health:10,move:2,attack:3,range:3,attributes:["%poison%","%shield% 1"]},elite:{health:15,move:3,attack:4,range:4,attributes:["%poison%","%shield% 1"]}},{level:6,normal:{health:12,move:2,attack:4,range:3,attributes:["%poison%","%shield% 1"]},elite:{health:16,move:3,attack:4,range:4,attributes:["%poison%","%shield% 2"]}},{level:7,normal:{health:14,move:2,attack:4,range:3,attributes:["%poison%","%shield% 1"]},elite:{health:18,move:3,attack:5,range:4,attributes:["%poison%","%shield% 2"]}}]},"Night Demon":{level:[{level:0,normal:{health:3,move:3,attack:3,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:5,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]}},{level:1,normal:{health:5,move:3,attack:3,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:8,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]}},{level:2,normal:{health:6,move:3,attack:4,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:11,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]}},{level:3,normal:{health:7,move:4,attack:4,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:13,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]}},{level:4,normal:{health:8,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:15,move:5,attack:5,range:0,attributes:["Attackers gain Disadvantage"]}},{level:5,normal:{health:11,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:17,move:5,attack:6,range:0,attributes:["Attackers gain Disadvantage"]}},{level:6,normal:{health:14,move:4,attack:5,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:21,move:5,attack:6,range:0,attributes:["Attackers gain Disadvantage"]}},{level:7,normal:{health:15,move:4,attack:6,range:0,attributes:["Attackers gain Disadvantage"]},elite:{health:21,move:5,attack:8,range:0,attributes:["Attackers gain Disadvantage"]}}]},"Rending Drake":{level:[{level:0,normal:{health:5,move:3,attack:3,range:0,attributes:[]},elite:{health:7,move:4,attack:4,range:0,attributes:[]}},{level:1,normal:{health:6,move:3,attack:3,range:0,attributes:["%wound%"]},elite:{health:7,move:4,attack:5,range:0,attributes:["%wound%"]}},{level:2,normal:{health:7,move:4,attack:3,range:0,attributes:["%wound%"]},elite:{health:9,move:5,attack:5,range:0,attributes:["%wound%"]}},{level:3,normal:{health:7,move:4,attack:4,range:0,attributes:["%wound%"]},elite:{health:10,move:5,attack:6,range:0,attributes:["%wound%"]}},{level:4,normal:{health:9,move:4,attack:4,range:0,attributes:["%wound%"]},elite:{health:11,move:6,attack:6,range:0,attributes:["%wound%"]}},{level:5,normal:{health:10,move:4,attack:5,range:0,attributes:["%wound%"]},elite:{health:14,move:6,attack:6,range:0,attributes:["%wound%"]}},{level:6,normal:{health:11,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:15,move:6,attack:7,range:0,attributes:["%wound%"]}},{level:7,normal:{health:14,move:5,attack:5,range:0,attributes:["%wound%"]},elite:{health:18,move:6,attack:7,range:0,attributes:["%wound%"]}}]},"Savvas Icestorm":{level:[{level:0,normal:{health:7,move:2,attack:2,range:3,attributes:["%pierce% 3"]},elite:{health:12,move:2,attack:3,range:4,attributes:["%pierce% 3"]}},{level:1,normal:{health:10,move:2,attack:2,range:4,attributes:["%pierce% 3"]},elite:{health:12,move:2,attack:3,range:5,attributes:["%pierce% 3","%shield% 1"]}},{level:2,normal:{health:12,move:3,attack:2,range:4,attributes:["%pierce% 3"]},elite:{health:15,move:3,attack:3,range:5,attributes:["%pierce% 3","%shield% 1"]}},{level:3,normal:{health:12,move:3,attack:3,range:4,attributes:["%pierce% 3","%shield% 1"]},elite:{health:18,move:3,attack:4,range:6,attributes:["%pierce% 3","%shield% 1"]}},{level:4,normal:{health:14,move:3,attack:3,range:5,attributes:["%pierce% 3","%shield% 1"]},elite:{health:19,move:4,attack:4,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:5,normal:{health:16,move:3,attack:4,range:5,attributes:["%pierce% 3","%shield% 1"]},elite:{health:21,move:4,attack:5,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:6,normal:{health:16,move:3,attack:4,range:5,attributes:["%pierce% 3","%shield% 2"]},elite:{health:23,move:4,attack:6,range:6,attributes:["%pierce% 3","%shield% 2"]}},{level:7,normal:{health:17,move:4,attack:4,range:6,attributes:["%pierce% 3","%shield% 2"]},elite:{health:24,move:4,attack:6,range:6,attributes:["%pierce% 4","%shield% 3"]}}]},"Savvas Lavaflow":{level:[{level:0,normal:{health:8,move:3,attack:2,range:0,attributes:[]},elite:{health:13,move:3,attack:3,range:0,attributes:[]}},{level:1,normal:{health:9,move:3,attack:2,range:0,attributes:["%poison%"]},elite:{health:15,move:3,attack:3,range:0,attributes:["%wound%"]}},{level:2,normal:{health:11,move:3,attack:3,range:0,attributes:["%poison%"]},elite:{health:18,move:3,attack:3,range:0,attributes:["%poison%","%wound%"]}},{level:3,normal:{health:14,move:3,attack:3,range:0,attributes:["%poison%"]},elite:{health:21,move:3,attack:4,range:0,attributes:["%poison%","%wound%"]}},{level:4,normal:{health:16,move:3,attack:4,range:0,attributes:["%poison%"]},elite:{health:24,move:4,attack:4,range:0,attributes:["%poison%","%wound%"]}},{level:5,normal:{health:18,move:3,attack:4,range:0,attributes:["%poison%","%wound%"]},elite:{health:27,move:4,attack:5,range:0,attributes:["%poison%","%wound%"]}},{level:6,normal:{health:20,move:4,attack:4,range:0,attributes:["%poison%","%wound%"]},elite:{health:30,move:4,attack:6,range:0,attributes:["%poison%","%wound%"]}},{level:7,normal:{health:24,move:4,attack:4,range:0,attributes:["%poison%","%wound%"]},elite:{health:35,move:4,attack:6,range:0,attributes:["%poison%","%wound%"]}}]},"Spitting Drake":{level:[{level:0,normal:{health:5,move:3,attack:3,range:3,attributes:["%flying%"]},elite:{health:8,move:3,attack:4,range:4,attributes:["%flying%"]}},{level:1,normal:{health:6,move:3,attack:3,range:3,attributes:["%flying%"]},elite:{health:9,move:3,attack:4,range:4,attributes:["%flying%","%muddle%"]}},{level:2,normal:{health:8,move:3,attack:3,range:3,attributes:["%flying%","%muddle%"]},elite:{health:10,move:3,attack:5,range:4,attributes:["%flying%","%muddle%"]}},{level:3,normal:{health:8,move:3,attack:4,range:4,attributes:["%flying%","%muddle%"]},elite:{health:12,move:3,attack:5,range:5,attributes:["%flying%","%muddle%"]}},{level:4,normal:{health:9,move:4,attack:4,range:4,attributes:["%flying%","%muddle%"]},elite:{health:14,move:4,attack:5,range:5,attributes:["%flying%","%muddle%"]}},{level:5,normal:{health:12,move:4,attack:4,range:4,attributes:["%flying%","%muddle%"]},elite:{health:16,move:4,attack:6,range:5,attributes:["%flying%","%muddle%"]}},{level:6,normal:{health:13,move:4,attack:5,range:4,attributes:["%flying%","%muddle%"]},elite:{health:19,move:4,attack:6,range:5,attributes:["%flying%","%muddle%"]}},{level:7,normal:{health:16,move:4,attack:5,range:4,attributes:["%flying%","%muddle%"]},elite:{health:21,move:4,attack:7,range:5,attributes:["%flying%","%muddle%"]}}]},"Stone Golem":{level:[{level:0,normal:{health:10,move:1,attack:3,range:0,attributes:[]},elite:{health:10,move:2,attack:4,range:0,attributes:["%shield% 1"]}},{level:1,normal:{health:10,move:1,attack:3,range:0,attributes:["%shield% 1"]},elite:{health:11,move:2,attack:4,range:0,attributes:["%shield% 2"]}},{level:2,normal:{health:11,move:1,attack:4,range:0,attributes:["%shield% 1"]},elite:{health:14,move:2,attack:5,range:0,attributes:["%shield% 2"]}},{level:3,normal:{health:11,move:1,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:15,move:2,attack:5,range:0,attributes:["%shield% 3"]}},{level:4,normal:{health:12,move:2,attack:4,range:0,attributes:["%shield% 2"]},elite:{health:17,move:2,attack:6,range:0,attributes:["%shield% 3"]}},{level:5,normal:{health:13,move:2,attack:5,range:0,attributes:["%shield% 2"]},elite:{health:19,move:3,attack:6,range:0,attributes:["%shield% 3"]}},{level:6,normal:{health:16,move:2,attack:5,range:0,attributes:["%shield% 2"]},elite:{health:20,move:3,attack:7,range:0,attributes:["%shield% 3"]}},{level:7,normal:{health:16,move:2,attack:5,range:0,attributes:["%shield% 3"]},elite:{health:21,move:3,attack:7,range:0,attributes:["%shield% 4"]}}]},"Sun Demon":{level:[{level:0,normal:{health:5,move:2,attack:2,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:9,move:2,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:1,normal:{health:7,move:2,attack:2,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:12,move:2,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:2,normal:{health:9,move:2,attack:2,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:13,move:2,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:3,normal:{health:10,move:2,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:15,move:3,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:4,normal:{health:11,move:3,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 1"]},elite:{health:16,move:3,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 1"]}},{level:5,normal:{health:11,move:3,attack:3,range:0,attributes:["%flying%","Advantage","%shield% 2"]},elite:{health:16,move:3,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 2"]}},{level:6,normal:{health:12,move:3,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 2"]},elite:{health:18,move:4,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 2"]}},{level:7,normal:{health:15,move:3,attack:4,range:0,attributes:["%flying%","Advantage","%shield% 2"]},elite:{health:22,move:4,attack:5,range:0,attributes:["%flying%","Advantage","%shield% 2"]}}]},"Vermling Scout":{level:[{level:0,normal:{health:2,move:3,attack:1,range:0,attributes:[]},elite:{health:4,move:3,attack:2,range:0,attributes:[]}},{level:1,normal:{health:3,move:3,attack:1,range:0,attributes:[]},elite:{health:5,move:3,attack:2,range:0,attributes:[]}},{level:2,normal:{health:3,move:3,attack:2,range:0,attributes:[]},elite:{health:5,move:4,attack:3,range:0,attributes:[]}},{level:3,normal:{health:5,move:3,attack:2,range:0,attributes:[]},elite:{health:7,move:4,attack:3,range:0,attributes:[]}},{level:4,normal:{health:6,move:3,attack:3,range:0,attributes:[]},elite:{health:8,move:4,attack:4,range:0,attributes:[]}},{level:5,normal:{health:8,move:3,attack:3,range:0,attributes:[]},elite:{health:11,move:4,attack:4,range:0,attributes:[]}},{level:6,normal:{health:9,move:4,attack:3,range:0,attributes:[]},elite:{health:12,move:5,attack:4,range:0,attributes:[]}},{level:7,normal:{health:11,move:4,attack:3,range:0,attributes:[]},elite:{health:15,move:5,attack:4,range:0,attributes:[]}}]},"Vermling Shaman":{level:[{level:0,normal:{health:2,move:2,attack:1,range:3,attributes:["%shield% 2"]},elite:{health:3,move:3,attack:2,range:3,attributes:["%shield% 2"]}},{level:1,normal:{health:2,move:2,attack:1,range:3,attributes:["%shield% 3"]},elite:{health:3,move:3,attack:2,range:3,attributes:["%shield% 3"]}},{level:2,normal:{health:3,move:2,attack:1,range:4,attributes:["%shield% 3"]},elite:{health:4,move:3,attack:2,range:4,attributes:["%shield% 3"]}},{level:3,normal:{health:3,move:2,attack:2,range:4,attributes:["%shield% 3"]},elite:{health:5,move:3,attack:3,range:4,attributes:["%shield% 3"]}},{level:4,normal:{health:3,move:3,attack:2,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:5,move:3,attack:3,range:4,attributes:["%muddle%","%shield% 4"]}},{level:5,normal:{health:4,move:3,attack:3,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:6,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 4"]}},{level:6,normal:{health:5,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:6,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 5"]}},{level:7,normal:{health:7,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 3"]},elite:{health:8,move:3,attack:4,range:4,attributes:["%muddle%","%shield% 5"]}}]},"Wind Demon":{level:[{level:0,normal:{health:3,move:3,attack:2,range:3,attributes:["%flying%","%shield% 1"]},elite:{health:5,move:4,attack:3,range:4,attributes:["%flying%","%shield% 1"]}},{level:1,normal:{health:3,move:3,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:5,move:4,attack:3,range:4,attributes:["%flying%","%shield% 2"]}},{level:2,normal:{health:4,move:4,attack:2,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:7,move:5,attack:3,range:4,attributes:["%flying%","%shield% 2"]}},{level:3,normal:{health:5,move:4,attack:3,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:8,move:5,attack:4,range:4,attributes:["%flying%","%shield% 2"]}},{level:4,normal:{health:7,move:4,attack:3,range:3,attributes:["%flying%","%shield% 2"]},elite:{health:8,move:5,attack:4,range:4,attributes:["%flying%","%disarm%","%shield% 2"]}},{level:5,normal:{health:9,move:4,attack:3,range:4,attributes:["%flying%","%shield% 2"]},elite:{health:11,move:5,attack:4,range:4,attributes:["%flying%","%disarm%","%shield% 2"]}},{level:6,normal:{health:10,move:4,attack:3,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:12,move:5,attack:4,range:4,attributes:["%flying%","%disarm%","%shield% 3"]}},{level:7,normal:{health:11,move:4,attack:4,range:4,attributes:["%flying%","%shield% 3"]},elite:{health:13,move:5,attack:5,range:4,attributes:["%flying%","%disarm%","%shield% 3"]}}]}},bosses:{"Bandit Commander":{level:[{level:0,health:"8xC",move:3,attack:3,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:1,health:"10xC",move:3,attack:3,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:2,health:"12xC",move:4,attack:3,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:3,health:"13xC",move:4,attack:4,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:4,health:"15xC",move:4,attack:4,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:5,health:"16xC",move:5,attack:5,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:6,health:"19xC",move:5,attack:5,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""},{level:7,health:"23xC",move:5,attack:5,range:0,special1:["Move to next door and reveal room"],special2:["Summon Living Bones"],immunities:["%stun%","%immobilize%","%curse%"],notes:""}]},"The Betrayer":{level:[{level:0,health:"10xC",move:3,attack:4,range:3,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:1,health:"12xC",move:3,attack:5,range:3,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:2,health:"14xC",move:3,attack:6,range:4,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:3,health:"16xC",move:4,attack:7,range:4,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:4,health:"18xC",move:4,attack:8,range:4,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:5,health:"20xC",move:5,attack:8,range:5,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:6,health:"23xC",move:5,attack:9,range:5,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""},{level:7,health:"27xC",move:5,attack:9,range:5,special1:["Summon Giant Viper and Fear"],special2:["Mind Control"],immunities:["%wound%","%poison%","%stun%","%disarm%","%curse%"],notes:""}]},"Captain of the Guard":{level:[{level:0,health:"7xC",move:2,attack:3,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:1,health:"9xC",move:2,attack:3,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:2,health:"11xC",move:2,attack:4,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:3,health:"14xC",move:3,attack:4,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:4,health:"16xC",move:3,attack:5,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:5,health:"20xC",move:3,attack:5,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:6,health:"21xC",move:4,attack:6,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""},{level:7,health:"25xC",move:4,attack:6,range:0,special1:["%heal% 2, Affect self and all allies"],special2:["All allies add +1 Attack to all attacks this round","%attack% +1"],immunities:["%disarm%","%wound%","%muddle%","%stun%"],notes:""}]},"The Colorless":{level:[{level:0,health:"9xC",move:3,attack:2,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 4, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:1,health:"10xC",move:3,attack:3,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 4, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:2,health:"11xC",move:4,attack:3,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 5, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:3,health:"12xC",move:4,attack:4,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 5, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:4,health:"14xC",move:4,attack:4,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 6, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:5,health:"15xC",move:4,attack:5,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 6, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:6,health:"17xC",move:4,attack:6,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 7, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""},{level:7,health:"19xC",move:5,attack:7,range:0,special1:["%dark%%use_element%: Summon Night Demon","%invisible%, Self"],special2:["%light%%use_element%: Summon Sun Demon","%heal% 7, Self","%shield% 1"],immunities:["%wound%","%poison%","%muddle%","%stun%","%disarm%"],notes:""}]},"Dark Rider":{level:[{level:0,health:"9xC",move:2,attack:"3+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:1,health:"10xC",move:3,attack:"3+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:2,health:"12xC",move:3,attack:"3+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:3,health:"13xC",move:3,attack:"4+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:4,health:"15xC",move:3,attack:"4+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:5,health:"16xC",move:3,attack:"5+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:6,health:"16xC",move:4,attack:"5+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"},{level:7,health:"18xC",move:4,attack:"6+X",range:0,special1:["%move% +2","%attack% +0"],special2:["%move% +0","Summon Imp","%attack% -1"],immunities:["%immobilize%","%poison%","%stun%","%disarm%"],notes:"X = Hexes moved"}]},"Elder Drake":{level:[{level:0,health:"11xC",move:0,attack:3,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:1,health:"12xC",move:0,attack:4,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:2,health:"15xC",move:0,attack:4,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:3,health:"16xC",move:0,attack:5,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:4,health:"20xC",move:0,attack:5,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:5,health:"22xC",move:0,attack:6,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:6,health:"27xC",move:0,attack:6,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""},{level:7,health:"29xC",move:0,attack:7,range:0,special1:["%attack% +0 %boss-aoe-elder-drake-sp1%"],special2:["Summon 2 Zephyrs and %move%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%stun%"],notes:""}]},"The Gloom":{level:[{level:0,health:"20xC",move:2,attack:5,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:1,health:"25xC",move:2,attack:5,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:2,health:"29xC",move:2,attack:6,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:3,health:"35xC",move:2,attack:6,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:4,health:"39xC",move:3,attack:7,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:5,health:"46xC",move:3,attack:7,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:6,health:"50xC",move:3,attack:8,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""},{level:7,health:"56xC",move:3,attack:9,range:0,special1:["%move% +9","%attack% +9"],special2:["Teleport","%attack% +1","%range% 5","%poison%","%wound%","%stun%"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%","%curse%"],notes:""}]},"Inox Bodyguard":{level:[{level:0,health:"6xC",move:2,attack:"C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 3"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:1,health:"7xC",move:2,attack:"1+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 3"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:2,health:"9xC",move:2,attack:"1+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 3"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:3,health:"10xC",move:3,attack:"2+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 4"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:4,health:"11xC",move:3,attack:"2+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 4"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:5,health:"13xC",move:3,attack:"3+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 5"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:6,health:"15xC",move:4,attack:"3+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 5"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"},{level:7,health:"17xC",move:4,attack:"4+C",range:0,special1:["%move% -1","%attack% -1 %boss-aoe-inox-bodyguard-sp1%"],special2:["%move% +0","%attack% +0","%retaliate% 5"],immunities:["%disarm%","%poison%","%muddle%","%stun%"],notes:"C = Number of Characters"}]},Jekserah:{level:[{level:0,health:"6xC",move:2,attack:2,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:1,health:"7xC",move:2,attack:3,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:2,health:"9xC",move:3,attack:3,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:3,health:"12xC",move:4,attack:4,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:4,health:"13xC",move:4,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:5,health:"15xC",move:5,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:6,health:"18xC",move:5,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""},{level:7,health:"22xC",move:5,attack:5,range:0,special1:["Summon Living Bones","%attack% -1, Target all adjacent enemies"],special2:["Summon Living Corpse","%move% -1","%attack% +2"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:""}]},"Merciless Overseer":{level:[{level:0,health:"6xC",move:2,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:1,health:"8xC",move:2,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:2,health:"9xC",move:3,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:3,health:"11xC",move:3,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:4,health:"12xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:5,health:"14xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:6,health:"16xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"},{level:7,health:"19xC",move:4,attack:"V",range:0,special1:["All Scouts act again"],special2:["Summon Vermling Scout"],immunities:["%disarm%","%wound%","%curse%","%stun%"],notes:"V = Number of Scouts present"}]},"Prime Demon":{level:[{level:0,health:"8xC",move:3,attack:4,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:1,health:"9xC",move:4,attack:4,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:2,health:"10xC",move:4,attack:5,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:3,health:"12xC",move:4,attack:6,range:0,special1:["Throne moves","Summon Demon","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:4,health:"14xC",move:5,attack:6,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:5,health:"16xC",move:5,attack:7,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:6,health:"20xC",move:5,attack:7,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""},{level:7,health:"22xC",move:5,attack:8,range:0,special1:["Throne moves","Summon Demon (Special 1)","%move% +2","%attack% -1"],special2:["Throne moves","Summon Demon (Special 2)","%move% +2","%attack% -1"],immunities:["%wound%","%poison%","%disarm%","%immobilize%","%muddle%","%stun%"],notes:""}]},"The Sightless Eye":{level:[{level:0,health:"7xC",move:0,attack:5,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:1,health:"8xC",move:0,attack:6,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:2,health:"10xC",move:0,attack:6,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:3,health:"11xC",move:0,attack:7,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:4,health:"14xC",move:0,attack:7,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:5,health:"15xC",move:0,attack:8,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:6,health:"18xC",move:0,attack:8,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""},{level:7,health:"20xC",move:0,attack:9,range:3,special1:["Summon Deep Terror","%attack% -3 %boss-aoe-sightless-eye-sp1%"],special2:["Summon Deep Terror","%attack% -2 %boss-aoe-sightless-eye-sp2%"],immunities:["%stun%","%disarm%","%curse%","%muddle%"],notes:""}]},"Winged Horror":{level:[{level:0,health:"6xC",move:3,attack:3,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:1,health:"7xC",move:4,attack:3,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:2,health:"8xC",move:4,attack:4,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:3,health:"10xC",move:4,attack:4,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:4,health:"12xC",move:5,attack:4,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:5,health:"14xC",move:5,attack:5,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:6,health:"17xC",move:5,attack:5,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""},{level:7,health:"20xC",move:5,attack:5,range:0,special1:["%attack% -1, Target all adjacent enemies","%attack% +0, %range% 3","Hatch eggs"],special2:["Summon C eggs","%move% -1","%attack% +0"],immunities:["%disarm%","%poison%","%muddle%","%stun%","%curse%"],notes:""}]}}},o={living_corpse_two_levels_extra:{description:"All living corpses are two levels higher than the scenario level, up to a max of 7",affected_deck:"Living Corpse",extra_levels:2}},m=[{name:"#1 Black Barrow",decks:[{name:"Bandit Guard",deck_name:"Guard"},{name:"Bandit Archer",deck_name:"Archer"},{name:"Living Bones",deck_name:"Living Bones"}]},{name:"#2 Barrow Lair",decks:[{name:"Bandit Archer"},{name:"Boss: Bandit Commander"},{name:"Living Bones"},{name:"Living Corpse"}]},{name:"#3 Inox Encampment",decks:[{name:"Inox Guard"},{name:"Inox Archer"},{name:"Inox Shaman"}]},{name:"#4 Crypt of the Damned",decks:[{name:"Living Bones"},{name:"Bandit Archer"},{name:"Cultist"},{name:"Earth Demon"},{name:"Wind Demon"}]},{name:"#5 Ruinous Crypt",decks:[{name:"Cultist"},{name:"Living Bones"},{name:"Night Demon"},{name:"Flame Demon"},{name:"Frost Demon"}]},{name:"#6 Decaying Crypt",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Living Spirit"}]},{name:"#7 Vibrant Grotto",decks:[{name:"Forest Imp"},{name:"Cave Bear"},{name:"Inox Shaman"},{name:"Earth Demon"}]},{name:"#8 Gloomhaven Warehouse",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Boss: Inox Bodyguard"}]},{name:"#9 Diamond Mine",decks:[{name:"Hound"},{name:"Vermling Scout"},{name:"Boss: Merciless Overseer"}]},{name:"#10 Plane of Elemental Power",decks:[{name:"Flame Demon"},{name:"Earth Demon"},{name:"Sun Demon"}]},{name:"#11 Gloomhaven Square A",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"City Guard"},{name:"City Archer"},{name:"Boss: Captain of the Guard"}]},{name:"#12 Gloomhaven Square B",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Cultist"},{name:"City Guard"},{name:"City Archer"},{name:"Boss: Jekserah"}]},{name:"#13 Temple of the Seer",decks:[{name:"Stone Golem"},{name:"Cave Bear"},{name:"Living Spirit"},{name:"Spitting Drake"}]},{name:"#14 Frozen Hollow",decks:[{name:"Hound"},{name:"Living Spirit"},{name:"Frost Demon"}]},{name:"#15 Shrine of Strength",decks:[{name:"Stone Golem"},{name:"Savvas Icestorm"},{name:"Frost Demon"},{name:"Wind Demon"},{name:"Harrower Infester"}]},{name:"#16 Mountain Pass",decks:[{name:"Earth Demon"},{name:"Wind Demon"},{name:"Inox Guard"},{name:"Inox Archer"}]},{name:"#17 Lost Island",decks:[{name:"Vermling Scout"},{name:"Vermling Shaman"},{name:"Cave Bear"}]},{name:"#18 Abandoned Sewers",decks:[{name:"Giant Viper"},{name:"Ooze"},{name:"Vermling Scout"}]},{name:"#19 Forgotten Crypt",decks:[{name:"Cultist"},{name:"Living Bones"},{name:"Living Spirit"},{name:"Living Corpse"}]},{name:"#20 Necromancer's Sanctum",decks:[{name:"Living Bones"},{name:"Cultist"},{name:"Night Demon"},{name:"Living Corpse"},{name:"Boss: Jekserah"}]},{name:"#21 Infernal Throne",decks:[{name:"Sun Demon"},{name:"Frost Demon"},{name:"Night Demon"},{name:"Wind Demon"},{name:"Earth Demon"},{name:"Flame Demon"},{name:"Boss: Prime Demon"}]},{name:"#22 Temple of the Elements",decks:[{name:"Living Bones"},{name:"Cultist"},{name:"Earth Demon"},{name:"Flame Demon"},{name:"Frost Demon"},{name:"Wind Demon"}]},{name:"#23 Deep Ruins",decks:[{name:"Stone Golem"},{name:"Ancient Artillery"},{name:"Living Bones"},{name:"Living Spirit"}]},{name:"#24 Echo Chamber",decks:[{name:"Rending Drake"},{name:"Ooze"},{name:"Living Spirit"}]},{name:"#25 Icecrag Ascent",decks:[{name:"Hound"},{name:"Rending Drake"},{name:"Spitting Drake"}]},{name:"#26 Ancient Cistern",decks:[{name:"Living Corpse"},{name:"Ooze"},{name:"Night Demon"},{name:"Black Imp"}]},{name:"#27 Ruinous Rift",decks:[{name:"Night Demon"},{name:"Wind Demon"},{name:"Frost Demon"},{name:"Sun Demon"},{name:"Earth Demon"},{name:"Flame Demon"}]},{name:"#28 Outer Ritual Chamber",decks:[{name:"Living Corpse"},{name:"Cultist"},{name:"Living Bones"},{name:"Night Demon"},{name:"Sun Demon"}],special_rules:[o.living_corpse_two_levels_extra]},{name:"#29 Sanctuary of Gloom",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Living Spirit"},{name:"Black Imp"}]},{name:"#30 Shrine of the Depths",decks:[{name:"Ooze"},{name:"Lurker"},{name:"Deep Terror"}]},{name:"#31 Plane of the Night",decks:[{name:"Deep Terror"},{name:"Night Demon"},{name:"Black Imp"}]},{name:"#32 Decrepit Wood",decks:[{name:"Harrower Infester"},{name:"Giant Viper"},{name:"Deep Terror"},{name:"Black Imp"}]},{name:"#33 Savvas Armory",decks:[{name:"Savvas Icestorm"},{name:"Savvas Lavaflow"},{name:"Frost Demon"},{name:"Flame Demon"},{name:"Wind Demon"},{name:"Earth Demon"}]},{name:"#34 Scorched Summit",decks:[{name:"Rending Drake"},{name:"Spitting Drake"},{name:"Boss: Elder Drake"}]},{name:"#35 Gloomhaven Battlements A",decks:[{name:"Flame Demon"},{name:"Frost Demon"},{name:"Earth Demon"},{name:"Wind Demon"},{name:"City Archer"},{name:"City Guard"},{name:"Boss: Captain of the Guard"}]},{name:"#36 Gloomhaven Battlements B",decks:[{name:"Flame Demon"},{name:"Frost Demon"},{name:"Earth Demon"},{name:"Wind Demon"},{name:"City Archer"},{name:"Boss: Prime Demon"}]},{name:"#37 Doom Trench",decks:[{name:"Lurker"},{name:"Deep Terror"},{name:"Harrower Infester"}]},{name:"#38 Slave Pens",decks:[{name:"Inox Guard"},{name:"Inox Archer"},{name:"Inox Shaman"},{name:"Stone Golem"}]},{name:"#39 Treacherous Divide",decks:[{name:"Cave Bear"},{name:"Frost Demon"},{name:"Spitting Drake"},{name:"Cultist"},{name:"Living Bones"}]},{name:"#40 Ancient Defense Network",decks:[{name:"Living Corpse"},{name:"Flame Demon"},{name:"Cave Bear"},{name:"Stone Golem"},{name:"Forest Imp"}]},{name:"#41 Timeworn Tomb",decks:[{name:"Ancient Artillery"},{name:"Living Corpse"},{name:"Living Spirit"},{name:"Stone Golem"}]},{name:"#42 Realm of the Voice",decks:[{name:"Night Demon"},{name:"Wind Demon"},{name:"Living Spirit"}]},{name:"#43 - Drake Nest",decks:[{name:"Flame Demon"},{name:"Rending Drake"},{name:"Spitting Drake"}]},{name:"#44 Tribal Assault",decks:[{name:"Inox Guard"},{name:"Inox Archer"},{name:"Hound"},{name:"Inox Shaman"}]},{name:"#45 Rebel Swamp",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Hound"}]},{name:"#46 Nightmare Peak",decks:[{name:"Night Demon"},{name:"Frost Demon"},{name:"Wind Demon"},{name:"Savvas Icestorm"},{name:"Boss: Winged Horror"}]},{name:"#47 Lair of the Unseeing Eye",decks:[{name:"Lurker"},{name:"Deep Terror"},{name:"Harrower Infester"},{name:"Boss: The Sightless Eye"}]},{name:"#48 - Shadow Weald",decks:[{name:"Forest Imp"},{name:"Earth Demon"},{name:"Harrower Infester"},{name:"Boss: Dark Rider"}]},{name:"#49 Rebel's Stand",decks:[{name:"Giant Viper"},{name:"City Archer"},{name:"City Guard"},{name:"Ancient Artillery"}]},{name:"#50 Ghost Fortress",decks:[{name:"Night Demon"},{name:"Sun Demon"},{name:"Earth Demon"}]},{name:"#51 The Void",decks:[{name:"Boss: The Gloom"}]},{name:"#52 Noxious Cellar",decks:[{name:"Spitting Drake"},{name:"Ooze"},{name:"Vermling Scout"},{name:"Living Corpse"},{name:"Vermling Shaman"}]},{name:"#53 Crypt Basement",decks:[{name:"Ooze"},{name:"Living Corpse"},{name:"Living Spirit"},{name:"Living Bones"},{name:"Giant Viper"}]},{name:"#54 Palace of Ice",decks:[{name:"Cave Bear"},{name:"Living Spirit"},{name:"Frost Demon"},{name:"Harrower Infester"}]},{name:"#55 Foggy Thicket",decks:[]},{name:"#56 Bandit's Wood",decks:[{name:"Hound"},{name:"Bandit Archer"},{name:"Rending Drake"},{name:"Bandit Guard"}]},{name:"#57 Investigation",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Hound"}]},{name:"#58 Bloody Shack",decks:[{name:"Earth Demon"},{name:"Harrower Infester"},{name:"Black Imp"},{name:"City Guard"}]},{name:"#59 Forgotten Grove",decks:[{name:"Cave Bear"},{name:"Hound"},{name:"Forest Imp"}]},{name:"#60 Alchemy Lab",decks:[{name:"Ooze"},{name:"Giant Viper"},{name:"Hound"},{name:"Rending Drake"},{name:"Spitting Drake"}]},{name:"#61 Fading Lighthouse",decks:[{name:"Ooze"},{name:"Giant Viper"},{name:"Frost Demon"},{name:"Flame Demon"}]},{name:"#62 Pit of Souls",decks:[{name:"Living Bones"},{name:"Living Spirit"}]},{name:"#63 Magma Pit",decks:[{name:"Vermling Scout"},{name:"Inox Guard"},{name:"Inox Archer"},{name:"Flame Demon"}]},{name:"#64 Underwater Lagoon",decks:[{name:"Ooze"},{name:"Forest Imp"},{name:"Rending Drake"}]},{name:"#65 Sulfur Mine",decks:[{name:"Vermling Scout"},{name:"Hound"},{name:"Inox Shaman"}]},{name:"#66 Clockwork Cove",decks:[{name:"Ooze"},{name:"Ancient Artillery"},{name:"Living Spirit"},{name:"Stone Golem"}]},{name:"#67 Arcane Library",decks:[{name:"Forest Imp"},{name:"Cave Bear"},{name:"Stone Golem"}]},{name:"#68 Toxic Moor",decks:[{name:"Rending Drake"},{name:"Black Imp"},{name:"Giant Viper"},{name:"Living Corpse"}]},{name:"#69 Well of the Unfortunate",decks:[{name:"Vermling Scout"},{name:"Vermling Shaman"},{name:"Forest Imp"},{name:"Stone Golem"},{name:"Living Spirit"}]},{name:"#70 Chained Isle",decks:[{name:"Night Demon"},{name:"Wind Demon"},{name:"Living Spirit"}]},{name:"#71 Windswept Highlands",decks:[{name:"Spitting Drake"},{name:"Wind Demon"},{name:"Sun Demon"}]},{name:"#72 Oozing Grove",decks:[{name:"Ooze"},{name:"Forest Imp"},{name:"Giant Viper"}]},{name:"#73 Rockslide Ridge",decks:[{name:"Hound"},{name:"Inox Archer"},{name:"Ancient Artillery"},{name:"Inox Guard"},{name:"Inox Shaman"}]},{name:"#74 Merchant Ship",decks:[{name:"Bandit Guard"},{name:"Bandit Archer"},{name:"Lurker"},{name:"Deep Terror"}]},{name:"#75 Overgrown Graveyard",decks:[{name:"Living Bones"},{name:"Living Corpse"},{name:"Living Spirit"}]},{name:"#76 Harrower Hive",decks:[{name:"Giant Viper"},{name:"Living Bones"},{name:"Night Demon"},{name:"Harrower Infester"}]},{name:"#77 Vault of Secrets",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Stone Golem"},{name:"Hound"}]},{name:"#78 Sacrifice Pit",decks:[{name:"Bandit Guard"},{name:"Bandit Archer"},{name:"Cultist"},{name:"Living Bones"},{name:"Black Imp"}]},{name:"#79 Lost Temple",decks:[{name:"Stone Golem"},{name:"Giant Viper"},{name:"Boss: The Betrayer"}]},{name:"#80 Vigil Keep",decks:[{name:"City Guard"},{name:"City Archer"},{name:"Ancient Artillery"},{name:"Hound"}]},{name:"#81 Temple of the Eclipse",decks:[{name:"Night Demon"},{name:"Sun Demon"},{name:"Stone Golem"},{name:"Ancient Artillery"},{name:"Boss: The Colorless"}]},{name:"#82 Burning Mountain",decks:[{name:"Earth Demon"},{name:"Flame Demon"},{name:"Stone Golem"}]},{name:"#83 Shadows Within",decks:[{name:"Hound"},{name:"Cultist"},{name:"Living Bones"},{name:"Living Spirit"},{name:"Flame Demon"}]},{name:"#84 Crystalline Cave",decks:[{name:"Flame Demon"},{name:"Frost Demon"},{name:"Earth Demon"}]},{name:"#85 Sun Temple",decks:[{name:"Hound"},{name:"Black Imp"},{name:"Night Demon"},{name:"Sun Demon"}]},{name:"#86 Harried Village",decks:[{name:"Cave Bear"},{name:"Vermling Shaman"},{name:"Vermling Scout"},{name:"Lurker"}]},{name:"#87 Corrupted Cove",decks:[{name:"Lurker"},{name:"Deep Terror"},{name:"Ooze"},{name:"Black Imp"}]},{name:"#88 Plane of Water",decks:[{name:"Frost Demon"},{name:"Ooze"},{name:"Lurker"}]},{name:"#89 Syndicate Hideout",decks:[{name:"Bandit Archer"},{name:"Bandit Guard"},{name:"Cultist"},{name:"Giant Viper"}]},{name:"#90 Demonic Rift",decks:[{name:"Earth Demon"},{name:"Wind Demon"},{name:"Night Demon"},{name:"Living Spirit"}]},{name:"#91 Wild Melee",decks:[{name:"Cave Bear"},{name:"Hound"},{name:"Bandit Guard"},{name:"Bandit Archer"},{name:"Living Spirit"}]},{name:"#92 Back Alley Brawl",decks:[{name:"Bandit Guard"},{name:"City Guard"},{name:"Inox Guard"},{name:"Bandit Archer"},{name:"City Archer"},{name:"Savvas Lavaflow"},{name:"Flame Demon"},{name:"Earth Demon"}]},{name:"#93 Sunken Vessel",decks:[{name:"Lurker"},{name:"Frost Demon"},{name:"Living Spirit"}]},{name:"#94 Vermling Nest",decks:[{name:"Hound"},{name:"Vermling Scout"},{name:"Vermling Shaman"},{name:"Cave Bear"}]},{name:"#95 Payment Due",decks:[{name:"Deep Terror"},{name:"Flame Demon"},{name:"Earth Demon"},{name:"Savvas Lavaflow"}]}],c={"%air%":"","%any%":"","%aoe-4-with-black%":"","%aoe-circle%":"
      ","%aoe-circle-with-middle-black%":"
      ","%aoe-circle-with-side-black%":"","%aoe-line-3-with-black%":"
      ","%aoe-line-4-with-black%":"
      ","%aoe-line-6-with-black%":"","%aoe-triangle-2-side%":"
      ","%aoe-triangle-2-side-with-black%":"
      ","%aoe-triangle-3-side-with-corner-black%":"
      ","%attack%":"Attack ","%bless%":"BLESS ","%boss-aoe-elder-drake-sp1%":"
      ","%boss-aoe-inox-bodyguard-sp1%":"
      ","%boss-aoe-sightless-eye-sp1%":"
      ","%boss-aoe-sightless-eye-sp2%":"
      ","%curse%":"CURSE ","%dark%":"","%disarm%":"DISARM ","%earth%":"","%fire%":"","%heal%":"Heal ","%ice%":"","%immobilize%":"IMMOBILIZE ","%invisible%":"INVISIBLE ","%jump%":"Jump ","%light%":"","%loot%":"Loot ","%move%":"Move ","%muddle%":"MUDDLE ","%pierce%":"PIERCE ","%poison%":"POISON ","%pull%":"PULL ","%push%":"PUSH ","%range%":"Range ","%retaliate%":"Retaliate ","%shield%":"Shield ","%flying%":"","%strengthen%":"STRENGTHEN ","%stun%":"STUN ","%target%":"Target ","%use_element%":"","%wound%":"WOUND "};function h(e){const a=e.toLowerCase();return a in c?c[a]:e}function u(e,a,t){let n=new RegExp("%"+a+"% (\\+|-)(\\d*)","g");const l=n.exec(e),i=2===t.length;let s=t[0],r="";const o=(n=new RegExp("(\\d*)([+\\-])?([a-zA-Z]+)","i")).exec(String(s));if(o&&o[3]){const e="-"===o[2]?"-":"+";r=o[3]+e,s=""!==o[1]?parseInt(o[1]):0}if(l){if("+"===l[1]){const e=s+parseInt(l[2]);if(i){return"%"+a+"% "+e+" / "+(t[1]+parseInt(l[2]))+""}return"%"+a+"% "+r+e}if("-"===l[1]){const e=s-parseInt(l[2]);if(i){return"%"+a+"% "+e+" / "+(t[1]-parseInt(l[2]))+""}return"%"+a+"% "+r+e}}return e}function d(e){if(!e||0===e[0].length&&0===e[1].length)return[];{let a=["* Attributes"];const t=[];let n=0;for(let a=0;a"+e.replace(/(,\s$)/g,"")+"":""})))}}function v(e){if(e){const a=[];let t=0;for(let n=0;n"+e.replace(/(,\s$)/g,"")+""})))}return[]}function g(e){return["* Notes: "+e+""]}function k(e,a){return a.map((function(e){return"* "+e}))}function p(e,a,t){return a&&-1!==e.indexOf("Special 1")&&(e=k(0,a)),a&&-1!==e.indexOf("Special 2")&&(e=k(0,t)),e}function b(e,a,t,n){const l=new RegExp("%(attack|move|range)% ([+\\-])(\\d*)","g");let i=l.exec(e);for(;i;)"attack"===i[1]?e=e.replace(i[0],u(i[0],"attack",a)):"move"===i[1]?e=e.replace(i[0],u(i[0],"move",t)):"range"===i[1]&&(e=e.replace(i[0],u(i[0],"range",n))),i=l.exec(e);return e.replace(/%[^%]*%/gi,h)}function f(e,a,t){for(let a in e)e[a].className=a===t?"":"inactive";for(let e in a)a[e].className=e===t?"tabbody":"inactive tabbody"}function S(e,a,t){e.className=t?"pane":"pane inactive",a.style.display=t?"initial":"none"}const _={};function C(e,a,t){t?e.classList.add(a):e.classList.remove(a)}function y(e,a,t,n){const l=document.createElement("input");l.type=e,l.name=a,l.value=t;const i=document.createTextNode(n),s=document.createElement("label");return s.appendChild(l),s.appendChild(i),{root:s,input:l}}function D(e){const a=[];for(let t in e)a.push(e[t]);return a}function w(e){return"checked"in e&&e.checked}function x(e){return"value"in e?e.value:""}function L(e,a){try{localStorage.setItem(e,a)}catch(e){console.error("Local storage is required")}}function A(e){try{return localStorage.getItem(e)}catch(e){console.error("Local storage is required")}}function E(e,a){for(let t=0;t Create a 3 damage trap in an adjacent empty hex closest to an enemy "],[!0,"29","* %move% +0","* %attack% -1","** %range% +1","** %immobilize%"]]},{class:"Boss",cards:[[!1,"11","* Special 2"],[!1,"14","* Special 2"],[!0,"17","* Special 2"],[!0,"85","* Special 1"],[!1,"79","* Special 1"],[!1,"73","* Special 1"],[!1,"36","* %move% +0","* %attack% +0"],[!1,"52","* %move% -1","* %attack% -1","** %range% 3","** %target% 2"]]},{class:"Cave Bear",cards:[[!1,"13","* %move% +1","* %attack% -1"],[!1,"14","* %move% -1","* %attack% -1","** %immobilize%"],[!0,"34","* %attack% +1","** %wound%"],[!1,"41","* %move% +0","* %attack% +0"],[!1,"60","* %move% -1","* %attack% +1"],[!0,"80","* %attack% -1","* %move% -2","* %attack% -1","** %wound%"],[!1,"61","* %move% +0","* %attack% -1","** %target% 2"],[!1,"03","* %shield% 1","* %retaliate% 2","* %heal% 2","** Self"]]},{class:"Cultist",cards:[[!1,"10","* %move% -1","* %attack% -1","* On Death:","** %attack% +2 %aoe-circle-with-middle-black%"],[!1,"10","* %move% -1","* %attack% -1","* On Death:","** %attack% +2 %aoe-circle-with-middle-black%"],[!1,"27","* %move% +0","* %attack% +0"],[!1,"27","* %move% +0","* %attack% +0"],[!1,"39","* %move% -1","* %attack% +0","* %heal% 1","** Self"],[!0,"63","* Summon normal Living Bones","* Cultist suffers 2 damage."],[!0,"63","* Summon normal Living Bones","* Cultist suffers 2 damage."],[!1,"31","* %move% -1","* %heal% 3","** %range% 3"]]},{class:"Deep Terror",cards:[[!1,"65","* %attack% +0","** %range% 3","** %target% 3","** %curse%"],[!0,"60","* %attack% +0 %aoe-line-6-with-black%","** %pierce% 3"],[!0,"60","* %attack% +0 %aoe-line-6-with-black%","** %pierce% 3"],[!1,"84","* %attack% -1","** Target all adjacent enemies","* %attack% +0","** %range% 4","** %wound%"],[!1,"75","* %attack% +0","** %poison%","* %attack% -1","** %range% 5","** %immobilize%"],[!1,"75","* %attack% -2","** Target all adjacent enemies","** %disarm%","* %attack% +0","** %range% 3","** %target% 2"],[!1,"96","* %attack% -2","** %range% 6","** Summon normal Deep Terror in a hex adjacent to the target"],[!1,"54","* %wound% and %poison%","** Target all adjacent enemies","* %attack% +0","** %range% 4"]]},{class:"Earth Demon",cards:[[!0,"40","* %heal% 3","** Self","* %earth%%use_element%: %immobilize% Target all enemies within %range% 3"],[!0,"42","* %move% +1","* %attack% -1"],[!1,"62","* %move% +0","* %attack% +0","* %earth%"],[!1,"71","* %attack% +0","** %range% 4","** %earth%%use_element%: %target% 2"],[!1,"83","* %move% -1","* %attack% +1","* %earth%"],[!1,"93","* %move% -1","* %attack% -1","** Target all adjacent enemies","* %earth%%use_element%: %push% 1"],[!1,"79","* %move% +1","* %attack% +0","** %air%%use_element%: -2 %attack%"],[!1,"87","* %move% +0","* %attack% -1
      %aoe-4-with-black%
      ","* %any%%use_element%: %earth%"]]},{class:"Flame Demon",cards:[[!1,"03","* %move% +1","* %attack% -1","** %range% +0","* %fire%"],[!1,"24","* %move% +0","* %attack% +0","** %range% +0","* %fire%"],[!0,"46","* %attack% +0","** %range% +0","** %fire%%use_element%: %aoe-circle%"],[!1,"49","* %attack% +0 %aoe-line-3-with-black%","**
      %fire%%use_element%: +1 %attack%
      %wound%
      "],[!1,"67","* %move% -1","* %attack% +1","** %range% -1","* %fire%"],[!1,"77","* %attack% +0","** Target all adjacent enemies","** %ice%%use_element%:Flame Demon suffers 1 damage."],[!0,"30","*
      %fire%%use_element%: All adjacent enemies
      suffer 2 damage.
      ","* %move% +0","* %attack% -2","** %range% +0","** %wound%","** %target% 2"],[!1,"08","* %move% -1","* Create a 4 damage trap in an adjacent empty hex closest to an enemy ","* %any%%use_element%: %fire%"]]},{class:"Frost Demon",cards:[[!1,"18","* %immobilize%","** Target all enemies within %range% 2","* %ice%%use_element%: %heal% 3
      Self
      "],[!1,"38","* %move% +1","* %attack% -1"],[!1,"58","* %move% +0","* %attack% +0"],[!1,"58","* %move% -1","* %attack% +0","** %range% 2","** %ice%%use_element%: +2 %attack%, +1 %range%"],[!0,"78","* %move% -1","* %attack% +0 %aoe-triangle-2-side-with-black%","* %ice%"],[!0,"78","* %move% -1","* %attack% +0 %aoe-triangle-2-side-with-black%","* %ice%"],[!1,"58","* %move% -1","* %attack% -1","** %pierce% 3","* %any%%use_element%: %ice%"],[!1,"18","* %shield% 2","* %move% +1","* %fire%%use_element%: Frost Demon suffers 1 damage"]]},{class:"Giant Viper",cards:[[!0,"32","* %move% +0","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Giant Viper's allies."],[!0,"32","* %move% +0","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Giant Viper's allies."],[!1,"11","* %shield% 1","* %attack% -1"],[!1,"43","* %move% +1","** %jump%","* %attack% -1","** Target all adjacent enemies."],[!1,"58","* %move% -1","* %attack% +1"],[!1,"58","* %move% +1","** %jump%","* %attack% -1","** All attacks targeting Giant Viper this round gain Disadvantage."],[!1,"43","* %move% -1","** %jump%","* %attack% +0","** %target% 2"],[!1,"23","* %move% -1","* %attack% -1","** %immobilize%","* %attack% -1"]]},{class:"Guard",cards:[[!0,"15","* %shield% 1","* %retaliate% 2"],[!1,"30","* %move% +1","* %attack% -1"],[!1,"35","* %move% -1","* %attack% +0","** %range% 2"],[!1,"50","* %move% +0","* %attack% +0"],[!1,"50","* %move% +0","* %attack% +0"],[!1,"70","* %move% -1","* %attack% +1"],[!1,"55","* %move% -1","* %attack% +0","* %strengthen%","** Self"],[!0,"15","* %shield% 1","* %attack% +0","** %poison%"]]},{class:"Harrower Infester",cards:[[!1,"38","* %move% -1","* %attack% +1","** %target% 2"],[!1,"07","* %move% +0","* %attack% -1","** %poison%","* %dark%"],[!1,"16","* %move% -1","* %attack% -1","* %heal% 5","** Self"],[!1,"16","* %attack% +2","** %immobilize%","* %retaliate% 2"],[!0,"02","* %shield% 2","* %retaliate% 2","** %range% 3"],[!1,"30","* %move% -1","* %attack% +0 %aoe-line-4-with-black%",'** %dark%%use_element%: Perform "%heal% 2, Self"
      for each target damaged'],[!1,"38","* %move% +0","* %attack% -1","** %target% 2","** %dark%%use_element%: +2 %attack%, %disarm%"],[!0,"07","* %attack% -1","** %range% 3","** %muddle%","* %heal% 4","** Self"]]},{class:"Hound",cards:[[!1,"06","* %move% -1","* %attack% +0","** %immobilize%"],[!1,"07","* %move% +0","* %muddle%","** Target all adjacent enemies"],[!0,"19","* %move% +1","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Hound's allies"],[!0,"19","* %move% +1","* %attack% +0","** Add +2 Attack if the target is adjacent to any of the Hound's allies"],[!1,"26","* %move% +0","* %attack% +0"],[!1,"26","* %move% +0","* %attack% +0"],[!1,"83","* %move% -2","* %attack% +1"],[!1,"72","* %attack% -1","** %pierce% 2","* %move% -2","* %attack% -1","** %pierce% 2"]]},{class:"Imp",cards:[[!1,"05","* %shield% 5","* %heal% 1","** Self"],[!1,"37","* %move% +0","* %attack% +0","** %range% +0"],[!1,"37","* %move% +0","* %attack% +0","** %range% +0"],[!1,"42","* %move% +1","* %heal% 2","** %range% 3"],[!0,"43","* %move% +0","* %attack% -1","** %range% +0, %target% 2, %poison%"],[!1,"76","* %move% -1","* %attack% +1","** %range% +0"],[!0,"43","* %move% +0","* %attack% -1","** %range% +0, %target% 2, %curse%"],[!1,"24","* %strengthen%","** Affect all allies within %range% 2","* %muddle%","** Target all enemies within %range% 2"]]},{class:"Living Bones",cards:[[!1,"64","* %move% -1","* %attack% +1"],[!0,"20","* %move% -2","* %attack% +0","* %heal% 2","** Self"],[!1,"25","* %move% +1","* %attack% -1"],[!1,"45","* %move% +0","* %attack% +0"],[!1,"45","* %move% +0","* %attack% +0"],[!1,"81","* %attack% +2"],[!1,"74","* %move% +0","* %attack% +0","** Target one enemy with all attacks"],[!0,"12","* %shield% 1","* %heal% 2","** Self"]]},{class:"Living Corpse",cards:[[!1,"21","* %move% +1","* %muddle% and %immobilize%","** Target one adjacent enemy"],[!1,"47","* %move% +1","* %attack% -1"],[!0,"66","* %move% +0","* %attack% +0"],[!0,"66","* %move% +0","* %attack% +0"],[!1,"82","* %move% -1","* %attack% +1"],[!1,"91","* %move% +1","* Living Corpse suffers 1 damage."],[!1,"71","* %move% +0","* %attack% +1","* %poison%","** Target all adjacent enemies"],[!1,"32","* %attack% +2","** %push% 1","* Living Corpse suffers 1 damage."]]},{class:"Living Spirit",cards:[[!0,"22","* %move% -1","* %attack% -1","** %range% +0","** %muddle%"],[!0,"33","* %move% +0","* %attack% -1","** %range% +0","** Target all enemies within range"],[!1,"48","* %move% +0","* %attack% +0","** %range% +0"],[!1,"48","* %move% +0","* %attack% +0","** %range% +0"],[!1,"61","* %attack% +0","** %range% -1","** %target% 2"],[!1,"75","* %move% -1","* %attack% +1","** %range% -1","* %heal% 1","** Self"],[!1,"55","* %move% +0","* %curse%","** %range% +0","** Target all enemies within range","* %ice%"],[!1,"67","* %move% -1","* %attack% +1","** %range% +0","** %ice%%use_element%: %stun%"]]},{class:"Lurker",cards:[[!0,"11","* %shield% 1","** %ice%%use_element%: %shield% 2 instead","* %wound%","** Target all adjacent enemies"],[!1,"28","* %move% +1","* %attack% -1"],[!1,"38","* %move% +0","* %attack% +0"],[!1,"38","* %move% +0","* %attack% +0","** Target one enemy with all attacks"],[!1,"61","* %move% -1","* %attack% +1"],[!1,"64","* %attack% +1","** Target all adjacent enemies"],[!1,"41","* %ice%%use_element%: %strengthen%","** Self","* %move% +0","* %attack% -1","** %wound%"],[!0,"23","* %shield% 1","* %move% +0","* %attack% -1","* %ice%"]]},{class:"Night Demon",cards:[[!1,"04","* %move% +1","* %attack% -1","* %dark%"],[!1,"07","* %move% +1","* %attack% -1","* %dark%%use_element%: %invisible%","** Self"],[!1,"22","* %move% +0","* %attack% +0","* %dark%"],[!1,"26","* %attack% -2","** %range% 3","** %target% 3","** %dark%%use_element%: %muddle%"],[!0,"46","* %move% -1","* %attack% +1","** %dark%%use_element%: +2 %attack%"],[!0,"41","* %move% -1","* %attack% +1","* %dark%"],[!1,"35","* %attack% -1","* %attack% -1","** %pierce% 2","* %light%%use_element%: %curse%","** Self"],[!1,"15","* %move% +0","* %attack% -1","* All adjacent enemies and allies suffer 1 damage.","* %any%%use_element%: %dark%"]]},{class:"Ooze",cards:[[!1,"36","* %move% +1","* %attack% -1","** %range% +0"],[!1,"57","* %move% +0","* %attack% +0","** %range% +0"],[!1,"59","* %attack% +0","** %range% +0","** %target% 2","** %poison%"],[!1,"66","* %move% -1","* %attack% +1","** %range% +1"],[!0,"94","* Ooze suffers 2 damage ","** Summons normal Ooze with a hit point value equal to the summoning Ooze's current hit point value (limited by a normal Ooze's specified maximum hit point value)"],[!0,"94","* Ooze suffers 2 damage ","** Summons normal Ooze with a hit point value equal to the summoning Ooze's current hit point value (limited by a normal Ooze's specified maximum hit point value)"],[!1,"85","* %push% 1 and","* %poison%","** Target all adjacent enemies","* %attack% +1","** %range% -1"],[!1,"66","* %move% -1","* %loot% 1","* %heal% 2","** Self"]]},{class:"Rending Drake",cards:[[!1,"12","* %move% +1","* %attack% -1"],[!0,"13","* %attack% -1","* %move% -1","* %attack% -1"],[!1,"25","* %move% +0","* %attack% +0"],[!1,"39","* %move% -1","* %attack% +1"],[!1,"54","* %move% -2","* %attack% -1","** %range% 3","** %target% 2","** %poison%"],[!1,"59","* %move% -2","* %attack% +1","** %target% 2"],[!1,"06","* %shield% 2","* %heal% 2","** Self","* %strengthen%","** Self"],[!0,"72","* %attack% -1","* %attack% -1","* %attack% -2"]]},{class:"Savvas Icestorm",cards:[[!1,"70","* %push% 2","** Target all adjacent enemies","** %air%%use_element%: %push% 4 instead","* %attack% +1","** %range% +1"],[!1,"98","* Summon normal Wind Demon","* %air%"],[!1,"98","* Summon normal Frost Demon","* %ice%"],[!1,"19","* %move% +0","* %attack% -1","** %range% -1","* %shield% 1","** Affect self and all allies within %range% 2","* %ice%"],[!1,"14","* %attack% +0","** %range% +0","** %ice%%use_element%: +2 %attack%, %immobilize%","* %retaliate% 2","* %air%"],[!1,"14","* %shield% 4","* %heal% 2","** %range% 3","** %ice%%use_element%: +3 %heal%","* %air%%use_element%: %attack% +0"],[!0,"47","* %disarm%","** Target all adjacent enemies","* %move% +0","* %attack% -1","** %range% +0","* %air%"],[!0,"35","* %move% -1","* %attack% -1 %aoe-triangle-3-side-with-corner-black% ","* %ice%"]]},{class:"Savvas Lavaflow",cards:[[!1,"97","* Summon normal Flame Demon","* %fire%"],[!1,"97","* Summon normal Earth Demon","* %earth%"],[!1,"22","* %move% +1","* %attack% -1","** Target all adjacent enemies","* %fire%%use_element%: %retaliate% 3"],[!0,"68","* %move% -1","* %attack% +1","** %range% 3","** All allies and enemies adjacent to the target suffer 2 damage.","* %earth%"],[!1,"41","* %move% +0","* %attack% -1 %aoe-line-4-with-black% ","** %earth%%use_element%: +2 %attack%, %immobilize%"],[!1,"51","* All enemies suffer 2 damage.","* %fire%%use_element%: %wound% all enemies","* %earth%%use_element%: %disarm% all enemies"],[!1,"31","* %heal% 4","** %range% 3","** %earth%%use_element%: %target% 3"],[!0,"68","* %move% -1","* %attack% -1","** %range% 3","** %target% 2","* %fire%"]]},{class:"Scout",cards:[[!1,"29","* %move% -1","* %attack% -1","** %range% 3"],[!1,"40","* %move% +1","* %attack% -1"],[!1,"53","* %move% +0","* %attack% +0"],[!1,"54","* %move% -2","* %attack% +0","** %range% 3","** %poison%"],[!1,"69","* %move% -1","* %attack% +1"],[!0,"92","* %attack% +2","** %poison% "],[!0,"35","* %move% +1","** %jump%","* %loot% 1"],[!1,"79","* %attack% -1","** %range% 4","** %target% 2"]]},{class:"Shaman",cards:[[!1,"08","* %move% +0","* %attack% -1","** %range% +0","** %disarm%"],[!1,"08","* %move% -1","* %attack% +0","** %range% +0","** %immobilize%"],[!0,"23","* %move% +0","* %heal% 3","** %range% 3"],[!0,"23","* %move% +0","* %heal% 3","** %range% 3"],[!1,"62","* %move% +0","* %attack% +0","** %range% +0"],[!1,"74","* %move% -1","* %attack% +1","** %range% +0"],[!1,"89","* %move% -1","* %heal% 1","** Affect all adjacent allies","* %bless%","** Self"],[!1,"09","* %move% +1","* %attack% -1","** %range% +0, %curse%, %target% 2"]]},{class:"Spitting Drake",cards:[[!1,"32","* %move% +1","* %attack% -1","** %range% +0"],[!1,"52","* %move% +0","* %attack% +0","** %range% +0"],[!0,"57","* %move% +0","* %attack% -1 %aoe-triangle-2-side%","** %range% +0"],[!1,"27","* %attack% +0","** %range% +0, %target% 2, %poison%"],[!1,"87","* %move% -1","* %attack% +1","** %range% +0"],[!1,"89","* %attack% -2","** %range% +0","** %stun%"],[!1,"06","* %shield% 2","* %heal% 2","** Self","* %strengthen%","** Self"],[!0,"89","* %move% -1","* %attack% -2 %aoe-circle%","** %range% +0","** %poison%"]]},{class:"Stone Golem",cards:[[!1,"11","* %retaliate% 3","** %range% 3"],[!1,"28","* %move% +1","* %attack% +0","* Stone Golem suffers 1 damage."],[!0,"51","* %move% +1","* %attack% -1"],[!1,"65","* %move% +0","* %attack% +0"],[!1,"72","* %attack% +1","** %range% 3","* Stone Golem suffers 2 damage"],[!0,"90","* %move% -1","* %attack% +1"],[!1,"28","* %move% +1","* %attack% -2","** %range% 3","** %pull% 2","** %immobilize%"],[!1,"83","* %move% +0","* %attack% -1","** Target all adjacent enemies"]]},{class:"Sun Demon",cards:[[!0,"17","* %heal% 3","** %range% 3","** %light%%use_element%: Target all allies within range instead"],[!1,"36","* %move% +0","* %attack% +0","** Target all adjacent enemies","* %light%"],[!1,"36","* %move% +0","* %attack% +0","** Target all adjacent enemies","* %light%"],[!1,"68","* %move% +0","* %attack% +1","* %light%"],[!0,"73","* %move% +0","* %attack% +1","* %light%%use_element%: %heal% 3","** Self"],[!1,"95","* %move% -1","* %attack% +0","** %range% 4","** %light%%use_element%: Target all enemies within range"],[!1,"88","* %move% -1","* %attack% -1","** Target all adjacent enemies","* %dark%%use_element%: %muddle%","** Self"],[!1,"50","* %move% +0","* %attack% +0","** %range% 3","* %any%%use_element%: %light%"]]},{class:"Wind Demon",cards:[[!1,"09","* %attack% -1","** %range% +0","* %heal% 1","** Self","* %air%%use_element%: %invisible%
      Self"],[!0,"21","* %move% +0","* %attack% +0","** %range% +0, %pull% 1","* %air%"],[!0,"21","* %move% +0","* %attack% +0","** %range% +0, %pull% 1","* %air%"],[!1,"29","* %move% +0","* %attack% -1","** %range% +0, %target% 2","** %air%%use_element%: %push% 2"],[!1,"37","* %move% +0","* %attack% +0
      %aoe-4-with-black%
      ","** %air%%use_element%: +1 Attack
      %aoe-circle-with-side-black%
      "],[!1,"43","* %move% -1","* %attack% +1","** %range% +0","** %air%%use_element%: %target% 2"],[!1,"43","* %push% 1","** Target all adjacent enemies","* %attack% +0","** %range% +0","** %earth%%use_element%: -2 %range%"],[!1,"02","* %shield% 1","* %move% -1","* %attack% -1","** %range% +0","* %any%%use_element%: %air%"]]}]),z={MODIFIER:"modifier",ABILITY:"ability",BOSS:"boss"},G={MODIFIER_CARD_DRAWN:"modifierCardDrawn",MODIFIER_DECK_SHUFFLE_REQUIRED:"modfierDeckShuffleRequired"};function F(e,a){const t={};return t.back=a,t.front=e,t.flip_up=function(e){C(this.back,"up",!e),C(this.back,"down",e),C(this.front,"up",e),C(this.front,"down",!e)},t.set_depth=function(e){e=e.toString(),this.back.style.zIndex=e,this.front.style.zIndex=e},t.push_down=function(){const e=parseInt(this.back.style.zIndex,10),a=parseInt(this.front.style.zIndex,10);this.back.style.zIndex=(e-1).toString(),this.front.style.zIndex=(a-1).toString()},t.addClass=function(e){this.front.classList.add(e),this.back.classList.add(e)},t.removeClass=function(e){this.front.classList.remove(e),this.back.classList.remove(e)},t.attach=function(e){e.appendChild(this.back),e.appendChild(this.front)},t.flip_up(!1),t}function O(e,a){const t=document.createElement("div");t.className="card ability back down";const n=document.createElement("span");return n.className="name",n.innerText=e+"-"+a,t.appendChild(n),t}function V(e,a,t,n,l,i,s,r,o){const m=document.createElement("div");m.className="card ability front down";const c=document.createElement("span");c.className="name",c.innerText=a+"-"+r,m.appendChild(c);const h=document.createElement("span");if(h.className="healthNormal",h.innerText="HP "+o[0],m.appendChild(h),o[1]>0){const e=document.createElement("span");e.className="healthElite",e.innerText="HP "+o[1],m.appendChild(e)}const u=document.createElement("span");if(u.className="initiative",u.innerText=e,m.appendChild(u),t){const e=document.createElement("img");e.src="images/shuffle.svg",m.appendChild(e)}let d=0,v=m;n=n.filter(Boolean);for(let e=0;e=0;)t+=1,a=a.substr(1);const r=t-d;for(;d!==t;)if(r>0){const e=document.createElement("ul");n.length>5&&(e.style.fontSize=100-2.5*n.length+"%"),v.appendChild(e),v=e;const a=document.createElement("li");v.appendChild(a),v=a,d+=1}else v=(v=v.parentElement).parentElement,d-=1;if(d>0&&r<=0){v=v.parentElement;const e=document.createElement("li");v.appendChild(e),v=e}const o=b(a.trim(),l,i,s);v.insertAdjacentHTML("beforeend",o)}return m}function j(e,a,t){const l=N[e];l.name=a,l.level=t;const i=JSON.parse(A(a)),s={class:l.class,name:l.name,type:z.ABILITY,draw_pile:[],discard:[],move:[0,0],attack:[0,0],range:[0,0],level:l.level,health:[0,0]};for(let e=0;e0){const e=this.discard[this.discard.length-1];let a=e.starting_lines,t=[];if(this.is_boss()){let e=[];a.forEach((function(a){e=e.concat(p(a,s.special1,s.special2))})),a=e,this.immunities&&(t=t.concat(v(this.immunities))),this.notes&&(t=t.concat(g(this.notes)))}else this.attributes&&(t=t.concat(d(this.attributes)));e.paint_front_card(this.get_real_name(),a.concat(t),this.attack,this.move,this.range,this.level,this.health),e.ui.set_depth(-3),e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}R(this)},s.draw_top_card=function(){let e=this.draw_pile[0].starting_lines,a=[];if(this.is_boss()){let t=[];e.forEach((function(e){t=t.concat(p(e,s.special1,s.special2))})),e=t,this.immunities&&(a=a.concat(v(this.immunities))),this.notes&&(a=a.concat(g(this.notes)))}else this.attributes&&(a=a.concat(d(this.attributes)));this.draw_pile[0].paint_front_card(this.get_real_name(),e.concat(a),this.attack,this.move,this.range,this.level,this.health),R(this)},s.must_reshuffle=function(){return!this.draw_pile.length||(I&&this.discard.length?this.discard[0].shuffle_next:void 0)},s.set_stats_monster=function(e){this.attack=e.attack,this.move=e.move,this.range=e.range,this.attributes=e.attributes,this.health=e.health},s.set_stats_boss=function(e){this.attack=e.attack,this.move=e.move,this.range=e.range,this.special1=e.special1,this.special2=e.special2,this.immunities=e.immunities,this.notes=e.notes,this.health=e.health},s.get_real_name=function(){return this.name?this.name:this.class},s.is_boss=function(){return this.class===n.Boss.class},s.set_card_piles=function(e,a){for(let a=0;a0&&e.discard[0].ui.addClass("lift");const a=e.draw_pile.shift();J(a,!0),e.discard.unshift(a)}function J(e,a){e.ui.set_depth(-3),a&&e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}function X(e){e.must_reshuffle()?U(e,!0):B.forEach((function(a){a.class===e.class&&(a.draw_top_card(),W(a))})),L(e.name,JSON.stringify(e))}function q(e){e.clean_discard_pile(),U(e,!0),document.body.dispatchEvent(new CustomEvent(G.MODIFIER_DECK_SHUFFLE_REQUIRED,{detail:{shuffle:!1}}))}function Z(e){e.clean_advantage_deck(),e.must_reshuffle()?q(e):(W(e),document.body.dispatchEvent(new CustomEvent(G.MODIFIER_CARD_DRAWN,{detail:{card_type:e.discard[0].card_type,count:e.count(e.discard[0].card_type)}})),e.shuffle_end_of_round()&&document.body.dispatchEvent(new CustomEvent(G.MODIFIER_DECK_SHUFFLE_REQUIRED,{detail:{shuffle:!0}}))),L("modifier_deck",JSON.stringify(e))}function K(e){let a;1===e.draw_pile.length?(Z(e),a=e.discard[0],q(e),J(a=e.draw_pile.shift(),!1),e.discard.unshift(a),Z(e)):0===e.draw_pile.length?(e.clean_advantage_deck(),q(e),Z(e),a=e.discard[0],Z(e)):(Z(e),a=e.discard[0],Z(e)),e.discard[0].ui.addClass("right"),a.ui.addClass("left"),e.advantage_to_clean=!0}function Q(e){return{ui:new F(function(e){const a=document.createElement("img");a.className="cover",a.src=e;const t=document.createElement("div");return t.className="card modifier front",t.appendChild(a),t}(e.image),function(){const e=document.createElement("div");return e.className="card modifier back",e}()),card_type:e.type,shuffle_next_round:e.shuffle}}function $(){T.shuffle_end_of_round()&&(T.clean_advantage_deck(),q(T)),L("modifier_deck",JSON.stringify(T))}function Y(e,a){const t=document.getElementById("tableau");document.getElementById("currentdeckslist").innerHTML="";const n=B.filter((function(t){return!a||0===e.filter((function(e){return e.name===t.name&&e.level===t.level})).length})),l=e.filter((function(e){return!a||0===B.filter((function(a){return e.name===a.name&&e.level===a.level})).length}));if(T)a||(t.removeChild(document.getElementById("modifier-container")),ee(),te(t,T,a));else if(ee(),te(t,T,a),a){const e=JSON.parse(A("modifier_deck")),a=ae("curse",e),t=ae("bless",e);for(let e=0;e-1&&B.splice(e,1),t.removeChild(l)},e.is_boss()?"Boss"!==e.get_real_name()&&e.set_stats_boss((i=e.get_real_name(),s=e.level,i=i.replace("Boss: ",""),{attack:[r.bosses[i].level[s].attack],move:[r.bosses[i].level[s].move],range:[r.bosses[i].level[s].range],special1:r.bosses[i].level[s].special1,special2:r.bosses[i].level[s].special2,immunities:r.bosses[i].level[s].immunities,notes:r.bosses[i].level[s].notes,health:[r.bosses[i].level[s].health]})):e.set_stats_monster(function(e,a){return{attack:[r.monsters[e].level[a].normal.attack,r.monsters[e].level[a].elite.attack],move:[r.monsters[e].level[a].normal.move,r.monsters[e].level[a].elite.move],range:[r.monsters[e].level[a].normal.range,r.monsters[e].level[a].elite.range],attributes:[r.monsters[e].level[a].normal.attributes,r.monsters[e].level[a].elite.attributes],health:[r.monsters[e].level[a].normal.health,r.monsters[e].level[a].elite.health]}}(e.get_real_name(),e.level)),U(e),a?e.draw_top_discard():R(e),B.push(e);const o=document.getElementById("currentdeckslist"),m=document.createElement("li");m.className="currentdeck",o.appendChild(m);const c=document.createElement("a");c.id="switch-"+n,c.href="#switch-"+n,c.innerText=e.get_real_name(),c.title="Click to show/hide deck",c.addEventListener("click",(function(){const e=document.getElementById(this.id.replace("switch-",""));e.className="hiddendeck"===e.className?"card-container":"hiddendeck"}),!1),m.appendChild(c)})),M()}function ee(){T=function(){const e={name:"Monster modifier deck",type:z.MODIFIER,draw_pile:[],discard:[],advantage_to_clean:!1,draw_top_discard:function(){if(this.discard.length>0){const e=this.discard[this.discard.length-1];e.ui.set_depth(-3),e.ui.addClass("pull"),e.ui.flip_up(!0),e.ui.removeClass("draw"),e.ui.addClass("discard")}R(this)}};e.count=function(e){return this.draw_pile.filter((function(a){return a.card_type===e})).length}.bind(e),e.remove_card=function(a){for(let t=0;t0}.bind(e),e.must_reshuffle=function(){return!this.draw_pile.length}.bind(e),e.clean_discard_pile=function(){for(let a=0;a7?7:this.spinner.value},t.set_value=function(e){this.spinner.value=e>7?7:e},t}function le(){const e={};e.ul=document.createElement("ul"),e.ul.className="selectionlist",e.checkboxes={},e.level_selectors={},e.global_level_selector=null;const a=document.createElement("li"),t=new ne("Select global level ",!0);a.appendChild(t.html),e.global_level_selector=t;const l=y("button","applylevel","Apply All","");l.input.onclick=function(){for(let a in e.level_selectors)e.level_selectors[a].set_value(e.global_level_selector.get_selection())},a.appendChild(l.root),e.ul.appendChild(a);for(let a in n){const t=n[a].name,l=document.createElement("li"),i=y("checkbox","deck",t,t);l.appendChild(i.root);const s=new ne(" with level ",!0);l.appendChild(s.html),e.ul.appendChild(l),e.checkboxes[t]=i.input,e.level_selectors[t]=s}return e.get_selection=function(){return D(this.checkboxes).filter(w).map(x)},e.get_selected_decks=function(){const a=this.get_selection();var t;return t=a.map(function(a){const t=a in n?n[a]:[];return t.level=e.level_selectors[a].get_selection(),t}.bind(this)),Array.prototype.concat.apply([],t)},e.set_selection=function(a){D(this.checkboxes).forEach((function(e){e.checked=!1})),a.forEach(function(a){const t=this.checkboxes[a.name];t&&(t.checked=!0,e.level_selectors[a.name].set_value(a.level))}.bind(this))},e}function ie(e){const a={};a.ul=document.createElement("ul"),a.ul.className="selectionlist",a.spinner=null,a.decks={},a.special_rules={},a.level_selector=null,a.level_selector=new ne("Select level",!1),a.ul.appendChild(a.level_selector.html);for(let t=0;t=0&&e===o.living_corpse_two_levels_extra.affected_deck?Math.min(7,parseInt(n)+o.living_corpse_two_levels_extra.extra_levels):n},a.get_scenario_decks=function(){return this.decks[this.get_selection()].map((function(e){return n[e.name]?e.class=n[e.name].class:-1!==e.name.indexOf("Boss")&&(e.class=n.Boss.class),e.level=a.get_level(e.name,a.get_special_rules()),e}))},a.get_special_rules=function(){return this.special_rules[this.get_selection()]},a}document.addEventListener("DOMContentLoaded",(function(){!function(){const e=document.getElementById("deckspage"),a=document.getElementById("scenariospage"),t=document.getElementById("applydecks"),n=document.getElementById("applyscenario"),l=document.getElementById("applyload"),i=document.getElementById("showmodifierdeck"),s=new le,r=new ie(m);e.insertAdjacentElement("afterbegin",s.ul),a.insertAdjacentElement("afterbegin",r.ul),t.onclick=function(){localStorage.clear();const e=s.get_selected_decks();L("selected_deck_names",JSON.stringify(e)),Y(e.map((function(e){return j(e.class,e.name,e.level)})),!0);const a=document.getElementById("showmodifierdeck-deckspage"),t=document.getElementById("modifier-container");a.checked?t.style.display="block":t.style.display="none"},n.onclick=function(){try{localStorage.clear()}catch(e){return void console.error("Local storage is required")}const e=r.get_scenario_decks();L("selected_deck_names",JSON.stringify(e)),s.set_selection(e),Y(e.map((function(e){return j(e.class,e.name,e.level)})),!1);const a=document.getElementById("modifier-container");i.checked?a.style.display="block":a.style.display="none",S(_.settingspane,_.cancelarea,!1)},l.onclick=function(){const e=JSON.parse(A("selected_deck_names"));s.set_selection(e),Y(e.map((function(e){return j(e.class,e.name,e.level)})),!0);const a=document.getElementById("modifier-container");i.checked?a.style.display="block":a.style.display="none"},window.onresize=M.bind(null,B)}(),function(){const e={scenarios:document.getElementById("scenariotab"),decks:document.getElementById("deckstab")},a={scenarios:document.getElementById("scenariospage"),decks:document.getElementById("deckspage")};_.settingspane=document.getElementById("settingspane"),_.settingsbtn=document.getElementById("settingsbtn"),_.cancelarea=document.getElementById("cancelarea"),e.scenarios.onclick=function(){f(e,a,"scenarios")},e.decks.onclick=function(){f(e,a,"decks")},_.settingsbtn.onclick=function(){S(_.settingspane,_.cancelarea,!0)},_.cancelarea.onclick=function(){S(_.settingspane,_.cancelarea,!1)},f(e,a,"scenarios")}()})),"serviceWorker"in navigator&&window.addEventListener("load",(function(){navigator.serviceWorker.register("/service-worker.js")}))}]); \ No newline at end of file diff --git a/dist/manifest.json b/dist/manifest.json new file mode 100644 index 00000000..3cf6e389 --- /dev/null +++ b/dist/manifest.json @@ -0,0 +1,19 @@ +{ + "short_name": "Gloomy Companion", + "name": "Gloomy Companion", + "start_url": "index.html", + "scope": ".", + "display": "standalone", + "icons": [ + { + "src": "/images/icon.png", + "sizes": "192x192", + "type": "image/png" + } + ], + "background_color": "#000", + "theme_color": "#731819", + "service_worker": { + "src": "/service-worker.js" + } +} diff --git a/dist/service-worker.js b/dist/service-worker.js new file mode 100644 index 00000000..3ffa769f --- /dev/null +++ b/dist/service-worker.js @@ -0,0 +1,79 @@ +// https://googlechrome.github.io/samples/service-worker/basic/ + +/* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +// Names of the two caches used in this version of the service worker. +// Change to v2, etc. when you update any of the local resources, which will +// in turn trigger the install event again. +const PRECACHE = 'precache-v1'; +const RUNTIME = 'runtime'; + +// A list of local resources we always want to be cached. +const PRECACHE_URLS = [ + 'index.html', + './', // Alias for index.html + 'cards.css', + 'style.css', + 'main.js', + 'Philosopher-Bold.ttf', + 'PirataOne-Gloomhaven.ttf' +]; + +// The install handler takes care of precaching the resources we always need. +self.addEventListener('install', event => { + event.waitUntil( + caches.open(PRECACHE) + .then(cache => cache.addAll(PRECACHE_URLS)) + .then(self.skipWaiting()) + ); +}); + +// The activate handler takes care of cleaning up old caches. +self.addEventListener('activate', event => { + const currentCaches = [PRECACHE, RUNTIME]; + event.waitUntil( + caches.keys().then(cacheNames => { + return cacheNames.filter(cacheName => !currentCaches.includes(cacheName)); + }).then(cachesToDelete => { + return Promise.all(cachesToDelete.map(cacheToDelete => { + return caches.delete(cacheToDelete); + })); + }).then(() => self.clients.claim()) + ); +}); + +// The fetch handler serves responses for same-origin resources from a cache. +// If no response is found, it populates the runtime cache with the response +// from the network before returning it to the page. +self.addEventListener('fetch', event => { + // Skip cross-origin requests, like those for Google Analytics. + if (event.request.url.startsWith(self.location.origin)) { + event.respondWith( + caches.match(event.request).then(cachedResponse => { + if (cachedResponse) { + return cachedResponse; + } + + return caches.open(RUNTIME).then(cache => { + return fetch(event.request).then(response => { + // Put a copy of the response in the runtime cache. + return cache.put(event.request, response.clone()).then(() => { + return response; + }); + }); + }); + }) + ); + } +}); diff --git a/gen-manifest.sh b/gen-manifest.sh deleted file mode 100755 index 642145fe..00000000 --- a/gen-manifest.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -# -# TODO: not updated for webpack - -cat << EOF > app.manifest -CACHE MANIFEST -# -# Version `date -u` -# - -EOF - -git ls-tree --full-tree -r --name-only HEAD | grep -v \ - -e app.manifest \ - -e gen-manifest.sh \ - -e README.md \ - | sort >> dist/app.manifest - diff --git a/src/index.js b/src/index.js index 7deea64c..609d12ed 100644 --- a/src/index.js +++ b/src/index.js @@ -5,3 +5,10 @@ document.addEventListener('DOMContentLoaded', function () { init() init_ui() }) + +// https://developers.google.com/web/tools/workbox/guides/generate-service-worker/webpack +if ('serviceWorker' in navigator) { + window.addEventListener('load', function () { + navigator.serviceWorker.register('/service-worker.js'); + }); +} diff --git a/webpack.config.js b/webpack.config.js index 7018f2e6..4454b601 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -9,6 +9,6 @@ module.exports = { devServer: { disableHostCheck: true, - contentBase: './dist' + contentBase: path.resolve(__dirname, 'dist') } }; From fab727a7dfeaa797d2638716ef1e8f82d069c134 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sat, 26 Oct 2019 15:40:38 -0400 Subject: [PATCH 22/23] add all images to service worker precached assets --- dist/service-worker.js | 69 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/dist/service-worker.js b/dist/service-worker.js index 3ffa769f..00f17756 100644 --- a/dist/service-worker.js +++ b/dist/service-worker.js @@ -27,7 +27,74 @@ const PRECACHE_URLS = [ 'style.css', 'main.js', 'Philosopher-Bold.ttf', - 'PirataOne-Gloomhaven.ttf' + 'PirataOne-Gloomhaven.ttf', + 'images/add_target.svg', + 'images/air.svg', + 'images/any_element.svg', + 'images/aoe-4-with-black.svg', + 'images/aoe-circle-with-middle-black.svg', + 'images/aoe-circle-with-side-black.svg', + 'images/aoe-circle.svg', + 'images/aoe-line-3-with-black.svg', + 'images/aoe-line-4-with-black.svg', + 'images/aoe-line-6-with-black.svg', + 'images/aoe-triangle-2-side-with-black.svg', + 'images/aoe-triangle-2-side.svg', + 'images/aoe-triangle-3-side-with-corner-black.svg', + 'images/aoe1.svg', + 'images/aoe2.svg', + 'images/attack.svg', + 'images/attack_mod_+0.jpg', + 'images/attack_mod_+1.jpg', + 'images/attack_mod_+2.jpg', + 'images/attack_mod_-1.jpg', + 'images/attack_mod_-2.jpg', + 'images/attack_mod_2x.jpg', + 'images/attack_mod_back.jpg', + 'images/attack_mod_bless.jpg', + 'images/attack_mod_curse.jpg', + 'images/attack_mod_null.jpg', + 'images/back.jpg', + 'images/back.svg', + 'images/bless.svg', + 'images/curse.svg', + 'images/dark.svg', + 'images/disarm.svg', + 'images/draw-two.svg', + 'images/earth.svg', + 'images/elderDrake.special1Area.svg', + 'images/fire.svg', + 'images/fly.svg', + 'images/front.jpg', + 'images/heal.svg', + 'images/ice.svg', + 'images/icon.png', + 'images/immobilize.svg', + 'images/inoxBodyguard.special1Area.svg', + 'images/invisibility.svg', + 'images/jump.svg', + 'images/light.svg', + 'images/loot.svg', + 'images/minus-circle.svg', + 'images/move.svg', + 'images/muddle.svg', + 'images/pierce.svg', + 'images/plus-circle.svg', + 'images/poison.svg', + 'images/push.svg', + 'images/range.svg', + 'images/retaliate.svg', + 'images/settings.svg', + 'images/shield.svg', + 'images/shuffle-black.svg', + 'images/shuffle.svg', + 'images/sightlessEye.special1Area.svg', + 'images/sightlessEye.special2Area.svg', + 'images/strengthen.svg', + 'images/stun.svg', + 'images/target.svg', + 'images/use_element.svg', + 'images/wound.svg' ]; // The install handler takes care of precaching the resources we always need. From bf4f128e87ea8e86819176f2d3f58845f55efc92 Mon Sep 17 00:00:00 2001 From: William Makley Date: Sat, 26 Oct 2019 16:10:29 -0400 Subject: [PATCH 23/23] add http-server for testing PWA functionality https://webpack.js.org/guides/progressive-web-application/ --- README.md | 7 +++- package-lock.json | 99 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 +- webpack.config.js | 1 + 4 files changed, 109 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ef475b72..230f8942 100644 --- a/README.md +++ b/README.md @@ -35,5 +35,10 @@ A single `*` means a top-level action. Double asterisk `**` means it modifies th ## Development * Clone the repository -* `npm ci` +* `npm install` * `npm run dev-server` + +## PWA Development and Testing + +1. `npm run http-server` +2. Browse to http://localhost:8080 and use Chrome developer tools for auditing and debugging. diff --git a/package-lock.json b/package-lock.json index fc667ef4..13669976 100644 --- a/package-lock.json +++ b/package-lock.json @@ -902,6 +902,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1026,6 +1032,12 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", + "dev": true + }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -1304,6 +1316,18 @@ "stream-shift": "^1.0.0" } }, + "ecstatic": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.2.tgz", + "integrity": "sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog==", + "dev": true, + "requires": { + "he": "^1.1.1", + "mime": "^1.6.0", + "minimist": "^1.1.0", + "url-join": "^2.0.5" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2687,6 +2711,12 @@ "minimalistic-assert": "^1.0.1" } }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -2780,6 +2810,22 @@ "micromatch": "^3.1.10" } }, + "http-server": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.11.1.tgz", + "integrity": "sha512-6JeGDGoujJLmhjiRGlt8yK8Z9Kl0vnl/dQoQZlc4oeqaUoAKQg94NILLfrY3oWzSyFaQCVNTcKE5PZ3cH8VP9w==", + "dev": true, + "requires": { + "colors": "1.0.3", + "corser": "~2.0.0", + "ecstatic": "^3.0.0", + "http-proxy": "^1.8.1", + "opener": "~1.4.0", + "optimist": "0.6.x", + "portfinder": "^1.0.13", + "union": "~0.4.3" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -3754,6 +3800,12 @@ } } }, + "opener": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", + "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", + "dev": true + }, "opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -3763,6 +3815,30 @@ "is-wsl": "^1.1.0" } }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -5145,6 +5221,23 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "union": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/union/-/union-0.4.6.tgz", + "integrity": "sha1-GY+9rrolTniLDvy2MLwR8kopWeA=", + "dev": true, + "requires": { + "qs": "~2.3.3" + }, + "dependencies": { + "qs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", + "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=", + "dev": true + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -5248,6 +5341,12 @@ } } }, + "url-join": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", + "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", + "dev": true + }, "url-parse": { "version": "1.4.7", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", diff --git a/package.json b/package.json index d2a2c38a..dd662217 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "build": "webpack --mode=production", "test": "echo \"Error: no test specified\" && exit 1", - "dev-server": "webpack-dev-server" + "dev-server": "webpack-dev-server", + "http-server": "http-server dist" }, "repository": { "type": "git", @@ -26,6 +27,7 @@ }, "devDependencies": { "eslint": "^6.5.1", + "http-server": "^0.11.1", "webpack-cli": "^3.3.9", "webpack-dev-server": "^3.8.2" } diff --git a/webpack.config.js b/webpack.config.js index 4454b601..a072ab07 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,6 +2,7 @@ const path = require('path'); module.exports = { entry: './src/index.js', + output: { filename: 'main.js', path: path.resolve(__dirname, 'dist'),