diff --git a/packages/base/file-formats/file-shell-isolated.gts b/packages/base/file-formats/file-shell-isolated.gts index 6ae2bf8a5d0..c7d6ca4306b 100644 --- a/packages/base/file-formats/file-shell-isolated.gts +++ b/packages/base/file-formats/file-shell-isolated.gts @@ -281,7 +281,7 @@ export class FileIsolatedShell extends GlimmerComponent
Triangles
{{@model.triangles}}
{{/if}} + {{#if @model.vertices}} +
Vertices
{{@model.vertices}}
+ {{/if}} + {{#if @model.dimensions}} +
Size
{{@model.dimensions}}
+ {{/if}} {{#if @model.unit}}
Units
{{@model.unit}}
{{/if}} + {{#if @model.nodes}} +
Nodes
{{@model.nodes}}
+ {{/if}} + {{#if @model.animations}} +
Animations
{{@model.animations}}
+ {{/if}} + {{#if @model.textures}} +
Textures
{{@model.textures}}
+ {{/if}} {{#if @model.materialNames.length}}
Materials
{{this.materialList}}
diff --git a/packages/base/gltf-meta-extractor.ts b/packages/base/gltf-meta-extractor.ts new file mode 100644 index 00000000000..2c1848bdd9c --- /dev/null +++ b/packages/base/gltf-meta-extractor.ts @@ -0,0 +1,212 @@ +// Structure sniffer for the glTF family — both the JSON `.gltf` form and the +// binary `.glb` container, which wraps the same glTF JSON in a length-prefixed +// chunk. Unlike STL, a glTF describes itself: the JSON carries an accessor per +// vertex attribute whose `count` is the vertex total and whose `min`/`max` are +// the axis-aligned bounds, so the vertex/triangle counts and bounding box the +// spec asks for come straight from the header rather than from a geometry scan. +// The heavy buffers (a `.glb` BIN chunk, a `.gltf`'s external or base64 buffers) +// are never touched. Pure JS (DataView/TextDecoder/JSON), kept in a plain `.ts` +// module so it is directly unit-testable — mirroring `stl-meta-extractor.ts`. +// Returns `undefined` for anything that isn't glTF; the calling FileDef turns +// that into a `FileContentMismatchError` so the extractor falls back to the base +// FileDef. + +export interface GltfMetadata { + // Which form the bytes took: the binary `.glb` container or raw `.gltf` JSON. + container: 'glb' | 'gltf'; + // `asset.version` — "2.0" for every modern glTF. + gltfVersion?: string; + // `asset.generator` — the exporting tool, when it named itself. + generator?: string; + meshCount?: number; + materialCount?: number; + nodeCount?: number; + animationCount?: number; + textureCount?: number; + // Summed across every mesh primitive's POSITION accessor. + vertexCount?: number; + // Summed across primitives, honoring each one's topology mode. + triangleCount?: number; + // The model-space bounding box, "X × Y × Z", derived from the union of the + // POSITION accessors' min/max. glTF distances are nominally meters, but files + // routinely ignore that, so it is presented unitless. + dimensions?: string; +} + +// 'glTF' and 'JSON' as little-endian uint32s — the GLB magic and its first +// chunk's type tag. +const GLB_MAGIC = 0x46546c67; +const GLB_JSON_CHUNK = 0x4e4f534a; + +// glTF primitive topology modes. Only the triangle families contribute faces; +// points and lines contribute none. +const MODE_TRIANGLES = 4; +const MODE_TRIANGLE_STRIP = 5; +const MODE_TRIANGLE_FAN = 6; + +// Read the JSON chunk out of a GLB container without touching the BIN chunk that +// follows it, so a large binary model is described from its header alone. +function readGlbJson(buf: ArrayBuffer): unknown { + if (buf.byteLength < 20) { + return undefined; + } + let view = new DataView(buf); + // Only glTF 2.0 defines the chunked binary container read here. + if (view.getUint32(4, true) !== 2) { + return undefined; + } + let chunkLength = view.getUint32(12, true); + let chunkType = view.getUint32(16, true); + // The spec requires the JSON chunk to come first. + if (chunkType !== GLB_JSON_CHUNK || 20 + chunkLength > buf.byteLength) { + return undefined; + } + try { + return JSON.parse( + new TextDecoder().decode(new Uint8Array(buf, 20, chunkLength)), + ); + } catch { + return undefined; + } +} + +function decodeGltfJson(bytes: Uint8Array): unknown { + try { + return JSON.parse(new TextDecoder().decode(bytes)); + } catch { + return undefined; + } +} + +function round(n: number): number { + return Math.round(n * 100) / 100; +} + +// Fold a mesh primitive's element count into a triangle total per its topology. +function trianglesFor(mode: number, elementCount: number): number { + if (mode === MODE_TRIANGLES) { + return Math.floor(elementCount / 3); + } + if (mode === MODE_TRIANGLE_STRIP || mode === MODE_TRIANGLE_FAN) { + return Math.max(0, elementCount - 2); + } + return 0; +} + +// Turn a parsed glTF document into the metadata we surface. Kept separate from +// the container decoding so both forms share exactly one analysis. +function analyzeGltf( + doc: any, + container: 'glb' | 'gltf', +): GltfMetadata | undefined { + // Every glTF asset carries an `asset` object with a version; its absence is + // the cheapest reliable "this isn't glTF" signal. + if (!doc || typeof doc !== 'object' || !doc.asset) { + return undefined; + } + let accessors: any[] = Array.isArray(doc.accessors) ? doc.accessors : []; + let meshes: any[] = Array.isArray(doc.meshes) ? doc.meshes : []; + + let vertexCount = 0; + let triangleCount = 0; + let min = [Infinity, Infinity, Infinity]; + let max = [-Infinity, -Infinity, -Infinity]; + let haveBounds = false; + + for (let mesh of meshes) { + let primitives: any[] = Array.isArray(mesh?.primitives) + ? mesh.primitives + : []; + for (let primitive of primitives) { + let positionIndex = primitive?.attributes?.POSITION; + let position = + typeof positionIndex === 'number' + ? accessors[positionIndex] + : undefined; + let positionCount = Number(position?.count) || 0; + vertexCount += positionCount; + + if ( + Array.isArray(position?.min) && + Array.isArray(position?.max) && + position.min.length >= 3 && + position.max.length >= 3 + ) { + for (let axis = 0; axis < 3; axis++) { + min[axis] = Math.min(min[axis]!, Number(position.min[axis])); + max[axis] = Math.max(max[axis]!, Number(position.max[axis])); + } + haveBounds = true; + } + + // Indexed geometry counts its index accessor; a non-indexed primitive + // draws its POSITION vertices directly. + let mode = + typeof primitive?.mode === 'number' ? primitive.mode : MODE_TRIANGLES; + let indexAccessor = + typeof primitive?.indices === 'number' + ? accessors[primitive.indices] + : undefined; + let elementCount = indexAccessor + ? Number(indexAccessor.count) || 0 + : positionCount; + triangleCount += trianglesFor(mode, elementCount); + } + } + + let metadata: GltfMetadata = { container }; + let version = doc.asset?.version; + if (typeof version === 'string' && version) { + metadata.gltfVersion = version; + } + let generator = doc.asset?.generator; + if (typeof generator === 'string' && generator) { + metadata.generator = generator; + } + if (meshes.length) { + metadata.meshCount = meshes.length; + } + if (Array.isArray(doc.materials) && doc.materials.length) { + metadata.materialCount = doc.materials.length; + } + if (Array.isArray(doc.nodes) && doc.nodes.length) { + metadata.nodeCount = doc.nodes.length; + } + if (Array.isArray(doc.animations) && doc.animations.length) { + metadata.animationCount = doc.animations.length; + } + if (Array.isArray(doc.textures) && doc.textures.length) { + metadata.textureCount = doc.textures.length; + } + if (vertexCount > 0) { + metadata.vertexCount = vertexCount; + } + if (triangleCount > 0) { + metadata.triangleCount = triangleCount; + } + if (haveBounds) { + metadata.dimensions = `${round(max[0]! - min[0]!)} × ${round( + max[1]! - min[1]!, + )} × ${round(max[2]! - min[2]!)}`; + } + return metadata; +} + +export function parseGltf( + buf: ArrayBuffer, +): { gltfMetadata: GltfMetadata } | undefined { + let container: 'glb' | 'gltf'; + let doc: unknown; + if ( + buf.byteLength >= 12 && + new DataView(buf).getUint32(0, true) === GLB_MAGIC + ) { + container = 'glb'; + doc = readGlbJson(buf); + } else { + container = 'gltf'; + doc = decodeGltfJson(new Uint8Array(buf)); + } + let metadata = analyzeGltf(doc, container); + return metadata ? { gltfMetadata: metadata } : undefined; +} diff --git a/packages/base/gltf-model-def.gts b/packages/base/gltf-model-def.gts new file mode 100644 index 00000000000..de648b67c0e --- /dev/null +++ b/packages/base/gltf-model-def.gts @@ -0,0 +1,152 @@ +import File3dIcon from '@cardstack/boxel-icons/file-3d'; +import { byteStreamToUint8Array } from '@cardstack/runtime-common'; +import { DEFAULT_FILE_SIZE_LIMIT_BYTES } from '@cardstack/runtime-common/constants'; +import { + FileContentMismatchError, + type ByteStream, + type SerializedFile, +} from './file-api'; +import { + ThreeDModelDef, + getExtension, + model3dAttributes, + type SerializedModel3d, +} from './three-d-model-def'; +import { parseGltf, type GltfMetadata } from './gltf-meta-extractor'; + +// Project the glTF header read onto the shared `model3d` field. A `.glb` is the +// same glTF document in a binary wrapper, so both leaves share this mapping and +// differ only in the container label. Unlike STL/3MF, a glTF header enumerates +// its scene graph directly, so vertex/dimension facts sit cheaply in the JSON +// chunk and are honest header-only answers. +function gltfToModel3d(g: GltfMetadata): SerializedModel3d { + let containerLabel = g.container === 'glb' ? 'Binary glTF' : 'glTF JSON'; + return { + format: g.gltfVersion + ? `${containerLabel} ${g.gltfVersion}` + : containerLabel, + meshes: g.meshCount, + triangles: g.triangleCount, + vertices: g.vertexCount, + materials: g.materialCount, + nodes: g.nodeCount, + animations: g.animationCount, + textures: g.textureCount, + dimensions: g.dimensions, + generator: g.generator, + }; +} + +// A shared extract step for both leaves: the container form is auto-detected by +// `parseGltf`, so the only per-format difference is which extension is +// accepted and how a parse failure is described. +async function extractGltfAttributes( + expectedExtension: '.gltf' | '.glb', + containerLabel: string, + url: string, + getStream: () => Promise, + options: { + contentHash?: string; + contentSize?: number; + fileSizeLimitBytes?: number; + }, +): Promise>> { + let extension = getExtension(url); + if (extension !== expectedExtension) { + throw new FileContentMismatchError( + `Expected ${expectedExtension} file extension, got "${extension || 'none'}"`, + ); + } + + let bytesPromise: Promise | undefined; + let memoizedStream = async () => { + bytesPromise ??= byteStreamToUint8Array(await getStream()); + return bytesPromise; + }; + + let base = await ThreeDModelDef.extractAttributes( + url, + memoizedStream, + options, + ); + let bytes = await memoizedStream(); + // Over the size cap, skip the sniff but keep the model type — the file still + // renders via the live client-side viewer (which parses its own geometry); + // it just has an empty inspector panel and the cube placeholder. Do NOT + // throw FileContentMismatchError here: that would demote the file to a plain + // FileDef and lose the 3D card entirely. + let sizeCap = options.fileSizeLimitBytes ?? DEFAULT_FILE_SIZE_LIMIT_BYTES; + if (bytes.byteLength > sizeCap) { + console.warn( + `[GltfModelDef] skipping metadata extraction for ${url}: ${bytes.byteLength} bytes exceeds cap ${sizeCap}`, + ); + return { ...base }; + } + let parsed = parseGltf( + bytes.buffer.slice( + bytes.byteOffset, + bytes.byteOffset + bytes.byteLength, + ) as ArrayBuffer, + ); + if (!parsed) { + throw new FileContentMismatchError( + `File does not contain a parseable ${containerLabel}`, + ); + } + return { ...base, ...model3dAttributes(gltfToModel3d(parsed.gltfMetadata)) }; +} + +// The JSON form (`.gltf`). Its buffers and textures may be external or embedded +// as base64; the header read here needs neither. +export class GltfDef extends ThreeDModelDef { + static displayName = 'glTF Model'; + static icon = File3dIcon; + static acceptTypes = '.gltf,model/gltf+json'; + + static async extractAttributes( + url: string, + getStream: () => Promise, + options: { + contentHash?: string; + contentSize?: number; + fileSizeLimitBytes?: number; + } = {}, + ): Promise>> { + return extractGltfAttributes( + '.gltf', + 'glTF JSON document', + url, + getStream, + options, + ); + } +} + +// The binary form (`.glb`). The same glTF document wrapped in a chunked +// container; `parseGltf` reads only its JSON chunk, never the geometry that +// follows. +export class GlbDef extends ThreeDModelDef { + static displayName = 'glTF Binary Model'; + static icon = File3dIcon; + static acceptTypes = '.glb,model/gltf-binary'; + + static async extractAttributes( + url: string, + getStream: () => Promise, + options: { + contentHash?: string; + contentSize?: number; + fileSizeLimitBytes?: number; + } = {}, + ): Promise>> { + return extractGltfAttributes( + '.glb', + 'GLB container', + url, + getStream, + options, + ); + } +} + +export default GltfDef; diff --git a/packages/base/three-d-model-def.gts b/packages/base/three-d-model-def.gts index 9231912ad93..6d3f71dc192 100644 --- a/packages/base/three-d-model-def.gts +++ b/packages/base/three-d-model-def.gts @@ -31,9 +31,14 @@ export interface SerializedModel3d { format?: string; meshes?: number; triangles?: number; + vertices?: number; materials?: number; materialNames?: string[]; unit?: string; + nodes?: number; + animations?: number; + textures?: number; + dimensions?: string; generator?: string; solidName?: string; designer?: string; diff --git a/packages/experiments-realm/model-samples/stl-complex.stl b/packages/experiments-realm/model-samples/stl-complex.stl new file mode 100644 index 00000000000..f42fa805eb1 Binary files /dev/null and b/packages/experiments-realm/model-samples/stl-complex.stl differ diff --git a/packages/experiments-realm/model-samples/stl-moderate.stl b/packages/experiments-realm/model-samples/stl-moderate.stl new file mode 100644 index 00000000000..a7957d6380d Binary files /dev/null and b/packages/experiments-realm/model-samples/stl-moderate.stl differ diff --git a/packages/experiments-realm/model-samples/stl-simple.stl b/packages/experiments-realm/model-samples/stl-simple.stl new file mode 100644 index 00000000000..d815c2bba7c --- /dev/null +++ b/packages/experiments-realm/model-samples/stl-simple.stl @@ -0,0 +1,2018 @@ +solid DiskBase + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -2.506665e-002 1.984229e-001 -8.000000e-002 + vertex 0.000000e+000 5.000000e-001 -8.000000e-002 + vertex 2.506665e-002 1.984229e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 2.506665e-002 1.984229e-001 -8.000000e-002 + vertex 0.000000e+000 5.000000e-001 -8.000000e-002 + vertex 8.020564e-002 4.935251e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 2.506665e-002 1.984229e-001 -8.000000e-002 + vertex 8.020564e-002 4.935251e-001 -8.000000e-002 + vertex 7.362491e-002 1.859553e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.175570e-001 1.618034e-001 -8.000000e-002 + vertex -2.323616e-001 4.427280e-001 -8.000000e-002 + vertex -7.362491e-002 1.859553e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -7.362491e-002 1.859553e-001 -8.000000e-002 + vertex -2.323616e-001 4.427280e-001 -8.000000e-002 + vertex -1.583340e-001 4.742682e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -7.362491e-002 1.859553e-001 -8.000000e-002 + vertex -1.583340e-001 4.742682e-001 -8.000000e-002 + vertex -2.506665e-002 1.984229e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -2.506665e-002 1.984229e-001 -8.000000e-002 + vertex -1.583340e-001 4.742682e-001 -8.000000e-002 + vertex -8.020564e-002 4.935251e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -2.506665e-002 1.984229e-001 -8.000000e-002 + vertex -8.020564e-002 4.935251e-001 -8.000000e-002 + vertex 0.000000e+000 5.000000e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.688656e-001 -1.071654e-001 -8.000000e-002 + vertex 3.873025e-001 -3.162227e-001 -8.000000e-002 + vertex 1.369094e-001 -1.457937e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.369094e-001 -1.457937e-001 -8.000000e-002 + vertex 3.873025e-001 -3.162227e-001 -8.000000e-002 + vertex 3.315613e-001 -3.742554e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.369094e-001 -1.457937e-001 -8.000000e-002 + vertex 3.315613e-001 -3.742554e-001 -8.000000e-002 + vertex 9.635074e-002 -1.752613e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.996053e-001 -1.255810e-002 -8.000000e-002 + vertex 4.898953e-001 -1.000128e-001 -8.000000e-002 + vertex 1.902113e-001 -6.180340e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.902113e-001 -6.180340e-002 -8.000000e-002 + vertex 4.898953e-001 -1.000128e-001 -8.000000e-002 + vertex 4.675081e-001 -1.773024e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.902113e-001 -6.180340e-002 -8.000000e-002 + vertex 4.675081e-001 -1.773024e-001 -8.000000e-002 + vertex 1.688656e-001 -1.071654e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.688656e-001 -1.071654e-001 -8.000000e-002 + vertex 4.675081e-001 -1.773024e-001 -8.000000e-002 + vertex 4.330127e-001 -2.500000e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.688656e-001 -1.071654e-001 -8.000000e-002 + vertex 4.330127e-001 -2.500000e-001 -8.000000e-002 + vertex 3.873025e-001 -3.162227e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.809654e-001 8.515586e-002 -8.000000e-002 + vertex 4.802591e-001 1.391087e-001 -8.000000e-002 + vertex 1.964574e-001 3.747626e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.964574e-001 3.747626e-002 -8.000000e-002 + vertex 4.802591e-001 1.391087e-001 -8.000000e-002 + vertex 4.963544e-001 6.026834e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.964574e-001 3.747626e-002 -8.000000e-002 + vertex 4.963544e-001 6.026834e-002 -8.000000e-002 + vertex 1.996053e-001 -1.255810e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.996053e-001 -1.255810e-002 -8.000000e-002 + vertex 4.963544e-001 6.026834e-002 -8.000000e-002 + vertex 4.995945e-001 -2.013297e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.996053e-001 -1.255810e-002 -8.000000e-002 + vertex 4.995945e-001 -2.013297e-002 -8.000000e-002 + vertex 4.898953e-001 -1.000128e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.809654e-001 8.515586e-002 -8.000000e-002 + vertex -4.114919e-001 2.840324e-001 -8.000000e-002 + vertex -1.541027e-001 1.274848e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.541027e-001 1.274848e-001 -8.000000e-002 + vertex -4.114919e-001 2.840324e-001 -8.000000e-002 + vertex -3.606012e-001 3.463622e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.541027e-001 1.274848e-001 -8.000000e-002 + vertex -3.606012e-001 3.463622e-001 -8.000000e-002 + vertex -1.175570e-001 1.618034e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.175570e-001 1.618034e-001 -8.000000e-002 + vertex -3.606012e-001 3.463622e-001 -8.000000e-002 + vertex -3.003711e-001 3.997214e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.175570e-001 1.618034e-001 -8.000000e-002 + vertex -3.003711e-001 3.997214e-001 -8.000000e-002 + vertex -2.323616e-001 4.427280e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.541027e-001 1.274848e-001 -8.000000e-002 + vertex 4.114919e-001 2.840324e-001 -8.000000e-002 + vertex 1.809654e-001 8.515586e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.809654e-001 8.515586e-002 -8.000000e-002 + vertex 4.114919e-001 2.840324e-001 -8.000000e-002 + vertex 4.517252e-001 2.143463e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.809654e-001 8.515586e-002 -8.000000e-002 + vertex 4.517252e-001 2.143463e-001 -8.000000e-002 + vertex 4.802591e-001 1.391087e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 8.020564e-002 4.935251e-001 -8.000000e-002 + vertex 1.583340e-001 4.742682e-001 -8.000000e-002 + vertex 7.362491e-002 1.859553e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 7.362491e-002 1.859553e-001 -8.000000e-002 + vertex 1.583340e-001 4.742682e-001 -8.000000e-002 + vertex 2.323616e-001 4.427280e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 7.362491e-002 1.859553e-001 -8.000000e-002 + vertex 2.323616e-001 4.427280e-001 -8.000000e-002 + vertex 1.175570e-001 1.618034e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.175570e-001 1.618034e-001 -8.000000e-002 + vertex 2.323616e-001 4.427280e-001 -8.000000e-002 + vertex 3.003711e-001 3.997214e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.175570e-001 1.618034e-001 -8.000000e-002 + vertex 3.003711e-001 3.997214e-001 -8.000000e-002 + vertex 1.541027e-001 1.274848e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.541027e-001 1.274848e-001 -8.000000e-002 + vertex 3.003711e-001 3.997214e-001 -8.000000e-002 + vertex 3.606012e-001 3.463622e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.541027e-001 1.274848e-001 -8.000000e-002 + vertex 3.606012e-001 3.463622e-001 -8.000000e-002 + vertex 4.114919e-001 2.840324e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.964574e-001 3.747626e-002 -8.000000e-002 + vertex -4.802591e-001 1.391087e-001 -8.000000e-002 + vertex -1.809654e-001 8.515586e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.809654e-001 8.515586e-002 -8.000000e-002 + vertex -4.802591e-001 1.391087e-001 -8.000000e-002 + vertex -4.517252e-001 2.143463e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.809654e-001 8.515586e-002 -8.000000e-002 + vertex -4.517252e-001 2.143463e-001 -8.000000e-002 + vertex -4.114919e-001 2.840324e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.902113e-001 -6.180340e-002 -8.000000e-002 + vertex -4.898953e-001 -1.000128e-001 -8.000000e-002 + vertex -1.996053e-001 -1.255810e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.996053e-001 -1.255810e-002 -8.000000e-002 + vertex -4.898953e-001 -1.000128e-001 -8.000000e-002 + vertex -4.995945e-001 -2.013297e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.996053e-001 -1.255810e-002 -8.000000e-002 + vertex -4.995945e-001 -2.013297e-002 -8.000000e-002 + vertex -1.964574e-001 3.747626e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.964574e-001 3.747626e-002 -8.000000e-002 + vertex -4.995945e-001 -2.013297e-002 -8.000000e-002 + vertex -4.963544e-001 6.026834e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.964574e-001 3.747626e-002 -8.000000e-002 + vertex -4.963544e-001 6.026834e-002 -8.000000e-002 + vertex -4.802591e-001 1.391087e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.369094e-001 -1.457937e-001 -8.000000e-002 + vertex -3.873025e-001 -3.162227e-001 -8.000000e-002 + vertex -1.688656e-001 -1.071654e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.688656e-001 -1.071654e-001 -8.000000e-002 + vertex -3.873025e-001 -3.162227e-001 -8.000000e-002 + vertex -4.330127e-001 -2.500000e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.688656e-001 -1.071654e-001 -8.000000e-002 + vertex -4.330127e-001 -2.500000e-001 -8.000000e-002 + vertex -1.902113e-001 -6.180340e-002 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.902113e-001 -6.180340e-002 -8.000000e-002 + vertex -4.330127e-001 -2.500000e-001 -8.000000e-002 + vertex -4.675081e-001 -1.773024e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.902113e-001 -6.180340e-002 -8.000000e-002 + vertex -4.675081e-001 -1.773024e-001 -8.000000e-002 + vertex -4.898953e-001 -1.000128e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -4.973798e-002 -1.937166e-001 -8.000000e-002 + vertex -1.959833e-001 -4.599897e-001 -8.000000e-002 + vertex -9.635074e-002 -1.752613e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -9.635074e-002 -1.752613e-001 -8.000000e-002 + vertex -1.959833e-001 -4.599897e-001 -8.000000e-002 + vertex -2.672329e-001 -4.225951e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -9.635074e-002 -1.752613e-001 -8.000000e-002 + vertex -2.672329e-001 -4.225951e-001 -8.000000e-002 + vertex -1.369094e-001 -1.457937e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.369094e-001 -1.457937e-001 -8.000000e-002 + vertex -2.672329e-001 -4.225951e-001 -8.000000e-002 + vertex -3.315613e-001 -3.742554e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.369094e-001 -1.457937e-001 -8.000000e-002 + vertex -3.315613e-001 -3.742554e-001 -8.000000e-002 + vertex -3.873025e-001 -3.162227e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -4.898587e-017 -2.000000e-001 -8.000000e-002 + vertex -4.023328e-002 -4.983787e-001 -8.000000e-002 + vertex -4.973798e-002 -1.937166e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -4.973798e-002 -1.937166e-001 -8.000000e-002 + vertex -4.023328e-002 -4.983787e-001 -8.000000e-002 + vertex -1.196578e-001 -4.854709e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -4.973798e-002 -1.937166e-001 -8.000000e-002 + vertex -1.196578e-001 -4.854709e-001 -8.000000e-002 + vertex -1.959833e-001 -4.599897e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 4.973798e-002 -1.937166e-001 -8.000000e-002 + vertex 4.023328e-002 -4.983787e-001 -8.000000e-002 + vertex -4.898587e-017 -2.000000e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -4.898587e-017 -2.000000e-001 -8.000000e-002 + vertex 4.023328e-002 -4.983787e-001 -8.000000e-002 + vertex 1.836970e-016 -5.000000e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -4.898587e-017 -2.000000e-001 -8.000000e-002 + vertex 1.836970e-016 -5.000000e-001 -8.000000e-002 + vertex -4.023328e-002 -4.983787e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 3.315613e-001 -3.742554e-001 -8.000000e-002 + vertex 2.672329e-001 -4.225951e-001 -8.000000e-002 + vertex 9.635074e-002 -1.752613e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 9.635074e-002 -1.752613e-001 -8.000000e-002 + vertex 2.672329e-001 -4.225951e-001 -8.000000e-002 + vertex 1.959833e-001 -4.599897e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 9.635074e-002 -1.752613e-001 -8.000000e-002 + vertex 1.959833e-001 -4.599897e-001 -8.000000e-002 + vertex 4.973798e-002 -1.937166e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 4.973798e-002 -1.937166e-001 -8.000000e-002 + vertex 1.959833e-001 -4.599897e-001 -8.000000e-002 + vertex 1.196578e-001 -4.854709e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 4.973798e-002 -1.937166e-001 -8.000000e-002 + vertex 1.196578e-001 -4.854709e-001 -8.000000e-002 + vertex 4.023328e-002 -4.983787e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 4.963869e-001 -6.000000e-002 4.000000e-002 + vertex -4.963869e-001 -6.000000e-002 4.000000e-002 + vertex -4.898953e-001 -1.000128e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 4.963869e-001 -6.000000e-002 4.000000e-002 + vertex -4.898953e-001 -1.000128e-001 4.000000e-002 + vertex 4.898953e-001 -1.000128e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 4.898953e-001 -1.000128e-001 4.000000e-002 + vertex -4.898953e-001 -1.000128e-001 4.000000e-002 + vertex -4.675081e-001 -1.773024e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 4.898953e-001 -1.000128e-001 4.000000e-002 + vertex -4.675081e-001 -1.773024e-001 4.000000e-002 + vertex 4.675081e-001 -1.773024e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 4.675081e-001 -1.773024e-001 4.000000e-002 + vertex -4.675081e-001 -1.773024e-001 4.000000e-002 + vertex -4.330127e-001 -2.500000e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 4.675081e-001 -1.773024e-001 4.000000e-002 + vertex -4.330127e-001 -2.500000e-001 4.000000e-002 + vertex 4.330127e-001 -2.500000e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 4.330127e-001 -2.500000e-001 4.000000e-002 + vertex -4.330127e-001 -2.500000e-001 4.000000e-002 + vertex -3.873025e-001 -3.162227e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 4.330127e-001 -2.500000e-001 4.000000e-002 + vertex -3.873025e-001 -3.162227e-001 4.000000e-002 + vertex 3.873025e-001 -3.162227e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 3.873025e-001 -3.162227e-001 4.000000e-002 + vertex -3.873025e-001 -3.162227e-001 4.000000e-002 + vertex -3.315613e-001 -3.742554e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 3.873025e-001 -3.162227e-001 4.000000e-002 + vertex -3.315613e-001 -3.742554e-001 4.000000e-002 + vertex 3.315613e-001 -3.742554e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 3.315613e-001 -3.742554e-001 4.000000e-002 + vertex -3.315613e-001 -3.742554e-001 4.000000e-002 + vertex -2.672329e-001 -4.225951e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 3.315613e-001 -3.742554e-001 4.000000e-002 + vertex -2.672329e-001 -4.225951e-001 4.000000e-002 + vertex 2.672329e-001 -4.225951e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.672329e-001 -4.225951e-001 4.000000e-002 + vertex -2.672329e-001 -4.225951e-001 4.000000e-002 + vertex -1.959833e-001 -4.599897e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.672329e-001 -4.225951e-001 4.000000e-002 + vertex -1.959833e-001 -4.599897e-001 4.000000e-002 + vertex 1.959833e-001 -4.599897e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 1.959833e-001 -4.599897e-001 4.000000e-002 + vertex -1.959833e-001 -4.599897e-001 4.000000e-002 + vertex -1.196578e-001 -4.854709e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 1.959833e-001 -4.599897e-001 4.000000e-002 + vertex -1.196578e-001 -4.854709e-001 4.000000e-002 + vertex 1.196578e-001 -4.854709e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 1.196578e-001 -4.854709e-001 4.000000e-002 + vertex -1.196578e-001 -4.854709e-001 4.000000e-002 + vertex -4.023328e-002 -4.983787e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 1.196578e-001 -4.854709e-001 4.000000e-002 + vertex -4.023328e-002 -4.983787e-001 4.000000e-002 + vertex 4.023328e-002 -4.983787e-001 4.000000e-002 + endloop + endfacet + facet normal -9.977564e-001 6.694921e-002 0.000000e+000 + outer loop + vertex -4.963869e-001 6.000000e-002 -4.000000e-002 + vertex -4.963544e-001 6.026834e-002 -8.000000e-002 + vertex -4.995945e-001 -2.013297e-002 -4.000000e-002 + endloop + endfacet + facet normal -9.999106e-001 1.337347e-002 0.000000e+000 + outer loop + vertex -4.995945e-001 -2.013297e-002 -4.000000e-002 + vertex -4.963544e-001 6.026834e-002 -8.000000e-002 + vertex -4.995945e-001 -2.013297e-002 -8.000000e-002 + endloop + endfacet + facet normal -9.977602e-001 -6.689154e-002 0.000000e+000 + outer loop + vertex -4.995945e-001 -2.013297e-002 -4.000000e-002 + vertex -4.995945e-001 -2.013297e-002 -8.000000e-002 + vertex -4.963869e-001 -6.000000e-002 -4.000000e-002 + endloop + endfacet + facet normal -9.927306e-001 -1.203574e-001 0.000000e+000 + outer loop + vertex -4.963869e-001 -6.000000e-002 -4.000000e-002 + vertex -4.995945e-001 -2.013297e-002 -8.000000e-002 + vertex -4.898953e-001 -1.000128e-001 -8.000000e-002 + endloop + endfacet + facet normal -9.891688e-001 -1.467825e-001 0.000000e+000 + outer loop + vertex -4.963869e-001 -6.000000e-002 -4.000000e-002 + vertex -4.898953e-001 -1.000128e-001 -8.000000e-002 + vertex -4.963869e-001 -6.000000e-002 4.000000e-002 + endloop + endfacet + facet normal 9.927306e-001 -1.203574e-001 0.000000e+000 + outer loop + vertex 4.963869e-001 -6.000000e-002 -4.000000e-002 + vertex 4.898953e-001 -1.000128e-001 -8.000000e-002 + vertex 4.995945e-001 -2.013297e-002 -4.000000e-002 + endloop + endfacet + facet normal 9.955921e-001 -9.378949e-002 0.000000e+000 + outer loop + vertex 4.995945e-001 -2.013297e-002 -4.000000e-002 + vertex 4.898953e-001 -1.000128e-001 -8.000000e-002 + vertex 4.995945e-001 -2.013297e-002 -8.000000e-002 + endloop + endfacet + facet normal 9.999130e-001 1.319381e-002 0.000000e+000 + outer loop + vertex 4.995945e-001 -2.013297e-002 -4.000000e-002 + vertex 4.995945e-001 -2.013297e-002 -8.000000e-002 + vertex 4.963869e-001 6.000000e-002 -4.000000e-002 + endloop + endfacet + facet normal 9.977564e-001 6.694920e-002 0.000000e+000 + outer loop + vertex 4.963869e-001 6.000000e-002 -4.000000e-002 + vertex 4.995945e-001 -2.013297e-002 -8.000000e-002 + vertex 4.963544e-001 6.026834e-002 -8.000000e-002 + endloop + endfacet + facet normal 9.927523e-001 1.201789e-001 0.000000e+000 + outer loop + vertex 4.963869e-001 6.000000e-002 -4.000000e-002 + vertex 4.963544e-001 6.026834e-002 -8.000000e-002 + vertex 4.963869e-001 6.000000e-002 4.000000e-002 + endloop + endfacet + facet normal -9.848379e-001 -1.734772e-001 0.000000e+000 + outer loop + vertex -4.963869e-001 -6.000000e-002 4.000000e-002 + vertex -4.898953e-001 -1.000128e-001 -8.000000e-002 + vertex -4.898953e-001 -1.000128e-001 4.000000e-002 + endloop + endfacet + facet normal -9.676545e-001 -2.522791e-001 0.000000e+000 + outer loop + vertex -4.898953e-001 -1.000128e-001 4.000000e-002 + vertex -4.898953e-001 -1.000128e-001 -8.000000e-002 + vertex -4.675081e-001 -1.773024e-001 -8.000000e-002 + endloop + endfacet + facet normal -9.526865e-001 -3.039545e-001 0.000000e+000 + outer loop + vertex -4.898953e-001 -1.000128e-001 4.000000e-002 + vertex -4.675081e-001 -1.773024e-001 -8.000000e-002 + vertex -4.675081e-001 -1.773024e-001 4.000000e-002 + endloop + endfacet + facet normal -9.146552e-001 -4.042349e-001 0.000000e+000 + outer loop + vertex -4.675081e-001 -1.773024e-001 4.000000e-002 + vertex -4.675081e-001 -1.773024e-001 -8.000000e-002 + vertex -4.330127e-001 -2.500000e-001 -8.000000e-002 + endloop + endfacet + facet normal -8.915918e-001 -4.528400e-001 0.000000e+000 + outer loop + vertex -4.675081e-001 -1.773024e-001 4.000000e-002 + vertex -4.330127e-001 -2.500000e-001 -8.000000e-002 + vertex -4.330127e-001 -2.500000e-001 4.000000e-002 + endloop + endfacet + facet normal -8.379669e-001 -5.457212e-001 0.000000e+000 + outer loop + vertex -4.330127e-001 -2.500000e-001 4.000000e-002 + vertex -4.330127e-001 -2.500000e-001 -8.000000e-002 + vertex -3.873025e-001 -3.162227e-001 -8.000000e-002 + endloop + endfacet + facet normal -8.074053e-001 -5.899972e-001 0.000000e+000 + outer loop + vertex -4.330127e-001 -2.500000e-001 4.000000e-002 + vertex -3.873025e-001 -3.162227e-001 -8.000000e-002 + vertex -3.873025e-001 -3.162227e-001 4.000000e-002 + endloop + endfacet + facet normal -7.395756e-001 -6.730735e-001 0.000000e+000 + outer loop + vertex -3.873025e-001 -3.162227e-001 4.000000e-002 + vertex -3.873025e-001 -3.162227e-001 -8.000000e-002 + vertex -3.315613e-001 -3.742554e-001 -8.000000e-002 + endloop + endfacet + facet normal -7.023074e-001 -7.118738e-001 0.000000e+000 + outer loop + vertex -3.873025e-001 -3.162227e-001 4.000000e-002 + vertex -3.315613e-001 -3.742554e-001 -8.000000e-002 + vertex -3.315613e-001 -3.742554e-001 4.000000e-002 + endloop + endfacet + facet normal -6.220297e-001 -7.829937e-001 0.000000e+000 + outer loop + vertex -3.315613e-001 -3.742554e-001 4.000000e-002 + vertex -3.315613e-001 -3.742554e-001 -8.000000e-002 + vertex -2.672329e-001 -4.225951e-001 -8.000000e-002 + endloop + endfacet + facet normal -5.790201e-001 -8.153133e-001 0.000000e+000 + outer loop + vertex -3.315613e-001 -3.742554e-001 4.000000e-002 + vertex -2.672329e-001 -4.225951e-001 -8.000000e-002 + vertex -2.672329e-001 -4.225951e-001 4.000000e-002 + endloop + endfacet + facet normal -4.883735e-001 -8.726347e-001 0.000000e+000 + outer loop + vertex -2.672329e-001 -4.225951e-001 4.000000e-002 + vertex -2.672329e-001 -4.225951e-001 -8.000000e-002 + vertex -1.959833e-001 -4.599897e-001 -8.000000e-002 + endloop + endfacet + facet normal -4.407364e-001 -8.976365e-001 0.000000e+000 + outer loop + vertex -2.672329e-001 -4.225951e-001 4.000000e-002 + vertex -1.959833e-001 -4.599897e-001 -8.000000e-002 + vertex -1.959833e-001 -4.599897e-001 4.000000e-002 + endloop + endfacet + facet normal -3.420688e-001 -9.396749e-001 0.000000e+000 + outer loop + vertex -1.959833e-001 -4.599897e-001 4.000000e-002 + vertex -1.959833e-001 -4.599897e-001 -8.000000e-002 + vertex -1.196578e-001 -4.854709e-001 -8.000000e-002 + endloop + endfacet + facet normal -2.910380e-001 -9.567115e-001 0.000000e+000 + outer loop + vertex -1.959833e-001 -4.599897e-001 4.000000e-002 + vertex -1.196578e-001 -4.854709e-001 -8.000000e-002 + vertex -1.196578e-001 -4.854709e-001 4.000000e-002 + endloop + endfacet + facet normal -1.869046e-001 -9.823781e-001 0.000000e+000 + outer loop + vertex -1.196578e-001 -4.854709e-001 4.000000e-002 + vertex -1.196578e-001 -4.854709e-001 -8.000000e-002 + vertex -4.023328e-002 -4.983787e-001 -8.000000e-002 + endloop + endfacet + facet normal -1.338019e-001 -9.910081e-001 0.000000e+000 + outer loop + vertex -1.196578e-001 -4.854709e-001 4.000000e-002 + vertex -4.023328e-002 -4.983787e-001 -8.000000e-002 + vertex -4.023328e-002 -4.983787e-001 4.000000e-002 + endloop + endfacet + facet normal -5.368308e-002 -9.985580e-001 0.000000e+000 + outer loop + vertex -4.023328e-002 -4.983787e-001 4.000000e-002 + vertex -4.023328e-002 -4.983787e-001 -8.000000e-002 + vertex 6.123234e-017 -5.000000e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 -1.000000e+000 0.000000e+000 + outer loop + vertex -4.023328e-002 -4.983787e-001 4.000000e-002 + vertex 6.123234e-017 -5.000000e-001 -8.000000e-002 + vertex 4.023328e-002 -4.983787e-001 4.000000e-002 + endloop + endfacet + facet normal 5.368308e-002 -9.985580e-001 0.000000e+000 + outer loop + vertex 6.123234e-017 -5.000000e-001 -8.000000e-002 + vertex 4.023328e-002 -4.983787e-001 -8.000000e-002 + vertex 4.023328e-002 -4.983787e-001 4.000000e-002 + endloop + endfacet + facet normal 1.338019e-001 -9.910081e-001 0.000000e+000 + outer loop + vertex 4.023328e-002 -4.983787e-001 4.000000e-002 + vertex 4.023328e-002 -4.983787e-001 -8.000000e-002 + vertex 1.196578e-001 -4.854709e-001 -8.000000e-002 + endloop + endfacet + facet normal 1.869046e-001 -9.823781e-001 0.000000e+000 + outer loop + vertex 4.023328e-002 -4.983787e-001 4.000000e-002 + vertex 1.196578e-001 -4.854709e-001 -8.000000e-002 + vertex 1.196578e-001 -4.854709e-001 4.000000e-002 + endloop + endfacet + facet normal 2.910380e-001 -9.567115e-001 0.000000e+000 + outer loop + vertex 1.196578e-001 -4.854709e-001 4.000000e-002 + vertex 1.196578e-001 -4.854709e-001 -8.000000e-002 + vertex 1.959833e-001 -4.599897e-001 -8.000000e-002 + endloop + endfacet + facet normal 3.420688e-001 -9.396749e-001 0.000000e+000 + outer loop + vertex 1.196578e-001 -4.854709e-001 4.000000e-002 + vertex 1.959833e-001 -4.599897e-001 -8.000000e-002 + vertex 1.959833e-001 -4.599897e-001 4.000000e-002 + endloop + endfacet + facet normal 4.407365e-001 -8.976365e-001 0.000000e+000 + outer loop + vertex 1.959833e-001 -4.599897e-001 4.000000e-002 + vertex 1.959833e-001 -4.599897e-001 -8.000000e-002 + vertex 2.672329e-001 -4.225951e-001 -8.000000e-002 + endloop + endfacet + facet normal 4.883735e-001 -8.726346e-001 0.000000e+000 + outer loop + vertex 1.959833e-001 -4.599897e-001 4.000000e-002 + vertex 2.672329e-001 -4.225951e-001 -8.000000e-002 + vertex 2.672329e-001 -4.225951e-001 4.000000e-002 + endloop + endfacet + facet normal 5.790201e-001 -8.153133e-001 0.000000e+000 + outer loop + vertex 2.672329e-001 -4.225951e-001 4.000000e-002 + vertex 2.672329e-001 -4.225951e-001 -8.000000e-002 + vertex 3.315613e-001 -3.742554e-001 -8.000000e-002 + endloop + endfacet + facet normal 6.220297e-001 -7.829937e-001 0.000000e+000 + outer loop + vertex 2.672329e-001 -4.225951e-001 4.000000e-002 + vertex 3.315613e-001 -3.742554e-001 -8.000000e-002 + vertex 3.315613e-001 -3.742554e-001 4.000000e-002 + endloop + endfacet + facet normal 7.023074e-001 -7.118738e-001 0.000000e+000 + outer loop + vertex 3.315613e-001 -3.742554e-001 4.000000e-002 + vertex 3.315613e-001 -3.742554e-001 -8.000000e-002 + vertex 3.873025e-001 -3.162227e-001 -8.000000e-002 + endloop + endfacet + facet normal 7.395756e-001 -6.730735e-001 0.000000e+000 + outer loop + vertex 3.315613e-001 -3.742554e-001 4.000000e-002 + vertex 3.873025e-001 -3.162227e-001 -8.000000e-002 + vertex 3.873025e-001 -3.162227e-001 4.000000e-002 + endloop + endfacet + facet normal 8.074053e-001 -5.899972e-001 0.000000e+000 + outer loop + vertex 3.873025e-001 -3.162227e-001 4.000000e-002 + vertex 3.873025e-001 -3.162227e-001 -8.000000e-002 + vertex 4.330127e-001 -2.500000e-001 -8.000000e-002 + endloop + endfacet + facet normal 8.379669e-001 -5.457212e-001 0.000000e+000 + outer loop + vertex 3.873025e-001 -3.162227e-001 4.000000e-002 + vertex 4.330127e-001 -2.500000e-001 -8.000000e-002 + vertex 4.330127e-001 -2.500000e-001 4.000000e-002 + endloop + endfacet + facet normal 8.915918e-001 -4.528400e-001 0.000000e+000 + outer loop + vertex 4.330127e-001 -2.500000e-001 4.000000e-002 + vertex 4.330127e-001 -2.500000e-001 -8.000000e-002 + vertex 4.675081e-001 -1.773024e-001 -8.000000e-002 + endloop + endfacet + facet normal 9.146552e-001 -4.042349e-001 0.000000e+000 + outer loop + vertex 4.330127e-001 -2.500000e-001 4.000000e-002 + vertex 4.675081e-001 -1.773024e-001 -8.000000e-002 + vertex 4.675081e-001 -1.773024e-001 4.000000e-002 + endloop + endfacet + facet normal 9.526865e-001 -3.039545e-001 0.000000e+000 + outer loop + vertex 4.675081e-001 -1.773024e-001 4.000000e-002 + vertex 4.675081e-001 -1.773024e-001 -8.000000e-002 + vertex 4.898953e-001 -1.000128e-001 -8.000000e-002 + endloop + endfacet + facet normal 9.676545e-001 -2.522791e-001 0.000000e+000 + outer loop + vertex 4.675081e-001 -1.773024e-001 4.000000e-002 + vertex 4.898953e-001 -1.000128e-001 -8.000000e-002 + vertex 4.898953e-001 -1.000128e-001 4.000000e-002 + endloop + endfacet + facet normal 9.848379e-001 -1.734772e-001 0.000000e+000 + outer loop + vertex 4.898953e-001 -1.000128e-001 4.000000e-002 + vertex 4.898953e-001 -1.000128e-001 -8.000000e-002 + vertex 4.963869e-001 -6.000000e-002 -4.000000e-002 + endloop + endfacet + facet normal 9.891688e-001 -1.467825e-001 0.000000e+000 + outer loop + vertex 4.898953e-001 -1.000128e-001 4.000000e-002 + vertex 4.963869e-001 -6.000000e-002 -4.000000e-002 + vertex 4.963869e-001 -6.000000e-002 4.000000e-002 + endloop + endfacet + facet normal 9.927306e-001 1.203578e-001 0.000000e+000 + outer loop + vertex 4.963869e-001 6.000000e-002 4.000000e-002 + vertex 4.963544e-001 6.026834e-002 -8.000000e-002 + vertex 4.963544e-001 6.026834e-002 4.000000e-002 + endloop + endfacet + facet normal 9.848167e-001 1.735972e-001 0.000000e+000 + outer loop + vertex 4.963544e-001 6.026834e-002 4.000000e-002 + vertex 4.963544e-001 6.026834e-002 -8.000000e-002 + vertex 4.802591e-001 1.391087e-001 -8.000000e-002 + endloop + endfacet + facet normal 9.740555e-001 2.263094e-001 0.000000e+000 + outer loop + vertex 4.963544e-001 6.026834e-002 4.000000e-002 + vertex 4.802591e-001 1.391087e-001 -8.000000e-002 + vertex 4.802591e-001 1.391087e-001 4.000000e-002 + endloop + endfacet + facet normal 9.442167e-001 3.293249e-001 0.000000e+000 + outer loop + vertex 4.802591e-001 1.391087e-001 4.000000e-002 + vertex 4.802591e-001 1.391087e-001 -8.000000e-002 + vertex 4.517252e-001 2.143463e-001 -8.000000e-002 + endloop + endfacet + facet normal 9.251391e-001 3.796282e-001 0.000000e+000 + outer loop + vertex 4.802591e-001 1.391087e-001 4.000000e-002 + vertex 4.517252e-001 2.143463e-001 -8.000000e-002 + vertex 4.517252e-001 2.143463e-001 4.000000e-002 + endloop + endfacet + facet normal 8.791618e-001 4.765233e-001 0.000000e+000 + outer loop + vertex 4.517252e-001 2.143463e-001 4.000000e-002 + vertex 4.517252e-001 2.143463e-001 -8.000000e-002 + vertex 4.114919e-001 2.840324e-001 -8.000000e-002 + endloop + endfacet + facet normal 8.522621e-001 5.231149e-001 0.000000e+000 + outer loop + vertex 4.517252e-001 2.143463e-001 4.000000e-002 + vertex 4.114919e-001 2.840324e-001 -8.000000e-002 + vertex 4.114919e-001 2.840324e-001 4.000000e-002 + endloop + endfacet + facet normal 7.913373e-001 6.113799e-001 0.000000e+000 + outer loop + vertex 4.114919e-001 2.840324e-001 4.000000e-002 + vertex 4.114919e-001 2.840324e-001 -8.000000e-002 + vertex 3.606012e-001 3.463622e-001 -8.000000e-002 + endloop + endfacet + facet normal 7.573121e-001 6.530532e-001 0.000000e+000 + outer loop + vertex 4.114919e-001 2.840324e-001 4.000000e-002 + vertex 3.606012e-001 3.463622e-001 -8.000000e-002 + vertex 3.606012e-001 3.463622e-001 4.000000e-002 + endloop + endfacet + facet normal 6.830174e-001 7.304021e-001 0.000000e+000 + outer loop + vertex 3.606012e-001 3.463622e-001 4.000000e-002 + vertex 3.606012e-001 3.463622e-001 -8.000000e-002 + vertex 3.003711e-001 3.997214e-001 -8.000000e-002 + endloop + endfacet + facet normal 6.427480e-001 7.660777e-001 0.000000e+000 + outer loop + vertex 3.606012e-001 3.463622e-001 4.000000e-002 + vertex 3.003711e-001 3.997214e-001 -8.000000e-002 + vertex 3.003711e-001 3.997214e-001 4.000000e-002 + endloop + endfacet + facet normal 5.570078e-001 8.305073e-001 0.000000e+000 + outer loop + vertex 3.003711e-001 3.997214e-001 4.000000e-002 + vertex 3.003711e-001 3.997214e-001 -8.000000e-002 + vertex 2.323616e-001 4.427280e-001 -8.000000e-002 + endloop + endfacet + facet normal 5.115370e-001 8.592612e-001 0.000000e+000 + outer loop + vertex 3.003711e-001 3.997214e-001 4.000000e-002 + vertex 2.323616e-001 4.427280e-001 -8.000000e-002 + vertex 2.323616e-001 4.427280e-001 4.000000e-002 + endloop + endfacet + facet normal 4.165719e-001 9.091027e-001 0.000000e+000 + outer loop + vertex 2.323616e-001 4.427280e-001 4.000000e-002 + vertex 2.323616e-001 4.427280e-001 -8.000000e-002 + vertex 1.583340e-001 4.742682e-001 -8.000000e-002 + endloop + endfacet + facet normal 3.670776e-001 9.301903e-001 0.000000e+000 + outer loop + vertex 2.323616e-001 4.427280e-001 4.000000e-002 + vertex 1.583340e-001 4.742682e-001 -8.000000e-002 + vertex 1.583340e-001 4.742682e-001 4.000000e-002 + endloop + endfacet + facet normal 2.653471e-001 9.641529e-001 0.000000e+000 + outer loop + vertex 1.583340e-001 4.742682e-001 4.000000e-002 + vertex 1.583340e-001 4.742682e-001 -8.000000e-002 + vertex 8.020564e-002 4.935251e-001 -8.000000e-002 + endloop + endfacet + facet normal 2.131110e-001 9.770280e-001 0.000000e+000 + outer loop + vertex 1.583340e-001 4.742682e-001 4.000000e-002 + vertex 8.020564e-002 4.935251e-001 -8.000000e-002 + vertex 8.020564e-002 4.935251e-001 4.000000e-002 + endloop + endfacet + facet normal 1.072499e-001 9.942321e-001 0.000000e+000 + outer loop + vertex 8.020564e-002 4.935251e-001 4.000000e-002 + vertex 8.020564e-002 4.935251e-001 -8.000000e-002 + vertex 0.000000e+000 5.000000e-001 -8.000000e-002 + endloop + endfacet + facet normal 5.362497e-002 9.985611e-001 0.000000e+000 + outer loop + vertex 8.020564e-002 4.935251e-001 4.000000e-002 + vertex 0.000000e+000 5.000000e-001 -8.000000e-002 + vertex 0.000000e+000 5.000000e-001 4.000000e-002 + endloop + endfacet + facet normal -5.362497e-002 9.985611e-001 0.000000e+000 + outer loop + vertex 0.000000e+000 5.000000e-001 4.000000e-002 + vertex 0.000000e+000 5.000000e-001 -8.000000e-002 + vertex -8.020564e-002 4.935251e-001 -8.000000e-002 + endloop + endfacet + facet normal -1.072499e-001 9.942321e-001 0.000000e+000 + outer loop + vertex 0.000000e+000 5.000000e-001 4.000000e-002 + vertex -8.020564e-002 4.935251e-001 -8.000000e-002 + vertex -8.020564e-002 4.935251e-001 4.000000e-002 + endloop + endfacet + facet normal -2.131110e-001 9.770280e-001 0.000000e+000 + outer loop + vertex -8.020564e-002 4.935251e-001 4.000000e-002 + vertex -8.020564e-002 4.935251e-001 -8.000000e-002 + vertex -1.583340e-001 4.742682e-001 -8.000000e-002 + endloop + endfacet + facet normal -2.653471e-001 9.641529e-001 0.000000e+000 + outer loop + vertex -8.020564e-002 4.935251e-001 4.000000e-002 + vertex -1.583340e-001 4.742682e-001 -8.000000e-002 + vertex -1.583340e-001 4.742682e-001 4.000000e-002 + endloop + endfacet + facet normal -3.670776e-001 9.301903e-001 0.000000e+000 + outer loop + vertex -1.583340e-001 4.742682e-001 4.000000e-002 + vertex -1.583340e-001 4.742682e-001 -8.000000e-002 + vertex -2.323616e-001 4.427280e-001 -8.000000e-002 + endloop + endfacet + facet normal -4.165719e-001 9.091027e-001 0.000000e+000 + outer loop + vertex -1.583340e-001 4.742682e-001 4.000000e-002 + vertex -2.323616e-001 4.427280e-001 -8.000000e-002 + vertex -2.323616e-001 4.427280e-001 4.000000e-002 + endloop + endfacet + facet normal -5.115370e-001 8.592612e-001 0.000000e+000 + outer loop + vertex -2.323616e-001 4.427280e-001 4.000000e-002 + vertex -2.323616e-001 4.427280e-001 -8.000000e-002 + vertex -3.003711e-001 3.997214e-001 -8.000000e-002 + endloop + endfacet + facet normal -5.570078e-001 8.305073e-001 0.000000e+000 + outer loop + vertex -2.323616e-001 4.427280e-001 4.000000e-002 + vertex -3.003711e-001 3.997214e-001 -8.000000e-002 + vertex -3.003711e-001 3.997214e-001 4.000000e-002 + endloop + endfacet + facet normal -6.427480e-001 7.660777e-001 0.000000e+000 + outer loop + vertex -3.003711e-001 3.997214e-001 4.000000e-002 + vertex -3.003711e-001 3.997214e-001 -8.000000e-002 + vertex -3.606012e-001 3.463622e-001 -8.000000e-002 + endloop + endfacet + facet normal -6.830174e-001 7.304021e-001 0.000000e+000 + outer loop + vertex -3.003711e-001 3.997214e-001 4.000000e-002 + vertex -3.606012e-001 3.463622e-001 -8.000000e-002 + vertex -3.606012e-001 3.463622e-001 4.000000e-002 + endloop + endfacet + facet normal -7.573121e-001 6.530532e-001 0.000000e+000 + outer loop + vertex -3.606012e-001 3.463622e-001 4.000000e-002 + vertex -3.606012e-001 3.463622e-001 -8.000000e-002 + vertex -4.114919e-001 2.840324e-001 -8.000000e-002 + endloop + endfacet + facet normal -7.913373e-001 6.113799e-001 0.000000e+000 + outer loop + vertex -3.606012e-001 3.463622e-001 4.000000e-002 + vertex -4.114919e-001 2.840324e-001 -8.000000e-002 + vertex -4.114919e-001 2.840324e-001 4.000000e-002 + endloop + endfacet + facet normal -8.522621e-001 5.231149e-001 0.000000e+000 + outer loop + vertex -4.114919e-001 2.840324e-001 4.000000e-002 + vertex -4.114919e-001 2.840324e-001 -8.000000e-002 + vertex -4.517252e-001 2.143463e-001 -8.000000e-002 + endloop + endfacet + facet normal -8.791618e-001 4.765233e-001 0.000000e+000 + outer loop + vertex -4.114919e-001 2.840324e-001 4.000000e-002 + vertex -4.517252e-001 2.143463e-001 -8.000000e-002 + vertex -4.517252e-001 2.143463e-001 4.000000e-002 + endloop + endfacet + facet normal -9.251391e-001 3.796283e-001 0.000000e+000 + outer loop + vertex -4.517252e-001 2.143463e-001 4.000000e-002 + vertex -4.517252e-001 2.143463e-001 -8.000000e-002 + vertex -4.802591e-001 1.391087e-001 -8.000000e-002 + endloop + endfacet + facet normal -9.442167e-001 3.293249e-001 0.000000e+000 + outer loop + vertex -4.517252e-001 2.143463e-001 4.000000e-002 + vertex -4.802591e-001 1.391087e-001 -8.000000e-002 + vertex -4.802591e-001 1.391087e-001 4.000000e-002 + endloop + endfacet + facet normal -9.740555e-001 2.263094e-001 0.000000e+000 + outer loop + vertex -4.802591e-001 1.391087e-001 4.000000e-002 + vertex -4.802591e-001 1.391087e-001 -8.000000e-002 + vertex -4.963544e-001 6.026834e-002 -8.000000e-002 + endloop + endfacet + facet normal -9.848167e-001 1.735972e-001 0.000000e+000 + outer loop + vertex -4.802591e-001 1.391087e-001 4.000000e-002 + vertex -4.963544e-001 6.026834e-002 -8.000000e-002 + vertex -4.963544e-001 6.026834e-002 4.000000e-002 + endloop + endfacet + facet normal -9.927306e-001 1.203578e-001 0.000000e+000 + outer loop + vertex -4.963544e-001 6.026834e-002 4.000000e-002 + vertex -4.963544e-001 6.026834e-002 -8.000000e-002 + vertex -4.963869e-001 6.000000e-002 -4.000000e-002 + endloop + endfacet + facet normal -9.927523e-001 1.201789e-001 0.000000e+000 + outer loop + vertex -4.963544e-001 6.026834e-002 4.000000e-002 + vertex -4.963869e-001 6.000000e-002 -4.000000e-002 + vertex -4.963869e-001 6.000000e-002 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -4.963869e-001 6.000000e-002 4.000000e-002 + vertex 2.450000e-001 6.000000e-002 4.000000e-002 + vertex -4.963544e-001 6.026834e-002 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -4.963544e-001 6.026834e-002 4.000000e-002 + vertex 2.450000e-001 6.000000e-002 4.000000e-002 + vertex 2.450000e-001 1.600000e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -4.963544e-001 6.026834e-002 4.000000e-002 + vertex 2.450000e-001 1.600000e-001 4.000000e-002 + vertex -4.802591e-001 1.391087e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -3.003711e-001 3.997214e-001 4.000000e-002 + vertex -3.606012e-001 3.463622e-001 4.000000e-002 + vertex -2.323616e-001 4.427280e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -2.323616e-001 4.427280e-001 4.000000e-002 + vertex -3.606012e-001 3.463622e-001 4.000000e-002 + vertex -4.114919e-001 2.840324e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -2.323616e-001 4.427280e-001 4.000000e-002 + vertex -4.114919e-001 2.840324e-001 4.000000e-002 + vertex -1.583340e-001 4.742682e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -1.583340e-001 4.742682e-001 4.000000e-002 + vertex -4.114919e-001 2.840324e-001 4.000000e-002 + vertex -4.517252e-001 2.143463e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -1.583340e-001 4.742682e-001 4.000000e-002 + vertex -4.517252e-001 2.143463e-001 4.000000e-002 + vertex -8.020564e-002 4.935251e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 8.020564e-002 4.935251e-001 4.000000e-002 + vertex 0.000000e+000 5.000000e-001 4.000000e-002 + vertex -8.020564e-002 4.935251e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.550000e-001 6.000000e-002 4.000000e-002 + vertex 4.963869e-001 6.000000e-002 4.000000e-002 + vertex 4.963544e-001 6.026834e-002 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.550000e-001 1.600000e-001 4.000000e-002 + vertex 3.606012e-001 3.463622e-001 4.000000e-002 + vertex 2.450000e-001 1.600000e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.450000e-001 1.600000e-001 4.000000e-002 + vertex 3.606012e-001 3.463622e-001 4.000000e-002 + vertex 3.003711e-001 3.997214e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.450000e-001 1.600000e-001 4.000000e-002 + vertex 3.003711e-001 3.997214e-001 4.000000e-002 + vertex 2.323616e-001 4.427280e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 4.963544e-001 6.026834e-002 4.000000e-002 + vertex 4.802591e-001 1.391087e-001 4.000000e-002 + vertex 2.550000e-001 6.000000e-002 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.550000e-001 6.000000e-002 4.000000e-002 + vertex 4.802591e-001 1.391087e-001 4.000000e-002 + vertex 4.517252e-001 2.143463e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.550000e-001 6.000000e-002 4.000000e-002 + vertex 4.517252e-001 2.143463e-001 4.000000e-002 + vertex 2.550000e-001 1.600000e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.550000e-001 1.600000e-001 4.000000e-002 + vertex 4.517252e-001 2.143463e-001 4.000000e-002 + vertex 4.114919e-001 2.840324e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.550000e-001 1.600000e-001 4.000000e-002 + vertex 4.114919e-001 2.840324e-001 4.000000e-002 + vertex 3.606012e-001 3.463622e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -4.517252e-001 2.143463e-001 4.000000e-002 + vertex -4.802591e-001 1.391087e-001 4.000000e-002 + vertex -8.020564e-002 4.935251e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -8.020564e-002 4.935251e-001 4.000000e-002 + vertex -4.802591e-001 1.391087e-001 4.000000e-002 + vertex 2.450000e-001 1.600000e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -8.020564e-002 4.935251e-001 4.000000e-002 + vertex 2.450000e-001 1.600000e-001 4.000000e-002 + vertex 8.020564e-002 4.935251e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 8.020564e-002 4.935251e-001 4.000000e-002 + vertex 2.450000e-001 1.600000e-001 4.000000e-002 + vertex 2.323616e-001 4.427280e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 8.020564e-002 4.935251e-001 4.000000e-002 + vertex 2.323616e-001 4.427280e-001 4.000000e-002 + vertex 1.583340e-001 4.742682e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -4.963869e-001 -6.000000e-002 -4.000000e-002 + vertex 4.963869e-001 -6.000000e-002 -4.000000e-002 + vertex -4.995945e-001 -2.013297e-002 -4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -4.995945e-001 -2.013297e-002 -4.000000e-002 + vertex 4.963869e-001 -6.000000e-002 -4.000000e-002 + vertex 4.995945e-001 -2.013297e-002 -4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -4.995945e-001 -2.013297e-002 -4.000000e-002 + vertex 4.995945e-001 -2.013297e-002 -4.000000e-002 + vertex -4.963869e-001 6.000000e-002 -4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex -4.963869e-001 6.000000e-002 -4.000000e-002 + vertex 4.995945e-001 -2.013297e-002 -4.000000e-002 + vertex 4.963869e-001 6.000000e-002 -4.000000e-002 + endloop + endfacet + facet normal -1.293022e-016 1.000000e+000 0.000000e+000 + outer loop + vertex 4.963869e-001 -6.000000e-002 -4.000000e-002 + vertex -4.963869e-001 -6.000000e-002 -4.000000e-002 + vertex 4.963869e-001 -6.000000e-002 4.000000e-002 + endloop + endfacet + facet normal -1.293022e-016 1.000000e+000 0.000000e+000 + outer loop + vertex 4.963869e-001 -6.000000e-002 4.000000e-002 + vertex -4.963869e-001 -6.000000e-002 -4.000000e-002 + vertex -4.963869e-001 -6.000000e-002 4.000000e-002 + endloop + endfacet + facet normal 1.293022e-016 -1.000000e+000 0.000000e+000 + outer loop + vertex 2.450000e-001 6.000000e-002 4.000000e-002 + vertex -4.963869e-001 6.000000e-002 4.000000e-002 + vertex 2.450000e-001 6.000000e-002 2.000000e-002 + endloop + endfacet + facet normal 1.293022e-016 -1.000000e+000 0.000000e+000 + outer loop + vertex 2.450000e-001 6.000000e-002 2.000000e-002 + vertex -4.963869e-001 6.000000e-002 4.000000e-002 + vertex -4.963869e-001 6.000000e-002 -4.000000e-002 + endloop + endfacet + facet normal 1.293022e-016 -1.000000e+000 0.000000e+000 + outer loop + vertex 2.450000e-001 6.000000e-002 2.000000e-002 + vertex -4.963869e-001 6.000000e-002 -4.000000e-002 + vertex 2.550000e-001 6.000000e-002 2.000000e-002 + endloop + endfacet + facet normal 1.293022e-016 -1.000000e+000 0.000000e+000 + outer loop + vertex 2.550000e-001 6.000000e-002 2.000000e-002 + vertex -4.963869e-001 6.000000e-002 -4.000000e-002 + vertex 4.963869e-001 6.000000e-002 -4.000000e-002 + endloop + endfacet + facet normal 1.293022e-016 -1.000000e+000 0.000000e+000 + outer loop + vertex 2.550000e-001 6.000000e-002 2.000000e-002 + vertex 4.963869e-001 6.000000e-002 -4.000000e-002 + vertex 2.550000e-001 6.000000e-002 4.000000e-002 + endloop + endfacet + facet normal 1.293022e-016 -1.000000e+000 0.000000e+000 + outer loop + vertex 2.550000e-001 6.000000e-002 4.000000e-002 + vertex 4.963869e-001 6.000000e-002 -4.000000e-002 + vertex 4.963869e-001 6.000000e-002 4.000000e-002 + endloop + endfacet + facet normal -8.370229e-002 9.964908e-001 0.000000e+000 + outer loop + vertex 7.347881e-017 2.000000e-001 -1.800000e-001 + vertex -2.506665e-002 1.984229e-001 -1.800000e-001 + vertex -2.506665e-002 1.984229e-001 -8.000000e-002 + endloop + endfacet + facet normal -2.077190e-001 9.781886e-001 0.000000e+000 + outer loop + vertex -2.506665e-002 1.984229e-001 -8.000000e-002 + vertex -2.506665e-002 1.984229e-001 -1.800000e-001 + vertex -7.362491e-002 1.859553e-001 -1.800000e-001 + endloop + endfacet + facet normal -2.892204e-001 9.572625e-001 0.000000e+000 + outer loop + vertex -2.506665e-002 1.984229e-001 -8.000000e-002 + vertex -7.362491e-002 1.859553e-001 -1.800000e-001 + vertex -7.362491e-002 1.859553e-001 -8.000000e-002 + endloop + endfacet + facet normal -4.444587e-001 8.957993e-001 0.000000e+000 + outer loop + vertex -7.362491e-002 1.859553e-001 -8.000000e-002 + vertex -7.362491e-002 1.859553e-001 -1.800000e-001 + vertex -1.175570e-001 1.618034e-001 -1.800000e-001 + endloop + endfacet + facet normal -5.181955e-001 8.552622e-001 0.000000e+000 + outer loop + vertex -7.362491e-002 1.859553e-001 -8.000000e-002 + vertex -1.175570e-001 1.618034e-001 -1.800000e-001 + vertex -1.175570e-001 1.618034e-001 -8.000000e-002 + endloop + endfacet + facet normal -6.532714e-001 7.571238e-001 0.000000e+000 + outer loop + vertex -1.175570e-001 1.618034e-001 -8.000000e-002 + vertex -1.175570e-001 1.618034e-001 -1.800000e-001 + vertex -1.541027e-001 1.274848e-001 -1.800000e-001 + endloop + endfacet + facet normal -7.146106e-001 6.995225e-001 0.000000e+000 + outer loop + vertex -1.175570e-001 1.618034e-001 -8.000000e-002 + vertex -1.541027e-001 1.274848e-001 -1.800000e-001 + vertex -1.541027e-001 1.274848e-001 -8.000000e-002 + endloop + endfacet + facet normal -8.210368e-001 5.708753e-001 0.000000e+000 + outer loop + vertex -1.541027e-001 1.274848e-001 -8.000000e-002 + vertex -1.541027e-001 1.274848e-001 -1.800000e-001 + vertex -1.809654e-001 8.515586e-002 -1.800000e-001 + endloop + endfacet + facet normal -8.661239e-001 4.998294e-001 0.000000e+000 + outer loop + vertex -1.541027e-001 1.274848e-001 -8.000000e-002 + vertex -1.809654e-001 8.515586e-002 -1.800000e-001 + vertex -1.809654e-001 8.515586e-002 -8.000000e-002 + endloop + endfacet + facet normal -9.372133e-001 3.487567e-001 0.000000e+000 + outer loop + vertex -1.809654e-001 8.515586e-002 -8.000000e-002 + vertex -1.809654e-001 8.515586e-002 -1.800000e-001 + vertex -1.964574e-001 3.747626e-002 -1.800000e-001 + endloop + endfacet + facet normal -9.632155e-001 2.687301e-001 0.000000e+000 + outer loop + vertex -1.809654e-001 8.515586e-002 -8.000000e-002 + vertex -1.964574e-001 3.747626e-002 -1.800000e-001 + vertex -1.964574e-001 3.747626e-002 -8.000000e-002 + endloop + endfacet + facet normal -9.945013e-001 1.047244e-001 0.000000e+000 + outer loop + vertex -1.964574e-001 3.747626e-002 -8.000000e-002 + vertex -1.964574e-001 3.747626e-002 -1.800000e-001 + vertex -1.996053e-001 -1.255810e-002 -1.800000e-001 + endloop + endfacet + facet normal -9.997848e-001 2.074543e-002 0.000000e+000 + outer loop + vertex -1.964574e-001 3.747626e-002 -8.000000e-002 + vertex -1.996053e-001 -1.255810e-002 -1.800000e-001 + vertex -1.996053e-001 -1.255810e-002 -8.000000e-002 + endloop + endfacet + facet normal -9.893011e-001 -1.458881e-001 0.000000e+000 + outer loop + vertex -1.996053e-001 -1.255810e-002 -8.000000e-002 + vertex -1.996053e-001 -1.255810e-002 -1.800000e-001 + vertex -1.902113e-001 -6.180340e-002 -1.800000e-001 + endloop + endfacet + facet normal -9.735339e-001 -2.285427e-001 0.000000e+000 + outer loop + vertex -1.996053e-001 -1.255810e-002 -8.000000e-002 + vertex -1.902113e-001 -6.180340e-002 -1.800000e-001 + vertex -1.902113e-001 -6.180340e-002 -8.000000e-002 + endloop + endfacet + facet normal -9.219395e-001 -3.873340e-001 0.000000e+000 + outer loop + vertex -1.902113e-001 -6.180340e-002 -8.000000e-002 + vertex -1.902113e-001 -6.180340e-002 -1.800000e-001 + vertex -1.688656e-001 -1.071654e-001 -1.800000e-001 + endloop + endfacet + facet normal -8.861123e-001 -4.634706e-001 0.000000e+000 + outer loop + vertex -1.902113e-001 -6.180340e-002 -8.000000e-002 + vertex -1.688656e-001 -1.071654e-001 -1.800000e-001 + vertex -1.688656e-001 -1.071654e-001 -8.000000e-002 + endloop + endfacet + facet normal -7.966490e-001 -6.044421e-001 0.000000e+000 + outer loop + vertex -1.688656e-001 -1.071654e-001 -8.000000e-002 + vertex -1.688656e-001 -1.071654e-001 -1.800000e-001 + vertex -1.369094e-001 -1.457937e-001 -1.800000e-001 + endloop + endfacet + facet normal -7.430130e-001 -6.692770e-001 0.000000e+000 + outer loop + vertex -1.688656e-001 -1.071654e-001 -8.000000e-002 + vertex -1.369094e-001 -1.457937e-001 -1.800000e-001 + vertex -1.369094e-001 -1.457937e-001 -8.000000e-002 + endloop + endfacet + facet normal -6.213022e-001 -7.835710e-001 0.000000e+000 + outer loop + vertex -1.369094e-001 -1.457937e-001 -8.000000e-002 + vertex -1.369094e-001 -1.457937e-001 -1.800000e-001 + vertex -9.635074e-002 -1.752613e-001 -1.800000e-001 + endloop + endfacet + facet normal -5.532274e-001 -8.330302e-001 0.000000e+000 + outer loop + vertex -1.369094e-001 -1.457937e-001 -8.000000e-002 + vertex -9.635074e-002 -1.752613e-001 -1.800000e-001 + vertex -9.635074e-002 -1.752613e-001 -8.000000e-002 + endloop + endfacet + facet normal -4.069166e-001 -9.134653e-001 0.000000e+000 + outer loop + vertex -9.635074e-002 -1.752613e-001 -8.000000e-002 + vertex -9.635074e-002 -1.752613e-001 -1.800000e-001 + vertex -4.973798e-002 -1.937166e-001 -1.800000e-001 + endloop + endfacet + facet normal -3.286806e-001 -9.444411e-001 0.000000e+000 + outer loop + vertex -9.635074e-002 -1.752613e-001 -8.000000e-002 + vertex -4.973798e-002 -1.937166e-001 -1.800000e-001 + vertex -4.973798e-002 -1.937166e-001 -8.000000e-002 + endloop + endfacet + facet normal -1.669630e-001 -9.859632e-001 0.000000e+000 + outer loop + vertex -4.973798e-002 -1.937166e-001 -8.000000e-002 + vertex -4.973798e-002 -1.937166e-001 -1.800000e-001 + vertex 0.000000e+000 -2.000000e-001 -1.800000e-001 + endloop + endfacet + facet normal -8.348151e-002 -9.965093e-001 0.000000e+000 + outer loop + vertex -4.973798e-002 -1.937166e-001 -8.000000e-002 + vertex 0.000000e+000 -2.000000e-001 -1.800000e-001 + vertex 0.000000e+000 -2.000000e-001 -8.000000e-002 + endloop + endfacet + facet normal 8.348151e-002 -9.965093e-001 0.000000e+000 + outer loop + vertex 0.000000e+000 -2.000000e-001 -8.000000e-002 + vertex 0.000000e+000 -2.000000e-001 -1.800000e-001 + vertex 4.973798e-002 -1.937166e-001 -1.800000e-001 + endloop + endfacet + facet normal 1.669630e-001 -9.859632e-001 0.000000e+000 + outer loop + vertex 0.000000e+000 -2.000000e-001 -8.000000e-002 + vertex 4.973798e-002 -1.937166e-001 -1.800000e-001 + vertex 4.973798e-002 -1.937166e-001 -8.000000e-002 + endloop + endfacet + facet normal 3.286806e-001 -9.444411e-001 0.000000e+000 + outer loop + vertex 4.973798e-002 -1.937166e-001 -8.000000e-002 + vertex 4.973798e-002 -1.937166e-001 -1.800000e-001 + vertex 9.635074e-002 -1.752613e-001 -1.800000e-001 + endloop + endfacet + facet normal 4.069166e-001 -9.134653e-001 0.000000e+000 + outer loop + vertex 4.973798e-002 -1.937166e-001 -8.000000e-002 + vertex 9.635074e-002 -1.752613e-001 -1.800000e-001 + vertex 9.635074e-002 -1.752613e-001 -8.000000e-002 + endloop + endfacet + facet normal 5.532274e-001 -8.330302e-001 0.000000e+000 + outer loop + vertex 9.635074e-002 -1.752613e-001 -8.000000e-002 + vertex 9.635074e-002 -1.752613e-001 -1.800000e-001 + vertex 1.369094e-001 -1.457937e-001 -1.800000e-001 + endloop + endfacet + facet normal 6.213022e-001 -7.835710e-001 0.000000e+000 + outer loop + vertex 9.635074e-002 -1.752613e-001 -8.000000e-002 + vertex 1.369094e-001 -1.457937e-001 -1.800000e-001 + vertex 1.369094e-001 -1.457937e-001 -8.000000e-002 + endloop + endfacet + facet normal 7.430130e-001 -6.692770e-001 0.000000e+000 + outer loop + vertex 1.369094e-001 -1.457937e-001 -8.000000e-002 + vertex 1.369094e-001 -1.457937e-001 -1.800000e-001 + vertex 1.688656e-001 -1.071654e-001 -1.800000e-001 + endloop + endfacet + facet normal 7.966490e-001 -6.044421e-001 0.000000e+000 + outer loop + vertex 1.369094e-001 -1.457937e-001 -8.000000e-002 + vertex 1.688656e-001 -1.071654e-001 -1.800000e-001 + vertex 1.688656e-001 -1.071654e-001 -8.000000e-002 + endloop + endfacet + facet normal 8.861123e-001 -4.634706e-001 0.000000e+000 + outer loop + vertex 1.688656e-001 -1.071654e-001 -8.000000e-002 + vertex 1.688656e-001 -1.071654e-001 -1.800000e-001 + vertex 1.902113e-001 -6.180340e-002 -1.800000e-001 + endloop + endfacet + facet normal 9.219395e-001 -3.873340e-001 0.000000e+000 + outer loop + vertex 1.688656e-001 -1.071654e-001 -8.000000e-002 + vertex 1.902113e-001 -6.180340e-002 -1.800000e-001 + vertex 1.902113e-001 -6.180340e-002 -8.000000e-002 + endloop + endfacet + facet normal 9.735339e-001 -2.285427e-001 0.000000e+000 + outer loop + vertex 1.902113e-001 -6.180340e-002 -8.000000e-002 + vertex 1.902113e-001 -6.180340e-002 -1.800000e-001 + vertex 1.996053e-001 -1.255810e-002 -1.800000e-001 + endloop + endfacet + facet normal 9.893011e-001 -1.458881e-001 0.000000e+000 + outer loop + vertex 1.902113e-001 -6.180340e-002 -8.000000e-002 + vertex 1.996053e-001 -1.255810e-002 -1.800000e-001 + vertex 1.996053e-001 -1.255810e-002 -8.000000e-002 + endloop + endfacet + facet normal 9.997848e-001 2.074543e-002 0.000000e+000 + outer loop + vertex 1.996053e-001 -1.255810e-002 -8.000000e-002 + vertex 1.996053e-001 -1.255810e-002 -1.800000e-001 + vertex 1.964574e-001 3.747626e-002 -1.800000e-001 + endloop + endfacet + facet normal 9.945013e-001 1.047244e-001 0.000000e+000 + outer loop + vertex 1.996053e-001 -1.255810e-002 -8.000000e-002 + vertex 1.964574e-001 3.747626e-002 -1.800000e-001 + vertex 1.964574e-001 3.747626e-002 -8.000000e-002 + endloop + endfacet + facet normal 9.632155e-001 2.687300e-001 0.000000e+000 + outer loop + vertex 1.964574e-001 3.747626e-002 -8.000000e-002 + vertex 1.964574e-001 3.747626e-002 -1.800000e-001 + vertex 1.809654e-001 8.515586e-002 -1.800000e-001 + endloop + endfacet + facet normal 9.372133e-001 3.487567e-001 0.000000e+000 + outer loop + vertex 1.964574e-001 3.747626e-002 -8.000000e-002 + vertex 1.809654e-001 8.515586e-002 -1.800000e-001 + vertex 1.809654e-001 8.515586e-002 -8.000000e-002 + endloop + endfacet + facet normal 8.661239e-001 4.998294e-001 0.000000e+000 + outer loop + vertex 1.809654e-001 8.515586e-002 -8.000000e-002 + vertex 1.809654e-001 8.515586e-002 -1.800000e-001 + vertex 1.541027e-001 1.274848e-001 -1.800000e-001 + endloop + endfacet + facet normal 8.210368e-001 5.708753e-001 0.000000e+000 + outer loop + vertex 1.809654e-001 8.515586e-002 -8.000000e-002 + vertex 1.541027e-001 1.274848e-001 -1.800000e-001 + vertex 1.541027e-001 1.274848e-001 -8.000000e-002 + endloop + endfacet + facet normal 7.146106e-001 6.995225e-001 0.000000e+000 + outer loop + vertex 1.541027e-001 1.274848e-001 -8.000000e-002 + vertex 1.541027e-001 1.274848e-001 -1.800000e-001 + vertex 1.175570e-001 1.618034e-001 -1.800000e-001 + endloop + endfacet + facet normal 6.532714e-001 7.571238e-001 0.000000e+000 + outer loop + vertex 1.541027e-001 1.274848e-001 -8.000000e-002 + vertex 1.175570e-001 1.618034e-001 -1.800000e-001 + vertex 1.175570e-001 1.618034e-001 -8.000000e-002 + endloop + endfacet + facet normal 5.181955e-001 8.552622e-001 0.000000e+000 + outer loop + vertex 1.175570e-001 1.618034e-001 -8.000000e-002 + vertex 1.175570e-001 1.618034e-001 -1.800000e-001 + vertex 7.362491e-002 1.859553e-001 -1.800000e-001 + endloop + endfacet + facet normal 4.444587e-001 8.957993e-001 0.000000e+000 + outer loop + vertex 1.175570e-001 1.618034e-001 -8.000000e-002 + vertex 7.362491e-002 1.859553e-001 -1.800000e-001 + vertex 7.362491e-002 1.859553e-001 -8.000000e-002 + endloop + endfacet + facet normal 2.892204e-001 9.572625e-001 0.000000e+000 + outer loop + vertex 7.362491e-002 1.859553e-001 -8.000000e-002 + vertex 7.362491e-002 1.859553e-001 -1.800000e-001 + vertex 2.506665e-002 1.984229e-001 -1.800000e-001 + endloop + endfacet + facet normal 2.077190e-001 9.781886e-001 0.000000e+000 + outer loop + vertex 7.362491e-002 1.859553e-001 -8.000000e-002 + vertex 2.506665e-002 1.984229e-001 -1.800000e-001 + vertex 2.506665e-002 1.984229e-001 -8.000000e-002 + endloop + endfacet + facet normal 8.370229e-002 9.964908e-001 0.000000e+000 + outer loop + vertex 2.506665e-002 1.984229e-001 -8.000000e-002 + vertex 2.506665e-002 1.984229e-001 -1.800000e-001 + vertex 7.347881e-017 2.000000e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 1.000000e+000 0.000000e+000 + outer loop + vertex 2.506665e-002 1.984229e-001 -8.000000e-002 + vertex 7.347881e-017 2.000000e-001 -1.800000e-001 + vertex -2.506665e-002 1.984229e-001 -8.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.996053e-001 -1.255810e-002 -1.800000e-001 + vertex -1.964574e-001 3.747626e-002 -1.800000e-001 + vertex -1.902113e-001 -6.180340e-002 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.902113e-001 -6.180340e-002 -1.800000e-001 + vertex -1.964574e-001 3.747626e-002 -1.800000e-001 + vertex -1.809654e-001 8.515586e-002 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.902113e-001 -6.180340e-002 -1.800000e-001 + vertex -1.809654e-001 8.515586e-002 -1.800000e-001 + vertex -1.688656e-001 -1.071654e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.688656e-001 -1.071654e-001 -1.800000e-001 + vertex -1.809654e-001 8.515586e-002 -1.800000e-001 + vertex -1.541027e-001 1.274848e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.688656e-001 -1.071654e-001 -1.800000e-001 + vertex -1.541027e-001 1.274848e-001 -1.800000e-001 + vertex -1.369094e-001 -1.457937e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.369094e-001 -1.457937e-001 -1.800000e-001 + vertex -1.541027e-001 1.274848e-001 -1.800000e-001 + vertex -1.175570e-001 1.618034e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -1.369094e-001 -1.457937e-001 -1.800000e-001 + vertex -1.175570e-001 1.618034e-001 -1.800000e-001 + vertex -9.635074e-002 -1.752613e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -9.635074e-002 -1.752613e-001 -1.800000e-001 + vertex -1.175570e-001 1.618034e-001 -1.800000e-001 + vertex -7.362491e-002 1.859553e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -9.635074e-002 -1.752613e-001 -1.800000e-001 + vertex -7.362491e-002 1.859553e-001 -1.800000e-001 + vertex -4.973798e-002 -1.937166e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -4.973798e-002 -1.937166e-001 -1.800000e-001 + vertex -7.362491e-002 1.859553e-001 -1.800000e-001 + vertex -2.506665e-002 1.984229e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -4.973798e-002 -1.937166e-001 -1.800000e-001 + vertex -2.506665e-002 1.984229e-001 -1.800000e-001 + vertex 0.000000e+000 -2.000000e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex -2.506665e-002 1.984229e-001 -1.800000e-001 + vertex 2.449294e-017 2.000000e-001 -1.800000e-001 + vertex 0.000000e+000 -2.000000e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 0.000000e+000 -2.000000e-001 -1.800000e-001 + vertex 2.449294e-017 2.000000e-001 -1.800000e-001 + vertex 2.506665e-002 1.984229e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 0.000000e+000 -2.000000e-001 -1.800000e-001 + vertex 2.506665e-002 1.984229e-001 -1.800000e-001 + vertex 4.973798e-002 -1.937166e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 4.973798e-002 -1.937166e-001 -1.800000e-001 + vertex 2.506665e-002 1.984229e-001 -1.800000e-001 + vertex 7.362491e-002 1.859553e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 4.973798e-002 -1.937166e-001 -1.800000e-001 + vertex 7.362491e-002 1.859553e-001 -1.800000e-001 + vertex 9.635074e-002 -1.752613e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 9.635074e-002 -1.752613e-001 -1.800000e-001 + vertex 7.362491e-002 1.859553e-001 -1.800000e-001 + vertex 1.175570e-001 1.618034e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 9.635074e-002 -1.752613e-001 -1.800000e-001 + vertex 1.175570e-001 1.618034e-001 -1.800000e-001 + vertex 1.369094e-001 -1.457937e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.369094e-001 -1.457937e-001 -1.800000e-001 + vertex 1.175570e-001 1.618034e-001 -1.800000e-001 + vertex 1.541027e-001 1.274848e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.369094e-001 -1.457937e-001 -1.800000e-001 + vertex 1.541027e-001 1.274848e-001 -1.800000e-001 + vertex 1.688656e-001 -1.071654e-001 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.688656e-001 -1.071654e-001 -1.800000e-001 + vertex 1.541027e-001 1.274848e-001 -1.800000e-001 + vertex 1.809654e-001 8.515586e-002 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.688656e-001 -1.071654e-001 -1.800000e-001 + vertex 1.809654e-001 8.515586e-002 -1.800000e-001 + vertex 1.902113e-001 -6.180340e-002 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.902113e-001 -6.180340e-002 -1.800000e-001 + vertex 1.809654e-001 8.515586e-002 -1.800000e-001 + vertex 1.964574e-001 3.747626e-002 -1.800000e-001 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 -1.000000e+000 + outer loop + vertex 1.902113e-001 -6.180340e-002 -1.800000e-001 + vertex 1.964574e-001 3.747626e-002 -1.800000e-001 + vertex 1.996053e-001 -1.255810e-002 -1.800000e-001 + endloop + endfacet + facet normal -1.000000e+000 0.000000e+000 0.000000e+000 + outer loop + vertex 2.550000e-001 1.600000e-001 2.000000e-002 + vertex 2.550000e-001 6.000000e-002 2.000000e-002 + vertex 2.550000e-001 1.600000e-001 4.000000e-002 + endloop + endfacet + facet normal -1.000000e+000 0.000000e+000 0.000000e+000 + outer loop + vertex 2.550000e-001 1.600000e-001 4.000000e-002 + vertex 2.550000e-001 6.000000e-002 2.000000e-002 + vertex 2.550000e-001 6.000000e-002 4.000000e-002 + endloop + endfacet + facet normal 1.000000e+000 0.000000e+000 0.000000e+000 + outer loop + vertex 2.450000e-001 6.000000e-002 2.000000e-002 + vertex 2.450000e-001 1.600000e-001 2.000000e-002 + vertex 2.450000e-001 6.000000e-002 4.000000e-002 + endloop + endfacet + facet normal 1.000000e+000 0.000000e+000 0.000000e+000 + outer loop + vertex 2.450000e-001 6.000000e-002 4.000000e-002 + vertex 2.450000e-001 1.600000e-001 2.000000e-002 + vertex 2.450000e-001 1.600000e-001 4.000000e-002 + endloop + endfacet + facet normal -2.775558e-015 -1.000000e+000 0.000000e+000 + outer loop + vertex 2.450000e-001 1.600000e-001 2.000000e-002 + vertex 2.550000e-001 1.600000e-001 2.000000e-002 + vertex 2.450000e-001 1.600000e-001 4.000000e-002 + endloop + endfacet + facet normal -2.775558e-015 -1.000000e+000 0.000000e+000 + outer loop + vertex 2.450000e-001 1.600000e-001 4.000000e-002 + vertex 2.550000e-001 1.600000e-001 2.000000e-002 + vertex 2.550000e-001 1.600000e-001 4.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.450000e-001 1.600000e-001 2.000000e-002 + vertex 2.450000e-001 6.000000e-002 2.000000e-002 + vertex 2.550000e-001 1.600000e-001 2.000000e-002 + endloop + endfacet + facet normal 0.000000e+000 0.000000e+000 1.000000e+000 + outer loop + vertex 2.550000e-001 1.600000e-001 2.000000e-002 + vertex 2.450000e-001 6.000000e-002 2.000000e-002 + vertex 2.550000e-001 6.000000e-002 2.000000e-002 + endloop + endfacet +endsolid \ No newline at end of file diff --git a/packages/experiments-realm/model-samples/three-mf-complex.3mf b/packages/experiments-realm/model-samples/three-mf-complex.3mf new file mode 100644 index 00000000000..28a325bc028 Binary files /dev/null and b/packages/experiments-realm/model-samples/three-mf-complex.3mf differ diff --git a/packages/experiments-realm/model-samples/three-mf-moderate.3mf b/packages/experiments-realm/model-samples/three-mf-moderate.3mf new file mode 100644 index 00000000000..68cc5d4c4c2 Binary files /dev/null and b/packages/experiments-realm/model-samples/three-mf-moderate.3mf differ diff --git a/packages/experiments-realm/model-samples/three-mf-simple.3mf b/packages/experiments-realm/model-samples/three-mf-simple.3mf new file mode 100644 index 00000000000..6480fd1e459 Binary files /dev/null and b/packages/experiments-realm/model-samples/three-mf-simple.3mf differ diff --git a/packages/host/tests/acceptance/model-file-extract-test.gts b/packages/host/tests/acceptance/model-file-extract-test.gts index 728a2bdb14e..90428d36573 100644 --- a/packages/host/tests/acceptance/model-file-extract-test.gts +++ b/packages/host/tests/acceptance/model-file-extract-test.gts @@ -44,6 +44,28 @@ const CUBE_STL = [ 'endsolid testcube', ].join('\n'); +// A minimal glTF 2.0 document whose header enumerates every fact the extractor +// projects: one triangulated mesh (24 vertices, 36 indices), bounds spanning +// 2 x 4 x 6, and a named generator. +const CUBE_GLTF = JSON.stringify({ + asset: { version: '2.0', generator: 'Test Exporter 1.0' }, + meshes: [ + { primitives: [{ attributes: { POSITION: 0 }, indices: 1, mode: 4 }] }, + ], + accessors: [ + { + type: 'VEC3', + componentType: 5126, + count: 24, + min: [-1, -2, -3], + max: [1, 2, 3], + }, + { type: 'SCALAR', componentType: 5123, count: 36 }, + ], + materials: [{}, {}], + nodes: [{}, {}, {}], +}); + const CUBE_MODEL_XML = ` Round-trip Cube @@ -89,10 +111,15 @@ module('Acceptance | model file-extract', function (hooks) { JSON.stringify(renderOptions), )}/file-extract`; + const MODULE_BY_DEF: Record = { + StlDef: 'stl-model-def', + ThreeMfDef: 'three-mf-def', + GltfDef: 'gltf-model-def', + GlbDef: 'gltf-model-def', + }; + const baseFileDefCodeRef = (name: string): ResolvedCodeRef => ({ - module: `${baseRealm.url}${ - name === 'StlDef' ? 'stl-model-def' : 'three-mf-def' - }` as RealmResourceIdentifier, + module: `${baseRealm.url}${MODULE_BY_DEF[name]}` as RealmResourceIdentifier, name, }); @@ -134,6 +161,7 @@ module('Acceptance | model file-extract', function (hooks) { ...SYSTEM_CARD_FIXTURE_CONTENTS, 'cube.stl': CUBE_STL, 'cube.3mf': CUBE_3MF, + 'cube.gltf': CUBE_GLTF, 'notmodel.stl': 'this is not an STL file', }, }); @@ -191,6 +219,33 @@ module('Acceptance | model file-extract', function (hooks) { ); }); + test('extracts glTF facts onto model3d through the render route', async function (assert) { + await visit( + renderPath(fileURL('cube.gltf'), { + fileExtract: true, + fileDefCodeRef: baseFileDefCodeRef('GltfDef'), + }), + ); + let result = await captureFileExtractResult('ready'); + let doc = result.searchDoc as Record; + assert.strictEqual(result.status, 'ready'); + // Container label folds in the asset version. + assert.strictEqual(doc?.model3d?.format, 'glTF JSON 2.0'); + assert.strictEqual(doc?.model3d?.generator, 'Test Exporter 1.0'); + // Unlike STL/3MF, a glTF header enumerates its scene graph directly, so + // geometry facts are honest header-only answers. + assert.strictEqual(doc?.model3d?.meshes, 1); + assert.strictEqual(doc?.model3d?.vertices, 24, 'POSITION accessor count'); + assert.strictEqual(doc?.model3d?.triangles, 12, '36 indices / 3'); + assert.strictEqual(doc?.model3d?.materials, 2); + assert.strictEqual(doc?.model3d?.nodes, 3); + assert.strictEqual( + doc?.model3d?.dimensions, + '2 \u00d7 4 \u00d7 6', + 'max minus min per axis', + ); + }); + test('a .stl whose bytes are not STL falls back and marks mismatch', async function (assert) { await visit( renderPath(fileURL('notmodel.stl'), { diff --git a/packages/host/tests/unit/file-def-code-ref-test.ts b/packages/host/tests/unit/file-def-code-ref-test.ts index ed58c17aec2..209d8af3b7d 100644 --- a/packages/host/tests/unit/file-def-code-ref-test.ts +++ b/packages/host/tests/unit/file-def-code-ref-test.ts @@ -73,6 +73,20 @@ module('Unit | isFileDefCodeRef', function (hooks) { ), 'ThreeMfDef', ); + assert.true( + isFileDefCodeRef( + { module: baseRRI('gltf-model-def'), name: 'GltfDef' }, + virtualNetwork, + ), + 'GltfDef', + ); + assert.true( + isFileDefCodeRef( + { module: baseRRI('gltf-model-def'), name: 'GlbDef' }, + virtualNetwork, + ), + 'GlbDef', + ); assert.true( isFileDefCodeRef( { module: baseRRI('pdf-file-def'), name: 'PdfDef' }, diff --git a/packages/host/tests/unit/model-meta-extractor-test.ts b/packages/host/tests/unit/model-meta-extractor-test.ts index c4a8c78d6dc..e8479311fae 100644 --- a/packages/host/tests/unit/model-meta-extractor-test.ts +++ b/packages/host/tests/unit/model-meta-extractor-test.ts @@ -1,3 +1,4 @@ +import { parseGltf } from '@cardstack/base/gltf-meta-extractor'; import { parseStl } from '@cardstack/base/stl-meta-extractor'; import { parseThreeMf } from '@cardstack/base/three-mf-meta-extractor'; import { zipSync, strToU8 } from 'fflate'; @@ -238,3 +239,124 @@ module('Unit | model metadata extractors | parseThreeMf', function () { ); }); }); + +// A glTF document with one indexed triangle mesh: 24 vertices, a 36-index +// (12-triangle) buffer, and a POSITION bounding box of 2 × 4 × 6. +const SAMPLE_GLTF = { + asset: { version: '2.0', generator: 'Test Exporter 1.0' }, + meshes: [ + { primitives: [{ attributes: { POSITION: 0 }, indices: 1, mode: 4 }] }, + ], + accessors: [ + { + type: 'VEC3', + componentType: 5126, + count: 24, + min: [-1, -2, -3], + max: [1, 2, 3], + }, + { type: 'SCALAR', componentType: 5123, count: 36 }, + ], + materials: [{}, {}], + nodes: [{}, {}, {}], + animations: [{}], + textures: [{}], +}; + +function gltfJson(doc: object): ArrayBuffer { + return toArrayBuffer(new TextEncoder().encode(JSON.stringify(doc))); +} + +// Wrap a glTF document in a binary GLB container: the 12-byte header followed by +// a single JSON chunk (padded to a 4-byte boundary with spaces, per spec). +function buildGlb(doc: object): ArrayBuffer { + let jsonBytes = new TextEncoder().encode(JSON.stringify(doc)); + let pad = (4 - (jsonBytes.length % 4)) % 4; + let chunkLength = jsonBytes.length + pad; + let total = 12 + 8 + chunkLength; + let buf = new ArrayBuffer(total); + let view = new DataView(buf); + let bytes = new Uint8Array(buf); + view.setUint32(0, 0x46546c67, true); // 'glTF' + view.setUint32(4, 2, true); // version 2 + view.setUint32(8, total, true); // total length + view.setUint32(12, chunkLength, true); // JSON chunk length + view.setUint32(16, 0x4e4f534a, true); // 'JSON' + bytes.set(jsonBytes, 20); + for (let i = 0; i < pad; i++) { + bytes[20 + jsonBytes.length + i] = 0x20; // space padding + } + return buf; +} + +module('Unit | model metadata extractors | parseGltf', function () { + test('reads counts and bounds from a .gltf JSON document', function (assert) { + let parsed = parseGltf(gltfJson(SAMPLE_GLTF)); + let g = parsed?.gltfMetadata; + assert.strictEqual(g?.container, 'gltf'); + assert.strictEqual(g?.gltfVersion, '2.0'); + assert.strictEqual(g?.generator, 'Test Exporter 1.0'); + assert.strictEqual(g?.vertexCount, 24, 'POSITION accessor count'); + assert.strictEqual(g?.triangleCount, 12, '36 indices / 3'); + assert.strictEqual(g?.dimensions, '2 × 4 × 6', 'max minus min per axis'); + assert.strictEqual(g?.meshCount, 1); + assert.strictEqual(g?.materialCount, 2); + assert.strictEqual(g?.nodeCount, 3); + assert.strictEqual(g?.animationCount, 1); + assert.strictEqual(g?.textureCount, 1); + }); + + test('reads the same facts from a .glb binary container', function (assert) { + let parsed = parseGltf(buildGlb(SAMPLE_GLTF)); + let g = parsed?.gltfMetadata; + assert.strictEqual(g?.container, 'glb', 'detected the GLB magic'); + assert.strictEqual(g?.vertexCount, 24); + assert.strictEqual(g?.triangleCount, 12); + assert.strictEqual(g?.dimensions, '2 × 4 × 6'); + }); + + test('counts triangles from POSITION when a primitive is not indexed', function (assert) { + let parsed = parseGltf( + gltfJson({ + asset: { version: '2.0' }, + meshes: [{ primitives: [{ attributes: { POSITION: 0 }, mode: 4 }] }], + accessors: [{ type: 'VEC3', count: 9 }], + }), + ); + assert.strictEqual(parsed?.gltfMetadata.vertexCount, 9); + assert.strictEqual(parsed?.gltfMetadata.triangleCount, 3, '9 vertices / 3'); + }); + + test('honors triangle-strip topology', function (assert) { + let parsed = parseGltf( + gltfJson({ + asset: { version: '2.0' }, + meshes: [{ primitives: [{ attributes: { POSITION: 0 }, mode: 5 }] }], + accessors: [{ type: 'VEC3', count: 6 }], + }), + ); + assert.strictEqual( + parsed?.gltfMetadata.triangleCount, + 4, + 'strip: count - 2', + ); + }); + + test('returns undefined for non-glTF content', function (assert) { + assert.strictEqual( + parseGltf(toArrayBuffer(new TextEncoder().encode('not a model'))), + undefined, + 'random text', + ); + assert.strictEqual( + parseGltf(gltfJson({ hello: 'world' })), + undefined, + 'JSON without an asset object', + ); + assert.strictEqual( + parseGltf(new ArrayBuffer(0)), + undefined, + 'empty buffer', + ); + }); +}); diff --git a/packages/runtime-common/file-def-code-ref.ts b/packages/runtime-common/file-def-code-ref.ts index 929ddf0ac11..1a8e6da61cf 100644 --- a/packages/runtime-common/file-def-code-ref.ts +++ b/packages/runtime-common/file-def-code-ref.ts @@ -55,10 +55,13 @@ const FILEDEF_CODE_REF_BY_EXTENSION: Record = { '.m4v': { module: baseModule('mp4-video-def'), name: 'Mp4Def' }, '.mov': { module: baseModule('mov-video-def'), name: 'MovDef' }, '.webm': { module: baseModule('webm-video-def'), name: 'WebmDef' }, - // 3D model formats. STL is raw triangle geometry; 3MF is a zipped OPC package. - // Both extend ThreeDModelDef, which renders a live client-side WebGL viewer. + // 3D model formats. STL is raw triangle geometry; 3MF is a zipped OPC + // package; GLB/glTF are the binary and JSON forms of the same scene format. + // All extend ThreeDModelDef, which renders a live client-side WebGL viewer. '.stl': { module: baseModule('stl-model-def'), name: 'StlDef' }, '.3mf': { module: baseModule('three-mf-def'), name: 'ThreeMfDef' }, + '.glb': { module: baseModule('gltf-model-def'), name: 'GlbDef' }, + '.gltf': { module: baseModule('gltf-model-def'), name: 'GltfDef' }, '.zip': { module: baseModule('zip-file-def'), name: 'ZipDef' }, '.woff2': { module: baseModule('woff2-font-def'), name: 'Woff2Def' }, '.woff': { module: baseModule('woff-font-def'), name: 'WoffDef' },