From b53104766beedd0a39663a3166fa8add4c98b33e Mon Sep 17 00:00:00 2001 From: Joshua Simmons Date: Sat, 12 Nov 2022 21:46:24 +0100 Subject: [PATCH] =?utf8?q?bl=C3=A5haj=20bring=20up=20=F0=9F=A6=88?= =?utf8?q?=F0=9F=A6=88=F0=9F=A6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- narcissus-gpu/src/lib.rs | 119 +- narcissus-gpu/src/vulkan.rs | 232 ++- "narcissus/data/bl\303\245haj.obj" | 1694 +++++++++-------- narcissus/src/main.rs | 404 ++-- .../{triangle.frag.glsl => basic.frag.glsl} | 2 +- narcissus/src/shaders/basic.frag.spv | Bin 0 -> 432 bytes narcissus/src/shaders/basic.vert.glsl | 24 + narcissus/src/shaders/basic.vert.spv | Bin 0 -> 1416 bytes narcissus/src/shaders/build.sh | 4 + narcissus/src/shaders/triangle.frag.spv | Bin 572 -> 0 bytes narcissus/src/shaders/triangle.vert.glsl | 26 - narcissus/src/shaders/triangle.vert.spv | Bin 1924 -> 0 bytes 12 files changed, 1593 insertions(+), 912 deletions(-) rename narcissus/src/shaders/{triangle.frag.glsl => basic.frag.glsl} (91%) create mode 100644 narcissus/src/shaders/basic.frag.spv create mode 100644 narcissus/src/shaders/basic.vert.glsl create mode 100644 narcissus/src/shaders/basic.vert.spv create mode 100755 narcissus/src/shaders/build.sh delete mode 100644 narcissus/src/shaders/triangle.frag.spv delete mode 100644 narcissus/src/shaders/triangle.vert.glsl delete mode 100644 narcissus/src/shaders/triangle.vert.spv diff --git a/narcissus-gpu/src/lib.rs b/narcissus-gpu/src/lib.rs index 86263f1..bcd5821 100644 --- a/narcissus-gpu/src/lib.rs +++ b/narcissus-gpu/src/lib.rs @@ -5,7 +5,7 @@ use narcissus_core::{flags_def, thread_token_def, Handle, PhantomUnsend}; mod vulkan; -#[derive(Clone, Copy, PartialEq, Eq, Hash)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, Default)] pub struct Texture(Handle); #[derive(Clone, Copy, PartialEq, Eq, Hash)] @@ -68,6 +68,7 @@ pub enum TextureFormat { BGRA8_UNORM, RGBA8_SRGB, RGBA8_UNORM, + DEPTH_F32, } flags_def!(TextureUsageFlags); @@ -154,6 +155,84 @@ pub struct SamplerDesc { pub max_lod: f32, } +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum Topology { + Points = 0, + Lines = 1, + LineStrip = 2, + Triangles = 3, + TriangleStrip = 4, +} + +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum PolygonMode { + Fill, + Line, + Point, +} + +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum CullingMode { + None, + Front, + Back, +} + +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum FrontFace { + Clockwise, + CounterClockwise, +} + +#[derive(Copy, Clone, PartialEq, Eq)] +pub enum CompareOp { + Never, + Less, + Equal, + LessOrEqual, + Greater, + NotEqual, + GreaterOrEqual, + Always, +} + +#[derive(Copy, Clone, PartialEq, Eq)] +pub enum StencilOp { + Keep, + Zero, + Replace, + IncrementAndClamp, + DecrementAndClamp, + Invert, + IncrementAndWrap, + DecrementAndWrap, +} + +#[derive(Clone, Copy)] +pub struct StencilOpState { + pub fail_op: StencilOp, + pub pass_op: StencilOp, + pub depth_fail_op: StencilOp, + pub compare_op: CompareOp, + pub compare_mask: u32, + pub write_mask: u32, + pub reference: u32, +} + +impl Default for StencilOpState { + fn default() -> Self { + Self { + fail_op: StencilOp::Keep, + pass_op: StencilOp::Keep, + depth_fail_op: StencilOp::Keep, + compare_op: CompareOp::Never, + compare_mask: 0, + write_mask: 0, + reference: 0, + } + } +} + pub struct GraphicsPipelineLayout<'a> { pub color_attachment_formats: &'a [TextureFormat], pub depth_attachment_format: Option, @@ -165,6 +244,16 @@ pub struct GraphicsPipelineDesc<'a> { pub fragment_shader: ShaderDesc<'a>, pub bind_group_layouts: &'a [BindGroupLayout], pub layout: GraphicsPipelineLayout<'a>, + pub topology: Topology, + pub polygon_mode: PolygonMode, + pub culling_mode: CullingMode, + pub front_face: FrontFace, + pub depth_compare_op: CompareOp, + pub depth_test_enable: bool, + pub depth_write_enable: bool, + pub stencil_test_enable: bool, + pub stencil_back: StencilOpState, + pub stencil_front: StencilOpState, } pub struct ComputePipelineDesc<'a> { @@ -208,6 +297,12 @@ pub struct RenderingDesc<'a> { pub stencil_attachment: Option, } +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum IndexType { + U16, + U32, +} + #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum BindingType { Sampler, @@ -238,7 +333,8 @@ pub struct Bind<'a> { pub enum TypedBind<'a> { Sampler(&'a [Sampler]), Texture(&'a [Texture]), - Buffer(&'a [Buffer]), + UniformBuffer(&'a [Buffer]), + StorageBuffer(&'a [Buffer]), } thread_token_def!(ThreadToken, GpuConcurrent, 8); @@ -314,6 +410,14 @@ pub trait Device { bindings: &[Bind], ); + fn cmd_set_index_buffer( + &self, + command_buffer_token: &CommandBufferToken, + buffer: Buffer, + offset: u64, + index_type: IndexType, + ); + fn cmd_set_pipeline(&self, command_buffer_token: &CommandBufferToken, pipeline: Pipeline); fn cmd_begin_rendering( @@ -327,6 +431,7 @@ pub trait Device { fn cmd_end_rendering(&self, command_buffer_token: &CommandBufferToken); fn cmd_set_viewports(&self, command_buffer_token: &CommandBufferToken, viewports: &[Viewport]); + fn cmd_set_scissors(&self, command_buffer_token: &CommandBufferToken, scissors: &[Scissor]); fn cmd_draw( @@ -338,6 +443,16 @@ pub trait Device { first_instance: u32, ); + fn cmd_draw_indexed( + &self, + command_buffer_token: &CommandBufferToken, + index_count: u32, + instance_count: u32, + first_index: u32, + vertex_offset: i32, + first_instance: u32, + ); + fn submit( &self, frame_token: &FrameToken, diff --git a/narcissus-gpu/src/vulkan.rs b/narcissus-gpu/src/vulkan.rs index 76413c7..3b03628 100644 --- a/narcissus-gpu/src/vulkan.rs +++ b/narcissus-gpu/src/vulkan.rs @@ -15,10 +15,12 @@ use vulkan_sys as vk; use crate::{ Bind, BindGroupLayout, BindGroupLayoutDesc, BindingType, Buffer, BufferDesc, BufferUsageFlags, - ClearValue, CommandBufferToken, ComputePipelineDesc, Device, FrameToken, GpuConcurrent, - GraphicsPipelineDesc, LoadOp, MemoryLocation, Pipeline, Sampler, SamplerAddressMode, - SamplerCompareOp, SamplerDesc, SamplerFilter, ShaderStageFlags, Texture, TextureDesc, - TextureDimension, TextureFormat, TextureUsageFlags, TextureViewDesc, ThreadToken, TypedBind, + ClearValue, CommandBufferToken, CompareOp, ComputePipelineDesc, CullingMode, Device, + FrameToken, FrontFace, GpuConcurrent, GraphicsPipelineDesc, IndexType, LoadOp, MemoryLocation, + Pipeline, PolygonMode, Sampler, SamplerAddressMode, SamplerCompareOp, SamplerDesc, + SamplerFilter, ShaderStageFlags, StencilOp, StencilOpState, Texture, TextureDesc, + TextureDimension, TextureFormat, TextureUsageFlags, TextureViewDesc, ThreadToken, Topology, + TypedBind, }; const NUM_FRAMES: usize = 2; @@ -50,6 +52,12 @@ fn vk_vec vulkan_sys::Result>(mut f: F) -> Vec< v } +#[must_use] +fn vulkan_bool32(b: bool) -> vk::Bool32 { + const VALUES: [vk::Bool32; 2] = [vk::Bool32::False, vk::Bool32::True]; + VALUES[b as usize] +} + #[must_use] fn vulkan_format(format: TextureFormat) -> vk::Format { match format { @@ -57,6 +65,7 @@ fn vulkan_format(format: TextureFormat) -> vk::Format { TextureFormat::RGBA8_UNORM => vk::Format::R8G8B8A8_UNORM, TextureFormat::BGRA8_SRGB => vk::Format::B8G8R8A8_SRGB, TextureFormat::BGRA8_UNORM => vk::Format::B8G8R8A8_UNORM, + TextureFormat::DEPTH_F32 => vk::Format::D32_SFLOAT, } } @@ -67,6 +76,7 @@ fn vulkan_aspect(format: TextureFormat) -> vk::ImageAspectFlags { | TextureFormat::BGRA8_UNORM | TextureFormat::RGBA8_SRGB | TextureFormat::RGBA8_UNORM => vk::ImageAspectFlags::COLOR, + TextureFormat::DEPTH_F32 => vk::ImageAspectFlags::DEPTH, } } @@ -115,6 +125,92 @@ fn vulkan_descriptor_type(binding_type: BindingType) -> vk::DescriptorType { } } +#[must_use] +fn vulkan_index_type(index_type: IndexType) -> vk::IndexType { + match index_type { + IndexType::U16 => vk::IndexType::Uint16, + IndexType::U32 => vk::IndexType::Uint32, + } +} + +#[must_use] +fn vulkan_primitive_topology(primitive_topology: Topology) -> vk::PrimitiveTopology { + match primitive_topology { + Topology::Points => vk::PrimitiveTopology::PointList, + Topology::Lines => vk::PrimitiveTopology::LineList, + Topology::LineStrip => vk::PrimitiveTopology::LineStrip, + Topology::Triangles => vk::PrimitiveTopology::TriangleList, + Topology::TriangleStrip => vk::PrimitiveTopology::TriangleStrip, + } +} + +#[must_use] +fn vulkan_polygon_mode(polygon_mode: PolygonMode) -> vk::PolygonMode { + match polygon_mode { + PolygonMode::Fill => vk::PolygonMode::Fill, + PolygonMode::Line => vk::PolygonMode::Line, + PolygonMode::Point => vk::PolygonMode::Point, + } +} + +#[must_use] +fn vulkan_cull_mode(culling_mode: CullingMode) -> vk::CullModeFlags { + match culling_mode { + CullingMode::None => vk::CullModeFlags::NONE, + CullingMode::Front => vk::CullModeFlags::FRONT, + CullingMode::Back => vk::CullModeFlags::BACK, + } +} + +#[must_use] +fn vulkan_front_face(front_face: FrontFace) -> vk::FrontFace { + match front_face { + FrontFace::Clockwise => vk::FrontFace::Clockwise, + FrontFace::CounterClockwise => vk::FrontFace::CounterClockwise, + } +} + +#[must_use] +fn vulkan_compare_op(compare_op: CompareOp) -> vk::CompareOp { + match compare_op { + CompareOp::Never => vk::CompareOp::Never, + CompareOp::Less => vk::CompareOp::Less, + CompareOp::Equal => vk::CompareOp::Equal, + CompareOp::LessOrEqual => vk::CompareOp::LessOrEqual, + CompareOp::Greater => vk::CompareOp::Greater, + CompareOp::NotEqual => vk::CompareOp::NotEqual, + CompareOp::GreaterOrEqual => vk::CompareOp::GreaterOrEqual, + CompareOp::Always => vk::CompareOp::Always, + } +} + +#[must_use] +fn vulkan_stencil_op(stencil_op: StencilOp) -> vk::StencilOp { + match stencil_op { + StencilOp::Keep => vk::StencilOp::Keep, + StencilOp::Zero => vk::StencilOp::Zero, + StencilOp::Replace => vk::StencilOp::Replace, + StencilOp::IncrementAndClamp => vk::StencilOp::IncrementAndClamp, + StencilOp::DecrementAndClamp => vk::StencilOp::DecrementAndClamp, + StencilOp::Invert => vk::StencilOp::Invert, + StencilOp::IncrementAndWrap => vk::StencilOp::IncrementAndWrap, + StencilOp::DecrementAndWrap => vk::StencilOp::DecrementAndWrap, + } +} + +#[must_use] +fn vulkan_stencil_op_state(stencil_op_state: StencilOpState) -> vk::StencilOpState { + vk::StencilOpState { + fail_op: vulkan_stencil_op(stencil_op_state.fail_op), + pass_op: vulkan_stencil_op(stencil_op_state.pass_op), + depth_fail_op: vulkan_stencil_op(stencil_op_state.depth_fail_op), + compare_op: vulkan_compare_op(stencil_op_state.compare_op), + compare_mask: stencil_op_state.compare_mask, + write_mask: stencil_op_state.write_mask, + reference: stencil_op_state.reference, + } +} + struct DelayQueue { delay: u64, counter: u64, @@ -1332,20 +1428,45 @@ impl<'driver> Device for VulkanDevice<'driver> { }, ]; + let topology = vulkan_primitive_topology(desc.topology); + let polygon_mode = vulkan_polygon_mode(desc.polygon_mode); + let cull_mode = vulkan_cull_mode(desc.culling_mode); + let front_face = vulkan_front_face(desc.front_face); + let depth_compare_op = vulkan_compare_op(desc.depth_compare_op); + let depth_test_enable = vulkan_bool32(desc.depth_test_enable); + let depth_write_enable = vulkan_bool32(desc.depth_write_enable); + let stencil_test_enable = vulkan_bool32(desc.stencil_test_enable); + let back = vulkan_stencil_op_state(desc.stencil_back); + let front = vulkan_stencil_op_state(desc.stencil_front); + let vertex_input_state = vk::PipelineVertexInputStateCreateInfo::default(); let input_assembly_state = vk::PipelineInputAssemblyStateCreateInfo { - topology: vk::PrimitiveTopology::TriangleList, + topology, ..default() }; let viewport_state = vk::PipelineViewportStateCreateInfo::default(); let rasterization_state = vk::PipelineRasterizationStateCreateInfo { line_width: 1.0, + polygon_mode, + cull_mode, + front_face, ..default() }; let multisample_state = vk::PipelineMultisampleStateCreateInfo { rasterization_samples: vk::SampleCountFlags::SAMPLE_COUNT_1, ..default() }; + let depth_stencil_state = vk::PipelineDepthStencilStateCreateInfo { + depth_compare_op, + depth_test_enable, + depth_write_enable, + min_depth_bounds: 0.0, + max_depth_bounds: 1.0, + stencil_test_enable, + back, + front, + ..default() + }; let color_blend_attachments = &[vk::PipelineColorBlendAttachmentState { color_write_mask: vk::ColorComponentFlags::R | vk::ColorComponentFlags::G @@ -1372,7 +1493,6 @@ impl<'driver> Device for VulkanDevice<'driver> { .copied() .map(vulkan_format), ); - let pipeline_rendering_create_info = vk::PipelineRenderingCreateInfo { view_mask: 0, color_attachment_formats: color_attachment_formats.into(), @@ -1398,6 +1518,7 @@ impl<'driver> Device for VulkanDevice<'driver> { viewport_state: Some(&viewport_state), rasterization_state: Some(&rasterization_state), multisample_state: Some(&multisample_state), + depth_stencil_state: Some(&depth_stencil_state), color_blend_state: Some(&color_blend_state), dynamic_state: Some(&dynamic_state), layout, @@ -1992,7 +2113,7 @@ impl<'driver> Device for VulkanDevice<'driver> { ..default() } } - TypedBind::Buffer(buffers) => { + TypedBind::UniformBuffer(buffers) => { let buffer_infos_iter = buffers.iter().map(|buffer| { let buffer = self.buffer_pool.lock().get(buffer.0).unwrap().buffer; vk::DescriptorBufferInfo { @@ -2012,6 +2133,26 @@ impl<'driver> Device for VulkanDevice<'driver> { ..default() } } + TypedBind::StorageBuffer(buffers) => { + let buffer_infos_iter = buffers.iter().map(|buffer| { + let buffer = self.buffer_pool.lock().get(buffer.0).unwrap().buffer; + vk::DescriptorBufferInfo { + buffer, + offset: 0, + range: !0, + } + }); + let buffer_infos = arena.alloc_slice_fill_iter(buffer_infos_iter); + vk::WriteDescriptorSet { + dst_set: descriptor_set, + dst_binding: bind.binding, + dst_array_element: bind.array_element, + descriptor_count: buffer_infos.len() as u32, + descriptor_type: vk::DescriptorType::StorageBuffer, + buffer_info: buffer_infos.as_ptr(), + ..default() + } + } }); let write_descriptors = arena.alloc_slice_fill_iter(write_descriptors_iter); @@ -2040,6 +2181,22 @@ impl<'driver> Device for VulkanDevice<'driver> { } } + fn cmd_set_index_buffer( + &self, + command_buffer_token: &CommandBufferToken, + buffer: Buffer, + offset: u64, + index_type: IndexType, + ) { + let buffer = self.buffer_pool.lock().get(buffer.0).unwrap().buffer; + let command_buffer = vk::CommandBuffer::from_raw(command_buffer_token.raw); + let index_type = vulkan_index_type(index_type); + unsafe { + self.device_fn + .cmd_bind_index_buffer(command_buffer, buffer, offset, index_type) + } + } + fn cmd_set_pipeline(&self, command_buffer_token: &CommandBufferToken, pipeline: Pipeline) { let command_buffer = vk::CommandBuffer::from_raw(command_buffer_token.raw); let VulkanPipeline { @@ -2146,6 +2303,35 @@ impl<'driver> Device for VulkanDevice<'driver> { }) .collect::>(); + let depth_attachment = desc.depth_attachment.as_ref().map(|attachment| { + let image_view = match self.texture_pool.lock().get(attachment.texture.0).unwrap() { + VulkanTextureHolder::Unique(texture) => texture.view, + VulkanTextureHolder::Shared(texture) => texture.view, + VulkanTextureHolder::Swapchain(_) => panic!(), + }; + + let (load_op, clear_value) = match attachment.load_op { + LoadOp::Load => (vk::AttachmentLoadOp::Load, vk::ClearValue::default()), + LoadOp::Clear(clear_value) => { + (vk::AttachmentLoadOp::Clear, vulkan_clear_value(clear_value)) + } + LoadOp::DontCare => (vk::AttachmentLoadOp::DontCare, vk::ClearValue::default()), + }; + + let store_op = match attachment.store_op { + crate::StoreOp::Store => vk::AttachmentStoreOp::Store, + crate::StoreOp::DontCare => vk::AttachmentStoreOp::DontCare, + }; + vk::RenderingAttachmentInfo { + image_view, + image_layout: vk::ImageLayout::DepthAttachmentOptimal, + load_op, + store_op, + clear_value, + ..default() + } + }); + let rendering_info = vk::RenderingInfo { flags: vk::RenderingFlags::default(), render_area: vk::Rect2d { @@ -2161,7 +2347,7 @@ impl<'driver> Device for VulkanDevice<'driver> { layer_count: 1, view_mask: 0, color_attachments: color_attachments.as_slice().into(), - depth_attachment: None, + depth_attachment: depth_attachment.as_ref(), stencil_attachment: None, ..default() }; @@ -2224,6 +2410,28 @@ impl<'driver> Device for VulkanDevice<'driver> { } } + fn cmd_draw_indexed( + &self, + command_buffer_token: &CommandBufferToken, + index_count: u32, + instance_count: u32, + first_index: u32, + vertex_offset: i32, + first_instance: u32, + ) { + let command_buffer = vk::CommandBuffer::from_raw(command_buffer_token.raw); + unsafe { + self.device_fn.cmd_draw_indexed( + command_buffer, + index_count, + instance_count, + first_index, + vertex_offset, + first_instance, + ) + } + } + fn submit( &self, frame_token: &FrameToken, @@ -2512,11 +2720,13 @@ impl<'app> Drop for VulkanDevice<'app> { { let mut image_views = Vec::new(); let mut images = Vec::new(); + let mut memories = Vec::new(); for texture in self.texture_pool.get_mut().values() { match texture { VulkanTextureHolder::Unique(texture) => { image_views.push(texture.view); - images.push(texture.texture.image) + images.push(texture.texture.image); + memories.push(texture.texture.memory.memory); } VulkanTextureHolder::Shared(texture) => { image_views.push(texture.view); @@ -2534,6 +2744,10 @@ impl<'app> Drop for VulkanDevice<'app> { for image in images { unsafe { device_fn.destroy_image(device, image, None) } } + + for memory in memories { + unsafe { device_fn.free_memory(device, memory, None) } + } } for sampler in self.sampler_pool.get_mut().values() { diff --git "a/narcissus/data/bl\303\245haj.obj" "b/narcissus/data/bl\303\245haj.obj" index 0c5da9a..13dc6e8 100644 --- "a/narcissus/data/bl\303\245haj.obj" +++ "b/narcissus/data/bl\303\245haj.obj" @@ -1,4 +1,5 @@ -mtllib blåhaj.mtl +# Blender 3.3.1 +# www.blender.org o Blåhaj v -0.513672 0.477227 -0.487855 v 0.101348 1.145127 -0.448955 @@ -154,824 +155,1027 @@ v -0.517875 0.803125 -1.331638 v -0.352151 0.564260 -1.388249 v -0.442642 0.646515 -1.430377 v -0.330108 0.609184 -1.403527 -vt 0.625330 0.143403 -vt 0.658445 0.124408 -vt 0.624013 0.200651 -vt 0.990716 0.589020 -vt 0.966159 0.581131 -vt 0.996827 0.555363 -vt 0.502189 0.954105 -vt 0.505948 0.982298 -vt 0.451646 0.945813 -vt 0.627160 0.093605 -vt 0.418993 0.937994 -vt 0.414665 0.966085 -vt 0.400551 0.934063 -vt 0.631341 0.006301 -vt 0.660360 0.000423 -vt 0.629700 0.049073 -vt 0.350544 0.282011 -vt 0.378198 0.316758 -vt 0.349109 0.330593 -vt 0.388162 0.932934 -vt 0.883200 0.931219 -vt 0.898668 0.949748 -vt 0.883312 0.949096 -vt 0.353316 0.121756 -vt 0.389800 0.142834 -vt 0.351643 0.176375 -vt 0.882784 0.973289 -vt 0.854365 0.977751 -vt 0.882572 0.920890 -vt 0.622342 0.738821 -vt 0.661532 0.816979 -vt 0.624220 0.786943 -vt 0.469432 0.845635 -vt 0.483257 0.858220 -vt 0.468829 0.855653 -vt 0.624083 0.299966 -vt 0.659898 0.307249 -vt 0.621388 0.351539 -vt 0.360989 0.041164 -vt 0.396072 0.063440 -vt 0.356102 0.078724 -vt 0.626586 0.826377 -vt 0.435967 0.838245 -vt 0.467713 0.842688 -vt 0.434196 0.862717 -vt 0.826493 0.526367 -vt 0.860094 0.526273 -vt 0.827576 0.543349 -vt 0.826493 0.452269 -vt 0.860913 0.470126 -vt 0.826041 0.482807 -vt 0.435967 0.885722 -vt 0.453973 0.891755 -vt 0.439846 0.900826 -vt 0.849666 0.170791 -vt 0.841745 0.084642 -vt 0.952907 0.078470 -vt 0.374973 0.408696 -vt 0.415398 0.443676 -vt 0.372884 0.486082 -vt 0.959580 0.720492 -vt 0.951697 0.798935 -vt 0.912973 0.747024 -vt 0.672209 0.261514 -vt 0.758163 0.309282 -vt 0.489397 0.551720 -vt 0.393171 0.556814 -vt 0.689288 0.126948 -vt 0.218719 0.718047 -vt 0.134018 0.753678 -vt 0.104744 0.541273 -vt 0.042952 0.361542 -vt 0.092956 0.374659 -vt 0.215653 0.221039 -vt 0.170309 0.250413 -vt 0.180460 0.115857 -vt 0.657475 0.667397 -vt 0.753361 0.625230 -vt 0.918403 0.548140 -vt 0.942709 0.557990 -vt 0.951524 0.600165 -vt 0.040634 0.839054 -vt 0.044556 0.837767 -vt 0.041603 0.836825 -vt 0.639862 0.935377 -vt 0.630940 0.965289 -vt 0.658907 0.932934 -vt 0.674371 0.137246 -vt 0.505948 0.982298 -vt 0.963197 0.597326 -vt 0.991519 0.631614 -vt 0.882784 0.900280 -vt 0.898403 0.881541 -vt 0.885504 0.864373 -vt 0.964629 0.448203 -vt 0.995501 0.432985 -vt 0.964842 0.422654 -vt 0.994213 0.659673 -vt 0.414665 0.966086 -vt 0.618426 0.569585 -vt 0.659918 0.508898 -vt 0.618333 0.508235 -vt 0.885504 0.957616 -vt 0.898384 0.948530 -vt 0.965556 0.410896 -vt 0.660595 -0.000060 -vt 0.378985 0.319260 -vt 0.372640 0.827080 -vt 0.401226 0.826293 -vt 0.375469 0.808152 -vt 0.619455 0.448548 -vt 0.389800 0.142834 -vt 0.471110 0.866632 -vt 0.483257 0.858220 -vt 0.565802 0.947126 -vt 0.933128 0.663956 -vt 0.920492 0.667761 -vt 0.934021 0.673637 -vt 0.661532 0.816979 -vt 0.853639 0.886837 -vt 0.882784 0.864372 -vt 0.668909 0.306138 -vt 0.396072 0.063440 -vt 0.613281 0.939128 -vt 0.467713 0.842688 -vt 0.623391 0.253481 -vt 0.965556 0.543349 -vt 0.995374 0.540892 -vt 0.963851 0.494541 -vt 0.860094 0.526273 -vt 0.369791 0.662381 -vt 0.384261 0.686618 -vt 0.365385 0.614972 -vt 0.860914 0.470126 -vt 0.453973 0.891755 -vt 0.952941 0.078441 -vt 0.961933 0.035254 -vt 0.841745 0.084642 -vt 0.415398 0.443676 -vt 0.374973 0.408696 -vt 0.372884 0.486082 -vt 0.867019 0.796088 -vt 0.937325 0.790617 -vt 0.912973 0.747024 -vt 0.489700 0.552446 -vt 0.393098 0.556884 -vt 0.134329 0.755598 -vt 0.189257 0.845380 -vt 0.220383 0.706825 -vt 0.901949 0.718982 -vt 0.961313 0.697559 -vt 0.105711 0.541948 -vt 0.757081 0.309561 -vt 0.093203 0.375171 -vt 0.042952 0.361542 -vt 0.064557 0.150736 -vt 0.116942 0.194662 -vt 0.124760 0.088981 -vt 0.170289 0.250234 -vt 0.215096 0.219436 -vt 0.180460 0.115857 -vt 0.088711 0.002435 -vt 0.146307 0.004447 -vt 0.753444 0.626844 -vt 0.657475 0.667397 -vt 0.490952 0.158111 -vt 0.220442 0.378064 -vt 0.174124 0.350301 -vt 0.202571 0.534959 -vt 0.745671 0.902251 -vt 0.741267 0.952410 -vt 0.768948 0.976605 -vt 0.951800 0.288159 -vt 0.977483 0.324616 -vt 0.988781 0.256596 -vt 0.942709 0.557990 -vt 0.918403 0.548140 -vt 0.951524 0.600165 -vt 0.630940 0.965289 -vt 0.995501 0.432985 -vt 0.995026 0.540717 -vt 0.971778 0.653302 -vt 0.424020 0.744855 -vt 0.375946 0.766544 -vt 0.373410 0.718110 -vt 0.383936 0.686491 +vn -0.4237 -0.9023 -0.0801 +vn 0.8144 -0.0584 0.5773 +vn 0.9122 -0.0427 0.4076 +vn -0.3507 -0.9300 -0.1104 +vn 0.9467 0.0527 0.3176 +vn -0.3869 -0.8910 0.2377 +vn 0.3994 0.9090 0.1190 +vn 0.8467 -0.2037 0.4915 +vn 0.0069 0.6847 0.7288 +vn 0.4080 0.9117 0.0493 +vn -0.3668 0.8849 0.2869 +vn -0.7005 -0.7125 -0.0408 +vn -0.1028 0.7783 0.6194 +vn -0.2840 -0.9571 -0.0581 +vn 0.0799 0.9967 -0.0174 +vn -0.7548 -0.6382 -0.1515 +vn -0.2180 0.8976 0.3833 +vn -0.2033 0.9784 -0.0381 +vn -0.9638 0.1202 -0.2380 +vn 0.4267 0.3986 0.8118 +vn -0.1798 0.0106 0.9837 +vn 0.5139 0.7617 0.3945 +vn -0.2383 -0.0064 0.9712 +vn -0.5983 -0.7587 0.2578 +vn 0.6986 0.4351 0.5680 +vn -0.2621 -0.8972 0.3555 +vn 0.2750 0.7823 0.5588 +vn -0.4531 -0.7983 0.3966 +vn 0.1391 -0.1594 0.9774 +vn -0.4513 -0.8446 0.2881 +vn 0.3569 0.4126 0.8380 +vn -0.5270 -0.3780 0.7612 +vn -0.7210 -0.6092 0.3301 +vn 0.3440 -0.5041 0.7922 +vn -0.1708 -0.0000 0.9853 +vn 0.6382 -0.7570 -0.1398 +vn -0.4179 -0.9016 -0.1117 +vn 0.9961 -0.0427 -0.0769 +vn -0.3591 -0.9311 -0.0647 +vn 0.7851 -0.5223 -0.3329 +vn 0.0824 0.7189 -0.6902 +vn -0.6186 -0.4547 -0.6408 +vn 0.6491 -0.7574 -0.0716 +vn 0.9984 0.0527 0.0195 +vn -0.5358 -0.8380 -0.1031 +vn 0.7167 0.2705 -0.6427 +vn -0.4366 -0.5798 -0.6879 +vn -0.2849 -0.8916 -0.3521 +vn 0.4158 0.9091 0.0248 +vn 0.9627 -0.2037 -0.1779 +vn 0.0723 0.9510 -0.3006 +vn 0.2518 0.6935 -0.6750 +vn -0.4429 -0.8924 -0.0869 +vn 0.4008 0.9117 0.0909 +vn 0.8210 0.4866 -0.2986 +vn 0.6772 -0.6972 -0.2351 +vn 0.9061 -0.1873 -0.3794 +vn -0.6734 -0.7125 -0.1972 +vn -0.3086 0.8291 -0.4663 +vn 0.1116 0.7783 -0.6179 +vn -0.2903 -0.9567 -0.0211 +vn 0.0694 0.9967 0.0433 +vn 0.5073 -0.8490 0.1478 +vn -0.7618 -0.6382 -0.1114 +vn -0.0707 0.8870 -0.4563 +vn -0.6018 -0.7963 -0.0620 +vn -0.7723 -0.3531 -0.5281 +vn -0.2043 0.9784 -0.0325 +vn 0.7669 0.5954 0.2396 +vn -0.9877 0.1202 -0.1002 +vn 0.6750 0.3986 -0.6209 +vn 0.1747 -0.0014 -0.9846 +vn 0.6946 0.7191 -0.0192 +vn 0.2345 0.0391 -0.9713 +vn 0.8489 0.4356 -0.2993 +vn 0.3175 -0.1121 -0.9416 +vn -0.4411 0.6661 0.6015 +vn 0.4279 -0.1971 -0.8820 +vn -0.3890 -0.8215 -0.4169 +vn 0.6208 0.4146 -0.6654 +vn 0.0559 0.4367 -0.8979 +vn -0.2397 -0.3769 -0.8947 +vn -0.4549 0.3624 -0.8135 +vn -0.5687 -0.6097 -0.5521 +vn 0.3118 0.8664 -0.3902 +vn -0.0881 -0.5021 -0.8603 +vn 0.3703 0.6162 -0.6952 +vn -0.3983 0.3446 -0.8501 +vn 0.5905 -0.5041 -0.6302 +vn 0.5540 -0.7570 0.3464 +vn -0.7843 -0.4849 0.3871 +vn 0.4620 0.8847 0.0628 +vn 0.7276 -0.6363 0.2564 +vn 0.9762 0.0368 0.2139 +vn 0.7083 0.6721 0.2159 +vn -0.5483 -0.8332 -0.0715 +vn -0.1547 0.7189 0.6776 +vn -0.2526 -0.9667 0.0400 +vn -0.7982 -0.4547 0.3952 +vn 0.4362 0.8987 0.0448 +vn 0.5446 -0.7322 0.4089 +vn -0.0505 0.6476 0.7603 +vn 0.2157 -0.5595 0.8003 +vn 0.1485 0.9888 0.0115 +vn -0.5393 -0.8380 -0.0832 +vn 0.4248 0.2571 0.8680 +vn -0.6427 -0.5798 0.5008 +vn 0.5078 -0.7663 0.3937 +vn -0.0426 0.9320 0.3600 +vn -0.4463 -0.8924 -0.0672 +vn 0.4817 -0.4231 0.7674 +vn -0.7150 -0.6843 -0.1436 +vn -0.2128 0.6238 0.7521 +vn -0.4215 -0.9068 -0.0045 +vn 0.2430 0.9605 0.1359 +vn 0.6726 0.4866 0.5575 +vn -0.3923 0.8986 0.1964 +vn 0.5586 -0.6972 0.4493 +vn 0.7256 -0.1872 0.6622 +vn 0.9110 0.4016 -0.0943 +vn 0.5274 -0.8490 0.0315 +vn -0.5412 -0.8389 -0.0580 +vn -0.1228 0.9912 0.0489 +vn 0.5278 -0.7825 0.3302 +vn 0.7650 0.6005 0.2328 +vn -0.9788 -0.1950 -0.0631 +vn 0.0783 0.6614 0.7459 +vn -0.8611 0.5064 -0.0464 +vn -0.4609 -0.8872 -0.0205 +vn -0.9055 -0.3535 0.2345 +vn -0.1786 -0.0037 0.9839 +vn 0.8018 0.5960 0.0432 +vn 0.6709 0.4046 0.6214 +vn -0.1815 0.0080 0.9834 +vn -0.1707 0.0040 0.9853 +vn 0.0400 -0.0758 0.9963 +vn -0.1476 0.0037 0.9890 +vn -0.8245 -0.0621 0.5625 +vn 0.7661 0.6322 0.1162 +vn -0.5565 -0.7751 0.2991 +vn -0.4349 -0.8517 0.2924 +vn 0.5790 0.5980 0.5542 +vn 0.3402 0.8179 0.4640 +vn -0.2495 0.4367 0.8643 +vn 0.1475 -0.1544 0.9769 +vn -0.2357 0.7120 0.6615 +vn -0.7021 0.3624 0.6130 +vn 0.3440 0.8002 0.4913 +vn 0.4326 0.4716 0.7684 +vn -0.1764 0.0197 0.9841 +vn 0.1623 0.8664 0.4723 +vn -0.7179 -0.6214 0.3137 +vn -0.0712 -0.1028 0.9922 +vn 0.4012 0.8000 0.4462 +vn -0.4840 0.8723 0.0694 +vn -0.4189 -0.0718 0.9052 +vn 0.0759 0.4576 0.8859 +vn -0.3719 -0.4950 0.7852 +vn -0.4631 -0.8077 -0.3648 +vn 0.1147 0.6162 0.7792 +vn -0.6612 0.3446 0.6664 +vn 0.7584 0.1148 0.6416 +vn -0.6281 -0.7708 0.1066 +vn -0.2173 -0.3641 0.9057 +vn 0.9985 -0.0316 -0.0452 +vn -0.1258 0.6090 -0.7832 +vn -0.5755 -0.4120 -0.7065 +vn 0.4858 0.8738 0.0231 +vn 0.9912 0.0368 0.1270 +vn 0.7410 0.6703 0.0405 +vn -0.5404 -0.8332 -0.1172 +vn -0.2258 -0.9656 -0.1290 +vn 0.4785 0.8769 0.0467 +vn 0.2098 0.6467 -0.7334 +vn 0.4724 -0.5595 -0.6810 +vn 0.6841 -0.7085 -0.1735 +vn 0.4284 0.8493 -0.3083 +vn 0.7226 -0.4136 -0.5539 +vn -0.7288 -0.6683 -0.1494 +vn -0.2790 0.9168 -0.2859 +vn -0.1007 0.6220 -0.7765 +vn -0.4057 -0.8831 -0.2355 +vn 0.2745 0.9605 -0.0462 +vn 0.8321 0.4234 0.3581 +vn -0.0992 0.9912 -0.0874 +vn 0.6012 -0.7866 -0.1406 +vn 0.7751 0.6257 0.0876 +vn -0.9456 -0.2275 -0.2326 +vn 0.3176 0.6614 -0.6794 +vn -0.8265 0.5064 -0.2460 +vn -0.4462 -0.8710 -0.2058 +vn 0.1671 0.0042 -0.9859 +vn 0.8524 0.4570 -0.2542 +vn 0.1655 -0.0078 -0.9862 +vn 0.1358 0.0079 -0.9907 +vn -0.5871 -0.0621 -0.8071 +vn 0.4546 -0.0134 -0.8906 +vn 0.7602 0.6320 0.1504 +vn 0.4451 0.7928 -0.4163 +vn -0.4246 -0.7741 -0.4696 +vn -0.3259 -0.8521 -0.4095 +vn 0.7312 0.5976 -0.3288 +vn 0.4734 0.8212 -0.3187 +vn 0.4660 -0.1733 -0.8677 +vn -0.0377 0.7116 -0.7016 +vn 0.4767 0.8199 -0.3170 +vn 0.6661 0.4709 -0.5784 +vn 0.1653 0.0256 -0.9859 +vn -0.5708 -0.6202 -0.5381 +vn 0.3368 -0.0783 -0.9383 +vn 0.5784 0.7093 -0.4030 +vn -0.3454 0.8636 -0.3672 +vn -0.0899 -0.0717 -0.9934 +vn 0.3716 0.4987 -0.7831 +vn -0.5588 -0.8086 0.1841 +vn 0.9270 0.0920 -0.3637 +vn -0.5288 -0.8394 -0.1255 +vn 0.1002 -0.3641 -0.9260 +vn -0.3650 0.6190 0.6954 +vn -0.7795 -0.4108 0.4729 +vn 0.4652 0.8738 0.1418 +vn 0.7222 -0.5677 0.3951 +vn 0.9415 0.0981 0.3223 +vn 0.6548 0.7146 0.2460 +vn -0.5502 -0.8307 -0.0847 +vn -0.2683 -0.9632 -0.0136 +vn 0.4676 0.8771 0.1102 +vn 0.0234 0.6818 0.7312 +vn 0.1547 -0.5982 0.7863 +vn 0.2953 0.8757 0.3821 +vn 0.5080 0.0618 0.8592 +vn -0.7365 -0.6683 -0.1046 +vn -0.3535 0.6241 0.6968 +vn -0.4621 -0.8820 0.0929 +vn 0.2755 0.9565 0.0960 +vn -0.4477 0.8389 0.3096 +vn 0.8002 0.5543 0.2292 +vn -0.5855 -0.7959 -0.1540 +vn -0.1257 0.9907 0.0517 +vn 0.5189 -0.7866 0.3347 +vn 0.7582 0.6249 0.1862 +vn -0.9687 -0.2275 -0.0991 +vn 0.0404 0.6609 0.7493 +vn -0.8159 0.5640 -0.1271 +vn -0.4824 -0.8744 -0.0527 +vn -0.1777 -0.0030 0.9841 +vn 0.1016 -0.0339 0.9942 +vn -0.8106 -0.1201 0.5732 +vn -0.5731 -0.7728 0.2727 +vn -0.4496 -0.8551 0.2581 +vn -0.2716 0.7116 0.6480 +vn 0.3403 0.8179 0.4640 +vn -0.1753 -0.0009 0.9845 +vn 0.0109 -0.0628 0.9980 +vn 0.4098 0.7094 0.5734 +vn -0.4474 0.8649 0.2275 +vn -0.4335 -0.0242 0.9008 +vn 0.0865 0.4991 0.8622 +vn -0.4654 -0.8080 -0.3614 +vn 0.9391 0.0110 0.3433 +vn -0.5401 -0.8394 -0.0598 +vn 0.9979 -0.0636 -0.0124 +vn -0.1912 0.6346 -0.7488 +vn -0.6083 -0.4849 -0.6284 +vn 0.4504 0.8861 0.1098 +vn 0.9951 0.0981 0.0133 +vn 0.6993 0.7148 -0.0099 +vn -0.5466 -0.8307 -0.1054 +vn -0.2528 -0.9622 -0.1012 +vn 0.4394 0.8943 0.0848 +vn 0.2686 0.6923 -0.6697 +vn 0.4103 -0.5982 -0.6883 +vn 0.6107 -0.7684 -0.1913 +vn 0.1522 0.9883 -0.0103 +vn 0.7745 0.0626 -0.6295 +vn -0.7216 -0.6843 -0.1053 +vn -0.2852 0.9178 -0.2761 +vn 0.0528 0.6234 -0.7802 +vn -0.4008 -0.9062 -0.1349 +vn 0.2918 0.9565 0.0023 +vn 0.8302 0.5545 0.0580 +vn -0.1009 0.9907 -0.0910 +vn 0.6082 -0.7825 -0.1334 +vn 0.7981 0.6009 0.0441 +vn -0.9429 -0.1950 -0.2699 +vn 0.2902 0.6609 -0.6921 +vn -0.8111 0.5641 -0.1549 +vn -0.4553 -0.8693 -0.1923 +vn 0.1685 0.0065 -0.9857 +vn 0.1717 -0.0027 -0.9851 +vn 0.1039 -0.0785 -0.9915 +vn -0.5704 -0.1201 -0.8125 +vn -0.4471 -0.7721 -0.4516 +vn -0.3384 -0.8538 -0.3956 +vn 0.0006 0.7120 -0.7022 +vn 0.4917 0.7990 -0.3462 +vn 0.1667 -0.0010 -0.9860 +vn 0.2797 -0.1063 -0.9542 +vn 0.5292 0.7994 -0.2845 +vn -0.4161 0.8715 -0.2594 +vn -0.1051 -0.0242 -0.9942 +vn 0.3696 0.4576 -0.8087 +vn -0.5611 -0.8053 0.1916 +vn 0.9997 -0.0238 -0.0002 +vn -0.5556 -0.7708 -0.3117 vt 0.659918 0.508898 -vt 0.618829 0.671054 -vt 0.898403 0.881541 -vt 0.401430 0.827363 -vt 0.400129 0.967568 -vt 0.375156 0.935628 -vt 0.430174 0.831325 +vt 0.374973 0.408696 +vt 0.959580 0.720492 vt 0.422161 0.895489 -vt 0.403002 0.873682 -vt 0.406318 0.832406 -vt 0.996827 0.682701 -vt 0.920572 0.649199 -vt 0.934021 0.646724 -vt 0.920492 0.667761 -vt 0.484351 0.838062 -vt 0.471110 0.831143 -vt 0.853639 0.886864 -vt 0.360430 0.560754 -vt 0.354112 0.501435 -vt 0.394831 0.062112 -vt 0.365846 0.017513 -vt 0.402646 0.003745 -vt 0.827533 0.426351 -vt 0.856128 0.426209 +vt 0.372884 0.486082 +vt 0.951697 0.798935 +vt 0.966159 0.581131 +vt 0.672209 0.261514 +vt 0.658445 0.124408 vt 0.728672 0.031965 +vt 0.995501 0.432985 +vt 0.400129 0.967568 +vt 0.414665 0.966085 vt 0.742101 0.025332 +vt 0.860913 0.470126 +vt 0.146307 0.004447 +vt 0.971778 0.653302 +vt 0.874136 0.794721 +vt 0.898668 0.949748 +vt 0.920492 0.667761 +vt 0.483257 0.858220 +vt 0.659898 0.307249 +vt 0.920572 0.649199 +vt 0.484351 0.838062 +vt 0.383936 0.686491 +vt 0.660360 0.000423 +vt 0.995026 0.540717 vt 0.788312 0.145203 -vt 0.961933 0.035254 vt 0.189367 0.844990 +vt 0.401430 0.827363 +vt 0.854365 0.977751 +vt 0.849666 0.170791 vt 0.126138 0.817793 -vt 0.874136 0.794721 -vt 0.124760 0.088981 -vt 0.146307 0.004447 +vt 0.505948 0.982298 +vt 0.841745 0.084642 +vt 0.467713 0.842688 +vt 0.952907 0.078470 +vt 0.853639 0.886864 +vt 0.961933 0.035254 +vt 0.630940 0.965289 +vt 0.453973 0.891755 +vt 0.396072 0.063440 +vt 0.394831 0.062112 +vt 0.071096 0.021684 +vt 0.898403 0.881541 +vt 0.912973 0.747024 +vt 0.415398 0.443676 +vt 0.393171 0.556814 +vt 0.424020 0.744855 +vt 0.134018 0.753678 +vt 0.430174 0.831325 +vt 0.378198 0.316758 +vt 0.389800 0.142834 +vt 0.657475 0.667397 +vt 0.758163 0.309282 +vt 0.202493 0.537282 +vt 0.689288 0.126948 +vt 0.218719 0.718047 +vt 0.489397 0.551720 +vt 0.104744 0.541273 +vt 0.661532 0.816979 +vt 0.856128 0.426209 vt 0.190873 0.034994 +vt 0.402646 0.003745 +vt 0.088711 0.002435 +vt 0.860094 0.526273 +vt 0.220442 0.378064 vt 0.753830 0.466752 -vt 0.484938 0.364658 +vt 0.896779 0.391742 +vt 0.951524 0.646724 vt 0.064557 0.150736 -vt 0.116942 0.194662 -vt 0.202493 0.537282 -vt 0.071096 0.021684 -vt 0.088711 0.002435 vt 0.490952 0.158111 -vt 0.173810 0.347627 +vt 0.484938 0.364658 +vt 0.042952 0.361542 +vt 0.215653 0.221039 +vt 0.349109 0.889925 +vt 0.753361 0.625230 +vt 0.897486 0.233218 vt 0.758611 0.731126 -vt 0.768948 0.976605 -vt 0.745671 0.902251 +vt 0.180460 0.115857 +vt 0.124760 0.088981 +vt 0.173810 0.347627 vt 0.823832 0.890239 +vt 0.900260 0.622502 +vt 0.116942 0.194662 +vt 0.092956 0.374659 vt 0.823829 0.978030 -vt 0.358223 0.841639 -vt 0.403002 0.831143 +vt 0.170309 0.250413 vt 0.403002 0.883636 -vt 0.349109 0.889925 -vt 0.220442 0.378064 +vt 0.988781 0.256596 +vt 0.358223 0.841639 vt 0.850332 0.233279 -vt 0.897486 0.233218 -vt 0.896779 0.391742 +vt 0.951524 0.600165 vt 0.849664 0.389781 -vt 0.741267 0.952410 vt 0.951800 0.288159 -vt 0.988781 0.256596 -vt 0.977483 0.324616 -vt 0.951524 0.646724 -vt 0.900260 0.622502 -vt 0.802328 0.288593 +vt 0.768948 0.976605 +vt 0.403002 0.831143 +vt 0.942709 0.557990 +vt 0.985658 0.360507 vt 0.799266 0.336212 -vt 0.050734 0.938690 +vt 0.741267 0.952410 +vt 0.802328 0.288593 +vt 0.977483 0.324616 +vt 0.918403 0.548140 +vt 0.976228 0.350736 +vt 0.745671 0.902251 +vt 0.351643 0.176375 vt 0.051791 0.954523 vt 0.086935 0.952930 +vt 0.618829 0.671054 +vt 0.050734 0.938690 +vt 0.350544 0.282011 vt 0.087317 0.937852 -vt 0.985658 0.360507 -vt 0.976228 0.350736 -vt 0.087419 0.928737 +vt 0.618426 0.569585 +vt 0.349109 0.330593 vt 0.049630 0.931359 -vt 0.086480 0.919888 +vt 0.406318 0.832406 +vt 0.618333 0.508235 +vt 0.087419 0.928737 vt 0.046587 0.924976 +vt 0.961313 0.697559 +vt 0.403002 0.873682 +vt 0.086480 0.919888 +vt 0.619455 0.448548 vt 0.052434 0.906111 +vt 0.996827 0.555363 +vt 0.354112 0.501435 +vt 0.621388 0.351539 vt 0.084861 0.905509 vt 0.056455 0.897587 +vt 0.360430 0.560754 +vt 0.624083 0.299966 vt 0.082574 0.897890 vt 0.059586 0.889752 +vt 0.365385 0.614972 vt 0.083183 0.890974 +vt 0.623391 0.253481 +vt 0.369791 0.662381 vt 0.062372 0.882905 +vt 0.471110 0.831143 vt 0.082670 0.883136 +vt 0.624013 0.200651 vt 0.064609 0.874775 +vt 0.373410 0.718110 +vt 0.934021 0.646724 +vt 0.625330 0.143403 vt 0.081564 0.874653 vt 0.066147 0.867676 +vt 0.375946 0.766544 vt 0.080015 0.867285 -vt 0.077857 0.860710 +vt 0.627160 0.093605 vt 0.065702 0.861437 -vt 0.076469 0.854382 +vt 0.375469 0.808152 +vt 0.077857 0.860710 +vt 0.629700 0.049073 +vt 0.372640 0.827080 +vt 0.882784 0.973289 vt 0.063762 0.858461 -vt 0.065845 0.845087 +vt 0.631341 0.006301 +vt 0.965556 0.543349 +vt 0.076469 0.854382 vt 0.054993 0.852062 -vt 0.055918 0.842513 +vt 0.882572 0.920890 +vt 0.502189 0.954105 +vt 0.065845 0.845087 +vt 0.435967 0.838245 +vt 0.882784 0.864372 vt 0.045615 0.846455 -vt 0.048659 0.839245 +vt 0.565802 0.947126 +vt 0.055918 0.842513 vt 0.041882 0.842583 -vt 0.074479 0.840455 +vt 0.434196 0.862717 +vt 0.048659 0.839245 +vt 0.613281 0.939128 +vt 0.040634 0.839054 +vt 0.435967 0.885722 +vt 0.044556 0.837767 +vt 0.639862 0.935377 +vt 0.041603 0.836825 +vt 0.439846 0.900826 +vt 0.658907 0.932934 vt 0.081958 0.847082 +vt 0.963851 0.494541 +vt 0.074479 0.840455 +vt 0.451646 0.945813 vt 0.085125 0.840159 +vt 0.964629 0.448203 vt 0.080191 0.836274 -vt 0.083390 0.834147 +vt 0.418993 0.937994 +vt 0.964842 0.422654 vt 0.087056 0.836341 -vt 0.085458 0.833448 +vt 0.400551 0.934063 +vt 0.083390 0.834147 +vt 0.965556 0.410896 vt 0.087419 0.834586 -vt 0.083903 0.963052 +vt 0.375156 0.935628 +vt 0.085458 0.833448 +vt 0.388162 0.932934 vt 0.053072 0.962768 +vt 0.353316 0.121756 +vt 0.083903 0.963052 +vt 0.622342 0.738821 vt 0.055058 0.969341 +vt 0.356102 0.078724 +vt 0.624220 0.786943 vt 0.082278 0.970230 vt 0.058426 0.975209 +vt 0.360989 0.041164 +vt 0.626586 0.826377 +vt 0.827533 0.426351 vt 0.080238 0.976124 +vt 0.827576 0.543349 vt 0.061730 0.978997 +vt 0.365846 0.017513 vt 0.076334 0.979843 -vt 0.071590 0.981955 +vt 0.826493 0.452269 vt 0.064618 0.981743 -vt 0.046679 0.909052 +vt 0.826493 0.526367 +vt 0.071590 0.981955 +vt 0.826041 0.482807 +vt 0.885504 0.864373 vt 0.038484 0.920435 -vt 0.039889 0.908653 +vt 0.901949 0.718982 +vt 0.046679 0.909052 +vt 0.990716 0.589020 vt 0.034184 0.914798 -vt 0.035541 0.907346 +vt 0.882784 0.900280 +vt 0.991519 0.631614 +vt 0.039889 0.908653 vt 0.032306 0.910051 +vt 0.883200 0.931219 +vt 0.035541 0.907346 +vt 0.994213 0.659673 +vt 0.883312 0.949096 vt 0.031137 0.907303 +vt 0.885504 0.957616 vt 0.031995 0.906078 -vt 0.061664 0.876911 +vt 0.996827 0.682701 vt 0.060312 0.880610 -vt 0.060049 0.877450 +vt 0.469432 0.845635 +vt 0.061664 0.876911 +vt 0.933128 0.663956 +vt 0.468829 0.855653 vt 0.059256 0.879045 -vt 0.971065 0.567078 +vt 0.471110 0.866632 +vt 0.934021 0.673637 +vt 0.060049 0.877450 +vt 0.659918 0.508898 +vt 0.425249 0.899189 +vt 0.374973 0.408696 vt 0.960971 0.724493 -vt 0.423568 0.746327 +vt 0.372884 0.486082 +vt 0.971065 0.567078 +vt 0.964998 0.808390 +vt 0.668909 0.306138 +vt 0.995374 0.540892 +vt 0.660595 -0.000060 +vt 0.189257 0.845380 +vt 0.788478 0.145439 +vt 0.467713 0.842688 +vt 0.952941 0.078441 +vt 0.853639 0.886837 +vt 0.728672 0.031965 +vt 0.995501 0.432985 vt 0.400129 0.967568 -vt 0.975438 0.659444 -vt 0.432486 0.831221 -vt 0.425249 0.899189 +vt 0.414665 0.966086 +vt 0.742101 0.025332 +vt 0.860914 0.470126 +vt 0.146307 0.004447 +vt 0.963197 0.597326 +vt 0.937325 0.790617 +vt 0.898403 0.881541 +vt 0.912973 0.747024 +vt 0.920492 0.667761 +vt 0.483257 0.858220 +vt 0.393098 0.556884 +vt 0.384261 0.686618 vt 0.920572 0.649199 -vt 0.854464 0.980908 vt 0.484351 0.838062 +vt 0.126138 0.817793 +vt 0.401226 0.826293 +vt 0.854464 0.980908 +vt 0.846410 0.173899 +vt 0.505948 0.982298 +vt 0.841745 0.084642 +vt 0.961933 0.035254 +vt 0.630940 0.965289 +vt 0.453973 0.891755 +vt 0.396072 0.063440 vt 0.394831 0.062111 -vt 0.402646 0.003745 +vt 0.071096 0.021684 +vt 0.867019 0.796088 +vt 0.898384 0.948530 +vt 0.975438 0.659444 +vt 0.415398 0.443676 +vt 0.134329 0.755598 +vt 0.423568 0.746327 +vt 0.432486 0.831221 +vt 0.378985 0.319260 +vt 0.389800 0.142834 +vt 0.661532 0.816979 vt 0.856128 0.426209 -vt 0.788478 0.145439 -vt 0.846410 0.173899 -vt 0.728672 0.031965 -vt 0.742101 0.025332 -vt 0.964998 0.808390 vt 0.190873 0.034994 -vt 0.126138 0.817793 +vt 0.657475 0.667397 +vt 0.489700 0.552446 +vt 0.105711 0.541948 +vt 0.220383 0.706825 +vt 0.674371 0.137246 +vt 0.402646 0.003745 +vt 0.860094 0.526273 +vt 0.088711 0.002435 +vt 0.220442 0.378064 vt 0.753830 0.466720 +vt 0.896778 0.391773 +vt 0.951524 0.646724 +vt 0.490952 0.158111 +vt 0.064557 0.150736 +vt 0.757081 0.309561 +vt 0.202571 0.534959 vt 0.484938 0.364658 -vt 0.071096 0.021684 +vt 0.042952 0.361542 +vt 0.215096 0.219436 +vt 0.753444 0.626844 +vt 0.349109 0.889925 +vt 0.897486 0.233218 vt 0.758611 0.731126 -vt 0.823829 0.978030 +vt 0.180460 0.115857 +vt 0.124760 0.088981 +vt 0.174124 0.350301 vt 0.823831 0.890276 -vt 0.358223 0.841639 -vt 0.349109 0.889925 +vt 0.900260 0.622502 +vt 0.116942 0.194662 +vt 0.093203 0.375171 +vt 0.170289 0.250234 +vt 0.823829 0.978030 vt 0.403002 0.883636 -vt 0.403002 0.831143 -vt 0.896778 0.391773 -vt 0.897486 0.233218 +vt 0.988781 0.256596 +vt 0.358223 0.841639 vt 0.850332 0.233279 vt 0.849664 0.389781 -vt 0.900260 0.622502 -vt 0.951524 0.646724 -vt 0.802328 0.288593 +vt 0.951524 0.600165 +vt 0.951800 0.288159 +vt 0.403002 0.831143 +vt 0.768948 0.976605 +vt 0.942709 0.557990 +vt 0.985658 0.360507 vt 0.799266 0.336212 +vt 0.741267 0.952410 +vt 0.977483 0.324616 +vt 0.802328 0.288593 +vt 0.745671 0.902251 +vt 0.918403 0.548140 vt 0.976228 0.350736 -vt 0.985658 0.360507 -vn -0.4237 -0.9023 -0.0801 -vn 0.8144 -0.0584 0.5774 -vn 0.9122 -0.0427 0.4076 -vn -0.3507 -0.9300 -0.1104 -vn 0.9467 0.0527 0.3176 -vn -0.3869 -0.8910 0.2377 -vn 0.3994 0.9090 0.1190 -vn 0.8467 -0.2037 0.4915 -vn 0.0069 0.6847 0.7288 -vn 0.4080 0.9117 0.0493 -vn -0.3668 0.8849 0.2869 -vn -0.7005 -0.7125 -0.0408 -vn -0.1028 0.7783 0.6194 -vn -0.2840 -0.9571 -0.0581 -vn 0.0799 0.9967 -0.0174 -vn -0.7548 -0.6382 -0.1515 -vn -0.2180 0.8976 0.3833 -vn -0.2033 0.9784 -0.0381 -vn -0.9638 0.1202 -0.2380 -vn 0.4267 0.3986 0.8118 -vn -0.1798 0.0106 0.9837 -vn 0.5139 0.7617 0.3945 -vn -0.2383 -0.0064 0.9712 -vn -0.5983 -0.7587 0.2578 -vn 0.6986 0.4351 0.5680 -vn -0.2621 -0.8972 0.3555 -vn 0.2750 0.7823 0.5588 -vn -0.4531 -0.7983 0.3966 -vn 0.1391 -0.1594 0.9774 -vn -0.4513 -0.8446 0.2881 -vn 0.3569 0.4126 0.8380 -vn -0.5270 -0.3780 0.7612 -vn -0.7210 -0.6092 0.3301 -vn 0.3440 -0.5041 0.7922 -vn -0.1708 0.0000 0.9853 -vn 0.6382 -0.7570 -0.1398 -vn -0.4179 -0.9016 -0.1117 -vn 0.9961 -0.0427 -0.0769 -vn -0.3591 -0.9311 -0.0647 -vn 0.7851 -0.5223 -0.3329 -vn 0.0824 0.7189 -0.6902 -vn -0.6186 -0.4547 -0.6408 -vn 0.6491 -0.7574 -0.0716 -vn 0.9984 0.0527 0.0195 -vn -0.5358 -0.8380 -0.1031 -vn 0.7167 0.2706 -0.6427 -vn -0.4366 -0.5798 -0.6879 -vn -0.2849 -0.8916 -0.3521 -vn 0.4158 0.9091 0.0248 -vn 0.9627 -0.2037 -0.1779 -vn 0.0723 0.9510 -0.3006 -vn 0.2519 0.6935 -0.6750 -vn -0.4429 -0.8924 -0.0869 -vn 0.4008 0.9117 0.0909 -vn 0.8210 0.4866 -0.2986 -vn 0.6772 -0.6972 -0.2351 -vn 0.9061 -0.1872 -0.3794 -vn -0.6734 -0.7125 -0.1972 -vn -0.3086 0.8291 -0.4663 -vn 0.1116 0.7783 -0.6179 -vn -0.2903 -0.9567 -0.0211 -vn 0.0694 0.9967 0.0433 -vn 0.5073 -0.8490 0.1478 -vn -0.7618 -0.6382 -0.1114 -vn -0.0707 0.8870 -0.4563 -vn -0.6018 -0.7963 -0.0620 -vn -0.7723 -0.3531 -0.5281 -vn -0.2042 0.9784 -0.0325 -vn 0.7669 0.5954 0.2396 -vn -0.9877 0.1202 -0.1002 -vn 0.6750 0.3986 -0.6209 -vn 0.1747 -0.0015 -0.9846 -vn 0.6946 0.7191 -0.0192 -vn 0.2345 0.0391 -0.9713 -vn 0.8489 0.4356 -0.2993 -vn 0.3175 -0.1121 -0.9416 -vn -0.3990 0.6408 0.6558 -vn 0.4279 -0.1971 -0.8820 -vn -0.3890 -0.8215 -0.4169 -vn 0.6208 0.4146 -0.6654 -vn 0.0559 0.4367 -0.8979 -vn -0.2397 -0.3769 -0.8947 -vn -0.4549 0.3624 -0.8135 -vn -0.5687 -0.6097 -0.5521 -vn 0.3118 0.8664 -0.3902 -vn -0.0881 -0.5021 -0.8603 -vn 0.3703 0.6162 -0.6952 -vn -0.3983 0.3446 -0.8500 -vn 0.5905 -0.5041 -0.6302 -vn 0.5540 -0.7570 0.3464 -vn -0.7819 -0.4323 0.4492 -vn 0.4635 0.8813 0.0920 -vn 0.7277 -0.6130 0.3078 -vn 0.9682 0.0539 0.2445 -vn 0.6800 0.6955 0.2323 -vn -0.5491 -0.8323 -0.0765 -vn -0.1547 0.7189 0.6776 -vn -0.2575 -0.9660 0.0237 -vn -0.7982 -0.4547 0.3952 -vn 0.4497 0.8903 0.0722 -vn 0.5446 -0.7322 0.4089 -vn -0.0251 0.6599 0.7509 -vn 0.1883 -0.5773 0.7945 -vn 0.2305 0.9501 0.2104 -vn -0.5393 -0.8380 -0.0832 -vn 0.4248 0.2571 0.8680 -vn -0.6427 -0.5798 0.5008 -vn 0.5078 -0.7663 0.3937 -vn -0.0426 0.9320 0.3600 -vn -0.4463 -0.8924 -0.0672 -vn 0.5132 -0.1156 0.8505 -vn -0.7219 -0.6794 -0.1314 -vn -0.2719 0.6256 0.7312 -vn -0.4359 -0.8995 0.0288 -vn 0.2540 0.9594 0.1226 -vn 0.6726 0.4866 0.5575 -vn -0.4125 0.8798 0.2364 -vn 0.5586 -0.6972 0.4493 -vn 0.7256 -0.1872 0.6622 -vn 0.8809 0.4717 0.0379 -vn 0.5274 -0.8490 0.0315 -vn -0.5607 -0.8221 -0.0985 -vn -0.1237 0.9911 0.0498 -vn 0.5204 -0.7859 0.3340 -vn 0.7608 0.6164 0.2029 -vn -0.9753 -0.2073 -0.0767 -vn 0.0646 0.6614 0.7473 -vn -0.8433 0.5314 -0.0806 -vn -0.4677 -0.8833 -0.0307 -vn -0.9055 -0.3535 0.2345 -vn -0.1779 -0.0031 0.9840 -vn 0.8018 0.5960 0.0432 -vn 0.6709 0.4046 0.6214 -vn -0.1815 0.0080 0.9834 -vn -0.1707 0.0040 0.9853 -vn 0.0619 -0.0609 0.9962 -vn -0.1476 0.0037 0.9890 -vn -0.8181 -0.0904 0.5680 -vn 0.7661 0.6322 0.1162 -vn -0.5650 -0.7740 0.2857 -vn -0.4432 -0.8538 0.2732 -vn 0.5790 0.5980 0.5542 -vn 0.3402 0.8179 0.4640 -vn -0.2495 0.4367 0.8643 -vn 0.1475 -0.1544 0.9769 -vn -0.2552 0.7119 0.6543 -vn -0.7021 0.3624 0.6130 -vn 0.3420 0.8098 0.4767 -vn 0.4326 0.4716 0.7684 -vn -0.1757 0.0067 0.9844 -vn 0.1623 0.8664 0.4723 -vn -0.7179 -0.6214 0.3137 -vn -0.0325 -0.0840 0.9959 -vn 0.4074 0.7497 0.5216 -vn -0.4674 0.8715 0.1483 -vn -0.4248 -0.0530 0.9037 -vn 0.0807 0.4765 0.8755 -vn -0.3719 -0.4950 0.7852 -vn -0.4643 -0.8079 -0.3631 -vn 0.1147 0.6162 0.7792 -vn -0.6612 0.3446 0.6664 -vn 0.8398 0.0768 0.5375 -vn -0.5645 -0.8252 -0.0177 -vn -0.2173 -0.3641 0.9057 -vn 0.9985 -0.0473 -0.0291 -vn -0.1567 0.6215 -0.7676 -vn -0.5854 -0.4330 -0.6854 -vn 0.4641 0.8824 0.0776 -vn 0.9940 0.0539 0.0956 -vn 0.7191 0.6947 0.0134 -vn -0.5428 -0.8323 -0.1127 -vn -0.2349 -0.9646 -0.1197 -vn 0.4569 0.8869 0.0679 -vn 0.2280 0.6613 -0.7146 -vn 0.4447 -0.5773 -0.6848 -vn 0.6651 -0.7251 -0.1784 -vn 0.3116 0.9333 -0.1786 -vn 0.7772 -0.1114 -0.6193 -vn -0.7240 -0.6794 -0.1192 -vn -0.2832 0.9175 -0.2793 -vn -0.0103 0.6246 -0.7809 -vn -0.4029 -0.8994 -0.1693 -vn 0.2804 0.9594 -0.0300 -vn 0.8425 0.4942 0.2141 -vn -0.0997 0.9911 -0.0885 -vn 0.6024 -0.7859 -0.1394 -vn 0.7835 0.6171 0.0722 -vn -0.9442 -0.2073 -0.2560 -vn 0.3077 0.6613 -0.6841 -vn -0.8212 0.5314 -0.2079 -vn -0.4482 -0.8706 -0.2029 -vn 0.1676 0.0050 -0.9858 -vn 0.8524 0.4570 -0.2542 -vn 0.1705 -0.0037 -0.9854 -vn 0.1202 -0.0347 -0.9921 -vn -0.5792 -0.0904 -0.8101 -vn 0.4546 -0.0134 -0.8906 -vn 0.7602 0.6320 0.1504 -vn 0.4451 0.7928 -0.4163 -vn -0.4360 -0.7732 -0.4606 -vn -0.3331 -0.8531 -0.4015 -vn 0.7312 0.5976 -0.3288 -vn 0.4734 0.8212 -0.3187 -vn 0.4660 -0.1733 -0.8677 -vn -0.0201 0.7119 -0.7020 -vn 0.4838 0.8104 -0.3306 -vn 0.6661 0.4709 -0.5784 -vn 0.1662 0.0090 -0.9861 -vn -0.5708 -0.6202 -0.5381 -vn 0.3072 -0.0930 -0.9471 -vn 0.5592 0.7498 -0.3538 -vn -0.3820 0.8695 -0.3133 -vn -0.0960 -0.0529 -0.9940 -vn 0.3706 0.4763 -0.7974 -vn -0.5599 -0.8070 0.1878 -vn 0.9716 0.0495 -0.2316 -vn -0.5376 -0.8252 -0.1733 -vn 0.1002 -0.3641 -0.9260 -usemtl Blåhaj -s off -f 64/1/1 5/2/1 62/3/1 -f 99/4/2 3/5/2 55/6/2 -f 72/7/3 15/8/3 81/9/3 -f 66/10/4 5/2/4 64/1/4 -f 83/11/5 7/12/5 85/13/5 -f 70/14/6 13/15/6 68/16/6 -f 49/17/7 23/18/7 51/19/7 -f 85/13/8 7/12/8 87/20/8 -f 102/21/9 9/22/9 104/23/9 -f 88/24/10 24/25/10 47/26/10 -f 69/27/11 14/28/11 71/29/11 -f 89/30/12 29/31/12 91/32/12 -f 106/33/13 10/34/13 108/35/13 -f 58/36/14 11/37/14 56/38/14 -f 92/39/15 18/40/15 90/41/15 -f 91/32/16 29/31/16 93/42/16 -f 73/43/17 16/44/17 75/45/17 -f 96/46/18 30/47/18 94/48/18 -f 95/49/19 8/50/19 97/51/19 -f 77/52/20 17/53/20 79/54/20 -f 14/55/21 15/56/21 16/57/21 -f 2/58/22 20/59/22 3/60/22 -f 2/61/23 3/62/23 19/63/23 -f 11/37/24 4/64/24 26/65/24 -f 20/59/25 28/66/25 21/67/25 -f 5/2/26 13/15/26 27/68/26 -f 2/58/27 23/18/27 20/59/27 -f 4/64/28 27/68/28 26/65/28 -f 27/69/29 22/70/29 28/71/29 -f 5/2/30 27/68/30 4/64/30 -f 33/72/31 39/73/31 28/71/31 -f 34/74/32 40/75/32 35/76/32 -f 25/77/33 34/78/33 29/31/33 -f 46/79/34 44/80/34 42/81/34 -f 77/82/35 78/83/35 79/84/35 -f 78/85/36 126/86/36 79/87/36 -f 136/88/37 64/1/37 62/3/37 -f 125/89/38 72/7/38 81/9/38 -f 136/88/39 66/10/39 64/1/39 -f 99/4/40 119/90/40 101/91/40 -f 100/92/41 120/93/41 98/94/41 -f 82/95/42 116/96/42 84/97/42 -f 101/91/43 119/90/43 103/98/43 -f 117/99/44 83/11/44 85/13/44 -f 50/100/45 110/101/45 52/102/45 -f 105/103/46 128/104/46 104/23/46 -f 84/97/47 116/96/47 86/105/47 -f 114/106/48 70/14/48 68/16/48 -f 131/107/49 49/17/49 51/19/49 -f 117/99/50 85/13/50 87/20/50 -f 69/108/51 124/109/51 67/110/51 -f 128/104/52 102/21/52 104/23/52 -f 52/102/53 110/101/53 54/111/53 -f 132/112/54 88/24/54 47/26/54 -f 109/113/55 121/114/55 108/35/55 -f 72/7/56 125/89/56 74/115/56 -f 107/116/57 121/117/57 109/118/57 -f 133/119/58 89/30/58 91/32/58 -f 115/120/59 71/29/59 73/121/59 -f 121/114/60 106/33/60 108/35/60 -f 113/122/61 58/36/61 56/38/61 -f 127/123/62 92/39/62 90/41/62 -f 74/115/63 125/89/63 76/124/63 -f 133/119/64 91/32/64 93/42/64 -f 115/125/65 73/43/65 75/45/65 -f 113/122/66 60/126/66 58/36/66 -f 70/127/67 114/128/67 80/129/67 -f 137/130/68 96/46/68 94/48/68 -f 61/131/69 123/132/69 59/133/69 -f 118/134/70 95/49/70 97/51/70 -f 126/135/71 77/52/71 79/54/71 -f 115/136/72 126/137/72 125/138/72 -f 129/139/73 111/140/73 112/141/73 -f 128/142/74 119/143/74 120/144/74 -f 135/145/75 129/139/75 122/146/75 -f 130/147/76 114/148/76 136/149/76 -f 2/61/77 19/63/77 98/150/77 53/151/77 -f 130/147/78 136/149/78 135/152/78 -f 113/122/79 140/153/79 136/88/79 -f 147/154/80 141/155/80 135/152/80 -f 139/156/81 146/157/81 144/158/81 -f 148/159/82 142/160/82 143/161/82 -f 137/162/83 144/158/83 118/163/83 -f 142/164/84 134/165/84 133/119/84 -f 132/112/85 139/166/85 127/123/85 -f 138/167/86 145/168/86 140/169/86 -f 154/170/87 153/171/87 151/172/87 -f 151/173/88 153/174/88 149/175/88 -f 152/176/89 154/177/89 150/178/89 -f 78/85/90 79/87/90 17/179/90 -f 6/180/91 13/181/91 80/129/91 82/95/91 -f 23/18/92 49/17/92 47/26/92 24/25/92 -f 9/182/93 3/5/93 99/4/93 101/91/93 -f 7/12/94 83/11/94 81/9/94 15/8/94 -f 22/183/95 65/184/95 63/185/95 12/186/95 -f 1/187/96 25/77/96 48/188/96 50/100/96 -f 100/92/97 98/94/97 19/189/97 -f 5/2/98 66/10/98 68/16/98 13/15/98 -f 82/95/99 84/97/99 6/180/99 -f 14/190/100 67/110/100 65/184/100 22/183/100 -f 101/91/101 103/98/101 9/182/101 -f 9/22/102 102/21/102 100/92/102 19/189/102 -f 6/191/103 86/192/103 87/20/103 7/12/103 -f 23/193/104 2/194/104 53/195/104 51/196/104 -f 50/100/105 52/102/105 1/187/105 -f 105/103/106 104/23/106 9/22/106 -f 84/97/107 86/105/107 6/180/107 -f 103/98/108 105/197/108 9/182/108 -f 69/108/109 67/110/109 14/190/109 -f 52/102/110 54/111/110 1/187/110 -f 12/198/111 63/199/111 107/116/111 10/200/111 -f 29/31/112 89/30/112 48/188/112 25/77/112 -f 12/201/113 10/34/113 106/33/113 61/202/113 -f 1/187/114 54/111/114 56/38/114 11/37/114 -f 24/25/115 88/24/115 90/41/115 18/40/115 -f 109/113/116 108/35/116 10/34/116 -f 16/203/117 73/121/117 71/29/117 14/28/117 -f 72/7/118 74/115/118 15/8/118 -f 107/116/119 109/118/119 10/200/119 -f 21/67/120 57/204/120 55/205/120 3/60/120 -f 74/115/121 76/124/121 15/8/121 -f 11/37/122 58/36/122 60/126/122 4/64/122 -f 18/206/123 92/39/123 94/207/123 30/208/123 -f 17/179/124 15/8/124 76/124/124 78/85/124 -f 21/67/125 12/186/125 59/133/125 57/204/125 -f 8/50/126 95/49/126 93/209/126 29/210/126 -f 17/53/127 77/52/127 75/45/127 16/44/127 -f 30/47/128 96/46/128 97/51/128 8/50/128 -f 4/64/129 60/126/129 62/3/129 5/2/129 -f 70/127/130 80/129/130 13/181/130 -f 6/211/131 7/212/131 15/56/131 13/213/131 -f 61/131/132 59/133/132 12/186/132 -f 3/60/133 20/59/133 21/67/133 -f 14/55/134 13/213/134 15/56/134 -f 16/57/135 15/56/135 17/214/135 -f 13/215/136 14/216/136 22/70/136 27/69/136 -f 19/63/137 3/62/137 9/217/137 -f 36/218/138 8/219/138 29/220/138 35/76/138 -f 12/186/139 21/67/139 22/183/139 -f 34/78/140 25/77/140 1/187/140 31/221/140 -f 26/65/141 31/221/141 1/187/141 11/37/141 -f 21/67/142 28/66/142 22/183/142 -f 23/18/143 33/222/143 20/59/143 -f 32/223/144 36/218/144 38/224/144 -f 26/225/145 27/69/145 28/71/145 -f 36/218/146 32/223/146 18/226/146 30/227/146 -f 30/227/147 8/219/147 36/218/147 -f 32/228/148 33/222/148 23/18/148 24/25/148 -f 20/59/149 33/222/149 28/66/149 -f 39/73/150 38/224/150 40/75/150 37/229/150 -f 24/25/151 18/40/151 32/228/151 -f 29/31/152 34/78/152 35/230/152 -f 26/225/153 28/71/153 39/73/153 37/229/153 -f 43/231/154 46/232/154 37/233/154 40/234/154 -f 41/235/155 43/236/155 40/237/155 34/238/155 -f 38/224/156 36/218/156 35/76/156 40/75/156 -f 38/224/157 39/73/157 33/72/157 32/223/157 -f 31/239/158 26/225/158 37/229/158 -f 41/240/159 34/241/159 31/242/159 42/243/159 -f 46/232/160 43/231/160 45/244/160 -f 43/245/161 41/246/161 45/247/161 -f 42/81/162 31/248/162 37/249/162 46/79/162 -f 45/250/163 41/240/163 42/243/163 44/251/163 -f 49/252/35 47/253/35 48/254/35 50/255/35 -f 44/256/164 46/257/164 45/247/164 -f 52/258/35 51/259/35 49/252/35 50/255/35 -f 54/260/35 53/261/35 51/259/35 52/258/35 -f 55/262/35 53/261/35 54/260/35 56/263/35 -f 57/264/35 55/262/35 56/263/35 58/265/35 -f 59/266/35 57/264/35 58/265/35 60/267/35 -f 61/268/35 59/266/35 60/267/35 62/269/35 -f 63/270/35 61/268/35 62/269/35 64/271/35 -f 65/272/35 63/270/35 64/271/35 66/273/35 -f 68/274/35 67/275/35 65/272/35 66/273/35 -f 70/276/35 69/277/35 67/275/35 68/274/35 -f 72/278/35 71/279/35 69/277/35 70/276/35 -f 74/280/35 73/281/35 71/279/35 72/278/35 -f 76/282/35 75/283/35 73/281/35 74/280/35 -f 78/83/35 77/82/35 75/283/35 76/282/35 -f 81/284/35 72/278/35 70/276/35 80/285/35 -f 82/286/35 83/287/35 81/284/35 80/285/35 -f 85/288/35 83/287/35 82/286/35 84/289/35 -f 87/290/35 85/288/35 84/289/35 86/291/35 -f 89/292/35 48/254/35 47/253/35 88/293/35 -f 90/294/35 91/295/35 89/292/35 88/293/35 -f 92/296/35 93/297/35 91/295/35 90/294/35 -f 94/298/35 95/299/35 93/297/35 92/296/35 -f 97/300/35 95/299/35 94/298/35 96/301/35 -f 99/302/35 98/303/35 53/261/35 55/262/35 -f 101/304/35 100/305/35 98/303/35 99/302/35 -f 103/306/35 102/307/35 100/305/35 101/304/35 -f 104/308/35 102/307/35 103/306/35 105/309/35 -f 107/310/35 106/311/35 61/268/35 63/270/35 -f 109/312/35 108/313/35 106/311/35 107/310/35 -f 99/4/165 55/6/165 112/314/165 119/90/165 -f 111/315/166 53/151/166 98/150/166 120/144/166 -f 116/96/167 82/95/167 80/129/167 114/128/167 -f 47/26/168 49/17/168 131/107/168 132/112/168 -f 81/9/169 83/11/169 117/99/169 125/89/169 -f 63/185/170 65/184/170 130/316/170 123/132/170 -f 110/101/171 50/100/171 48/188/171 134/165/171 -f 68/16/172 66/10/172 136/88/172 114/106/172 -f 65/184/173 67/110/173 124/109/173 130/316/173 -f 100/92/174 102/21/174 128/104/174 120/93/174 -f 87/20/175 86/192/175 116/317/175 117/99/175 -f 128/318/176 105/197/176 103/98/176 119/90/176 -f 131/319/177 51/196/177 53/195/177 111/320/177 -f 107/116/178 63/199/178 123/321/178 121/117/178 -f 48/188/179 89/30/179 133/119/179 134/165/179 -f 69/27/180 71/29/180 115/120/180 124/322/180 -f 123/323/181 61/202/181 106/33/181 121/114/181 -f 56/38/182 54/111/182 110/101/182 113/122/182 -f 90/41/183 88/24/183 132/112/183 127/123/183 -f 55/205/184 57/204/184 122/146/184 112/141/184 -f 94/207/185 92/39/185 127/324/185 137/325/185 -f 126/86/186 78/85/186 76/124/186 125/89/186 -f 122/146/187 57/204/187 59/133/187 123/132/187 -f 93/209/188 95/49/188 118/134/188 133/326/188 -f 75/45/189 77/52/189 126/135/189 115/125/189 -f 97/51/190 96/46/190 137/130/190 118/134/190 -f 62/3/191 60/126/191 113/122/191 136/88/191 -f 125/138/192 114/327/192 124/328/192 115/136/192 -f 122/146/193 129/139/193 112/141/193 -f 116/329/194 114/327/194 125/138/194 117/330/194 -f 119/143/195 112/331/195 111/315/195 120/144/195 -f 133/332/196 118/163/196 144/158/196 143/161/196 -f 130/147/197 124/333/197 114/148/197 -f 130/316/198 122/146/198 123/132/198 -f 111/140/199 129/139/199 131/107/199 -f 110/101/200 134/165/200 142/164/200 138/334/200 -f 140/153/201 113/122/201 110/101/201 138/334/201 -f 130/316/202 135/145/202 122/146/202 -f 129/139/203 141/335/203 131/107/203 -f 135/152/204 136/149/204 140/169/204 -f 144/158/205 137/162/205 127/336/205 139/156/205 -f 139/166/206 132/112/206 131/107/206 141/335/206 -f 135/145/207 141/335/207 129/139/207 -f 148/159/208 146/157/208 147/154/208 145/168/208 -f 143/337/209 142/164/209 133/119/209 -f 140/169/210 145/168/210 147/154/210 135/152/210 -f 151/172/211 148/338/211 145/339/211 154/170/211 -f 149/340/212 142/341/212 148/342/212 151/343/212 -f 143/161/213 144/158/213 146/157/213 148/159/213 -f 146/157/214 139/156/214 141/155/214 147/154/214 -f 138/344/215 142/345/215 149/346/215 150/347/215 -f 145/348/216 138/349/216 150/178/216 154/177/216 -f 150/347/217 149/346/217 153/350/217 152/351/217 -f 153/174/218 154/352/218 152/353/218 +s 0 +f 64/146/1 5/9/1 62/142/1 +f 99/225/2 3/7/2 55/126/2 +f 72/164/3 15/34/3 81/185/3 +f 66/151/4 5/9/4 64/146/4 +f 83/189/5 7/13/5 85/192/5 +f 70/159/6 13/26/6 68/155/6 +f 49/112/7 23/52/7 51/115/7 +f 85/192/8 7/13/8 87/198/8 +f 102/231/9 9/19/9 104/234/9 +f 88/200/10 24/53/10 47/107/10 +f 69/157/11 14/31/11 71/163/11 +f 89/202/12 29/61/12 91/205/12 +f 106/240/13 10/21/13 108/243/13 +f 58/132/14 11/22/14 56/128/14 +f 92/208/15 18/42/15 90/204/15 +f 91/205/16 29/61/16 93/209/16 +f 73/166/17 16/36/17 75/172/17 +f 96/218/18 30/66/18 94/212/18 +f 95/216/19 8/15/19 97/220/19 +f 77/176/20 17/41/20 79/180/20 +f 14/32/21 15/35/21 16/37/21 +f 2/2/22 20/47/22 3/5/22 +f 2/3/23 3/6/23 19/46/23 +f 11/22/24 4/8/24 26/55/24 +f 20/47/25 28/59/25 21/48/25 +f 5/9/26 13/26/26 27/57/26 +f 2/2/27 23/52/27 20/47/27 +f 4/8/28 27/57/28 26/55/28 +f 27/58/29 22/50/29 28/60/29 +f 5/9/30 27/57/30 4/8/30 +f 33/74/31 39/86/31 28/60/31 +f 34/75/32 40/88/32 35/80/32 +f 25/54/33 34/77/33 29/61/33 +f 46/104/34 44/98/34 42/93/34 +f 77/175/35 78/177/35 79/179/35 +f 78/178/36 126/287/36 79/181/36 +f 136/308/37 64/146/37 62/142/37 +f 125/284/38 72/164/38 81/185/38 +f 136/308/39 66/151/39 64/146/39 +f 99/225/40 119/270/40 101/228/40 +f 100/227/41 120/272/41 98/221/41 +f 82/187/42 116/264/42 84/190/42 +f 101/228/43 119/270/43 103/233/43 +f 117/266/44 83/189/44 85/192/44 +f 50/114/45 110/248/45 52/118/45 +f 105/236/46 128/293/46 104/234/46 +f 84/190/47 116/264/47 86/194/47 +f 114/257/48 70/159/48 68/155/48 +f 131/299/49 49/112/49 51/115/49 +f 117/266/50 85/192/50 87/198/50 +f 69/156/51 124/281/51 67/153/51 +f 128/293/52 102/231/52 104/234/52 +f 52/118/53 110/248/53 54/124/53 +f 132/300/54 88/200/54 47/107/54 +f 109/245/55 121/275/55 108/243/55 +f 72/164/56 125/284/56 74/169/56 +f 107/242/57 121/274/57 109/246/57 +f 133/301/58 89/202/58 91/205/58 +f 115/262/59 71/163/59 73/167/59 +f 121/275/60 106/240/60 108/243/60 +f 113/255/61 58/132/61 56/128/61 +f 127/289/62 92/208/62 90/204/62 +f 74/169/63 125/284/63 76/174/63 +f 133/301/64 91/205/64 93/209/64 +f 115/260/65 73/166/65 75/172/65 +f 113/255/66 60/137/66 58/132/66 +f 70/160/67 114/256/67 80/183/67 +f 137/310/68 96/218/68 94/212/68 +f 61/138/69 123/277/69 59/135/69 +f 118/268/70 95/216/70 97/220/70 +f 126/288/71 77/176/71 79/180/71 +f 115/261/72 126/286/72 125/285/72 +f 129/295/73 111/250/73 112/252/73 +f 128/292/74 119/271/74 120/273/74 +f 135/305/75 129/295/75 122/276/75 +f 130/296/76 114/258/76 136/307/76 +f 2/3/77 98/223/77 53/121/77 +f 130/296/78 136/307/78 135/306/78 +f 113/255/79 140/318/79 136/308/79 +f 147/333/80 141/321/80 135/306/80 +f 139/317/81 146/332/81 144/328/81 +f 148/334/82 142/322/82 143/327/82 +f 137/311/83 144/328/83 118/269/83 +f 142/323/84 134/304/84 133/301/84 +f 132/300/85 139/316/85 127/289/85 +f 138/312/86 145/329/86 140/319/86 +f 154/351/87 153/348/87 151/344/87 +f 151/342/88 153/349/88 149/337/88 +f 152/345/89 154/352/89 150/341/89 +f 78/178/90 79/181/90 17/40/90 +f 6/11/91 80/183/91 82/187/91 +f 49/112/92 24/53/92 23/52/92 +f 3/7/93 101/228/93 9/17/93 +f 7/13/94 81/185/94 15/34/94 +f 22/49/95 63/144/95 12/25/95 +f 25/54/96 50/114/96 1/1/96 +f 100/227/97 98/221/97 19/45/97 +f 5/9/98 68/155/98 13/26/98 +f 82/187/99 84/190/99 6/11/99 +f 67/153/100 22/49/100 14/30/100 +f 101/228/101 103/233/101 9/17/101 +f 9/19/102 100/227/102 19/45/102 +f 6/12/103 87/198/103 7/13/103 +f 23/51/104 53/122/104 51/117/104 +f 50/114/105 52/118/105 1/1/105 +f 105/236/106 104/234/106 9/19/106 +f 84/190/107 86/194/107 6/11/107 +f 103/233/108 105/238/108 9/17/108 +f 69/156/109 67/153/109 14/30/109 +f 52/118/110 54/124/110 1/1/110 +f 12/23/111 107/242/111 10/20/111 +f 89/202/112 25/54/112 29/61/112 +f 12/24/113 106/240/113 61/140/113 +f 54/124/114 11/22/114 1/1/114 +f 24/53/115 90/204/115 18/42/115 +f 109/245/116 108/243/116 10/21/116 +f 16/38/117 71/163/117 14/31/117 +f 72/164/118 74/169/118 15/34/118 +f 107/242/119 109/246/119 10/20/119 +f 21/48/120 55/127/120 3/5/120 +f 74/169/121 76/174/121 15/34/121 +f 11/22/122 60/137/122 4/8/122 +f 18/43/123 94/214/123 30/64/123 +f 17/40/124 76/174/124 78/178/124 +f 21/48/125 59/135/125 57/131/125 +f 95/216/126 29/62/126 8/15/126 +f 17/41/127 75/172/127 16/36/127 +f 30/66/128 97/220/128 8/15/128 +f 4/8/129 62/142/129 5/9/129 +f 70/160/130 80/183/130 13/27/130 +f 7/14/131 13/28/131 6/10/131 +f 61/138/132 59/135/132 12/25/132 +f 3/5/133 20/47/133 21/48/133 +f 14/32/134 13/28/134 15/35/134 +f 16/37/135 15/35/135 17/39/135 +f 13/29/136 22/50/136 27/58/136 +f 19/46/137 3/6/137 9/18/137 +f 36/81/138 29/63/138 35/80/138 +f 12/25/139 21/48/139 22/49/139 +f 34/77/140 1/1/140 31/68/140 +f 31/68/141 11/22/141 26/55/141 +f 21/48/142 28/59/142 22/49/142 +f 23/52/143 33/73/143 20/47/143 +f 32/71/144 36/81/144 38/85/144 +f 26/56/145 27/58/145 28/60/145 +f 36/81/146 18/44/146 30/65/146 +f 30/65/147 8/16/147 36/81/147 +f 32/72/148 23/52/148 24/53/148 +f 20/47/149 33/73/149 28/59/149 +f 39/86/150 40/88/150 37/82/150 +f 24/53/151 18/42/151 32/72/151 +f 29/61/152 34/77/152 35/79/152 +f 26/56/153 39/86/153 37/82/153 +f 43/96/154 37/83/154 40/87/154 +f 41/91/155 40/89/155 34/76/155 +f 38/85/156 35/80/156 40/88/156 +f 38/85/157 33/74/157 32/71/157 +f 31/67/158 26/56/158 37/82/158 +f 34/78/159 42/94/159 41/92/159 +f 46/106/160 43/96/160 45/101/160 +f 43/95/161 41/90/161 45/103/161 +f 42/93/162 37/84/162 46/104/162 +f 41/92/163 44/100/163 45/102/163 +f 49/111/35 48/109/35 50/113/35 +f 44/99/164 46/105/164 45/103/164 +f 52/119/35 49/111/35 50/113/35 +f 54/123/35 51/116/35 52/119/35 +f 55/125/35 54/123/35 56/129/35 +f 57/130/35 56/129/35 58/133/35 +f 59/134/35 58/133/35 60/136/35 +f 61/139/35 60/136/35 62/141/35 +f 63/143/35 62/141/35 64/147/35 +f 65/148/35 64/147/35 66/150/35 +f 68/154/35 65/148/35 66/150/35 +f 70/161/35 67/152/35 68/154/35 +f 72/165/35 69/158/35 70/161/35 +f 74/170/35 71/162/35 72/165/35 +f 76/173/35 73/168/35 74/170/35 +f 78/177/35 75/171/35 76/173/35 +f 81/184/35 70/161/35 80/182/35 +f 82/186/35 81/184/35 80/182/35 +f 85/193/35 82/186/35 84/191/35 +f 87/197/35 84/191/35 86/195/35 +f 89/201/35 47/108/35 88/199/35 +f 90/203/35 89/201/35 88/199/35 +f 92/207/35 91/206/35 90/203/35 +f 94/213/35 93/211/35 92/207/35 +f 97/219/35 94/213/35 96/217/35 +f 99/224/35 53/120/35 55/125/35 +f 101/229/35 98/222/35 99/224/35 +f 103/232/35 100/226/35 101/229/35 +f 104/235/35 103/232/35 105/237/35 +f 107/241/35 61/139/35 63/143/35 +f 109/247/35 106/239/35 107/241/35 +f 99/225/165 112/253/165 119/270/165 +f 111/251/166 98/223/166 120/273/166 +f 116/264/167 80/183/167 114/256/167 +f 49/112/168 132/300/168 47/107/168 +f 81/185/169 117/266/169 125/284/169 +f 63/144/170 130/297/170 123/277/170 +f 50/114/171 134/304/171 110/248/171 +f 68/155/172 136/308/172 114/257/172 +f 67/153/173 130/297/173 65/149/173 +f 100/227/174 128/293/174 120/272/174 +f 87/198/175 116/265/175 117/266/175 +f 128/294/176 103/233/176 119/270/176 +f 131/298/177 53/122/177 111/249/177 +f 107/242/178 123/278/178 121/274/178 +f 89/202/179 134/304/179 48/110/179 +f 71/163/180 124/282/180 69/157/180 +f 123/279/181 106/240/181 121/275/181 +f 54/124/182 113/255/182 56/128/182 +f 90/204/183 132/300/183 127/289/183 +f 55/127/184 122/276/184 112/252/184 +f 94/214/185 127/290/185 137/309/185 +f 126/287/186 76/174/186 125/284/186 +f 122/276/187 59/135/187 123/277/187 +f 95/216/188 133/302/188 93/210/188 +f 75/172/189 126/288/189 115/260/189 +f 97/220/190 137/310/190 118/268/190 +f 62/142/191 113/255/191 136/308/191 +f 125/285/192 124/283/192 115/261/192 +f 122/276/193 129/295/193 112/252/193 +f 114/259/194 117/267/194 116/263/194 +f 119/271/195 111/251/195 120/273/195 +f 133/303/196 144/328/196 143/327/196 +f 130/296/197 124/280/197 114/258/197 +f 130/297/198 122/276/198 123/277/198 +f 111/250/199 129/295/199 131/299/199 +f 110/248/200 142/323/200 138/313/200 +f 113/255/201 138/313/201 140/318/201 +f 130/297/202 135/305/202 122/276/202 +f 129/295/203 141/320/203 131/299/203 +f 135/306/204 136/307/204 140/319/204 +f 144/328/205 127/291/205 139/317/205 +f 139/316/206 131/299/206 141/320/206 +f 135/305/207 141/320/207 129/295/207 +f 148/334/208 147/333/208 145/329/208 +f 143/326/209 142/323/209 133/301/209 +f 140/319/210 147/333/210 135/306/210 +f 151/344/211 145/330/211 154/351/211 +f 149/338/212 148/336/212 151/343/212 +f 143/327/213 146/332/213 148/334/213 +f 146/332/214 141/321/214 147/333/214 +f 138/314/215 149/339/215 150/340/215 +f 145/331/216 150/341/216 154/352/216 +f 149/339/217 152/347/217 150/340/217 +f 153/349/218 154/353/218 152/346/218 +f 2/3/219 19/46/219 98/223/219 +f 6/11/220 13/27/220 80/183/220 +f 49/112/221 47/107/221 24/53/221 +f 3/7/222 99/225/222 101/228/222 +f 7/13/223 83/189/223 81/185/223 +f 22/49/224 65/149/224 63/144/224 +f 25/54/225 48/110/225 50/114/225 +f 5/9/226 66/151/226 68/155/226 +f 67/153/227 65/149/227 22/49/227 +f 9/19/228 102/231/228 100/227/228 +f 6/12/229 86/196/229 87/198/229 +f 23/51/230 2/4/230 53/122/230 +f 12/23/231 63/145/231 107/242/231 +f 89/202/232 48/110/232 25/54/232 +f 12/24/233 10/21/233 106/240/233 +f 54/124/234 56/128/234 11/22/234 +f 24/53/235 88/200/235 90/204/235 +f 16/38/236 73/167/236 71/163/236 +f 21/48/237 57/131/237 55/127/237 +f 11/22/238 58/132/238 60/137/238 +f 18/43/239 92/208/239 94/214/239 +f 17/40/240 15/34/240 76/174/240 +f 21/48/241 12/25/241 59/135/241 +f 95/216/242 93/210/242 29/62/242 +f 17/41/243 77/176/243 75/172/243 +f 30/66/244 96/218/244 97/220/244 +f 4/8/245 60/137/245 62/142/245 +f 7/14/246 15/35/246 13/28/246 +f 13/29/247 14/33/247 22/50/247 +f 36/81/248 8/16/248 29/63/248 +f 34/77/249 25/54/249 1/1/249 +f 31/68/250 1/1/250 11/22/250 +f 36/81/251 32/71/251 18/44/251 +f 32/72/252 33/73/252 23/52/252 +f 39/86/253 38/85/253 40/88/253 +f 26/56/254 28/60/254 39/86/254 +f 43/96/255 46/106/255 37/83/255 +f 41/91/256 43/97/256 40/89/256 +f 38/85/257 36/81/257 35/80/257 +f 38/85/258 39/86/258 33/74/258 +f 34/78/259 31/69/259 42/94/259 +f 42/93/260 31/70/260 37/84/260 +f 41/92/261 42/94/261 44/100/261 +f 49/111/35 47/108/35 48/109/35 +f 52/119/35 51/116/35 49/111/35 +f 54/123/35 53/120/35 51/116/35 +f 55/125/35 53/120/35 54/123/35 +f 57/130/35 55/125/35 56/129/35 +f 59/134/35 57/130/35 58/133/35 +f 61/139/35 59/134/35 60/136/35 +f 63/143/35 61/139/35 62/141/35 +f 65/148/35 63/143/35 64/147/35 +f 68/154/35 67/152/35 65/148/35 +f 70/161/35 69/158/35 67/152/35 +f 72/165/35 71/162/35 69/158/35 +f 74/170/35 73/168/35 71/162/35 +f 76/173/35 75/171/35 73/168/35 +f 78/177/35 77/175/35 75/171/35 +f 81/184/35 72/165/35 70/161/35 +f 82/186/35 83/188/35 81/184/35 +f 85/193/35 83/188/35 82/186/35 +f 87/197/35 85/193/35 84/191/35 +f 89/201/35 48/109/35 47/108/35 +f 90/203/35 91/206/35 89/201/35 +f 92/207/35 93/211/35 91/206/35 +f 94/213/35 95/215/35 93/211/35 +f 97/219/35 95/215/35 94/213/35 +f 99/224/35 98/222/35 53/120/35 +f 101/229/35 100/226/35 98/222/35 +f 103/232/35 102/230/35 100/226/35 +f 104/235/35 102/230/35 103/232/35 +f 107/241/35 106/239/35 61/139/35 +f 109/247/35 108/244/35 106/239/35 +f 99/225/262 55/126/262 112/253/262 +f 111/251/263 53/121/263 98/223/263 +f 116/264/264 82/187/264 80/183/264 +f 49/112/265 131/299/265 132/300/265 +f 81/185/266 83/189/266 117/266/266 +f 63/144/267 65/149/267 130/297/267 +f 50/114/268 48/110/268 134/304/268 +f 68/155/269 66/151/269 136/308/269 +f 67/153/270 124/281/270 130/297/270 +f 100/227/271 102/231/271 128/293/271 +f 87/198/272 86/196/272 116/265/272 +f 128/294/273 105/238/273 103/233/273 +f 131/298/274 51/117/274 53/122/274 +f 107/242/275 63/145/275 123/278/275 +f 89/202/276 133/301/276 134/304/276 +f 71/163/277 115/262/277 124/282/277 +f 123/279/278 61/140/278 106/240/278 +f 54/124/279 110/248/279 113/255/279 +f 90/204/280 88/200/280 132/300/280 +f 55/127/281 57/131/281 122/276/281 +f 94/214/282 92/208/282 127/290/282 +f 126/287/283 78/178/283 76/174/283 +f 122/276/284 57/131/284 59/135/284 +f 95/216/285 118/268/285 133/302/285 +f 75/172/286 77/176/286 126/288/286 +f 97/220/287 96/218/287 137/310/287 +f 62/142/288 60/137/288 113/255/288 +f 125/285/289 114/259/289 124/283/289 +f 114/259/290 125/285/290 117/267/290 +f 119/271/291 112/254/291 111/251/291 +f 133/303/292 118/269/292 144/328/292 +f 110/248/293 134/304/293 142/323/293 +f 113/255/294 110/248/294 138/313/294 +f 144/328/295 137/311/295 127/291/295 +f 139/316/296 132/300/296 131/299/296 +f 148/334/297 146/332/297 147/333/297 +f 140/319/298 145/329/298 147/333/298 +f 151/344/299 148/335/299 145/330/299 +f 149/338/300 142/324/300 148/336/300 +f 143/327/301 144/328/301 146/332/301 +f 146/332/302 139/317/302 141/321/302 +f 138/314/303 142/325/303 149/339/303 +f 145/331/304 138/315/304 150/341/304 +f 149/339/305 153/350/305 152/347/305 diff --git a/narcissus/src/main.rs b/narcissus/src/main.rs index 52de126..9d4c422 100644 --- a/narcissus/src/main.rs +++ b/narcissus/src/main.rs @@ -1,22 +1,45 @@ -use std::time::Instant; +use std::{path::Path, time::Instant}; use narcissus_app::{create_app, Event, WindowDesc}; -use narcissus_core::{cstr, obj, slice, Image}; +use narcissus_core::{cstr, default, obj, Image}; use narcissus_gpu::{ create_vulkan_device, Bind, BindGroupLayoutDesc, BindGroupLayoutEntryDesc, BindingType, Buffer, - BufferDesc, BufferUsageFlags, ClearValue, Device, GraphicsPipelineDesc, GraphicsPipelineLayout, - LoadOp, MemoryLocation, RenderingAttachment, RenderingDesc, Scissor, ShaderDesc, - ShaderStageFlags, StoreOp, TextureDesc, TextureDimension, TextureFormat, TextureUsageFlags, - TextureViewDesc, ThreadToken, TypedBind, Viewport, + BufferDesc, BufferUsageFlags, ClearValue, CompareOp, CullingMode, Device, FrontFace, + GraphicsPipelineDesc, GraphicsPipelineLayout, IndexType, LoadOp, MemoryLocation, PolygonMode, + RenderingAttachment, RenderingDesc, Scissor, ShaderDesc, ShaderStageFlags, StoreOp, + TextureDesc, TextureDimension, TextureFormat, TextureUsageFlags, ThreadToken, Topology, + TypedBind, Viewport, }; -use narcissus_maths::{Vec2, Vec3}; +use narcissus_maths::{sin_cos_pi_f32, Deg, Mat4, Point3, Vec2, Vec3, Vec4}; + +/// Marker trait indicates it's safe to convert a given type directly to an array of bytes. +/// +/// # Safety +/// +/// Must not be applied to any types with padding +unsafe trait Blittable: Sized {} + +#[allow(unused)] +struct Uniform { + clip_from_model: Mat4, +} -pub fn main() { - let blåhaj_obj = std::fs::File::open("narcissus/data/blåhaj.obj").unwrap(); +unsafe impl Blittable for Uniform {} + +#[allow(unused)] +struct Vertex { + position: [f32; 4], + normal: [f32; 4], + texcoord: [f32; 4], +} +unsafe impl Blittable for Vertex {} +unsafe impl Blittable for u16 {} + +fn load_obj>(path: P) -> (Vec, Vec) { #[derive(Default)] struct ObjVisitor { - position: Vec, + positions: Vec, normals: Vec, texcoords: Vec, indices: Vec<[(i32, i32, i32); 3]>, @@ -24,7 +47,7 @@ pub fn main() { impl obj::Visitor for ObjVisitor { fn visit_position(&mut self, x: f32, y: f32, z: f32, _w: f32) { - self.position.push(Vec3::new(x, y, z)) + self.positions.push(Vec3::new(x, y, z)) } fn visit_texcoord(&mut self, u: f32, v: f32, _w: f32) { @@ -36,9 +59,8 @@ pub fn main() { } fn visit_face(&mut self, indices: &[(i32, i32, i32)]) { - for triangle in slice::array_windows::<_, 3>(indices) { - self.indices.push(*triangle) - } + self.indices + .push(indices.try_into().expect("not a triangle")); } fn visit_object(&mut self, _name: &str) {} @@ -46,36 +68,136 @@ pub fn main() { fn visit_smooth_group(&mut self, _group: i32) {} } - let mut obj_visitor = ObjVisitor::default(); - let mut obj_parser = obj::Parser::new(blåhaj_obj); - let start = std::time::Instant::now(); - obj_parser.visit(&mut obj_visitor).unwrap(); - let end = std::time::Instant::now(); + let path = path.as_ref(); + let file = std::fs::File::open(path).expect("couldn't open file"); + let mut visitor = ObjVisitor::default(); + + obj::Parser::new(file) + .visit(&mut visitor) + .expect("failed to parse obj file"); + + let (vertices, indices): (Vec<_>, Vec<_>) = visitor + .indices + .iter() + .flatten() + .enumerate() + .map(|(index, &(position_index, texcoord_index, normal_index))| { + let position = visitor.positions[position_index as usize - 1]; + let normal = visitor.normals[normal_index as usize - 1]; + let texcoord = visitor.texcoords[texcoord_index as usize - 1]; + ( + Vertex { + position: Vec4::new(position.x, position.y, position.z, 0.0).into(), + normal: Vec4::new(normal.x, normal.y, normal.z, 0.0).into(), + texcoord: Vec4::new(texcoord.x, texcoord.y, 0.0, 0.0).into(), + }, + index as u16, + ) + }) + .unzip(); println!( - "loaded {} vertices, {} normals, {} texcoords, and {} indices", - obj_visitor.position.len(), - obj_visitor.normals.len(), - obj_visitor.texcoords.len(), - obj_visitor.indices.len(), + "parsing obj {path:?} took {:?}", + std::time::Instant::now() - start ); - println!("took {:?}", end - start); - let start = std::time::Instant::now(); - let blåhaj_image = std::fs::read("narcissus/data/blåhaj.png").unwrap(); - let blåhaj = Image::from_buffer(&blåhaj_image).unwrap(); - let end = std::time::Instant::now(); + (vertices, indices) +} +fn load_img>(path: P) -> Image { + let start = std::time::Instant::now(); + let path = path.as_ref(); + let image = Image::from_buffer(std::fs::read(path).expect("failed to read file").as_slice()) + .expect("failed to load image"); println!( - "loaded blåhaj width: {}, height: {}, components: {}", - blåhaj.width(), - blåhaj.height(), - blåhaj.components() + "loading image {path:?} took {:?}", + std::time::Instant::now() - start ); - println!("took {:?}", end - start); + image +} + +fn create_buffer_with_data(device: &dyn Device, usage: BufferUsageFlags, data: &[T]) -> Buffer +where + T: Blittable, +{ + let len = data.len() * std::mem::size_of::(); + let buffer = device.create_buffer(&BufferDesc { + memory_location: MemoryLocation::PreferHost, + usage, + size: len, + }); + // Safety: T: Blittable which implies it's freely convertable to a byte slice. + unsafe { + let dst = std::slice::from_raw_parts_mut(device.map_buffer(buffer), len); + let src = std::slice::from_raw_parts(data.as_ptr() as *const u8, len); + dst.copy_from_slice(src); + device.unmap_buffer(buffer); + } + buffer +} + +struct UniformBufferMap<'a> { + device: &'a dyn Device, + buffer: Buffer, + slice: &'a mut [u8], +} + +impl<'a> UniformBufferMap<'a> { + pub fn new(device: &'a dyn Device, len: usize) -> Self { + let buffer = device.create_buffer(&BufferDesc { + memory_location: MemoryLocation::PreferHost, + usage: BufferUsageFlags::UNIFORM, + size: len, + }); + unsafe { + let ptr = device.map_buffer(buffer); + let slice = std::slice::from_raw_parts_mut(ptr, len); + Self { + device, + buffer, + slice, + } + } + } + + pub fn buffer(&self) -> Buffer { + self.buffer + } + + pub fn write(&mut self, value: T) + where + T: Blittable, + { + unsafe { + let src = std::slice::from_raw_parts( + &value as *const T as *const u8, + std::mem::size_of::(), + ); + self.slice.copy_from_slice(src) + } + } +} + +impl<'a> Drop for UniformBufferMap<'a> { + fn drop(&mut self) { + // Safety: Make sure we don't have the slice outlive the mapping. + unsafe { + self.device.unmap_buffer(self.buffer); + } + } +} + +pub fn main() { + let _blåhaj_image = load_img("narcissus/data/blåhaj.png"); + let (blåhaj_vertices, blåhaj_indices) = load_obj("narcissus/data/blåhaj.obj"); let app = create_app(); + let window = app.create_window(&WindowDesc { + title: "narcissus", + width: 800, + height: 600, + }); let device = create_vulkan_device(app.as_ref()); let mut thread_token = ThreadToken::new(); @@ -83,10 +205,10 @@ pub fn main() { #[repr(align(4))] struct Spirv([u8; LEN]); - let vert_shader_spv = Spirv(*include_bytes!("shaders/triangle.vert.spv")); - let frag_shader_spv = Spirv(*include_bytes!("shaders/triangle.frag.spv")); + let vert_shader_spv = Spirv(*include_bytes!("shaders/basic.vert.spv")); + let frag_shader_spv = Spirv(*include_bytes!("shaders/basic.frag.spv")); - let bind_group_layout = device.create_bind_group_layout(&BindGroupLayoutDesc { + let uniform_bind_group_layout = device.create_bind_group_layout(&BindGroupLayoutDesc { entries: &[BindGroupLayoutEntryDesc { slot: 0, stages: ShaderStageFlags::ALL, @@ -95,6 +217,15 @@ pub fn main() { }], }); + let storage_bind_group_layout = device.create_bind_group_layout(&BindGroupLayoutDesc { + entries: &[BindGroupLayoutEntryDesc { + slot: 0, + stages: ShaderStageFlags::ALL, + binding_type: BindingType::StorageBuffer, + count: 1, + }], + }); + let pipeline = device.create_graphics_pipeline(&GraphicsPipelineDesc { vertex_shader: ShaderDesc { entrypoint_name: cstr!("main"), @@ -104,99 +235,58 @@ pub fn main() { entrypoint_name: cstr!("main"), code: &frag_shader_spv.0, }, - bind_group_layouts: &[bind_group_layout], + bind_group_layouts: &[uniform_bind_group_layout, storage_bind_group_layout], layout: GraphicsPipelineLayout { color_attachment_formats: &[TextureFormat::BGRA8_SRGB], - depth_attachment_format: None, + depth_attachment_format: Some(TextureFormat::DEPTH_F32), stencil_attachment_format: None, }, + topology: Topology::Triangles, + polygon_mode: PolygonMode::Fill, + culling_mode: CullingMode::Back, + front_face: FrontFace::Clockwise, + depth_compare_op: CompareOp::GreaterOrEqual, + depth_test_enable: true, + depth_write_enable: true, + stencil_test_enable: false, + stencil_back: default(), + stencil_front: default(), }); - let window = app.create_window(&WindowDesc { - title: "narcissus", - width: 800, - height: 600, - }); - - let texture = device.create_texture(&TextureDesc { - memory_location: MemoryLocation::PreferDevice, - usage: TextureUsageFlags::SAMPLED, - dimension: TextureDimension::Type2d, - format: TextureFormat::BGRA8_SRGB, - width: 800, - height: 600, - depth: 1, - layers: 1, - mip_levels: 1, - }); - - let texture2 = device.create_texture_view(&TextureViewDesc { - texture, - dimension: TextureDimension::Type2d, - format: TextureFormat::BGRA8_SRGB, - base_mip: 0, - mip_count: 1, - base_layer: 0, - layer_count: 1, - }); - - let frame_token = device.begin_frame(); - device.destroy_texture(&frame_token, texture); - device.destroy_texture(&frame_token, texture2); - device.end_frame(frame_token); - - struct UniformBufferMap<'a> { - device: &'a dyn Device, - buffer: Buffer, - slice: &'a mut [u8], - } - - impl<'a> UniformBufferMap<'a> { - pub fn new(device: &'a dyn Device, len: usize) -> Self { - let buffer = device.create_buffer(&BufferDesc { - memory_location: MemoryLocation::PreferHost, - usage: BufferUsageFlags::UNIFORM, - size: len, - }); - unsafe { - let ptr = device.map_buffer(buffer); - let slice = std::slice::from_raw_parts_mut(ptr, len); - Self { - device, - buffer, - slice, - } - } - } - - pub fn buffer(&self) -> Buffer { - self.buffer - } + let blåhaj_vertex_buffer = create_buffer_with_data( + device.as_ref(), + BufferUsageFlags::STORAGE, + blåhaj_vertices.as_slice(), + ); - pub fn write_f32(&mut self, value: f32) { - self.slice.copy_from_slice(&value.to_le_bytes()); - } - } + let blåhaj_index_buffer = create_buffer_with_data( + device.as_ref(), + BufferUsageFlags::INDEX, + blåhaj_indices.as_slice(), + ); - impl<'a> Drop for UniformBufferMap<'a> { - fn drop(&mut self) { - // Safety: Make sure we don't have the slice outlive the mapping. - unsafe { - self.device.unmap_buffer(self.buffer); - } - } - } + let mut uniforms = UniformBufferMap::new(device.as_ref(), std::mem::size_of::()); - let mut uniforms = UniformBufferMap::new(device.as_ref(), 4); + let mut depth_width = 0; + let mut depth_height = 0; + let mut depth_image = default(); let start_time = Instant::now(); 'main: loop { let frame_token = device.begin_frame(); let frame_start = Instant::now() - start_time; - let frame_start = frame_start.as_secs_f32(); + let frame_start = frame_start.as_secs_f32() * 0.5; + + let (s, c) = sin_cos_pi_f32(frame_start); + let camera_from_model = + Mat4::look_at(Point3::new(s * 5.0, 1.0, c * 5.0), Point3::ZERO, -Vec3::Y); + let clip_from_camera = + Mat4::perspective_rev_inf_zo(Deg::new(90.0).into(), 800.0 / 600.0, 0.01); + + let clip_from_model = clip_from_camera * camera_from_model; - uniforms.write_f32(frame_start); + uniforms.write(Uniform { clip_from_model }); while let Some(event) = app.poll_event() { use Event::*; @@ -216,8 +306,60 @@ pub fn main() { let (width, height, swapchain_image) = device.acquire_swapchain(&frame_token, window, TextureFormat::BGRA8_SRGB); + if width != depth_width || height != depth_height { + device.destroy_texture(&frame_token, depth_image); + depth_image = device.create_texture(&TextureDesc { + memory_location: MemoryLocation::PreferDevice, + usage: TextureUsageFlags::DEPTH_STENCIL, + dimension: TextureDimension::Type2d, + format: TextureFormat::DEPTH_F32, + width, + height, + depth: 1, + layers: 1, + mip_levels: 1, + }); + depth_width = width; + depth_height = height; + } + let command_buffer_token = device.create_command_buffer(&frame_token, &mut thread_token); + device.cmd_set_bind_group( + &frame_token, + &mut thread_token, + &command_buffer_token, + pipeline, + uniform_bind_group_layout, + 0, + &[Bind { + binding: 0, + array_element: 0, + typed: TypedBind::UniformBuffer(&[uniforms.buffer()]), + }], + ); + + device.cmd_set_bind_group( + &frame_token, + &mut thread_token, + &command_buffer_token, + pipeline, + storage_bind_group_layout, + 1, + &[Bind { + binding: 0, + array_element: 0, + typed: TypedBind::StorageBuffer(&[blåhaj_vertex_buffer]), + }], + ); + + device.cmd_set_index_buffer( + &command_buffer_token, + blåhaj_index_buffer, + 0, + IndexType::U16, + ); + device.cmd_begin_rendering( &frame_token, &mut thread_token, @@ -234,25 +376,19 @@ pub fn main() { ])), store_op: StoreOp::Store, }], - depth_attachment: None, + depth_attachment: Some(RenderingAttachment { + texture: depth_image, + load_op: LoadOp::Clear(ClearValue::DepthStencil { + depth: 0.0, + stencil: 0, + }), + store_op: StoreOp::DontCare, + }), stencil_attachment: None, }, ); device.cmd_set_pipeline(&command_buffer_token, pipeline); - device.cmd_set_bind_group( - &frame_token, - &mut thread_token, - &command_buffer_token, - pipeline, - bind_group_layout, - 0, - &[Bind { - binding: 0, - array_element: 0, - typed: TypedBind::Buffer(&[uniforms.buffer()]), - }], - ); device.cmd_set_scissors( &command_buffer_token, @@ -263,6 +399,7 @@ pub fn main() { height, }], ); + device.cmd_set_viewports( &command_buffer_token, &[Viewport { @@ -274,7 +411,16 @@ pub fn main() { max_depth: 1.0, }], ); - device.cmd_draw(&command_buffer_token, 3, 1, 0, 0); + + device.cmd_draw_indexed( + &command_buffer_token, + blåhaj_indices.len() as u32, + 1, + 0, + 0, + 0, + ); + device.cmd_end_rendering(&command_buffer_token); device.submit(&frame_token, &mut thread_token, command_buffer_token); diff --git a/narcissus/src/shaders/triangle.frag.glsl b/narcissus/src/shaders/basic.frag.glsl similarity index 91% rename from narcissus/src/shaders/triangle.frag.glsl rename to narcissus/src/shaders/basic.frag.glsl index e948fd6..ad841f7 100644 --- a/narcissus/src/shaders/triangle.frag.glsl +++ b/narcissus/src/shaders/basic.frag.glsl @@ -1,4 +1,4 @@ -#version 450 +#version 460 layout(location = 0) in vec3 fragColor; layout(location = 0) out vec4 outColor; diff --git a/narcissus/src/shaders/basic.frag.spv b/narcissus/src/shaders/basic.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..869b2117ca1854db9fcf14eea88e4e696d96291d GIT binary patch literal 432 zcmXw#KWhR(6vThGyLV?a{s--X!BUVEi3EaL+E^%l0wIk>(!>wo$4(OnGwwY&ZfD-? zn|T|(`C%Ph6DI%;KdN zRtD{{AX(dUzT0+1=?wBxX~r*s5?JTi-F*K@>AQU}r)s!C=H$_E!^~;N1GV#y{FZt% Q+*ghb(fg?PN5MM<|MbBRGXMYp literal 0 HcmV?d00001 diff --git a/narcissus/src/shaders/basic.vert.glsl b/narcissus/src/shaders/basic.vert.glsl new file mode 100644 index 0000000..aaad3a8 --- /dev/null +++ b/narcissus/src/shaders/basic.vert.glsl @@ -0,0 +1,24 @@ +#version 460 + +layout(set = 0, binding = 0) uniform uniformBuffer { + mat4 viewProj; +}; + +struct Vertex { + vec4 position; + vec4 normal; + vec4 texcoord; +}; + +layout(std430, set = 1, binding = 0) readonly buffer vertexBuffer { + Vertex vertices[]; +}; + +layout(location = 0) out vec3 fragColor; + +void main() { + Vertex vertex = vertices[gl_VertexIndex]; + vec3 pos = vertex.position.xyz; + gl_Position = vec4(pos, 1.0) * viewProj; + fragColor = vertex.normal.xyz * 0.5 + 0.5; +} diff --git a/narcissus/src/shaders/basic.vert.spv b/narcissus/src/shaders/basic.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..c0b9e8836507d7d05133227e0344c4ef867c9d00 GIT binary patch literal 1416 zcmYk5*=iI~6h&8!9TJlmV+KK+#3&Al?UY18V-p-Y4*?awK=8!}ebEolACP>mFM_O7 z=R#j7s?NS=*mv(+O}#gwuUKT6cMNNdnhIE=kN52S)A{7b&o7h1qeo_}&_tp+t1QNM z3w-gsu1@;9D8kD8Bjf1Nt&c4>l_JvM1VPxalRjXCNo-!UBv5Sa6Q z#5_-leczx7U&P0$w?6IAvI6m~FE29I1NS#*!)s@&=YGa($=CWTx#yj*-dK;!cYh;$ zIa~hM@_wkh{q61JvcKQzWBqm7(9ZLUjp;*s&m^X7PE@%UIv^!+r0z-zEPr=g79KXMXd*W6JqxKlaSqSolB1md(8c~q_%rDJJF#hSApEeWzKQ*#;yD%n0ZiyJ A^#A|> literal 0 HcmV?d00001 diff --git a/narcissus/src/shaders/build.sh b/narcissus/src/shaders/build.sh new file mode 100755 index 0000000..66595df --- /dev/null +++ b/narcissus/src/shaders/build.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +glslc --target-env=vulkan1.3 -O -fshader-stage=vert -o basic.vert.spv basic.vert.glsl +glslc --target-env=vulkan1.3 -O -fshader-stage=frag -o basic.frag.spv basic.frag.glsl \ No newline at end of file diff --git a/narcissus/src/shaders/triangle.frag.spv b/narcissus/src/shaders/triangle.frag.spv deleted file mode 100644 index 8a4cc40b1bc21fe6ef28c0d6e167604d0931849f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmY+B%}T>i5QV?wCXKfC&w}ox;!-FsR0L5MBH0A0_yD1_Q3A0oZ7R6)*?cNDf}Amd zIuLT_-0$8wbI1875qLCdGvF`!_;^5zhW+E@IT@|X+35V@OhgA~pqMTZ0oeC8$>-YG z1@?d*&h!XyIDFvC6Wb(C(s(?MlZSM=T&C;tqsY=CpJ(YTUuDxWf6v72Y;pN~T5M+9 zKuGYfZb)dg7n|~aQ7l&SB28XiR+HCSj0uc8vM#V(Oq~z#&Fitb#?}Wo8o&@ZB(R>8 ztM{QfRgai{UFCWQY2uq;ymIj^^y-){Ub#F-J0&o-WBxwxE(y(pYAJNbH$EY7Q{COJ t&OZ^_*)Eu-sI^|DsYb2!D^0U`Br^Z|HdoCL+n0}9ob{uqKL?rYC-~rgxiL+Q!>fWk}d|l(qCrcukyyk zJZH{8{gSqG-t(UQeA6I5SCVq-*N}FVo>AqMlQf{B{g(F*_ZHio+Tzmk3mC%+j0k5$ zefC_Cbb1^&5N0K+9jgjcU@Z^%6oA{)-nX)S#rZW;^c0%|=@?&ZMMjGikQk$bqI)jzSeJ$CIRT z6tz0h`R7J0I)_u#LrL96TyM5cx4QLu)RI(moYQWeMn}g)Z(0Pg~s$@7lG(2u}4&(2*z0lFOlcchp#AiEkyK~&AMi)9JfUcV)7dmRB?;LtU z|Ld*elWlq+sjPz4Js|0+q)!U1Ue26-!wC!{Hhk*4ccDvV=F7o8s|}yMSh_!K)+G<0 z@W?&0@o*J)vKJ<+m#wEkD8YWy1P7TQ1gWei$SUx{Ch=aeIl3~=wC&O>K48Iq@ z?J^iT_{5uXU)aH+r+2)^%!ZlV^_j32=$ReQ;N*+Uer0<0lH9SM_T5Cr_L0w;JBuwc z`^x^%dwf3edBJDr(Ph2h&9&GQ>$%54Pp_Ap%Wl%^WtXv;_IsUi(D5P88{aW@nY@s> zm&^?Px<6x!yx}slfRCKMJ5&9Z$3?%Q&}twj4nF@Vuh4DjH+P19eNbTg%O3H}9x$VI z?+y2wUT-S2KHry&4-N+(4