Last active
June 2, 2025 13:06
-
-
Save LukasFratzl/988f1c9736b43684deb319880ac6c6fc to your computer and use it in GitHub Desktop.
Marching Cubes in Unity with Burst and C# Jobs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| LICENCE -> MIT License | |
| AUTHOR -> Lukas Fratzl | |
| GIT -> https://github.com/LukasFratzl | |
| DESCRIPTION -> My implementation of "Marching Cubes" in Unity with Burst and Multithreaded with c# Jobs | |
| the algorithm is smart enough to generate every "Grid Size" with every wanted "Resolution" | |
| as extra with a "Smooth" or "Flat" normal generation | |
| USAGE -> Assign all field and allocate the Native Containers, Schedule the Job and Complete it | |
| -> SEE EXAMPLE JOB DOWN BELOW! | |
| GENERATE SPEED -> RESOLUTION 32 -> 26.9 ms | 27 024 Vertices | 1 CHUNK | |
| RESOLUTION 16 -> 4.3 ms | 6 630 Vertices | 1 CHUNK | |
| RESOLUTION 8 -> 0.8 ms | 1 656 Vertices | 1 CHUNK | |
| ( ALL TESTED IN THE EDITOR WITH BURST AND WITHOUT IL2CPP ) | |
| BEST PRACTICE -> Usually to create a more detailed shape, use a Tessellation Shader, otherwise the Mesh | |
| apply time is too high for a large view range, usually around 6 - 16 RESOLUTION is fine | |
| -> To speed up the generation speed of the finished mesh you can build a Mesh with the job system, | |
| See Here -> https://gist.github.com/LukasFratzl/b479a74087e17d729e8319edd4808757 | |
| EXAMPLE JOB -> // FIRST SCHEDULE THE MARCHING CUBES JOB | |
| MarchingCubesJob job = new MarchingCubesJob(); | |
| job._resolution = 16; | |
| job._isoLevel = 0.5f; | |
| job._noiseScale = 0.2f; | |
| job._useAbsolutePosition = 0; | |
| job._useSmoothNormals = (byte)(_smoothNormals ? 1 : 0); | |
| job._gridPosition = new float3(32f, 16f, 0f); | |
| job._gridSize = new float3(16f, 16f, 16f); | |
| job._vertexData = new NativeList<MarchingCubesJob.VertexData>(Allocator.Persistent); | |
| job._indices = new NativeList<ushort>(Allocator.Persistent); | |
| JobHandle _handle = job.Schedule(); | |
| // COMPLETE IT | |
| _handle.Complete(); | |
| // THE VERTEX DATA AND INDECES DATA WORKS WITH THE NEW MESH APPLY JOB SEE -> https://gist.github.com/LukasFratzl/b479a74087e17d729e8319edd4808757 | |
| */ | |
| using System.Runtime.CompilerServices; | |
| using Unity.Burst; | |
| using Unity.Collections; | |
| using Unity.Jobs; | |
| using Unity.Mathematics; | |
| using UnityEngine; | |
| namespace flow____.Terrain | |
| { | |
| [BurstCompile(OptimizeFor = OptimizeFor.Performance)] | |
| public struct MarchingCubesJob : IJob | |
| { | |
| public struct VertexData | |
| { | |
| public float3 Position; | |
| public float3 Normal; | |
| public Color Color; | |
| public float4 UV1; | |
| } | |
| // FIELDS TO ASSIGN or ALLOCATE -> START | |
| [ReadOnly] public float _isoLevel; // DEFAULT 0.5f ( Depending on your Density values, usually 0 - 1 ) | |
| [ReadOnly] public float _noiseScale; // DEFAULT 0.2f | |
| [ReadOnly] public int _resolution; // DEFAULT 16 | |
| [ReadOnly] public float3 _gridPosition; // DEFAULT 0.0.0 ( Increment by _gridSize ) | |
| [ReadOnly] public float3 _gridSize; // DEFAULT 16 | |
| [ReadOnly] public byte _useAbsolutePosition; // DEFAULT 0 ( 0 = off | 1 = on ) | |
| [ReadOnly] public byte _useSmoothNormals; // DEFAULT 0 ( 0 = off | 1 = on ) | |
| // NATIVE CONTAINERS -> START | |
| [WriteOnly] public NativeList<VertexData> _vertexData; // ALLOCATE WITH LENGTH OF 0 | |
| [WriteOnly] public NativeList<ushort> _indices; // ALLOCATE WITH LENGTH OF 0 | |
| // NATIVE CONTAINERS -> END | |
| // FIELDS TO ASSIGN or ALLOCATE -> END | |
| public void Execute() | |
| { | |
| int _meshVertsCapacity = verticesBufferSizeResolution[_resolution]; | |
| _vertexData.Capacity = _meshVertsCapacity; | |
| _indices.Capacity = _meshVertsCapacity; | |
| NativeArray<float3> edgeVertex = new NativeArray<float3>(12, Allocator.Temp); | |
| NativeArray<float4> vertexData = new NativeArray<float4>(8, Allocator.Temp); | |
| float3 resolutionScaled = _gridSize / (float)_resolution; | |
| NativeArray<float3> VertexOffsetScaled = new NativeArray<float3>(8, Allocator.Temp); | |
| for (int i = 0; i < 8; i++) VertexOffsetScaled[i] = VertexOffset[i] * resolutionScaled; | |
| NativeHashMap<float3, float3> _normalsUnifyLookUp = new NativeHashMap<float3, float3>((int)(_meshVertsCapacity * 0.5f), Allocator.Temp); | |
| float3 _gridPositionNoise = _gridPosition; | |
| if (_useAbsolutePosition == 0) // MEANS THE MESH RENDERER TRANSFORMS THE ORIGIN OF THE MESH | |
| _gridPosition = float3.zero; | |
| int realVertexCount = 0; | |
| int resPlus1 = _resolution + 1; | |
| for (int x = 0; x <= resPlus1; x++) | |
| { | |
| float xDelta = _gridSize.x * (float)(x - 1) / (float)_resolution; | |
| float xLength = _gridPosition.x + xDelta; | |
| float xLengthNoise = _gridPositionNoise.x + xDelta; | |
| for (int y = 0; y <= resPlus1; y++) | |
| { | |
| float yDelta = _gridSize.y * (float)(y - 1) / (float)_resolution; | |
| float yLength = _gridPosition.y + yDelta; | |
| float yLengthNoise = _gridPositionNoise.y + yDelta; | |
| for (int z = 0; z <= resPlus1; z++) | |
| { | |
| float zDelta = _gridSize.z * (float)(z - 1) / (float)_resolution; | |
| float zLength = _gridPosition.z + zDelta; | |
| float zLengthNoise = _gridPositionNoise.z + zDelta; | |
| float3 posNoise = new float3(xLengthNoise, yLengthNoise, zLengthNoise); | |
| float3 posVertex = new float3(xLength, yLength, zLength); | |
| int cubeIndex = 0; | |
| // Find vertices inside the surface | |
| for (int i = 0; i < 8; i++) | |
| { | |
| float3 o = VertexOffsetScaled[i]; | |
| float cube = noise.cnoise((posNoise + o) * _noiseScale); // GET THE DENSITY VALUE HERE, FOR NOW IT'S JUST SIMPLE NOISE | |
| switch (cube > _isoLevel) | |
| { | |
| case true: | |
| cubeIndex |= cubeBits[i]; | |
| break; | |
| case false: | |
| break; | |
| } | |
| vertexData[i] = new float4(posVertex + o, cube); | |
| } | |
| // Cube is entirely in/out of the surface | |
| switch (cubeIndex) | |
| { | |
| case 0: | |
| continue; | |
| case 255: | |
| continue; | |
| default: | |
| break; | |
| } | |
| // Find edges intersected by surface | |
| uint edgeFlags = EdgeTable[cubeIndex]; | |
| // No intersection if cube is completely outside surface or completely inside surface | |
| switch (edgeFlags) | |
| { | |
| case 0: | |
| continue; | |
| case 15: | |
| continue; | |
| default: | |
| break; | |
| } | |
| // Find intersection point with surface for each edge | |
| for (int i = 0; i < 12; i++) | |
| { | |
| // When intersection for this edge exists | |
| switch (edgeFlags & cubeBits[i]) | |
| { | |
| case 0: | |
| continue; | |
| default: | |
| edgeVertex[i] = VertexInterp(_isoLevel, vertexData[EdgeConnectionX[i]], vertexData[EdgeConnectionY[i]]); | |
| break; | |
| } | |
| } | |
| byte _isOutsideBounds = (x == 0 || y == 0 || z == 0 || x == resPlus1 || y == resPlus1 || z == resPlus1) ? (byte)1 : (byte)0; | |
| int cubeIndex1D = cubeIndex * 16; | |
| // Store found triangles. Up to five per cube possible | |
| for (int i = 0; i < 5; i++) | |
| { | |
| int to1D = cubeIndex1D + 3 * i; | |
| // Stop when triangle list terminates with -1 | |
| if (TriTable[to1D] < 0) | |
| { | |
| break; | |
| } | |
| float3x3 vertex3 = new float3x3(edgeVertex[TriTable[to1D]], edgeVertex[TriTable[to1D + 1]], edgeVertex[TriTable[to1D + 2]]); | |
| float3 normalFlat = math.normalize(math.cross(vertex3[1] - vertex3[2], vertex3[0] - vertex3[2])); | |
| int idxInsideBounds = realVertexCount; | |
| for (int j = 0; j < 3; j++) | |
| { | |
| float3 vertex = vertex3[j]; | |
| float3 vertexHash = math.floor(vertex * 1000f + 0.5f) * 0.001f; // ROUNDS THE FLOAT3 TO THE 3rd DECIMAL PLACE, OTHERWISE IT'S NOT USABLE AS A KEY | |
| switch (_useSmoothNormals) | |
| { | |
| case 1: | |
| switch (_normalsUnifyLookUp.ContainsKey(vertexHash)) | |
| { | |
| case true: | |
| break; | |
| case false: | |
| _normalsUnifyLookUp.Add(vertexHash, normalFlat); | |
| break; | |
| } | |
| break; | |
| case 0: | |
| break; | |
| } | |
| switch (_isOutsideBounds) | |
| { | |
| case 0: | |
| VertexData _data = new VertexData(); | |
| _data.Position = vertex; | |
| _indices.Add((ushort)(idxInsideBounds + WindingOrder[j])); | |
| switch (_useSmoothNormals) | |
| { | |
| case 1: | |
| _data.Normal = _normalsUnifyLookUp[vertexHash]; | |
| break; | |
| case 0: | |
| _data.Normal = normalFlat; | |
| break; | |
| } | |
| _data.Color = new Color(1f, 0f, 0, 0f); | |
| _data.UV1 = float4.zero; | |
| _vertexData.Add(_data); | |
| realVertexCount++; | |
| break; | |
| case 1: | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| edgeVertex.Dispose(); | |
| VertexOffsetScaled.Dispose(); | |
| vertexData.Dispose(); | |
| _normalsUnifyLookUp.Dispose(); | |
| } | |
| [MethodImpl(MethodImplOptions.AggressiveInlining)] | |
| float3 VertexInterp(float _isolevel, float4 _d1, float4 _d2) | |
| { | |
| switch (math.abs(_isolevel - _d1.w) < 0.00001f) | |
| { | |
| case true: | |
| return _d1.xyz; | |
| case false: | |
| break; | |
| } | |
| switch (math.abs(_isolevel - _d2.w) < 0.00001f) | |
| { | |
| case true: | |
| return _d2.xyz; | |
| case false: | |
| break; | |
| } | |
| return _d1.xyz + ((_isoLevel - _d1.w) / (_d2.w - _d1.w)) * (_d2.xyz - _d1.xyz); | |
| } | |
| static readonly int[] verticesBufferSizeResolution = { | |
| 10, // 0 | |
| 10, // 1 | |
| 10, // 2 | |
| 150, // 3 | |
| 330, // 4 | |
| 600, // 5 | |
| 828, // 6 | |
| 1128, // 7 | |
| 1656, // 8 | |
| 2148, // 9 | |
| 2646, // 10 | |
| 3210, // 11 | |
| 3660, // 12 | |
| 4446, // 13 | |
| 5130, // 14 | |
| 5934, // 15 | |
| 6630, // 16 | |
| 7764, // 17 | |
| 8556, // 18 | |
| 9402, // 19 | |
| 10722, // 20 | |
| 11544, // 21 | |
| 12744, // 22 | |
| 13842, // 23 | |
| 15162, // 24 | |
| 16350, // 25 | |
| 17868, // 26 | |
| 19104, // 27 | |
| 20664, // 28 | |
| 22170, // 29 | |
| 23748, // 30 | |
| 25332, // 31 | |
| 27024, // 32 | |
| 28674, // 33 | |
| 30744, // 34 | |
| 32340, // 35 | |
| 34152, // 36 | |
| 36024, // 37 | |
| 38232, // 38 | |
| 39996, // 39 | |
| 42444, // 40 | |
| 44538, // 41 | |
| 46482, // 42 | |
| 48828, // 43 | |
| 50994, // 44 | |
| 53472, // 45 | |
| 55628, // 46 | |
| 58524, // 47 | |
| 60840, // 48 | |
| 63472, // 49 | |
| 66144 // 50 | |
| }; | |
| static readonly int[] cubeBits = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 }; | |
| static readonly ushort[] EdgeTable = | |
| { | |
| 0x0, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, | |
| 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, | |
| 0x190, 0x99, 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, | |
| 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, | |
| 0x230, 0x339, 0x33, 0x13a, 0x636, 0x73f, 0x435, 0x53c, | |
| 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, | |
| 0x3a0, 0x2a9, 0x1a3, 0xaa, 0x7a6, 0x6af, 0x5a5, 0x4ac, | |
| 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, | |
| 0x460, 0x569, 0x663, 0x76a, 0x66, 0x16f, 0x265, 0x36c, | |
| 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, | |
| 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff, 0x3f5, 0x2fc, | |
| 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0, | |
| 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55, 0x15c, | |
| 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, | |
| 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc, | |
| 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, | |
| 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, | |
| 0xcc, 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, | |
| 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, | |
| 0x15c, 0x55, 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, | |
| 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, | |
| 0x2fc, 0x3f5, 0xff, 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, | |
| 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, | |
| 0x36c, 0x265, 0x16f, 0x66, 0x76a, 0x663, 0x569, 0x460, | |
| 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, | |
| 0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa, 0x1a3, 0x2a9, 0x3a0, | |
| 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, | |
| 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33, 0x339, 0x230, | |
| 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, | |
| 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99, 0x190, | |
| 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, | |
| 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0 | |
| }; | |
| static readonly int[] EdgeConnectionX = { 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3 }; | |
| static readonly int[] EdgeConnectionY = { 1, 2, 3, 0, 5, 6, 7, 4, 4, 5, 6, 7 }; | |
| static readonly float3[] VertexOffset = | |
| { | |
| new float3(0, 0, 0), | |
| new float3(1, 0, 0), | |
| new float3(1, 1, 0), | |
| new float3(0, 1, 0), | |
| new float3(0, 0, 1), | |
| new float3(1, 0, 1), | |
| new float3(1, 1, 1), | |
| new float3(0, 1, 1) | |
| }; | |
| static readonly int[] WindingOrder = { 2, 1, 0 }; | |
| static readonly int[] TriTable = | |
| { | |
| -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 | |
| }; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment