From 535ffcff919881edb17c2b21d279a88723b860ef Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 11:41:33 +0200 Subject: [PATCH 01/47] clear everything for preparation of v3 --- src/arena.ts | 49 ------ src/arena_scaling.ts | 120 ------------- src/camera.ts | 14 -- src/canvas_kit.ts | 64 ------- src/diep_gamepad.ts | 79 --------- src/entity.ts | 45 ----- src/entity_manager.ts | 321 ----------------------------------- src/event_emitter.ts | 39 ----- src/game.ts | 27 --- src/globals.d.ts | 2 + src/index.ts | 9 - src/movement.ts | 58 ------- src/player.ts | 376 ----------------------------------------- src/player_movement.ts | 17 -- 14 files changed, 2 insertions(+), 1218 deletions(-) delete mode 100644 src/arena.ts delete mode 100644 src/arena_scaling.ts delete mode 100644 src/camera.ts delete mode 100644 src/canvas_kit.ts delete mode 100644 src/diep_gamepad.ts delete mode 100644 src/entity.ts delete mode 100644 src/entity_manager.ts delete mode 100644 src/event_emitter.ts delete mode 100644 src/game.ts delete mode 100644 src/movement.ts delete mode 100644 src/player.ts delete mode 100644 src/player_movement.ts diff --git a/src/arena.ts b/src/arena.ts deleted file mode 100644 index f0a602b..0000000 --- a/src/arena.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Vector } from './vector'; -import { arenaScaling } from './arena_scaling'; -import { minimap } from './minimap'; -import { game } from './game'; - -class Arena { - #size = 1; - - constructor() { - game.on('frame', () => { - const ratio = Vector.divide(minimap.minimapDim, minimap.viewportDim); - const arenaDim = Vector.multiply( - ratio, - arenaScaling.screenToCanvas(new Vector(window.innerWidth, window.innerHeight)) - ); - const arenaSize = Vector.round(arenaScaling.toArenaUnits(arenaDim)); - this.#size = arenaSize.x; - }); - } - - /** - * @returns {number} The Arena size in arena units - */ - get size(): number { - return this.#size; - } - - //These methods are not much used. can be moved to playerMovement.mjs where its currently only used. - /** - * - * @param {Vector} vector The vector in [0, 1] coordinates - * @returns {Vector} The scaled vector in [-Arena.size/2, Arena.size/2] coordinates - */ - scale(vector: Vector): Vector { - const scale = (value) => Math.round(this.#size * (value - 0.5)); - return new Vector(scale(vector.x), scale(vector.y)); - } - /** - * - * @param {Vector} vector - The scaled vector in [-Arena.size/2, Arena.size/2] coordinates - * @returns {Vector} The unscaled vector in [0, 1] coordinates - */ - unscale(vector: Vector) { - const unscale = (value) => value / this.#size + 0.5; - return new Vector(unscale(vector.x), unscale(vector.y)); - } -} - -export const arena = new Arena(); diff --git a/src/arena_scaling.ts b/src/arena_scaling.ts deleted file mode 100644 index 022de34..0000000 --- a/src/arena_scaling.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { Vector } from './vector'; -import { CanvasKit } from './canvas_kit'; -import { camera } from './camera'; -import { game } from './game'; - -class ArenaScaling { - #scalingFactor = 1; - #drawSolidBackground = false; - - constructor() { - game.once('ready', () => { - window.input.set_convar = new Proxy(window.input.set_convar, { - apply: (target, thisArg, args) => { - if (args[0] === 'ren_solid_background') this.#drawSolidBackground = args[1]; - else Reflect.apply(target, thisArg, args); - }, - }); - }); - - CanvasKit.replace('stroke', (target, thisArg, args) => { - if (thisArg.fillStyle !== '#cdcdcd' || thisArg.globalAlpha === 0) { - return Reflect.apply(target, thisArg, args); - } - - this.#scalingFactor = thisArg.globalAlpha * 10; - - if (!this.#drawSolidBackground) return Reflect.apply(target, thisArg, args); - }); - } - - get scalingFactor(): number { - return this.#scalingFactor; - } - - get windowRatio(): number { - return Math.max(window.innerWidth / 1920, window.innerHeight / 1080); - } - - get fov(): number { - return this.#scalingFactor / this.windowRatio; - } - - /** - * - * @param {Vector} v The vector in canvas units - * @returns {Vector} The vector in arena units - */ - toArenaUnits(v: Vector): Vector { - return Vector.scale(1 / this.#scalingFactor, v); - } - - /** - * - * @param {Vector} v The vector in arena units - * @returns {Vector} The vector in canvas units - */ - toCanvasUnits(v: Vector): Vector { - return Vector.scale(this.#scalingFactor, v); - } - - /** - * Will translate coordinates from canvas to arena - * @param {Vector} canvasPos The canvas coordinates - * @returns {Vector} The `canvasPos` translated to arena coordinates - */ - toArenaPos(canvasPos: Vector): Vector { - const direction = Vector.subtract( - canvasPos, - this.screenToCanvas(new Vector(window.innerWidth / 2, window.innerHeight / 2)) - ); - const scaled = this.toArenaUnits(direction); - const arenaPos = Vector.add(scaled, camera.position); - - return arenaPos; - } - - /** - * Will translate coordinates from arena to canvas - * @param {Vector} arenaPos The arena coordinates - * @returns {Vector} The `arenaPos` translated to canvas coordinates - */ - toCanvasPos(arenaPos: Vector): Vector { - const direction = Vector.subtract(arenaPos, camera.position); - const scaled = this.toCanvasUnits(direction); - const canvasPos = Vector.add( - scaled, - this.screenToCanvas(new Vector(window.innerWidth / 2, window.innerHeight / 2)) - ); - - return canvasPos; - } - - screenToCanvasUnits(n: number) { - return n * window.devicePixelRatio; - } - - canvasToScreenUnits(n: number) { - return n / window.devicePixelRatio; - } - - /** - * Will translate coordinates from screen to canvas - * @param v The screen coordinates - * @returns The canvas coordinates - */ - screenToCanvas(v: Vector) { - return Vector.scale(window.devicePixelRatio, v); - } - - /** - * Will translate coordinates from canvas to screen - * @param v The canvas coordinates - * @returns the screen coordinates - */ - canvasToScreen(v: Vector) { - return Vector.scale(1 / window.devicePixelRatio, v); - } -} - -export const arenaScaling = new ArenaScaling(); diff --git a/src/camera.ts b/src/camera.ts deleted file mode 100644 index 0f91aa2..0000000 --- a/src/camera.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Vector } from './vector'; -import { arena } from './arena'; -import { minimap } from './minimap'; - -class Camera { - get position(): Vector { - const center = Vector.add(minimap.viewportPos, Vector.scale(0.5, minimap.viewportDim)); - const cameraPos = Vector.subtract(center, minimap.minimapPos); - const normalized = Vector.divide(cameraPos, minimap.minimapDim); - return arena.scale(normalized); - } -} - -export const camera = new Camera(); diff --git a/src/canvas_kit.ts b/src/canvas_kit.ts deleted file mode 100644 index d644d7c..0000000 --- a/src/canvas_kit.ts +++ /dev/null @@ -1,64 +0,0 @@ -export class CanvasKit { - /** - * The consumer will be called before - */ - static hook( - method: string, - consumer: (target: Function, thisArg: CanvasRenderingContext2D, args: any[]) => void - ): void { - const target = window.CanvasRenderingContext2D.prototype; - target[method] = new Proxy(target[method], { - apply(target, thisArg, args) { - if (thisArg.canvas.className !== 'CanvasKit-bypass') consumer(target, thisArg, args); - return Reflect.apply(target, thisArg, args); - }, - }); - } - - /** - * replaces the function. Use `return Reflect.apply(target, thisArg, args);` in - * your function to call the original function. - */ - static replace( - method: string, - func: (target: Function, thisArg: CanvasRenderingContext2D, args: any[]) => any - ): void { - const target = window.CanvasRenderingContext2D.prototype; - target[method] = new Proxy(target[method], { - apply(target, thisArg, args) { - if (thisArg.canvas.className !== 'CanvasKit-bypass') return func(target, thisArg, args); - return Reflect.apply(target, thisArg, args); - }, - }); - } - - /** - * The consumer will be called before. - */ - static hookRAF(consumer: () => void): void { - window.requestAnimationFrame = new Proxy(window.requestAnimationFrame, { - apply(target, thisArg, args) { - consumer(); - return Reflect.apply(target, thisArg, args); - }, - }); - } - - /** - * If you want to a canvas then create it with this method. - */ - static createCanvas(): HTMLCanvasElement { - const canvas = document.createElement('canvas'); - canvas.className = 'CanvasKit-bypass'; - canvas.style.pointerEvents = 'none'; - canvas.style.position = 'fixed'; - canvas.style['z-index'] = 1; - canvas.style.top = '0px'; - canvas.style.left = '0px'; - canvas.style.right = '0px'; - canvas.style.bottom = '0px'; - canvas.style.width = '100%'; - canvas.style.height = '100%'; - return canvas; - } -} diff --git a/src/diep_gamepad.ts b/src/diep_gamepad.ts deleted file mode 100644 index b4c271f..0000000 --- a/src/diep_gamepad.ts +++ /dev/null @@ -1,79 +0,0 @@ -class DiepGamepad { - #axes: number[]; - #buttons: { pressed: boolean }[]; - connected: boolean; - - /** - * Emulates a Gampad - * when `gamepad.connected` is set to `true` the game will - * ignore following keyboard inputs: - * W, A, S, D, upArrow, leftArrow, downArrow, rightArray - * leftMouse, rightMouse, Spacebar, Shift, - * MouseMovement to change tank angle - * these are also the only keys we emulate with this gamepad - * - */ - constructor() { - this.#axes = [0, 0, 0, 0]; - this.#buttons = [...Array(17)].map((x) => { - return { pressed: false }; - }); - this.connected = false; - - //window.navigator.getGamepads = () => [this.connected ? this.#toGamepad() : undefined]; - window.navigator.getGamepads = new Proxy(window.navigator.getGamepads, { - apply: (target, thisArg, args) => { - if (this.connected) return [this.#toGamepad()]; - return Reflect.apply(target, thisArg, args); - }, - }); - } - - set x(value: number) { - this.#axes[0] = value; - } - set y(value: number) { - this.#axes[1] = value; - } - set mx(value: number) { - this.#axes[2] = value; - } - set my(value: number) { - this.#axes[3] = value; - } - set leftMouse(value: boolean) { - this.#buttons[7].pressed = value; - } - set rightMouse(value: boolean) { - this.#buttons[6].pressed = value; - } - - get x(): number { - return this.#axes[0]; - } - get y(): number { - return this.#axes[1]; - } - get mx(): number { - return this.#axes[2]; - } - get my(): number { - return this.#axes[3]; - } - get leftMouse(): boolean { - return this.#buttons[7].pressed; - } - get rightMouse(): boolean { - return this.#buttons[6].pressed; - } - - #toGamepad(): Gamepad { - return { - axes: this.#axes, - buttons: this.#buttons, - mapping: 'standard', - } as unknown as Gamepad; - } -} - -export const gamepad = new DiepGamepad(); diff --git a/src/entity.ts b/src/entity.ts deleted file mode 100644 index f43827e..0000000 --- a/src/entity.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Vector } from './vector'; -import { Movement } from './movement'; - -export enum EntityType { - Player, - Bullet, - Drone, - Trap, - Square, - Triangle, - Pentagon, - AlphaPentagon, - Crasher, - UNKNOWN, -} - -export enum EntityColor { - TeamBlue = '#00b2e1', - TeamRed = '#f14e54', - TeamPurple = '#bf7ff5', - TeamGreen = '#00e16e', - Square = '#ffe869', - Triangle = '#fc7677', - Pentagon = '#768dfc', - AlphaPentagon = '#768dfc', - Crasher = '#f177dd', - NecromancerDrone = '#fcc376', -} - -export const TeamColors = [EntityColor.TeamBlue, EntityColor.TeamRed, EntityColor.TeamPurple, EntityColor.TeamGreen]; - -/** - * Represents an ingame Entity. - * - * Holds minimal information currently. - */ -export class Entity extends Movement { - constructor(readonly type: EntityType, readonly parent: Entity, readonly extras: object = {}) { - super(); - } - - updatePos(newPos: Vector): void { - super.updatePos(newPos); - } -} diff --git a/src/entity_manager.ts b/src/entity_manager.ts deleted file mode 100644 index bd92a67..0000000 --- a/src/entity_manager.ts +++ /dev/null @@ -1,321 +0,0 @@ -import { Vector } from './vector'; -import { CanvasKit } from './canvas_kit'; -import { Entity, EntityType, EntityColor, TeamColors } from './entity'; -import { arenaScaling } from './arena_scaling'; -import { game } from './game'; -import { playerMovement } from './player_movement'; - -/** - * Entity Manager is used to access the information about the entities, that are currently drawn on the screen. - * To access the entities the EntityManager exposes the EntityManager.entities field. - */ -class EntityManager { - #entities: Entity[] = []; - #entitiesUpdated: Entity[] = []; - - constructor() { - game.on('frame', () => { - this.#entities = this.#entitiesUpdated; - this.#entitiesUpdated = []; - }); - - this.#triangleHook(); - - this.#squareHook(); - - this.#pentagonHook(); - - //when is a bullet being drawn? - - //when is a player being drawn? - this.#playerHook(); - } - - get entities(): Entity[] { - return this.#entities; - } - - /** - * - * @returns The own player entity - */ - getPlayer(): Entity { - const player = this.#entities.filter( - (entity) => - entity.type == EntityType.Player && Vector.distance(entity.position, playerMovement.position) < 28 - ); - - return player[0]; - } - - /** - * Adds the entity to `#entitiesUpdated`. - * - * Will either find the entity in `#entities` or create a new `Entity`. - */ - #add(type: EntityType, position: Vector, extras: object = {}) { - const entityIndex = this.#findEntity(type, position); - - let entity: Entity; - if (entityIndex === -1) { - let parent = null; - if (type == EntityType.Bullet) { - // TODO: we want to change this to EntityType.Barrel in the future? - const parentIndex = this.#findEntity(EntityType.Player, position, 300); - if (parentIndex >= 0) { - parent = this.entities[parentIndex]; - } - } - - entity = new Entity(type, parent, { - id: Math.random().toString(36).slice(2, 5), - timestamp: performance.now(), - ...extras, - }); - } else { - entity = this.#entities[entityIndex]; - } - - entity.updatePos(position); - this.#entitiesUpdated.push(entity); - } - - /** - * Searches `#entities` for the entity that is closest to `position` and - * returns the __index__ of that entity or __-1__ if there is no match. - */ - #findEntity(type: EntityType, position: Vector, tolerance: number = 42): number { - let result = -1; - let shortestDistance = Infinity; - - this.#entities.forEach((x, i) => { - if (x.type !== type) return; - - const distance = Vector.distance(x.position, position); - - if (distance < shortestDistance) { - shortestDistance = distance; - result = i; - } - }); - - if (shortestDistance > tolerance) { - return -1; - } - - return result; - } - - /** - * Will call the cb method, when a polygon with `numVertices` vertices is drawn. - */ - #createPolygonHook(numVertices: number, cb: (vertices: Vector[], ctx: CanvasRenderingContext2D) => void): void { - let index = 0; - - let vertices: Vector[] = []; - - const onFillPolygon = (ctx: CanvasRenderingContext2D) => { - cb(vertices, ctx); - }; - - CanvasKit.hook('beginPath', (target, thisArg, args) => { - index = 1; - vertices = []; - }); - CanvasKit.hook('moveTo', (target, thisArg, args) => { - if (index === 1) { - index++; - vertices.push(new Vector(args[0], args[1])); - return; - } - index = 0; - }); - CanvasKit.hook('lineTo', (target, thisArg, args) => { - if (index >= 2 && index <= numVertices) { - index++; - vertices.push(new Vector(args[0], args[1])); - return; - } - index = 0; - }); - CanvasKit.hook('fill', (target, thisArg, args) => { - if (index === numVertices + 1) { - index++; - onFillPolygon(thisArg); - return; - } - index = 0; - }); - } - - #triangleHook(): void { - this.#createPolygonHook(3, (vertices, ctx) => { - const side1 = Math.round(Vector.distance(vertices[0], vertices[1])); - const side2 = Math.round(Vector.distance(vertices[0], vertices[2])); - const side3 = Math.round(Vector.distance(vertices[1], vertices[2])); - //ignore Minimap Arrow - if (side1 !== side2 || side2 !== side3) return; - //ignore Leader Arrow - if ('#000000' === ctx.fillStyle) return; - - vertices = vertices.map((x) => arenaScaling.toArenaPos(x)); - - const position = Vector.centroid(...vertices); - const radius = Math.round(Vector.radius(...vertices)); - const color = ctx.fillStyle as EntityColor; - - let type: EntityType; - switch (radius) { - case 23: - //battleship drone - if (TeamColors.includes(color)) type = EntityType.Drone; - break; - case 30: - //base drone - if (TeamColors.includes(color)) type = EntityType.Drone; - break; - case 35: - //small crasher - if (EntityColor.Crasher === color) type = EntityType.Crasher; - break; - case 40: - case 41: - case 42: - case 43: - case 44: - case 45: - case 46: - //overseer/overlord drone - if (TeamColors.includes(color)) type = EntityType.Drone; - break; - case 55: - //big crasher - if (EntityColor.Crasher === color) type = EntityType.Crasher; - //triangle - if (EntityColor.Triangle === color) type = EntityType.Triangle; - break; - } - if (type === undefined) type = EntityType.UNKNOWN; - this.#add(type, position, { color, radius }); - }); - } - - #squareHook(): void { - this.#createPolygonHook(4, (vertices, ctx) => { - vertices = vertices.map((x) => arenaScaling.toArenaPos(x)); - - const position = Vector.centroid(...vertices); - const radius = Math.round(Vector.radius(...vertices)); - const color = ctx.fillStyle as EntityColor; - - let type: EntityType; - switch (radius) { - case 55: - //square - if (EntityColor.Square === color) type = EntityType.Square; - //necromancer drone - if (TeamColors.includes(color) || EntityColor.NecromancerDrone === color) type = EntityType.Drone; - break; - } - if (type === undefined) type = EntityType.UNKNOWN; - this.#add(type, position, { color, radius }); - }); - } - - #pentagonHook(): void { - this.#createPolygonHook(5, (vertices, ctx) => { - vertices = vertices.map((x) => arenaScaling.toArenaPos(x)); - - const position = Vector.centroid(...vertices); - const radius = Math.round(Vector.radius(...vertices)); - const color = ctx.fillStyle as EntityColor; - - let type: EntityType; - switch (radius) { - case 75: - if (EntityColor.Pentagon === color) type = EntityType.Pentagon; - break; - case 200: - if (EntityColor.AlphaPentagon === color) type = EntityType.AlphaPentagon; - break; - } - if (type === undefined) type = EntityType.UNKNOWN; - this.#add(type, position, { color, radius }); - }); - } - - #playerHook(): void { - let index = 0; - - let position: Vector; - let color: string; - let radius: number; - - const onCircle = () => { - position = arenaScaling.toArenaPos(position); - radius = arenaScaling.toArenaUnits(new Vector(radius, radius)).x; - - let type = EntityType.UNKNOWN; - if (radius > 53) { - type = EntityType.Player; - } else { - type = EntityType.Bullet; - } - - this.#add(type, position, { - color, - radius, - }); - }; - - //Sequence: beginPath -> arc -> fill -> beginPath -> arc -> fill -> arc - CanvasKit.hook('beginPath', (target, thisArg, args) => { - //start - if (index !== 3) { - index = 1; - return; - } - if (index === 3) { - index++; - return; - } - index = 0; - }); - //check when a circle is drawn. - CanvasKit.hook('arc', (target, thisArg, args) => { - //outline - if (index === 1) { - index++; - const transform = thisArg.getTransform(); - position = new Vector(transform.e, transform.f); - radius = transform.a; - return; - } - if (index === 4) { - index++; - color = thisArg.fillStyle as string; - return; - } - //last arc call - if (index === 6) { - index++; - onCircle(); - return; - } - index = 0; - }); - CanvasKit.hook('fill', (target, thisArg, args) => { - if (index === 2) { - index++; - return; - } - if (index === 5) { - index++; - return; - } - index = 0; - }); - } -} - -export const entityManager = new EntityManager(); diff --git a/src/event_emitter.ts b/src/event_emitter.ts deleted file mode 100644 index c08e186..0000000 --- a/src/event_emitter.ts +++ /dev/null @@ -1,39 +0,0 @@ -type EventCallback = (...args: any) => void; - -export abstract class EventEmitter extends EventTarget { - /** - * - * @param {string} eventName The name of the event - * @param {...any} args The arguments that will be passed to the listener - */ - protected emit(eventName: string, ...args: any): void { - this.dispatchEvent(new CustomEvent(eventName, { detail: args })); - } - - /** - * - * @param {string} eventName The name of the event - * @param {EventCallback} listener The callback function - */ - on(eventName: string, listener: EventCallback): void { - this.addEventListener(eventName, (e: CustomEvent) => Reflect.apply(listener, this, e.detail)); - } - - /** - * - * @param {string} eventName The name of the event - * @param {EventCallback} listener The callback function - */ - once(eventName: string, listener: EventCallback): void { - this.addEventListener(eventName, (e: CustomEvent) => Reflect.apply(listener, this, e.detail), { once: true }); - } - - /** - * - * @param {string} eventName The name of the event - * @param {EventCallback} listener The callback function - */ - off(eventName: string, listener: EventCallback): void { - this.removeEventListener(eventName, listener); - } -} diff --git a/src/game.ts b/src/game.ts deleted file mode 100644 index 87f8a59..0000000 --- a/src/game.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { EventEmitter } from './event_emitter'; -import { CanvasKit } from './canvas_kit'; - -class Game extends EventEmitter { - #ready = false; - - constructor() { - super(); - - CanvasKit.hookRAF(() => this.#onframe()); - } - - #onframe(): void { - if (!this.#ready && window.input !== undefined) { - this.#ready = true; - this.#onready(); - } - - super.emit('frame'); - } - - #onready(): void { - setTimeout(() => super.emit('ready'), 100); - } -} - -export const game = new Game(); diff --git a/src/globals.d.ts b/src/globals.d.ts index 9448ed6..9f234ae 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -14,3 +14,5 @@ interface Input { } declare var input: Input; + +declare var unsafeWindow: Window & typeof globalThis; diff --git a/src/index.ts b/src/index.ts index 8ab002b..478475a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,12 +1,3 @@ export { Vector } from './vector'; -export { CanvasKit } from './canvas_kit'; -export { EntityColor, EntityType, TeamColors, Entity } from './entity'; -export { gamepad } from './diep_gamepad'; -export { game } from './game'; export { minimap } from './minimap'; -export { arena } from './arena'; -export { arenaScaling } from './arena_scaling'; - -export { player } from './player'; -export { entityManager } from './entity_manager'; diff --git a/src/movement.ts b/src/movement.ts deleted file mode 100644 index cd3f8ae..0000000 --- a/src/movement.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Vector } from './vector'; - -export class Movement { - #position = new Vector(0, 0); - #velocity = new Vector(0, 0); - - /* - * used for average velocity calculation - */ - readonly #velocitySamplesSize = 10; - #velocitySamples = []; - #velocitySamplesIndex = 0; - #velocityLastNow = performance.now(); - - get position(): Vector { - return this.#position; - } - - /** - * Velocity in [diep_]units / second - */ - get velocity(): Vector { - return this.#velocity; - } - - /** - * Predict where this object will be after `time` - * @param time The time in ms. - */ - predictPos(time: number): Vector { - const duration = (time + performance.now() - this.#velocityLastNow) / 1000; - return Vector.add(this.#position, Vector.scale(duration, this.#velocity)); - } - - protected updatePos(newPos: Vector): void { - this.#updateVelocity(newPos); - this.#position = newPos; - } - - #updateVelocity(newPos: Vector): void { - const now = performance.now(); - const time = (now - this.#velocityLastNow) / 1000; - if (time === 0) return; - this.#velocityLastNow = now; - - const velocity = Vector.scale(1 / time, Vector.subtract(newPos, this.#position)); - - // add current velocity to our samples array - this.#velocitySamples[this.#velocitySamplesIndex++] = velocity; - this.#velocitySamplesIndex %= this.#velocitySamplesSize; - - // calculate the average velocity - this.#velocity = Vector.scale( - 1 / this.#velocitySamples.length, - this.#velocitySamples.reduce((acc, x) => Vector.add(acc, x)) - ); - } -} diff --git a/src/player.ts b/src/player.ts deleted file mode 100644 index 8140f4d..0000000 --- a/src/player.ts +++ /dev/null @@ -1,376 +0,0 @@ -import { Vector } from './vector'; -import { EventEmitter } from './event_emitter'; -import { game } from './game'; -import { arenaScaling } from './arena_scaling'; -import { playerMovement } from './player_movement'; -import { gamepad } from './diep_gamepad'; -import { CanvasKit } from './canvas_kit'; - -const sleep = (ms: number): Promise => new Promise((resolve, reject) => setTimeout(resolve, ms)); - -class Player extends EventEmitter { - #isDead = true; - #mouseLock = false; - #mouseCanvasPos = new Vector(0, 0); - #mousePos = new Vector(0, 0); - #gamemode = window.localStorage.gamemode; - #level = 1; - #tank = 'Tank'; - - constructor() { - super(); - - game.once('ready', () => { - //Check dead or alive - game.on('frame', () => { - const isDead = !window.input.should_prevent_unload(); - if (this.#isDead == isDead) return; - this.#isDead = isDead; - - if (this.#isDead) this.#ondead(); - else this.#onspawn(); - }); - //update mouse position - game.on('frame', () => { - this.#mousePos = arenaScaling.toArenaPos(this.#mouseCanvasPos); - }); - - //Mouse events - const canvas = document.getElementById('canvas'); - canvas.onmousemove = new Proxy(canvas.onmousemove, { - apply: (target, thisArg, args) => { - if (this.#mouseLock) return; - this.#onmousemove(args[0]); - return Reflect.apply(target, thisArg, args); - }, - }); - canvas.onmousedown = new Proxy(canvas.onmousedown, { - apply: (target, thisArg, args) => { - if (this.#mouseLock) return; - this.#onmousedown(args[0]); - return Reflect.apply(target, thisArg, args); - }, - }); - canvas.onmouseup = new Proxy(canvas.onmouseup, { - apply: (target, thisArg, args) => { - if (this.#mouseLock) return; - this.#onmouseup(args[0]); - return Reflect.apply(target, thisArg, args); - }, - }); - //Key events - window.onkeydown = new Proxy(window.onkeydown, { - apply: (target, thisArg, args) => { - this.#onkeydown(args[0]); - return Reflect.apply(target, thisArg, args); - }, - }); - window.onkeyup = new Proxy(window.onkeyup, { - apply: (target, thisArg, args) => { - this.#onkeyup(args[0]); - return Reflect.apply(target, thisArg, args); - }, - }); - - // tank and level event listener - CanvasKit.hook('fillText', (target, thisArg, args) => { - const text = args[0]; - const match = text.match(/^Lvl (\d+) (\w*)$/); - if (match == null) { - return; - } - - const newLevel = Number(match[1]); - const newTank = match[2]; - - // make sure to trigger events for all levels in between. - while (newLevel > this.#level + 1) { - super.emit('level', ++this.#level); - } - - if (newLevel !== this.#level) super.emit('level', newLevel); - if (newTank !== this.#tank) super.emit('tank', newTank); - - this.#level = newLevel; - this.#tank = match[2]; - }); - }); - } - - get position(): Vector { - return playerMovement.position; - } - - get velocity(): Vector { - return playerMovement.velocity; - } - - get mouse(): Vector { - return this.#mousePos; - } - - get isDead(): boolean { - return this.#isDead; - } - - get gamemode(): string { - return this.#gamemode; - } - - get level(): number { - return this.#level; - } - - get tank(): string { - return this.#tank; - } - - /** - * Predict where this object will be after `time` - * @param time The time in ms - */ - predictPos(time: number): Vector { - return playerMovement.predictPos(time); - } - - /** - * Fun function to upgrade to octo - * @async - */ - async octoBuild() { - this.keyDown('k'); - await this.upgrade_stat(4, 7); - await this.upgrade_stat(5, 7); - await this.upgrade_stat(6, 7); - await this.upgrade_stat(7, 7); - await this.upgrade_stat(8, 5); - await this.upgrade_tank(1); - await this.upgrade_tank(2); - await this.upgrade_tank(1); - this.keyUp('k'); - } - - async #ondead(): Promise { - await sleep(50); - super.emit('dead'); - } - - async #onspawn(): Promise { - this.#gamemode = window.localStorage.gamemode; - - await sleep(50); - super.emit('spawn'); - } - - useGamepad(value: boolean): void { - gamepad.connected = value; - } - - keyDown(key: number | string): void { - if (typeof key == 'string') { - if (key.length != 1) throw new Error(`diepAPI: Unsupported key: ${key}`); - key = key.toUpperCase().charCodeAt(0); - } - window.input.keyDown(key); - this.#onkeydown({ keyCode: key } as KeyboardEvent); - } - keyUp(key: number | string): void { - if (typeof key == 'string') { - if (key.length != 1) throw new Error(`diepAPI: Unsupported key: ${key}`); - key = key.toUpperCase().charCodeAt(0); - } - window.input.keyUp(key); - this.#onkeyup({ keyCode: key } as KeyboardEvent); - } - async keyPress(key: number | string): Promise { - this.keyDown(key); - await sleep(200); - this.keyUp(key); - await sleep(10); - } - - async spawn(name: string, attempts: number = 0): Promise { - if (!this.#isDead) return; - - if (name !== undefined) (document.getElementById('textInput') as HTMLInputElement).value = name; - - await this.keyPress(13); - - await sleep(250); - - await this.spawn(name, attempts + 1); - } - - async upgrade_stat(id: number, level: number): Promise { - if (id < 1 || id > 8) throw `diepAPI: ${id} is not a supported stat`; - - this.keyDown(85); - for (let i = 0; i < level; i++) { - await this.keyPress(48 + id); - } - this.keyUp(85); - await sleep(250); - } - - async upgrade_tank(index: number): Promise { - index -= 1; - const x_index = index % 2; - const y_index = Math.floor(index / 2); - const x = arenaScaling.screenToCanvasUnits(arenaScaling.windowRatio * (x_index * 115 + 97.5)); - const y = arenaScaling.screenToCanvasUnits(arenaScaling.windowRatio * (y_index * 110 + 120)); - - this.#mouseLock = true; - window.input.mouse(x, y); - await this.keyPress(1); - // wait 200 ms before disabling mouselock - await sleep(200); - this.#mouseLock = false; - // wait 1500 ms for the animation to finish - await sleep(1500); - } - - moveTo(arenaPos: Vector): void { - if (gamepad.connected) { - const direction = Vector.subtract(arenaPos, this.position); - const distance = Vector.len(direction); - - if (distance === 0) { - gamepad.x = 0; - gamepad.y = 0; - return; - } - - //max speed - const velocity = Vector.scale(1 / distance, direction); - - gamepad.x = velocity.x; - gamepad.y = velocity.y; - } else { - const direction = Vector.subtract(arenaPos, this.position); - - if (direction.x > 0) { - this.keyUp('a'); - this.keyDown('d'); - } else if (direction.x < 0) { - this.keyUp('d'); - this.keyDown('a'); - } else { - this.keyUp('a'); - this.keyUp('d'); - } - - if (direction.y > 0) { - this.keyUp('w'); - this.keyDown('s'); - } else if (direction.y < 0) { - this.keyUp('s'); - this.keyDown('w'); - } else { - this.keyUp('w'); - this.keyUp('s'); - } - } - } - - lookAt(arenaPos: Vector): void { - const position = arenaScaling.toCanvasPos(arenaPos); - window.input.mouse(position.x, position.y); - - this.#onmousemove({ clientX: position.x, clientY: position.y } as MouseEvent); - } - - #onmousemove(e: MouseEvent): void { - this.#mouseCanvasPos = arenaScaling.screenToCanvas(new Vector(e.clientX, e.clientY)); - - if (gamepad.connected) { - const arenaPos = arenaScaling.toArenaPos(this.#mouseCanvasPos); - const direction = Vector.subtract(arenaPos, this.position); - let axes = Vector.scale(arenaScaling.fov / 1200 / 1.1, direction); - - const length = Vector.len(axes); - - if (length !== 0 && length < 0.15) { - axes = Vector.scale(0.15 / length, axes); - } - - gamepad.mx = axes.x; - gamepad.my = axes.y; - } - } - - #onmousedown(e: MouseEvent): void { - if (gamepad.connected) this.#onkeydown({ keyCode: e.which } as KeyboardEvent); - } - - #onmouseup(e: MouseEvent): void { - if (gamepad.connected) this.#onkeyup({ keyCode: e.which } as KeyboardEvent); - } - - #onkeydown(e: KeyboardEvent): void { - super.emit('keydown', e.keyCode); - - if (gamepad.connected) { - switch (e.keyCode) { - case 37: - case 65: - gamepad.x = -1; - break; - case 40: - case 83: - gamepad.y = 1; - break; - case 38: - case 87: - gamepad.y = -1; - break; - case 39: - case 68: - gamepad.x = 1; - break; - case 1: - case 32: - gamepad.leftMouse = true; - break; - case 3: - case 16: - gamepad.rightMouse = true; - break; - } - } - } - - #onkeyup(e: KeyboardEvent): void { - super.emit('keyup', e.keyCode); - - if (gamepad.connected) { - switch (e.keyCode) { - case 37: - case 65: - gamepad.x = 0; - break; - case 40: - case 83: - gamepad.y = 0; - break; - case 38: - case 87: - gamepad.y = 0; - break; - case 39: - case 68: - gamepad.x = 0; - break; - case 1: - case 32: - gamepad.leftMouse = false; - break; - case 3: - case 16: - gamepad.rightMouse = false; - break; - } - } - } -} - -export const player = new Player(); diff --git a/src/player_movement.ts b/src/player_movement.ts deleted file mode 100644 index e6a0019..0000000 --- a/src/player_movement.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Movement } from './movement'; -import { minimap } from './minimap'; -import { arena } from './arena'; -import { game } from './game'; - -class PlayerMovement extends Movement { - /** - * Using the minimap arrow to get the player position and velocity - */ - constructor() { - super(); - - game.on('frame', () => super.updatePos(arena.scale(minimap.arrowPos))); - } -} - -export const playerMovement = new PlayerMovement(); From 1f72eff45e11964d29709a71fea342d013908a19 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 11:41:57 +0200 Subject: [PATCH 02/47] add unscale method --- src/vector.ts | 48 ++++++++++++++++-------------------------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/src/vector.ts b/src/vector.ts index 8306028..2d92cba 100644 --- a/src/vector.ts +++ b/src/vector.ts @@ -1,54 +1,38 @@ export class Vector { constructor(readonly x: number, readonly y: number) {} - /** - * ( u1 ) + ( v1 ) = ( u1 + v1 ) - * ( u2 ) ( v2 ) ( u2 + v2 ) - */ + static len(v: Vector): number { + return Math.sqrt(v.x ** 2 + v.y ** 2); + } + + static round(v: Vector): Vector { + return new Vector(Math.round(v.x), Math.round(v.y)); + } + + static scale(r: number, v: Vector): Vector { + return new Vector(r * v.x, r * v.y); + } + + static unscale(r: number, v: Vector): Vector { + return new Vector(v.x / r, v.y / r); + } + static add(u: Vector, v: Vector): Vector { return new Vector(u.x + v.x, u.y + v.y); } - /** - * ( u1 ) - ( v1 ) = ( u1 - v1 ) - * ( u2 ) ( v2 ) ( u2 - v2 ) - */ static subtract(u: Vector, v: Vector): Vector { return new Vector(u.x - v.x, u.y - v.y); } - /** - * ( u1 ) * ( v1 ) = ( u1 * v1 ) - * ( u2 ) ( v2 ) ( u2 * v2 ) - */ static multiply(u: Vector, v: Vector): Vector { return new Vector(u.x * v.x, u.y * v.y); } - /** - * ( u1 ) / ( v1 ) = ( u1 / v1 ) - * ( u2 ) ( v2 ) ( u2 / v2 ) - */ static divide(u: Vector, v: Vector): Vector { return new Vector(u.x / v.x, u.y / v.y); } - /** - * r * ( v1 ) = ( r * v1 ) - * ( v2 ) ( r * v2 ) - */ - static scale(r: number, v: Vector): Vector { - return new Vector(r * v.x, r * v.y); - } - - static round(v: Vector): Vector { - return new Vector(Math.round(v.x), Math.round(v.y)); - } - - static len(v: Vector): number { - return Math.sqrt(v.x ** 2 + v.y ** 2); - } - static distance(u: Vector, v: Vector): number { return Vector.len(Vector.subtract(u, v)); } From 7c2cd02f5ffd7b4493131bccf20faabd908fd72e Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 11:42:13 +0200 Subject: [PATCH 03/47] add minimap --- src/minimap.ts | 172 +++++++++++++++++++++++++++++-------------------- 1 file changed, 102 insertions(+), 70 deletions(-) diff --git a/src/minimap.ts b/src/minimap.ts index 570c2d6..a29582e 100644 --- a/src/minimap.ts +++ b/src/minimap.ts @@ -1,35 +1,40 @@ import { Vector } from './vector'; -import { CanvasKit } from './canvas_kit'; -import { game } from './game'; +const _window = typeof unsafeWindow == 'undefined' ? window : unsafeWindow; + +/** + * The Minimap API + */ class Minimap { #minimapDim = new Vector(1, 1); #minimapPos = new Vector(0, 0); #viewportDim = new Vector(1, 1); - #viewportPos = new Vector(0, 0); + #viewportPos = new Vector(1, 1); - /** - * @description The position of the arrow normalized to the range [0,1] - */ #arrowPos = new Vector(0.5, 0.5); #drawViewport = false; constructor() { - game.once('ready', () => { - window.input.set_convar('ren_minimap_viewport', 'true'); - window.input.set_convar = new Proxy(window.input.set_convar, { + // TODO: game.once('ready') + setTimeout(() => { + _window.input.set_convar('ren_minimap_viewport', 'true'); + _window.input.set_convar = new Proxy(_window.input.set_convar, { apply: (target, thisArg, args) => { - if (args[0] === 'ren_minimap_viewport') this.#drawViewport = args[1]; - else Reflect.apply(target, thisArg, args); + if (args[0] === 'ren_minimap_viewport') { + this.#drawViewport = args[1]; + return; + } + + return Reflect.apply(target, thisArg, args); }, }); - }); + }, 1000); - this._minimapHook(); - this._viewportHook(); - this._arrowHook(); + this.#minimapHook(); + this.#viewPortHook(); + this.#arrowHook(); } get minimapDim(): Vector { @@ -52,41 +57,45 @@ class Minimap { return this.#arrowPos; } - drawViewport(value: boolean): void { - this.#drawViewport = value; - } - - _minimapHook() { - CanvasKit.hook('strokeRect', (target, thisArg, args) => { - const transform = thisArg.getTransform(); + #minimapHook() { + _window.CanvasRenderingContext2D.prototype.strokeRect = new Proxy(_window.CanvasRenderingContext2D.prototype.strokeRect, { + apply(target, thisArg, args) { + if (thisArg.canvas.className !== 'CanvasKit-bypass') { + const transform = thisArg.getTransform(); - this.#minimapDim = new Vector(transform.a, transform.d); - this.#minimapPos = new Vector(transform.e, transform.f); + this.#minimapDim = new Vector(transform.a, transform.d); + this.#minimapPos = new Vector(transform.e, transform.f); + } + return Reflect.apply(target, thisArg, args); + }, }); } - _viewportHook() { - CanvasKit.replace('fillRect', (target, thisArg, args) => { - const transform = thisArg.getTransform(); - - if ( - Math.round((transform.a / transform.d) * 10_000) !== - Math.round((window.innerWidth / window.innerHeight) * 10_000) - ) { + #viewPortHook() { + _window.CanvasRenderingContext2D.prototype.fillRect = new Proxy(_window.CanvasRenderingContext2D.prototype.fillRect, { + apply(target, thisArg, args) { + if (thisArg.canvas.className !== 'CanvasKit-bypass') { + const transform = thisArg.getTransform(); + + if (Math.round((transform.a / transform.d) * 10_000) !== Math.round((_window.innerWidth / _window.innerHeight) * 10_000)) { + return Reflect.apply(target, thisArg, args); + } + if (transform.a >= _window.innerWidth && transform.d >= _window.innerHeight) { + return Reflect.apply(target, thisArg, args); + } + + this.#viewportDim = new Vector(transform.a, transform.d); + this.#viewportPos = new Vector(transform.e, transform.f); + + if (this.#drawViewport) return Reflect.apply(target, thisArg, args); + return; + } return Reflect.apply(target, thisArg, args); - } - if (transform.a >= window.innerWidth && transform.d >= window.innerHeight) { - return Reflect.apply(target, thisArg, args); - } - - this.#viewportDim = new Vector(transform.a, transform.d); - this.#viewportPos = new Vector(transform.e, transform.f); - - if (this.#drawViewport) return Reflect.apply(target, thisArg, args); + }, }); } - _arrowHook() { + #arrowHook() { let index = 0; let pointA: Vector; @@ -106,37 +115,60 @@ class Minimap { this.#arrowPos = position; }; - CanvasKit.hook('beginPath', (target, thisArg, args) => { - index = 1; + _window.CanvasRenderingContext2D.prototype.beginPath = new Proxy(_window.CanvasRenderingContext2D.prototype.beginPath, { + apply(target, thisArg, args) { + if (thisArg.canvas.className !== 'CanvasKit-bypass') { + index = 1; + } + return Reflect.apply(target, thisArg, args); + }, }); - CanvasKit.hook('moveTo', (target, thisArg, args) => { - if (index === 1) { - index++; - pointA = new Vector(args[0], args[1]); - return; - } - index = 0; + + _window.CanvasRenderingContext2D.prototype.moveTo = new Proxy(_window.CanvasRenderingContext2D.prototype.moveTo, { + apply(target, thisArg, args) { + if (thisArg.canvas.className !== 'CanvasKit-bypass') { + if (index === 1) { + index++; + pointA = new Vector(args[0], args[1]); + return Reflect.apply(target, thisArg, args); + } + index = 0; + } + return Reflect.apply(target, thisArg, args); + }, }); - CanvasKit.hook('lineTo', (target, thisArg, args) => { - if (index === 2) { - index++; - pointB = new Vector(args[0], args[1]); - return; - } - if (index === 3) { - index++; - pointC = new Vector(args[0], args[1]); - return; - } - index = 0; + + _window.CanvasRenderingContext2D.prototype.lineTo = new Proxy(_window.CanvasRenderingContext2D.prototype.lineTo, { + apply(target, thisArg, args) { + if (thisArg.canvas.className !== 'CanvasKit-bypass') { + if (index === 2) { + index++; + pointB = new Vector(args[0], args[1]); + return Reflect.apply(target, thisArg, args); + } + if (index === 3) { + index++; + pointC = new Vector(args[0], args[1]); + return Reflect.apply(target, thisArg, args); + } + index = 0; + } + return Reflect.apply(target, thisArg, args); + }, }); - CanvasKit.hook('fill', (target, thisArg, args) => { - if (index === 4) { - index++; - calculatePos(); - return; - } - index = 0; + + _window.CanvasRenderingContext2D.prototype.fill = new Proxy(_window.CanvasRenderingContext2D.prototype.fill, { + apply(target, thisArg, args) { + if (thisArg.canvas.className !== 'CanvasKit-bypass') { + if (index === 4) { + index++; + calculatePos(); + return Reflect.apply(target, thisArg, args); + } + index = 0; + } + return Reflect.apply(target, thisArg, args); + }, }); } } From afd84644861fa5346bba6af64a5c0c85ec8863a1 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 17:17:50 +0200 Subject: [PATCH 04/47] Add CanvasKit & polygonHook --- src/CanvasKit.ts | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/CanvasKit.ts diff --git a/src/CanvasKit.ts b/src/CanvasKit.ts new file mode 100644 index 0000000..fb80ed8 --- /dev/null +++ b/src/CanvasKit.ts @@ -0,0 +1,81 @@ +import { Vector } from './vector'; + +const _window = typeof unsafeWindow == 'undefined' ? window : unsafeWindow; + +export class CanvasKit { + /** + * The consumer will be called before + */ + static hookCtx( + method: string, + consumer: (target: Function, thisArg: CanvasRenderingContext2D, args: any[]) => void + ): void { + const target = _window.CanvasRenderingContext2D.prototype; + target[method] = new Proxy(target[method], { + apply(target, thisArg, args) { + if (thisArg.canvas.className !== 'CanvasKit-bypass') consumer(target, thisArg, args); + return Reflect.apply(target, thisArg, args); + }, + }); + } + + /** + * replaces the function. Use `return Reflect.apply(target, thisArg, args);` in + * your function to call the original function. + */ + static replaceCtx( + method: string, + func: (target: Function, thisArg: CanvasRenderingContext2D, args: any[]) => any + ): void { + const target = _window.CanvasRenderingContext2D.prototype; + target[method] = new Proxy(target[method], { + apply(target, thisArg, args) { + if (thisArg.canvas.className !== 'CanvasKit-bypass') return func(target, thisArg, args); + return Reflect.apply(target, thisArg, args); + }, + }); + } + + /** + * + * Calls the callback method when a polygon with `numVertices` is being drawn. + */ + static hookPolygon(numVertices: number, cb: (vertices: Vector[], ctx: CanvasRenderingContext2D) => void): void { + let index = 0; + + let vertices: Vector[] = []; + + const onFillPolygon = (ctx: CanvasRenderingContext2D) => { + cb(vertices, ctx); + }; + + CanvasKit.hookCtx('beginPath', (target, thisArg, args) => { + index = 1; + vertices = []; + }); + CanvasKit.hookCtx('moveTo', (target, thisArg, args) => { + if (index === 1) { + index++; + vertices.push(new Vector(args[0], args[1])); + return; + } + index = 0; + }); + CanvasKit.hookCtx('lineTo', (target, thisArg, args) => { + if (index >= 2 && index <= numVertices) { + index++; + vertices.push(new Vector(args[0], args[1])); + return; + } + index = 0; + }); + CanvasKit.hookCtx('fill', (target, thisArg, args) => { + if (index === numVertices + 1) { + index++; + onFillPolygon(thisArg); + return; + } + index = 0; + }); + } +} From fc11fd7ce111bd5c66f1cfddfe56aacc20290bb2 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 17:18:18 +0200 Subject: [PATCH 05/47] use canvaskit api --- src/minimap.ts | 123 +++++++++++-------------------------------------- 1 file changed, 28 insertions(+), 95 deletions(-) diff --git a/src/minimap.ts b/src/minimap.ts index a29582e..404976b 100644 --- a/src/minimap.ts +++ b/src/minimap.ts @@ -1,3 +1,4 @@ +import { CanvasKit } from './CanvasKit'; import { Vector } from './vector'; const _window = typeof unsafeWindow == 'undefined' ? window : unsafeWindow; @@ -33,7 +34,7 @@ class Minimap { }, 1000); this.#minimapHook(); - this.#viewPortHook(); + this.#viewportHook(); this.#arrowHook(); } @@ -58,117 +59,49 @@ class Minimap { } #minimapHook() { - _window.CanvasRenderingContext2D.prototype.strokeRect = new Proxy(_window.CanvasRenderingContext2D.prototype.strokeRect, { - apply(target, thisArg, args) { - if (thisArg.canvas.className !== 'CanvasKit-bypass') { - const transform = thisArg.getTransform(); - - this.#minimapDim = new Vector(transform.a, transform.d); - this.#minimapPos = new Vector(transform.e, transform.f); - } - return Reflect.apply(target, thisArg, args); - }, + CanvasKit.hookCtx('strokeRect', (target, thisArg, args) => { + const transform = thisArg.getTransform(); + + this.#minimapDim = new Vector(transform.a, transform.d); + this.#minimapPos = new Vector(transform.e, transform.f); }); } - #viewPortHook() { - _window.CanvasRenderingContext2D.prototype.fillRect = new Proxy(_window.CanvasRenderingContext2D.prototype.fillRect, { - apply(target, thisArg, args) { - if (thisArg.canvas.className !== 'CanvasKit-bypass') { - const transform = thisArg.getTransform(); + #viewportHook() { + CanvasKit.replaceCtx('fillRect', (target, thisArg, args) => { + const transform = thisArg.getTransform(); - if (Math.round((transform.a / transform.d) * 10_000) !== Math.round((_window.innerWidth / _window.innerHeight) * 10_000)) { - return Reflect.apply(target, thisArg, args); - } - if (transform.a >= _window.innerWidth && transform.d >= _window.innerHeight) { - return Reflect.apply(target, thisArg, args); - } + if (thisArg.globalAlpha !== 0.1) { + return Reflect.apply(target, thisArg, args); + } + if ( + Math.abs(transform.a / transform.d - window.innerWidth / window.innerHeight) > + (window.innerWidth / window.innerHeight) * 0.000_001 + ) { + return Reflect.apply(target, thisArg, args); + } - this.#viewportDim = new Vector(transform.a, transform.d); - this.#viewportPos = new Vector(transform.e, transform.f); + this.#viewportDim = new Vector(transform.a, transform.d); + this.#viewportPos = new Vector(transform.e, transform.f); - if (this.#drawViewport) return Reflect.apply(target, thisArg, args); - return; - } + if (this.#drawViewport) { return Reflect.apply(target, thisArg, args); - }, + } }); } #arrowHook() { - let index = 0; - - let pointA: Vector; - let pointB: Vector; - let pointC: Vector; - - const calculatePos = () => { - const side1 = Math.round(Vector.distance(pointA, pointB)); - const side2 = Math.round(Vector.distance(pointA, pointC)); - const side3 = Math.round(Vector.distance(pointB, pointC)); + CanvasKit.hookPolygon(3, (vertices, ctx) => { + const side1 = Math.round(Vector.distance(vertices[0], vertices[1])); + const side2 = Math.round(Vector.distance(vertices[0], vertices[2])); + const side3 = Math.round(Vector.distance(vertices[1], vertices[2])); if (side1 === side2 && side2 === side3) return; - const centroid = Vector.centroid(pointA, pointB, pointC); + const centroid = Vector.centroid(...vertices); const arrowPos = Vector.subtract(centroid, this.#minimapPos); const position = Vector.divide(arrowPos, this.#minimapDim); this.#arrowPos = position; - }; - - _window.CanvasRenderingContext2D.prototype.beginPath = new Proxy(_window.CanvasRenderingContext2D.prototype.beginPath, { - apply(target, thisArg, args) { - if (thisArg.canvas.className !== 'CanvasKit-bypass') { - index = 1; - } - return Reflect.apply(target, thisArg, args); - }, - }); - - _window.CanvasRenderingContext2D.prototype.moveTo = new Proxy(_window.CanvasRenderingContext2D.prototype.moveTo, { - apply(target, thisArg, args) { - if (thisArg.canvas.className !== 'CanvasKit-bypass') { - if (index === 1) { - index++; - pointA = new Vector(args[0], args[1]); - return Reflect.apply(target, thisArg, args); - } - index = 0; - } - return Reflect.apply(target, thisArg, args); - }, - }); - - _window.CanvasRenderingContext2D.prototype.lineTo = new Proxy(_window.CanvasRenderingContext2D.prototype.lineTo, { - apply(target, thisArg, args) { - if (thisArg.canvas.className !== 'CanvasKit-bypass') { - if (index === 2) { - index++; - pointB = new Vector(args[0], args[1]); - return Reflect.apply(target, thisArg, args); - } - if (index === 3) { - index++; - pointC = new Vector(args[0], args[1]); - return Reflect.apply(target, thisArg, args); - } - index = 0; - } - return Reflect.apply(target, thisArg, args); - }, - }); - - _window.CanvasRenderingContext2D.prototype.fill = new Proxy(_window.CanvasRenderingContext2D.prototype.fill, { - apply(target, thisArg, args) { - if (thisArg.canvas.className !== 'CanvasKit-bypass') { - if (index === 4) { - index++; - calculatePos(); - return Reflect.apply(target, thisArg, args); - } - index = 0; - } - return Reflect.apply(target, thisArg, args); - }, }); } } From d83322729cac1bf3c5a8d4be72811887604b8db7 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 17:28:35 +0200 Subject: [PATCH 06/47] rename replaceCtx to overrideCtx --- src/CanvasKit.ts | 2 +- src/minimap.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CanvasKit.ts b/src/CanvasKit.ts index fb80ed8..b893210 100644 --- a/src/CanvasKit.ts +++ b/src/CanvasKit.ts @@ -23,7 +23,7 @@ export class CanvasKit { * replaces the function. Use `return Reflect.apply(target, thisArg, args);` in * your function to call the original function. */ - static replaceCtx( + static overrideCtx( method: string, func: (target: Function, thisArg: CanvasRenderingContext2D, args: any[]) => any ): void { diff --git a/src/minimap.ts b/src/minimap.ts index 404976b..eb5702d 100644 --- a/src/minimap.ts +++ b/src/minimap.ts @@ -68,7 +68,7 @@ class Minimap { } #viewportHook() { - CanvasKit.replaceCtx('fillRect', (target, thisArg, args) => { + CanvasKit.overrideCtx('fillRect', (target, thisArg, args) => { const transform = thisArg.getTransform(); if (thisArg.globalAlpha !== 0.1) { From f7f26a9ed9568f648c004390d1e07974040bd490 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 17:34:23 +0200 Subject: [PATCH 07/47] rename file to lowercase --- src/{CanvasKit.ts => canvas_kit.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{CanvasKit.ts => canvas_kit.ts} (100%) diff --git a/src/CanvasKit.ts b/src/canvas_kit.ts similarity index 100% rename from src/CanvasKit.ts rename to src/canvas_kit.ts From 07ca978c5a6cf630d7ddecb475a74faf7e894b06 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 17:46:21 +0200 Subject: [PATCH 08/47] add event emitter --- src/event_emitter.ts | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/event_emitter.ts diff --git a/src/event_emitter.ts b/src/event_emitter.ts new file mode 100644 index 0000000..c08e186 --- /dev/null +++ b/src/event_emitter.ts @@ -0,0 +1,39 @@ +type EventCallback = (...args: any) => void; + +export abstract class EventEmitter extends EventTarget { + /** + * + * @param {string} eventName The name of the event + * @param {...any} args The arguments that will be passed to the listener + */ + protected emit(eventName: string, ...args: any): void { + this.dispatchEvent(new CustomEvent(eventName, { detail: args })); + } + + /** + * + * @param {string} eventName The name of the event + * @param {EventCallback} listener The callback function + */ + on(eventName: string, listener: EventCallback): void { + this.addEventListener(eventName, (e: CustomEvent) => Reflect.apply(listener, this, e.detail)); + } + + /** + * + * @param {string} eventName The name of the event + * @param {EventCallback} listener The callback function + */ + once(eventName: string, listener: EventCallback): void { + this.addEventListener(eventName, (e: CustomEvent) => Reflect.apply(listener, this, e.detail), { once: true }); + } + + /** + * + * @param {string} eventName The name of the event + * @param {EventCallback} listener The callback function + */ + off(eventName: string, listener: EventCallback): void { + this.removeEventListener(eventName, listener); + } +} From 17b9f3935c60acb3910a0ed0da8338a0a026cc06 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 19:03:57 +0200 Subject: [PATCH 09/47] add global var _window --- src/globals.d.ts | 1 + src/index.ts | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/globals.d.ts b/src/globals.d.ts index 9f234ae..aba2ea0 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -16,3 +16,4 @@ interface Input { declare var input: Input; declare var unsafeWindow: Window & typeof globalThis; +declare var _window: Window & typeof globalThis; diff --git a/src/index.ts b/src/index.ts index 478475a..3bb1517 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,10 @@ +_window = typeof unsafeWindow == 'undefined' ? window : unsafeWindow; + +export { CanvasKit } from './canvas_kit'; export { Vector } from './vector'; +export { arena } from './arena'; +export { camera } from './camera'; +export { game } from './game'; export { minimap } from './minimap'; +export { scaling } from './scaling'; From 3d79acb9c27420040ccc7cefbf516617f9c4e672 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 19:04:23 +0200 Subject: [PATCH 10/47] add game api --- src/game.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/game.ts diff --git a/src/game.ts b/src/game.ts new file mode 100644 index 0000000..87f8a59 --- /dev/null +++ b/src/game.ts @@ -0,0 +1,27 @@ +import { EventEmitter } from './event_emitter'; +import { CanvasKit } from './canvas_kit'; + +class Game extends EventEmitter { + #ready = false; + + constructor() { + super(); + + CanvasKit.hookRAF(() => this.#onframe()); + } + + #onframe(): void { + if (!this.#ready && window.input !== undefined) { + this.#ready = true; + this.#onready(); + } + + super.emit('frame'); + } + + #onready(): void { + setTimeout(() => super.emit('ready'), 100); + } +} + +export const game = new Game(); From 2f620b43914ab33e9ce0f732a07dd1ded25f5c37 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 19:04:40 +0200 Subject: [PATCH 11/47] add hookRAF method --- src/canvas_kit.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/canvas_kit.ts b/src/canvas_kit.ts index b893210..56e0091 100644 --- a/src/canvas_kit.ts +++ b/src/canvas_kit.ts @@ -1,8 +1,17 @@ import { Vector } from './vector'; - -const _window = typeof unsafeWindow == 'undefined' ? window : unsafeWindow; - export class CanvasKit { + /** + * The consumer will be called before. + */ + static hookRAF(consumer: () => void): void { + window.requestAnimationFrame = new Proxy(window.requestAnimationFrame, { + apply(target, thisArg, args) { + consumer(); + return Reflect.apply(target, thisArg, args); + }, + }); + } + /** * The consumer will be called before */ From 569aeec2f62e3d9692829229b4d715fbd60f3f59 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 19:05:21 +0200 Subject: [PATCH 12/47] use game 'ready' event --- src/minimap.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/minimap.ts b/src/minimap.ts index eb5702d..651fd22 100644 --- a/src/minimap.ts +++ b/src/minimap.ts @@ -1,6 +1,8 @@ -import { CanvasKit } from './CanvasKit'; +import { CanvasKit } from './canvas_kit'; import { Vector } from './vector'; +import { game } from './game'; + const _window = typeof unsafeWindow == 'undefined' ? window : unsafeWindow; /** @@ -18,8 +20,7 @@ class Minimap { #drawViewport = false; constructor() { - // TODO: game.once('ready') - setTimeout(() => { + game.once('ready', () => { _window.input.set_convar('ren_minimap_viewport', 'true'); _window.input.set_convar = new Proxy(_window.input.set_convar, { apply: (target, thisArg, args) => { @@ -31,7 +32,7 @@ class Minimap { return Reflect.apply(target, thisArg, args); }, }); - }, 1000); + }); this.#minimapHook(); this.#viewportHook(); From 644c2d92b59f3e7a6c990bfdfc1bdbca6463aafa Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 19:10:02 +0200 Subject: [PATCH 13/47] add more apis --- src/arena.ts | 48 +++++++++++++++++++ src/camera.ts | 15 ++++++ src/scaling.ts | 126 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 src/arena.ts create mode 100644 src/camera.ts create mode 100644 src/scaling.ts diff --git a/src/arena.ts b/src/arena.ts new file mode 100644 index 0000000..aad2df4 --- /dev/null +++ b/src/arena.ts @@ -0,0 +1,48 @@ +import { Vector } from './vector'; + +import { minimap } from './minimap'; +import { scaling } from './scaling'; + +class Arena { + #size = 1; + + constructor() { + setInterval(() => { + const ratio = Vector.divide(minimap.minimapDim, minimap.viewportDim); + const arenaDim = Vector.multiply( + ratio, + scaling.screenToCanvas(new Vector(_window.innerWidth, _window.innerHeight)) + ); + const arenaSize = Vector.round(scaling.toArenaUnits(arenaDim)); + this.#size = arenaSize.x; + }, 16); + } + + /** + * @returns {number} The Arena size in arena units + */ + get size(): number { + return this.#size; + } + + /** + * + * @param {Vector} vector The vector in [0, 1] coordinates + * @returns {Vector} The scaled vector in [-Arena.size/2, Arena.size/2] coordinates + */ + scale(vector: Vector): Vector { + const scale = (value: number) => Math.round(this.#size * (value - 0.5)); + return new Vector(scale(vector.x), scale(vector.y)); + } + /** + * + * @param {Vector} vector - The scaled vector in [-Arena.size/2, Arena.size/2] coordinates + * @returns {Vector} The unscaled vector in [0, 1] coordinates + */ + unscale(vector: Vector): Vector { + const unscale = (value: number) => value / this.#size + 0.5; + return new Vector(unscale(vector.x), unscale(vector.y)); + } +} + +export const arena = new Arena(); diff --git a/src/camera.ts b/src/camera.ts new file mode 100644 index 0000000..642aaf5 --- /dev/null +++ b/src/camera.ts @@ -0,0 +1,15 @@ +import { Vector } from './vector'; + +import { arena } from './arena'; +import { minimap } from './minimap'; + +class Camera { + get position(): Vector { + const center = Vector.add(minimap.viewportPos, Vector.unscale(2, minimap.viewportDim)); + const cameraPos = Vector.subtract(center, minimap.minimapPos); + const normalized = Vector.divide(cameraPos, minimap.minimapDim); + return arena.scale(normalized); + } +} + +export const camera = new Camera(); diff --git a/src/scaling.ts b/src/scaling.ts new file mode 100644 index 0000000..d8c95f2 --- /dev/null +++ b/src/scaling.ts @@ -0,0 +1,126 @@ +import { CanvasKit } from './canvas_kit'; +import { Vector } from './vector'; + +import { camera } from './camera'; + +class Scaling { + #scalingFactor = 1; + #drawSolidBackground = false; + + constructor() { + // TODO: game.on('ready') + setTimeout(() => { + _window.input.set_convar = new Proxy(_window.input.set_convar, { + apply: (target, thisArg, args) => { + if (args[0] === 'ren_solid_background') this.#drawSolidBackground = args[1]; + else Reflect.apply(target, thisArg, args); + }, + }); + }, 1000); + + CanvasKit.overrideCtx('stroke', (target, thisArg, args) => { + if (thisArg.fillStyle !== '#cdcdcd') { + return Reflect.apply(target, thisArg, args); + } + if (thisArg.globalAlpha === 0) { + return Reflect.apply(target, thisArg, args); + } + + this.#scalingFactor = thisArg.globalAlpha * 10; + + if (!this.#drawSolidBackground) { + return Reflect.apply(target, thisArg, args); + } + }); + } + + get windowRatio(): number { + return Math.max(_window.innerWidth / 1920, _window.innerHeight / 1080); + } + + get scalingFactor(): number { + return this.#scalingFactor; + } + + get fov(): number { + return this.#scalingFactor / this.windowRatio; + } + + /** + * + * @param {Vector} v The vector in canvas units + * @returns {Vector} The vector in arena units + */ + toArenaUnits(v: Vector): Vector { + return Vector.unscale(this.#scalingFactor, v); + } + + /** + * + * @param {Vector} v The vector in arena units + * @returns {Vector} The vector in canvas units + */ + toCanvasUnits(v: Vector): Vector { + return Vector.scale(this.#scalingFactor, v); + } + + /** + * Will translate coordinates from canvas to arena + * @param {Vector} canvasPos The canvas coordinates + * @returns {Vector} The `canvasPos` translated to arena coordinates + */ + toArenaPos(canvasPos: Vector): Vector { + const direction = Vector.subtract( + canvasPos, + this.screenToCanvas(new Vector(_window.innerWidth / 2, _window.innerHeight / 2)) + ); + const scaled = this.toArenaUnits(direction); + const arenaPos = Vector.add(scaled, camera.position); + + return arenaPos; + } + + /** + * Will translate coordinates from arena to canvas + * @param {Vector} arenaPos The arena coordinates + * @returns {Vector} The `arenaPos` translated to canvas coordinates + */ + toCanvasPos(arenaPos: Vector): Vector { + const direction = Vector.subtract(arenaPos, camera.position); + const scaled = this.toCanvasUnits(direction); + const canvasPos = Vector.add( + scaled, + this.screenToCanvas(new Vector(_window.innerWidth / 2, _window.innerHeight / 2)) + ); + + return canvasPos; + } + + screenToCanvasUnits(n: number) { + return n * _window.devicePixelRatio; + } + + canvasToScreenUnits(n: number) { + return n / _window.devicePixelRatio; + } + + /** + * Will translate coordinates from screen to canvas + * @param v The screen coordinates + * @returns The canvas coordinates + */ + screenToCanvas(v: Vector) { + return Vector.scale(_window.devicePixelRatio, v); + } + + /** + * Will translate coordinates from canvas to screen + * @param v The canvas coordinates + * @returns the screen coordinates + */ + canvasToScreen(v: Vector) { + return Vector.scale(1 / _window.devicePixelRatio, v); + } +} + +export const scaling = new Scaling(); From 07e622a4333a23b47c2897cd3da0d9248a6bea0b Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 19:17:06 +0200 Subject: [PATCH 14/47] add player movement --- src/index.ts | 1 + src/movement.ts | 57 +++++++++++++++++++++++++++++++++++++++++++ src/playerMovement.ts | 18 ++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 src/movement.ts create mode 100644 src/playerMovement.ts diff --git a/src/index.ts b/src/index.ts index 3bb1517..1c18e87 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,4 +7,5 @@ export { arena } from './arena'; export { camera } from './camera'; export { game } from './game'; export { minimap } from './minimap'; +export { playerMovement } from './playerMovement'; export { scaling } from './scaling'; diff --git a/src/movement.ts b/src/movement.ts new file mode 100644 index 0000000..237dcc2 --- /dev/null +++ b/src/movement.ts @@ -0,0 +1,57 @@ +import { Vector } from './vector'; + +export class Movement { + #position = new Vector(0, 0); + #velocity = new Vector(0, 0); + + /* + * used for average velocity calculation + */ + readonly #velocitySamplesSize = 10; + #velocitySamples = []; + #velocitySamplesIndex = 0; + #velocityLastNow = performance.now(); + get position(): Vector { + return this.#position; + } + + /** + * Velocity in [diep_]units / second + */ + get velocity(): Vector { + return this.#velocity; + } + + /** + * Predict where this object will be after `time` + * @param time The time in ms. + */ + predictPos(time: number): Vector { + const duration = (time + performance.now() - this.#velocityLastNow) / 1000; + return Vector.add(this.#position, Vector.scale(duration, this.#velocity)); + } + + protected updatePos(newPos: Vector): void { + this.#updateVelocity(newPos); + this.#position = newPos; + } + + #updateVelocity(newPos: Vector): void { + const now = performance.now(); + const time = (now - this.#velocityLastNow) / 1000; + if (time === 0) return; + this.#velocityLastNow = now; + + const velocity = Vector.unscale(time, Vector.subtract(newPos, this.#position)); + + // add current velocity to our samples array + this.#velocitySamples[this.#velocitySamplesIndex++] = velocity; + this.#velocitySamplesIndex %= this.#velocitySamplesSize; + + // calculate the average velocity + this.#velocity = Vector.unscale( + this.#velocitySamples.length, + this.#velocitySamples.reduce((acc, x) => Vector.add(acc, x)) + ); + } +} diff --git a/src/playerMovement.ts b/src/playerMovement.ts new file mode 100644 index 0000000..0db1f90 --- /dev/null +++ b/src/playerMovement.ts @@ -0,0 +1,18 @@ +import { Movement } from './movement'; + +import { arena } from './arena'; +import { game } from './game'; +import { minimap } from './minimap'; + +class PlayerMovement extends Movement { + /** + * Using the minimap arrow to get the player position and velocity + */ + constructor() { + super(); + + game.on('frame', () => super.updatePos(arena.scale(minimap.arrowPos))); + } +} + +export const playerMovement = new PlayerMovement(); From d92728070386ec6c7f5634c042aee5fe2df14cdc Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 19:45:11 +0200 Subject: [PATCH 15/47] add overlay class --- src/canvas_kit.ts | 19 +++++++++++++++++++ src/game.ts | 2 +- src/index.ts | 1 + src/minimap.ts | 2 -- src/overlay.ts | 27 +++++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 src/overlay.ts diff --git a/src/canvas_kit.ts b/src/canvas_kit.ts index 56e0091..510b6d8 100644 --- a/src/canvas_kit.ts +++ b/src/canvas_kit.ts @@ -1,5 +1,24 @@ import { Vector } from './vector'; + export class CanvasKit { + /** + * If you need a canvas then create it with this method. + */ + static createCanvas(): HTMLCanvasElement { + const canvas = document.createElement('canvas'); + canvas.className = 'CanvasKit-bypass'; + canvas.style.pointerEvents = 'none'; + canvas.style.position = 'fixed'; + canvas.style['z-index'] = 1; + canvas.style.top = '0px'; + canvas.style.left = '0px'; + canvas.style.right = '0px'; + canvas.style.bottom = '0px'; + canvas.style.width = '100%'; + canvas.style.height = '100%'; + return canvas; + } + /** * The consumer will be called before. */ diff --git a/src/game.ts b/src/game.ts index 87f8a59..7bcba46 100644 --- a/src/game.ts +++ b/src/game.ts @@ -1,5 +1,5 @@ -import { EventEmitter } from './event_emitter'; import { CanvasKit } from './canvas_kit'; +import { EventEmitter } from './event_emitter'; class Game extends EventEmitter { #ready = false; diff --git a/src/index.ts b/src/index.ts index 1c18e87..56923df 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,7 @@ _window = typeof unsafeWindow == 'undefined' ? window : unsafeWindow; export { CanvasKit } from './canvas_kit'; export { Vector } from './vector'; +export { Overlay } from './overlay'; export { arena } from './arena'; export { camera } from './camera'; diff --git a/src/minimap.ts b/src/minimap.ts index 651fd22..e3e9696 100644 --- a/src/minimap.ts +++ b/src/minimap.ts @@ -3,8 +3,6 @@ import { Vector } from './vector'; import { game } from './game'; -const _window = typeof unsafeWindow == 'undefined' ? window : unsafeWindow; - /** * The Minimap API */ diff --git a/src/overlay.ts b/src/overlay.ts new file mode 100644 index 0000000..56cd934 --- /dev/null +++ b/src/overlay.ts @@ -0,0 +1,27 @@ +import { CanvasKit } from './canvas_kit'; + +import { game } from './game'; + +class Overlay { + canvas: HTMLCanvasElement; + ctx: CanvasRenderingContext2D; + constructor() { + this.canvas = CanvasKit.createCanvas(); + this.ctx = this.canvas.getContext('2d'); + document.body.appendChild(this.canvas); + window.addEventListener('resize', () => this.#onResize()); + game.on('frame', () => this.#onFrame()); + this.#onResize(); + } + + #onResize() { + this.canvas.width = window.innerWidth * window.devicePixelRatio; + this.canvas.height = window.innerHeight * window.devicePixelRatio; + } + + #onFrame() { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + } +} + +export { Overlay }; From 4e82875720189c9e418bac41065455a0afdace9f Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 19:48:23 +0200 Subject: [PATCH 16/47] change window to _window --- src/overlay.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/overlay.ts b/src/overlay.ts index 56cd934..7f74ac6 100644 --- a/src/overlay.ts +++ b/src/overlay.ts @@ -9,14 +9,14 @@ class Overlay { this.canvas = CanvasKit.createCanvas(); this.ctx = this.canvas.getContext('2d'); document.body.appendChild(this.canvas); - window.addEventListener('resize', () => this.#onResize()); + _window.addEventListener('resize', () => this.#onResize()); game.on('frame', () => this.#onFrame()); this.#onResize(); } #onResize() { - this.canvas.width = window.innerWidth * window.devicePixelRatio; - this.canvas.height = window.innerHeight * window.devicePixelRatio; + this.canvas.width = _window.innerWidth * _window.devicePixelRatio; + this.canvas.height = _window.innerHeight * _window.devicePixelRatio; } #onFrame() { From fff3f76ca39d10f4564daf17b1b575630611bebf Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 20:21:10 +0200 Subject: [PATCH 17/47] update --- src/index.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 56923df..af858bc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,5 @@ -_window = typeof unsafeWindow == 'undefined' ? window : unsafeWindow; - -export { CanvasKit } from './canvas_kit'; -export { Vector } from './vector'; -export { Overlay } from './overlay'; +export { CanvasKit } from './core/canvas_kit'; +export { Vector } from './core/vector'; export { arena } from './arena'; export { camera } from './camera'; From baddbc908e2ae1cd9925a5f4d2c150975ae215c1 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 20:30:12 +0200 Subject: [PATCH 18/47] update npm --- package-lock.json | 2181 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 1962 insertions(+), 219 deletions(-) diff --git a/package-lock.json b/package-lock.json index 30f1437..b0ce437 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,1749 @@ { "name": "diepapi", "version": "2.0.3", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "diepapi", + "version": "2.0.3", + "license": "MIT", + "devDependencies": { + "ts-loader": "^9.2.5", + "typedoc": "^0.22.11", + "typescript": "^4.4.3", + "webpack": "^5.51.1", + "webpack-cli": "^4.8.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.107", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.107.tgz", + "integrity": "sha512-Huen6taaVrUrSy8o7mGStByba8PfOWWluHNxSHGBrCgEdFVLtvdQDBr9LBCF9Uci8SYxh28QNNMO0oC17wbGAg==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/marked": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz", + "integrity": "sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", + "integrity": "sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-oniguruma": "^1.6.1", + "vscode-textmate": "5.2.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "dev": true, + "dependencies": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "dev": true, + "dependencies": { + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-loader": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.8.tgz", + "integrity": "sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/typedoc": { + "version": "0.22.15", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.15.tgz", + "integrity": "sha512-CMd1lrqQbFvbx6S9G6fL4HKp3GoIuhujJReWqlIvSb2T26vGai+8Os3Mde7Pn832pXYemd9BMuuYWhFpL5st0Q==", + "dev": true, + "dependencies": { + "glob": "^7.2.0", + "lunr": "^2.3.9", + "marked": "^4.0.12", + "minimatch": "^5.0.1", + "shiki": "^0.10.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 12.10.0" + }, + "peerDependencies": { + "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x" + } + }, + "node_modules/typescript": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", + "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, + "node_modules/watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.72.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", + "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + }, "dependencies": { "@discoveryjs/json-ext": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", - "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, "@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", "dev": true, "requires": { "@types/estree": "*", @@ -21,9 +1751,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", "dev": true, "requires": { "@types/eslint": "*", @@ -31,21 +1761,21 @@ } }, "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/node": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.10.tgz", - "integrity": "sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==", + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz", + "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==", "dev": true }, "@webassemblyjs/ast": { @@ -195,25 +1925,27 @@ } }, "@webpack-cli/configtest": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz", - "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true, + "requires": {} }, "@webpack-cli/info": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz", - "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.2.tgz", - "integrity": "sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==", - "dev": true + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true, + "requires": {} }, "@xtuc/ieee754": { "version": "1.2.0", @@ -228,16 +1960,17 @@ "dev": true }, "acorn": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, "acorn-import-assertions": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", - "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", - "dev": true + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} }, "ajv": { "version": "6.12.6", @@ -255,7 +1988,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-styles": { "version": "4.3.0", @@ -273,13 +2007,12 @@ "dev": true }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "braces": { @@ -292,16 +2025,16 @@ } }, "browserslist": { - "version": "4.16.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", - "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001251", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.811", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.75" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, "buffer-from": { @@ -311,9 +2044,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001251", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz", - "integrity": "sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==", + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", "dev": true }, "chalk": { @@ -324,17 +2057,6 @@ "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "chrome-trace-event": { @@ -370,9 +2092,9 @@ "dev": true }, "colorette": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", - "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, "commander": { @@ -399,15 +2121,15 @@ } }, "electron-to-chromium": { - "version": "1.3.818", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.818.tgz", - "integrity": "sha512-c/Z9gIr+jDZAR9q+mn40hEc1NharBT+8ejkarjbCDnBNFviI6hvcC5j2ezkAXru//bTnQp5n6iPi0JA83Tla1Q==", + "version": "1.4.107", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.107.tgz", + "integrity": "sha512-Huen6taaVrUrSy8o7mGStByba8PfOWWluHNxSHGBrCgEdFVLtvdQDBr9LBCF9Uci8SYxh28QNNMO0oC17wbGAg==", "dev": true }, "enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -421,9 +2143,9 @@ "dev": true }, "es-module-lexer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", - "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, "escalade": { @@ -452,9 +2174,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -555,6 +2277,27 @@ "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "glob-to-regexp": { @@ -564,9 +2307,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "has": { @@ -591,9 +2334,9 @@ "dev": true }, "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -623,9 +2366,9 @@ "dev": true }, "is-core-module": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", - "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dev": true, "requires": { "has": "^1.0.3" @@ -665,14 +2408,25 @@ "dev": true }, "jest-worker": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", - "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "json-parse-better-errors": { @@ -700,9 +2454,9 @@ "dev": true }, "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, "locate-path": { @@ -730,9 +2484,9 @@ "dev": true }, "marked": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", - "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz", + "integrity": "sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==", "dev": true }, "merge-stream": { @@ -742,28 +2496,28 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.49.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -773,12 +2527,12 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" } }, "neo-async": { @@ -788,9 +2542,9 @@ "dev": true }, "node-releases": { - "version": "1.1.75", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", - "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, "npm-run-path": { @@ -821,12 +2575,12 @@ } }, "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -836,17 +2590,6 @@ "dev": true, "requires": { "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } } }, "p-try": { @@ -879,10 +2622,16 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pkg-dir": { @@ -919,13 +2668,14 @@ } }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { @@ -961,9 +2711,9 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -1003,9 +2753,9 @@ "dev": true }, "shiki": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", - "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", + "integrity": "sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==", "dev": true, "requires": { "jsonc-parser": "^3.0.0", @@ -1014,9 +2764,9 @@ } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "source-map": { @@ -1026,9 +2776,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -1042,29 +2792,36 @@ "dev": true }, "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, "terser": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.2.tgz", - "integrity": "sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "dev": true, "requires": { + "acorn": "^8.5.0", "commander": "^2.20.0", "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, "dependencies": { "source-map": { @@ -1076,17 +2833,16 @@ } }, "terser-webpack-plugin": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "dev": true, "requires": { - "jest-worker": "^27.0.2", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^5.7.0" + "terser": "^5.7.2" } }, "to-regex-range": { @@ -1099,9 +2855,9 @@ } }, "ts-loader": { - "version": "9.2.5", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.5.tgz", - "integrity": "sha512-al/ATFEffybdRMUIr5zMEWQdVnCGMUA9d3fXJ8dBVvBlzytPvIszoG9kZoR+94k6/i293RnVOXwMaWbXhNy9pQ==", + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.8.tgz", + "integrity": "sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -1111,22 +2867,22 @@ } }, "typedoc": { - "version": "0.22.11", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", - "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", + "version": "0.22.15", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.15.tgz", + "integrity": "sha512-CMd1lrqQbFvbx6S9G6fL4HKp3GoIuhujJReWqlIvSb2T26vGai+8Os3Mde7Pn832pXYemd9BMuuYWhFpL5st0Q==", "dev": true, "requires": { "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^4.0.10", - "minimatch": "^3.0.4", - "shiki": "^0.10.0" + "marked": "^4.0.12", + "minimatch": "^5.0.1", + "shiki": "^0.10.1" } }, "typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true }, "uri-js": { @@ -1138,16 +2894,10 @@ "punycode": "^2.1.0" } }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "vscode-oniguruma": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", - "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", + "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", "dev": true }, "vscode-textmate": { @@ -1157,9 +2907,9 @@ "dev": true }, "watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -1167,13 +2917,13 @@ } }, "webpack": { - "version": "5.51.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.51.1.tgz", - "integrity": "sha512-xsn3lwqEKoFvqn4JQggPSRxE4dhsRcysWTqYABAZlmavcoTmwlOb9b1N36Inbt/eIispSkuHa80/FJkDTPos1A==", + "version": "5.72.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", + "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -1181,12 +2931,12 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.0", - "es-module-lexer": "^0.7.1", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -1194,28 +2944,27 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", - "webpack-sources": "^3.2.0" + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" } }, "webpack-cli": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.8.0.tgz", - "integrity": "sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.0.4", - "@webpack-cli/info": "^1.3.0", - "@webpack-cli/serve": "^1.5.2", - "colorette": "^1.2.1", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", "commander": "^7.0.0", "execa": "^5.0.0", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^2.2.0", "rechoir": "^0.7.0", - "v8-compile-cache": "^2.2.0", "webpack-merge": "^5.7.3" }, "dependencies": { @@ -1238,9 +2987,9 @@ } }, "webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true }, "which": { @@ -1269,12 +3018,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true } } } From 2f55ca2ad77300b7c57d21827352a7a34e1c6203 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 20:32:22 +0200 Subject: [PATCH 19/47] update --- README.md | 15 +- docs/assets/highlight.css | 50 -- docs/assets/icons.css | 1043 ----------------------- docs/assets/icons.png | Bin 9615 -> 0 bytes docs/assets/icons@2x.png | Bin 28144 -> 0 bytes docs/assets/main.js | 52 -- docs/assets/search.js | 1 - docs/assets/style.css | 1341 ------------------------------ docs/assets/widgets.png | Bin 480 -> 0 bytes docs/assets/widgets@2x.png | Bin 855 -> 0 bytes docs/classes/CanvasKit.html | 10 - docs/classes/Vector.html | 20 - docs/index.html | 68 -- docs/modules.html | 1 - extensions/README.md | 9 + extensions/globals.d.ts | 19 + extensions/overlay/overlay.ts | 27 + extensions/overlay/tsconfig.json | 10 + 18 files changed, 75 insertions(+), 2591 deletions(-) delete mode 100644 docs/assets/highlight.css delete mode 100644 docs/assets/icons.css delete mode 100644 docs/assets/icons.png delete mode 100644 docs/assets/icons@2x.png delete mode 100644 docs/assets/main.js delete mode 100644 docs/assets/search.js delete mode 100644 docs/assets/style.css delete mode 100644 docs/assets/widgets.png delete mode 100644 docs/assets/widgets@2x.png delete mode 100644 docs/classes/CanvasKit.html delete mode 100644 docs/classes/Vector.html delete mode 100644 docs/index.html delete mode 100644 docs/modules.html create mode 100644 extensions/README.md create mode 100644 extensions/globals.d.ts create mode 100644 extensions/overlay/overlay.ts create mode 100644 extensions/overlay/tsconfig.json diff --git a/README.md b/README.md index 8cf0b05..4dc0afe 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ # diepAPI -### v.3.0.0 +diepAPI is a library with many apis that allow you to interact with the game. -The next major release is currently planned for april 2022. -3.0.0 will come with -- full documentation -- improved and stable api +### APIs: + +- arena +- camera +- minimap +- playerMovement +- scaling ### Building: @@ -17,6 +20,8 @@ npm install npm run build ``` +You will find diepAPI.js in the /dist folder. + ### Working with the API: include the bundled library in your script and access the api by the global Object `diepAPI`. diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css deleted file mode 100644 index c682d50..0000000 --- a/docs/assets/highlight.css +++ /dev/null @@ -1,50 +0,0 @@ -:root { - --light-hl-0: #001080; - --dark-hl-0: #9CDCFE; - --light-hl-1: #000000; - --dark-hl-1: #D4D4D4; - --light-hl-2: #000000; - --dark-hl-2: #C8C8C8; - --light-hl-3: #008000; - --dark-hl-3: #6A9955; - --light-code-background: #FFFFFF; - --dark-code-background: #1E1E1E; -} - -@media (prefers-color-scheme: light) { :root { - --hl-0: var(--light-hl-0); - --hl-1: var(--light-hl-1); - --hl-2: var(--light-hl-2); - --hl-3: var(--light-hl-3); - --code-background: var(--light-code-background); -} } - -@media (prefers-color-scheme: dark) { :root { - --hl-0: var(--dark-hl-0); - --hl-1: var(--dark-hl-1); - --hl-2: var(--dark-hl-2); - --hl-3: var(--dark-hl-3); - --code-background: var(--dark-code-background); -} } - -body.light { - --hl-0: var(--light-hl-0); - --hl-1: var(--light-hl-1); - --hl-2: var(--light-hl-2); - --hl-3: var(--light-hl-3); - --code-background: var(--light-code-background); -} - -body.dark { - --hl-0: var(--dark-hl-0); - --hl-1: var(--dark-hl-1); - --hl-2: var(--dark-hl-2); - --hl-3: var(--dark-hl-3); - --code-background: var(--dark-code-background); -} - -.hl-0 { color: var(--hl-0); } -.hl-1 { color: var(--hl-1); } -.hl-2 { color: var(--hl-2); } -.hl-3 { color: var(--hl-3); } -pre, code { background: var(--code-background); } diff --git a/docs/assets/icons.css b/docs/assets/icons.css deleted file mode 100644 index 776a356..0000000 --- a/docs/assets/icons.css +++ /dev/null @@ -1,1043 +0,0 @@ -.tsd-kind-icon { - display: block; - position: relative; - padding-left: 20px; - text-indent: -20px; -} -.tsd-kind-icon:before { - content: ""; - display: inline-block; - vertical-align: middle; - width: 17px; - height: 17px; - margin: 0 3px 2px 0; - background-image: url(./icons.png); -} -@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { - .tsd-kind-icon:before { - background-image: url(./icons@2x.png); - background-size: 238px 204px; - } -} - -.tsd-signature.tsd-kind-icon:before { - background-position: 0 -153px; -} - -.tsd-kind-object-literal > .tsd-kind-icon:before { - background-position: 0px -17px; -} -.tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -17px; -} -.tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -17px; -} - -.tsd-kind-class > .tsd-kind-icon:before { - background-position: 0px -34px; -} -.tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -34px; -} -.tsd-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -34px; -} - -.tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: 0px -51px; -} -.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -17px -51px; -} -.tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -51px; -} - -.tsd-kind-interface > .tsd-kind-icon:before { - background-position: 0px -68px; -} -.tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -68px; -} -.tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -68px; -} - -.tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: 0px -85px; -} -.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -17px -85px; -} -.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private - > .tsd-kind-icon:before { - background-position: -34px -85px; -} - -.tsd-kind-namespace > .tsd-kind-icon:before { - background-position: 0px -102px; -} -.tsd-kind-namespace.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -102px; -} -.tsd-kind-namespace.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -102px; -} - -.tsd-kind-module > .tsd-kind-icon:before { - background-position: 0px -102px; -} -.tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -102px; -} -.tsd-kind-module.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -102px; -} - -.tsd-kind-enum > .tsd-kind-icon:before { - background-position: 0px -119px; -} -.tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -119px; -} -.tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -119px; -} - -.tsd-kind-enum-member > .tsd-kind-icon:before { - background-position: 0px -136px; -} -.tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -136px; -} -.tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -136px; -} - -.tsd-kind-signature > .tsd-kind-icon:before { - background-position: 0px -153px; -} -.tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -153px; -} -.tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -153px; -} - -.tsd-kind-type-alias > .tsd-kind-icon:before { - background-position: 0px -170px; -} -.tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -170px; -} -.tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -170px; -} - -.tsd-kind-type-alias.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: 0px -187px; -} -.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -17px -187px; -} -.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private - > .tsd-kind-icon:before { - background-position: -34px -187px; -} - -.tsd-kind-variable > .tsd-kind-icon:before { - background-position: -136px -0px; -} -.tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -0px; -} -.tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -0px; -} -.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -0px; -} -.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -0px; -} -.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -0px; -} - -.tsd-kind-property > .tsd-kind-icon:before { - background-position: -136px -0px; -} -.tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -0px; -} -.tsd-kind-property.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -0px; -} -.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -0px; -} -.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -0px; -} -.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -0px; -} - -.tsd-kind-get-signature > .tsd-kind-icon:before { - background-position: -136px -17px; -} -.tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -17px; -} -.tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -17px; -} - -.tsd-kind-set-signature > .tsd-kind-icon:before { - background-position: -136px -34px; -} -.tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -34px; -} -.tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -34px; -} - -.tsd-kind-accessor > .tsd-kind-icon:before { - background-position: -136px -51px; -} -.tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -51px; -} -.tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -51px; -} - -.tsd-kind-function > .tsd-kind-icon:before { - background-position: -136px -68px; -} -.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -68px; -} -.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -68px; -} -.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -68px; -} -.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -68px; -} -.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -68px; -} - -.tsd-kind-method > .tsd-kind-icon:before { - background-position: -136px -68px; -} -.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -68px; -} -.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -68px; -} -.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -68px; -} -.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -68px; -} -.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -68px; -} - -.tsd-kind-call-signature > .tsd-kind-icon:before { - background-position: -136px -68px; -} -.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -68px; -} -.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -68px; -} - -.tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: -136px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -153px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class - > .tsd-kind-icon:before { - background-position: -51px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum - > .tsd-kind-icon:before { - background-position: -170px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -85px; -} - -.tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: -136px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -153px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class - > .tsd-kind-icon:before { - background-position: -51px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum - > .tsd-kind-icon:before { - background-position: -170px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -85px; -} - -.tsd-kind-constructor > .tsd-kind-icon:before { - background-position: -136px -102px; -} -.tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -102px; -} -.tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -102px; -} - -.tsd-kind-constructor-signature > .tsd-kind-icon:before { - background-position: -136px -102px; -} -.tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -102px; -} -.tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -102px; -} - -.tsd-kind-index-signature > .tsd-kind-icon:before { - background-position: -136px -119px; -} -.tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -119px; -} -.tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -119px; -} - -.tsd-kind-event > .tsd-kind-icon:before { - background-position: -136px -136px; -} -.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -136px; -} -.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -136px; -} -.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -136px; -} -.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -136px; -} -.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -136px; -} -.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -136px; -} -.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -136px; -} -.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -136px; -} - -.tsd-is-static > .tsd-kind-icon:before { - background-position: -136px -153px; -} -.tsd-is-static.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -153px; -} -.tsd-is-static.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -153px; -} -.tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -153px; -} -.tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -153px; -} -.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -153px; -} -.tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -153px; -} -.tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -153px; -} -.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -153px; -} - -.tsd-is-static.tsd-kind-function > .tsd-kind-icon:before { - background-position: -136px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -170px; -} - -.tsd-is-static.tsd-kind-method > .tsd-kind-icon:before { - background-position: -136px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -170px; -} - -.tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before { - background-position: -136px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -153px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class - > .tsd-kind-icon:before { - background-position: -51px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum - > .tsd-kind-icon:before { - background-position: -170px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -170px; -} - -.tsd-is-static.tsd-kind-event > .tsd-kind-icon:before { - background-position: -136px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -68px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -85px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -102px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected - > .tsd-kind-icon:before { - background-position: -187px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private - > .tsd-kind-icon:before { - background-position: -119px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface - > .tsd-kind-icon:before { - background-position: -204px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited - > .tsd-kind-icon:before { - background-position: -221px -187px; -} diff --git a/docs/assets/icons.png b/docs/assets/icons.png deleted file mode 100644 index 3836d5fe46e48bbe186116855aae879c23935327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9615 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 NZmR35l_G4O{0}dcmS_L~ diff --git a/docs/assets/icons@2x.png b/docs/assets/icons@2x.png deleted file mode 100644 index 5a209e2f6d7f915cc9cb6fe7a4264c8be4db87b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28144 zcmeFZcUTka`>%_-5TzIqq$xo`r3nZ`iiBRG(z{ZnN$)K|ii-3S5u{fmRRNLEoAh2n z@4X|01dtAA(50@mzH5K?{+)CF+}EWTz2eMdW-{;n-p}WG1C$hCWW;pD1Ox#ad~k9g4`y4!oVfq@3c(iW~uhy*`T7_0aH7`>`EnYuXVq#+YC==3#rnNM4TqqzM zpi2Elr!3hl!ZdK#y0bV+yVc8rwFEtAX3=QlvJ&e-EsBp)Q`0yKXbNuf-yYw7kh0CD z|Flk1UuHgvoR+*QR0ee&IDUfUzE7*`A=P$6nC;BPI@VJs|F#`Xc>X!`<6%M7XXNok zw^unt1h0m>-&2{GiIGsByulr92XZRrazZs&&M3jJintF7A}cE^uW4zt_r81yHt1I! z6-_gmO@78G3$})kfyhR0^qk?zev_%4R$qSjQI3MAg0)9EM#TOAD=_tf(*)S$7yiiR z&5v>wk3Bn**iD9S_I#2%^vi(^O+gpv2i^A);6^AcH%VC>0nH8|O!jN*L<#RtT z@aF9HMNu*d(BdiZq(LBO%(qsjSot+ZXQd{zLYh#CvOrK(?#u+|XYRylqcXOLk=m!) zBp`~~1dg7kF(Q#m)I8ZHMOD5%m&U)5jGOW@7+sm1N+O~^j*zRG;e4x@OteV=T4yo9 zSG`^0j^S)ZYp2DT>}AR|n$S)4FPI#8#(R~;Y**AZ9`&yqT;p`rks7Nhz;)dn-TgXU zw!^Bo@W6|jfp@}ijsSEFo#x3LnG;`o_yXK@2KuG8cTv&K@=dU?_PK*6=YU9!Ix8l;<_!y*Qc2phVpLM}&t|CuHBv&{M$K?VXtTabi(7kUMwV zl!>5cDNNqK6`Br*B~EcVh#5Z!FgiJZBN5nzpC7?UdAc+&AT0ivd;DA2$@YXMPK6=< z+#U~?*!R0i`3uu|#zDrRRN&j-j>ZOu#h-n#7WO^)@0> zCT6a$LGWwFLcPfN=(3#6`*UIS%uIT=LIXV-RbGE&!!+8)q~dkx`l{aKCe1`{J<5&< zlhRo;JX-UC>5)X;mwR+W96`@&ucHp$jIb~B_w_=mH>In?BLume!Wta=`ca+&7~pek zBVD?f5{nelCaje~EtZn+g3%5GJF}R_b`q}IH$Iom2IRD$^h*R)Cid8Q5~4Dzm!P&Q z<`iI)4wA#l@TwjPL)*9k5Vc!!;`9;bf?HRMm86wi9LI8A%*NGep3g11H{aP)>%l2Q zRMMQU!*0J$hJI5Qs3b=6?}qR7O;BU%Yzufc*ZKBV`}ro7zm=C?OY6Vlabc^r6r7P> z?1c^jD{e4n*Ou441V=Pd1eE8utX@)G5gq72HQAXLZ4l2wKd@yIYC+s) z-mu`E`kj=B!)a^B;pecv4W5oh>_tpj>^NU8L*eH4EhcOxQ|);$x(z(Yb5^tudSptV z%8z{(h@_t`chWkvFX=r!p~Vjhf1AdM>uGK05$1fyLb5D7m0!MUKW=JTZv)bXz9~*F z$yP@U3UE0=$;yjWr8b7C(1^oNDMZVxYYeMtL}ZnvQDkm>S0)=r_ugabEZ}AJ<<_Fu z{I^KKIz+V8K|pK811W5r##z8^S*2fr9Ln zlRG?Zzz8;xu9VSE8s+=(!^TGi1P2hC7%7MUqF=cZqFBtJNW9BROV ziv0cjsUmVvsU^X!`1UivK|dy+fSG$3YH8W0`q${`)taBT9jV{Hfh|&RIaJVvqRIFh zC*Rmvl&3*;XcMiJZ-+Mvfe0xN4N?AvJeABnNdgs(BYb!fK5<1)5UvM!Tz4_aojmUX z#Ymoh)m%fN(>6|#*RP~Lxt1?5);w}yT_lftje3sidO&MxNgcMg9@S+>M%s~y)0i`8 zT_+7LrZ~d<7V^K^C^~ast~@nM04^c5dw*&660^p%^R>n4xzd&jo)Y@ z1r=F09>jFOr%wsj^a3;>N!{rvf(qpkAdWM*5IYCsuwNwoJh7;9I$#`T6-NUIEKsiS;OylQ(XY zQtCiR1dyEGJV=~|zaFOEveB&szAVx*wsyuY?hiBGWR{h0!D zv;G`;F9cnib*YxugasrI^%uy@i)>BvC4V8@! zwy5#iHC#Qar(i0EPA3CuMQbaKy4m$CLjLSNwJs!13b%h{&x7479bv{SjC&3?SO&)3 z6q4nRRP(zOfw-mQrmx@Z64~o}GNXa9YCE$vD-(CLseaF%6HH+WZz4 zbRiJ~zAtA6*i9;z!+zZ?9~V0Lr66|Ae;}U1e#6D^hMhB6XJNHZi{t>DgU&jb=#rPK z@s04Hr_SOr%UCRY_SdDuSw^D*Rzre~4PCqgc)DBYam}@G^TxsTqX%w-yWtYU-Q2IX-a2Z4Kz_-yIe`m;x2bY1F?XZoIH=`uW{$R)ICXxqU$- zG#M6s!fDZwUOA_cs|PXe1T@XN3^UdYyR*t}943A1dTvXp!=%8c%)(s)5y@OJ@@%1a ztlq}Uvhfo3^ZO>ZO|NKfu37JMRRmXfJ_*VOBVnxFFmbq!zc%A+R+w|={11?sJpmca zCeCi;;-*yO)ywzKxa#q?E%@U-+LGH4{=2|reRd-Kz*Ps1$u6sPFO>{K9^k2Y!@=h7rZt472^BCU& z|0MZmbh1HlC3#bcjoX#m73R?H>6oW=45{gu0$S>j`v?``ch#0kGur}QbO_gO3XrB- zS4pz-Yrnqqt-k_LE-&~ox9gd#^n&HE%Z~grM;N@Das8-#U304PA$v*rj36j~qQzYN zsX>8?%q9DhpxrWR@M>30YI^WUDh4bcn+*bYn;~zt_g`$3{#G+=lBmWE;j}5e&vlDa zjsdE(Xg^o(Z|3$Tx>~-q5NrZ}^$y0eMd|h`7Y4OWkgF0(Cu&CfJV03AKfzSGBhMU4bqd4kc`qE!CH4Q^FdOCtUHaZW3R&>S}$! zhk=OYL~3fch$-?wa0)OEkynDzJR=vc^vuUQ$hF(>E(q3{7{4uhC^f@bzHUZT>k%%R zsekA}E`OlGE(x+lP1smp0;Ba7{C$F=@Pp~i$AsJkc)x+3Vf9xQB=aSN>D!T;Y5iU~39#6yoQuj6Bj%kdYC z`72YjnSoF_A)d#@S`|;~F|6TOn%b{4?MWJC4uG&NK=D zqd0rU$A@62MtWD$=Gg>TgO6)b6Vf41#Au&Zq<@p1RG!t}NG8kv#>%{bHuCdAeIao2 zkWX{dyO`XCdv`FlK?jS{48~Uaz;oD6PtoFF0u6HBTHCHh<)5wP<r?9UIw%{psu)`l~*PK0?1^oH}d{D_wF{En-ejdBHTK|(*2$K?xVkG zwYXl8^HAjVOqKQj0f6s~O`)Slp+alXd8@#4Iw?pHys|MW1|l%ipCPeN)|fLB$Dc(9s}LNw@?8G{ zU>U(Vid5}ltIy~zNv>o09)rC()g8O`<5~!qF*Z_?L;+2Sy!WSv=}|67mnOPb!A*2; z^f>okkk+f3+9?Tg&6NBMX%;BtB3Ds#(PZ6E4`X0e`~amc=9QGw3J-$!nw6)l1A8;m zFdl>D?g@J3P-41+3N`R32d*Hq0GWj!{3n&rVA)dpcB+|5`XZFFZI1bKA7d;-x=0wt zy;$6nvCJ$_&JDjWa%`LQYq&(6LqBP7G_+`+4$|qk7IlS4wK{qnP-3!yFO%_fw(8(Q(#|htD?ECEYPeT&anf%0GjGQC<0)vR3x=4pq`@gX z{0?*O(e3p_zu@N9G2O%!F8j&|FRhF(c@BWMxZTpdW0xv^K!`2L39%+Hs0#R>a@n-J#u*kF6~?DIhPrUi@$pR0tS?5wF%PE z(-eYCc#{7tVRzd>j~xO&LBPK62xxwmxrdd{N6!G1hfD0H?fV)_B^PBIm|@~CZXnpdaM=<+?&D8Md^RL00JfP zK|cm@`4bB6muuN!Zck2>k+wh^8kM73#1(%6#^TG;42H{?eTC(h^zB32g{Skc%t3Dn zcHX3$TQhR}n9xXCd$?igvlBH@ZU~p4OO*Gf=$@=w?9vYs)!RYa9V@}xVt8Sr4y_!< zGjn5?gnlSKhqS-YW^o#@NScez6I3x{ zv>meTLLYSK!pa+|kqQI8rWST7_)jL~mqQ}Ou*!V2U-g|ZR+pB%Z@w|HnZrV~uY*w?_gMhSp+4fY?hMmdNXYD(iruAlj0&qga8nQ1=c#y* zgYc@oWp>=|LQ+s})zQ5kv*UF?QMJ2|FN1CzjX$x&TwGJ!4VjOiZxVDVz#r28{^WRn z{o1SYRs*^Nt9(ZX`wad=44v--X~h#aROW$yKE=n-VWRfhI&wn|_X6(` z_WPK(bt4Q8gxJ=b%BW_nNj&h;H;2z`{vi`~)tCBk(zGYBp?f;(Ua+^@+rKm53ld9S zPP#A^Wv7>F7c36IAp7(%S716|mr9fnL?n&Q*?OcmX7>@shP*98yVXmJ{1{z!s;@_D zt0}M~j-0t@?)wY>a9PxzCVtBiTKiS1<;-&hv5CHiv=8d$IOnl?aI_>zR3eW}l*}`T zd7%jWK1w(iqAjU37u~dz-4@O^=PWhD7_yL+z1;-hnPx|je;QFR?I_x6McEg|;`Zuf z_}_7>V@hb=%%^H&>8W{N&Ud5bKD%p(B6#&l@nN^wOdQizb`@g}g1c|qGqGr^c>a1w z|5;G!BbS8(8#mlqM+re6&;L0Ba$evPxRGW!koG@-z@*c+8&^U^7Q+0jgUtgB$)Bh)OGD5oa(ju zL&w{}@q-4qVXtvRtXul%gWH0DxXe$&?MN>z2jh1!ElU%a2;fz@xaTyfs`lnr<` zLv5teGAw`KJIh))Wg8JzoRNMyP>X1rhr)=#Y8O6Nf7>}xLS8!@+&6k0h#H>Nn{`&~ z<h^0MI*wtWWT)UGMw#$-to|sCF?yXL$;_=8T>RsAI7ks*W{$R-UI&M5a3{Gda?9J z3PeWSws3vp1$(`F*+<1X7B6hG<6u)lqr|?N&1Up;Si*MeoRFeRNGZa1=`C?4ZaPvJ zuHL9EQ^d$jd1pu9n6iBgWPMtJyxmfJGQf{a*eag-%E@KZ$^*2_&F#h|LL)2_l*QS9(#5T>)&wtE8a=@FF+vG8N zk>*kU^97;}tRP6EGf5HKhlr6@^Nb7N1`_>QnnYF9-8tncspx59kcfE)TtFun#cCjn zEU2;}6Xu~xx+Bv+O;tKLcuo?~kQbcPghcWdz4-^H!wQOhQukRZRMRk>kfMa~V;A;p zSqpR3D87(4X}j4Awfr<~7h4dgK)pzpZf{bn z^yt`yH4+85n%*$3rL0fWi>l^4|J{Qess(a2+0W-O>gl%xIaVi`l9N3Nq}{$Q?o$#6 zP(6};On20~O*x}!V+=9YO)zz4yeTv@_04tEzA@Muc((5aTR+rHpa6@RymHX{a%Ss{ z+ZVey@TSCpCZq6G3WNWPfd3Z(|HlaUnQ37#)!hnd5VH}%lQbK+^qVrFox87bV{eTd zMjY@0wT+?ndYzV$vST&K{gWpow&Zbq;%=a$(B%@MLh@v!P|L4U zgM9JBN_Gb)g+}3@K$8-*b+GGuC&@6v)Fomd?4){kVQ)620*%U<8saNfLM+ndN~1z> zV$;~rU}Fc&M@|;i!@q(ZqbHdoB(EYYOs>u5jd5A-M`}}pr;g+_B5o2kj-|Pa zF8qc!e5d+kUV>;ih=57(*r24g=6@)>+c%LfGLw_-Bbm7r_`az+tag}5rqG&jrg(-W~CJFkaxZTf@_Ofx@ zzxqF#<4|HKKBpc&B9R1r8t{!k_=WNfzbR?aogs939=bT|!c4N>91ai-wsc4|JdG9y zGpB1A4i1ueuSS{R3h}0^YLpx`pB;Ok2-R5 zZzHya))4+|xc0QJ*&1>3;@0$RcgE3M_rt55cZ9<51j!pV&i`8js3v%e$CG{I{X+yj zruhC$iN%UA-Y%u_?FQq!rBg;{`8h`ZCg^bG&OC=733*%4cUW`DPGqp|OgNy?)-Lky zuY7>yw$@M~Jl&X?9MI2RqOdsWZwzFd6{P)UF5-=GVh z;$}}BvAUMs#V{T@TweGxI7dhuIzFqotm&oQreos6)^Nt1G4l8ce%&u1F<%WFM9t;W zBAEtq#1FS}e7Gq{9nzJ-0@1fhx^+w)&5)h+@I@?kv+h4xs>`xqTMB()kR)QH0W6ODL=b|ea)CmcTzPItT=KH66{L4@p}bW9=F z=+(cM#QUgiq$M^X08=_kUPU7sf!8j#4rN7NO0#TX0-;8=ySO&T7v$C}*`++cHZu0; zRv+{Je*j9;z>+TGv1i76Qc^1lu^>XXp&w}t;MzI_nTpY_m?O?J|UF!?x>j)zIZZ*}uTg|S?56^~@P4iEAwq#7&c^D#OmVAeT^&ib{UcAER@k$$X; zQdR$NNz=G^;6|aY!VuP>0e2>_I^ymyjmC*~Oj(aU>lb7XxoNc&mR~HbdffiYw#m3DLJ)nb-vczmSGI=PaP=yOJ4mrW01pSsP02=(ym z!R+#8VFsL>Puje-hBZZ0gY`?oFt44R6Z--pJ~w8q7te$W<+z`WB)mKtrOR>%f~{*2 z8>hh;3|%NPQq8-xDbWw`*n5*Ni7GB0zr7D?q`b1s^a4*X%Jk>EYA*r$va{t*S$Wk8 zL^lqaL9$a?PVadKA#e`-ocbsFKC1awpXsVmMxs^Fnz9Tb*6tD1sa`;k~@OqRo@ub(|hVwu)j^O#EQmIetE!ma(-|!O<`ZRqJb<$^dia$W5ARK;F@n)=G zXY|L|OhQ88G?ay6&;=(qqYF;O$NJ7x1?PPHYJC`UButfql;CF9^Z@N$9e`rgvKY7- zzkY{r^gSjplQ4S;+v7}YOOB)q;im)xJ8Tb}^>Fe{+E{o<&QW1zc~g`vO5=ii`UUW? zZp)~%d!YRLs1P5Gsp1zs3gc8)u&mU&?P*XcG+Tr-__K7L+$}7WQfV_Ngi(tq_9feK zK+m&sYg9Dt?NYYIX6$uOy3OW4i<~fWv+Cf(7LSO2Cy{IK;1#Y8C_5@I{l+TY*=I|v zB849$N`$Qn3)Wezrk#N{(Sj^ujO*o{#sa4oD_O8zmLim4B{5HQWLd}YpB(b z4G-q~15C`KQcuBSO|^7AHPTM2RneHT?`cv7UxhiJ{_{;Q;kGe05x5xg&K3|_>$pD_a&U>aXaI13$(JL50d8Z5nu7>Swu zA*$V;mYnn2)kI5c`a29y*`L60#8U8YzlVb^NVbZO*AIlUcC6{g-vYStoB)oYa(>HrRpU$_+Fu$?E^-+?mgq9i+l>lZ?b zT6(Rs*ytr2RlqzPAC<(}aFaO~EuqFiP9Nk%5YV?9#t-?A=4jtCuRhpfZRc5{uXo+q z=LI8vUYPpMT}NAmAiT1T|Lra-gEjft1a;1k`{Oe~KvJy%Wz~FR@vzsl)Hj`G)zsap zD0(^YuCzHguv&0Ryn%gl!eek+ywQej&`(Qef(ql7EcAYQoG}tAUY=Ns0uhUO05V)*ND z@*NLrHqhR{%JlU-nMJbBbn#Q$0gDOt;1glG|M6dhX@zoq#PRvcMk<`}n-dBYPlDbf zY2&o+<&J4^>4Q557tWSxa)1M;mS}X$!JFe6+N_0AI?erp9CdjDGuyvnelpc04y2u#n8-PU5wo6P&9?ZpnONA+t}Ucy z&nD(V>H%M8avRC7jdV$uW8n|L5W6kw7|(e8$j>_ZLqe`6y!1fWM}{tJ3t7HmzB894QuSOpNj=&WDT3e5Or0)3wFwasb4%9_M@6)K z&l3J-@<{!8U7lZ%P!XZsO|ejU04NSjBEBESP4Ff6+T}!&pxTCxBG{W z{I$5gyC-P##k--2l=5r77AsRg@o4?Q7zqe%7Y9-kbSnK|KDcKK;nZqb@o$i(QzUtW z4FlkIku@T67|OO;)}XWaHSwT$i->~}#O|Bld^q?M%%`d*s2x9BKP zZo$OD?q27J1NAg#Nd(Fn?4I|PbI>nwdR&!F6YOHC^L#n$QG{zQGnjL8QL{~TyS%sy zMT%4c%BbJPXL6?WNg|O1-c<>qUm^=RW`+5)eH2jAI{T^M6-_natW57V(D?*MKT4n;I#vjkQ1Y~X{0hj4% zF}qYRzy8zJX(%d$`X$XgPvDafqM65Qw_;|~(JO*m8-*q1ir0~W4cd`@#KX3_GEp5t z5?rPAGz%$L?%(5dRFgw~R^|tdxXDGF>^=J2drvtC0;nBNt)$2d+>6A}c}i_~ef`fu zywIKq{Tp+H@09h2i{+Dn7?p7~8D%gZ+<(bq<1f|tL;Qy~w3}O7WX))3Ej+(psj!1- zrlt&tNKU|u?sySN{!ByuYY@P5bL5@7&Uld^k~iLzJaP7WDAI|JZrsHHT>hmAC?xw& zC!c!IBNTzL7K;wAXR3vVTe1i(oYdqoy3H0Zw{@>?*4UcFaMCNHwib2efs0(Ync=2q zwM72#(Cn=nv2ablw^j({)fdng^E-(uP|5UD8@CzqpKlZ^=HH}?5{kmM7vLAoAatc; zwH5KZJkkdhh8C1p5+HZgC}LE+Xu}KIn7|*#?;j-8^-VaZ5jOW{JA#*;g5p`(xTiDd zKkPnW*IU@QEsE%-JWbaZU2+aF3<-bfklBU}TCC{E-~c1suP&!}=v`e&X_xF{wro+L zcgxt?1af+ArOGprbI<(>!E99@GkN&7?#q=uz{(bMN@|0qqxcTr07b2;i>k6W8Za(r zOGe?77{mF3SVV_<+hIDRNdbE)(lSDJU|Bf|swOh*8)pQ6AizER8M>1xnN1+Qcqhg$ z&ak{6PD5v75^-mAcvoOH6*!9Hkzpt)*#Ip_vNoGk)^|nj*9+w7+7R(=j4q>aw<4Wc z=nBx)kd4$ER29&>bnknJ`n4)pOczJMPJ! z0)p$AgO&S=`T1(PYN?P}4cSJ%&R?iNexQp^N$*`-AbTP7WfZIW#P4d}}S2|=#O7ke0mzh*aEWQE)y!|#~iGCKXe zpzrFFL$pk!^d8pUI(IfGO<%TTQHsrDXLDNnMC6*d0wT9m7x6Ft7V=_OlTqkuj{x>p z;1kpB_NxE04RdYk)Y!laqUU=rfZJ$T5)`7`QV?5(Ltg_xlECcjtEa{J!@6Brx);>b zl?P)xrifEIfWi;~!Hgrq*7bz~i3BH#^2_mOIb$vnOz3yqef|S?NrX2~aMzcrlIGhJ zJ57YYnbrjk0gMXNJsZ;3!GV3+U0eN7l{dNPN>2^D{M%{F_n#@Jh)M2G9pb6tlT&F# zzc){OFWO&LCDH1cNMGR@X9VA+vt>EiQ|#sD{Y6sIh0eE(T5g#Bhn{L{CgdEL#dtrL zC>~e(BtwcN6QdM$0h>v5cu{@BvleO1d{z*-w8N(k$wHP$AXwvfT1)EL-?E&6nLdTq zFA@*HmwLR__b301zkRRgd(MeG6hCvppG6OwFv=2NKQVx_rQX$Z3q-DFDcOMHtbuC2 zb}=nSGqv$BlXjj(ahhid7ECVPglKaK;z#;LgZZ+OisWYuKBPX7xpErFk*@EYkKqg2 ze61oYkPXBN#&}jK`c6OUoF{pGlCOmyvi0VbqIH)+GaMDJ>Eg{$20?GwP~=nbph7n3wT-iS@IWTjG!q<-}5nJdNKFs75SDJ`2N60FM#00h+c!NU0ufy*_DlHj73t z5%X`Hqe$xxtHUL9%+{FK#XTYqf1a`&Lh=``4pOX3cy239FO^N zfStakz4XYa-?AppcGY?%Pj@WYmLvxBlKhq06UyFTy`Dj|YO2D`3uG#B$$f7PEjp~U zN;XAx*Xx;j?A}%@n)?=Uw67Bf^MPlLUonDdnT0whr^OXyCbtVRp^N&tL4I{~Dg4l+ zvxK9}?_3)Y$>n?i!054VsQ<#MMZ=Q@luen-sz=N_VC}l?`zNJtA`krH?K@>?REBq0S+(}^2UlFWDqHi30Pa~uu05d$T+-JrcJV1?aXOg(}Rs zl`@li5%>|PHxJjZT#h6)u5#ukqU%dvk;$HYi|x;L7naNA&)c1zj7(iIm+BYA&tK7r zwW0zwzaX`x0|CVQVi4}J(N#ScVIBUXBSyY%CN{!aH)SJ(GEwpFU}-yF{d#w05hL=m zqA}!Sf^U&%EPmu~34)ZMEMWZ|Z{ zf+Da%zhehlo-wY?=x^Nensm)O!dR`~B96^wloNE6>dRY#u#pQB(ftm&2{0{aPw);3 zLS~XJegtuFdsZ#-4}Yw<2z1ya*ZublDU*Ut>&i)(l$<$AW-E7gWuf>Kh>nR@=~Jgg zYVeI|2kH%1E@)ScwTRMO*HTWJ!AcdT*o-xoiH_PF%JHNE29RfRx{{W~Mn)HwZeR53 z{~74suQ)4?@;WN79bIYU3yi%hNhnxTu7in4w>kOLA9 z^_cPfyxl`BO^Jaqzdl`|Ez%y3HTE#{dbqX?j$5k&zQxN?z*CZw+vAZV-WEk=-9oI^ zi>;EFv9pBIbUMsM{{@)yaWwa#nUxs`jEZa5y%dJ~ZYpxpbwF;r5KM9NBrtI6bS49Z z{7GcMaXGAxDfXDD;60Li!JF~fHPwUU&ynr@B*@3ChF52>+Zzj(2PL6C2Mor0xpcaX zJz8ihH2PY@>!))WZIW^vV%K*vW$Xw?vcF2|dP9n=qCP9;7B^IZhW=jxJ&T%Ztkc=ADNzA zsx*6uOG(O5$(&<*ti|J7dW)DtZjKZ4%;`A)POZf?A4Jh3X-N5M*8W<2T>+@m+RM zso4=f_o0cfhnM$+auk~mI=kVgHZ;l-+V`UB8DLApLi~fqxxCu82ZpTHwuvkJ zMaL0c$(fK#3^%@^>W3#TVHR`5ZG3y0Clb5K47#1K#yLmQyhW_55~ZZn&H*`)Kcz#xCRQCFdlucHx%dY1wZPf=tL$KK^-_TTkBlg%SX#-AMe8 zDRJaA`0SE_!0FPPn@x{0rimZQd9k+}88MLx`S?6fu6=l1Y@h3fs<=&*q;z=urTS=C zK%}u|(8k5e&Y-zSmoYb|zD$^cY}p6(t?!f9J6m?2>Tc-Xy34Rp*Ug6P;_=3oS~ z%u;Q7%I5MiGqZ{d!-pEl{0|+1NTm+haNN1M^6$Gh!|V@!B;}D{h3pn(C{xBk%}#IR zO1TK6*^j5|!U4^zB>Fw$Ab?>qDPT1M^Jx#~^C&2cPdIB_0;KSVNk9r$##HLTSD_Z& zz)jE%*Gj)7d9uVMl=+HdJ8%e}9%lwaY;_kEvV>UsLHx;mMC@f3lzq5Iv&y8{w)@Z#?E z$bXT?tyF)?<3bugVVY6(e@Vg`2i>|)$^m~$WioLwW}oXXZ}=w;=N0{LOx0{9*as^Bb{)>T@3m+vEip|GPIJDHTEO0j?I58}) z3~@%Q(7?0uCeHM#BsO=kytmWFVcmtD#HF#V$&{e5iF)nW6D|+WjJvd;&5ukcPLykI zL)z_SO#T-IEgtk{E$oT_$8EEJI%wS_Y2C(F)`01pzGC)%N-d}qrB@+6yelt`_?uuN zPMGYZCo678{Kdb+IPo{#IN(js1Ummj@!l19H8oPMb}r|M+d{D&z2T^r|!8rbRwlE=7j zz{QM`99y%o-F!wvWl#jR$l|ML^ohwPPlBQ~Vi{{yBOjvrhl~uf zK5Vk45;70o*YhtM&7#Sc2dfA3wZq@0ZZ6N~v6zg&MzJl<$ZNrwqf-$TiT@#W`2x6Mt;TiS4huyA5^}YIPTFF^l19VciDe9QgSuo770l zz$Fvs?0FY@_UtE2YE##{%dGmgZHHfzsU_`V*H`P4*F`ul(sYs9Jq*h6rbk1>eD34Z{2K;_cLbZ46halLc ze2%NUKU&GA!WwUqG&=coFm>87tCT*F4xGxo74O@5Y3xJVE!8F_1FP%~BdC2FS9Isf zXuW-CnGh!{^D*Drcrxc3Y`W9=5ZVYqn-rEs?8_&q}IoEx+VFS zRga(VCYV$<=Zq#wk?;b+las#o#HsNw*`FGFDeA^*xQuB(cE3~CcEUYt6MjgdL|p=P z2+pPgOZ0Zk#7FPiJV}Wb={;89-U46uTu_QI1&b)P=+se1|88_^!5Um>o)Nj!lfI}_ zA{$}3*734@W4yItj?m zLJCa$`Rn$L_lRPSglt!uro*Wg-e^WHi@NW8q5zxYdq%ULx=%RZ(Ry~zKFHmgD!x8n_+?xj`!7VyZLb@!Ht zcyvx*=Ox|L<#!iwxI;b}HqA-#(_&c7eI; zh0-~Nl>BWL;lGfbd$~ThM~0`;bnAxA&t^Bg46A9F67?ijVTmmSHXl37dKJH@X%pJ( zv;J34-$9e2BLwPjbgdS-#g6)O&a!wuZ-4?=C;(W1fb*oq3F7!&Q;TDT{dSIuAJ0r( zTYW}1z5Y^?(IYRkcvPK{&UNZ!DTD2NG^^l4v6pZ*x!@0~FW+zs*VWLZvD5?b&529v zzAIr#Blpmqud6Eze&qzM(zwET6WE`YFdmz$)SiInkY`uE9 z2W8d!Z|P-BLFnbp3rcnGlI9P_{}G(V#2CJpq^&-OF7u(-e@`ex!`4!J7AZxIWjne$ z*}p)Oo)D;<^YCfczySXZ)mxzJ%Trh$e@@Xs6YI$UjQXTpMM3=OD}yJh-k2t_G}69%^Fr!Z2HQA5*4M*x@spn| zrheG^IKj0ez3X@*QK}PLKen)$lLlOFZ8tSxuEOsfZ4ZBRv~f7a=7}eY0qYvDhVUkw zZOeCWJKZrO(yrm9v!+wYKhPp+8sVTN>nKBQt1)2z7ZTr41?oJxD3UIFa*^`;bD2FhRFQI1$)e-S7>YM&OE5M83i$Yg1gC4XbSB(3HY$XeKc0w~r|t-}85eyvq znGOcAFmP`I@uNFB6D-U3R7zi&HI?4$T$XBCYp7jyF2hIU++&75Z}~Yj0lG(o!Q{%x zle@H4z=iwQ^%fFV}$@P%l|Q*S||Fc=aU(OuYN7&dFa}V3Nc7J*3pGRNHysT zpl1qYqD}+z4udN>1yr0@uF3~3%~hGND|wBbU_IaPN$MmzOSBa(DV?!lmqJAFWhao7 z6XK-N{+v`HO%=al&V4z}>Sa|@+Qf8!nk9bZMS#vdzl+RDih{^-@~-07nqb7URdH*R+DD=7!&A9Oi{-a*?F%R^?_>z|&W zHQ+4C_b)3pp#^K(qJHO8s1UDOMw^aDYOOebgZD{HMbGVDVk$+=PF2;lVmdaX96DD( z2>^x9360&?xbJ=C?ww+GUzY7mi#yf$i@Zi^^Y}?DA8FLB1O|#d@$jX3gICv(QdzlV&8dxsHV(c+LsK>QTvzU6_ zYb0#5dCxZ%c~~}R7+|_=M1NiJ;GL(M6jlh!W$wT&BZz#^;TRxOvOoC5av{aK*jUdB zEJTT7g$OLq7j%VOxq7lBmjswrMs{Cq4i_QLuY?I-R*l_PX%)WEauEF6LE{{cM%g#Z zY=g9-pHTq4-?B_^ws)ot(CdUT(Q;?3ZgB%&0-LSJk}S~oODd0f;gmE$LNlWC)*SZw zTF2tWUDe>}3GAgFzfUW{@fr-5%+TXNF!#@u3xLK#M@{^pJ@RwHxR(mQv$rbM^u)yF zp7gc4+^-scO=w4GnLoUHm&|*G%B4)zdnT-@sLAXD{t?qVWoK?M#QmO7ZDZYumcROM zT0RXq?@|A$uOb2&0IX>Ab9ty?U)lM3)bo7LPM+d~0IDZ9U)9X4Pt|IhEccrc4$Yqg zxN&t9niz^0H@V{LX*57HW5=4LcVn`mZrtz!m-E4LWa#a&|ZE=ZeR z_be>uWC0uQotqmp(+ySAn|+s`Jh^?c#?)U-^^qVEROY9akEY4F$EfL{d=!)6%BG-- zzxb^*e?e$Rf1Wl1QT?k8F>OCoXwv?=Ung`f@oR`*z|{D)G%5h9(2EXaoVg^$f5Zm< zKZTunJXG!9$1R~Oja|ej${K1yXo$j8_FcA;rjQxV!J)?|Gj8yk6(bnRAXg-|KsQuFvOvU}1Q)$#BKFf7rFv3#c^C6nuM& zOO0Gft$Kq{^uZk+fBQMx4ywF#eZ10jN%@}^6Trc3hCtkr5v?qLPeTBZoa}i>5KfE4m^W45!H&tNIy2!R)_bi2pfs)oyorVbu+nl5 ziVqIJzcjU0;LWSXA>n4vmdvWwz`nJ(vB0=#2PO^BiHo&%ecgXrM@U_;#^7aMCflK* zu?J85J`Tl@CXG@Gz9}c1FQwCP4okOwbBpS37P8a>qfV`z9k+`X5YFPzTfu%UP!6y`Fvr_P9?4V5;X6Bf8{U9#rCkAZ zM&uVB!n66B@`9(+a&}!KKRfCf^oQNN+6$^tHoMIK!>*$7-0ZFr=x>*b-P5X-LgxBY zo2Ug*pNH%q>8qqJmtk=~7g&DYcueN3PcuE3&z~%j0gUYgSS9wn57tV0QdV~{+bxEnx{U^j4&k6Tg_t{mX$_Yq$xe=@q|jc4#`MB^ zJT!tidMB9LT+XqKk3JFN=!_dS0?dknKn##1>;EeT2o)}9LyEIBz=e4SFuw9d_vq)Y znKx|vFBXdWkaNz_)-AYMGNnQ9zLj_f%C}~7N!N>u)Lf+CfEIdIU7czh$QbcAide4T zZQJy*?<2fUv(SP%PV21I_X1kz7G8vO5oI)0xCIvcYt6{A`!}bwQlGSad^&0sE+dig ztCN-J!D2iYgG*FJ2{BPzy1^u&y=FXDd67a8y7BGP|L)Sh_Z*1ci7meUFD~utdnA|k z%FkshXa7&|yHfQ-cZaL9*88w++@nx&uAPsEVL*=wVw{~gi>(snR7!xUfN3m@nIRqe z$bxi@pG5F$L=in`nIEOo82`J5h_9j*7~_4)pr(1ea&G+SOCoJiMKDK#1^!`Tmo zu(KAj$s(@Ez}~eSFWD$y#q zslU<&-b60sArh0MhfMd8Ut(rM_CQZ8FfKQivy3;fi)0|#R9eO4o~zDAw8`&mCJBRl zL+V<9>B#dX+=Ch6E=t$PUla#aJlOiq<<`$o@7t~|m@_8YX~f5JPr8|q*x0k}KKaw) zlj4s{p!Bb0(O2I@&cJP`BT4v(=^IBCC}>G;6Pl`dvTGO(u1uHZFzBch#Oi5#?{oUA zMDhff&?FU9`${$qfOt^aXNUDLXp}!L8o++(*YdqI@rZ`e_9q$WGiZtk%BdwBGNUQLOvKhbHU?bZL0ypyF6t66gl zm;}?$LvW7=cpykxJulrHg1_Tybvk9?!FUgQFW7)ZjiG5RKh5P)A-N+a_IR~*prd%Jub(3dwV#iE zEZRnitmR!zrZDwcFZbI$fi zpQ#2NyF^|ZZxhg}_2{p|uY5RbnD8K6ZJ*(Qw2)?}wekp&yaRA|Qo#DxsS?SeI+jqSMG)is9$_pX3e;QRCk`w z6Eyf}-+>ptnm-5fB$ja02cI*FiDNlWz6!au(Hs}CGqc@Mmic~|=QFFJrG1@1hjtXy z4~e%c+1cVu*QrSvt}^-J7&3CYOFA(;0v#pDtP1!!v4p;BvW*`n{US>q(dX{NUrV`ti>sUd7L3MP0-oP`aRTgYw5brGKhov{JH8&ZnR)OJ2X6Hj z*N%E-g5%w9Tu(o3p@Ox209&F)dqM|)8ypzq@>_T7)U{4lXM#FbS?FxaC!G^bZMM9+ z4tmuQbQP|}fWbv^^L6{ks3C9Ej)`TTPs7Rx%f;*+b8A$!FHS$N0rHb7YlE-;Os=Pr zQ{twGcgc=sfxFbo@AZ<0v(i)mIIN>SayZmhz4f%!>5C|cW!)L%h17s1v)z*m@qbN( zLIG`HP@`-xc!<{bo61SZlQWVZ1OuYl!Sb-gF-ru;V-o?-65R4%f%6Z;4dlCb<*tm4 zT`7ejX`!VvI;>13$7YHQz%+8p7l(Tpo$_JB4f^W={o?Bv;zK3iLCjqj{gvE5lo;fd zHH{q|VzJ(ecLFb~dW44K((lhkhDQ$2inQ@ZcRq7Y>-^*1b>gOVEt)4}ovdHpbt^K@ z|3sf`Dm|bJwcZkK{pP34+PPS-&Y(HzYpQh%%*U0(ohJ^qYv&SPhZse79v3M#nTUb? zTTjUjU*9&)0S1{kUx6pKuPYG_c~z}evFZy5xUz{>?k8wd2OGRLnS6!W@2E;KWyJGkUt&UFTh*2NVjj=kW%jj~V001z!4 z=ACav4hf=_2vC25z)FK{a-HCIF%1b@(>NH^N7$**yWUBYO61yA32R`g-kGrQqT2&s zZ1aW~`>zx~03Uhl@0bL?Vul+mpc)cp64nzfU1rpi*eG&?8WU7Xl4Pf1!!_iKpK_${ zC;xLY0h})InNl8x8hkL6Jpz7odsa%}^mCw|17HWPhf{dC+kQ}x((i~n?<}jL=p9a@ z<9^KPtHyuVYuBL`*B7H;P2iVO8ICwx_P&$c40y;=GC7R)u@F`J-|`;#me&bZ9#xFU zJg^Th!=rFfc{Bw+ujIxWBM>U0T(6i0?6X&W^QWn?a#<*foA?<)RQJ+am_wkw5~pN- z7sfTpB>PChT4dEn1d;2VMl0o-hg^bZeAQZSZ%fT*?fK_jkzO;p1^Kn_+yjstFP#ra zNvx;BrMYSMj?`B;0sS zFuJaW4L~Ou?IWxSIxyrDP0$laaSx}5DtUOzHO?=y^m2JYfcOG)&~ws}entE=bCT7$ z=#rYt?lU1eR^i}WaqU8Z0rKPflqR^`l!q|k(Zo+khOK+ubx;hXEPh&3dhXVaKhK_5 zEWuW;iN*%L+&b5&xM}Dl-pY8w8~S%KsSYAxoEeE0RatjS6)vupzw^Mi4zR4J9^a9vEO zGsL1|=&T;B!-Hc|XANCOT4+&_Am}oQeN;)!5I#Ng%dGfD89Z`xzBJfQ5Uq?0g3AeUS9@IhE|>w~}OV)8>HvkoV#COPN{LT#vk8 zt2Z)j@{a(~lW*kv*4-rOL6sffa^(OAYdJ-0AsgF9gwSQe2wH&X@4yh*TSHt#%TNt1(?*1p$1*$&WoXj%(3D- zcQ5QJ#PkYUg9UjMs?vZCI$TX&{X=JmqECeM2>uCx|CpLx$`!gYuDe(vVX}YRkFG^k zURe>tw{_d=^mg9nvS?KtpkI=2?(iG$tPXR5QosdvzxGoCt z$$I=Gfzpq+2F3?10L^~%hk|tHo!byiu28i+0-PzrVDKCekd-_eW}(>Fp}Ancc191J z%LV{ozGVXd7!U|yD)X?cRj`u12B#u~Q22#>5x;tCwV54R+A8Kzk+(poe&f<5a*v*K zT2oU&Cy_LPGej(sedjw!v3{YylrY}sxYF)>cfp<-T!xEu)CFu&YJe?D)I%N!%*L!8 zEi#ZVi4r-oMksMF`zOoUUiq(+KVL}Vgk4zs|M2{i%LBzJSShuf5=6EJK+gfbJ})q= zG0GhyJ>s|)s`}>jgj5{06DiB8;CT5#UeEFuCDRNU65yFEh+SOUYPR?{idoz^hcctc z&442k_wYk5d(L7ZTKmy)4^n0o##7c6!_jl_B86&KbNSP0;&tq_AS1DeI66n%PR*pX zi2%0k-ZNP@3`AaRb)vJ?W}XEv*Z1a+PPd6tY;c0IY-s0=Iw-*C*soU) zC=bBofdMQRHt;f`m;%bDO+Q@6&hS8dvdDDe(V_H-k2t&!J`FL&9w2#0bHLqd5+>n8)4e;ua%TPUO&4#d!TjvD`IHe+m+wqABkj zoNs5r+GI!s>cQZx77EF%7%V;lk~d43R$%h9**@|sc6SSR>J07Anld(@sT0nyR>Qu_ zPhkc@Fj;M*AKsf3%f|p*H1HyY%3g7T%cCKt?y8k0=-`j0laL`{!mVH11jZ{=3)Zbo z21^05#asw*jiv?Hew&@KV*;teNz-jz?UZ2y0k!l8DBW^9Rj~0!uD>Ft|27Lg;_|N} z*?vvL_xnuig>$EG@^@kLoJ?zdbt0stXU1YVLJO_W zCv!h-*}a>}{Q3SZv`DX6-2%p&B;T>R%A72KsxXP5VK54m2trhI`mBmx(#zV{ zInu6zS{==2l?XBO^i7UsOK?Fk{?ekyEXECjxn| ze`kRpJim|8Q}?3d(XG1>vcoX%zs<(_g-QWYTElLe@&5AL%%^F!{2#PFiop zRz~d(ix56>b@e=g)qGNk>2`{de6Q_WxRCIF*6yQFR#bxy#Qy{EQ~~2n-V>tkL{`UY z&0Rmmuj2DpeT)jObl<7A@des_b`d1V25nwoq~e9M<^f>hHSU>co8g(*{m}-YwofiI z-mkS=3Wl~O+8MFVW{YqX8E6K**_pPc`QNK@m~X8Hg&Kle5qX4L!dd6!IWdLU*Nlkc zGiH(n$H6or(h^BfuCPB&?kP`30z;2(u1 zR+FQfD9dIbldYlRvSLo87bRrF5U656yei7F$Z+uFv&!-!9(3wD{QY)By0oUJmuQ{- zU}FV=;Y7LSZ1uxnRdzVY10dxWlIkcKoJet_HxrwC@n~W6^hFyQekJ5|pV<4XQj zka1?kZLfD%g`ld(`_Jln6>AAWt9jnwML-$NI@O($<9KJ{W`C%l?Zl4-L0J7Mr!-?21u}Dy5k;D zu}!eeZ*3?R;L}9xDghYu?{zNJxF-U5o>7it>+~T~$v2ua{;7P)^J*yJ6~TT02(a@l_L<@JIZo3wOYJ9t9BNNUnvpIZ184_1fah;Vh@r1saB z^4y@`7jq3dxmVlsiow+%)C~5)FovY6v>3pvw$J%t@r@7cp&Ec@j$@T1u-i81-!`X5 z*u0~!^hDZq+7k7};*;b~0?h1x(q(|(>8OIVD1hr(THoGWk=iwDyIPzQf69sA=(J+o zn#EcLV}QPlry2xM(Oe*&QuTxz|DO({_ui&T9ig&XSsUK?V&dy)5>MGnr6uw&*J)SR z4O5d0C2t!+(VG{Y3fFU3G4!F~;z`0^Zy$VT zlJGjGSF&$3BUtfc03n5Fp1KQfb~InA&8`q*1q&GG=||Hzpy6L2H1f*;LpyQht{w?} zDZ2kUk>FaSr)>&iD|Z|7sH6U!z%}z@JhB~OedrN<`}Lfq^UV}Y43>cn?*zZ0AOM2< zpX5w(`QSQaEYTvqHz~=NXHUjQf0o%dBkQfeAN31lR&xxOEgYHTdZp%bVXN280=Ana z^M=FH$n=5rl?&BI)^08Qe_`>YwGkkoEIR+Kv^%~Pb0k^b?3|sA#qp8cs#eTueeM2Q zRw=0&M&6mX$~YF!Y0ZBc@63#c7`f!9BKSXd@Voc{RoLU+XN*d^;RK${8T?=LBS%Bk z&gk{var Ce=Object.create;var J=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,_e=Object.prototype.hasOwnProperty;var Me=t=>J(t,"__esModule",{value:!0});var $e=typeof require!="undefined"?require:t=>{throw new Error('Dynamic require of "'+t+'" is not supported')};var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Oe(e))!_e.call(t,n)&&n!=="default"&&J(t,n,{get:()=>e[n],enumerable:!(r=Pe(e,n))||r.enumerable});return t},Ae=t=>De(Me(J(t!=null?Ce(Re(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var de=Fe((ue,he)=>{(function(){var t=function(e){var r=new t.Builder;return r.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),r.searchPipeline.add(t.stemmer),e.call(r,r),r.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(r){e.console&&console.warn&&console.warn(r)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var r=Object.create(null),n=Object.keys(e),i=0;i0){var h=t.utils.clone(r)||{};h.position=[a,l],h.index=s.length,s.push(new t.Token(n.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,r){r in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+r),e.label=r,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var r=e.label&&e.label in this.registeredFunctions;r||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var r=new t.Pipeline;return e.forEach(function(n){var i=t.Pipeline.registeredFunctions[n];if(i)r.add(i);else throw new Error("Cannot load unregistered function: "+n)}),r},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(r){t.Pipeline.warnIfFunctionNotRegistered(r),this._stack.push(r)},this)},t.Pipeline.prototype.after=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");n=n+1,this._stack.splice(n,0,r)},t.Pipeline.prototype.before=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");this._stack.splice(n,0,r)},t.Pipeline.prototype.remove=function(e){var r=this._stack.indexOf(e);r!=-1&&this._stack.splice(r,1)},t.Pipeline.prototype.run=function(e){for(var r=this._stack.length,n=0;n1&&(oe&&(n=s),o!=e);)i=n-r,s=r+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(oc?h+=2:a==c&&(r+=n[l+1]*i[h+1],l+=2,h+=2);return r},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),r=1,n=0;r0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}if(s.str.length==0&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),f=s.str.charAt(1),v;f in s.node.edges?v=s.node.edges[f]:(v=new t.TokenSet,s.node.edges[f]=v),s.str.length==1&&(v.final=!0),i.push({node:v,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return n},t.TokenSet.fromString=function(e){for(var r=new t.TokenSet,n=r,i=0,s=e.length;i=e;r--){var n=this.uncheckedNodes[r],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(r){var n=new t.QueryParser(e,r);n.parse()})},t.Index.prototype.query=function(e){for(var r=new t.Query(this.fields),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),c=0;c1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,r){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,r;do e=this.next(),r=e.charCodeAt(0);while(r>47&&r<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var r=e.next();if(r==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(r.charCodeAt(0)==92){e.escapeCharacter();continue}if(r==":")return t.QueryLexer.lexField;if(r=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(r=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(r=="+"&&e.width()===1||r=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(r.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,r){this.lexer=new t.QueryLexer(e),this.query=r,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var r=e.peekLexeme();if(r!=null)switch(r.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(n+=" with value '"+r.str+"'"),new t.QueryParseError(n,r.start,r.end)}},t.QueryParser.parsePresence=function(e){var r=e.consumeLexeme();if(r!=null){switch(r.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+r.str+"'";throw new t.QueryParseError(n,r.start,r.end)}var i=e.peekLexeme();if(i==null){var n="expecting term or field, found nothing";throw new t.QueryParseError(n,r.start,r.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(n,i.start,i.end)}}},t.QueryParser.parseField=function(e){var r=e.consumeLexeme();if(r!=null){if(e.query.allFields.indexOf(r.str)==-1){var n=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+r.str+"', possible fields: "+n;throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.fields=[r.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,r.start,r.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var r=e.consumeLexeme();if(r!=null){e.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(n==null){e.nextClause();return}switch(n.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new t.QueryParseError(i,n.start,n.end)}}},t.QueryParser.parseEditDistance=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.editDistance=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="boost must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.boost=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,r){typeof define=="function"&&define.amd?define(r):typeof ue=="object"?he.exports=r():e.lunr=r()}(this,function(){return t})})()});var le=[];function N(t,e){le.push({selector:e,constructor:t})}var X=class{constructor(){this.createComponents(document.body)}createComponents(e){le.forEach(r=>{e.querySelectorAll(r.selector).forEach(n=>{n.dataset.hasInstance||(new r.constructor({el:n}),n.dataset.hasInstance=String(!0))})})}};var Q=class{constructor(e){this.el=e.el}};var Z=class{constructor(){this.listeners={}}addEventListener(e,r){e in this.listeners||(this.listeners[e]=[]),this.listeners[e].push(r)}removeEventListener(e,r){if(!(e in this.listeners))return;let n=this.listeners[e];for(let i=0,s=n.length;i{let r=Date.now();return(...n)=>{r+e-Date.now()<0&&(t(...n),r=Date.now())}};var ee=class extends Z{constructor(){super();this.scrollTop=0;this.lastY=0;this.width=0;this.height=0;this.showToolbar=!0;this.toolbar=document.querySelector(".tsd-page-toolbar"),this.secondaryNav=document.querySelector(".tsd-navigation.secondary"),window.addEventListener("scroll",K(()=>this.onScroll(),10)),window.addEventListener("resize",K(()=>this.onResize(),10)),this.onResize(),this.onScroll()}triggerResize(){let e=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(e)}onResize(){this.width=window.innerWidth||0,this.height=window.innerHeight||0;let e=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(e)}onScroll(){this.scrollTop=window.scrollY||0;let e=new CustomEvent("scroll",{detail:{scrollTop:this.scrollTop}});this.dispatchEvent(e),this.hideShowToolbar()}hideShowToolbar(){let e=this.showToolbar;this.showToolbar=this.lastY>=this.scrollTop||this.scrollTop<=0,e!==this.showToolbar&&(this.toolbar.classList.toggle("tsd-page-toolbar--hide"),this.secondaryNav.classList.toggle("tsd-navigation--toolbar-hide")),this.lastY=this.scrollTop}},I=ee;I.instance=new ee;var te=class extends Q{constructor(e){super(e);this.anchors=[];this.index=-1;I.instance.addEventListener("resize",()=>this.onResize()),I.instance.addEventListener("scroll",r=>this.onScroll(r)),this.createAnchors()}createAnchors(){let e=window.location.href;e.indexOf("#")!=-1&&(e=e.substr(0,e.indexOf("#"))),this.el.querySelectorAll("a").forEach(r=>{let n=r.href;if(n.indexOf("#")==-1||n.substr(0,e.length)!=e)return;let i=n.substr(n.indexOf("#")+1),s=document.querySelector("a.tsd-anchor[name="+i+"]"),o=r.parentNode;!s||!o||this.anchors.push({link:o,anchor:s,position:0})}),this.onResize()}onResize(){let e;for(let n=0,i=this.anchors.length;nn.position-i.position);let r=new CustomEvent("scroll",{detail:{scrollTop:I.instance.scrollTop}});this.onScroll(r)}onScroll(e){let r=e.detail.scrollTop+5,n=this.anchors,i=n.length-1,s=this.index;for(;s>-1&&n[s].position>r;)s-=1;for(;s-1&&this.anchors[this.index].link.classList.remove("focus"),this.index=s,this.index>-1&&this.anchors[this.index].link.classList.add("focus"))}};var ce=(t,e=100)=>{let r;return(...n)=>{clearTimeout(r),r=setTimeout(()=>t(n),e)}};var pe=Ae(de());function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e=document.getElementById("search-script");t.classList.add("loading"),e&&(e.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),e.addEventListener("load",()=>{t.classList.remove("loading"),t.classList.add("ready")}),window.searchData&&t.classList.remove("loading"));let r=document.querySelector("#tsd-search input"),n=document.querySelector("#tsd-search .results");if(!r||!n)throw new Error("The input field or the result list wrapper was not found");let i=!1;n.addEventListener("mousedown",()=>i=!0),n.addEventListener("mouseup",()=>{i=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{i||(i=!1,t.classList.remove("has-focus"))});let s={base:t.dataset.base+"/"};Ve(t,n,r,s)}function Ve(t,e,r,n){r.addEventListener("input",ce(()=>{ze(t,e,r,n)},200));let i=!1;r.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ne(e,r):s.key=="Escape"?r.blur():s.key=="ArrowUp"?me(e,-1):s.key==="ArrowDown"?me(e,1):i=!1}),r.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!r.matches(":focus")&&s.key==="/"&&(r.focus(),s.preventDefault())})}function He(t,e){t.index||window.searchData&&(e.classList.remove("loading"),e.classList.add("ready"),t.data=window.searchData,t.index=pe.Index.load(window.searchData.index))}function ze(t,e,r,n){if(He(n,t),!n.index||!n.data)return;e.textContent="";let i=r.value.trim(),s=n.index.search(`*${i}*`);for(let o=0,a=Math.min(10,s.length);o${ve(c.parent,i)}.${l}`);let h=document.createElement("li");h.classList.value=c.classes;let f=document.createElement("a");f.href=n.base+c.url,f.classList.add("tsd-kind-icon"),f.innerHTML=l,h.append(f),e.appendChild(h)}}function me(t,e){let r=t.querySelector(".current");if(!r)r=t.querySelector(e==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let n=r;if(e===1)do n=n.nextElementSibling;while(n instanceof HTMLElement&&n.offsetParent==null);else do n=n.previousElementSibling;while(n instanceof HTMLElement&&n.offsetParent==null);n&&(r.classList.remove("current"),n.classList.add("current"))}}function Ne(t,e){let r=t.querySelector(".current");if(r||(r=t.querySelector("li:first-child")),r){let n=r.querySelector("a");n&&(window.location.href=n.href),e.blur()}}function ve(t,e){if(e==="")return t;let r=t.toLocaleLowerCase(),n=e.toLocaleLowerCase(),i=[],s=0,o=r.indexOf(n);for(;o!=-1;)i.push(re(t.substring(s,o)),`${re(t.substring(o,o+n.length))}`),s=o+n.length,o=r.indexOf(n,s);return i.push(re(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function re(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var ge=class{constructor(e,r){this.signature=e,this.description=r}addClass(e){return this.signature.classList.add(e),this.description.classList.add(e),this}removeClass(e){return this.signature.classList.remove(e),this.description.classList.remove(e),this}},ne=class extends Q{constructor(e){super(e);this.groups=[];this.index=-1;this.createGroups(),this.container&&(this.el.classList.add("active"),Array.from(this.el.children).forEach(r=>{r.addEventListener("touchstart",n=>this.onClick(n)),r.addEventListener("click",n=>this.onClick(n))}),this.container.classList.add("active"),this.setIndex(0))}setIndex(e){if(e<0&&(e=0),e>this.groups.length-1&&(e=this.groups.length-1),this.index==e)return;let r=this.groups[e];if(this.index>-1){let n=this.groups[this.index];n.removeClass("current").addClass("fade-out"),r.addClass("current"),r.addClass("fade-in"),I.instance.triggerResize(),setTimeout(()=>{n.removeClass("fade-out"),r.removeClass("fade-in")},300)}else r.addClass("current"),I.instance.triggerResize();this.index=e}createGroups(){let e=this.el.children;if(e.length<2)return;this.container=this.el.nextElementSibling;let r=this.container.children;this.groups=[];for(let n=0;n{r.signature===e.currentTarget&&this.setIndex(n)})}};var C="mousedown",ye="mousemove",_="mouseup",G={x:0,y:0},xe=!1,ie=!1,Be=!1,A=!1,Le=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Le?"is-mobile":"not-mobile");Le&&"ontouchstart"in document.documentElement&&(Be=!0,C="touchstart",ye="touchmove",_="touchend");document.addEventListener(C,t=>{ie=!0,A=!1;let e=C=="touchstart"?t.targetTouches[0]:t;G.y=e.pageY||0,G.x=e.pageX||0});document.addEventListener(ye,t=>{if(!!ie&&!A){let e=C=="touchstart"?t.targetTouches[0]:t,r=G.x-(e.pageX||0),n=G.y-(e.pageY||0);A=Math.sqrt(r*r+n*n)>10}});document.addEventListener(_,()=>{ie=!1});document.addEventListener("click",t=>{xe&&(t.preventDefault(),t.stopImmediatePropagation(),xe=!1)});var se=class extends Q{constructor(e){super(e);this.className=this.el.dataset.toggle||"",this.el.addEventListener(_,r=>this.onPointerUp(r)),this.el.addEventListener("click",r=>r.preventDefault()),document.addEventListener(C,r=>this.onDocumentPointerDown(r)),document.addEventListener(_,r=>this.onDocumentPointerUp(r))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let r=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(r),setTimeout(()=>document.documentElement.classList.remove(r),500)}onPointerUp(e){A||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-menu, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!A&&this.active&&e.target.closest(".col-menu")){let r=e.target.closest("a");if(r){let n=window.location.href;n.indexOf("#")!=-1&&(n=n.substr(0,n.indexOf("#"))),r.href.substr(0,n.length)==n&&setTimeout(()=>this.setActive(!1),250)}}}};var oe=class{constructor(e,r){this.key=e,this.value=r,this.defaultValue=r,this.initialize(),window.localStorage[this.key]&&this.setValue(this.fromLocalStorage(window.localStorage[this.key]))}initialize(){}setValue(e){if(this.value==e)return;let r=this.value;this.value=e,window.localStorage[this.key]=this.toLocalStorage(e),this.handleValueChange(r,e)}},ae=class extends oe{initialize(){let e=document.querySelector("#tsd-filter-"+this.key);!e||(this.checkbox=e,this.checkbox.addEventListener("change",()=>{this.setValue(this.checkbox.checked)}))}handleValueChange(e,r){!this.checkbox||(this.checkbox.checked=this.value,document.documentElement.classList.toggle("toggle-"+this.key,this.value!=this.defaultValue))}fromLocalStorage(e){return e=="true"}toLocalStorage(e){return e?"true":"false"}},Ee=class extends oe{initialize(){document.documentElement.classList.add("toggle-"+this.key+this.value);let e=document.querySelector("#tsd-filter-"+this.key);if(!e)return;this.select=e;let r=()=>{this.select.classList.add("active")},n=()=>{this.select.classList.remove("active")};this.select.addEventListener(C,r),this.select.addEventListener("mouseover",r),this.select.addEventListener("mouseleave",n),this.select.querySelectorAll("li").forEach(i=>{i.addEventListener(_,s=>{e.classList.remove("active"),this.setValue(s.target.dataset.value||"")})}),document.addEventListener(C,i=>{this.select.contains(i.target)||this.select.classList.remove("active")})}handleValueChange(e,r){this.select.querySelectorAll("li.selected").forEach(s=>{s.classList.remove("selected")});let n=this.select.querySelector('li[data-value="'+r+'"]'),i=this.select.querySelector(".tsd-select-label");n&&i&&(n.classList.add("selected"),i.textContent=n.textContent),document.documentElement.classList.remove("toggle-"+e),document.documentElement.classList.add("toggle-"+r)}fromLocalStorage(e){return e}toLocalStorage(e){return e}},Y=class extends Q{constructor(e){super(e);this.optionVisibility=new Ee("visibility","private"),this.optionInherited=new ae("inherited",!0),this.optionExternals=new ae("externals",!0)}static isSupported(){try{return typeof window.localStorage!="undefined"}catch(e){return!1}}};function be(t){let e=localStorage.getItem("tsd-theme")||"os";t.value=e,we(e),t.addEventListener("change",()=>{localStorage.setItem("tsd-theme",t.value),we(t.value)})}function we(t){switch(t){case"os":document.body.classList.remove("light","dark");break;case"light":document.body.classList.remove("dark"),document.body.classList.add("light");break;case"dark":document.body.classList.remove("light"),document.body.classList.add("dark");break}}fe();N(te,".menu-highlight");N(ne,".tsd-signatures");N(se,"a[data-toggle]");Y.isSupported()?N(Y,"#tsd-filter"):document.documentElement.classList.add("no-filter");var Te=document.getElementById("theme");Te&&be(Te);var qe=new X;Object.defineProperty(window,"app",{value:qe});})(); -/*! - * lunr.Builder - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Index - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Pipeline - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Set - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.TokenSet - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.Vector - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.stemmer - * Copyright (C) 2020 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - */ -/*! - * lunr.stopWordFilter - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.tokenizer - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.trimmer - * Copyright (C) 2020 Oliver Nightingale - */ -/*! - * lunr.utils - * Copyright (C) 2020 Oliver Nightingale - */ -/** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 - * Copyright (C) 2020 Oliver Nightingale - * @license MIT - */ diff --git a/docs/assets/search.js b/docs/assets/search.js deleted file mode 100644 index 182a216..0000000 --- a/docs/assets/search.js +++ /dev/null @@ -1 +0,0 @@ -window.searchData = {"kinds":{"32":"Variable","128":"Class","512":"Constructor","1024":"Property","2048":"Method"},"rows":[{"id":0,"kind":128,"name":"Vector","url":"classes/Vector.html","classes":"tsd-kind-class"},{"id":1,"kind":2048,"name":"add","url":"classes/Vector.html#add","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"Vector"},{"id":2,"kind":2048,"name":"subtract","url":"classes/Vector.html#subtract","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"Vector"},{"id":3,"kind":2048,"name":"multiply","url":"classes/Vector.html#multiply","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"Vector"},{"id":4,"kind":2048,"name":"divide","url":"classes/Vector.html#divide","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"Vector"},{"id":5,"kind":2048,"name":"scale","url":"classes/Vector.html#scale","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"Vector"},{"id":6,"kind":2048,"name":"round","url":"classes/Vector.html#round","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"Vector"},{"id":7,"kind":2048,"name":"len","url":"classes/Vector.html#len","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"Vector"},{"id":8,"kind":2048,"name":"distance","url":"classes/Vector.html#distance","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"Vector"},{"id":9,"kind":2048,"name":"centroid","url":"classes/Vector.html#centroid","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"Vector"},{"id":10,"kind":2048,"name":"radius","url":"classes/Vector.html#radius","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"Vector"},{"id":11,"kind":512,"name":"constructor","url":"classes/Vector.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"Vector"},{"id":12,"kind":1024,"name":"x","url":"classes/Vector.html#x","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Vector"},{"id":13,"kind":1024,"name":"y","url":"classes/Vector.html#y","classes":"tsd-kind-property tsd-parent-kind-class","parent":"Vector"},{"id":14,"kind":128,"name":"CanvasKit","url":"classes/CanvasKit.html","classes":"tsd-kind-class"},{"id":15,"kind":2048,"name":"hook","url":"classes/CanvasKit.html#hook","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"CanvasKit"},{"id":16,"kind":2048,"name":"replace","url":"classes/CanvasKit.html#replace","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"CanvasKit"},{"id":17,"kind":2048,"name":"hookRAF","url":"classes/CanvasKit.html#hookRAF","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"CanvasKit"},{"id":18,"kind":2048,"name":"createCanvas","url":"classes/CanvasKit.html#createCanvas","classes":"tsd-kind-method tsd-parent-kind-class tsd-is-static","parent":"CanvasKit"},{"id":19,"kind":512,"name":"constructor","url":"classes/CanvasKit.html#constructor","classes":"tsd-kind-constructor tsd-parent-kind-class","parent":"CanvasKit"},{"id":20,"kind":32,"name":"gamepad","url":"modules.html#gamepad","classes":"tsd-kind-variable"},{"id":21,"kind":32,"name":"game","url":"modules.html#game","classes":"tsd-kind-variable"},{"id":22,"kind":32,"name":"minimap","url":"modules.html#minimap","classes":"tsd-kind-variable"},{"id":23,"kind":32,"name":"arena","url":"modules.html#arena","classes":"tsd-kind-variable"},{"id":24,"kind":32,"name":"arenaScaling","url":"modules.html#arenaScaling","classes":"tsd-kind-variable"},{"id":25,"kind":32,"name":"player","url":"modules.html#player","classes":"tsd-kind-variable"},{"id":26,"kind":32,"name":"entityManager","url":"modules.html#entityManager","classes":"tsd-kind-variable"}],"index":{"version":"2.3.9","fields":["name","parent"],"fieldVectors":[["name/0",[0,6.581]],["parent/0",[]],["name/1",[1,29.267]],["parent/1",[0,0.546]],["name/2",[2,29.267]],["parent/2",[0,0.546]],["name/3",[3,29.267]],["parent/3",[0,0.546]],["name/4",[4,29.267]],["parent/4",[0,0.546]],["name/5",[5,29.267]],["parent/5",[0,0.546]],["name/6",[6,29.267]],["parent/6",[0,0.546]],["name/7",[7,29.267]],["parent/7",[0,0.546]],["name/8",[8,29.267]],["parent/8",[0,0.546]],["name/9",[9,29.267]],["parent/9",[0,0.546]],["name/10",[10,29.267]],["parent/10",[0,0.546]],["name/11",[11,24.159]],["parent/11",[0,0.546]],["name/12",[12,29.267]],["parent/12",[0,0.546]],["name/13",[13,29.267]],["parent/13",[0,0.546]],["name/14",[14,14.604]],["parent/14",[]],["name/15",[15,29.267]],["parent/15",[14,1.212]],["name/16",[16,29.267]],["parent/16",[14,1.212]],["name/17",[17,29.267]],["parent/17",[14,1.212]],["name/18",[18,29.267]],["parent/18",[14,1.212]],["name/19",[11,24.159]],["parent/19",[14,1.212]],["name/20",[19,29.267]],["parent/20",[]],["name/21",[20,29.267]],["parent/21",[]],["name/22",[21,29.267]],["parent/22",[]],["name/23",[22,29.267]],["parent/23",[]],["name/24",[23,29.267]],["parent/24",[]],["name/25",[24,29.267]],["parent/25",[]],["name/26",[25,29.267]],["parent/26",[]]],"invertedIndex":[["add",{"_index":1,"name":{"1":{}},"parent":{}}],["arena",{"_index":22,"name":{"23":{}},"parent":{}}],["arenascaling",{"_index":23,"name":{"24":{}},"parent":{}}],["canvaskit",{"_index":14,"name":{"14":{}},"parent":{"15":{},"16":{},"17":{},"18":{},"19":{}}}],["centroid",{"_index":9,"name":{"9":{}},"parent":{}}],["constructor",{"_index":11,"name":{"11":{},"19":{}},"parent":{}}],["createcanvas",{"_index":18,"name":{"18":{}},"parent":{}}],["distance",{"_index":8,"name":{"8":{}},"parent":{}}],["divide",{"_index":4,"name":{"4":{}},"parent":{}}],["entitymanager",{"_index":25,"name":{"26":{}},"parent":{}}],["game",{"_index":20,"name":{"21":{}},"parent":{}}],["gamepad",{"_index":19,"name":{"20":{}},"parent":{}}],["hook",{"_index":15,"name":{"15":{}},"parent":{}}],["hookraf",{"_index":17,"name":{"17":{}},"parent":{}}],["len",{"_index":7,"name":{"7":{}},"parent":{}}],["minimap",{"_index":21,"name":{"22":{}},"parent":{}}],["multiply",{"_index":3,"name":{"3":{}},"parent":{}}],["player",{"_index":24,"name":{"25":{}},"parent":{}}],["radius",{"_index":10,"name":{"10":{}},"parent":{}}],["replace",{"_index":16,"name":{"16":{}},"parent":{}}],["round",{"_index":6,"name":{"6":{}},"parent":{}}],["scale",{"_index":5,"name":{"5":{}},"parent":{}}],["subtract",{"_index":2,"name":{"2":{}},"parent":{}}],["vector",{"_index":0,"name":{"0":{}},"parent":{"1":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{},"10":{},"11":{},"12":{},"13":{}}}],["x",{"_index":12,"name":{"12":{}},"parent":{}}],["y",{"_index":13,"name":{"13":{}},"parent":{}}]],"pipeline":[]}} \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css deleted file mode 100644 index 2e409a9..0000000 --- a/docs/assets/style.css +++ /dev/null @@ -1,1341 +0,0 @@ -@import url("./icons.css"); - -:root { - /* Light */ - --light-color-background: #fcfcfc; - --light-color-secondary-background: #fff; - --light-color-text: #222; - --light-color-text-aside: #707070; - --light-color-link: #4da6ff; - --light-color-menu-divider: #eee; - --light-color-menu-divider-focus: #000; - --light-color-menu-label: #707070; - --light-color-panel: var(--light-color-secondary-background); - --light-color-panel-divider: #eee; - --light-color-comment-tag: #707070; - --light-color-comment-tag-text: #fff; - --light-color-ts: #9600ff; - --light-color-ts-interface: #647f1b; - --light-color-ts-enum: #937210; - --light-color-ts-class: #0672de; - --light-color-ts-private: #707070; - --light-color-toolbar: #fff; - --light-color-toolbar-text: #333; - --light-icon-filter: invert(0); - --light-external-icon: url("data:image/svg+xml;utf8,"); - - /* Dark */ - --dark-color-background: #36393f; - --dark-color-secondary-background: #2f3136; - --dark-color-text: #ffffff; - --dark-color-text-aside: #e6e4e4; - --dark-color-link: #00aff4; - --dark-color-menu-divider: #eee; - --dark-color-menu-divider-focus: #000; - --dark-color-menu-label: #707070; - --dark-color-panel: var(--dark-color-secondary-background); - --dark-color-panel-divider: #818181; - --dark-color-comment-tag: #dcddde; - --dark-color-comment-tag-text: #2f3136; - --dark-color-ts: #c97dff; - --dark-color-ts-interface: #9cbe3c; - --dark-color-ts-enum: #d6ab29; - --dark-color-ts-class: #3695f3; - --dark-color-ts-private: #e2e2e2; - --dark-color-toolbar: #34373c; - --dark-color-toolbar-text: #ffffff; - --dark-icon-filter: invert(1); - --dark-external-icon: url("data:image/svg+xml;utf8,"); -} - -@media (prefers-color-scheme: light) { - :root { - --color-background: var(--light-color-background); - --color-secondary-background: var(--light-color-secondary-background); - --color-text: var(--light-color-text); - --color-text-aside: var(--light-color-text-aside); - --color-link: var(--light-color-link); - --color-menu-divider: var(--light-color-menu-divider); - --color-menu-divider-focus: var(--light-color-menu-divider-focus); - --color-menu-label: var(--light-color-menu-label); - --color-panel: var(--light-color-panel); - --color-panel-divider: var(--light-color-panel-divider); - --color-comment-tag: var(--light-color-comment-tag); - --color-comment-tag-text: var(--light-color-comment-tag-text); - --color-ts: var(--light-color-ts); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-class: var(--light-color-ts-class); - --color-ts-private: var(--light-color-ts-private); - --color-toolbar: var(--light-color-toolbar); - --color-toolbar-text: var(--light-color-toolbar-text); - --icon-filter: var(--light-icon-filter); - --external-icon: var(--light-external-icon); - } -} - -@media (prefers-color-scheme: dark) { - :root { - --color-background: var(--dark-color-background); - --color-secondary-background: var(--dark-color-secondary-background); - --color-text: var(--dark-color-text); - --color-text-aside: var(--dark-color-text-aside); - --color-link: var(--dark-color-link); - --color-menu-divider: var(--dark-color-menu-divider); - --color-menu-divider-focus: var(--dark-color-menu-divider-focus); - --color-menu-label: var(--dark-color-menu-label); - --color-panel: var(--dark-color-panel); - --color-panel-divider: var(--dark-color-panel-divider); - --color-comment-tag: var(--dark-color-comment-tag); - --color-comment-tag-text: var(--dark-color-comment-tag-text); - --color-ts: var(--dark-color-ts); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-private: var(--dark-color-ts-private); - --color-toolbar: var(--dark-color-toolbar); - --color-toolbar-text: var(--dark-color-toolbar-text); - --icon-filter: var(--dark-icon-filter); - --external-icon: var(--dark-external-icon); - } -} - -body { - margin: 0; -} - -body.light { - --color-background: var(--light-color-background); - --color-secondary-background: var(--light-color-secondary-background); - --color-text: var(--light-color-text); - --color-text-aside: var(--light-color-text-aside); - --color-link: var(--light-color-link); - --color-menu-divider: var(--light-color-menu-divider); - --color-menu-divider-focus: var(--light-color-menu-divider-focus); - --color-menu-label: var(--light-color-menu-label); - --color-panel: var(--light-color-panel); - --color-panel-divider: var(--light-color-panel-divider); - --color-comment-tag: var(--light-color-comment-tag); - --color-comment-tag-text: var(--light-color-comment-tag-text); - --color-ts: var(--light-color-ts); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-class: var(--light-color-ts-class); - --color-ts-private: var(--light-color-ts-private); - --color-toolbar: var(--light-color-toolbar); - --color-toolbar-text: var(--light-color-toolbar-text); - --icon-filter: var(--light-icon-filter); - --external-icon: var(--light-external-icon); -} - -body.dark { - --color-background: var(--dark-color-background); - --color-secondary-background: var(--dark-color-secondary-background); - --color-text: var(--dark-color-text); - --color-text-aside: var(--dark-color-text-aside); - --color-link: var(--dark-color-link); - --color-menu-divider: var(--dark-color-menu-divider); - --color-menu-divider-focus: var(--dark-color-menu-divider-focus); - --color-menu-label: var(--dark-color-menu-label); - --color-panel: var(--dark-color-panel); - --color-panel-divider: var(--dark-color-panel-divider); - --color-comment-tag: var(--dark-color-comment-tag); - --color-comment-tag-text: var(--dark-color-comment-tag-text); - --color-ts: var(--dark-color-ts); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-private: var(--dark-color-ts-private); - --color-toolbar: var(--dark-color-toolbar); - --color-toolbar-text: var(--dark-color-toolbar-text); - --icon-filter: var(--dark-icon-filter); - --external-icon: var(--dark-external-icon); -} - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -h2 { - font-size: 1.5em; - margin: 0.83em 0; -} - -h3 { - font-size: 1.17em; - margin: 1em 0; -} - -h4, -.tsd-index-panel h3 { - font-size: 1em; - margin: 1.33em 0; -} - -h5 { - font-size: 0.83em; - margin: 1.67em 0; -} - -h6 { - font-size: 0.67em; - margin: 2.33em 0; -} - -pre { - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -dl, -menu, -ol, -ul { - margin: 1em 0; -} - -dd { - margin: 0 0 0 40px; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 40px; -} -@media (max-width: 640px) { - .container { - padding: 0 20px; - } -} - -.container-main { - padding-bottom: 200px; -} - -.row { - display: flex; - position: relative; - margin: 0 -10px; -} -.row:after { - visibility: hidden; - display: block; - content: ""; - clear: both; - height: 0; -} - -.col-4, -.col-8 { - box-sizing: border-box; - float: left; - padding: 0 10px; -} - -.col-4 { - width: 33.3333333333%; -} -.col-8 { - width: 66.6666666667%; -} - -ul.tsd-descriptions > li > :first-child, -.tsd-panel > :first-child, -.col-8 > :first-child, -.col-4 > :first-child, -ul.tsd-descriptions > li > :first-child > :first-child, -.tsd-panel > :first-child > :first-child, -.col-8 > :first-child > :first-child, -.col-4 > :first-child > :first-child, -ul.tsd-descriptions > li > :first-child > :first-child > :first-child, -.tsd-panel > :first-child > :first-child > :first-child, -.col-8 > :first-child > :first-child > :first-child, -.col-4 > :first-child > :first-child > :first-child { - margin-top: 0; -} -ul.tsd-descriptions > li > :last-child, -.tsd-panel > :last-child, -.col-8 > :last-child, -.col-4 > :last-child, -ul.tsd-descriptions > li > :last-child > :last-child, -.tsd-panel > :last-child > :last-child, -.col-8 > :last-child > :last-child, -.col-4 > :last-child > :last-child, -ul.tsd-descriptions > li > :last-child > :last-child > :last-child, -.tsd-panel > :last-child > :last-child > :last-child, -.col-8 > :last-child > :last-child > :last-child, -.col-4 > :last-child > :last-child > :last-child { - margin-bottom: 0; -} - -@keyframes fade-in { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@keyframes fade-out { - from { - opacity: 1; - visibility: visible; - } - to { - opacity: 0; - } -} -@keyframes fade-in-delayed { - 0% { - opacity: 0; - } - 33% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@keyframes fade-out-delayed { - 0% { - opacity: 1; - visibility: visible; - } - 66% { - opacity: 0; - } - 100% { - opacity: 0; - } -} -@keyframes shift-to-left { - from { - transform: translate(0, 0); - } - to { - transform: translate(-25%, 0); - } -} -@keyframes unshift-to-left { - from { - transform: translate(-25%, 0); - } - to { - transform: translate(0, 0); - } -} -@keyframes pop-in-from-right { - from { - transform: translate(100%, 0); - } - to { - transform: translate(0, 0); - } -} -@keyframes pop-out-to-right { - from { - transform: translate(0, 0); - visibility: visible; - } - to { - transform: translate(100%, 0); - } -} -body { - background: var(--color-background); - font-family: "Segoe UI", sans-serif; - font-size: 16px; - color: var(--color-text); -} - -a { - color: var(--color-link); - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -a.external[target="_blank"] { - background-image: var(--external-icon); - background-position: top 3px right; - background-repeat: no-repeat; - padding-right: 13px; -} - -code, -pre { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - padding: 0.2em; - margin: 0; - font-size: 14px; -} - -pre { - padding: 10px; -} -pre code { - padding: 0; - font-size: 100%; -} - -blockquote { - margin: 1em 0; - padding-left: 1em; - border-left: 4px solid gray; -} - -.tsd-typography { - line-height: 1.333em; -} -.tsd-typography ul { - list-style: square; - padding: 0 0 0 20px; - margin: 0; -} -.tsd-typography h4, -.tsd-typography .tsd-index-panel h3, -.tsd-index-panel .tsd-typography h3, -.tsd-typography h5, -.tsd-typography h6 { - font-size: 1em; - margin: 0; -} -.tsd-typography h5, -.tsd-typography h6 { - font-weight: normal; -} -.tsd-typography p, -.tsd-typography ul, -.tsd-typography ol { - margin: 1em 0; -} - -@media (min-width: 901px) and (max-width: 1024px) { - html.default .col-content { - width: 72%; - } - html.default .col-menu { - width: 28%; - } - html.default .tsd-navigation { - padding-left: 10px; - } -} -@media (max-width: 900px) { - html.default .col-content { - float: none; - width: 100%; - } - html.default .col-menu { - position: fixed !important; - overflow: auto; - -webkit-overflow-scrolling: touch; - z-index: 1024; - top: 0 !important; - bottom: 0 !important; - left: auto !important; - right: 0 !important; - width: 100%; - padding: 20px 20px 0 0; - max-width: 450px; - visibility: hidden; - background-color: var(--color-panel); - transform: translate(100%, 0); - } - html.default .col-menu > *:last-child { - padding-bottom: 20px; - } - html.default .overlay { - content: ""; - display: block; - position: fixed; - z-index: 1023; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.75); - visibility: hidden; - } -} - -.tsd-page-title { - padding: 70px 0 20px 0; - margin: 0 0 40px 0; - background: var(--color-panel); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.35); -} -.tsd-page-title h1 { - margin: 0; -} - -.tsd-breadcrumb { - margin: 0; - padding: 0; - color: var(--color-text-aside); -} -.tsd-breadcrumb a { - color: var(--color-text-aside); - text-decoration: none; -} -.tsd-breadcrumb a:hover { - text-decoration: underline; -} -.tsd-breadcrumb li { - display: inline; -} -.tsd-breadcrumb li:after { - content: " / "; -} - -dl.tsd-comment-tags { - overflow: hidden; -} -dl.tsd-comment-tags dt { - float: left; - padding: 1px 5px; - margin: 0 10px 0 0; - border-radius: 4px; - border: 1px solid var(--color-comment-tag); - color: var(--color-comment-tag); - font-size: 0.8em; - font-weight: normal; -} -dl.tsd-comment-tags dd { - margin: 0 0 10px 0; -} -dl.tsd-comment-tags dd:before, -dl.tsd-comment-tags dd:after { - display: table; - content: " "; -} -dl.tsd-comment-tags dd pre, -dl.tsd-comment-tags dd:after { - clear: both; -} -dl.tsd-comment-tags p { - margin: 0; -} - -.tsd-panel.tsd-comment .lead { - font-size: 1.1em; - line-height: 1.333em; - margin-bottom: 2em; -} -.tsd-panel.tsd-comment .lead:last-child { - margin-bottom: 0; -} - -.toggle-protected .tsd-is-private { - display: none; -} - -.toggle-public .tsd-is-private, -.toggle-public .tsd-is-protected, -.toggle-public .tsd-is-private-protected { - display: none; -} - -.toggle-inherited .tsd-is-inherited { - display: none; -} - -.toggle-externals .tsd-is-external { - display: none; -} - -#tsd-filter { - position: relative; - display: inline-block; - height: 40px; - vertical-align: bottom; -} -.no-filter #tsd-filter { - display: none; -} -#tsd-filter .tsd-filter-group { - display: inline-block; - height: 40px; - vertical-align: bottom; - white-space: nowrap; -} -#tsd-filter input { - display: none; -} -@media (max-width: 900px) { - #tsd-filter .tsd-filter-group { - display: block; - position: absolute; - top: 40px; - right: 20px; - height: auto; - background-color: var(--color-panel); - visibility: hidden; - transform: translate(50%, 0); - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); - } - .has-options #tsd-filter .tsd-filter-group { - visibility: visible; - } - .to-has-options #tsd-filter .tsd-filter-group { - animation: fade-in 0.2s; - } - .from-has-options #tsd-filter .tsd-filter-group { - animation: fade-out 0.2s; - } - #tsd-filter label, - #tsd-filter .tsd-select { - display: block; - padding-right: 20px; - } -} - -footer { - border-top: 1px solid var(--color-panel-divider); - background-color: var(--color-panel); -} -footer.with-border-bottom { - border-bottom: 1px solid var(--color-panel-divider); -} -footer .tsd-legend-group { - font-size: 0; -} -footer .tsd-legend { - display: inline-block; - width: 25%; - padding: 0; - font-size: 16px; - list-style: none; - line-height: 1.333em; - vertical-align: top; -} -@media (max-width: 900px) { - footer .tsd-legend { - width: 50%; - } -} - -.tsd-hierarchy { - list-style: square; - padding: 0 0 0 20px; - margin: 0; -} -.tsd-hierarchy .target { - font-weight: bold; -} - -.tsd-index-panel .tsd-index-content { - margin-bottom: -30px !important; -} -.tsd-index-panel .tsd-index-section { - margin-bottom: 30px !important; -} -.tsd-index-panel h3 { - margin: 0 -20px 10px -20px; - padding: 0 20px 10px 20px; - border-bottom: 1px solid var(--color-panel-divider); -} -.tsd-index-panel ul.tsd-index-list { - -webkit-column-count: 3; - -moz-column-count: 3; - -ms-column-count: 3; - -o-column-count: 3; - column-count: 3; - -webkit-column-gap: 20px; - -moz-column-gap: 20px; - -ms-column-gap: 20px; - -o-column-gap: 20px; - column-gap: 20px; - padding: 0; - list-style: none; - line-height: 1.333em; -} -@media (max-width: 900px) { - .tsd-index-panel ul.tsd-index-list { - -webkit-column-count: 1; - -moz-column-count: 1; - -ms-column-count: 1; - -o-column-count: 1; - column-count: 1; - } -} -@media (min-width: 901px) and (max-width: 1024px) { - .tsd-index-panel ul.tsd-index-list { - -webkit-column-count: 2; - -moz-column-count: 2; - -ms-column-count: 2; - -o-column-count: 2; - column-count: 2; - } -} -.tsd-index-panel ul.tsd-index-list li { - -webkit-page-break-inside: avoid; - -moz-page-break-inside: avoid; - -ms-page-break-inside: avoid; - -o-page-break-inside: avoid; - page-break-inside: avoid; -} -.tsd-index-panel a, -.tsd-index-panel .tsd-parent-kind-module a { - color: var(--color-ts); -} -.tsd-index-panel .tsd-parent-kind-interface a { - color: var(--color-ts-interface); -} -.tsd-index-panel .tsd-parent-kind-enum a { - color: var(--color-ts-enum); -} -.tsd-index-panel .tsd-parent-kind-class a { - color: var(--color-ts-class); -} -.tsd-index-panel .tsd-kind-module a { - color: var(--color-ts); -} -.tsd-index-panel .tsd-kind-interface a { - color: var(--color-ts-interface); -} -.tsd-index-panel .tsd-kind-enum a { - color: var(--color-ts-enum); -} -.tsd-index-panel .tsd-kind-class a { - color: var(--color-ts-class); -} -.tsd-index-panel .tsd-is-private a { - color: var(--color-ts-private); -} - -.tsd-flag { - display: inline-block; - padding: 1px 5px; - border-radius: 4px; - color: var(--color-comment-tag-text); - background-color: var(--color-comment-tag); - text-indent: 0; - font-size: 14px; - font-weight: normal; -} - -.tsd-anchor { - position: absolute; - top: -100px; -} - -.tsd-member { - position: relative; -} -.tsd-member .tsd-anchor + h3 { - margin-top: 0; - margin-bottom: 0; - border-bottom: none; -} -.tsd-member [data-tsd-kind] { - color: var(--color-ts); -} -.tsd-member [data-tsd-kind="Interface"] { - color: var(--color-ts-interface); -} -.tsd-member [data-tsd-kind="Enum"] { - color: var(--color-ts-enum); -} -.tsd-member [data-tsd-kind="Class"] { - color: var(--color-ts-class); -} -.tsd-member [data-tsd-kind="Private"] { - color: var(--color-ts-private); -} - -.tsd-navigation { - margin: 0 0 0 40px; -} -.tsd-navigation a { - display: block; - padding-top: 2px; - padding-bottom: 2px; - border-left: 2px solid transparent; - color: var(--color-text); - text-decoration: none; - transition: border-left-color 0.1s; -} -.tsd-navigation a:hover { - text-decoration: underline; -} -.tsd-navigation ul { - margin: 0; - padding: 0; - list-style: none; -} -.tsd-navigation li { - padding: 0; -} - -.tsd-navigation.primary { - padding-bottom: 40px; -} -.tsd-navigation.primary a { - display: block; - padding-top: 6px; - padding-bottom: 6px; -} -.tsd-navigation.primary ul li a { - padding-left: 5px; -} -.tsd-navigation.primary ul li li a { - padding-left: 25px; -} -.tsd-navigation.primary ul li li li a { - padding-left: 45px; -} -.tsd-navigation.primary ul li li li li a { - padding-left: 65px; -} -.tsd-navigation.primary ul li li li li li a { - padding-left: 85px; -} -.tsd-navigation.primary ul li li li li li li a { - padding-left: 105px; -} -.tsd-navigation.primary > ul { - border-bottom: 1px solid var(--color-panel-divider); -} -.tsd-navigation.primary li { - border-top: 1px solid var(--color-panel-divider); -} -.tsd-navigation.primary li.current > a { - font-weight: bold; -} -.tsd-navigation.primary li.label span { - display: block; - padding: 20px 0 6px 5px; - color: var(--color-menu-label); -} -.tsd-navigation.primary li.globals + li > span, -.tsd-navigation.primary li.globals + li > a { - padding-top: 20px; -} - -.tsd-navigation.secondary { - max-height: calc(100vh - 1rem - 40px); - overflow: auto; - position: -webkit-sticky; - position: sticky; - top: calc(0.5rem + 40px); - transition: 0.3s; -} -.tsd-navigation.secondary.tsd-navigation--toolbar-hide { - max-height: calc(100vh - 1rem); - top: 0.5rem; -} -.tsd-navigation.secondary ul { - transition: opacity 0.2s; -} -.tsd-navigation.secondary ul li a { - padding-left: 25px; -} -.tsd-navigation.secondary ul li li a { - padding-left: 45px; -} -.tsd-navigation.secondary ul li li li a { - padding-left: 65px; -} -.tsd-navigation.secondary ul li li li li a { - padding-left: 85px; -} -.tsd-navigation.secondary ul li li li li li a { - padding-left: 105px; -} -.tsd-navigation.secondary ul li li li li li li a { - padding-left: 125px; -} -.tsd-navigation.secondary ul.current a { - border-left-color: var(--color-panel-divider); -} -.tsd-navigation.secondary li.focus > a, -.tsd-navigation.secondary ul.current li.focus > a { - border-left-color: var(--color-menu-divider-focus); -} -.tsd-navigation.secondary li.current { - margin-top: 20px; - margin-bottom: 20px; - border-left-color: var(--color-panel-divider); -} -.tsd-navigation.secondary li.current > a { - font-weight: bold; -} - -@media (min-width: 901px) { - .menu-sticky-wrap { - position: static; - } -} - -.tsd-panel { - margin: 20px 0; - padding: 20px; - background-color: var(--color-panel); - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); -} -.tsd-panel:empty { - display: none; -} -.tsd-panel > h1, -.tsd-panel > h2, -.tsd-panel > h3 { - margin: 1.5em -20px 10px -20px; - padding: 0 20px 10px 20px; - border-bottom: 1px solid var(--color-panel-divider); -} -.tsd-panel > h1.tsd-before-signature, -.tsd-panel > h2.tsd-before-signature, -.tsd-panel > h3.tsd-before-signature { - margin-bottom: 0; - border-bottom: 0; -} -.tsd-panel table { - display: block; - width: 100%; - overflow: auto; - margin-top: 10px; - word-break: normal; - word-break: keep-all; - border-collapse: collapse; -} -.tsd-panel table th { - font-weight: bold; -} -.tsd-panel table th, -.tsd-panel table td { - padding: 6px 13px; - border: 1px solid var(--color-panel-divider); -} -.tsd-panel table tr { - background: var(--color-background); -} -.tsd-panel table tr:nth-child(even) { - background: var(--color-secondary-background); -} - -.tsd-panel-group { - margin: 60px 0; -} -.tsd-panel-group > h1, -.tsd-panel-group > h2, -.tsd-panel-group > h3 { - padding-left: 20px; - padding-right: 20px; -} - -#tsd-search { - transition: background-color 0.2s; -} -#tsd-search .title { - position: relative; - z-index: 2; -} -#tsd-search .field { - position: absolute; - left: 0; - top: 0; - right: 40px; - height: 40px; -} -#tsd-search .field input { - box-sizing: border-box; - position: relative; - top: -50px; - z-index: 1; - width: 100%; - padding: 0 10px; - opacity: 0; - outline: 0; - border: 0; - background: transparent; - color: var(--color-text); -} -#tsd-search .field label { - position: absolute; - overflow: hidden; - right: -40px; -} -#tsd-search .field input, -#tsd-search .title { - transition: opacity 0.2s; -} -#tsd-search .results { - position: absolute; - visibility: hidden; - top: 40px; - width: 100%; - margin: 0; - padding: 0; - list-style: none; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); -} -#tsd-search .results li { - padding: 0 10px; - background-color: var(--color-background); -} -#tsd-search .results li:nth-child(even) { - background-color: var(--color-panel); -} -#tsd-search .results li.state { - display: none; -} -#tsd-search .results li.current, -#tsd-search .results li:hover { - background-color: var(--color-panel-divider); -} -#tsd-search .results a { - display: block; -} -#tsd-search .results a:before { - top: 10px; -} -#tsd-search .results span.parent { - color: var(--color-text-aside); - font-weight: normal; -} -#tsd-search.has-focus { - background-color: var(--color-panel-divider); -} -#tsd-search.has-focus .field input { - top: 0; - opacity: 1; -} -#tsd-search.has-focus .title { - z-index: 0; - opacity: 0; -} -#tsd-search.has-focus .results { - visibility: visible; -} -#tsd-search.loading .results li.state.loading { - display: block; -} -#tsd-search.failure .results li.state.failure { - display: block; -} - -.tsd-signature { - margin: 0 0 1em 0; - padding: 10px; - border: 1px solid var(--color-panel-divider); - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 14px; - overflow-x: auto; -} -.tsd-signature.tsd-kind-icon { - padding-left: 30px; -} -.tsd-signature.tsd-kind-icon:before { - top: 10px; - left: 10px; -} -.tsd-panel > .tsd-signature { - margin-left: -20px; - margin-right: -20px; - border-width: 1px 0; -} -.tsd-panel > .tsd-signature.tsd-kind-icon { - padding-left: 40px; -} -.tsd-panel > .tsd-signature.tsd-kind-icon:before { - left: 20px; -} - -.tsd-signature-symbol { - color: var(--color-text-aside); - font-weight: normal; -} - -.tsd-signature-type { - font-style: italic; - font-weight: normal; -} - -.tsd-signatures { - padding: 0; - margin: 0 0 1em 0; - border: 1px solid var(--color-panel-divider); -} -.tsd-signatures .tsd-signature { - margin: 0; - border-width: 1px 0 0 0; - transition: background-color 0.1s; -} -.tsd-signatures .tsd-signature:first-child { - border-top-width: 0; -} -.tsd-signatures .tsd-signature.current { - background-color: var(--color-panel-divider); -} -.tsd-signatures.active > .tsd-signature { - cursor: pointer; -} -.tsd-panel > .tsd-signatures { - margin-left: -20px; - margin-right: -20px; - border-width: 1px 0; -} -.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon { - padding-left: 40px; -} -.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before { - left: 20px; -} -.tsd-panel > a.anchor + .tsd-signatures { - border-top-width: 0; - margin-top: -20px; -} - -ul.tsd-descriptions { - position: relative; - overflow: hidden; - padding: 0; - list-style: none; -} -ul.tsd-descriptions.active > .tsd-description { - display: none; -} -ul.tsd-descriptions.active > .tsd-description.current { - display: block; -} -ul.tsd-descriptions.active > .tsd-description.fade-in { - animation: fade-in-delayed 0.3s; -} -ul.tsd-descriptions.active > .tsd-description.fade-out { - animation: fade-out-delayed 0.3s; - position: absolute; - display: block; - top: 0; - left: 0; - right: 0; - opacity: 0; - visibility: hidden; -} -ul.tsd-descriptions h4, -ul.tsd-descriptions .tsd-index-panel h3, -.tsd-index-panel ul.tsd-descriptions h3 { - font-size: 16px; - margin: 1em 0 0.5em 0; -} - -ul.tsd-parameters, -ul.tsd-type-parameters { - list-style: square; - margin: 0; - padding-left: 20px; -} -ul.tsd-parameters > li.tsd-parameter-signature, -ul.tsd-type-parameters > li.tsd-parameter-signature { - list-style: none; - margin-left: -20px; -} -ul.tsd-parameters h5, -ul.tsd-type-parameters h5 { - font-size: 16px; - margin: 1em 0 0.5em 0; -} -ul.tsd-parameters .tsd-comment, -ul.tsd-type-parameters .tsd-comment { - margin-top: -0.5em; -} - -.tsd-sources { - font-size: 14px; - color: var(--color-text-aside); - margin: 0 0 1em 0; -} -.tsd-sources a { - color: var(--color-text-aside); - text-decoration: underline; -} -.tsd-sources ul, -.tsd-sources p { - margin: 0 !important; -} -.tsd-sources ul { - list-style: none; - padding: 0; -} - -.tsd-page-toolbar { - position: fixed; - z-index: 1; - top: 0; - left: 0; - width: 100%; - height: 40px; - color: var(--color-toolbar-text); - background: var(--color-toolbar); - border-bottom: 1px solid var(--color-panel-divider); - transition: transform 0.3s linear; -} -.tsd-page-toolbar a { - color: var(--color-toolbar-text); - text-decoration: none; -} -.tsd-page-toolbar a.title { - font-weight: bold; -} -.tsd-page-toolbar a.title:hover { - text-decoration: underline; -} -.tsd-page-toolbar .table-wrap { - display: table; - width: 100%; - height: 40px; -} -.tsd-page-toolbar .table-cell { - display: table-cell; - position: relative; - white-space: nowrap; - line-height: 40px; -} -.tsd-page-toolbar .table-cell:first-child { - width: 100%; -} - -.tsd-page-toolbar--hide { - transform: translateY(-100%); -} - -.tsd-select .tsd-select-list li:before, -.tsd-select .tsd-select-label:before, -.tsd-widget:before { - content: ""; - display: inline-block; - width: 40px; - height: 40px; - margin: 0 -8px 0 0; - background-image: url(./widgets.png); - background-repeat: no-repeat; - text-indent: -1024px; - vertical-align: bottom; - filter: var(--icon-filter); -} -@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { - .tsd-select .tsd-select-list li:before, - .tsd-select .tsd-select-label:before, - .tsd-widget:before { - background-image: url(./widgets@2x.png); - background-size: 320px 40px; - } -} - -.tsd-widget { - display: inline-block; - overflow: hidden; - opacity: 0.8; - height: 40px; - transition: opacity 0.1s, background-color 0.2s; - vertical-align: bottom; - cursor: pointer; -} -.tsd-widget:hover { - opacity: 0.9; -} -.tsd-widget.active { - opacity: 1; - background-color: var(--color-panel-divider); -} -.tsd-widget.no-caption { - width: 40px; -} -.tsd-widget.no-caption:before { - margin: 0; -} -.tsd-widget.search:before { - background-position: 0 0; -} -.tsd-widget.menu:before { - background-position: -40px 0; -} -.tsd-widget.options:before { - background-position: -80px 0; -} -.tsd-widget.options, -.tsd-widget.menu { - display: none; -} -@media (max-width: 900px) { - .tsd-widget.options, - .tsd-widget.menu { - display: inline-block; - } -} -input[type="checkbox"] + .tsd-widget:before { - background-position: -120px 0; -} -input[type="checkbox"]:checked + .tsd-widget:before { - background-position: -160px 0; -} - -.tsd-select { - position: relative; - display: inline-block; - height: 40px; - transition: opacity 0.1s, background-color 0.2s; - vertical-align: bottom; - cursor: pointer; -} -.tsd-select .tsd-select-label { - opacity: 0.6; - transition: opacity 0.2s; -} -.tsd-select .tsd-select-label:before { - background-position: -240px 0; -} -.tsd-select.active .tsd-select-label { - opacity: 0.8; -} -.tsd-select.active .tsd-select-list { - visibility: visible; - opacity: 1; - transition-delay: 0s; -} -.tsd-select .tsd-select-list { - position: absolute; - visibility: hidden; - top: 40px; - left: 0; - margin: 0; - padding: 0; - opacity: 0; - list-style: none; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); - transition: visibility 0s 0.2s, opacity 0.2s; -} -.tsd-select .tsd-select-list li { - padding: 0 20px 0 0; - background-color: var(--color-background); -} -.tsd-select .tsd-select-list li:before { - background-position: 40px 0; -} -.tsd-select .tsd-select-list li:nth-child(even) { - background-color: var(--color-panel); -} -.tsd-select .tsd-select-list li:hover { - background-color: var(--color-panel-divider); -} -.tsd-select .tsd-select-list li.selected:before { - background-position: -200px 0; -} -@media (max-width: 900px) { - .tsd-select .tsd-select-list { - top: 0; - left: auto; - right: 100%; - margin-right: -5px; - } - .tsd-select .tsd-select-label:before { - background-position: -280px 0; - } -} - -img { - max-width: 100%; -} diff --git a/docs/assets/widgets.png b/docs/assets/widgets.png deleted file mode 100644 index c7380532ac1b45400620011c37c4dcb7aec27a4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmeAS@N?(olHy`uVBq!ia0y~yU~~YoH8@y+q^jrZML>b&o-U3d6^w6h1+IPUz|;DW zIZ;96kdsD>Qv^q=09&hp0GpEni<1IR%gvP3v%OR9*{MuRTKWHZyIbuBt)Ci`cU_&% z1T+i^Y)o{%281-<3TpPAUTzw5v;RY=>1rvxmPl96#kYc9hX!6V^nB|ad#(S+)}?8C zr_H+lT3B#So$T=?$(w3-{rbQ4R<@nsf$}$hwSO)A$8&`(j+wQf=Jwhb0`CvhR5DCf z^OgI)KQemrUFPH+UynC$Y~QHG%DbTVh-Skz{enNU)cV_hPu~{TD7TPZl>0&K>iuE| z7AYn$7)Jrb9GE&SfQW4q&G*@N|4cHI`VakFa5-C!ov&XD)J(qp$rJJ*9e z-sHv}#g*T7Cv048d1v~BEAzM5FztAse#q78WWC^BUCzQ U&wLp6h6BX&boFyt=akR{0G%$)mH+?% diff --git a/docs/assets/widgets@2x.png b/docs/assets/widgets@2x.png deleted file mode 100644 index 4bbbd57272f3b28f47527d4951ad10f950b8ad43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 855 zcmeAS@N?(olHy`uVBq!ia0y~yU}^xe12~w0Jcmn z@(X6T|9^jgLcx21{)7exgY)a>N6m2F0<`Rqr;B4q1>>88jUdw-7W`c)zLE*mq8W2H z-<&Jl_Hco5BuC5n@AbF5GD82~-e8-v=#zCyUX0F-o}8pPfAv`!GN$ff+TL<~@kgt} z62eO?_|&+>xBmM$@p|z`tIKEdpPf8%qI>4r7@jn<=eta*{3~?g(zz{Ke9zc-G^gr? z-7foa?LcS!hmbwzru}ICvbWLlW8;+l-}!^=c32!^nV`+`C*;0-*Y%l94pC;Cb3GXz zzSf%a!{gVr{Y_lVuUj+a)*Ca+!-Hu%xmP&&X-2CuANY8^i{D7Kg6qzP zXz_ps9+lN8ESH{K4`yu&b~I>N9xGlE&;2u*b?+Go!AhN?m-bxlLvtC#MzDF2kFzfHJ1W7ybqdefSqVhbOykd*Yi%EDuhs z4wF{ft^bv2+DDnKb8gj1FuvcV`M}luS>lO<^)8x>y1#R;a=-ZKwWTQQb)ioBbi;zh zD!f5V)8581to1LL7c9!l^PSC$NBPYif!_vAZhmL4)v4U)4UsrLYiH_9rmQDd?)(e5 z^pcH>qvBg*i0dus2r*mp4;zKvu=P#s-ti;2obl`NjjwoYd>e(oo#j_uyRb<7Pv^If zzZ|mGHmV)8^tbO%^>eqMw(@7(&3g{jEp-Najo7V75xI_ZHK*FA`elF{r5}E*d7+j_R diff --git a/docs/classes/CanvasKit.html b/docs/classes/CanvasKit.html deleted file mode 100644 index c20a896..0000000 --- a/docs/classes/CanvasKit.html +++ /dev/null @@ -1,10 +0,0 @@ -CanvasKit | diepapi
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class CanvasKit

Hierarchy

  • CanvasKit

Index

Constructors

constructor

Methods

Static createCanvas

  • createCanvas(): HTMLCanvasElement
  • -

    If you want to a canvas then create it with this method.

    -

    Returns HTMLCanvasElement

Static hook

  • hook(method: string, consumer: (target: Function, thisArg: CanvasRenderingContext2D, args: any[]) => void): void
  • -

    The consumer will be called before

    -

    Parameters

    • method: string
    • consumer: (target: Function, thisArg: CanvasRenderingContext2D, args: any[]) => void
        • (target: Function, thisArg: CanvasRenderingContext2D, args: any[]): void
        • Parameters

          • target: Function
          • thisArg: CanvasRenderingContext2D
          • args: any[]

          Returns void

    Returns void

Static hookRAF

  • hookRAF(consumer: () => void): void
  • -

    The consumer will be called before.

    -

    Parameters

    • consumer: () => void
        • (): void
        • Returns void

    Returns void

Static replace

  • replace(method: string, func: (target: Function, thisArg: CanvasRenderingContext2D, args: any[]) => any): void
  • -

    replaces the function. Use return Reflect.apply(target, thisArg, args); in -your function to call the original function.

    -

    Parameters

    • method: string
    • func: (target: Function, thisArg: CanvasRenderingContext2D, args: any[]) => any
        • (target: Function, thisArg: CanvasRenderingContext2D, args: any[]): any
        • Parameters

          • target: Function
          • thisArg: CanvasRenderingContext2D
          • args: any[]

          Returns any

    Returns void

Legend

  • Constructor
  • Property
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/Vector.html b/docs/classes/Vector.html deleted file mode 100644 index 97826e2..0000000 --- a/docs/classes/Vector.html +++ /dev/null @@ -1,20 +0,0 @@ -Vector | diepapi
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class Vector

Hierarchy

  • Vector

Index

Constructors

constructor

  • new Vector(x: number, y: number): Vector

Properties

Readonly x

x: number

Readonly y

y: number

Methods

Static add

Static centroid

Static distance

Static divide

Static len

Static multiply

Static radius

  • radius(...vertices: Vector[]): number
  • -

    Calcutes the radius from a set of vertices that are placed on a circle

    -

    Parameters

    Returns number

Static round

Static scale

Static subtract

Legend

  • Constructor
  • Property
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 29522e8..0000000 --- a/docs/index.html +++ /dev/null @@ -1,68 +0,0 @@ -diepapi
Options
All
  • Public
  • Public/Protected
  • All
Menu

diepapi

- -

diepAPI

-
- - -

This is a WIP Project that I'm developing to create self playing bots in the future.

-
- - -

State of the API: STABLE

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ClassStatus
GameSTABLE
MinimapSTABLE
ArenaScalingSTABLE
ArenaSTABLE
PlayerSTABLE
EntityManagerSTABLE
- - -

Building:

-
-

You can build the library yourself or use my prebuild version that can be found here.

-
git clone https://github.com/Cazka/diepAPI.git
npm install
npm run build -
- - -

Working with the API:

-
-

include the bundled library in your script and access the api by the global Object diepAPI. -Refer to the documentation and examples for more information.

- - -

Documentation:

-
-

Documentation can be found here.

- - -

Examples:

-
-

Examples can be found here.

-

Legend

  • Constructor
  • Property
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html deleted file mode 100644 index a275c91..0000000 --- a/docs/modules.html +++ /dev/null @@ -1 +0,0 @@ -diepapi
Options
All
  • Public
  • Public/Protected
  • All
Menu

diepapi

Index

Variables

arena

arena: Arena = ...

arenaScaling

arenaScaling: ArenaScaling = ...

entityManager

entityManager: EntityManager = ...

game

game: Game = ...

gamepad

gamepad: DiepGamepad = ...

minimap

minimap: Minimap = ...

player

player: Player = ...

Legend

  • Constructor
  • Property
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/extensions/README.md b/extensions/README.md new file mode 100644 index 0000000..f586039 --- /dev/null +++ b/extensions/README.md @@ -0,0 +1,9 @@ +# Extension + +Extensions are separate scripts that may be installed to extend diepAPIs functionality. + +For Example if you want to use diepAPI.entityManager, install die entityManager extension. + +### Extensions: + +- Overlay \ No newline at end of file diff --git a/extensions/globals.d.ts b/extensions/globals.d.ts new file mode 100644 index 0000000..aba2ea0 --- /dev/null +++ b/extensions/globals.d.ts @@ -0,0 +1,19 @@ +interface Input { + mouse: (x: number, y: number) => void; + keyDown: (key: string | number) => void; + keyUp: (key: string | number) => void; + blur: () => void; + wheel: Function; + prevent_right_click: (value: boolean) => void; + flushInputHooks: Function; + set_convar: (key: string, value: string) => boolean; + get_convar: (key: string) => null | string; + execute: (v: string) => void; + print_convar_help: () => void; + should_prevent_unload: () => boolean; +} + +declare var input: Input; + +declare var unsafeWindow: Window & typeof globalThis; +declare var _window: Window & typeof globalThis; diff --git a/extensions/overlay/overlay.ts b/extensions/overlay/overlay.ts new file mode 100644 index 0000000..4e6e08f --- /dev/null +++ b/extensions/overlay/overlay.ts @@ -0,0 +1,27 @@ +import { CanvasKit } from '../../src/core/canvas_kit'; + +import { game } from '../../src/game'; + +class Overlay { + canvas: HTMLCanvasElement; + ctx: CanvasRenderingContext2D; + constructor() { + this.canvas = CanvasKit.createCanvas(); + this.ctx = this.canvas.getContext('2d'); + document.body.appendChild(this.canvas); + _window.addEventListener('resize', () => this.#onResize()); + game.on('frame', () => this.#onFrame()); + this.#onResize(); + } + + #onResize() { + this.canvas.width = _window.innerWidth * _window.devicePixelRatio; + this.canvas.height = _window.innerHeight * _window.devicePixelRatio; + } + + #onFrame() { + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + } +} + +export { Overlay }; diff --git a/extensions/overlay/tsconfig.json b/extensions/overlay/tsconfig.json new file mode 100644 index 0000000..a98529e --- /dev/null +++ b/extensions/overlay/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "baseUrl": "../../src", + "outDir": "../../dist" + }, + "include": ["./"] +} From b97c729f59e86de7231c6811a0e3ab1028039324 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 20:32:48 +0200 Subject: [PATCH 20/47] moving to core --- src/{ => core}/canvas_kit.ts | 0 src/{ => core}/event_emitter.ts | 0 src/{ => core}/globals.d.ts | 0 src/{ => core}/movement.ts | 0 src/{ => core}/vector.ts | 0 src/overlay.ts | 27 --------------------------- 6 files changed, 27 deletions(-) rename src/{ => core}/canvas_kit.ts (100%) rename src/{ => core}/event_emitter.ts (100%) rename src/{ => core}/globals.d.ts (100%) rename src/{ => core}/movement.ts (100%) rename src/{ => core}/vector.ts (100%) delete mode 100644 src/overlay.ts diff --git a/src/canvas_kit.ts b/src/core/canvas_kit.ts similarity index 100% rename from src/canvas_kit.ts rename to src/core/canvas_kit.ts diff --git a/src/event_emitter.ts b/src/core/event_emitter.ts similarity index 100% rename from src/event_emitter.ts rename to src/core/event_emitter.ts diff --git a/src/globals.d.ts b/src/core/globals.d.ts similarity index 100% rename from src/globals.d.ts rename to src/core/globals.d.ts diff --git a/src/movement.ts b/src/core/movement.ts similarity index 100% rename from src/movement.ts rename to src/core/movement.ts diff --git a/src/vector.ts b/src/core/vector.ts similarity index 100% rename from src/vector.ts rename to src/core/vector.ts diff --git a/src/overlay.ts b/src/overlay.ts deleted file mode 100644 index 7f74ac6..0000000 --- a/src/overlay.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { CanvasKit } from './canvas_kit'; - -import { game } from './game'; - -class Overlay { - canvas: HTMLCanvasElement; - ctx: CanvasRenderingContext2D; - constructor() { - this.canvas = CanvasKit.createCanvas(); - this.ctx = this.canvas.getContext('2d'); - document.body.appendChild(this.canvas); - _window.addEventListener('resize', () => this.#onResize()); - game.on('frame', () => this.#onFrame()); - this.#onResize(); - } - - #onResize() { - this.canvas.width = _window.innerWidth * _window.devicePixelRatio; - this.canvas.height = _window.innerHeight * _window.devicePixelRatio; - } - - #onFrame() { - this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); - } -} - -export { Overlay }; From ee03b0c9c68451baf041723513f19417c30e8ebb Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 20:33:08 +0200 Subject: [PATCH 21/47] update imports --- src/arena.ts | 2 +- src/camera.ts | 2 +- src/game.ts | 4 ++-- src/minimap.ts | 4 ++-- src/playerMovement.ts | 2 +- src/scaling.ts | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/arena.ts b/src/arena.ts index aad2df4..3902582 100644 --- a/src/arena.ts +++ b/src/arena.ts @@ -1,4 +1,4 @@ -import { Vector } from './vector'; +import { Vector } from './core/vector'; import { minimap } from './minimap'; import { scaling } from './scaling'; diff --git a/src/camera.ts b/src/camera.ts index 642aaf5..a9d2e95 100644 --- a/src/camera.ts +++ b/src/camera.ts @@ -1,4 +1,4 @@ -import { Vector } from './vector'; +import { Vector } from './core/vector'; import { arena } from './arena'; import { minimap } from './minimap'; diff --git a/src/game.ts b/src/game.ts index 7bcba46..81629a3 100644 --- a/src/game.ts +++ b/src/game.ts @@ -1,5 +1,5 @@ -import { CanvasKit } from './canvas_kit'; -import { EventEmitter } from './event_emitter'; +import { CanvasKit } from './core/canvas_kit'; +import { EventEmitter } from './core/event_emitter'; class Game extends EventEmitter { #ready = false; diff --git a/src/minimap.ts b/src/minimap.ts index e3e9696..5e92cf0 100644 --- a/src/minimap.ts +++ b/src/minimap.ts @@ -1,5 +1,5 @@ -import { CanvasKit } from './canvas_kit'; -import { Vector } from './vector'; +import { CanvasKit } from './core/canvas_kit'; +import { Vector } from './core/vector'; import { game } from './game'; diff --git a/src/playerMovement.ts b/src/playerMovement.ts index 0db1f90..674dae1 100644 --- a/src/playerMovement.ts +++ b/src/playerMovement.ts @@ -1,4 +1,4 @@ -import { Movement } from './movement'; +import { Movement } from './core/movement'; import { arena } from './arena'; import { game } from './game'; diff --git a/src/scaling.ts b/src/scaling.ts index d8c95f2..122a16d 100644 --- a/src/scaling.ts +++ b/src/scaling.ts @@ -1,5 +1,5 @@ -import { CanvasKit } from './canvas_kit'; -import { Vector } from './vector'; +import { CanvasKit } from './core/canvas_kit'; +import { Vector } from './core/vector'; import { camera } from './camera'; From 27e4d9fce97b8821bebb0359ee290d07a0566941 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 20:33:47 +0200 Subject: [PATCH 22/47] update --- extensions/overlay/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/overlay/tsconfig.json b/extensions/overlay/tsconfig.json index a98529e..5613ff0 100644 --- a/extensions/overlay/tsconfig.json +++ b/extensions/overlay/tsconfig.json @@ -6,5 +6,5 @@ "baseUrl": "../../src", "outDir": "../../dist" }, - "include": ["./"] + "include": ["./", "../globals.d.ts"] } From 8f52559f97b0135f68a867a28c239de334a91912 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 20:35:44 +0200 Subject: [PATCH 23/47] update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4dc0afe..402bc00 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ diepAPI is a library with many apis that allow you to interact with the game. - arena - camera +- game - minimap - playerMovement - scaling From 60ef7fe2e4bd34a196691f4a37ba7593393c8413 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 20:43:51 +0200 Subject: [PATCH 24/47] rename --- src/{playerMovement.ts => player_movement.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{playerMovement.ts => player_movement.ts} (100%) diff --git a/src/playerMovement.ts b/src/player_movement.ts similarity index 100% rename from src/playerMovement.ts rename to src/player_movement.ts From a4bf5c0f80225de0dcdfd3562c712781f22af742 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 20:50:40 +0200 Subject: [PATCH 25/47] add --- README.md | 2 + extensions/README.md | 5 +- src/gamepad.ts | 78 ++++++++++ src/index.ts | 3 +- src/player.ts | 360 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 445 insertions(+), 3 deletions(-) create mode 100644 src/gamepad.ts create mode 100644 src/player.ts diff --git a/README.md b/README.md index 402bc00..628141b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,9 @@ diepAPI is a library with many apis that allow you to interact with the game. - arena - camera - game +- gamepad - minimap +- player - playerMovement - scaling diff --git a/extensions/README.md b/extensions/README.md index f586039..2e80761 100644 --- a/extensions/README.md +++ b/extensions/README.md @@ -2,8 +2,9 @@ Extensions are separate scripts that may be installed to extend diepAPIs functionality. -For Example if you want to use diepAPI.entityManager, install die entityManager extension. +For example if you want to use diepAPI.entityManager, install the entityManager extension. ### Extensions: -- Overlay \ No newline at end of file +- Overlay +- EntityManager \ No newline at end of file diff --git a/src/gamepad.ts b/src/gamepad.ts new file mode 100644 index 0000000..38ac7e7 --- /dev/null +++ b/src/gamepad.ts @@ -0,0 +1,78 @@ +class Gamepad { + #axes: number[]; + #buttons: { pressed: boolean }[]; + connected: boolean; + + /** + * Emulates a Gampad + * when `gamepad.connected` is set to `true` the game will + * ignore following keyboard inputs: + * W, A, S, D, upArrow, leftArrow, downArrow, rightArray + * leftMouse, rightMouse, Spacebar, Shift, + * MouseMovement to change tank angle + * these are also the only keys we emulate with this gamepad + * + */ + constructor() { + this.#axes = [0, 0, 0, 0]; + this.#buttons = [...Array(17)].map((x) => { + return { pressed: false }; + }); + this.connected = false; + + window.navigator.getGamepads = new Proxy(window.navigator.getGamepads, { + apply: (target, thisArg, args) => { + if (this.connected) return [this.#toGamepad()]; + return Reflect.apply(target, thisArg, args); + }, + }); + } + + set x(value: number) { + this.#axes[0] = value; + } + set y(value: number) { + this.#axes[1] = value; + } + set mx(value: number) { + this.#axes[2] = value; + } + set my(value: number) { + this.#axes[3] = value; + } + set leftMouse(value: boolean) { + this.#buttons[7].pressed = value; + } + set rightMouse(value: boolean) { + this.#buttons[6].pressed = value; + } + + get x(): number { + return this.#axes[0]; + } + get y(): number { + return this.#axes[1]; + } + get mx(): number { + return this.#axes[2]; + } + get my(): number { + return this.#axes[3]; + } + get leftMouse(): boolean { + return this.#buttons[7].pressed; + } + get rightMouse(): boolean { + return this.#buttons[6].pressed; + } + + #toGamepad(): Gamepad { + return { + axes: this.#axes, + buttons: this.#buttons, + mapping: 'standard', + } as unknown as Gamepad; + } +} + +export const gamepad = new Gamepad(); diff --git a/src/index.ts b/src/index.ts index af858bc..05f8b9e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,5 +5,6 @@ export { arena } from './arena'; export { camera } from './camera'; export { game } from './game'; export { minimap } from './minimap'; -export { playerMovement } from './playerMovement'; +export { player } from './player'; +export { playerMovement } from './player_movement'; export { scaling } from './scaling'; diff --git a/src/player.ts b/src/player.ts new file mode 100644 index 0000000..889ad1b --- /dev/null +++ b/src/player.ts @@ -0,0 +1,360 @@ +import { CanvasKit } from './core/canvas_kit'; +import { EventEmitter } from './core/event_emitter'; +import { gamepad } from './gamepad'; +import { Vector } from './core/vector'; + +import { scaling } from './scaling'; +import { playerMovement } from './player_movement'; +import { game } from './game'; + +const sleep = (ms: number): Promise => new Promise((resolve, reject) => setTimeout(resolve, ms)); + +class Player extends EventEmitter { + #isDead = true; + #mouseLock = false; + #mouseCanvasPos = new Vector(0, 0); + #mousePos = new Vector(0, 0); + #gamemode = _window.localStorage.gamemode; + #level = 1; + #tank = 'Tank'; + + constructor() { + super(); + + game.once('ready', () => { + //Check dead or alive + game.on('frame', () => { + const isDead = !_window.input.should_prevent_unload(); + if (this.#isDead == isDead) return; + this.#isDead = isDead; + + if (this.#isDead) this.#ondead(); + else this.#onspawn(); + }); + //update mouse position + game.on('frame', () => { + this.#mousePos = scaling.toArenaPos(this.#mouseCanvasPos); + }); + + //Mouse events + const canvas = document.getElementById('canvas'); + canvas.onmousemove = new Proxy(canvas.onmousemove, { + apply: (target, thisArg, args) => { + if (this.#mouseLock) return; + this.#onmousemove(args[0]); + return Reflect.apply(target, thisArg, args); + }, + }); + canvas.onmousedown = new Proxy(canvas.onmousedown, { + apply: (target, thisArg, args) => { + if (this.#mouseLock) return; + this.#onmousedown(args[0]); + return Reflect.apply(target, thisArg, args); + }, + }); + canvas.onmouseup = new Proxy(canvas.onmouseup, { + apply: (target, thisArg, args) => { + if (this.#mouseLock) return; + this.#onmouseup(args[0]); + return Reflect.apply(target, thisArg, args); + }, + }); + //Key events + _window.onkeydown = new Proxy(_window.onkeydown, { + apply: (target, thisArg, args) => { + this.#onkeydown(args[0]); + return Reflect.apply(target, thisArg, args); + }, + }); + _window.onkeyup = new Proxy(_window.onkeyup, { + apply: (target, thisArg, args) => { + this.#onkeyup(args[0]); + return Reflect.apply(target, thisArg, args); + }, + }); + + // tank and level event listener + CanvasKit.hookCtx('fillText', (target, thisArg, args) => { + const text = args[0]; + const match = text.match(/^Lvl (\d+) (\w*)$/); + if (match == null) { + return; + } + + const newLevel = Number(match[1]); + const newTank = match[2]; + + // make sure to trigger events for all levels in between. + while (newLevel > this.#level + 1) { + super.emit('level', ++this.#level); + } + + if (newLevel !== this.#level) super.emit('level', newLevel); + if (newTank !== this.#tank) super.emit('tank', newTank); + + this.#level = newLevel; + this.#tank = match[2]; + }); + }); + } + + get position(): Vector { + return playerMovement.position; + } + + get velocity(): Vector { + return playerMovement.velocity; + } + + get mouse(): Vector { + return this.#mousePos; + } + + get isDead(): boolean { + return this.#isDead; + } + + get gamemode(): string { + return this.#gamemode; + } + + get level(): number { + return this.#level; + } + + get tank(): string { + return this.#tank; + } + + /** + * Predict where this object will be after `time` + * @param time The time in ms + */ + predictPos(time: number): Vector { + return playerMovement.predictPos(time); + } + + async #ondead(): Promise { + await sleep(50); + super.emit('dead'); + } + + async #onspawn(): Promise { + this.#gamemode = _window.localStorage.gamemode; + + await sleep(50); + super.emit('spawn'); + } + + useGamepad(value: boolean): void { + gamepad.connected = value; + } + + keyDown(key: number | string): void { + if (typeof key == 'string') { + if (key.length != 1) throw new Error(`diepAPI: Unsupported key: ${key}`); + key = key.toUpperCase().charCodeAt(0); + } + _window.input.keyDown(key); + this.#onkeydown({ keyCode: key } as KeyboardEvent); + } + keyUp(key: number | string): void { + if (typeof key == 'string') { + if (key.length != 1) throw new Error(`diepAPI: Unsupported key: ${key}`); + key = key.toUpperCase().charCodeAt(0); + } + _window.input.keyUp(key); + this.#onkeyup({ keyCode: key } as KeyboardEvent); + } + async keyPress(key: number | string): Promise { + this.keyDown(key); + await sleep(200); + this.keyUp(key); + await sleep(10); + } + + async spawn(name: string, attempts: number = 0): Promise { + if (!this.#isDead) return; + + if (name !== undefined) (document.getElementById('textInput') as HTMLInputElement).value = name; + + await this.keyPress(13); + + await sleep(250); + + await this.spawn(name, attempts + 1); + } + + async upgrade_stat(id: number, level: number): Promise { + if (id < 1 || id > 8) throw `diepAPI: ${id} is not a supported stat`; + + this.keyDown(85); + for (let i = 0; i < level; i++) { + await this.keyPress(48 + id); + } + this.keyUp(85); + await sleep(250); + } + + async upgrade_tank(index: number): Promise { + index -= 1; + const x_index = index % 2; + const y_index = Math.floor(index / 2); + const x = scaling.screenToCanvasUnits(scaling.windowRatio * (x_index * 115 + 97.5)); + const y = scaling.screenToCanvasUnits(scaling.windowRatio * (y_index * 110 + 120)); + + this.#mouseLock = true; + _window.input.mouse(x, y); + await this.keyPress(1); + // wait 200 ms before disabling mouselock + await sleep(200); + this.#mouseLock = false; + // wait 1500 ms for the animation to finish + await sleep(1500); + } + + moveTo(arenaPos: Vector): void { + if (gamepad.connected) { + const direction = Vector.subtract(arenaPos, this.position); + const distance = Vector.len(direction); + + if (distance === 0) { + gamepad.x = 0; + gamepad.y = 0; + return; + } + + //max speed + const velocity = Vector.scale(1 / distance, direction); + + gamepad.x = velocity.x; + gamepad.y = velocity.y; + } else { + const direction = Vector.subtract(arenaPos, this.position); + + if (direction.x > 0) { + this.keyUp('a'); + this.keyDown('d'); + } else if (direction.x < 0) { + this.keyUp('d'); + this.keyDown('a'); + } else { + this.keyUp('a'); + this.keyUp('d'); + } + + if (direction.y > 0) { + this.keyUp('w'); + this.keyDown('s'); + } else if (direction.y < 0) { + this.keyUp('s'); + this.keyDown('w'); + } else { + this.keyUp('w'); + this.keyUp('s'); + } + } + } + + lookAt(arenaPos: Vector): void { + const position = scaling.toCanvasPos(arenaPos); + _window.input.mouse(position.x, position.y); + + this.#onmousemove({ clientX: position.x, clientY: position.y } as MouseEvent); + } + + #onmousemove(e: MouseEvent): void { + this.#mouseCanvasPos = scaling.screenToCanvas(new Vector(e.clientX, e.clientY)); + + if (gamepad.connected) { + const arenaPos = scaling.toArenaPos(this.#mouseCanvasPos); + const direction = Vector.subtract(arenaPos, this.position); + let axes = Vector.scale(scaling.fov / 1200 / 1.1, direction); + + const length = Vector.len(axes); + + if (length !== 0 && length < 0.15) { + axes = Vector.scale(0.15 / length, axes); + } + + gamepad.mx = axes.x; + gamepad.my = axes.y; + } + } + + #onmousedown(e: MouseEvent): void { + if (gamepad.connected) this.#onkeydown({ keyCode: e.which } as KeyboardEvent); + } + + #onmouseup(e: MouseEvent): void { + if (gamepad.connected) this.#onkeyup({ keyCode: e.which } as KeyboardEvent); + } + + #onkeydown(e: KeyboardEvent): void { + super.emit('keydown', e.keyCode); + + if (gamepad.connected) { + switch (e.keyCode) { + case 37: + case 65: + gamepad.x = -1; + break; + case 40: + case 83: + gamepad.y = 1; + break; + case 38: + case 87: + gamepad.y = -1; + break; + case 39: + case 68: + gamepad.x = 1; + break; + case 1: + case 32: + gamepad.leftMouse = true; + break; + case 3: + case 16: + gamepad.rightMouse = true; + break; + } + } + } + + #onkeyup(e: KeyboardEvent): void { + super.emit('keyup', e.keyCode); + + if (gamepad.connected) { + switch (e.keyCode) { + case 37: + case 65: + gamepad.x = 0; + break; + case 40: + case 83: + gamepad.y = 0; + break; + case 38: + case 87: + gamepad.y = 0; + break; + case 39: + case 68: + gamepad.x = 0; + break; + case 1: + case 32: + gamepad.leftMouse = false; + break; + case 3: + case 16: + gamepad.rightMouse = false; + break; + } + } + } +} + +export const player = new Player(); From d79b2ab0819440a88b282ec2256076eddf2d8fe9 Mon Sep 17 00:00:00 2001 From: Cazka Date: Thu, 14 Apr 2022 20:58:42 +0200 Subject: [PATCH 26/47] add entityManager --- extensions/entityManager/entity.ts | 45 ++++ extensions/entityManager/entityManager.ts | 280 ++++++++++++++++++++++ extensions/entityManager/tsconfig.json | 10 + extensions/overlay/overlay.ts | 4 +- 4 files changed, 337 insertions(+), 2 deletions(-) create mode 100644 extensions/entityManager/entity.ts create mode 100644 extensions/entityManager/entityManager.ts create mode 100644 extensions/entityManager/tsconfig.json diff --git a/extensions/entityManager/entity.ts b/extensions/entityManager/entity.ts new file mode 100644 index 0000000..6632b9d --- /dev/null +++ b/extensions/entityManager/entity.ts @@ -0,0 +1,45 @@ +import { Vector } from 'core/vector'; +import { Movement } from 'core/movement'; + +export enum EntityType { + Player, + Bullet, + Drone, + Trap, + Square, + Triangle, + Pentagon, + AlphaPentagon, + Crasher, + UNKNOWN, +} + +export enum EntityColor { + TeamBlue = '#00b2e1', + TeamRed = '#f14e54', + TeamPurple = '#bf7ff5', + TeamGreen = '#00e16e', + Square = '#ffe869', + Triangle = '#fc7677', + Pentagon = '#768dfc', + AlphaPentagon = '#768dfc', + Crasher = '#f177dd', + NecromancerDrone = '#fcc376', +} + +export const TeamColors = [EntityColor.TeamBlue, EntityColor.TeamRed, EntityColor.TeamPurple, EntityColor.TeamGreen]; + +/** + * Represents an ingame Entity. + * + * Holds minimal information currently. + */ +export class Entity extends Movement { + constructor(readonly type: EntityType, readonly parent: Entity, readonly extras: object = {}) { + super(); + } + + updatePos(newPos: Vector): void { + super.updatePos(newPos); + } +} diff --git a/extensions/entityManager/entityManager.ts b/extensions/entityManager/entityManager.ts new file mode 100644 index 0000000..8d4ffba --- /dev/null +++ b/extensions/entityManager/entityManager.ts @@ -0,0 +1,280 @@ +import { CanvasKit } from 'core/canvas_kit'; +import { Entity, EntityType, EntityColor, TeamColors } from './entity'; +import { Vector } from 'core/vector'; + +import { game } from 'game'; +import { playerMovement } from 'player_movement'; +import { scaling } from 'scaling'; + +/** + * Entity Manager is used to access the information about the entities, that are currently drawn on the screen. + * To access the entities the EntityManager exposes the EntityManager.entities field. + */ +class EntityManager { + #entities: Entity[] = []; + #entitiesUpdated: Entity[] = []; + + constructor() { + game.on('frame', () => { + this.#entities = this.#entitiesUpdated; + this.#entitiesUpdated = []; + }); + + this.#triangleHook(); + + this.#squareHook(); + + this.#pentagonHook(); + + //when is a bullet being drawn? + + //when is a player being drawn? + this.#playerHook(); + } + + get entities(): Entity[] { + return this.#entities; + } + + /** + * + * @returns The own player entity + */ + getPlayer(): Entity { + const player = this.#entities.filter( + (entity) => + entity.type == EntityType.Player && Vector.distance(entity.position, playerMovement.position) < 28 + ); + + return player[0]; + } + + /** + * Adds the entity to `#entitiesUpdated`. + * + * Will either find the entity in `#entities` or create a new `Entity`. + */ + #add(type: EntityType, position: Vector, extras: object = {}) { + const entityIndex = this.#findEntity(type, position); + + let entity: Entity; + if (entityIndex === -1) { + let parent = null; + if (type == EntityType.Bullet) { + // TODO: we want to change this to EntityType.Barrel in the future? + const parentIndex = this.#findEntity(EntityType.Player, position, 300); + if (parentIndex >= 0) { + parent = this.entities[parentIndex]; + } + } + + entity = new Entity(type, parent, { + id: Math.random().toString(36).slice(2, 5), + timestamp: performance.now(), + ...extras, + }); + } else { + entity = this.#entities[entityIndex]; + } + + entity.updatePos(position); + this.#entitiesUpdated.push(entity); + } + + /** + * Searches `#entities` for the entity that is closest to `position` and + * returns the __index__ of that entity or __-1__ if there is no match. + */ + #findEntity(type: EntityType, position: Vector, tolerance: number = 42): number { + let result = -1; + let shortestDistance = Infinity; + + this.#entities.forEach((x, i) => { + if (x.type !== type) return; + + const distance = Vector.distance(x.position, position); + + if (distance < shortestDistance) { + shortestDistance = distance; + result = i; + } + }); + + if (shortestDistance > tolerance) { + return -1; + } + + return result; + } + + #triangleHook(): void { + CanvasKit.hookPolygon(3, (vertices, ctx) => { + const side1 = Math.round(Vector.distance(vertices[0], vertices[1])); + const side2 = Math.round(Vector.distance(vertices[0], vertices[2])); + const side3 = Math.round(Vector.distance(vertices[1], vertices[2])); + //ignore Minimap Arrow + if (side1 !== side2 || side2 !== side3) return; + //ignore Leader Arrow + if ('#000000' === ctx.fillStyle) return; + + vertices = vertices.map((x) => scaling.toArenaPos(x)); + + const position = Vector.centroid(...vertices); + const radius = Math.round(Vector.radius(...vertices)); + const color = ctx.fillStyle as EntityColor; + + let type: EntityType; + switch (radius) { + case 23: + //battleship drone + if (TeamColors.includes(color)) type = EntityType.Drone; + break; + case 30: + //base drone + if (TeamColors.includes(color)) type = EntityType.Drone; + break; + case 35: + //small crasher + if (EntityColor.Crasher === color) type = EntityType.Crasher; + break; + case 40: + case 41: + case 42: + case 43: + case 44: + case 45: + case 46: + //overseer/overlord drone + if (TeamColors.includes(color)) type = EntityType.Drone; + break; + case 55: + //big crasher + if (EntityColor.Crasher === color) type = EntityType.Crasher; + //triangle + if (EntityColor.Triangle === color) type = EntityType.Triangle; + break; + } + if (type === undefined) type = EntityType.UNKNOWN; + this.#add(type, position, { color, radius }); + }); + } + + #squareHook(): void { + CanvasKit.hookPolygon(4, (vertices, ctx) => { + vertices = vertices.map((x) => scaling.toArenaPos(x)); + + const position = Vector.centroid(...vertices); + const radius = Math.round(Vector.radius(...vertices)); + const color = ctx.fillStyle as EntityColor; + + let type: EntityType; + switch (radius) { + case 55: + //square + if (EntityColor.Square === color) type = EntityType.Square; + //necromancer drone + if (TeamColors.includes(color) || EntityColor.NecromancerDrone === color) type = EntityType.Drone; + break; + } + if (type === undefined) type = EntityType.UNKNOWN; + this.#add(type, position, { color, radius }); + }); + } + + #pentagonHook(): void { + CanvasKit.hookPolygon(5, (vertices, ctx) => { + vertices = vertices.map((x) => scaling.toArenaPos(x)); + + const position = Vector.centroid(...vertices); + const radius = Math.round(Vector.radius(...vertices)); + const color = ctx.fillStyle as EntityColor; + + let type: EntityType; + switch (radius) { + case 75: + if (EntityColor.Pentagon === color) type = EntityType.Pentagon; + break; + case 200: + if (EntityColor.AlphaPentagon === color) type = EntityType.AlphaPentagon; + break; + } + if (type === undefined) type = EntityType.UNKNOWN; + this.#add(type, position, { color, radius }); + }); + } + + #playerHook(): void { + let index = 0; + + let position: Vector; + let color: string; + let radius: number; + + const onCircle = () => { + position = scaling.toArenaPos(position); + radius = scaling.toArenaUnits(new Vector(radius, radius)).x; + + let type = EntityType.UNKNOWN; + if (radius > 53) { + type = EntityType.Player; + } else { + type = EntityType.Bullet; + } + + this.#add(type, position, { + color, + radius, + }); + }; + + //Sequence: beginPath -> arc -> fill -> beginPath -> arc -> fill -> arc + CanvasKit.hookCtx('beginPath', (target, thisArg, args) => { + //start + if (index !== 3) { + index = 1; + return; + } + if (index === 3) { + index++; + return; + } + index = 0; + }); + //check when a circle is drawn. + CanvasKit.hookCtx('arc', (target, thisArg, args) => { + //outline + if (index === 1) { + index++; + const transform = thisArg.getTransform(); + position = new Vector(transform.e, transform.f); + radius = transform.a; + return; + } + if (index === 4) { + index++; + color = thisArg.fillStyle as string; + return; + } + //last arc call + if (index === 6) { + index++; + onCircle(); + return; + } + index = 0; + }); + CanvasKit.hookCtx('fill', (target, thisArg, args) => { + if (index === 2) { + index++; + return; + } + if (index === 5) { + index++; + return; + } + index = 0; + }); + } +} + +export const entityManager = new EntityManager(); diff --git a/extensions/entityManager/tsconfig.json b/extensions/entityManager/tsconfig.json new file mode 100644 index 0000000..5613ff0 --- /dev/null +++ b/extensions/entityManager/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "baseUrl": "../../src", + "outDir": "../../dist" + }, + "include": ["./", "../globals.d.ts"] +} diff --git a/extensions/overlay/overlay.ts b/extensions/overlay/overlay.ts index 4e6e08f..0ac2663 100644 --- a/extensions/overlay/overlay.ts +++ b/extensions/overlay/overlay.ts @@ -1,6 +1,6 @@ -import { CanvasKit } from '../../src/core/canvas_kit'; +import { CanvasKit } from 'core/canvas_kit'; -import { game } from '../../src/game'; +import { game } from 'game'; class Overlay { canvas: HTMLCanvasElement; From 3425dc380448c448206c1e286ee55b135f4f853e Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 14:52:53 +0200 Subject: [PATCH 27/47] retructure folders & move extensions back to diepAPI --- extensions/README.md | 10 ---------- extensions/entityManager/tsconfig.json | 10 ---------- extensions/globals.d.ts | 19 ------------------- extensions/overlay/tsconfig.json | 10 ---------- src/{ => apis}/arena.ts | 2 +- src/{ => apis}/camera.ts | 2 +- src/{ => apis}/game.ts | 4 ++-- src/{ => apis}/gamepad.ts | 0 src/{ => apis}/minimap.ts | 4 ++-- src/{ => apis}/player.ts | 12 ++++++------ src/{ => apis}/player_movement.ts | 2 +- src/{ => apis}/scaling.ts | 4 ++-- src/extensions/README.md | 11 +++++++++++ .../extensions}/entityManager/entity.ts | 4 ++-- .../entityManager/entityManager.ts | 10 +++++----- src/extensions/extension.ts | 14 ++++++++++++++ {extensions/overlay => src/tools}/overlay.ts | 4 ++-- 17 files changed, 49 insertions(+), 73 deletions(-) delete mode 100644 extensions/README.md delete mode 100644 extensions/entityManager/tsconfig.json delete mode 100644 extensions/globals.d.ts delete mode 100644 extensions/overlay/tsconfig.json rename src/{ => apis}/arena.ts (97%) rename src/{ => apis}/camera.ts (91%) rename src/{ => apis}/game.ts (81%) rename src/{ => apis}/gamepad.ts (100%) rename src/{ => apis}/minimap.ts (97%) rename src/{ => apis}/player.ts (98%) rename src/{ => apis}/player_movement.ts (90%) rename src/{ => apis}/scaling.ts (97%) create mode 100644 src/extensions/README.md rename {extensions => src/extensions}/entityManager/entity.ts (90%) rename {extensions => src/extensions}/entityManager/entityManager.ts (97%) create mode 100644 src/extensions/extension.ts rename {extensions/overlay => src/tools}/overlay.ts (89%) diff --git a/extensions/README.md b/extensions/README.md deleted file mode 100644 index 2e80761..0000000 --- a/extensions/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Extension - -Extensions are separate scripts that may be installed to extend diepAPIs functionality. - -For example if you want to use diepAPI.entityManager, install the entityManager extension. - -### Extensions: - -- Overlay -- EntityManager \ No newline at end of file diff --git a/extensions/entityManager/tsconfig.json b/extensions/entityManager/tsconfig.json deleted file mode 100644 index 5613ff0..0000000 --- a/extensions/entityManager/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "node", - "baseUrl": "../../src", - "outDir": "../../dist" - }, - "include": ["./", "../globals.d.ts"] -} diff --git a/extensions/globals.d.ts b/extensions/globals.d.ts deleted file mode 100644 index aba2ea0..0000000 --- a/extensions/globals.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -interface Input { - mouse: (x: number, y: number) => void; - keyDown: (key: string | number) => void; - keyUp: (key: string | number) => void; - blur: () => void; - wheel: Function; - prevent_right_click: (value: boolean) => void; - flushInputHooks: Function; - set_convar: (key: string, value: string) => boolean; - get_convar: (key: string) => null | string; - execute: (v: string) => void; - print_convar_help: () => void; - should_prevent_unload: () => boolean; -} - -declare var input: Input; - -declare var unsafeWindow: Window & typeof globalThis; -declare var _window: Window & typeof globalThis; diff --git a/extensions/overlay/tsconfig.json b/extensions/overlay/tsconfig.json deleted file mode 100644 index 5613ff0..0000000 --- a/extensions/overlay/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "node", - "baseUrl": "../../src", - "outDir": "../../dist" - }, - "include": ["./", "../globals.d.ts"] -} diff --git a/src/arena.ts b/src/apis/arena.ts similarity index 97% rename from src/arena.ts rename to src/apis/arena.ts index 3902582..99d72b5 100644 --- a/src/arena.ts +++ b/src/apis/arena.ts @@ -1,4 +1,4 @@ -import { Vector } from './core/vector'; +import { Vector } from '../core/vector'; import { minimap } from './minimap'; import { scaling } from './scaling'; diff --git a/src/camera.ts b/src/apis/camera.ts similarity index 91% rename from src/camera.ts rename to src/apis/camera.ts index a9d2e95..473a0ac 100644 --- a/src/camera.ts +++ b/src/apis/camera.ts @@ -1,4 +1,4 @@ -import { Vector } from './core/vector'; +import { Vector } from '../core/vector'; import { arena } from './arena'; import { minimap } from './minimap'; diff --git a/src/game.ts b/src/apis/game.ts similarity index 81% rename from src/game.ts rename to src/apis/game.ts index 81629a3..fd19a95 100644 --- a/src/game.ts +++ b/src/apis/game.ts @@ -1,5 +1,5 @@ -import { CanvasKit } from './core/canvas_kit'; -import { EventEmitter } from './core/event_emitter'; +import { CanvasKit } from '../core/canvas_kit'; +import { EventEmitter } from '../core/event_emitter'; class Game extends EventEmitter { #ready = false; diff --git a/src/gamepad.ts b/src/apis/gamepad.ts similarity index 100% rename from src/gamepad.ts rename to src/apis/gamepad.ts diff --git a/src/minimap.ts b/src/apis/minimap.ts similarity index 97% rename from src/minimap.ts rename to src/apis/minimap.ts index 5e92cf0..455f818 100644 --- a/src/minimap.ts +++ b/src/apis/minimap.ts @@ -1,5 +1,5 @@ -import { CanvasKit } from './core/canvas_kit'; -import { Vector } from './core/vector'; +import { CanvasKit } from '../core/canvas_kit'; +import { Vector } from '../core/vector'; import { game } from './game'; diff --git a/src/player.ts b/src/apis/player.ts similarity index 98% rename from src/player.ts rename to src/apis/player.ts index 889ad1b..f851252 100644 --- a/src/player.ts +++ b/src/apis/player.ts @@ -1,11 +1,11 @@ -import { CanvasKit } from './core/canvas_kit'; -import { EventEmitter } from './core/event_emitter'; -import { gamepad } from './gamepad'; -import { Vector } from './core/vector'; +import { CanvasKit } from '../core/canvas_kit'; +import { EventEmitter } from '../core/event_emitter'; +import { Vector } from '../core/vector'; -import { scaling } from './scaling'; -import { playerMovement } from './player_movement'; import { game } from './game'; +import { gamepad } from './gamepad'; +import { playerMovement } from './player_movement'; +import { scaling } from './scaling'; const sleep = (ms: number): Promise => new Promise((resolve, reject) => setTimeout(resolve, ms)); diff --git a/src/player_movement.ts b/src/apis/player_movement.ts similarity index 90% rename from src/player_movement.ts rename to src/apis/player_movement.ts index 674dae1..165df63 100644 --- a/src/player_movement.ts +++ b/src/apis/player_movement.ts @@ -1,4 +1,4 @@ -import { Movement } from './core/movement'; +import { Movement } from '../core/movement'; import { arena } from './arena'; import { game } from './game'; diff --git a/src/scaling.ts b/src/apis/scaling.ts similarity index 97% rename from src/scaling.ts rename to src/apis/scaling.ts index 122a16d..070cf34 100644 --- a/src/scaling.ts +++ b/src/apis/scaling.ts @@ -1,5 +1,5 @@ -import { CanvasKit } from './core/canvas_kit'; -import { Vector } from './core/vector'; +import { CanvasKit } from '../core/canvas_kit'; +import { Vector } from '../core/vector'; import { camera } from './camera'; diff --git a/src/extensions/README.md b/src/extensions/README.md new file mode 100644 index 0000000..cb87ab6 --- /dev/null +++ b/src/extensions/README.md @@ -0,0 +1,11 @@ +# Extension + +Extensions are modules that need to be loaded first to be useable (e.g. diepAPI.extensions.entityManager.load()) + + +### Extensions: + +- *entityManager + + +*entityManager is an extension since it's use is performance heavy. \ No newline at end of file diff --git a/extensions/entityManager/entity.ts b/src/extensions/entityManager/entity.ts similarity index 90% rename from extensions/entityManager/entity.ts rename to src/extensions/entityManager/entity.ts index 6632b9d..b13cfb4 100644 --- a/extensions/entityManager/entity.ts +++ b/src/extensions/entityManager/entity.ts @@ -1,5 +1,5 @@ -import { Vector } from 'core/vector'; -import { Movement } from 'core/movement'; +import { Vector } from '../../core/vector'; +import { Movement } from '../../core/movement'; export enum EntityType { Player, diff --git a/extensions/entityManager/entityManager.ts b/src/extensions/entityManager/entityManager.ts similarity index 97% rename from extensions/entityManager/entityManager.ts rename to src/extensions/entityManager/entityManager.ts index 8d4ffba..ec2375d 100644 --- a/extensions/entityManager/entityManager.ts +++ b/src/extensions/entityManager/entityManager.ts @@ -1,10 +1,10 @@ -import { CanvasKit } from 'core/canvas_kit'; +import { CanvasKit } from '../../core/canvas_kit'; import { Entity, EntityType, EntityColor, TeamColors } from './entity'; -import { Vector } from 'core/vector'; +import { Vector } from '../../core/vector'; -import { game } from 'game'; -import { playerMovement } from 'player_movement'; -import { scaling } from 'scaling'; +import { game } from '../../apis/game'; +import { playerMovement } from '../../apis/player_movement'; +import { scaling } from '../../apis/scaling'; /** * Entity Manager is used to access the information about the entities, that are currently drawn on the screen. diff --git a/src/extensions/extension.ts b/src/extensions/extension.ts new file mode 100644 index 0000000..7c848fa --- /dev/null +++ b/src/extensions/extension.ts @@ -0,0 +1,14 @@ +export class Extension { + #loaded = false; + constructor(private onload: () => void) {} + + #load() { + if (this.#loaded) { + return; + } + + this.#loaded = true; + + this.onload(); + } +} diff --git a/extensions/overlay/overlay.ts b/src/tools/overlay.ts similarity index 89% rename from extensions/overlay/overlay.ts rename to src/tools/overlay.ts index 0ac2663..ac832f8 100644 --- a/extensions/overlay/overlay.ts +++ b/src/tools/overlay.ts @@ -1,6 +1,6 @@ -import { CanvasKit } from 'core/canvas_kit'; +import { CanvasKit } from '../core/canvas_kit'; -import { game } from 'game'; +import { game } from '../apis/game'; class Overlay { canvas: HTMLCanvasElement; From 2b4acc15b1a13419037ba95d1cf99732ce01fbaf Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 14:53:18 +0200 Subject: [PATCH 28/47] update imports --- src/index.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index 05f8b9e..06d8c15 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,10 @@ export { CanvasKit } from './core/canvas_kit'; export { Vector } from './core/vector'; -export { arena } from './arena'; -export { camera } from './camera'; -export { game } from './game'; -export { minimap } from './minimap'; -export { player } from './player'; -export { playerMovement } from './player_movement'; -export { scaling } from './scaling'; +export { arena } from './apis/arena'; +export { camera } from './apis/camera'; +export { game } from './apis/game'; +export { minimap } from './apis/minimap'; +export { player } from './apis/player'; +export { playerMovement } from './apis/player_movement'; +export { scaling } from './apis/scaling'; From b62cd84e847ed6c67d817f062b0412dd5a6a12b7 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 15:27:57 +0200 Subject: [PATCH 29/47] added namespaces for exports --- src/apis/index.ts | 7 ++++++ src/core/index.ts | 4 +++ src/extensions/entityManager/entityManager.ts | 25 +++++++++++-------- src/extensions/extension.ts | 2 +- src/extensions/index.ts | 1 + src/index.ts | 15 +++++------ src/tools/index.ts | 1 + 7 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 src/apis/index.ts create mode 100644 src/core/index.ts create mode 100644 src/extensions/index.ts create mode 100644 src/tools/index.ts diff --git a/src/apis/index.ts b/src/apis/index.ts new file mode 100644 index 0000000..5cfe037 --- /dev/null +++ b/src/apis/index.ts @@ -0,0 +1,7 @@ +export { arena } from './arena'; +export { camera } from './camera'; +export { game } from './game'; +export { minimap } from './minimap'; +export { player } from './player'; +export { playerMovement } from './player_movement'; +export { scaling } from './scaling'; diff --git a/src/core/index.ts b/src/core/index.ts new file mode 100644 index 0000000..59620f0 --- /dev/null +++ b/src/core/index.ts @@ -0,0 +1,4 @@ +export { CanvasKit } from './canvas_kit'; +export { EventEmitter } from './event_emitter'; +export { Movement } from './movement'; +export { Vector } from './vector'; diff --git a/src/extensions/entityManager/entityManager.ts b/src/extensions/entityManager/entityManager.ts index ec2375d..d72b849 100644 --- a/src/extensions/entityManager/entityManager.ts +++ b/src/extensions/entityManager/entityManager.ts @@ -1,5 +1,6 @@ import { CanvasKit } from '../../core/canvas_kit'; import { Entity, EntityType, EntityColor, TeamColors } from './entity'; +import { Extension } from '../extension'; import { Vector } from '../../core/vector'; import { game } from '../../apis/game'; @@ -10,26 +11,28 @@ import { scaling } from '../../apis/scaling'; * Entity Manager is used to access the information about the entities, that are currently drawn on the screen. * To access the entities the EntityManager exposes the EntityManager.entities field. */ -class EntityManager { +class EntityManager extends Extension { #entities: Entity[] = []; #entitiesUpdated: Entity[] = []; constructor() { - game.on('frame', () => { - this.#entities = this.#entitiesUpdated; - this.#entitiesUpdated = []; - }); + super(() => { + game.on('frame', () => { + this.#entities = this.#entitiesUpdated; + this.#entitiesUpdated = []; + }); - this.#triangleHook(); + this.#triangleHook(); - this.#squareHook(); + this.#squareHook(); - this.#pentagonHook(); + this.#pentagonHook(); - //when is a bullet being drawn? + //when is a bullet being drawn? - //when is a player being drawn? - this.#playerHook(); + //when is a player being drawn? + this.#playerHook(); + }); } get entities(): Entity[] { diff --git a/src/extensions/extension.ts b/src/extensions/extension.ts index 7c848fa..e9d18d6 100644 --- a/src/extensions/extension.ts +++ b/src/extensions/extension.ts @@ -2,7 +2,7 @@ export class Extension { #loaded = false; constructor(private onload: () => void) {} - #load() { + public load() { if (this.#loaded) { return; } diff --git a/src/extensions/index.ts b/src/extensions/index.ts new file mode 100644 index 0000000..fec32a2 --- /dev/null +++ b/src/extensions/index.ts @@ -0,0 +1 @@ +export { entityManager } from './entityManager/entityManager'; diff --git a/src/index.ts b/src/index.ts index 06d8c15..4ae814e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,7 @@ -export { CanvasKit } from './core/canvas_kit'; -export { Vector } from './core/vector'; +export * as api from './apis'; -export { arena } from './apis/arena'; -export { camera } from './apis/camera'; -export { game } from './apis/game'; -export { minimap } from './apis/minimap'; -export { player } from './apis/player'; -export { playerMovement } from './apis/player_movement'; -export { scaling } from './apis/scaling'; +export * as core from './core'; + +export * as extensions from './extensions'; + +export * as tools from './tools'; diff --git a/src/tools/index.ts b/src/tools/index.ts new file mode 100644 index 0000000..d1498ae --- /dev/null +++ b/src/tools/index.ts @@ -0,0 +1 @@ +export { Overlay } from './overlay'; From b5bd705744be9ed5eb26b415c99d84c612b62886 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 16:25:06 +0200 Subject: [PATCH 30/47] rename entity manager --- .../entityManager.ts => entity_manager.ts} | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) rename src/extensions/{entityManager/entityManager.ts => entity_manager.ts} (96%) diff --git a/src/extensions/entityManager/entityManager.ts b/src/extensions/entity_manager.ts similarity index 96% rename from src/extensions/entityManager/entityManager.ts rename to src/extensions/entity_manager.ts index d72b849..cf3a152 100644 --- a/src/extensions/entityManager/entityManager.ts +++ b/src/extensions/entity_manager.ts @@ -1,11 +1,11 @@ -import { CanvasKit } from '../../core/canvas_kit'; -import { Entity, EntityType, EntityColor, TeamColors } from './entity'; -import { Extension } from '../extension'; -import { Vector } from '../../core/vector'; - -import { game } from '../../apis/game'; -import { playerMovement } from '../../apis/player_movement'; -import { scaling } from '../../apis/scaling'; +import { CanvasKit } from '../core/canvas_kit'; +import { Entity, EntityType, EntityColor, TeamColors } from '../core/entity'; +import { Extension } from './extension'; +import { Vector } from '../core/vector'; + +import { game } from '../apis/game'; +import { playerMovement } from '../apis/player_movement'; +import { scaling } from '../apis/scaling'; /** * Entity Manager is used to access the information about the entities, that are currently drawn on the screen. From 703b6547c5a5dc69257eaa527892c58ac359e637 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 16:25:18 +0200 Subject: [PATCH 31/47] move entity to core --- src/{extensions/entityManager => core}/entity.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename src/{extensions/entityManager => core}/entity.ts (87%) diff --git a/src/extensions/entityManager/entity.ts b/src/core/entity.ts similarity index 87% rename from src/extensions/entityManager/entity.ts rename to src/core/entity.ts index b13cfb4..747210f 100644 --- a/src/extensions/entityManager/entity.ts +++ b/src/core/entity.ts @@ -1,5 +1,5 @@ -import { Vector } from '../../core/vector'; -import { Movement } from '../../core/movement'; +import { Vector } from './vector'; +import { Movement } from './movement'; export enum EntityType { Player, @@ -35,7 +35,7 @@ export const TeamColors = [EntityColor.TeamBlue, EntityColor.TeamRed, EntityColo * Holds minimal information currently. */ export class Entity extends Movement { - constructor(readonly type: EntityType, readonly parent: Entity, readonly extras: object = {}) { + constructor(readonly type: EntityType, readonly parent: Entity, readonly extras: any) { super(); } From 16e7c3cc4b3c5ffcb203cf13c801f1544b741804 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 16:25:50 +0200 Subject: [PATCH 32/47] increase epsilon --- src/apis/minimap.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apis/minimap.ts b/src/apis/minimap.ts index 455f818..9ec39c9 100644 --- a/src/apis/minimap.ts +++ b/src/apis/minimap.ts @@ -75,7 +75,7 @@ class Minimap { } if ( Math.abs(transform.a / transform.d - window.innerWidth / window.innerHeight) > - (window.innerWidth / window.innerHeight) * 0.000_001 + (window.innerWidth / window.innerHeight) * 0.000_05 ) { return Reflect.apply(target, thisArg, args); } From 208da64e452c12d5b1d46b65135a0a396bd977f1 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 16:26:18 +0200 Subject: [PATCH 33/47] update import --- src/extensions/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extensions/index.ts b/src/extensions/index.ts index fec32a2..1cb5d0f 100644 --- a/src/extensions/index.ts +++ b/src/extensions/index.ts @@ -1 +1 @@ -export { entityManager } from './entityManager/entityManager'; +export { entityManager } from './entity_manager'; From d53f14c32c6e9845090168fa45d3da088a206631 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 16:27:43 +0200 Subject: [PATCH 34/47] export entity, color, type --- src/core/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/index.ts b/src/core/index.ts index 59620f0..e2afd61 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -1,4 +1,5 @@ export { CanvasKit } from './canvas_kit'; export { EventEmitter } from './event_emitter'; +export { Entity, EntityColor, EntityType } from './entity'; export { Movement } from './movement'; export { Vector } from './vector'; From d773c51a35870e4727246ee67c717912f314d028 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 16:52:24 +0200 Subject: [PATCH 35/47] move debug tool to extensions --- src/extensions/debug_tool.ts | 139 +++++++++++++++++++++++++++++++++++ src/extensions/index.ts | 1 + tools/entities_debug_tool.ts | 74 ------------------- tools/tsconfig.json | 10 --- 4 files changed, 140 insertions(+), 84 deletions(-) create mode 100644 src/extensions/debug_tool.ts delete mode 100644 tools/entities_debug_tool.ts delete mode 100644 tools/tsconfig.json diff --git a/src/extensions/debug_tool.ts b/src/extensions/debug_tool.ts new file mode 100644 index 0000000..750f7c9 --- /dev/null +++ b/src/extensions/debug_tool.ts @@ -0,0 +1,139 @@ +import { Vector } from '../core/vector'; +import { Entity, EntityType } from '../types/entity'; + +import { scaling } from '../apis/scaling'; +import { game } from '../apis/game'; + +import { Overlay } from '../tools/overlay'; + +import { entityManager } from './entity_manager'; +import { Extension } from './extension'; + +class DebugTool extends Extension { + #overlay: Overlay; + #ctx: CanvasRenderingContext2D; + + #drawBoundingBox = false; + #drawVelocity = false; + #drawParent = false; + #drawInfo = false; + + constructor() { + super(() => { + entityManager.load(); + + this.#overlay = new Overlay(); + this.#ctx = this.#overlay.ctx; + + game.on('frame', () => { + entityManager.entities.forEach((entity) => { + const position = scaling.toCanvasPos(entity.position); + const futurePos = scaling.toCanvasPos(entity.predictPos(1000)); + const dimensions = scaling.toCanvasUnits( + new Vector(2 * entity.extras.radius, 2 * entity.extras.radius) + ); + + if (this.#drawBoundingBox) { + this.#_drawboundingBox(entity, position, dimensions); + } + + if (this.#drawVelocity) { + this.#_drawVelocity(position, futurePos); + } + + if (this.#drawParent) { + this.#_drawParent(entity, futurePos); + } + + if (this.#drawInfo) { + this.#_drawInfo(entity, position, dimensions); + } + }); + }); + }); + } + + drawAll(v: boolean): void { + this.#drawBoundingBox = true; + this.#drawVelocity = true; + this.#drawParent = true; + this.#drawInfo = true; + } + + drawBoundingBox(v: boolean): void { + this.#drawBoundingBox = v; + } + + drawVelocity(v: boolean): void { + this.#drawVelocity = v; + } + + drawParent(v: boolean): void { + this.#drawParent = v; + } + + drawInfo(v: boolean): void { + this.#drawInfo = v; + } + + #_drawboundingBox(entity: Entity, position: Vector, dimensions: Vector) { + this.#ctx.save(); + + this.#ctx.strokeStyle = entity.type === EntityType.UNKNOWN ? '#ffffff' : entity.extras.color; + this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(3, 3)).x; + + this.#ctx.strokeRect(position.x - dimensions.x / 2, position.y - dimensions.y / 2, dimensions.x, dimensions.y); + + this.#ctx.restore(); + } + + #_drawVelocity(position: Vector, futurePos: Vector) { + this.#ctx.save(); + + this.#ctx.strokeStyle = '#000000'; + this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(3, 3)).x; + + this.#ctx.beginPath(); + this.#ctx.moveTo(position.x, position.y); + this.#ctx.lineTo(futurePos.x, futurePos.y); + this.#ctx.stroke(); + + this.#ctx.restore(); + } + + #_drawParent(entity: Entity, position: Vector) { + if (entity.parent === null) { + return; + } + + const parentPos = scaling.toCanvasPos(entity.parent.position); + + this.#ctx.save(); + + this.#ctx.strokeStyle = '#8aff69'; + this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(3, 3)).x; + + this.#ctx.beginPath(); + this.#ctx.moveTo(position.x, position.y); + this.#ctx.lineTo(parentPos.x, parentPos.y); + this.#ctx.stroke(); + + this.#ctx.restore(); + } + + #_drawInfo(entity: Entity, position: Vector, dimensions: Vector) { + this.#ctx.save(); + + this.#ctx.font = scaling.toCanvasUnits(new Vector(30, 30)).x + 'px Ubuntu'; + + this.#ctx.fillText( + `${entity.extras.id} ${Math.floor((performance.now() - entity.extras.timestamp) / 1000)}`, + position.x, + position.y - dimensions.y * 0.7 + ); + + this.#ctx.restore(); + } +} + +export const debugTool = new DebugTool(); diff --git a/src/extensions/index.ts b/src/extensions/index.ts index 1cb5d0f..a17836b 100644 --- a/src/extensions/index.ts +++ b/src/extensions/index.ts @@ -1 +1,2 @@ export { entityManager } from './entity_manager'; +export { debugTool } from './debug_tool'; diff --git a/tools/entities_debug_tool.ts b/tools/entities_debug_tool.ts deleted file mode 100644 index 2d21286..0000000 --- a/tools/entities_debug_tool.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { entityManager, game, arenaScaling, Vector, CanvasKit } from 'index'; - -entityManager.initialize(); - -class EntityOverlay { - #canvas: HTMLCanvasElement; - #ctx: CanvasRenderingContext2D; - constructor() { - this.#canvas = CanvasKit.createCanvas(); - this.#ctx = this.#canvas.getContext('2d'); - document.body.appendChild(this.#canvas); - - window.addEventListener('resize', () => this.#onResize()); - - game.on('frame', () => this.#onFrame()); - - this.#onResize(); - } - - #onResize(): void { - this.#canvas.width = window.innerWidth * window.devicePixelRatio; - this.#canvas.height = window.innerHeight * window.devicePixelRatio; - } - - #onFrame() { - this.#ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height); - entityManager.entities.forEach((entity) => { - const position = arenaScaling.toCanvasPos(entity.position); - const futurePos = arenaScaling.toCanvasPos(entity.predictPos(1000)); - const dimensions = arenaScaling.toCanvasUnits( - new Vector(2 * entity.extras.radius, 2 * entity.extras.radius) - ); - this.#ctx.strokeStyle = 9 === entity.type ? '#ffffff' : entity.extras.color; - this.#ctx.lineWidth = 5; - this.#ctx.strokeRect( - position.x - dimensions.x / 2, - position.y - dimensions.y / 2, - dimensions.x, - dimensions.y - ); - - //velocity - this.#ctx.strokeStyle = '#000000'; - this.#ctx.lineWidth = 3; - this.#ctx.beginPath(); - this.#ctx.moveTo(position.x, position.y); - this.#ctx.lineTo(futurePos.x, futurePos.y); - this.#ctx.stroke(); - - // parent - if (entity.parent !== null) { - const parentPos = arenaScaling.toCanvasPos(entity.parent.position); - - this.#ctx.strokeStyle = '#8aff69'; - this.#ctx.lineWidth = 3; - this.#ctx.beginPath(); - this.#ctx.moveTo(position.x, position.y); - this.#ctx.lineTo(parentPos.x, parentPos.y); - this.#ctx.stroke(); - } - - //Time alive + id - const fontSize = arenaScaling.toCanvasUnits(new Vector(30, 30)); - this.#ctx.font = fontSize.x + 'px Ubuntu'; - this.#ctx.fillText( - `${entity.extras.id} ${Math.floor((performance.now() - entity.extras.timestamp) / 1000)}`, - position.x, - position.y - dimensions.y * 0.7 - ); - }); - } -} - -const overlay = new EntityOverlay(); diff --git a/tools/tsconfig.json b/tools/tsconfig.json deleted file mode 100644 index 1f7eb48..0000000 --- a/tools/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "node", - "baseUrl": "../src", - "outDir": "../dist" - }, - "include": ["./"] -} From 67c0f17dd6f7c9040a43a883b3bf1390d7e7b1b5 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 16:52:50 +0200 Subject: [PATCH 36/47] new namespace types --- src/core/index.ts | 1 - src/extensions/entity_manager.ts | 2 +- src/index.ts | 2 ++ src/{core => types}/entity.ts | 4 ++-- src/types/index.ts | 1 + 5 files changed, 6 insertions(+), 4 deletions(-) rename src/{core => types}/entity.ts (91%) create mode 100644 src/types/index.ts diff --git a/src/core/index.ts b/src/core/index.ts index e2afd61..59620f0 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -1,5 +1,4 @@ export { CanvasKit } from './canvas_kit'; export { EventEmitter } from './event_emitter'; -export { Entity, EntityColor, EntityType } from './entity'; export { Movement } from './movement'; export { Vector } from './vector'; diff --git a/src/extensions/entity_manager.ts b/src/extensions/entity_manager.ts index cf3a152..d557640 100644 --- a/src/extensions/entity_manager.ts +++ b/src/extensions/entity_manager.ts @@ -1,5 +1,5 @@ import { CanvasKit } from '../core/canvas_kit'; -import { Entity, EntityType, EntityColor, TeamColors } from '../core/entity'; +import { Entity, EntityType, EntityColor, TeamColors } from '../types/entity'; import { Extension } from './extension'; import { Vector } from '../core/vector'; diff --git a/src/index.ts b/src/index.ts index 4ae814e..00c2e83 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,3 +5,5 @@ export * as core from './core'; export * as extensions from './extensions'; export * as tools from './tools'; + +export * as types from './types'; diff --git a/src/core/entity.ts b/src/types/entity.ts similarity index 91% rename from src/core/entity.ts rename to src/types/entity.ts index 747210f..c562c79 100644 --- a/src/core/entity.ts +++ b/src/types/entity.ts @@ -1,5 +1,5 @@ -import { Vector } from './vector'; -import { Movement } from './movement'; +import { Vector } from '../core/vector'; +import { Movement } from '../core/movement'; export enum EntityType { Player, diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..9383c06 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1 @@ +export { Entity, EntityColor, EntityType } from './entity'; From 5483dfaabbd1ff7bb776a4506ff90e01cc6e6887 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 16:55:22 +0200 Subject: [PATCH 37/47] drawAll fix --- src/extensions/debug_tool.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/extensions/debug_tool.ts b/src/extensions/debug_tool.ts index 750f7c9..78362a9 100644 --- a/src/extensions/debug_tool.ts +++ b/src/extensions/debug_tool.ts @@ -54,10 +54,10 @@ class DebugTool extends Extension { } drawAll(v: boolean): void { - this.#drawBoundingBox = true; - this.#drawVelocity = true; - this.#drawParent = true; - this.#drawInfo = true; + this.#drawBoundingBox = v; + this.#drawVelocity = v; + this.#drawParent = v; + this.#drawInfo = v; } drawBoundingBox(v: boolean): void { From 4d8fcaf892eb0f6bec9d3eaf9c4a4d7da059f949 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 17:16:58 +0200 Subject: [PATCH 38/47] increase lindeWidth --- src/extensions/debug_tool.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/extensions/debug_tool.ts b/src/extensions/debug_tool.ts index 78362a9..d798535 100644 --- a/src/extensions/debug_tool.ts +++ b/src/extensions/debug_tool.ts @@ -80,7 +80,7 @@ class DebugTool extends Extension { this.#ctx.save(); this.#ctx.strokeStyle = entity.type === EntityType.UNKNOWN ? '#ffffff' : entity.extras.color; - this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(3, 3)).x; + this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(5, 5)).x; this.#ctx.strokeRect(position.x - dimensions.x / 2, position.y - dimensions.y / 2, dimensions.x, dimensions.y); @@ -91,7 +91,7 @@ class DebugTool extends Extension { this.#ctx.save(); this.#ctx.strokeStyle = '#000000'; - this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(3, 3)).x; + this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(5, 5)).x; this.#ctx.beginPath(); this.#ctx.moveTo(position.x, position.y); @@ -111,7 +111,7 @@ class DebugTool extends Extension { this.#ctx.save(); this.#ctx.strokeStyle = '#8aff69'; - this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(3, 3)).x; + this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(5, 5)).x; this.#ctx.beginPath(); this.#ctx.moveTo(position.x, position.y); From 08b06da68a2bfdda22d3f3ca7044f7d8498ef955 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 18:57:06 +0200 Subject: [PATCH 39/47] add more info to debug tool --- src/extensions/debug_tool.ts | 57 ++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/src/extensions/debug_tool.ts b/src/extensions/debug_tool.ts index d798535..33c6125 100644 --- a/src/extensions/debug_tool.ts +++ b/src/extensions/debug_tool.ts @@ -3,6 +3,7 @@ import { Entity, EntityType } from '../types/entity'; import { scaling } from '../apis/scaling'; import { game } from '../apis/game'; +import { player } from '../apis/player'; import { Overlay } from '../tools/overlay'; @@ -17,6 +18,7 @@ class DebugTool extends Extension { #drawVelocity = false; #drawParent = false; #drawInfo = false; + #drawStats = false; constructor() { super(() => { @@ -42,13 +44,17 @@ class DebugTool extends Extension { } if (this.#drawParent) { - this.#_drawParent(entity, futurePos); + this.#_drawParent(entity, position); } if (this.#drawInfo) { this.#_drawInfo(entity, position, dimensions); } }); + + if (this.#drawStats) { + this.#_drawStats(); + } }); }); } @@ -58,6 +64,7 @@ class DebugTool extends Extension { this.#drawVelocity = v; this.#drawParent = v; this.#drawInfo = v; + this.#drawStats = v; } drawBoundingBox(v: boolean): void { @@ -76,6 +83,10 @@ class DebugTool extends Extension { this.#drawInfo = v; } + drawStats(v: boolean): void { + this.#drawStats = v; + } + #_drawboundingBox(entity: Entity, position: Vector, dimensions: Vector) { this.#ctx.save(); @@ -124,7 +135,18 @@ class DebugTool extends Extension { #_drawInfo(entity: Entity, position: Vector, dimensions: Vector) { this.#ctx.save(); - this.#ctx.font = scaling.toCanvasUnits(new Vector(30, 30)).x + 'px Ubuntu'; + const fontSize = scaling.toCanvasUnits(new Vector(30, 30)).x; + + this.#ctx.font = fontSize + 'px Ubuntu'; + this.#ctx.fillStyle = `#ffffff`; + this.#ctx.strokeStyle = '#000000'; + this.#ctx.lineWidth = fontSize / 5; + + this.#ctx.strokeText( + `${entity.extras.id} ${Math.floor((performance.now() - entity.extras.timestamp) / 1000)}`, + position.x, + position.y - dimensions.y * 0.7 + ); this.#ctx.fillText( `${entity.extras.id} ${Math.floor((performance.now() - entity.extras.timestamp) / 1000)}`, @@ -134,6 +156,37 @@ class DebugTool extends Extension { this.#ctx.restore(); } + + #_drawStats() { + const text = `Debug Tool: + Game Info: + gamemode: ${player.gamemode} + entities: ${entityManager.entities.length} + + Player Info: + Is dead: ${player.isDead} + level: ${player.level} + tank: ${player.tank} + position: ${Math.round(player.position.x)},${Math.round(player.position.y)} + mouse: ${Math.round(player.mouse.x)},${Math.round(player.mouse.y)} + velocity [units/seconds]: ${Math.round(Math.hypot(player.velocity.x, player.velocity.y))}`; + + this.#ctx.save(); + + const fontSize = 20 * _window.devicePixelRatio; + + this.#ctx.font = `${fontSize}px Ubuntu`; + this.#ctx.fillStyle = `#ffffff`; + this.#ctx.strokeStyle = '#000000'; + this.#ctx.lineWidth = fontSize / 5; + + text.split('\n').forEach((x, i) => { + this.#ctx.strokeText(x, 0, _window.innerHeight * 0.25 + i * fontSize * 1.05); + this.#ctx.fillText(x, 0, _window.innerHeight * 0.25 + i * fontSize * 1.05); + }); + + this.#ctx.restore(); + } } export const debugTool = new DebugTool(); From efedcf8b8406c80dc8bdb15cd7eab18fb94a2c87 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 21:31:53 +0200 Subject: [PATCH 40/47] change api namespace to apis --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 00c2e83..f400e81 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -export * as api from './apis'; +export * as apis from './apis'; export * as core from './core'; From 7f8b31940a953917d9141524a13478edd35e08cc Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 21:32:14 +0200 Subject: [PATCH 41/47] update afk example to use v3 api --- examples/afk.user.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/afk.user.js b/examples/afk.user.js index 023f379..3ed465b 100644 --- a/examples/afk.user.js +++ b/examples/afk.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name AFK Script // @description press Q to activate AFK -// @version 0.0.4 +// @version 0.0.5 // @author Cazka // @match https://diep.io/* // @icon https://www.google.com/s2/favicons?domain=diep.io @@ -10,7 +10,8 @@ // ==/UserScript== if (!window.diepAPI) return window.alert('Please install diepAPI to use this script'); -const { player, game, Vector } = window.diepAPI; +const { Vector } = window.diepAPI.core; +const { player, game } = window.diepAPI.apis; let afkActive = false; let afkPosition; From da7475c2a35507fc0a29150bffe1d9fb2baee2e1 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 21:32:25 +0200 Subject: [PATCH 42/47] remove entity debug tool from example --- examples/entity_debug_tool.user.js | 64 ------------------------------ 1 file changed, 64 deletions(-) delete mode 100644 examples/entity_debug_tool.user.js diff --git a/examples/entity_debug_tool.user.js b/examples/entity_debug_tool.user.js deleted file mode 100644 index a8e4942..0000000 --- a/examples/entity_debug_tool.user.js +++ /dev/null @@ -1,64 +0,0 @@ -// ==UserScript== -// @name Entity Debug Tool -// @description https://github.com/Cazka/diepAPI -// @version 1.0.1 -// @author Cazka -// @match https://diep.io/* -// @icon https://www.google.com/s2/favicons?domain=diep.io -// @namespace https://greasyfork.org/users/541070 -// @grant none -// ==/UserScript== -if (!window.diepAPI) return window.alert('Please install diepAPI to use this script'); - -const { entityManager, game, arenaScaling, Vector, CanvasKit } = window.diepAPI; - -class EntityOverlay { - #canvas; - #ctx; - constructor() { - this.#canvas = CanvasKit.createCanvas(); - this.#ctx = this.#canvas.getContext('2d'); - document.body.appendChild(this.#canvas); - window.addEventListener('resize', () => this.#onResize()); - game.on('frame', () => this.#onFrame()); - this.#onResize(); - } - #onResize() { - this.#canvas.width = window.innerWidth * window.devicePixelRatio; - this.#canvas.height = window.innerHeight * window.devicePixelRatio; - } - #onFrame() { - this.#ctx.clearRect(0, 0, this.#canvas.width, this.#canvas.height); - entityManager.entities.forEach((entity) => { - const position = arenaScaling.toCanvasPos(entity.position); - const futurePos = arenaScaling.toCanvasPos(entity.predictPos(1000)); - const dimensions = arenaScaling.toCanvasUnits( - new Vector(2 * entity.extras.radius, 2 * entity.extras.radius) - ); - this.#ctx.strokeStyle = 9 === entity.type ? '#ffffff' : entity.extras.color; - this.#ctx.lineWidth = 5; - this.#ctx.strokeRect( - position.x - dimensions.x / 2, - position.y - dimensions.y / 2, - dimensions.x, - dimensions.y - ); - //velocity - this.#ctx.strokeStyle = '#000000'; - this.#ctx.lineWidth = 3; - this.#ctx.beginPath(); - this.#ctx.moveTo(position.x, position.y); - this.#ctx.lineTo(futurePos.x, futurePos.y); - this.#ctx.stroke(); - //Time alive + id - const fontSize = arenaScaling.toCanvasUnits(new Vector(30, 30)); - this.#ctx.font = fontSize.x + 'px Ubuntu'; - this.#ctx.fillText( - `${entity.extras.id} ${Math.floor((performance.now() - entity.extras.timestamp) / 1000)}`, - position.x, - position.y - dimensions.y * 0.7 - ); - }); - } -} -const overlay = new EntityOverlay(); From 69c3b551a823a6148c6f8d0e5e44e8e341b52827 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 21:46:05 +0200 Subject: [PATCH 43/47] update farm script to use v3 api --- examples/farmer.user.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/farmer.user.js b/examples/farmer.user.js index 12af740..f199a52 100644 --- a/examples/farmer.user.js +++ b/examples/farmer.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name Farm Script // @description press P to start the farmer -// @version 0.0.6 +// @version 0.0.7 // @author Cazka // @match https://diep.io/* // @icon https://www.google.com/s2/favicons?domain=diep.io @@ -10,7 +10,11 @@ // ==/UserScript== if (!window.diepAPI) return window.alert('Please install diepAPI to use this script'); -const { player, game, entityManager, Vector } = window.diepAPI; +const { Vector } = window.diepAPI.core; +const { player, game } = window.diepAPI.apis; +const { entityManager } = window.diepAPI.extensions; + +entityManager.load(); let farmActive = false; From 9220cce4131f2af60680112bc94647728a76e129 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sat, 16 Apr 2022 21:46:54 +0200 Subject: [PATCH 44/47] update press o to use v3 api --- examples/press_o.user.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/press_o.user.js b/examples/press_o.user.js index cfac5d9..30cf04e 100644 --- a/examples/press_o.user.js +++ b/examples/press_o.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name Press O // @description best script -// @version 0.0.1 +// @version 0.0.2 // @author Cazka // @match https://diep.io/* // @icon https://www.google.com/s2/favicons?domain=diep.io @@ -10,7 +10,7 @@ // ==/UserScript== if (!window.diepAPI) return window.alert('Please install diepAPI to use this script'); -const { player } = window.diepAPI; +const { player } = window.diepAPI.apis; player.on('spawn', async () => await player.keyPress('o')); player.on('dead', async () => await player.spawn()); From 1f79560e5ad8d21d9f8f8244700cfb5de31b2e88 Mon Sep 17 00:00:00 2001 From: Cazka Date: Mon, 18 Apr 2022 01:03:05 +0200 Subject: [PATCH 45/47] =?UTF-8?q?added=20background=20overlay=20?= =?UTF-8?q?=F0=9F=99=8C=F0=9F=8F=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tools/background_overlay.ts | 35 +++++++++++++++++++++++++++++++++ src/tools/index.ts | 1 + src/tools/overlay.ts | 4 ++++ 3 files changed, 40 insertions(+) create mode 100644 src/tools/background_overlay.ts diff --git a/src/tools/background_overlay.ts b/src/tools/background_overlay.ts new file mode 100644 index 0000000..8f94a69 --- /dev/null +++ b/src/tools/background_overlay.ts @@ -0,0 +1,35 @@ +import { CanvasKit } from '../core/canvas_kit'; +import { Overlay } from './overlay'; + +class BackgroundOverlay extends Overlay { + #gameCanvas: HTMLCanvasElement; + #gameContext: CanvasRenderingContext2D; + + constructor() { + super(); + + this.#gameCanvas = document.getElementById('canvas') as HTMLCanvasElement; + this.#gameContext = this.#gameCanvas.getContext('2d'); + + this.#hookBackground(); + } + + #hookBackground() { + CanvasKit.overrideCtx('fillRect', (target, thisArg, args) => { + if (typeof thisArg.fillStyle !== 'object') { + return Reflect.apply(target, thisArg, args); + } + const result = Reflect.apply(target, thisArg, args); + + this.#gameContext.save(); + this.#gameContext.setTransform(1, 0, 0, 1, 0, 0); + this.#gameContext.globalAlpha = 1; + this.#gameContext.drawImage(this.canvas, 0, 0); + this.#gameContext.restore(); + + return result; + }); + } +} + +export { BackgroundOverlay }; diff --git a/src/tools/index.ts b/src/tools/index.ts index d1498ae..9966a9f 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -1 +1,2 @@ export { Overlay } from './overlay'; +export { BackgroundOverlay } from './background_overlay'; diff --git a/src/tools/overlay.ts b/src/tools/overlay.ts index ac832f8..e27b3c1 100644 --- a/src/tools/overlay.ts +++ b/src/tools/overlay.ts @@ -20,7 +20,11 @@ class Overlay { } #onFrame() { + this.canvas.width = _window.innerWidth * _window.devicePixelRatio; + this.canvas.height = _window.innerHeight * _window.devicePixelRatio; + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); } } From 21100fc0152851851a0c4887fa8ef2d2c29342e8 Mon Sep 17 00:00:00 2001 From: Cazka Date: Mon, 18 Apr 2022 01:15:33 +0200 Subject: [PATCH 46/47] turn overlay to singletons --- src/extensions/debug_tool.ts | 87 ++++++++++++++++----------------- src/tools/background_overlay.ts | 37 +++++++++++--- src/tools/index.ts | 4 +- src/tools/overlay.ts | 2 +- 4 files changed, 76 insertions(+), 54 deletions(-) diff --git a/src/extensions/debug_tool.ts b/src/extensions/debug_tool.ts index 33c6125..7a73339 100644 --- a/src/extensions/debug_tool.ts +++ b/src/extensions/debug_tool.ts @@ -5,15 +5,12 @@ import { scaling } from '../apis/scaling'; import { game } from '../apis/game'; import { player } from '../apis/player'; -import { Overlay } from '../tools/overlay'; +import { overlay } from '../tools/overlay'; import { entityManager } from './entity_manager'; import { Extension } from './extension'; class DebugTool extends Extension { - #overlay: Overlay; - #ctx: CanvasRenderingContext2D; - #drawBoundingBox = false; #drawVelocity = false; #drawParent = false; @@ -24,9 +21,6 @@ class DebugTool extends Extension { super(() => { entityManager.load(); - this.#overlay = new Overlay(); - this.#ctx = this.#overlay.ctx; - game.on('frame', () => { entityManager.entities.forEach((entity) => { const position = scaling.toCanvasPos(entity.position); @@ -88,28 +82,33 @@ class DebugTool extends Extension { } #_drawboundingBox(entity: Entity, position: Vector, dimensions: Vector) { - this.#ctx.save(); + overlay.ctx.save(); - this.#ctx.strokeStyle = entity.type === EntityType.UNKNOWN ? '#ffffff' : entity.extras.color; - this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(5, 5)).x; + overlay.ctx.strokeStyle = entity.type === EntityType.UNKNOWN ? '#ffffff' : entity.extras.color; + overlay.ctx.lineWidth = scaling.toCanvasUnits(new Vector(5, 5)).x; - this.#ctx.strokeRect(position.x - dimensions.x / 2, position.y - dimensions.y / 2, dimensions.x, dimensions.y); + overlay.ctx.strokeRect( + position.x - dimensions.x / 2, + position.y - dimensions.y / 2, + dimensions.x, + dimensions.y + ); - this.#ctx.restore(); + overlay.ctx.restore(); } #_drawVelocity(position: Vector, futurePos: Vector) { - this.#ctx.save(); + overlay.ctx.save(); - this.#ctx.strokeStyle = '#000000'; - this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(5, 5)).x; + overlay.ctx.strokeStyle = '#000000'; + overlay.ctx.lineWidth = scaling.toCanvasUnits(new Vector(5, 5)).x; - this.#ctx.beginPath(); - this.#ctx.moveTo(position.x, position.y); - this.#ctx.lineTo(futurePos.x, futurePos.y); - this.#ctx.stroke(); + overlay.ctx.beginPath(); + overlay.ctx.moveTo(position.x, position.y); + overlay.ctx.lineTo(futurePos.x, futurePos.y); + overlay.ctx.stroke(); - this.#ctx.restore(); + overlay.ctx.restore(); } #_drawParent(entity: Entity, position: Vector) { @@ -119,42 +118,42 @@ class DebugTool extends Extension { const parentPos = scaling.toCanvasPos(entity.parent.position); - this.#ctx.save(); + overlay.ctx.save(); - this.#ctx.strokeStyle = '#8aff69'; - this.#ctx.lineWidth = scaling.toCanvasUnits(new Vector(5, 5)).x; + overlay.ctx.strokeStyle = '#8aff69'; + overlay.ctx.lineWidth = scaling.toCanvasUnits(new Vector(5, 5)).x; - this.#ctx.beginPath(); - this.#ctx.moveTo(position.x, position.y); - this.#ctx.lineTo(parentPos.x, parentPos.y); - this.#ctx.stroke(); + overlay.ctx.beginPath(); + overlay.ctx.moveTo(position.x, position.y); + overlay.ctx.lineTo(parentPos.x, parentPos.y); + overlay.ctx.stroke(); - this.#ctx.restore(); + overlay.ctx.restore(); } #_drawInfo(entity: Entity, position: Vector, dimensions: Vector) { - this.#ctx.save(); + overlay.ctx.save(); const fontSize = scaling.toCanvasUnits(new Vector(30, 30)).x; - this.#ctx.font = fontSize + 'px Ubuntu'; - this.#ctx.fillStyle = `#ffffff`; - this.#ctx.strokeStyle = '#000000'; - this.#ctx.lineWidth = fontSize / 5; + overlay.ctx.font = fontSize + 'px Ubuntu'; + overlay.ctx.fillStyle = `#ffffff`; + overlay.ctx.strokeStyle = '#000000'; + overlay.ctx.lineWidth = fontSize / 5; - this.#ctx.strokeText( + overlay.ctx.strokeText( `${entity.extras.id} ${Math.floor((performance.now() - entity.extras.timestamp) / 1000)}`, position.x, position.y - dimensions.y * 0.7 ); - this.#ctx.fillText( + overlay.ctx.fillText( `${entity.extras.id} ${Math.floor((performance.now() - entity.extras.timestamp) / 1000)}`, position.x, position.y - dimensions.y * 0.7 ); - this.#ctx.restore(); + overlay.ctx.restore(); } #_drawStats() { @@ -171,21 +170,21 @@ class DebugTool extends Extension { mouse: ${Math.round(player.mouse.x)},${Math.round(player.mouse.y)} velocity [units/seconds]: ${Math.round(Math.hypot(player.velocity.x, player.velocity.y))}`; - this.#ctx.save(); + overlay.ctx.save(); const fontSize = 20 * _window.devicePixelRatio; - this.#ctx.font = `${fontSize}px Ubuntu`; - this.#ctx.fillStyle = `#ffffff`; - this.#ctx.strokeStyle = '#000000'; - this.#ctx.lineWidth = fontSize / 5; + overlay.ctx.font = `${fontSize}px Ubuntu`; + overlay.ctx.fillStyle = `#ffffff`; + overlay.ctx.strokeStyle = '#000000'; + overlay.ctx.lineWidth = fontSize / 5; text.split('\n').forEach((x, i) => { - this.#ctx.strokeText(x, 0, _window.innerHeight * 0.25 + i * fontSize * 1.05); - this.#ctx.fillText(x, 0, _window.innerHeight * 0.25 + i * fontSize * 1.05); + overlay.ctx.strokeText(x, 0, _window.innerHeight * 0.25 + i * fontSize * 1.05); + overlay.ctx.fillText(x, 0, _window.innerHeight * 0.25 + i * fontSize * 1.05); }); - this.#ctx.restore(); + overlay.ctx.restore(); } } diff --git a/src/tools/background_overlay.ts b/src/tools/background_overlay.ts index 8f94a69..8185f4c 100644 --- a/src/tools/background_overlay.ts +++ b/src/tools/background_overlay.ts @@ -1,17 +1,40 @@ import { CanvasKit } from '../core/canvas_kit'; -import { Overlay } from './overlay'; -class BackgroundOverlay extends Overlay { +import { game } from '../apis/game'; + +class BackgroundOverlay { + canvas: HTMLCanvasElement; + ctx: CanvasRenderingContext2D; + #gameCanvas: HTMLCanvasElement; #gameContext: CanvasRenderingContext2D; constructor() { - super(); + this.canvas = CanvasKit.createCanvas(); + this.ctx = this.canvas.getContext('2d'); + + _window.addEventListener('resize', () => this.#onResize()); + game.on('frame', () => this.#onFrame()); + this.#onResize(); + + game.once('ready', () => { + this.#gameCanvas = document.getElementById('canvas') as HTMLCanvasElement; + this.#gameContext = this.#gameCanvas.getContext('2d'); + this.#hookBackground(); + }); + } + + #onResize() { + this.canvas.width = _window.innerWidth * _window.devicePixelRatio; + this.canvas.height = _window.innerHeight * _window.devicePixelRatio; + } - this.#gameCanvas = document.getElementById('canvas') as HTMLCanvasElement; - this.#gameContext = this.#gameCanvas.getContext('2d'); + #onFrame() { + this.canvas.width = _window.innerWidth * _window.devicePixelRatio; + this.canvas.height = _window.innerHeight * _window.devicePixelRatio; - this.#hookBackground(); + this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); } #hookBackground() { @@ -32,4 +55,4 @@ class BackgroundOverlay extends Overlay { } } -export { BackgroundOverlay }; +export const backgroundOverlay = new BackgroundOverlay(); diff --git a/src/tools/index.ts b/src/tools/index.ts index 9966a9f..d2fa81d 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -1,2 +1,2 @@ -export { Overlay } from './overlay'; -export { BackgroundOverlay } from './background_overlay'; +export { overlay } from './overlay'; +export { backgroundOverlay } from './background_overlay'; diff --git a/src/tools/overlay.ts b/src/tools/overlay.ts index e27b3c1..e1fa1e6 100644 --- a/src/tools/overlay.ts +++ b/src/tools/overlay.ts @@ -28,4 +28,4 @@ class Overlay { } } -export { Overlay }; +export const overlay = new Overlay(); From f0f7256b6fea22ccf6aefad1152555fc739b1e75 Mon Sep 17 00:00:00 2001 From: Cazka Date: Sun, 2 Oct 2022 21:01:56 +0200 Subject: [PATCH 47/47] add template user script --- template.user.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 template.user.js diff --git a/template.user.js b/template.user.js new file mode 100644 index 0000000..a46aebf --- /dev/null +++ b/template.user.js @@ -0,0 +1,20 @@ +// ==UserScript== +// @name diepAPI +// @description https://github.com/Cazka/diepAPI +// @version 3.0.0 +// @author Cazka +// @match https://diep.io/* +// @icon https://www.google.com/s2/favicons?domain=diep.io +// @namespace https://greasyfork.org/users/541070 +// @run-at document-start +// @grant none +// ==/UserScript== +(() => { + const _window = "undefined" == typeof unsafeWindow ? window : unsafeWindow; + if (_window.diepAPI) return; + + //diepAPI start + //diepAPI end + + _window.diepAPI = diepAPI; +})();