arcanumcube
Version:
1,058 lines (1,057 loc) • 453 kB
JavaScript
// src/core.ts
var CUBE_SIZE = 3;
var SIDE_MAX = CUBE_SIZE - 1;
var SIDE_MIN = 0;
var SIDE_MIDDLE = Math.floor(CUBE_SIZE / 2);
var STICKER_COLOR = {
UP: 0,
FRONT: 1,
RIGHT: 2,
DOWN: 3,
BACK: 4,
LEFT: 5,
PLAIN: 6
};
var CUBE = {
AXIS: "axis",
CENTER: "center",
EDGE: "edge",
CORNER: "corner",
STICKER: "sticker"
};
var CUBETYPE_LIST = [CUBE.AXIS, CUBE.CENTER, CUBE.EDGE, CUBE.CORNER];
var FACE_LIST = ["U", "F", "R", "D", "B", "L"];
var FACE = Object.assign(
{},
...FACE_LIST.map((k, i) => ({ [k]: i }))
);
var TWIST = {
U: "U",
UR: "U'",
F: "F",
FR: "F'",
R: "R",
RR: "R'",
D: "D",
DR: "D'",
B: "B",
BR: "B'",
L: "L",
LR: "L'",
M: "M",
MR: "M'",
E: "E",
ER: "E'",
S: "S",
SR: "S'",
U2: "U2",
F2: "F2",
R2: "R2",
D2: "D2",
B2: "B2",
L2: "L2",
M2: "M2",
E2: "E2",
S2: "S2"
};
var SINGLE_TWIST_LIST = [
TWIST.U,
TWIST.UR,
TWIST.F,
TWIST.FR,
TWIST.R,
TWIST.RR,
TWIST.D,
TWIST.DR,
TWIST.B,
TWIST.BR,
TWIST.L,
TWIST.LR,
TWIST.M,
TWIST.MR,
TWIST.E,
TWIST.ER,
TWIST.S,
TWIST.SR
];
var DOUBLE_TWIST_LIST = [
TWIST.U2,
TWIST.F2,
TWIST.R2,
TWIST.D2,
TWIST.B2,
TWIST.L2,
TWIST.M2,
TWIST.E2,
TWIST.S2
];
var TWIST_LIST = [...SINGLE_TWIST_LIST, ...DOUBLE_TWIST_LIST];
var CUBE_ANGLES = [
[
// down 3x3 cubes
[
[TWIST.B],
// [0, 0, 90]
[TWIST.B2],
// [0, 0, 180]
[TWIST.B2]
// [0, 0, 180]
],
[
[TWIST.UR, TWIST.SR],
// [0, 90, 90]
[TWIST.M2],
// [180, 0, 0]
[TWIST.U, TWIST.S]
// [0, -90, -90]
],
[
[TWIST.L2],
// [180, 0, 0]
[TWIST.M2],
// [180, 0, 0]
[TWIST.L, TWIST.UR, TWIST.F]
// [90, 90, -90]
]
],
[
// middle 3x3 cubes
[
[TWIST.B],
// [0, 0, 90]
[TWIST.MR],
// [-90, 0, 0]
[TWIST.BR]
// [0, 0, -90]
],
[
[TWIST.SR],
// [0, 0, 90]
[],
// [0, 0, 0] original axis
[TWIST.S]
// [0, 0, -90]
],
[
[TWIST.M, TWIST.FR],
// [90, 0, 90]
[TWIST.M],
// [90, 0, 0]
[TWIST.M, TWIST.F]
// [90, 0, -90]
]
],
[
// up 3x3 cubes
[
[],
// [0, 0, 0] original corner
[],
// [0, 0, 0] original edge
[TWIST.U]
// [0, -90, 0]
],
[
[TWIST.UR],
// [0, 90, 0]
[],
// [0, 0, 0] original center
[TWIST.U]
// [0, -90, 0]
],
[
[TWIST.UR],
// [0, 90, 0]
[TWIST.U2],
// [0, 180, 0]
[TWIST.U2]
// [0, 180, 0]
]
]
];
var TWIST_RULE = {
[TWIST.U]: { axis: [0, -1, 0], levels: [2], steps: 1 },
[TWIST.UR]: { axis: [0, 1, 0], levels: [2], steps: 1 },
[TWIST.F]: { axis: [0, 0, -1], levels: [2], steps: 1 },
[TWIST.FR]: { axis: [0, 0, 1], levels: [2], steps: 1 },
[TWIST.R]: { axis: [-1, 0, 0], levels: [2], steps: 1 },
[TWIST.RR]: { axis: [1, 0, 0], levels: [2], steps: 1 },
[TWIST.D]: { axis: [0, 1, 0], levels: [0], steps: 1 },
[TWIST.DR]: { axis: [0, -1, 0], levels: [0], steps: 1 },
[TWIST.B]: { axis: [0, 0, 1], levels: [0], steps: 1 },
[TWIST.BR]: { axis: [0, 0, -1], levels: [0], steps: 1 },
[TWIST.L]: { axis: [1, 0, 0], levels: [0], steps: 1 },
[TWIST.LR]: { axis: [-1, 0, 0], levels: [0], steps: 1 },
[TWIST.M]: { axis: [1, 0, 0], levels: [1], steps: 1 },
[TWIST.MR]: { axis: [-1, 0, 0], levels: [1], steps: 1 },
[TWIST.E]: { axis: [0, 1, 0], levels: [1], steps: 1 },
[TWIST.ER]: { axis: [0, -1, 0], levels: [1], steps: 1 },
[TWIST.S]: { axis: [0, 0, -1], levels: [1], steps: 1 },
[TWIST.SR]: { axis: [0, 0, 1], levels: [1], steps: 1 },
[TWIST.U2]: { axis: [0, -1, 0], levels: [2], steps: 2 },
[TWIST.F2]: { axis: [0, 0, -1], levels: [2], steps: 2 },
[TWIST.R2]: { axis: [-1, 0, 0], levels: [2], steps: 2 },
[TWIST.D2]: { axis: [0, 1, 0], levels: [0], steps: 2 },
[TWIST.B2]: { axis: [0, 0, 1], levels: [0], steps: 2 },
[TWIST.L2]: { axis: [1, 0, 0], levels: [0], steps: 2 },
[TWIST.M2]: { axis: [1, 0, 0], levels: [1], steps: 2 },
[TWIST.E2]: { axis: [0, 1, 0], levels: [1], steps: 2 },
[TWIST.S2]: { axis: [0, 0, -1], levels: [1], steps: 2 }
};
function getStickerIndex(x, y, z, face) {
let [px, py] = [0, 0];
if (face === FACE.U) {
px = x;
py = z;
} else if (face === FACE.D) {
px = x;
py = SIDE_MAX - z;
} else if (face === FACE.F) {
px = x;
py = SIDE_MAX - y;
} else if (face === FACE.B) {
px = SIDE_MAX - x;
py = SIDE_MAX - y;
} else if (face === FACE.R) {
px = SIDE_MAX - z;
py = SIDE_MAX - y;
} else if (face === FACE.L) {
px = z;
py = SIDE_MAX - y;
}
return face * CUBE_SIZE * CUBE_SIZE + py * CUBE_SIZE + px;
}
function getCubeFromStickerIndex(index) {
const face = Math.floor(index / (CUBE_SIZE * CUBE_SIZE));
const f = index - face * (CUBE_SIZE * CUBE_SIZE);
const py = Math.floor(f / CUBE_SIZE);
const px = f % CUBE_SIZE;
let [x, y, z] = [0, 0, 0];
if (face === FACE.U) {
x = px;
z = py;
} else if (face === FACE.D) {
x = px;
z = SIDE_MAX - py;
} else if (face === FACE.F) {
x = px;
y = SIDE_MAX - py;
} else if (face === FACE.B) {
x = SIDE_MAX - px;
y = SIDE_MAX - py;
} else if (face === FACE.R) {
z = SIDE_MAX - px;
y = SIDE_MAX - py;
} else if (face === FACE.L) {
z = px;
y = SIDE_MAX - py;
}
return [x, y, z, face];
}
function getRandomTwistList(steps = 0) {
const t = steps === 0 ? Math.floor(Math.random() * (30 - 15 + 1)) + 15 : steps;
const len = SINGLE_TWIST_LIST.length;
const isOffsetting = (a, b) => {
return a !== b && (a + "'").substring(0, 2) === (b + "'").substring(0, 2);
};
const list = [];
let prev = "";
for (let i = 0; i < t; i++) {
let s;
while (isOffsetting(s = SINGLE_TWIST_LIST[Math.floor(Math.random() * len)], prev)) ;
list.push(s);
prev = s;
}
return list;
}
var SIDE_FACES = Object.freeze([
[1, 2, 4, 5],
[2, 0, 5, 3],
[0, 1, 3, 4],
[2, 1, 5, 4],
[0, 2, 3, 5],
[1, 0, 4, 3]
]);
function getInitialState(up, front) {
const down = (up + 3) % 6;
const side = SIDE_FACES[up];
const state = new Array(CUBE_SIZE * CUBE_SIZE).fill(up);
for (let i = 0; i < 4; i++) {
if (i == 2) {
const downs = [...Array(CUBE_SIZE * CUBE_SIZE)].fill(down);
state.push(...downs);
}
const sides = [...Array(CUBE_SIZE * CUBE_SIZE)].fill(side[(front + i) % 4]);
state.push(...sides);
}
return state;
}
function isSameArrays(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
return !arr1.some((v, i) => v !== arr2[i]);
}
var GOAL_STATE_LIST = [];
for (let up = 0; up < 6; up++) {
for (let front = 0; front < 4; front++) {
GOAL_STATE_LIST.push(getInitialState(up, front));
}
}
Object.freeze(GOAL_STATE_LIST);
function MatchGoalState(state) {
return GOAL_STATE_LIST.some((s) => isSameArrays(state, s));
}
var Cube = class {
type;
position;
_stickers;
_initialPosition;
constructor(x, y, z) {
this._stickers = [];
this._initialPosition = { x, y, z };
this.position = { x, y, z };
let faces = 0;
if (x === SIDE_MAX) faces++;
if (x === SIDE_MIN) faces++;
if (y === SIDE_MAX) faces++;
if (y === SIDE_MIN) faces++;
if (z === SIDE_MAX) faces++;
if (z === SIDE_MIN) faces++;
this.type = CUBETYPE_LIST[faces];
}
getStickers() {
return this._stickers;
}
init() {
const { x, y, z } = this.position;
const angles = CUBE_ANGLES[y][z][x];
this._stickers = [];
if (this.type === CUBE.CENTER) {
this._stickers = [{ face: FACE.U, color: STICKER_COLOR.PLAIN }];
} else if (this.type === CUBE.EDGE) {
this._stickers = [
{ face: FACE.U, color: STICKER_COLOR.PLAIN },
{ face: FACE.B, color: STICKER_COLOR.PLAIN }
];
} else if (this.type === CUBE.CORNER) {
this._stickers = [
{ face: FACE.U, color: STICKER_COLOR.PLAIN },
{ face: FACE.B, color: STICKER_COLOR.PLAIN },
{ face: FACE.L, color: STICKER_COLOR.PLAIN }
];
}
this.rotateStickerFace(angles, false, true);
}
reset() {
const Faces = [FACE.U, FACE.B, FACE.L];
const { x, y, z } = this._initialPosition;
this.position = { x, y, z };
const angles = CUBE_ANGLES[y][z][x];
for (let i = 0; i < this._stickers.length; i++) {
this._stickers[i].face = Faces[i];
this._stickers[i].color = STICKER_COLOR.PLAIN;
}
this.rotateStickerFace(angles, false, true);
}
rotateStickerFace(twists, reverse = false, init = false) {
const rotateMap = [
/* x */
[FACE.U, FACE.F, FACE.D, FACE.B],
/* y */
[FACE.F, FACE.R, FACE.B, FACE.L],
/* z */
[FACE.U, FACE.L, FACE.D, FACE.R]
];
function getNext(face, axis_index, twist) {
const { axis, steps } = TWIST_RULE[twist];
const map = rotateMap[axis_index];
const i = map.indexOf(face);
if (i < 0) return face;
const angle = axis[axis_index];
const i2 = (i + 4 + (reverse ? -1 : 1) * angle * steps) % 4;
return map[i2];
}
for (const sticker of this._stickers) {
for (const r of twists) {
sticker.face = getNext(sticker.face, 0, r);
sticker.face = getNext(sticker.face, 1, r);
sticker.face = getNext(sticker.face, 2, r);
}
if (init && sticker.color === STICKER_COLOR.PLAIN) {
sticker.color = sticker.face;
}
}
}
};
var ArcanumCube = class {
/** output debug information to console */
debug;
/** history of twisting */
_history;
/** cube objects matrix */
_matrix;
constructor(options) {
this.debug = false;
this._history = [];
this._matrix = [];
if (options) {
if (options.debug != null) {
this.debug = options.debug;
}
}
}
init() {
this._matrix = [];
const yarray = [];
for (let y = SIDE_MIN; y <= SIDE_MAX; y++) {
const zarray = [];
for (let z = SIDE_MIN; z <= SIDE_MAX; z++) {
const xarray = [];
for (let x = SIDE_MIN; x <= SIDE_MAX; x++) {
const cube = new Cube(x, y, z);
cube.init();
xarray.push(cube);
}
zarray.push(xarray);
}
yarray.push(zarray);
}
this._matrix = yarray;
}
reset() {
const list = [];
for (let y = SIDE_MIN; y <= SIDE_MAX; y++) {
for (let z = SIDE_MIN; z <= SIDE_MAX; z++) {
for (let x = SIDE_MIN; x <= SIDE_MAX; x++) {
const cube = this._matrix[y][z][x];
cube.reset();
list.push(cube);
}
}
}
list.forEach((cube) => {
const n = cube.position;
this._matrix[n.y][n.z][n.x] = cube;
});
this._history = [];
}
// twist randomly several steps
scramble(steps) {
const list = getRandomTwistList(steps);
if (this.debug) console.log("Scramble: " + list.join(", "));
this.twist(list, false);
}
undo(steps = 1) {
const list = this.getUndoList(steps);
this.twist(list, true);
}
isSolved() {
return MatchGoalState(this.getStickerColors());
}
getHistory() {
return this._history;
}
getUndoList(steps = 1) {
let t = steps;
if (t < 0) t = 0;
if (t > this._history.length) t = this._history.length;
return this._history.slice(-t).reverse();
}
twist(twist, reverse = false) {
if (Array.isArray(twist)) {
if (twist.length == 0) return;
for (const c of twist) {
this._twist(c, reverse);
}
} else {
this._twist(twist, reverse);
}
}
_twist(twist, reverse) {
this.rotateMatrix(twist, reverse);
if (this.debug) {
this.dumpStickers();
}
if (reverse) {
this._history.pop();
} else {
this._history.push(twist);
}
if (this.debug) console.log(this._history.join(" "));
}
rotateMatrix(twist, reverse = false) {
const rule = TWIST_RULE[twist];
const axis = rule.axis;
const map = new Array(3);
for (const l of rule.levels) {
let i = axis.indexOf(-1);
if (i === -1) i = axis.indexOf(1);
const s = (reverse ? -1 : 1) * axis[i];
map[i] = Array(8).fill(l);
map[(i + s + 3) % 3] = [0, 1, 2, 2, 2, 1, 0, 0];
map[(i - s + 3) % 3] = [0, 0, 0, 1, 2, 2, 2, 1];
const [x, y, z] = map;
const tmp = [];
for (let i2 = 0; i2 < 8; i2++) {
const cube = this._matrix[y[i2]][z[i2]][x[i2]];
cube.rotateStickerFace([twist], reverse);
tmp.push(cube);
}
for (let i2 = 0; i2 < 8; i2++) {
const i22 = (i2 + rule.steps * 2) % 8;
tmp[i2].position = { x: x[i22], y: y[i22], z: z[i22] };
this._matrix[y[i22]][z[i22]][x[i22]] = tmp[i2];
}
}
}
getStickerColors() {
const list = new Array(CUBE_SIZE * CUBE_SIZE * 6);
for (let y = SIDE_MIN; y <= SIDE_MAX; y++) {
for (let z = SIDE_MIN; z <= SIDE_MAX; z++) {
for (let x = SIDE_MIN; x <= SIDE_MAX; x++) {
const cube = this._matrix[y][z][x];
const stickers = cube.getStickers();
for (const sticker of stickers) {
const index = getStickerIndex(x, y, z, sticker.face);
list[index] = sticker.color;
}
}
}
}
return list;
}
dumpStickers() {
const list = this.getStickerColors();
const STYLE = "background-color:black; padding:1px 1px;";
const Col2Str = {
[STICKER_COLOR.UP]: "color:white; " + STYLE,
[STICKER_COLOR.FRONT]: "color:#00d800; " + STYLE,
[STICKER_COLOR.RIGHT]: "color:#d80000; " + STYLE,
[STICKER_COLOR.DOWN]: "color:yellow; " + STYLE,
[STICKER_COLOR.BACK]: "color:#0000d8; " + STYLE,
[STICKER_COLOR.LEFT]: "color:#ff8000; " + STYLE
};
const RESET = "background-color:none; padding:0px 0px;";
const result = [];
const attrs = [];
const getLine = (faces) => {
const line = [];
for (let py = 0; py < 3; py++) {
for (const f of faces) {
if (f === -1) {
line.push(" ");
} else {
line.push("%c\u25A0 %c\u25A0 %c\u25A0%c ");
const index = f * CUBE_SIZE * CUBE_SIZE + py * CUBE_SIZE;
attrs.push(Col2Str[list[index + 0]]);
attrs.push(Col2Str[list[index + 1]]);
attrs.push(Col2Str[list[index + 2]]);
attrs.push(RESET);
}
}
line.push("\n");
}
line.push("\n");
result.push(line.join(""));
};
getLine([-1, FACE.U]);
getLine([FACE.L, FACE.F, FACE.R, FACE.B]);
getLine([-1, FACE.D]);
console.log(result.join("\n"), ...attrs);
}
};
var STICKER_PERMUTATION_GROUP_MAP = makeStickerPermutationGroupMap();
function makeStickerPermutationGroupMap() {
const result = {};
TWIST_LIST.forEach((twist) => {
const tmp = getCubePermutationGroup(twist).stickers;
result[twist] = [tmp.before, tmp.after];
});
return result;
}
function getNextStickerColors(stickers, twist) {
const result = [...stickers];
const [bef, aft] = STICKER_PERMUTATION_GROUP_MAP[twist];
for (let i = 0; i < bef.length; i++) {
result[aft[i]] = stickers[bef[i]];
}
return result;
}
function getArrayForTensor(stickers) {
const array = [...Array(3)].map(
() => [...Array(3)].map(() => Array(6 * 6).fill(0))
);
for (let i = 0; i < stickers.length; i++) {
const face = Math.floor(i / (CUBE_SIZE * CUBE_SIZE));
const c = i - face * (CUBE_SIZE * CUBE_SIZE);
const row = Math.floor(c / CUBE_SIZE);
const column = c - row * CUBE_SIZE;
const color = stickers[i];
array[row][column][color * 6 + face] = 1;
}
return array;
}
function getCubePermutationGroup(twist, reverse = false) {
const rule = TWIST_RULE[twist];
const axis = rule.axis;
const result = { before: [], after: [], stickers: { before: [], after: [] } };
const map = new Array(3);
for (const l of rule.levels) {
let i = axis.indexOf(-1);
if (i === -1) i = axis.indexOf(1);
const s = (reverse ? -1 : 1) * axis[i];
map[i] = Array(8).fill(l);
map[(i + s + 3) % 3] = [0, 1, 2, 2, 2, 1, 0, 0];
map[(i - s + 3) % 3] = [0, 0, 0, 1, 2, 2, 2, 1];
const [x, y, z] = map;
for (let i2 = 0; i2 < 8; i2++) {
const i22 = (i2 + rule.steps * 2) % 8;
result.before.push([x[i2], y[i2], z[i2]]);
result.after.push([x[i22], y[i22], z[i22]]);
const list = getStickerPermutationGroup(
[x[i2], y[i2], z[i2]],
[x[i22], y[i22], z[i22]],
[twist],
reverse
);
result.stickers.before.push(...list.before);
result.stickers.after.push(...list.after);
}
}
return result;
}
function getStickerPermutationGroup(position, position2, twists, reverse = false) {
const rotateMap = [
/* x */
[FACE.U, FACE.F, FACE.D, FACE.B],
/* y */
[FACE.F, FACE.R, FACE.B, FACE.L],
/* z */
[FACE.U, FACE.L, FACE.D, FACE.R]
];
function getNext(face, axis_index, twist) {
const { axis, steps } = TWIST_RULE[twist];
const map = rotateMap[axis_index];
const i = map.indexOf(face);
if (i < 0) return face;
const angle = axis[axis_index];
const i2 = (i + 4 + (reverse ? -1 : 1) * angle * steps) % 4;
return map[i2];
}
const result = { before: [], after: [] };
const [x, y, z] = position;
const [x2, y2, z2] = position2;
const faces = [];
if (x === SIDE_MAX) faces.push(FACE.R);
if (x === SIDE_MIN) faces.push(FACE.L);
if (y === SIDE_MAX) faces.push(FACE.U);
if (y === SIDE_MIN) faces.push(FACE.D);
if (z === SIDE_MAX) faces.push(FACE.F);
if (z === SIDE_MIN) faces.push(FACE.B);
for (const face of faces) {
let f = face;
result.before.push(getStickerIndex(x, y, z, f));
for (const t of twists) {
f = getNext(f, 0, t);
f = getNext(f, 1, t);
f = getNext(f, 2, t);
}
result.after.push(getStickerIndex(x2, y2, z2, f));
}
return result;
}
// src/skins.ts
import * as THREE from "three";
var DefaultLogoTextures;
function loadDefaultLogoTexture() {
if (DefaultLogoTextures) return DefaultLogoTextures;
const image = document.createElementNS("http://www.w3.org/1999/xhtml", "img");
image.src = DefaultLogo;
const texture = new THREE.Texture(image);
texture.needsUpdate = true;
return texture;
}
function GetSkinByName(name) {
return SkinMap[name];
}
function GetSkinNameList() {
return Object.keys(SkinMap);
}
var standardSkin = {
name: "Standard",
enableEnvMap: false,
modelFiles: {
axis: "default-axis",
center: "default-center",
edge: "default-edge",
corner: "default-corner",
sticker: "default-sticker"
},
modelLoading: false,
models: {},
cube: {
material: () => {
return new THREE.MeshStandardMaterial({
color: 3092271,
metalness: 0.8,
roughness: 0.4
});
},
activate: (mesh) => {
const mat = mesh.material;
mat.transparent = false;
mat.opacity = 1;
mat.needsUpdate = true;
},
deactivate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.3;
mat.needsUpdate = true;
}
},
sticker: {
material: (x, y, z, color) => {
const ColorList = [
"#ffffff",
// U: White
"#00d800",
// F: Green
"#d80000",
// R: Red
"#ffff00",
// D: Yellow
"#0000d8",
// B: Blue
"#ff8000"
// L: Orange
];
const col = ColorList[color];
let texture = void 0;
const mat = new THREE.MeshStandardMaterial({
color: col,
metalness: 0.4,
roughness: 0.1
});
if (texture != null) {
mat.map = texture;
mat.bumpMap = texture;
}
return mat;
},
activate: (mesh) => {
const mat = mesh.material;
mat.transparent = false;
mat.opacity = 1;
mat.needsUpdate = true;
},
deactivate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.3;
mat.needsUpdate = true;
}
}
};
var metalicSkin = {
name: "Metalic",
enableEnvMap: true,
modelFiles: {
axis: "default-axis",
center: "default-center",
edge: "default-edge",
corner: "default-corner",
sticker: "default-sticker"
},
modelLoading: false,
models: {},
cube: {
material: () => {
return new THREE.MeshStandardMaterial({
color: 15263976,
metalness: 1,
roughness: 0.1
});
},
activate: (mesh) => {
const mat = mesh.material;
mat.transparent = false;
mat.opacity = 1;
mat.needsUpdate = true;
},
deactivate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.3;
mat.needsUpdate = true;
}
},
sticker: {
material: (x, y, z, color) => {
const ColorList = [
"#ffffff",
// U: White
"#00d800",
// F: Green
"#d80000",
// R: Red
"#ffff00",
// D: Yellow
"#0000d8",
// B: Blue
"#ff8000"
// L: Orange
];
const col = ColorList[color];
let texture = void 0;
const mat = new THREE.MeshStandardMaterial({
color: col,
metalness: 0.7,
roughness: 0.1
});
if (texture != null) mat.map = texture;
return mat;
},
activate: (mesh) => {
const mat = mesh.material;
mat.transparent = false;
mat.opacity = 1;
mat.needsUpdate = true;
},
deactivate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.3;
mat.needsUpdate = true;
}
}
};
var goldSkin = {
name: "Gold",
enableEnvMap: true,
modelFiles: {
axis: "default-axis",
center: "default-center",
edge: "default-edge",
corner: "default-corner",
sticker: "default-sticker"
},
modelLoading: false,
models: {},
cube: {
material: () => {
return new THREE.MeshStandardMaterial({
color: 16773216,
metalness: 1,
roughness: 0
});
},
activate: (mesh) => {
const mat = mesh.material;
mat.transparent = false;
mat.opacity = 1;
mat.needsUpdate = true;
},
deactivate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.3;
mat.needsUpdate = true;
}
},
sticker: {
material: (x, y, z, color) => {
const ColorList = [
"#fff8d0",
// U: White
"#00c800",
// F: Green
"#e80000",
// R: Red
"#fff000",
// D: Yellow
"#0000c8",
// B: Blue
"#f87000"
// L: Orange
];
const col = ColorList[color];
let texture = void 0;
const mat = new THREE.MeshStandardMaterial({
color: col,
metalness: 1,
roughness: 0
});
if (texture != null) mat.map = texture;
return mat;
},
activate: (mesh) => {
const mat = mesh.material;
mat.transparent = false;
mat.opacity = 1;
mat.needsUpdate = true;
},
deactivate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.3;
mat.needsUpdate = true;
}
}
};
var acrylicSkin = {
name: "Acrylic",
enableEnvMap: true,
modelFiles: {
axis: "default-axis",
center: "default-center",
edge: "default-edge",
corner: "default-corner",
sticker: "default-sticker"
},
modelLoading: false,
models: {},
cube: {
material: () => {
return new THREE.MeshStandardMaterial({
color: 16056063,
metalness: 1,
roughness: 0
});
},
activate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.6;
mat.needsUpdate = true;
},
deactivate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.2;
mat.needsUpdate = true;
}
},
sticker: {
material: (x, y, z, color) => {
const ColorList = [
"#ffffff",
// U: White
"#00c800",
// F: Green
"#e80000",
// R: Red
"#fff000",
// D: Yellow
"#0000c8",
// B: Blue
"#f87000"
// L: Orange
];
const col = ColorList[color];
let texture = void 0;
const mat = new THREE.MeshStandardMaterial({
color: col,
metalness: 1,
roughness: 0
});
if (texture != null) mat.map = texture;
return mat;
},
activate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.7;
mat.needsUpdate = true;
},
deactivate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.2;
mat.needsUpdate = true;
}
}
};
var crystalSkin = {
name: "Crystal",
enableEnvMap: true,
modelFiles: {
axis: "default-axis",
center: "default-center",
edge: "default-edge",
corner: "default-corner",
sticker: "default-sticker"
},
modelLoading: false,
models: {},
cube: {
material: () => {
return new THREE.MeshPhysicalMaterial({
flatShading: false,
color: "#ffffff",
roughness: 0.01,
transmission: 1
});
},
activate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.5;
mat.needsUpdate = true;
},
deactivate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.2;
mat.needsUpdate = true;
}
},
sticker: {
material: (x, y, z, color) => {
const ColorList = [
"#ffffff",
// U: White
"#00c800",
// F: Green
"#e80000",
// R: Red
"#fff000",
// D: Yellow
"#0000c8",
// B: Blue
"#f87000"
// L: Orange
];
const col = ColorList[color];
let texture = void 0;
const mat = new THREE.MeshBasicMaterial({
color: col,
refractionRatio: 0.75,
reflectivity: 1
});
if (texture != null) mat.map = texture;
return mat;
},
activate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.5;
mat.needsUpdate = true;
},
deactivate: (mesh) => {
const mat = mesh.material;
mat.transparent = true;
mat.opacity = 0.2;
mat.needsUpdate = true;
}
}
};
var DefaultSkin = standardSkin;
var SkinMap = {
[standardSkin.name]: standardSkin,
[metalicSkin.name]: metalicSkin,
[goldSkin.name]: goldSkin,
[acrylicSkin.name]: acrylicSkin,
[crystalSkin.name]: crystalSkin
};
var DefaultModel = {
"default-axis": "ewoJImFzc2V0Ijp7CgkJImdlbmVyYXRvciI6Iktocm9ub3MgZ2xURiBCbGVuZGVyIEkvTyB2NC4zLjQ3IiwKCQkidmVyc2lvbiI6IjIuMCIKCX0sCgkic2NlbmUiOjAsCgkic2NlbmVzIjpbCgkJewoJCQkibmFtZSI6IlNjZW5lIiwKCQkJIm5vZGVzIjpbCgkJCQkwCgkJCV0KCQl9CgldLAoJIm5vZGVzIjpbCgkJewoJCQkibWVzaCI6MCwKCQkJIm5hbWUiOiJcdTUxODZcdTY3ZjFYIgoJCX0KCV0sCgkibWVzaGVzIjpbCgkJewoJCQkibmFtZSI6Ilx1NTE4Nlx1NjdmMS4wMDIiLAoJCQkicHJpbWl0aXZlcyI6WwoJCQkJewoJCQkJCSJhdHRyaWJ1dGVzIjp7CgkJCQkJCSJQT1NJVElPTiI6MCwKCQkJCQkJIk5PUk1BTCI6MSwKCQkJCQkJIlRFWENPT1JEXzAiOjIKCQkJCQl9LAoJCQkJCSJpbmRpY2VzIjozCgkJCQl9CgkJCV0KCQl9CgldLAoJImFjY2Vzc29ycyI6WwoJCXsKCQkJImJ1ZmZlclZpZXciOjAsCgkJCSJjb21wb25lbnRUeXBlIjo1MTI2LAoJCQkiY291bnQiOjI4ODAsCgkJCSJtYXgiOlsKCQkJCTEuNTU3NjAwMDIxMzYyMzA0NywKCQkJCTEuNTU3NjAwMDIxMzYyMzA0NywKCQkJCTEuNTU3NjAwMDIxMzYyMzA0NwoJCQldLAoJCQkibWluIjpbCgkJCQktMS41NTc2MDAwMjEzNjIzMDQ3LAoJCQkJLTEuNTU3NjAwMDIxMzYyMzA0NywKCQkJCS0xLjU1NzYwMDAyMTM2MjMwNDcKCQkJXSwKCQkJInR5cGUiOiJWRUMzIgoJCX0sCgkJewoJCQkiYnVmZmVyVmlldyI6MSwKCQkJImNvbXBvbmVudFR5cGUiOjUxMjYsCgkJCSJjb3VudCI6Mjg4MCwKCQkJInR5cGUiOiJWRUMzIgoJCX0sCgkJewoJCQkiYnVmZmVyVmlldyI6MiwKCQkJImNvbXBvbmVudFR5cGUiOjUxMjYsCgkJCSJjb3VudCI6Mjg4MCwKCQkJInR5cGUiOiJWRUMyIgoJCX0sCgkJewoJCQkiYnVmZmVyVmlldyI6MywKCQkJImNvbXBvbmVudFR5cGUiOjUxMjMsCgkJCSJjb3VudCI6NDU3MiwKCQkJInR5cGUiOiJTQ0FMQVIiCgkJfQoJXSwKCSJidWZmZXJWaWV3cyI6WwoJCXsKCQkJImJ1ZmZlciI6MCwKCQkJImJ5dGVMZW5ndGgiOjM0NTYwLAoJCQkiYnl0ZU9mZnNldCI6MCwKCQkJInRhcmdldCI6MzQ5NjIKCQl9LAoJCXsKCQkJImJ1ZmZlciI6MCwKCQkJImJ5dGVMZW5ndGgiOjM0NTYwLAoJCQkiYnl0ZU9mZnNldCI6MzQ1NjAsCgkJCSJ0YXJnZXQiOjM0OTYyCgkJfSwKCQl7CgkJCSJidWZmZXIiOjAsCgkJCSJieXRlTGVuZ3RoIjoyMzA0MCwKCQkJImJ5dGVPZmZzZXQiOjY5MTIwLAoJCQkidGFyZ2V0IjozNDk2MgoJCX0sCgkJewoJCQkiYnVmZmVyIjowLAoJCQkiYnl0ZUxlbmd0aCI6OTE0NCwKCQkJImJ5dGVPZmZzZXQiOjkyMTYwLAoJCQkidGFyZ2V0IjozNDk2MwoJCX0KCV0sCgkiYnVmZmVycyI6WwoJCXsKCQkJImJ5dGVMZW5ndGgiOjEwMTMwNCwKCQkJInVyaSI6ImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCxjRi9Idnd3MmtqTnl0dUcrY0YvSHZ3dzJrak55dHVHK2NGL0h2d3cya2pOeXR1Rys4eVc4djhMNmlUTlRQKysrOHlXOHY4TDZpVE5UUCsrKzh5Vzh2OEw2aVROVFArKys4eVc4djhMNmlUTlRQKysrZDk3RnY2NHFrVFBpZXVpK2Q5N0Z2NjRxa1RQaWV1aStkOTdGdjY0cWtUUGlldWkrZDk3RnY2NHFrVFBpZXVpK3NjTEJ2MXNuampNZGIrMitzY0xCdjFzbmpqTWRiKzIrc2NMQnYxc25qak1kYisyK3NjTEJ2MXNuampNZGIrMitjRi9IUHd3MmtyTnl0dUcrY0YvSFB3dzJrck55dHVHK2NGL0hQd3cya3JOeXR1Rys4eVc4UDhMNmliTlRQKysrOHlXOFA4TDZpYk5UUCsrKzh5VzhQOEw2aWJOVFArKys4eVc4UDhMNmliTlRQKysrZDk3RlA2NHFrYlBpZXVpK2Q5N0ZQNjRxa2JQaWV1aStkOTdGUDY0cWtiUGlldWkrZDk3RlA2NHFrYlBpZXVpK3NjTEJQMXNuanJNZGIrMitzY0xCUDFzbmpyTWRiKzIrc2NMQlAxc25qck1kYisyK3NjTEJQMXNuanJNZGIrMitjRi9Idnk0anNMMHNZTjIrY0YvSHZ5NGpzTDBzWU4yK2NGL0h2eTRqc0wwc1lOMis4eVc4dndLenVyMTVwdXErOHlXOHZ3S3p1cjE1cHVxKzh5Vzh2d0t6dXIxNXB1cSs4eVc4dndLenVyMTVwdXErZDk3RnZ4aHJ0YjFTQStTK2Q5N0Z2eGhydGIxU0ErUytkOTdGdnhocnRiMVNBK1MrZDk3RnZ4aHJ0YjFTQStTK3NjTEJ2OE5JdWIwdjMraStzY0xCdjhOSXViMHYzK2krc2NMQnY4Tkl1YjB2MytpK3NjTEJ2OE5JdWIwdjMraStjRi9IUHo4anNMMHNZTjIrY0YvSFB6OGpzTDBzWU4yK2NGL0hQejhqc0wwc1lOMis4eVc4UHhPenVyMTVwdXErOHlXOFB4T3p1cjE1cHVxKzh5VzhQeE96dXIxNXB1cSs4eVc4UHhPenVyMTVwdXErZDk3RlB5bHJ0YjFTQStTK2Q5N0ZQeWxydGIxU0ErUytkOTdGUHlscnRiMVNBK1MrZDk3RlB5bHJ0YjFTQStTK3NjTEJQOVJJdWIwdjMraStzY0xCUDlSSXViMHYzK2krc2NMQlA5Ukl1YjB2MytpK3NjTEJQOVJJdWIwdjMraStjRi9IdjhEQUxMNEZpTkMrY0YvSHY4REFMTDRGaU5DK2NGL0h2OERBTEw0RmlOQys4eVc4djZrY043NG1DZDIrOHlXOHY2a2NONzRtQ2QyKzh5Vzh2NmtjTjc0bUNkMis4eVc4djZrY043NG1DZDIrZDk3RnY3UHVNYjZWeU5hK2Q5N0Z2N1B1TWI2VnlOYStkOTdGdjdQdU1iNlZ5TmErZDk3RnY3UHVNYjZWeU5hK3NjTEJ2MTY1TmI1SFhOdStzY0xCdjE2NU5iNUhYTnUrc2NMQnYxNjVOYjVIWE51K3NjTEJ2MTY1TmI1SFhOdStjRi9IUDhyQUxMNEZpTkMrY0YvSFA4ckFMTDRGaU5DK2NGL0hQOHJBTEw0RmlOQys4eVc4UDdFY043NG1DZDIrOHlXOFA3RWNONzRtQ2QyKzh5VzhQN0VjTjc0bUNkMis4eVc4UDdFY043NG1DZDIrZDk3RlA3M3VNYjZWeU5hK2Q5N0ZQNzN1TWI2VnlOYStkOTdGUDczdU1iNlZ5TmErZDk3RlA3M3VNYjZWeU5hK3NjTEJQMmk1TmI1SFhOdStzY0xCUDJpNU5iNUhYTnUrc2NMQlAyaTVOYjVIWE51K3NjTEJQMmk1TmI1SFhOdStjRi9IdjJQTWVyNWFyTHUrY0YvSHYyUE1lcjVhckx1K2NGL0h2MlBNZXI1YXJMdSs4eVc4dnkvcmhMNUs3Y2ErOHlXOHZ5L3JoTDVLN2NhKzh5Vzh2eS9yaEw1SzdjYSs4eVc4dnkvcmhMNUs3Y2ErZDk3RnY3QW9nYjdTVE1HK2Q5N0Z2N0FvZ2I3U1RNRytkOTdGdjdBb2diN1NUTUcrZDk3RnY3QW9nYjdTVE1HK3NjTEJ2MG5wZzc1UmE4VytzY0xCdjBucGc3NVJhOFcrc2NMQnYwbnBnNzVSYThXK3NjTEJ2MG5wZzc1UmE4VytjRi9IUDJ2TWVyNWFyTHUrY0YvSFAydk1lcjVhckx1K2NGL0hQMnZNZXI1YXJMdSs4eVc4UHpQcmhMNUs3Y2ErOHlXOFB6UHJoTDVLN2NhKzh5VzhQelByaEw1SzdjYSs4eVc4UHpQcmhMNUs3Y2ErZDk3RlA3UW9nYjdTVE1HK2Q5N0ZQN1FvZ2I3U1RNRytkOTdGUDdRb2diN1NUTUcrZDk3RlA3UW9nYjdTVE1HK3NjTEJQMDNwZzc1UmE4VytzY0xCUDAzcGc3NVJhOFcrc2NMQlAwM3BnNzVSYThXK3NjTEJQMDNwZzc1UmE4VytjRi9IdjF1YW43NWRtcCsrY0YvSHYxdWFuNzVkbXArK2NGL0h2MXVhbjc1ZG1wKys4eVc4djJNc3FiNWxMS20rOHlXOHYyTXNxYjVsTEttKzh5Vzh2Mk1zcWI1bExLbSs4eVc4djJNc3FiNWxMS20rZDk3RnYxOWpwTDVoWTZTK2Q5N0Z2MTlqcEw1aFk2UytkOTdGdjE5anBMNWhZNlMrZDk3RnYxOWpwTDVoWTZTK3NjTEJ2eWJrcDc0bzVLZStzY0xCdnlia3A3NG81S2Urc2NMQnZ5YmtwNzRvNUtlK3NjTEJ2eWJrcDc0bzVLZStjRi9IUDErYW43NWRtcCsrY0YvSFAxK2FuNzVkbXArK2NGL0hQMSthbjc1ZG1wKys4eVc4UDJjc3FiNWxMS20rOHlXOFAyY3NxYjVsTEttKzh5VzhQMmNzcWI1bExLbSs4eVc4UDJjc3FiNWxMS20rZDk3RlAyTmpwTDVoWTZTK2Q5N0ZQMk5qcEw1aFk2UytkOTdGUDJOanBMNWhZNlMrZDk3RlAyTmpwTDVoWTZTK3NjTEJQeXJrcDc0bzVLZStzY0xCUHlya3A3NG81S2Urc2NMQlB5cmtwNzRvNUtlK3NjTEJQeXJrcDc0bzVLZStjRi9IdjFpc3U3NW56SHErY0YvSHYxaXN1NzVuekhxK2NGL0h2MWlzdTc1bnpIcSs4eVc4djBqdHhyNHg2NFMrOHlXOHYwanR4cjR4NjRTKzh5Vzh2MGp0eHI0eDY0Uys4eVc4djBqdHhyNHg2NFMrZDk3RnY5Qk13YjZ5S0lHK2Q5N0Z2OUJNd2I2eUtJRytkOTdGdjlCTXdiNnlLSUcrZDk3RnY5Qk13YjZ5S0lHK3NjTEJ2MDlyeGI1TDZZTytzY0xCdjA5cnhiNUw2WU8rc2NMQnYwOXJ4YjVMNllPK3NjTEJ2MDlyeGI1TDZZTytjRi9IUDF5c3U3NW56SHErY0YvSFAxeXN1NzVuekhxK2NGL0hQMXlzdTc1bnpIcSs4eVc4UDB6dHhyNHg2NFMrOHlXOFAwenR4cjR4NjRTKzh5VzhQMHp0eHI0eDY0Uys4eVc4UDB6dHhyNHg2NFMrZDk3RlA5Uk13YjZ5S0lHK2Q5N0ZQOVJNd2I2eUtJRytkOTdGUDlSTXdiNnlLSUcrZDk3RlA5Uk13YjZ5S0lHK3NjTEJQMU5yeGI1TDZZTytzY0xCUDFOcnhiNUw2WU8rc2NMQlAxTnJ4YjVMNllPK3NjTEJQMU5yeGI1TDZZTytjRi9IdndPSTBMN0Z3Q3krY0YvSHZ3T0kwTDdGd0N5K2NGL0h2d09JMEw3RndDeSs4eVc4dnlRSjNiNnRIRGUrOHlXOHZ5UUozYjZ0SERlKzh5Vzh2eVFKM2I2dEhEZSs4eVc4dnlRSjNiNnRIRGUrZDk3RnY1UEkxcjY0N2pHK2Q5N0Z2NVBJMXI2NDdqRytkOTdGdjVQSTFyNjQ3akcrZDk3RnY1UEkxcjY0N2pHK3NjTEJ2MFZjMjc1anVUVytzY0xCdjBWYzI3NWp1VFcrc2NMQnYwVmMyNzVqdVRXK3NjTEJ2MFZjMjc1anVUVytjRi9IUHdlSTBMN0Z3Q3krY0YvSFB3ZUkwTDdGd0N5K2NGL0hQd2VJMEw3RndDeSs4eVc4UHlnSjNiNnRIRGUrOHlXOFB5Z0ozYjZ0SERlKzh5VzhQeWdKM2I2dEhEZSs4eVc4UHlnSjNiNnRIRGUrZDk3RlA1ZkkxcjY0N2pHK2Q5N0ZQNWZJMXI2NDdqRytkOTdGUDVmSTFyNjQ3akcrZDk3RlA1ZkkxcjY0N2pHK3NjTEJQMGxjMjc1anVUVytzY0xCUDBsYzI3NWp1VFcrc2NMQlAwbGMyNzVqdVRXK3NjTEJQMGxjMjc1anVUVytjRi9IdnlwZzNiNDJJN0M5Y0YvSHZ5cGczYjQySTdDOWNGL0h2eXBnM2I0Mkk3Qzk4eVc4djNlbTZyNEtzN3E5OHlXOHYzZW02cjRLczdxOTh5Vzh2M2VtNnI0S3M3cTk4eVc4djNlbTZyNEtzN3E5ZDk3RnYxQUQ1TDRnYTdXOWQ5N0Z2MUFENUw0Z2E3VzlkOTdGdjFBRDVMNGdhN1c5ZDk3RnYxQUQ1TDRnYTdXOXNjTEJ2eTNmNkw3TVNMbTlzY0xCdnkzZjZMN01TTG05c2NMQnZ5M2Y2TDdNU0xtOXNjTEJ2eTNmNkw3TVNMbTljRi9IUHk1ZzNiNDJJN0M5Y0YvSFB5NWczYjQySTdDOWNGL0hQeTVnM2I0Mkk3Qzk4eVc4UDN1bTZyNEtzN3E5OHlXOFAzdW02cjRLczdxOTh5VzhQM3VtNnI0S3M3cTk4eVc4UDN1bTZyNEtzN3E5ZDk3RlAxUUQ1TDRnYTdXOWQ5N0ZQMVFENUw0Z2E3VzlkOTdGUDFRRDVMNGdhN1c5ZDk3RlAxUUQ1TDRnYTdXOXNjTEJQekhmNkw3TVNMbTlzY0xCUHpIZjZMN01TTG05c2NMQlB6SGY2TDdNU0xtOXNjTEJQekhmNkw3TVNMbTljRi9IdjNDMjRiNEFBQUNBY0YvSHYzQzI0YjRBQUFDQWNGL0h2M0MyNGI0QUFBQ0E4eVc4djFFLzc3NEFBQUNBOHlXOHYxRS83NzRBQUFDQTh5Vzh2MUUvNzc0QUFBQ0E4eVc4djFFLzc3NEFBQUNBZDk3RnYrQjY2TDVUUCsrdGQ5N0Z2K0I2Nkw1VFArK3RkOTdGditCNjZMNVRQKyt0ZDk3RnYrQjY2TDVUUCsrdHNjTEJ2eHR2N2I1VFArK3RzY0xCdnh0djdiNVRQKyt0c2NMQnZ4dHY3YjVUUCsrdHNjTEJ2eHR2N2I1VFArK3RjRi9IUDNTMjRiNEFBQUNBY0YvSFAzUzI0YjRBQUFDQWNGL0hQM1MyNGI0QUFBQ0E4eVc4UDFVLzc3NEFBQUNBOHlXOFAxVS83NzRBQUFDQTh5VzhQMVUvNzc0QUFBQ0E4eVc4UDFVLzc3NEFBQUNBZDk3RlArUjY2TDVUUCs4dGQ5N0ZQK1I2Nkw1VFArOHRkOTdGUCtSNjZMNVRQKzh0ZDk3RlArUjY2TDVUUCs4dHNjTEJQeDl2N2I1VFArOHRzY0xCUHg5djdiNVRQKzh0c2NMQlB4OXY3YjVUUCs4dHNjTEJQeDl2N2I1VFArOHRjRi9IdnlwZzNiNDJJN0E5Y0YvSHZ5cGczYjQySTdBOWNGL0h2eXBnM2I0Mkk3QTk4eVc4djNlbTZyNEtzN285OHlXOHYzZW02cjRLczdvOTh5Vzh2M2VtNnI0S3M3bzk4eVc4djNlbTZyNEtzN285ZDk3RnYxQUQ1TDRnYTdVOWQ5N0Z2MUFENUw0Z2E3VTlkOTdGdjFBRDVMNGdhN1U5ZDk3RnYxQUQ1TDRnYTdVOXNjTEJ2eTNmNkw3TVNMazlzY0xCdnkzZjZMN01TTGs5c2NMQnZ5M2Y2TDdNU0xrOXNjTEJ2eTNmNkw3TVNMazljRi9IUHk1ZzNiNDJJN0E5Y0YvSFB5NWczYjQySTdBOWNGL0hQeTVnM2I0Mkk3QTk4eVc4UDN1bTZyNEtzN285OHlXOFAzdW02cjRLczdvOTh5VzhQM3VtNnI0S3M3bzk4eVc4UDN1bTZyNEtzN285ZDk3RlAxUUQ1TDRnYTdVOWQ5N0ZQMVFENUw0Z2E3VTlkOTdGUDFRRDVMNGdhN1U5ZDk3RlAxUUQ1TDRnYTdVOXNjTEJQekhmNkw3TVNMazlzY0xCUHpIZjZMN01TTGs5c2NMQlB6SGY2TDdNU0xrOXNjTEJQekhmNkw3TVNMazljRi9IdndPSTBMN0Z3Q3crY0YvSHZ3T0kwTDdGd0N3K2NGL0h2d09JMEw3RndDdys4eVc4dnlRSjNiNnRIRGMrOHlXOHZ5UUozYjZ0SERjKzh5Vzh2eVFKM2I2dEhEYys4eVc4dnlRSjNiNnRIRGMrZDk3RnY1UEkxcjY0N2pFK2Q5N0Z2NVBJMXI2NDdqRStkOTdGdjVQSTFyNjQ3akUrZDk3RnY1UEkxcjY0N2pFK3NjTEJ2MFZjMjc1anVUVStzY0xCdjBWYzI3NWp1VFUrc2NMQnYwVmMyNzVqdVRVK3NjTEJ2MFZjMjc1anVUVStjRi9IUHdlSTBMN0Z3Q3crY0YvSFB3ZUkwTDdGd0N3K2NGL0hQd2VJMEw3RndDdys4eVc4UHlnSjNiNnRIRGMrOHlXOFB5Z0ozYjZ0SERjKzh5VzhQeWdKM2I2dEhEYys4eVc4UHlnSjNiNnRIRGMrZDk3RlA1ZkkxcjY0N2pFK2Q5N0ZQNWZJMXI2NDdqRStkOTdGUDVmSTFyNjQ3akUrZDk3RlA1ZkkxcjY0N2pFK3NjTEJQMGxjMjc1anVUVStzY0xCUDBsYzI3NWp1VFUrc2NMQlAwbGMyNzVqdVRVK3NjTEJQMGxjMjc1anVUVStjRi9IdjFpc3U3NW56SG8rY0YvSHYxaXN1NzVuekhvK2NGL0h2MWlzdTc1bnpIbys4eVc4djBqdHhyNHg2NFErOHlXOHYwanR4cjR4NjRRKzh5Vzh2MGp0eHI0eDY0USs4eVc4djBqdHhyNHg2NFErZDk3RnY5Qk13YjZ5S0lFK2Q5N0Z2OUJNd2I2eUtJRStkOTdGdjlCTXdiNnlLSUUrZDk3RnY5Qk13YjZ5S0lFK3NjTEJ2MDlyeGI1TDZZTStzY0xCdjA5cnhiNUw2WU0rc2NMQnYwOXJ4YjVMNllNK3NjTEJ2MDlyeGI1TDZZTStjRi9IUDF5c3U3NW56SG8rY0YvSFAxeXN1NzVuekhvK2NGL0hQMXlzdTc1bnpIbys4eVc4UDB6dHhyNHg2NFErOHlXOFAwenR4cjR4NjRRKzh5VzhQMHp0eHI0eDY0USs4eVc4UDB6dHhyNHg2NFErZDk3RlA5Uk13YjZ5S0lFK2Q5N0ZQOVJNd2I2eUtJRStkOTdGUDlSTXdiNnlLSUUrZDk3RlA5Uk13YjZ5S0lFK3NjTEJQMU5yeGI1TDZZTStzY0xCUDFOcnhiNUw2WU0rc2NMQlAxTnJ4YjVMNllNK3NjTEJQMU5yeGI1TDZZTStjRi9IdjF1YW43NWRtcDgrY0YvSHYxdWFuNzVkbXA4K2NGL0h2MXVhbjc1ZG1wOCs4eVc4djJNc3FiNWxMS2srOHlXOHYyTXNxYjVsTEtrKzh5Vzh2Mk1zcWI1bExLays4eVc4djJNc3FiNWxMS2srZDk3RnYxOWpwTDVoWTZRK2Q5N0Z2MTlqcEw1aFk2UStkOTdGdjE5anBMNWhZNlErZDk3RnYxOWpwTDVoWTZRK3NjTEJ2eWJrcDc0bzVLYytzY0xCdnlia3A3NG81S2Mrc2NMQnZ5YmtwNzRvNUtjK3NjTEJ2eWJrcDc0bzVLYytjRi9IUDErYW43NWRtcDgrY0YvSFAxK2FuNzVkbXA4K2NGL0hQMSthbjc1ZG1wOCs4eVc4UDJjc3FiNWxMS2srOHlXOFAyY3NxYjVsTEtrKzh5VzhQMmNzcWI1bExLays4eVc4UDJjc3FiNWxMS2srZDk3RlAyTmpwTDVoWTZRK2Q5N0ZQMk5qcEw1aFk2UStkOTdGUDJOanBMNWhZNlErZDk3RlAyTmpwTDVoWTZRK3NjTEJQeXJrcDc0bzVLYytzY0xCUHlya3A3NG81S2Mrc2NMQlB5cmtwNzRvNUtjK3NjTEJQeXJrcDc0bzVLYytjRi9IdjJQTWVyNWFyTHMrY0YvSHYyUE1lcjVhckxzK2NGL0h2MlBNZXI1YXJMcys4eVc4dnkvcmhMNUs3Y1krOHlXOHZ5L3JoTDVLN2NZKzh5Vzh2eS9yaEw1SzdjWSs4eVc4dnkvcmhMNUs3Y1krZDk3RnY3QW9nYjdTVE1FK2Q5N0Z2N0FvZ2I3U1RNRStkOTdGdjdBb2diN1NUTUUrZDk3RnY3QW9nYjdTVE1FK3NjTEJ2MG5wZzc1UmE4VStzY0xCdjBucGc3NVJhOFUrc2NMQnYwbnBnNzVSYThVK3NjTEJ2MG5wZzc1UmE4VStjRi9IUDJ2TWVyNWFyTHMrY0YvSFAydk1lcjVhckxzK2NGL0hQMnZNZXI1YXJMcys4eVc4UHpQcmhMNUs3Y1krOHlXOFB6UHJoTDVLN2NZKzh5VzhQelByaEw1SzdjWSs4eVc4UHpQcmhMNUs3Y1krZDk3RlA3UW9nYjdTVE1FK2Q5N0ZQN1FvZ2I3U1RNRStkOTdGUDdRb2diN1NUTUUrZDk3RlA3UW9nYjdTVE1FK3NjTEJQMDNwZzc1UmE4VStzY0xCUDAzcGc3NVJhOFUrc2NMQlAwM3BnNzVSYThVK3NjTEJQMDNwZzc1UmE4VStjRi9IdjhEQUxMNEZpTkErY0YvSHY4REFMTDRGaU5BK2NGL0h2OERBTEw0RmlOQSs4eVc4djZrY043NG1DZDArOHlXOHY2a2NONzRtQ2QwKzh5Vzh2NmtjTjc0bUNkMCs4eVc4djZrY043NG1DZDArZDk3RnY3UHVNYjZWeU5ZK2Q5N0Z2N1B1TWI2VnlOWStkOTdGdjdQdU1iNlZ5TlkrZDk3RnY3UHVNYjZWeU5ZK3NjTEJ2MTY1TmI1SFhOcytzY0xCdjE2NU5iNUhYTnMrc2NMQnYxNjVOYjVIWE5zK3NjTEJ2MTY1TmI1SFhOcytjRi9IUDhyQUxMNEZpTkErY0YvSFA4ckFMTDRGaU5BK2NGL0hQOHJBTEw0RmlOQSs4eVc4UDdFY043NG1DZDArOHlXOFA3RWNONzRtQ2QwKzh5VzhQN0VjTjc0bUNkMCs4eVc4UDdFY043NG1DZDArZDk3RlA3M3VNYjZWeU5ZK2Q5N0ZQNzN1TWI2VnlOWStkOTdGUDczdU1iNlZ5TlkrZDk3RlA3M3VNYjZWeU5ZK3NjTEJQMmk1TmI1SFhOcytzY0xCUDJpNU5iNUhYTnMrc2NMQlAyaTVOYjVIWE5zK3NjTEJQMmk1TmI1SFhOcytjRi9Idnk0anNMMHNZTjArY0YvSHZ5NGpzTDBzWU4wK2NGL0h2eTRqc0wwc1lOMCs4eVc4dndLenVyMTVwdW8rOHlXOHZ3S3p1cjE1cHVvKzh5Vzh2d0t6dXIxNXB1bys4eVc4dndLenVyMTVwdW8rZDk3RnZ4aHJ0YjFTQStRK2Q5N0Z2eGhydGIxU0ErUStkOTdGdnhocnRiMVNBK1ErZDk3RnZ4aHJ0YjFTQStRK3NjTEJ2OE5JdWIwdjMrZytzY0xCdjhOSXViMHYzK2crc2NMQnY4Tkl1YjB2MytnK3NjTEJ2OE5JdWIwdjMrZytjRi9IUHo4anNMMHNZTjArY0YvSFB6OGpzTDBzWU4wK2NGL0hQejhqc0wwc1lOMCs4eVc4UHhPenVyMTVwdW8rOHlXOFB4T3p1cjE1cHVvKzh5VzhQeE96dXIxNXB1bys4eVc4UHhPenVyMTVwdW8rZDk3RlB5bHJ0YjFTQStRK2Q5N0ZQeWxydGIxU0ErUStkOTdGUHlscnRiMVNBK1ErZDk3RlB5bHJ0YjFTQStRK3NjTEJQOVJJdWIwdjMrZytzY0xCUDlSSXViMHYzK2crc2NMQlA5Ukl1YjB2MytnK3NjTEJQOVJJdWIwdjMrZytjRi9Idnd3MmtqTnl0dUUrY0YvSHZ3dzJrak55dHVFK2NGL0h2d3cya2pOeXR1RSs4eVc4djhMNmlUTlRQKzgrOHlXOHY4TDZpVE5UUCs4Kzh5Vzh2OEw2aVROVFArOCs4eVc4djhMNmlUTlRQKzgrZDk3RnY4WU1rVFBpZXVnK2Q5N0Z2OFlNa1RQaWV1ZytkOTdGdjhZTWtUUGlldWcrZDk3RnY4WU1rVFBpZXVnK3NjTEJ2M01KampNZGIrMCtzY0xCdjNNSmpqTWRiKzArc2NMQnYzTUpqak1kYiswK3NjTEJ2M01KampNZGIrMCtjRi9IUHd3MmtyTnl0dUUrY0YvSFB3dzJrck55dHVFK2NGL0hQd3cya3JOeXR1RSs4eVc4UDhMNmliTlRQKzgrOHlXOFA4TDZpYk5UUCs4Kzh5VzhQOEw2aWJOVFArOCs4eVc4UDhMNmliTlRQKzgrZDk3RlA4WU1rYlBpZXVnK2Q5N0ZQOFlNa2JQaWV1ZytkOTdGUDhZTWtiUGlldWcrZDk3RlA4WU1rYlBpZXVnK3NjTEJQM01KanJNZGIrMCtzY0xCUDNNSmpyTWRiKzArc2NMQlAzTUpqck1kYiswK3NjTEJQM01KanJNZGIrMCtjRi9Idno4anNEMHNZTjArY0YvSHZ6OGpzRDBzWU4wK2NGL0h2ejhqc0Qwc1lOMCs4eVc4dnhPenVqMTVwdW8rOHlXOHZ4T3p1ajE1cHVvKzh5Vzh2eE96dWoxNXB1bys4eVc4dnhPenVqMTVwdW8rZDk3RnZ5bHJ0VDFTQStRK2Q5N0Z2eWxydFQxU0ErUStkOTdGdnlscnRUMVNBK1ErZDk3RnZ5bHJ0VDFTQStRK3NjTEJ2OVJJdVQwdjMrZytzY0xCdjlSSXVUMHYzK2crc2NMQnY5Ukl1VDB2MytnK3NjTEJ2OVJJdVQwdjMrZytjRi9IUHk0anNEMHNZTjArY0YvSFB5NGpzRDBzWU4wK2NGL0hQeTRqc0Qwc1lOMCs4eVc4UHdLenVqMTVwdW8rOHlXOFB3S3p1ajE1cHVvKzh5VzhQd0t6dWoxNXB1bys4eVc4UHdLenVqMTVwdW8rZDk3RlB4aHJ0VDFTQStRK2Q5N0ZQeGhydFQxU0ErUStkOTdGUHhocnRUMVNBK1ErZDk3RlB4aHJ0VDFTQStRK3NjTEJQOE5JdVQwdjMrZytzY0xCUDhOSXVUMHYzK2crc2NMQlA4Tkl1VDB2MytnK3NjTEJQOE5JdVQwdjMrZytjRi9IdjhyQUxENEZpTkErY0YvSHY4ckFMRDRGaU5BK2NGL0h2OHJBTEQ0RmlOQSs4eVc4djdFY056NG1DZDArOHlXOHY3RWNOejRtQ2QwKzh5Vzh2N0VjTno0bUNkMCs4eVc4djdFY056NG1DZDArZDk3RnY3M3VNVDZWeU5ZK2Q5N0Z2NzN1TVQ2VnlOWStkOTdGdjczdU1UNlZ5TlkrZDk3RnY3M3VNVDZWeU5ZK3NjTEJ2Mmk1TlQ1SFhOcytzY0xCdjJpNU5UNUhYTnMrc2NMQnYyaTVOVDVIWE5zK3NjTEJ2Mmk1TlQ1SFhOcytjRi9IUDhEQUxENEZpTkErY0YvSFA4REFMRDRGaU5BK2NGL0hQOERBTEQ0RmlOQSs4eVc4UDZrY056NG1DZDArOHlXOFA2a2NOejRtQ2QwKzh5VzhQNmtjTno0bUNkMCs4eVc4UDZrY056NG1DZDArZDk3RlA3UHVNVDZWeU5ZK2Q5N0ZQN1B1TVQ2VnlOWStkOTdGUDdQdU1UNlZ5TlkrZDk3RlA3UHVNVDZWeU5ZK3NjTEJQMTY1TlQ1SFhOcytzY0xCUDE2NU5UNUhYTnMrc2NMQlAxNjVOVDVIWE5zK3NjTEJQMTY1TlQ1SFhOcytjRi9IdjJ2TWVqNWFyTHMrY0YvSHYydk1lajVhckxzK2NGL0h2MnZNZWo1YXJMcys4eVc4dnpQcmhENUs3Y1krOHlXOHZ6UHJoRDVLN2NZKzh5Vzh2elByaEQ1SzdjWSs4eVc4dnpQcmhENUs3Y1krZDk3RnY3UW9nVDdTVE1FK2Q5N0Z2N1FvZ1Q3U1RNRStkOTdGdjdRb2dUN1NUTUUrZDk3RnY3UW9nVDdTVE1FK3NjTEJ2MDNwZ3o1UmE4VStzY0xCdjAzcGd6NVJhOFUrc2NMQnYwM3BnejVSYThVK3NjTEJ2MDNwZ3o1UmE4VStjRi9IUDJQTWVqNWFyTHMrY0YvSFAyUE1lajVhckxzK2NGL0hQMlBNZWo1YXJMcys4eVc4UHkvcmhENUs3Y1krOHlXOFB5L3JoRDVLN2NZKzh5VzhQeS9yaEQ1SzdjWSs4eVc4UHkvcmhENUs3Y1krZDk3RlA3QW9nVDdTVE1FK2Q5N0ZQN0FvZ1Q3U1RNRStkOTdGUDdBb2dUN1NUTUUrZDk3RlA3QW9nVDdTVE1FK3NjTEJQMG5wZ3o1UmE4VStzY0xCUDBucGd6NVJhOFUrc2NMQlAwbnBnejVSYThVK3NjTEJQMG5wZ3o1UmE4VStjRi9IdjErYW56NWRtcDgrY0YvSHYxK2FuejVkbXA4K2NGL0h2MSthbno1ZG1wOCs4eVc4djJjc3FUNWxMS2srOHlXOHYyY3NxVDVsTEtrKzh5Vzh2MmNzcVQ1bExLays4eVc4djJjc3FUNWxMS2srZDk3RnYyTmpwRDVoWTZRK2Q5N0Z2Mk5qcEQ1aFk2UStkOTdGdjJOanBENWhZNlErZDk3RnYyTmpwRDVoWTZRK3NjTEJ2eXJrcHo0bzVLYytzY0xCdnlya3B6NG81S2Mrc2NMQnZ5cmtwejRvNUtjK3NjTEJ2eXJrcHo0bzVLYytjRi9IUDF1YW56NWRtcDgrY0YvSFAxdWFuejVkbXA4K2NGL0hQMXVhbno1ZG1wOCs4eVc4UDJNc3FUNWxMS2srOHlXOFAyTXNxVDVsTEtrKzh5VzhQMk1zcVQ1bExLays4eVc4UDJNc3FUNWxMS2srZDk3RlAxOWpwRDVoWTZRK2Q5N0ZQMTlqcEQ1aFk2UStkOTdGUDE5anBENWhZNlErZDk3RlAxOWpwRDVoWTZRK3NjTEJQeWJrcHo0bzVLYytzY0xCUHlia3B6NG81S2Mrc2NMQlB5YmtwejRvNUtjK3NjTEJQeWJrcHo0bzVLYytjRi9IdjF5c3V6NW56SG8rY0YvSHYxeXN1ejVuekhvK2NGL0h2MXlzdXo1bnpIbys4eVc4djB6dHhqNHg2NFErOHlXOHYwenR4ajR4NjRRKzh5Vzh2MHp0eGo0eDY0USs4eVc4djB6dHhqNHg2NFErZDk3RnY5Uk13VDZ5S0lFK2Q5N0Z2OVJNd1Q2eUtJRStkOTdGdjlSTXdUNnlLSUUrZDk3RnY5Uk13VDZ5S0lFK3NjTEJ2MU5yeFQ1TDZZTStzY0xCdjFOcnhUNUw2WU0rc2NMQnYxTnJ4VDVMNllNK3NjTEJ2MU5yeFQ1TDZZTStjRi9IUDFpc3V6NW56SG8rY0YvSFAxaXN1ejVuekhvK2NGL0hQMWlzdXo1bnpIbys4eVc4UDBqdHhqNHg2NFErOHlXOFAwanR4ajR4NjRRKzh5VzhQMGp0eGo0eDY0USs4eVc4UDBqdHhqNHg2NFErZDk3RlA5Qk13VDZ5S0lFK2Q5N0ZQOUJNd1Q2eUtJRStkOTdGUDlCTXdUNnlLSUUrZDk3RlA5Qk13VDZ5S0lFK3NjTEJQMDlyeFQ1TDZZTStzY0xCUDA5cnhUNUw2WU0rc2NMQlAwOXJ4VDVMNllNK3NjTEJQMDlyeFQ1TDZZTStjRi9IdndlSTBEN0Z3Q3crY0YvSHZ3ZUkwRDdGd0N3K2NGL0h2d2VJMEQ3RndDdys4eVc4dnlnSjNUNnRIRGMrOHlXOHZ5Z0ozVDZ0SERjKzh5Vzh2eWdKM1Q2dEhEYys4eVc4dnlnSjNUNnRIRGMrZDk3RnY1ZkkxajY0N2pFK2Q5N0Z2NWZJMWo2NDdqRStkOTdGdjVmSTFqNjQ3akUrZDk3RnY1ZkkxajY0N2pFK3NjTEJ2MGxjMno1anVUVStzY0xCdjBsYzJ6NWp1VFUrc2NMQnYwbGMyejVqdVRVK3NjTEJ2MGxjMno1anVUVStjRi9IUHdPSTBEN0Z3Q3crY0YvSFB3T0kwRDdGd0N3K2NGL0hQd09JMEQ3RndDdys4eVc4UHlRSjNUNnRIRGMrOHlXOFB5UUozVDZ0SERjKzh5VzhQeVFKM1Q2dEhEYys4eVc4UHlRSjNUNnRIRGMrZDk3RlA1UEkxajY0N2pFK2Q5N0ZQNVBJMWo2NDdqRStkOTdGUDVQSTFqNjQ3akUrZDk3RlA1UEkxajY0N2pFK3NjTEJQMFZjMno1anVUVStzY0xCUDBWYzJ6NWp1VFUrc2NMQlAwVmMyejVqdVRVK3NjTEJQMFZjMno1anVUVStjRi9Idnk1ZzNUNDJJN0E5Y0YvSHZ5NWczVDQySTdBOWNGL0h2eTVnM1Q0Mkk3QTk4eVc4djN1bTZqNEtzN285OHlXOHYzdW02ajRLczdvOTh5Vzh2M3VtNmo0S3M3bzk4eVc4djN1bTZqNEtzN285ZDk3RnYxUUQ1RDRnYTdVOWQ5N0Z2MVFENUQ0Z2E3VTlkOTdGdjFRRDVENGdhN1U5ZDk3RnYxUUQ1RDRnYTdVOXNjTEJ2ekhmNkQ3TVNMazlzY0xCdnpIZjZEN01TTGs5c2NMQnZ6SGY2RDdNU0xrOXNjTEJ2ekhmNkQ3TVNMazljRi9IUHlwZzNUNDJJN0E5Y0YvSFB5cGczVDQySTdBOWNGL0hQeXBnM1Q0Mkk3QTk4eVc4UDNlbTZqNEtzN285OHlXOFAzZW02ajRLczdvOTh5VzhQM2VtNmo0S3M3bzk4eVc4UDNlbTZqNEtzN285ZDk3RlAxQUQ1RDRnYTdVOWQ5N0ZQMUFENUQ0Z2E3VTlkOTdGUDFBRDVENGdhN1U5ZDk3RlAxQUQ1RDRnYTdVOXNjTEJQeTNmNkQ3TVNMazlzY0xCUHkzZjZEN01TTGs5c2NMQlB5M2Y2RDdNU0xrOXNjTEJQeTNmNkQ3TVNMazljRi9IdjNTMjRUNEFBQUNBY0YvSHYzUzI0VDRBQUFDQWNGL0h2M1MyNFQ0QUFBQ0E4eVc4djFVLzd6NEFBQUNBOHlXOHYxVS83ejRBQUFDQTh5Vzh2MVUvN3o0QUFBQ0E4eVc4djFVLzd6NEFBQUNBZDk3RnYrUjY2RDVUUCs4dGQ5N0Z2K1I2NkQ1VFArOHRkOTdGditSNjZENVRQKzh0ZDk3RnYrUjY2RDVUUCs4dHNjTEJ2eDl2N1Q1VFArOHRzY0xCdng5djdUNVRQKzh0c2NMQnZ4OXY3VDVUUCs4dHNjTEJ2eDl2N1Q1VFArOHRjRi9IUDNDMjRUNEFBQUNBY0YvSFAzQzI0VDRBQUFDQWNGL0hQM0MyNFQ0QUFBQ0E4eVc4UDFFLzd6NEFBQUNBOHlXOFAxRS83ejRBQUFDQTh5VzhQMUUvN3o0QUFBQ0E4eVc4UDFFLzd6NEFBQUNBZDk3RlArQjY2RDVUUCsrdGQ5N0ZQK0I2NkQ1VFArK3RkOTdGUCtCNjZENVRQKyt0ZDk3RlArQjY2RDVUUCsrdHNjTEJQeHR2N1Q1VFArK3RzY0xCUHh0djdUNVRQKyt0c2NMQlB4dHY3VDVUUCsrdHNjTEJQeHR2N1Q1VFArK3RjRi9Idnk1ZzNUNDJJN0M5Y0YvSHZ5NWczVDQySTdDOWNGL0h2eTVnM1Q0Mkk3Qzk4eVc4djN1bTZqNEtzN3E5OHlXOHYzdW02ajRLczdxOTh5Vzh2M3VtNmo0S3M3cTk4eVc4djN1bTZqNEtzN3E5ZDk3RnYxUUQ1RDRnYTdXOWQ5N0Z2MVFENUQ0Z2E3VzlkOTdGdjFRRDVENGdhN1c5ZDk3RnYxUUQ1RDRnYTdXOXNjTEJ2ekhmNkQ3TVNMbTlzY0xCdnpIZjZEN01TTG05c2NMQnZ6SGY2RDdNU0xtOXNjTEJ2ekhmNkQ3TVNMbTljRi9IUHlwZzNUNDJJN0M5Y0YvSFB5cGczVDQySTdDOWNGL0hQeXBnM1Q0Mkk3Qzk4eVc4UDNlbTZqNEtzN3E5OHlXOFAzZW02ajRLczdxOTh5VzhQM2VtNmo0S3M3cTk4eVc4UDNlbTZqNEtzN3E5ZDk3RlAxQUQ1RDRnYTdXOWQ5N0ZQMUFENUQ0Z2E3VzlkOTdGUDFBRDVENGdhN1c5ZDk3RlAxQUQ1RDRnYTdXOXNjTEJQeTNmNkQ3TVNMbTlzY0xCUHkzZjZEN01TTG05c2NMQlB5M2Y2RDdNU0xtOXNjTEJQeTNmNkQ3TVNMbTljRi9IdndlSTBEN0Z3Q3krY0YvSHZ3ZUkwRDdGd0N5K2NGL0h2d2VJMEQ3RndDeSs4eVc4dnlnSjNUNnRIRGUrOHlXOHZ5Z0ozVDZ0SERlKzh5Vzh2eWdKM1Q2dEhEZSs4eVc4dnlnSjNUNnRIRGUrZDk3RnY1ZkkxajY0N2pHK2Q5N0Z2NWZJMWo2NDdqRytkOTdGdjVmSTFqNjQ3akcrZDk3RnY1ZkkxajY0N2pHK3NjTEJ2MGxjMno1anVUVytzY0xCdjBsYzJ6NWp1VFcrc2NMQnYwbGMyejVqdVRXK3NjTEJ2MGxjMno1anVUVytjRi9IUHdPSTBEN0Z3Q3krY0YvSFB3T0kwRDdGd0N5K2NGL0hQd09JMEQ3RndDeSs4eVc4UHlRSjNUNnRIRGUrOHlXOFB5UUozVDZ0SERlKzh5VzhQeVFKM1Q2dEhEZSs4eVc4UHlRSjNUNnRIRGUrZDk3RlA1UEkxajY0N2pHK2Q5N0ZQNVBJMWo2NDdqRytkOTdGUDVQSTFqNjQ3akcrZDk3RlA1UEkxajY0N2pHK3NjTEJQMFZjMno1anVUVytzY0xCUDBWYzJ6NWp1VFcrc2NMQlAwVmMyejVqdVRXK3NjTEJQMFZjMno1anVUVytjRi9IdjF5c3V6NW56SHErY0YvSHYxeXN1ejVuekhxK2NGL0h2MXlzdXo1bnpIcSs4eVc4djB6dHhqNHg2NFMrOHlXOHYwenR4ajR4NjRTKzh5Vzh2MHp0eGo0eDY0Uys4eVc4djB6dHhqNHg2NFMrZDk3RnY5Uk13VDZ5S0lHK2Q5N0Z2OVJNd1Q2eUtJRytkOTdGdjlSTXdUNnlLSUcrZDk3RnY5Uk13VDZ5S0lHK3NjTEJ2MU5yeFQ1TDZZTytzY0xCdjFOcnhUNUw2WU8rc2NMQnYxTnJ4VDVMNllPK3NjTEJ2MU5yeFQ1TDZZTytjRi9IUDFpc3V6NW56SHErY0YvSFAxaXN1ejVuekhxK2NGL0hQMWlzdXo1bnpIcSs4eVc4UDBqdHhqNHg2NFMrOHlXOFAwanR4ajR4NjRTKzh5VzhQMGp0eGo0eDY0Uys4eVc4UDBqdHhqNHg2NFMrZDk3RlA5Qk13VDZ5S0lHK2Q5N0ZQOUJNd1Q2eUtJRytkOTdGUDlCTXdUNnlLSUcrZDk3RlA5Qk13VDZ5S0lHK3NjTEJQMDlyeFQ1TDZZTytzY0xCUDA5cnhUNUw2WU8rc2NMQlAwOXJ4VDVMNllPK3NjTEJQMDlyeFQ1TDZZTytjRi9IdjErYW56NWRtcCsrY0YvSHYxK2FuejVkbXArK2NGL0h2MSthbno1ZG1wKys4eVc4djJjc3FUNWxMS20rOHlXOHYyY3NxVDVsTEttKzh5Vzh2MmNzcVQ1bExLbSs4eVc4djJjc3FUNWxMS20rZDk3RnYyTmpwRDVoWTZTK2Q5N0Z2Mk5qcEQ1aFk2UytkOTdGdjJOanBENWhZNlMrZDk3RnYyTmpwRDVoWTZTK3NjTEJ2eXJrcHo0bzVLZStzY0xCdnlya3B6NG81S2Urc2NMQnZ5cmtwejRvNUtlK3NjTEJ2eXJrcHo0bzVLZStjRi9IUDF1YW56NWRtcCsrY0YvSFAxdWFuejVkbXArK2NGL0hQMXVhbno1ZG1wKys4eVc4UDJNc3FUNWxMS20rOHlXOFAyTXNxVDVsTEttKzh5VzhQMk1zcVQ1bExLbSs4eVc4UDJNc3FUNWxMS20rZDk3RlAxOWpwRDVoWTZTK2Q5N0ZQMTlqcEQ1aFk2UytkOTdGUDE5anBENWhZNlMrZDk3RlAxOWpwRDVoWTZTK3NjTEJQeWJrcHo0bzVLZStzY0xCUHlia3B6NG81S2Urc2NMQlB5YmtwejRvNUtlK3NjTEJQeWJrcHo0bzVLZStjRi9IdjJ2TWVqNWFyTHUrY0YvSHYydk1lajVhckx1K2NGL0h2MnZNZWo1YXJMdSs4eVc4dnpQcmhENUs3Y2ErOHlXOHZ6UHJoRDVLN2NhKzh5Vzh2elByaEQ1SzdjYSs4eVc4dnpQcmhENUs3Y2ErZDk3RnY3UW9nVDdTVE1HK2Q5N0Z2N1FvZ1Q3U1RNRytkOTdGdjdRb2dUN1NUTUcrZDk3RnY3UW9nVDdTVE1HK3NjTEJ2MDNwZ3o1UmE4VytzY0xCdjAzcGd6NVJhOFcrc2NMQnYwM3BnejVSYThXK3NjTEJ2MDNwZ3o1UmE4VytjRi9IUDJQTWVqNWFyTHUrY0YvSFAyUE1lajVhckx1K2NGL0hQMlBNZWo1YXJMdSs4eVc4UHkvcmhENUs3Y2ErOHlXOFB5L3JoRDVLN2NhKzh5VzhQeS9yaEQ1SzdjYSs4eVc4UHkvcmhENUs3Y2ErZDk3RlA3QW9nVDdTVE1HK2Q5N0ZQN0FvZ1Q3U1RNRytkOTdGUDdBb2dUN1NUTUcrZDk3RlA3QW9nVDdTVE1HK3NjTEJQMG5wZ3o1UmE4VytzY0xCUDBucGd6NVJhOFcrc2NMQlAwbnBnejVSYThXK3NjTEJQMG5wZ3o1UmE4VytjRi9IdjhyQUxENEZpTkMrY0YvSHY4ckFMRDRGaU5DK2NGL0h2OHJBTEQ0RmlOQys4eVc4djdFY056NG1DZDIrOHlXOHY3RWNOejRtQ2QyKzh5Vzh2N0VjTno0bUNkMis4eVc4djdFY056NG1DZDIrZDk3RnY3M3VNVDZWeU5hK2Q5N0Z2NzN1TVQ2VnlOYStkOTdGdjczdU1UNlZ5TmErZDk3RnY3M3VNVDZWeU5hK3NjTEJ2Mmk1TlQ1SFhOdStzY0xCdjJpNU5UNUhYTnUrc2NMQnYyaTVOVDVIWE51K3NjTEJ2Mmk1TlQ1SFhOdStjRi9IUDhEQUxENEZpTkMrY0YvSFA4REFMRDRGaU5DK2NGL0hQOERBTEQ0RmlOQys4eVc4UDZrY056NG1DZDIrOHlXOFA2a2NOejRtQ2QyKzh5VzhQNmtjTno0bUNkMis4eVc4UDZrY056NG1DZDIrZDk3RlA3UHVNVDZWeU5hK2Q5N0ZQN1B1TVQ2VnlOYStkOTdGUDdQdU1UNlZ5TmErZDk3RlA3UHVNVDZWeU5hK3NjTEJQMTY1TlQ1SFhOdStzY0xCUDE2NU5UNUhYTnUrc2NMQlAxNjVOVDVIWE51K3NjTEJQMTY1TlQ1SFhOdStjRi9Idno4anNEMHNZTjIrY0YvSHZ6OGpzRDBzWU4yK2NGL0h2ejhqc0Qwc1lOMis4eVc4dnhPenVqMTVwdXErOHlXOHZ4T3p1ajE1cHVxKzh5Vzh2eE96dWoxNXB1cSs4eVc4dnhPenVqMTVwdXErZDk3RnZ5bHJ0VDFTQStTK2Q5N0Z2eWxydFQxU0ErUytkOTdGdnlscnRUMVNBK1MrZDk3RnZ5bHJ0VDFTQStTK3NjTEJ2OVJJdVQwdjMraStzY0xCdjlSSXVUMHYzK2krc2NMQnY5Ukl1VDB2MytpK3NjTEJ2OVJJdVQwdjMraStjRi9IUHk0anNEMHNZTjIrY0YvSFB5NGpzRDBzWU4yK2NGL0hQeTRqc0Qwc1lOMis4eVc4UHdLenVqMTVwdXErOHlXOFB3S3p1ajE1cHVxKzh5VzhQd0t6dWoxNXB1cSs4eVc4UHdLenVqMTVwdXErZDk3RlB4aHJ0VDFTQStTK2Q5N0ZQeGhydFQxU0ErUytkOTdGUHhocnRUMVNBK1MrZDk3RlB4aHJ0VDFTQStTK3NjTEJQOE5JdVQwdjMraStzY0xCUDhOSXVUMHYzK2krc2NMQlA4Tkl1VDB2MytpK3NjTEJQOE5JdVQwdjMraStBQUFBQUhCZng3OXl0dUcrQUFBQUFIQmZ4Nzl5dHVHK0FBQUFBSEJmeDc5eXR1RytBQUFBQVBNbHZMOVRQKysrQUFBQUFQTWx2TDlUUCsrK0FBQUFBUE1sdkw5VFArKytBQUFBQVBNbHZMOVRQKysrVXovdnJYZmV4Yi9pZXVpK1V6L3ZyWGZleGIvaWV1aStVei92clhmZXhiL2lldWkrVXovdnJYZmV4Yi9pZXVpK1V6L3ZyYkhDd2I4ZGIrMitVei92cmJIQ3diOGRiKzIrVXovdnJiSEN3YjhkYisyK1V6L3ZyYkhDd2I4ZGIrMitBQUFBQUhCZnh6OXl0dUcrQUFBQUFIQmZ4ejl5dHVHK0FBQUFBSEJmeHo5eXR1RytBQUFBQVBNbHZEOVRQKysrQUFBQUFQTWx2RDlUUCsrK0FBQUFBUE1sdkQ5VFArKytBQUFBQVBNbHZEOVRQKysrVXovdkxYZmV4VC9pZXVpK1V6L3ZMWGZleFQvaWV1aStVei92TFhmZXhUL2lldWkrVXovdkxYZmV4VC9pZXVpK1V6L3ZMYkhDd1Q4ZGIrMitVei92TGJIQ3dUOGRiKzIrVXovdkxiSEN3VDhkYisyK1V6L3ZMYkhDd1Q4ZGIrMitOaU93UFhCZng3OHNZTjIrTmlPd1BYQmZ4NzhzWU4yK05pT3dQWEJmeDc4c1lOMitDck82UGZNbHZMOTVwdXErQ3JPNlBmTWx2TDk1cHVxK0NyTzZQZk1sdkw5NXB1cS