
function $parcel$export(e, n, v, s) {
  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
}

      var $parcel$global = globalThis;
    
var $parcel$modules = {};
var $parcel$inits = {};

var parcelRequire = $parcel$global["parcelRequire1192"];

if (parcelRequire == null) {
  parcelRequire = function(id) {
    if (id in $parcel$modules) {
      return $parcel$modules[id].exports;
    }
    if (id in $parcel$inits) {
      var init = $parcel$inits[id];
      delete $parcel$inits[id];
      var module = {id: id, exports: {}};
      $parcel$modules[id] = module;
      init.call(module.exports, module, module.exports);
      return module.exports;
    }
    var err = new Error("Cannot find module '" + id + "'");
    err.code = 'MODULE_NOT_FOUND';
    throw err;
  };

  parcelRequire.register = function register(id, init) {
    $parcel$inits[id] = init;
  };

  $parcel$global["parcelRequire1192"] = parcelRequire;
}

var parcelRegister = parcelRequire.register;
parcelRegister("1kF5N", function(module, exports) {

$parcel$export(module.exports, "CollisionSide", () => CollisionSide);
$parcel$export(module.exports, "circleInCircle", () => circleInCircle);
$parcel$export(module.exports, "pointInCircle", () => pointInCircle);
$parcel$export(module.exports, "rectInRect", () => rectInRect);
$parcel$export(module.exports, "pointInRect", () => pointInRect);
$parcel$export(module.exports, "circleInRect", () => circleInRect);
$parcel$export(module.exports, "resolveCollision", () => resolveCollision);
/* collision.ts */ 
var $cNzzM = parcelRequire("cNzzM");
const { abs } = Math;
var CollisionSide = /*#__PURE__*/ function(CollisionSide) {
    CollisionSide["NONE"] = "";
    CollisionSide["LEFT"] = "left";
    CollisionSide["RIGHT"] = "right";
    CollisionSide["TOP"] = "top";
    CollisionSide["BOTTOM"] = "bottom";
    return CollisionSide;
}({});
function circleInCircle(c1, r1, c2, r2) {
    const s = r1 + r2;
    return c1.distance2(c2) <= s * s;
}
function pointInCircle(p, c, r) {
    return p.distance2(c) <= r * r;
}
function rectInRect(r1, r2) {
    return !(r2.x >= r1.x + r1.w || r2.x + r2.w <= r1.x || r2.y >= r1.y + r1.h || r2.y + r2.h <= r1.y);
}
function pointInRect(p, r) {
    return p.x <= r.x && p.x <= r.x + r.w && r.y <= p.y && p.y <= r.y + r.h;
}
function circleInRect(c, radius, r) {
    const { x: left, y: top } = r.topleft;
    const { x: right, y: bottom } = r.bottomright;
    return !// AABB/AABB
    (c.x + radius <= left || c.x - radius >= right || c.y + radius <= top || c.y - radius >= bottom) && // one of the rectangle vertices is in the circle
    (this.pointInCircle(r.topleft, c, radius) || this.pointInCircle(r.bottomleft, c, radius) || this.pointInCircle(r.topright, c, radius) || this.pointInCircle(r.bottomright, c, radius) || // the center is in the rectangle
    this.pointInRect(c, r) || // discriminate last cases
    (()=>{
        const { x: w, y: h } = r.size;
        const d = c.sub(r.topleft);
        // project center on left side
        const px = d.dot(new (0, $cNzzM.Vec2)(w, 0));
        if (px <= w && px >= 0) return true;
        // project center on top size
        const py = d.dot(new (0, $cNzzM.Vec2)(0, h));
        if (py <= h && py >= 0) return true;
        return false;
    })());
}
function resolveCollision(r1, r2) {
    if (!rectInRect(r1, r2)) return "";
    const vx = r1.center.x - r2.center.x;
    const vy = r1.center.y - r2.center.y;
    const ax = abs(vx);
    const ay = abs(vy);
    const ww2 = (r1.w + r2.w) / 2;
    const hh2 = (r1.h + r2.h) / 2;
    const ox = ww2 - ax;
    const oy = hh2 - ay;
    if (ox > 0 && oy > 0) {
        if (ox >= oy) return vy > 0 ? "top" : "bottom";
        else return vx > 0 ? "left" : "right";
    }
    return "";
}

});
parcelRegister("cNzzM", function(module, exports) {

$parcel$export(module.exports, "Vec2", () => $9798ac7148f7abf4$export$ac4bca90992eed1);
const { atan2: $9798ac7148f7abf4$var$atan2, sqrt: $9798ac7148f7abf4$var$sqrt } = Math;
class $9798ac7148f7abf4$export$ac4bca90992eed1 {
    /**
   * create a Vector 2D Object
   * @param {number} x
   * @param {number} y
   */ constructor(x = 0, y = 0){
        this.x = x;
        this.y = y;
    }
    /**
   * Return a fresh null vector
   */ static null() {
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(0, 0);
    }
    /**
   * Construct a Vec2 with both components equal
   * @param x {number} value of the components
   */ static scal(x) {
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(x, x);
    }
    /**
   * Construct a Vec2 from an arbitrary object
   */ static from_obj(obj) {
        const x = typeof obj["x"] == "number" ? obj["x"] : 0;
        const y = typeof obj["y"] == "number" ? obj["y"] : 0;
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(x, y);
    }
    /**
   * Construct a Vec2 pointing toward x+
   */ static xAxis() {
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(1, 0);
    }
    /**
   * Construct a Vec2 pointing toward y+
   */ static yAxis() {
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(0, 1);
    }
    /**
   * Clone a Vec2
   * @param {Vec2} v
   * @returns a fresh Vec2
   */ clone() {
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(this.x, this.y);
    }
    /**
   * Return a fresh vector with the same coordinates.
   */ static copy({ x: x, y: y }) {
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(x, y);
    }
    /**
   * Set the components of a vector in place
   */ set(x, y = null) {
        if (x instanceof $9798ac7148f7abf4$export$ac4bca90992eed1) {
            this.x = x.x;
            this.y = x.y;
        } else {
            this.x = x != null && x != undefined ? x : this.x;
            this.y = y != null && x != undefined ? y : this.y;
        }
        return this;
    }
    /**
   * Return a new vector sum of this and another
   * @param other {Vec2}
   */ add({ x: x, y: y }) {
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(this.x + x, this.y + y);
    }
    /**
   * Return a new vector difference of this and another
   * @param other {Vec2}
   */ sub({ x: x, y: y }) {
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(this.x - x, this.y - y);
    }
    /**
   * Return a new vector product of this and another
   * @param other {Vec2}
   */ mul({ x: x, y: y }) {
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(this.x * x, this.y * y);
    }
    /**
   * Return a new vector quotient of this and another
   * @param other {Vec2}
   */ div({ x: x, y: y }) {
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(this.x / x, this.y / y);
    }
    /**
   * Return the angle in radians between two vectors
   */ angle(other) {
        const det = this.det(other);
        const dot = this.dot(other);
        return $9798ac7148f7abf4$var$atan2(det, dot);
    }
    /**
   * Return the dot product of this and another vector
   */ dot({ x: x, y: y }) {
        return this.x * x + this.y * y;
    }
    /**
   * Return the determinant of this and another vector
   */ det({ x: x, y: y }) {
        return this.x * y - this.y * x;
    }
    /**
   * Return the length/norm/magnitude of this vector
   */ length() {
        return $9798ac7148f7abf4$var$sqrt(this.x * this.x + this.y * this.y);
    }
    /**
   * Return the squared length of this vector
   */ length2() {
        return this.x * this.x + this.y * this.y;
    }
    /**
   * Compare to a vector
   */ equals({ x: x, y: y }) {
        return this.x == x && this.y == y;
    }
    /**
   * Linear interpolation
   */ lerp({ x: x, y: y }, alpha) {
        return new $9798ac7148f7abf4$export$ac4bca90992eed1(this.x + (x - this.x) * alpha, this.y + (y - this.y) * alpha);
    }
    /**
   * Return a new vector of length 1 and of same direction.
   */ normalize() {
        return this.div($9798ac7148f7abf4$export$ac4bca90992eed1.scal(this.length() || 1));
    }
    /**
   * Return a new vector of length n and of same direction.
   */ withNorm(n) {
        return this.mul($9798ac7148f7abf4$export$ac4bca90992eed1.scal(n / (this.length() || 1)));
    }
    /**
   * return the distance between this point and another
   */ distance(other) {
        return this.sub(other).length();
    }
    /**
   * return the squared distance between this point and another
   */ distance2(other) {
        return this.sub(other).length2();
    }
}

});


var $370cb1d6398d5f76$exports = {};

$parcel$export($370cb1d6398d5f76$exports, "Camera", () => $370cb1d6398d5f76$export$79f141de891a5fed);
$parcel$export($370cb1d6398d5f76$exports, "SmoothCamera", () => $370cb1d6398d5f76$export$e90a5c36ff53ccb4);

var $cNzzM = parcelRequire("cNzzM");
var $fba27c1221d410b4$exports = {};

$parcel$export($fba27c1221d410b4$exports, "Rect", () => $fba27c1221d410b4$export$c79fc6492f3af13d);

var $cNzzM = parcelRequire("cNzzM");
class $fba27c1221d410b4$export$c79fc6492f3af13d {
    /**
   * @param {number} x left coordinate
   * @param {number} y top coordinate
   * @param {number} w width of the rectangle
   * @param {number} h height of the rectangle
   */ constructor(x, y, w, h){
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
    }
    /**
   * Return a fresh null rectangle (size = Vec2.null() and topright = Vec2.null())
   */ static null() {
        return new $fba27c1221d410b4$export$c79fc6492f3af13d(0, 0, 0, 0);
    }
    /**
   * Return a fresh rectangle initialized from an arbitrary object.
   */ static from_obj(obj) {
        const x = typeof obj["x"] == "number" ? obj["x"] : 0;
        const y = typeof obj["y"] == "number" ? obj["y"] : 0;
        const w = typeof obj["w"] == "number" ? obj["w"] : 0;
        const h = typeof obj["h"] == "number" ? obj["h"] : 0;
        return new $fba27c1221d410b4$export$c79fc6492f3af13d(x, y, w, h);
    }
    /**
   * Top left corner coordinates
   * Do not set the components directly, it would not update the rectangle.
   */ get topleft() {
        return new (0, $cNzzM.Vec2)(this.x, this.y);
    }
    set topleft({ x: x, y: y }) {
        this.x = x;
        this.y = y;
    }
    /**
   * Top right corner coordinates
   * Do not set the components directly, it would not update the rectangle.
   */ get topright() {
        return new (0, $cNzzM.Vec2)(this.x + this.w, this.y);
    }
    set topright({ x: x, y: y }) {
        this.x = x - this.w;
        this.y = y;
    }
    /**
   * Bottom left corner coordinates
   * Do not set the components directly, it would not update the rectangle.
   */ get bottomleft() {
        return new (0, $cNzzM.Vec2)(this.x, this.y + this.h);
    }
    set bottomleft({ x: x, y: y }) {
        this.x = x;
        this.y = y - this.h;
    }
    /**
   * Bottom right corner coordinates
   * Do not set the components directly, it would not update the rectangle.
   */ get bottomright() {
        return new (0, $cNzzM.Vec2)(this.x + this.h, this.y + this.h);
    }
    set bottomright({ x: x, y: y }) {
        this.x = x - this.w;
        this.y = y - this.h;
    }
    /**
   * Center coordinates
   * Do not set the components directly, it would not update the rectangle.
   */ get center() {
        return new (0, $cNzzM.Vec2)(this.x + 0.5 * this.w, this.y + 0.5 * this.h);
    }
    set center({ x: x, y: y }) {
        this.x = x - 0.5 * this.w;
        this.y = y - 0.5 * this.h;
    }
    /**
   * Left coordinate
   */ get left() {
        return this.x;
    }
    set left(x) {
        this.x = x;
    }
    /**
   * right coordinate
   */ get right() {
        return this.x + this.w;
    }
    set right(x) {
        this.x = x - this.w;
    }
    /**
   * Top coordinate
   */ get top() {
        return this.y;
    }
    set top(y) {
        this.y = y;
    }
    /**
   * Bottom coordinate
   */ get bottom() {
        return this.y + this.h;
    }
    set bottom(y) {
        this.y = y - this.h;
    }
    /**
   * Size as a vector.
   * Setting this with shrink or grow the rectangle from top left corner.
   * Do not set the components directly, it would not update the rectangle.
   */ get size() {
        return new (0, $cNzzM.Vec2)(this.w, this.h);
    }
    set size({ x: x, y: y }) {
        this.w = x;
        this.h = y;
    }
}


const $370cb1d6398d5f76$var$SNAP_DIST2 = 4;
class $370cb1d6398d5f76$export$79f141de891a5fed {
    /**
   * @param {CanvasRenderingContext2D} ctx - current canvas context
   * @param {Vec2} target - initial point to look at
   * @param {Vec2} offset - offset from screen center
   */ constructor(can, target, offset){
        this.can = can;
        this.ctx = can.ctx;
        this.target = target;
        offset = offset ?? (0, $cNzzM.Vec2).null();
        this.center = can.size.mul((0, $cNzzM.Vec2).scal(0.5)).sub(offset);
        this.pos = this.center.sub(this.target);
    }
    /**
   * Start rendering through this camera
   */ attach() {
        this.ctx.save();
        this.ctx.translate(this.pos.x, this.pos.y);
        return this;
    }
    /**
   * Stop rendering through this camera
   */ detach() {
        this.ctx.restore();
        return this;
    }
    /**
   * update the camera
   * @param {number} dt
   */ update(_dt) {
        this.pos.set(this.center.sub(this.target));
        return this;
    }
    /**
   * return the rectangle currently showed through the camera.
   */ get rect() {
        const r = (0, $fba27c1221d410b4$export$c79fc6492f3af13d).null();
        r.size = this.can.size;
        r.topleft = this.pos.mul((0, $cNzzM.Vec2).scal(-1));
        return r;
    }
}
class $370cb1d6398d5f76$export$e90a5c36ff53ccb4 extends $370cb1d6398d5f76$export$79f141de891a5fed {
    /**
   * @param {CanvasRenderingContext2D} ctx - current canvas context
   * @param {Vec2} target - initial point to look at
   * @param {number} speed speed at wich the camera moves (pixel per seconds)
   * @param {Vec2?} offset - offset from screen center
   */ constructor(can, target, speed, offset){
        super(can, target, offset);
        this.speed = speed;
    }
    update(dt) {
        const ptarget = this.center.sub(this.target);
        const delta = ptarget.sub(this.pos);
        const dr = this.speed * dt;
        if (delta.length2() > dr * dr) this.pos.set(this.pos.add(delta.withNorm(dr)));
        else this.pos.set(ptarget);
        return this;
    }
}


var $c5e8e0cfa8a822f8$exports = {};

$parcel$export($c5e8e0cfa8a822f8$exports, "Canvas", () => $c5e8e0cfa8a822f8$export$8d01c972ee8b14a9);
var $f314c6851ceb0f9e$exports = {};

$parcel$export($f314c6851ceb0f9e$exports, "el", () => $f314c6851ceb0f9e$export$c3da0dad1b44eea9);
$parcel$export($f314c6851ceb0f9e$exports, "attr", () => $f314c6851ceb0f9e$export$7aabe8b3a840d2fd);
$parcel$export($f314c6851ceb0f9e$exports, "frag", () => $f314c6851ceb0f9e$export$6a2d9549213d3666);
$parcel$export($f314c6851ceb0f9e$exports, "qs", () => $f314c6851ceb0f9e$export$836aee6bce45247);
$parcel$export($f314c6851ceb0f9e$exports, "qsa", () => $f314c6851ceb0f9e$export$9ca9051b92b5a6d2);
$parcel$export($f314c6851ceb0f9e$exports, "style", () => $f314c6851ceb0f9e$export$1d567c320f4763bc);
$parcel$export($f314c6851ceb0f9e$exports, "on", () => $f314c6851ceb0f9e$export$af631764ddc44097);
$parcel$export($f314c6851ceb0f9e$exports, "ready", () => $f314c6851ceb0f9e$export$28ee1007e174a2a6);
$parcel$export($f314c6851ceb0f9e$exports, "emit", () => $f314c6851ceb0f9e$export$8f35fbd5db0f3634);
const $f314c6851ceb0f9e$var$doc = document;
const $f314c6851ceb0f9e$var$selectorRegex = /([.#])/;
const $f314c6851ceb0f9e$var$ns = "http://www.w3.org/2000/svg";
const $f314c6851ceb0f9e$var$parseSelector = (selector)=>{
    const tokens = selector.split($f314c6851ceb0f9e$var$selectorRegex);
    let id = "", className = "";
    for(let i = 1; i < tokens.length; i += 2)switch(tokens[i]){
        case ".":
            className += ` ${tokens[i + 1]}`;
            break;
        case "#":
            id = tokens[i + 1];
    }
    return {
        tag: tokens[0] || "div",
        className: className.trim(),
        id: id
    };
};
function $f314c6851ceb0f9e$export$c3da0dad1b44eea9(selector, isSvg = false) {
    const { tag: tag, id: id, className: className } = $f314c6851ceb0f9e$var$parseSelector(selector);
    const element = isSvg ? $f314c6851ceb0f9e$var$doc.createElementNS($f314c6851ceb0f9e$var$ns, tag) : $f314c6851ceb0f9e$var$doc.createElement(tag);
    if (id) element.id = id;
    if (className) {
        if (isSvg) $f314c6851ceb0f9e$export$7aabe8b3a840d2fd(element, "class", className);
        else element.className = className;
    }
    return element;
}
function $f314c6851ceb0f9e$export$6a2d9549213d3666() {
    return $f314c6851ceb0f9e$var$doc.createDocumentFragment();
}
function $f314c6851ceb0f9e$export$836aee6bce45247(selectors, ctx = $f314c6851ceb0f9e$var$doc) {
    return ctx.querySelector(selectors);
}
function $f314c6851ceb0f9e$export$9ca9051b92b5a6d2(selectors, ctx = $f314c6851ceb0f9e$var$doc) {
    return ctx.querySelectorAll(selectors);
}
function $f314c6851ceb0f9e$export$1d567c320f4763bc(element, styleObj) {
    return Object.assign(element.style, styleObj);
}
function $f314c6851ceb0f9e$export$7aabe8b3a840d2fd(element, attributeName, value) {
    if (value === undefined) return element.getAttribute(attributeName);
    if (value === false) element.removeAttribute(attributeName);
    else element.setAttribute(attributeName, value);
}
function $f314c6851ceb0f9e$export$af631764ddc44097(element, type, handler) {
    element.addEventListener(type, handler, false);
    return function() {
        element.removeEventListener(type, handler, false);
    };
}
function $f314c6851ceb0f9e$export$28ee1007e174a2a6(app) {
    if (/complete|loaded|interactive/.test($f314c6851ceb0f9e$var$doc.readyState) && $f314c6851ceb0f9e$var$doc.body) app();
    else $f314c6851ceb0f9e$export$af631764ddc44097($f314c6851ceb0f9e$var$doc, "DOMContentLoaded", app);
}
function $f314c6851ceb0f9e$export$8f35fbd5db0f3634(element, event, details) {
    if (typeof event === "string") {
        const e = new CustomEvent(event, {
            detail: details
        });
        element.dispatchEvent(e);
        return e;
    } else {
        element.dispatchEvent(event);
        return event;
    }
}



var $cNzzM = parcelRequire("cNzzM");

const $c5e8e0cfa8a822f8$var$DEFAULT_FONT = "droid sans";
const $c5e8e0cfa8a822f8$var$DEFAULT_SIZE = "24px";
class $c5e8e0cfa8a822f8$export$8d01c972ee8b14a9 {
    /**
   * Initialize a new Canvas
   * @param {number} width
   * @param {number} height
   * @param {string} background - background color
   */ constructor(width = 400, height = 400, background = "#FFFFFF"){
        this.canElement = document.createElement("canvas"); // canvas
        this.width = width;
        this.height = height;
        this.canElement.width = width; // set width
        this.canElement.height = height; // set height
        this._ctx = null;
        if (background) this.canElement.style.background = background; // change background
    }
    /**
   * A simple shortcut covering the most common case
   */ static quickSetup(options) {
        const w = typeof options["w"] == "number" ? options["w"] : 720;
        const h = typeof options["h"] == "number" ? options["h"] : 480;
        const bg = typeof options["bg"] == "string" ? options["bg"] : "#FFFFFF";
        const id = typeof options["id"] == "string" ? options["id"] : undefined;
        const parent = options["parent"] instanceof Element ? options["parent"] : (0, $f314c6851ceb0f9e$export$836aee6bce45247)("body");
        const can = new $c5e8e0cfa8a822f8$export$8d01c972ee8b14a9(w, h, bg);
        if (options["smooth"] !== undefined && options["smooth"] !== null) can.smooth(options["smooth"]);
        can.attach(parent, id);
        return can;
    }
    get ctx() {
        if (!this._ctx) this._ctx = this.canElement.getContext("2d");
        return this._ctx;
    }
    get size() {
        return new (0, $cNzzM.Vec2)(this.canElement.width, this.canElement.height);
    }
    get rect() {
        return new (0, $fba27c1221d410b4$export$c79fc6492f3af13d)(0, 0, this.canElement.width, this.canElement.height);
    }
    boundingRect() {
        const { top: top, left: left, width: width, height: height } = this.canElement.getBoundingClientRect();
        return new (0, $fba27c1221d410b4$export$c79fc6492f3af13d)(top, left, width, height);
    }
    attach(parent, id) {
        if (id) {
            const prev = (0, $f314c6851ceb0f9e$export$836aee6bce45247)("#" + id);
            if (prev) prev.remove();
            this.canElement.id = id;
        }
        if (!parent) parent = (0, $f314c6851ceb0f9e$export$836aee6bce45247)("body");
        parent.appendChild(this.canElement);
        return this;
    }
    clear() {
        this.ctx.clearRect(0, 0, this.width, this.height);
        return this;
    }
    drawText(text, pos, options) {
        const font = typeof options["font"] == "string" ? options["font"] : $c5e8e0cfa8a822f8$var$DEFAULT_FONT;
        const align = typeof options["align"] == "string" ? options["align"] : "start";
        const size = typeof options["size"] == "string" ? options["size"] : $c5e8e0cfa8a822f8$var$DEFAULT_SIZE;
        this.ctx.font = `${size} ${font}`;
        this.ctx.textAlign = align;
        this.ctx.fillText(text, pos.x, pos.y);
    }
    smooth(enabled) {
        this.ctx.imageSmoothingEnabled = enabled;
        return this;
    }
}


parcelRequire("1kF5N");

var $a75eca5c28f7626a$exports = {};

$parcel$export($a75eca5c28f7626a$exports, "Registry", () => $a75eca5c28f7626a$export$4d9facee29974f3);
class $a75eca5c28f7626a$export$4d9facee29974f3 {
    constructor(){
        this.selectedEntity = Symbol();
        this.entities = new Map();
        this.components = new Map();
    }
    entity(name) {
        let ent;
        if (name) {
            if (typeof name == "string") ent = Symbol.for(name);
            else ent = name;
        } else ent = Symbol();
        this.selectedEntity = ent;
        if (!this.entities.has(ent)) {
            this.entities.set(ent, {
                compList: []
            });
            this.selectedEntity = ent;
        }
        return this;
    }
    /**
   * Return an entity from its name.
   */ entityByName(ent) {
        return Symbol.for(ent);
    }
    addComponent(comp, values) {
        if (!values) values = {};
        if (typeof comp == "string") comp = this.componentByName(comp);
        const { map: map, defVal: defVal } = this.components.get(comp);
        const val = {};
        for(const key in defVal)if (key in values) val[key] = values[key];
        else val[key] = defVal[key];
        map.set(this.selectedEntity, val);
        this.entities.get(this.selectedEntity).compList.push(comp);
        return this;
    }
    /**
   * Map callback to all entities that have every components in comps.
   * When callback is called, the corresponding entity is selected.
   */ queryAll(callback, ...comps) {
        const maps = comps.map((c)=>this.components.get(c).map);
        const smaller = maps.reduce((a, b)=>a.size < b.size ? a : b);
        for (const ent of smaller.keys()){
            const values = [];
            let valid = true;
            for (const map of maps){
                const val = map.get(ent);
                if (!val) {
                    valid = false;
                    break;
                } else values.push(val);
            }
            if (valid) {
                this.selectedEntity = ent;
                callback(...values);
            }
        }
        return this;
    }
    entityData(ent) {
        if (ent) this.selectedEntity = ent;
        const { compList: compList } = this.entities.get(this.selectedEntity);
        const res = {};
        for (const comp of compList){
            const { name: name, map: map } = this.components.get(comp);
            const val = map.get(this.selectedEntity);
            res[name] = val;
        }
        return res;
    }
    makeComponent(name, defVal) {
        const comp = Symbol.for("%%comp%%" + name);
        this.components.set(comp, {
            name: name,
            map: new Map(),
            defVal: defVal
        });
        return comp;
    }
    /**
   * Return a component from its name.
   */ componentByName(name) {
        return Symbol.for("%%comp%%" + name);
    }
}


var $cf19820bc073e692$exports = {};

$parcel$export($cf19820bc073e692$exports, "EventEmitter", () => $cf19820bc073e692$export$4fae95256245c8c0);
/**
 * A general function type for handling custom events
 */ class $cf19820bc073e692$export$4fae95256245c8c0 {
    constructor(){
        this.events = new Map();
    }
    /**
   * Bind a new event listener
   * @param {string} type - event type
   * @param {function} listener - event handler
   */ on(type, listener) {
        if (!this.events.has(type)) this.events.set(type, new Set());
        const listeners = this.events.get(type);
        listeners.add(listener);
        return ()=>{
            listeners.delete(listener);
            if (!listeners.size) this.events.delete(type);
        };
    }
    /**
   * Disable an event listener
   * @param {string} type - event type
   * @param {function} listener - event handler to disable
   */ off(type, listener) {
        const listeners = this.events.get(type);
        if (!listeners) return;
        listeners.delete(listener);
        if (!listeners.size) this.events.delete(type);
    }
    /**
   * Emit an event and handle it.
   * @param {string} - event type
   * @params {} args - event handlers parameters
   */ emit(type, ...args) {
        const listeners = this.events.get(type);
        if (!listeners) return;
        listeners.forEach((listener)=>listener(...args));
    }
}


var $8aaa40018df40525$exports = {};

$parcel$export($8aaa40018df40525$exports, "Looper", () => $8aaa40018df40525$export$d66ceb2d1ed1a313);
$parcel$export($8aaa40018df40525$exports, "run", () => $8aaa40018df40525$export$889ea624f2cb2c57);
/**
 * Run the main loop.
 */ class $8aaa40018df40525$export$d66ceb2d1ed1a313 {
    constructor(){
        this.lastStep = 0;
        this.frameRequest = 0;
    }
    /**
   * Start looping.
   */ run(game) {
        if (!this.running) {
            this.running = true;
            this.game = game;
            if (!this.game.render) this.game.render = ()=>{
                return;
            };
            this.loop();
        }
        return ()=>this.stop();
    }
    loop() {
        const now = performance.now();
        const dt = (now - this.lastStep) / 1000;
        this.game.update(dt);
        this.game.render();
        this.lastStep = now;
        this.frameRequest = requestAnimationFrame(()=>this.loop());
    }
    /**
   * Stop the loop.
   */ stop() {
        if (this.game.stop) this.game.stop();
        if (this.frameRequest) cancelAnimationFrame(this.frameRequest);
        this.frameRequest = undefined;
        this.running = false;
    }
}
const $8aaa40018df40525$var$defaultLooper = new $8aaa40018df40525$export$d66ceb2d1ed1a313();
function $8aaa40018df40525$export$889ea624f2cb2c57(game) {
    return $8aaa40018df40525$var$defaultLooper.run(game);
}


var $0c4ddb079e43abcd$exports = {};

$parcel$export($0c4ddb079e43abcd$exports, "KeyType", () => $0c4ddb079e43abcd$export$1f55fd038a163bf3);
$parcel$export($0c4ddb079e43abcd$exports, "MouseButton", () => $0c4ddb079e43abcd$export$92850d9476e00eee);
$parcel$export($0c4ddb079e43abcd$exports, "arrowMappings", () => $0c4ddb079e43abcd$export$67706a0a308cceee);
$parcel$export($0c4ddb079e43abcd$exports, "dirIndex", () => $0c4ddb079e43abcd$export$ae8852bbe78912cd);
$parcel$export($0c4ddb079e43abcd$exports, "isTouchscreen", () => $0c4ddb079e43abcd$export$7278969d5c6ba800);
$parcel$export($0c4ddb079e43abcd$exports, "gamepadAvailable", () => $0c4ddb079e43abcd$export$5e1622395d233d1f);
$parcel$export($0c4ddb079e43abcd$exports, "InputState", () => $0c4ddb079e43abcd$export$8e4da1bcc9dc6af);


var $cNzzM = parcelRequire("cNzzM");
const $e54338dd055ced60$var$mappings = [];
var $e54338dd055ced60$export$2e2bcd8739ae039 = $e54338dd055ced60$var$mappings;
const $e54338dd055ced60$var$m0 = {
    name: "Logitech F310 (XInput) Firefox Linux",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Firefox",
            id: "046d-c21d-Logitech Gamepad F310",
            os: "Linux"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m0);
$e54338dd055ced60$var$m0.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m0.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m0.buttons.set("back", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m0.buttons.set("dpad down", {
    type: "axis",
    index: 7,
    direction: 1
});
$e54338dd055ced60$var$m0.buttons.set("dpad left", {
    type: "axis",
    index: 6,
    direction: -1
});
$e54338dd055ced60$var$m0.buttons.set("dpad right", {
    type: "axis",
    index: 6,
    direction: 1
});
$e54338dd055ced60$var$m0.buttons.set("dpad up", {
    type: "axis",
    index: 7,
    direction: -1
});
$e54338dd055ced60$var$m0.buttons.set("home", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m0.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m0.buttons.set("left stick", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m0.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m0.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m0.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m0.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m0.buttons.set("left trigger", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m0.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m0.buttons.set("right stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m0.buttons.set("right stick down", {
    type: "axis",
    index: 4,
    direction: 1
});
$e54338dd055ced60$var$m0.buttons.set("right stick left", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m0.buttons.set("right stick right", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m0.buttons.set("right stick up", {
    type: "axis",
    index: 4,
    direction: -1
});
$e54338dd055ced60$var$m0.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    direction: 1
});
$e54338dd055ced60$var$m0.buttons.set("start", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m0.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m0.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m0.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m0.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m0.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m0.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m0.buttons.set("left trigger", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m0.buttons.set("right stick x", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m0.buttons.set("right stick y", {
    type: "axis",
    index: 4,
    inverse: false
});
$e54338dd055ced60$var$m0.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m1 = {
    name: "PS4 Firefox Linux",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Firefox",
            id: "054c-05c4-Sony Computer Entertainment Wireless Controller",
            os: "Linux"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m1);
$e54338dd055ced60$var$m1.buttons.set("a", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m1.buttons.set("b", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m1.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m1.buttons.set("dpad down", {
    type: "axis",
    index: 7,
    direction: 1
});
$e54338dd055ced60$var$m1.buttons.set("dpad left", {
    type: "axis",
    index: 6,
    direction: -1
});
$e54338dd055ced60$var$m1.buttons.set("dpad right", {
    type: "axis",
    index: 6,
    direction: 1
});
$e54338dd055ced60$var$m1.buttons.set("dpad up", {
    type: "axis",
    index: 7,
    direction: -1
});
$e54338dd055ced60$var$m1.buttons.set("home", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m1.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m1.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m1.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m1.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m1.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m1.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m1.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m1.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m1.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m1.buttons.set("right stick down", {
    type: "axis",
    index: 5,
    direction: 1
});
$e54338dd055ced60$var$m1.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m1.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m1.buttons.set("right stick up", {
    type: "axis",
    index: 5,
    direction: -1
});
$e54338dd055ced60$var$m1.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m1.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m1.buttons.set("x", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m1.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m1.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m1.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m1.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m1.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m1.buttons.set("left trigger", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m1.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m1.buttons.set("right stick y", {
    type: "axis",
    index: 5,
    inverse: false
});
$e54338dd055ced60$var$m1.buttons.set("right trigger", {
    type: "axis",
    index: 4,
    inverse: false
});
const $e54338dd055ced60$var$m2 = {
    name: "Logitech F310 (DirectInput) Chrome/Firefox Linux",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Chrome",
            id: "Logitech Logitech Dual Action (Vendor: 046d Product: c216)",
            os: "Linux"
        },
        {
            browser: "Firefox",
            id: "046d-c216-Logitech Logitech Dual Action",
            os: "Linux"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m2);
$e54338dd055ced60$var$m2.buttons.set("a", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m2.buttons.set("b", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m2.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m2.buttons.set("dpad down", {
    type: "axis",
    index: 5,
    direction: 1
});
$e54338dd055ced60$var$m2.buttons.set("dpad left", {
    type: "axis",
    index: 4,
    direction: -1
});
$e54338dd055ced60$var$m2.buttons.set("dpad right", {
    type: "axis",
    index: 4,
    direction: 1
});
$e54338dd055ced60$var$m2.buttons.set("dpad up", {
    type: "axis",
    index: 5,
    direction: -1
});
$e54338dd055ced60$var$m2.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m2.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m2.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m2.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m2.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m2.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m2.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m2.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m2.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m2.buttons.set("right stick down", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m2.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m2.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m2.buttons.set("right stick up", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m2.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m2.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m2.buttons.set("x", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m2.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m2.buttons.set("dpad x", {
    type: "axis",
    index: 4,
    inverse: false
});
$e54338dd055ced60$var$m2.buttons.set("dpad y", {
    type: "axis",
    index: 5,
    inverse: false
});
$e54338dd055ced60$var$m2.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m2.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m2.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m2.buttons.set("right stick y", {
    type: "axis",
    index: 3,
    inverse: false
});
const $e54338dd055ced60$var$m3 = {
    name: "Xbox One Chrome OSX Linux",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Chrome",
            id: "\u00a9Microsoft Corporation Controller (STANDARD GAMEPAD Vendor: 045e Product: 028e)",
            os: "Linux"
        },
        {
            browser: "Chrome",
            id: "Xbox One Controller (STANDARD GAMEPAD Vendor: 02d1 Product: 045e)",
            os: "Mac OS X"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m3);
$e54338dd055ced60$var$m3.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m3.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m3.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m3.buttons.set("dpad down", {
    type: "button",
    index: 13
});
$e54338dd055ced60$var$m3.buttons.set("dpad left", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m3.buttons.set("dpad right", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m3.buttons.set("dpad up", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m3.buttons.set("home", {
    type: "button",
    index: 16
});
$e54338dd055ced60$var$m3.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m3.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m3.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m3.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m3.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m3.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m3.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m3.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m3.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m3.buttons.set("right stick down", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m3.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m3.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m3.buttons.set("right stick up", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m3.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m3.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m3.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m3.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m3.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m3.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m3.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m3.buttons.set("right stick y", {
    type: "axis",
    index: 3,
    inverse: false
});
const $e54338dd055ced60$var$m4 = {
    name: "PS4 Firefox OSX",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Firefox",
            id: "54c-5c4-Wireless Controller",
            os: "Mac OS X"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m4);
$e54338dd055ced60$var$m4.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m4.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m4.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m4.buttons.set("dpad down", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m4.buttons.set("dpad left", {
    type: "button",
    index: 16
});
$e54338dd055ced60$var$m4.buttons.set("dpad right", {
    type: "button",
    index: 17
});
$e54338dd055ced60$var$m4.buttons.set("dpad up", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m4.buttons.set("home", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m4.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m4.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m4.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m4.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m4.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m4.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m4.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m4.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m4.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m4.buttons.set("right stick down", {
    type: "axis",
    index: 5,
    direction: 1
});
$e54338dd055ced60$var$m4.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m4.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m4.buttons.set("right stick up", {
    type: "axis",
    index: 5,
    direction: -1
});
$e54338dd055ced60$var$m4.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m4.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m4.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m4.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m4.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m4.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m4.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m4.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m4.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m4.buttons.set("right stick y", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m5 = {
    name: "Logitech F310 (DirectInput) Firefox Windows",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Firefox",
            id: "046d-c216-Logitech Dual Action",
            os: "Windows NT"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m5);
$e54338dd055ced60$var$m5.buttons.set("a", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m5.buttons.set("b", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m5.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m5.buttons.set("dpad down", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m5.buttons.set("dpad left", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m5.buttons.set("dpad right", {
    type: "button",
    index: 16
});
$e54338dd055ced60$var$m5.buttons.set("dpad up", {
    type: "button",
    index: 13
});
$e54338dd055ced60$var$m5.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m5.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m5.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m5.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m5.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m5.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m5.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m5.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m5.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m5.buttons.set("right stick down", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m5.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m5.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m5.buttons.set("right stick up", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m5.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m5.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m5.buttons.set("x", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m5.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m5.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m5.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m5.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m5.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m5.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m5.buttons.set("right stick y", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m5.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m6 = {
    name: "Xbox 360 FF Windows",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Firefox",
            id: "xinput",
            os: "Windows NT"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m6);
$e54338dd055ced60$var$m6.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m6.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m6.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m6.buttons.set("dpad down", {
    type: "button",
    index: 13
});
$e54338dd055ced60$var$m6.buttons.set("dpad left", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m6.buttons.set("dpad right", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m6.buttons.set("dpad up", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m6.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m6.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m6.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m6.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m6.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m6.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m6.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m6.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m6.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m6.buttons.set("right stick down", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m6.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m6.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m6.buttons.set("right stick up", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m6.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m6.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m6.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m6.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m6.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m6.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m6.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m6.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m6.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m6.buttons.set("right stick y", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m6.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m7 = {
    name: "XBone Chrome Linux",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Chrome",
            id: "Microsoft Controller (Vendor: 045e Product: 02d1)",
            os: "Linux"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m7);
$e54338dd055ced60$var$m7.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m7.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m7.buttons.set("back", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m7.buttons.set("dpad down", {
    type: "axis",
    index: 7,
    direction: 1
});
$e54338dd055ced60$var$m7.buttons.set("dpad left", {
    type: "axis",
    index: 6,
    direction: -1
});
$e54338dd055ced60$var$m7.buttons.set("dpad right", {
    type: "axis",
    index: 6,
    direction: 1
});
$e54338dd055ced60$var$m7.buttons.set("dpad up", {
    type: "axis",
    index: 7,
    direction: -1
});
$e54338dd055ced60$var$m7.buttons.set("home", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m7.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m7.buttons.set("left stick", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m7.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m7.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m7.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m7.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m7.buttons.set("left trigger", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m7.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m7.buttons.set("right stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m7.buttons.set("right stick down", {
    type: "axis",
    index: 4,
    direction: 1
});
$e54338dd055ced60$var$m7.buttons.set("right stick left", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m7.buttons.set("right stick right", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m7.buttons.set("right stick up", {
    type: "axis",
    index: 4,
    direction: -1
});
$e54338dd055ced60$var$m7.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    direction: 1
});
$e54338dd055ced60$var$m7.buttons.set("start", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m7.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m7.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m7.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m7.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m7.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m7.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m7.buttons.set("left trigger", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m7.buttons.set("right stick x", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m7.buttons.set("right stick y", {
    type: "axis",
    index: 4,
    inverse: false
});
$e54338dd055ced60$var$m7.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m8 = {
    name: "Logitech F310 (DirectInput) Firefox OSX",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Firefox",
            id: "46d-c216-Logitech Dual Action",
            os: "Mac OS X"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m8);
$e54338dd055ced60$var$m8.buttons.set("a", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m8.buttons.set("b", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m8.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m8.buttons.set("dpad down", {
    type: "button",
    index: 13
});
$e54338dd055ced60$var$m8.buttons.set("dpad left", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m8.buttons.set("dpad right", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m8.buttons.set("dpad up", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m8.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m8.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m8.buttons.set("left stick down", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m8.buttons.set("left stick left", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m8.buttons.set("left stick right", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m8.buttons.set("left stick up", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m8.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m8.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m8.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m8.buttons.set("right stick down", {
    type: "axis",
    index: 4,
    direction: 1
});
$e54338dd055ced60$var$m8.buttons.set("right stick left", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m8.buttons.set("right stick up", {
    type: "axis",
    index: 4,
    direction: -1
});
$e54338dd055ced60$var$m8.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m8.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m8.buttons.set("x", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m8.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m8.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m8.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m8.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m8.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m8.buttons.set("left trigger", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m8.buttons.set("right stick x", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m8.buttons.set("right stick y", {
    type: "axis",
    index: 4,
    inverse: false
});
$e54338dd055ced60$var$m8.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m9 = {
    name: "PLAYSTATION(R)3 Controller (STANDARD GAMEPAD Vendor: 054c Product: 0268) Chrome OSX Linux",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Chrome",
            id: "PLAYSTATION(R)3 Controller (STANDARD GAMEPAD Vendor: 054c Product: 0268)",
            os: "Mac OS X"
        },
        {
            browser: "Chrome",
            id: "Sony PLAYSTATION(R)3 Controller (STANDARD GAMEPAD Vendor: 054c Product: 0268)",
            os: "Linux"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m9);
$e54338dd055ced60$var$m9.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m9.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m9.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m9.buttons.set("dpad down", {
    type: "button",
    index: 13
});
$e54338dd055ced60$var$m9.buttons.set("dpad left", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m9.buttons.set("dpad right", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m9.buttons.set("dpad up", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m9.buttons.set("home", {
    type: "button",
    index: 16
});
$e54338dd055ced60$var$m9.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m9.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m9.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m9.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m9.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m9.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m9.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m9.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m9.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m9.buttons.set("right stick down", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m9.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m9.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m9.buttons.set("right stick up", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m9.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m9.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m9.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m9.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m9.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m9.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m9.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m9.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m9.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m9.buttons.set("right stick y", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m9.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m10 = {
    name: "054c-0268-Sony PLAYSTATION(R)3 Controller Firefox Linux",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Firefox",
            id: "054c-0268-Sony PLAYSTATION(R)3 Controller",
            os: "Linux"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m10);
$e54338dd055ced60$var$m10.buttons.set("a", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m10.buttons.set("b", {
    type: "button",
    index: 13
});
$e54338dd055ced60$var$m10.buttons.set("back", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m10.buttons.set("dpad down", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m10.buttons.set("dpad left", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m10.buttons.set("dpad right", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m10.buttons.set("dpad up", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m10.buttons.set("home", {
    type: "button",
    index: 16
});
$e54338dd055ced60$var$m10.buttons.set("left stick", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m10.buttons.set("left shoulder", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m10.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m10.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m10.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m10.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m10.buttons.set("left trigger", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m10.buttons.set("right stick", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m10.buttons.set("right stick down", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m10.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m10.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m10.buttons.set("right stick up", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m10.buttons.set("right trigger", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m10.buttons.set("right shoulder", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m10.buttons.set("start", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m10.buttons.set("x", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m10.buttons.set("y", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m10.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m10.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m10.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m10.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m10.buttons.set("left trigger", {
    type: "axis",
    index: 12,
    inverse: false
});
$e54338dd055ced60$var$m10.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m10.buttons.set("right stick y", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m10.buttons.set("right trigger", {
    type: "axis",
    index: 13,
    inverse: false
});
const $e54338dd055ced60$var$m11 = {
    name: "Xbox 360 Chrome Windows/OSX",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Chrome",
            id: "Xbox 360 Controller (STANDARD GAMEPAD Vendor: 028e Product: 045e)",
            os: "Mac OS X"
        },
        {
            browser: "Chrome",
            id: "Xbox 360 Controller (XInput STANDARD GAMEPAD)",
            os: "Windows NT"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m11);
$e54338dd055ced60$var$m11.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m11.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m11.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m11.buttons.set("dpad down", {
    type: "button",
    index: 13
});
$e54338dd055ced60$var$m11.buttons.set("dpad left", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m11.buttons.set("dpad right", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m11.buttons.set("dpad up", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m11.buttons.set("home", {
    type: "button",
    index: 16
});
$e54338dd055ced60$var$m11.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m11.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m11.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m11.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m11.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m11.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m11.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m11.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m11.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m11.buttons.set("right stick down", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m11.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m11.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m11.buttons.set("right stick up", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m11.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m11.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m11.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m11.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m11.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m11.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m11.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m11.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m11.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m11.buttons.set("right stick y", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m11.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m12 = {
    name: "PS4 Chrome Windows/OSX",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Chrome",
            id: "Wireless Controller (STANDARD GAMEPAD Vendor: 054c Product: 05c4)",
            os: "Windows NT"
        },
        {
            browser: "Chrome",
            id: "Wireless Controller (STANDARD GAMEPAD Vendor: 054c Product: 05c4)",
            os: "Mac OS X"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m12);
$e54338dd055ced60$var$m12.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m12.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m12.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m12.buttons.set("dpad down", {
    type: "button",
    index: 13
});
$e54338dd055ced60$var$m12.buttons.set("dpad left", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m12.buttons.set("dpad right", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m12.buttons.set("dpad up", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m12.buttons.set("home", {
    type: "button",
    index: 16
});
$e54338dd055ced60$var$m12.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m12.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m12.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m12.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m12.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m12.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m12.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m12.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m12.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m12.buttons.set("right stick down", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m12.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m12.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m12.buttons.set("right stick up", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m12.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m12.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m12.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m12.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m12.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m12.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m12.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m12.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m12.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m12.buttons.set("right stick y", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m12.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m13 = {
    name: "Xbox 360 Firefox Linux",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Firefox",
            id: "045e-028e-Microsoft X-Box 360 pad",
            os: "Linux"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m13);
$e54338dd055ced60$var$m13.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m13.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m13.buttons.set("back", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m13.buttons.set("dpad down", {
    type: "axis",
    index: 7,
    direction: 1
});
$e54338dd055ced60$var$m13.buttons.set("dpad left", {
    type: "axis",
    index: 6,
    direction: -1
});
$e54338dd055ced60$var$m13.buttons.set("dpad right", {
    type: "axis",
    index: 6,
    direction: 1
});
$e54338dd055ced60$var$m13.buttons.set("dpad up", {
    type: "axis",
    index: 7,
    direction: -1
});
$e54338dd055ced60$var$m13.buttons.set("home", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m13.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m13.buttons.set("left stick", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m13.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m13.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m13.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m13.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m13.buttons.set("left trigger", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m13.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m13.buttons.set("right stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m13.buttons.set("right stick down", {
    type: "axis",
    index: 4,
    direction: 1
});
$e54338dd055ced60$var$m13.buttons.set("right stick left", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m13.buttons.set("right stick right", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m13.buttons.set("right stick up", {
    type: "axis",
    index: 4,
    direction: -1
});
$e54338dd055ced60$var$m13.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    direction: 1
});
$e54338dd055ced60$var$m13.buttons.set("start", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m13.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m13.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m13.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m13.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m13.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m13.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m13.buttons.set("left trigger", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m13.buttons.set("right stick x", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m13.buttons.set("right stick y", {
    type: "axis",
    index: 4,
    inverse: false
});
$e54338dd055ced60$var$m13.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m14 = {
    name: "Logitech F310 (XInput) Chrome Linux",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Chrome",
            id: "Logitech Gamepad F310 (STANDARD GAMEPAD Vendor: 046d Product: c21d)",
            os: "Linux"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m14);
$e54338dd055ced60$var$m14.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m14.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m14.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m14.buttons.set("dpad down", {
    type: "button",
    index: 13
});
$e54338dd055ced60$var$m14.buttons.set("dpad left", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m14.buttons.set("dpad right", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m14.buttons.set("dpad up", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m14.buttons.set("home", {
    type: "button",
    index: 16
});
$e54338dd055ced60$var$m14.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m14.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m14.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m14.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m14.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m14.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m14.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m14.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m14.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m14.buttons.set("right stick down", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m14.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m14.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m14.buttons.set("right stick up", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m14.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m14.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m14.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m14.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m14.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m14.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m14.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m14.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m14.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m14.buttons.set("right stick y", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m14.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m15 = {
    name: "Logitech F310 (DirectInput) Chrome Windows/OSX",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Chrome",
            id: "Logitech Dual Action (STANDARD GAMEPAD Vendor: 046d Product: c216)",
            os: "Mac OS X"
        },
        {
            browser: "Chrome",
            id: "Logitech Dual Action (STANDARD GAMEPAD Vendor: 046d Product: c216)",
            os: "Windows NT"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m15);
$e54338dd055ced60$var$m15.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m15.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m15.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m15.buttons.set("dpad down", {
    type: "button",
    index: 13
});
$e54338dd055ced60$var$m15.buttons.set("dpad left", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m15.buttons.set("dpad right", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m15.buttons.set("dpad up", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m15.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m15.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m15.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m15.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m15.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m15.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m15.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m15.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m15.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m15.buttons.set("right stick down", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m15.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m15.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m15.buttons.set("right stick up", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m15.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m15.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m15.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m15.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m15.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m15.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m15.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m15.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m15.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m15.buttons.set("right stick y", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m15.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});
const $e54338dd055ced60$var$m16 = {
    name: "PS4 Chrome Linux",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Chrome",
            id: "Sony Computer Entertainment Wireless Controller (STANDARD GAMEPAD Vendor: 054c Product: 05c4)",
            os: "Linux"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m16);
$e54338dd055ced60$var$m16.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m16.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m16.buttons.set("back", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m16.buttons.set("dpad down", {
    type: "button",
    index: 13
});
$e54338dd055ced60$var$m16.buttons.set("dpad left", {
    type: "button",
    index: 14
});
$e54338dd055ced60$var$m16.buttons.set("dpad right", {
    type: "button",
    index: 15
});
$e54338dd055ced60$var$m16.buttons.set("dpad up", {
    type: "button",
    index: 12
});
$e54338dd055ced60$var$m16.buttons.set("home", {
    type: "button",
    index: 16
});
$e54338dd055ced60$var$m16.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m16.buttons.set("left stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m16.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m16.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m16.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m16.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m16.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m16.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m16.buttons.set("right stick", {
    type: "button",
    index: 11
});
$e54338dd055ced60$var$m16.buttons.set("right stick down", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m16.buttons.set("right stick left", {
    type: "axis",
    index: 2,
    direction: -1
});
$e54338dd055ced60$var$m16.buttons.set("right stick right", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m16.buttons.set("right stick up", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m16.buttons.set("right trigger", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m16.buttons.set("start", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m16.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m16.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m16.buttons.set("dpad x", {
    type: "button",
    index: 15,
    indexNegative: 14
});
$e54338dd055ced60$var$m16.buttons.set("dpad y", {
    type: "button",
    index: 13,
    indexNegative: 12
});
$e54338dd055ced60$var$m16.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m16.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m16.buttons.set("left trigger", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m16.buttons.set("right stick x", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m16.buttons.set("right stick y", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m16.buttons.set("right trigger", {
    type: "button",
    index: 7
});
const $e54338dd055ced60$var$m17 = {
    name: "Xbone Firefox Linux",
    buttons: new Map(),
    axes: new Map(),
    supported: [
        {
            browser: "Firefox",
            id: "045e-02d1-Microsoft X-Box One pad",
            os: "Linux"
        }
    ]
};
$e54338dd055ced60$var$mappings.push($e54338dd055ced60$var$m17);
$e54338dd055ced60$var$m17.buttons.set("a", {
    type: "button",
    index: 0
});
$e54338dd055ced60$var$m17.buttons.set("b", {
    type: "button",
    index: 1
});
$e54338dd055ced60$var$m17.buttons.set("back", {
    type: "button",
    index: 6
});
$e54338dd055ced60$var$m17.buttons.set("dpad down", {
    type: "axis",
    index: 7,
    direction: 1
});
$e54338dd055ced60$var$m17.buttons.set("dpad left", {
    type: "axis",
    index: 6,
    direction: -1
});
$e54338dd055ced60$var$m17.buttons.set("dpad right", {
    type: "axis",
    index: 6,
    direction: 1
});
$e54338dd055ced60$var$m17.buttons.set("dpad up", {
    type: "axis",
    index: 7,
    direction: -1
});
$e54338dd055ced60$var$m17.buttons.set("home", {
    type: "button",
    index: 8
});
$e54338dd055ced60$var$m17.buttons.set("left shoulder", {
    type: "button",
    index: 4
});
$e54338dd055ced60$var$m17.buttons.set("left stick", {
    type: "button",
    index: 9
});
$e54338dd055ced60$var$m17.buttons.set("left stick down", {
    type: "axis",
    index: 1,
    direction: 1
});
$e54338dd055ced60$var$m17.buttons.set("left stick left", {
    type: "axis",
    index: 0,
    direction: -1
});
$e54338dd055ced60$var$m17.buttons.set("left stick right", {
    type: "axis",
    index: 0,
    direction: 1
});
$e54338dd055ced60$var$m17.buttons.set("left stick up", {
    type: "axis",
    index: 1,
    direction: -1
});
$e54338dd055ced60$var$m17.buttons.set("left trigger", {
    type: "axis",
    index: 2,
    direction: 1
});
$e54338dd055ced60$var$m17.buttons.set("right shoulder", {
    type: "button",
    index: 5
});
$e54338dd055ced60$var$m17.buttons.set("right stick", {
    type: "button",
    index: 10
});
$e54338dd055ced60$var$m17.buttons.set("right stick down", {
    type: "axis",
    index: 4,
    direction: 1
});
$e54338dd055ced60$var$m17.buttons.set("right stick left", {
    type: "axis",
    index: 3,
    direction: -1
});
$e54338dd055ced60$var$m17.buttons.set("right stick right", {
    type: "axis",
    index: 3,
    direction: 1
});
$e54338dd055ced60$var$m17.buttons.set("right stick up", {
    type: "axis",
    index: 4,
    direction: -1
});
$e54338dd055ced60$var$m17.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    direction: 1
});
$e54338dd055ced60$var$m17.buttons.set("start", {
    type: "button",
    index: 7
});
$e54338dd055ced60$var$m17.buttons.set("x", {
    type: "button",
    index: 2
});
$e54338dd055ced60$var$m17.buttons.set("y", {
    type: "button",
    index: 3
});
$e54338dd055ced60$var$m17.buttons.set("dpad x", {
    type: "axis",
    index: 6,
    inverse: false
});
$e54338dd055ced60$var$m17.buttons.set("dpad y", {
    type: "axis",
    index: 7,
    inverse: false
});
$e54338dd055ced60$var$m17.buttons.set("left stick x", {
    type: "axis",
    index: 0,
    inverse: false
});
$e54338dd055ced60$var$m17.buttons.set("left stick y", {
    type: "axis",
    index: 1,
    inverse: false
});
$e54338dd055ced60$var$m17.buttons.set("left trigger", {
    type: "axis",
    index: 2,
    inverse: false
});
$e54338dd055ced60$var$m17.buttons.set("right stick x", {
    type: "axis",
    index: 3,
    inverse: false
});
$e54338dd055ced60$var$m17.buttons.set("right stick y", {
    type: "axis",
    index: 4,
    inverse: false
});
$e54338dd055ced60$var$m17.buttons.set("right trigger", {
    type: "axis",
    index: 5,
    inverse: false
});


var $0c4ddb079e43abcd$export$1f55fd038a163bf3 = /*#__PURE__*/ function(KeyType) {
    KeyType["LEFT"] = "ArrowLeft";
    KeyType["RIGHT"] = "ArrowRight";
    KeyType["UP"] = "ArrowUp";
    KeyType["DOWN"] = "ArrowDown";
    KeyType["SPACEBAR"] = " ";
    KeyType["ESCAPE"] = "Escape";
    KeyType["ENTER"] = "Enter";
    KeyType["CTRL"] = "Control";
    KeyType["TAB"] = "Tab";
    KeyType["ALT"] = "Alt";
    KeyType["A"] = "a";
    KeyType["B"] = "b";
    KeyType["C"] = "c";
    KeyType["D"] = "d";
    KeyType["E"] = "e";
    KeyType["F"] = "f";
    KeyType["G"] = "g";
    KeyType["H"] = "h";
    KeyType["I"] = "i";
    KeyType["J"] = "j";
    KeyType["K"] = "k";
    KeyType["L"] = "l";
    KeyType["M"] = "m";
    KeyType["N"] = "n";
    KeyType["O"] = "o";
    KeyType["P"] = "p";
    KeyType["Q"] = "q";
    KeyType["R"] = "r";
    KeyType["S"] = "s";
    KeyType["T"] = "t";
    KeyType["U"] = "u";
    KeyType["V"] = "v";
    KeyType["W"] = "w";
    KeyType["X"] = "x";
    KeyType["Y"] = "y";
    KeyType["Z"] = "z";
    return KeyType;
}({});
var $0c4ddb079e43abcd$export$92850d9476e00eee = /*#__PURE__*/ function(MouseButton) {
    MouseButton[MouseButton["LEFT"] = 0] = "LEFT";
    MouseButton[MouseButton["MIDDLE"] = 1] = "MIDDLE";
    MouseButton[MouseButton["RIGHT"] = 2] = "RIGHT";
    MouseButton[MouseButton["BACK"] = 3] = "BACK";
    MouseButton[MouseButton["FORWARD"] = 4] = "FORWARD";
    return MouseButton;
}({});
const $0c4ddb079e43abcd$var$defaultMapping = [
    [
        "ArrowLeft"
    ],
    [
        "ArrowRight"
    ],
    [
        "ArrowUp"
    ],
    [
        "ArrowDown"
    ]
];
const $0c4ddb079e43abcd$export$67706a0a308cceee = {
    wasd: [
        [
            "ArrowLeft",
            "a"
        ],
        [
            "ArrowRight",
            "d"
        ],
        [
            "ArrowUp",
            "w"
        ],
        [
            "ArrowDown",
            "s"
        ]
    ],
    zqsd: [
        [
            "ArrowLeft",
            "q"
        ],
        [
            "ArrowRight",
            "d"
        ],
        [
            "ArrowUp",
            "z"
        ],
        [
            "ArrowDown",
            "s"
        ]
    ],
    ijkl: [
        [
            "ArrowLeft",
            "j"
        ],
        [
            "ArrowRight",
            "l"
        ],
        [
            "ArrowUp",
            "i"
        ],
        [
            "ArrowDown",
            "k"
        ]
    ],
    hjkl: [
        [
            "ArrowLeft",
            "h"
        ],
        [
            "ArrowRight",
            "l"
        ],
        [
            "ArrowUp",
            "k"
        ],
        [
            "ArrowDown",
            "j"
        ]
    ],
    "": $0c4ddb079e43abcd$var$defaultMapping
};
const $0c4ddb079e43abcd$export$ae8852bbe78912cd = {
    LEFT: 0,
    RIGHT: 1,
    UP: 2,
    DOWN: 3
};
function $0c4ddb079e43abcd$export$7278969d5c6ba800() {
    return !!("ontouchstart" in document.documentElement);
}
function $0c4ddb079e43abcd$export$5e1622395d233d1f() {
    return !!(navigator && navigator.getGamepads);
}
class $0c4ddb079e43abcd$export$8e4da1bcc9dc6af {
    /**
   * @param mapping {string} mapping name, can be "wasd", "zqsd", "ijkl", "hjkl" or ""
   */ constructor(mapping = ""){
        this.dir = new (0, $cNzzM.Vec2)(0, 0);
        this.keyState = new Map();
        this.mouseButtonState = new Map();
        this.dirKeys = $0c4ddb079e43abcd$export$67706a0a308cceee[mapping] ?? $0c4ddb079e43abcd$var$defaultMapping;
        this.gamepads = [];
        this.gamepadMappings = [];
        this.mouse = (0, $cNzzM.Vec2).null();
        this.stoppers = [];
        this.frameRequest = undefined;
    }
    /**
   * Change the mapping mode, can be "wasd", "zqsd", "ijkl", "hjkl" or ""
   */ setKBMapping(mapping) {
        this.dirKeys = $0c4ddb079e43abcd$export$67706a0a308cceee[mapping] ?? $0c4ddb079e43abcd$var$defaultMapping;
        return this;
    }
    /**
   * Start the monitoring of input events.
   */ start() {
        this.stoppers = [
            (0, $f314c6851ceb0f9e$export$af631764ddc44097)(window, "keyup", (e)=>this.handleKeyUp(e)),
            (0, $f314c6851ceb0f9e$export$af631764ddc44097)(window, "keydown", (e)=>this.handleKeyDown(e)),
            (0, $f314c6851ceb0f9e$export$af631764ddc44097)(window, "mousemove", (e)=>this.handleMouseMov(e)),
            (0, $f314c6851ceb0f9e$export$af631764ddc44097)(window, "mousedown", (e)=>this.handleMouseDown(e)),
            (0, $f314c6851ceb0f9e$export$af631764ddc44097)(window, "mouseup", (e)=>this.handleMouseUp(e)),
            (0, $f314c6851ceb0f9e$export$af631764ddc44097)(window, "gamepadconnected", ()=>this.handleGamepadConnect()),
            (0, $f314c6851ceb0f9e$export$af631764ddc44097)(window, "gamepaddisconnected", ()=>this.handleGamepadConnect()),
            ...this.stoppers
        ];
        this.refreshGamepads();
        return this;
    }
    /**
   * Stop the listeners for events.
   */ stop() {
        if (this.frameRequest) cancelAnimationFrame(this.frameRequest);
        this.frameRequest = undefined;
        this.stoppers.forEach((stop)=>stop());
        this.stoppers = [];
    }
    /**
   * Update hidden states.
   */ loop() {
        this.updateGamepad();
        this.frameRequest = requestAnimationFrame(()=>this.loop());
    }
    /**
   * Return the position of the mouse in pixels in the canvas.
   */ mousePos(canvas) {
        const r = canvas.boundingRect();
        const scale = canvas.size.div(r.size);
        return this.mouse.sub(r.topleft).mul(scale);
    }
    /**
   * Return a vector in the direction of the movement according to the keyboard.
   */ direction() {
        const x = this.anyKeyDown(this.dirKeys[$0c4ddb079e43abcd$export$ae8852bbe78912cd.RIGHT]) ? 1 : this.anyKeyDown(this.dirKeys[$0c4ddb079e43abcd$export$ae8852bbe78912cd.LEFT]) ? -1 : 0;
        const y = this.anyKeyDown(this.dirKeys[$0c4ddb079e43abcd$export$ae8852bbe78912cd.DOWN]) ? 1 : this.anyKeyDown(this.dirKeys[$0c4ddb079e43abcd$export$ae8852bbe78912cd.UP]) ? -1 : 0;
        this.dir.set(x, y);
        return this.dir;
    }
    /**
   * Return true if the button is held down.
   */ buttonDown(but) {
        if (!this.mouseButtonState.has(but)) return false;
        const { down: down } = this.mouseButtonState.get(but);
        return down;
    }
    /**
   * check if a key has been pressed. Return true only once per press.
   */ buttonPressed(but) {
        if (!this.mouseButtonState.has(but)) return false;
        const { justChecked: justChecked, down: down } = this.mouseButtonState.get(but);
        this.mouseButtonState.set(but, {
            justChecked: down,
            down: down
        });
        return down;
    }
    /**
   * return true as long as a key is held down
   * @param {KeyType} key
   */ keyDown(key) {
        if (!this.keyState.has(key)) return false;
        const { down: down } = this.keyState.get(key);
        return down;
    }
    /**
   * check if a key has been pressed. Return true only once per press.
   */ keyPressed(key) {
        if (!this.keyState.has(key)) return false;
        const { justChecked: justChecked, down: down } = this.keyState.get(key);
        this.keyState.set(key, {
            justChecked: down,
            down: down
        });
        return down;
    }
    /**
   * Return true if any of the keys passed in the array parameter is down.
   */ anyKeyDown(keys) {
        for (const k of keys){
            if (this.keyDown(k)) return true;
        }
        return false;
    }
    /**
   * Setup an event handler for all
   */ onKeyPress(callback) {
        const checked = new Map();
        const ru = (0, $f314c6851ceb0f9e$export$af631764ddc44097)(window, "keydown", (e)=>{
            if (!checked.get(e.key)) {
                callback(e.key);
                checked.set(e.key, true);
            }
        });
        const rd = (0, $f314c6851ceb0f9e$export$af631764ddc44097)(window, "keyup", (e)=>{
            checked.set(e.key, false);
        });
        this.stoppers.push(rd);
        this.stoppers.push(ru);
    }
    /**
   * Refresh the gamepad list
   */ refreshGamepads() {
        if ($0c4ddb079e43abcd$export$5e1622395d233d1f()) {
            this.gamepads = navigator.getGamepads();
            this.gamepadMappings = this.gamepads.map($0c4ddb079e43abcd$var$findMapping);
            this.gamepadStates = this.gamepads.map((_, i)=>{
                if (this.gamepadStates[i]) return this.gamepadStates[i];
                else return new Map();
            });
        } else {
            this.gamepads = [];
            this.gamepadMappings = [];
        }
        return this;
    }
    /**
   * Return the number of connected gamepads
   */ gamepadNumber() {
        return this.gamepads.length;
    }
    /**
   * Check if a button have just been pressed.
   */ gamepadButtonPressed(gp, button) {
        const { justChecked: justChecked, down: down } = this.gamepadStates[gp].get(button);
        this.gamepadStates[gp].set(button, {
            justChecked: down,
            down: down
        });
        return !justChecked && down;
    }
    /**
   * Check if a button is currently being held down.
   */ gamepadButtonDown(gp, button) {
        const { down: down } = this.gamepadStates[gp].get(button);
        return down;
    }
    /**
   * Return the value of the axis between -1 and 1.
   */ gamepadGetAxis(gp, axis) {
        const mp = this.gamepadMappings[gp].axes.get(axis);
        if (!mp) return 0;
        return $0c4ddb079e43abcd$var$getGPAxis(this.gamepads[gp], mp);
    }
    /**
   * Return true if the gamepad is useable.
   */ gamepadIsMapped(gp) {
        if (gp >= this.gamepads.length) return false;
        if (gp < 0) return false;
        return !!this.gamepadMappings[gp];
    }
    updateGamepad() {
        this.gamepads.forEach((gp, i)=>{
            if (!gp) return;
            const mp = this.gamepadMappings[i];
            if (!mp) return;
            for (const [name, bt] of mp.buttons){
                if ($0c4ddb079e43abcd$var$getGPButton(gp, bt)) {
                    if (!this.gamepadStates[i].get(name)) {
                        (0, $f314c6851ceb0f9e$export$8f35fbd5db0f3634)(window, "gpdown", {
                            gp: i,
                            button: name
                        });
                        this.gamepadStates[i].set(name, {
                            justChecked: false,
                            down: true
                        });
                    }
                } else if (this.gamepadStates[i].get(name)) {
                    (0, $f314c6851ceb0f9e$export$8f35fbd5db0f3634)(window, "gpup", {
                        gp: i,
                        button: name
                    });
                    this.gamepadStates[i].set(name, {
                        justChecked: false,
                        down: false
                    });
                }
            }
        });
    }
    handleKeyDown(e) {
        if (e.defaultPrevented) return;
        this.keyState.set(e.key, {
            justChecked: false,
            down: true
        });
        e.preventDefault();
    }
    handleKeyUp(e) {
        this.keyState.set(e.key, {
            justChecked: false,
            down: false
        });
    }
    handleMouseMov(e) {
        this.mouse.set(e.clientX, e.clientY);
    }
    handleMouseDown(e) {
        if (e.defaultPrevented) return;
        this.mouse.set(e.clientX, e.clientY);
        this.mouseButtonState.set(e.button, {
            justChecked: false,
            down: true
        });
        e.preventDefault();
    }
    handleMouseUp(e) {
        this.mouse.set(e.clientX, e.clientY);
        this.mouseButtonState.set(e.button, {
            justChecked: false,
            down: false
        });
    }
    handleGamepadConnect() {
        this.refreshGamepads();
    }
}
function $0c4ddb079e43abcd$var$getGPButton(gp, mp) {
    if (mp.type == "button") return gp.buttons[mp.index].pressed;
    else {
        if (mp.direction < 0) return gp.axes[mp.index] < -0.75;
        else return gp.axes[mp.index] > 0.75;
    }
}
function $0c4ddb079e43abcd$var$getGPAxis(gp, mp) {
    if (mp.type == "axis") {
        if (mp.inverse) return -gp.axes[mp.index];
        else return gp.axes[mp.index];
    } else {
        let p = 0;
        let n = 0;
        if (gp.buttons[mp.index]) p = 1;
        if (mp.indexNegative !== undefined && gp.buttons[mp.indexNegative]) n = 1;
        return p - n;
    }
}
function $0c4ddb079e43abcd$var$findMapping(gp) {
    if (gp === null) return null;
    for (const mapping of (0, $e54338dd055ced60$export$2e2bcd8739ae039))for (const { id: id, os: os, browser: browser } of mapping.supported){
        if (gp.id.indexOf(id) !== -1 && browser.indexOf(os) !== -1 && browser.indexOf(browser) !== -1) return mapping;
    }
    return null;
}


var $09ac412af5115446$exports = {};

$parcel$export($09ac412af5115446$exports, "AssetTable", () => $09ac412af5115446$export$d55eaace18d0b795);
$parcel$export($09ac412af5115446$exports, "Loader", () => $09ac412af5115446$export$3b0d6d7590275603);
var $fab42eb3dee39b5b$exports = {};

$parcel$export($fab42eb3dee39b5b$exports, "PI", () => $fab42eb3dee39b5b$export$6b5c1ceb16d01dc3);
$parcel$export($fab42eb3dee39b5b$exports, "TWO_PI", () => $fab42eb3dee39b5b$export$6eec49b1a6289c4e);
$parcel$export($fab42eb3dee39b5b$exports, "HALF_PI", () => $fab42eb3dee39b5b$export$f504979d7e0a75c7);
$parcel$export($fab42eb3dee39b5b$exports, "random", () => $fab42eb3dee39b5b$export$4385e60b38654f68);
$parcel$export($fab42eb3dee39b5b$exports, "randomInt", () => $fab42eb3dee39b5b$export$3c5f89dae98e900b);
$parcel$export($fab42eb3dee39b5b$exports, "unique", () => $fab42eb3dee39b5b$export$7a5d5c156e7dc406);
$parcel$export($fab42eb3dee39b5b$exports, "shuffle", () => $fab42eb3dee39b5b$export$448332262467e042);
$parcel$export($fab42eb3dee39b5b$exports, "chunk", () => $fab42eb3dee39b5b$export$5f7ec48d69707ddd);
$parcel$export($fab42eb3dee39b5b$exports, "clamp", () => $fab42eb3dee39b5b$export$7d15b64cf5a3a4c4);
$parcel$export($fab42eb3dee39b5b$exports, "crc32", () => $fab42eb3dee39b5b$export$1cd93882633e45f5);
const $fab42eb3dee39b5b$export$6b5c1ceb16d01dc3 = Math.PI;
const $fab42eb3dee39b5b$export$6eec49b1a6289c4e = $fab42eb3dee39b5b$export$6b5c1ceb16d01dc3 * 2;
const $fab42eb3dee39b5b$export$f504979d7e0a75c7 = $fab42eb3dee39b5b$export$6b5c1ceb16d01dc3 / 2;
const { ceil: $fab42eb3dee39b5b$var$ceil, floor: $fab42eb3dee39b5b$var$floor, random: $fab42eb3dee39b5b$var$mathRandom, min: $fab42eb3dee39b5b$var$min, max: $fab42eb3dee39b5b$var$max } = Math;
function $fab42eb3dee39b5b$export$4385e60b38654f68(a = 0, b = 1) {
    return $fab42eb3dee39b5b$var$mathRandom() * (b - a) + a;
}
function $fab42eb3dee39b5b$export$3c5f89dae98e900b(a = 0, b = 1) {
    a = $fab42eb3dee39b5b$var$ceil(a);
    b = $fab42eb3dee39b5b$var$floor(b);
    return $fab42eb3dee39b5b$var$floor($fab42eb3dee39b5b$var$mathRandom() * (b - a + 1)) + a;
}
function $fab42eb3dee39b5b$export$7a5d5c156e7dc406(arr) {
    return [
        ...new Set(arr)
    ];
}
function $fab42eb3dee39b5b$export$448332262467e042(arr) {
    // use Knuth shuffling
    for(let i = arr.length - 1; i > 0; --i){
        const c = arr[i];
        const j = $fab42eb3dee39b5b$export$3c5f89dae98e900b(0, i);
        arr[i] = arr[j];
        arr[j] = c;
    }
    return arr;
}
function $fab42eb3dee39b5b$export$5f7ec48d69707ddd(arr, chunkSize) {
    const chunks = [];
    for(let i = 0; i < arr.length; i += chunkSize)chunks.push(arr.slice(i, i + chunkSize));
    return chunks;
}
function $fab42eb3dee39b5b$export$7d15b64cf5a3a4c4(num, a, b) {
    return $fab42eb3dee39b5b$var$max(a, $fab42eb3dee39b5b$var$min(num, b));
}
const $fab42eb3dee39b5b$var$crcTable = [];
function $fab42eb3dee39b5b$export$1cd93882633e45f5(str) {
    if ($fab42eb3dee39b5b$var$crcTable.length == 0) $fab42eb3dee39b5b$var$fillCRCTable();
    let crc = 0xffffffff;
    for(let i = 0; i < str.length; i++){
        const byte = str.charCodeAt(i);
        crc = crc >>> 8 ^ $fab42eb3dee39b5b$var$crcTable[(crc ^ byte) & 0xff];
    }
    return (crc ^ -1) >>> 0;
}
function $fab42eb3dee39b5b$var$fillCRCTable() {
    let c;
    for(let n = 0; n < 256; n++){
        c = n;
        for(let k = 0; k < 8; k++)c = c & 1 ? 0xedb88320 ^ c >>> 1 : c >>> 1;
        $fab42eb3dee39b5b$var$crcTable.push(c);
    }
}


class $09ac412af5115446$export$d55eaace18d0b795 {
    constructor(){
        this.json = new Map();
        this.image = new Map();
        this.sound = new Map();
        this.font = new Map();
    }
}
/**
 * @ignore
 * Asynchronously load an image file from URL
 * @param {string} name - ressource id
 * @param {string} src - ressource URL
 */ function $09ac412af5115446$var$loadImage({ name: name, src: src }) {
    return new Promise((resolve, reject)=>{
        const img = new Image();
        img.crossOrigin = "Anonymous";
        img.onload = ()=>resolve({
                name: name,
                data: img
            });
        img.onerror = ()=>reject(new Error(`Couldn't load Image: ${src}`));
        img.src = src;
    });
}
/**
 * @ignore
 * Asynchronously load a sound file from URL
 * @param {string} name - ressource id
 * @param {string} src - ressource URL
 */ async function $09ac412af5115446$var$loadSound({ name: name, src: src }, ctx) {
    const res = await fetch(src);
    if (!res.ok) throw new Error(`Couldn't Load Sound: ${src}`);
    const arrayBuffer = await res.arrayBuffer();
    const audioBuffer = await ctx.decodeAudioData(arrayBuffer);
    return {
        name: name,
        data: audioBuffer
    };
}
/**
 * @ignore
 * Asynchronously load a JSON file from URL
 * @param {string} name - ressource id
 * @param {string} src - ressource URL
 */ async function $09ac412af5115446$var$loadJson({ name: name, src: src }) {
    const res = await fetch(src);
    if (!res.ok) throw new Error(`Couldn't load the JSON file: ${src}`);
    const json = await res.json();
    return {
        name: name,
        data: json
    };
}
/**
 * @ignore
 * Asynchronously load a font file from URL
 * @param {string} name - ressource id
 * @param {string} src - ressource URL
 */ async function $09ac412af5115446$var$loadFont({ name: name, src: src }) {
    const font = new FontFace(`${name}${(0, $fab42eb3dee39b5b$export$1cd93882633e45f5)(name)}`, `url(${src})`);
    const loaded = await font.load();
    document.fonts.add(loaded);
    return {
        name: name,
        data: loaded.family
    };
}
/**
 * @ignore
 * Collect the assets into a map.
 */ function $09ac412af5115446$var$toMap(assets) {
    return assets.reduce((m, a)=>m.set(a.name, a.data), new Map());
}
class $09ac412af5115446$export$3b0d6d7590275603 {
    constructor(audioCtx){
        this.imageQueue = [];
        this.soundQueue = [];
        this.jsonQueue = [];
        this.fontQueue = [];
        this.loading = false;
        this.audioCtx = audioCtx;
    }
    /**
   * add image to the queue
   * @param {string} name - name of image
   * @param {string} src - source of image
   */ addImage(name, src) {
        this.imageQueue.push({
            name: name,
            src: src
        });
        return this;
    }
    /**
   * add sound to queue
   * @param {string} name - name of sound
   * @param {string} src - source of sound
   */ addSound(name, src) {
        this.soundQueue.push({
            name: name,
            src: src
        });
        return this;
    }
    /**
   * add json file to queue
   * @param {string} name - name of json file
   * @param {string} src - source of json file
   */ addJSON(name, src) {
        this.jsonQueue.push({
            name: name,
            src: src
        });
        return this;
    }
    /**
   * add font file to queue
   * @param {string} name - name of the font
   * @param {string} src - source of the font
   */ addFont(name, src) {
        this.fontQueue.push({
            name: name,
            src: src
        });
        return this;
    }
    /**
   * @ignore
   * clears the queue of assets
   */ clearQueue(queue) {
        while(queue.length)queue.pop();
        return this;
    }
    /**
   * reset the loader
   */ reset() {
        this.clearQueue(this.imageQueue).clearQueue(this.soundQueue).clearQueue(this.jsonQueue).clearQueue(this.fontQueue);
        this.loading = false;
    }
    loadQueries(queries, loader, moreData) {
        return Promise.all(queries.map((e)=>loader(e, moreData)));
    }
    /**
   * Asynchronous loading of all assets
   */ load() {
        if (this.loading) return this.currentProm;
        this.loading = true;
        const t = new $09ac412af5115446$export$d55eaace18d0b795();
        const p = Promise.all([
            this.loadQueries(this.imageQueue, $09ac412af5115446$var$loadImage).then((res)=>{
                t.image = $09ac412af5115446$var$toMap(res);
            }),
            this.loadQueries(this.jsonQueue, $09ac412af5115446$var$loadJson).then((res)=>{
                t.json = $09ac412af5115446$var$toMap(res);
            }),
            this.loadQueries(this.fontQueue, $09ac412af5115446$var$loadFont).then((res)=>{
                t.font = $09ac412af5115446$var$toMap(res);
            }),
            this.audioCtx ? this.loadQueries(this.soundQueue, $09ac412af5115446$var$loadSound, this.audioCtx).then((res)=>{
                t.sound = $09ac412af5115446$var$toMap(res);
            }) : new Promise((resolve)=>resolve(undefined))
        ]);
        this.currentProm = p.then(()=>{
            this.reset();
            return t;
        }).catch((err)=>{
            this.reset();
            throw err;
        });
        return this.currentProm;
    }
}



var $ca0e73b0e439d9a0$exports = {};

$parcel$export($ca0e73b0e439d9a0$exports, "SoundDriver", () => $ca0e73b0e439d9a0$export$9fff132cb6be70e6);

class $ca0e73b0e439d9a0$export$9fff132cb6be70e6 {
    constructor(){
        this.ctx = new AudioContext();
        this.mixer = this.ctx.createGain();
    }
    /**
   * Volume for the mixer, between 0 and 1
   */ get volume() {
        return this.mixer.gain.value;
    }
    set volume(v) {
        this.mixer.gain.value = (0, $fab42eb3dee39b5b$export$7d15b64cf5a3a4c4)(v, 0, 1);
    }
    /**
   * play a sound
   * @param {AudioBuffer} audio sound data as obtained from a loader
   * @param {number} time length to play in seconds, or 0 to play to the end
   * @param {boolean} loop if true, the track loops
   * @example
   * ```
   * import { SoundDriver } from "toupie";
   * const sdrive = new SoundDriver();
   * const jumpSound: AudioBuffer = ...;
   * sdrive.play(jumpSound);
   * ```
   */ play(audio, time = 0, loop = false) {
        const source = this.ctx.createBufferSource();
        source.buffer = audio;
        source.connect(this.mixer);
        source.loop = loop;
        source.start(time);
        return source;
    }
    stop(source, time = 0) {
        source.stop(time);
        return this;
    }
}


var $87471af8250da72d$exports = {};

$parcel$export($87471af8250da72d$exports, "AnchorType", () => $87471af8250da72d$export$856be359de119281);
$parcel$export($87471af8250da72d$exports, "Sprite", () => $87471af8250da72d$export$3075603db8e6204c);
$parcel$export($87471af8250da72d$exports, "AnimatedSprite", () => $87471af8250da72d$export$dae599798687ad3c);
/* sprite.ts */ 
var $cNzzM = parcelRequire("cNzzM");

var $87471af8250da72d$export$856be359de119281 = /*#__PURE__*/ function(AnchorType) {
    AnchorType["CENTER"] = "center";
    AnchorType["TOPLEFT"] = "topleft";
    AnchorType["TOPRIGHT"] = "topright";
    AnchorType["BOTTOMLEFT"] = "bottomleft";
    AnchorType["BOTTOMRIGHT"] = "bottomright";
    return AnchorType;
}({});
class $87471af8250da72d$export$3075603db8e6204c {
    /**
   * @param {CanvasImageSource} image sprite image
   * @param {Rect} sourceRect rectangle in the texture
   * @param {Rect?} destRect rectangle in the canvas
   */ constructor(image, sourceRect, destRect){
        this.rotation = 0;
        this.flipX = false;
        this.flipY = false;
        this.scale = 1;
        this.image = image;
        this.anchor = "topleft";
        if (sourceRect.w == 0) sourceRect.w = this.image.width;
        if (sourceRect.h == 0) sourceRect.h = this.image.height;
        this.sourceRect = sourceRect;
        if (!destRect) {
            this.destRect = (0, $fba27c1221d410b4$export$c79fc6492f3af13d).null();
            this.destRect.size = this.sourceRect.size;
        } else this.destRect = destRect;
    }
    /**
   * Position of the sprite defined by anchor
   * Do not set components of the position directly, it will not update it properly.
   * Instead, assign to the property:
   * @example
   * ```
   * const p = sprite.pos
   * p.x += 0.5;
   * sprite.pos = p;
   * ```
   */ get pos() {
        switch(this.anchor){
            case "center":
                return this.destRect.center;
            case "topleft":
                return this.destRect.topleft;
            case "topright":
                return this.destRect.topright;
            case "bottomleft":
                return this.destRect.bottomleft;
            case "bottomright":
                return this.destRect.bottomright;
            default:
                return (0, $cNzzM.Vec2).null(); // not reached
        }
    }
    set pos(v) {
        switch(this.anchor){
            case "center":
                this.destRect.center = v;
                break;
            case "topleft":
                this.destRect.topleft = v;
                break;
            case "topright":
                this.destRect.topright = v;
                break;
            case "bottomleft":
                this.destRect.bottomleft = v;
                break;
            case "bottomright":
                this.destRect.bottomright = v;
                break;
        }
    }
    /**
   * The rect bounding the sprite, taking scaling into account.
   */ get rect() {
        // TODO somehow apply all the other transformations before returning
        const sz = this.destRect.size.mul((0, $cNzzM.Vec2).scal(this.scale));
        const p = this.pos;
        const r = (0, $fba27c1221d410b4$export$c79fc6492f3af13d).null();
        r.size = sz;
        switch(this.anchor){
            case "center":
                r.center = p;
                break;
            case "topleft":
                r.topleft = p;
                break;
            case "topright":
                r.topright = p;
                break;
            case "bottomleft":
                r.bottomleft = p;
                break;
            case "bottomright":
                r.bottomright = p;
                break;
        }
        return r;
    }
    /**
   * Draw the sprite on a canvas.
   * @param {Canvas} can
   */ render(can) {
        const ctx = can.ctx;
        ctx.save();
        const { x: x, y: y } = this.pos;
        ctx.translate(x, y);
        ctx.scale(this.scale, this.scale);
        ctx.rotate(-this.rotation);
        ctx.scale(this.flipX ? -1 : 1, this.flipY ? -1 : 1);
        ctx.translate(-x, -y);
        ctx.drawImage(this.image, this.sourceRect.x, this.sourceRect.y, this.sourceRect.w, this.sourceRect.h, this.destRect.x, this.destRect.y, this.destRect.w, this.destRect.h);
        ctx.restore();
        return this;
    }
}
class $87471af8250da72d$export$dae599798687ad3c extends $87471af8250da72d$export$3075603db8e6204c {
    /**
   * @param {Canvas} can
   * @param {image} spriteSheet
   * @param {Rect[]} frames a set of rectangle delimiting the part of the sprite sheet for each frame.
   * @param {Rect[]?} destRects a set of return delimiting the zone where the frame must be drawn.
   * The position of the destRects is overwritten as the sprite is moved around.
   */ constructor(image, frames, destRects){
        super(image, (0, $fba27c1221d410b4$export$c79fc6492f3af13d).null(), (0, $fba27c1221d410b4$export$c79fc6492f3af13d).null()), this.currentFrame = 0, this.playing = false, this.time = 0;
        this.frames = frames;
        if (!destRects) this.destRects = this.frames.map((r)=>{
            const dest = (0, $fba27c1221d410b4$export$c79fc6492f3af13d).null();
            dest.size = r.size;
            return dest;
        });
        else this.destRects = destRects;
        this.destRect = this.destRects[0];
        this.animations = new Map();
    }
    /**
   * Position of the sprite defined by anchor
   * Do not set components of the position directly, it will not update it properly.
   * Instead, assign to the property:
   * @example
   * ```
   * const p = sprite.pos
   * p.x += 0.5;
   * sprite.pos = p;
   * ```
   */ get pos() {
        switch(this.anchor){
            case "topleft":
                return this.destRect.topleft;
            case "center":
                return this.destRect.center;
            case "topright":
                return this.destRect.topright;
            case "bottomleft":
                return this.destRect.bottomleft;
            case "bottomright":
                return this.destRect.bottomright;
            default:
                return (0, $cNzzM.Vec2).null(); // not reached
        }
    }
    set pos(v) {
        switch(this.anchor){
            case "topleft":
                this.destRect.topleft = v;
                break;
            case "center":
                this.destRect.center = v;
                break;
            case "topright":
                this.destRect.topright = v;
                break;
            case "bottomleft":
                this.destRect.bottomleft = v;
                break;
            case "bottomright":
                this.destRect.bottomright = v;
                break;
        }
    }
    /**
   * add animation
   * @param {string} animationName name of animation
   * @param {number} frameStart frame to begin from
   * @param {number} frameEnd frame to end at
   * @param {number} delay delay between each frame
   */ addAnimation(animationName, frameStart, frameEnd, delay, loop) {
        if (this.animations.has(animationName)) throw new Error(`Animation with name "${animationName}" already exists.`);
        if (frameStart < 0) frameStart += this.frames.length;
        if (frameEnd < 0) frameEnd += this.frames.length;
        loop = loop ?? true;
        const animation = {
            frameStart: frameStart,
            frameEnd: frameEnd,
            delay: delay,
            loop: loop
        };
        this.animations.set(animationName, animation);
        return this;
    }
    /**
   * play animation
   * @param {string} animationName name of animation to play
   */ play(animationName) {
        this.currentAnimation = this.animations.get(animationName);
        if (this.currentAnimation) {
            this.currentFrame = this.currentAnimation.frameStart;
            this.applyCurrentFrame();
            this.playing = true;
            this.time = 0;
        } else throw new Error(`Animation with name "${animationName}" does not exists.`);
        return this;
    }
    /**
   * stop the sprite animation
   */ stop() {
        this.playing = false;
        return this;
    }
    /**
   * @ignore
   * Internal procedure to make the frame change effective.
   */ applyCurrentFrame() {
        const p = this.pos;
        this.sourceRect = this.frames[this.currentFrame];
        this.destRect = this.destRects[this.currentFrame];
        this.pos = p;
    }
    /**
   * Called on each frame to update sprite states
   * @param {number} dt delta time
   */ update(dt) {
        if (!this.playing || !this.currentAnimation) return;
        this.time += dt;
        const { frameStart: frameStart, frameEnd: frameEnd, delay: delay, loop: loop } = this.currentAnimation;
        if (this.time >= delay) {
            if (this.currentFrame >= frameEnd) {
                if (loop) // start over
                this.currentFrame = frameStart;
                else {
                    // hold the last frame
                    this.playing = false;
                    return;
                }
            }
            this.currentFrame++;
            this.applyCurrentFrame();
            this.time = 0;
        }
        return this;
    }
}


var $9d3582d7255d97e4$exports = {};

$parcel$export($9d3582d7255d97e4$exports, "StagedGame", () => $9d3582d7255d97e4$export$646c40f627ec7f05);
$parcel$export($9d3582d7255d97e4$exports, "Stage", () => $9d3582d7255d97e4$export$208cd1682bd0e4b6);


class $9d3582d7255d97e4$export$646c40f627ec7f05 {
    constructor(){
        this.stageStack = [];
        this.input = new (0, $0c4ddb079e43abcd$export$8e4da1bcc9dc6af)();
        this.stopLoop = ()=>{
            return;
        };
    }
    /**
   * Run the game.
   * Call super.run() if you override this.
   */ run() {
        this.input.start();
        this.stopLoop = (0, $8aaa40018df40525$export$889ea624f2cb2c57)({
            update: (dt)=>this.update(dt),
            render: ()=>this.render(),
            stop: ()=>this.stop()
        });
    }
    /**
   * Stop the game.
   */ stop() {
        this.input.stop();
    }
    /**
   * Init the game.
   */ init() {
        this.stages = new Map();
    }
    /**
   * Called on each frame to update the states.
   * Don't override this, instead use the stage update method.
   */ update(dt) {
        this.currentStage.update(dt);
    }
    /**
   * Called on each frame to render the states.
   * Don't override this, instead use the stage update method.
   */ render() {
        this.currentStage.render();
    }
    /**
   * Add a new stage to the game.
   */ addStage(name1, stage) {
        this.stages.set(name1, stage);
        return this;
    }
    /**
   * Set the current stage, either by name (previously registered with addStage)
   * or by the Stage object itself.
   */ setStage(stage) {
        if (typeof stage == "string") {
            stage = this.stages.get(stage);
            if (!stage) throw Error(`There are no stages named ${name}.`);
        }
        if (this.currentStage) {
            this.currentStage.leave();
            this.stageStack.pop();
        }
        this.stopLoop();
        this.stageStack.push(stage);
        this.currentStage = stage;
        this.currentStage.enter();
        this.run();
        return this;
    }
    /**
   * Temporarily suspend the current stage and move to a new one.
   */ pushStage(stage) {
        if (typeof stage == "string") {
            stage = this.stages.get(stage);
            if (!stage) throw Error(`There are no stages named ${name}.`);
        }
        this.currentStage.pause();
        this.stopLoop();
        this.stageStack.push(stage);
        this.currentStage = stage;
        this.currentStage.enter();
        this.run();
        return this;
    }
    /**
   * Stop the current stage and go to the previous one.
   */ popStage() {
        if (this.stageStack.length < 2) throw Error("There are not enough stage on the stack.");
        this.currentStage.leave();
        this.stopLoop();
        this.stageStack.pop();
        const stage = this.stageStack[this.stageStack.length - 1];
        this.currentStage = stage;
        this.currentStage.resume();
        this.run();
        return this;
    }
}
class $9d3582d7255d97e4$export$208cd1682bd0e4b6 {
    constructor(game){
        this.game = game;
    }
    /**
   * Called to prepare the stage for playing.
   * Call super.init() when overriding.
   */ init() {
        this.inited = true;
    }
    /**
   * Called when transiting to this stage or when pushing on the stack.
   * Tempory stages are entered only once.
   */ enter() {
        if (!this.inited) this.init();
    }
    /**
   * Called when transiting away from this stage or when poping from the stack
   * When called on a tempory stage, it means that this stage will be lost and
   * garbage collected.
   */ leave() {
        return;
    }
    /**
   * Called when comming back to this stage after poping another stage
   */ resume() {
        return;
    }
    /**
   * Called when temporarily leaving this stage by pushing another stage.
   */ pause() {
        return;
    }
}



parcelRequire("cNzzM");
var $d76c49f57c95e539$exports = {};

$parcel$export($d76c49f57c95e539$exports, "savePersistent", () => $d76c49f57c95e539$export$9327a7438f0a35ea);
$parcel$export($d76c49f57c95e539$exports, "loadPersistent", () => $d76c49f57c95e539$export$36b97f3ac1beee3c);
$parcel$export($d76c49f57c95e539$exports, "clearPersistent", () => $d76c49f57c95e539$export$e3941b951f1db24c);
/**
 * Save an object in local storage.
 */ function $d76c49f57c95e539$export$9327a7438f0a35ea(name, data) {
    window.localStorage.setItem(name, JSON.stringify(data));
}
function $d76c49f57c95e539$export$36b97f3ac1beee3c(name) {
    let v;
    try {
        v = JSON.parse(window.localStorage.getItem(name));
    } catch (SyntaxError) {
        v = null;
    }
    return v;
}
function $d76c49f57c95e539$export$e3941b951f1db24c(name) {
    if (name !== undefined) window.localStorage.removeItem(name);
    else window.localStorage.clear();
}




var CollisionSide = parcelRequire("1kF5N").CollisionSide;
var circleInCircle = parcelRequire("1kF5N").circleInCircle;
var pointInCircle = parcelRequire("1kF5N").pointInCircle;
var rectInRect = parcelRequire("1kF5N").rectInRect;
var pointInRect = parcelRequire("1kF5N").pointInRect;
var circleInRect = parcelRequire("1kF5N").circleInRect;
var resolveCollision = parcelRequire("1kF5N").resolveCollision;
var $287c74586c0b069e$exports = parcelRequire("1kF5N")["*"];
var $9798ac7148f7abf4$export$ac4bca90992eed1 = parcelRequire("cNzzM").Vec2;
export {$370cb1d6398d5f76$export$79f141de891a5fed as Camera, $370cb1d6398d5f76$export$e90a5c36ff53ccb4 as SmoothCamera, $c5e8e0cfa8a822f8$export$8d01c972ee8b14a9 as Canvas, CollisionSide, circleInCircle, pointInCircle, rectInRect, pointInRect, circleInRect, resolveCollision, $287c74586c0b069e$exports as default, $f314c6851ceb0f9e$export$c3da0dad1b44eea9 as el, $f314c6851ceb0f9e$export$7aabe8b3a840d2fd as attr, $f314c6851ceb0f9e$export$6a2d9549213d3666 as frag, $f314c6851ceb0f9e$export$836aee6bce45247 as qs, $f314c6851ceb0f9e$export$9ca9051b92b5a6d2 as qsa, $f314c6851ceb0f9e$export$1d567c320f4763bc as style, $f314c6851ceb0f9e$export$af631764ddc44097 as on, $f314c6851ceb0f9e$export$28ee1007e174a2a6 as ready, $f314c6851ceb0f9e$export$8f35fbd5db0f3634 as emit, $a75eca5c28f7626a$export$4d9facee29974f3 as Registry, $cf19820bc073e692$export$4fae95256245c8c0 as EventEmitter, $8aaa40018df40525$export$d66ceb2d1ed1a313 as Looper, $8aaa40018df40525$export$889ea624f2cb2c57 as run, $0c4ddb079e43abcd$export$1f55fd038a163bf3 as KeyType, $0c4ddb079e43abcd$export$92850d9476e00eee as MouseButton, $0c4ddb079e43abcd$export$67706a0a308cceee as arrowMappings, $0c4ddb079e43abcd$export$ae8852bbe78912cd as dirIndex, $0c4ddb079e43abcd$export$7278969d5c6ba800 as isTouchscreen, $0c4ddb079e43abcd$export$5e1622395d233d1f as gamepadAvailable, $0c4ddb079e43abcd$export$8e4da1bcc9dc6af as InputState, $09ac412af5115446$export$d55eaace18d0b795 as AssetTable, $09ac412af5115446$export$3b0d6d7590275603 as Loader, $fba27c1221d410b4$export$c79fc6492f3af13d as Rect, $ca0e73b0e439d9a0$export$9fff132cb6be70e6 as SoundDriver, $87471af8250da72d$export$856be359de119281 as AnchorType, $87471af8250da72d$export$3075603db8e6204c as Sprite, $87471af8250da72d$export$dae599798687ad3c as AnimatedSprite, $9d3582d7255d97e4$export$646c40f627ec7f05 as StagedGame, $9d3582d7255d97e4$export$208cd1682bd0e4b6 as Stage, $fab42eb3dee39b5b$export$6b5c1ceb16d01dc3 as PI, $fab42eb3dee39b5b$export$6eec49b1a6289c4e as TWO_PI, $fab42eb3dee39b5b$export$f504979d7e0a75c7 as HALF_PI, $fab42eb3dee39b5b$export$4385e60b38654f68 as random, $fab42eb3dee39b5b$export$3c5f89dae98e900b as randomInt, $fab42eb3dee39b5b$export$7a5d5c156e7dc406 as unique, $fab42eb3dee39b5b$export$448332262467e042 as shuffle, $fab42eb3dee39b5b$export$5f7ec48d69707ddd as chunk, $fab42eb3dee39b5b$export$7d15b64cf5a3a4c4 as clamp, $fab42eb3dee39b5b$export$1cd93882633e45f5 as crc32, $9798ac7148f7abf4$export$ac4bca90992eed1 as Vec2, $d76c49f57c95e539$export$9327a7438f0a35ea as savePersistent, $d76c49f57c95e539$export$36b97f3ac1beee3c as loadPersistent, $d76c49f57c95e539$export$e3941b951f1db24c as clearPersistent};
//# sourceMappingURL=toupie.mjs.map
