UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

298 lines 17.6 kB
import { padColOfNumbers } from "./../debug/index.js"; import { TgdVec3 } from "./vec3.js"; import { TgdVec4 } from "./vec4.js"; import { mat4 } from "gl-matrix"; /** * Column-first 4x4 matrix. * * - `m12` means row 2 and column 3 (__A__). * - `m20` means row 3 and column 1 (__B__). * * ``` * +-+-+-+-+ * | | | | | * +-+-+-+-+ * | | |A| | * +-+-+-+-+ * |B| | | | * +-+-+-+-+ * | | | | | * +-+-+-+-+ * ``` * * This is how mathematicians use matrices. * * But, internally, for WebGL compliance, we store the data like this: * * ``` * +--+--+--+--+ * | 0| 4| 8|12| * +--+--+--+--+ * | 1| 5| 9|13| * +--+--+--+--+ * | 2| 6|10|14| * +--+--+--+--+ * | 3| 7|11|15| * +--+--+--+--+ * ``` * * That's why is better to access members through the accessor `m00`, `m01`, etc. */ export class TgdMat4 extends Float32Array { constructor(m00 = 1, m10 = 0, m20 = 0, m30 = 0, m01 = 0, m11 = 1, m21 = 0, m31 = 0, m02 = 0, m12 = 0, m22 = 1, m32 = 0, m03 = 0, m13 = 0, m23 = 0, m33 = 1) { if (typeof m00 === "number") { super([ m00, m10, m20, m30, m01, m11, m21, m31, m02, m12, m22, m32, m03, m13, m23, m33, ]); } else { super(m00); } } reset(row0 = TgdVec4.X, row1 = TgdVec4.Y, row2 = TgdVec4.Z, row3 = TgdVec4.W) { const [m00, m01, m02, m03] = row0; const [m10, m11, m12, m13] = row1; const [m20, m21, m22, m23] = row2; const [m30, m31, m32, m33] = row3; this.m00 = m00; this.m01 = m01; this.m02 = m02; this.m03 = m03; this.m10 = m10; this.m11 = m11; this.m12 = m12; this.m13 = m13; this.m20 = m20; this.m21 = m21; this.m22 = m22; this.m23 = m23; this.m30 = m30; this.m31 = m31; this.m32 = m32; this.m33 = m33; return this; } multiply(mat) { mat4.multiply(this, this, mat); return this; } /** * @param from This matrix will become the inversion of `from`. * If not defined, the matrix will invert itself. */ invert(from) { mat4.invert(this, from !== null && from !== void 0 ? from : this); return this; } get translation() { const { m03, m13, m23 } = this; return new TgdVec3(m03, m13, m23); } set translation(vec) { const [x, y, z] = vec; this.m03 = x; this.m13 = y; this.m23 = z; } toTanslation(target) { target.x = this.m03; target.y = this.m13; target.z = this.m23; return this; } /** * Add `delta` to the current translation. */ translate(delta) { const [x, y, z] = delta; this.m03 += x; this.m13 += y; this.m23 += z; return this; } from(mat) { var _a; for (let index = 0; index < this.length; index++) { this[index] = (_a = mat[index]) !== null && _a !== void 0 ? _a : 0; } return this; } fromMat3(mat) { this.m00 = mat.m00; this.m01 = mat.m01; this.m02 = mat.m02; this.m10 = mat.m10; this.m11 = mat.m11; this.m12 = mat.m12; this.m20 = mat.m20; this.m21 = mat.m21; this.m22 = mat.m22; return this; } toAxes(axisX, axisY, axisZ) { this.toAxisX(axisX); this.toAxisY(axisY); return this.toAxisZ(axisZ); } toAxisX(axisX) { axisX.x = this.m00; axisX.y = this.m01; axisX.z = this.m02; return this; } toAxisY(axisY) { axisY.x = this.m10; axisY.y = this.m11; axisY.z = this.m12; return this; } toAxisZ(axisZ) { axisZ.x = this.m20; axisZ.y = this.m21; axisZ.z = this.m22; return this; } fromQuat({ x, y, z, w }) { mat4.fromQuat(this, [x, y, z, w]); return this; } get m00() { return this[IDX_m00]; } set m00(v) { this[IDX_m00] = v; } get m10() { return this[IDX_m10]; } set m10(v) { this[IDX_m10] = v; } get m20() { return this[IDX_m20]; } set m20(v) { this[IDX_m20] = v; } get m30() { return this[IDX_m30]; } set m30(v) { this[IDX_m30] = v; } get m01() { return this[IDX_m01]; } set m01(v) { this[IDX_m01] = v; } get m11() { return this[IDX_m11]; } set m11(v) { this[IDX_m11] = v; } get m21() { return this[IDX_m21]; } set m21(v) { this[IDX_m21] = v; } get m31() { return this[IDX_m31]; } set m31(v) { this[IDX_m31] = v; } get m02() { return this[IDX_m02]; } set m02(v) { this[IDX_m02] = v; } get m12() { return this[IDX_m12]; } set m12(v) { this[IDX_m12] = v; } get m22() { return this[IDX_m22]; } set m22(v) { this[IDX_m22] = v; } get m32() { return this[IDX_m32]; } set m32(v) { this[IDX_m32] = v; } get m03() { return this[IDX_m03]; } set m03(v) { this[IDX_m03] = v; } get m13() { return this[IDX_m13]; } set m13(v) { this[IDX_m13] = v; } get m23() { return this[IDX_m23]; } set m23(v) { this[IDX_m23] = v; } get m33() { return this[IDX_m33]; } set m33(v) { this[IDX_m33] = v; } debug(caption = "Mat4") { const row0 = padColOfNumbers([this.m00, this.m01, this.m02, this.m03]); const row1 = padColOfNumbers([this.m10, this.m11, this.m12, this.m13]); const row2 = padColOfNumbers([this.m20, this.m21, this.m22, this.m23]); const row3 = padColOfNumbers([this.m30, this.m31, this.m32, this.m33]); console.log(caption); console.log(" ", row0.join(" | ")); console.log(" ", row1.join(" | ")); console.log(" ", row2.join(" | ")); console.log(" ", row3.join(" | ")); } } const IDX_m00 = 0; const IDX_m10 = 1; const IDX_m20 = 2; const IDX_m30 = 3; const IDX_m01 = 4; const IDX_m11 = 5; const IDX_m21 = 6; const IDX_m31 = 7; const IDX_m02 = 8; const IDX_m12 = 9; const IDX_m22 = 10; const IDX_m32 = 11; const IDX_m03 = 12; const IDX_m13 = 13; const IDX_m23 = 14; const IDX_m33 = 15; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0NC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXRoL21hdDQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUc1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFFaEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLFlBQVk7SUFxQnJDLFlBQ0ksTUFBd0IsQ0FBQyxFQUN6QixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUMsRUFDZixNQUFjLENBQUM7UUFFZixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQztnQkFDRixHQUFHO2dCQUNILEdBQUc7Z0JBQ0gsR0FBRztnQkFDSCxHQUFHO2dCQUNILEdBQUc7Z0JBQ0gsR0FBRztnQkFDSCxHQUFHO2dCQUNILEdBQUc7Z0JBQ0gsR0FBRztnQkFDSCxHQUFHO2dCQUNILEdBQUc7Z0JBQ0gsR0FBRztnQkFDSCxHQUFHO2dCQUNILEdBQUc7Z0JBQ0gsR0FBRztnQkFDSCxHQUFHO2FBQ04sQ0FBQyxDQUFBO1FBQ04sQ0FBQzthQUFNLENBQUM7WUFDSixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FDRCxPQUErQixPQUFPLENBQUMsQ0FBQyxFQUN4QyxPQUErQixPQUFPLENBQUMsQ0FBQyxFQUN4QyxPQUErQixPQUFPLENBQUMsQ0FBQyxFQUN4QyxPQUErQixPQUFPLENBQUMsQ0FBQztRQUV4QyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFBO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUE7UUFDakMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQTtRQUNqQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFBO1FBQ2pDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ2QsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDZCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ2QsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDZCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ2QsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDZCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ2QsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDZCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ2QsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDZCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO1FBQ2QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQVk7UUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQzlCLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUVILE1BQU0sQ0FBQyxJQUFjO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksYUFBSixJQUFJLGNBQUosSUFBSSxHQUFJLElBQUksQ0FBQyxDQUFBO1FBQy9CLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQTtRQUM5QixPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLEdBQW9EO1FBQ2hFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUNaLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFBO1FBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUE7SUFDaEIsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUF5QjtRQUNsQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUE7UUFDbkIsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFBO1FBQ25CLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQTtRQUNuQixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxLQUFzRDtRQUM1RCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUE7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFDYixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUNiLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO1FBQ2IsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsSUFBSSxDQUFDLEdBQTRCOztRQUM3QixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFBLEdBQUcsQ0FBQyxLQUFLLENBQUMsbUNBQUksQ0FBQyxDQUFBO1FBQ2pDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBc0I7UUFDM0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQTtRQUNsQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUE7UUFDbEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQTtRQUNsQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUE7UUFDbEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQTtRQUNsQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUE7UUFDbEIsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWMsRUFBRSxLQUFjLEVBQUUsS0FBYztRQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBYztRQUNsQixLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUE7UUFDbEIsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFBO1FBQ2xCLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQTtRQUNsQixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBYztRQUNsQixLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUE7UUFDbEIsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFBO1FBQ2xCLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQTtRQUNsQixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBYztRQUNsQixLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUE7UUFDbEIsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFBO1FBQ2xCLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQTtRQUNsQixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQXFCO1FBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNqQyxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsQ0FBUztRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDckIsQ0FBQztJQUNELElBQUksR0FBRztRQUNILE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFDRCxJQUFJLEdBQUcsQ0FBQyxDQUFTO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNyQixDQUFDO0lBQ0QsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLENBQVM7UUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsQ0FBUztRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDckIsQ0FBQztJQUNELElBQUksR0FBRztRQUNILE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFDRCxJQUFJLEdBQUcsQ0FBQyxDQUFTO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNyQixDQUFDO0lBQ0QsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLENBQVM7UUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsQ0FBUztRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDckIsQ0FBQztJQUNELElBQUksR0FBRztRQUNILE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFDRCxJQUFJLEdBQUcsQ0FBQyxDQUFTO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNyQixDQUFDO0lBQ0QsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLENBQVM7UUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsQ0FBUztRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDckIsQ0FBQztJQUNELElBQUksR0FBRztRQUNILE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFDRCxJQUFJLEdBQUcsQ0FBQyxDQUFTO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNyQixDQUFDO0lBQ0QsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLENBQVM7UUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsQ0FBUztRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDckIsQ0FBQztJQUNELElBQUksR0FBRztRQUNILE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFDRCxJQUFJLEdBQUcsQ0FBQyxDQUFTO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNyQixDQUFDO0lBQ0QsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLENBQVM7UUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsQ0FBUztRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDckIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTTtRQUNsQixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN0RSxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN0RSxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN0RSxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUV0RSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUN4QyxDQUFDO0NBQ0o7QUFFRCxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUE7QUFDakIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFBO0FBQ2pCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQTtBQUNqQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUE7QUFDakIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFBO0FBQ2pCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQTtBQUNqQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUE7QUFDakIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFBO0FBQ2pCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQTtBQUNqQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUE7QUFDakIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO0FBQ2xCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtBQUNsQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7QUFDbEIsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO0FBQ2xCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtBQUNsQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUEifQ==