three-stdlib
Version:
stand-alone library of threejs examples
4,811 lines (4,810 loc) • 42.5 kB
JavaScript
import { Mesh, BufferGeometry, BufferAttribute, DynamicDrawUsage, Sphere, Vector3, Color } from "three";
class MarchingCubes extends Mesh {
constructor(resolution, material, enableUvs = false, enableColors = false, maxPolyCount = 1e4) {
const geometry = new BufferGeometry();
super(geometry, material);
this.isMarchingCubes = true;
const scope = this;
const vlist = new Float32Array(12 * 3);
const nlist = new Float32Array(12 * 3);
const clist = new Float32Array(12 * 3);
this.enableUvs = enableUvs;
this.enableColors = enableColors;
this.init = function(resolution2) {
this.resolution = resolution2;
this.isolation = 80;
this.size = resolution2;
this.size2 = this.size * this.size;
this.size3 = this.size2 * this.size;
this.halfsize = this.size / 2;
this.delta = 2 / this.size;
this.yd = this.size;
this.zd = this.size2;
this.field = new Float32Array(this.size3);
this.normal_cache = new Float32Array(this.size3 * 3);
this.palette = new Float32Array(this.size3 * 3);
this.count = 0;
const maxVertexCount = maxPolyCount * 3;
this.positionArray = new Float32Array(maxVertexCount * 3);
const positionAttribute = new BufferAttribute(this.positionArray, 3);
positionAttribute.setUsage(DynamicDrawUsage);
geometry.setAttribute("position", positionAttribute);
this.normalArray = new Float32Array(maxVertexCount * 3);
const normalAttribute = new BufferAttribute(this.normalArray, 3);
normalAttribute.setUsage(DynamicDrawUsage);
geometry.setAttribute("normal", normalAttribute);
if (this.enableUvs) {
this.uvArray = new Float32Array(maxVertexCount * 2);
const uvAttribute = new BufferAttribute(this.uvArray, 2);
uvAttribute.setUsage(DynamicDrawUsage);
geometry.setAttribute("uv", uvAttribute);
}
if (this.enableColors) {
this.colorArray = new Float32Array(maxVertexCount * 3);
const colorAttribute = new BufferAttribute(this.colorArray, 3);
colorAttribute.setUsage(DynamicDrawUsage);
geometry.setAttribute("color", colorAttribute);
}
geometry.boundingSphere = new Sphere(new Vector3(), 1);
};
function lerp(a, b, t) {
return a + (b - a) * t;
}
function VIntX(q, offset, isol, x, y, z, valp1, valp2, c_offset1, c_offset2) {
const mu = (isol - valp1) / (valp2 - valp1), nc = scope.normal_cache;
vlist[offset + 0] = x + mu * scope.delta;
vlist[offset + 1] = y;
vlist[offset + 2] = z;
nlist[offset + 0] = lerp(nc[q + 0], nc[q + 3], mu);
nlist[offset + 1] = lerp(nc[q + 1], nc[q + 4], mu);
nlist[offset + 2] = lerp(nc[q + 2], nc[q + 5], mu);
clist[offset + 0] = lerp(scope.palette[c_offset1 * 3 + 0], scope.palette[c_offset2 * 3 + 0], mu);
clist[offset + 1] = lerp(scope.palette[c_offset1 * 3 + 1], scope.palette[c_offset2 * 3 + 1], mu);
clist[offset + 2] = lerp(scope.palette[c_offset1 * 3 + 2], scope.palette[c_offset2 * 3 + 2], mu);
}
function VIntY(q, offset, isol, x, y, z, valp1, valp2, c_offset1, c_offset2) {
const mu = (isol - valp1) / (valp2 - valp1), nc = scope.normal_cache;
vlist[offset + 0] = x;
vlist[offset + 1] = y + mu * scope.delta;
vlist[offset + 2] = z;
const q2 = q + scope.yd * 3;
nlist[offset + 0] = lerp(nc[q + 0], nc[q2 + 0], mu);
nlist[offset + 1] = lerp(nc[q + 1], nc[q2 + 1], mu);
nlist[offset + 2] = lerp(nc[q + 2], nc[q2 + 2], mu);
clist[offset + 0] = lerp(scope.palette[c_offset1 * 3 + 0], scope.palette[c_offset2 * 3 + 0], mu);
clist[offset + 1] = lerp(scope.palette[c_offset1 * 3 + 1], scope.palette[c_offset2 * 3 + 1], mu);
clist[offset + 2] = lerp(scope.palette[c_offset1 * 3 + 2], scope.palette[c_offset2 * 3 + 2], mu);
}
function VIntZ(q, offset, isol, x, y, z, valp1, valp2, c_offset1, c_offset2) {
const mu = (isol - valp1) / (valp2 - valp1), nc = scope.normal_cache;
vlist[offset + 0] = x;
vlist[offset + 1] = y;
vlist[offset + 2] = z + mu * scope.delta;
const q2 = q + scope.zd * 3;
nlist[offset + 0] = lerp(nc[q + 0], nc[q2 + 0], mu);
nlist[offset + 1] = lerp(nc[q + 1], nc[q2 + 1], mu);
nlist[offset + 2] = lerp(nc[q + 2], nc[q2 + 2], mu);
clist[offset + 0] = lerp(scope.palette[c_offset1 * 3 + 0], scope.palette[c_offset2 * 3 + 0], mu);
clist[offset + 1] = lerp(scope.palette[c_offset1 * 3 + 1], scope.palette[c_offset2 * 3 + 1], mu);
clist[offset + 2] = lerp(scope.palette[c_offset1 * 3 + 2], scope.palette[c_offset2 * 3 + 2], mu);
}
function compNorm(q) {
const q3 = q * 3;
if (scope.normal_cache[q3] === 0) {
scope.normal_cache[q3 + 0] = scope.field[q - 1] - scope.field[q + 1];
scope.normal_cache[q3 + 1] = scope.field[q - scope.yd] - scope.field[q + scope.yd];
scope.normal_cache[q3 + 2] = scope.field[q - scope.zd] - scope.field[q + scope.zd];
}
}
function polygonize(fx, fy, fz, q, isol) {
const q1 = q + 1, qy = q + scope.yd, qz = q + scope.zd, q1y = q1 + scope.yd, q1z = q1 + scope.zd, qyz = q + scope.yd + scope.zd, q1yz = q1 + scope.yd + scope.zd;
let cubeindex = 0;
const field0 = scope.field[q], field1 = scope.field[q1], field2 = scope.field[qy], field3 = scope.field[q1y], field4 = scope.field[qz], field5 = scope.field[q1z], field6 = scope.field[qyz], field7 = scope.field[q1yz];
if (field0 < isol)
cubeindex |= 1;
if (field1 < isol)
cubeindex |= 2;
if (field2 < isol)
cubeindex |= 8;
if (field3 < isol)
cubeindex |= 4;
if (field4 < isol)
cubeindex |= 16;
if (field5 < isol)
cubeindex |= 32;
if (field6 < isol)
cubeindex |= 128;
if (field7 < isol)
cubeindex |= 64;
const bits = edgeTable[cubeindex];
if (bits === 0)
return 0;
const d = scope.delta, fx2 = fx + d, fy2 = fy + d, fz2 = fz + d;
if (bits & 1) {
compNorm(q);
compNorm(q1);
VIntX(q * 3, 0, isol, fx, fy, fz, field0, field1, q, q1);
}
if (bits & 2) {
compNorm(q1);
compNorm(q1y);
VIntY(q1 * 3, 3, isol, fx2, fy, fz, field1, field3, q1, q1y);
}
if (bits & 4) {
compNorm(qy);
compNorm(q1y);
VIntX(qy * 3, 6, isol, fx, fy2, fz, field2, field3, qy, q1y);
}
if (bits & 8) {
compNorm(q);
compNorm(qy);
VIntY(q * 3, 9, isol, fx, fy, fz, field0, field2, q, qy);
}
if (bits & 16) {
compNorm(qz);
compNorm(q1z);
VIntX(qz * 3, 12, isol, fx, fy, fz2, field4, field5, qz, q1z);
}
if (bits & 32) {
compNorm(q1z);
compNorm(q1yz);
VIntY(q1z * 3, 15, isol, fx2, fy, fz2, field5, field7, q1z, q1yz);
}
if (bits & 64) {
compNorm(qyz);
compNorm(q1yz);
VIntX(qyz * 3, 18, isol, fx, fy2, fz2, field6, field7, qyz, q1yz);
}
if (bits & 128) {
compNorm(qz);
compNorm(qyz);
VIntY(qz * 3, 21, isol, fx, fy, fz2, field4, field6, qz, qyz);
}
if (bits & 256) {
compNorm(q);
compNorm(qz);
VIntZ(q * 3, 24, isol, fx, fy, fz, field0, field4, q, qz);
}
if (bits & 512) {
compNorm(q1);
compNorm(q1z);
VIntZ(q1 * 3, 27, isol, fx2, fy, fz, field1, field5, q1, q1z);
}
if (bits & 1024) {
compNorm(q1y);
compNorm(q1yz);
VIntZ(q1y * 3, 30, isol, fx2, fy2, fz, field3, field7, q1y, q1yz);
}
if (bits & 2048) {
compNorm(qy);
compNorm(qyz);
VIntZ(qy * 3, 33, isol, fx, fy2, fz, field2, field6, qy, qyz);
}
cubeindex <<= 4;
let o1, o2, o3, numtris = 0, i = 0;
while (triTable[cubeindex + i] != -1) {
o1 = cubeindex + i;
o2 = o1 + 1;
o3 = o1 + 2;
posnormtriv(vlist, nlist, clist, 3 * triTable[o1], 3 * triTable[o2], 3 * triTable[o3]);
i += 3;
numtris++;
}
return numtris;
}
function posnormtriv(pos, norm, colors, o1, o2, o3) {
const c = scope.count * 3;
scope.positionArray[c + 0] = pos[o1];
scope.positionArray[c + 1] = pos[o1 + 1];
scope.positionArray[c + 2] = pos[o1 + 2];
scope.positionArray[c + 3] = pos[o2];
scope.positionArray[c + 4] = pos[o2 + 1];
scope.positionArray[c + 5] = pos[o2 + 2];
scope.positionArray[c + 6] = pos[o3];
scope.positionArray[c + 7] = pos[o3 + 1];
scope.positionArray[c + 8] = pos[o3 + 2];
if (scope.material.flatShading === true) {
const nx = (norm[o1 + 0] + norm[o2 + 0] + norm[o3 + 0]) / 3;
const ny = (norm[o1 + 1] + norm[o2 + 1] + norm[o3 + 1]) / 3;
const nz = (norm[o1 + 2] + norm[o2 + 2] + norm[o3 + 2]) / 3;
scope.normalArray[c + 0] = nx;
scope.normalArray[c + 1] = ny;
scope.normalArray[c + 2] = nz;
scope.normalArray[c + 3] = nx;
scope.normalArray[c + 4] = ny;
scope.normalArray[c + 5] = nz;
scope.normalArray[c + 6] = nx;
scope.normalArray[c + 7] = ny;
scope.normalArray[c + 8] = nz;
} else {
scope.normalArray[c + 0] = norm[o1 + 0];
scope.normalArray[c + 1] = norm[o1 + 1];
scope.normalArray[c + 2] = norm[o1 + 2];
scope.normalArray[c + 3] = norm[o2 + 0];
scope.normalArray[c + 4] = norm[o2 + 1];
scope.normalArray[c + 5] = norm[o2 + 2];
scope.normalArray[c + 6] = norm[o3 + 0];
scope.normalArray[c + 7] = norm[o3 + 1];
scope.normalArray[c + 8] = norm[o3 + 2];
}
if (scope.enableUvs) {
const d = scope.count * 2;
scope.uvArray[d + 0] = pos[o1 + 0];
scope.uvArray[d + 1] = pos[o1 + 2];
scope.uvArray[d + 2] = pos[o2 + 0];
scope.uvArray[d + 3] = pos[o2 + 2];
scope.uvArray[d + 4] = pos[o3 + 0];
scope.uvArray[d + 5] = pos[o3 + 2];
}
if (scope.enableColors) {
scope.colorArray[c + 0] = colors[o1 + 0];
scope.colorArray[c + 1] = colors[o1 + 1];
scope.colorArray[c + 2] = colors[o1 + 2];
scope.colorArray[c + 3] = colors[o2 + 0];
scope.colorArray[c + 4] = colors[o2 + 1];
scope.colorArray[c + 5] = colors[o2 + 2];
scope.colorArray[c + 6] = colors[o3 + 0];
scope.colorArray[c + 7] = colors[o3 + 1];
scope.colorArray[c + 8] = colors[o3 + 2];
}
scope.count += 3;
}
this.addBall = function(ballx, bally, ballz, strength, subtract, colors) {
const sign = Math.sign(strength);
strength = Math.abs(strength);
const userDefineColor = !(colors === void 0 || colors === null);
let ballColor = new Color(ballx, bally, ballz);
if (userDefineColor) {
try {
ballColor = colors instanceof Color ? colors : Array.isArray(colors) ? new Color(
Math.min(Math.abs(colors[0]), 1),
Math.min(Math.abs(colors[1]), 1),
Math.min(Math.abs(colors[2]), 1)
) : new Color(colors);
} catch (err) {
ballColor = new Color(ballx, bally, ballz);
}
}
const radius = this.size * Math.sqrt(strength / subtract), zs = ballz * this.size, ys = bally * this.size, xs = ballx * this.size;
let min_z = Math.floor(zs - radius);
if (min_z < 1)
min_z = 1;
let max_z = Math.floor(zs + radius);
if (max_z > this.size - 1)
max_z = this.size - 1;
let min_y = Math.floor(ys - radius);
if (min_y < 1)
min_y = 1;
let max_y = Math.floor(ys + radius);
if (max_y > this.size - 1)
max_y = this.size - 1;
let min_x = Math.floor(xs - radius);
if (min_x < 1)
min_x = 1;
let max_x = Math.floor(xs + radius);
if (max_x > this.size - 1)
max_x = this.size - 1;
let x, y, z, y_offset, z_offset, fx, fy, fz, fz2, fy2, val;
for (z = min_z; z < max_z; z++) {
z_offset = this.size2 * z;
fz = z / this.size - ballz;
fz2 = fz * fz;
for (y = min_y; y < max_y; y++) {
y_offset = z_offset + this.size * y;
fy = y / this.size - bally;
fy2 = fy * fy;
for (x = min_x; x < max_x; x++) {
fx = x / this.size - ballx;
val = strength / (1e-6 + fx * fx + fy2 + fz2) - subtract;
if (val > 0) {
this.field[y_offset + x] += val * sign;
const ratio = Math.sqrt((x - xs) * (x - xs) + (y - ys) * (y - ys) + (z - zs) * (z - zs)) / radius;
const contrib = 1 - ratio * ratio * ratio * (ratio * (ratio * 6 - 15) + 10);
this.palette[(y_offset + x) * 3 + 0] += ballColor.r * contrib;
this.palette[(y_offset + x) * 3 + 1] += ballColor.g * contrib;
this.palette[(y_offset + x) * 3 + 2] += ballColor.b * contrib;
}
}
}
}
};
this.addPlaneX = function(strength, subtract) {
const size = this.size, yd = this.yd, zd = this.zd, field = this.field;
let x, y, z, xx, val, xdiv, cxy, dist = size * Math.sqrt(strength / subtract);
if (dist > size)
dist = size;
for (x = 0; x < dist; x++) {
xdiv = x / size;
xx = xdiv * xdiv;
val = strength / (1e-4 + xx) - subtract;
if (val > 0) {
for (y = 0; y < size; y++) {
cxy = x + y * yd;
for (z = 0; z < size; z++) {
field[zd * z + cxy] += val;
}
}
}
}
};
this.addPlaneY = function(strength, subtract) {
const size = this.size, yd = this.yd, zd = this.zd, field = this.field;
let x, y, z, yy, val, ydiv, cy, cxy, dist = size * Math.sqrt(strength / subtract);
if (dist > size)
dist = size;
for (y = 0; y < dist; y++) {
ydiv = y / size;
yy = ydiv * ydiv;
val = strength / (1e-4 + yy) - subtract;
if (val > 0) {
cy = y * yd;
for (x = 0; x < size; x++) {
cxy = cy + x;
for (z = 0; z < size; z++)
field[zd * z + cxy] += val;
}
}
}
};
this.addPlaneZ = function(strength, subtract) {
const size = this.size, yd = this.yd, zd = this.zd, field = this.field;
let x, y, z, zz, val, zdiv, cz, cyz, dist = size * Math.sqrt(strength / subtract);
if (dist > size)
dist = size;
for (z = 0; z < dist; z++) {
zdiv = z / size;
zz = zdiv * zdiv;
val = strength / (1e-4 + zz) - subtract;
if (val > 0) {
cz = zd * z;
for (y = 0; y < size; y++) {
cyz = cz + y * yd;
for (x = 0; x < size; x++)
field[cyz + x] += val;
}
}
}
};
this.setCell = function(x, y, z, value) {
const index = this.size2 * z + this.size * y + x;
this.field[index] = value;
};
this.getCell = function(x, y, z) {
const index = this.size2 * z + this.size * y + x;
return this.field[index];
};
this.blur = function(intensity = 1) {
const field = this.field;
const fieldCopy = field.slice();
const size = this.size;
const size2 = this.size2;
for (let x = 0; x < size; x++) {
for (let y = 0; y < size; y++) {
for (let z = 0; z < size; z++) {
const index = size2 * z + size * y + x;
let val = fieldCopy[index];
let count = 1;
for (let x2 = -1; x2 <= 1; x2 += 2) {
const x3 = x2 + x;
if (x3 < 0 || x3 >= size)
continue;
for (let y2 = -1; y2 <= 1; y2 += 2) {
const y3 = y2 + y;
if (y3 < 0 || y3 >= size)
continue;
for (let z2 = -1; z2 <= 1; z2 += 2) {
const z3 = z2 + z;
if (z3 < 0 || z3 >= size)
continue;
const index2 = size2 * z3 + size * y3 + x3;
const val2 = fieldCopy[index2];
count++;
val += intensity * (val2 - val) / count;
}
}
}
field[index] = val;
}
}
}
};
this.reset = function() {
for (let i = 0; i < this.size3; i++) {
this.normal_cache[i * 3] = 0;
this.field[i] = 0;
this.palette[i * 3] = this.palette[i * 3 + 1] = this.palette[i * 3 + 2] = 0;
}
};
this.update = function() {
this.count = 0;
const smin2 = this.size - 2;
for (let z = 1; z < smin2; z++) {
const z_offset = this.size2 * z;
const fz = (z - this.halfsize) / this.halfsize;
for (let y = 1; y < smin2; y++) {
const y_offset = z_offset + this.size * y;
const fy = (y - this.halfsize) / this.halfsize;
for (let x = 1; x < smin2; x++) {
const fx = (x - this.halfsize) / this.halfsize;
const q = y_offset + x;
polygonize(fx, fy, fz, q, this.isolation);
}
}
}
this.geometry.setDrawRange(0, this.count);
geometry.getAttribute("position").needsUpdate = true;
geometry.getAttribute("normal").needsUpdate = true;
if (this.enableUvs)
geometry.getAttribute("uv").needsUpdate = true;
if (this.enableColors)
geometry.getAttribute("color").needsUpdate = true;
if (this.count / 3 > maxPolyCount)
console.warn(
"THREE.MarchingCubes: Geometry buffers too small for rendering. Please create an instance with a higher poly count."
);
};
this.init(resolution);
}
}
const edgeTable = new Int32Array([
0,
265,
515,
778,
1030,
1295,
1541,
1804,
2060,
2309,
2575,
2822,
3082,
3331,
3593,
3840,
400,
153,
915,
666,
1430,
1183,
1941,
1692,
2460,
2197,
2975,
2710,
3482,
3219,
3993,
3728,
560,
825,
51,
314,
1590,
1855,
1077,
1340,
2620,
2869,
2111,
2358,
3642,
3891,
3129,
3376,
928,
681,
419,
170,
1958,
1711,
1445,
1196,
2988,
2725,
2479,
2214,
4010,
3747,
3497,
3232,
1120,
1385,
1635,
1898,
102,
367,
613,
876,
3180,
3429,
3695,
3942,
2154,
2403,
2665,
2912,
1520,
1273,
2035,
1786,
502,
255,
1013,
764,
3580,
3317,
4095,
3830,
2554,
2291,
3065,
2800,
1616,
1881,
1107,
1370,
598,
863,
85,
348,
3676,
3925,
3167,
3414,
2650,
2899,
2137,
2384,
1984,
1737,
1475,
1226,
966,
719,
453,
204,
4044,
3781,
3535,
3270,
3018,
2755,
2505,
2240,
2240,
2505,
2755,
3018,
3270,
3535,
3781,
4044,
204,
453,
719,
966,
1226,
1475,
1737,
1984,
2384,
2137,
2899,
2650,
3414,
3167,
3925,
3676,
348,
85,
863,
598,
1370,
1107,
1881,
1616,
2800,
3065,
2291,
2554,
3830,
4095,
3317,
3580,
764,
1013,
255,
502,
1786,
2035,
1273,
1520,
2912,
2665,
2403,
2154,
3942,
3695,
3429,
3180,
876,
613,
367,
102,
1898,
1635,
1385,
1120,
3232,
3497,
3747,
4010,
2214,
2479,
2725,
2988,
1196,
1445,
1711,
1958,
170,
419,
681,
928,
3376,
3129,
3891,
3642,
2358,
2111,
2869,
2620,
1340,
1077,
1855,
1590,
314,
51,
825,
560,
3728,
3993,
3219,
3482,
2710,
2975,
2197,
2460,
1692,
1941,
1183,
1430,
666,
915,
153,
400,
3840,
3593,
3331,
3082,
2822,
2575,
2309,
2060,
1804,
1541,
1295,
1030,
778,
515,
265,
0
]);
const triTable = new Int32Array([
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
8,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
1,
9,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
8,
3,
9,
8,
1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
2,
10,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
8,
3,
1,
2,
10,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
2,
10,
0,
2,
9,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
2,
8,
3,
2,
10,
8,
10,
9,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
11,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
11,
2,
8,
11,
0,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
9,
0,
2,
3,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
11,
2,
1,
9,
11,
9,
8,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
10,
1,
11,
10,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
10,
1,
0,
8,
10,
8,
11,
10,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
9,
0,
3,
11,
9,
11,
10,
9,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
8,
10,
10,
8,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
7,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
3,
0,
7,
3,
4,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
1,
9,
8,
4,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
1,
9,
4,
7,
1,
7,
3,
1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
2,
10,
8,
4,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
4,
7,
3,
0,
4,
1,
2,
10,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
2,
10,
9,
0,
2,
8,
4,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
2,
10,
9,
2,
9,
7,
2,
7,
3,
7,
9,
4,
-1,
-1,
-1,
-1,
8,
4,
7,
3,
11,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
11,
4,
7,
11,
2,
4,
2,
0,
4,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
0,
1,
8,
4,
7,
2,
3,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
7,
11,
9,
4,
11,
9,
11,
2,
9,
2,
1,
-1,
-1,
-1,
-1,
3,
10,
1,
3,
11,
10,
7,
8,
4,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
11,
10,
1,
4,
11,
1,
0,
4,
7,
11,
4,
-1,
-1,
-1,
-1,
4,
7,
8,
9,
0,
11,
9,
11,
10,
11,
0,
3,
-1,
-1,
-1,
-1,
4,
7,
11,
4,
11,
9,
9,
11,
10,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
5,
4,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
5,
4,
0,
8,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
5,
4,
1,
5,
0,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
8,
5,
4,
8,
3,
5,
3,
1,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
2,
10,
9,
5,
4,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
0,
8,
1,
2,
10,
4,
9,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
5,
2,
10,
5,
4,
2,
4,
0,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
2,
10,
5,
3,
2,
5,
3,
5,
4,
3,
4,
8,
-1,
-1,
-1,
-1,
9,
5,
4,
2,
3,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
11,
2,
0,
8,
11,
4,
9,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
5,
4,
0,
1,
5,
2,
3,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
2,
1,
5,
2,
5,
8,
2,
8,
11,
4,
8,
5,
-1,
-1,
-1,
-1,
10,
3,
11,
10,
1,
3,
9,
5,
4,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
9,
5,
0,
8,
1,
8,
10,
1,
8,
11,
10,
-1,
-1,
-1,
-1,
5,
4,
0,
5,
0,
11,
5,
11,
10,
11,
0,
3,
-1,
-1,
-1,
-1,
5,
4,
8,
5,
8,
10,
10,
8,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
7,
8,
5,
7,
9,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
3,
0,
9,
5,
3,
5,
7,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
7,
8,
0,
1,
7,
1,
5,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
5,
3,
3,
5,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
7,
8,
9,
5,
7,
10,
1,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
10,
1,
2,
9,
5,
0,
5,
3,
0,
5,
7,
3,
-1,
-1,
-1,
-1,
8,
0,
2,
8,
2,
5,
8,
5,
7,
10,
5,
2,
-1,
-1,
-1,
-1,
2,
10,
5,
2,
5,
3,
3,
5,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
7,
9,
5,
7,
8,
9,
3,
11,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
5,
7,
9,
7,
2,
9,
2,
0,
2,
7,
11,
-1,
-1,
-1,
-1,
2,
3,
11,
0,
1,
8,
1,
7,
8,
1,
5,
7,
-1,
-1,
-1,
-1,
11,
2,
1,
11,
1,
7,
7,
1,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
5,
8,
8,
5,
7,
10,
1,
3,
10,
3,
11,
-1,
-1,
-1,
-1,
5,
7,
0,
5,
0,
9,
7,
11,
0,
1,
0,
10,
11,
10,
0,
-1,
11,
10,
0,
11,
0,
3,
10,
5,
0,
8,
0,
7,
5,
7,
0,
-1,
11,
10,
5,
7,
11,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
10,
6,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
8,
3,
5,
10,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
0,
1,
5,
10,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
8,
3,
1,
9,
8,
5,
10,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
6,
5,
2,
6,
1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
6,
5,
1,
2,
6,
3,
0,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
6,
5,
9,
0,
6,
0,
2,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
5,
9,
8,
5,
8,
2,
5,
2,
6,
3,
2,
8,
-1,
-1,
-1,
-1,
2,
3,
11,
10,
6,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
11,
0,
8,
11,
2,
0,
10,
6,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
1,
9,
2,
3,
11,
5,
10,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
5,
10,
6,
1,
9,
2,
9,
11,
2,
9,
8,
11,
-1,
-1,
-1,
-1,
6,
3,
11,
6,
5,
3,
5,
1,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
8,
11,
0,
11,
5,
0,
5,
1,
5,
11,
6,
-1,
-1,
-1,
-1,
3,
11,
6,
0,
3,
6,
0,
6,
5,
0,
5,
9,
-1,
-1,
-1,
-1,
6,
5,
9,
6,
9,
11,
11,
9,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
5,
10,
6,
4,
7,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
3,
0,
4,
7,
3,
6,
5,
10,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
9,
0,
5,
10,
6,
8,
4,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
10,
6,
5,
1,
9,
7,
1,
7,
3,
7,
9,
4,
-1,
-1,
-1,
-1,
6,
1,
2,
6,
5,
1,
4,
7,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
2,
5,
5,
2,
6,
3,
0,
4,
3,
4,
7,
-1,
-1,
-1,
-1,
8,
4,
7,
9,
0,
5,
0,
6,
5,
0,
2,
6,
-1,
-1,
-1,
-1,
7,
3,
9,
7,
9,
4,
3,
2,
9,
5,
9,
6,
2,
6,
9,
-1,
3,
11,
2,
7,
8,
4,
10,
6,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
5,
10,
6,
4,
7,
2,
4,
2,
0,
2,
7,
11,
-1,
-1,
-1,
-1,
0,
1,
9,
4,
7,
8,
2,
3,
11,
5,
10,
6,
-1,
-1,
-1,
-1,
9,
2,
1,
9,
11,
2,
9,
4,
11,
7,
11,
4,
5,
10,
6,
-1,
8,
4,
7,
3,
11,
5,
3,
5,
1,
5,
11,
6,
-1,
-1,
-1,
-1,
5,
1,
11,
5,
11,
6,
1,
0,
11,
7,
11,
4,
0,
4,
11,
-1,
0,
5,
9,
0,
6,
5,
0,
3,
6,
11,
6,
3,
8,
4,
7,
-1,
6,
5,
9,
6,
9,
11,
4,
7,
9,
7,
11,
9,
-1,
-1,
-1,
-1,
10,
4,
9,
6,
4,
10,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
10,
6,
4,
9,
10,
0,
8,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
10,
0,
1,
10,
6,
0,
6,
4,
0,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
8,
3,
1,
8,
1,
6,
8,
6,
4,
6,
1,
10,
-1,
-1,
-1,
-1,
1,
4,
9,
1,
2,
4,
2,
6,
4,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
0,
8,
1,
2,
9,
2,
4,
9,
2,
6,
4,
-1,
-1,
-1,
-1,
0,
2,
4,
4,
2,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
8,
3,
2,
8,
2,
4,
4,
2,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
10,
4,
9,
10,
6,
4,
11,
2,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
8,
2,
2,
8,
11,
4,
9,
10,
4,
10,
6,
-1,
-1,
-1,
-1,
3,
11,
2,
0,
1,
6,
0,
6,
4,
6,
1,
10,
-1,
-1,
-1,
-1,
6,
4,
1,
6,
1,
10,
4,
8,
1,
2,
1,
11,
8,
11,
1,
-1,
9,
6,
4,
9,
3,
6,
9,
1,
3,
11,
6,
3,
-1,
-1,
-1,
-1,
8,
11,
1,
8,
1,
0,
11,
6,
1,
9,
1,
4,
6,
4,
1,
-1,
3,
11,
6,
3,
6,
0,
0,
6,
4,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
6,
4,
8,
11,
6,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
7,
10,
6,
7,
8,
10,
8,
9,
10,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
7,
3,
0,
10,
7,
0,
9,
10,
6,
7,
10,
-1,
-1,
-1,
-1,
10,
6,
7,
1,
10,
7,
1,
7,
8,
1,
8,
0,
-1,
-1,
-1,
-1,
10,
6,
7,
10,
7,
1,
1,
7,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
2,
6,
1,
6,
8,
1,
8,
9,
8,
6,
7,
-1,
-1,
-1,
-1,
2,
6,
9,
2,
9,
1,
6,
7,
9,
0,
9,
3,
7,
3,
9,
-1,
7,
8,
0,
7,
0,
6,
6,
0,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
7,
3,
2,
6,
7,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
2,
3,
11,
10,
6,
8,
10,
8,
9,
8,
6,
7,
-1,
-1,
-1,
-1,
2,
0,
7,
2,
7,
11,
0,
9,
7,
6,
7,
10,
9,
10,
7,
-1,
1,
8,
0,
1,
7,
8,
1,
10,
7,
6,
7,
10,
2,
3,
11,
-1,
11,
2,
1,
11,
1,
7,
10,
6,
1,
6,
7,
1,
-1,
-1,
-1,
-1,
8,
9,
6,
8,
6,
7,
9,
1,
6,
11,
6,
3,
1,
3,
6,
-1,
0,
9,
1,
11,
6,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
7,
8,
0,
7,
0,
6,
3,
11,
0,
11,
6,
0,
-1,
-1,
-1,
-1,
7,
11,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
7,
6,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
0,
8,
11,
7,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
1,
9,
11,
7,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
8,
1,
9,
8,
3,
1,
11,
7,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
10,
1,
2,
6,
11,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
2,
10,
3,
0,
8,
6,
11,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
2,
9,
0,
2,
10,
9,
6,
11,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
6,
11,
7,
2,
10,
3,
10,
8,
3,
10,
9,
8,
-1,
-1,
-1,
-1,
7,
2,
3,
6,
2,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
7,
0,
8,
7,
6,
0,
6,
2,
0,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
2,
7,
6,
2,
3,
7,
0,
1,
9,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
6,
2,
1,
8,
6,
1,
9,
8,
8,
7,
6,
-1,
-1,
-1,
-1,
10,
7,
6,
10,
1,
7,
1,
3,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
10,
7,
6,
1,
7,
10,
1,
8,
7,
1,
0,
8,
-1,
-1,
-1,
-1,
0,
3,
7,
0,
7,
10,
0,
10,
9,
6,
10,
7,
-1,
-1,
-1,
-1,
7,
6,
10,
7,
10,
8,
8,
10,
9,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
6,
8,
4,
11,
8,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
6,
11,
3,
0,
6,
0,
4,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
8,
6,
11,
8,
4,
6,
9,
0,
1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
4,
6,
9,
6,
3,
9,
3,
1,
11,
3,
6,
-1,
-1,
-1,
-1,
6,
8,
4,
6,
11,
8,
2,
10,
1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
2,
10,
3,
0,
11,
0,
6,
11,
0,
4,
6,
-1,
-1,
-1,
-1,
4,
11,
8,
4,
6,
11,
0,
2,
9,
2,
10,
9,
-1,
-1,
-1,
-1,
10,
9,
3,
10,
3,
2,
9,
4,
3,
11,
3,
6,
4,
6,
3,
-1,
8,
2,
3,
8,
4,
2,
4,
6,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
4,
2,
4,
6,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
9,
0,
2,
3,
4,
2,
4,
6,
4,
3,
8,
-1,
-1,
-1,
-1,
1,
9,
4,
1,
4,
2,
2,
4,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
8,
1,
3,
8,
6,
1,
8,
4,
6,
6,
10,
1,
-1,
-1,
-1,
-1,
10,
1,
0,
10,
0,
6,
6,
0,
4,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
6,
3,
4,
3,
8,
6,
10,
3,
0,
3,
9,
10,
9,
3,
-1,
10,
9,
4,
6,
10,
4,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
9,
5,
7,
6,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
8,
3,
4,
9,
5,
11,
7,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
5,
0,
1,
5,
4,
0,
7,
6,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
11,
7,
6,
8,
3,
4,
3,
5,
4,
3,
1,
5,
-1,
-1,
-1,
-1,
9,
5,
4,
10,
1,
2,
7,
6,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
6,
11,
7,
1,
2,
10,
0,
8,
3,
4,
9,
5,
-1,
-1,
-1,
-1,
7,
6,
11,
5,
4,
10,
4,
2,
10,
4,
0,
2,
-1,
-1,
-1,
-1,
3,
4,
8,
3,
5,
4,
3,
2,
5,
10,
5,
2,
11,
7,
6,
-1,
7,
2,
3,
7,
6,
2,
5,
4,
9,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
5,
4,
0,
8,
6,
0,
6,
2,
6,
8,
7,
-1,
-1,
-1,
-1,
3,
6,
2,
3,
7,
6,
1,
5,
0,
5,
4,
0,
-1,
-1,
-1,
-1,
6,
2,
8,
6,
8,
7,
2,
1,
8,
4,
8,
5,
1,
5,
8,
-1,
9,
5,
4,
10,
1,
6,
1,
7,
6,
1,
3,
7,
-1,
-1,
-1,
-1,
1,
6,
10,
1,
7,
6,
1,
0,
7,
8,
7,
0,
9,
5,
4,
-1,
4,
0,
10,
4,
10,
5,
0,
3,
10,
6,
10,
7,
3,
7,
10,
-1,
7,
6,
10,
7,
10,
8,
5,
4,
10,
4,
8,
10,
-1,
-1,
-1,
-1,
6,
9,
5,
6,
11,
9,
11,
8,
9,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
6,
11,
0,
6,
3,
0,
5,
6,
0,
9,
5,
-1,
-1,
-1,
-1,
0,
11,
8,
0,
5,
11,
0,
1,
5,
5,
6,
11,
-1,
-1,
-1,
-1,
6,
11,
3,
6,
3,
5,
5,
3,
1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
2,
10,
9,
5,
11,
9,
11,
8,
11,
5,
6,
-1,
-1,
-1,
-1,
0,
11,
3,
0,
6,
11,
0,
9,
6,
5,
6,
9,
1,
2,
10,
-1,
11,
8,
5,
11,
5,
6,
8,
0,
5,
10,
5,
2,
0,
2,
5,
-1,
6,
11,
3,
6,
3,
5,
2,
10,
3,
10,
5,
3,
-1,
-1,
-1,
-1,
5,
8,
9,
5,
2,
8,
5,
6,
2,
3,
8,
2,
-1,
-1,
-1,
-1,
9,
5,
6,
9,
6,
0,
0,
6,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
5,
8,
1,
8,
0,
5,
6,
8,
3,
8,
2,
6,
2,
8,
-1,
1,
5,
6,
2,
1,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
3,
6,
1,
6,
10,
3,
8,
6,
5,
6,
9,
8,
9,
6,
-1,
10,
1,
0,
10,
0,
6,
9,
5,
0,
5,
6,
0,
-1,
-1,
-1,
-1,
0,
3,
8,
5,
6,
10,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
10,
5,
6,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
11,
5,
10,
7,
5,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
11,
5,
10,
11,
7,
5,
8,
3,
0,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
5,
11,
7,
5,
10,
11,
1,
9,
0,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
10,
7,
5,
10,
11,
7,
9,
8,
1,
8,
3,
1,
-1,
-1,
-1,
-1,
11,
1,
2,
11,
7,
1,
7,
5,
1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
8,
3,
1,
2,
7,
1,
7,
5,
7,
2,
11,
-1,
-1,
-1,
-1,
9,
7,
5,
9,
2,
7,
9,
0,
2,
2,
11,
7,
-1,
-1,
-1,
-1,
7,
5,
2,
7,
2,
11,
5,
9,
2,
3,
2,
8,
9,
8,
2,
-1,
2,
5,
10,
2,
3,
5,
3,
7,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
8,
2,
0,
8,
5,
2,
8,
7,
5,
10,
2,
5,
-1,
-1,
-1,
-1,
9,
0,
1,
5,
10,
3,
5,
3,
7,
3,
10,
2,
-1,
-1,
-1,
-1,
9,
8,
2,
9,
2,
1,
8,
7,
2,
10,
2,
5,
7,
5,
2,
-1,
1,
3,
5,
3,
7,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
8,
7,
0,
7,
1,
1,
7,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
0,
3,
9,
3,
5,
5,
3,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
8,
7,
5,
9,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
5,
8,
4,
5,
10,
8,
10,
11,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
5,
0,
4,
5,
11,
0,
5,
10,
11,
11,
3,
0,
-1,
-1,
-1,
-1,
0,
1,
9,
8,
4,
10,
8,
10,
11,
10,
4,
5,
-1,
-1,
-1,
-1,
10,
11,
4,
10,
4,
5,
11,
3,
4,
9,
4,
1,
3,
1,
4,
-1,
2,
5,
1,
2,
8,
5,
2,
11,
8,
4,
5,
8,
-1,
-1,
-1,
-1,
0,
4,
11,
0,
11,
3,
4,
5,
11,
2,
11,
1,
5,
1,
11,
-1,
0,
2,
5,
0,
5,
9,
2,
11,
5,
4,
5,
8,
11,
8,
5,
-1,
9,
4,
5,
2,
11,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
2,
5,
10,
3,
5,
2,
3,
4,
5,
3,
8,
4,
-1,
-1,
-1,
-1,
5,
10,
2,
5,
2,
4,
4,
2,
0,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
10,
2,
3,
5,
10,
3,
8,
5,
4,
5,
8,
0,
1,
9,
-1,
5,
10,
2,
5,
2,
4,
1,
9,
2,
9,
4,
2,
-1,
-1,
-1,
-1,
8,
4,
5,
8,
5,
3,
3,
5,
1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
4,
5,
1,
0,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
8,
4,
5,
8,
5,
3,
9,
0,
5,
0,
3,
5,
-1,
-1,
-1,
-1,
9,
4,
5,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
11,
7,
4,
9,
11,
9,
10,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
8,
3,
4,
9,
7,
9,
11,
7,
9,
10,
11,
-1,
-1,
-1,
-1,
1,
10,
11,
1,
11,
4,
1,
4,
0,
7,
4,
11,
-1,
-1,
-1,
-1,
3,
1,
4,
3,
4,
8,
1,
10,
4,
7,
4,
11,
10,
11,
4,
-1,
4,
11,
7,
9,
11,
4,
9,
2,
11,
9,
1,
2,
-1,
-1,
-1,
-1,
9,
7,
4,
9,
11,
7,
9,
1,
11,
2,
11,
1,
0,
8,
3,
-1,
11,
7,
4,
11,
4,
2,
2,
4,
0,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
11,
7,
4,
11,
4,
2,
8,
3,
4,
3,
2,
4,
-1,
-1,
-1,
-1,
2,
9,
10,
2,
7,
9,
2,
3,
7,
7,
4,
9,
-1,
-1,
-1,
-1,
9,
10,
7,
9,
7,
4,
10,
2,
7,
8,
7,
0,
2,
0,
7,
-1,
3,
7,
10,
3,
10,
2,
7,
4,
10,
1,
10,
0,
4,
0,
10,
-1,
1,
10,
2,
8,
7,
4,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
9,
1,
4,
1,
7,
7,
1,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
9,
1,
4,
1,
7,
0,
8,
1,
8,
7,
1,
-1,
-1,
-1,
-1,
4,
0,
3,
7,
4,
3,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
4,
8,
7,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
10,
8,
10,
11,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
0,
9,
3,
9,
11,
11,
9,
10,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
1,
10,
0,
10,
8,
8,
10,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
1,
10,
11,
3,
10,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
2,
11,
1,
11,
9,
9,
11,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
0,
9,
3,
9,
11,
1,
2,
9,
2,
11,
9,
-1,
-1,
-1,
-1,
0,
2,
11,
8,
0,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
3,
2,
11,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
2,
3,
8,
2,
8,
10,
10,
8,
9,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
9,
10,
2,
0,
9,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
2,
3,
8,
2,
8,
10,
0,
1,
8,
1,
10,
8,
-1,
-1,
-1,
-1,
1,
10,
2,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
1,
3,
8,
9,
1,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
9,
1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
0,
3,
8,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1
]);
export {
MarchingCubes,
edgeTable,
triTable
};
//# sourceMappingURL=MarchingCubes.js.map