From 2ce65aa136d32350f46122757aca413c5a3e00bb Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 14 Jul 2023 16:49:01 -0700 Subject: [PATCH 001/482] Initial commit --- .gitignore | 1 + Cargo.lock | 607 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 9 + src/main.rs | 3 + 4 files changed, 620 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..ef942c5 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,607 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "ash" +version = "0.37.3+1.3.251" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +dependencies = [ + "libloading", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.25", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "core-graphics-types" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +dependencies = [ + "bitflags", + "core-foundation", + "libc", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "half" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +dependencies = [ + "bytemuck", + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + +[[package]] +name = "itoa" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" + +[[package]] +name = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "ryu" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.25", +] + +[[package]] +name = "serde_json" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" + +[[package]] +name = "strafe-client" +version = "0.1.0" +dependencies = [ + "vulkano", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" + +[[package]] +name = "toml_edit" +version = "0.19.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +dependencies = [ + "indexmap 2.0.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vk-parse" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6a0bda9bbe6b9e50e6456c80aa8fe4cca3b21e4311a1130c41e4915ec2e32a" +dependencies = [ + "xml-rs", +] + +[[package]] +name = "vulkano" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e1f15eeb9d93a05eb3c237332a10806eac1eb82444e54485bfcc1859c483c23" +dependencies = [ + "ahash", + "ash", + "bytemuck", + "core-graphics-types", + "crossbeam-queue", + "half", + "heck", + "indexmap 1.9.3", + "libloading", + "objc", + "once_cell", + "parking_lot", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "smallvec", + "thread_local", + "vk-parse", + "vulkano-macros", +] + +[[package]] +name = "vulkano-macros" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "895b8a2cac1e7650d2d0552f2392da0970a358515ac11a34adaf19bfdc771b98" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winnow" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7" +dependencies = [ + "memchr", +] + +[[package]] +name = "xml-rs" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a56c84a8ccd4258aed21c92f70c0f6dea75356b6892ae27c24139da456f9336" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ee4e545 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "strafe-client" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +vulkano = "0.33.0" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} From 1a8bdef575b9b5d7dcdfba6af0ce83ed9dc38108 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 20 Jul 2023 23:48:15 -0700 Subject: [PATCH 002/482] teapot starting point is teapot from the vulkano examples --- src/frag.glsl | 14 + src/main.rs | 483 ++++++- src/teapot.rs | 3377 +++++++++++++++++++++++++++++++++++++++++++++++++ src/vert.glsl | 18 + 4 files changed, 3891 insertions(+), 1 deletion(-) create mode 100644 src/frag.glsl create mode 100644 src/teapot.rs create mode 100644 src/vert.glsl diff --git a/src/frag.glsl b/src/frag.glsl new file mode 100644 index 0000000..39c544e --- /dev/null +++ b/src/frag.glsl @@ -0,0 +1,14 @@ +#version 450 + +layout(location = 0) in vec3 v_normal; +layout(location = 0) out vec4 f_color; + +const vec3 LIGHT = vec3(0.0, 0.0, 1.0); + +void main() { + float brightness = dot(normalize(v_normal), normalize(LIGHT)); + vec3 dark_color = vec3(0.6, 0.0, 0.0); + vec3 regular_color = vec3(1.0, 0.0, 0.0); + + f_color = vec4(mix(dark_color, regular_color, brightness), 1.0); +} diff --git a/src/main.rs b/src/main.rs index e7a11a9..bfd9768 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,484 @@ +// Copyright (c) 2016 The vulkano developers +// Licensed under the Apache License, Version 2.0 +// or the MIT +// license , +// at your option. All files in the project carrying such +// notice may not be copied, modified, or distributed except +// according to those terms. + +use cgmath::{Matrix3, Matrix4, Point3, Rad, Vector3}; +use examples::{Normal, Position, INDICES, NORMALS, POSITIONS}; +use std::{sync::Arc, time::Instant}; +use vulkano::{ + buffer::{ + allocator::{SubbufferAllocator, SubbufferAllocatorCreateInfo}, + Buffer, BufferCreateInfo, BufferUsage, + }, + command_buffer::{ + allocator::StandardCommandBufferAllocator, AutoCommandBufferBuilder, CommandBufferUsage, + RenderPassBeginInfo, SubpassContents, + }, + descriptor_set::{ + allocator::StandardDescriptorSetAllocator, PersistentDescriptorSet, WriteDescriptorSet, + }, + device::{ + physical::PhysicalDeviceType, Device, DeviceCreateInfo, DeviceExtensions, DeviceOwned, + QueueCreateInfo, QueueFlags, + }, + format::Format, + image::{view::ImageView, AttachmentImage, ImageAccess, ImageUsage, SwapchainImage}, + instance::{Instance, InstanceCreateInfo}, + memory::allocator::{AllocationCreateInfo, MemoryUsage, StandardMemoryAllocator}, + pipeline::{ + graphics::{ + depth_stencil::DepthStencilState, + input_assembly::InputAssemblyState, + vertex_input::Vertex, + viewport::{Viewport, ViewportState}, + }, + GraphicsPipeline, Pipeline, PipelineBindPoint, + }, + render_pass::{Framebuffer, FramebufferCreateInfo, RenderPass, Subpass}, + shader::ShaderModule, + swapchain::{ + acquire_next_image, AcquireError, Swapchain, SwapchainCreateInfo, SwapchainCreationError, + SwapchainPresentInfo, + }, + sync::{self, FlushError, GpuFuture}, + VulkanLibrary, +}; +use vulkano_win::VkSurfaceBuild; +use winit::{ + event::{Event, WindowEvent}, + event_loop::{ControlFlow, EventLoop}, + window::{Window, WindowBuilder}, +}; + fn main() { - println!("Hello, world!"); + // The start of this example is exactly the same as `triangle`. You should read the `triangle` + // example if you haven't done so yet. + + let library = VulkanLibrary::new().unwrap(); + let required_extensions = vulkano_win::required_extensions(&library); + let instance = Instance::new( + library, + InstanceCreateInfo { + enabled_extensions: required_extensions, + enumerate_portability: true, + ..Default::default() + }, + ) + .unwrap(); + + let event_loop = EventLoop::new(); + let surface = WindowBuilder::new() + .build_vk_surface(&event_loop, instance.clone()) + .unwrap(); + + let device_extensions = DeviceExtensions { + khr_swapchain: true, + ..DeviceExtensions::empty() + }; + let (physical_device, queue_family_index) = instance + .enumerate_physical_devices() + .unwrap() + .filter(|p| p.supported_extensions().contains(&device_extensions)) + .filter_map(|p| { + p.queue_family_properties() + .iter() + .enumerate() + .position(|(i, q)| { + q.queue_flags.intersects(QueueFlags::GRAPHICS) + && p.surface_support(i as u32, &surface).unwrap_or(false) + }) + .map(|i| (p, i as u32)) + }) + .min_by_key(|(p, _)| match p.properties().device_type { + PhysicalDeviceType::DiscreteGpu => 0, + PhysicalDeviceType::IntegratedGpu => 1, + PhysicalDeviceType::VirtualGpu => 2, + PhysicalDeviceType::Cpu => 3, + PhysicalDeviceType::Other => 4, + _ => 5, + }) + .unwrap(); + + println!( + "Using device: {} (type: {:?})", + physical_device.properties().device_name, + physical_device.properties().device_type, + ); + + let (device, mut queues) = Device::new( + physical_device, + DeviceCreateInfo { + enabled_extensions: device_extensions, + queue_create_infos: vec![QueueCreateInfo { + queue_family_index, + ..Default::default() + }], + ..Default::default() + }, + ) + .unwrap(); + + let queue = queues.next().unwrap(); + + let (mut swapchain, images) = { + let surface_capabilities = device + .physical_device() + .surface_capabilities(&surface, Default::default()) + .unwrap(); + let image_format = Some( + device + .physical_device() + .surface_formats(&surface, Default::default()) + .unwrap()[0] + .0, + ); + let window = surface.object().unwrap().downcast_ref::().unwrap(); + + Swapchain::new( + device.clone(), + surface.clone(), + SwapchainCreateInfo { + min_image_count: surface_capabilities.min_image_count, + image_format, + image_extent: window.inner_size().into(), + image_usage: ImageUsage::COLOR_ATTACHMENT, + composite_alpha: surface_capabilities + .supported_composite_alpha + .into_iter() + .next() + .unwrap(), + ..Default::default() + }, + ) + .unwrap() + }; + + let memory_allocator = Arc::new(StandardMemoryAllocator::new_default(device.clone())); + + let vertex_buffer = Buffer::from_iter( + &memory_allocator, + BufferCreateInfo { + usage: BufferUsage::VERTEX_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + usage: MemoryUsage::Upload, + ..Default::default() + }, + POSITIONS, + ) + .unwrap(); + let normals_buffer = Buffer::from_iter( + &memory_allocator, + BufferCreateInfo { + usage: BufferUsage::VERTEX_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + usage: MemoryUsage::Upload, + ..Default::default() + }, + NORMALS, + ) + .unwrap(); + let index_buffer = Buffer::from_iter( + &memory_allocator, + BufferCreateInfo { + usage: BufferUsage::INDEX_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + usage: MemoryUsage::Upload, + ..Default::default() + }, + INDICES, + ) + .unwrap(); + + let uniform_buffer = SubbufferAllocator::new( + memory_allocator.clone(), + SubbufferAllocatorCreateInfo { + buffer_usage: BufferUsage::UNIFORM_BUFFER, + ..Default::default() + }, + ); + + let vs = vs::load(device.clone()).unwrap(); + let fs = fs::load(device.clone()).unwrap(); + + let render_pass = vulkano::single_pass_renderpass!( + device.clone(), + attachments: { + color: { + load: Clear, + store: Store, + format: swapchain.image_format(), + samples: 1, + }, + depth: { + load: Clear, + store: DontCare, + format: Format::D16_UNORM, + samples: 1, + }, + }, + pass: { + color: [color], + depth_stencil: {depth}, + }, + ) + .unwrap(); + + let (mut pipeline, mut framebuffers) = + window_size_dependent_setup(&memory_allocator, &vs, &fs, &images, render_pass.clone()); + let mut recreate_swapchain = false; + + let mut previous_frame_end = Some(sync::now(device.clone()).boxed()); + let rotation_start = Instant::now(); + + let descriptor_set_allocator = StandardDescriptorSetAllocator::new(device.clone()); + let command_buffer_allocator = + StandardCommandBufferAllocator::new(device.clone(), Default::default()); + + event_loop.run(move |event, _, control_flow| { + match event { + Event::WindowEvent { + event: WindowEvent::CloseRequested, + .. + } => { + *control_flow = ControlFlow::Exit; + } + Event::WindowEvent { + event: WindowEvent::Resized(_), + .. + } => { + recreate_swapchain = true; + } + Event::RedrawEventsCleared => { + let window = surface.object().unwrap().downcast_ref::().unwrap(); + let dimensions = window.inner_size(); + if dimensions.width == 0 || dimensions.height == 0 { + return; + } + + previous_frame_end.as_mut().unwrap().cleanup_finished(); + + if recreate_swapchain { + let (new_swapchain, new_images) = + match swapchain.recreate(SwapchainCreateInfo { + image_extent: dimensions.into(), + ..swapchain.create_info() + }) { + Ok(r) => r, + Err(SwapchainCreationError::ImageExtentNotSupported { .. }) => return, + Err(e) => panic!("failed to recreate swapchain: {e}"), + }; + + swapchain = new_swapchain; + let (new_pipeline, new_framebuffers) = window_size_dependent_setup( + &memory_allocator, + &vs, + &fs, + &new_images, + render_pass.clone(), + ); + pipeline = new_pipeline; + framebuffers = new_framebuffers; + recreate_swapchain = false; + } + + let uniform_buffer_subbuffer = { + let elapsed = rotation_start.elapsed(); + let rotation = + elapsed.as_secs() as f64 + elapsed.subsec_nanos() as f64 / 1_000_000_000.0; + let rotation = Matrix3::from_angle_y(Rad(rotation as f32)); + + // note: this teapot was meant for OpenGL where the origin is at the lower left + // instead the origin is at the upper left in Vulkan, so we reverse the Y axis + let aspect_ratio = + swapchain.image_extent()[0] as f32 / swapchain.image_extent()[1] as f32; + let proj = cgmath::perspective( + Rad(std::f32::consts::FRAC_PI_2), + aspect_ratio, + 0.01, + 100.0, + ); + let view = Matrix4::look_at_rh( + Point3::new(0.3, 0.3, 1.0), + Point3::new(0.0, 0.0, 0.0), + Vector3::new(0.0, -1.0, 0.0), + ); + let scale = Matrix4::from_scale(0.01); + + let uniform_data = vs::Data { + world: Matrix4::from(rotation).into(), + view: (view * scale).into(), + proj: proj.into(), + }; + + let subbuffer = uniform_buffer.allocate_sized().unwrap(); + *subbuffer.write().unwrap() = uniform_data; + + subbuffer + }; + + let layout = pipeline.layout().set_layouts().get(0).unwrap(); + let set = PersistentDescriptorSet::new( + &descriptor_set_allocator, + layout.clone(), + [WriteDescriptorSet::buffer(0, uniform_buffer_subbuffer)], + ) + .unwrap(); + + let (image_index, suboptimal, acquire_future) = + match acquire_next_image(swapchain.clone(), None) { + Ok(r) => r, + Err(AcquireError::OutOfDate) => { + recreate_swapchain = true; + return; + } + Err(e) => panic!("failed to acquire next image: {e}"), + }; + + if suboptimal { + recreate_swapchain = true; + } + + let mut builder = AutoCommandBufferBuilder::primary( + &command_buffer_allocator, + queue.queue_family_index(), + CommandBufferUsage::OneTimeSubmit, + ) + .unwrap(); + builder + .begin_render_pass( + RenderPassBeginInfo { + clear_values: vec![ + Some([0.0, 0.0, 1.0, 1.0].into()), + Some(1f32.into()), + ], + ..RenderPassBeginInfo::framebuffer( + framebuffers[image_index as usize].clone(), + ) + }, + SubpassContents::Inline, + ) + .unwrap() + .bind_pipeline_graphics(pipeline.clone()) + .bind_descriptor_sets( + PipelineBindPoint::Graphics, + pipeline.layout().clone(), + 0, + set, + ) + .bind_vertex_buffers(0, (vertex_buffer.clone(), normals_buffer.clone())) + .bind_index_buffer(index_buffer.clone()) + .draw_indexed(index_buffer.len() as u32, 1, 0, 0, 0) + .unwrap() + .end_render_pass() + .unwrap(); + let command_buffer = builder.build().unwrap(); + + let future = previous_frame_end + .take() + .unwrap() + .join(acquire_future) + .then_execute(queue.clone(), command_buffer) + .unwrap() + .then_swapchain_present( + queue.clone(), + SwapchainPresentInfo::swapchain_image_index(swapchain.clone(), image_index), + ) + .then_signal_fence_and_flush(); + + match future { + Ok(future) => { + previous_frame_end = Some(future.boxed()); + } + Err(FlushError::OutOfDate) => { + recreate_swapchain = true; + previous_frame_end = Some(sync::now(device.clone()).boxed()); + } + Err(e) => { + println!("failed to flush future: {e}"); + previous_frame_end = Some(sync::now(device.clone()).boxed()); + } + } + } + _ => (), + } + }); +} + +/// This function is called once during initialization, then again whenever the window is resized. +fn window_size_dependent_setup( + memory_allocator: &StandardMemoryAllocator, + vs: &ShaderModule, + fs: &ShaderModule, + images: &[Arc], + render_pass: Arc, +) -> (Arc, Vec>) { + let dimensions = images[0].dimensions().width_height(); + + let depth_buffer = ImageView::new_default( + AttachmentImage::transient(memory_allocator, dimensions, Format::D16_UNORM).unwrap(), + ) + .unwrap(); + + let framebuffers = images + .iter() + .map(|image| { + let view = ImageView::new_default(image.clone()).unwrap(); + Framebuffer::new( + render_pass.clone(), + FramebufferCreateInfo { + attachments: vec![view, depth_buffer.clone()], + ..Default::default() + }, + ) + .unwrap() + }) + .collect::>(); + + // In the triangle example we use a dynamic viewport, as its a simple example. However in the + // teapot example, we recreate the pipelines with a hardcoded viewport instead. This allows the + // driver to optimize things, at the cost of slower window resizes. + // https://computergraphics.stackexchange.com/questions/5742/vulkan-best-way-of-updating-pipeline-viewport + let pipeline = GraphicsPipeline::start() + .vertex_input_state([Position::per_vertex(), Normal::per_vertex()]) + .vertex_shader(vs.entry_point("main").unwrap(), ()) + .input_assembly_state(InputAssemblyState::new()) + .viewport_state(ViewportState::viewport_fixed_scissor_irrelevant([ + Viewport { + origin: [0.0, 0.0], + dimensions: [dimensions[0] as f32, dimensions[1] as f32], + depth_range: 0.0..1.0, + }, + ])) + .fragment_shader(fs.entry_point("main").unwrap(), ()) + .depth_stencil_state(DepthStencilState::simple_depth_test()) + .render_pass(Subpass::from(render_pass, 0).unwrap()) + .build(memory_allocator.device().clone()) + .unwrap(); + + (pipeline, framebuffers) +} + +mod vs { + vulkano_shaders::shader! { + ty: "vertex", + path: "src/bin/teapot/vert.glsl", + } +} + +mod fs { + vulkano_shaders::shader! { + ty: "fragment", + path: "src/bin/teapot/frag.glsl", + } } diff --git a/src/teapot.rs b/src/teapot.rs new file mode 100644 index 0000000..625f50c --- /dev/null +++ b/src/teapot.rs @@ -0,0 +1,3377 @@ +// Copyright (c) 2016 The vulkano developers +// Licensed under the Apache License, Version 2.0 +// or the MIT +// license , +// at your option. All files in the project carrying such +// notice may not be copied, modified, or distributed except +// according to those terms. + +use vulkano::{buffer::BufferContents, pipeline::graphics::vertex_input::Vertex}; + +#[derive(BufferContents, Vertex)] +#[repr(C)] +pub struct Position { + #[format(R32G32B32_SFLOAT)] + position: [f32; 3], +} + +pub const POSITIONS: [Position; 531] = [ + Position { + position: [0.0, 0.0, 0.0], + }, // dummy vector because in the original model indices + // start at 1 + Position { + position: [40.6266, 28.3457, -1.10804], + }, + Position { + position: [40.0714, 30.4443, -1.10804], + }, + Position { + position: [40.7155, 31.1438, -1.10804], + }, + Position { + position: [42.0257, 30.4443, -1.10804], + }, + Position { + position: [43.4692, 28.3457, -1.10804], + }, + Position { + position: [37.5425, 28.3457, 14.5117], + }, + Position { + position: [37.0303, 30.4443, 14.2938], + }, + Position { + position: [37.6244, 31.1438, 14.5466], + }, + Position { + position: [38.8331, 30.4443, 15.0609], + }, + Position { + position: [40.1647, 28.3457, 15.6274], + }, + Position { + position: [29.0859, 28.3457, 27.1468], + }, + Position { + position: [28.6917, 30.4443, 26.7527], + }, + Position { + position: [29.149, 31.1438, 27.2099], + }, + Position { + position: [30.0792, 30.4443, 28.1402], + }, + Position { + position: [31.1041, 28.3457, 29.165], + }, + Position { + position: [16.4508, 28.3457, 35.6034], + }, + Position { + position: [16.2329, 30.4443, 35.0912], + }, + Position { + position: [16.4857, 31.1438, 35.6853], + }, + Position { + position: [16.9999, 30.4443, 36.894], + }, + Position { + position: [17.5665, 28.3457, 38.2256], + }, + Position { + position: [0.831025, 28.3457, 38.6876], + }, + Position { + position: [0.831025, 30.4443, 38.1324], + }, + Position { + position: [0.831025, 31.1438, 38.7764], + }, + Position { + position: [0.831025, 30.4443, 40.0866], + }, + Position { + position: [0.831025, 28.3457, 41.5301], + }, + Position { + position: [-15.868, 28.3457, 35.6034], + }, + Position { + position: [-15.0262, 30.4443, 35.0912], + }, + Position { + position: [-14.9585, 31.1438, 35.6853], + }, + Position { + position: [-15.3547, 30.4443, 36.894], + }, + Position { + position: [-15.9044, 28.3457, 38.2256], + }, + Position { + position: [-28.3832, 28.3457, 27.1468], + }, + Position { + position: [-27.4344, 30.4443, 26.7527], + }, + Position { + position: [-27.6068, 31.1438, 27.2099], + }, + Position { + position: [-28.4322, 30.4443, 28.1402], + }, + Position { + position: [-29.4421, 28.3457, 29.165], + }, + Position { + position: [-36.2402, 28.3457, 14.5117], + }, + Position { + position: [-35.52, 30.4443, 14.2938], + }, + Position { + position: [-36.0073, 31.1438, 14.5466], + }, + Position { + position: [-37.1767, 30.4443, 15.0609], + }, + Position { + position: [-38.5027, 28.3457, 15.6274], + }, + Position { + position: [-38.9646, 28.3457, -1.10804], + }, + Position { + position: [-38.4094, 30.4443, -1.10804], + }, + Position { + position: [-39.0534, 31.1438, -1.10804], + }, + Position { + position: [-40.3636, 30.4443, -1.10804], + }, + Position { + position: [-41.8071, 28.3457, -1.10804], + }, + Position { + position: [-35.8804, 28.3457, -16.7278], + }, + Position { + position: [-35.3683, 30.4443, -16.5099], + }, + Position { + position: [-35.9624, 31.1438, -16.7627], + }, + Position { + position: [-37.1711, 30.4443, -17.2769], + }, + Position { + position: [-38.5027, 28.3457, -17.8435], + }, + Position { + position: [-27.4238, 28.3457, -29.3629], + }, + Position { + position: [-27.0297, 30.4443, -28.9687], + }, + Position { + position: [-27.4869, 31.1438, -29.426], + }, + Position { + position: [-28.4172, 30.4443, -30.3562], + }, + Position { + position: [-29.4421, 28.3457, -31.3811], + }, + Position { + position: [-14.7887, 28.3457, -37.8195], + }, + Position { + position: [-14.5708, 30.4443, -37.3073], + }, + Position { + position: [-14.8236, 31.1438, -37.9014], + }, + Position { + position: [-15.3379, 30.4443, -39.1101], + }, + Position { + position: [-15.9044, 28.3457, -40.4417], + }, + Position { + position: [0.831025, 28.3457, -40.9036], + }, + Position { + position: [0.831025, 30.4443, -40.3484], + }, + Position { + position: [0.831025, 31.1438, -40.9925], + }, + Position { + position: [0.831025, 30.4443, -42.3027], + }, + Position { + position: [0.831025, 28.3457, -43.7462], + }, + Position { + position: [16.4508, 28.3457, -37.8195], + }, + Position { + position: [16.2329, 30.4443, -37.3073], + }, + Position { + position: [16.4857, 31.1438, -37.9014], + }, + Position { + position: [16.9999, 30.4443, -39.1101], + }, + Position { + position: [17.5665, 28.3457, -40.4417], + }, + Position { + position: [29.0859, 28.3457, -29.3629], + }, + Position { + position: [28.6917, 30.4443, -28.9687], + }, + Position { + position: [29.149, 31.1438, -29.426], + }, + Position { + position: [30.0792, 30.4443, -30.3562], + }, + Position { + position: [31.1041, 28.3457, -31.3811], + }, + Position { + position: [37.5425, 28.3457, -16.7278], + }, + Position { + position: [37.0303, 30.4443, -16.5099], + }, + Position { + position: [37.6244, 31.1438, -16.7627], + }, + Position { + position: [38.8331, 30.4443, -17.2769], + }, + Position { + position: [40.1647, 28.3457, -17.8435], + }, + Position { + position: [48.6879, 17.1865, -1.10804], + }, + Position { + position: [53.2404, 6.22714, -1.10804], + }, + Position { + position: [56.4605, -4.33246, -1.10804], + }, + Position { + position: [57.6819, -14.2925, -1.10804], + }, + Position { + position: [44.979, 17.1865, 17.6758], + }, + Position { + position: [49.1787, 6.22714, 19.4626], + }, + Position { + position: [52.1492, -4.33246, 20.7265], + }, + Position { + position: [53.2759, -14.2925, 21.2059], + }, + Position { + position: [34.8094, 17.1865, 32.8703], + }, + Position { + position: [38.0417, 6.22714, 36.1026], + }, + Position { + position: [40.3279, -4.33246, 38.3889], + }, + Position { + position: [41.1951, -14.2925, 39.2561], + }, + Position { + position: [19.6148, 17.1865, 43.0399], + }, + Position { + position: [21.4017, 6.22714, 47.2396], + }, + Position { + position: [22.6656, -4.33246, 50.2101], + }, + Position { + position: [23.145, -14.2925, 51.3369], + }, + Position { + position: [0.831025, 17.1865, 46.7488], + }, + Position { + position: [0.831025, 6.22714, 51.3013], + }, + Position { + position: [0.831025, -4.33246, 54.5214], + }, + Position { + position: [0.831025, -14.2925, 55.7428], + }, + Position { + position: [-17.9528, 17.1865, 43.0399], + }, + Position { + position: [-19.7397, 6.22714, 47.2396], + }, + Position { + position: [-21.0035, -4.33246, 50.2101], + }, + Position { + position: [-21.4829, -14.2925, 51.3369], + }, + Position { + position: [-33.1474, 17.1865, 32.8703], + }, + Position { + position: [-36.3796, 6.22714, 36.1026], + }, + Position { + position: [-38.6659, -4.33246, 38.3889], + }, + Position { + position: [-39.5331, -14.2925, 39.2561], + }, + Position { + position: [-43.3169, 17.1865, 17.6758], + }, + Position { + position: [-47.5166, 6.22714, 19.4626], + }, + Position { + position: [-50.4871, -4.33246, 20.7265], + }, + Position { + position: [-51.6139, -14.2925, 21.2059], + }, + Position { + position: [-47.0258, 17.1865, -1.10804], + }, + Position { + position: [-51.5784, 6.22714, -1.10804], + }, + Position { + position: [-54.7984, -4.33246, -1.10804], + }, + Position { + position: [-56.0198, -14.2925, -1.10804], + }, + Position { + position: [-43.3169, 17.1865, -19.8919], + }, + Position { + position: [-47.5166, 6.22714, -21.6787], + }, + Position { + position: [-50.4871, -4.33246, -22.9426], + }, + Position { + position: [-51.6139, -14.2925, -23.422], + }, + Position { + position: [-33.1474, 17.1865, -35.0864], + }, + Position { + position: [-36.3796, 6.22714, -38.3187], + }, + Position { + position: [-38.6659, -4.33246, -40.6049], + }, + Position { + position: [-39.5331, -14.2925, -41.4721], + }, + Position { + position: [-17.9528, 17.1865, -45.256], + }, + Position { + position: [-19.7397, 6.22714, -49.4557], + }, + Position { + position: [-21.0035, -4.33246, -52.4262], + }, + Position { + position: [-21.4829, -14.2925, -53.5529], + }, + Position { + position: [0.831025, 17.1865, -48.9649], + }, + Position { + position: [0.831025, 6.22714, -53.5174], + }, + Position { + position: [0.831025, -4.33246, -56.7375], + }, + Position { + position: [0.831025, -14.2925, -57.9589], + }, + Position { + position: [19.6148, 17.1865, -45.256], + }, + Position { + position: [21.4017, 6.22714, -49.4557], + }, + Position { + position: [22.6656, -4.33246, -52.4262], + }, + Position { + position: [23.145, -14.2925, -53.5529], + }, + Position { + position: [34.8094, 17.1865, -35.0864], + }, + Position { + position: [38.0417, 6.22714, -38.3187], + }, + Position { + position: [40.3279, -4.33246, -40.6049], + }, + Position { + position: [41.1951, -14.2925, -41.4721], + }, + Position { + position: [44.979, 17.1865, -19.8919], + }, + Position { + position: [49.1787, 6.22714, -21.6787], + }, + Position { + position: [52.1492, -4.33246, -22.9426], + }, + Position { + position: [53.2759, -14.2925, -23.422], + }, + Position { + position: [55.4611, -22.7202, -1.10804], + }, + Position { + position: [50.5755, -28.9493, -1.10804], + }, + Position { + position: [45.6899, -33.1798, -1.10804], + }, + Position { + position: [43.4692, -35.6115, -1.10804], + }, + Position { + position: [51.2273, -22.7202, 20.3343], + }, + Position { + position: [46.7203, -28.9493, 18.4167], + }, + Position { + position: [42.2133, -33.1798, 16.4991], + }, + Position { + position: [40.1647, -35.6115, 15.6274], + }, + Position { + position: [39.6184, -22.7202, 37.6793], + }, + Position { + position: [36.1496, -28.9493, 34.2106], + }, + Position { + position: [32.6808, -33.1798, 30.7418], + }, + Position { + position: [31.1041, -35.6115, 29.165], + }, + Position { + position: [22.2733, -22.7202, 49.2882], + }, + Position { + position: [20.3557, -28.9493, 44.7813], + }, + Position { + position: [18.4381, -33.1798, 40.2743], + }, + Position { + position: [17.5665, -35.6115, 38.2256], + }, + Position { + position: [0.831025, -22.7202, 53.5221], + }, + Position { + position: [0.831025, -28.9493, 48.6365], + }, + Position { + position: [0.831025, -33.1798, 43.7508], + }, + Position { + position: [0.831025, -35.6115, 41.5301], + }, + Position { + position: [-20.6113, -22.7202, 49.2882], + }, + Position { + position: [-18.6937, -28.9493, 44.7813], + }, + Position { + position: [-16.7761, -33.1798, 40.2743], + }, + Position { + position: [-15.9044, -35.6115, 38.2256], + }, + Position { + position: [-37.9564, -22.7202, 37.6793], + }, + Position { + position: [-34.4876, -28.9493, 34.2106], + }, + Position { + position: [-31.0188, -33.1798, 30.7418], + }, + Position { + position: [-29.4421, -35.6115, 29.165], + }, + Position { + position: [-49.5653, -22.7202, 20.3343], + }, + Position { + position: [-45.0583, -28.9493, 18.4167], + }, + Position { + position: [-40.5513, -33.1798, 16.4991], + }, + Position { + position: [-38.5027, -35.6115, 15.6274], + }, + Position { + position: [-53.7991, -22.7202, -1.10804], + }, + Position { + position: [-48.9135, -28.9493, -1.10804], + }, + Position { + position: [-44.0279, -33.1798, -1.10804], + }, + Position { + position: [-41.8071, -35.6115, -1.10804], + }, + Position { + position: [-49.5653, -22.7202, -22.5504], + }, + Position { + position: [-45.0583, -28.9493, -20.6327], + }, + Position { + position: [-40.5513, -33.1798, -18.7151], + }, + Position { + position: [-38.5027, -35.6115, -17.8435], + }, + Position { + position: [-37.9564, -22.7202, -39.8954], + }, + Position { + position: [-34.4876, -28.9493, -36.4266], + }, + Position { + position: [-31.0188, -33.1798, -32.9578], + }, + Position { + position: [-29.4421, -35.6115, -31.3811], + }, + Position { + position: [-20.6113, -22.7202, -51.5043], + }, + Position { + position: [-18.6937, -28.9493, -46.9973], + }, + Position { + position: [-16.7761, -33.1798, -42.4903], + }, + Position { + position: [-15.9044, -35.6115, -40.4417], + }, + Position { + position: [0.831025, -22.7202, -55.7382], + }, + Position { + position: [0.831025, -28.9493, -50.8525], + }, + Position { + position: [0.831025, -33.1798, -45.9669], + }, + Position { + position: [0.831025, -35.6115, -43.7462], + }, + Position { + position: [22.2733, -22.7202, -51.5043], + }, + Position { + position: [20.3557, -28.9493, -46.9973], + }, + Position { + position: [18.4381, -33.1798, -42.4903], + }, + Position { + position: [17.5665, -35.6115, -40.4417], + }, + Position { + position: [39.6184, -22.7202, -39.8954], + }, + Position { + position: [36.1496, -28.9493, -36.4266], + }, + Position { + position: [32.6808, -33.1798, -32.9578], + }, + Position { + position: [31.1041, -35.6115, -31.3811], + }, + Position { + position: [51.2273, -22.7202, -22.5504], + }, + Position { + position: [46.7203, -28.9493, -20.6327], + }, + Position { + position: [42.2133, -33.1798, -18.7151], + }, + Position { + position: [40.1647, -35.6115, -17.8435], + }, + Position { + position: [42.5031, -37.1772, -1.10804], + }, + Position { + position: [37.3399, -38.5429, -1.10804], + }, + Position { + position: [24.5818, -39.5089, -1.10804], + }, + Position { + position: [0.831025, -39.8754, -1.10804], + }, + Position { + position: [39.2736, -37.1772, 15.2483], + }, + Position { + position: [34.5105, -38.5429, 13.2217], + }, + Position { + position: [22.7411, -39.5089, 8.21414], + }, + Position { + position: [30.4182, -37.1772, 28.4792], + }, + Position { + position: [26.7523, -38.5429, 24.8133], + }, + Position { + position: [17.6941, -39.5089, 15.755], + }, + Position { + position: [17.1873, -37.1772, 37.3345], + }, + Position { + position: [15.1608, -38.5429, 32.5714], + }, + Position { + position: [10.1532, -39.5089, 20.8021], + }, + Position { + position: [0.831025, -37.1772, 40.5641], + }, + Position { + position: [0.831025, -38.5429, 35.4009], + }, + Position { + position: [0.831025, -39.5089, 22.6427], + }, + Position { + position: [-15.5253, -37.1772, 37.3345], + }, + Position { + position: [-13.4987, -38.5429, 32.5714], + }, + Position { + position: [-8.49115, -39.5089, 20.8021], + }, + Position { + position: [-28.7562, -37.1772, 28.4792], + }, + Position { + position: [-25.0903, -38.5429, 24.8133], + }, + Position { + position: [-16.032, -39.5089, 15.755], + }, + Position { + position: [-37.6115, -37.1772, 15.2483], + }, + Position { + position: [-32.8484, -38.5429, 13.2217], + }, + Position { + position: [-21.0791, -39.5089, 8.21414], + }, + Position { + position: [-40.8411, -37.1772, -1.10804], + }, + Position { + position: [-35.6779, -38.5429, -1.10804], + }, + Position { + position: [-22.9198, -39.5089, -1.10804], + }, + Position { + position: [-37.6115, -37.1772, -17.4643], + }, + Position { + position: [-32.8484, -38.5429, -15.4378], + }, + Position { + position: [-21.0791, -39.5089, -10.4302], + }, + Position { + position: [-28.7562, -37.1772, -30.6952], + }, + Position { + position: [-25.0903, -38.5429, -27.0294], + }, + Position { + position: [-16.032, -39.5089, -17.9711], + }, + Position { + position: [-15.5253, -37.1772, -39.5506], + }, + Position { + position: [-13.4987, -38.5429, -34.7875], + }, + Position { + position: [-8.49115, -39.5089, -23.0181], + }, + Position { + position: [0.831025, -37.1772, -42.7802], + }, + Position { + position: [0.831025, -38.5429, -37.6169], + }, + Position { + position: [0.831025, -39.5089, -24.8588], + }, + Position { + position: [17.1873, -37.1772, -39.5506], + }, + Position { + position: [15.1608, -38.5429, -34.7875], + }, + Position { + position: [10.1532, -39.5089, -23.0181], + }, + Position { + position: [30.4182, -37.1772, -30.6952], + }, + Position { + position: [26.7523, -38.5429, -27.0294], + }, + Position { + position: [17.6941, -39.5089, -17.9711], + }, + Position { + position: [39.2736, -37.1772, -17.4643], + }, + Position { + position: [34.5105, -38.5429, -15.4378], + }, + Position { + position: [22.7411, -39.5089, -10.4302], + }, + Position { + position: [-44.6497, 17.6861, -1.10804], + }, + Position { + position: [-57.9297, 17.5862, -1.10804], + }, + Position { + position: [-67.7453, 16.8867, -1.10804], + }, + Position { + position: [-73.8301, 14.9879, -1.10804], + }, + Position { + position: [-75.9176, 11.2904, -1.10804], + }, + Position { + position: [-44.2055, 18.6855, 3.68876], + }, + Position { + position: [-58.3252, 18.5699, 3.68876], + }, + Position { + position: [-68.6891, 17.7611, 3.68876], + }, + Position { + position: [-75.0724, 15.5657, 3.68876], + }, + Position { + position: [-77.2501, 11.2904, 3.68876], + }, + Position { + position: [-43.2284, 20.884, 5.28769], + }, + Position { + position: [-59.1955, 20.7341, 5.28769], + }, + Position { + position: [-70.7655, 19.6848, 5.28769], + }, + Position { + position: [-77.8053, 16.8367, 5.28769], + }, + Position { + position: [-80.1814, 11.2904, 5.28769], + }, + Position { + position: [-42.2513, 23.0825, 3.68876], + }, + Position { + position: [-60.0657, 22.8983, 3.68876], + }, + Position { + position: [-72.8419, 21.6085, 3.68876], + }, + Position { + position: [-80.5381, 18.1077, 3.68876], + }, + Position { + position: [-83.1128, 11.2904, 3.68876], + }, + Position { + position: [-41.8071, 24.0819, -1.10804], + }, + Position { + position: [-60.4613, 23.882, -1.10804], + }, + Position { + position: [-73.7857, 22.4829, -1.10804], + }, + Position { + position: [-81.7804, 18.6855, -1.10804], + }, + Position { + position: [-84.4453, 11.2904, -1.10804], + }, + Position { + position: [-42.2513, 23.0825, -5.90483], + }, + Position { + position: [-60.0657, 22.8983, -5.90483], + }, + Position { + position: [-72.8419, 21.6085, -5.90483], + }, + Position { + position: [-80.5381, 18.1077, -5.90483], + }, + Position { + position: [-83.1128, 11.2904, -5.90483], + }, + Position { + position: [-43.2284, 20.884, -7.50376], + }, + Position { + position: [-59.1955, 20.7341, -7.50376], + }, + Position { + position: [-70.7655, 19.6848, -7.50376], + }, + Position { + position: [-77.8053, 16.8367, -7.50376], + }, + Position { + position: [-80.1814, 11.2904, -7.50376], + }, + Position { + position: [-44.2055, 18.6855, -5.90483], + }, + Position { + position: [-58.3252, 18.5699, -5.90483], + }, + Position { + position: [-68.6891, 17.7611, -5.90483], + }, + Position { + position: [-75.0724, 15.5657, -5.90483], + }, + Position { + position: [-77.2501, 11.2904, -5.90483], + }, + Position { + position: [-74.8073, 5.4943, -1.10804], + }, + Position { + position: [-71.2985, -1.50103, -1.10804], + }, + Position { + position: [-65.1248, -8.49634, -1.10804], + }, + Position { + position: [-56.0198, -14.2925, -1.10804], + }, + Position { + position: [-76.0183, 4.93477, 3.68876], + }, + Position { + position: [-72.159, -2.35462, 3.68876], + }, + Position { + position: [-65.4267, -9.55033, 3.68876], + }, + Position { + position: [-55.5757, -15.6249, 3.68876], + }, + Position { + position: [-78.6824, 3.70383, 5.28769], + }, + Position { + position: [-74.0522, -4.23253, 5.28769], + }, + Position { + position: [-66.0909, -11.8691, 5.28769], + }, + Position { + position: [-54.5986, -18.5563, 5.28769], + }, + Position { + position: [-81.3466, 2.47288, 3.68876], + }, + Position { + position: [-75.9454, -6.11044, 3.68876], + }, + Position { + position: [-66.755, -14.1878, 3.68876], + }, + Position { + position: [-53.6214, -21.4877, 3.68876], + }, + Position { + position: [-82.5576, 1.91336, -1.10804], + }, + Position { + position: [-76.8059, -6.96404, -1.10804], + }, + Position { + position: [-67.0569, -15.2418, -1.10804], + }, + Position { + position: [-53.1773, -22.8201, -1.10804], + }, + Position { + position: [-81.3466, 2.47288, -5.90483], + }, + Position { + position: [-75.9454, -6.11044, -5.90483], + }, + Position { + position: [-66.755, -14.1878, -5.90483], + }, + Position { + position: [-53.6214, -21.4877, -5.90483], + }, + Position { + position: [-78.6824, 3.70383, -7.50376], + }, + Position { + position: [-74.0522, -4.23253, -7.50376], + }, + Position { + position: [-66.0909, -11.8691, -7.50376], + }, + Position { + position: [-54.5986, -18.5563, -7.50376], + }, + Position { + position: [-76.0183, 4.93477, -5.90483], + }, + Position { + position: [-72.159, -2.35462, -5.90483], + }, + Position { + position: [-65.4267, -9.55033, -5.90483], + }, + Position { + position: [-55.5757, -15.6249, -5.90483], + }, + Position { + position: [49.1543, 0.630882, -1.10804], + }, + Position { + position: [62.7896, 3.76212, -1.10804], + }, + Position { + position: [68.6967, 11.2904, -1.10804], + }, + Position { + position: [71.939, 20.4176, -1.10804], + }, + Position { + position: [77.5797, 28.3457, -1.10804], + }, + Position { + position: [49.1543, -3.03333, 9.4449], + }, + Position { + position: [63.8305, 1.04519, 8.42059], + }, + Position { + position: [70.0292, 9.70814, 6.1671], + }, + Position { + position: [73.5629, 19.8451, 3.91361], + }, + Position { + position: [80.2446, 28.3457, 2.88929], + }, + Position { + position: [49.1543, -11.0946, 12.9626], + }, + Position { + position: [66.1207, -4.93206, 11.5968], + }, + Position { + position: [72.9605, 6.22714, 8.59214], + }, + Position { + position: [77.1355, 18.5855, 5.58749], + }, + Position { + position: [86.1073, 28.3457, 4.22173], + }, + Position { + position: [49.1543, -19.1559, 9.4449], + }, + Position { + position: [68.4108, -10.9093, 8.42059], + }, + Position { + position: [75.8919, 2.74614, 6.1671], + }, + Position { + position: [80.7081, 17.326, 3.91361], + }, + Position { + position: [91.97, 28.3457, 2.88929], + }, + Position { + position: [49.1543, -22.8201, -1.10804], + }, + Position { + position: [69.4518, -13.6262, -1.10804], + }, + Position { + position: [77.2244, 1.16386, -1.10804], + }, + Position { + position: [82.3321, 16.7534, -1.10804], + }, + Position { + position: [94.6349, 28.3457, -1.10804], + }, + Position { + position: [49.1543, -19.1559, -11.661], + }, + Position { + position: [68.4108, -10.9093, -10.6367], + }, + Position { + position: [75.8919, 2.74614, -8.38317], + }, + Position { + position: [80.7081, 17.326, -6.12968], + }, + Position { + position: [91.97, 28.3457, -5.10536], + }, + Position { + position: [49.1543, -11.0946, -15.1786], + }, + Position { + position: [66.1207, -4.93206, -13.8129], + }, + Position { + position: [72.9605, 6.22714, -10.8082], + }, + Position { + position: [77.1355, 18.5855, -7.80356], + }, + Position { + position: [86.1073, 28.3457, -6.4378], + }, + Position { + position: [49.1543, -3.03333, -11.661], + }, + Position { + position: [63.8305, 1.04519, -10.6367], + }, + Position { + position: [70.0292, 9.70814, -8.38317], + }, + Position { + position: [73.5629, 19.8451, -6.12968], + }, + Position { + position: [80.2446, 28.3457, -5.10536], + }, + Position { + position: [79.6227, 29.5449, -1.10804], + }, + Position { + position: [81.1329, 29.9446, -1.10804], + }, + Position { + position: [81.577, 29.5449, -1.10804], + }, + Position { + position: [80.4222, 28.3457, -1.10804], + }, + Position { + position: [82.4767, 29.6034, 2.63946], + }, + Position { + position: [83.8116, 30.0383, 2.08983], + }, + Position { + position: [83.8515, 29.6268, 1.54019], + }, + Position { + position: [82.1988, 28.3457, 1.29036], + }, + Position { + position: [88.7555, 29.7322, 3.88862], + }, + Position { + position: [89.7049, 30.2444, 3.15578], + }, + Position { + position: [88.8555, 29.8072, 2.42294], + }, + Position { + position: [86.1073, 28.3457, 2.08983], + }, + Position { + position: [95.0343, 29.8611, 2.63946], + }, + Position { + position: [95.5982, 30.4505, 2.08983], + }, + Position { + position: [93.8594, 29.9875, 1.54019], + }, + Position { + position: [90.0158, 28.3457, 1.29036], + }, + Position { + position: [97.8883, 29.9196, -1.10804], + }, + Position { + position: [98.2769, 30.5442, -1.10804], + }, + Position { + position: [96.1339, 30.0695, -1.10804], + }, + Position { + position: [91.7924, 28.3457, -1.10804], + }, + Position { + position: [95.0343, 29.8611, -4.85553], + }, + Position { + position: [95.5982, 30.4505, -4.3059], + }, + Position { + position: [93.8594, 29.9875, -3.75626], + }, + Position { + position: [90.0158, 28.3457, -3.50643], + }, + Position { + position: [88.7555, 29.7322, -6.10469], + }, + Position { + position: [89.7049, 30.2444, -5.37185], + }, + Position { + position: [88.8555, 29.8072, -4.63901], + }, + Position { + position: [86.1073, 28.3457, -4.3059], + }, + Position { + position: [82.4767, 29.6034, -4.85553], + }, + Position { + position: [83.8116, 30.0383, -4.3059], + }, + Position { + position: [83.8515, 29.6268, -3.75626], + }, + Position { + position: [82.1988, 28.3457, -3.50643], + }, + Position { + position: [0.831025, 49.6647, -1.10804], + }, + Position { + position: [10.5134, 48.2657, -1.10804], + }, + Position { + position: [10.0693, 44.868, -1.10804], + }, + Position { + position: [6.42728, 40.6708, -1.10804], + }, + Position { + position: [6.51611, 36.8733, -1.10804], + }, + Position { + position: [9.76642, 48.2657, 2.70243], + }, + Position { + position: [9.35632, 44.868, 2.52698], + }, + Position { + position: [5.9947, 40.6708, 1.09187], + }, + Position { + position: [6.07552, 36.8733, 1.12336], + }, + Position { + position: [7.71453, 48.2657, 5.77547], + }, + Position { + position: [7.39819, 44.868, 5.45913], + }, + Position { + position: [4.80736, 40.6708, 2.8683], + }, + Position { + position: [4.86744, 36.8733, 2.92838], + }, + Position { + position: [4.64149, 48.2657, 7.82736], + }, + Position { + position: [4.46604, 44.868, 7.41726], + }, + Position { + position: [3.03093, 40.6708, 4.05564], + }, + Position { + position: [3.06242, 36.8733, 4.13646], + }, + Position { + position: [0.831025, 48.2657, 8.57438], + }, + Position { + position: [0.831025, 44.868, 8.13023], + }, + Position { + position: [0.831025, 40.6708, 4.48822], + }, + Position { + position: [0.831025, 36.8733, 4.57705], + }, + Position { + position: [-2.97944, 48.2657, 7.82736], + }, + Position { + position: [-2.80399, 44.868, 7.41726], + }, + Position { + position: [-1.36888, 40.6708, 4.05564], + }, + Position { + position: [-1.40037, 36.8733, 4.13646], + }, + Position { + position: [-6.05248, 48.2657, 5.77547], + }, + Position { + position: [-5.73614, 44.868, 5.45913], + }, + Position { + position: [-3.14531, 40.6708, 2.8683], + }, + Position { + position: [-3.20539, 36.8733, 2.92838], + }, + Position { + position: [-8.10437, 48.2657, 2.70243], + }, + Position { + position: [-7.69427, 44.868, 2.52698], + }, + Position { + position: [-4.33265, 40.6708, 1.09187], + }, + Position { + position: [-4.41347, 36.8733, 1.12336], + }, + Position { + position: [-8.85139, 48.2657, -1.10804], + }, + Position { + position: [-8.40724, 44.868, -1.10804], + }, + Position { + position: [-4.76523, 40.6708, -1.10804], + }, + Position { + position: [-4.85406, 36.8733, -1.10804], + }, + Position { + position: [-8.10437, 48.2657, -4.9185], + }, + Position { + position: [-7.69427, 44.868, -4.74305], + }, + Position { + position: [-4.33265, 40.6708, -3.30794], + }, + Position { + position: [-4.41347, 36.8733, -3.33943], + }, + Position { + position: [-6.05248, 48.2657, -7.99154], + }, + Position { + position: [-5.73614, 44.868, -7.6752], + }, + Position { + position: [-3.14531, 40.6708, -5.08437], + }, + Position { + position: [-3.20539, 36.8733, -5.14445], + }, + Position { + position: [-2.97944, 48.2657, -10.0434], + }, + Position { + position: [-2.80399, 44.868, -9.63333], + }, + Position { + position: [-1.36888, 40.6708, -6.27171], + }, + Position { + position: [-1.40037, 36.8733, -6.35253], + }, + Position { + position: [0.831025, 48.2657, -10.7904], + }, + Position { + position: [0.831025, 44.868, -10.3463], + }, + Position { + position: [0.831025, 40.6708, -6.70429], + }, + Position { + position: [0.831025, 36.8733, -6.79312], + }, + Position { + position: [4.64149, 48.2657, -10.0434], + }, + Position { + position: [4.46604, 44.868, -9.63333], + }, + Position { + position: [3.03093, 40.6708, -6.27171], + }, + Position { + position: [3.06242, 36.8733, -6.35253], + }, + Position { + position: [7.71453, 48.2657, -7.99154], + }, + Position { + position: [7.39819, 44.868, -7.6752], + }, + Position { + position: [4.80736, 40.6708, -5.08437], + }, + Position { + position: [4.86744, 36.8733, -5.14445], + }, + Position { + position: [9.76642, 48.2657, -4.9185], + }, + Position { + position: [9.35632, 44.868, -4.74305], + }, + Position { + position: [5.9947, 40.6708, -3.30794], + }, + Position { + position: [6.07552, 36.8733, -3.33943], + }, + Position { + position: [13.8001, 34.3417, -1.10804], + }, + Position { + position: [24.282, 32.6095, -1.10804], + }, + Position { + position: [33.6979, 30.8773, -1.10804], + }, + Position { + position: [37.7841, 28.3457, -1.10804], + }, + Position { + position: [12.795, 34.3417, 3.98234], + }, + Position { + position: [22.4646, 32.6095, 8.09647], + }, + Position { + position: [31.1507, 30.8773, 11.7922], + }, + Position { + position: [34.9202, 28.3457, 13.396], + }, + Position { + position: [10.0391, 34.3417, 8.10003], + }, + Position { + position: [17.4812, 32.6095, 15.5422], + }, + Position { + position: [24.1665, 30.8773, 22.2275], + }, + Position { + position: [27.0677, 28.3457, 25.1286], + }, + Position { + position: [5.9214, 34.3417, 10.856], + }, + Position { + position: [10.0355, 32.6095, 20.5255], + }, + Position { + position: [13.7313, 30.8773, 29.2117], + }, + Position { + position: [15.3351, 28.3457, 32.9812], + }, + Position { + position: [0.831025, 34.3417, 11.8611], + }, + Position { + position: [0.831025, 32.6095, 22.3429], + }, + Position { + position: [0.831025, 30.8773, 31.7589], + }, + Position { + position: [0.831025, 28.3457, 35.845], + }, + Position { + position: [-4.25935, 34.3417, 10.856], + }, + Position { + position: [-8.37348, 32.6095, 20.5255], + }, + Position { + position: [-12.0692, 30.8773, 29.2117], + }, + Position { + position: [-13.673, 28.3457, 32.9812], + }, + Position { + position: [-8.37704, 34.3417, 8.10003], + }, + Position { + position: [-15.8192, 32.6095, 15.5422], + }, + Position { + position: [-22.5045, 30.8773, 22.2275], + }, + Position { + position: [-25.4056, 28.3457, 25.1286], + }, + Position { + position: [-11.133, 34.3417, 3.98234], + }, + Position { + position: [-20.8025, 32.6095, 8.09647], + }, + Position { + position: [-29.4887, 30.8773, 11.7922], + }, + Position { + position: [-33.2582, 28.3457, 13.396], + }, + Position { + position: [-12.1381, 34.3417, -1.10804], + }, + Position { + position: [-22.62, 32.6095, -1.10804], + }, + Position { + position: [-32.0359, 30.8773, -1.10804], + }, + Position { + position: [-36.122, 28.3457, -1.10804], + }, + Position { + position: [-11.133, 34.3417, -6.19841], + }, + Position { + position: [-20.8025, 32.6095, -10.3125], + }, + Position { + position: [-29.4887, 30.8773, -14.0083], + }, + Position { + position: [-33.2582, 28.3457, -15.6121], + }, + Position { + position: [-8.37704, 34.3417, -10.3161], + }, + Position { + position: [-15.8192, 32.6095, -17.7582], + }, + Position { + position: [-22.5045, 30.8773, -24.4435], + }, + Position { + position: [-25.4056, 28.3457, -27.3447], + }, + Position { + position: [-4.25935, 34.3417, -13.072], + }, + Position { + position: [-8.37348, 32.6095, -22.7416], + }, + Position { + position: [-12.0692, 30.8773, -31.4277], + }, + Position { + position: [-13.673, 28.3457, -35.1972], + }, + Position { + position: [0.831025, 34.3417, -14.0771], + }, + Position { + position: [0.831025, 32.6095, -24.559], + }, + Position { + position: [0.831025, 30.8773, -33.9749], + }, + Position { + position: [0.831025, 28.3457, -38.0611], + }, + Position { + position: [5.9214, 34.3417, -13.072], + }, + Position { + position: [10.0355, 32.6095, -22.7416], + }, + Position { + position: [13.7313, 30.8773, -31.4277], + }, + Position { + position: [15.3351, 28.3457, -35.1972], + }, + Position { + position: [10.0391, 34.3417, -10.3161], + }, + Position { + position: [17.4812, 32.6095, -17.7582], + }, + Position { + position: [24.1665, 30.8773, -24.4435], + }, + Position { + position: [27.0677, 28.3457, -27.3447], + }, + Position { + position: [12.795, 34.3417, -6.19841], + }, + Position { + position: [22.4646, 32.6095, -10.3125], + }, + Position { + position: [31.1507, 30.8773, -14.0083], + }, + Position { + position: [34.9202, 28.3457, -15.6121], + }, +]; + +#[derive(BufferContents, Vertex)] +#[repr(C)] +pub struct Normal { + #[format(R32G32B32_SFLOAT)] + normal: [f32; 3], +} + +pub const NORMALS: [Normal; 531] = [ + Normal { + normal: [0.0, 0.0, 0.0], + }, // dummy vector because in the original model indices + // start at 1 + Normal { + normal: [-0.966742, -0.255752, 0.0], + }, + Normal { + normal: [-0.966824, 0.255443, 0.0], + }, + Normal { + normal: [-0.092052, 0.995754, 0.0], + }, + Normal { + normal: [0.68205, 0.731305, 0.0], + }, + Normal { + normal: [0.870301, 0.492521, -0.0], + }, + Normal { + normal: [-0.893014, -0.256345, -0.369882], + }, + Normal { + normal: [-0.893437, 0.255997, -0.369102], + }, + Normal { + normal: [-0.0838771, 0.995843, -0.0355068], + }, + Normal { + normal: [0.629724, 0.73186, 0.260439], + }, + Normal { + normal: [0.803725, 0.49337, 0.332584], + }, + Normal { + normal: [-0.683407, -0.256729, -0.683407], + }, + Normal { + normal: [-0.683531, 0.256067, -0.683531], + }, + Normal { + normal: [-0.0649249, 0.995776, -0.0649248], + }, + Normal { + normal: [0.481398, 0.732469, 0.481398], + }, + Normal { + normal: [0.614804, 0.493997, 0.614804], + }, + Normal { + normal: [-0.369882, -0.256345, -0.893014], + }, + Normal { + normal: [-0.369102, 0.255997, -0.893437], + }, + Normal { + normal: [-0.0355067, 0.995843, -0.0838772], + }, + Normal { + normal: [0.260439, 0.73186, 0.629724], + }, + Normal { + normal: [0.332584, 0.49337, 0.803725], + }, + Normal { + normal: [-0.00284834, -0.257863, -0.966177], + }, + Normal { + normal: [-0.00192311, 0.254736, -0.967009], + }, + Normal { + normal: [-0.000266114, 0.995734, -0.0922702], + }, + Normal { + normal: [0.0, 0.731295, 0.682061], + }, + Normal { + normal: [0.0, 0.492521, 0.870301], + }, + Normal { + normal: [0.379058, -0.3593, -0.852771], + }, + Normal { + normal: [0.37711, 0.149086, -0.914091], + }, + Normal { + normal: [0.0275022, 0.992081, -0.122551], + }, + Normal { + normal: [-0.26101, 0.726762, 0.635367], + }, + Normal { + normal: [-0.332485, 0.492546, 0.804271], + }, + Normal { + normal: [0.663548, -0.410791, -0.625264], + }, + Normal { + normal: [0.712664, 0.0737216, -0.697621], + }, + Normal { + normal: [0.0997268, 0.987509, -0.121984], + }, + Normal { + normal: [-0.48732, 0.723754, 0.488568], + }, + Normal { + normal: [-0.615242, 0.492602, 0.615484], + }, + Normal { + normal: [0.880028, -0.332908, -0.338709], + }, + Normal { + normal: [0.917276, 0.167113, -0.361493], + }, + Normal { + normal: [0.113584, 0.992365, -0.0480695], + }, + Normal { + normal: [-0.63415, 0.727508, 0.261889], + }, + Normal { + normal: [-0.804126, 0.492634, 0.332705], + }, + Normal { + normal: [0.96669, -0.255738, 0.0104537], + }, + Normal { + normal: [0.967442, 0.252962, 0.00810329], + }, + Normal { + normal: [0.0934365, 0.995624, 0.00128063], + }, + Normal { + normal: [-0.682167, 0.731196, -0.00034353], + }, + Normal { + normal: [-0.870322, 0.492483, -0.0], + }, + Normal { + normal: [0.893014, -0.256345, 0.369882], + }, + Normal { + normal: [0.893437, 0.255997, 0.369102], + }, + Normal { + normal: [0.0838768, 0.995843, 0.0355066], + }, + Normal { + normal: [-0.629724, 0.73186, -0.260439], + }, + Normal { + normal: [-0.803725, 0.49337, -0.332584], + }, + Normal { + normal: [0.683407, -0.256729, 0.683407], + }, + Normal { + normal: [0.683531, 0.256067, 0.683531], + }, + Normal { + normal: [0.0649249, 0.995776, 0.0649249], + }, + Normal { + normal: [-0.481398, 0.732469, -0.481398], + }, + Normal { + normal: [-0.614804, 0.493997, -0.614804], + }, + Normal { + normal: [0.369882, -0.256345, 0.893014], + }, + Normal { + normal: [0.369102, 0.255997, 0.893437], + }, + Normal { + normal: [0.0355067, 0.995843, 0.083877], + }, + Normal { + normal: [-0.260439, 0.73186, -0.629724], + }, + Normal { + normal: [-0.332584, 0.49337, -0.803725], + }, + Normal { + normal: [0.0, -0.255752, 0.966742], + }, + Normal { + normal: [0.0, 0.255443, 0.966824], + }, + Normal { + normal: [0.0, 0.995754, 0.092052], + }, + Normal { + normal: [0.0, 0.731305, -0.68205], + }, + Normal { + normal: [-0.0, 0.492521, -0.870301], + }, + Normal { + normal: [-0.369882, -0.256345, 0.893014], + }, + Normal { + normal: [-0.369102, 0.255996, 0.893437], + }, + Normal { + normal: [-0.0355068, 0.995843, 0.0838771], + }, + Normal { + normal: [0.260439, 0.73186, -0.629724], + }, + Normal { + normal: [0.332584, 0.49337, -0.803725], + }, + Normal { + normal: [-0.683407, -0.256729, 0.683407], + }, + Normal { + normal: [-0.683531, 0.256067, 0.683531], + }, + Normal { + normal: [-0.0649249, 0.995776, 0.064925], + }, + Normal { + normal: [0.481398, 0.732469, -0.481398], + }, + Normal { + normal: [0.614804, 0.493997, -0.614804], + }, + Normal { + normal: [-0.893014, -0.256345, 0.369882], + }, + Normal { + normal: [-0.893437, 0.255997, 0.369102], + }, + Normal { + normal: [-0.0838767, 0.995843, 0.0355066], + }, + Normal { + normal: [0.629724, 0.73186, -0.260439], + }, + Normal { + normal: [0.803725, 0.49337, -0.332584], + }, + Normal { + normal: [0.915321, 0.402725, 0.0], + }, + Normal { + normal: [0.941808, 0.336151, -0.0], + }, + Normal { + normal: [0.97869, 0.205342, 0.0], + }, + Normal { + normal: [0.997804, -0.0662397, 0.0], + }, + Normal { + normal: [0.845438, 0.403546, 0.349835], + }, + Normal { + normal: [0.869996, 0.336859, 0.360047], + }, + Normal { + normal: [0.904193, 0.205791, 0.37428], + }, + Normal { + normal: [0.921879, -0.0663697, 0.381752], + }, + Normal { + normal: [0.646802, 0.404096, 0.646802], + }, + Normal { + normal: [0.665655, 0.337351, 0.665655], + }, + Normal { + normal: [0.691923, 0.20612, 0.691923], + }, + Normal { + normal: [0.705542, -0.0664796, 0.705543], + }, + Normal { + normal: [0.349835, 0.403546, 0.845438], + }, + Normal { + normal: [0.360047, 0.336859, 0.869996], + }, + Normal { + normal: [0.37428, 0.205791, 0.904193], + }, + Normal { + normal: [0.381752, -0.0663697, 0.921879], + }, + Normal { + normal: [-0.0, 0.402725, 0.915321], + }, + Normal { + normal: [0.0, 0.336151, 0.941808], + }, + Normal { + normal: [-0.0, 0.205342, 0.97869], + }, + Normal { + normal: [-0.0, -0.0662397, 0.997804], + }, + Normal { + normal: [-0.349835, 0.403546, 0.845438], + }, + Normal { + normal: [-0.360047, 0.336859, 0.869996], + }, + Normal { + normal: [-0.37428, 0.205791, 0.904193], + }, + Normal { + normal: [-0.381752, -0.0663697, 0.921879], + }, + Normal { + normal: [-0.646802, 0.404096, 0.646802], + }, + Normal { + normal: [-0.665655, 0.337351, 0.665655], + }, + Normal { + normal: [-0.691923, 0.20612, 0.691923], + }, + Normal { + normal: [-0.705543, -0.0664796, 0.705543], + }, + Normal { + normal: [-0.845438, 0.403546, 0.349835], + }, + Normal { + normal: [-0.869996, 0.336859, 0.360047], + }, + Normal { + normal: [-0.904193, 0.205791, 0.37428], + }, + Normal { + normal: [-0.921879, -0.0663697, 0.381752], + }, + Normal { + normal: [-0.915321, 0.402725, -0.0], + }, + Normal { + normal: [-0.941808, 0.336151, -0.0], + }, + Normal { + normal: [-0.97869, 0.205342, -0.0], + }, + Normal { + normal: [-0.997804, -0.0662397, -0.0], + }, + Normal { + normal: [-0.845438, 0.403546, -0.349835], + }, + Normal { + normal: [-0.869996, 0.336859, -0.360047], + }, + Normal { + normal: [-0.904193, 0.205791, -0.37428], + }, + Normal { + normal: [-0.921879, -0.0663697, -0.381752], + }, + Normal { + normal: [-0.646802, 0.404096, -0.646802], + }, + Normal { + normal: [-0.665655, 0.337351, -0.665655], + }, + Normal { + normal: [-0.691923, 0.20612, -0.691923], + }, + Normal { + normal: [-0.705542, -0.0664796, -0.705543], + }, + Normal { + normal: [-0.349835, 0.403546, -0.845438], + }, + Normal { + normal: [-0.360047, 0.336859, -0.869996], + }, + Normal { + normal: [-0.37428, 0.205791, -0.904193], + }, + Normal { + normal: [-0.381752, -0.0663697, -0.921879], + }, + Normal { + normal: [0.0, 0.402725, -0.915321], + }, + Normal { + normal: [-0.0, 0.336151, -0.941808], + }, + Normal { + normal: [0.0, 0.205342, -0.97869], + }, + Normal { + normal: [0.0, -0.0662397, -0.997804], + }, + Normal { + normal: [0.349835, 0.403546, -0.845438], + }, + Normal { + normal: [0.360047, 0.336859, -0.869996], + }, + Normal { + normal: [0.37428, 0.205791, -0.904193], + }, + Normal { + normal: [0.381752, -0.0663697, -0.921879], + }, + Normal { + normal: [0.646802, 0.404096, -0.646802], + }, + Normal { + normal: [0.665655, 0.337351, -0.665655], + }, + Normal { + normal: [0.691923, 0.20612, -0.691923], + }, + Normal { + normal: [0.705543, -0.0664796, -0.705542], + }, + Normal { + normal: [0.845438, 0.403546, -0.349835], + }, + Normal { + normal: [0.869996, 0.336859, -0.360047], + }, + Normal { + normal: [0.904193, 0.205791, -0.37428], + }, + Normal { + normal: [0.921879, -0.0663697, -0.381752], + }, + Normal { + normal: [0.900182, -0.435513, -0.0], + }, + Normal { + normal: [0.729611, -0.683863, -0.0], + }, + Normal { + normal: [0.693951, -0.720022, -0.0], + }, + Normal { + normal: [0.79395, -0.607984, 0.0], + }, + Normal { + normal: [0.831437, -0.43618, 0.344179], + }, + Normal { + normal: [0.673512, -0.684665, 0.278594], + }, + Normal { + normal: [0.640399, -0.720924, 0.264874], + }, + Normal { + normal: [0.732949, -0.608996, 0.303166], + }, + Normal { + normal: [0.636092, -0.436777, 0.636092], + }, + Normal { + normal: [0.514965, -0.685289, 0.514965], + }, + Normal { + normal: [0.489651, -0.721446, 0.489651], + }, + Normal { + normal: [0.560555, -0.609554, 0.560555], + }, + Normal { + normal: [0.344179, -0.43618, 0.831437], + }, + Normal { + normal: [0.278594, -0.684665, 0.673512], + }, + Normal { + normal: [0.264874, -0.720924, 0.640399], + }, + Normal { + normal: [0.303166, -0.608996, 0.732949], + }, + Normal { + normal: [0.0, -0.435513, 0.900182], + }, + Normal { + normal: [-0.0, -0.683863, 0.729611], + }, + Normal { + normal: [0.0, -0.720022, 0.693951], + }, + Normal { + normal: [-0.0, -0.607984, 0.79395], + }, + Normal { + normal: [-0.344179, -0.43618, 0.831437], + }, + Normal { + normal: [-0.278594, -0.684665, 0.673512], + }, + Normal { + normal: [-0.264874, -0.720924, 0.640399], + }, + Normal { + normal: [-0.303166, -0.608996, 0.732949], + }, + Normal { + normal: [-0.636092, -0.436777, 0.636092], + }, + Normal { + normal: [-0.514965, -0.685289, 0.514965], + }, + Normal { + normal: [-0.489651, -0.721446, 0.489651], + }, + Normal { + normal: [-0.560555, -0.609554, 0.560555], + }, + Normal { + normal: [-0.831437, -0.43618, 0.344179], + }, + Normal { + normal: [-0.673512, -0.684665, 0.278595], + }, + Normal { + normal: [-0.640399, -0.720924, 0.264874], + }, + Normal { + normal: [-0.732949, -0.608996, 0.303166], + }, + Normal { + normal: [-0.900182, -0.435513, -0.0], + }, + Normal { + normal: [-0.729611, -0.683863, -0.0], + }, + Normal { + normal: [-0.693951, -0.720022, 0.0], + }, + Normal { + normal: [-0.79395, -0.607983, -0.0], + }, + Normal { + normal: [-0.831437, -0.43618, -0.344179], + }, + Normal { + normal: [-0.673512, -0.684665, -0.278594], + }, + Normal { + normal: [-0.640399, -0.720924, -0.264874], + }, + Normal { + normal: [-0.732949, -0.608996, -0.303166], + }, + Normal { + normal: [-0.636092, -0.436777, -0.636092], + }, + Normal { + normal: [-0.514965, -0.685289, -0.514965], + }, + Normal { + normal: [-0.489651, -0.721446, -0.489651], + }, + Normal { + normal: [-0.560555, -0.609554, -0.560555], + }, + Normal { + normal: [-0.344179, -0.43618, -0.831437], + }, + Normal { + normal: [-0.278594, -0.684665, -0.673512], + }, + Normal { + normal: [-0.264874, -0.720924, -0.640399], + }, + Normal { + normal: [-0.303166, -0.608996, -0.732949], + }, + Normal { + normal: [-0.0, -0.435513, -0.900182], + }, + Normal { + normal: [0.0, -0.683863, -0.729611], + }, + Normal { + normal: [-0.0, -0.720022, -0.693951], + }, + Normal { + normal: [0.0, -0.607984, -0.79395], + }, + Normal { + normal: [0.344179, -0.43618, -0.831437], + }, + Normal { + normal: [0.278594, -0.684665, -0.673512], + }, + Normal { + normal: [0.264874, -0.720924, -0.640399], + }, + Normal { + normal: [0.303167, -0.608996, -0.732949], + }, + Normal { + normal: [0.636092, -0.436777, -0.636092], + }, + Normal { + normal: [0.514965, -0.685289, -0.514965], + }, + Normal { + normal: [0.489651, -0.721446, -0.489651], + }, + Normal { + normal: [0.560555, -0.609554, -0.560555], + }, + Normal { + normal: [0.831437, -0.43618, -0.344179], + }, + Normal { + normal: [0.673512, -0.684665, -0.278595], + }, + Normal { + normal: [0.640399, -0.720924, -0.264874], + }, + Normal { + normal: [0.732949, -0.608996, -0.303166], + }, + Normal { + normal: [0.62386, -0.781536, 0.0], + }, + Normal { + normal: [0.177291, -0.984159, -0.0], + }, + Normal { + normal: [0.0492072, -0.998789, 0.0], + }, + Normal { + normal: [0.0, -1.0, -0.0], + }, + Normal { + normal: [0.576229, -0.781801, 0.238217], + }, + Normal { + normal: [0.163629, -0.984208, 0.0675273], + }, + Normal { + normal: [0.0454217, -0.998792, 0.0187357], + }, + Normal { + normal: [0.440416, -0.782348, 0.440416], + }, + Normal { + normal: [0.124903, -0.984276, 0.124903], + }, + Normal { + normal: [0.0346621, -0.998798, 0.0346621], + }, + Normal { + normal: [0.238217, -0.781801, 0.576229], + }, + Normal { + normal: [0.0675273, -0.984208, 0.163629], + }, + Normal { + normal: [0.0187357, -0.998792, 0.0454217], + }, + Normal { + normal: [-0.0, -0.781536, 0.62386], + }, + Normal { + normal: [0.0, -0.984159, 0.177291], + }, + Normal { + normal: [-0.0, -0.998789, 0.0492072], + }, + Normal { + normal: [-0.238216, -0.781801, 0.576229], + }, + Normal { + normal: [-0.0675273, -0.984208, 0.163629], + }, + Normal { + normal: [-0.0187357, -0.998792, 0.0454217], + }, + Normal { + normal: [-0.440416, -0.782348, 0.440416], + }, + Normal { + normal: [-0.124903, -0.984276, 0.124903], + }, + Normal { + normal: [-0.0346621, -0.998798, 0.0346621], + }, + Normal { + normal: [-0.576229, -0.781801, 0.238217], + }, + Normal { + normal: [-0.163629, -0.984208, 0.0675273], + }, + Normal { + normal: [-0.0454217, -0.998792, 0.0187357], + }, + Normal { + normal: [-0.62386, -0.781536, -0.0], + }, + Normal { + normal: [-0.177291, -0.984159, 0.0], + }, + Normal { + normal: [-0.0492072, -0.998789, -0.0], + }, + Normal { + normal: [-0.576229, -0.781801, -0.238217], + }, + Normal { + normal: [-0.163629, -0.984208, -0.0675273], + }, + Normal { + normal: [-0.0454217, -0.998792, -0.0187357], + }, + Normal { + normal: [-0.440416, -0.782348, -0.440416], + }, + Normal { + normal: [-0.124903, -0.984276, -0.124903], + }, + Normal { + normal: [-0.0346621, -0.998798, -0.0346621], + }, + Normal { + normal: [-0.238217, -0.781801, -0.576229], + }, + Normal { + normal: [-0.0675273, -0.984208, -0.163629], + }, + Normal { + normal: [-0.0187357, -0.998792, -0.0454217], + }, + Normal { + normal: [0.0, -0.781536, -0.62386], + }, + Normal { + normal: [-0.0, -0.984159, -0.177291], + }, + Normal { + normal: [0.0, -0.998789, -0.0492072], + }, + Normal { + normal: [0.238217, -0.781801, -0.576229], + }, + Normal { + normal: [0.0675273, -0.984208, -0.163629], + }, + Normal { + normal: [0.0187357, -0.998792, -0.0454217], + }, + Normal { + normal: [0.440416, -0.782348, -0.440416], + }, + Normal { + normal: [0.124903, -0.984276, -0.124903], + }, + Normal { + normal: [0.0346621, -0.998798, -0.0346621], + }, + Normal { + normal: [0.576229, -0.781801, -0.238217], + }, + Normal { + normal: [0.163629, -0.984208, -0.0675273], + }, + Normal { + normal: [0.0454217, -0.998792, -0.0187357], + }, + Normal { + normal: [0.00778619, -0.99997, -0.000215809], + }, + Normal { + normal: [0.0391385, -0.999233, -0.000988567], + }, + Normal { + normal: [0.179511, -0.983746, -0.00436856], + }, + Normal { + normal: [0.6123, -0.790556, -0.0104598], + }, + Normal { + normal: [0.986152, -0.165707, -0.00666949], + }, + Normal { + normal: [0.00703893, -0.812495, 0.582926], + }, + Normal { + normal: [0.0361273, -0.837257, 0.545614], + }, + Normal { + normal: [0.161845, -0.810421, 0.563048], + }, + Normal { + normal: [0.482365, -0.595148, 0.642746], + }, + Normal { + normal: [0.73872, -0.114593, 0.664199], + }, + Normal { + normal: [-0.00190867, 0.162121, 0.986769], + }, + Normal { + normal: [0.0027616, 0.0171073, 0.99985], + }, + Normal { + normal: [0.0105326, 0.0733989, 0.997247], + }, + Normal { + normal: [-0.0660406, 0.130069, 0.989303], + }, + Normal { + normal: [-0.0944272, 0.0165946, 0.995393], + }, + Normal { + normal: [-0.009203, 0.871509, 0.490293], + }, + Normal { + normal: [-0.0486064, 0.840609, 0.539457], + }, + Normal { + normal: [-0.223298, 0.802881, 0.552739], + }, + Normal { + normal: [-0.596365, 0.559971, 0.575135], + }, + Normal { + normal: [-0.803337, 0.0682361, 0.591602], + }, + Normal { + normal: [-0.0105609, 0.999944, 0.000103364], + }, + Normal { + normal: [-0.0587986, 0.99827, 0.000709759], + }, + Normal { + normal: [-0.28071, 0.959787, 0.00326876], + }, + Normal { + normal: [-0.749723, 0.661738, 0.0042684], + }, + Normal { + normal: [-0.997351, 0.0727144, 0.00205923], + }, + Normal { + normal: [-0.00879197, 0.871493, -0.49033], + }, + Normal { + normal: [-0.0464937, 0.841178, -0.538756], + }, + Normal { + normal: [-0.217909, 0.806807, -0.549161], + }, + Normal { + normal: [-0.597291, 0.560026, -0.574121], + }, + Normal { + normal: [-0.804, 0.0629127, -0.591291], + }, + Normal { + normal: [-0.00180555, 0.161691, -0.98684], + }, + Normal { + normal: [0.00203087, 0.014555, -0.999892], + }, + Normal { + normal: [0.00921499, 0.0600698, -0.998152], + }, + Normal { + normal: [-0.0593333, 0.113865, -0.991723], + }, + Normal { + normal: [-0.0868992, 0.0122903, -0.996141], + }, + Normal { + normal: [0.00641779, -0.812379, -0.583094], + }, + Normal { + normal: [0.0337833, -0.837512, -0.545373], + }, + Normal { + normal: [0.157112, -0.811947, -0.56219], + }, + Normal { + normal: [0.484407, -0.589365, -0.646528], + }, + Normal { + normal: [0.73887, -0.10132, -0.666187], + }, + Normal { + normal: [0.946512, 0.32265, -0.0033571], + }, + Normal { + normal: [0.82583, 0.56387, -0.00745213], + }, + Normal { + normal: [0.650011, 0.759893, -0.00693681], + }, + Normal { + normal: [0.532429, 0.846458, -0.00524544], + }, + Normal { + normal: [0.725608, 0.259351, 0.637362], + }, + Normal { + normal: [0.645945, 0.461988, 0.607719], + }, + Normal { + normal: [0.531614, 0.63666, 0.558615], + }, + Normal { + normal: [0.424964, 0.681717, 0.59554], + }, + Normal { + normal: [-0.0495616, -0.019755, 0.998576], + }, + Normal { + normal: [-0.0378162, -0.0356243, 0.99865], + }, + Normal { + normal: [-0.0379139, -0.0365122, 0.998614], + }, + Normal { + normal: [-0.168854, -0.297946, 0.93953], + }, + Normal { + normal: [-0.742342, -0.299166, 0.599523], + }, + Normal { + normal: [-0.619602, -0.529406, 0.579503], + }, + Normal { + normal: [-0.483708, -0.685761, 0.543837], + }, + Normal { + normal: [-0.445293, -0.794355, 0.413176], + }, + Normal { + normal: [-0.926513, -0.376257, 0.00199587], + }, + Normal { + normal: [-0.75392, -0.656952, 0.00431723], + }, + Normal { + normal: [-0.566224, -0.824244, 0.00346105], + }, + Normal { + normal: [-0.481804, -0.876277, 0.00185047], + }, + Normal { + normal: [-0.744675, -0.294424, -0.598977], + }, + Normal { + normal: [-0.621949, -0.528114, -0.578165], + }, + Normal { + normal: [-0.481171, -0.68834, -0.542828], + }, + Normal { + normal: [-0.438055, -0.797035, -0.415744], + }, + Normal { + normal: [-0.0443368, -0.0170558, -0.998871], + }, + Normal { + normal: [-0.0261761, -0.0281665, -0.99926], + }, + Normal { + normal: [-0.0252939, -0.0283323, -0.999278], + }, + Normal { + normal: [-0.157482, -0.289392, -0.944167], + }, + Normal { + normal: [0.728244, 0.25241, -0.637142], + }, + Normal { + normal: [0.647055, 0.459725, -0.608254], + }, + Normal { + normal: [0.522994, 0.640657, -0.562171], + }, + Normal { + normal: [0.409978, 0.682857, -0.604669], + }, + Normal { + normal: [-0.230787, 0.972982, -0.00652338], + }, + Normal { + normal: [-0.548936, 0.835863, -0.00151111], + }, + Normal { + normal: [-0.875671, 0.482807, 0.00989278], + }, + Normal { + normal: [-0.877554, 0.479097, 0.0190923], + }, + Normal { + normal: [-0.69619, 0.717439, 0.024497], + }, + Normal { + normal: [-0.152878, 0.687211, 0.71019], + }, + Normal { + normal: [-0.316721, 0.63775, 0.702113], + }, + Normal { + normal: [-0.601067, 0.471452, 0.64533], + }, + Normal { + normal: [-0.635889, 0.44609, 0.6298], + }, + Normal { + normal: [-0.435746, 0.601008, 0.670011], + }, + Normal { + normal: [0.111112, -0.0850694, 0.99016], + }, + Normal { + normal: [0.22331, 0.00654036, 0.974726], + }, + Normal { + normal: [0.190097, 0.154964, 0.969458], + }, + Normal { + normal: [0.00527077, 0.189482, 0.98187], + }, + Normal { + normal: [-0.0117518, 0.246688, 0.969024], + }, + Normal { + normal: [0.343906, -0.722796, 0.599412], + }, + Normal { + normal: [0.572489, -0.567656, 0.591627], + }, + Normal { + normal: [0.787436, -0.256459, 0.560512], + }, + Normal { + normal: [0.647097, -0.306374, 0.698141], + }, + Normal { + normal: [0.427528, -0.499343, 0.753576], + }, + Normal { + normal: [0.410926, -0.911668, 0.00128446], + }, + Normal { + normal: [0.67152, -0.740986, -0.000899122], + }, + Normal { + normal: [0.922026, -0.38706, -0.00725269], + }, + Normal { + normal: [0.84691, -0.531556, -0.0138542], + }, + Normal { + normal: [0.535925, -0.8442, -0.0105045], + }, + Normal { + normal: [0.341188, -0.722822, -0.600931], + }, + Normal { + normal: [0.578664, -0.561139, -0.591838], + }, + Normal { + normal: [0.784869, -0.25102, -0.566542], + }, + Normal { + normal: [0.642681, -0.302257, -0.70399], + }, + Normal { + normal: [0.418589, -0.500042, -0.758117], + }, + Normal { + normal: [0.115806, -0.0791394, -0.990114], + }, + Normal { + normal: [0.232811, 0.0125652, -0.972441], + }, + Normal { + normal: [0.206662, 0.153601, -0.96628], + }, + Normal { + normal: [0.0244996, 0.161443, -0.986578], + }, + Normal { + normal: [0.00338193, 0.211115, -0.977455], + }, + Normal { + normal: [-0.134912, 0.687491, -0.713551], + }, + Normal { + normal: [-0.31954, 0.633073, -0.705062], + }, + Normal { + normal: [-0.603902, 0.461442, -0.649903], + }, + Normal { + normal: [-0.631816, 0.437169, -0.640072], + }, + Normal { + normal: [-0.424306, 0.612706, -0.66675], + }, + Normal { + normal: [-0.4258, 0.904753, 0.0108049], + }, + Normal { + normal: [0.0220472, 0.999756, 0.00162273], + }, + Normal { + normal: [0.999599, 0.0258705, 0.0115556], + }, + Normal { + normal: [0.709585, -0.704553, 0.00967183], + }, + Normal { + normal: [-0.259858, 0.791936, 0.552549], + }, + Normal { + normal: [0.00953916, 0.99972, -0.0216718], + }, + Normal { + normal: [0.410156, 0.332912, -0.849083], + }, + Normal { + normal: [0.541523, -0.54862, -0.637], + }, + Normal { + normal: [0.0463104, 0.455224, 0.889172], + }, + Normal { + normal: [-0.0106883, 0.988794, 0.148901], + }, + Normal { + normal: [-0.0443756, 0.682947, -0.729118], + }, + Normal { + normal: [0.122825, 0.00923214, -0.992385], + }, + Normal { + normal: [0.481839, -0.180439, 0.85748], + }, + Normal { + normal: [0.455272, 0.736752, 0.499925], + }, + Normal { + normal: [-0.220542, 0.907193, -0.358276], + }, + Normal { + normal: [-0.23592, 0.657249, -0.715797], + }, + Normal { + normal: [0.728092, -0.685302, -0.0155853], + }, + Normal { + normal: [0.888739, 0.45811, -0.0166791], + }, + Normal { + normal: [-0.260097, 0.965582, 0.000800195], + }, + Normal { + normal: [-0.371612, 0.928378, -0.00441745], + }, + Normal { + normal: [0.480166, -0.17836, -0.858853], + }, + Normal { + normal: [0.488103, 0.716801, -0.497947], + }, + Normal { + normal: [-0.222004, 0.905399, 0.361893], + }, + Normal { + normal: [-0.235405, 0.66318, 0.710477], + }, + Normal { + normal: [0.0587203, 0.437704, -0.8972], + }, + Normal { + normal: [0.00132612, 0.986459, -0.164003], + }, + Normal { + normal: [-0.0441901, 0.681677, 0.730317], + }, + Normal { + normal: [0.138801, -0.0341896, 0.98973], + }, + Normal { + normal: [-0.25889, 0.797206, -0.54538], + }, + Normal { + normal: [0.0122703, 0.999739, 0.0192865], + }, + Normal { + normal: [0.39863, 0.35489, 0.845663], + }, + Normal { + normal: [0.537564, -0.5814, 0.610737], + }, + Normal { + normal: [-0.0, 1.0, 0.0], + }, + Normal { + normal: [0.82454, 0.565804, 0.0], + }, + Normal { + normal: [0.917701, -0.397272, 0.0], + }, + Normal { + normal: [0.935269, -0.353939, 0.000112842], + }, + Normal { + normal: [0.780712, 0.624891, 0.0], + }, + Normal { + normal: [0.762641, 0.565035, 0.314825], + }, + Normal { + normal: [0.847982, -0.397998, 0.350034], + }, + Normal { + normal: [0.864141, -0.355261, 0.356441], + }, + Normal { + normal: [0.720991, 0.625625, 0.297933], + }, + Normal { + normal: [0.583357, 0.565165, 0.583338], + }, + Normal { + normal: [0.648485, -0.398726, 0.648448], + }, + Normal { + normal: [0.660872, -0.355894, 0.660748], + }, + Normal { + normal: [0.551862, 0.62529, 0.55178], + }, + Normal { + normal: [0.314824, 0.565051, 0.762629], + }, + Normal { + normal: [0.350045, -0.397976, 0.847988], + }, + Normal { + normal: [0.356474, -0.3552, 0.864153], + }, + Normal { + normal: [0.297983, 0.625515, 0.721067], + }, + Normal { + normal: [-0.0, 0.565804, 0.82454], + }, + Normal { + normal: [-0.0, -0.397272, 0.917701], + }, + Normal { + normal: [-0.000112839, -0.353939, 0.935269], + }, + Normal { + normal: [-0.0, 0.624891, 0.780712], + }, + Normal { + normal: [-0.314825, 0.565035, 0.762641], + }, + Normal { + normal: [-0.350034, -0.397998, 0.847982], + }, + Normal { + normal: [-0.356441, -0.355261, 0.864141], + }, + Normal { + normal: [-0.297933, 0.625625, 0.720991], + }, + Normal { + normal: [-0.583338, 0.565165, 0.583357], + }, + Normal { + normal: [-0.648448, -0.398726, 0.648485], + }, + Normal { + normal: [-0.660748, -0.355894, 0.660872], + }, + Normal { + normal: [-0.55178, 0.62529, 0.551862], + }, + Normal { + normal: [-0.762629, 0.565051, 0.314824], + }, + Normal { + normal: [-0.847988, -0.397976, 0.350045], + }, + Normal { + normal: [-0.864153, -0.3552, 0.356474], + }, + Normal { + normal: [-0.721067, 0.625515, 0.297983], + }, + Normal { + normal: [-0.82454, 0.565804, -0.0], + }, + Normal { + normal: [-0.917701, -0.397272, -0.0], + }, + Normal { + normal: [-0.935269, -0.353939, -0.000112839], + }, + Normal { + normal: [-0.780712, 0.624891, -0.0], + }, + Normal { + normal: [-0.76264, 0.565035, -0.314825], + }, + Normal { + normal: [-0.847982, -0.397998, -0.350034], + }, + Normal { + normal: [-0.864141, -0.355261, -0.356441], + }, + Normal { + normal: [-0.720991, 0.625625, -0.297933], + }, + Normal { + normal: [-0.583357, 0.565165, -0.583338], + }, + Normal { + normal: [-0.648485, -0.398726, -0.648448], + }, + Normal { + normal: [-0.660872, -0.355894, -0.660748], + }, + Normal { + normal: [-0.551862, 0.62529, -0.55178], + }, + Normal { + normal: [-0.314824, 0.565051, -0.762629], + }, + Normal { + normal: [-0.350045, -0.397976, -0.847988], + }, + Normal { + normal: [-0.356474, -0.3552, -0.864153], + }, + Normal { + normal: [-0.297983, 0.625515, -0.721067], + }, + Normal { + normal: [0.0, 0.565804, -0.82454], + }, + Normal { + normal: [0.0, -0.397272, -0.917701], + }, + Normal { + normal: [0.000112839, -0.353939, -0.935269], + }, + Normal { + normal: [0.0, 0.624891, -0.780712], + }, + Normal { + normal: [0.314825, 0.565035, -0.762641], + }, + Normal { + normal: [0.350034, -0.397998, -0.847982], + }, + Normal { + normal: [0.356441, -0.355261, -0.864141], + }, + Normal { + normal: [0.297933, 0.625625, -0.720991], + }, + Normal { + normal: [0.583338, 0.565165, -0.583357], + }, + Normal { + normal: [0.648448, -0.398726, -0.648485], + }, + Normal { + normal: [0.660748, -0.355894, -0.660872], + }, + Normal { + normal: [0.55178, 0.62529, -0.551862], + }, + Normal { + normal: [0.762629, 0.565051, -0.314824], + }, + Normal { + normal: [0.847988, -0.397976, -0.350045], + }, + Normal { + normal: [0.864153, -0.3552, -0.356474], + }, + Normal { + normal: [0.721067, 0.625515, -0.297983], + }, + Normal { + normal: [0.236584, 0.971611, 0.0], + }, + Normal { + normal: [0.173084, 0.984907, -0.0], + }, + Normal { + normal: [0.379703, 0.925108, 0.0], + }, + Normal { + normal: [0.526673, 0.850068, 0.0], + }, + Normal { + normal: [0.217978, 0.971775, 0.0902162], + }, + Normal { + normal: [0.15959, 0.984977, 0.0659615], + }, + Normal { + normal: [0.350498, 0.925312, 0.14474], + }, + Normal { + normal: [0.48559, 0.850653, 0.201474], + }, + Normal { + normal: [0.166631, 0.971838, 0.166631], + }, + Normal { + normal: [0.121908, 0.985026, 0.121908], + }, + Normal { + normal: [0.267668, 0.925585, 0.267668], + }, + Normal { + normal: [0.371315, 0.851029, 0.371315], + }, + Normal { + normal: [0.0902162, 0.971775, 0.217978], + }, + Normal { + normal: [0.0659615, 0.984977, 0.15959], + }, + Normal { + normal: [0.14474, 0.925312, 0.350498], + }, + Normal { + normal: [0.201474, 0.850653, 0.48559], + }, + Normal { + normal: [-0.0, 0.971611, 0.236584], + }, + Normal { + normal: [0.0, 0.984907, 0.173084], + }, + Normal { + normal: [0.0, 0.925108, 0.379703], + }, + Normal { + normal: [0.0, 0.850068, 0.526673], + }, + Normal { + normal: [-0.0902162, 0.971775, 0.217978], + }, + Normal { + normal: [-0.0659615, 0.984977, 0.15959], + }, + Normal { + normal: [-0.14474, 0.925312, 0.350498], + }, + Normal { + normal: [-0.201474, 0.850653, 0.48559], + }, + Normal { + normal: [-0.166631, 0.971838, 0.166631], + }, + Normal { + normal: [-0.121908, 0.985026, 0.121908], + }, + Normal { + normal: [-0.267668, 0.925585, 0.267668], + }, + Normal { + normal: [-0.371315, 0.851029, 0.371315], + }, + Normal { + normal: [-0.217978, 0.971775, 0.0902162], + }, + Normal { + normal: [-0.15959, 0.984977, 0.0659615], + }, + Normal { + normal: [-0.350498, 0.925312, 0.14474], + }, + Normal { + normal: [-0.48559, 0.850653, 0.201474], + }, + Normal { + normal: [-0.236583, 0.971611, -0.0], + }, + Normal { + normal: [-0.173084, 0.984907, 0.0], + }, + Normal { + normal: [-0.379703, 0.925108, -0.0], + }, + Normal { + normal: [-0.526673, 0.850068, 0.0], + }, + Normal { + normal: [-0.217978, 0.971775, -0.0902162], + }, + Normal { + normal: [-0.15959, 0.984977, -0.0659615], + }, + Normal { + normal: [-0.350498, 0.925312, -0.14474], + }, + Normal { + normal: [-0.48559, 0.850653, -0.201474], + }, + Normal { + normal: [-0.166631, 0.971838, -0.166631], + }, + Normal { + normal: [-0.121908, 0.985026, -0.121908], + }, + Normal { + normal: [-0.267668, 0.925585, -0.267668], + }, + Normal { + normal: [-0.371315, 0.851029, -0.371315], + }, + Normal { + normal: [-0.0902162, 0.971775, -0.217978], + }, + Normal { + normal: [-0.0659615, 0.984977, -0.15959], + }, + Normal { + normal: [-0.14474, 0.925312, -0.350498], + }, + Normal { + normal: [-0.201474, 0.850653, -0.485589], + }, + Normal { + normal: [0.0, 0.971611, -0.236584], + }, + Normal { + normal: [-0.0, 0.984907, -0.173084], + }, + Normal { + normal: [-0.0, 0.925108, -0.379703], + }, + Normal { + normal: [-0.0, 0.850068, -0.526673], + }, + Normal { + normal: [0.0902162, 0.971775, -0.217978], + }, + Normal { + normal: [0.0659615, 0.984977, -0.15959], + }, + Normal { + normal: [0.14474, 0.925312, -0.350498], + }, + Normal { + normal: [0.201474, 0.850653, -0.48559], + }, + Normal { + normal: [0.166631, 0.971838, -0.166631], + }, + Normal { + normal: [0.121908, 0.985026, -0.121908], + }, + Normal { + normal: [0.267668, 0.925585, -0.267668], + }, + Normal { + normal: [0.371315, 0.851029, -0.371315], + }, + Normal { + normal: [0.217978, 0.971775, -0.0902162], + }, + Normal { + normal: [0.15959, 0.984977, -0.0659615], + }, + Normal { + normal: [0.350498, 0.925312, -0.14474], + }, + Normal { + normal: [0.48559, 0.850653, -0.201474], + }, +]; + +pub const INDICES: [u16; 3072] = [ + 7, 6, 1, 1, 2, 7, 8, 7, 2, 2, 3, 8, 9, 8, 3, 3, 4, 9, 10, 9, 4, 4, 5, 10, 12, 11, 6, 6, 7, 12, + 13, 12, 7, 7, 8, 13, 14, 13, 8, 8, 9, 14, 15, 14, 9, 9, 10, 15, 17, 16, 11, 11, 12, 17, 18, 17, + 12, 12, 13, 18, 19, 18, 13, 13, 14, 19, 20, 19, 14, 14, 15, 20, 22, 21, 16, 16, 17, 22, 23, 22, + 17, 17, 18, 23, 24, 23, 18, 18, 19, 24, 25, 24, 19, 19, 20, 25, 27, 26, 21, 21, 22, 27, 28, 27, + 22, 22, 23, 28, 29, 28, 23, 23, 24, 29, 30, 29, 24, 24, 25, 30, 32, 31, 26, 26, 27, 32, 33, 32, + 27, 27, 28, 33, 34, 33, 28, 28, 29, 34, 35, 34, 29, 29, 30, 35, 37, 36, 31, 31, 32, 37, 38, 37, + 32, 32, 33, 38, 39, 38, 33, 33, 34, 39, 40, 39, 34, 34, 35, 40, 42, 41, 36, 36, 37, 42, 43, 42, + 37, 37, 38, 43, 44, 43, 38, 38, 39, 44, 45, 44, 39, 39, 40, 45, 47, 46, 41, 41, 42, 47, 48, 47, + 42, 42, 43, 48, 49, 48, 43, 43, 44, 49, 50, 49, 44, 44, 45, 50, 52, 51, 46, 46, 47, 52, 53, 52, + 47, 47, 48, 53, 54, 53, 48, 48, 49, 54, 55, 54, 49, 49, 50, 55, 57, 56, 51, 51, 52, 57, 58, 57, + 52, 52, 53, 58, 59, 58, 53, 53, 54, 59, 60, 59, 54, 54, 55, 60, 62, 61, 56, 56, 57, 62, 63, 62, + 57, 57, 58, 63, 64, 63, 58, 58, 59, 64, 65, 64, 59, 59, 60, 65, 67, 66, 61, 61, 62, 67, 68, 67, + 62, 62, 63, 68, 69, 68, 63, 63, 64, 69, 70, 69, 64, 64, 65, 70, 72, 71, 66, 66, 67, 72, 73, 72, + 67, 67, 68, 73, 74, 73, 68, 68, 69, 74, 75, 74, 69, 69, 70, 75, 77, 76, 71, 71, 72, 77, 78, 77, + 72, 72, 73, 78, 79, 78, 73, 73, 74, 79, 80, 79, 74, 74, 75, 80, 2, 1, 76, 76, 77, 2, 3, 2, 77, + 77, 78, 3, 4, 3, 78, 78, 79, 4, 5, 4, 79, 79, 80, 5, 85, 10, 5, 5, 81, 85, 86, 85, 81, 81, 82, + 86, 87, 86, 82, 82, 83, 87, 88, 87, 83, 83, 84, 88, 89, 15, 10, 10, 85, 89, 90, 89, 85, 85, 86, + 90, 91, 90, 86, 86, 87, 91, 92, 91, 87, 87, 88, 92, 93, 20, 15, 15, 89, 93, 94, 93, 89, 89, 90, + 94, 95, 94, 90, 90, 91, 95, 96, 95, 91, 91, 92, 96, 97, 25, 20, 20, 93, 97, 98, 97, 93, 93, 94, + 98, 99, 98, 94, 94, 95, 99, 100, 99, 95, 95, 96, 100, 101, 30, 25, 25, 97, 101, 102, 101, 97, + 97, 98, 102, 103, 102, 98, 98, 99, 103, 104, 103, 99, 99, 100, 104, 105, 35, 30, 30, 101, 105, + 106, 105, 101, 101, 102, 106, 107, 106, 102, 102, 103, 107, 108, 107, 103, 103, 104, 108, 109, + 40, 35, 35, 105, 109, 110, 109, 105, 105, 106, 110, 111, 110, 106, 106, 107, 111, 112, 111, + 107, 107, 108, 112, 113, 45, 40, 40, 109, 113, 114, 113, 109, 109, 110, 114, 115, 114, 110, + 110, 111, 115, 116, 115, 111, 111, 112, 116, 117, 50, 45, 45, 113, 117, 118, 117, 113, 113, + 114, 118, 119, 118, 114, 114, 115, 119, 120, 119, 115, 115, 116, 120, 121, 55, 50, 50, 117, + 121, 122, 121, 117, 117, 118, 122, 123, 122, 118, 118, 119, 123, 124, 123, 119, 119, 120, 124, + 125, 60, 55, 55, 121, 125, 126, 125, 121, 121, 122, 126, 127, 126, 122, 122, 123, 127, 128, + 127, 123, 123, 124, 128, 129, 65, 60, 60, 125, 129, 130, 129, 125, 125, 126, 130, 131, 130, + 126, 126, 127, 131, 132, 131, 127, 127, 128, 132, 133, 70, 65, 65, 129, 133, 134, 133, 129, + 129, 130, 134, 135, 134, 130, 130, 131, 135, 136, 135, 131, 131, 132, 136, 137, 75, 70, 70, + 133, 137, 138, 137, 133, 133, 134, 138, 139, 138, 134, 134, 135, 139, 140, 139, 135, 135, 136, + 140, 141, 80, 75, 75, 137, 141, 142, 141, 137, 137, 138, 142, 143, 142, 138, 138, 139, 143, + 144, 143, 139, 139, 140, 144, 81, 5, 80, 80, 141, 81, 82, 81, 141, 141, 142, 82, 83, 82, 142, + 142, 143, 83, 84, 83, 143, 143, 144, 84, 149, 88, 84, 84, 145, 149, 150, 149, 145, 145, 146, + 150, 151, 150, 146, 146, 147, 151, 152, 151, 147, 147, 148, 152, 153, 92, 88, 88, 149, 153, + 154, 153, 149, 149, 150, 154, 155, 154, 150, 150, 151, 155, 156, 155, 151, 151, 152, 156, 157, + 96, 92, 92, 153, 157, 158, 157, 153, 153, 154, 158, 159, 158, 154, 154, 155, 159, 160, 159, + 155, 155, 156, 160, 161, 100, 96, 96, 157, 161, 162, 161, 157, 157, 158, 162, 163, 162, 158, + 158, 159, 163, 164, 163, 159, 159, 160, 164, 165, 104, 100, 100, 161, 165, 166, 165, 161, 161, + 162, 166, 167, 166, 162, 162, 163, 167, 168, 167, 163, 163, 164, 168, 169, 108, 104, 104, 165, + 169, 170, 169, 165, 165, 166, 170, 171, 170, 166, 166, 167, 171, 172, 171, 167, 167, 168, 172, + 173, 112, 108, 108, 169, 173, 174, 173, 169, 169, 170, 174, 175, 174, 170, 170, 171, 175, 176, + 175, 171, 171, 172, 176, 177, 116, 112, 112, 173, 177, 178, 177, 173, 173, 174, 178, 179, 178, + 174, 174, 175, 179, 180, 179, 175, 175, 176, 180, 181, 120, 116, 116, 177, 181, 182, 181, 177, + 177, 178, 182, 183, 182, 178, 178, 179, 183, 184, 183, 179, 179, 180, 184, 185, 124, 120, 120, + 181, 185, 186, 185, 181, 181, 182, 186, 187, 186, 182, 182, 183, 187, 188, 187, 183, 183, 184, + 188, 189, 128, 124, 124, 185, 189, 190, 189, 185, 185, 186, 190, 191, 190, 186, 186, 187, 191, + 192, 191, 187, 187, 188, 192, 193, 132, 128, 128, 189, 193, 194, 193, 189, 189, 190, 194, 195, + 194, 190, 190, 191, 195, 196, 195, 191, 191, 192, 196, 197, 136, 132, 132, 193, 197, 198, 197, + 193, 193, 194, 198, 199, 198, 194, 194, 195, 199, 200, 199, 195, 195, 196, 200, 201, 140, 136, + 136, 197, 201, 202, 201, 197, 197, 198, 202, 203, 202, 198, 198, 199, 203, 204, 203, 199, 199, + 200, 204, 205, 144, 140, 140, 201, 205, 206, 205, 201, 201, 202, 206, 207, 206, 202, 202, 203, + 207, 208, 207, 203, 203, 204, 208, 145, 84, 144, 144, 205, 145, 146, 145, 205, 205, 206, 146, + 147, 146, 206, 206, 207, 147, 148, 147, 207, 207, 208, 148, 213, 152, 148, 148, 209, 213, 214, + 213, 209, 209, 210, 214, 215, 214, 210, 210, 211, 215, 212, 215, 211, 211, 212, 212, 216, 156, + 152, 152, 213, 216, 217, 216, 213, 213, 214, 217, 218, 217, 214, 214, 215, 218, 212, 218, 215, + 215, 212, 212, 219, 160, 156, 156, 216, 219, 220, 219, 216, 216, 217, 220, 221, 220, 217, 217, + 218, 221, 212, 221, 218, 218, 212, 212, 222, 164, 160, 160, 219, 222, 223, 222, 219, 219, 220, + 223, 224, 223, 220, 220, 221, 224, 212, 224, 221, 221, 212, 212, 225, 168, 164, 164, 222, 225, + 226, 225, 222, 222, 223, 226, 227, 226, 223, 223, 224, 227, 212, 227, 224, 224, 212, 212, 228, + 172, 168, 168, 225, 228, 229, 228, 225, 225, 226, 229, 230, 229, 226, 226, 227, 230, 212, 230, + 227, 227, 212, 212, 231, 176, 172, 172, 228, 231, 232, 231, 228, 228, 229, 232, 233, 232, 229, + 229, 230, 233, 212, 233, 230, 230, 212, 212, 234, 180, 176, 176, 231, 234, 235, 234, 231, 231, + 232, 235, 236, 235, 232, 232, 233, 236, 212, 236, 233, 233, 212, 212, 237, 184, 180, 180, 234, + 237, 238, 237, 234, 234, 235, 238, 239, 238, 235, 235, 236, 239, 212, 239, 236, 236, 212, 212, + 240, 188, 184, 184, 237, 240, 241, 240, 237, 237, 238, 241, 242, 241, 238, 238, 239, 242, 212, + 242, 239, 239, 212, 212, 243, 192, 188, 188, 240, 243, 244, 243, 240, 240, 241, 244, 245, 244, + 241, 241, 242, 245, 212, 245, 242, 242, 212, 212, 246, 196, 192, 192, 243, 246, 247, 246, 243, + 243, 244, 247, 248, 247, 244, 244, 245, 248, 212, 248, 245, 245, 212, 212, 249, 200, 196, 196, + 246, 249, 250, 249, 246, 246, 247, 250, 251, 250, 247, 247, 248, 251, 212, 251, 248, 248, 212, + 212, 252, 204, 200, 200, 249, 252, 253, 252, 249, 249, 250, 253, 254, 253, 250, 250, 251, 254, + 212, 254, 251, 251, 212, 212, 255, 208, 204, 204, 252, 255, 256, 255, 252, 252, 253, 256, 257, + 256, 253, 253, 254, 257, 212, 257, 254, 254, 212, 212, 209, 148, 208, 208, 255, 209, 210, 209, + 255, 255, 256, 210, 211, 210, 256, 256, 257, 211, 212, 211, 257, 257, 212, 212, 264, 263, 258, + 258, 259, 264, 265, 264, 259, 259, 260, 265, 266, 265, 260, 260, 261, 266, 267, 266, 261, 261, + 262, 267, 269, 268, 263, 263, 264, 269, 270, 269, 264, 264, 265, 270, 271, 270, 265, 265, 266, + 271, 272, 271, 266, 266, 267, 272, 274, 273, 268, 268, 269, 274, 275, 274, 269, 269, 270, 275, + 276, 275, 270, 270, 271, 276, 277, 276, 271, 271, 272, 277, 279, 278, 273, 273, 274, 279, 280, + 279, 274, 274, 275, 280, 281, 280, 275, 275, 276, 281, 282, 281, 276, 276, 277, 282, 284, 283, + 278, 278, 279, 284, 285, 284, 279, 279, 280, 285, 286, 285, 280, 280, 281, 286, 287, 286, 281, + 281, 282, 287, 289, 288, 283, 283, 284, 289, 290, 289, 284, 284, 285, 290, 291, 290, 285, 285, + 286, 291, 292, 291, 286, 286, 287, 292, 294, 293, 288, 288, 289, 294, 295, 294, 289, 289, 290, + 295, 296, 295, 290, 290, 291, 296, 297, 296, 291, 291, 292, 297, 259, 258, 293, 293, 294, 259, + 260, 259, 294, 294, 295, 260, 261, 260, 295, 295, 296, 261, 262, 261, 296, 296, 297, 262, 302, + 267, 262, 262, 298, 302, 303, 302, 298, 298, 299, 303, 304, 303, 299, 299, 300, 304, 305, 304, + 300, 300, 301, 305, 306, 272, 267, 267, 302, 306, 307, 306, 302, 302, 303, 307, 308, 307, 303, + 303, 304, 308, 309, 308, 304, 304, 305, 309, 310, 277, 272, 272, 306, 310, 311, 310, 306, 306, + 307, 311, 312, 311, 307, 307, 308, 312, 313, 312, 308, 308, 309, 313, 314, 282, 277, 277, 310, + 314, 315, 314, 310, 310, 311, 315, 316, 315, 311, 311, 312, 316, 317, 316, 312, 312, 313, 317, + 318, 287, 282, 282, 314, 318, 319, 318, 314, 314, 315, 319, 320, 319, 315, 315, 316, 320, 321, + 320, 316, 316, 317, 321, 322, 292, 287, 287, 318, 322, 323, 322, 318, 318, 319, 323, 324, 323, + 319, 319, 320, 324, 325, 324, 320, 320, 321, 325, 326, 297, 292, 292, 322, 326, 327, 326, 322, + 322, 323, 327, 328, 327, 323, 323, 324, 328, 329, 328, 324, 324, 325, 329, 298, 262, 297, 297, + 326, 298, 299, 298, 326, 326, 327, 299, 300, 299, 327, 327, 328, 300, 301, 300, 328, 328, 329, + 301, 336, 335, 330, 330, 331, 336, 337, 336, 331, 331, 332, 337, 338, 337, 332, 332, 333, 338, + 339, 338, 333, 333, 334, 339, 341, 340, 335, 335, 336, 341, 342, 341, 336, 336, 337, 342, 343, + 342, 337, 337, 338, 343, 344, 343, 338, 338, 339, 344, 346, 345, 340, 340, 341, 346, 347, 346, + 341, 341, 342, 347, 348, 347, 342, 342, 343, 348, 349, 348, 343, 343, 344, 349, 351, 350, 345, + 345, 346, 351, 352, 351, 346, 346, 347, 352, 353, 352, 347, 347, 348, 353, 354, 353, 348, 348, + 349, 354, 356, 355, 350, 350, 351, 356, 357, 356, 351, 351, 352, 357, 358, 357, 352, 352, 353, + 358, 359, 358, 353, 353, 354, 359, 361, 360, 355, 355, 356, 361, 362, 361, 356, 356, 357, 362, + 363, 362, 357, 357, 358, 363, 364, 363, 358, 358, 359, 364, 366, 365, 360, 360, 361, 366, 367, + 366, 361, 361, 362, 367, 368, 367, 362, 362, 363, 368, 369, 368, 363, 363, 364, 369, 331, 330, + 365, 365, 366, 331, 332, 331, 366, 366, 367, 332, 333, 332, 367, 367, 368, 333, 334, 333, 368, + 368, 369, 334, 374, 339, 334, 334, 370, 374, 375, 374, 370, 370, 371, 375, 376, 375, 371, 371, + 372, 376, 377, 376, 372, 372, 373, 377, 378, 344, 339, 339, 374, 378, 379, 378, 374, 374, 375, + 379, 380, 379, 375, 375, 376, 380, 381, 380, 376, 376, 377, 381, 382, 349, 344, 344, 378, 382, + 383, 382, 378, 378, 379, 383, 384, 383, 379, 379, 380, 384, 385, 384, 380, 380, 381, 385, 386, + 354, 349, 349, 382, 386, 387, 386, 382, 382, 383, 387, 388, 387, 383, 383, 384, 388, 389, 388, + 384, 384, 385, 389, 390, 359, 354, 354, 386, 390, 391, 390, 386, 386, 387, 391, 392, 391, 387, + 387, 388, 392, 393, 392, 388, 388, 389, 393, 394, 364, 359, 359, 390, 394, 395, 394, 390, 390, + 391, 395, 396, 395, 391, 391, 392, 396, 397, 396, 392, 392, 393, 397, 398, 369, 364, 364, 394, + 398, 399, 398, 394, 394, 395, 399, 400, 399, 395, 395, 396, 400, 401, 400, 396, 396, 397, 401, + 370, 334, 369, 369, 398, 370, 371, 370, 398, 398, 399, 371, 372, 371, 399, 399, 400, 372, 373, + 372, 400, 400, 401, 373, 407, 402, 402, 402, 403, 407, 408, 407, 403, 403, 404, 408, 409, 408, + 404, 404, 405, 409, 410, 409, 405, 405, 406, 410, 411, 402, 402, 402, 407, 411, 412, 411, 407, + 407, 408, 412, 413, 412, 408, 408, 409, 413, 414, 413, 409, 409, 410, 414, 415, 402, 402, 402, + 411, 415, 416, 415, 411, 411, 412, 416, 417, 416, 412, 412, 413, 417, 418, 417, 413, 413, 414, + 418, 419, 402, 402, 402, 415, 419, 420, 419, 415, 415, 416, 420, 421, 420, 416, 416, 417, 421, + 422, 421, 417, 417, 418, 422, 423, 402, 402, 402, 419, 423, 424, 423, 419, 419, 420, 424, 425, + 424, 420, 420, 421, 425, 426, 425, 421, 421, 422, 426, 427, 402, 402, 402, 423, 427, 428, 427, + 423, 423, 424, 428, 429, 428, 424, 424, 425, 429, 430, 429, 425, 425, 426, 430, 431, 402, 402, + 402, 427, 431, 432, 431, 427, 427, 428, 432, 433, 432, 428, 428, 429, 433, 434, 433, 429, 429, + 430, 434, 435, 402, 402, 402, 431, 435, 436, 435, 431, 431, 432, 436, 437, 436, 432, 432, 433, + 437, 438, 437, 433, 433, 434, 438, 439, 402, 402, 402, 435, 439, 440, 439, 435, 435, 436, 440, + 441, 440, 436, 436, 437, 441, 442, 441, 437, 437, 438, 442, 443, 402, 402, 402, 439, 443, 444, + 443, 439, 439, 440, 444, 445, 444, 440, 440, 441, 445, 446, 445, 441, 441, 442, 446, 447, 402, + 402, 402, 443, 447, 448, 447, 443, 443, 444, 448, 449, 448, 444, 444, 445, 449, 450, 449, 445, + 445, 446, 450, 451, 402, 402, 402, 447, 451, 452, 451, 447, 447, 448, 452, 453, 452, 448, 448, + 449, 453, 454, 453, 449, 449, 450, 454, 455, 402, 402, 402, 451, 455, 456, 455, 451, 451, 452, + 456, 457, 456, 452, 452, 453, 457, 458, 457, 453, 453, 454, 458, 459, 402, 402, 402, 455, 459, + 460, 459, 455, 455, 456, 460, 461, 460, 456, 456, 457, 461, 462, 461, 457, 457, 458, 462, 463, + 402, 402, 402, 459, 463, 464, 463, 459, 459, 460, 464, 465, 464, 460, 460, 461, 465, 466, 465, + 461, 461, 462, 466, 403, 402, 402, 402, 463, 403, 404, 403, 463, 463, 464, 404, 405, 404, 464, + 464, 465, 405, 406, 405, 465, 465, 466, 406, 471, 410, 406, 406, 467, 471, 472, 471, 467, 467, + 468, 472, 473, 472, 468, 468, 469, 473, 474, 473, 469, 469, 470, 474, 475, 414, 410, 410, 471, + 475, 476, 475, 471, 471, 472, 476, 477, 476, 472, 472, 473, 477, 478, 477, 473, 473, 474, 478, + 479, 418, 414, 414, 475, 479, 480, 479, 475, 475, 476, 480, 481, 480, 476, 476, 477, 481, 482, + 481, 477, 477, 478, 482, 483, 422, 418, 418, 479, 483, 484, 483, 479, 479, 480, 484, 485, 484, + 480, 480, 481, 485, 486, 485, 481, 481, 482, 486, 487, 426, 422, 422, 483, 487, 488, 487, 483, + 483, 484, 488, 489, 488, 484, 484, 485, 489, 490, 489, 485, 485, 486, 490, 491, 430, 426, 426, + 487, 491, 492, 491, 487, 487, 488, 492, 493, 492, 488, 488, 489, 493, 494, 493, 489, 489, 490, + 494, 495, 434, 430, 430, 491, 495, 496, 495, 491, 491, 492, 496, 497, 496, 492, 492, 493, 497, + 498, 497, 493, 493, 494, 498, 499, 438, 434, 434, 495, 499, 500, 499, 495, 495, 496, 500, 501, + 500, 496, 496, 497, 501, 502, 501, 497, 497, 498, 502, 503, 442, 438, 438, 499, 503, 504, 503, + 499, 499, 500, 504, 505, 504, 500, 500, 501, 505, 506, 505, 501, 501, 502, 506, 507, 446, 442, + 442, 503, 507, 508, 507, 503, 503, 504, 508, 509, 508, 504, 504, 505, 509, 510, 509, 505, 505, + 506, 510, 511, 450, 446, 446, 507, 511, 512, 511, 507, 507, 508, 512, 513, 512, 508, 508, 509, + 513, 514, 513, 509, 509, 510, 514, 515, 454, 450, 450, 511, 515, 516, 515, 511, 511, 512, 516, + 517, 516, 512, 512, 513, 517, 518, 517, 513, 513, 514, 518, 519, 458, 454, 454, 515, 519, 520, + 519, 515, 515, 516, 520, 521, 520, 516, 516, 517, 521, 522, 521, 517, 517, 518, 522, 523, 462, + 458, 458, 519, 523, 524, 523, 519, 519, 520, 524, 525, 524, 520, 520, 521, 525, 526, 525, 521, + 521, 522, 526, 527, 466, 462, 462, 523, 527, 528, 527, 523, 523, 524, 528, 529, 528, 524, 524, + 525, 529, 530, 529, 525, 525, 526, 530, 467, 406, 466, 466, 527, 467, 468, 467, 527, 527, 528, + 468, 469, 468, 528, 528, 529, 469, 470, 469, 529, 529, 530, 470u16, +]; diff --git a/src/vert.glsl b/src/vert.glsl new file mode 100644 index 0000000..d2af02c --- /dev/null +++ b/src/vert.glsl @@ -0,0 +1,18 @@ +#version 450 + +layout(location = 0) in vec3 position; +layout(location = 1) in vec3 normal; + +layout(location = 0) out vec3 v_normal; + +layout(set = 0, binding = 0) uniform Data { + mat4 world; + mat4 view; + mat4 proj; +} uniforms; + +void main() { + mat4 worldview = uniforms.view * uniforms.world; + v_normal = transpose(inverse(mat3(worldview))) * normal; + gl_Position = uniforms.proj * worldview * vec4(position, 1.0); +} From 2ba0c6080e7175ef5d2fc4c4923f707337db6d5e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 21 Jul 2023 00:18:29 -0700 Subject: [PATCH 003/482] cannot rename lib.rs --- src/{teapot.rs => lib.rs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{teapot.rs => lib.rs} (100%) diff --git a/src/teapot.rs b/src/lib.rs similarity index 100% rename from src/teapot.rs rename to src/lib.rs From 05b3f49ad2d06e9e0eeb8e4da42eaa9a780bc872 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 21 Jul 2023 00:08:50 -0700 Subject: [PATCH 004/482] fix deps --- Cargo.lock | 968 ++++++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 4 + 2 files changed, 964 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ef942c5..e58dd60 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,28 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "ab_glyph" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5110f1c78cf582855d895ecd0746b653db010cec6d9f5575293f27934d980a39" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "ahash" version = "0.8.3" @@ -23,6 +45,51 @@ dependencies = [ "memchr", ] +[[package]] +name = "android-activity" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40bc1575e653f158cbdc6ebcd917b9564e66321c5325c232c3591269c257be69" +dependencies = [ + "android-properties", + "bitflags", + "cc", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum 0.6.1", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + [[package]] name = "ash" version = "0.37.3+1.3.251" @@ -44,6 +111,31 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block-sys" +version = "0.1.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "block2" +version = "0.2.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" +dependencies = [ + "block-sys", + "objc2-encode", +] + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + [[package]] name = "bytemuck" version = "1.13.1" @@ -64,12 +156,60 @@ dependencies = [ "syn 2.0.25", ] +[[package]] +name = "calloop" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e0d00eb1ea24371a97d2da6201c6747a633dc6dc1988ef503403b4c59504a8" +dependencies = [ + "bitflags", + "log", + "nix 0.25.1", + "slotmap", + "thiserror", + "vec_map", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +dependencies = [ + "jobserver", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cgmath" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" +dependencies = [ + "approx", + "num-traits", +] + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + [[package]] name = "core-foundation" version = "0.9.3" @@ -86,6 +226,19 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + [[package]] name = "core-graphics-types" version = "0.1.2" @@ -97,6 +250,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-queue" version = "0.3.8" @@ -122,12 +284,67 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "fdeflate" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "getrandom" version = "0.2.10" @@ -188,12 +405,54 @@ dependencies = [ "hashbrown 0.14.0", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "itoa" version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.147" @@ -220,6 +479,12 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + [[package]] name = "malloc_buf" version = "0.0.6" @@ -235,6 +500,167 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys", + "num_enum 0.5.11", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +dependencies = [ + "autocfg", + "bitflags", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-traits" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.25", +] + [[package]] name = "objc" version = "0.2.7" @@ -244,12 +670,56 @@ dependencies = [ "malloc_buf", ] +[[package]] +name = "objc-sys" +version = "0.2.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" + +[[package]] +name = "objc2" +version = "0.3.0-beta.3.patch-leaks.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" +dependencies = [ + "block2", + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-encode" +version = "2.0.0-pre.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" +dependencies = [ + "objc-sys", +] + [[package]] name = "once_cell" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "orbclient" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "221d488cd70617f1bd599ed8ceb659df2147d9393717954d82a0f5e8032a6ab1" +dependencies = [ + "redox_syscall", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "706de7e2214113d63a8238d1910463cfce781129a6f263d13fdb09ff64355ba4" +dependencies = [ + "ttf-parser", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -270,7 +740,32 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "png" +version = "0.17.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" +dependencies = [ + "bitflags", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", ] [[package]] @@ -301,6 +796,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + [[package]] name = "redox_syscall" version = "0.3.5" @@ -339,18 +840,46 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +[[package]] +name = "roxmltree" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" +dependencies = [ + "xmlparser", +] + [[package]] name = "ryu" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "sctk-adwaita" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda4e97be1fd174ccc2aae81c8b694e803fa99b34e8fd0f057a9d70698e3ed09" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit", + "tiny-skia", +] + [[package]] name = "serde" version = "1.0.171" @@ -382,19 +911,84 @@ dependencies = [ "serde", ] +[[package]] +name = "shaderc" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31cef52787a0db5108788ea20bed13d6bf4b96287c5c5201e55725f7070f3443" +dependencies = [ + "libc", + "shaderc-sys", +] + +[[package]] +name = "shaderc-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8f8439fffcffd6efcd74197204addf935dbab5752696bd990a6cd36d54cf64" +dependencies = [ + "cmake", + "libc", + "roxmltree", +] + +[[package]] +name = "simd-adler32" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" + +[[package]] +name = "slotmap" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +[[package]] +name = "smithay-client-toolkit" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454" +dependencies = [ + "bitflags", + "calloop", + "dlib", + "lazy_static", + "log", + "memmap2", + "nix 0.24.3", + "pkg-config", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + [[package]] name = "strafe-client" version = "0.1.0" dependencies = [ + "cgmath", "vulkano", + "vulkano-shaders", + "vulkano-win", + "winit", ] +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + [[package]] name = "syn" version = "1.0.109" @@ -417,6 +1011,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "thiserror" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.25", +] + [[package]] name = "thread_local" version = "1.1.7" @@ -427,6 +1041,31 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiny-skia" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "png", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adbfb5d3f3dd57a0e11d12f4f13d4ebbbc1b5c15b7ab0a156d030b21da5f677c" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + [[package]] name = "toml_datetime" version = "0.6.3" @@ -444,12 +1083,24 @@ dependencies = [ "winnow", ] +[[package]] +name = "ttf-parser" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a464a4b34948a5f67fddd2b823c62d9d92e44be75058b99939eae6c5b6960b33" + [[package]] name = "unicode-ident" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "version_check" version = "0.9.4" @@ -506,12 +1157,177 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "vulkano-shaders" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f8cf18e9becbc6d39f1c39e26bcf69546c93989553eb5748cd734a8a697a6e5" +dependencies = [ + "ahash", + "heck", + "proc-macro2", + "quote", + "shaderc", + "syn 1.0.109", + "vulkano", +] + +[[package]] +name = "vulkano-win" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666c77efe5ea82837781961a6bcd957ee2e926777e8de0005f580335d6eaefe7" +dependencies = [ + "core-graphics-types", + "objc", + "raw-window-handle", + "vulkano", + "winit", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.25", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.25", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "wayland-client" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +dependencies = [ + "bitflags", + "downcast-rs", + "libc", + "nix 0.24.3", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +dependencies = [ + "nix 0.24.3", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +dependencies = [ + "nix 0.24.3", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +dependencies = [ + "bitflags", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "winapi" version = "0.3.9" @@ -534,63 +1350,173 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "winit" +version = "0.28.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "866db3f712fffba75d31bf0cdecf357c8aeafd158c5b7ab51dba2a2b2d47f196" +dependencies = [ + "android-activity", + "bitflags", + "cfg_aliases", + "core-foundation", + "core-graphics", + "dispatch", + "instant", + "libc", + "log", + "mio", + "ndk", + "objc2", + "once_cell", + "orbclient", + "percent-encoding", + "raw-window-handle", + "redox_syscall", + "sctk-adwaita", + "smithay-client-toolkit", + "wasm-bindgen", + "wayland-client", + "wayland-commons", + "wayland-protocols", + "wayland-scanner", + "web-sys", + "windows-sys 0.45.0", + "x11-dl", +] + [[package]] name = "winnow" version = "0.5.0" @@ -600,8 +1526,34 @@ dependencies = [ "memchr", ] +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xcursor" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" +dependencies = [ + "nom", +] + [[package]] name = "xml-rs" version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a56c84a8ccd4258aed21c92f70c0f6dea75356b6892ae27c24139da456f9336" + +[[package]] +name = "xmlparser" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" diff --git a/Cargo.toml b/Cargo.toml index ee4e545..75ceb11 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,8 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +cgmath = "0.18.0" vulkano = "0.33.0" +vulkano-shaders = "0.33.0" +vulkano-win = "0.33.0" +winit = "0.28.6" From aea9c5aa79e3be6b34448dadf8d4fc7c293a5b5b Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 21 Jul 2023 00:09:04 -0700 Subject: [PATCH 005/482] fix references --- src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index bfd9768..42d8782 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ // according to those terms. use cgmath::{Matrix3, Matrix4, Point3, Rad, Vector3}; -use examples::{Normal, Position, INDICES, NORMALS, POSITIONS}; +use strafe_client::{Normal, Position, INDICES, NORMALS, POSITIONS}; use std::{sync::Arc, time::Instant}; use vulkano::{ buffer::{ @@ -472,13 +472,13 @@ fn window_size_dependent_setup( mod vs { vulkano_shaders::shader! { ty: "vertex", - path: "src/bin/teapot/vert.glsl", + path: "src/vert.glsl", } } mod fs { vulkano_shaders::shader! { ty: "fragment", - path: "src/bin/teapot/frag.glsl", + path: "src/frag.glsl", } } From da90e23aa020f384e95eaac0dab083b55edfa14e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 20 Jul 2023 23:52:33 -0700 Subject: [PATCH 006/482] moving camera --- src/main.rs | 110 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 98 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index 42d8782..a7b18cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,7 @@ // notice may not be copied, modified, or distributed except // according to those terms. -use cgmath::{Matrix3, Matrix4, Point3, Rad, Vector3}; +use cgmath::{Matrix3, Matrix4, Point3, Rad, Vector3, Transform,Rotation, Quaternion}; use strafe_client::{Normal, Position, INDICES, NORMALS, POSITIONS}; use std::{sync::Arc, time::Instant}; use vulkano::{ @@ -50,11 +50,48 @@ use vulkano::{ }; use vulkano_win::VkSurfaceBuild; use winit::{ - event::{Event, WindowEvent}, + event::{ElementState,KeyboardInput,VirtualKeyCode,Event, WindowEvent}, event_loop::{ControlFlow, EventLoop}, window::{Window, WindowBuilder}, }; +const CONTROL_MOVEFORWARD:u32 = 0b00000001; +const CONTROL_MOVEBACK:u32 = 0b00000010; +const CONTROL_MOVERIGHT:u32 = 0b00000100; +const CONTROL_MOVELEFT:u32 = 0b00001000; +const CONTROL_MOVEUP:u32 = 0b00010000; +const CONTROL_MOVEDOWN:u32 = 0b00100000; +//const CONTROL_JUMP:u32 = 0b01000000; +//const CONTROL_ZOOM:u32 = 0b10000000; + +const FORWARD_DIR:Vector3 = Vector3::new(0,0,-1); +const RIGHT_DIR:Vector3 = Vector3::new(1,0,0); +const UP_DIR:Vector3 = Vector3::new(0,1,0); + +fn get_control_dir(controls: u32) -> Vector3{ + //don't get fancy just do it + let mut control_dir:Vector3 = Vector3::new(0,0,0); + if controls & CONTROL_MOVEFORWARD == CONTROL_MOVEFORWARD { + control_dir+=FORWARD_DIR; + } + if controls & CONTROL_MOVEBACK == CONTROL_MOVEBACK { + control_dir+=-FORWARD_DIR; + } + if controls & CONTROL_MOVELEFT == CONTROL_MOVELEFT { + control_dir+=-RIGHT_DIR; + } + if controls & CONTROL_MOVERIGHT == CONTROL_MOVERIGHT { + control_dir+=RIGHT_DIR; + } + if controls & CONTROL_MOVEUP == CONTROL_MOVEUP { + control_dir+=UP_DIR; + } + if controls & CONTROL_MOVEDOWN == CONTROL_MOVEDOWN { + control_dir+=-UP_DIR; + } + return control_dir.cast().unwrap() +} + fn main() { // The start of this example is exactly the same as `triangle`. You should read the `triangle` // example if you haven't done so yet. @@ -245,6 +282,13 @@ fn main() { let command_buffer_allocator = StandardCommandBufferAllocator::new(device.clone(), Default::default()); + + let mut time = Instant::now(); + //polution + let mut pos = Vector3::new(0.0,0.0,0.0); + let mut orientation = Quaternion::new(1.0,0.0,0.0,0.0); + let mut controls:u32 = 0; + let fly_speed = 0.05; event_loop.run(move |event, _, control_flow| { match event { Event::WindowEvent { @@ -259,7 +303,55 @@ fn main() { } => { recreate_swapchain = true; } - Event::RedrawEventsCleared => { + Event::WindowEvent { + event: + WindowEvent::KeyboardInput { + input: + KeyboardInput { + state, + virtual_keycode: Some(keycode), + .. + }, + .. + }, + .. + } => { + match (state,keycode) { + (k,VirtualKeyCode::W) => match k { + ElementState::Pressed => controls|=CONTROL_MOVEFORWARD, + ElementState::Released => controls&=!CONTROL_MOVEFORWARD, + } + (k,VirtualKeyCode::A) => match k { + ElementState::Pressed => controls|=CONTROL_MOVELEFT, + ElementState::Released => controls&=!CONTROL_MOVELEFT, + } + (k,VirtualKeyCode::S) => match k { + ElementState::Pressed => controls|=CONTROL_MOVEBACK, + ElementState::Released => controls&=!CONTROL_MOVEBACK, + } + (k,VirtualKeyCode::D) => match k { + ElementState::Pressed => controls|=CONTROL_MOVERIGHT, + ElementState::Released => controls&=!CONTROL_MOVERIGHT, + } + (k,VirtualKeyCode::E) => match k { + ElementState::Pressed => controls|=CONTROL_MOVEUP, + ElementState::Released => controls&=!CONTROL_MOVEUP, + } + (k,VirtualKeyCode::Q) => match k { + ElementState::Pressed => controls|=CONTROL_MOVEDOWN, + ElementState::Released => controls&=!CONTROL_MOVEDOWN, + } + _ => (), + } + } + _ => (), + } + let time_now = Instant::now(); + let dt = (time_now-time).as_secs_f64(); + if dt > 1.0 / 60.0 { + time = time_now; + pos += orientation.rotate_vector(get_control_dir(controls))*fly_speed; + let window = surface.object().unwrap().downcast_ref::().unwrap(); let dimensions = window.inner_size(); if dimensions.width == 0 || dimensions.height == 0 { @@ -308,16 +400,12 @@ fn main() { 0.01, 100.0, ); - let view = Matrix4::look_at_rh( - Point3::new(0.3, 0.3, 1.0), - Point3::new(0.0, 0.0, 0.0), - Vector3::new(0.0, -1.0, 0.0), - ); - let scale = Matrix4::from_scale(0.01); + let view = Matrix4::from_translation(pos)+Matrix4::from(orientation); + let scale = Matrix4::from_scale(-0.01); let uniform_data = vs::Data { world: Matrix4::from(rotation).into(), - view: (view * scale).into(), + view: (view * scale).cast::().unwrap().into(), proj: proj.into(), }; @@ -410,8 +498,6 @@ fn main() { } } } - _ => (), - } }); } From c8dbfc726898b043d6a026d6668038cc65dfeb9e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 21 Jul 2023 00:53:28 -0700 Subject: [PATCH 007/482] mouse control --- src/main.rs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index a7b18cf..450e5ca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,7 @@ // notice may not be copied, modified, or distributed except // according to those terms. -use cgmath::{Matrix3, Matrix4, Point3, Rad, Vector3, Transform,Rotation, Quaternion}; +use cgmath::{Matrix3, Matrix4, Rad, Vector2, Vector3, Rotation, Quaternion, Euler}; use strafe_client::{Normal, Position, INDICES, NORMALS, POSITIONS}; use std::{sync::Arc, time::Instant}; use vulkano::{ @@ -50,7 +50,7 @@ use vulkano::{ }; use vulkano_win::VkSurfaceBuild; use winit::{ - event::{ElementState,KeyboardInput,VirtualKeyCode,Event, WindowEvent}, + event::{ElementState,KeyboardInput,VirtualKeyCode,Event, WindowEvent, DeviceEvent}, event_loop::{ControlFlow, EventLoop}, window::{Window, WindowBuilder}, }; @@ -285,8 +285,8 @@ fn main() { let mut time = Instant::now(); //polution + let mut mouse = Vector2::new(0.0,0.0); let mut pos = Vector3::new(0.0,0.0,0.0); - let mut orientation = Quaternion::new(1.0,0.0,0.0,0.0); let mut controls:u32 = 0; let fly_speed = 0.05; event_loop.run(move |event, _, control_flow| { @@ -303,6 +303,15 @@ fn main() { } => { recreate_swapchain = true; } + Event::DeviceEvent { + event: + DeviceEvent::MouseMotion { + delta, + }, + .. + } => { + mouse+=Vector2::from(delta); + } Event::WindowEvent { event: WindowEvent::KeyboardInput { @@ -348,8 +357,10 @@ fn main() { } let time_now = Instant::now(); let dt = (time_now-time).as_secs_f64(); - if dt > 1.0 / 60.0 { + if dt > 1.0 / 120.0 { time = time_now; + let angles = Euler{x:Rad(mouse.y/128.),y:Rad(mouse.x/128.),z:Rad(0.0)}; + let orientation=Quaternion::from(angles); pos += orientation.rotate_vector(get_control_dir(controls))*fly_speed; let window = surface.object().unwrap().downcast_ref::().unwrap(); @@ -400,7 +411,7 @@ fn main() { 0.01, 100.0, ); - let view = Matrix4::from_translation(pos)+Matrix4::from(orientation); + let view = Matrix4::from_translation(pos)*Matrix4::from(angles); let scale = Matrix4::from_scale(-0.01); let uniform_data = vs::Data { From 799c4a92248a42c6ea33cfd6a82e180f8d9c7690 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 28 Aug 2023 15:27:24 -0700 Subject: [PATCH 008/482] fix camera --- src/main.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 450e5ca..426d143 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,7 @@ // notice may not be copied, modified, or distributed except // according to those terms. -use cgmath::{Matrix3, Matrix4, Rad, Vector2, Vector3, Rotation, Quaternion, Euler}; +use cgmath::{Matrix3, Matrix4, Rad, Vector2, Vector3, Rotation, Quaternion, Euler, SquareMatrix}; use strafe_client::{Normal, Position, INDICES, NORMALS, POSITIONS}; use std::{sync::Arc, time::Instant}; use vulkano::{ @@ -66,7 +66,7 @@ const CONTROL_MOVEDOWN:u32 = 0b00100000; const FORWARD_DIR:Vector3 = Vector3::new(0,0,-1); const RIGHT_DIR:Vector3 = Vector3::new(1,0,0); -const UP_DIR:Vector3 = Vector3::new(0,1,0); +const UP_DIR:Vector3 = Vector3::new(0,-1,0); fn get_control_dir(controls: u32) -> Vector3{ //don't get fancy just do it @@ -359,7 +359,7 @@ fn main() { let dt = (time_now-time).as_secs_f64(); if dt > 1.0 / 120.0 { time = time_now; - let angles = Euler{x:Rad(mouse.y/128.),y:Rad(mouse.x/128.),z:Rad(0.0)}; + let angles = Euler{x:Rad(mouse.y/256.),y:Rad(mouse.x/-256.),z:Rad(0.0)}; let orientation=Quaternion::from(angles); pos += orientation.rotate_vector(get_control_dir(controls))*fly_speed; @@ -415,8 +415,8 @@ fn main() { let scale = Matrix4::from_scale(-0.01); let uniform_data = vs::Data { - world: Matrix4::from(rotation).into(), - view: (view * scale).cast::().unwrap().into(), + world: (Matrix4::from_translation(Vector3 { x: 0.0, y: 0.0, z: 0.0 }) * Matrix4::from(rotation) * scale).into(), + view: view.invert().unwrap().cast::().unwrap().into(), proj: proj.into(), }; From cbe9c4a212a5777e50131e519a4f932861b2e571 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 29 Aug 2023 18:01:42 -0700 Subject: [PATCH 009/482] translation is not needed --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 426d143..68dd5ef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -413,9 +413,9 @@ fn main() { ); let view = Matrix4::from_translation(pos)*Matrix4::from(angles); let scale = Matrix4::from_scale(-0.01); - +// Matrix4::from_translation(Vector3 { x: 0.0, y: 0.0, z: 0.0 }) * let uniform_data = vs::Data { - world: (Matrix4::from_translation(Vector3 { x: 0.0, y: 0.0, z: 0.0 }) * Matrix4::from(rotation) * scale).into(), + world: (Matrix4::from(rotation) * scale).into(), view: view.invert().unwrap().cast::().unwrap().into(), proj: proj.into(), }; From 65eb229961c80c8195ded4293d7b402944ad5d6f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 29 Aug 2023 18:01:48 -0700 Subject: [PATCH 010/482] sens too low --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 68dd5ef..c618099 100644 --- a/src/main.rs +++ b/src/main.rs @@ -359,7 +359,7 @@ fn main() { let dt = (time_now-time).as_secs_f64(); if dt > 1.0 / 120.0 { time = time_now; - let angles = Euler{x:Rad(mouse.y/256.),y:Rad(mouse.x/-256.),z:Rad(0.0)}; + let angles = Euler{x:Rad(mouse.y/1024.),y:Rad(mouse.x/-1024.),z:Rad(0.0)}; let orientation=Quaternion::from(angles); pos += orientation.rotate_vector(get_control_dir(controls))*fly_speed; From 036c056de0aebf55888951285ba4f3726eac7db5 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 29 Aug 2023 18:02:05 -0700 Subject: [PATCH 011/482] press tab to lock mouse (no workie on X11) --- src/main.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main.rs b/src/main.rs index c618099..23ade7f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -350,6 +350,24 @@ fn main() { ElementState::Pressed => controls|=CONTROL_MOVEDOWN, ElementState::Released => controls&=!CONTROL_MOVEDOWN, } + (k,VirtualKeyCode::Tab) => match k { + ElementState::Pressed => { + let window = surface.object().unwrap().downcast_ref::().unwrap(); + let garb = window.set_cursor_grab(winit::window::CursorGrabMode::None); + match garb { + Err(err) => println!("set_cursor_grab error: {}",err), + _ => (), + } + } + ElementState::Released => { + let window = surface.object().unwrap().downcast_ref::().unwrap(); + let garb = window.set_cursor_grab(winit::window::CursorGrabMode::Locked); + match garb { + Err(err) => println!("set_cursor_grab error: {}",err), + _ => (), + } + } + } _ => (), } } From b99f1ef73122cdcb604e11a8631f14fea4d4675f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 29 Aug 2023 18:10:08 -0700 Subject: [PATCH 012/482] switch to wgpu --- Cargo.lock | 885 ++++++++----- Cargo.toml | 5 +- src/frag.glsl | 14 - src/lib.rs | 3377 ------------------------------------------------- src/main.rs | 598 +-------- src/vert.glsl | 18 - 6 files changed, 544 insertions(+), 4353 deletions(-) delete mode 100644 src/frag.glsl delete mode 100644 src/lib.rs delete mode 100644 src/vert.glsl diff --git a/Cargo.lock b/Cargo.lock index e58dd60..9abbb6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,6 +18,15 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -26,33 +35,23 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.3" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "cfg-if", "getrandom", "once_cell", "version_check", ] -[[package]] -name = "aho-corasick" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" -dependencies = [ - "memchr", -] - [[package]] name = "android-activity" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bc1575e653f158cbdc6ebcd917b9564e66321c5325c232c3591269c257be69" +checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" dependencies = [ "android-properties", - "bitflags", + "bitflags 1.3.2", "cc", "jni-sys", "libc", @@ -70,12 +69,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" [[package]] -name = "approx" -version = "0.4.0" +name = "android_system_properties" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "num-traits", + "libc", ] [[package]] @@ -96,7 +95,7 @@ version = "0.37.3+1.3.251" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" dependencies = [ - "libloading", + "libloading 0.7.4", ] [[package]] @@ -105,12 +104,54 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-sys" version = "0.1.0-beta.1" @@ -141,20 +182,6 @@ name = "bytemuck" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] [[package]] name = "calloop" @@ -162,7 +189,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52e0d00eb1ea24371a97d2da6201c6747a633dc6dc1988ef503403b4c59504a8" dependencies = [ - "bitflags", + "bitflags 1.3.2", "log", "nix 0.25.1", "slotmap", @@ -172,11 +199,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -192,23 +220,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] -name = "cgmath" -version = "0.18.0" +name = "codespan-reporting" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ - "approx", - "num-traits", + "termcolor", + "unicode-width", ] [[package]] -name = "cmake" -version = "0.1.50" +name = "com-rs" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] +checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642" [[package]] name = "core-foundation" @@ -232,10 +257,10 @@ version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-graphics-types", - "foreign-types", + "foreign-types 0.3.2", "libc", ] @@ -245,7 +270,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "libc", ] @@ -260,30 +285,16 @@ dependencies = [ ] [[package]] -name = "crossbeam-queue" -version = "0.3.8" +name = "d3d12" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "e16e44ab292b1dddfdaf7be62cfd8877df52f2f3fde5858d95bab606be259f20" dependencies = [ - "cfg-if", - "crossbeam-utils", + "bitflags 2.4.0", + "libloading 0.8.0", + "winapi", ] -[[package]] -name = "crossbeam-utils" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - [[package]] name = "dispatch" version = "0.2.0" @@ -296,7 +307,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading", + "libloading 0.8.0", ] [[package]] @@ -322,9 +333,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" dependencies = [ "crc32fast", "miniz_oxide", @@ -336,7 +347,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", ] [[package]] @@ -345,6 +377,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "getrandom" version = "0.2.10" @@ -357,14 +395,73 @@ dependencies = [ ] [[package]] -name = "half" -version = "2.3.1" +name = "gimli" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + +[[package]] +name = "glow" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" dependencies = [ - "bytemuck", - "cfg-if", - "crunchy", + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.4.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.4.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce95f9e2e11c2c6fadfce42b5af60005db06576f231f5c92550fdded43c423e8" +dependencies = [ + "backtrace", + "log", + "thiserror", + "winapi", + "windows", +] + +[[package]] +name = "gpu-descriptor" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b0c02e1ba0bdb14e965058ca34e09c020f8e507a760df1121728e0aef68d57a" +dependencies = [ + "bitflags 1.3.2", + "gpu-descriptor-types", + "hashbrown 0.12.3", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126" +dependencies = [ + "bitflags 1.3.2", ] [[package]] @@ -372,6 +469,9 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] [[package]] name = "hashbrown" @@ -380,10 +480,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" [[package]] -name = "heck" -version = "0.4.1" +name = "hassle-rs" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "1397650ee315e8891a0df210707f0fc61771b0cc518c3023896064c5407cb3b0" +dependencies = [ + "bitflags 1.3.2", + "com-rs", + "libc", + "libloading 0.7.4", + "thiserror", + "widestring", + "winapi", +] + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] name = "indexmap" @@ -417,12 +532,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "itoa" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" - [[package]] name = "jni-sys" version = "0.3.0" @@ -447,6 +556,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "khronos-egl" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3" +dependencies = [ + "libc", + "libloading 0.7.4", + "pkg-config", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -469,6 +589,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "libloading" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d580318f95776505201b28cf98eb1fa5e4be3b689633ba6a3e6cd880ff22d8cb" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "lock_api" version = "0.4.10" @@ -481,9 +611,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "malloc_buf" @@ -496,9 +626,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f478948fd84d9f8e86967bf432640e46adfb5a4bd4f14ef7e864ab38220534ae" [[package]] name = "memmap2" @@ -518,6 +648,21 @@ dependencies = [ "autocfg", ] +[[package]] +name = "metal" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "623b5e6cefd76e58f774bd3cc0c6f5c7615c58c03a97815245a25c3c9bdee318" +dependencies = [ + "bitflags 2.4.0", + "block", + "core-graphics-types", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -546,13 +691,33 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "naga" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ceaaa4eedaece7e4ec08c55c640ba03dbb73fb812a6570a59bcf1930d0f70e" +dependencies = [ + "bit-set", + "bitflags 2.4.0", + "codespan-reporting", + "hexf-parse", + "indexmap 1.9.3", + "log", + "num-traits", + "rustc-hash", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + [[package]] name = "ndk" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" dependencies = [ - "bitflags", + "bitflags 1.3.2", "jni-sys", "ndk-sys", "num_enum 0.5.11", @@ -581,7 +746,7 @@ version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", "memoffset", @@ -594,7 +759,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" dependencies = [ "autocfg", - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", "memoffset", @@ -658,7 +823,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.29", ] [[package]] @@ -668,6 +833,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", + "objc_exception", ] [[package]] @@ -696,6 +862,24 @@ dependencies = [ "objc-sys", ] +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "object" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -704,9 +888,9 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "orbclient" -version = "0.3.45" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "221d488cd70617f1bd599ed8ceb659df2147d9393717954d82a0f5e8032a6ab1" +checksum = "8378ac0dfbd4e7895f2d2c1f1345cab3836910baf3a300b000d04250f0c8428f" dependencies = [ "redox_syscall", ] @@ -740,9 +924,15 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "percent-encoding" version = "2.3.0" @@ -757,11 +947,11 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "png" -version = "0.17.9" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" +checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" dependencies = [ - "bitflags", + "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", @@ -780,22 +970,34 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.64" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] -name = "quote" -version = "1.0.29" +name = "profiling" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +checksum = "46b2164ebdb1dfeec5e337be164292351e11daf63a05174c6776b2f47460f0c9" + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] +[[package]] +name = "range-alloc" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" + [[package]] name = "raw-window-handle" version = "0.5.2" @@ -808,52 +1010,26 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] -name = "regex" -version = "1.9.1" +name = "renderdoc-sys" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] +checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b" [[package]] -name = "regex-automata" -version = "0.3.3" +name = "rustc-demangle" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] -name = "regex-syntax" -version = "0.7.4" +name = "rustc-hash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" - -[[package]] -name = "roxmltree" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" -dependencies = [ - "xmlparser", -] - -[[package]] -name = "ryu" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "scoped-tls" @@ -863,9 +1039,9 @@ checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sctk-adwaita" @@ -880,63 +1056,11 @@ dependencies = [ "tiny-skia", ] -[[package]] -name = "serde" -version = "1.0.171" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.171" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "serde_json" -version = "1.0.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "shaderc" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31cef52787a0db5108788ea20bed13d6bf4b96287c5c5201e55725f7070f3443" -dependencies = [ - "libc", - "shaderc-sys", -] - -[[package]] -name = "shaderc-sys" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e8f8439fffcffd6efcd74197204addf935dbab5752696bd990a6cd36d54cf64" -dependencies = [ - "cmake", - "libc", - "roxmltree", -] - [[package]] name = "simd-adler32" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "slotmap" @@ -959,7 +1083,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454" dependencies = [ - "bitflags", + "bitflags 1.3.2", "calloop", "dlib", "lazy_static", @@ -972,14 +1096,27 @@ dependencies = [ "wayland-protocols", ] +[[package]] +name = "spirv" +version = "0.2.0+1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" +dependencies = [ + "bitflags 1.3.2", + "num-traits", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strafe-client" version = "0.1.0" dependencies = [ - "cgmath", - "vulkano", - "vulkano-shaders", - "vulkano-win", + "wgpu", "winit", ] @@ -1002,9 +1139,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.25" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ "proc-macro2", "quote", @@ -1012,33 +1149,32 @@ dependencies = [ ] [[package]] -name = "thiserror" -version = "1.0.44" +name = "termcolor" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.44" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", -] - -[[package]] -name = "thread_local" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" -dependencies = [ - "cfg-if", - "once_cell", + "syn 2.0.29", ] [[package]] @@ -1091,9 +1227,21 @@ checksum = "a464a4b34948a5f67fddd2b823c62d9d92e44be75058b99939eae6c5b6960b33" [[package]] name = "unicode-ident" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "vec_map" @@ -1107,84 +1255,6 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "vk-parse" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6a0bda9bbe6b9e50e6456c80aa8fe4cca3b21e4311a1130c41e4915ec2e32a" -dependencies = [ - "xml-rs", -] - -[[package]] -name = "vulkano" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e1f15eeb9d93a05eb3c237332a10806eac1eb82444e54485bfcc1859c483c23" -dependencies = [ - "ahash", - "ash", - "bytemuck", - "core-graphics-types", - "crossbeam-queue", - "half", - "heck", - "indexmap 1.9.3", - "libloading", - "objc", - "once_cell", - "parking_lot", - "proc-macro2", - "quote", - "regex", - "serde", - "serde_json", - "smallvec", - "thread_local", - "vk-parse", - "vulkano-macros", -] - -[[package]] -name = "vulkano-macros" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "895b8a2cac1e7650d2d0552f2392da0970a358515ac11a34adaf19bfdc771b98" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "vulkano-shaders" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f8cf18e9becbc6d39f1c39e26bcf69546c93989553eb5748cd734a8a697a6e5" -dependencies = [ - "ahash", - "heck", - "proc-macro2", - "quote", - "shaderc", - "syn 1.0.109", - "vulkano", -] - -[[package]] -name = "vulkano-win" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666c77efe5ea82837781961a6bcd957ee2e926777e8de0005f580335d6eaefe7" -dependencies = [ - "core-graphics-types", - "objc", - "raw-window-handle", - "vulkano", - "winit", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1212,10 +1282,22 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.29", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.87" @@ -1234,7 +1316,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.25", + "syn 2.0.29", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1251,7 +1333,7 @@ version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" dependencies = [ - "bitflags", + "bitflags 1.3.2", "downcast-rs", "libc", "nix 0.24.3", @@ -1290,7 +1372,7 @@ version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" dependencies = [ - "bitflags", + "bitflags 1.3.2", "wayland-client", "wayland-commons", "wayland-scanner", @@ -1328,6 +1410,111 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "wgpu" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7472f3b69449a8ae073f6ec41d05b6f846902d92a6c45313c50cb25857b736ce" +dependencies = [ + "arrayvec", + "cfg-if", + "js-sys", + "log", + "naga", + "parking_lot", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecf7454d9386f602f7399225c92dd2fbdcde52c519bc8fb0bd6fbeb388075dc2" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.4.0", + "codespan-reporting", + "log", + "naga", + "parking_lot", + "profiling", + "raw-window-handle", + "rustc-hash", + "smallvec", + "thiserror", + "web-sys", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6654a13885a17f475e8324efb46dc6986d7aaaa98353330f8de2077b153d0101" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.4.0", + "block", + "core-graphics-types", + "d3d12", + "glow", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hassle-rs", + "js-sys", + "khronos-egl", + "libc", + "libloading 0.8.0", + "log", + "metal", + "naga", + "objc", + "parking_lot", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "winapi", +] + +[[package]] +name = "wgpu-types" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee64d7398d0c2f9ca48922c902ef69c42d000c759f3db41e355f4a570b052b67" +dependencies = [ + "bitflags 2.4.0", + "js-sys", + "web-sys", +] + +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + [[package]] name = "winapi" version = "0.3.9" @@ -1344,12 +1531,30 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -1365,7 +1570,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] [[package]] @@ -1385,17 +1590,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -1406,9 +1611,9 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" @@ -1418,9 +1623,9 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" @@ -1430,9 +1635,9 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" @@ -1442,9 +1647,9 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" @@ -1454,9 +1659,9 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" @@ -1466,9 +1671,9 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" @@ -1478,9 +1683,9 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winit" @@ -1489,7 +1694,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "866db3f712fffba75d31bf0cdecf357c8aeafd158c5b7ab51dba2a2b2d47f196" dependencies = [ "android-activity", - "bitflags", + "bitflags 1.3.2", "cfg_aliases", "core-foundation", "core-graphics", @@ -1519,9 +1724,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.5.0" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" dependencies = [ "memchr", ] @@ -1548,12 +1753,6 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a56c84a8ccd4258aed21c92f70c0f6dea75356b6892ae27c24139da456f9336" - -[[package]] -name = "xmlparser" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" +checksum = "47430998a7b5d499ccee752b41567bc3afc57e1327dc855b1a2aa44ce29b5fa1" diff --git a/Cargo.toml b/Cargo.toml index 75ceb11..e948f59 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -cgmath = "0.18.0" -vulkano = "0.33.0" -vulkano-shaders = "0.33.0" -vulkano-win = "0.33.0" +wgpu = "0.17.0" winit = "0.28.6" diff --git a/src/frag.glsl b/src/frag.glsl deleted file mode 100644 index 39c544e..0000000 --- a/src/frag.glsl +++ /dev/null @@ -1,14 +0,0 @@ -#version 450 - -layout(location = 0) in vec3 v_normal; -layout(location = 0) out vec4 f_color; - -const vec3 LIGHT = vec3(0.0, 0.0, 1.0); - -void main() { - float brightness = dot(normalize(v_normal), normalize(LIGHT)); - vec3 dark_color = vec3(0.6, 0.0, 0.0); - vec3 regular_color = vec3(1.0, 0.0, 0.0); - - f_color = vec4(mix(dark_color, regular_color, brightness), 1.0); -} diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 625f50c..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,3377 +0,0 @@ -// Copyright (c) 2016 The vulkano developers -// Licensed under the Apache License, Version 2.0 -// or the MIT -// license , -// at your option. All files in the project carrying such -// notice may not be copied, modified, or distributed except -// according to those terms. - -use vulkano::{buffer::BufferContents, pipeline::graphics::vertex_input::Vertex}; - -#[derive(BufferContents, Vertex)] -#[repr(C)] -pub struct Position { - #[format(R32G32B32_SFLOAT)] - position: [f32; 3], -} - -pub const POSITIONS: [Position; 531] = [ - Position { - position: [0.0, 0.0, 0.0], - }, // dummy vector because in the original model indices - // start at 1 - Position { - position: [40.6266, 28.3457, -1.10804], - }, - Position { - position: [40.0714, 30.4443, -1.10804], - }, - Position { - position: [40.7155, 31.1438, -1.10804], - }, - Position { - position: [42.0257, 30.4443, -1.10804], - }, - Position { - position: [43.4692, 28.3457, -1.10804], - }, - Position { - position: [37.5425, 28.3457, 14.5117], - }, - Position { - position: [37.0303, 30.4443, 14.2938], - }, - Position { - position: [37.6244, 31.1438, 14.5466], - }, - Position { - position: [38.8331, 30.4443, 15.0609], - }, - Position { - position: [40.1647, 28.3457, 15.6274], - }, - Position { - position: [29.0859, 28.3457, 27.1468], - }, - Position { - position: [28.6917, 30.4443, 26.7527], - }, - Position { - position: [29.149, 31.1438, 27.2099], - }, - Position { - position: [30.0792, 30.4443, 28.1402], - }, - Position { - position: [31.1041, 28.3457, 29.165], - }, - Position { - position: [16.4508, 28.3457, 35.6034], - }, - Position { - position: [16.2329, 30.4443, 35.0912], - }, - Position { - position: [16.4857, 31.1438, 35.6853], - }, - Position { - position: [16.9999, 30.4443, 36.894], - }, - Position { - position: [17.5665, 28.3457, 38.2256], - }, - Position { - position: [0.831025, 28.3457, 38.6876], - }, - Position { - position: [0.831025, 30.4443, 38.1324], - }, - Position { - position: [0.831025, 31.1438, 38.7764], - }, - Position { - position: [0.831025, 30.4443, 40.0866], - }, - Position { - position: [0.831025, 28.3457, 41.5301], - }, - Position { - position: [-15.868, 28.3457, 35.6034], - }, - Position { - position: [-15.0262, 30.4443, 35.0912], - }, - Position { - position: [-14.9585, 31.1438, 35.6853], - }, - Position { - position: [-15.3547, 30.4443, 36.894], - }, - Position { - position: [-15.9044, 28.3457, 38.2256], - }, - Position { - position: [-28.3832, 28.3457, 27.1468], - }, - Position { - position: [-27.4344, 30.4443, 26.7527], - }, - Position { - position: [-27.6068, 31.1438, 27.2099], - }, - Position { - position: [-28.4322, 30.4443, 28.1402], - }, - Position { - position: [-29.4421, 28.3457, 29.165], - }, - Position { - position: [-36.2402, 28.3457, 14.5117], - }, - Position { - position: [-35.52, 30.4443, 14.2938], - }, - Position { - position: [-36.0073, 31.1438, 14.5466], - }, - Position { - position: [-37.1767, 30.4443, 15.0609], - }, - Position { - position: [-38.5027, 28.3457, 15.6274], - }, - Position { - position: [-38.9646, 28.3457, -1.10804], - }, - Position { - position: [-38.4094, 30.4443, -1.10804], - }, - Position { - position: [-39.0534, 31.1438, -1.10804], - }, - Position { - position: [-40.3636, 30.4443, -1.10804], - }, - Position { - position: [-41.8071, 28.3457, -1.10804], - }, - Position { - position: [-35.8804, 28.3457, -16.7278], - }, - Position { - position: [-35.3683, 30.4443, -16.5099], - }, - Position { - position: [-35.9624, 31.1438, -16.7627], - }, - Position { - position: [-37.1711, 30.4443, -17.2769], - }, - Position { - position: [-38.5027, 28.3457, -17.8435], - }, - Position { - position: [-27.4238, 28.3457, -29.3629], - }, - Position { - position: [-27.0297, 30.4443, -28.9687], - }, - Position { - position: [-27.4869, 31.1438, -29.426], - }, - Position { - position: [-28.4172, 30.4443, -30.3562], - }, - Position { - position: [-29.4421, 28.3457, -31.3811], - }, - Position { - position: [-14.7887, 28.3457, -37.8195], - }, - Position { - position: [-14.5708, 30.4443, -37.3073], - }, - Position { - position: [-14.8236, 31.1438, -37.9014], - }, - Position { - position: [-15.3379, 30.4443, -39.1101], - }, - Position { - position: [-15.9044, 28.3457, -40.4417], - }, - Position { - position: [0.831025, 28.3457, -40.9036], - }, - Position { - position: [0.831025, 30.4443, -40.3484], - }, - Position { - position: [0.831025, 31.1438, -40.9925], - }, - Position { - position: [0.831025, 30.4443, -42.3027], - }, - Position { - position: [0.831025, 28.3457, -43.7462], - }, - Position { - position: [16.4508, 28.3457, -37.8195], - }, - Position { - position: [16.2329, 30.4443, -37.3073], - }, - Position { - position: [16.4857, 31.1438, -37.9014], - }, - Position { - position: [16.9999, 30.4443, -39.1101], - }, - Position { - position: [17.5665, 28.3457, -40.4417], - }, - Position { - position: [29.0859, 28.3457, -29.3629], - }, - Position { - position: [28.6917, 30.4443, -28.9687], - }, - Position { - position: [29.149, 31.1438, -29.426], - }, - Position { - position: [30.0792, 30.4443, -30.3562], - }, - Position { - position: [31.1041, 28.3457, -31.3811], - }, - Position { - position: [37.5425, 28.3457, -16.7278], - }, - Position { - position: [37.0303, 30.4443, -16.5099], - }, - Position { - position: [37.6244, 31.1438, -16.7627], - }, - Position { - position: [38.8331, 30.4443, -17.2769], - }, - Position { - position: [40.1647, 28.3457, -17.8435], - }, - Position { - position: [48.6879, 17.1865, -1.10804], - }, - Position { - position: [53.2404, 6.22714, -1.10804], - }, - Position { - position: [56.4605, -4.33246, -1.10804], - }, - Position { - position: [57.6819, -14.2925, -1.10804], - }, - Position { - position: [44.979, 17.1865, 17.6758], - }, - Position { - position: [49.1787, 6.22714, 19.4626], - }, - Position { - position: [52.1492, -4.33246, 20.7265], - }, - Position { - position: [53.2759, -14.2925, 21.2059], - }, - Position { - position: [34.8094, 17.1865, 32.8703], - }, - Position { - position: [38.0417, 6.22714, 36.1026], - }, - Position { - position: [40.3279, -4.33246, 38.3889], - }, - Position { - position: [41.1951, -14.2925, 39.2561], - }, - Position { - position: [19.6148, 17.1865, 43.0399], - }, - Position { - position: [21.4017, 6.22714, 47.2396], - }, - Position { - position: [22.6656, -4.33246, 50.2101], - }, - Position { - position: [23.145, -14.2925, 51.3369], - }, - Position { - position: [0.831025, 17.1865, 46.7488], - }, - Position { - position: [0.831025, 6.22714, 51.3013], - }, - Position { - position: [0.831025, -4.33246, 54.5214], - }, - Position { - position: [0.831025, -14.2925, 55.7428], - }, - Position { - position: [-17.9528, 17.1865, 43.0399], - }, - Position { - position: [-19.7397, 6.22714, 47.2396], - }, - Position { - position: [-21.0035, -4.33246, 50.2101], - }, - Position { - position: [-21.4829, -14.2925, 51.3369], - }, - Position { - position: [-33.1474, 17.1865, 32.8703], - }, - Position { - position: [-36.3796, 6.22714, 36.1026], - }, - Position { - position: [-38.6659, -4.33246, 38.3889], - }, - Position { - position: [-39.5331, -14.2925, 39.2561], - }, - Position { - position: [-43.3169, 17.1865, 17.6758], - }, - Position { - position: [-47.5166, 6.22714, 19.4626], - }, - Position { - position: [-50.4871, -4.33246, 20.7265], - }, - Position { - position: [-51.6139, -14.2925, 21.2059], - }, - Position { - position: [-47.0258, 17.1865, -1.10804], - }, - Position { - position: [-51.5784, 6.22714, -1.10804], - }, - Position { - position: [-54.7984, -4.33246, -1.10804], - }, - Position { - position: [-56.0198, -14.2925, -1.10804], - }, - Position { - position: [-43.3169, 17.1865, -19.8919], - }, - Position { - position: [-47.5166, 6.22714, -21.6787], - }, - Position { - position: [-50.4871, -4.33246, -22.9426], - }, - Position { - position: [-51.6139, -14.2925, -23.422], - }, - Position { - position: [-33.1474, 17.1865, -35.0864], - }, - Position { - position: [-36.3796, 6.22714, -38.3187], - }, - Position { - position: [-38.6659, -4.33246, -40.6049], - }, - Position { - position: [-39.5331, -14.2925, -41.4721], - }, - Position { - position: [-17.9528, 17.1865, -45.256], - }, - Position { - position: [-19.7397, 6.22714, -49.4557], - }, - Position { - position: [-21.0035, -4.33246, -52.4262], - }, - Position { - position: [-21.4829, -14.2925, -53.5529], - }, - Position { - position: [0.831025, 17.1865, -48.9649], - }, - Position { - position: [0.831025, 6.22714, -53.5174], - }, - Position { - position: [0.831025, -4.33246, -56.7375], - }, - Position { - position: [0.831025, -14.2925, -57.9589], - }, - Position { - position: [19.6148, 17.1865, -45.256], - }, - Position { - position: [21.4017, 6.22714, -49.4557], - }, - Position { - position: [22.6656, -4.33246, -52.4262], - }, - Position { - position: [23.145, -14.2925, -53.5529], - }, - Position { - position: [34.8094, 17.1865, -35.0864], - }, - Position { - position: [38.0417, 6.22714, -38.3187], - }, - Position { - position: [40.3279, -4.33246, -40.6049], - }, - Position { - position: [41.1951, -14.2925, -41.4721], - }, - Position { - position: [44.979, 17.1865, -19.8919], - }, - Position { - position: [49.1787, 6.22714, -21.6787], - }, - Position { - position: [52.1492, -4.33246, -22.9426], - }, - Position { - position: [53.2759, -14.2925, -23.422], - }, - Position { - position: [55.4611, -22.7202, -1.10804], - }, - Position { - position: [50.5755, -28.9493, -1.10804], - }, - Position { - position: [45.6899, -33.1798, -1.10804], - }, - Position { - position: [43.4692, -35.6115, -1.10804], - }, - Position { - position: [51.2273, -22.7202, 20.3343], - }, - Position { - position: [46.7203, -28.9493, 18.4167], - }, - Position { - position: [42.2133, -33.1798, 16.4991], - }, - Position { - position: [40.1647, -35.6115, 15.6274], - }, - Position { - position: [39.6184, -22.7202, 37.6793], - }, - Position { - position: [36.1496, -28.9493, 34.2106], - }, - Position { - position: [32.6808, -33.1798, 30.7418], - }, - Position { - position: [31.1041, -35.6115, 29.165], - }, - Position { - position: [22.2733, -22.7202, 49.2882], - }, - Position { - position: [20.3557, -28.9493, 44.7813], - }, - Position { - position: [18.4381, -33.1798, 40.2743], - }, - Position { - position: [17.5665, -35.6115, 38.2256], - }, - Position { - position: [0.831025, -22.7202, 53.5221], - }, - Position { - position: [0.831025, -28.9493, 48.6365], - }, - Position { - position: [0.831025, -33.1798, 43.7508], - }, - Position { - position: [0.831025, -35.6115, 41.5301], - }, - Position { - position: [-20.6113, -22.7202, 49.2882], - }, - Position { - position: [-18.6937, -28.9493, 44.7813], - }, - Position { - position: [-16.7761, -33.1798, 40.2743], - }, - Position { - position: [-15.9044, -35.6115, 38.2256], - }, - Position { - position: [-37.9564, -22.7202, 37.6793], - }, - Position { - position: [-34.4876, -28.9493, 34.2106], - }, - Position { - position: [-31.0188, -33.1798, 30.7418], - }, - Position { - position: [-29.4421, -35.6115, 29.165], - }, - Position { - position: [-49.5653, -22.7202, 20.3343], - }, - Position { - position: [-45.0583, -28.9493, 18.4167], - }, - Position { - position: [-40.5513, -33.1798, 16.4991], - }, - Position { - position: [-38.5027, -35.6115, 15.6274], - }, - Position { - position: [-53.7991, -22.7202, -1.10804], - }, - Position { - position: [-48.9135, -28.9493, -1.10804], - }, - Position { - position: [-44.0279, -33.1798, -1.10804], - }, - Position { - position: [-41.8071, -35.6115, -1.10804], - }, - Position { - position: [-49.5653, -22.7202, -22.5504], - }, - Position { - position: [-45.0583, -28.9493, -20.6327], - }, - Position { - position: [-40.5513, -33.1798, -18.7151], - }, - Position { - position: [-38.5027, -35.6115, -17.8435], - }, - Position { - position: [-37.9564, -22.7202, -39.8954], - }, - Position { - position: [-34.4876, -28.9493, -36.4266], - }, - Position { - position: [-31.0188, -33.1798, -32.9578], - }, - Position { - position: [-29.4421, -35.6115, -31.3811], - }, - Position { - position: [-20.6113, -22.7202, -51.5043], - }, - Position { - position: [-18.6937, -28.9493, -46.9973], - }, - Position { - position: [-16.7761, -33.1798, -42.4903], - }, - Position { - position: [-15.9044, -35.6115, -40.4417], - }, - Position { - position: [0.831025, -22.7202, -55.7382], - }, - Position { - position: [0.831025, -28.9493, -50.8525], - }, - Position { - position: [0.831025, -33.1798, -45.9669], - }, - Position { - position: [0.831025, -35.6115, -43.7462], - }, - Position { - position: [22.2733, -22.7202, -51.5043], - }, - Position { - position: [20.3557, -28.9493, -46.9973], - }, - Position { - position: [18.4381, -33.1798, -42.4903], - }, - Position { - position: [17.5665, -35.6115, -40.4417], - }, - Position { - position: [39.6184, -22.7202, -39.8954], - }, - Position { - position: [36.1496, -28.9493, -36.4266], - }, - Position { - position: [32.6808, -33.1798, -32.9578], - }, - Position { - position: [31.1041, -35.6115, -31.3811], - }, - Position { - position: [51.2273, -22.7202, -22.5504], - }, - Position { - position: [46.7203, -28.9493, -20.6327], - }, - Position { - position: [42.2133, -33.1798, -18.7151], - }, - Position { - position: [40.1647, -35.6115, -17.8435], - }, - Position { - position: [42.5031, -37.1772, -1.10804], - }, - Position { - position: [37.3399, -38.5429, -1.10804], - }, - Position { - position: [24.5818, -39.5089, -1.10804], - }, - Position { - position: [0.831025, -39.8754, -1.10804], - }, - Position { - position: [39.2736, -37.1772, 15.2483], - }, - Position { - position: [34.5105, -38.5429, 13.2217], - }, - Position { - position: [22.7411, -39.5089, 8.21414], - }, - Position { - position: [30.4182, -37.1772, 28.4792], - }, - Position { - position: [26.7523, -38.5429, 24.8133], - }, - Position { - position: [17.6941, -39.5089, 15.755], - }, - Position { - position: [17.1873, -37.1772, 37.3345], - }, - Position { - position: [15.1608, -38.5429, 32.5714], - }, - Position { - position: [10.1532, -39.5089, 20.8021], - }, - Position { - position: [0.831025, -37.1772, 40.5641], - }, - Position { - position: [0.831025, -38.5429, 35.4009], - }, - Position { - position: [0.831025, -39.5089, 22.6427], - }, - Position { - position: [-15.5253, -37.1772, 37.3345], - }, - Position { - position: [-13.4987, -38.5429, 32.5714], - }, - Position { - position: [-8.49115, -39.5089, 20.8021], - }, - Position { - position: [-28.7562, -37.1772, 28.4792], - }, - Position { - position: [-25.0903, -38.5429, 24.8133], - }, - Position { - position: [-16.032, -39.5089, 15.755], - }, - Position { - position: [-37.6115, -37.1772, 15.2483], - }, - Position { - position: [-32.8484, -38.5429, 13.2217], - }, - Position { - position: [-21.0791, -39.5089, 8.21414], - }, - Position { - position: [-40.8411, -37.1772, -1.10804], - }, - Position { - position: [-35.6779, -38.5429, -1.10804], - }, - Position { - position: [-22.9198, -39.5089, -1.10804], - }, - Position { - position: [-37.6115, -37.1772, -17.4643], - }, - Position { - position: [-32.8484, -38.5429, -15.4378], - }, - Position { - position: [-21.0791, -39.5089, -10.4302], - }, - Position { - position: [-28.7562, -37.1772, -30.6952], - }, - Position { - position: [-25.0903, -38.5429, -27.0294], - }, - Position { - position: [-16.032, -39.5089, -17.9711], - }, - Position { - position: [-15.5253, -37.1772, -39.5506], - }, - Position { - position: [-13.4987, -38.5429, -34.7875], - }, - Position { - position: [-8.49115, -39.5089, -23.0181], - }, - Position { - position: [0.831025, -37.1772, -42.7802], - }, - Position { - position: [0.831025, -38.5429, -37.6169], - }, - Position { - position: [0.831025, -39.5089, -24.8588], - }, - Position { - position: [17.1873, -37.1772, -39.5506], - }, - Position { - position: [15.1608, -38.5429, -34.7875], - }, - Position { - position: [10.1532, -39.5089, -23.0181], - }, - Position { - position: [30.4182, -37.1772, -30.6952], - }, - Position { - position: [26.7523, -38.5429, -27.0294], - }, - Position { - position: [17.6941, -39.5089, -17.9711], - }, - Position { - position: [39.2736, -37.1772, -17.4643], - }, - Position { - position: [34.5105, -38.5429, -15.4378], - }, - Position { - position: [22.7411, -39.5089, -10.4302], - }, - Position { - position: [-44.6497, 17.6861, -1.10804], - }, - Position { - position: [-57.9297, 17.5862, -1.10804], - }, - Position { - position: [-67.7453, 16.8867, -1.10804], - }, - Position { - position: [-73.8301, 14.9879, -1.10804], - }, - Position { - position: [-75.9176, 11.2904, -1.10804], - }, - Position { - position: [-44.2055, 18.6855, 3.68876], - }, - Position { - position: [-58.3252, 18.5699, 3.68876], - }, - Position { - position: [-68.6891, 17.7611, 3.68876], - }, - Position { - position: [-75.0724, 15.5657, 3.68876], - }, - Position { - position: [-77.2501, 11.2904, 3.68876], - }, - Position { - position: [-43.2284, 20.884, 5.28769], - }, - Position { - position: [-59.1955, 20.7341, 5.28769], - }, - Position { - position: [-70.7655, 19.6848, 5.28769], - }, - Position { - position: [-77.8053, 16.8367, 5.28769], - }, - Position { - position: [-80.1814, 11.2904, 5.28769], - }, - Position { - position: [-42.2513, 23.0825, 3.68876], - }, - Position { - position: [-60.0657, 22.8983, 3.68876], - }, - Position { - position: [-72.8419, 21.6085, 3.68876], - }, - Position { - position: [-80.5381, 18.1077, 3.68876], - }, - Position { - position: [-83.1128, 11.2904, 3.68876], - }, - Position { - position: [-41.8071, 24.0819, -1.10804], - }, - Position { - position: [-60.4613, 23.882, -1.10804], - }, - Position { - position: [-73.7857, 22.4829, -1.10804], - }, - Position { - position: [-81.7804, 18.6855, -1.10804], - }, - Position { - position: [-84.4453, 11.2904, -1.10804], - }, - Position { - position: [-42.2513, 23.0825, -5.90483], - }, - Position { - position: [-60.0657, 22.8983, -5.90483], - }, - Position { - position: [-72.8419, 21.6085, -5.90483], - }, - Position { - position: [-80.5381, 18.1077, -5.90483], - }, - Position { - position: [-83.1128, 11.2904, -5.90483], - }, - Position { - position: [-43.2284, 20.884, -7.50376], - }, - Position { - position: [-59.1955, 20.7341, -7.50376], - }, - Position { - position: [-70.7655, 19.6848, -7.50376], - }, - Position { - position: [-77.8053, 16.8367, -7.50376], - }, - Position { - position: [-80.1814, 11.2904, -7.50376], - }, - Position { - position: [-44.2055, 18.6855, -5.90483], - }, - Position { - position: [-58.3252, 18.5699, -5.90483], - }, - Position { - position: [-68.6891, 17.7611, -5.90483], - }, - Position { - position: [-75.0724, 15.5657, -5.90483], - }, - Position { - position: [-77.2501, 11.2904, -5.90483], - }, - Position { - position: [-74.8073, 5.4943, -1.10804], - }, - Position { - position: [-71.2985, -1.50103, -1.10804], - }, - Position { - position: [-65.1248, -8.49634, -1.10804], - }, - Position { - position: [-56.0198, -14.2925, -1.10804], - }, - Position { - position: [-76.0183, 4.93477, 3.68876], - }, - Position { - position: [-72.159, -2.35462, 3.68876], - }, - Position { - position: [-65.4267, -9.55033, 3.68876], - }, - Position { - position: [-55.5757, -15.6249, 3.68876], - }, - Position { - position: [-78.6824, 3.70383, 5.28769], - }, - Position { - position: [-74.0522, -4.23253, 5.28769], - }, - Position { - position: [-66.0909, -11.8691, 5.28769], - }, - Position { - position: [-54.5986, -18.5563, 5.28769], - }, - Position { - position: [-81.3466, 2.47288, 3.68876], - }, - Position { - position: [-75.9454, -6.11044, 3.68876], - }, - Position { - position: [-66.755, -14.1878, 3.68876], - }, - Position { - position: [-53.6214, -21.4877, 3.68876], - }, - Position { - position: [-82.5576, 1.91336, -1.10804], - }, - Position { - position: [-76.8059, -6.96404, -1.10804], - }, - Position { - position: [-67.0569, -15.2418, -1.10804], - }, - Position { - position: [-53.1773, -22.8201, -1.10804], - }, - Position { - position: [-81.3466, 2.47288, -5.90483], - }, - Position { - position: [-75.9454, -6.11044, -5.90483], - }, - Position { - position: [-66.755, -14.1878, -5.90483], - }, - Position { - position: [-53.6214, -21.4877, -5.90483], - }, - Position { - position: [-78.6824, 3.70383, -7.50376], - }, - Position { - position: [-74.0522, -4.23253, -7.50376], - }, - Position { - position: [-66.0909, -11.8691, -7.50376], - }, - Position { - position: [-54.5986, -18.5563, -7.50376], - }, - Position { - position: [-76.0183, 4.93477, -5.90483], - }, - Position { - position: [-72.159, -2.35462, -5.90483], - }, - Position { - position: [-65.4267, -9.55033, -5.90483], - }, - Position { - position: [-55.5757, -15.6249, -5.90483], - }, - Position { - position: [49.1543, 0.630882, -1.10804], - }, - Position { - position: [62.7896, 3.76212, -1.10804], - }, - Position { - position: [68.6967, 11.2904, -1.10804], - }, - Position { - position: [71.939, 20.4176, -1.10804], - }, - Position { - position: [77.5797, 28.3457, -1.10804], - }, - Position { - position: [49.1543, -3.03333, 9.4449], - }, - Position { - position: [63.8305, 1.04519, 8.42059], - }, - Position { - position: [70.0292, 9.70814, 6.1671], - }, - Position { - position: [73.5629, 19.8451, 3.91361], - }, - Position { - position: [80.2446, 28.3457, 2.88929], - }, - Position { - position: [49.1543, -11.0946, 12.9626], - }, - Position { - position: [66.1207, -4.93206, 11.5968], - }, - Position { - position: [72.9605, 6.22714, 8.59214], - }, - Position { - position: [77.1355, 18.5855, 5.58749], - }, - Position { - position: [86.1073, 28.3457, 4.22173], - }, - Position { - position: [49.1543, -19.1559, 9.4449], - }, - Position { - position: [68.4108, -10.9093, 8.42059], - }, - Position { - position: [75.8919, 2.74614, 6.1671], - }, - Position { - position: [80.7081, 17.326, 3.91361], - }, - Position { - position: [91.97, 28.3457, 2.88929], - }, - Position { - position: [49.1543, -22.8201, -1.10804], - }, - Position { - position: [69.4518, -13.6262, -1.10804], - }, - Position { - position: [77.2244, 1.16386, -1.10804], - }, - Position { - position: [82.3321, 16.7534, -1.10804], - }, - Position { - position: [94.6349, 28.3457, -1.10804], - }, - Position { - position: [49.1543, -19.1559, -11.661], - }, - Position { - position: [68.4108, -10.9093, -10.6367], - }, - Position { - position: [75.8919, 2.74614, -8.38317], - }, - Position { - position: [80.7081, 17.326, -6.12968], - }, - Position { - position: [91.97, 28.3457, -5.10536], - }, - Position { - position: [49.1543, -11.0946, -15.1786], - }, - Position { - position: [66.1207, -4.93206, -13.8129], - }, - Position { - position: [72.9605, 6.22714, -10.8082], - }, - Position { - position: [77.1355, 18.5855, -7.80356], - }, - Position { - position: [86.1073, 28.3457, -6.4378], - }, - Position { - position: [49.1543, -3.03333, -11.661], - }, - Position { - position: [63.8305, 1.04519, -10.6367], - }, - Position { - position: [70.0292, 9.70814, -8.38317], - }, - Position { - position: [73.5629, 19.8451, -6.12968], - }, - Position { - position: [80.2446, 28.3457, -5.10536], - }, - Position { - position: [79.6227, 29.5449, -1.10804], - }, - Position { - position: [81.1329, 29.9446, -1.10804], - }, - Position { - position: [81.577, 29.5449, -1.10804], - }, - Position { - position: [80.4222, 28.3457, -1.10804], - }, - Position { - position: [82.4767, 29.6034, 2.63946], - }, - Position { - position: [83.8116, 30.0383, 2.08983], - }, - Position { - position: [83.8515, 29.6268, 1.54019], - }, - Position { - position: [82.1988, 28.3457, 1.29036], - }, - Position { - position: [88.7555, 29.7322, 3.88862], - }, - Position { - position: [89.7049, 30.2444, 3.15578], - }, - Position { - position: [88.8555, 29.8072, 2.42294], - }, - Position { - position: [86.1073, 28.3457, 2.08983], - }, - Position { - position: [95.0343, 29.8611, 2.63946], - }, - Position { - position: [95.5982, 30.4505, 2.08983], - }, - Position { - position: [93.8594, 29.9875, 1.54019], - }, - Position { - position: [90.0158, 28.3457, 1.29036], - }, - Position { - position: [97.8883, 29.9196, -1.10804], - }, - Position { - position: [98.2769, 30.5442, -1.10804], - }, - Position { - position: [96.1339, 30.0695, -1.10804], - }, - Position { - position: [91.7924, 28.3457, -1.10804], - }, - Position { - position: [95.0343, 29.8611, -4.85553], - }, - Position { - position: [95.5982, 30.4505, -4.3059], - }, - Position { - position: [93.8594, 29.9875, -3.75626], - }, - Position { - position: [90.0158, 28.3457, -3.50643], - }, - Position { - position: [88.7555, 29.7322, -6.10469], - }, - Position { - position: [89.7049, 30.2444, -5.37185], - }, - Position { - position: [88.8555, 29.8072, -4.63901], - }, - Position { - position: [86.1073, 28.3457, -4.3059], - }, - Position { - position: [82.4767, 29.6034, -4.85553], - }, - Position { - position: [83.8116, 30.0383, -4.3059], - }, - Position { - position: [83.8515, 29.6268, -3.75626], - }, - Position { - position: [82.1988, 28.3457, -3.50643], - }, - Position { - position: [0.831025, 49.6647, -1.10804], - }, - Position { - position: [10.5134, 48.2657, -1.10804], - }, - Position { - position: [10.0693, 44.868, -1.10804], - }, - Position { - position: [6.42728, 40.6708, -1.10804], - }, - Position { - position: [6.51611, 36.8733, -1.10804], - }, - Position { - position: [9.76642, 48.2657, 2.70243], - }, - Position { - position: [9.35632, 44.868, 2.52698], - }, - Position { - position: [5.9947, 40.6708, 1.09187], - }, - Position { - position: [6.07552, 36.8733, 1.12336], - }, - Position { - position: [7.71453, 48.2657, 5.77547], - }, - Position { - position: [7.39819, 44.868, 5.45913], - }, - Position { - position: [4.80736, 40.6708, 2.8683], - }, - Position { - position: [4.86744, 36.8733, 2.92838], - }, - Position { - position: [4.64149, 48.2657, 7.82736], - }, - Position { - position: [4.46604, 44.868, 7.41726], - }, - Position { - position: [3.03093, 40.6708, 4.05564], - }, - Position { - position: [3.06242, 36.8733, 4.13646], - }, - Position { - position: [0.831025, 48.2657, 8.57438], - }, - Position { - position: [0.831025, 44.868, 8.13023], - }, - Position { - position: [0.831025, 40.6708, 4.48822], - }, - Position { - position: [0.831025, 36.8733, 4.57705], - }, - Position { - position: [-2.97944, 48.2657, 7.82736], - }, - Position { - position: [-2.80399, 44.868, 7.41726], - }, - Position { - position: [-1.36888, 40.6708, 4.05564], - }, - Position { - position: [-1.40037, 36.8733, 4.13646], - }, - Position { - position: [-6.05248, 48.2657, 5.77547], - }, - Position { - position: [-5.73614, 44.868, 5.45913], - }, - Position { - position: [-3.14531, 40.6708, 2.8683], - }, - Position { - position: [-3.20539, 36.8733, 2.92838], - }, - Position { - position: [-8.10437, 48.2657, 2.70243], - }, - Position { - position: [-7.69427, 44.868, 2.52698], - }, - Position { - position: [-4.33265, 40.6708, 1.09187], - }, - Position { - position: [-4.41347, 36.8733, 1.12336], - }, - Position { - position: [-8.85139, 48.2657, -1.10804], - }, - Position { - position: [-8.40724, 44.868, -1.10804], - }, - Position { - position: [-4.76523, 40.6708, -1.10804], - }, - Position { - position: [-4.85406, 36.8733, -1.10804], - }, - Position { - position: [-8.10437, 48.2657, -4.9185], - }, - Position { - position: [-7.69427, 44.868, -4.74305], - }, - Position { - position: [-4.33265, 40.6708, -3.30794], - }, - Position { - position: [-4.41347, 36.8733, -3.33943], - }, - Position { - position: [-6.05248, 48.2657, -7.99154], - }, - Position { - position: [-5.73614, 44.868, -7.6752], - }, - Position { - position: [-3.14531, 40.6708, -5.08437], - }, - Position { - position: [-3.20539, 36.8733, -5.14445], - }, - Position { - position: [-2.97944, 48.2657, -10.0434], - }, - Position { - position: [-2.80399, 44.868, -9.63333], - }, - Position { - position: [-1.36888, 40.6708, -6.27171], - }, - Position { - position: [-1.40037, 36.8733, -6.35253], - }, - Position { - position: [0.831025, 48.2657, -10.7904], - }, - Position { - position: [0.831025, 44.868, -10.3463], - }, - Position { - position: [0.831025, 40.6708, -6.70429], - }, - Position { - position: [0.831025, 36.8733, -6.79312], - }, - Position { - position: [4.64149, 48.2657, -10.0434], - }, - Position { - position: [4.46604, 44.868, -9.63333], - }, - Position { - position: [3.03093, 40.6708, -6.27171], - }, - Position { - position: [3.06242, 36.8733, -6.35253], - }, - Position { - position: [7.71453, 48.2657, -7.99154], - }, - Position { - position: [7.39819, 44.868, -7.6752], - }, - Position { - position: [4.80736, 40.6708, -5.08437], - }, - Position { - position: [4.86744, 36.8733, -5.14445], - }, - Position { - position: [9.76642, 48.2657, -4.9185], - }, - Position { - position: [9.35632, 44.868, -4.74305], - }, - Position { - position: [5.9947, 40.6708, -3.30794], - }, - Position { - position: [6.07552, 36.8733, -3.33943], - }, - Position { - position: [13.8001, 34.3417, -1.10804], - }, - Position { - position: [24.282, 32.6095, -1.10804], - }, - Position { - position: [33.6979, 30.8773, -1.10804], - }, - Position { - position: [37.7841, 28.3457, -1.10804], - }, - Position { - position: [12.795, 34.3417, 3.98234], - }, - Position { - position: [22.4646, 32.6095, 8.09647], - }, - Position { - position: [31.1507, 30.8773, 11.7922], - }, - Position { - position: [34.9202, 28.3457, 13.396], - }, - Position { - position: [10.0391, 34.3417, 8.10003], - }, - Position { - position: [17.4812, 32.6095, 15.5422], - }, - Position { - position: [24.1665, 30.8773, 22.2275], - }, - Position { - position: [27.0677, 28.3457, 25.1286], - }, - Position { - position: [5.9214, 34.3417, 10.856], - }, - Position { - position: [10.0355, 32.6095, 20.5255], - }, - Position { - position: [13.7313, 30.8773, 29.2117], - }, - Position { - position: [15.3351, 28.3457, 32.9812], - }, - Position { - position: [0.831025, 34.3417, 11.8611], - }, - Position { - position: [0.831025, 32.6095, 22.3429], - }, - Position { - position: [0.831025, 30.8773, 31.7589], - }, - Position { - position: [0.831025, 28.3457, 35.845], - }, - Position { - position: [-4.25935, 34.3417, 10.856], - }, - Position { - position: [-8.37348, 32.6095, 20.5255], - }, - Position { - position: [-12.0692, 30.8773, 29.2117], - }, - Position { - position: [-13.673, 28.3457, 32.9812], - }, - Position { - position: [-8.37704, 34.3417, 8.10003], - }, - Position { - position: [-15.8192, 32.6095, 15.5422], - }, - Position { - position: [-22.5045, 30.8773, 22.2275], - }, - Position { - position: [-25.4056, 28.3457, 25.1286], - }, - Position { - position: [-11.133, 34.3417, 3.98234], - }, - Position { - position: [-20.8025, 32.6095, 8.09647], - }, - Position { - position: [-29.4887, 30.8773, 11.7922], - }, - Position { - position: [-33.2582, 28.3457, 13.396], - }, - Position { - position: [-12.1381, 34.3417, -1.10804], - }, - Position { - position: [-22.62, 32.6095, -1.10804], - }, - Position { - position: [-32.0359, 30.8773, -1.10804], - }, - Position { - position: [-36.122, 28.3457, -1.10804], - }, - Position { - position: [-11.133, 34.3417, -6.19841], - }, - Position { - position: [-20.8025, 32.6095, -10.3125], - }, - Position { - position: [-29.4887, 30.8773, -14.0083], - }, - Position { - position: [-33.2582, 28.3457, -15.6121], - }, - Position { - position: [-8.37704, 34.3417, -10.3161], - }, - Position { - position: [-15.8192, 32.6095, -17.7582], - }, - Position { - position: [-22.5045, 30.8773, -24.4435], - }, - Position { - position: [-25.4056, 28.3457, -27.3447], - }, - Position { - position: [-4.25935, 34.3417, -13.072], - }, - Position { - position: [-8.37348, 32.6095, -22.7416], - }, - Position { - position: [-12.0692, 30.8773, -31.4277], - }, - Position { - position: [-13.673, 28.3457, -35.1972], - }, - Position { - position: [0.831025, 34.3417, -14.0771], - }, - Position { - position: [0.831025, 32.6095, -24.559], - }, - Position { - position: [0.831025, 30.8773, -33.9749], - }, - Position { - position: [0.831025, 28.3457, -38.0611], - }, - Position { - position: [5.9214, 34.3417, -13.072], - }, - Position { - position: [10.0355, 32.6095, -22.7416], - }, - Position { - position: [13.7313, 30.8773, -31.4277], - }, - Position { - position: [15.3351, 28.3457, -35.1972], - }, - Position { - position: [10.0391, 34.3417, -10.3161], - }, - Position { - position: [17.4812, 32.6095, -17.7582], - }, - Position { - position: [24.1665, 30.8773, -24.4435], - }, - Position { - position: [27.0677, 28.3457, -27.3447], - }, - Position { - position: [12.795, 34.3417, -6.19841], - }, - Position { - position: [22.4646, 32.6095, -10.3125], - }, - Position { - position: [31.1507, 30.8773, -14.0083], - }, - Position { - position: [34.9202, 28.3457, -15.6121], - }, -]; - -#[derive(BufferContents, Vertex)] -#[repr(C)] -pub struct Normal { - #[format(R32G32B32_SFLOAT)] - normal: [f32; 3], -} - -pub const NORMALS: [Normal; 531] = [ - Normal { - normal: [0.0, 0.0, 0.0], - }, // dummy vector because in the original model indices - // start at 1 - Normal { - normal: [-0.966742, -0.255752, 0.0], - }, - Normal { - normal: [-0.966824, 0.255443, 0.0], - }, - Normal { - normal: [-0.092052, 0.995754, 0.0], - }, - Normal { - normal: [0.68205, 0.731305, 0.0], - }, - Normal { - normal: [0.870301, 0.492521, -0.0], - }, - Normal { - normal: [-0.893014, -0.256345, -0.369882], - }, - Normal { - normal: [-0.893437, 0.255997, -0.369102], - }, - Normal { - normal: [-0.0838771, 0.995843, -0.0355068], - }, - Normal { - normal: [0.629724, 0.73186, 0.260439], - }, - Normal { - normal: [0.803725, 0.49337, 0.332584], - }, - Normal { - normal: [-0.683407, -0.256729, -0.683407], - }, - Normal { - normal: [-0.683531, 0.256067, -0.683531], - }, - Normal { - normal: [-0.0649249, 0.995776, -0.0649248], - }, - Normal { - normal: [0.481398, 0.732469, 0.481398], - }, - Normal { - normal: [0.614804, 0.493997, 0.614804], - }, - Normal { - normal: [-0.369882, -0.256345, -0.893014], - }, - Normal { - normal: [-0.369102, 0.255997, -0.893437], - }, - Normal { - normal: [-0.0355067, 0.995843, -0.0838772], - }, - Normal { - normal: [0.260439, 0.73186, 0.629724], - }, - Normal { - normal: [0.332584, 0.49337, 0.803725], - }, - Normal { - normal: [-0.00284834, -0.257863, -0.966177], - }, - Normal { - normal: [-0.00192311, 0.254736, -0.967009], - }, - Normal { - normal: [-0.000266114, 0.995734, -0.0922702], - }, - Normal { - normal: [0.0, 0.731295, 0.682061], - }, - Normal { - normal: [0.0, 0.492521, 0.870301], - }, - Normal { - normal: [0.379058, -0.3593, -0.852771], - }, - Normal { - normal: [0.37711, 0.149086, -0.914091], - }, - Normal { - normal: [0.0275022, 0.992081, -0.122551], - }, - Normal { - normal: [-0.26101, 0.726762, 0.635367], - }, - Normal { - normal: [-0.332485, 0.492546, 0.804271], - }, - Normal { - normal: [0.663548, -0.410791, -0.625264], - }, - Normal { - normal: [0.712664, 0.0737216, -0.697621], - }, - Normal { - normal: [0.0997268, 0.987509, -0.121984], - }, - Normal { - normal: [-0.48732, 0.723754, 0.488568], - }, - Normal { - normal: [-0.615242, 0.492602, 0.615484], - }, - Normal { - normal: [0.880028, -0.332908, -0.338709], - }, - Normal { - normal: [0.917276, 0.167113, -0.361493], - }, - Normal { - normal: [0.113584, 0.992365, -0.0480695], - }, - Normal { - normal: [-0.63415, 0.727508, 0.261889], - }, - Normal { - normal: [-0.804126, 0.492634, 0.332705], - }, - Normal { - normal: [0.96669, -0.255738, 0.0104537], - }, - Normal { - normal: [0.967442, 0.252962, 0.00810329], - }, - Normal { - normal: [0.0934365, 0.995624, 0.00128063], - }, - Normal { - normal: [-0.682167, 0.731196, -0.00034353], - }, - Normal { - normal: [-0.870322, 0.492483, -0.0], - }, - Normal { - normal: [0.893014, -0.256345, 0.369882], - }, - Normal { - normal: [0.893437, 0.255997, 0.369102], - }, - Normal { - normal: [0.0838768, 0.995843, 0.0355066], - }, - Normal { - normal: [-0.629724, 0.73186, -0.260439], - }, - Normal { - normal: [-0.803725, 0.49337, -0.332584], - }, - Normal { - normal: [0.683407, -0.256729, 0.683407], - }, - Normal { - normal: [0.683531, 0.256067, 0.683531], - }, - Normal { - normal: [0.0649249, 0.995776, 0.0649249], - }, - Normal { - normal: [-0.481398, 0.732469, -0.481398], - }, - Normal { - normal: [-0.614804, 0.493997, -0.614804], - }, - Normal { - normal: [0.369882, -0.256345, 0.893014], - }, - Normal { - normal: [0.369102, 0.255997, 0.893437], - }, - Normal { - normal: [0.0355067, 0.995843, 0.083877], - }, - Normal { - normal: [-0.260439, 0.73186, -0.629724], - }, - Normal { - normal: [-0.332584, 0.49337, -0.803725], - }, - Normal { - normal: [0.0, -0.255752, 0.966742], - }, - Normal { - normal: [0.0, 0.255443, 0.966824], - }, - Normal { - normal: [0.0, 0.995754, 0.092052], - }, - Normal { - normal: [0.0, 0.731305, -0.68205], - }, - Normal { - normal: [-0.0, 0.492521, -0.870301], - }, - Normal { - normal: [-0.369882, -0.256345, 0.893014], - }, - Normal { - normal: [-0.369102, 0.255996, 0.893437], - }, - Normal { - normal: [-0.0355068, 0.995843, 0.0838771], - }, - Normal { - normal: [0.260439, 0.73186, -0.629724], - }, - Normal { - normal: [0.332584, 0.49337, -0.803725], - }, - Normal { - normal: [-0.683407, -0.256729, 0.683407], - }, - Normal { - normal: [-0.683531, 0.256067, 0.683531], - }, - Normal { - normal: [-0.0649249, 0.995776, 0.064925], - }, - Normal { - normal: [0.481398, 0.732469, -0.481398], - }, - Normal { - normal: [0.614804, 0.493997, -0.614804], - }, - Normal { - normal: [-0.893014, -0.256345, 0.369882], - }, - Normal { - normal: [-0.893437, 0.255997, 0.369102], - }, - Normal { - normal: [-0.0838767, 0.995843, 0.0355066], - }, - Normal { - normal: [0.629724, 0.73186, -0.260439], - }, - Normal { - normal: [0.803725, 0.49337, -0.332584], - }, - Normal { - normal: [0.915321, 0.402725, 0.0], - }, - Normal { - normal: [0.941808, 0.336151, -0.0], - }, - Normal { - normal: [0.97869, 0.205342, 0.0], - }, - Normal { - normal: [0.997804, -0.0662397, 0.0], - }, - Normal { - normal: [0.845438, 0.403546, 0.349835], - }, - Normal { - normal: [0.869996, 0.336859, 0.360047], - }, - Normal { - normal: [0.904193, 0.205791, 0.37428], - }, - Normal { - normal: [0.921879, -0.0663697, 0.381752], - }, - Normal { - normal: [0.646802, 0.404096, 0.646802], - }, - Normal { - normal: [0.665655, 0.337351, 0.665655], - }, - Normal { - normal: [0.691923, 0.20612, 0.691923], - }, - Normal { - normal: [0.705542, -0.0664796, 0.705543], - }, - Normal { - normal: [0.349835, 0.403546, 0.845438], - }, - Normal { - normal: [0.360047, 0.336859, 0.869996], - }, - Normal { - normal: [0.37428, 0.205791, 0.904193], - }, - Normal { - normal: [0.381752, -0.0663697, 0.921879], - }, - Normal { - normal: [-0.0, 0.402725, 0.915321], - }, - Normal { - normal: [0.0, 0.336151, 0.941808], - }, - Normal { - normal: [-0.0, 0.205342, 0.97869], - }, - Normal { - normal: [-0.0, -0.0662397, 0.997804], - }, - Normal { - normal: [-0.349835, 0.403546, 0.845438], - }, - Normal { - normal: [-0.360047, 0.336859, 0.869996], - }, - Normal { - normal: [-0.37428, 0.205791, 0.904193], - }, - Normal { - normal: [-0.381752, -0.0663697, 0.921879], - }, - Normal { - normal: [-0.646802, 0.404096, 0.646802], - }, - Normal { - normal: [-0.665655, 0.337351, 0.665655], - }, - Normal { - normal: [-0.691923, 0.20612, 0.691923], - }, - Normal { - normal: [-0.705543, -0.0664796, 0.705543], - }, - Normal { - normal: [-0.845438, 0.403546, 0.349835], - }, - Normal { - normal: [-0.869996, 0.336859, 0.360047], - }, - Normal { - normal: [-0.904193, 0.205791, 0.37428], - }, - Normal { - normal: [-0.921879, -0.0663697, 0.381752], - }, - Normal { - normal: [-0.915321, 0.402725, -0.0], - }, - Normal { - normal: [-0.941808, 0.336151, -0.0], - }, - Normal { - normal: [-0.97869, 0.205342, -0.0], - }, - Normal { - normal: [-0.997804, -0.0662397, -0.0], - }, - Normal { - normal: [-0.845438, 0.403546, -0.349835], - }, - Normal { - normal: [-0.869996, 0.336859, -0.360047], - }, - Normal { - normal: [-0.904193, 0.205791, -0.37428], - }, - Normal { - normal: [-0.921879, -0.0663697, -0.381752], - }, - Normal { - normal: [-0.646802, 0.404096, -0.646802], - }, - Normal { - normal: [-0.665655, 0.337351, -0.665655], - }, - Normal { - normal: [-0.691923, 0.20612, -0.691923], - }, - Normal { - normal: [-0.705542, -0.0664796, -0.705543], - }, - Normal { - normal: [-0.349835, 0.403546, -0.845438], - }, - Normal { - normal: [-0.360047, 0.336859, -0.869996], - }, - Normal { - normal: [-0.37428, 0.205791, -0.904193], - }, - Normal { - normal: [-0.381752, -0.0663697, -0.921879], - }, - Normal { - normal: [0.0, 0.402725, -0.915321], - }, - Normal { - normal: [-0.0, 0.336151, -0.941808], - }, - Normal { - normal: [0.0, 0.205342, -0.97869], - }, - Normal { - normal: [0.0, -0.0662397, -0.997804], - }, - Normal { - normal: [0.349835, 0.403546, -0.845438], - }, - Normal { - normal: [0.360047, 0.336859, -0.869996], - }, - Normal { - normal: [0.37428, 0.205791, -0.904193], - }, - Normal { - normal: [0.381752, -0.0663697, -0.921879], - }, - Normal { - normal: [0.646802, 0.404096, -0.646802], - }, - Normal { - normal: [0.665655, 0.337351, -0.665655], - }, - Normal { - normal: [0.691923, 0.20612, -0.691923], - }, - Normal { - normal: [0.705543, -0.0664796, -0.705542], - }, - Normal { - normal: [0.845438, 0.403546, -0.349835], - }, - Normal { - normal: [0.869996, 0.336859, -0.360047], - }, - Normal { - normal: [0.904193, 0.205791, -0.37428], - }, - Normal { - normal: [0.921879, -0.0663697, -0.381752], - }, - Normal { - normal: [0.900182, -0.435513, -0.0], - }, - Normal { - normal: [0.729611, -0.683863, -0.0], - }, - Normal { - normal: [0.693951, -0.720022, -0.0], - }, - Normal { - normal: [0.79395, -0.607984, 0.0], - }, - Normal { - normal: [0.831437, -0.43618, 0.344179], - }, - Normal { - normal: [0.673512, -0.684665, 0.278594], - }, - Normal { - normal: [0.640399, -0.720924, 0.264874], - }, - Normal { - normal: [0.732949, -0.608996, 0.303166], - }, - Normal { - normal: [0.636092, -0.436777, 0.636092], - }, - Normal { - normal: [0.514965, -0.685289, 0.514965], - }, - Normal { - normal: [0.489651, -0.721446, 0.489651], - }, - Normal { - normal: [0.560555, -0.609554, 0.560555], - }, - Normal { - normal: [0.344179, -0.43618, 0.831437], - }, - Normal { - normal: [0.278594, -0.684665, 0.673512], - }, - Normal { - normal: [0.264874, -0.720924, 0.640399], - }, - Normal { - normal: [0.303166, -0.608996, 0.732949], - }, - Normal { - normal: [0.0, -0.435513, 0.900182], - }, - Normal { - normal: [-0.0, -0.683863, 0.729611], - }, - Normal { - normal: [0.0, -0.720022, 0.693951], - }, - Normal { - normal: [-0.0, -0.607984, 0.79395], - }, - Normal { - normal: [-0.344179, -0.43618, 0.831437], - }, - Normal { - normal: [-0.278594, -0.684665, 0.673512], - }, - Normal { - normal: [-0.264874, -0.720924, 0.640399], - }, - Normal { - normal: [-0.303166, -0.608996, 0.732949], - }, - Normal { - normal: [-0.636092, -0.436777, 0.636092], - }, - Normal { - normal: [-0.514965, -0.685289, 0.514965], - }, - Normal { - normal: [-0.489651, -0.721446, 0.489651], - }, - Normal { - normal: [-0.560555, -0.609554, 0.560555], - }, - Normal { - normal: [-0.831437, -0.43618, 0.344179], - }, - Normal { - normal: [-0.673512, -0.684665, 0.278595], - }, - Normal { - normal: [-0.640399, -0.720924, 0.264874], - }, - Normal { - normal: [-0.732949, -0.608996, 0.303166], - }, - Normal { - normal: [-0.900182, -0.435513, -0.0], - }, - Normal { - normal: [-0.729611, -0.683863, -0.0], - }, - Normal { - normal: [-0.693951, -0.720022, 0.0], - }, - Normal { - normal: [-0.79395, -0.607983, -0.0], - }, - Normal { - normal: [-0.831437, -0.43618, -0.344179], - }, - Normal { - normal: [-0.673512, -0.684665, -0.278594], - }, - Normal { - normal: [-0.640399, -0.720924, -0.264874], - }, - Normal { - normal: [-0.732949, -0.608996, -0.303166], - }, - Normal { - normal: [-0.636092, -0.436777, -0.636092], - }, - Normal { - normal: [-0.514965, -0.685289, -0.514965], - }, - Normal { - normal: [-0.489651, -0.721446, -0.489651], - }, - Normal { - normal: [-0.560555, -0.609554, -0.560555], - }, - Normal { - normal: [-0.344179, -0.43618, -0.831437], - }, - Normal { - normal: [-0.278594, -0.684665, -0.673512], - }, - Normal { - normal: [-0.264874, -0.720924, -0.640399], - }, - Normal { - normal: [-0.303166, -0.608996, -0.732949], - }, - Normal { - normal: [-0.0, -0.435513, -0.900182], - }, - Normal { - normal: [0.0, -0.683863, -0.729611], - }, - Normal { - normal: [-0.0, -0.720022, -0.693951], - }, - Normal { - normal: [0.0, -0.607984, -0.79395], - }, - Normal { - normal: [0.344179, -0.43618, -0.831437], - }, - Normal { - normal: [0.278594, -0.684665, -0.673512], - }, - Normal { - normal: [0.264874, -0.720924, -0.640399], - }, - Normal { - normal: [0.303167, -0.608996, -0.732949], - }, - Normal { - normal: [0.636092, -0.436777, -0.636092], - }, - Normal { - normal: [0.514965, -0.685289, -0.514965], - }, - Normal { - normal: [0.489651, -0.721446, -0.489651], - }, - Normal { - normal: [0.560555, -0.609554, -0.560555], - }, - Normal { - normal: [0.831437, -0.43618, -0.344179], - }, - Normal { - normal: [0.673512, -0.684665, -0.278595], - }, - Normal { - normal: [0.640399, -0.720924, -0.264874], - }, - Normal { - normal: [0.732949, -0.608996, -0.303166], - }, - Normal { - normal: [0.62386, -0.781536, 0.0], - }, - Normal { - normal: [0.177291, -0.984159, -0.0], - }, - Normal { - normal: [0.0492072, -0.998789, 0.0], - }, - Normal { - normal: [0.0, -1.0, -0.0], - }, - Normal { - normal: [0.576229, -0.781801, 0.238217], - }, - Normal { - normal: [0.163629, -0.984208, 0.0675273], - }, - Normal { - normal: [0.0454217, -0.998792, 0.0187357], - }, - Normal { - normal: [0.440416, -0.782348, 0.440416], - }, - Normal { - normal: [0.124903, -0.984276, 0.124903], - }, - Normal { - normal: [0.0346621, -0.998798, 0.0346621], - }, - Normal { - normal: [0.238217, -0.781801, 0.576229], - }, - Normal { - normal: [0.0675273, -0.984208, 0.163629], - }, - Normal { - normal: [0.0187357, -0.998792, 0.0454217], - }, - Normal { - normal: [-0.0, -0.781536, 0.62386], - }, - Normal { - normal: [0.0, -0.984159, 0.177291], - }, - Normal { - normal: [-0.0, -0.998789, 0.0492072], - }, - Normal { - normal: [-0.238216, -0.781801, 0.576229], - }, - Normal { - normal: [-0.0675273, -0.984208, 0.163629], - }, - Normal { - normal: [-0.0187357, -0.998792, 0.0454217], - }, - Normal { - normal: [-0.440416, -0.782348, 0.440416], - }, - Normal { - normal: [-0.124903, -0.984276, 0.124903], - }, - Normal { - normal: [-0.0346621, -0.998798, 0.0346621], - }, - Normal { - normal: [-0.576229, -0.781801, 0.238217], - }, - Normal { - normal: [-0.163629, -0.984208, 0.0675273], - }, - Normal { - normal: [-0.0454217, -0.998792, 0.0187357], - }, - Normal { - normal: [-0.62386, -0.781536, -0.0], - }, - Normal { - normal: [-0.177291, -0.984159, 0.0], - }, - Normal { - normal: [-0.0492072, -0.998789, -0.0], - }, - Normal { - normal: [-0.576229, -0.781801, -0.238217], - }, - Normal { - normal: [-0.163629, -0.984208, -0.0675273], - }, - Normal { - normal: [-0.0454217, -0.998792, -0.0187357], - }, - Normal { - normal: [-0.440416, -0.782348, -0.440416], - }, - Normal { - normal: [-0.124903, -0.984276, -0.124903], - }, - Normal { - normal: [-0.0346621, -0.998798, -0.0346621], - }, - Normal { - normal: [-0.238217, -0.781801, -0.576229], - }, - Normal { - normal: [-0.0675273, -0.984208, -0.163629], - }, - Normal { - normal: [-0.0187357, -0.998792, -0.0454217], - }, - Normal { - normal: [0.0, -0.781536, -0.62386], - }, - Normal { - normal: [-0.0, -0.984159, -0.177291], - }, - Normal { - normal: [0.0, -0.998789, -0.0492072], - }, - Normal { - normal: [0.238217, -0.781801, -0.576229], - }, - Normal { - normal: [0.0675273, -0.984208, -0.163629], - }, - Normal { - normal: [0.0187357, -0.998792, -0.0454217], - }, - Normal { - normal: [0.440416, -0.782348, -0.440416], - }, - Normal { - normal: [0.124903, -0.984276, -0.124903], - }, - Normal { - normal: [0.0346621, -0.998798, -0.0346621], - }, - Normal { - normal: [0.576229, -0.781801, -0.238217], - }, - Normal { - normal: [0.163629, -0.984208, -0.0675273], - }, - Normal { - normal: [0.0454217, -0.998792, -0.0187357], - }, - Normal { - normal: [0.00778619, -0.99997, -0.000215809], - }, - Normal { - normal: [0.0391385, -0.999233, -0.000988567], - }, - Normal { - normal: [0.179511, -0.983746, -0.00436856], - }, - Normal { - normal: [0.6123, -0.790556, -0.0104598], - }, - Normal { - normal: [0.986152, -0.165707, -0.00666949], - }, - Normal { - normal: [0.00703893, -0.812495, 0.582926], - }, - Normal { - normal: [0.0361273, -0.837257, 0.545614], - }, - Normal { - normal: [0.161845, -0.810421, 0.563048], - }, - Normal { - normal: [0.482365, -0.595148, 0.642746], - }, - Normal { - normal: [0.73872, -0.114593, 0.664199], - }, - Normal { - normal: [-0.00190867, 0.162121, 0.986769], - }, - Normal { - normal: [0.0027616, 0.0171073, 0.99985], - }, - Normal { - normal: [0.0105326, 0.0733989, 0.997247], - }, - Normal { - normal: [-0.0660406, 0.130069, 0.989303], - }, - Normal { - normal: [-0.0944272, 0.0165946, 0.995393], - }, - Normal { - normal: [-0.009203, 0.871509, 0.490293], - }, - Normal { - normal: [-0.0486064, 0.840609, 0.539457], - }, - Normal { - normal: [-0.223298, 0.802881, 0.552739], - }, - Normal { - normal: [-0.596365, 0.559971, 0.575135], - }, - Normal { - normal: [-0.803337, 0.0682361, 0.591602], - }, - Normal { - normal: [-0.0105609, 0.999944, 0.000103364], - }, - Normal { - normal: [-0.0587986, 0.99827, 0.000709759], - }, - Normal { - normal: [-0.28071, 0.959787, 0.00326876], - }, - Normal { - normal: [-0.749723, 0.661738, 0.0042684], - }, - Normal { - normal: [-0.997351, 0.0727144, 0.00205923], - }, - Normal { - normal: [-0.00879197, 0.871493, -0.49033], - }, - Normal { - normal: [-0.0464937, 0.841178, -0.538756], - }, - Normal { - normal: [-0.217909, 0.806807, -0.549161], - }, - Normal { - normal: [-0.597291, 0.560026, -0.574121], - }, - Normal { - normal: [-0.804, 0.0629127, -0.591291], - }, - Normal { - normal: [-0.00180555, 0.161691, -0.98684], - }, - Normal { - normal: [0.00203087, 0.014555, -0.999892], - }, - Normal { - normal: [0.00921499, 0.0600698, -0.998152], - }, - Normal { - normal: [-0.0593333, 0.113865, -0.991723], - }, - Normal { - normal: [-0.0868992, 0.0122903, -0.996141], - }, - Normal { - normal: [0.00641779, -0.812379, -0.583094], - }, - Normal { - normal: [0.0337833, -0.837512, -0.545373], - }, - Normal { - normal: [0.157112, -0.811947, -0.56219], - }, - Normal { - normal: [0.484407, -0.589365, -0.646528], - }, - Normal { - normal: [0.73887, -0.10132, -0.666187], - }, - Normal { - normal: [0.946512, 0.32265, -0.0033571], - }, - Normal { - normal: [0.82583, 0.56387, -0.00745213], - }, - Normal { - normal: [0.650011, 0.759893, -0.00693681], - }, - Normal { - normal: [0.532429, 0.846458, -0.00524544], - }, - Normal { - normal: [0.725608, 0.259351, 0.637362], - }, - Normal { - normal: [0.645945, 0.461988, 0.607719], - }, - Normal { - normal: [0.531614, 0.63666, 0.558615], - }, - Normal { - normal: [0.424964, 0.681717, 0.59554], - }, - Normal { - normal: [-0.0495616, -0.019755, 0.998576], - }, - Normal { - normal: [-0.0378162, -0.0356243, 0.99865], - }, - Normal { - normal: [-0.0379139, -0.0365122, 0.998614], - }, - Normal { - normal: [-0.168854, -0.297946, 0.93953], - }, - Normal { - normal: [-0.742342, -0.299166, 0.599523], - }, - Normal { - normal: [-0.619602, -0.529406, 0.579503], - }, - Normal { - normal: [-0.483708, -0.685761, 0.543837], - }, - Normal { - normal: [-0.445293, -0.794355, 0.413176], - }, - Normal { - normal: [-0.926513, -0.376257, 0.00199587], - }, - Normal { - normal: [-0.75392, -0.656952, 0.00431723], - }, - Normal { - normal: [-0.566224, -0.824244, 0.00346105], - }, - Normal { - normal: [-0.481804, -0.876277, 0.00185047], - }, - Normal { - normal: [-0.744675, -0.294424, -0.598977], - }, - Normal { - normal: [-0.621949, -0.528114, -0.578165], - }, - Normal { - normal: [-0.481171, -0.68834, -0.542828], - }, - Normal { - normal: [-0.438055, -0.797035, -0.415744], - }, - Normal { - normal: [-0.0443368, -0.0170558, -0.998871], - }, - Normal { - normal: [-0.0261761, -0.0281665, -0.99926], - }, - Normal { - normal: [-0.0252939, -0.0283323, -0.999278], - }, - Normal { - normal: [-0.157482, -0.289392, -0.944167], - }, - Normal { - normal: [0.728244, 0.25241, -0.637142], - }, - Normal { - normal: [0.647055, 0.459725, -0.608254], - }, - Normal { - normal: [0.522994, 0.640657, -0.562171], - }, - Normal { - normal: [0.409978, 0.682857, -0.604669], - }, - Normal { - normal: [-0.230787, 0.972982, -0.00652338], - }, - Normal { - normal: [-0.548936, 0.835863, -0.00151111], - }, - Normal { - normal: [-0.875671, 0.482807, 0.00989278], - }, - Normal { - normal: [-0.877554, 0.479097, 0.0190923], - }, - Normal { - normal: [-0.69619, 0.717439, 0.024497], - }, - Normal { - normal: [-0.152878, 0.687211, 0.71019], - }, - Normal { - normal: [-0.316721, 0.63775, 0.702113], - }, - Normal { - normal: [-0.601067, 0.471452, 0.64533], - }, - Normal { - normal: [-0.635889, 0.44609, 0.6298], - }, - Normal { - normal: [-0.435746, 0.601008, 0.670011], - }, - Normal { - normal: [0.111112, -0.0850694, 0.99016], - }, - Normal { - normal: [0.22331, 0.00654036, 0.974726], - }, - Normal { - normal: [0.190097, 0.154964, 0.969458], - }, - Normal { - normal: [0.00527077, 0.189482, 0.98187], - }, - Normal { - normal: [-0.0117518, 0.246688, 0.969024], - }, - Normal { - normal: [0.343906, -0.722796, 0.599412], - }, - Normal { - normal: [0.572489, -0.567656, 0.591627], - }, - Normal { - normal: [0.787436, -0.256459, 0.560512], - }, - Normal { - normal: [0.647097, -0.306374, 0.698141], - }, - Normal { - normal: [0.427528, -0.499343, 0.753576], - }, - Normal { - normal: [0.410926, -0.911668, 0.00128446], - }, - Normal { - normal: [0.67152, -0.740986, -0.000899122], - }, - Normal { - normal: [0.922026, -0.38706, -0.00725269], - }, - Normal { - normal: [0.84691, -0.531556, -0.0138542], - }, - Normal { - normal: [0.535925, -0.8442, -0.0105045], - }, - Normal { - normal: [0.341188, -0.722822, -0.600931], - }, - Normal { - normal: [0.578664, -0.561139, -0.591838], - }, - Normal { - normal: [0.784869, -0.25102, -0.566542], - }, - Normal { - normal: [0.642681, -0.302257, -0.70399], - }, - Normal { - normal: [0.418589, -0.500042, -0.758117], - }, - Normal { - normal: [0.115806, -0.0791394, -0.990114], - }, - Normal { - normal: [0.232811, 0.0125652, -0.972441], - }, - Normal { - normal: [0.206662, 0.153601, -0.96628], - }, - Normal { - normal: [0.0244996, 0.161443, -0.986578], - }, - Normal { - normal: [0.00338193, 0.211115, -0.977455], - }, - Normal { - normal: [-0.134912, 0.687491, -0.713551], - }, - Normal { - normal: [-0.31954, 0.633073, -0.705062], - }, - Normal { - normal: [-0.603902, 0.461442, -0.649903], - }, - Normal { - normal: [-0.631816, 0.437169, -0.640072], - }, - Normal { - normal: [-0.424306, 0.612706, -0.66675], - }, - Normal { - normal: [-0.4258, 0.904753, 0.0108049], - }, - Normal { - normal: [0.0220472, 0.999756, 0.00162273], - }, - Normal { - normal: [0.999599, 0.0258705, 0.0115556], - }, - Normal { - normal: [0.709585, -0.704553, 0.00967183], - }, - Normal { - normal: [-0.259858, 0.791936, 0.552549], - }, - Normal { - normal: [0.00953916, 0.99972, -0.0216718], - }, - Normal { - normal: [0.410156, 0.332912, -0.849083], - }, - Normal { - normal: [0.541523, -0.54862, -0.637], - }, - Normal { - normal: [0.0463104, 0.455224, 0.889172], - }, - Normal { - normal: [-0.0106883, 0.988794, 0.148901], - }, - Normal { - normal: [-0.0443756, 0.682947, -0.729118], - }, - Normal { - normal: [0.122825, 0.00923214, -0.992385], - }, - Normal { - normal: [0.481839, -0.180439, 0.85748], - }, - Normal { - normal: [0.455272, 0.736752, 0.499925], - }, - Normal { - normal: [-0.220542, 0.907193, -0.358276], - }, - Normal { - normal: [-0.23592, 0.657249, -0.715797], - }, - Normal { - normal: [0.728092, -0.685302, -0.0155853], - }, - Normal { - normal: [0.888739, 0.45811, -0.0166791], - }, - Normal { - normal: [-0.260097, 0.965582, 0.000800195], - }, - Normal { - normal: [-0.371612, 0.928378, -0.00441745], - }, - Normal { - normal: [0.480166, -0.17836, -0.858853], - }, - Normal { - normal: [0.488103, 0.716801, -0.497947], - }, - Normal { - normal: [-0.222004, 0.905399, 0.361893], - }, - Normal { - normal: [-0.235405, 0.66318, 0.710477], - }, - Normal { - normal: [0.0587203, 0.437704, -0.8972], - }, - Normal { - normal: [0.00132612, 0.986459, -0.164003], - }, - Normal { - normal: [-0.0441901, 0.681677, 0.730317], - }, - Normal { - normal: [0.138801, -0.0341896, 0.98973], - }, - Normal { - normal: [-0.25889, 0.797206, -0.54538], - }, - Normal { - normal: [0.0122703, 0.999739, 0.0192865], - }, - Normal { - normal: [0.39863, 0.35489, 0.845663], - }, - Normal { - normal: [0.537564, -0.5814, 0.610737], - }, - Normal { - normal: [-0.0, 1.0, 0.0], - }, - Normal { - normal: [0.82454, 0.565804, 0.0], - }, - Normal { - normal: [0.917701, -0.397272, 0.0], - }, - Normal { - normal: [0.935269, -0.353939, 0.000112842], - }, - Normal { - normal: [0.780712, 0.624891, 0.0], - }, - Normal { - normal: [0.762641, 0.565035, 0.314825], - }, - Normal { - normal: [0.847982, -0.397998, 0.350034], - }, - Normal { - normal: [0.864141, -0.355261, 0.356441], - }, - Normal { - normal: [0.720991, 0.625625, 0.297933], - }, - Normal { - normal: [0.583357, 0.565165, 0.583338], - }, - Normal { - normal: [0.648485, -0.398726, 0.648448], - }, - Normal { - normal: [0.660872, -0.355894, 0.660748], - }, - Normal { - normal: [0.551862, 0.62529, 0.55178], - }, - Normal { - normal: [0.314824, 0.565051, 0.762629], - }, - Normal { - normal: [0.350045, -0.397976, 0.847988], - }, - Normal { - normal: [0.356474, -0.3552, 0.864153], - }, - Normal { - normal: [0.297983, 0.625515, 0.721067], - }, - Normal { - normal: [-0.0, 0.565804, 0.82454], - }, - Normal { - normal: [-0.0, -0.397272, 0.917701], - }, - Normal { - normal: [-0.000112839, -0.353939, 0.935269], - }, - Normal { - normal: [-0.0, 0.624891, 0.780712], - }, - Normal { - normal: [-0.314825, 0.565035, 0.762641], - }, - Normal { - normal: [-0.350034, -0.397998, 0.847982], - }, - Normal { - normal: [-0.356441, -0.355261, 0.864141], - }, - Normal { - normal: [-0.297933, 0.625625, 0.720991], - }, - Normal { - normal: [-0.583338, 0.565165, 0.583357], - }, - Normal { - normal: [-0.648448, -0.398726, 0.648485], - }, - Normal { - normal: [-0.660748, -0.355894, 0.660872], - }, - Normal { - normal: [-0.55178, 0.62529, 0.551862], - }, - Normal { - normal: [-0.762629, 0.565051, 0.314824], - }, - Normal { - normal: [-0.847988, -0.397976, 0.350045], - }, - Normal { - normal: [-0.864153, -0.3552, 0.356474], - }, - Normal { - normal: [-0.721067, 0.625515, 0.297983], - }, - Normal { - normal: [-0.82454, 0.565804, -0.0], - }, - Normal { - normal: [-0.917701, -0.397272, -0.0], - }, - Normal { - normal: [-0.935269, -0.353939, -0.000112839], - }, - Normal { - normal: [-0.780712, 0.624891, -0.0], - }, - Normal { - normal: [-0.76264, 0.565035, -0.314825], - }, - Normal { - normal: [-0.847982, -0.397998, -0.350034], - }, - Normal { - normal: [-0.864141, -0.355261, -0.356441], - }, - Normal { - normal: [-0.720991, 0.625625, -0.297933], - }, - Normal { - normal: [-0.583357, 0.565165, -0.583338], - }, - Normal { - normal: [-0.648485, -0.398726, -0.648448], - }, - Normal { - normal: [-0.660872, -0.355894, -0.660748], - }, - Normal { - normal: [-0.551862, 0.62529, -0.55178], - }, - Normal { - normal: [-0.314824, 0.565051, -0.762629], - }, - Normal { - normal: [-0.350045, -0.397976, -0.847988], - }, - Normal { - normal: [-0.356474, -0.3552, -0.864153], - }, - Normal { - normal: [-0.297983, 0.625515, -0.721067], - }, - Normal { - normal: [0.0, 0.565804, -0.82454], - }, - Normal { - normal: [0.0, -0.397272, -0.917701], - }, - Normal { - normal: [0.000112839, -0.353939, -0.935269], - }, - Normal { - normal: [0.0, 0.624891, -0.780712], - }, - Normal { - normal: [0.314825, 0.565035, -0.762641], - }, - Normal { - normal: [0.350034, -0.397998, -0.847982], - }, - Normal { - normal: [0.356441, -0.355261, -0.864141], - }, - Normal { - normal: [0.297933, 0.625625, -0.720991], - }, - Normal { - normal: [0.583338, 0.565165, -0.583357], - }, - Normal { - normal: [0.648448, -0.398726, -0.648485], - }, - Normal { - normal: [0.660748, -0.355894, -0.660872], - }, - Normal { - normal: [0.55178, 0.62529, -0.551862], - }, - Normal { - normal: [0.762629, 0.565051, -0.314824], - }, - Normal { - normal: [0.847988, -0.397976, -0.350045], - }, - Normal { - normal: [0.864153, -0.3552, -0.356474], - }, - Normal { - normal: [0.721067, 0.625515, -0.297983], - }, - Normal { - normal: [0.236584, 0.971611, 0.0], - }, - Normal { - normal: [0.173084, 0.984907, -0.0], - }, - Normal { - normal: [0.379703, 0.925108, 0.0], - }, - Normal { - normal: [0.526673, 0.850068, 0.0], - }, - Normal { - normal: [0.217978, 0.971775, 0.0902162], - }, - Normal { - normal: [0.15959, 0.984977, 0.0659615], - }, - Normal { - normal: [0.350498, 0.925312, 0.14474], - }, - Normal { - normal: [0.48559, 0.850653, 0.201474], - }, - Normal { - normal: [0.166631, 0.971838, 0.166631], - }, - Normal { - normal: [0.121908, 0.985026, 0.121908], - }, - Normal { - normal: [0.267668, 0.925585, 0.267668], - }, - Normal { - normal: [0.371315, 0.851029, 0.371315], - }, - Normal { - normal: [0.0902162, 0.971775, 0.217978], - }, - Normal { - normal: [0.0659615, 0.984977, 0.15959], - }, - Normal { - normal: [0.14474, 0.925312, 0.350498], - }, - Normal { - normal: [0.201474, 0.850653, 0.48559], - }, - Normal { - normal: [-0.0, 0.971611, 0.236584], - }, - Normal { - normal: [0.0, 0.984907, 0.173084], - }, - Normal { - normal: [0.0, 0.925108, 0.379703], - }, - Normal { - normal: [0.0, 0.850068, 0.526673], - }, - Normal { - normal: [-0.0902162, 0.971775, 0.217978], - }, - Normal { - normal: [-0.0659615, 0.984977, 0.15959], - }, - Normal { - normal: [-0.14474, 0.925312, 0.350498], - }, - Normal { - normal: [-0.201474, 0.850653, 0.48559], - }, - Normal { - normal: [-0.166631, 0.971838, 0.166631], - }, - Normal { - normal: [-0.121908, 0.985026, 0.121908], - }, - Normal { - normal: [-0.267668, 0.925585, 0.267668], - }, - Normal { - normal: [-0.371315, 0.851029, 0.371315], - }, - Normal { - normal: [-0.217978, 0.971775, 0.0902162], - }, - Normal { - normal: [-0.15959, 0.984977, 0.0659615], - }, - Normal { - normal: [-0.350498, 0.925312, 0.14474], - }, - Normal { - normal: [-0.48559, 0.850653, 0.201474], - }, - Normal { - normal: [-0.236583, 0.971611, -0.0], - }, - Normal { - normal: [-0.173084, 0.984907, 0.0], - }, - Normal { - normal: [-0.379703, 0.925108, -0.0], - }, - Normal { - normal: [-0.526673, 0.850068, 0.0], - }, - Normal { - normal: [-0.217978, 0.971775, -0.0902162], - }, - Normal { - normal: [-0.15959, 0.984977, -0.0659615], - }, - Normal { - normal: [-0.350498, 0.925312, -0.14474], - }, - Normal { - normal: [-0.48559, 0.850653, -0.201474], - }, - Normal { - normal: [-0.166631, 0.971838, -0.166631], - }, - Normal { - normal: [-0.121908, 0.985026, -0.121908], - }, - Normal { - normal: [-0.267668, 0.925585, -0.267668], - }, - Normal { - normal: [-0.371315, 0.851029, -0.371315], - }, - Normal { - normal: [-0.0902162, 0.971775, -0.217978], - }, - Normal { - normal: [-0.0659615, 0.984977, -0.15959], - }, - Normal { - normal: [-0.14474, 0.925312, -0.350498], - }, - Normal { - normal: [-0.201474, 0.850653, -0.485589], - }, - Normal { - normal: [0.0, 0.971611, -0.236584], - }, - Normal { - normal: [-0.0, 0.984907, -0.173084], - }, - Normal { - normal: [-0.0, 0.925108, -0.379703], - }, - Normal { - normal: [-0.0, 0.850068, -0.526673], - }, - Normal { - normal: [0.0902162, 0.971775, -0.217978], - }, - Normal { - normal: [0.0659615, 0.984977, -0.15959], - }, - Normal { - normal: [0.14474, 0.925312, -0.350498], - }, - Normal { - normal: [0.201474, 0.850653, -0.48559], - }, - Normal { - normal: [0.166631, 0.971838, -0.166631], - }, - Normal { - normal: [0.121908, 0.985026, -0.121908], - }, - Normal { - normal: [0.267668, 0.925585, -0.267668], - }, - Normal { - normal: [0.371315, 0.851029, -0.371315], - }, - Normal { - normal: [0.217978, 0.971775, -0.0902162], - }, - Normal { - normal: [0.15959, 0.984977, -0.0659615], - }, - Normal { - normal: [0.350498, 0.925312, -0.14474], - }, - Normal { - normal: [0.48559, 0.850653, -0.201474], - }, -]; - -pub const INDICES: [u16; 3072] = [ - 7, 6, 1, 1, 2, 7, 8, 7, 2, 2, 3, 8, 9, 8, 3, 3, 4, 9, 10, 9, 4, 4, 5, 10, 12, 11, 6, 6, 7, 12, - 13, 12, 7, 7, 8, 13, 14, 13, 8, 8, 9, 14, 15, 14, 9, 9, 10, 15, 17, 16, 11, 11, 12, 17, 18, 17, - 12, 12, 13, 18, 19, 18, 13, 13, 14, 19, 20, 19, 14, 14, 15, 20, 22, 21, 16, 16, 17, 22, 23, 22, - 17, 17, 18, 23, 24, 23, 18, 18, 19, 24, 25, 24, 19, 19, 20, 25, 27, 26, 21, 21, 22, 27, 28, 27, - 22, 22, 23, 28, 29, 28, 23, 23, 24, 29, 30, 29, 24, 24, 25, 30, 32, 31, 26, 26, 27, 32, 33, 32, - 27, 27, 28, 33, 34, 33, 28, 28, 29, 34, 35, 34, 29, 29, 30, 35, 37, 36, 31, 31, 32, 37, 38, 37, - 32, 32, 33, 38, 39, 38, 33, 33, 34, 39, 40, 39, 34, 34, 35, 40, 42, 41, 36, 36, 37, 42, 43, 42, - 37, 37, 38, 43, 44, 43, 38, 38, 39, 44, 45, 44, 39, 39, 40, 45, 47, 46, 41, 41, 42, 47, 48, 47, - 42, 42, 43, 48, 49, 48, 43, 43, 44, 49, 50, 49, 44, 44, 45, 50, 52, 51, 46, 46, 47, 52, 53, 52, - 47, 47, 48, 53, 54, 53, 48, 48, 49, 54, 55, 54, 49, 49, 50, 55, 57, 56, 51, 51, 52, 57, 58, 57, - 52, 52, 53, 58, 59, 58, 53, 53, 54, 59, 60, 59, 54, 54, 55, 60, 62, 61, 56, 56, 57, 62, 63, 62, - 57, 57, 58, 63, 64, 63, 58, 58, 59, 64, 65, 64, 59, 59, 60, 65, 67, 66, 61, 61, 62, 67, 68, 67, - 62, 62, 63, 68, 69, 68, 63, 63, 64, 69, 70, 69, 64, 64, 65, 70, 72, 71, 66, 66, 67, 72, 73, 72, - 67, 67, 68, 73, 74, 73, 68, 68, 69, 74, 75, 74, 69, 69, 70, 75, 77, 76, 71, 71, 72, 77, 78, 77, - 72, 72, 73, 78, 79, 78, 73, 73, 74, 79, 80, 79, 74, 74, 75, 80, 2, 1, 76, 76, 77, 2, 3, 2, 77, - 77, 78, 3, 4, 3, 78, 78, 79, 4, 5, 4, 79, 79, 80, 5, 85, 10, 5, 5, 81, 85, 86, 85, 81, 81, 82, - 86, 87, 86, 82, 82, 83, 87, 88, 87, 83, 83, 84, 88, 89, 15, 10, 10, 85, 89, 90, 89, 85, 85, 86, - 90, 91, 90, 86, 86, 87, 91, 92, 91, 87, 87, 88, 92, 93, 20, 15, 15, 89, 93, 94, 93, 89, 89, 90, - 94, 95, 94, 90, 90, 91, 95, 96, 95, 91, 91, 92, 96, 97, 25, 20, 20, 93, 97, 98, 97, 93, 93, 94, - 98, 99, 98, 94, 94, 95, 99, 100, 99, 95, 95, 96, 100, 101, 30, 25, 25, 97, 101, 102, 101, 97, - 97, 98, 102, 103, 102, 98, 98, 99, 103, 104, 103, 99, 99, 100, 104, 105, 35, 30, 30, 101, 105, - 106, 105, 101, 101, 102, 106, 107, 106, 102, 102, 103, 107, 108, 107, 103, 103, 104, 108, 109, - 40, 35, 35, 105, 109, 110, 109, 105, 105, 106, 110, 111, 110, 106, 106, 107, 111, 112, 111, - 107, 107, 108, 112, 113, 45, 40, 40, 109, 113, 114, 113, 109, 109, 110, 114, 115, 114, 110, - 110, 111, 115, 116, 115, 111, 111, 112, 116, 117, 50, 45, 45, 113, 117, 118, 117, 113, 113, - 114, 118, 119, 118, 114, 114, 115, 119, 120, 119, 115, 115, 116, 120, 121, 55, 50, 50, 117, - 121, 122, 121, 117, 117, 118, 122, 123, 122, 118, 118, 119, 123, 124, 123, 119, 119, 120, 124, - 125, 60, 55, 55, 121, 125, 126, 125, 121, 121, 122, 126, 127, 126, 122, 122, 123, 127, 128, - 127, 123, 123, 124, 128, 129, 65, 60, 60, 125, 129, 130, 129, 125, 125, 126, 130, 131, 130, - 126, 126, 127, 131, 132, 131, 127, 127, 128, 132, 133, 70, 65, 65, 129, 133, 134, 133, 129, - 129, 130, 134, 135, 134, 130, 130, 131, 135, 136, 135, 131, 131, 132, 136, 137, 75, 70, 70, - 133, 137, 138, 137, 133, 133, 134, 138, 139, 138, 134, 134, 135, 139, 140, 139, 135, 135, 136, - 140, 141, 80, 75, 75, 137, 141, 142, 141, 137, 137, 138, 142, 143, 142, 138, 138, 139, 143, - 144, 143, 139, 139, 140, 144, 81, 5, 80, 80, 141, 81, 82, 81, 141, 141, 142, 82, 83, 82, 142, - 142, 143, 83, 84, 83, 143, 143, 144, 84, 149, 88, 84, 84, 145, 149, 150, 149, 145, 145, 146, - 150, 151, 150, 146, 146, 147, 151, 152, 151, 147, 147, 148, 152, 153, 92, 88, 88, 149, 153, - 154, 153, 149, 149, 150, 154, 155, 154, 150, 150, 151, 155, 156, 155, 151, 151, 152, 156, 157, - 96, 92, 92, 153, 157, 158, 157, 153, 153, 154, 158, 159, 158, 154, 154, 155, 159, 160, 159, - 155, 155, 156, 160, 161, 100, 96, 96, 157, 161, 162, 161, 157, 157, 158, 162, 163, 162, 158, - 158, 159, 163, 164, 163, 159, 159, 160, 164, 165, 104, 100, 100, 161, 165, 166, 165, 161, 161, - 162, 166, 167, 166, 162, 162, 163, 167, 168, 167, 163, 163, 164, 168, 169, 108, 104, 104, 165, - 169, 170, 169, 165, 165, 166, 170, 171, 170, 166, 166, 167, 171, 172, 171, 167, 167, 168, 172, - 173, 112, 108, 108, 169, 173, 174, 173, 169, 169, 170, 174, 175, 174, 170, 170, 171, 175, 176, - 175, 171, 171, 172, 176, 177, 116, 112, 112, 173, 177, 178, 177, 173, 173, 174, 178, 179, 178, - 174, 174, 175, 179, 180, 179, 175, 175, 176, 180, 181, 120, 116, 116, 177, 181, 182, 181, 177, - 177, 178, 182, 183, 182, 178, 178, 179, 183, 184, 183, 179, 179, 180, 184, 185, 124, 120, 120, - 181, 185, 186, 185, 181, 181, 182, 186, 187, 186, 182, 182, 183, 187, 188, 187, 183, 183, 184, - 188, 189, 128, 124, 124, 185, 189, 190, 189, 185, 185, 186, 190, 191, 190, 186, 186, 187, 191, - 192, 191, 187, 187, 188, 192, 193, 132, 128, 128, 189, 193, 194, 193, 189, 189, 190, 194, 195, - 194, 190, 190, 191, 195, 196, 195, 191, 191, 192, 196, 197, 136, 132, 132, 193, 197, 198, 197, - 193, 193, 194, 198, 199, 198, 194, 194, 195, 199, 200, 199, 195, 195, 196, 200, 201, 140, 136, - 136, 197, 201, 202, 201, 197, 197, 198, 202, 203, 202, 198, 198, 199, 203, 204, 203, 199, 199, - 200, 204, 205, 144, 140, 140, 201, 205, 206, 205, 201, 201, 202, 206, 207, 206, 202, 202, 203, - 207, 208, 207, 203, 203, 204, 208, 145, 84, 144, 144, 205, 145, 146, 145, 205, 205, 206, 146, - 147, 146, 206, 206, 207, 147, 148, 147, 207, 207, 208, 148, 213, 152, 148, 148, 209, 213, 214, - 213, 209, 209, 210, 214, 215, 214, 210, 210, 211, 215, 212, 215, 211, 211, 212, 212, 216, 156, - 152, 152, 213, 216, 217, 216, 213, 213, 214, 217, 218, 217, 214, 214, 215, 218, 212, 218, 215, - 215, 212, 212, 219, 160, 156, 156, 216, 219, 220, 219, 216, 216, 217, 220, 221, 220, 217, 217, - 218, 221, 212, 221, 218, 218, 212, 212, 222, 164, 160, 160, 219, 222, 223, 222, 219, 219, 220, - 223, 224, 223, 220, 220, 221, 224, 212, 224, 221, 221, 212, 212, 225, 168, 164, 164, 222, 225, - 226, 225, 222, 222, 223, 226, 227, 226, 223, 223, 224, 227, 212, 227, 224, 224, 212, 212, 228, - 172, 168, 168, 225, 228, 229, 228, 225, 225, 226, 229, 230, 229, 226, 226, 227, 230, 212, 230, - 227, 227, 212, 212, 231, 176, 172, 172, 228, 231, 232, 231, 228, 228, 229, 232, 233, 232, 229, - 229, 230, 233, 212, 233, 230, 230, 212, 212, 234, 180, 176, 176, 231, 234, 235, 234, 231, 231, - 232, 235, 236, 235, 232, 232, 233, 236, 212, 236, 233, 233, 212, 212, 237, 184, 180, 180, 234, - 237, 238, 237, 234, 234, 235, 238, 239, 238, 235, 235, 236, 239, 212, 239, 236, 236, 212, 212, - 240, 188, 184, 184, 237, 240, 241, 240, 237, 237, 238, 241, 242, 241, 238, 238, 239, 242, 212, - 242, 239, 239, 212, 212, 243, 192, 188, 188, 240, 243, 244, 243, 240, 240, 241, 244, 245, 244, - 241, 241, 242, 245, 212, 245, 242, 242, 212, 212, 246, 196, 192, 192, 243, 246, 247, 246, 243, - 243, 244, 247, 248, 247, 244, 244, 245, 248, 212, 248, 245, 245, 212, 212, 249, 200, 196, 196, - 246, 249, 250, 249, 246, 246, 247, 250, 251, 250, 247, 247, 248, 251, 212, 251, 248, 248, 212, - 212, 252, 204, 200, 200, 249, 252, 253, 252, 249, 249, 250, 253, 254, 253, 250, 250, 251, 254, - 212, 254, 251, 251, 212, 212, 255, 208, 204, 204, 252, 255, 256, 255, 252, 252, 253, 256, 257, - 256, 253, 253, 254, 257, 212, 257, 254, 254, 212, 212, 209, 148, 208, 208, 255, 209, 210, 209, - 255, 255, 256, 210, 211, 210, 256, 256, 257, 211, 212, 211, 257, 257, 212, 212, 264, 263, 258, - 258, 259, 264, 265, 264, 259, 259, 260, 265, 266, 265, 260, 260, 261, 266, 267, 266, 261, 261, - 262, 267, 269, 268, 263, 263, 264, 269, 270, 269, 264, 264, 265, 270, 271, 270, 265, 265, 266, - 271, 272, 271, 266, 266, 267, 272, 274, 273, 268, 268, 269, 274, 275, 274, 269, 269, 270, 275, - 276, 275, 270, 270, 271, 276, 277, 276, 271, 271, 272, 277, 279, 278, 273, 273, 274, 279, 280, - 279, 274, 274, 275, 280, 281, 280, 275, 275, 276, 281, 282, 281, 276, 276, 277, 282, 284, 283, - 278, 278, 279, 284, 285, 284, 279, 279, 280, 285, 286, 285, 280, 280, 281, 286, 287, 286, 281, - 281, 282, 287, 289, 288, 283, 283, 284, 289, 290, 289, 284, 284, 285, 290, 291, 290, 285, 285, - 286, 291, 292, 291, 286, 286, 287, 292, 294, 293, 288, 288, 289, 294, 295, 294, 289, 289, 290, - 295, 296, 295, 290, 290, 291, 296, 297, 296, 291, 291, 292, 297, 259, 258, 293, 293, 294, 259, - 260, 259, 294, 294, 295, 260, 261, 260, 295, 295, 296, 261, 262, 261, 296, 296, 297, 262, 302, - 267, 262, 262, 298, 302, 303, 302, 298, 298, 299, 303, 304, 303, 299, 299, 300, 304, 305, 304, - 300, 300, 301, 305, 306, 272, 267, 267, 302, 306, 307, 306, 302, 302, 303, 307, 308, 307, 303, - 303, 304, 308, 309, 308, 304, 304, 305, 309, 310, 277, 272, 272, 306, 310, 311, 310, 306, 306, - 307, 311, 312, 311, 307, 307, 308, 312, 313, 312, 308, 308, 309, 313, 314, 282, 277, 277, 310, - 314, 315, 314, 310, 310, 311, 315, 316, 315, 311, 311, 312, 316, 317, 316, 312, 312, 313, 317, - 318, 287, 282, 282, 314, 318, 319, 318, 314, 314, 315, 319, 320, 319, 315, 315, 316, 320, 321, - 320, 316, 316, 317, 321, 322, 292, 287, 287, 318, 322, 323, 322, 318, 318, 319, 323, 324, 323, - 319, 319, 320, 324, 325, 324, 320, 320, 321, 325, 326, 297, 292, 292, 322, 326, 327, 326, 322, - 322, 323, 327, 328, 327, 323, 323, 324, 328, 329, 328, 324, 324, 325, 329, 298, 262, 297, 297, - 326, 298, 299, 298, 326, 326, 327, 299, 300, 299, 327, 327, 328, 300, 301, 300, 328, 328, 329, - 301, 336, 335, 330, 330, 331, 336, 337, 336, 331, 331, 332, 337, 338, 337, 332, 332, 333, 338, - 339, 338, 333, 333, 334, 339, 341, 340, 335, 335, 336, 341, 342, 341, 336, 336, 337, 342, 343, - 342, 337, 337, 338, 343, 344, 343, 338, 338, 339, 344, 346, 345, 340, 340, 341, 346, 347, 346, - 341, 341, 342, 347, 348, 347, 342, 342, 343, 348, 349, 348, 343, 343, 344, 349, 351, 350, 345, - 345, 346, 351, 352, 351, 346, 346, 347, 352, 353, 352, 347, 347, 348, 353, 354, 353, 348, 348, - 349, 354, 356, 355, 350, 350, 351, 356, 357, 356, 351, 351, 352, 357, 358, 357, 352, 352, 353, - 358, 359, 358, 353, 353, 354, 359, 361, 360, 355, 355, 356, 361, 362, 361, 356, 356, 357, 362, - 363, 362, 357, 357, 358, 363, 364, 363, 358, 358, 359, 364, 366, 365, 360, 360, 361, 366, 367, - 366, 361, 361, 362, 367, 368, 367, 362, 362, 363, 368, 369, 368, 363, 363, 364, 369, 331, 330, - 365, 365, 366, 331, 332, 331, 366, 366, 367, 332, 333, 332, 367, 367, 368, 333, 334, 333, 368, - 368, 369, 334, 374, 339, 334, 334, 370, 374, 375, 374, 370, 370, 371, 375, 376, 375, 371, 371, - 372, 376, 377, 376, 372, 372, 373, 377, 378, 344, 339, 339, 374, 378, 379, 378, 374, 374, 375, - 379, 380, 379, 375, 375, 376, 380, 381, 380, 376, 376, 377, 381, 382, 349, 344, 344, 378, 382, - 383, 382, 378, 378, 379, 383, 384, 383, 379, 379, 380, 384, 385, 384, 380, 380, 381, 385, 386, - 354, 349, 349, 382, 386, 387, 386, 382, 382, 383, 387, 388, 387, 383, 383, 384, 388, 389, 388, - 384, 384, 385, 389, 390, 359, 354, 354, 386, 390, 391, 390, 386, 386, 387, 391, 392, 391, 387, - 387, 388, 392, 393, 392, 388, 388, 389, 393, 394, 364, 359, 359, 390, 394, 395, 394, 390, 390, - 391, 395, 396, 395, 391, 391, 392, 396, 397, 396, 392, 392, 393, 397, 398, 369, 364, 364, 394, - 398, 399, 398, 394, 394, 395, 399, 400, 399, 395, 395, 396, 400, 401, 400, 396, 396, 397, 401, - 370, 334, 369, 369, 398, 370, 371, 370, 398, 398, 399, 371, 372, 371, 399, 399, 400, 372, 373, - 372, 400, 400, 401, 373, 407, 402, 402, 402, 403, 407, 408, 407, 403, 403, 404, 408, 409, 408, - 404, 404, 405, 409, 410, 409, 405, 405, 406, 410, 411, 402, 402, 402, 407, 411, 412, 411, 407, - 407, 408, 412, 413, 412, 408, 408, 409, 413, 414, 413, 409, 409, 410, 414, 415, 402, 402, 402, - 411, 415, 416, 415, 411, 411, 412, 416, 417, 416, 412, 412, 413, 417, 418, 417, 413, 413, 414, - 418, 419, 402, 402, 402, 415, 419, 420, 419, 415, 415, 416, 420, 421, 420, 416, 416, 417, 421, - 422, 421, 417, 417, 418, 422, 423, 402, 402, 402, 419, 423, 424, 423, 419, 419, 420, 424, 425, - 424, 420, 420, 421, 425, 426, 425, 421, 421, 422, 426, 427, 402, 402, 402, 423, 427, 428, 427, - 423, 423, 424, 428, 429, 428, 424, 424, 425, 429, 430, 429, 425, 425, 426, 430, 431, 402, 402, - 402, 427, 431, 432, 431, 427, 427, 428, 432, 433, 432, 428, 428, 429, 433, 434, 433, 429, 429, - 430, 434, 435, 402, 402, 402, 431, 435, 436, 435, 431, 431, 432, 436, 437, 436, 432, 432, 433, - 437, 438, 437, 433, 433, 434, 438, 439, 402, 402, 402, 435, 439, 440, 439, 435, 435, 436, 440, - 441, 440, 436, 436, 437, 441, 442, 441, 437, 437, 438, 442, 443, 402, 402, 402, 439, 443, 444, - 443, 439, 439, 440, 444, 445, 444, 440, 440, 441, 445, 446, 445, 441, 441, 442, 446, 447, 402, - 402, 402, 443, 447, 448, 447, 443, 443, 444, 448, 449, 448, 444, 444, 445, 449, 450, 449, 445, - 445, 446, 450, 451, 402, 402, 402, 447, 451, 452, 451, 447, 447, 448, 452, 453, 452, 448, 448, - 449, 453, 454, 453, 449, 449, 450, 454, 455, 402, 402, 402, 451, 455, 456, 455, 451, 451, 452, - 456, 457, 456, 452, 452, 453, 457, 458, 457, 453, 453, 454, 458, 459, 402, 402, 402, 455, 459, - 460, 459, 455, 455, 456, 460, 461, 460, 456, 456, 457, 461, 462, 461, 457, 457, 458, 462, 463, - 402, 402, 402, 459, 463, 464, 463, 459, 459, 460, 464, 465, 464, 460, 460, 461, 465, 466, 465, - 461, 461, 462, 466, 403, 402, 402, 402, 463, 403, 404, 403, 463, 463, 464, 404, 405, 404, 464, - 464, 465, 405, 406, 405, 465, 465, 466, 406, 471, 410, 406, 406, 467, 471, 472, 471, 467, 467, - 468, 472, 473, 472, 468, 468, 469, 473, 474, 473, 469, 469, 470, 474, 475, 414, 410, 410, 471, - 475, 476, 475, 471, 471, 472, 476, 477, 476, 472, 472, 473, 477, 478, 477, 473, 473, 474, 478, - 479, 418, 414, 414, 475, 479, 480, 479, 475, 475, 476, 480, 481, 480, 476, 476, 477, 481, 482, - 481, 477, 477, 478, 482, 483, 422, 418, 418, 479, 483, 484, 483, 479, 479, 480, 484, 485, 484, - 480, 480, 481, 485, 486, 485, 481, 481, 482, 486, 487, 426, 422, 422, 483, 487, 488, 487, 483, - 483, 484, 488, 489, 488, 484, 484, 485, 489, 490, 489, 485, 485, 486, 490, 491, 430, 426, 426, - 487, 491, 492, 491, 487, 487, 488, 492, 493, 492, 488, 488, 489, 493, 494, 493, 489, 489, 490, - 494, 495, 434, 430, 430, 491, 495, 496, 495, 491, 491, 492, 496, 497, 496, 492, 492, 493, 497, - 498, 497, 493, 493, 494, 498, 499, 438, 434, 434, 495, 499, 500, 499, 495, 495, 496, 500, 501, - 500, 496, 496, 497, 501, 502, 501, 497, 497, 498, 502, 503, 442, 438, 438, 499, 503, 504, 503, - 499, 499, 500, 504, 505, 504, 500, 500, 501, 505, 506, 505, 501, 501, 502, 506, 507, 446, 442, - 442, 503, 507, 508, 507, 503, 503, 504, 508, 509, 508, 504, 504, 505, 509, 510, 509, 505, 505, - 506, 510, 511, 450, 446, 446, 507, 511, 512, 511, 507, 507, 508, 512, 513, 512, 508, 508, 509, - 513, 514, 513, 509, 509, 510, 514, 515, 454, 450, 450, 511, 515, 516, 515, 511, 511, 512, 516, - 517, 516, 512, 512, 513, 517, 518, 517, 513, 513, 514, 518, 519, 458, 454, 454, 515, 519, 520, - 519, 515, 515, 516, 520, 521, 520, 516, 516, 517, 521, 522, 521, 517, 517, 518, 522, 523, 462, - 458, 458, 519, 523, 524, 523, 519, 519, 520, 524, 525, 524, 520, 520, 521, 525, 526, 525, 521, - 521, 522, 526, 527, 466, 462, 462, 523, 527, 528, 527, 523, 523, 524, 528, 529, 528, 524, 524, - 525, 529, 530, 529, 525, 525, 526, 530, 467, 406, 466, 466, 527, 467, 468, 467, 527, 527, 528, - 468, 469, 468, 528, 528, 529, 469, 470, 469, 529, 529, 530, 470u16, -]; diff --git a/src/main.rs b/src/main.rs index 23ade7f..e7a11a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,599 +1,3 @@ -// Copyright (c) 2016 The vulkano developers -// Licensed under the Apache License, Version 2.0 -// or the MIT -// license , -// at your option. All files in the project carrying such -// notice may not be copied, modified, or distributed except -// according to those terms. - -use cgmath::{Matrix3, Matrix4, Rad, Vector2, Vector3, Rotation, Quaternion, Euler, SquareMatrix}; -use strafe_client::{Normal, Position, INDICES, NORMALS, POSITIONS}; -use std::{sync::Arc, time::Instant}; -use vulkano::{ - buffer::{ - allocator::{SubbufferAllocator, SubbufferAllocatorCreateInfo}, - Buffer, BufferCreateInfo, BufferUsage, - }, - command_buffer::{ - allocator::StandardCommandBufferAllocator, AutoCommandBufferBuilder, CommandBufferUsage, - RenderPassBeginInfo, SubpassContents, - }, - descriptor_set::{ - allocator::StandardDescriptorSetAllocator, PersistentDescriptorSet, WriteDescriptorSet, - }, - device::{ - physical::PhysicalDeviceType, Device, DeviceCreateInfo, DeviceExtensions, DeviceOwned, - QueueCreateInfo, QueueFlags, - }, - format::Format, - image::{view::ImageView, AttachmentImage, ImageAccess, ImageUsage, SwapchainImage}, - instance::{Instance, InstanceCreateInfo}, - memory::allocator::{AllocationCreateInfo, MemoryUsage, StandardMemoryAllocator}, - pipeline::{ - graphics::{ - depth_stencil::DepthStencilState, - input_assembly::InputAssemblyState, - vertex_input::Vertex, - viewport::{Viewport, ViewportState}, - }, - GraphicsPipeline, Pipeline, PipelineBindPoint, - }, - render_pass::{Framebuffer, FramebufferCreateInfo, RenderPass, Subpass}, - shader::ShaderModule, - swapchain::{ - acquire_next_image, AcquireError, Swapchain, SwapchainCreateInfo, SwapchainCreationError, - SwapchainPresentInfo, - }, - sync::{self, FlushError, GpuFuture}, - VulkanLibrary, -}; -use vulkano_win::VkSurfaceBuild; -use winit::{ - event::{ElementState,KeyboardInput,VirtualKeyCode,Event, WindowEvent, DeviceEvent}, - event_loop::{ControlFlow, EventLoop}, - window::{Window, WindowBuilder}, -}; - -const CONTROL_MOVEFORWARD:u32 = 0b00000001; -const CONTROL_MOVEBACK:u32 = 0b00000010; -const CONTROL_MOVERIGHT:u32 = 0b00000100; -const CONTROL_MOVELEFT:u32 = 0b00001000; -const CONTROL_MOVEUP:u32 = 0b00010000; -const CONTROL_MOVEDOWN:u32 = 0b00100000; -//const CONTROL_JUMP:u32 = 0b01000000; -//const CONTROL_ZOOM:u32 = 0b10000000; - -const FORWARD_DIR:Vector3 = Vector3::new(0,0,-1); -const RIGHT_DIR:Vector3 = Vector3::new(1,0,0); -const UP_DIR:Vector3 = Vector3::new(0,-1,0); - -fn get_control_dir(controls: u32) -> Vector3{ - //don't get fancy just do it - let mut control_dir:Vector3 = Vector3::new(0,0,0); - if controls & CONTROL_MOVEFORWARD == CONTROL_MOVEFORWARD { - control_dir+=FORWARD_DIR; - } - if controls & CONTROL_MOVEBACK == CONTROL_MOVEBACK { - control_dir+=-FORWARD_DIR; - } - if controls & CONTROL_MOVELEFT == CONTROL_MOVELEFT { - control_dir+=-RIGHT_DIR; - } - if controls & CONTROL_MOVERIGHT == CONTROL_MOVERIGHT { - control_dir+=RIGHT_DIR; - } - if controls & CONTROL_MOVEUP == CONTROL_MOVEUP { - control_dir+=UP_DIR; - } - if controls & CONTROL_MOVEDOWN == CONTROL_MOVEDOWN { - control_dir+=-UP_DIR; - } - return control_dir.cast().unwrap() -} - fn main() { - // The start of this example is exactly the same as `triangle`. You should read the `triangle` - // example if you haven't done so yet. - - let library = VulkanLibrary::new().unwrap(); - let required_extensions = vulkano_win::required_extensions(&library); - let instance = Instance::new( - library, - InstanceCreateInfo { - enabled_extensions: required_extensions, - enumerate_portability: true, - ..Default::default() - }, - ) - .unwrap(); - - let event_loop = EventLoop::new(); - let surface = WindowBuilder::new() - .build_vk_surface(&event_loop, instance.clone()) - .unwrap(); - - let device_extensions = DeviceExtensions { - khr_swapchain: true, - ..DeviceExtensions::empty() - }; - let (physical_device, queue_family_index) = instance - .enumerate_physical_devices() - .unwrap() - .filter(|p| p.supported_extensions().contains(&device_extensions)) - .filter_map(|p| { - p.queue_family_properties() - .iter() - .enumerate() - .position(|(i, q)| { - q.queue_flags.intersects(QueueFlags::GRAPHICS) - && p.surface_support(i as u32, &surface).unwrap_or(false) - }) - .map(|i| (p, i as u32)) - }) - .min_by_key(|(p, _)| match p.properties().device_type { - PhysicalDeviceType::DiscreteGpu => 0, - PhysicalDeviceType::IntegratedGpu => 1, - PhysicalDeviceType::VirtualGpu => 2, - PhysicalDeviceType::Cpu => 3, - PhysicalDeviceType::Other => 4, - _ => 5, - }) - .unwrap(); - - println!( - "Using device: {} (type: {:?})", - physical_device.properties().device_name, - physical_device.properties().device_type, - ); - - let (device, mut queues) = Device::new( - physical_device, - DeviceCreateInfo { - enabled_extensions: device_extensions, - queue_create_infos: vec![QueueCreateInfo { - queue_family_index, - ..Default::default() - }], - ..Default::default() - }, - ) - .unwrap(); - - let queue = queues.next().unwrap(); - - let (mut swapchain, images) = { - let surface_capabilities = device - .physical_device() - .surface_capabilities(&surface, Default::default()) - .unwrap(); - let image_format = Some( - device - .physical_device() - .surface_formats(&surface, Default::default()) - .unwrap()[0] - .0, - ); - let window = surface.object().unwrap().downcast_ref::().unwrap(); - - Swapchain::new( - device.clone(), - surface.clone(), - SwapchainCreateInfo { - min_image_count: surface_capabilities.min_image_count, - image_format, - image_extent: window.inner_size().into(), - image_usage: ImageUsage::COLOR_ATTACHMENT, - composite_alpha: surface_capabilities - .supported_composite_alpha - .into_iter() - .next() - .unwrap(), - ..Default::default() - }, - ) - .unwrap() - }; - - let memory_allocator = Arc::new(StandardMemoryAllocator::new_default(device.clone())); - - let vertex_buffer = Buffer::from_iter( - &memory_allocator, - BufferCreateInfo { - usage: BufferUsage::VERTEX_BUFFER, - ..Default::default() - }, - AllocationCreateInfo { - usage: MemoryUsage::Upload, - ..Default::default() - }, - POSITIONS, - ) - .unwrap(); - let normals_buffer = Buffer::from_iter( - &memory_allocator, - BufferCreateInfo { - usage: BufferUsage::VERTEX_BUFFER, - ..Default::default() - }, - AllocationCreateInfo { - usage: MemoryUsage::Upload, - ..Default::default() - }, - NORMALS, - ) - .unwrap(); - let index_buffer = Buffer::from_iter( - &memory_allocator, - BufferCreateInfo { - usage: BufferUsage::INDEX_BUFFER, - ..Default::default() - }, - AllocationCreateInfo { - usage: MemoryUsage::Upload, - ..Default::default() - }, - INDICES, - ) - .unwrap(); - - let uniform_buffer = SubbufferAllocator::new( - memory_allocator.clone(), - SubbufferAllocatorCreateInfo { - buffer_usage: BufferUsage::UNIFORM_BUFFER, - ..Default::default() - }, - ); - - let vs = vs::load(device.clone()).unwrap(); - let fs = fs::load(device.clone()).unwrap(); - - let render_pass = vulkano::single_pass_renderpass!( - device.clone(), - attachments: { - color: { - load: Clear, - store: Store, - format: swapchain.image_format(), - samples: 1, - }, - depth: { - load: Clear, - store: DontCare, - format: Format::D16_UNORM, - samples: 1, - }, - }, - pass: { - color: [color], - depth_stencil: {depth}, - }, - ) - .unwrap(); - - let (mut pipeline, mut framebuffers) = - window_size_dependent_setup(&memory_allocator, &vs, &fs, &images, render_pass.clone()); - let mut recreate_swapchain = false; - - let mut previous_frame_end = Some(sync::now(device.clone()).boxed()); - let rotation_start = Instant::now(); - - let descriptor_set_allocator = StandardDescriptorSetAllocator::new(device.clone()); - let command_buffer_allocator = - StandardCommandBufferAllocator::new(device.clone(), Default::default()); - - - let mut time = Instant::now(); - //polution - let mut mouse = Vector2::new(0.0,0.0); - let mut pos = Vector3::new(0.0,0.0,0.0); - let mut controls:u32 = 0; - let fly_speed = 0.05; - event_loop.run(move |event, _, control_flow| { - match event { - Event::WindowEvent { - event: WindowEvent::CloseRequested, - .. - } => { - *control_flow = ControlFlow::Exit; - } - Event::WindowEvent { - event: WindowEvent::Resized(_), - .. - } => { - recreate_swapchain = true; - } - Event::DeviceEvent { - event: - DeviceEvent::MouseMotion { - delta, - }, - .. - } => { - mouse+=Vector2::from(delta); - } - Event::WindowEvent { - event: - WindowEvent::KeyboardInput { - input: - KeyboardInput { - state, - virtual_keycode: Some(keycode), - .. - }, - .. - }, - .. - } => { - match (state,keycode) { - (k,VirtualKeyCode::W) => match k { - ElementState::Pressed => controls|=CONTROL_MOVEFORWARD, - ElementState::Released => controls&=!CONTROL_MOVEFORWARD, - } - (k,VirtualKeyCode::A) => match k { - ElementState::Pressed => controls|=CONTROL_MOVELEFT, - ElementState::Released => controls&=!CONTROL_MOVELEFT, - } - (k,VirtualKeyCode::S) => match k { - ElementState::Pressed => controls|=CONTROL_MOVEBACK, - ElementState::Released => controls&=!CONTROL_MOVEBACK, - } - (k,VirtualKeyCode::D) => match k { - ElementState::Pressed => controls|=CONTROL_MOVERIGHT, - ElementState::Released => controls&=!CONTROL_MOVERIGHT, - } - (k,VirtualKeyCode::E) => match k { - ElementState::Pressed => controls|=CONTROL_MOVEUP, - ElementState::Released => controls&=!CONTROL_MOVEUP, - } - (k,VirtualKeyCode::Q) => match k { - ElementState::Pressed => controls|=CONTROL_MOVEDOWN, - ElementState::Released => controls&=!CONTROL_MOVEDOWN, - } - (k,VirtualKeyCode::Tab) => match k { - ElementState::Pressed => { - let window = surface.object().unwrap().downcast_ref::().unwrap(); - let garb = window.set_cursor_grab(winit::window::CursorGrabMode::None); - match garb { - Err(err) => println!("set_cursor_grab error: {}",err), - _ => (), - } - } - ElementState::Released => { - let window = surface.object().unwrap().downcast_ref::().unwrap(); - let garb = window.set_cursor_grab(winit::window::CursorGrabMode::Locked); - match garb { - Err(err) => println!("set_cursor_grab error: {}",err), - _ => (), - } - } - } - _ => (), - } - } - _ => (), - } - let time_now = Instant::now(); - let dt = (time_now-time).as_secs_f64(); - if dt > 1.0 / 120.0 { - time = time_now; - let angles = Euler{x:Rad(mouse.y/1024.),y:Rad(mouse.x/-1024.),z:Rad(0.0)}; - let orientation=Quaternion::from(angles); - pos += orientation.rotate_vector(get_control_dir(controls))*fly_speed; - - let window = surface.object().unwrap().downcast_ref::().unwrap(); - let dimensions = window.inner_size(); - if dimensions.width == 0 || dimensions.height == 0 { - return; - } - - previous_frame_end.as_mut().unwrap().cleanup_finished(); - - if recreate_swapchain { - let (new_swapchain, new_images) = - match swapchain.recreate(SwapchainCreateInfo { - image_extent: dimensions.into(), - ..swapchain.create_info() - }) { - Ok(r) => r, - Err(SwapchainCreationError::ImageExtentNotSupported { .. }) => return, - Err(e) => panic!("failed to recreate swapchain: {e}"), - }; - - swapchain = new_swapchain; - let (new_pipeline, new_framebuffers) = window_size_dependent_setup( - &memory_allocator, - &vs, - &fs, - &new_images, - render_pass.clone(), - ); - pipeline = new_pipeline; - framebuffers = new_framebuffers; - recreate_swapchain = false; - } - - let uniform_buffer_subbuffer = { - let elapsed = rotation_start.elapsed(); - let rotation = - elapsed.as_secs() as f64 + elapsed.subsec_nanos() as f64 / 1_000_000_000.0; - let rotation = Matrix3::from_angle_y(Rad(rotation as f32)); - - // note: this teapot was meant for OpenGL where the origin is at the lower left - // instead the origin is at the upper left in Vulkan, so we reverse the Y axis - let aspect_ratio = - swapchain.image_extent()[0] as f32 / swapchain.image_extent()[1] as f32; - let proj = cgmath::perspective( - Rad(std::f32::consts::FRAC_PI_2), - aspect_ratio, - 0.01, - 100.0, - ); - let view = Matrix4::from_translation(pos)*Matrix4::from(angles); - let scale = Matrix4::from_scale(-0.01); -// Matrix4::from_translation(Vector3 { x: 0.0, y: 0.0, z: 0.0 }) * - let uniform_data = vs::Data { - world: (Matrix4::from(rotation) * scale).into(), - view: view.invert().unwrap().cast::().unwrap().into(), - proj: proj.into(), - }; - - let subbuffer = uniform_buffer.allocate_sized().unwrap(); - *subbuffer.write().unwrap() = uniform_data; - - subbuffer - }; - - let layout = pipeline.layout().set_layouts().get(0).unwrap(); - let set = PersistentDescriptorSet::new( - &descriptor_set_allocator, - layout.clone(), - [WriteDescriptorSet::buffer(0, uniform_buffer_subbuffer)], - ) - .unwrap(); - - let (image_index, suboptimal, acquire_future) = - match acquire_next_image(swapchain.clone(), None) { - Ok(r) => r, - Err(AcquireError::OutOfDate) => { - recreate_swapchain = true; - return; - } - Err(e) => panic!("failed to acquire next image: {e}"), - }; - - if suboptimal { - recreate_swapchain = true; - } - - let mut builder = AutoCommandBufferBuilder::primary( - &command_buffer_allocator, - queue.queue_family_index(), - CommandBufferUsage::OneTimeSubmit, - ) - .unwrap(); - builder - .begin_render_pass( - RenderPassBeginInfo { - clear_values: vec![ - Some([0.0, 0.0, 1.0, 1.0].into()), - Some(1f32.into()), - ], - ..RenderPassBeginInfo::framebuffer( - framebuffers[image_index as usize].clone(), - ) - }, - SubpassContents::Inline, - ) - .unwrap() - .bind_pipeline_graphics(pipeline.clone()) - .bind_descriptor_sets( - PipelineBindPoint::Graphics, - pipeline.layout().clone(), - 0, - set, - ) - .bind_vertex_buffers(0, (vertex_buffer.clone(), normals_buffer.clone())) - .bind_index_buffer(index_buffer.clone()) - .draw_indexed(index_buffer.len() as u32, 1, 0, 0, 0) - .unwrap() - .end_render_pass() - .unwrap(); - let command_buffer = builder.build().unwrap(); - - let future = previous_frame_end - .take() - .unwrap() - .join(acquire_future) - .then_execute(queue.clone(), command_buffer) - .unwrap() - .then_swapchain_present( - queue.clone(), - SwapchainPresentInfo::swapchain_image_index(swapchain.clone(), image_index), - ) - .then_signal_fence_and_flush(); - - match future { - Ok(future) => { - previous_frame_end = Some(future.boxed()); - } - Err(FlushError::OutOfDate) => { - recreate_swapchain = true; - previous_frame_end = Some(sync::now(device.clone()).boxed()); - } - Err(e) => { - println!("failed to flush future: {e}"); - previous_frame_end = Some(sync::now(device.clone()).boxed()); - } - } - } - }); -} - -/// This function is called once during initialization, then again whenever the window is resized. -fn window_size_dependent_setup( - memory_allocator: &StandardMemoryAllocator, - vs: &ShaderModule, - fs: &ShaderModule, - images: &[Arc], - render_pass: Arc, -) -> (Arc, Vec>) { - let dimensions = images[0].dimensions().width_height(); - - let depth_buffer = ImageView::new_default( - AttachmentImage::transient(memory_allocator, dimensions, Format::D16_UNORM).unwrap(), - ) - .unwrap(); - - let framebuffers = images - .iter() - .map(|image| { - let view = ImageView::new_default(image.clone()).unwrap(); - Framebuffer::new( - render_pass.clone(), - FramebufferCreateInfo { - attachments: vec![view, depth_buffer.clone()], - ..Default::default() - }, - ) - .unwrap() - }) - .collect::>(); - - // In the triangle example we use a dynamic viewport, as its a simple example. However in the - // teapot example, we recreate the pipelines with a hardcoded viewport instead. This allows the - // driver to optimize things, at the cost of slower window resizes. - // https://computergraphics.stackexchange.com/questions/5742/vulkan-best-way-of-updating-pipeline-viewport - let pipeline = GraphicsPipeline::start() - .vertex_input_state([Position::per_vertex(), Normal::per_vertex()]) - .vertex_shader(vs.entry_point("main").unwrap(), ()) - .input_assembly_state(InputAssemblyState::new()) - .viewport_state(ViewportState::viewport_fixed_scissor_irrelevant([ - Viewport { - origin: [0.0, 0.0], - dimensions: [dimensions[0] as f32, dimensions[1] as f32], - depth_range: 0.0..1.0, - }, - ])) - .fragment_shader(fs.entry_point("main").unwrap(), ()) - .depth_stencil_state(DepthStencilState::simple_depth_test()) - .render_pass(Subpass::from(render_pass, 0).unwrap()) - .build(memory_allocator.device().clone()) - .unwrap(); - - (pipeline, framebuffers) -} - -mod vs { - vulkano_shaders::shader! { - ty: "vertex", - path: "src/vert.glsl", - } -} - -mod fs { - vulkano_shaders::shader! { - ty: "fragment", - path: "src/frag.glsl", - } + println!("Hello, world!"); } diff --git a/src/vert.glsl b/src/vert.glsl deleted file mode 100644 index d2af02c..0000000 --- a/src/vert.glsl +++ /dev/null @@ -1,18 +0,0 @@ -#version 450 - -layout(location = 0) in vec3 position; -layout(location = 1) in vec3 normal; - -layout(location = 0) out vec3 v_normal; - -layout(set = 0, binding = 0) uniform Data { - mat4 world; - mat4 view; - mat4 proj; -} uniforms; - -void main() { - mat4 worldview = uniforms.view * uniforms.world; - v_normal = transpose(inverse(mat3(worldview))) * normal; - gl_Position = uniforms.proj * worldview * vec4(position, 1.0); -} From 68eda6546e031e164d31b4b2126fe31d0bf6682b Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 29 Aug 2023 18:20:58 -0700 Subject: [PATCH 013/482] wgpu/examples/skybox --- images/astc.dds | Bin 0 -> 131380 bytes images/bc1.dds | Bin 0 -> 65744 bytes images/bgra.dds | Bin 0 -> 524408 bytes images/etc2.dds | Bin 0 -> 65744 bytes models/teslacyberv3.0.mtl | 62 + models/teslacyberv3.0.obj | 6617 +++++++++++++++++++++++++++++++++++++ src/framework.rs | 639 ++++ src/lib.rs | 1 + src/main.rs | 524 ++- src/shader.wgsl | 80 + 10 files changed, 7921 insertions(+), 2 deletions(-) create mode 100644 images/astc.dds create mode 100644 images/bc1.dds create mode 100644 images/bgra.dds create mode 100644 images/etc2.dds create mode 100644 models/teslacyberv3.0.mtl create mode 100644 models/teslacyberv3.0.obj create mode 100644 src/framework.rs create mode 100644 src/lib.rs create mode 100644 src/shader.wgsl diff --git a/images/astc.dds b/images/astc.dds new file mode 100644 index 0000000000000000000000000000000000000000..b1bee88fa75fe3d194115c9fa27631efec8a7ffb GIT binary patch literal 131380 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

K+%pE;5B!|96 z(89Svk14N%_pk&xo&`KJMB|@?bf3y@e#)D`mzkRUjgR@3wMI!xFmK&LZ9JP@AiI|h10hY2#=6d(2W4p{=W z1jOTf&FIuA;W^;J&-F#UBDt+~8R$&y5#2rqiT=3GO-vEOC`uJ6SmpoM<)0=m%-AR2`9@b-!%D5HIbaU`Ib5heN=A2Xjh zFO0((^oOgN>$9W1v@28It(6QT>WX>?sr}+J-mXHFe-`zM%NbDt+dFhY&6u|t&Uhs# z-?2UFZN`0Z=b51|z}%a6JbAxt+nFInIg^r+d&c|XV1SEv^$tB)&ZHgMF?aN#{vI$c3n_EUZi6$A4t{w z?9s1%wX3jG^_$Xv{^elRZq+t@?K4{|52;tJ+F?+X?^c~c`(1@AWj`*Zexzy&|M{%v ziYrxNdy0F_FnV;-T)l@zC4^MTf zQl#!aw>wXBGMoC}sah%fEz54+t(q_G=yjvKQ6_qDM<`FTQC9!BPDk~{R<8HFx=|*v zonBj^-6-Q-GS6zwZdGW}MbkyJ|4z`uUQln8O&wq1yjZ(iRi$Uyt(BcB;~(EH{Vduo zz52CM3Ggm1E-~)L`>as~xbpREa|;*va^(W)^5yTbS&h3@`(E;}`Pvj|{n6h=ft3nU8q?pQ`lXxIq2URgTX-UKIHbCdjs(Jl+lrjetqKTuNky`ERB)^3vVF^9woehW=FxIEy`$NMZ7)SW6*N0~oW z)2W(p@U{!;-KwI;wal@hr}nT>hFQ}8+#c3gZPxW4sdDg6@q0t}v@6&N@iD+MCy#pf zw0i<#=DndRdyJPeSG}L_A9q@qrK2wl+FeHO0pB<6dWK`(^WM|W)|+wv`F(sS%)Bu8 zxlU)F&j0!T%ti~t>2&><5Aci}^6|5sF^=~f8~UkJXR+I=2mf%uWM$BPKyQQqThd>l z1-Y1N@HxS&UeFbSXt(M;$WNB-89Jn5;mhe6B6>6EU%rNA&CL4I=0c+T1HRMXx+ty( z0FCA){ownU68**a@d2|36lD26W}ox&0dXhGUUA*iF17{Pkn5NG7_m`D{b4u{`@-O7 zI~iMyePQVNJ&@bF_lCCZVdOObpV|YzOy~h0uA4djJ>a3>Irge|pPdnNxbJi_7B~Ce zkjII7v8XrXs$s;ax6l5Jnc?0W3b~w|1^v6Pug1Wjzn|~d0iT^gUB8E?bx+qH({X01 zXKk~g-mjhc@}o@DyJL`v7X%*g^$c;X=JW@!uDKO#_4?5rgItXba(c(0$j)1rjlMTz zG24s;;~l-wbKmpY6LS3l-v%=yS%!6qHS~ba&+qeaV#^iRS3241eDMoIU+J``i{(-8 zeSID)BRYfjdA?|yZt$M=dTW3Sxjxs)Mmg(!eZM@gIKXf_2EWp2s$&#Ac#d_8G2TCQ zvSJ4Cm-}cOkKuX@FzWR}E;Y)A>XW6;N0{e(xYhW7N$Pit z*j(^{&*_YBGlMVoIgO40#`~vEk3<6g{CxjpJ|kZ`T0LmD1}+07ju!F8}+jFr0+$&DFxP^V^}w9q7uG(u*yyg9gTM^g!GE^{Kkfz8XCsXK80LeE&j(&h`a{iT4s`2xb{lGr z4c*^wiF+~#Ux~wkaXB``IcWWVVUS@Ywq>K>ll(|o)O#80wa7`&n;B{c>$sVLezK&$ z)5a+h^iY&ye!Vd0v+&la_q`!!@E^=H{*2Pqus)#=%p0x^zBm}=;<}x|CA2>3mW|%u zkM$S&?Xe+$y`gT|=#qYsLVpN_!7!mA*T3##T%~NA6MS7XJnVF?+hevH zpBVxa4YPGuTv&%WUgvZMFuhIeeSH&pE9T!7*ArS?XYcPjt+&K&p*H)Il_Ga^`2Iew z5Z8^xgA*I*{)>Z&vI$xST`#R3Tm}7uiDOh4RQII7NfJGcpbsz%Ja`N7)e z!iIDf?|VXfkTJ2{wfUO(SS(D>*#eIo9jtvqtJD4D^~}cR!o`b+hac~3E))fHy3ch6 z^pU6E3fZeh)m9s8*tTblHia)`KiR%U+u&x|$L*&J#heS}2|d&?=oMeCWUL~m)A>%V zSRry&4?d3RZDQ{ydN91<{sbN6q2j?$c1FQpgm*zV<0ii1BsS=cOZw|A96y16b%=u{ zT;a1S#vDNJ-%vBX>A?wot_*xsBPst~4#zF>oYt?=I2G1&gm>VCzy8U}HCn8L1E=-< zYA#w-bXtEw%_;ZBh#pMD#1bB)pS-0%q$<&Q_<(*?o$KN~EqFe&F8&)ydA>#zI?tZQ z_0JwPm`qxfr}Q%PkbDiEcg5<~Xh+pg_xVEknrBrl-#EGDkV*egoZb&^rs6G`G^}`DEvqdc@4t zWi_U0lp;O*50%hY{58gW&7IOnl;6Gv{ZSN5{-Hwqtjc2HeEFJwwJpBTLH*_e)$TOS zAyuAZ7niSjL(T0784}ROJL!5LQZq5Cepa=s)Mg_X?P5d(6*)O?rs4U+-BITo>N}-h zDDyL`WI2q^P{S;cV)mxD8J<-&WGOjI*Rv|a>v+pd)`o+!QVeVkOqEb*?i~+wVXM!NhM|KOUCeiDZ_>&OuzckG}gg! zZ>T%6ono<^+Ba*eEr(REXESkK{IL4<>}{37!*2k_oSC@4NtR(YGjFKRWk-DRoK*B% z)Ritu1%6z;_vjmHj8AWO6X6@h_)3=E-$tWh<`nSpmlmj4BD3$>H0 z%uOFfKb?043~xYhv~&b9ez2PYH706@Q^;+kj|Q6jkOr${*4|;ze}U9&iLZTD1$rEF zxk32(lp+Pq43r_^d* zxQ_Z0e2Poy2R}MC)q6K#d~{oE4DqFnjfmE0&t*I5Y_)Q`@gAL(^vrYFv84?7dAI5~+-20? zsB#&Xz%#H^bOG%LI{Z&>QXR|!8}t3(`w5dLcR&w*4Y|duwF{&}KX^Bi2R;c6#Uoz_ zJ>ajbIRrYut&_W3l`FNz0~d)-kh7oz@C*;Lgujukts^`YM-PJ@7-zc$hKHf7j3=@1=3I9WB{LP>#4pC+K8< zFPK93kK}*v*Qt09&ljH~yD?tf!ce`u5C=Q%PU*?3EbQ_H(q)b|V^?9nIv^@IPtX_N zR+k6)YYn794)?1`4qX6!;!a6`@Z~Q3ev+W+=u`(myCd31{SCz3u&d5x+Z!4%ug+y( zi}&?VKR*4b`ieu4zkU3alK7!#m@TP*z4q#1yUbenXj%lnL*VyNOwqjt<04b+YOsPn zLq7cmEBaI5n5eR1{WAAngje8Pw*Pn}N_cSBeqECbcrx0zoywo)PfK>I4rXUMJvwTq zIFOk;u7|ztT)bFb-jT(}qyF8XPuMJx)4Z7~SYkW`yU@tBEb2#nmmvVYT_uZVgm@bN zgEo8HsQQpPf2q5V@T}(@4tl=9>wgpDDCPOZxfPHPA%}T_`s=cdR5qd9<0HF%w`$1z z#ACz<6<`u{_Q1a?B&8 zrQ`Ze)kxLX#_4@edw-xLd3EX4L)VCoKkjag_p3XyCd1c`Zj?1-@k&V^z1Qi@$9mL| zWvCf5_hY?LvaGJD@MN}9esHh0@`Ad$Y~&o-xu({%MKs@8W8A+$+OM{9TpQ7$!{$9h z_~jQzdio&;iq;V5!LWdY8_2M||;!*@DP6pK@w1`atduAoW070)4VB=n1} zB!4sQCti!|^nRh9cUF9OCJvm8f0Ex_;cy~;fOrXhi8uoS4-}V>A9uT{A2x^2lt7e;&`5Urn|X*^ zk$)X*6{2_mjVeJoo+B8DBEEs=L|`W>yAj_ZKl50<5&rLF9OUm|=SJ)6jpP?MPjN=_ zi_5tn>_7PZ(f@@1my^56zYX$ws6S$N0DfM?Nf>Ty?&vq|&@?a29eo`37E?LbM}B4I z%v8c}%e*?}{TJ99%zIO?=NKmce@4B~vzeS&^@{YvI1_{MCVtvUxBh?(g3yW5O)#MZhV7jWXC@tP_5kYTVC+KW*(Z>)Fhm z{pxk~-|~<@abNwGYVwbrgWd4Q1D&de?J?L%8)d&R>flG+DEqOIp6^tR1CnmqsM%jC?t2y|6$bV;ozXE-o`pn9h zXfFIiY>WIPbbJg4J zEMUn0Q*B=2uO9r-J`3#B7Y6@zp9lok4Su;C{nzRGCFN$|(KGa9rI_i9RS$M!968vH zNjP^D@dR^==Kit;g`7L zV&ooOW+UuCp4UBD3A+(&9MHoKwQ$W`VZO#}iZ5)&Iw_XRk7hQGsztnyoq&dE;r7S& z!v0*+6TvH{eb`K?3NP^M`86ons(G+POMut&I$W^Lzcun?CGv*$P)8sjo+>MT@C|z zL-vTp5{2E_krm-i7Lc9g?3A@0!utBDe5Pd->ut0p_*5$NxfWZ}E;55o)J{j>sSxRl zX0yUU`m-n=_a^koj%bA7-3{&ywEkN}Y>@OpXI~fA{gc^cOqzxK>bZ;JXGp)S?nr|@ znW}-D2JIksiw(=OdeB zzst_aiNcyXmt$^qcOJs?d_3?Dy+daK*=YtW$}y1%h2zw}o|-;?oGzhg?_>Apfx*VSNFA(0VDR^$C!% z2I3^SJGdzmL8K3Dr~8oOh~Go*qh2CTFScPFK|C38KUy~!#7Em9*D)^=Wq(wM`n^L9 z=uSzH;%M|?9pYL` zua+(yU8wP3yw{J4%UL-bhy99jxY6MU?J9&ggTEj0%0gwxE0nK#ldxa?0Qv<*tUn)o z1G&-P0e=I}FG-X`EaW@xvWe6O{JxBK*LZ(|YJ%8$!=T#}e}-(Vv_2(8P7>8{JR-pVWK3m|s-B zG5;wLtuYAsKmwe}J8Tb{kVaRfKQl0iuaIY$#591REzp7RpBeYrbm$95YibNLd0)wV>zVO(P1_;u z!H$stFX-C>Y!4qu+@HoD^cVW^*M>9vZ^iFMKA=9$;4h4SUzi(<){~v$w+5m!zdW@D|2jv`MD1vndDT3 z2|GI)uNUm@1b)azNxWJqdfGLIB&Bh`ys~f*8Cv!`%mSQ zIG^T^d?>!cxF_*W;+vFnf%uK`Ef6&r312JpAYpuI9Faz%Bm5Y~5+?|IIjIl9&Q0Wt z#d*)e)A@-4>6q^@t5&D^d%%5&D0a_&xUc{ zf?wkOw;1OS!&~5UlINuE5rlb;e9iV?B$6CwOn*}y@U8*>624F;jbyKzxj_6kqt_Do zYXTJTMfp6nH+Piq_(Js=ucACH)8_N?TEw+Z_`Ts*_9^dmV?Mk{@mvY5wy;AnUcW}( z!HF-lhsEnHmrTg}{pA5sdV2b;@t@5npaUiz(INR0=qjw|$?^8`6h}6H!5e;IP;^Ji z9W!#RJ!thu68t?@6NT0byiJBg-W=g`J-=@{&riVndcGg|MUc-%{)ncF@le#eZO_ig zSoJ-f;&SDRtMI#2R$Baln8$UoHq!E?Qdf9wWoAb1VpkaP&l7Kkb^V*QO|S!xRGn8p z+-Ee9oi8bHw(&gdPDYe6Lx&l>ZZ)q>ruuq;4wN^}n5~C|@je^Ar<1W*ww(?Ca-T?? zw?x4IMn12piPzA0!w*w0;C&rm=>OE0gg=Ih#-m=u+5Od#DKFyB=x5}@-zV-zy~@Vo z>UEdwRj1VX(K97F`mtiMv(3wItrVr)A)CeDF#*3DAqJm~^E%`aFmsZ4Tei5u89UQHk(cM? z$*%XWI}rTkzRSOV?Oj*+NLAjFqiu0yP;y;1WH=*Vyxs`;mGtWg^6NU@l^8il}lDQopXJ!P<~&{nW1sLIZ$bOyXs}clacqPX;jIU zFCD&EJ7?*NjxAq$e$O1u8YAmbl%G;h8vjsw3i(iD@ofgmU#orQnV7hIzVu#a2zfBb zn_KR5dc*rLKSba5^3U%RrKG3FA*Z4DgWJ!B&46da|A;(<6J^Ur)7Pin?Qps<&zPpc zRS%4QN4sLhk`)JnZ&$rrT&#a@=#_o1c)wEnfN!!kBkEfm$9&*y0ewjjeDUCdeI&=D zQ6o!!xx_48x!+$_eX+Ky@cFqu-No7pt>n8$ zU;SLCqFkhy3_XwhGWhlMFCz~uqL06|P%~fpM?UliN%;l!Zzu15erx3^^?jblOC;ru zD$!fdJVW_<#U=V-%GcupQ)3kG8a9ScWg>6wSX*xB*bwY}(W1p?!&@sQ%G}(Y!RPld zpEy+19)7!)Nl7noh11vj%ZiOv_RZQ{r^oY)eXF&1J38C;56;o7c!d0z1A0TTp7l5f z3LOK#t@Aj$3MI?ix4$@)r^)AfJD)+mVdQ-S>_2h2C@mu;>V2r+95=$RH{>EaQP;ml zTWlyPTGIbyWy&2X8B6-NRu<{Lh5lbqKfL1XSta^;_eRws%;UFf8)YT14^OE_ zvV-ru^G+k^aM0OyTv5JJb};7gP#)h-6U+9i=Swe_v)ebyPG*Z5;%>q}Fi}~7Y{slK z1fWN8f6DFJ{;LBkWh>ksPZW7&nM!5Y>6DbGMZbmhs7YG@d_UQ_P-A$!q-eADyjmG_ z1npG|HA@P7%6r-e^w)Oi`1JJ)HNN(@bldjiX~NBQ$ZwppbnkO#o#dy?%=9gJusl^$ zG!}V*@-7R~(~*DjP=C}CHB}G7FJ>;=@>BRHtLu%%At&Tg^Tha8ier@IzeM?o(VA^r zHp)h_KkIU_b2N|1!WkY9;k&I~hxpHY>8efVw^M%R{vXf(3E|z=*5+BQg+Fq~x4ucw z)mM*=A-gf#>55%miSmhnDL!9%GCSU|sHanPGCSsQC^sU`E$=(hvk-jZ;O)QtBK$K- zr9<&W$cfK$LyNv#IZsOYpmRu$eD~rTn~~=!=7)78SH2tae03q<^3RTB zTMRljPcxGJk9htu^uG-cJ|+`MAIUo$dQ3J?y7khQ@%hr9Ww(g$zB@(w?JQB9(|Q5^ zEM=QBl&bk*mi4u`kLaUpnLrlme5qb>5phGrAtPZMUDqvM!LJ6s9xmTQ{wy7D6@5|L zsd^@0WxfMghkU`!+EeN}kFJ68Nli7z`U=qXsV7&xa~^S{qk)r_)!LU;U;XD_e)Wr> zN9k8P zvTsVKd;NmE^L&s9-ShfAHjPam&h+75;39g zz|Y17#P+Xi?^>#m%=3O7e4ciNpCW!2rSwAjG^(lt#)&-0*>`lN2BKe2yw-e5{h0KX z-lM*SxNhghGl&m3Zj0y%yzjZIc01*l`h8FB%me(@b8S^bFZYP4G*445>oesouF#gt zOxx=%{pxvA-q@GZTv#r{a4Syhffs9pe-7nPM*JZBmmC*v`yJ#KXRECLo%)Aa7P&i= zyHq4~hX0|udeSKx_pH!!_rk&QG%MOJUVnsRV9pV^8 z`D5@u@k{{zDmLU`_Ey24W-zail;>$;SBI?u#6!hK!^r^RxhFI_Bl)E)HZkI$3#86& zYXDj6+0{`_)T#Pf+A!h|{pzo!omVo}3eel)2`CODKHF92*ws{c*V0Ay7Dw9p3u<0x z>!5M$OmFCY191;`QN4xuo0)9;$!3hJS;8D0C_Jy$hQqpr7#Cx}(sLN)47aS5^d-CE zDyx7TK4I2PZiQc7Ct~Z?0`gX8+oDF~<+|k!cke|0SB*JN^@}UP znBw$1La}*k&|hPeXI2AGV|>C)^C~VX^V2%UFgD2L|5Sy3z%g&2-(4LeMQh4eB7erD zdlt`)c#?WR=sD;9r}ivFzWdXGCh(ze_%-X-0VNV!&DZgK{2IUgyt-WW3RhEmUj3M? zH^66HK>4^`$yGoO6vXV#wUvidysbCt(E81OwQ8wt(8rM%3scLfL@O>f$zVvr|N=QobKCV2eewa z5a|4>5ytRjCHN<3;Zik^Ny{wO9i->j zA88PM2mbuw!#3o5zpR>9>sw6vQQxrQS_R~V*fC9QWUtMFwJRHgP7`L?SR$+atHH|eFVw^lI zi&2&yV%1uWz$xVte)mpAIVa+w&-AO!mOj+)Dm)Q*QYk?{jfM>j z#pCQN;>DEr+2D;mcUqsS`J7}iPxIdP+~MtS*9P=r3C~W_d@y%=j(~4>cE=&-khd4< zH4H%BNn)l@WhKU6oa=cT&utmoVi%VmQh7>R7;!oBoLEB{K@V$uEP!?-PAB*ed>QZU zU0Vq`s;e>6_!{}DZKtqaVgp}*=C9OfJWl$ae3@-$qpBmz(i1n%mo{YOTW#Y5`V^_h z<5^r;S)sk7E2U!(^eumxRUAP7mwYn^a(<=E5?yB@zAzi^&Dn!>z}YMkZLNgaRl^qcK7^YQKPur6zG_D zq-wXSW{clUaj^RX;xyXtQ*thIQ9yq#N6A~UK7by3bbM+>r2H|NGG1I9zZ;{;W=Ggg8CQKPKih^$9PpXm@Oo4pDbRZxd1&Y zGc|WH;c@)_Jjmfu^=sXmeFGR@_mn-C+DqNb`)HiSr?+5q^E66jL8l!2WOs)=bpPOm zUq9Z2`j2}r#);2G-3I8Tvo+Uj|%$X*r-)}wL(@l6gGF!GN%F+Iq0eQ72vnOhbt2fHNowXeK zx&6@38IeRr`N1u&&|jze;pD;NyeM(7PIX{ZEq~_=%+)ycQI9Z8g#TNOiR_ zPXoQ6BWj@dyV)EGBR-y!liv&dbd&7UKk#7wG!>Tg$XnJ{LeD_}u@#VI>&MnY4&Jr6 z?d+b)0sU!<^;jk3&Cy;9^vDZpt69`AK{~L{KqekRLRRZ$^7&qRq5;N zZG#ynAP5WjOwhXAkh_<14!NfKJ`rk7yS)%F9_(CFI=e+12_Y z-JS4j{NbqMIAsCAtt#JxycMV24tjPK%HGmce;JvZ)kdRkT;HVag8xapezjKNb|2T4 zkL&pids`*sRQ(n+^xYI`IKI;`XK9MmXkZKEJVpZ0zI7Ru)oAG>%!j`4g%nX!V}eY&H!m-yCbHCviM2VF^ZqzU#a-e(&?hCa3r zinJKN#f$QpO7xG5UJelc*2|NSm*e`rl0d^Ate+2cG#{O;U0eQ0Po;gbwzBfd`^D=C ze}&t}zn%^G&%G&5!TRoYV4&BhNS!X1axK>N3}r*v+Dh0_k+7TAw>L(;5t^sieYwa= z^HjX3U|hdhD?)-`EAY28tbOv3sw4Z|%VWPMzRs|_oLY=y`nO3>=~UHUoO)Ugz1Uch zmNTx0pCwfEpt$^$YQ+zJB%=MC)my)Dq6u_jzTLTu_&R6)lJC*D`nPR+T3kM7sUdPH zLh@leFu{==&G4C^A7ZAxV^8q)Q%_w!PVz`DlP{wAu;O^Sg5Z$;+&2h+U+vr53GaCA zJ4fkycTKApu9-hG{s;d)XPu67%=q~!eiOxy;unD}H^wRJkjG*j6XI8Yk@hX-7V;x2Xe;mPq+}?2v3?Q4_#^U5337F2blHb@8h?^)s$O=ci5D%I=iv4=bXG;3Q_q0F% zehKnJB9SCxreA1ZY)Q0djn^dN7=bCH(Mx`Pv-u0I@K-4R zB%Sh?Dyj_z!Y>*(7zIE5+|j#nJe#?!J&2us*q2g0*s1P`M5-?zxS%%ohC;tOuv$}I zZ@@lm_}j0UbS1&vs=IQXhy&2R*PI8=h7r_5K#!1vUg_?aXg#@P(tS%SgbftfX)$M7QQz$pucpfy5z+{MR`iI%j1OKberCw z>w+Dddsip)jg2zJwH@%2&X-<`^V?5D&(B>Rf?u~^owIDYbJ^%A><8=h?F??#zFVZz z-P5^Qt8h)m?(b_V{OJ`ByUz&;=Wd6eGF9`5yd_JH4Gp<0acfN*{IYj0{QTj6-FHD9 zDb^VWs~(fdOFb;v)4%o&v*cHl%NMtufEp9wooxyjXCM{Dvo@LlNr#3YNvbj%|A=(TMU^&G2JWdwC!n{GmA! zwv;cY_q&|(Q}7@9e4Z7gNA*p94|dC)()I337J9E|-U|4aPN_mV5pOO0PgUPUwP9R; z*HV6aK`elEO2>}**I>QdVQet3fnB^kbT>{*p!k3X^0QNgfwC&FPO^2|#m$BAAG+t6 zPwN4_5uW@5j=D-K`70TF8~mjg)NVy?;4s#~fcP5XY~*Jt-AjHah5O#>FT&5V4SX%f z`;>Sw#bvB~o&D{qbJ?7P=ijb^oivsXze&C(bewT-t!yq-id*0}X)0to_}aa&zlXS8 zh~|wVUv@=w-5&CbTCmS@zKl0o8S-zuAGY#$EqzRup7V(#YtSAabh^l2*|OzYMHl+7 z^URY3NM3thdvH(HAys;G0($u&RnJ71(_U4fHDrWid*Hv(m7V0s{u<`vC&=#J6|;k0 zu*ZhE`x8`IN6)eUFBcP1>HNAoz;;)m+6VazDbcrmAM&j z>8s9c4b4BC*)j0ddVFU zaSiFwR&3}x4gQk+uXl&ZE@jM>b!4|Oa`(}-<;{hLiqq%DVHYe?zUrs-NGz7M9|4{G zfg&C4W4v1#gTDg%>yS6wgmT`MD;~<%y9Cii_JmzB$%@x6kdD4f zpe{M|`wimEVT$LNhVt^XEnzm=2JiQkBgIJ<;!9O4~AZ|l+ zvrC}Jm9N$|n=P$-pbw7O3JPf5zgu?U5z>QJ6zSfhwIjKX+zQ5d>)6;Bt!w_kST*Gx zMX|mm@-VnQJpF(V;wFuD5&$lkc^}pbGwqBx8@5=nogM3f#S$^ldc;_w#x`fkD8y23 zd$6l8Z4u?ETu`Sixfl5;>*+m*<2=qyV9eiW5AU-xIe&j|dl2$`Z0zb>AML|Ev0)1N zqkjJejCYDO<*Et$!cwH4I?K8d{TgJk@6O{quYL_H#pgQ7zGK;9CCOP85Jnz1DT_fZK?|}akOd-&FUUHphpntf+7Jr4o6;8yLxAbEFLCy~-e-!JVIf}ehKt|~~gYz=X zV+O2ajjClW{JjC#E!&;DMT8$KI`h_P$UUPuj&*5)wC$xs%_Il!es%bFG~b$P)^p@9 zEIlj|dHId7IK-iy!I5l?H|(MdYG1DN89CllTN6+9hT-o)oTYaNkYzBQ|FeA-zb5oO z@SOk!eiq8pa7Is?^}JAj79@R(^s8IVi(6f%b`YV2UY2ZUHoVny$$T#%FZ}lK1MiuI z?{#{7MEqy>Qz(C+omq7HsP}L8zCRm(pRzR|E0>a`zw_H)b|U|3vl*( zgzEzQKjS|m7iPcbmSuqtZZqz)pBMTgz}fe2R~DX|4Ta}sU;n6h3-yHed}R1B=|K6w zf6l&$+4$Y6p8`G~7vAc9x4r%`>2TZkeN4U*-uH3w{iyU5-hW&8SE2*)5&3Oq_vho{ zKl}N=SoyC+huQtT9saZH|6ecvjp=YZ{CvC^iuwon=yuP2-1~p2c6>aJ@%bzC_v7OC z->v>%ir)X-@cMuK`Dk|L|D)5#qm!Tq{QsS90v!ZDg;4&p=|cXXKf&+uXSe$?^+*BV zTf;xmZVkhIbHlnNy#KF_->upc`g1#YtLJC?g|3%xL4Tp0TfXlW&;6zA3;p=0@Ot}# zUN;-wqTh*qpzwDH?OcD)E$ZLuKD~$hskgfSajy&gnSu0f>SyvNTo?4}_%yz=;m2+F zZ(U!&>t+b76Zi?xJ6#qa=yD7Eh3kK7yk@tbkmG$cmLKjnz8QaE-yp?hsD6CJC6P^F>;Xm6RxgGvD<1LJr_j>=6cnJ8r zrmqY6d;%Rl0{+wVP0ok-jDA35!Y_`~OC6XGLVtzvz18_hLcQBV;r+>0ZpK&OO95{I zPXP*YZZ@2azrY6s9d4W-In4*LX?i8vvDs`NhPTi^;-4A(Z;#hUt^eV8C(iGwp*&5S z-H!9qg!7!*!(1d3hmv>o|(<}LVW?wj4!oI^rl~8J*Mxk zPTLtme@Np>*7Nd^_paO1RcOb1%k!e>9W(l15-(xBC%xD1NUrx{dAH-%dY#bDY)Iou z^J9jus67EsfxZL-0p29&C4C>FcM{$LUkJ|=OwxneNzzY%!gT>c&5h6CN#}w0p^WpN zxIlpP0X%LK^Z;})oS!^5aTdR!oy2*Tao!BX2$SUd1%42qaD6t6W87|hPPi{TCqUu) zYo8dd_|i-A_Y4?(FMAneO9@8q@wFyypY-ORiIi z^$_jc_*{;K+C@Gu+NJLg)48@}XW_5w<1Ez2yh`+YX8iHp)$8L+{EM$X*9$+01Un5tHyjj3*Ui>ILI?C5fmyLVzAu+?igQYBt5lDyo6{d@W|@(x1= z_V3mH(O376jTMDDU!da%_BDhi0@%OURjBLf2+)4?$BX?I>@vppLUOz5`vtDny|D`H z`@Ir3;X4f2H`_aPmcAb`))&D3O?l{1)>q8w@^WjTUoJ0bMV`2c zudlJ+0)w;+zKc*nHzMqDPkH4(vb0_bJ9M_R>C0Tfy)!eb-RT#69$U`g0Cm zUXJ}dyvdVZ-mfxSYKG{$5GN`Ox>S6Bq)!s_(fQH*H?CFCKFOl$$Oyg;l3lmgxnu$M z4f1ihm9BgC_gWVKD(uP?sY@3~joW?Lm%Tu0VvYEI#{y}u%Y&?YdAaVPReL6D#p~I= z(7jsDR0~^5{b7U zAKh5pf%C0*s~#{$nrI*RB`;r3`!cs~`3iQ^VBhcg+`Y8_*Ed}9Ch?CcBjlp*ix>^3 zMFc}X%M|y6E=IQK#0Bh&FxIELH{m=ezR!Az?kjkHWPudl^C~ODc_-MHa6;Zf__r4L zE)itxlKh_ouLhfI2jOE2Td@COTrYZ%+eYOT4|Oid*txcH_}Yk_^46^tP3E6hRTL^5 z!5X@6?bszFJPpZ|Gc_kJ_-RwwYcbyQo3o^5$ufjscvB@nn3 z=OGkd^Pi+~<_*;t=W+eWJGn2?_#T_QvzTDSa$Hx5ddK7M;`{?^q1blRNY{Ukt#5l! z#y*+-BnMJ#>?*oG){xOg`&AEYEwikxT&?9qcVOS{xZc&;I!gGrjBMFZ3A`1ba(B1j z`Owh!dcIWore4#~Qq)wqQo62s>owXx!Jc&$RDd4Rc~*RHXr(Ntrrt>VVBERQcMRaX z1D_?QX#jl0?teEx^XUh#z5Ej4|%)cAjp3o=U3r7SGIf_cU7q;x_C9t zO>s#Y{H>VxR`)Io;b;6>3;3a{Fw++Aq5ZxMT?0NE|M0JjLGk*g!Vd4HG3`B}fM<|{Vf zdopuz8_n;gMUi4z`5aA-HSA0;U#RhhgV@izQZ`mRjD1Hb(nb80VfsFg1qW^tKBa8w zw@E(Ay1KBhJx_CS%>OR9uCVLh%igkr9#=}r@-N_A0BdUy`-i~yFWEDQ9_bzIt8{MF zX?+1l^Q$1efg}9KYPQr=0{`_DM@IHQ&bs(`0pYuWA5Eik4+^hEqBL&J&V!|>r?1i1 zKSTS>d*U@^B)76&xa6mE+8DE>c>wcz&UY5wLHmSc!x1atUvsdzndox<_hS~?2fV9U z!idWU3fb=}d$12k^TQu@;QWKl+E4W@dQe*_`a6sN(z~>usi>%=guZ{Id`_X3lSj(}i;iUU>c|J&AqKqV5=-n{T$HZK3@izwYU1p>qmel`9!K zA17YTiK%>SabH88=7PE;?fwobdxl=aF7yiR({AVawHS9>=5yO8YX=JXBlSGt%YSzO z`<=%1?3F%0@#~1s=q3Ct9r5A{ZCM)4Q#vQW-eSW1sL<91llGk`mL0v9 z){|cpt8xBRS7EEoW+y(V$>*>?r>Su2n-@id|GRz$`@2T654>LizHP{gM7*&DkX!Zq z<=(`1x7rGTcazp-JBaV>j_dDO;l?>SbC&+P$9lqwecjMwOf)|jNdfS}xe>34?`{Hr zxN@DL3T>Xoc>mGw<9x42YxRE6z`fa)vAC~7`@<~#aJQM}UD5DpGwuJ%SZ;R_{!JId z*hO_g{i)-%o9R4@mViehUXOF3u7tyMPJ_QlS5Ny~MI9|$Xdj@6FU5DrPG*Lewy4w{p>?jNpmN}HFGdIFefi(tPv1ty1~??!lk!|x=1-eKDER3*-RDzJy3hg4`U zD&1IrQ#E7Pc$_aVUutd`slK58c9x}Pe;e(SRi~KIUaIDqP%wqg^P22GbcFbzAXlLv zI&c$#>eV>6$RBWfE~tN&Eq1#T`@$Ys62|_dk!zRY|0E?aO811v&yS2I%UvtXp zJN^>p6V^G;;6v%^kQei%E%Km? z_*}wde3$yAh)WJN1K%(G!$VVa&YKdE2*SU_6mKQSzw_J(eP^qvJ`yE)Qp302EnbiB zi1FTPdcI)E{xPEC@VnbgI2|Utq$oG9Li_Ek;gHoz_%6#`ym$a~d#0`y(gEjpC^uu? zT~PnzS66ZV0QR$uRGN0-94E8Gw6k3Hv+Ql3J$;$Z{VR3aTIsw;&vAEmqiQ6_@xp7p zkKr7^9P5agpxM&P(K#ibj&2Fixd-Bu6eso15_NPD{sqbi^u-EoALoZYh;!C1IyzQs zMAEhrTGvF=!+_6|UB@FE-%3gw5Jr zPl+4Wf}i%+jA1_ZtNl1PkM^m_#TWO}em8?Ig!hbO=Sfmc?sk8oQmUIyO`@$NflA01m49|7Lkk^<)? zI-l&o`*8=+W6I>P5#-%{LAs9bCr;8imwK*OK7jKhB~BK6i2Z2h0*?anFWl8)6GJ~X z1f2fPJ_zWsQr6nseykDK9X-*f>3qvShMv5-5^|t}>&~bB=h5D$vFm*#n`Lc~ zUnAKCI4H|rHImKQoGkI1#WDu_VxH8p&2V%L_Fp<39b6Oi$IQjNo4(ukTG-J+bTH4e zv751;GUj^SYShEAI+*V`|570m(>iF2)??mxVqNzZ$;)@ipm(#mn%`z`^VaFgW&UhY zTwME@4Cgh%hRsD;Xas6deJV57_K7#XtX@B|A`}wCx z-u{#P3cC_^$ZPMLnK?^W$|f^nIPWS&`uccXbR(`Cb-DN+-%45E2%YzHGJ9kLkNu

XV^i%9(?|a`*`%M}1{g4wIWrmWS=ok3Wks8>g`fc`0 z4>4mJ;Qi{n$R)z--$%Y5rg3^^!jA9RjbwKhwDi1;@^{X=T!gP~@{ghK;5{rG8X>$I z?vnUv{B`cWb3_MhbFCtKY}m&&(Rr_xQ!5mWutyxxND+2TXTg}ocX?nxdTPr^&&~gd zV>$8P?lbTHbT#H*Y;W^PlJ7?Dt#fN2ckrQ^VcIWVJ?8h*`C$96SuJQaOLUeGoy!Kk zqJwp04~YYw0y;k{Y@+YzbYz8cX@B#${`5st5$(Ulxwyr|Px$)FkF=H8H`{i016KX) zdK}zDjIXwjWQQM=b9645`;nd%L?=T$^D{J#fgeBrJ;FbRb2c_(os7WPCj4`k zWWGXt`4#M|CcEX5=G+dl-{L0kJ#>x}Km7FbbiPwOEc*=f`<%RX-6h&byg|o$2GF07 zGF>9Zyk}prVEwPqvO8aazJPNn`KzyyJeo2NMVe5*rluF?Gkh&gS3hQ@Q)x3&BpmoB zr*5}MMEmR6P^X0Wg72`D(LUea9_3vDJ<`BLkVvCA7}fG3#m5FPH#Q^rVcnVWk0sBDi`j6s$M8Yei7JCo_L2?0ql1sk~_hE_O)xkGegeR@4~Eb z*qu#$ch5f4BIy6}$?^5|X*hq+@_Dk~G{SBHumNjR+iG_9c0hl2bl60>@VmZA2Pj(0(pf}qh;(6@<|yIanxOYI5pcV zc*(9RH=KBx&P(rO1M! zt|G!e+(@Ks2fw=i+46GI`?V)DZt!LFCLQY&d6bZ!P7V7g5IZ*QfSu)aDD(c%sHlGG zf&+g)SL8bQy9#=LRn^hvbKtu=LlySh!>KvgNR&s4@=M>GwLc?t#f>~#s3WE1thC-1 zL|l5}f7t*;XkFPawSe!lqTEkM1}Gnt0KWGcy#Z)Usi zroX4P_w1wm0LC@tqqF(E7N9@&(rrv`Z!P9qe<_-<)FH1g3iC?Q-`iDgH{}&$nBK7t zaFSTG0{KLi%X>FHb%636WpXBHDaaSxSngdee=OB2lQ6{p*or61s1CA2m5w^Z$Qxa& zJ*5Wzfb`XR(uV?}FxJbC{NN@%54<6>w(gnV()fj`>0QW%F)tY8EOfoUV^uBDV@}R3 z$leakty|_)KyDUxGuWp!>U6Ji5!n;!Ip&ijN9Vtsm`nD*F4m1aWzfgoRXnsBbpBmt zUq8*;%g;=iXc4!WAkv zxWQj`kBX_4khIX`E*i*3*;^L*jkJMRa)Ca}&mQT#JMC-K)`l)@Hmw;|%^o z^%l~@bN-~$6P|GT^rqj@IzV29`VUL@XCVEXutC0Djw%AN<*27iIOoEwGntdUQLN*X ztP6r;TI4VK!fcWsf?$Cjv``-2Xaw$)lGVBMWhvE1bvc#D!*Mj@=wuZ7#AEaFR5Iyt z;y-Ssh4NWAYK$+5a-sR;DdLZO!Omke&WnE#kcSfQE%s^_K(4qB+K>$rchR<{BAa&She z0InlXyL%GZe}?j{mN@i;9r+cLixyGqE>K+|yV`0t=nhc5*|Dwy%9Gu5p~Fo2(KBrq zFVK48tijqg=uu-Y7eJ54de}4$ToLwY%z&&852tcouj*#tjOXiOI?5B$<#8ZCAnF(% z-ij^ zunP6BLGM!>w*l+vvmj?*fq6X>9Or1f3YRHHb#5Ih-bDCq(C%X?|J<9CQPh!!{Umq0 z3D=CdR3FoLFYO6`O7>8ET%ji%Z3Y-T=}9dnQ$Oi_*?B7AL&&{=L8pN|P;w^PYo~p0 ztg`L=RiKji`BRXq(P*UDx%@B`q0XG*q+bjWM3Bs!$q zSP!-1O)Yxj(>=}2kQ&fy_?>xlJzP~^CgN*jUBK6n@5&r~gY2pM=cL?CcEXx6|HT^h z%~|D!3f;o2$L1kzTKAdE?s=R&hCDJUS<~mgI8XYyF~Lcw-4aotKIpLwuQwI-#TRDz zV%7lRlAko6ZC;6fs9a%jJxls4(E@*$=+U0Z7(@Y7+F$KGukBwhUm@;mdS0q@LGMNV z<$oPDorB(AcCJH4_eb7%Q3-jS$tH}3Cm=^zTf3wU{En@%JWce{KehD?<)yTpo-eM8 zpS8ze=R*RR^v{$2!jDf6l73t^c2I&mcSV(5ss!b&JJ>Fl5&tm;ho2_gB-D}(X>}&U z5H*z1xS7<%MdEv!gNqb2-d0JQfyT>S)L&^%StX0$xc!@l;F4(ZAn)Y*ErJi36xv6oxcS6oS zJY{VG-G_>*DjLF+e>@ycv?{@e;*ofO_A6uma2eSPQRH=jzMOFdg(Io;IJha2pVAIT z&q7=`nOb6x&AXZAtM*t1$zgjf$rskMGePrL8EmU<13&1IwQVFx_cz)9DaRJ{YeIO7kA zrd@S)nD4L?_S*LRj#jfhjqFx!`I_^vuX(phwz>{}j;g_Wq8G{u!2W@J3(NptMc%6H zlpx_#V|(}RB))gX;V=-N&Q&;A%2y12P=@i&iwU967s5_}d&x!n-Z)-c`?!4lylsv! z3$1*fxm$&Oek{Z7%o6i2y_p%sKE--zdIbCHSO)CwqjNz2(@*g8+rZyh{^i$cpT%P} z$QFDiQ!;J@-#(hrw2yBlJ2=e}4AQv$r)~3T-^C*?75P8nHrL$akORzc?cusQ)Wyi7 z{MN^{2V-l>Y5uJb2raaq)|^O$$ZpO4c&o-dZ=<>g6LZVro3p}ahd-qEEtNS0($CD+ z!{8em@)5lNeF=H_U(g`W6Y@l9>dnWIClzKj>T7h*`{O%~&uG5muKwPIxHc~SLt+EQ z-*vF@x5r>l4KDbHR-#KpH{&>#@mMM+EJL08hf`Hv9{FZl=LKAG=q1N8iYppFCcb{} z!7bpAu)D{?;BVs@rz{qZ=r#RT%1yLx99IgF5C2R?*O)#)a?*WBxsCFAoqgu%2+5Cv z``<&p%9U!SqkWq6MSI)DTDm`Ac-cn#?53laB0IouCI=iGt-rfDg~EpGs_%V!H;wad z3n$uLZ=9H%qI&VjtLcFMOK$JKWFUOid`Vw<>*DqE0??PqKGbRsSU`u2TV6~gV4Y`N zv=<{w6X?TgRJ0DEPD`NOWU%45gyaeGFqx4xeBNh@2L|Z6*;FISi%?>daUtl`m7XS{ z{p|^H!4+tcF4nsP@4G$5ac!6%g_~!OYr$tEI+oVAm5aM6&s(N-pr80sS9set(iiS_ zX+I-%W=h2G!Nb=gPbD$baQgNszzzxVB6ZG?89!&*gx_0!PekeUbFKknBSf z@sr7!hNiT2z+3zRa3##6c|G*SOy+l{>FyQ4O&qSdvgPs(qI}zc`S0giv0oNuEmBx( zR)9W?*`OyJ0O=CtB){gK<==uHnWZRp!~TbS{;rrscL<;G2O7I)8^>5mC1-+Var zwpy);^fK%DFptqQ)~HSo6o_f_vMgPzgwx?v*tst6(t;mg-fV*>D$b$q@_#-%v;RQ; zj{Ln!?hEpFRrT2~QU0yxo^tu&=dB($T27N6#9-m9zk%M;5UU@SR-efjjoNcbPE_R}Rx@Rg3us7vH} z=)GFx>oNs%tz@s)Su7T^t1Vo#A_w}0?i(*j$e!U(`F?}C%^8u!b_?lc4SO#irG3Hw z%sxnZ!G*lz)8zkr`a=`)kV)6&-XtF*91v;YO=Pbyy^d#y@1zb`^mJW+^y7`>-&H8v zkJqBL+TYoj21zSr3>QeQSG>{(dmDV#P!Tx}xp#hlcPsfPD|Pj-$H58gu{-GRVOO_` z{BZ@c=U@lasB@V`$jf(L+hV-5m-OQCU1qeSb%x8~r=4<&P}% z5-z}+$`fhe`@&^&`T~2kB)aF!}K^=t02veT} zf0ShPCVGJ*EXc}sqy7#2HHdqG{=Krq7lu?hc2TCpj!Q z;Aa>rYPmlRcIoT+t!DGjL>$>(#uA<$i1DbS@`$|W&=)^^9p8JQ&kvk&LDm=V=Rxi- z$nrNAiuj&+(D)G1-{h~?t;9ND-D&VUq-3R!>0*Q*nqwZ|vK!<}`%^EFd|<2rhZ9s1Q*U-h`WtyCg0|MJ$7o4%+f1+z-S(l8^3VGHLdUHogx{(5)4D_zAt`-- zB4oIq?4)?l{-Y$9bPvrbP-Fc%y{)d_G}=oWx4M*KyvO=&uipcCW$hjXeV{=YHIT>0 zGQRDP3$(ts1tv8lhs$eQM0##z8;~vbXvTNHcjo}flLlTPqjlmOkV#2jdvEVBa6ja2 zkF`oDpMFX0Vutu{8WJQ?KaifYq62bN=4pU`0Q`TH7xfRLskN2#lIB=cLG4uCvNh0$ z5V?Y|tzNpHit zH#XM5pSU3Ft7qu<9H^@uOYDcNi5 z*tQaS$g--cdeZMBEio0@GeLz_^uv1@jwgO9B;t^h%jI%5#K3;ZG;91L(Bm?D;Mb=9 zelJ+NnEJ^tRlG&?;NP2@MtaiBr6$Oog;}RBER7LgYzU`+PVaFmqYj#PGd2+A=_fmw z^e-i+(o>sAJd{rF&s-fc%5D)$)ob} zU#h6hPBGh$gHMfq|NEiU)sM?ZPievwC-K1CcDx6AOm__WFX%C8)R3NQ=L&-gkCgY>aC`>5W>_j|ixS177SWZoZ9{T$<@wfj8s z*_#rr*jI>4b6x@-zd>H1qkf;s7-Izstp`uMU=isLxm?gm@;R3?BA#SUiKV|7dc}F| z)K-0M8gRUNqqYL;A*=Vr_7t)U6XjNp^zx++`yl+;YS~m7_7CL2d+y>k;P)NFHBGC~ zGR{!$bkx5bCMcQqgA^-27W(@TJx94}=T2m|X z$$y^${+W`M_^sDPc}YD}u2zbpv%7RLT9<(`-a_Af{y(Z($o}j$g&{w{-%hI}BzM?# zLBy%S4*T{Z#<3aeMbQtu2zi0)E5heMhbSL;hSp`v$p_4&M>`f57L%VP4fTZ_i1&!c z&!4Atka}@;e;SM?$T!IU_B`0P;M?DRW4Z?X7%*o!*;}@c8|Tl#@9}T}vW%iG!DVwT z;W*)jJ=v76pWXLf2kpDWmEjo4&pqR<)5O1ZW&G0fz_X|h+e*BT2cSlJHq>rN72rV~ z1>y4;|It8=aR=(HF%kvr*A?18{2vgJfycV5R+bKs|vBHoqasLYuyWyCisx)*#w{NO;&DB>lsf3Cd!3GJ);$kqnp z!xx2%LazGe?}5E?$$b4co;yp%fm1v$g#jny!;^9G$#`&xUNO!%c}?-Ov;VHg2h(@x z_y5(F-go^wvvI&aV3G9uwSG}Q@lWh8+GPK4Y(0?yv99>_c8_?Sye~wllUpWf^6 zQq=HlT=jK2%=RZ4PygldQ~$o|`mfOeW}HZ`t5090Z*ttT-~Y35BmDY$|8E>$@_Kfh z$@$(BffbE^$$AOb$36S|_3PQ^lkX=wIGtaj`!#yZ_A9v#zOMZ$dWdAYx^Dh*o@d|t zb@QFV>?=Si-M4=lPhUMJnxwy&pS(YItxkNhf7iwtY8K~v_tmyJ(&VT2P(Aq$oO7X; z3kjO0NVE9+x{0L|^!H@_>1NOY^NLwT{dN2&`TiT%O|n0KMh~yoo9sWGZ^627(0N^Y zKdlpoEi8EcU-%ZPtnkV4Cf}Q!UmAB%2w$5QalAOL&=hJG`(JTGi+bwf@5#S6UA?Zj zT5tPWJF#Sf_D7Nq+EArGh_xigL+cmP#Z-au z(fh<}m%v{AolTD8>)Is~&r;ZYUd6;+6Ik|q1?a(XhvT#kgoEC2@;Q2+!jwI z-&*objMrQd`qB1ZYU^tYhk{x|Y|9%15oL8+S|0C-bUE>N)J?gOpWb*)b!50$a{ngB zn_PFZ^DOA;yD`+q{_?m{{zWs}UyfT6S~^Dbsk}O$H?}msZtU;M(7M_AzDh5#{x<6Q zRiN%T)~j;~>aH_fC?d9u)J4xJTwd({m=CY_6Q2OR<4Yz!Zmb$yHb`~3!=|Yhse;{Y zx4aQ4MBRDa#i*nyRNtAFf`x%6XCZp(TF$j@a*3&U=@C$prgLuJ*Hu>C;4)B@?JSPi^Qykxt3= zUOsYMD@VQelfL_GGKp-?v`-u-ch>|e%;Q5R;c-cQV6@`oXiz&?rCE0fCrGv(-_USq zRJzV|Fg^WQXIp9E%S~7A80sl)KAYZy)v-ByPl9U-oy5Lq?V)wU*n=34NVl(U6M~7x z8N~jeaWULQ>>_G~Fty3?VwtlvJ~P)Vjx(6h>+kZP^f6dKcll$!Zimb9Eq|2e3H`ro zmL8}NM082gDLH;xH}w0c=hnrpY-c#;d$dj>Re54Q=VsX9Yfk!lP_OoO)B^xsS3g;H z#}G8xV|8qOXN~$X)yW@sxuGFDvQPil?x6Na><>RJA89L1yGiamH2RBOitj#`wq&Ak z=+5FrGO?~b29W$dUDNzlOvHRvOsF^>6fm0hVZJzpeRh0;o?1-rnAn1W(EaGHiN=fJ za(DWt=^D??&eyf;bF<^Uas1cjA9TU<`0i{!&H^Tp)G5=*eoh#oX9%&VVTlpXtv zaf!b}jBK5VzfbcU^L>WrIBwc^a@5Xwg{}U$xX$T51((p!`W4@MbsdY}>8JgH-@R8` zd^ZQU6w1RFyt4~-S?KKCP$TNh^63_;lhMbn)eOUKGqdsLdvX2kt}g#CKnMT6irRZ& zZxoJp&Hu5jz4W)1x?#6_l{zggMRIcVJ{#4Gn)ZR81UddL|DjO}=8vwio=q_yDV1Z7aL`$OI1Gf z_j|zqYs*J2HZsh9_Rwg=!wDQ~7>RfoffFL0@(~st+&Xf{5T-%cI#M{)i`Fpmz>w6z z3$N1e_ygJj&Y>oQa}3b~ZCIp7>^i-g zLThdK9R=LVMXEEbo+4tNV z)ij>>AU7BktbNao`Y#L$oO*s(N55nArPPjjYj164-ADsZ=!?P{!97LvQ+rh6StNW4zU~3m@X&IYaw2F>j>(C z@hnT@7XvTHf57ZMyv6)UoD&E5(fyxB@PE4XwZvmb| zMdW^1NBfgydx5LWpj`!gp%5+AGyP+j)sz2dGS(u-w@d~bO^*Zj^4fN|$dCHQqW=DD z)L-I2$X~%JzXu-AF$(_X#VJ`<&@mh1?&frrw=70npu)x8ycoDyX19rOXhnDC z*(ZUg@TN2Dcen3=e}2Aq&35b?A@hjajW|tKa?>j#D@$0OV>CndQr011UKx3^j^!A% z7aPOS4?Z3JyFIuz8%EIT81PZmcD*s6*yU_5)h9USPJd4+tMN+in%Jmj+1fyTC*kpe z`A1^iFCjp6JaK*WT{pFS@u#Dx*Uf68Vtj*MNWITS`;?W0J=D6HT~2BPOcb77{0=`F z&J&a^Qm#bYH|v!$geS3_nW6QLdgaz3ntzz*4nC<_yYv<-O?l4<6^h{@-(!KOfzh=lkwJ~+c#496C zZ@YBKM8t#J-@DWQeH&Wco#3zuW&r#8Vk3@svY(D#-ik=%ZI5hgB?JUo5pN`gdhV^Fd8v{Sz zCGb+KVdU*yHi4N-c)3gBa<>D&-gz`Vtp@8&F*ykwX--M->aHtI!Jm`pzkBBF)ctxgV`-#>RhT z@VP`e_KWEbRjY7{%MWWYuPA81;Z;)e6STKI?p{j>&B0 zcRA;7AIMbVD3faYB?IF%jQqS)7M99h8Fg+h<6?u)I)}A5m@d7~_Ea5<3AoR;b2HB> zm>=6l8eMGE?sh-Zsp6G+Vb9yU62if?&pQ8Sw=5XMd&TwC`uDb6tSbfc_O4ZG)?@AM z-MmrVY%WWDgt%yy6L5-qqDVm9<(-@1UlVxLhn`bn4Y|($ymMn|xPWKZbheiYfhl$^ zBKZVC#_n=ro$CX6zrc9du^jU+Ko4A(Jz2+<#-aoIk;WT8^LX=8fjdmPH?SpS@lMB??onc1d)L%zVx4ez6!?Mi4)1>Ek-yWL({Ug6MNyR=+4 zvj+OyHjifPlijc9OM-|jZ=6#SfZk2~Dr%4QBM!1iBgo8j?n7`fK5D)8=sMIJC;tKJ zn;*#UnDU7As~jD6mcuo+GdmCb0Oy3+pLXt_XNP>6BEJvw+#~k_f0p(N7*{Iltd2om zq?Slg4D!jk=kwpGh;bX$zt7CwtBG0=kK;_Sxj3q4E_Hz3@b9M%ysWH7+#BTH|LlGq zbpr+LhYyM*(=2<%vqFx;{p>Gx<(5d40{{0m$Q91Req#Xp$g62C9Kw2I9AU%AeKx;c zhW3glFWWBrP%Fv0SIXj?*x4eVKF#tm&ape(W{&FXO;%`n37_qV=zJ8PIHRpMJP$tU z<5iN}64a@U>*vlvd&=MZ7RA9Nx?57Y(uH!tohEz)y~!=%rZ=je&tH_=qG<h$D4aMyGEw9Vm}OMw-3b2D13K^n zx#kJ@*ED4<_Km2++yy~Gb-%TGO+Ce>}DPEtI@L4^YG zDH~8favXIKaZWf=kVF0ncFHR4L>vLDvRI#lKaI6;syf6Iuw(swzrjA?gMsNF{8T#g zCG|!;&k9nE8}-?R=s4lnK`7fnWU-k#U(f#2xW&-{;PLm6NIq?59j_WC1rM70K z{R_M!C4)^(rd0IzlyGoSP>VRyh!B{-a|UCX`IEnSoRR(k`;g@%!QUXxV;YJHo#!8mG6L28L;eYzUtguROBuwe4izP;HZ@AC ze-Hh_g*uZP@>yj7=fDtW9|&$)0Y8VK|8^;j$0?IYR$-k8I%Dty(3?^0)1`t=W+?-$ z`hy}zjtA{TQDX8$B(>!E{JxV$?uE_AGS+J~`VI0d%(K$J3j0PPEk?ZXoD$6x)BVn_ zjp{s}Wp{3VKHsq3Bv`O7r<~zpOKEC}!#{P313hKgWBX{`a@>rE{8%bwF*gVPq;L1W zu$0EH^z4y*42_Tz#&k6AOyHu1=#g->f^G-$Wt`Vd^{m56XVL1qRcf!LK=Cmm^DM30 z`VNfWV74SEKY?UgV{C_C(VQ?gQr&fP!i0MDDOt`QrGx6HJD|57$R|E*W9DFd0qCpG zV_iho^yN}~G|URf>Jm>fQjf-kHCjx8Cj`Tb0T~U@jKFg@OoEaoiUP> zo_35+5wz*sL5~(LbDZkbS85Ec)NiH66wAeTax?iY6NvARds8l;u6Pk|bEbD<9uF!c ztu)_=)6h};u{jV!+|q%34ZjqAGK%w?M1207k{(&MZZ-Tq9O~Rr+|S}}Ww?{_U<3js z;vorr(DV9pq~=2-cRSOqY`fe$>ZP=-w64gY7*vFTRzr1XE)P(y9yS=&-#3Ro+G!H zq=v15dXO&zbl<#sBWLM??~C|>gSOsBQ!?m zqJGz48>IdZ*K*$jJ=A$P0sk@bb+pU`L*z$`GDrYYJyCSh(1i2mb#+$w?};yPtOxNZ zLq&73f-f}M^2_Vj2gwgTlju#QIIZ*^`9W&`&=x=(AI{gCcZ+ex+Zfp`O4Kyi~f+GkE=BXDUOm+ zdd4OmMtylM)Ij>MS*q+=1-&M^zss}{EiXvI%Ichw*725HntxMR2|6JDdce%Au0F2i z-}s=l6Z8A4{q5W6T(jM7X`#Bb7EWmBtV4v2@t}(GHSj4GFU47dmw9rAZB#M7ZM z=t_D`7qA~%ZND>-KeJ_7aGc`p?>Xo@Onh(Jt3LgOzp zn3)Y&AEeTdsxAwMYaJjDYrw@EpAF2&K2P0w8lNExzwBKmIl z^%rK{n|8aM{vK;NpGI_I+KY2PKr0;x`F^vxy_7Zincr;2`8SONZBB_hZf80%uLCwI z#;d5-34HaFb&6`I>I3X^M0P1nPZ1r=R;?a&WwV$`osQyp244unzm7V*IU2;Du8=cU z4Vwo&h~q+)l&7S=eq$QNKXwOgkoU{w51xwZDGqm&_q8u5?jjbgk5d10zLNm=*dX5= z2x8n=&;53B95}sap>r&VJCM`)4bB?KMEru>F@6+(M_pQ#7wZB0MCrx)0N=7inN>bD%INx+S6;AC+pwj9`={;5-+)w1 zG>@L%gD=te<5zzCQ=0F~myP4(hpw+$hPYkIClvqP0kokrCey^j6i+3j12>T`oj?Da z1AI{;>A?AO$|q6-I~jg|97v-0htIbf_pZk85#A|K{Dn``5+%QTu4AB>=GpAv%P0={ zs8yOm@wdU)WG=~TFPw?=cgRgUjbBIv%`5PnM2hn-#8=-MK->%V&zaeHW*IjSB>H%# z^1}4p6Gl$4XuG1iINYGWfOCKeud;=3O*HOPuP@$9?KUUH zX9TrXfw%sRWj`=#qv$SW!glhluCy?-r@zxaztA<2t~Di86TJMv|U-ccG~Q$;!Q z&ER~(+ztz!n?jf@;_a8qHIcqditEuQm{gKCZk)fO`o=nA)NG^qovV6~=I{o?i`fyk3_0o1 zw@S>!19x-xl~0ruM7-`APq6(yvGFv)f}WBw(cDMkC!B2p&2~YCx^qd3!x8!>gSN+V_+ob@8d?4w66UPC7oZf4-2l3tJ z5MX8@>0hC1_yJL$7`QwZl85{bE;mp8!DsQcJ;-Ag#x>}{319N-(RIH+>DQwt0c&dL ze&E%h7Wt`S3Gw~#&xn3RkW2JiCEJ8apY+Q;2%Mbo(xm@U^cP6I1HOoeYu7e~2tRD8 z*b~`~$Rmkt0Q~{+@g212|Ch%HJYDpkSh-+={3s~rtRcSw#y8u-UK0Ic0?Q`9cbC6& zbBau!M>x9#c0$F(YS>A`TOOPUYR%^9f9P^6tBXH5U08vBWZ#~4JJCr2+*PEP*uwu7 z6huFb8Q0?X5*k*-`C}&bLEzuOYyI?ohI3!V-8qi@4_+tv>&_L)J@CJb&M9H~DiW^( zzj-skHveK*jav2+U!Z|srP#~wJ?Z3tPA%pSM1cTeb9C&B^Zgu4J=w8eZ^JcMHaM;*d35a7>*&&IE|z*~XG;_s+$ zdan3!`=q&@}3*}oG}3ph1>)F za>o$X(bHuAER^310PG&b3BwGO<&;#*L#*C>5AeSJ2n)TlTJDPEDahZ!e&WXos$4EL-P z?Ti&TAn-E>$6WEiuQI7%eh!>jhzm@J=r1^|8-Y6rp47=O&=Wc%<V-0P>b;e1hUQ8GG0ZJ2YS6 z(x7hm0n{6JUwEnx`jyS3nIe0AIvl3o2OTb6Rt>o_#yN(`-eG;+GUzqHx&42?=jJSP zgk|5}1wGW^43B#5t(JJti}+2d#LYg5_vMB4XmS2b@Vdy}2wzwP{bQmC$Frc1Y%GoU zOS#q1tHUo0R*_uL`NGHPJd!t2eli#KqhNEi5zD>A+IVd!Lgg7;SXryHo;@Dyi z6;L?jD|0R4WYE_+=kLaPH~&B_@zOb2k{ex1$!_Pvk^t2qHz&#qVXw-$n953ViJsF^ zIrLriV4vXx#i5yNjK&SnUl-lt+&`z}_ZdvLfOyE8v#MeTZDfDk)GB#n75Z0O8-yHg zoj1nrV`yF_a;HG{m~N7bi*}#R$~;+jAipONQ;>dH9=6%Zjx5Nwj8iRm$j%Dn}fe_N8=N5OlNv``_5(d(fnI1RJ4Q`N2QnwvMn{Q=O z{*}%ZS z?4xgP-T*zWoqcojN;PM(*hpW|U7~Zoh!eaN7$p5_P2EQaNIxB$j`xvX#$bPh$T z^g_=;+^0lxmRe`t{kR5BW~}*d(l7ctsyyb2HpDq%!0Z`Mg`o zTx`TSIi*AP1^nPHeS83Dc+)Pk|N$WB|g zj4e+H%^~FL(bIe}5Nr<&;T#C$`^iywMp7jFgA?C{pMirMYe#$l13L!vdn>B?#z1aK zo|o0UGMZXq_p-q4Q%g8T1-eWWeWAz&UP5+)-XcxUz8>#gra$?L!M z`Tt}0eeL*ZT_ov{Z2xj!{H^^;j`zm)Z+-r6z3;~NC$InF`L7%|CS3fT#+w}fSG9jT z9d7)7@;cf6MZa!bpMT>u<>#h-oP6(%?X~ZG-MFuQ$A|Zjr859KJsu`Il#xgwzi0UX z+H3d0UO^u3-r?_(ONg#3n z>nUXq^b=^Qal%!ge_o5zCb~$JF3frp;?=$QKH`WSe|cWv`npKY!*zN)94_peU1_C;9_?COJRJHX*KC7uIW22;*Cp5Oz5kvw8ly zi8nVhGYP}9&U;F3i!}nT0{*O$dqjK%tC;W>2Y{+((81*i) zfG)tR0JtT;>%%Y9ec~qyu0;bPg@a~*J)fjXE^=IZ#w`|QEQwD_DjdJpDv_8b+)58RLF zKzJkG8w?4_xbEaUe0}>*(5nZRy)q(Qcf{ee{T<>LW@?}6y3h7H@~AZ$>D>5RdYjX^ z`SpCkvlRMw|EL7#3kdI`{u90?b$H{~;%tGh5&IX{hr`PgJ#gPudeFFtF2qM+{~?}b z)}HfXd}I$!Uu}s_dqQT819h;k@Bp>M9%k<+y3zgDan-+9ymb>@h(2ULD)67C+4y4-r;G&!Uc@W0 zF~s#EgvI!JJJv7Zq!K0PXu5h{V)pNXM#OPlJoXuIVwXp3xdg2aq63{z`17_Y^cpfr zSfkCr%c|-(ZT$t}ijRgOW8`-fJ~~m_6lyD#&CRnlh0be{r)@lK-Rt>Hy0V!kVb`kW z^Q;o_lNA+uoI4%Id1@E(Z%MKwuJeD?ARgOpXwj4dXIsBjuh}|+6YM+Pd^zwo=JvU^ zld#Vg;rVGF@UYe~)9APx_| z4>!a9uTd{L%>rM@EopV+h0B2pC~X!~`G}>o^R`sN6&{XN)dGj!s5ZB5i#rjIxonl; z(j1IO&zi)z!LzK35#tCE@JRUvezd|Yq4k`dPVpbM{H8I-Y5KcH!gW(Smih0mit&d3 zHm#$$(w0E5mv9^Q&BqT?-bbrRqoKB1qtVcPODq57^f|ODx7$VMTEDH)RFePx$%e`} zSRn{J;6Q%dGhn57kFXH4QXY+GOcv?L=35tk3?P8c7kmAJlH$O&{&;bl z0=T1wb*YANt~BDR(!r}eFHvqZQNEi-@BHr&&X-p_e<{V0r=Mlnf9`z0sNTe~w<2!T z9@GvH?vNX0U!izP^Z3}CG(L%^`DZrds{wv^cnEb!x`naP_u&`p)^Ou=4%pln^-|nG zlx=n_gg@IGUNM!D^>C_UidCE|vgP~o(p7Z+nH3flufq6PZ!AiA0NF~D>Me@bhhw=D zI7m1wNPoTyaY`&NEgWiBvvC*GhjR^p*_kaP^t+O|e+Y4ZJTv?I7{#UH?=4mJ6z|sF z9n+CtPKvlP!t?5*(RCERv@+Wblzm~=p_G^2qU)DG8K3&clI{7fkDa!AkjFY;5V*4# zr_^c7r8rt`S)>=)G3LdBwN;c4(ki|1*(&6@;aRqT@`D2h2X1#a@)`*{hk@rc6!c)# zE|+g*GWJvKZ+3v>U4vk9XT$ocm7yyKbFDW~S?~im}Ih_YY-D6W&9kKSun1t)Xz} zKz@C>4(H_`mmBn^Ep)EiC87L{$1=JDWs$SMr8;B|;I1iIsjDnfTIaFTOWkDiU0ImGkij|t`(TDMV?^#ai&%m!uaa9#=i2AnVYbTkeI))czapQ4EAnnGXr z7`xuv1pLs-bqKpdpN<-(oN39#yKdxh_TA|Zdl)<0O4pp%hWOk2hn(<7#C)IZ&Xh7$ zhLKh3OW;=@0SCYIhM*^YWeoJ8AJ}(-S=t7F49k11=e3W>*)fi(QUAKgZ911*qdr@t z4>zO+wP%YO^u-bx&PQnAa0nv5KFeC8|BCybarGrWD9tW;PU3B*eB%j=3+KQwev>9A zZQU(chw_jN+SAtfPa*2ezz79PudhFtqm% zG001Ir+=55;l^Bd`M)s~)i@CM%e#YmAf3Md+v%3ULyB<%XKOh*I?~8YCcv+h)l#Ph z{Hv$5T*D&n^ITE;)251c#CVQk7Sc|Bi|=)gJvo|ma`)9)&Y z5?(C$t1^$Qr}*MU{d}161=ULV<|peA-(!{v6ptC7w2pP+8vC}pDTMPP!65M9!l8gs zgL4z3o-)2WGv;%<9gzHoMhk~pC0zEQ(PyDYPwEbhUhza-7t&6SzOyUQYbkGVP83zu zS0K)LgZ#~q}~J;Z#v}iCJq7;vc%d+wj#QpX* zLjM2Q$qZymPWlRm!XDK&YW1xQ&aHiSyTwfFc~~nAtY!aY1m_^2ul_guhDe9XT1ww9 zidAMZmeTF=#2Cem+Vc6GffH!kN-2+1(6qyYgc4ysV^Wg7yP@N8)Z2{qsQZcf z^?cVG@8MhoIQeAEDDpRp9`lOv)tF4}$cy0(-Liw^ZcA^#L~^cWt*f8%raEI0JNbLL z7E|tmtmo#%?$!jVk#|=3;I|!g?fY+6A?3qI-n9PhbS~k3j-zY+Wa?s~mq)^+z7F{i z_k|tLI&Z6Ha=F?r_r$~IS`Ff(Z_fG?OqCw2*L~>{hT`&{ZPD=*ugMEjlAsp2x-0zd zur{}3vOSg(q_@nyr{SA(rC>_6m30pV&ezQL#v%E5T^zEfP-j&)(I+X?^hBXScP z!}=f32)q@P(6r(dyS{@Df_@<8p#Kdq!Zljn+f38zw5uT-;D9G3=vgvOBy{2y{z zZ-xI2<7tUT;kC&)SCgt(j(j5&d*GB^d9LW{VrxK>!bYJp7ZBhw`08b$F!60 zW1nc6gNJGSy@&T6`Qz@%hs(hz>HLNFaEg=m-81G%aIrZh#)Co8j~8Zb$jiA(Jtni; zmDOBn0DAqDwx<+)!$|(+Wy=B_*;Q#DDRMU=PoQ9|H-In6r7pdm@^wVKX-ax;TI&mi zl-H}bV9x;gLoX?QOOS7voBloMx|d_RX}|1qKU7TdlcAtQ(pguH zc;qqz&Z%Wd8d>NcphKf$_03t(bHBkM|1A8UIWNCVdfJhD78g@|S)Tl`iQ@LGlX}nx z@c_sdYXM#0);Qc^I)H z%Da2^VjJ@Cyr18wp9G(KJ%6flUk>Sq{Pc&=w-8rwM$Zy|sERA0#~#RU5EO`yNB+WE zGvcaw;gqgJ{#t{Tp*){cCLQX#AWqUgh`dn9OEuFBtMU2#6xTH3j1jjF zPZq^DrgHjh>W_gvi#Sp6&nux#*;s#!RA?mrYaei>Q9hQmkAep3*TreClk&=>Nu`#b zAm5qUp3u{M@K;vSymUMG`ReM|^KEGkj>e@iNYFy>WTWuA(z(gXRBERLwvFPs;aAmB zz89O4<25%Gc>~jv;=o zr&Pbiokn>~eJyr|@}o*$n%_tA+dcR27~&E#Cb@*DuN7o3%~l}JVSI4Cf&Omg-e4*2 zx52Zgnbt#WCN_N*^<>PGu>m^Qm!0ihL~@ytFvw$yI27+v@H3nT&1pmarW*ALCDqHa zm$tS^pQr0{i8pVfeYS)TU!Zw;CwQTU`enaJ`^lCc*fcmrb_>$7%62h3n}9VurFpVCQKBMkcR?H6bBH9()r#M@EJmFM7yk4e2kBhf?B zD*dGtbg<>Ab`rn)@Hdk>%8SGtJ%%__A?xhuVGOMBWn)E7IQE$OJsDdD%ZqF!K5 ziNe(q{zD`7;;8!u`<4rfc0be_6YazG z?^*i$S&+8r+Toh;9;!OcxMm-En+;Xh%Xnob-*&@j| zPv@oI^0@r9jP8tqiF43{!jU}0-8?Q2dk?BeUVYIri1Dse^Jn9ih|hITslfN!)T7O$ zM<5Q{L44&vQ7<=HMS6BCC!`S{9WOT;2zkWkfIKGKuk+(v$M2>12NjrbK|J@r+$O(! z^*#TmzMt&(wSHdxZqiQy93R6-2>xV0{>r!#!dKTnzV`mB&!Y}7*WdpYbiMk0@&nlu zgnt7zMVv5jZUF0|9{@Nj`8}jKcTau;qz|DVuDuuH1N5iolm4VxzaZX+`M`IBboZD2 zCp5m~cxQh{gr^_R%PD?Hf`l!EL&FUw#_dWGFiia+oLB4*Iezdy1tl=Uo8Sjv#TIcy zSHFYTznXB-YYU{YErDCG3RORjpFPVTJN->Kk zD^M?aPe}AXh`72`;Xqss`Jc!x0eujk>J#5TdyV(Av$#3o>G*EYG?v86_k{k4_)@0I z6ZsMR0g^mVq_ghQiA(iA?>txZ;nWs=8{$M4Es2cvBOeK4ej51?R;d}uf;}-Gt{EBf zgNyStE0%vjCjzxZ4T5MQitpI``o>cx4#B_b|v^)HzqKSm4klAukb z84uCr?jGpr?6}n@UAH~olrTeX!p;&-q!P|ywhKJj!QtKx3EBDZ7uMead>Y+i z|1aR2Rho=Vp>Gwb`@&gJP=_!iCe%LuX@>4C{_zv(GZWHVu)RRX1 z_WOj(nq$bX3%y81xI{JZ2g-Mk_LPM;jBEr>PWCqBkq!sxp?6lqV~d8NcXqjsa&+FV zwng#);YMYVS^REt>cUdO_aEwKqyGpw5Yw^q>AU{<3gpK`9!*^oahT9MS-tV*#jnlt zM{xWS>y39#{hs_D&93PH=}|&I7ubpOsx!b#=({mai}i>M+|0 zPbhTOh0>ruCp2N1y83as*GA_$cI4|A4lUw*1vAdsVLyQGly{lx=`DaBVOekj_V(u) zUS*z`huWFv^w7COBMKnVdDlGKm+Zxkt_zETLDF}co_#lU2hNvyrGv{37blW)mKET6b6M52gXEH3c&0BUrZ#Y#E73 z@&N+%+H<0uLfi`Ky<5St#rsIGpdP%L`z6JvBF+HuHx(0jT$F>52Z)!&->>q0il0m% z!WI70T0}7*zscayrqHd6`+R!vMfmA@_3-1)DPd$`_?>WG6O8g)5%M6xKXlgw#T|3} ztD~qd(WKGDd^_@2H?#Qr(TukQPID*jN4f&=zp8m&Fz{DKR+TuILF3%*3$mIj1mJPN zTaeJ=xE6e+VZiVNaKmtSn}qhez9oTpeeioGpeskdF2+FlL(Ubg)oV<&UUi3}KPLTL z;Tp?p13$b}p&PshIE@qsqp2>ORbaQY<2`NJ=REWsW>Oz(!~Qa8PYY7uJj&^=G+NgO zD-&%bugphlMcfm|g$t<;?5V0&3HiSk>>I1=!Fg>vM|qjgWVniDz@aEEms{6^cv-WN z1s}q`pW3sC^2nlkuVgjwC5gmhBswb;3iqGSm${1O3Gy!}$}>g*|19XsF!4PRY6JSy z5!5Hc20JvmQSD&NI^KP*s2;#K;j2Px$w!p`*1~k)yzCjA8+GX^zwtfA>E{Wzkz6WA z9hk@E8*EC>Cwzi@GZM@{@DFCNg?G;>Sq4A~c)wiG@68bed@ra2z7Br0h1t^O?m`(_ Hj{AQAnXA0l literal 0 HcmV?d00001 diff --git a/images/bgra.dds b/images/bgra.dds new file mode 100644 index 0000000000000000000000000000000000000000..de3135c85ceb5fa566c85ab79a08c13ddd28d86f GIT binary patch literal 524408 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%0DS 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℞G)I5LJ~>zZ&yv?~T2j)w7s$ZtnuPV6FSW&u|`{uOE4bBl=He-#t!sgg$!l z3;k}V!gTbV{i(#4#2?9k>%EfBWB=U0!&>46vFZ_<&W^Ez)4k)x>DAMtz4$C0|HD82 zee&IZ{d={xzl{BgzxYd-BE2A&11r!2=3CjD)toMKbO(lOEzyuZwzk98M?bn7?eW6~ zSswCF2jGD)eK^5;(_{Ku`^ED0MxXKP=hn<2pF553jJQqr@4R@yYzP?6eXDKJuX!aJ znGp@EvzdOw-oR?==f_-~*YQ^JuaAGkfm$nb!}Jktww|-$G5&x#0OBTarh2%GH;V;! zoTnF3j=Od!vS;SdG}2=(0|y*)4g{^TC*@c=x)F2DhDY-`biT%$Kz&bM*yseGaR^!f1P;(-I% ze+T;GgN>d~?ExNHel6?zZ`5I^!(K{XdK^dR6cgFvw_-Z!3i&*10NXo89H_^UcYTfT ztq+@VAYH0I)f_={)W*!{c$H5l7U90c+~o=N-sz*8VS}UneDW`TLZ67G-~oMGV{fQ* zFWy^k#?N~X)3wzj-hP$-D3>D7hX3d_b;Rl_(cWwVSpVH!%_s>A;A`|}1NeQOyIwx4 zIOfUfYhfJn>=BklbN428rTzi^2aiV&HWBu~|7;N4C*N;h4fE~!`9J>Ge++uttNwRA z|MK6;_x}8c;(^s$CHw5c%jDkvP3EuiJMc=S08kSwDy znoYkm_@nRf``P-{YF^hmHnMm0o!)MCh3*&oUfc-((Ifpv%oJAgUveyJ17HSgV7!LC=2vuk3z)zX~oy!MuoZVN^Pultj8CTs3}sz1r$6if5P>=`SMEjC3@d|G^H_y}P>I$v$*NAUw651k#K zHrEXO$vq!n#Q5VAd({s<&W?)Xz~J^opVEKI1Nd>^`qq>D!)jw@NW4M^p!4)#AExsp z#82t_qbJ*Ex16n+5As!NfDU!fX3mIts%KXF?*8xrznO2ux55MLgL4jfi1ud13>(=s zTPL5hm;O(0ggm6##^O2Zs?8@jlb*$UE6p*%7b6CnUee!&-fAAim&8)Yls($4wfN5M zm*Mk|)zQ94FI0z;{^z%&jX3sH{)g=E+&QqH_$66)9(^;rXZd_v@kg^%4kY_(>6eoW z^mTvyRfp>%1N>o!dmOynch~?jf$!-E^Q9jq_iFy-<;}aN(_uWcA3lFGYd`!`uZtyo zk^JLS(Us2%9~;7yp&I>3ou(ox6RsIjkCJjTaX|NEf4 zx!BN+eEw_UMEeB#4qj)+)R&Qe^k)P30eaK7>U`CPS0fy))p9Ror_kIy6+Y_1$`(HG zU3@(1pwegj?&;wkr#Kt0kX8C^^zp?9>i+aev0dgF(E%_WUH|^~)qMR0{{PF!1WuWt(&y+ua9{t87sq*=s{<|2ewqs#G>z^fhtu!WLXUnr_t`qY5U!oQ8*x*% zIetIU%mR4ZELyU`KD#fx4WrY0_ASNp>=2vj`Oxq20iG0-q$lWm-?whApY4=WMOXUN z{t%aomEL*zL3~y3Qaos_%{pBPr-)&hSEDXc{8g-*9U$heMM_Cejld$uRXTU zmBcC7sXItjuv+1##ysPI$bF%N=$n?+;UBAaEHt;y`5scLP zc;EWVq4BlZR`nVDfb>i0hS zV9fSZ2TSi*-$DDEn~FJGu|O-gT)TMhh_yem1=)o{BE~m5uC$`0L6_ zH4xT6xnSqf9?y+?>K@Fl^B(%c z$g zInsrj(bNC(A;fg{=1=U&#*=%r-xt5xH+SeZYu2@qXKOUo=hhtNfp;8e>ln}bjW{2l zTrI=EJgv#pHq!%SVdw_GZH-1vWZxNn<7sh}VsOnKJ$AksQfg9KPwR;9#HiKC(zEmm z`|lbZ=sx8Ek3Po(4mefL9!4R{W*8jFhc??;taj+Dt_9Y+{G^$0`L$+!9X(x7q`Y6( zp-IL>j54iBXuH(|ft(ox;i?!N==SsRmELq=ySBE+dY!~rR1I5;|0fJvOIF7==yqnr)xXby|rS~T))SWPe%{y9fmcFlHWJ| z&eSH8e``PoI;;hKig*04`u(-)52y35VKu$agZ7K%DWd(rD%mUXoPq7aBvbu6m4Cc2 zeUA>HH^#YpAC|ILmELnTvifM%Ysyo+cjs=l^3(QMwbyfb_M`R5wl?T}<5hchhNH>a z)#BNwuNK#7UFkYLAfF!(41I?eyPqjf%J0dWsN*-MKt6~L6hpZXUzs^)zL5C^a;9g} zhgajnYfqaoQtjORSM4$KI352`F0r}dkG5iO`aI-7?FGu_)0yUmsjDCK?=z3`4`h!n zM{D;4<8SqL$_4Hp^xrj8?7y`&AK)Nck(^jZ2R@iSpFU1`WAJ+4!3W|NgLitg=Jel` z_or)v=F{1ou%Ot0HDQAoj+dR!x(xg`z5aO3HPL@`;fUu(8#!tZF%oi*_r_fFo)2Revr@lnjd zfm_8!MqcD@bJmlkbG^P8UKQJfcjU44hq?|uGxlGhSLEFP>DPzD=ppB!L(pN|C5(rr`xA-~54kPCA!*nKw1d?I@~%AtSyhu@FcBJ|JQ z4?i6JW#Ry^;HhG6`XJec)9DAXH!(GNQ1KA?6SeYcqv?M69&0GyZXYi($ivZ7?b&iP zm%kqS4P;N%gD%Gp>;RubUpU(HJ*_1=(!(&LIwuGD^E!+Ee4`x#le1ygJT*D;#~{)~%uI^ekR^_^=p7^C`l8v)!-0 z9eaVkOz!oO>a%|EX?zf? zhzY#LjQD{5C&Tczd>x-py_i}q`y4*{s+?YrYQ63i-;pCb)pyxcGoJ3GAH^`_7MHr7 zefcfo^6Ia|W8n_61$&G4(gSqI(QKHRu;RAj{i|V%3(d>E^61{^6;U5*w&U6B)zOBJ zE;pn0%I)_22=|GB*vDHB>$5M-*{>$yFaMgZ7E>?(n*P$`G3u+50e;EUAEI;AJjs32 z4Wrki>k{uXH^gik>+s2sKi0qYpXg?RulSlA;KAmqqCR(q;QOUj-FFmm+9?*AZ z!-M<61^asRTk#OO0ACFH#{(X{R#W1$^)R#h#s_2+9yFs|-=I1?JzZjdeEa9oK>Y8) zm(`H=9^XccP0b4%A;vNGp6;H+5X7#;E7;kY=xWA_nkv|jjuV%Y4?7x9z>aJ2wci|z zkI)5fvq#D&#Td;6a1MECIOS~eZq6v4ro+Tu5103_XRp}`U;XmeQB!CSM>EFQG1syu z`j5RFx_>=lBfj<8Uo{_j%udgKna64_gnggv@BJt}Z-(&LLnzw6mt8lD>~8o|&X|uU z*UwJe4FleI)||00qPkZ$f2^VB(OnD}-giH8&Lc0Iu3?YRSxy5V47&Du#5h_X^j{7S zqQBWK@=|QULiC@j=U}F}G*iAofB&T}Y}Ac(-*g_{M-O;##AI9hfxEk3bYa8QG1&VE zhIZJ$nhto{ECu(Y4;UTgvYw^O-cRp}YmNQqTdQerJ$X}$Dt5LvJ-fk&T~I=%bUpZ!&MfnTOy*PJ{vcJ_B2^7-$7U%$f3Vl>5i zM^61>a{+I+7k72D?>B$!!Kclj$R5C$dL798&8N}!IlWV#OSCsnK^?rg2V@@o=>_!w z>=Kwn4itS)*bxZJ$x(Rac z-13kx4?duW>9niab@kfvelRwj@X?Ro51PvnolgFqcMtlANA0-S1q>VBu^%mchM&<@ zU88;MSE_F^`^*d*JV@rv%2BHYkC_QMeD?H-7!&^bq?#f#o8%JVkc+K7zJ-tVMeBQX zZDT%g_W7IU|Cj;sxe&loL(>fn^H7D@PYFEDdrTF!C-wrv{OAWt@ zVbR-nqdmSn7uGmaoS%F@{kFXJ@7q`T>ulf$txworEb3u4eXK{Xug4Q&I$wuFzWAv= z=kLmigh|!WJ$GGUf4K&}hB%~okz*!ox_c_a_<#rt z?PkaHeen)>Su7Xs-N9qv3a$n`Vx_>vwL~s$K$ixZT>3DKoo1&hE(T z!5m^aY?!(({k^y9C)H>6)zAN0o%`RaL;knn8>mlKQ~tbKRhYm`EI#RxbLDH(LH2}} ztNh)+|1$aJkH4S1cje0H%h5CCT1G6YdpMp=u}=lR&R(FmKdLU`i{@o~Qg6(&7vX@L z*})g19@<{Oa%Hz(WCzkk=fcpRM|*wmkD~j_u2T-39EtO(@1fJt3T>yheoFs;>Tq;T zp7-vlCoDW*W{+c?{IeD52J^EAe?)t+LGvt5gp>F^BjyoJV03;yeL&vC)8*Ir=6W6Q z0^BPexIY?+$HIZfVJlv!MEuyap>U_qzCwX;%s8F;!0*TnICbbeCV_E&x7(K?7;KtD(!c=KYkLEkY{*R zzp7bb`Vqd1{-69Q>|bAtnW4|V|90%li~ef2;7>8-W5w6unXiBT)8uJ2aeDb+UNj$h zg6QvB_20tCV)@6C0lmv~%7d`LZ9YJD#l9ov)2p4on(j9T#Xh0-i`5q<);s#&vjgVR z>W85h^r~TOfYk$_yKeA&eR6Xyw>@P=@ZxN zP}ekK3azhmihH?7^dE8*54cDASUiWnLqAM?c^JrZc0%3$h*L*zbZ5WJPPo?^;0bXn z@pBjsE>kaM&q6p0mWKJ+IsNm#H}GcHLpO=d!Hj1vRS#bd<#zu5we-52n0m=)pM5;u z*AIF4;@J`7`?|gnIN!WS{@$1w6d$N*);Df`=)LfO`bRP?erWc)y>#uxA+Lw#^wQwJ zu3;??OhHc$7Y{|J2xbCi?RQPZj%tL*)wY785l8 zfh{p(0nVWJ<+%BE=uWoTcJe;e0c4q6v+Zc?^WA&p0NayfkJ{h-g1)~uo}d#Jo4rMs z%rvizy)tXv{jt^f8(yOC#e>*;dH@#Ue~tOl;ShNb>oNSGc)KH)J^zLO?EmeZqt8Yyihb$k?I-0N{ol~{(H{=OPi&v_(HZ#3Y!G$P=fVj0 z%h{NZq$c7)&z*0*TFK+_#?$uG`?MaxAO7?2lb`Es9DS-C~}ZP2}IQO7qvk53PFjuY+Yz!qA&(dXBF>ffacM}J5> zajCVrkRK}EC-!shO8W(LoGcGyKRIzAb%ts%?Ipqp1qNi#K3gb*ti!>I~IksH1_K%$m7u57u-)UH|gy&&#tlw^58Kn|^b>|@7Msmv2SmC(S-qaMfcsib`Kq*Z$fNHZG?Ff zX4R<`(UTzdVh^LO+JWlE_EkHcJw_w^K?c>JnTs~&jdx9O1AD^Kunqy7f= z1V6)r?(1+q-SUxxlRe93WmR`kt^9gAbY(xErTgen56^)P|DpCoXf^tiZ|6i z$RUYaPS=i%jCmc!j8FD|r;>X%mR>p0|Cs}e7?zt?yiNk5+6qd8Ox< zqPJQGYw!J~u$dUYm@nQS+vZO1ZN|WSxS54rGh%o$gzuH*C}l@7OW+r`)k~ zd-Y?x$NqHmwC`@!E9N7{lj`m8u3Y2DJEwcdviPx@0(OBNfxY1eHq{K8jdC>RJsv!x zCqvA%Tx@i=|KZ_|g)lyy=lfzdVw%hS$MN*fy=)0N7dI3;;zO&8uvhZUVo;Ah%H9+M zR3E3ORL{!CfB13oL$#;oMw#WTM(uf@iBpKfn6cwL_Wm_jk_}TYz`r~cP1JCRn;wZ~ z=+5qu<&gvL+RZe@tLDe>gY;?19rJtiWr#n?b-_vKe7gTV6YbfGG2e%7iFfeTcRyDj z8`fYuhzN;kr3Pd+I=dOwU={vM7JbM!s^2QPoz@(b^L5XK4<+$o<* zH;=h&@f+MGHY=Bb?qnYA&GtCj^CKs_#;%86$BQTH+n&}vpsiU`XeRdz=b}CTRF2y3 z#ITO{KVm0?_R$|7$R7+}Cm#4N+w|3+{xD(yW@72bmgj{X*k5#|<9DYI_-)H!`a%01 z?TzO7G`_dc?Ad`2qs!^^n7#m5i~Q67V?WC14%a!v_}O6cYlgtgVl^bue0x0b_FHdF zw!gD&vLhU^GyK4|%;bA4;uQntep|gr^%j5pD!cz_{=;8t@qKlTa3SnJeVhyHn=iAF9q=6e&8pqX_r(X~ zIKEg)?q;L;|IBs4ee!?w{LXa8dNNJt>@V&zWIoyFOYlKqP`YMcSVGUyZgyr3KG@0? zvIEx0yxYzEamS&KjrOHqt)G$npKi~e8`)1b{>ISduZG`cz7#o-57jsDb@u#&Y`Z>T z^{{mPm50r#`s|}(^r)mB_BY{3LS_1$Cqjr?B8%QyQ?QooG!b?C-ba4;C2yf3)(rMd#!` zz0H3ZIlca8D(`f-@6gX?5Xqkj9pj)AT$^+8 zBhcKzjt?KPNBz48#o%AtdV3-sJQhzCn>7o4JsW(W&yU3q7s?IOryq#ReU?Amx`>6E zE%mD7S#t6;`|r3~Ei~U>ef*t{M;|vQtT+%o?=aK(rQ^r!e($TL(WhxX()D)jLRLmxEZWG`vZ?l&UTf|>zYfg@28ia1;XoJ+FARR5lRE}3T-)M- zf97|y?|h1}pJx9Ho3dRS*=2Jx_^L3`s6S1w^4A7#i;irgTBcK1vy&ae|A?1dAKw8! zAonZTX|WqLcOM?7&!_aK2k^jw<9#Rk(*@JH*sJLxabEjoUb%8*^!M^v%*msR_!Q=1 z%7cn6*mpu6lKxgF_59m%E#J5QPdfhjcVCVf!uqAAalxnMBjt(rch9%N6L{xf*CMwh zwj|y^_I!@+^tTu|pObzdANT}K#}Q4Zwi}K4Y-4U;G-TK5cHhGb;wWPe^Zd6%M~k0^ zDd~#;+0RPe{0DyrHXHRg>3wwadI{#w=h9!MrbEpqUf}aB%$2XA>!baaKN#&-#p}x3 zCU=KU$WgyHdL8&prrD3^Qmn<*P5T{eRyvfpQVq6 zKM`&0Wd{FG<$g+YxMzz8;Q9Yw2e1KT-!ZidWPkdd<#3?<)3!ak+jDjIWZTT%$!u$} zejz_I|L$gb|9tjQALYqxq?iDEKJ7oG+)2 zX7u9TtG48N^MO4M`lchJt39nfk{$lVm1JIw@y5Nax!3Bm&Zl?J^q%?1@R#?*B*^{A z;?!bRbQv8(Ke*S$=r#Ipl2JJW@!_FQlYjg3iPevuOgvy+lR32C!~^ld{@&YvI6n26 zBYm_GR@~OU*>6VwUDbIlo+vJVrZ~#I{H!PC5 z_p1wd+)QIQ@y_#Vrmt6z8|{y_U;4q$VNNIiXGcEE*xR=AdvE9i`ahj;C~SJPn2)*@ zys_4O(gi2d4JV2L+PCO*hZzlK!J6%^jul$o*QA)#xwAFlzMZ(eC}9 zx*zUC?;iE$s@WMc60-kW^ncACuYCitfCI_G#<_9?t;P1)>`Sry9s8HtyYgH<`t?EI z8|eYDU-gpa(N5|AqPX9aGo>R}!X9!@ z`Zn!dC+3J2YT4JKH@k4)eEVkPr<$Q}uN}Dxdz_sv=69}|bA4k2L-jsdxc@NeLYIg44(=3=`yuF6K`27Q4<@cY8o??{` zU%nXjims-!=w9<;^eV~6$nA(ZiKX&A29C`Jhcgfg=n`+70FY4~C$p_WXn?FD14F9fqLiq}M zCfNOZ(f{GA_lxVLo3ECatAFM~IRocB6#kf9Ru>=r(=W^M<61muX72oYcq$%HFQiAr z-e_y_3j1K@lG%N;>0U86bhM8tOeil62kH|c*TWBpSIlnZBb-Zjo=aXwPci$^0UyAP z!v(Yg>qNSCXWEBM&9puD?tb+}uRk4gZQl6x zuZtTuo2)e<_i&#*Db#DyfowgzH`M{?Yp=HhN9*-Ex~2co|48(=FUFC+dxQ;X4djOS zTznQj%F$?lF@1I{-GHVi@*5wQyZPYD_QuO^R)Z!!B)2XOtncVvx!8;841S_LdGXl6 z>Vfueu1$9A+Y!!a@11#wpYWRg@wuX?CrMX zl5ak6U^I~jKAO%xTD={;Zx8r$`Fa=5Hpe@if9-m>BRv5dOtGRkAiOA6x-We0kjt6t zKxccN%j2m_;Fq%x;sWOG=o!$r^t5~a)R3tk5GNh=guQ-JuETs5@_n~Q zaS?P^YpB2Ec{N+&zHD-dEpea=U0;dsl3wxQ>-`j0j9ihEV(+I&G+4-cp;v#KO#(HRvEpBuf%8Uv3()k zbS*tD?yCp==|{zZyH+y?aA|AMS>g?q9jcn+H<|HPAu3f#$l=l1vatZf~z3GQoNWR7PVEJjy z#!C1P?fKSlxfw}j?cIzfV@6}NH&bIecl*n~wf|vsdlB8uRrn~qIGwXfKJ?(5&!SdR ze00oM?>lV$nCX^`-^%{Ohw|~TA}nb($o2cx^q1p!XQp^haxYH&#@lag)y#JNqlVjc zqStHsv-jkG9Iu~G;{ZpZH~Np+ZGC6xifphw)fN`Y6?Mpej6K6zW4e}IJr(x4P}~(Z zeN>)Zd_e6F-LF65S~mZ7JaF^z-SRQb@46H&ztH}dhxUj4+P`bDoY&IqWaq-{+uifqli$AM@vX_* zZ@xKV=VtKO+wV*|;PHcU{!gAx9#`Xat{AD@@HBQr2g6=;wL@+b{kQZ@IhL@Yz7TuT z!&?`sC*y1LKj3?Lk1;#xU;jArTc1TwHA-e_n1^kyhPnNE2h8FUFEz_iUDViT`upa3 z#vkUc`mLJt;rnIx$NoaCpIYWC(Hdry%hgvW?+QO`Z*6wBZfdW0v}W%l6ZWcg{d7Kk zIPgdGr_<4$Y##|fIY!*K_m6q){SI_Ln0$^HK=LRyrN>);GvC6Y4sdE$_Gc@P#RuZ? z<`%g}{c`M;c)<1e^7V2J$duj zzbe-K=9rsfZpypciBiM@tgSJt&TU}cw;h~ zzS_($fAXk(>E3TX!^4N=h{A`_UmhIJhQ}N**oX&5e~0>nm zY8ll4-+1|a%+j(Cq}=A0k>4^yN8PnNiCVHTvzP5op5cEz=40l1GD1!s^x2cX zt2WPGGwL_#0CNfTM%s5=d_@h_Vt(9gHh5>WmnYsI?T;0&pUZFC+p#;_sU~L3V~H;4 zFJFTG;|RZveKI_z>yP&Sl#K5FQ~Gr;Z_7{9OW z>YCP^rxW}hHts-ld#?dKiEktBqz^KsZ#Qge_A`!raeDDfUX=b5j9&o0^6`sah>U;9 zOVWRV{r~;X7o`73>}k?KYvW$;{}0;#MJD*Y|Dr$quovN{?UrV%mpS`uT#x5Ihhg*S zLsD)UC#CO2-%$1wq5stb$DMjo!Jc(NUi*SP%f-qK#}qqHJ-OI<#%Tq$Hgel`=4r*I zllB+n)h%|MdseaK^izvf$89MVtXx?j{|e4D6~wd^D>rX0h%+m&BMR)uf_fMQ{-1(a zq=Nh-1vYiTIqd>JP=Sx4Kvoy^Zk75zqyChW;v$Nd>Ww1-5K~Jzo%SS!_S$q=H&9#kN!S7h6u=$2{yQj^>%1 zljC@A*V$(k+nJ-|PCunszjsfuYRC3s&CVSKdFcz}XMqh>jG8c!aZe~XXH!g?J-dJp z3*xm3Y|CQk$dLtWwE})DIQw0&?k&jaRxCPZT|sV|g4}e)%ALm-Yfs!+kguZPOj9v% z=G0=~*ii*Fl=JwBgDmiW6)$?pOA34m%zL*29w|C>=vc6yT6AGf`sK0rE#Tu~@X#T& z!NsuQ!-^3+#|Y+c<4OAp^5x{QkuSf1PYc$y1-bSMYAhAUpS+(rIH}li+9}0xjB^{b zvF*%Li|yx}QIKD$*!i+^i|yx~SFG8!vseu6P&=}ib=1;g26I3@zk(Q-g0p7@v53Xw zIkO959P(Tc_myctn!s;RVEYwwRXM;bL6|RQ{ zvOaSS?;6S+2A&1*Optc4vCZZ$7?1zcb)EY!`e)54I+*Vn6QO>#7N}?Km0dmA)6kFE z4ZXhqj4o$;&Rj@`RE z*G+I=+nn6T?maPWJ>%50^|X`I*0WAe+s-^aZ8`O1axLx7aZlQI?vcBWn~iVBvuB>j5o}+#aSneLsyMtPDY~h9k(?a^#{0qG$uzMzqY9Rk=psLb6xXw zMsFL>p|7teK9ydqjr6bfqArQ=TLZHX>ucA4=4*Dp*VvvB_+`MmB;RbwSjruY#k}#3 z-x!`PjL#fG<`UWf_FGOpiTC&9975W%<`~=gvh&im^Ur0Ukh-oX?a%s9+jtZAJ6B7v zanyCIiSu3q9l2(5?c8Wv%F^i-n3}zal~?%+nGET_!~#E&K!ds?Apuy(rNfT z^!MuL&_C}Uf^%bBvi_|R_=ScN@6;Ea>Ar`tQ`)zAp8>qB)ndHE5bU4HjDHID3i)wM z@}rj2#VU4YF;Mm3Ae7sxG`_jF!ZSIFJ0n=4mHbei!sGoi+Id{mh4UKq) zz#1Id0@{Cb+%v`3v+1-`a=kfodmlyo%<6r6@sqPwWZY{`-k;`k{}goTSk~I^&0F6_ z-f#_~zjh4tqVCeq(GxxFnQ~*nor7%WVb3{Vxo-Ck=Ya8^K>p!fX)|+SEumw;-!-kV(ayt;bEw^W?wR#GlGw4vcQ2#v z?=j%Lm3dPpn2TCp=wimKePpb)`$TJ@nf1_*aX~9s_b%JDllrk6(-Lf_Rr~f)OXyh6 z5iiQVUvn4OjE`?&4{Z7())eF`(wC;MTU)L#Hn02Q`umMzkhX{6qtMr+-_bdc9)_}i z;XKGQ`mx60k1(!MAJ;MaPAJ#zJia8xpZf>yE-j_z4 z8+pXDEY=P-=eB3s(1$th&6=v7iO+P899+v-H*l}A!J32CP*{O{nZFS~5H{iR-FwpF z9lKfYABEqoo}w5@EG3?s^>(&lkYU8kx*tYPrF}m(G85gXt z-Tjul->=Uc`R87<=d{d!zwwm4rE{>Ee$5VQd1H@m-nS|&l- zTyrkDY_HP|bl~~Zh3nSk^Iqsj@{jGKmiFG9d(Pi62ileFEFaTa3hFmaDuyM=slQF;MJJp}EcGvMG=aM}f6G?fcTXGR=LEP0+7ve&cYBCvm=96UGQ&td1h3`yE#Lc*N&qPj~Gb{Vzat%Xdz$|8i)_LC7 zcpYpiaK^X6cn>ArD@rdwJjb2jrFJvt#z6|DgT#Cn5*;5h!>%%8Z; zL8mWgewS{?P5?vCu}(ur&RNg7Mf}D&=fzO-ULdOm61TuQ(^$Si?CprBzR;zcHxp}6 zua~JWCD$%tjWrSdFo5-qxxURs>-j|Y3WmY+#&)}&wwdo*|GVd=ScjLK|0`D>w=vVd zdfzdt!>m=S>@%mTv@Xr&e0%(t`!vJAC;Mrc1MQu;YpKi4SgaN9*_Acmy%_pm#Q96l z7D_XoFHvvI^*w0Gx$`W{qW@M+mz%@8!84qEB4jmltNOVtvZ}<|^?VsAmAp z`)95?_mamV*R3Ptxo_jE#o3%G()>j9ihE1?u05x%ZGk*08DmLZIrsoM1+Mnem_BOt znR6g5A?Cw>N+n_{VmDstZdl_OR-YdDz@_jox0sdb?ytiYX&z`Q>o42JscD1<$ z^r_57E@>;ti}JWR5}kv!@cJ5PX9ak#-*aNtf!2y$4)&f4TSU!mYe}`>OEfOVGZ12K z-udp>t)A!hjIJ_h1@@$}*!+gecrMRAm?zjejpkyW(9+0>JrCa_v~T_f$8FsJb2!XI zXJ(%&_o)L}8#;~>dd@VE?KX8ezb~!nr^`0K|IK^m%$&7$W!}s6%-#`Qs3*hk=oi&j z;vRtc_j5iJ=3k%QES_N|__)vGIExvC~sZ)+jUDe=C>C*Ea)&p>#(K(njV+Ou?@*2^Mg_akT8OApIEYha`JDoYxesVvQ zye1_va3#-Gs@K+TCuWa%madff(t>k8k7u{;h39YGi#JE2wud&9aSQqKw8g&kESWSZKaOgl z7N;^1{+ACtw_|;*h3rdt_Rq6#`lF4dP(C?!@ADkI&u6@!`+%&`N@{wS?71TU;rET~ zX+fLXLDt{aUuSOoA=pkGd-lk7qrYqX!wh8pm?`KL=xI3f>6ndw_8k29xyWIjFX!4} zZj7&Ued{^oVaQGAv6FiXtYh`pMIMm6=QeNva&cwW#mZmleI@*(%yb=Lo=0G*r9%9_dM*is+qhcw5TJ~HbW8@prN0y4W~@1f+pYdHs*YR)5bOZz*@ z3fHhc?|&XiPIKse0srlHXFx+yH+(XBSDB++a8GL-xOZm{tvfvV(!rcPL57+C$Mc5m zxo+Q!-28orX&=E^*RkXAbF$~oTv!|Z@OJI;9IJn{pVXQ4T*d5tA|tFvx(Yfq7EvE* z59V0yBwePfP zJXd;H*Uss`JK}rjOHCO5%X6>Ji*#jNmpO)Jfa}CLEtys(qJulLC*6^CS$m%EaK?Uk zH}*8~n|6V>yCOTf3?#0G)`b}2&d9wk@Kh)IBjA61(#A_3y_;H4$RYPt)X z9hAW{V!IeV^7jwx-2>T1jvp}3`)2UF^rq~c%Ws%BU3$=;U`}e!_6)_&?#LLA97J9T zXt_Q6Gw$7YX6)S=XHV#^J9{;q2jbtx&NF9!2j;dzU(VAiSCIwAA((4D>Jw{|X8DXR zb-&3PrH*Ohl7)E=tnW9JIndrz@6A94&cv5AbpbpHA8Q{?!-kMI)io`vSEbq5pV+b` zHe`w2TdJ?j0l0wA9gFAc`e08QyCUz5hmYO&az3=%tg+*MfHX4(ULTE(F_?S0vF7MB za(L=MdkL7onEkoV%z?GRIxr7?i9_uH&vzVvZ8sF!AIKg!wtY8frWd_*3`BE{8vxtwi8(PK;Cy}Je?TB0AjfNA`8@W>N|D4b;68q z=`(`3NA^{`w>z}oi_es4=0Y|m(R-{b=pOaq$RTrFYr7aTlyg>W*-Ts}x#_`p2+v^5 zPQ)8Y_pT==ql;V{DEDUa{8Pcyx~<)r(^*F?Dv9YSC(oaaA7m@*SZW3AVPE@1a;Smv zC8Bc@pMh^ z__gKD)osohW3GBZ2fdk_Ud)4gaK>9`U+D8PN47H8GZN+-@_e{?VcNq}?Vt&BMT`gY zG2q*qwL=eledcGhj)wjX*LhQvcZ}Cq>T$epjH59h=BU=j#uh1Cn1l5vY%AC7B;E?U zQk~=3h55v=_M0&|y%;)fH<-O~=-d6aBd~k(*=exp4!!r|IeId-UeH4q?;8l+GPm+{ zXU1SY;?c~VG4HNvyYg9obhqor9@4!sfbn|P#QF%X`;EEK*R4IA>x7}_UF*2EaevS} z*2;&&p^Glek!uHWcAYc{{WFz&&5tt~S{;IY-UHd{Syuhx`h$({Ft5+N^{ZL;oKUVg zezR-fY%>kkrk^u2bs0M{y^ymaFGQ}qkU2Qah8{Z{`P>QLTt{@cb+3f1z#$9V6Bq!E=?guwXSW=)XxTvYbi}~IQ`x1LSoM!`Ks57jf(-SNAb8`oL{y_uJ8?zKYip5@nn*_&t4zh~@gckb&B-u1*)@+>cf=Q@Civdb~| z=KJ>GZW8Tb@XzsMW#8`R;Y$Cd7 zAnTJJ$b=j_$Jo_PISvxJp4ax+cAojy9&z8?+AlBa*gnS+cqYpI@;GDNu7mZOscDsY z3LaqoC-Wcpx8ePrC3{h2XZWZq~rQuJg5d$MDSKu~SB(4|))vt$cHzM7vC1hq34S z%Csqs<5IS|j$3v7aV7e_WM8RNo?7RA5qlDg@X1z++d=xPwU%QHykqY-1zLVKRu z93gYD!D{(fs6H`HBpJliCQg@}rTd{em{k|Iecl~~9Ii0jW`}dZtXTJfPP5ZVV zc11gA=f&;YW&JV$zU)T*+pe4ywf?PVhk6jtZp@r)D8Pp8zt)kUiVb)@$B-mJ{xVdoDY!ouXctyTv_b-4bSs=_Qmys`E|^#=vf{{!8%79CI@9SM1Aed)c|r zDs>CtOV1w8!@eEEocDvq-&zVymg$y7+ zQJHJ6v&J%Cl4plIVJn$`*7Zskp3AjJ##=haCKX%Ht7aPo`O}Xzt#w7_vfkEDqkq?N zd#=kGujUk-O?=XzA>hw5j)!06VQaDJ&(+uO@0-JVC49bO`*!@CJ90dld&3Li2iJ4v zP}z9eDQVLg#9TnH#tSOv^ux;E{oy<9Y|ol%2Po^D^R8XMi)-V5jRok|yNCJs$~7nK zD)ocUJ_?%=*`eRZoI&cyj@;uJu+G>&)>BoU_XK0liD}0eUsXTHYYwSN@T7UOsW$@F z?twdI{cg%oV;$zX_QpTw-h+E}`dG}l>VCB60~c=MTmkc8?6bMymY=XYEkNEc0(Waf zm|IMru4hQ~4^Bq@t0%4LB5&ohlgeV|QeCZ`IS`zbr;cAeo8#q?Ngco+pNi}LQa|`K zeqVo%`96(fGp5q>AKKU2?5@MQv47s3-?n~hFUIehYThwxvoAutT{9W~xdxxSBQ^DTa3C1_L|FH_3mNEv!hY{93+YjPj2< zPus@tm=j3s^Zf9AeX#P#D6q92`;p}6q5eS0ncI@HLZvcUn_=QKa^Aw9nTI%kAm5vN zR9)DKbxF4W`7ie+>t`0&2jMrRV`Dz#dFMc1h3^>)umGNL?@u4I{&ZuFqyzmr;+e2HJLBsQ=d#+Z$*@?P`M8jst)3%SCe9oO*6LdT!^fdA7+qYhV> zTfbu&_$~pjx%eFx;ak&oaj$SbJnx>$CUSY^{gmzMF#Njscij`oX9vK20r#&xfxRth ziSg@47SpURp;za@wWB$(Jg4ILkxtpnfd z%V*=T(OGZd{}^9N2j+)}x{Zgij_^#ncDifP&NS_JKR0KGF~icD^y?V_$CB;R<;Fqd zN5*cI-`yXU{x_VsJJ&o|wT-cZz58VD?by2~;rUN}?$V3(5v-4*EYn|M9u6@Se`{}B zW7D|oTvt^+#q-GT`XT*4<%#R$oVykq&o~PAVO&RfUcDW81B|N~KbN{m_`NvCRI-0j zW?Kars=v+rx~{9-kLidWlm^r%xyBW=;aLsWrt?-H&*XP_*H|IzZj8i^b&t_=g2vC8 z2gJSq)!H(Q-THL;Sd@1@uXUJS#QNRb5XNe`2kcnuXHSsdjqz(cNCVo?+HUTZ>B}*$ zNjW5ayASGF8~1mNM|ZvD+*-3mon^iRYYpQ!kHB7j@ezmTGg0dPobQSCy8CU$98bl5QQC2CXN(%VUwCS z!m+E{jH@(%&m`!|++98St?qnR8K%!^6xj4bHkwC;SltqQN^F!;`WZ{C%pBrS)M<{R z3wk2w=xSgu@4G+K8()R_-5s~NWpZu;Z9(u6565r*40ECx@0Vj`PbMGcUSg^C?#{Z- zJUP;+@;aYcW$ecCW#0hvk>wN9Cblac(BIS!Vx4xCWe8)4>>OapkIgj$X&!sL? z{$<}YzpL+A8_irx<^t>j4-tb|vM*MW)2Gyq^i1PS_Eg;8)JG-$=B|t4?-o8QK>(2m=t&EPy|8@n;z(q5LyK09MICu!DIj3cl0z(Aj;ylq^re5}mUuWhb7 zpV^wC{$|X9eqH5&`c@x{^-lB&&Y)()ROGGs7)CN~*VFDj>f3kS>D>9-(v$eB6CJ-X zU=!z33j{yW5aw{g9Q@<>Oj=fw$AI-eXKqVsK9xC^246{z&4zaMoq6`#`cBIG4&Cq_ zF#qPG)&BIq#9Z4;AC~q|Z^kG6_rs2o_6D)W)rQl)cO2GlalRazbZI^ZpI4gE#?`hB zec!ozmmCW|0a;=V+gaEa<_pm7Sh5BC7~QI_6JP1xXK-CUkpEWS<#5RXX{Dpc)tz(fVKe!^=Hco_KA`sa6Cw|E&bh~b=eP}c zPa2k%mCx4Xai7#!r3LHRr(|ATUrJxD`=lXlw=T$W&UV!89B3i)F!LvGuOv=d+abrl zq6@lX9}Pu@E!jw%$}VCo@tc^R=E#m6sl_xR#~?Z8F6d1Cl?&FdV~vAv5PdM4^9L>X z3td0Yz;8B#*nri?Z7SL4ELpRZ#)?S0V&d6%$8KIT&&0|D<~xkM80MeybN7|xJ?(VI z?fO#wbuI4x)0BnC80-ywG}fjx24fy=64&Z8>yEg8#JQ%dKe{lN$`teQnqOh%R{Q|y zPi=c;p0QJ$Gs5QH3r%my^(3Tw^`P}{j>o>3jJ?}~^{VTDF~~ggr_5brT{mK;7E=cU zI=2>_J~w<6IsTLQ-cq{h$hdNDEo=kxJ-cU;^LjVNpYymgAId{@zBZS3u(D1X$Y(Qn ze&xS>YL0Ku9jja2ThT@|zCs^twyBX9-m5=OIiGXzBfm%B6E=T_wTEY8tD3vf`CPyE zM9vZKX6;BmHfUh(nl;GRK{@A$XLhVlr9AOWV9uq&bIBvtNHH$Vy#)78+($9zD)OUj zS+cmqW-2>&Ie>fC_t3p(;-&W&zl8i}P2~9v?S!0z+C47xw>GIVM0x2xv39fZB=g7{X^u(HgUlw+sOJl;A2A=> z)jA^jibo*dJm0BbOq$DiZ265L_=5GT>vPr)asQ>B`;~KnV|br+k@?_=oy+TA)>CDB z^t@-km38KGx9>`m&durSd1%i^+naOEn(wxk98P}cc1PyDCHK_o=WvMaVvdyS`eu|z ze%2cwS2z49xgKX<^G)^2HjwKKZGUq>%%?1J@hk ztnbY@I`d}g_fr?RZ#Iaz&^I{-nv?GQf7i}KxyKxM!^f~@V7`gdE~#r)^1r2WH|x8` z*xiS5{PKZ$CnI;QvOcei=*@9=c)KIgiw-+19roYvc&n#GJQ=Z{>2KL8u4Wf5`J$T)o`xwg@I_Hd3`lxfa7HDcc% zzpHt^v^g^kIey0GbFH(RU?lkWxLQzx2hdb*$;9t(WB= z_?rXX`c2l$@E&=kYj5bD?`ZercnxHsd24%NAL?In9*#WXNNgzf8n`dpILJtIE%hPy z#Xxv^1opwimg#A^z7uqXF}V6s=D_pQ7pW_Z-=l8RamQjq6Zdx9Mr01_ENFbp%xQUV zG2_jcIqzAw^^iB2-oVp*SLQ*~|DjLId|1}x@_lnCBD+dtS_wX-duHY`H4lo9-X7w$dlcZm5O1FxH-+Pt>rkuZ)`9>{sAkV&4o)BkJ^x_;0= zFXpfhI!)Pkc*hPoUef$x#?YA`b`dcci#IVhoH;SSoOECfyV29ke~QfHw~ethrX=SN zY{(>^$LAa+*36aHuAj9phJn!#*6!xEV{KWY+e_ASr8t@IOC2xmnupY}IL=)6WNtl= zmpK_+W7*8pC4U(gqm0*nGH0W;PqcOQ(>Z?iqkfyd_)l}rHS)0Jb85WjIW1!*4(m+* z*5T;B1+&?wT$<@Y|KKA0f$nb^^R7;q$QpGJaR}Pbd2b5Z>djapkDfV+)jj6MlDFJv zbWQDfL33`81b^kWt#i-rC2==puYLncJ#aKgg#b}2N z(w>Ai^yQBL_p!)*^|5O#;~Ck*D%*GMRwDOH*CNumXKy?+uoSz)Sp9q+glpq2_0PF} zGZs%Dj{7{?mhNp>>t+UXqP~4;=ML#V|BKuN*fZL5^))@?=Xvw~3w=I^kN#60n8(*V z(8dFppL+~vK+UhRyechAt&>RYmw|m#`|h36OUMP%j(xr(I--|}Z}`85y)ga9 zfB#qd?-%}0dcptvcRCC?=9+m3Hv9A`?6tIzcWyFgsgV83Ke0T5ec#?ghnCdME!}rE zXN0vJ&1a!MFZ=3tc*YOEHu6bdo^kPU9!i^e>Z18M{=oIDd&K%m&FOPQFMN&o4s$&y zG2pk&iD+}|8F%Pjo6oom>&$tUa}c!Jm)E1g$u*g4oGI85VE zZR^SVYn*MbZQOfeZObVq)s8t~XN|an8s}GP?9JBt4jfd&F0GLxq=wyBgRW|v!Kp!? zHE6#^j`JEmt=gEmvuf-K*T~UUBc`iHuJ0QAt~K(V)sQze^n7jbkij+1;MX{BQ6t8^ zz#m?6*19-$_pX9`)Wvqr)qBQ#D`)JfnNuuUx2~AYxpHDY3V5%;r(2NAq+nf8aHgfe zHZ10?UsKFpv$7z6Vu9@84E~UUc%OVW9(~1iJ8}ecCI6V5ruV#A)@oB_*N z69c%N^PjspbFeF)g*^UD&%5r22iULJRIiEZ9-r$PeFdKRagRn>J&~BPY+ zSakI2f^#qhc0kSxz`kvex�_E{`h>>)4hsiTR6wW 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 literal 0 HcmV?d00001 diff --git a/images/etc2.dds b/images/etc2.dds new file mode 100644 index 0000000000000000000000000000000000000000..77a3fa0da920e5cde0253bf7f5079fb0fed7d04f GIT binary patch literal 65744 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 literal 0 HcmV?d00001 diff --git a/models/teslacyberv3.0.mtl b/models/teslacyberv3.0.mtl new file mode 100644 index 0000000..1ac9711 --- /dev/null +++ b/models/teslacyberv3.0.mtl @@ -0,0 +1,62 @@ +# Blender MTL File: 'teslacyberv3.0.blend' +# Material Count: 6 + +newmtl Material +Ns 65.476285 +Ka 1.000000 1.000000 1.000000 +Kd 0.411568 0.411568 0.411568 +Ks 0.614679 0.614679 0.614679 +Ke 0.000000 0.000000 0.000000 +Ni 36.750000 +d 1.000000 +illum 3 + +newmtl Материал +Ns 323.999994 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 + +newmtl Материал.001 +Ns 900.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.026240 0.026240 0.026240 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 1 + +newmtl Материал.002 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.031837 0.032429 0.029425 +Ks 0.169725 0.169725 0.169725 +Ke 0.000000 0.000000 0.000000 +Ni 0.000000 +d 1.000000 +illum 2 + +newmtl Материал.003 +Ns 900.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.023585 0.083235 0.095923 +Ks 1.000000 1.000000 1.000000 +Ke 0.000000 0.000000 0.000000 +Ni 45.049999 +d 1.000000 +illum 3 + +newmtl Материал.004 +Ns 323.999994 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/models/teslacyberv3.0.obj b/models/teslacyberv3.0.obj new file mode 100644 index 0000000..337fe85 --- /dev/null +++ b/models/teslacyberv3.0.obj @@ -0,0 +1,6617 @@ +# Blender v2.91.2 OBJ File: 'teslacyberv3.0.blend' +# www.blender.org +mtllib teslacyberv3.0.mtl +o Cube +v 1.000000 1.919617 4.732432 +v 1.000000 0.974478 4.635892 +v 1.000000 3.273532 0.658841 +v 1.000000 0.655211 2.310734 +v 0.877517 2.564093 2.887154 +v 1.000000 0.882397 4.314609 +v 1.000000 3.067818 -1.579714 +v 1.000000 0.667890 -2.227377 +v 1.000000 0.785508 -4.214180 +v 1.000000 2.638943 -4.453823 +v 1.000000 0.874439 4.244418 +v 1.000000 0.655517 2.313426 +v 1.000000 1.111976 2.351255 +v 1.000000 1.866242 2.835600 +v 1.000000 1.833448 3.907717 +v 1.000000 1.258289 4.260885 +v 1.000000 0.668172 -2.232137 +v 1.000000 1.196988 -2.260916 +v 1.000000 1.854486 -2.740417 +v 1.000000 1.879915 -3.782969 +v 1.000000 1.335027 -4.186186 +v 1.750241 2.525397 -5.238923 +v 1.750241 1.086208 -5.076335 +v 1.284501 1.919617 4.732432 +v 1.327607 0.971679 4.653199 +v 1.531155 2.563108 2.886828 +v 1.531797 3.067818 -1.579714 +v 1.358472 3.272686 0.658562 +v 1.466385 2.830804 2.109343 +v 1.750241 0.655211 2.182597 +v 1.750241 0.882397 4.314609 +v 1.750241 0.667890 -2.227377 +v 1.697931 2.638943 -4.453823 +v 1.750241 2.485732 -4.434013 +v 1.750241 2.160423 2.167351 +v 1.750241 2.354560 -1.772200 +v 1.818752 0.655211 2.182857 +v 1.819952 0.655517 2.313426 +v 1.819952 0.874439 4.244418 +v 1.750241 0.882397 4.314609 +v 1.750241 1.128912 2.225720 +v 1.819952 1.111976 2.351255 +v 1.750241 1.985622 2.765436 +v 1.819952 1.866242 2.835600 +v 1.750241 1.936693 3.953938 +v 1.819952 1.833448 3.907717 +v 1.750241 1.341437 4.333489 +v 1.819952 1.258289 4.260885 +v 1.750241 0.883422 2.180506 +v 1.750241 1.591581 -4.318402 +v 1.750224 0.785508 -4.214180 +v 1.750241 0.833292 -4.351184 +v 1.820337 0.668172 -2.232137 +v 1.750241 0.667890 -2.048774 +v 1.820337 1.196988 -2.260916 +v 1.793278 1.210958 -2.101550 +v 1.820337 1.854486 -2.740417 +v 1.750241 1.987285 -2.642222 +v 1.820337 1.879915 -3.782969 +v 1.750241 2.014194 -3.854774 +v 1.820337 1.335027 -4.186186 +v 1.750241 1.350402 -4.282620 +v 1.712797 0.888017 2.180506 +v 1.819131 0.883519 2.180886 +v 1.720162 0.917570 -2.072449 +v 1.717040 0.905044 -0.269841 +v 1.750241 0.900970 -0.269841 +v 1.818854 0.655211 2.182597 +v 1.818854 0.667890 -2.048774 +v 1.818854 0.655211 2.182857 +v 1.818854 0.883422 2.180506 +v 1.818854 0.913878 -2.072449 +v 1.818854 0.900970 -0.269841 +v 1.750241 2.253663 0.275267 +v 1.772394 1.127157 2.177967 +v 1.750241 1.213567 -4.300763 +v 1.750241 1.289006 -5.099246 +v 1.750181 1.335027 -4.186186 +v 1.819927 1.289006 -5.099246 +v 1.819927 1.086208 -5.076335 +v 1.819927 0.833292 -4.351184 +v 1.819927 1.213567 -4.300763 +v 1.750215 1.204111 -4.203537 +v 1.750241 0.833292 -4.351184 +v 1.750241 1.213567 -4.300763 +v 1.819927 0.833292 -4.351184 +v 1.819927 1.213567 -4.300763 +v 1.750241 0.784857 -4.213239 +v 1.750241 1.204197 -4.203453 +v 1.819927 0.784857 -4.213239 +v 1.819927 1.204197 -4.203453 +v 1.750241 1.289002 -5.099215 +v 1.750241 1.266550 -4.861531 +v 1.750241 1.372882 -4.864861 +v 1.750241 1.389482 -5.059558 +v 1.704873 1.213566 -4.300773 +v 1.704873 1.350401 -4.282630 +v 1.704814 1.335025 -4.186196 +v 1.704847 1.204110 -4.203547 +v 1.704873 1.289004 -5.099256 +v 1.704873 1.372881 -4.864871 +v 1.704873 1.266549 -4.861541 +v 1.000000 1.335027 -4.186186 +v 1.750181 1.335027 -4.186186 +v 1.704813 1.335027 -4.186186 +v 0.999869 0.785508 -4.214180 +v 1.704605 1.335027 -4.186186 +v 1.781390 1.163258 0.334393 +v 1.715989 0.900825 0.337296 +v 1.597979 2.686126 2.117274 +v 1.695288 2.350152 2.149278 +v 1.568109 2.947990 -1.569140 +v 1.682906 2.571904 -1.628006 +v 1.470975 3.199804 0.572917 +v 1.497593 3.130800 -0.014067 +v 1.688418 2.473200 0.053302 +v 1.689320 2.457031 0.328725 +v 1.488895 3.153348 0.177737 +v 1.562110 2.963541 -1.436855 +v 1.683560 2.560198 -1.428613 +v 1.570283 2.798146 1.780491 +v 1.694388 2.366281 1.874541 +v 1.586019 2.734497 1.971851 +v 1.695039 2.354623 2.073121 +v 1.703611 2.262414 3.349329 +v 1.671976 2.347888 2.072812 +v 1.672225 2.343417 2.148969 +v 1.547219 2.791411 1.780182 +v 1.447912 3.193069 0.572608 +v 1.660496 2.553463 -1.428922 +v 1.665354 2.466465 0.052993 +v 1.474530 3.124065 -0.014376 +v 1.465832 3.146613 0.177428 +v 1.666257 2.450296 0.328416 +v 1.539047 2.956806 -1.437164 +v 1.671325 2.359546 1.874232 +v 1.574915 2.679392 2.116965 +v 1.562956 2.727762 1.971541 +v 1.680548 2.255679 3.349020 +v 1.555592 2.944302 -1.569304 +v 1.670389 2.568216 -1.628170 +v 1.549594 2.959853 -1.437019 +v 1.476379 3.149660 0.177573 +v 1.485076 3.127112 -0.014231 +v 1.675901 2.469512 0.053138 +v 1.676804 2.453343 0.328561 +v 1.671043 2.556510 -1.428777 +v 1.573503 2.730809 1.971686 +v 1.557766 2.794458 1.780327 +v 1.681871 2.362593 1.874377 +v 1.682522 2.350935 2.072957 +v 1.750241 1.263441 4.331896 +v 1.327607 1.287596 4.716530 +v 1.284501 1.284919 4.656356 +v 1.393376 1.287596 4.679573 +v 1.393376 0.971679 4.616242 +v 1.816010 0.882397 4.314609 +v 1.816010 1.263441 4.331896 +v 1.754250 1.258442 4.260794 +v 1.754033 0.874437 4.244418 +v 1.820019 1.258442 4.260794 +v 1.819803 0.874437 4.244418 +v 1.846744 0.800318 3.491142 +v 1.846744 0.720480 3.445081 +v 1.846744 0.706713 3.353942 +v 1.846744 0.769385 3.286355 +v 1.846744 0.861302 3.293214 +v 1.846744 0.913249 3.369355 +v 1.846744 0.886108 3.457441 +v 1.882362 0.798209 3.519400 +v 1.882362 0.697072 3.461051 +v 1.882362 0.679633 3.345598 +v 1.882362 0.759025 3.259980 +v 1.882362 0.875463 3.268670 +v 1.882362 0.941268 3.365122 +v 1.882362 0.906887 3.476708 +v 1.846744 0.792024 3.602285 +v 1.846744 0.628413 3.507893 +v 1.846744 0.600203 3.321125 +v 1.846744 0.728635 3.182619 +v 1.846744 0.916998 3.196676 +v 1.846744 1.023451 3.352709 +v 1.846744 0.967832 3.533221 +v 1.846744 0.658244 3.340309 +v 1.846744 0.677849 3.463600 +v 1.846744 0.683943 3.472385 +v 1.846744 0.792559 3.533928 +v 1.846744 0.553669 3.971039 +v 1.846744 0.431761 3.901965 +v 1.846744 0.780979 2.736408 +v 1.846744 0.920785 2.745747 +v 1.846744 0.879964 3.242204 +v 1.846744 0.755402 3.233883 +v 1.846744 0.745481 3.237870 +v 1.846744 0.661312 3.330068 +v 1.846744 0.288318 2.999900 +v 1.846744 0.382787 2.896419 +v 1.846744 0.783949 2.806544 +v 1.846744 0.908512 2.814866 +v 1.846744 1.241172 3.003353 +v 1.846744 1.312330 3.105928 +v 1.846744 1.372374 3.483531 +v 1.846744 1.336544 3.603119 +v 1.846744 1.078759 3.885496 +v 1.846744 0.962922 3.932045 +v 1.846744 0.581424 3.906559 +v 1.846744 0.472808 3.845017 +v 1.846744 0.254873 3.530860 +v 1.846744 0.235268 3.407569 +v 1.846744 0.345005 3.041307 +v 1.846744 0.429174 2.949109 +v 1.846744 0.879964 3.242204 +v 1.846744 0.755402 3.233883 +v 1.846744 0.960424 3.350050 +v 1.846744 0.889266 3.247475 +v 1.846744 0.926273 3.480196 +v 1.846744 0.962103 3.360608 +v 1.846744 0.803227 3.534641 +v 1.846744 0.919064 3.488092 +v 1.846744 0.683943 3.472385 +v 1.846744 0.792559 3.533928 +v 1.846744 0.658244 3.340309 +v 1.846744 0.677849 3.463600 +v 1.846744 0.745481 3.237870 +v 1.846744 0.661312 3.330068 +v 1.846744 0.165151 3.410984 +v 1.846744 0.187155 3.549363 +v 1.846744 1.401199 3.630465 +v 1.846744 1.441414 3.496242 +v 1.846744 0.962103 3.360608 +v 1.846744 0.926273 3.480196 +v 1.846744 0.919064 3.488092 +v 1.846744 0.803227 3.534641 +v 1.846744 0.981853 3.999644 +v 1.846744 1.111866 3.947399 +v 1.846744 0.889266 3.247475 +v 1.846744 0.960424 3.350050 +v 1.846744 1.374021 3.072428 +v 1.846744 1.294155 2.957301 +v 1.865511 0.904784 3.474123 +v 1.865511 0.803871 3.514674 +v 1.865511 1.359836 3.481223 +v 1.865511 0.942278 3.363063 +v 1.865511 0.267171 3.527500 +v 1.865511 0.694646 3.452786 +v 1.865511 0.677567 3.345380 +v 1.865511 0.248002 3.406949 +v 1.865511 0.699955 3.460439 +v 1.865511 0.480262 3.834674 +v 1.865511 0.586465 3.894849 +v 1.865511 0.794577 3.514053 +v 1.865511 0.911063 3.467244 +v 1.865511 1.324802 3.598153 +v 1.865511 0.906283 2.827418 +v 1.865511 0.784489 2.819282 +v 1.865511 0.762207 3.252665 +v 1.865511 0.870721 3.259914 +v 1.865511 0.753565 3.256138 +v 1.865511 0.437599 2.958678 +v 1.865511 0.680240 3.336458 +v 1.865511 0.355300 3.048827 +v 1.865511 0.959483 3.919768 +v 1.865511 1.072746 3.874254 +v 1.865511 0.878825 3.264505 +v 1.865511 0.940815 3.353865 +v 1.865511 1.301126 3.112011 +v 1.865511 1.231549 3.011716 +v 1.846743 0.808222 2.561027 +v 1.846743 0.967930 2.576757 +v 1.846743 1.121501 2.623343 +v 1.846743 1.263033 2.698993 +v 1.846743 1.387086 2.800801 +v 1.846743 1.488894 2.924854 +v 1.846743 1.564544 3.066386 +v 1.846743 1.611130 3.219956 +v 1.846743 1.626859 3.379664 +v 1.846743 1.611130 3.539372 +v 1.846743 1.564544 3.692943 +v 1.846743 1.488894 3.834475 +v 1.846743 1.387086 3.958528 +v 1.846743 1.263033 4.060336 +v 1.846743 1.121501 4.135986 +v 1.846743 0.967930 4.182571 +v 1.846743 0.808222 4.198301 +v 1.846743 0.648514 4.182571 +v 1.846743 0.494943 4.135986 +v 1.846743 0.353412 4.060336 +v 1.846743 0.229358 3.958528 +v 1.846743 0.127550 3.834475 +v 1.846743 0.051900 3.692943 +v 1.846743 0.005315 3.539372 +v 1.846743 -0.010415 3.379664 +v 1.846743 0.005316 3.219955 +v 1.846743 0.051901 3.066385 +v 1.846743 0.127551 2.924853 +v 1.846743 0.229359 2.800800 +v 1.846743 0.353413 2.698992 +v 1.846743 0.494945 2.623342 +v 1.846743 0.648515 2.576757 +v 1.888794 0.808222 2.638682 +v 1.888794 0.952781 2.652920 +v 1.888794 1.091784 2.695086 +v 1.888794 1.219890 2.763560 +v 1.888794 1.332176 2.855711 +v 1.888794 1.424327 2.967997 +v 1.888794 1.492801 3.096102 +v 1.888794 1.534967 3.235106 +v 1.888794 1.549205 3.379664 +v 1.888794 1.534967 3.524223 +v 1.888794 1.492801 3.663226 +v 1.888794 1.424327 3.791332 +v 1.888794 1.332176 3.903618 +v 1.888794 1.219890 3.995769 +v 1.888794 1.091784 4.064243 +v 1.888794 0.952781 4.106409 +v 1.888794 0.808222 4.120646 +v 1.888794 0.663664 4.106409 +v 1.888794 0.524660 4.064243 +v 1.888794 0.396554 3.995769 +v 1.888794 0.284268 3.903618 +v 1.888794 0.192118 3.791332 +v 1.888794 0.123644 3.663225 +v 1.888794 0.081477 3.524222 +v 1.888794 0.067240 3.379664 +v 1.888794 0.081478 3.235105 +v 1.888794 0.123644 3.096102 +v 1.888794 0.192118 2.967996 +v 1.888794 0.284269 2.855710 +v 1.888794 0.396555 2.763560 +v 1.888794 0.524662 2.695086 +v 1.888794 0.663665 2.652919 +v 1.855595 0.808222 2.738160 +v 1.855595 0.933374 2.750486 +v 1.855595 1.053715 2.786992 +v 1.855595 1.164623 2.846273 +v 1.855595 1.261834 2.926052 +v 1.855595 1.341614 3.023264 +v 1.855595 1.400895 3.134171 +v 1.855595 1.437400 3.254513 +v 1.855595 1.449726 3.379664 +v 1.855595 1.437400 3.504816 +v 1.855595 1.400895 3.625157 +v 1.855595 1.341614 3.736065 +v 1.855595 1.261834 3.833276 +v 1.855595 1.164623 3.913055 +v 1.855595 1.053715 3.972337 +v 1.855595 0.933373 4.008842 +v 1.855595 0.808222 4.021168 +v 1.855595 0.683071 4.008842 +v 1.855595 0.562729 3.972337 +v 1.855595 0.451821 3.913055 +v 1.855595 0.354610 3.833276 +v 1.855595 0.274831 3.736065 +v 1.855595 0.215550 3.625157 +v 1.855595 0.179044 3.504815 +v 1.855595 0.166718 3.379664 +v 1.855595 0.179045 3.254513 +v 1.855595 0.215550 3.134171 +v 1.855595 0.274832 3.023263 +v 1.855595 0.354611 2.926052 +v 1.855595 0.451823 2.846273 +v 1.855595 0.562730 2.786992 +v 1.855595 0.683072 2.750486 +v 1.840194 0.808222 2.876457 +v 1.840194 0.906393 2.886126 +v 1.840194 1.000792 2.914761 +v 1.840194 1.087790 2.961263 +v 1.840194 1.164044 3.023843 +v 1.840194 1.226624 3.100097 +v 1.840194 1.273126 3.187095 +v 1.840194 1.301761 3.281493 +v 1.840194 1.311430 3.379664 +v 1.840194 1.301761 3.477835 +v 1.840194 1.273126 3.572234 +v 1.840194 1.226624 3.659232 +v 1.840194 1.164044 3.735486 +v 1.840194 1.087790 3.798066 +v 1.840194 1.000792 3.844568 +v 1.840194 0.906393 3.873203 +v 1.840194 0.808222 3.882872 +v 1.840194 0.710051 3.873203 +v 1.840194 0.615653 3.844568 +v 1.840194 0.528655 3.798066 +v 1.840194 0.452401 3.735486 +v 1.840194 0.389820 3.659231 +v 1.840194 0.343319 3.572233 +v 1.840194 0.314684 3.477835 +v 1.840194 0.305014 3.379664 +v 1.840194 0.314684 3.281493 +v 1.840194 0.343320 3.187095 +v 1.840194 0.389821 3.100096 +v 1.840194 0.452401 3.023843 +v 1.840194 0.528656 2.961262 +v 1.840194 0.615654 2.914761 +v 1.840194 0.710052 2.886125 +v 1.353033 0.808222 2.561027 +v 1.353033 0.967930 2.576757 +v 1.353033 1.121501 2.623343 +v 1.353033 1.263033 2.698993 +v 1.353033 1.387086 2.800801 +v 1.353033 1.488894 2.924854 +v 1.353033 1.564544 3.066386 +v 1.353033 1.611130 3.219956 +v 1.353033 1.626859 3.379664 +v 1.353033 1.611130 3.539372 +v 1.353033 1.564544 3.692943 +v 1.353033 1.488894 3.834475 +v 1.353033 1.387086 3.958528 +v 1.353033 1.263033 4.060336 +v 1.353033 1.121501 4.135986 +v 1.353033 0.967930 4.182571 +v 1.353033 0.808222 4.198301 +v 1.353033 0.648514 4.182571 +v 1.353033 0.494943 4.135986 +v 1.353033 0.353412 4.060336 +v 1.353033 0.229358 3.958528 +v 1.353033 0.127550 3.834475 +v 1.353033 0.051900 3.692943 +v 1.353033 0.005315 3.539372 +v 1.353033 -0.010415 3.379664 +v 1.353033 0.005316 3.219955 +v 1.353033 0.051901 3.066385 +v 1.353033 0.127551 2.924853 +v 1.353033 0.229359 2.800800 +v 1.353033 0.353413 2.698992 +v 1.353033 0.494945 2.623342 +v 1.353033 0.648515 2.576757 +v 1.846744 0.800318 -3.128476 +v 1.846744 0.720480 -3.174537 +v 1.846744 0.706713 -3.265676 +v 1.846744 0.769385 -3.333263 +v 1.846744 0.861302 -3.326404 +v 1.846744 0.913249 -3.250263 +v 1.846744 0.886108 -3.162177 +v 1.882362 0.798209 -3.100218 +v 1.882362 0.697072 -3.158567 +v 1.882362 0.679633 -3.274020 +v 1.882362 0.759025 -3.359638 +v 1.882362 0.875463 -3.350948 +v 1.882362 0.941268 -3.254496 +v 1.882362 0.906887 -3.142910 +v 1.846744 0.792024 -3.017333 +v 1.846744 0.628413 -3.111725 +v 1.846744 0.600203 -3.298493 +v 1.846744 0.728635 -3.436999 +v 1.846744 0.916998 -3.422941 +v 1.846744 1.023451 -3.266909 +v 1.846744 0.967832 -3.086397 +v 1.846744 0.658244 -3.279309 +v 1.846744 0.677849 -3.156018 +v 1.846744 0.683943 -3.147233 +v 1.846744 0.792559 -3.085690 +v 1.846744 0.553669 -2.648579 +v 1.846744 0.431761 -2.717653 +v 1.846744 0.780979 -3.883210 +v 1.846744 0.920785 -3.873871 +v 1.846744 0.879964 -3.377414 +v 1.846744 0.755402 -3.385735 +v 1.846744 0.745481 -3.381748 +v 1.846744 0.661312 -3.289550 +v 1.846744 0.288318 -3.619718 +v 1.846744 0.382787 -3.723199 +v 1.846744 0.783949 -3.813074 +v 1.846744 0.908512 -3.804752 +v 1.846744 1.241172 -3.616265 +v 1.846744 1.312330 -3.513690 +v 1.846744 1.372374 -3.136086 +v 1.846744 1.336544 -3.016499 +v 1.846744 1.078759 -2.734122 +v 1.846744 0.962922 -2.687573 +v 1.846744 0.581424 -2.713058 +v 1.846744 0.472808 -2.774601 +v 1.846744 0.254873 -3.088758 +v 1.846744 0.235268 -3.212049 +v 1.846744 0.345005 -3.578310 +v 1.846744 0.429174 -3.670509 +v 1.846744 0.879964 -3.377414 +v 1.846744 0.755402 -3.385735 +v 1.846744 0.960424 -3.269568 +v 1.846744 0.889266 -3.372143 +v 1.846744 0.926273 -3.139422 +v 1.846744 0.962103 -3.259010 +v 1.846744 0.803227 -3.084977 +v 1.846744 0.919064 -3.131526 +v 1.846744 0.683943 -3.147233 +v 1.846744 0.792559 -3.085690 +v 1.846744 0.658244 -3.279309 +v 1.846744 0.677849 -3.156018 +v 1.846744 0.745481 -3.381748 +v 1.846744 0.661312 -3.289550 +v 1.846744 0.165151 -3.208634 +v 1.846744 0.187155 -3.070255 +v 1.846744 1.401199 -2.989153 +v 1.846744 1.441414 -3.123376 +v 1.846744 0.962103 -3.259010 +v 1.846744 0.926273 -3.139422 +v 1.846744 0.919064 -3.131526 +v 1.846744 0.803227 -3.084977 +v 1.846744 0.981853 -2.619974 +v 1.846744 1.111866 -2.672219 +v 1.846744 0.889266 -3.372143 +v 1.846744 0.960424 -3.269568 +v 1.846744 1.374021 -3.547190 +v 1.846744 1.294155 -3.662317 +v 1.865511 0.904784 -3.145495 +v 1.865511 0.803871 -3.104944 +v 1.865511 1.359836 -3.138395 +v 1.865511 0.942278 -3.256555 +v 1.865511 0.267171 -3.092118 +v 1.865511 0.694646 -3.166831 +v 1.865511 0.677567 -3.274238 +v 1.865511 0.248002 -3.212669 +v 1.865511 0.699955 -3.159178 +v 1.865511 0.480262 -2.784944 +v 1.865511 0.586465 -2.724769 +v 1.865511 0.794577 -3.105565 +v 1.865511 0.911063 -3.152374 +v 1.865511 1.324802 -3.021465 +v 1.865511 0.906283 -3.792200 +v 1.865511 0.784489 -3.800336 +v 1.865511 0.762207 -3.366953 +v 1.865511 0.870721 -3.359704 +v 1.865511 0.753565 -3.363480 +v 1.865511 0.437599 -3.660940 +v 1.865511 0.680240 -3.283160 +v 1.865511 0.355300 -3.570791 +v 1.865511 0.959483 -2.699850 +v 1.865511 1.072746 -2.745364 +v 1.865511 0.878825 -3.355113 +v 1.865511 0.940815 -3.265753 +v 1.865511 1.301126 -3.507607 +v 1.865511 1.231549 -3.607902 +v 1.846743 0.808222 -4.058591 +v 1.846743 0.967930 -4.042861 +v 1.846743 1.121501 -3.996275 +v 1.846743 1.263033 -3.920625 +v 1.846743 1.387086 -3.818817 +v 1.846743 1.488894 -3.694764 +v 1.846743 1.564544 -3.553232 +v 1.846743 1.611130 -3.399662 +v 1.846743 1.626859 -3.239954 +v 1.846743 1.611130 -3.080245 +v 1.846743 1.564544 -2.926675 +v 1.846743 1.488894 -2.785143 +v 1.846743 1.387086 -2.661090 +v 1.846743 1.263033 -2.559282 +v 1.846743 1.121501 -2.483632 +v 1.846743 0.967930 -2.437047 +v 1.846743 0.808222 -2.421317 +v 1.846743 0.648514 -2.437047 +v 1.846743 0.494943 -2.483632 +v 1.846743 0.353412 -2.559282 +v 1.846743 0.229358 -2.661090 +v 1.846743 0.127550 -2.785143 +v 1.846743 0.051900 -2.926675 +v 1.846743 0.005315 -3.080246 +v 1.846743 -0.010415 -3.239954 +v 1.846743 0.005316 -3.399662 +v 1.846743 0.051901 -3.553233 +v 1.846743 0.127551 -3.694765 +v 1.846743 0.229359 -3.818818 +v 1.846743 0.353413 -3.920626 +v 1.846743 0.494945 -3.996276 +v 1.846743 0.648515 -4.042861 +v 1.888794 0.808222 -3.980936 +v 1.888794 0.952781 -3.966698 +v 1.888794 1.091784 -3.924532 +v 1.888794 1.219890 -3.856058 +v 1.888794 1.332176 -3.763907 +v 1.888794 1.424327 -3.651621 +v 1.888794 1.492801 -3.523515 +v 1.888794 1.534967 -3.384512 +v 1.888794 1.549205 -3.239954 +v 1.888794 1.534967 -3.095395 +v 1.888794 1.492801 -2.956392 +v 1.888794 1.424327 -2.828286 +v 1.888794 1.332176 -2.716000 +v 1.888794 1.219890 -2.623849 +v 1.888794 1.091784 -2.555375 +v 1.888794 0.952781 -2.513209 +v 1.888794 0.808222 -2.498971 +v 1.888794 0.663664 -2.513209 +v 1.888794 0.524660 -2.555375 +v 1.888794 0.396554 -2.623849 +v 1.888794 0.284268 -2.716000 +v 1.888794 0.192118 -2.828286 +v 1.888794 0.123644 -2.956393 +v 1.888794 0.081477 -3.095396 +v 1.888794 0.067240 -3.239954 +v 1.888794 0.081478 -3.384513 +v 1.888794 0.123644 -3.523516 +v 1.888794 0.192118 -3.651622 +v 1.888794 0.284269 -3.763908 +v 1.888794 0.396555 -3.856058 +v 1.888794 0.524662 -3.924532 +v 1.888794 0.663665 -3.966699 +v 1.855595 0.808222 -3.881458 +v 1.855595 0.933374 -3.869132 +v 1.855595 1.053715 -3.832626 +v 1.855595 1.164623 -3.773345 +v 1.855595 1.261834 -3.693566 +v 1.855595 1.341614 -3.596354 +v 1.855595 1.400895 -3.485447 +v 1.855595 1.437400 -3.365105 +v 1.855595 1.449726 -3.239954 +v 1.855595 1.437400 -3.114802 +v 1.855595 1.400895 -2.994461 +v 1.855595 1.341614 -2.883553 +v 1.855595 1.261834 -2.786342 +v 1.855595 1.164623 -2.706563 +v 1.855595 1.053715 -2.647281 +v 1.855595 0.933373 -2.610775 +v 1.855595 0.808222 -2.598450 +v 1.855595 0.683071 -2.610775 +v 1.855595 0.562729 -2.647281 +v 1.855595 0.451821 -2.706563 +v 1.855595 0.354610 -2.786342 +v 1.855595 0.274831 -2.883553 +v 1.855595 0.215550 -2.994461 +v 1.855595 0.179044 -3.114803 +v 1.855595 0.166718 -3.239954 +v 1.855595 0.179045 -3.365105 +v 1.855595 0.215550 -3.485447 +v 1.855595 0.274832 -3.596355 +v 1.855595 0.354611 -3.693566 +v 1.855595 0.451823 -3.773345 +v 1.855595 0.562730 -3.832626 +v 1.855595 0.683072 -3.869132 +v 1.840194 0.808222 -3.743161 +v 1.840194 0.906393 -3.733492 +v 1.840194 1.000792 -3.704857 +v 1.840194 1.087790 -3.658355 +v 1.840194 1.164044 -3.595775 +v 1.840194 1.226624 -3.519521 +v 1.840194 1.273126 -3.432523 +v 1.840194 1.301761 -3.338125 +v 1.840194 1.311430 -3.239954 +v 1.840194 1.301761 -3.141783 +v 1.840194 1.273126 -3.047384 +v 1.840194 1.226624 -2.960386 +v 1.840194 1.164044 -2.884132 +v 1.840194 1.087790 -2.821552 +v 1.840194 1.000792 -2.775050 +v 1.840194 0.906393 -2.746415 +v 1.840194 0.808222 -2.736746 +v 1.840194 0.710051 -2.746415 +v 1.840194 0.615653 -2.775050 +v 1.840194 0.528655 -2.821552 +v 1.840194 0.452401 -2.884132 +v 1.840194 0.389820 -2.960387 +v 1.840194 0.343319 -3.047385 +v 1.840194 0.314684 -3.141783 +v 1.840194 0.305014 -3.239954 +v 1.840194 0.314684 -3.338125 +v 1.840194 0.343320 -3.432523 +v 1.840194 0.389821 -3.519521 +v 1.840194 0.452401 -3.595775 +v 1.840194 0.528656 -3.658356 +v 1.840194 0.615654 -3.704857 +v 1.840194 0.710052 -3.733493 +v 1.353033 0.808222 -4.058591 +v 1.353033 0.967930 -4.042861 +v 1.353033 1.121501 -3.996275 +v 1.353033 1.263033 -3.920625 +v 1.353033 1.387086 -3.818817 +v 1.353033 1.488894 -3.694764 +v 1.353033 1.564544 -3.553232 +v 1.353033 1.611130 -3.399662 +v 1.353033 1.626859 -3.239954 +v 1.353033 1.611130 -3.080245 +v 1.353033 1.564544 -2.926675 +v 1.353033 1.488894 -2.785143 +v 1.353033 1.387086 -2.661090 +v 1.353033 1.263033 -2.559282 +v 1.353033 1.121501 -2.483632 +v 1.353033 0.967930 -2.437047 +v 1.353033 0.808222 -2.421317 +v 1.353033 0.648514 -2.437047 +v 1.353033 0.494943 -2.483632 +v 1.353033 0.353412 -2.559282 +v 1.353033 0.229358 -2.661090 +v 1.353033 0.127550 -2.785143 +v 1.353033 0.051900 -2.926675 +v 1.353033 0.005315 -3.080246 +v 1.353033 -0.010415 -3.239954 +v 1.353033 0.005316 -3.399662 +v 1.353033 0.051901 -3.553233 +v 1.353033 0.127551 -3.694765 +v 1.353033 0.229359 -3.818818 +v 1.353033 0.353413 -3.920626 +v 1.353033 0.494945 -3.996276 +v 1.353033 0.648515 -4.042861 +v 1.750241 2.023547 4.365501 +v 1.284501 1.900495 4.727822 +v 1.750241 1.928161 4.357363 +v 1.284501 1.840112 4.710514 +v 1.269853 1.906111 4.686014 +v 1.735593 2.029163 4.323693 +v 1.735593 1.933777 4.315555 +v 1.269853 1.845728 4.668705 +v -0.014648 1.905965 4.688289 +v -0.014648 1.845915 4.670260 +v 1.301011 0.808222 2.697971 +v 1.301011 0.941214 2.711070 +v 1.301011 1.069095 2.749862 +v 1.301011 1.186951 2.812857 +v 1.301011 1.290252 2.897634 +v 1.301011 1.375030 3.000936 +v 1.301011 1.438025 3.118792 +v 1.301011 1.476817 3.246672 +v 1.301011 1.489915 3.379664 +v 1.301011 1.476817 3.512656 +v 1.301011 1.438025 3.640537 +v 1.301011 1.375030 3.758393 +v 1.301011 1.290252 3.861694 +v 1.301011 1.186951 3.946471 +v 1.301011 1.069095 4.009467 +v 1.301011 0.941214 4.048259 +v 1.301011 0.808222 4.061357 +v 1.301011 0.675230 4.048259 +v 1.301011 0.547349 4.009467 +v 1.301011 0.429494 3.946471 +v 1.301011 0.326192 3.861694 +v 1.301011 0.241415 3.758393 +v 1.301011 0.178420 3.640537 +v 1.301011 0.139627 3.512655 +v 1.301011 0.126529 3.379664 +v 1.301011 0.139628 3.246672 +v 1.301011 0.178420 3.118791 +v 1.301011 0.241416 3.000935 +v 1.301011 0.326193 2.897634 +v 1.301011 0.429495 2.812857 +v 1.301011 0.547351 2.749862 +v 1.301011 0.675231 2.711069 +v 1.591977 0.808222 3.304218 +v -0.159445 0.808222 3.304218 +v -0.159445 0.808222 3.304218 +v 1.591977 0.808222 3.304218 +v -0.159445 0.793497 3.305668 +v 1.591977 0.793497 3.305668 +v -0.159445 0.779338 3.309963 +v 1.591977 0.779338 3.309963 +v -0.159445 0.766289 3.316938 +v 1.591977 0.766289 3.316938 +v -0.159445 0.754852 3.326325 +v 1.591977 0.754852 3.326325 +v -0.159445 0.745465 3.337763 +v 1.591977 0.745465 3.337763 +v -0.159445 0.738490 3.350811 +v 1.591977 0.738490 3.350811 +v -0.159445 0.734195 3.364970 +v 1.591977 0.734195 3.364970 +v -0.159445 0.732745 3.379695 +v 1.591977 0.732745 3.379695 +v -0.159445 0.734195 3.394420 +v 1.591977 0.734195 3.394420 +v -0.159445 0.738490 3.408579 +v 1.591977 0.738490 3.408579 +v -0.159445 0.745465 3.421628 +v 1.591977 0.745465 3.421628 +v -0.159445 0.754852 3.433066 +v 1.591977 0.754852 3.433066 +v -0.159445 0.766289 3.442452 +v 1.591977 0.766289 3.442452 +v -0.159445 0.779338 3.449427 +v 1.591977 0.779338 3.449427 +v -0.159445 0.793497 3.453722 +v 1.591977 0.793497 3.453722 +v -0.159445 0.808222 3.455173 +v 1.591977 0.808222 3.455173 +v -0.159445 0.822947 3.453722 +v 1.591977 0.822947 3.453722 +v -0.159445 0.837106 3.449427 +v 1.591977 0.837106 3.449427 +v -0.159445 0.850155 3.442452 +v 1.591977 0.850155 3.442452 +v -0.159445 0.861593 3.433066 +v 1.591977 0.861593 3.433066 +v -0.159445 0.870979 3.421628 +v 1.591977 0.870979 3.421628 +v -0.159445 0.877954 3.408579 +v 1.591977 0.877954 3.408579 +v -0.159445 0.882249 3.394420 +v 1.591977 0.882249 3.394420 +v -0.159445 0.883700 3.379695 +v 1.591977 0.883700 3.379695 +v -0.159445 0.882249 3.364970 +v 1.591977 0.882249 3.364970 +v -0.159445 0.877954 3.350811 +v 1.591977 0.877954 3.350811 +v -0.159445 0.870979 3.337762 +v 1.591977 0.870979 3.337762 +v -0.159445 0.861593 3.326325 +v 1.591977 0.861593 3.326325 +v -0.159445 0.850155 3.316938 +v 1.591977 0.850155 3.316938 +v -0.159445 0.837106 3.309963 +v 1.591977 0.837106 3.309963 +v -0.159445 0.822947 3.305668 +v 1.591977 0.822947 3.305668 +v -0.159445 0.793497 3.305668 +v 1.591977 0.793497 3.305668 +v -0.159445 0.779338 3.309963 +v 1.591977 0.779338 3.309963 +v -0.159445 0.766289 3.316938 +v 1.591977 0.766289 3.316938 +v -0.159445 0.754852 3.326325 +v 1.591977 0.754852 3.326325 +v -0.159445 0.745465 3.337763 +v 1.591977 0.745465 3.337763 +v -0.159445 0.738490 3.350811 +v 1.591977 0.738490 3.350811 +v -0.159445 0.734195 3.364970 +v 1.591977 0.734195 3.364970 +v -0.159445 0.732745 3.379695 +v 1.591977 0.732745 3.379695 +v -0.159445 0.734195 3.394420 +v 1.591977 0.734195 3.394420 +v -0.159445 0.738490 3.408579 +v 1.591977 0.738490 3.408579 +v -0.159445 0.745465 3.421628 +v 1.591977 0.745465 3.421628 +v -0.159445 0.754852 3.433066 +v 1.591977 0.754852 3.433066 +v -0.159445 0.766289 3.442452 +v 1.591977 0.766289 3.442452 +v -0.159445 0.779338 3.449427 +v 1.591977 0.779338 3.449427 +v -0.159445 0.793497 3.453722 +v 1.591977 0.793497 3.453722 +v -0.159445 0.808222 3.455173 +v 1.591977 0.808222 3.455173 +v -0.159445 0.822947 3.453722 +v 1.591977 0.822947 3.453722 +v -0.159445 0.837106 3.449427 +v 1.591977 0.837106 3.449427 +v -0.159445 0.850155 3.442452 +v 1.591977 0.850155 3.442452 +v -0.159445 0.861593 3.433066 +v 1.591977 0.861593 3.433066 +v -0.159445 0.870979 3.421628 +v 1.591977 0.870979 3.421628 +v -0.159445 0.877954 3.408579 +v 1.591977 0.877954 3.408579 +v -0.159445 0.882249 3.394420 +v 1.591977 0.882249 3.394420 +v -0.159445 0.883700 3.379695 +v 1.591977 0.883700 3.379695 +v -0.159445 0.882249 3.364970 +v 1.591977 0.882249 3.364970 +v -0.159445 0.877954 3.350811 +v 1.591977 0.877954 3.350811 +v -0.159445 0.870979 3.337762 +v 1.591977 0.870979 3.337762 +v -0.159445 0.861593 3.326325 +v 1.591977 0.861593 3.326325 +v -0.159445 0.850155 3.316938 +v 1.591977 0.850155 3.316938 +v -0.159445 0.837106 3.309963 +v 1.591977 0.837106 3.309963 +v -0.159445 0.822947 3.305668 +v 1.591977 0.822947 3.305668 +v 1.591977 0.808222 -3.306741 +v -0.159445 0.808222 -3.306741 +v -0.159445 0.793497 -3.305290 +v 1.591977 0.793497 -3.305290 +v -0.159445 0.779338 -3.300995 +v 1.591977 0.779338 -3.300995 +v -0.159445 0.766289 -3.294020 +v 1.591977 0.766289 -3.294020 +v -0.159445 0.754852 -3.284634 +v 1.591977 0.754852 -3.284634 +v -0.159445 0.745465 -3.273196 +v 1.591977 0.745465 -3.273196 +v -0.159445 0.738490 -3.260147 +v 1.591977 0.738490 -3.260147 +v -0.159445 0.734195 -3.245988 +v 1.591977 0.734195 -3.245988 +v -0.159445 0.732745 -3.231263 +v 1.591977 0.732745 -3.231263 +v -0.159445 0.734195 -3.216538 +v 1.591977 0.734195 -3.216538 +v -0.159445 0.738490 -3.202379 +v 1.591977 0.738490 -3.202379 +v -0.159445 0.745465 -3.189330 +v 1.591977 0.745465 -3.189330 +v -0.159445 0.754852 -3.177893 +v 1.591977 0.754852 -3.177893 +v -0.159445 0.766289 -3.168506 +v 1.591977 0.766289 -3.168506 +v -0.159445 0.779338 -3.161531 +v 1.591977 0.779338 -3.161531 +v -0.159445 0.793497 -3.157236 +v 1.591977 0.793497 -3.157236 +v -0.159445 0.808222 -3.155786 +v 1.591977 0.808222 -3.155786 +v -0.159445 0.822947 -3.157236 +v 1.591977 0.822947 -3.157236 +v -0.159445 0.837106 -3.161531 +v 1.591977 0.837106 -3.161531 +v -0.159445 0.850155 -3.168506 +v 1.591977 0.850155 -3.168506 +v -0.159445 0.861593 -3.177893 +v 1.591977 0.861593 -3.177893 +v -0.159445 0.870979 -3.189330 +v 1.591977 0.870979 -3.189330 +v -0.159445 0.877954 -3.202379 +v 1.591977 0.877954 -3.202379 +v -0.159445 0.882249 -3.216538 +v 1.591977 0.882249 -3.216538 +v -0.159445 0.883700 -3.231263 +v 1.591977 0.883700 -3.231263 +v -0.159445 0.882249 -3.245988 +v 1.591977 0.882249 -3.245988 +v -0.159445 0.877954 -3.260147 +v 1.591977 0.877954 -3.260147 +v -0.159445 0.870979 -3.273196 +v 1.591977 0.870979 -3.273196 +v -0.159445 0.861593 -3.284634 +v 1.591977 0.861593 -3.284634 +v -0.159445 0.850155 -3.294020 +v 1.591977 0.850155 -3.294020 +v -0.159445 0.837106 -3.300995 +v 1.591977 0.837106 -3.300995 +v -0.159445 0.822947 -3.305290 +v 1.591977 0.822947 -3.305290 +v 1.000000 3.301469 0.574261 +v 1.000000 2.051993 4.367670 +v -0.033414 2.565001 2.887454 +v 1.441406 3.301469 0.574261 +v 1.555197 2.833836 2.103204 +v 1.750241 2.051993 4.367670 +v -0.033336 2.550689 2.882889 +v 1.000079 3.259221 0.654277 +v 0.877596 2.549781 2.882589 +v 1.358550 3.258375 0.653997 +v 1.466463 2.816492 2.104779 +v 1.531234 2.548796 2.882264 +v 1.736886 2.482217 -5.209983 +v 1.750241 2.478743 -5.231385 +v 1.750241 2.374938 -5.214535 +v 1.736886 2.378413 -5.193133 +v -0.013355 2.482217 -5.209983 +v -0.013355 2.378412 -5.193133 +v 1.732752 2.482217 -5.209983 +v 1.732752 2.378413 -5.193133 +v 1.732752 2.478743 -5.231385 +v 1.732752 2.374938 -5.214535 +v 1.300982 0.808222 -3.921466 +v 1.300982 0.941178 -3.908370 +v 1.300982 1.069026 -3.869588 +v 1.300982 1.186850 -3.806610 +v 1.300982 1.290124 -3.721855 +v 1.300982 1.374879 -3.618581 +v 1.300982 1.437857 -3.500757 +v 1.300982 1.476639 -3.372910 +v 1.300982 1.489734 -3.239954 +v 1.300982 1.476639 -3.106997 +v 1.300982 1.437857 -2.979151 +v 1.300982 1.374879 -2.861326 +v 1.300982 1.290124 -2.758052 +v 1.300982 1.186850 -2.673297 +v 1.300982 1.069025 -2.610319 +v 1.300982 0.941178 -2.571537 +v 1.300982 0.808222 -2.558442 +v 1.300982 0.675266 -2.571537 +v 1.300982 0.547419 -2.610319 +v 1.300982 0.429594 -2.673297 +v 1.300982 0.326320 -2.758052 +v 1.300982 0.241566 -2.861326 +v 1.300982 0.178587 -2.979151 +v 1.300982 0.139805 -3.106998 +v 1.300982 0.126710 -3.239954 +v 1.300982 0.139806 -3.372911 +v 1.300982 0.178588 -3.500757 +v 1.300982 0.241566 -3.618582 +v 1.300982 0.326321 -3.721856 +v 1.300982 0.429595 -3.806610 +v 1.300982 0.547420 -3.869589 +v 1.300982 0.675267 -3.908370 +v -1.000000 1.919617 4.732432 +v -1.000000 0.974478 4.635892 +v 0.000000 3.301469 0.574261 +v -1.000000 3.273532 0.658841 +v 0.000000 1.086208 -5.076335 +v 0.000000 1.919617 4.732432 +v 0.000000 0.971679 4.663217 +v 0.000000 2.525397 -5.238923 +v -1.000000 0.655211 2.310734 +v 0.000000 0.655211 2.310734 +v -0.877517 2.564093 2.887154 +v 0.000000 2.051993 4.367670 +v 0.000000 0.882397 4.314609 +v -1.000000 0.882397 4.314609 +v 0.000000 3.067818 -1.579714 +v -1.000000 3.067818 -1.579714 +v -1.000000 0.667890 -2.227377 +v 0.000000 0.667890 -2.227377 +v -1.000000 0.785508 -4.214180 +v 0.000000 0.785508 -4.214180 +v 0.000000 2.638943 -4.453823 +v -1.000000 2.638943 -4.453823 +v -1.000000 0.874439 4.244418 +v -1.000000 0.655517 2.313426 +v -1.000000 1.111976 2.351255 +v -1.000000 1.866242 2.835600 +v -1.000000 1.833448 3.907717 +v -1.000000 1.258289 4.260885 +v -1.000000 0.668172 -2.232137 +v -1.000000 1.196988 -2.260916 +v -1.000000 1.854486 -2.740417 +v -1.000000 1.879915 -3.782969 +v -1.000000 1.335027 -4.186186 +v -1.750241 2.525397 -5.238923 +v -1.750241 1.086208 -5.076335 +v -1.284501 1.919617 4.732432 +v -1.327607 0.971679 4.653199 +v -1.531155 2.563108 2.886828 +v -1.531797 3.067818 -1.579714 +v -1.358472 3.272686 0.658562 +v -1.466385 2.830804 2.109343 +v -1.750241 0.655211 2.182597 +v -1.750241 0.882397 4.314609 +v -1.750241 0.667890 -2.227377 +v -1.697931 2.638943 -4.453823 +v -1.750241 2.485732 -4.434013 +v -1.750241 2.160423 2.167351 +v -1.750241 2.354560 -1.772200 +v -1.818752 0.655211 2.182857 +v -1.819952 0.655517 2.313426 +v -1.819952 0.874439 4.244418 +v -1.750241 0.882397 4.314609 +v -1.750241 1.128912 2.225720 +v -1.819952 1.111976 2.351255 +v -1.750241 1.985622 2.765436 +v -1.819952 1.866242 2.835600 +v -1.750241 1.936693 3.953938 +v -1.819952 1.833448 3.907717 +v -1.750241 1.341437 4.333489 +v -1.819952 1.258289 4.260885 +v -1.750241 0.883422 2.180506 +v -1.750241 1.591581 -4.318402 +v -1.750224 0.785508 -4.214180 +v -1.750241 0.833292 -4.351184 +v -1.820337 0.668172 -2.232137 +v -1.750241 0.667890 -2.048774 +v -1.820337 1.196988 -2.260916 +v -1.793278 1.210958 -2.101550 +v -1.820337 1.854486 -2.740417 +v -1.750241 1.987285 -2.642222 +v -1.820337 1.879915 -3.782969 +v -1.750241 2.014194 -3.854774 +v -1.820337 1.335027 -4.186186 +v -1.750241 1.350402 -4.282620 +v -1.712797 0.888017 2.180506 +v -1.819131 0.883519 2.180886 +v -1.720162 0.917570 -2.072449 +v -1.717040 0.905044 -0.269841 +v -1.750241 0.900970 -0.269841 +v -1.818854 0.655211 2.182597 +v -1.818854 0.667890 -2.048774 +v -1.818854 0.655211 2.182857 +v -1.818854 0.883422 2.180506 +v -1.818854 0.913878 -2.072449 +v -1.818854 0.900970 -0.269841 +v -1.750241 2.253663 0.275267 +v -1.772394 1.127157 2.177967 +v -1.750241 1.213567 -4.300763 +v -1.750241 1.289006 -5.099246 +v -1.750181 1.335027 -4.186186 +v -1.819927 1.289006 -5.099246 +v -1.819927 1.086208 -5.076335 +v -1.819927 0.833292 -4.351184 +v -1.819927 1.213567 -4.300763 +v -1.750215 1.204111 -4.203537 +v -1.750241 0.833292 -4.351184 +v -1.750241 1.213567 -4.300763 +v -1.819927 0.833292 -4.351184 +v -1.819927 1.213567 -4.300763 +v -1.750241 0.784857 -4.213239 +v -1.750241 1.204197 -4.203453 +v -1.819927 0.784857 -4.213239 +v -1.819927 1.204197 -4.203453 +v 0.000000 1.288997 -5.099216 +v -1.750241 1.289002 -5.099215 +v 0.000000 1.266547 -4.861532 +v -1.750241 1.266550 -4.861531 +v 0.000000 1.372881 -4.864861 +v -1.750241 1.372882 -4.864861 +v 0.000000 1.389481 -5.059558 +v -1.750241 1.389482 -5.059558 +v -1.704873 1.213566 -4.300773 +v -1.704873 1.350401 -4.282630 +v -1.704814 1.335025 -4.186196 +v -1.704847 1.204110 -4.203547 +v -1.704873 1.289004 -5.099256 +v -1.704873 1.372881 -4.864871 +v -1.704873 1.266549 -4.861541 +v -1.000000 1.335027 -4.186186 +v -1.750181 1.335027 -4.186186 +v -1.704813 1.335027 -4.186186 +v -0.999869 0.785508 -4.214180 +v -1.704605 1.335027 -4.186186 +v -1.781390 1.163258 0.334393 +v -1.715989 0.900825 0.337296 +v -1.597979 2.686126 2.117274 +v -1.695288 2.350152 2.149278 +v -1.568109 2.947990 -1.569140 +v -1.682906 2.571904 -1.628006 +v -1.470975 3.199804 0.572917 +v -1.497593 3.130800 -0.014067 +v -1.688418 2.473200 0.053302 +v -1.689320 2.457031 0.328725 +v -1.488895 3.153348 0.177737 +v -1.562110 2.963541 -1.436855 +v -1.683560 2.560198 -1.428613 +v -1.570283 2.798146 1.780491 +v -1.694388 2.366281 1.874541 +v -1.586019 2.734497 1.971851 +v -1.695039 2.354623 2.073121 +v -1.703611 2.262414 3.349329 +v -1.671976 2.347888 2.072812 +v -1.672225 2.343417 2.148969 +v -1.547219 2.791411 1.780182 +v -1.447912 3.193069 0.572608 +v -1.660496 2.553463 -1.428922 +v -1.665354 2.466465 0.052993 +v -1.474530 3.124065 -0.014376 +v -1.465832 3.146613 0.177428 +v -1.666257 2.450296 0.328416 +v -1.539047 2.956806 -1.437164 +v -1.671325 2.359546 1.874232 +v -1.574915 2.679392 2.116965 +v -1.562956 2.727762 1.971541 +v -1.680548 2.255679 3.349020 +v -1.555592 2.944302 -1.569304 +v -1.670389 2.568216 -1.628170 +v -1.549594 2.959853 -1.437019 +v -1.476379 3.149660 0.177573 +v -1.485076 3.127112 -0.014231 +v -1.675901 2.469512 0.053138 +v -1.676804 2.453343 0.328561 +v -1.671043 2.556510 -1.428777 +v -1.573503 2.730809 1.971686 +v -1.557766 2.794458 1.780327 +v -1.681871 2.362593 1.874377 +v -1.682522 2.350935 2.072957 +v -1.750241 1.263441 4.331896 +v -1.327607 1.287596 4.716530 +v 0.000000 1.287597 4.726548 +v -1.284501 1.284919 4.656356 +v 0.000000 1.291921 4.656356 +v -1.393376 1.287596 4.679573 +v -1.393376 0.971679 4.616242 +v -1.816010 0.882397 4.314609 +v -1.816010 1.263441 4.331896 +v -1.754250 1.258442 4.260794 +v -1.754033 0.874437 4.244418 +v -1.820019 1.258442 4.260794 +v -1.819803 0.874437 4.244418 +v -1.846744 0.800318 3.491142 +v -1.846744 0.720480 3.445081 +v -1.846744 0.706713 3.353942 +v -1.846744 0.769385 3.286355 +v -1.846744 0.861302 3.293214 +v -1.846744 0.913249 3.369355 +v -1.846744 0.886108 3.457441 +v -1.882362 0.798209 3.519400 +v -1.882362 0.697072 3.461051 +v -1.882362 0.679633 3.345598 +v -1.882362 0.759025 3.259980 +v -1.882362 0.875463 3.268670 +v -1.882362 0.941268 3.365122 +v -1.882362 0.906887 3.476708 +v -1.846744 0.792024 3.602285 +v -1.846744 0.628413 3.507893 +v -1.846744 0.600203 3.321125 +v -1.846744 0.728635 3.182619 +v -1.846744 0.916998 3.196676 +v -1.846744 1.023451 3.352709 +v -1.846744 0.967832 3.533221 +v -1.846744 0.658244 3.340309 +v -1.846744 0.677849 3.463600 +v -1.846744 0.683943 3.472385 +v -1.846744 0.792559 3.533928 +v -1.846744 0.553669 3.971039 +v -1.846744 0.431761 3.901965 +v -1.846744 0.780979 2.736408 +v -1.846744 0.920785 2.745747 +v -1.846744 0.879964 3.242204 +v -1.846744 0.755402 3.233883 +v -1.846744 0.745481 3.237870 +v -1.846744 0.661312 3.330068 +v -1.846744 0.288318 2.999900 +v -1.846744 0.382787 2.896419 +v -1.846744 0.783949 2.806544 +v -1.846744 0.908512 2.814866 +v -1.846744 1.241172 3.003353 +v -1.846744 1.312330 3.105928 +v -1.846744 1.372374 3.483531 +v -1.846744 1.336544 3.603119 +v -1.846744 1.078759 3.885496 +v -1.846744 0.962922 3.932045 +v -1.846744 0.581424 3.906559 +v -1.846744 0.472808 3.845017 +v -1.846744 0.254873 3.530860 +v -1.846744 0.235268 3.407569 +v -1.846744 0.345005 3.041307 +v -1.846744 0.429174 2.949109 +v -1.846744 0.879964 3.242204 +v -1.846744 0.755402 3.233883 +v -1.846744 0.960424 3.350050 +v -1.846744 0.889266 3.247475 +v -1.846744 0.926273 3.480196 +v -1.846744 0.962103 3.360608 +v -1.846744 0.803227 3.534641 +v -1.846744 0.919064 3.488092 +v -1.846744 0.683943 3.472385 +v -1.846744 0.792559 3.533928 +v -1.846744 0.658244 3.340309 +v -1.846744 0.677849 3.463600 +v -1.846744 0.745481 3.237870 +v -1.846744 0.661312 3.330068 +v -1.846744 0.165151 3.410984 +v -1.846744 0.187155 3.549363 +v -1.846744 1.401199 3.630465 +v -1.846744 1.441414 3.496242 +v -1.846744 0.962103 3.360608 +v -1.846744 0.926273 3.480196 +v -1.846744 0.919064 3.488092 +v -1.846744 0.803227 3.534641 +v -1.846744 0.981853 3.999644 +v -1.846744 1.111866 3.947399 +v -1.846744 0.889266 3.247475 +v -1.846744 0.960424 3.350050 +v -1.846744 1.374021 3.072428 +v -1.846744 1.294155 2.957301 +v -1.865511 0.904784 3.474123 +v -1.865511 0.803871 3.514674 +v -1.865511 1.359836 3.481223 +v -1.865511 0.942278 3.363063 +v -1.865511 0.267171 3.527500 +v -1.865511 0.694646 3.452786 +v -1.865511 0.677567 3.345380 +v -1.865511 0.248002 3.406949 +v -1.865511 0.699955 3.460439 +v -1.865511 0.480262 3.834674 +v -1.865511 0.586465 3.894849 +v -1.865511 0.794577 3.514053 +v -1.865511 0.911063 3.467244 +v -1.865511 1.324802 3.598153 +v -1.865511 0.906283 2.827418 +v -1.865511 0.784489 2.819282 +v -1.865511 0.762207 3.252665 +v -1.865511 0.870721 3.259914 +v -1.865511 0.753565 3.256138 +v -1.865511 0.437599 2.958678 +v -1.865511 0.680240 3.336458 +v -1.865511 0.355300 3.048827 +v -1.865511 0.959483 3.919768 +v -1.865511 1.072746 3.874254 +v -1.865511 0.878825 3.264505 +v -1.865511 0.940815 3.353865 +v -1.865511 1.301126 3.112011 +v -1.865511 1.231549 3.011716 +v -1.846743 0.808222 2.561027 +v -1.846743 0.967930 2.576757 +v -1.846743 1.121501 2.623343 +v -1.846743 1.263033 2.698993 +v -1.846743 1.387086 2.800801 +v -1.846743 1.488894 2.924854 +v -1.846743 1.564544 3.066386 +v -1.846743 1.611130 3.219956 +v -1.846743 1.626859 3.379664 +v -1.846743 1.611130 3.539372 +v -1.846743 1.564544 3.692943 +v -1.846743 1.488894 3.834475 +v -1.846743 1.387086 3.958528 +v -1.846743 1.263033 4.060336 +v -1.846743 1.121501 4.135986 +v -1.846743 0.967930 4.182571 +v -1.846743 0.808222 4.198301 +v -1.846743 0.648514 4.182571 +v -1.846743 0.494943 4.135986 +v -1.846743 0.353412 4.060336 +v -1.846743 0.229358 3.958528 +v -1.846743 0.127550 3.834475 +v -1.846743 0.051900 3.692943 +v -1.846743 0.005315 3.539372 +v -1.846743 -0.010415 3.379664 +v -1.846743 0.005316 3.219955 +v -1.846743 0.051901 3.066385 +v -1.846743 0.127551 2.924853 +v -1.846743 0.229359 2.800800 +v -1.846743 0.353413 2.698992 +v -1.846743 0.494945 2.623342 +v -1.846743 0.648515 2.576757 +v -1.888794 0.808222 2.638682 +v -1.888794 0.952781 2.652920 +v -1.888794 1.091784 2.695086 +v -1.888794 1.219890 2.763560 +v -1.888794 1.332176 2.855711 +v -1.888794 1.424327 2.967997 +v -1.888794 1.492801 3.096102 +v -1.888794 1.534967 3.235106 +v -1.888794 1.549205 3.379664 +v -1.888794 1.534967 3.524223 +v -1.888794 1.492801 3.663226 +v -1.888794 1.424327 3.791332 +v -1.888794 1.332176 3.903618 +v -1.888794 1.219890 3.995769 +v -1.888794 1.091784 4.064243 +v -1.888794 0.952781 4.106409 +v -1.888794 0.808222 4.120646 +v -1.888794 0.663664 4.106409 +v -1.888794 0.524660 4.064243 +v -1.888794 0.396554 3.995769 +v -1.888794 0.284268 3.903618 +v -1.888794 0.192118 3.791332 +v -1.888794 0.123644 3.663225 +v -1.888794 0.081477 3.524222 +v -1.888794 0.067240 3.379664 +v -1.888794 0.081478 3.235105 +v -1.888794 0.123644 3.096102 +v -1.888794 0.192118 2.967996 +v -1.888794 0.284269 2.855710 +v -1.888794 0.396555 2.763560 +v -1.888794 0.524662 2.695086 +v -1.888794 0.663665 2.652919 +v -1.855595 0.808222 2.738160 +v -1.855595 0.933374 2.750486 +v -1.855595 1.053715 2.786992 +v -1.855595 1.164623 2.846273 +v -1.855595 1.261834 2.926052 +v -1.855595 1.341614 3.023264 +v -1.855595 1.400895 3.134171 +v -1.855595 1.437400 3.254513 +v -1.855595 1.449726 3.379664 +v -1.855595 1.437400 3.504816 +v -1.855595 1.400895 3.625157 +v -1.855595 1.341614 3.736065 +v -1.855595 1.261834 3.833276 +v -1.855595 1.164623 3.913055 +v -1.855595 1.053715 3.972337 +v -1.855595 0.933373 4.008842 +v -1.855595 0.808222 4.021168 +v -1.855595 0.683071 4.008842 +v -1.855595 0.562729 3.972337 +v -1.855595 0.451821 3.913055 +v -1.855595 0.354610 3.833276 +v -1.855595 0.274831 3.736065 +v -1.855595 0.215550 3.625157 +v -1.855595 0.179044 3.504815 +v -1.855595 0.166718 3.379664 +v -1.855595 0.179045 3.254513 +v -1.855595 0.215550 3.134171 +v -1.855595 0.274832 3.023263 +v -1.855595 0.354611 2.926052 +v -1.855595 0.451823 2.846273 +v -1.855595 0.562730 2.786992 +v -1.855595 0.683072 2.750486 +v -1.840194 0.808222 2.876457 +v -1.840194 0.906393 2.886126 +v -1.840194 1.000792 2.914761 +v -1.840194 1.087790 2.961263 +v -1.840194 1.164044 3.023843 +v -1.840194 1.226624 3.100097 +v -1.840194 1.273126 3.187095 +v -1.840194 1.301761 3.281493 +v -1.840194 1.311430 3.379664 +v -1.840194 1.301761 3.477835 +v -1.840194 1.273126 3.572234 +v -1.840194 1.226624 3.659232 +v -1.840194 1.164044 3.735486 +v -1.840194 1.087790 3.798066 +v -1.840194 1.000792 3.844568 +v -1.840194 0.906393 3.873203 +v -1.840194 0.808222 3.882872 +v -1.840194 0.710051 3.873203 +v -1.840194 0.615653 3.844568 +v -1.840194 0.528655 3.798066 +v -1.840194 0.452401 3.735486 +v -1.840194 0.389820 3.659231 +v -1.840194 0.343319 3.572233 +v -1.840194 0.314684 3.477835 +v -1.840194 0.305014 3.379664 +v -1.840194 0.314684 3.281493 +v -1.840194 0.343320 3.187095 +v -1.840194 0.389821 3.100096 +v -1.840194 0.452401 3.023843 +v -1.840194 0.528656 2.961262 +v -1.840194 0.615654 2.914761 +v -1.840194 0.710052 2.886125 +v -1.353033 0.808222 2.561027 +v -1.353033 0.967930 2.576757 +v -1.353033 1.121501 2.623343 +v -1.353033 1.263033 2.698993 +v -1.353033 1.387086 2.800801 +v -1.353033 1.488894 2.924854 +v -1.353033 1.564544 3.066386 +v -1.353033 1.611130 3.219956 +v -1.353033 1.626859 3.379664 +v -1.353033 1.611130 3.539372 +v -1.353033 1.564544 3.692943 +v -1.353033 1.488894 3.834475 +v -1.353033 1.387086 3.958528 +v -1.353033 1.263033 4.060336 +v -1.353033 1.121501 4.135986 +v -1.353033 0.967930 4.182571 +v -1.353033 0.808222 4.198301 +v -1.353033 0.648514 4.182571 +v -1.353033 0.494943 4.135986 +v -1.353033 0.353412 4.060336 +v -1.353033 0.229358 3.958528 +v -1.353033 0.127550 3.834475 +v -1.353033 0.051900 3.692943 +v -1.353033 0.005315 3.539372 +v -1.353033 -0.010415 3.379664 +v -1.353033 0.005316 3.219955 +v -1.353033 0.051901 3.066385 +v -1.353033 0.127551 2.924853 +v -1.353033 0.229359 2.800800 +v -1.353033 0.353413 2.698992 +v -1.353033 0.494945 2.623342 +v -1.353033 0.648515 2.576757 +v -1.846744 0.800318 -3.128476 +v -1.846744 0.720480 -3.174537 +v -1.846744 0.706713 -3.265676 +v -1.846744 0.769385 -3.333263 +v -1.846744 0.861302 -3.326404 +v -1.846744 0.913249 -3.250263 +v -1.846744 0.886108 -3.162177 +v -1.882362 0.798209 -3.100218 +v -1.882362 0.697072 -3.158567 +v -1.882362 0.679633 -3.274020 +v -1.882362 0.759025 -3.359638 +v -1.882362 0.875463 -3.350948 +v -1.882362 0.941268 -3.254496 +v -1.882362 0.906887 -3.142910 +v -1.846744 0.792024 -3.017333 +v -1.846744 0.628413 -3.111725 +v -1.846744 0.600203 -3.298493 +v -1.846744 0.728635 -3.436999 +v -1.846744 0.916998 -3.422941 +v -1.846744 1.023451 -3.266909 +v -1.846744 0.967832 -3.086397 +v -1.846744 0.658244 -3.279309 +v -1.846744 0.677849 -3.156018 +v -1.846744 0.683943 -3.147233 +v -1.846744 0.792559 -3.085690 +v -1.846744 0.553669 -2.648579 +v -1.846744 0.431761 -2.717653 +v -1.846744 0.780979 -3.883210 +v -1.846744 0.920785 -3.873871 +v -1.846744 0.879964 -3.377414 +v -1.846744 0.755402 -3.385735 +v -1.846744 0.745481 -3.381748 +v -1.846744 0.661312 -3.289550 +v -1.846744 0.288318 -3.619718 +v -1.846744 0.382787 -3.723199 +v -1.846744 0.783949 -3.813074 +v -1.846744 0.908512 -3.804752 +v -1.846744 1.241172 -3.616265 +v -1.846744 1.312330 -3.513690 +v -1.846744 1.372374 -3.136086 +v -1.846744 1.336544 -3.016499 +v -1.846744 1.078759 -2.734122 +v -1.846744 0.962922 -2.687573 +v -1.846744 0.581424 -2.713058 +v -1.846744 0.472808 -2.774601 +v -1.846744 0.254873 -3.088758 +v -1.846744 0.235268 -3.212049 +v -1.846744 0.345005 -3.578310 +v -1.846744 0.429174 -3.670509 +v -1.846744 0.879964 -3.377414 +v -1.846744 0.755402 -3.385735 +v -1.846744 0.960424 -3.269568 +v -1.846744 0.889266 -3.372143 +v -1.846744 0.926273 -3.139422 +v -1.846744 0.962103 -3.259010 +v -1.846744 0.803227 -3.084977 +v -1.846744 0.919064 -3.131526 +v -1.846744 0.683943 -3.147233 +v -1.846744 0.792559 -3.085690 +v -1.846744 0.658244 -3.279309 +v -1.846744 0.677849 -3.156018 +v -1.846744 0.745481 -3.381748 +v -1.846744 0.661312 -3.289550 +v -1.846744 0.165151 -3.208634 +v -1.846744 0.187155 -3.070255 +v -1.846744 1.401199 -2.989153 +v -1.846744 1.441414 -3.123376 +v -1.846744 0.962103 -3.259010 +v -1.846744 0.926273 -3.139422 +v -1.846744 0.919064 -3.131526 +v -1.846744 0.803227 -3.084977 +v -1.846744 0.981853 -2.619974 +v -1.846744 1.111866 -2.672219 +v -1.846744 0.889266 -3.372143 +v -1.846744 0.960424 -3.269568 +v -1.846744 1.374021 -3.547190 +v -1.846744 1.294155 -3.662317 +v -1.865511 0.904784 -3.145495 +v -1.865511 0.803871 -3.104944 +v -1.865511 1.359836 -3.138395 +v -1.865511 0.942278 -3.256555 +v -1.865511 0.267171 -3.092118 +v -1.865511 0.694646 -3.166831 +v -1.865511 0.677567 -3.274238 +v -1.865511 0.248002 -3.212669 +v -1.865511 0.699955 -3.159178 +v -1.865511 0.480262 -2.784944 +v -1.865511 0.586465 -2.724769 +v -1.865511 0.794577 -3.105565 +v -1.865511 0.911063 -3.152374 +v -1.865511 1.324802 -3.021465 +v -1.865511 0.906283 -3.792200 +v -1.865511 0.784489 -3.800336 +v -1.865511 0.762207 -3.366953 +v -1.865511 0.870721 -3.359704 +v -1.865511 0.753565 -3.363480 +v -1.865511 0.437599 -3.660940 +v -1.865511 0.680240 -3.283160 +v -1.865511 0.355300 -3.570791 +v -1.865511 0.959483 -2.699850 +v -1.865511 1.072746 -2.745364 +v -1.865511 0.878825 -3.355113 +v -1.865511 0.940815 -3.265753 +v -1.865511 1.301126 -3.507607 +v -1.865511 1.231549 -3.607902 +v -1.846743 0.808222 -4.058591 +v -1.846743 0.967930 -4.042861 +v -1.846743 1.121501 -3.996275 +v -1.846743 1.263033 -3.920625 +v -1.846743 1.387086 -3.818817 +v -1.846743 1.488894 -3.694764 +v -1.846743 1.564544 -3.553232 +v -1.846743 1.611130 -3.399662 +v -1.846743 1.626859 -3.239954 +v -1.846743 1.611130 -3.080245 +v -1.846743 1.564544 -2.926675 +v -1.846743 1.488894 -2.785143 +v -1.846743 1.387086 -2.661090 +v -1.846743 1.263033 -2.559282 +v -1.846743 1.121501 -2.483632 +v -1.846743 0.967930 -2.437047 +v -1.846743 0.808222 -2.421317 +v -1.846743 0.648514 -2.437047 +v -1.846743 0.494943 -2.483632 +v -1.846743 0.353412 -2.559282 +v -1.846743 0.229358 -2.661090 +v -1.846743 0.127550 -2.785143 +v -1.846743 0.051900 -2.926675 +v -1.846743 0.005315 -3.080246 +v -1.846743 -0.010415 -3.239954 +v -1.846743 0.005316 -3.399662 +v -1.846743 0.051901 -3.553233 +v -1.846743 0.127551 -3.694765 +v -1.846743 0.229359 -3.818818 +v -1.846743 0.353413 -3.920626 +v -1.846743 0.494945 -3.996276 +v -1.846743 0.648515 -4.042861 +v -1.888794 0.808222 -3.980936 +v -1.888794 0.952781 -3.966698 +v -1.888794 1.091784 -3.924532 +v -1.888794 1.219890 -3.856058 +v -1.888794 1.332176 -3.763907 +v -1.888794 1.424327 -3.651621 +v -1.888794 1.492801 -3.523515 +v -1.888794 1.534967 -3.384512 +v -1.888794 1.549205 -3.239954 +v -1.888794 1.534967 -3.095395 +v -1.888794 1.492801 -2.956392 +v -1.888794 1.424327 -2.828286 +v -1.888794 1.332176 -2.716000 +v -1.888794 1.219890 -2.623849 +v -1.888794 1.091784 -2.555375 +v -1.888794 0.952781 -2.513209 +v -1.888794 0.808222 -2.498971 +v -1.888794 0.663664 -2.513209 +v -1.888794 0.524660 -2.555375 +v -1.888794 0.396554 -2.623849 +v -1.888794 0.284268 -2.716000 +v -1.888794 0.192118 -2.828286 +v -1.888794 0.123644 -2.956393 +v -1.888794 0.081477 -3.095396 +v -1.888794 0.067240 -3.239954 +v -1.888794 0.081478 -3.384513 +v -1.888794 0.123644 -3.523516 +v -1.888794 0.192118 -3.651622 +v -1.888794 0.284269 -3.763908 +v -1.888794 0.396555 -3.856058 +v -1.888794 0.524662 -3.924532 +v -1.888794 0.663665 -3.966699 +v -1.855595 0.808222 -3.881458 +v -1.855595 0.933374 -3.869132 +v -1.855595 1.053715 -3.832626 +v -1.855595 1.164623 -3.773345 +v -1.855595 1.261834 -3.693566 +v -1.855595 1.341614 -3.596354 +v -1.855595 1.400895 -3.485447 +v -1.855595 1.437400 -3.365105 +v -1.855595 1.449726 -3.239954 +v -1.855595 1.437400 -3.114802 +v -1.855595 1.400895 -2.994461 +v -1.855595 1.341614 -2.883553 +v -1.855595 1.261834 -2.786342 +v -1.855595 1.164623 -2.706563 +v -1.855595 1.053715 -2.647281 +v -1.855595 0.933373 -2.610775 +v -1.855595 0.808222 -2.598450 +v -1.855595 0.683071 -2.610775 +v -1.855595 0.562729 -2.647281 +v -1.855595 0.451821 -2.706563 +v -1.855595 0.354610 -2.786342 +v -1.855595 0.274831 -2.883553 +v -1.855595 0.215550 -2.994461 +v -1.855595 0.179044 -3.114803 +v -1.855595 0.166718 -3.239954 +v -1.855595 0.179045 -3.365105 +v -1.855595 0.215550 -3.485447 +v -1.855595 0.274832 -3.596355 +v -1.855595 0.354611 -3.693566 +v -1.855595 0.451823 -3.773345 +v -1.855595 0.562730 -3.832626 +v -1.855595 0.683072 -3.869132 +v -1.840194 0.808222 -3.743161 +v -1.840194 0.906393 -3.733492 +v -1.840194 1.000792 -3.704857 +v -1.840194 1.087790 -3.658355 +v -1.840194 1.164044 -3.595775 +v -1.840194 1.226624 -3.519521 +v -1.840194 1.273126 -3.432523 +v -1.840194 1.301761 -3.338125 +v -1.840194 1.311430 -3.239954 +v -1.840194 1.301761 -3.141783 +v -1.840194 1.273126 -3.047384 +v -1.840194 1.226624 -2.960386 +v -1.840194 1.164044 -2.884132 +v -1.840194 1.087790 -2.821552 +v -1.840194 1.000792 -2.775050 +v -1.840194 0.906393 -2.746415 +v -1.840194 0.808222 -2.736746 +v -1.840194 0.710051 -2.746415 +v -1.840194 0.615653 -2.775050 +v -1.840194 0.528655 -2.821552 +v -1.840194 0.452401 -2.884132 +v -1.840194 0.389820 -2.960387 +v -1.840194 0.343319 -3.047385 +v -1.840194 0.314684 -3.141783 +v -1.840194 0.305014 -3.239954 +v -1.840194 0.314684 -3.338125 +v -1.840194 0.343320 -3.432523 +v -1.840194 0.389821 -3.519521 +v -1.840194 0.452401 -3.595775 +v -1.840194 0.528656 -3.658356 +v -1.840194 0.615654 -3.704857 +v -1.840194 0.710052 -3.733493 +v -1.353033 0.808222 -4.058591 +v -1.353033 0.967930 -4.042861 +v -1.353033 1.121501 -3.996275 +v -1.353033 1.263033 -3.920625 +v -1.353033 1.387086 -3.818817 +v -1.353033 1.488894 -3.694764 +v -1.353033 1.564544 -3.553232 +v -1.353033 1.611130 -3.399662 +v -1.353033 1.626859 -3.239954 +v -1.353033 1.611130 -3.080245 +v -1.353033 1.564544 -2.926675 +v -1.353033 1.488894 -2.785143 +v -1.353033 1.387086 -2.661090 +v -1.353033 1.263033 -2.559282 +v -1.353033 1.121501 -2.483632 +v -1.353033 0.967930 -2.437047 +v -1.353033 0.808222 -2.421317 +v -1.353033 0.648514 -2.437047 +v -1.353033 0.494943 -2.483632 +v -1.353033 0.353412 -2.559282 +v -1.353033 0.229358 -2.661090 +v -1.353033 0.127550 -2.785143 +v -1.353033 0.051900 -2.926675 +v -1.353033 0.005315 -3.080246 +v -1.353033 -0.010415 -3.239954 +v -1.353033 0.005316 -3.399662 +v -1.353033 0.051901 -3.553233 +v -1.353033 0.127551 -3.694765 +v -1.353033 0.229359 -3.818818 +v -1.353033 0.353413 -3.920626 +v -1.353033 0.494945 -3.996276 +v -1.353033 0.648515 -4.042861 +v -1.750241 2.023547 4.365501 +v -1.284501 1.900495 4.727822 +v -1.750241 1.928161 4.357363 +v -1.284501 1.840112 4.710514 +v 0.000000 1.840300 4.712069 +v 0.000000 1.900349 4.730097 +v -1.269853 1.906111 4.686014 +v -1.735593 2.029163 4.323693 +v -1.735593 1.933777 4.315555 +v -1.269853 1.845728 4.668705 +v 0.014648 1.905965 4.688289 +v 0.014648 1.845915 4.670260 +v -1.301011 0.808222 2.697971 +v -1.301011 0.941214 2.711070 +v -1.301011 1.069095 2.749862 +v -1.301011 1.186951 2.812857 +v -1.301011 1.290252 2.897634 +v -1.301011 1.375030 3.000936 +v -1.301011 1.438025 3.118792 +v -1.301011 1.476817 3.246672 +v -1.301011 1.489915 3.379664 +v -1.301011 1.476817 3.512656 +v -1.301011 1.438025 3.640537 +v -1.301011 1.375030 3.758393 +v -1.301011 1.290252 3.861694 +v -1.301011 1.186951 3.946471 +v -1.301011 1.069095 4.009467 +v -1.301011 0.941214 4.048259 +v -1.301011 0.808222 4.061357 +v -1.301011 0.675230 4.048259 +v -1.301011 0.547349 4.009467 +v -1.301011 0.429494 3.946471 +v -1.301011 0.326192 3.861694 +v -1.301011 0.241415 3.758393 +v -1.301011 0.178420 3.640537 +v -1.301011 0.139627 3.512655 +v -1.301011 0.126529 3.379664 +v -1.301011 0.139628 3.246672 +v -1.301011 0.178420 3.118791 +v -1.301011 0.241416 3.000935 +v -1.301011 0.326193 2.897634 +v -1.301011 0.429495 2.812857 +v -1.301011 0.547351 2.749862 +v -1.301011 0.675231 2.711069 +v -1.591977 0.808222 3.304218 +v 0.159445 0.808222 3.304218 +v 0.159445 0.808222 3.304218 +v -1.591977 0.808222 3.304218 +v 0.159445 0.793497 3.305668 +v -1.591977 0.793497 3.305668 +v 0.159445 0.779338 3.309963 +v -1.591977 0.779338 3.309963 +v 0.159445 0.766289 3.316938 +v -1.591977 0.766289 3.316938 +v 0.159445 0.754852 3.326325 +v -1.591977 0.754852 3.326325 +v 0.159445 0.745465 3.337763 +v -1.591977 0.745465 3.337763 +v 0.159445 0.738490 3.350811 +v -1.591977 0.738490 3.350811 +v 0.159445 0.734195 3.364970 +v -1.591977 0.734195 3.364970 +v 0.159445 0.732745 3.379695 +v -1.591977 0.732745 3.379695 +v 0.159445 0.734195 3.394420 +v -1.591977 0.734195 3.394420 +v 0.159445 0.738490 3.408579 +v -1.591977 0.738490 3.408579 +v 0.159445 0.745465 3.421628 +v -1.591977 0.745465 3.421628 +v 0.159445 0.754852 3.433066 +v -1.591977 0.754852 3.433066 +v 0.159445 0.766289 3.442452 +v -1.591977 0.766289 3.442452 +v 0.159445 0.779338 3.449427 +v -1.591977 0.779338 3.449427 +v 0.159445 0.793497 3.453722 +v -1.591977 0.793497 3.453722 +v 0.159445 0.808222 3.455173 +v -1.591977 0.808222 3.455173 +v 0.159445 0.822947 3.453722 +v -1.591977 0.822947 3.453722 +v 0.159445 0.837106 3.449427 +v -1.591977 0.837106 3.449427 +v 0.159445 0.850155 3.442452 +v -1.591977 0.850155 3.442452 +v 0.159445 0.861593 3.433066 +v -1.591977 0.861593 3.433066 +v 0.159445 0.870979 3.421628 +v -1.591977 0.870979 3.421628 +v 0.159445 0.877954 3.408579 +v -1.591977 0.877954 3.408579 +v 0.159445 0.882249 3.394420 +v -1.591977 0.882249 3.394420 +v 0.159445 0.883700 3.379695 +v -1.591977 0.883700 3.379695 +v 0.159445 0.882249 3.364970 +v -1.591977 0.882249 3.364970 +v 0.159445 0.877954 3.350811 +v -1.591977 0.877954 3.350811 +v 0.159445 0.870979 3.337762 +v -1.591977 0.870979 3.337762 +v 0.159445 0.861593 3.326325 +v -1.591977 0.861593 3.326325 +v 0.159445 0.850155 3.316938 +v -1.591977 0.850155 3.316938 +v 0.159445 0.837106 3.309963 +v -1.591977 0.837106 3.309963 +v 0.159445 0.822947 3.305668 +v -1.591977 0.822947 3.305668 +v 0.159445 0.793497 3.305668 +v -1.591977 0.793497 3.305668 +v 0.159445 0.779338 3.309963 +v -1.591977 0.779338 3.309963 +v 0.159445 0.766289 3.316938 +v -1.591977 0.766289 3.316938 +v 0.159445 0.754852 3.326325 +v -1.591977 0.754852 3.326325 +v 0.159445 0.745465 3.337763 +v -1.591977 0.745465 3.337763 +v 0.159445 0.738490 3.350811 +v -1.591977 0.738490 3.350811 +v 0.159445 0.734195 3.364970 +v -1.591977 0.734195 3.364970 +v 0.159445 0.732745 3.379695 +v -1.591977 0.732745 3.379695 +v 0.159445 0.734195 3.394420 +v -1.591977 0.734195 3.394420 +v 0.159445 0.738490 3.408579 +v -1.591977 0.738490 3.408579 +v 0.159445 0.745465 3.421628 +v -1.591977 0.745465 3.421628 +v 0.159445 0.754852 3.433066 +v -1.591977 0.754852 3.433066 +v 0.159445 0.766289 3.442452 +v -1.591977 0.766289 3.442452 +v 0.159445 0.779338 3.449427 +v -1.591977 0.779338 3.449427 +v 0.159445 0.793497 3.453722 +v -1.591977 0.793497 3.453722 +v 0.159445 0.808222 3.455173 +v -1.591977 0.808222 3.455173 +v 0.159445 0.822947 3.453722 +v -1.591977 0.822947 3.453722 +v 0.159445 0.837106 3.449427 +v -1.591977 0.837106 3.449427 +v 0.159445 0.850155 3.442452 +v -1.591977 0.850155 3.442452 +v 0.159445 0.861593 3.433066 +v -1.591977 0.861593 3.433066 +v 0.159445 0.870979 3.421628 +v -1.591977 0.870979 3.421628 +v 0.159445 0.877954 3.408579 +v -1.591977 0.877954 3.408579 +v 0.159445 0.882249 3.394420 +v -1.591977 0.882249 3.394420 +v 0.159445 0.883700 3.379695 +v -1.591977 0.883700 3.379695 +v 0.159445 0.882249 3.364970 +v -1.591977 0.882249 3.364970 +v 0.159445 0.877954 3.350811 +v -1.591977 0.877954 3.350811 +v 0.159445 0.870979 3.337762 +v -1.591977 0.870979 3.337762 +v 0.159445 0.861593 3.326325 +v -1.591977 0.861593 3.326325 +v 0.159445 0.850155 3.316938 +v -1.591977 0.850155 3.316938 +v 0.159445 0.837106 3.309963 +v -1.591977 0.837106 3.309963 +v 0.159445 0.822947 3.305668 +v -1.591977 0.822947 3.305668 +v -1.591977 0.808222 -3.306741 +v 0.159445 0.808222 -3.306741 +v 0.159445 0.793497 -3.305290 +v -1.591977 0.793497 -3.305290 +v 0.159445 0.779338 -3.300995 +v -1.591977 0.779338 -3.300995 +v 0.159445 0.766289 -3.294020 +v -1.591977 0.766289 -3.294020 +v 0.159445 0.754852 -3.284634 +v -1.591977 0.754852 -3.284634 +v 0.159445 0.745465 -3.273196 +v -1.591977 0.745465 -3.273196 +v 0.159445 0.738490 -3.260147 +v -1.591977 0.738490 -3.260147 +v 0.159445 0.734195 -3.245988 +v -1.591977 0.734195 -3.245988 +v 0.159445 0.732745 -3.231263 +v -1.591977 0.732745 -3.231263 +v 0.159445 0.734195 -3.216538 +v -1.591977 0.734195 -3.216538 +v 0.159445 0.738490 -3.202379 +v -1.591977 0.738490 -3.202379 +v 0.159445 0.745465 -3.189330 +v -1.591977 0.745465 -3.189330 +v 0.159445 0.754852 -3.177893 +v -1.591977 0.754852 -3.177893 +v 0.159445 0.766289 -3.168506 +v -1.591977 0.766289 -3.168506 +v 0.159445 0.779338 -3.161531 +v -1.591977 0.779338 -3.161531 +v 0.159445 0.793497 -3.157236 +v -1.591977 0.793497 -3.157236 +v 0.159445 0.808222 -3.155786 +v -1.591977 0.808222 -3.155786 +v 0.159445 0.822947 -3.157236 +v -1.591977 0.822947 -3.157236 +v 0.159445 0.837106 -3.161531 +v -1.591977 0.837106 -3.161531 +v 0.159445 0.850155 -3.168506 +v -1.591977 0.850155 -3.168506 +v 0.159445 0.861593 -3.177893 +v -1.591977 0.861593 -3.177893 +v 0.159445 0.870979 -3.189330 +v -1.591977 0.870979 -3.189330 +v 0.159445 0.877954 -3.202379 +v -1.591977 0.877954 -3.202379 +v 0.159445 0.882249 -3.216538 +v -1.591977 0.882249 -3.216538 +v 0.159445 0.883700 -3.231263 +v -1.591977 0.883700 -3.231263 +v 0.159445 0.882249 -3.245988 +v -1.591977 0.882249 -3.245988 +v 0.159445 0.877954 -3.260147 +v -1.591977 0.877954 -3.260147 +v 0.159445 0.870979 -3.273196 +v -1.591977 0.870979 -3.273196 +v 0.159445 0.861593 -3.284634 +v -1.591977 0.861593 -3.284634 +v 0.159445 0.850155 -3.294020 +v -1.591977 0.850155 -3.294020 +v 0.159445 0.837106 -3.300995 +v -1.591977 0.837106 -3.300995 +v 0.159445 0.822947 -3.305290 +v -1.591977 0.822947 -3.305290 +v -1.000000 3.301469 0.574261 +v 0.000000 3.274440 0.659141 +v -1.000000 2.051993 4.367670 +v 0.033414 2.565001 2.887454 +v -1.441406 3.301469 0.574261 +v -1.555197 2.833836 2.103204 +v -1.750241 2.051993 4.367670 +v 0.000000 3.260128 0.654576 +v 0.033336 2.550689 2.882889 +v -1.000079 3.259221 0.654277 +v -0.877596 2.549781 2.882589 +v -1.358550 3.258375 0.653997 +v -1.466463 2.816492 2.104779 +v -1.531234 2.548796 2.882264 +v -1.736886 2.482217 -5.209983 +v 0.000000 2.478743 -5.231385 +v -1.750241 2.478743 -5.231385 +v -1.750241 2.374938 -5.214535 +v 0.000000 2.374938 -5.214535 +v -1.736886 2.378413 -5.193133 +v 0.013355 2.482217 -5.209983 +v 0.013355 2.378412 -5.193133 +v -1.732752 2.482217 -5.209983 +v -1.732752 2.378413 -5.193133 +v -1.732752 2.478743 -5.231385 +v -1.732752 2.374938 -5.214535 +v -1.300982 0.808222 -3.921466 +v -1.300982 0.941178 -3.908370 +v -1.300982 1.069026 -3.869588 +v -1.300982 1.186850 -3.806610 +v -1.300982 1.290124 -3.721855 +v -1.300982 1.374879 -3.618581 +v -1.300982 1.437857 -3.500757 +v -1.300982 1.476639 -3.372910 +v -1.300982 1.489734 -3.239954 +v -1.300982 1.476639 -3.106997 +v -1.300982 1.437857 -2.979151 +v -1.300982 1.374879 -2.861326 +v -1.300982 1.290124 -2.758052 +v -1.300982 1.186850 -2.673297 +v -1.300982 1.069025 -2.610319 +v -1.300982 0.941178 -2.571537 +v -1.300982 0.808222 -2.558442 +v -1.300982 0.675266 -2.571537 +v -1.300982 0.547419 -2.610319 +v -1.300982 0.429594 -2.673297 +v -1.300982 0.326320 -2.758052 +v -1.300982 0.241566 -2.861326 +v -1.300982 0.178587 -2.979151 +v -1.300982 0.139805 -3.106998 +v -1.300982 0.126710 -3.239954 +v -1.300982 0.139806 -3.372911 +v -1.300982 0.178588 -3.500757 +v -1.300982 0.241566 -3.618582 +v -1.300982 0.326321 -3.721856 +v -1.300982 0.429595 -3.806610 +v -1.300982 0.547420 -3.869589 +v -1.300982 0.675267 -3.908370 +vt 0.625000 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.625000 +vt 0.625000 0.625000 +vt 0.625000 0.718750 +vt 0.750000 0.718750 +vt 0.750000 0.750000 +vt 0.625000 0.750000 +vt 0.634972 0.717058 +vt 0.627025 0.717322 +vt 0.627025 0.717322 +vt 0.634972 0.717058 +vt 0.625000 0.531250 +vt 0.625000 0.531250 +vt 0.625000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.531250 +vt 0.625000 0.562500 +vt 0.401187 0.631547 +vt 0.400179 0.599791 +vt 0.399847 0.589331 +vt 0.399847 0.589331 +vt 0.401187 0.631547 +vt 0.625000 0.625000 +vt 0.625000 0.687500 +vt 0.608050 0.683263 +vt 0.609106 0.677838 +vt 0.610496 0.670701 +vt 0.619267 0.625660 +vt 0.618006 0.614232 +vt 0.617393 0.608686 +vt 0.612853 0.567544 +vt 0.612431 0.563719 +vt 0.573364 0.564889 +vt 0.573160 0.570629 +vt 0.571643 0.613288 +vt 0.571361 0.621217 +vt 0.569778 0.665715 +vt 0.569575 0.671432 +vt 0.569497 0.673624 +vt 0.547725 0.668181 +vt 0.549154 0.617425 +vt 0.550700 0.562500 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.573335 0.487335 +vt 0.625000 0.875000 +vt 0.623082 0.875000 +vt 0.619949 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.562500 +vt 0.392651 0.552724 +vt 0.392651 0.552724 +vt 0.375000 0.562500 +vt 0.625000 0.718750 +vt 0.608249 0.700317 +vt 0.375000 0.687500 +vt 0.464470 0.693253 +vt 0.585945 0.708658 +vt 0.547815 0.678340 +vt 0.431207 0.638537 +vt 0.429468 0.638617 +vt 0.614785 0.717473 +vt 0.576437 0.712680 +vt 0.456448 0.697681 +vt 0.422954 0.596439 +vt 0.402059 0.631517 +vt 0.375000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.625000 +vt 0.401187 0.631547 +vt 0.414347 0.540708 +vt 0.431813 0.469918 +vt 0.292083 0.307140 +vt -0.082886 -0.098011 +vt 0.000000 0.000000 +vt 0.598153 0.500000 +vt 0.611577 0.500000 +vt 0.614933 0.500000 +vt 0.618288 0.500000 +vt 0.439201 0.526572 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.399410 0.529471 +vt 0.375000 0.531250 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt -0.060953 -0.072076 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.734375 0.500000 +vt 0.618288 0.500000 +vt 0.734375 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.718750 0.500000 +vt 0.000000 0.000000 +vt -0.082886 -0.098011 +vt 0.598153 0.500000 +vt 0.573160 0.570629 +vt 0.571643 0.613288 +vt 0.608249 0.700317 +vt 0.608050 0.683263 +vt 0.569497 0.673624 +vt 0.571361 0.621217 +vt 0.569778 0.665715 +vt 0.619267 0.625660 +vt 0.618006 0.614232 +vt 0.569575 0.671432 +vt 0.609106 0.677838 +vt 0.610496 0.670701 +vt 0.617393 0.608686 +vt 0.612853 0.567544 +vt 0.609106 0.677838 +vt 0.610496 0.670701 +vt 0.612853 0.567544 +vt 0.612431 0.563719 +vt 0.569778 0.665715 +vt 0.569575 0.671432 +vt 0.571643 0.613288 +vt 0.571361 0.621217 +vt 0.618006 0.614232 +vt 0.617393 0.608686 +vt 0.573364 0.564889 +vt 0.573160 0.570629 +vt 0.541659 0.750000 +vt 0.562500 0.875000 +vt 0.500000 0.875000 +vt 0.375000 0.875000 +vt 0.375000 0.750000 +vt 0.375000 0.750000 +vt 0.458317 0.750000 +vt 0.456448 0.697681 +vt 0.375000 0.687500 +vt 0.600988 0.750000 +vt 0.000000 0.000000 +vt 0.444928 0.511667 +vt 0.587121 0.675189 +vt 0.608270 0.875000 +vt 0.600988 0.750000 +vt 0.608270 0.875000 +vt 0.623082 0.875000 +vt 0.619949 0.750000 +vt 0.444928 0.511667 +vt 0.614785 0.717473 +vt 0.576437 0.712680 +vt 0.587121 0.675189 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.968750 0.500000 +vt 0.937500 1.000000 +vt 0.937500 0.500000 +vt 0.906250 1.000000 +vt 0.906250 0.500000 +vt 0.875000 1.000000 +vt 0.875000 0.500000 +vt 0.843750 1.000000 +vt 0.843750 0.500000 +vt 0.812500 1.000000 +vt 0.812500 0.500000 +vt 0.781250 1.000000 +vt 0.781250 0.500000 +vt 0.750000 1.000000 +vt 0.750000 0.500000 +vt 0.718750 1.000000 +vt 0.718750 0.500000 +vt 0.687500 1.000000 +vt 0.687500 0.500000 +vt 0.656250 1.000000 +vt 0.656250 0.500000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.593750 1.000000 +vt 0.593750 0.500000 +vt 0.562500 1.000000 +vt 0.562500 0.500000 +vt 0.531250 1.000000 +vt 0.531250 0.500000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.468750 1.000000 +vt 0.468750 0.500000 +vt 0.437500 1.000000 +vt 0.437500 0.500000 +vt 0.406250 1.000000 +vt 0.406250 0.500000 +vt 0.375000 1.000000 +vt 0.375000 0.500000 +vt 0.343750 1.000000 +vt 0.343750 0.500000 +vt 0.312500 1.000000 +vt 0.312500 0.500000 +vt 0.281250 1.000000 +vt 0.281250 0.500000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.218750 1.000000 +vt 0.218750 0.500000 +vt 0.187500 1.000000 +vt 0.187500 0.500000 +vt 0.156250 1.000000 +vt 0.156250 0.500000 +vt 0.125000 1.000000 +vt 0.125000 0.500000 +vt 0.093750 1.000000 +vt 0.093750 0.500000 +vt 0.062500 1.000000 +vt 0.062500 0.500000 +vt 0.296822 0.485388 +vt 0.250000 0.490000 +vt 0.203179 0.485389 +vt 0.158156 0.471731 +vt 0.116663 0.449553 +vt 0.080295 0.419706 +vt 0.050447 0.383337 +vt 0.028269 0.341844 +vt 0.014612 0.296822 +vt 0.010000 0.250000 +vt 0.014611 0.203179 +vt 0.028269 0.158156 +vt 0.050447 0.116663 +vt 0.080294 0.080294 +vt 0.116663 0.050447 +vt 0.158156 0.028269 +vt 0.203178 0.014612 +vt 0.250000 0.010000 +vt 0.296822 0.014612 +vt 0.341844 0.028269 +vt 0.383337 0.050447 +vt 0.419706 0.080294 +vt 0.449553 0.116663 +vt 0.471731 0.158156 +vt 0.485388 0.203178 +vt 0.490000 0.250000 +vt 0.485388 0.296822 +vt 0.471731 0.341844 +vt 0.449553 0.383337 +vt 0.419706 0.419706 +vt 0.383337 0.449553 +vt 0.341844 0.471731 +vt 0.031250 1.000000 +vt 0.031250 0.500000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.750000 0.490000 +vt 0.796822 0.485388 +vt 0.841844 0.471731 +vt 0.883337 0.449553 +vt 0.919706 0.419706 +vt 0.949553 0.383337 +vt 0.971731 0.341844 +vt 0.985388 0.296822 +vt 0.990000 0.250000 +vt 0.985388 0.203178 +vt 0.971731 0.158156 +vt 0.949553 0.116663 +vt 0.919706 0.080294 +vt 0.883337 0.050447 +vt 0.841844 0.028269 +vt 0.796822 0.014612 +vt 0.750000 0.010000 +vt 0.703178 0.014612 +vt 0.658156 0.028269 +vt 0.616663 0.050447 +vt 0.580294 0.080294 +vt 0.550447 0.116663 +vt 0.528269 0.158156 +vt 0.514611 0.203179 +vt 0.510000 0.250000 +vt 0.514612 0.296822 +vt 0.528269 0.341844 +vt 0.550447 0.383337 +vt 0.580295 0.419706 +vt 0.616663 0.449553 +vt 0.658156 0.471731 +vt 0.703179 0.485389 +vt 0.740064 0.627288 +vt 0.634667 0.627655 +vt 0.740255 0.716823 +vt 0.627717 0.628001 +vt 0.631519 0.684809 +vt 0.627717 0.628001 +vt 0.631519 0.684809 +vt 0.634667 0.627655 +vt 0.740255 0.716823 +vt 0.740064 0.627288 +vt 0.726562 0.500000 +vt 0.614933 0.500000 +vt 0.614933 0.500000 +vt 0.614933 0.500000 +vt 0.726562 0.500000 +vt 0.618288 0.500000 +vt 0.618288 0.500000 +vt 0.625000 0.562500 +vt 0.625000 0.625000 +vt 0.625000 0.718750 +vt 0.625000 0.750000 +vt 0.634972 0.717058 +vt 0.634972 0.717058 +vt 0.627025 0.717322 +vt 0.627025 0.717322 +vt 0.625000 0.531250 +vt 0.625000 0.500000 +vt 0.625000 0.531250 +vt 0.625000 0.562500 +vt 0.401187 0.631547 +vt 0.401187 0.631547 +vt 0.399847 0.589331 +vt 0.399847 0.589331 +vt 0.400179 0.599791 +vt 0.550700 0.562500 +vt 0.549154 0.617425 +vt 0.547725 0.668181 +vt 0.569497 0.673624 +vt 0.569575 0.671432 +vt 0.569778 0.665715 +vt 0.571361 0.621217 +vt 0.571643 0.613288 +vt 0.573160 0.570629 +vt 0.573364 0.564889 +vt 0.612431 0.563719 +vt 0.612853 0.567544 +vt 0.617393 0.608686 +vt 0.618006 0.614232 +vt 0.619267 0.625660 +vt 0.610496 0.670701 +vt 0.609106 0.677838 +vt 0.608050 0.683263 +vt 0.625000 0.687500 +vt 0.625000 0.625000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.573335 0.487335 +vt 0.625000 0.750000 +vt 0.619949 0.750000 +vt 0.375000 0.562500 +vt 0.375000 0.562500 +vt 0.392651 0.552724 +vt 0.392651 0.552724 +vt 0.625000 0.718750 +vt 0.608249 0.700317 +vt 0.375000 0.687500 +vt 0.456448 0.697681 +vt 0.576437 0.712680 +vt 0.614785 0.717473 +vt 0.429468 0.638617 +vt 0.431207 0.638537 +vt 0.547815 0.678340 +vt 0.585945 0.708658 +vt 0.464470 0.693253 +vt 0.422954 0.596439 +vt 0.375000 0.625000 +vt 0.402059 0.631517 +vt 0.375000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.625000 +vt 0.401187 0.631547 +vt 0.000000 0.000000 +vt -0.082886 -0.098011 +vt 0.292083 0.307140 +vt 0.431813 0.469918 +vt 0.414347 0.540708 +vt 0.618288 0.500000 +vt 0.614933 0.500000 +vt 0.611577 0.500000 +vt 0.598153 0.500000 +vt 0.000000 0.000000 +vt 0.439201 0.526572 +vt -0.060953 -0.072076 +vt -0.060953 -0.072076 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.399410 0.529471 +vt 0.375000 0.531250 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt -0.060953 -0.072076 +vt -0.060953 -0.072076 +vt 0.000000 0.000000 +vt 0.734375 0.500000 +vt 0.618288 0.500000 +vt 0.000000 0.000000 +vt -0.082886 -0.098011 +vt 0.000000 0.000000 +vt 0.598153 0.500000 +vt 0.571643 0.613288 +vt 0.573160 0.570629 +vt 0.608050 0.683263 +vt 0.608249 0.700317 +vt 0.569497 0.673624 +vt 0.569778 0.665715 +vt 0.571361 0.621217 +vt 0.618006 0.614232 +vt 0.619267 0.625660 +vt 0.569575 0.671432 +vt 0.609106 0.677838 +vt 0.610496 0.670701 +vt 0.612853 0.567544 +vt 0.617393 0.608686 +vt 0.610496 0.670701 +vt 0.609106 0.677838 +vt 0.612431 0.563719 +vt 0.612853 0.567544 +vt 0.569575 0.671432 +vt 0.569778 0.665715 +vt 0.571361 0.621217 +vt 0.571643 0.613288 +vt 0.617393 0.608686 +vt 0.618006 0.614232 +vt 0.573160 0.570629 +vt 0.573364 0.564889 +vt 0.541659 0.750000 +vt 0.458317 0.750000 +vt 0.375000 0.750000 +vt 0.375000 0.750000 +vt 0.375000 0.687500 +vt 0.456448 0.697681 +vt 0.600988 0.750000 +vt 0.444928 0.511667 +vt 0.000000 0.000000 +vt 0.587121 0.675189 +vt 0.608270 0.875000 +vt 0.600988 0.750000 +vt 0.619949 0.750000 +vt 0.623082 0.875000 +vt 0.444928 0.511667 +vt 0.576437 0.712680 +vt 0.614785 0.717473 +vt 0.587121 0.675189 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.906250 0.500000 +vt 0.906250 1.000000 +vt 0.875000 0.500000 +vt 0.875000 1.000000 +vt 0.843750 0.500000 +vt 0.843750 1.000000 +vt 0.812500 0.500000 +vt 0.812500 1.000000 +vt 0.781250 0.500000 +vt 0.781250 1.000000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.718750 0.500000 +vt 0.718750 1.000000 +vt 0.687500 0.500000 +vt 0.687500 1.000000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.593750 0.500000 +vt 0.593750 1.000000 +vt 0.562500 0.500000 +vt 0.562500 1.000000 +vt 0.531250 0.500000 +vt 0.531250 1.000000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.468750 0.500000 +vt 0.468750 1.000000 +vt 0.437500 0.500000 +vt 0.437500 1.000000 +vt 0.406250 0.500000 +vt 0.406250 1.000000 +vt 0.375000 0.500000 +vt 0.375000 1.000000 +vt 0.343750 0.500000 +vt 0.343750 1.000000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.281250 0.500000 +vt 0.281250 1.000000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.218750 0.500000 +vt 0.218750 1.000000 +vt 0.187500 0.500000 +vt 0.187500 1.000000 +vt 0.156250 0.500000 +vt 0.156250 1.000000 +vt 0.125000 0.500000 +vt 0.125000 1.000000 +vt 0.093750 0.500000 +vt 0.093750 1.000000 +vt 0.062500 0.500000 +vt 0.062500 1.000000 +vt 0.296822 0.485388 +vt 0.341844 0.471731 +vt 0.383337 0.449553 +vt 0.419706 0.419706 +vt 0.449553 0.383337 +vt 0.471731 0.341844 +vt 0.485388 0.296822 +vt 0.490000 0.250000 +vt 0.485388 0.203178 +vt 0.471731 0.158156 +vt 0.449553 0.116663 +vt 0.419706 0.080294 +vt 0.383337 0.050447 +vt 0.341844 0.028269 +vt 0.296822 0.014612 +vt 0.250000 0.010000 +vt 0.203178 0.014612 +vt 0.158156 0.028269 +vt 0.116663 0.050447 +vt 0.080294 0.080294 +vt 0.050447 0.116663 +vt 0.028269 0.158156 +vt 0.014611 0.203179 +vt 0.010000 0.250000 +vt 0.014612 0.296822 +vt 0.028269 0.341844 +vt 0.050447 0.383337 +vt 0.080295 0.419706 +vt 0.116663 0.449553 +vt 0.158156 0.471731 +vt 0.203179 0.485389 +vt 0.250000 0.490000 +vt 0.031250 0.500000 +vt 0.031250 1.000000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.750000 0.490000 +vt 0.703179 0.485389 +vt 0.658156 0.471731 +vt 0.616663 0.449553 +vt 0.580295 0.419706 +vt 0.550447 0.383337 +vt 0.528269 0.341844 +vt 0.514612 0.296822 +vt 0.510000 0.250000 +vt 0.514611 0.203179 +vt 0.528269 0.158156 +vt 0.550447 0.116663 +vt 0.580294 0.080294 +vt 0.616663 0.050447 +vt 0.658156 0.028269 +vt 0.703178 0.014612 +vt 0.750000 0.010000 +vt 0.796822 0.014612 +vt 0.841844 0.028269 +vt 0.883337 0.050447 +vt 0.919706 0.080294 +vt 0.949553 0.116663 +vt 0.971731 0.158156 +vt 0.985388 0.203178 +vt 0.990000 0.250000 +vt 0.985388 0.296822 +vt 0.971731 0.341844 +vt 0.949553 0.383337 +vt 0.919706 0.419706 +vt 0.883337 0.449553 +vt 0.841844 0.471731 +vt 0.796822 0.485388 +vt 0.634667 0.627655 +vt 0.740255 0.716823 +vt 0.627717 0.628001 +vt 0.631519 0.684809 +vt 0.631519 0.684809 +vt 0.627717 0.628001 +vt 0.634667 0.627655 +vt 0.740255 0.716823 +vt 0.614933 0.500000 +vt 0.614933 0.500000 +vt 0.614933 0.500000 +vt 0.726562 0.500000 +vt 0.618288 0.500000 +vt 0.618288 0.500000 +vt 0.250000 0.687500 +vt 0.375000 0.687500 +vt 0.250000 0.750000 +vt 0.375000 0.625084 +vt 0.428363 0.640586 +vt 0.528979 0.677861 +vt 0.559197 0.708128 +vt 0.450382 0.715365 +vt 0.375000 0.685311 +vt 0.375000 0.531250 +vt 0.439201 0.526572 +vt 0.513412 0.534872 +vt 0.506006 0.552334 +vt 0.431812 0.561420 +vt 0.375000 0.562425 +vt 0.428363 0.640586 +vt 0.528979 0.677861 +vt 0.375000 0.625084 +vt 0.456448 0.697681 +vt 0.456448 0.697681 +vt 0.431812 0.561420 +vt 0.375000 0.562425 +vt 0.450382 0.715365 +vt 0.375000 0.685311 +vt 0.506006 0.552334 +vt 0.513412 0.534872 +vt 0.375000 0.687500 +vt 0.559197 0.708128 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.375000 0.562500 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.399847 0.589331 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.410228 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.410228 0.500000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.250000 0.500000 +vt 0.375000 0.531250 +vt 0.250000 0.531250 +vt 0.500000 0.500000 +vt 0.517614 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.571307 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.399410 0.529471 +vt 0.410228 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.375000 0.750000 +vt 0.375000 0.687500 +vt 0.458317 0.750000 +vt 0.375000 0.687500 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.375000 0.687500 +vt 0.375000 0.625084 +vt 0.375000 0.685311 +vt 0.450382 0.715365 +vt 0.559197 0.708128 +vt 0.528979 0.677861 +vt 0.428363 0.640586 +vt 0.375000 0.531250 +vt 0.375000 0.562425 +vt 0.431812 0.561420 +vt 0.506006 0.552334 +vt 0.513412 0.534872 +vt 0.439201 0.526572 +vt 0.528979 0.677861 +vt 0.428363 0.640586 +vt 0.375000 0.625084 +vt 0.456448 0.697681 +vt 0.456448 0.697681 +vt 0.375000 0.562425 +vt 0.431812 0.561420 +vt 0.375000 0.685311 +vt 0.450382 0.715365 +vt 0.506006 0.552334 +vt 0.513412 0.534872 +vt 0.375000 0.687500 +vt 0.559197 0.708128 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.375000 0.562500 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.399847 0.589331 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.410228 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.410228 0.500000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.375000 0.531250 +vt 0.517614 0.500000 +vt 0.000000 0.000000 +vt 0.571307 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.399410 0.529471 +vt 0.410228 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.375000 0.750000 +vt 0.458317 0.750000 +vt 0.375000 0.687500 +vt 0.375000 0.687500 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.250000 0.562500 +vt 0.250000 0.625000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.906250 0.500000 +vt 0.906250 1.000000 +vt 0.875000 1.000000 +vt 0.875000 0.500000 +vt 0.296822 0.485388 +vt 0.250000 0.490000 +vt 0.203179 0.485389 +vt 0.158156 0.471731 +vt 0.116663 0.449553 +vt 0.080295 0.419706 +vt 0.050447 0.383337 +vt 0.028269 0.341844 +vt 0.014612 0.296822 +vt 0.010000 0.250000 +vt 0.014611 0.203179 +vt 0.028269 0.158156 +vt 0.050447 0.116663 +vt 0.080294 0.080294 +vt 0.116663 0.050447 +vt 0.158156 0.028269 +vt 0.203178 0.014612 +vt 0.250000 0.010000 +vt 0.296822 0.014612 +vt 0.341844 0.028269 +vt 0.383337 0.050447 +vt 0.419706 0.080294 +vt 0.449553 0.116663 +vt 0.471731 0.158156 +vt 0.485388 0.203178 +vt 0.490000 0.250000 +vt 0.485388 0.296822 +vt 0.471731 0.341844 +vt 0.449553 0.383337 +vt 0.419706 0.419706 +vt 0.383337 0.449553 +vt 0.341844 0.471731 +vt 0.750000 0.490000 +vt 0.796822 0.485388 +vt 0.841844 0.471731 +vt 0.883337 0.449553 +vt 0.919706 0.419706 +vt 0.949553 0.383337 +vt 0.971731 0.341844 +vt 0.985388 0.296822 +vt 0.990000 0.250000 +vt 0.985388 0.203178 +vt 0.971731 0.158156 +vt 0.949553 0.116663 +vt 0.919706 0.080294 +vt 0.883337 0.050447 +vt 0.841844 0.028269 +vt 0.796822 0.014612 +vt 0.750000 0.010000 +vt 0.703178 0.014612 +vt 0.658156 0.028269 +vt 0.616663 0.050447 +vt 0.580294 0.080294 +vt 0.550447 0.116663 +vt 0.528269 0.158156 +vt 0.514611 0.203179 +vt 0.510000 0.250000 +vt 0.514612 0.296822 +vt 0.528269 0.341844 +vt 0.550447 0.383337 +vt 0.580295 0.419706 +vt 0.616663 0.449553 +vt 0.658156 0.471731 +vt 0.703179 0.485389 +vt 0.093750 0.500000 +vt 0.093750 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.500000 +vt 0.843750 0.500000 +vt 0.843750 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.500000 +vt 0.125000 0.500000 +vt 0.125000 1.000000 +vt 0.781250 1.000000 +vt 0.781250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 1.000000 +vt 0.718750 1.000000 +vt 0.718750 0.500000 +vt 0.218750 0.500000 +vt 0.218750 1.000000 +vt 0.687500 1.000000 +vt 0.687500 0.500000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.656250 1.000000 +vt 0.656250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.593750 1.000000 +vt 0.593750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 1.000000 +vt 0.562500 1.000000 +vt 0.562500 0.500000 +vt 0.375000 0.500000 +vt 0.375000 1.000000 +vt 0.531250 1.000000 +vt 0.531250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.437500 0.500000 +vt 0.437500 1.000000 +vt 0.468750 1.000000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.406250 1.000000 +vt 0.406250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.500000 +vt 0.562500 0.500000 +vt 0.562500 1.000000 +vt 0.343750 1.000000 +vt 0.343750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.500000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.281250 1.000000 +vt 0.281250 0.500000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.687500 0.500000 +vt 0.687500 1.000000 +vt 0.218750 1.000000 +vt 0.218750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 1.000000 +vt 0.187500 1.000000 +vt 0.187500 0.500000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.156250 1.000000 +vt 0.156250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.500000 +vt 0.812500 0.500000 +vt 0.812500 1.000000 +vt 0.093750 1.000000 +vt 0.093750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.500000 +vt 0.875000 0.500000 +vt 0.875000 1.000000 +vt 0.296822 0.485388 +vt 0.250000 0.490000 +vt 0.203179 0.485389 +vt 0.158156 0.471731 +vt 0.116663 0.449553 +vt 0.080295 0.419706 +vt 0.050447 0.383337 +vt 0.028269 0.341844 +vt 0.014612 0.296822 +vt 0.010000 0.250000 +vt 0.014611 0.203179 +vt 0.028269 0.158156 +vt 0.050447 0.116663 +vt 0.080294 0.080294 +vt 0.116663 0.050447 +vt 0.158156 0.028269 +vt 0.203178 0.014612 +vt 0.250000 0.010000 +vt 0.296822 0.014612 +vt 0.341844 0.028269 +vt 0.383337 0.050447 +vt 0.419706 0.080294 +vt 0.449553 0.116663 +vt 0.471731 0.158156 +vt 0.485388 0.203178 +vt 0.490000 0.250000 +vt 0.485388 0.296822 +vt 0.471731 0.341844 +vt 0.449553 0.383337 +vt 0.419706 0.419706 +vt 0.383337 0.449553 +vt 0.341844 0.471731 +vt 0.906250 0.500000 +vt 0.906250 1.000000 +vt 0.750000 0.490000 +vt 0.796822 0.485388 +vt 0.841844 0.471731 +vt 0.883337 0.449553 +vt 0.919706 0.419706 +vt 0.949553 0.383337 +vt 0.971731 0.341844 +vt 0.985388 0.296822 +vt 0.990000 0.250000 +vt 0.985388 0.203178 +vt 0.971731 0.158156 +vt 0.949553 0.116663 +vt 0.919706 0.080294 +vt 0.883337 0.050447 +vt 0.841844 0.028269 +vt 0.796822 0.014612 +vt 0.750000 0.010000 +vt 0.703178 0.014612 +vt 0.658156 0.028269 +vt 0.616663 0.050447 +vt 0.580294 0.080294 +vt 0.550447 0.116663 +vt 0.528269 0.158156 +vt 0.514611 0.203179 +vt 0.510000 0.250000 +vt 0.514612 0.296822 +vt 0.528269 0.341844 +vt 0.550447 0.383337 +vt 0.580295 0.419706 +vt 0.616663 0.449553 +vt 0.658156 0.471731 +vt 0.703179 0.485389 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.031250 0.500000 +vt 0.031250 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.031250 0.500000 +vt 0.031250 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.906250 0.500000 +vt 0.875000 0.500000 +vt 0.875000 1.000000 +vt 0.906250 1.000000 +vt 0.296822 0.485388 +vt 0.341844 0.471731 +vt 0.383337 0.449553 +vt 0.419706 0.419706 +vt 0.449553 0.383337 +vt 0.471731 0.341844 +vt 0.485388 0.296822 +vt 0.490000 0.250000 +vt 0.485388 0.203178 +vt 0.471731 0.158156 +vt 0.449553 0.116663 +vt 0.419706 0.080294 +vt 0.383337 0.050447 +vt 0.341844 0.028269 +vt 0.296822 0.014612 +vt 0.250000 0.010000 +vt 0.203178 0.014612 +vt 0.158156 0.028269 +vt 0.116663 0.050447 +vt 0.080294 0.080294 +vt 0.050447 0.116663 +vt 0.028269 0.158156 +vt 0.014611 0.203179 +vt 0.010000 0.250000 +vt 0.014612 0.296822 +vt 0.028269 0.341844 +vt 0.050447 0.383337 +vt 0.080295 0.419706 +vt 0.116663 0.449553 +vt 0.158156 0.471731 +vt 0.203179 0.485389 +vt 0.250000 0.490000 +vt 0.750000 0.490000 +vt 0.703179 0.485389 +vt 0.658156 0.471731 +vt 0.616663 0.449553 +vt 0.580295 0.419706 +vt 0.550447 0.383337 +vt 0.528269 0.341844 +vt 0.514612 0.296822 +vt 0.510000 0.250000 +vt 0.514611 0.203179 +vt 0.528269 0.158156 +vt 0.550447 0.116663 +vt 0.580294 0.080294 +vt 0.616663 0.050447 +vt 0.658156 0.028269 +vt 0.703178 0.014612 +vt 0.750000 0.010000 +vt 0.796822 0.014612 +vt 0.841844 0.028269 +vt 0.883337 0.050447 +vt 0.919706 0.080294 +vt 0.949553 0.116663 +vt 0.971731 0.158156 +vt 0.985388 0.203178 +vt 0.990000 0.250000 +vt 0.985388 0.296822 +vt 0.971731 0.341844 +vt 0.949553 0.383337 +vt 0.919706 0.419706 +vt 0.883337 0.449553 +vt 0.841844 0.471731 +vt 0.796822 0.485388 +vt 0.093750 0.500000 +vt 0.062500 0.500000 +vt 0.062500 1.000000 +vt 0.093750 1.000000 +vt 0.843750 0.500000 +vt 0.812500 0.500000 +vt 0.812500 1.000000 +vt 0.843750 1.000000 +vt 0.125000 0.500000 +vt 0.125000 1.000000 +vt 0.781250 0.500000 +vt 0.781250 1.000000 +vt 0.156250 0.500000 +vt 0.156250 1.000000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.187500 0.500000 +vt 0.187500 1.000000 +vt 0.718750 0.500000 +vt 0.718750 1.000000 +vt 0.218750 0.500000 +vt 0.218750 1.000000 +vt 0.687500 0.500000 +vt 0.687500 1.000000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.281250 0.500000 +vt 0.281250 1.000000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.593750 0.500000 +vt 0.593750 1.000000 +vt 0.343750 0.500000 +vt 0.343750 1.000000 +vt 0.562500 0.500000 +vt 0.562500 1.000000 +vt 0.375000 0.500000 +vt 0.375000 1.000000 +vt 0.531250 0.500000 +vt 0.531250 1.000000 +vt 0.406250 0.500000 +vt 0.406250 1.000000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.437500 0.500000 +vt 0.437500 1.000000 +vt 0.468750 0.500000 +vt 0.468750 1.000000 +vt 0.468750 0.500000 +vt 0.468750 1.000000 +vt 0.437500 0.500000 +vt 0.437500 1.000000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.406250 0.500000 +vt 0.406250 1.000000 +vt 0.531250 0.500000 +vt 0.531250 1.000000 +vt 0.375000 0.500000 +vt 0.375000 1.000000 +vt 0.562500 0.500000 +vt 0.562500 1.000000 +vt 0.343750 0.500000 +vt 0.343750 1.000000 +vt 0.593750 0.500000 +vt 0.593750 1.000000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.281250 0.500000 +vt 0.281250 1.000000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.687500 0.500000 +vt 0.687500 1.000000 +vt 0.218750 0.500000 +vt 0.218750 1.000000 +vt 0.718750 0.500000 +vt 0.718750 1.000000 +vt 0.187500 0.500000 +vt 0.187500 1.000000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.156250 0.500000 +vt 0.156250 1.000000 +vt 0.781250 0.500000 +vt 0.781250 1.000000 +vt 0.125000 0.500000 +vt 0.125000 1.000000 +vt 0.812500 0.500000 +vt 0.812500 1.000000 +vt 0.093750 0.500000 +vt 0.093750 1.000000 +vt 0.843750 0.500000 +vt 0.843750 1.000000 +vt 0.062500 0.500000 +vt 0.062500 1.000000 +vt 0.875000 0.500000 +vt 0.875000 1.000000 +vt 0.296822 0.485388 +vt 0.341844 0.471731 +vt 0.383337 0.449553 +vt 0.419706 0.419706 +vt 0.449553 0.383337 +vt 0.471731 0.341844 +vt 0.485388 0.296822 +vt 0.490000 0.250000 +vt 0.485388 0.203178 +vt 0.471731 0.158156 +vt 0.449553 0.116663 +vt 0.419706 0.080294 +vt 0.383337 0.050447 +vt 0.341844 0.028269 +vt 0.296822 0.014612 +vt 0.250000 0.010000 +vt 0.203178 0.014612 +vt 0.158156 0.028269 +vt 0.116663 0.050447 +vt 0.080294 0.080294 +vt 0.050447 0.116663 +vt 0.028269 0.158156 +vt 0.014611 0.203179 +vt 0.010000 0.250000 +vt 0.014612 0.296822 +vt 0.028269 0.341844 +vt 0.050447 0.383337 +vt 0.080295 0.419706 +vt 0.116663 0.449553 +vt 0.158156 0.471731 +vt 0.203179 0.485389 +vt 0.250000 0.490000 +vt 0.906250 0.500000 +vt 0.906250 1.000000 +vt 0.750000 0.490000 +vt 0.703179 0.485389 +vt 0.658156 0.471731 +vt 0.616663 0.449553 +vt 0.580295 0.419706 +vt 0.550447 0.383337 +vt 0.528269 0.341844 +vt 0.514612 0.296822 +vt 0.510000 0.250000 +vt 0.514611 0.203179 +vt 0.528269 0.158156 +vt 0.550447 0.116663 +vt 0.580294 0.080294 +vt 0.616663 0.050447 +vt 0.658156 0.028269 +vt 0.703178 0.014612 +vt 0.750000 0.010000 +vt 0.796822 0.014612 +vt 0.841844 0.028269 +vt 0.883337 0.050447 +vt 0.919706 0.080294 +vt 0.949553 0.116663 +vt 0.971731 0.158156 +vt 0.985388 0.203178 +vt 0.990000 0.250000 +vt 0.985388 0.296822 +vt 0.971731 0.341844 +vt 0.949553 0.383337 +vt 0.919706 0.419706 +vt 0.883337 0.449553 +vt 0.841844 0.471731 +vt 0.796822 0.485388 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.031250 1.000000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.031250 1.000000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vn 0.0000 0.9942 -0.1078 +vn 0.0000 0.9400 0.3411 +vn -0.0000 0.3039 -0.9527 +vn 0.0000 0.9897 -0.1431 +vn 0.0000 0.9890 -0.1476 +vn -0.1218 -0.9925 -0.0071 +vn 0.9589 0.2836 0.0128 +vn 0.9551 0.2959 0.0128 +vn 0.9456 0.3249 0.0160 +vn 0.0009 -0.1780 0.9840 +vn -0.0021 -0.0952 -0.9955 +vn 0.9601 0.2794 0.0138 +vn 0.9999 0.0009 0.0161 +vn 0.9997 0.0252 0.0033 +vn 0.0032 -0.0086 -1.0000 +vn 0.9703 -0.2418 -0.0000 +vn 0.0000 -1.0000 0.0004 +vn 0.0004 0.0103 0.9999 +vn 0.4967 0.0849 -0.8638 +vn 0.9997 0.0248 0.0004 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.9875 -0.1575 +vn 0.0000 0.0000 1.0000 +vn 1.0000 -0.0000 0.0002 +vn -1.0000 -0.0000 0.0000 +vn 0.0000 -0.9871 0.1602 +vn -0.0000 -0.9964 -0.0850 +vn 0.0001 -0.9875 -0.1575 +vn 0.0000 -0.9993 -0.0386 +vn -0.2806 0.9581 0.0572 +vn 0.2683 -0.9037 -0.3338 +vn -0.2805 0.9572 0.0719 +vn 0.2766 -0.9529 0.1246 +vn 0.2692 -0.9070 -0.3238 +vn 0.2713 -0.9064 -0.3238 +vn 0.2789 -0.9522 0.1246 +vn -0.2828 0.9575 0.0571 +vn 0.0081 -0.0286 0.9996 +vn -0.9985 0.0027 -0.0554 +vn 0.5899 -0.0526 0.8058 +vn 0.6301 -0.1095 0.7687 +vn 0.0003 0.9911 0.1330 +vn 0.0003 -0.0991 0.9951 +vn -0.0001 -0.9911 -0.1331 +vn -0.0679 0.9854 0.1561 +vn -0.9446 -0.0279 0.3272 +vn 0.1226 -0.9770 -0.1742 +vn 0.0000 -0.0980 -0.9952 +vn 0.0000 -0.2903 -0.9569 +vn 0.0000 -0.4714 -0.8819 +vn 0.0000 -0.6344 -0.7730 +vn 0.0000 -0.7730 -0.6344 +vn 0.0000 -0.8819 -0.4714 +vn 0.0000 -0.9569 -0.2903 +vn 0.0000 -0.9952 -0.0980 +vn 0.0000 -0.9952 0.0980 +vn 0.0000 -0.9569 0.2903 +vn 0.0000 -0.8819 0.4714 +vn 0.0000 -0.7730 0.6344 +vn 0.0000 -0.6344 0.7730 +vn 0.0000 -0.4714 0.8819 +vn 0.0000 -0.2903 0.9569 +vn 0.0000 -0.0980 0.9952 +vn -0.0000 0.0980 0.9952 +vn 0.0000 0.2903 0.9569 +vn 0.0000 0.4714 0.8819 +vn 0.0000 0.6344 0.7730 +vn 0.0000 0.7730 0.6344 +vn 0.0000 0.8819 0.4714 +vn 0.0000 0.9569 0.2903 +vn 0.0000 0.9952 0.0980 +vn 0.0000 0.9952 -0.0980 +vn 0.0000 0.9569 -0.2903 +vn 0.0000 0.8819 -0.4714 +vn -0.0000 0.7730 -0.6344 +vn -0.0000 0.6344 -0.7730 +vn 0.0000 0.4714 -0.8819 +vn 0.0000 0.2903 -0.9569 +vn 0.0000 0.0980 -0.9952 +vn 0.0005 0.9512 0.3085 +vn 0.0005 0.9450 0.3272 +vn -0.0225 0.9557 0.2934 +vn -0.0037 0.9452 0.3264 +vn 0.0007 0.9452 0.3265 +vn 0.0011 0.9478 0.3189 +vn -0.9975 -0.0266 0.0661 +vn 0.0000 -0.3039 0.9527 +vn -0.9969 -0.0288 0.0731 +vn 0.0000 -0.1554 -0.9879 +vn -0.0000 -0.1595 -0.9872 +vn -0.0000 0.9871 -0.1602 +vn 0.0000 -0.1602 -0.9871 +vn 0.0000 0.1602 0.9871 +vn 0.1218 -0.9925 -0.0071 +vn -0.9589 0.2836 0.0128 +vn -0.9551 0.2959 0.0128 +vn -0.9456 0.3249 0.0160 +vn -0.0009 -0.1780 0.9840 +vn 0.0021 -0.0952 -0.9955 +vn -0.9601 0.2794 0.0138 +vn -0.9999 0.0009 0.0161 +vn -0.9997 0.0252 0.0033 +vn -0.0032 -0.0086 -1.0000 +vn -0.9703 -0.2418 -0.0000 +vn -0.0004 0.0103 0.9999 +vn -0.4967 0.0849 -0.8638 +vn -0.9997 0.0248 0.0004 +vn -1.0000 -0.0000 0.0002 +vn -0.0001 -0.9875 -0.1575 +vn 0.2806 0.9581 0.0572 +vn -0.2683 -0.9037 -0.3338 +vn 0.2805 0.9572 0.0719 +vn -0.2766 -0.9529 0.1246 +vn -0.2692 -0.9070 -0.3238 +vn -0.2713 -0.9064 -0.3238 +vn -0.2789 -0.9522 0.1246 +vn 0.2829 0.9575 0.0571 +vn 0.2828 0.9575 0.0571 +vn -0.0081 -0.0286 0.9996 +vn 0.9985 0.0027 -0.0554 +vn -0.5899 -0.0526 0.8058 +vn -0.6301 -0.1096 0.7687 +vn -0.0003 0.9911 0.1330 +vn -0.0003 -0.0991 0.9951 +vn 0.0001 -0.9911 -0.1331 +vn 0.0679 0.9854 0.1561 +vn 0.9446 -0.0279 0.3272 +vn -0.1226 -0.9770 -0.1742 +vn -0.0005 0.9512 0.3085 +vn -0.0005 0.9450 0.3272 +vn 0.0225 0.9557 0.2934 +vn 0.0037 0.9452 0.3264 +vn -0.0007 0.9452 0.3265 +vn -0.0011 0.9478 0.3189 +vn 0.9975 -0.0266 0.0661 +vn 0.9969 -0.0288 0.0731 +vn 0.6221 -0.1262 0.7727 +vn 0.0014 -0.2815 0.9595 +vn -0.6221 -0.1262 0.7727 +vn -0.0014 -0.2815 0.9595 +vn 0.0049 -0.9652 0.2613 +vn 0.0000 -0.5403 0.8415 +vn 0.0000 -0.0826 0.9966 +vn 0.0000 0.9975 -0.0701 +vn 0.0000 -0.0543 -0.9985 +vn 0.0000 0.0429 -0.9991 +vn 0.0000 -0.5892 -0.8080 +vn 0.0000 -0.9997 -0.0244 +vn 0.0000 -0.9936 0.1127 +vn 0.0000 -0.9995 -0.0306 +vn -0.0067 -0.9653 0.2610 +vn 0.0000 -0.5233 -0.8522 +vn 0.9881 0.0890 -0.1256 +vn 0.8631 0.2709 -0.4262 +vn 0.8464 0.5322 0.0192 +vn 0.8198 0.3038 0.4853 +vn 0.7057 -0.0297 0.7079 +vn 0.0003 -1.0000 0.0042 +vn 0.0025 -0.9998 -0.0221 +vn 0.7855 0.1270 0.6057 +vn 0.9488 0.2015 0.2431 +vn 0.8858 0.4639 0.0108 +vn 0.8470 0.3011 -0.4380 +vn 0.0387 0.9992 0.0071 +vn 0.0417 0.9991 0.0071 +vn 0.0000 -1.0000 -0.0030 +vn 1.0000 0.0006 0.0084 +vn 0.0000 -1.0000 -0.0015 +vn 0.0000 -0.1123 -0.9937 +vn 0.0000 -0.9442 -0.3293 +vn 0.0000 0.9956 0.0941 +vn 0.0000 -0.9435 -0.3313 +vn 0.0000 -0.0233 0.9997 +vn 0.0000 0.9954 0.0958 +vn -0.0000 -0.1121 -0.9937 +vn -0.0000 0.9956 0.0940 +vn -0.0000 -0.0313 -0.9995 +vn 0.0001 -0.9956 -0.0940 +vn 1.0000 0.0001 0.0004 +vn -0.0001 0.9956 0.0941 +vn -0.0001 0.9953 0.0968 +vn -0.0020 -0.0231 0.9997 +vn 0.0000 -0.5948 0.8038 +vn 0.0000 -0.1315 0.9913 +vn 0.0084 -0.0395 0.9992 +vn 0.0693 -0.1932 -0.9787 +vn -0.0181 0.0150 0.9997 +vn -0.0812 0.2349 0.9686 +vn -0.0690 0.1924 0.9789 +vn 0.9601 0.2794 0.0122 +vn 0.9572 0.2893 0.0121 +vn 0.9602 0.2790 0.0135 +vn 0.0398 -0.0904 -0.9951 +vn 0.0299 -0.1456 0.9889 +vn 0.0101 0.9986 -0.0516 +vn 0.5988 -0.0920 0.7956 +vn 0.4826 -0.1722 0.8588 +vn 0.1131 -0.9083 0.4027 +vn -0.0273 0.9949 -0.0971 +vn 0.0000 0.0426 -0.9991 +vn 0.9985 -0.0027 0.0554 +vn -0.0027 -0.9999 -0.0117 +vn -0.0073 0.2267 -0.9739 +vn 0.5826 -0.2972 -0.7565 +vn 0.5826 -0.6714 0.4581 +vn 0.5826 0.5960 0.5526 +vn 0.5826 0.4062 -0.7040 +vn 0.5826 -0.7767 -0.2393 +vn 0.5826 -0.0605 0.8105 +vn 0.5826 0.8037 -0.1214 +vn 0.9031 0.0320 -0.4283 +vn 0.9031 -0.4247 0.0642 +vn 0.9031 0.1571 0.3998 +vn 0.9031 0.3548 -0.2421 +vn 0.9031 -0.3150 -0.2921 +vn 0.9031 -0.2146 0.3721 +vn 0.9031 0.4105 0.1265 +vn -0.3821 0.1311 0.9148 +vn 0.6979 -0.3531 0.6231 +vn -0.3821 -0.1591 -0.9103 +vn -0.3821 0.5383 0.7511 +vn 0.6979 0.6861 0.2056 +vn -0.9751 -0.1823 0.1265 +vn -0.3821 -0.2516 0.8892 +vn -0.9751 0.1094 -0.1931 +vn -0.3821 0.7969 0.4678 +vn -0.9751 0.2192 -0.0349 +vn -0.3821 -0.8109 -0.4432 +vn 0.6979 -0.7073 0.1125 +vn -0.3821 0.2788 -0.8811 +vn -0.9751 -0.2126 -0.0637 +vn -0.9751 -0.0148 0.2214 +vn 0.6979 0.0477 -0.7146 +vn -0.3821 -0.6334 0.6729 +vn -0.3821 0.8626 -0.3314 +vn 0.6979 -0.5290 -0.4829 +vn -0.9751 -0.0827 -0.2059 +vn -0.3821 0.6125 -0.6920 +vn -0.3821 -0.8521 0.3577 +vn -0.9751 0.1639 0.1496 +vn 0.6979 0.5885 -0.4082 +vn -0.3821 -0.9210 -0.0757 +vn -0.3821 -0.5150 -0.7673 +vn 0.6979 0.2671 0.6646 +vn -0.3821 0.9229 0.0474 +vn 0.9031 -0.2146 0.3720 +vn -0.0049 -0.9652 0.2613 +vn 0.0067 -0.9653 0.2610 +vn -0.9881 0.0890 -0.1256 +vn -0.8631 0.2709 -0.4262 +vn -0.8464 0.5322 0.0192 +vn -0.8198 0.3038 0.4853 +vn -0.7057 -0.0297 0.7079 +vn -0.0003 -1.0000 0.0042 +vn -0.0025 -0.9998 -0.0221 +vn -0.7855 0.1270 0.6057 +vn -0.9488 0.2015 0.2431 +vn -0.8858 0.4639 0.0108 +vn -0.8471 0.3011 -0.4380 +vn -0.0387 0.9992 0.0071 +vn -0.0417 0.9991 0.0071 +vn -1.0000 0.0006 0.0084 +vn -0.0001 -0.9956 -0.0940 +vn -1.0000 0.0001 0.0004 +vn 0.0001 0.9956 0.0941 +vn 0.0001 0.9953 0.0968 +vn 0.0020 -0.0231 0.9997 +vn -0.0084 -0.0395 0.9992 +vn -0.0693 -0.1932 -0.9787 +vn 0.0181 0.0150 0.9997 +vn 0.0812 0.2349 0.9686 +vn 0.0690 0.1924 0.9789 +vn -0.9601 0.2794 0.0122 +vn -0.9572 0.2893 0.0121 +vn -0.9602 0.2790 0.0135 +vn -0.0398 -0.0904 -0.9951 +vn -0.0299 -0.1456 0.9889 +vn -0.0101 0.9986 -0.0516 +vn -0.5988 -0.0920 0.7956 +vn -0.4826 -0.1722 0.8588 +vn -0.1131 -0.9083 0.4027 +vn 0.0273 0.9949 -0.0971 +vn -0.9985 -0.0027 0.0554 +vn 0.0027 -0.9999 -0.0117 +vn 0.0073 0.2267 -0.9739 +vn -0.5826 -0.2972 -0.7565 +vn -0.5826 -0.6714 0.4581 +vn -0.5826 0.5960 0.5526 +vn -0.5826 0.4062 -0.7040 +vn -0.5826 -0.7767 -0.2393 +vn -0.5826 -0.0605 0.8105 +vn -0.5826 0.8037 -0.1214 +vn -0.9031 0.0320 -0.4283 +vn -0.9031 -0.4247 0.0642 +vn -0.9031 0.1571 0.3998 +vn -0.9031 0.3548 -0.2421 +vn -0.9031 -0.3150 -0.2921 +vn -0.9031 -0.2146 0.3721 +vn -0.9031 0.4105 0.1265 +vn 0.3821 0.1311 0.9148 +vn -0.6979 -0.3531 0.6231 +vn 0.3821 -0.1591 -0.9103 +vn 0.3821 0.5383 0.7511 +vn -0.6979 0.6861 0.2056 +vn 0.9751 -0.1823 0.1265 +vn 0.3821 -0.2516 0.8892 +vn 0.9751 0.1094 -0.1931 +vn 0.3821 0.7969 0.4678 +vn 0.9751 0.2192 -0.0349 +vn 0.3821 -0.8109 -0.4432 +vn -0.6979 -0.7073 0.1125 +vn 0.3821 0.2788 -0.8811 +vn 0.9751 -0.2126 -0.0637 +vn 0.9751 -0.0148 0.2214 +vn -0.6979 0.0477 -0.7146 +vn 0.3821 -0.6334 0.6729 +vn 0.3821 0.8626 -0.3314 +vn -0.6979 -0.5290 -0.4829 +vn 0.9751 -0.0827 -0.2059 +vn 0.3821 0.6125 -0.6920 +vn 0.3821 -0.8521 0.3577 +vn 0.9751 0.1639 0.1496 +vn -0.6979 0.5885 -0.4082 +vn 0.3821 -0.9210 -0.0757 +vn 0.3821 -0.5150 -0.7673 +vn -0.6979 0.2671 0.6646 +vn 0.3821 0.9229 0.0474 +vn -0.9031 -0.2146 0.3720 +vn 0.9590 0.2831 0.0119 +vn 0.9604 0.2784 0.0130 +vn -0.0052 0.9527 0.3039 +vn -0.9590 0.2831 0.0119 +vn -0.9604 0.2784 0.0130 +vn 0.0052 0.9527 0.3039 +vn 0.0000 -0.9995 0.0328 +vn 0.0000 -0.9983 -0.0591 +vn 0.0001 -1.0000 -0.0028 +vn 0.8784 -0.4215 0.2253 +vn 0.8784 0.4756 0.0468 +vn 0.8784 -0.4574 0.1387 +vn 0.8784 0.4574 0.1387 +vn 0.8784 -0.4756 0.0468 +vn 0.8784 0.4215 0.2253 +vn 0.8784 -0.4757 -0.0468 +vn 0.8784 0.3695 0.3032 +vn 0.8784 -0.4574 -0.1387 +vn 0.8784 0.3032 0.3695 +vn 0.8784 -0.4215 -0.2253 +vn 0.8784 0.2253 0.4215 +vn 0.8784 0.0468 -0.4756 +vn 0.8784 -0.3695 -0.3032 +vn 0.8784 0.1387 0.4574 +vn 0.8784 0.1387 -0.4574 +vn 0.8784 -0.3032 -0.3695 +vn 0.8784 0.0468 0.4757 +vn 0.8784 0.2253 -0.4215 +vn 0.8784 -0.2253 -0.4215 +vn 0.8784 -0.0468 0.4757 +vn 0.8784 0.3032 -0.3695 +vn 0.8784 -0.1387 -0.4574 +vn 0.8784 -0.1387 0.4574 +vn 0.8784 0.3695 -0.3032 +vn 0.8784 -0.0468 -0.4757 +vn 0.8784 -0.2253 0.4215 +vn 0.8784 0.4215 -0.2253 +vn 0.8784 -0.3032 0.3695 +vn 0.8784 0.4574 -0.1387 +vn 0.8784 -0.3695 0.3032 +vn 0.8784 0.4757 -0.0468 +vn 0.9481 0.0312 -0.3164 +vn 0.9481 -0.2017 0.2458 +vn 0.9481 0.0923 0.3043 +vn 0.9481 0.0923 -0.3043 +vn 0.9481 -0.2458 0.2017 +vn 0.9481 0.0312 0.3164 +vn 0.9481 0.1499 -0.2804 +vn 0.9481 -0.2804 0.1499 +vn 0.9481 0.2017 -0.2458 +vn 0.9481 -0.3043 0.0923 +vn 0.9481 0.2458 -0.2017 +vn 0.9481 -0.3164 0.0312 +vn 0.9481 0.2804 -0.1499 +vn 0.9481 -0.3164 -0.0312 +vn 0.9481 0.3043 -0.0923 +vn 0.9481 -0.3043 -0.0923 +vn 0.9481 0.3164 -0.0312 +vn 0.9481 -0.2804 -0.1499 +vn 0.9481 0.3164 0.0312 +vn 0.9481 -0.2458 -0.2017 +vn 0.9481 0.3043 0.0923 +vn 0.9481 -0.2017 -0.2458 +vn 0.9481 0.2804 0.1499 +vn 0.9481 -0.1499 -0.2804 +vn 0.9481 -0.0312 0.3164 +vn 0.9481 0.2458 0.2017 +vn 0.9481 -0.0923 -0.3043 +vn 0.9481 -0.0923 0.3043 +vn 0.9481 0.2017 0.2458 +vn 0.9481 -0.0312 -0.3164 +vn 0.9481 -0.1499 0.2804 +vn 0.9481 0.1499 0.2804 +vn 0.9938 0.0705 -0.0860 +vn 0.9938 -0.1064 0.0323 +vn 0.9938 0.0860 -0.0705 +vn 0.9938 -0.1107 0.0109 +vn 0.9938 0.0981 -0.0524 +vn 0.9938 -0.1107 -0.0109 +vn 0.9938 0.1064 -0.0323 +vn 0.9938 -0.1064 -0.0323 +vn 0.9938 0.1107 -0.0109 +vn 0.9938 -0.0981 -0.0524 +vn 0.9938 0.1107 0.0109 +vn 0.9938 -0.0860 -0.0705 +vn 0.9938 0.1064 0.0323 +vn 0.9938 -0.0705 -0.0860 +vn 0.9938 0.0981 0.0524 +vn 0.9938 -0.0524 -0.0981 +vn 0.9938 -0.0109 0.1107 +vn 0.9938 0.0860 0.0705 +vn 0.9938 -0.0323 -0.1064 +vn 0.9938 -0.0323 0.1064 +vn 0.9938 0.0705 0.0860 +vn 0.9938 -0.0109 -0.1107 +vn 0.9938 -0.0524 0.0981 +vn 0.9938 0.0524 0.0981 +vn 0.9938 0.0109 -0.1107 +vn 0.9938 -0.0705 0.0860 +vn 0.9938 0.0323 0.1064 +vn 0.9938 0.0323 -0.1064 +vn 0.9938 -0.0860 0.0705 +vn 0.9938 0.0109 0.1107 +vn 0.9938 0.0524 -0.0981 +vn 0.9938 -0.0981 0.0524 +vn 0.8784 0.4757 0.0468 +vn 0.8784 -0.4757 0.0468 +vn -0.9343 -0.1035 0.3413 +vn -0.9343 0.2757 -0.2262 +vn -0.9343 -0.0350 -0.3549 +vn -0.9343 -0.1681 0.3145 +vn -0.9343 0.3145 -0.1681 +vn -0.9343 -0.2262 0.2757 +vn -0.9343 0.3413 -0.1035 +vn -0.9343 -0.2757 0.2262 +vn -0.9343 0.3549 -0.0350 +vn -0.9343 -0.3145 0.1681 +vn -0.9343 0.3549 0.0350 +vn -0.9343 -0.3413 0.1035 +vn -0.9343 0.3413 0.1035 +vn -0.9343 -0.3549 0.0350 +vn -0.9343 0.3145 0.1681 +vn -0.9343 -0.3549 -0.0350 +vn -0.9343 0.2757 0.2262 +vn -0.9343 -0.3413 -0.1035 +vn -0.9343 0.2262 0.2757 +vn -0.9343 -0.3145 -0.1681 +vn -0.9343 0.1681 0.3145 +vn -0.9343 0.0350 -0.3549 +vn -0.9343 -0.2757 -0.2262 +vn -0.9343 0.1035 0.3413 +vn -0.9343 0.1035 -0.3413 +vn -0.9343 -0.2262 -0.2757 +vn -0.9343 0.0350 0.3549 +vn -0.9343 0.1681 -0.3145 +vn -0.9343 -0.1681 -0.3145 +vn -0.9343 -0.0350 0.3549 +vn -0.9343 0.2262 -0.2757 +vn -0.9343 -0.1035 -0.3413 +vn -0.9343 -0.3547 -0.0349 +vn -0.9343 0.2755 0.2261 +vn -0.9343 -0.3410 -0.1035 +vn -0.9343 0.2261 0.2755 +vn -0.9343 -0.3143 -0.1680 +vn -0.9343 0.1680 0.3143 +vn -0.9343 0.0349 -0.3547 +vn -0.9343 -0.2755 -0.2261 +vn -0.9343 0.1035 0.3410 +vn -0.9343 0.1035 -0.3410 +vn -0.9343 -0.2261 -0.2755 +vn -0.9343 0.0349 0.3547 +vn -0.9343 0.1680 -0.3143 +vn -0.9343 -0.1680 -0.3143 +vn -0.9343 -0.0349 0.3547 +vn -0.9343 0.2261 -0.2755 +vn -0.9343 -0.1034 -0.3410 +vn -0.9343 -0.1034 0.3410 +vn -0.9343 0.2755 -0.2261 +vn -0.9343 -0.0349 -0.3547 +vn -0.9343 -0.1680 0.3143 +vn -0.9343 0.3143 -0.1680 +vn -0.9343 -0.2261 0.2755 +vn -0.9343 0.3410 -0.1035 +vn -0.9343 -0.2755 0.2261 +vn -0.9343 0.3547 -0.0349 +vn -0.9343 -0.3143 0.1680 +vn -0.9343 0.3547 0.0349 +vn -0.9343 -0.3410 0.1035 +vn -0.9343 0.3410 0.1035 +vn -0.9343 -0.3547 0.0349 +vn -0.9343 0.3143 0.1680 +vn -0.0001 -1.0000 -0.0028 +vn -0.8784 -0.4215 0.2253 +vn -0.8784 0.4756 0.0468 +vn -0.8784 -0.4574 0.1387 +vn -0.8784 0.4574 0.1387 +vn -0.8784 -0.4756 0.0468 +vn -0.8784 0.4215 0.2253 +vn -0.8784 -0.4757 -0.0468 +vn -0.8784 0.3695 0.3032 +vn -0.8784 -0.4574 -0.1387 +vn -0.8784 0.3032 0.3695 +vn -0.8784 -0.4215 -0.2253 +vn -0.8784 0.2253 0.4215 +vn -0.8784 0.0468 -0.4757 +vn -0.8784 -0.3695 -0.3032 +vn -0.8784 0.1387 0.4574 +vn -0.8784 0.1387 -0.4574 +vn -0.8784 -0.3032 -0.3695 +vn -0.8784 0.0468 0.4757 +vn -0.8784 0.2253 -0.4215 +vn -0.8784 -0.2253 -0.4215 +vn -0.8784 -0.0468 0.4757 +vn -0.8784 0.3032 -0.3695 +vn -0.8784 -0.1387 -0.4574 +vn -0.8784 -0.1387 0.4574 +vn -0.8784 0.3695 -0.3032 +vn -0.8784 -0.0468 -0.4757 +vn -0.8784 -0.2253 0.4215 +vn -0.8784 0.4215 -0.2253 +vn -0.8784 -0.3032 0.3695 +vn -0.8784 0.4574 -0.1387 +vn -0.8784 -0.3695 0.3032 +vn -0.8784 0.4757 -0.0468 +vn -0.9481 0.0312 -0.3164 +vn -0.9481 -0.2017 0.2458 +vn -0.9481 0.0923 0.3043 +vn -0.9481 0.0923 -0.3043 +vn -0.9481 -0.2458 0.2017 +vn -0.9481 0.0312 0.3164 +vn -0.9481 0.1499 -0.2804 +vn -0.9481 -0.2804 0.1499 +vn -0.9481 0.2017 -0.2458 +vn -0.9481 -0.3043 0.0923 +vn -0.9481 0.2458 -0.2017 +vn -0.9481 -0.3164 0.0312 +vn -0.9481 0.2804 -0.1499 +vn -0.9481 -0.3164 -0.0312 +vn -0.9481 0.3043 -0.0923 +vn -0.9481 -0.3043 -0.0923 +vn -0.9481 0.3164 -0.0312 +vn -0.9481 -0.2804 -0.1499 +vn -0.9481 0.3164 0.0312 +vn -0.9481 -0.2458 -0.2017 +vn -0.9481 0.3043 0.0923 +vn -0.9481 -0.2017 -0.2458 +vn -0.9481 0.2804 0.1499 +vn -0.9481 -0.1499 -0.2804 +vn -0.9481 -0.0312 0.3164 +vn -0.9481 0.2458 0.2017 +vn -0.9481 -0.0923 -0.3043 +vn -0.9481 -0.0923 0.3043 +vn -0.9481 0.2017 0.2458 +vn -0.9481 -0.0312 -0.3164 +vn -0.9481 -0.1499 0.2804 +vn -0.9481 0.1499 0.2804 +vn -0.9938 0.0705 -0.0860 +vn -0.9938 -0.1064 0.0323 +vn -0.9938 0.0860 -0.0705 +vn -0.9938 -0.1107 0.0109 +vn -0.9938 0.0981 -0.0524 +vn -0.9938 -0.1107 -0.0109 +vn -0.9938 0.1064 -0.0323 +vn -0.9938 -0.1064 -0.0323 +vn -0.9938 0.1107 -0.0109 +vn -0.9938 -0.0981 -0.0524 +vn -0.9938 0.1107 0.0109 +vn -0.9938 -0.0860 -0.0705 +vn -0.9938 0.1064 0.0323 +vn -0.9938 -0.0705 -0.0860 +vn -0.9938 0.0981 0.0524 +vn -0.9938 -0.0524 -0.0981 +vn -0.9938 -0.0109 0.1107 +vn -0.9938 0.0860 0.0705 +vn -0.9938 -0.0323 -0.1064 +vn -0.9938 -0.0323 0.1064 +vn -0.9938 0.0705 0.0860 +vn -0.9938 -0.0109 -0.1107 +vn -0.9938 -0.0524 0.0981 +vn -0.9938 0.0524 0.0981 +vn -0.9938 0.0109 -0.1107 +vn -0.9938 -0.0705 0.0860 +vn -0.9938 0.0323 0.1064 +vn -0.9938 0.0323 -0.1064 +vn -0.9938 -0.0860 0.0705 +vn -0.9938 0.0109 0.1107 +vn -0.9938 0.0524 -0.0981 +vn -0.9938 -0.0981 0.0524 +vn -0.8784 0.4757 0.0468 +vn -0.8784 0.0468 -0.4756 +vn 0.9343 -0.1035 0.3413 +vn 0.9343 0.2757 -0.2262 +vn 0.9343 -0.0350 -0.3549 +vn 0.9343 -0.1681 0.3145 +vn 0.9343 0.3145 -0.1681 +vn 0.9343 -0.2262 0.2757 +vn 0.9343 0.3413 -0.1035 +vn 0.9343 -0.2757 0.2262 +vn 0.9343 0.3549 -0.0350 +vn 0.9343 -0.3145 0.1681 +vn 0.9343 0.3549 0.0350 +vn 0.9343 -0.3413 0.1035 +vn 0.9343 0.3413 0.1035 +vn 0.9343 -0.3549 0.0350 +vn 0.9343 0.3145 0.1681 +vn 0.9343 -0.3549 -0.0350 +vn 0.9343 0.2757 0.2262 +vn 0.9343 -0.3413 -0.1035 +vn 0.9343 0.2262 0.2757 +vn 0.9343 -0.3145 -0.1681 +vn 0.9343 0.1681 0.3145 +vn 0.9343 0.0350 -0.3549 +vn 0.9343 -0.2757 -0.2262 +vn 0.9343 0.1035 0.3413 +vn 0.9343 0.1035 -0.3413 +vn 0.9343 -0.2262 -0.2757 +vn 0.9343 0.0350 0.3549 +vn 0.9343 0.1681 -0.3145 +vn 0.9343 -0.1681 -0.3145 +vn 0.9343 -0.0350 0.3549 +vn 0.9343 0.2262 -0.2757 +vn 0.9343 -0.1035 -0.3413 +vn 0.9343 -0.3547 -0.0349 +vn 0.9343 0.2755 0.2261 +vn 0.9343 -0.3410 -0.1035 +vn 0.9343 0.2261 0.2755 +vn 0.9343 -0.3143 -0.1680 +vn 0.9343 0.1680 0.3143 +vn 0.9343 0.0349 -0.3547 +vn 0.9343 -0.2755 -0.2261 +vn 0.9343 0.1035 0.3410 +vn 0.9343 0.1035 -0.3410 +vn 0.9343 -0.2261 -0.2755 +vn 0.9343 0.0349 0.3547 +vn 0.9343 0.1680 -0.3143 +vn 0.9343 -0.1680 -0.3143 +vn 0.9343 -0.0349 0.3547 +vn 0.9343 0.2261 -0.2755 +vn 0.9343 -0.1035 -0.3410 +vn 0.9343 -0.1035 0.3410 +vn 0.9343 0.2755 -0.2261 +vn 0.9343 -0.0349 -0.3547 +vn 0.9343 -0.1680 0.3143 +vn 0.9343 0.3143 -0.1680 +vn 0.9343 -0.2261 0.2755 +vn 0.9343 0.3410 -0.1035 +vn 0.9343 -0.2755 0.2261 +vn 0.9343 0.3547 -0.0349 +vn 0.9343 -0.3143 0.1680 +vn 0.9343 0.3547 0.0349 +vn 0.9343 -0.3410 0.1035 +vn 0.9343 0.3410 0.1035 +vn 0.9343 -0.3547 0.0349 +vn 0.9343 0.3143 0.1680 +usemtl Material +s off +f 7/1/1 995/2/1 983/3/1 927/4/1 +f 928/5/2 992/6/2 986/7/2 1/8/2 +f 5/9/3 26/10/3 938/11/3 935/12/3 +f 10/13/4 33/14/4 22/15/4 988/16/4 1001/17/4 +f 10/13/5 7/1/5 27/18/5 33/14/5 +f 63/19/6 109/20/6 66/21/6 67/22/6 49/23/6 +f 1001/17/5 995/2/5 7/1/5 10/13/5 +f 27/18/7 930/24/7 931/25/7 110/26/7 123/27/7 121/28/7 114/29/7 118/30/7 115/31/7 119/32/7 112/33/7 113/34/7 120/35/7 116/36/7 117/37/7 122/38/7 124/39/7 111/40/7 35/41/7 74/42/7 36/43/7 +f 33/44/8 27/45/8 36/46/8 34/47/8 +f 22/15/9 33/14/9 34/48/9 +f 1/8/10 986/49/10 1696/50/10 694/51/10 24/52/10 +f 54/53/11 65/54/11 72/55/11 69/56/11 +f 7/1/1 927/4/1 930/24/1 27/18/1 +f 928/5/2 1/8/2 24/52/2 932/57/2 +f 932/57/12 35/41/12 111/40/12 125/58/12 110/26/12 931/25/12 +f 31/59/13 47/60/13 45/61/13 43/62/13 41/63/13 75/64/13 35/41/13 932/57/13 693/65/13 695/66/13 152/67/13 +f 75/64/14 108/68/14 74/42/14 35/41/14 +f 63/19/15 64/69/15 37/70/15 +f 109/20/16 108/68/16 75/64/16 63/19/16 +f 37/70/17 30/71/17 68/72/17 70/73/17 +f 63/19/18 37/70/18 70/73/18 71/74/18 +f 75/64/19 41/63/19 64/69/19 63/19/19 +f 74/42/20 108/68/20 56/75/20 58/76/20 60/77/20 62/78/20 50/79/20 34/47/20 36/43/20 +f 34/47/21 50/79/21 62/78/21 94/80/21 95/81/21 941/82/21 940/83/21 22/15/21 +f 62/78/22 61/84/22 78/85/22 +f 76/86/23 52/87/23 84/88/23 85/89/23 +f 83/90/24 51/91/24 52/87/24 76/86/24 +f 52/87/23 81/92/23 86/93/23 84/88/23 +f 82/94/23 76/86/23 85/89/23 87/95/23 +f 81/92/23 82/94/23 87/95/23 86/93/23 +f 85/89/25 84/88/25 88/96/25 89/97/25 +f 1942/98/26 940/83/26 939/99/26 943/100/26 +f 101/101/27 1088/102/27 1090/103/27 95/81/27 +f 62/78/28 78/85/28 98/104/28 97/105/28 +f 94/80/29 62/78/29 97/105/29 101/106/29 +f 66/21/16 65/54/16 56/75/16 108/68/16 109/20/16 +f 116/36/30 120/35/30 130/107/30 131/108/30 +f 110/26/31 125/58/31 139/109/31 137/110/31 +f 125/58/32 111/40/32 127/111/32 139/109/32 +f 122/38/30 117/37/30 134/112/30 136/113/30 +f 118/30/33 114/29/33 129/114/33 133/115/33 +f 111/40/30 124/39/30 126/116/30 127/111/30 +f 123/27/34 110/26/34 137/110/34 138/117/34 +f 114/29/34 121/28/34 128/118/34 129/114/34 +f 119/32/33 115/31/33 132/119/33 135/120/33 +f 121/28/35 123/27/35 148/121/35 149/122/35 +f 112/33/36 119/32/36 142/123/36 140/124/36 +f 124/39/37 122/38/37 150/125/37 151/126/37 +f 117/37/37 116/36/37 145/127/37 146/128/37 +f 115/31/36 118/30/36 143/129/36 144/130/36 +f 120/35/37 113/34/37 141/131/37 147/132/37 +f 154/133/38 1152/134/38 1150/135/38 987/136/38 2/137/38 25/138/38 153/139/38 +f 31/59/39 152/67/39 159/140/39 160/141/39 +f 696/142/40 154/133/40 152/143/40 695/144/40 +f 24/52/41 694/51/41 693/145/41 932/57/41 +f 1695/146/42 696/142/42 700/147/42 702/148/42 +f 696/142/43 1695/146/43 1152/134/43 154/133/43 +f 694/51/44 1696/50/44 701/149/44 697/150/44 +f 696/142/45 695/144/45 699/151/45 700/147/45 +f 695/66/46 693/65/46 698/152/46 699/153/46 +f 693/145/47 694/51/47 697/150/47 698/154/47 +f 737/155/48 738/156/48 740/157/48 739/158/48 +f 739/158/49 740/157/49 742/159/49 741/160/49 +f 741/160/50 742/159/50 744/161/50 743/162/50 +f 743/162/51 744/161/51 746/163/51 745/164/51 +f 745/164/52 746/163/52 748/165/52 747/166/52 +f 747/166/53 748/165/53 750/167/53 749/168/53 +f 749/168/54 750/167/54 752/169/54 751/170/54 +f 751/170/55 752/169/55 754/171/55 753/172/55 +f 753/172/56 754/171/56 756/173/56 755/174/56 +f 755/174/57 756/173/57 758/175/57 757/176/57 +f 757/176/58 758/175/58 760/177/58 759/178/58 +f 759/178/59 760/177/59 762/179/59 761/180/59 +f 761/180/60 762/179/60 764/181/60 763/182/60 +f 763/182/61 764/181/61 766/183/61 765/184/61 +f 765/184/62 766/183/62 768/185/62 767/186/62 +f 767/186/63 768/185/63 770/187/63 769/188/63 +f 769/188/64 770/187/64 772/189/64 771/190/64 +f 771/190/65 772/189/65 774/191/65 773/192/65 +f 773/192/66 774/191/66 776/193/66 775/194/66 +f 775/194/67 776/193/67 778/195/67 777/196/67 +f 777/196/68 778/195/68 780/197/68 779/198/68 +f 779/198/69 780/197/69 782/199/69 781/200/69 +f 781/200/70 782/199/70 784/201/70 783/202/70 +f 783/202/71 784/201/71 786/203/71 785/204/71 +f 785/204/72 786/203/72 788/205/72 787/206/72 +f 787/206/73 788/205/73 790/207/73 789/208/73 +f 789/208/74 790/207/74 792/209/74 791/210/74 +f 791/210/75 792/209/75 794/211/75 793/212/75 +f 793/212/76 794/211/76 796/213/76 795/214/76 +f 795/214/77 796/213/77 798/215/77 797/216/77 +f 740/217/21 738/218/21 800/219/21 798/220/21 796/221/21 794/222/21 792/223/21 790/224/21 788/225/21 786/226/21 784/227/21 782/228/21 780/229/21 778/230/21 776/231/21 774/232/21 772/233/21 770/234/21 768/235/21 766/236/21 764/237/21 762/238/21 760/239/21 758/240/21 756/241/21 754/242/21 752/243/21 750/244/21 748/245/21 746/246/21 744/247/21 742/248/21 +f 797/216/78 798/215/78 800/249/78 799/250/78 +f 799/250/79 800/249/79 738/251/79 737/252/79 +f 737/253/25 739/254/25 741/255/25 743/256/25 745/257/25 747/258/25 749/259/25 751/260/25 753/261/25 755/262/25 757/263/25 759/264/25 761/265/25 763/266/25 765/267/25 767/268/25 769/269/25 771/270/25 773/271/25 775/272/25 777/273/25 779/274/25 781/275/25 783/276/25 785/277/25 787/278/25 789/279/25 791/280/25 793/281/25 795/282/25 797/283/25 799/284/25 +f 1928/285/80 3/286/80 927/4/80 983/3/80 +f 5/9/81 929/287/81 992/6/81 928/5/81 +f 28/288/82 29/289/82 931/25/82 930/24/82 +f 29/289/83 26/10/83 932/57/83 931/25/83 +f 26/10/84 5/9/84 928/5/84 932/57/84 +f 3/286/85 28/288/85 930/24/85 927/4/85 +f 29/289/86 28/288/86 936/290/86 937/291/86 +f 28/288/87 3/286/87 934/292/87 936/290/87 +f 26/10/88 29/289/88 937/291/88 938/11/88 +f 929/287/3 5/9/3 935/12/3 933/293/3 +f 3/286/87 1928/285/87 1934/294/87 934/292/87 +f 1090/103/89 1945/295/89 941/82/89 95/81/89 +f 941/82/26 942/296/26 946/297/26 948/298/26 +f 1942/98/90 988/16/90 22/15/90 940/83/90 +f 941/82/91 1945/295/91 944/299/91 942/296/91 +f 947/300/25 948/298/25 946/297/25 945/301/25 +f 939/99/91 940/83/91 947/300/91 945/301/91 +f 940/83/92 941/82/92 948/298/92 947/300/92 +f 942/296/93 939/99/93 945/301/93 946/297/93 +f 996/302/1 1927/303/1 983/3/1 995/2/1 +f 1929/304/2 981/305/2 986/7/2 992/6/2 +f 991/306/3 1937/307/3 1940/308/3 1018/309/3 +f 1002/310/4 1001/17/4 988/16/4 1014/311/4 1025/312/4 +f 1002/310/5 1025/312/5 1019/313/5 996/302/5 +f 1055/314/94 1041/315/94 1059/316/94 1058/317/94 1105/318/94 +f 1001/17/5 1002/310/5 996/302/5 995/2/5 +f 1019/313/95 1028/319/95 1066/320/95 1027/321/95 1107/322/95 1120/323/95 1118/324/95 1113/325/95 1112/326/95 1116/327/95 1109/328/95 1108/329/95 1115/330/95 1111/331/95 1114/332/95 1110/333/95 1117/334/95 1119/335/95 1106/336/95 1932/337/95 1931/338/95 +f 1025/339/96 1026/340/96 1028/341/96 1019/342/96 +f 1014/311/97 1026/343/97 1025/312/97 +f 981/305/98 1016/344/98 1692/345/98 1696/50/98 986/49/98 +f 1046/346/99 1061/347/99 1064/348/99 1057/349/99 +f 996/302/1 1019/313/1 1931/338/1 1927/303/1 +f 1929/304/2 1933/350/2 1016/344/2 981/305/2 +f 1933/350/100 1932/337/100 1106/336/100 1121/351/100 1107/322/100 1027/321/100 +f 1023/352/101 1148/353/101 1693/354/101 1691/355/101 1933/350/101 1027/321/101 1067/356/101 1033/357/101 1035/358/101 1037/359/101 1039/360/101 +f 1067/356/102 1027/321/102 1066/320/102 1104/361/102 +f 1055/314/103 1029/362/103 1056/363/103 +f 1105/318/104 1055/314/104 1067/356/104 1104/361/104 +f 1029/362/17 1062/364/17 1060/365/17 1022/366/17 +f 1055/314/105 1063/367/105 1062/364/105 1029/362/105 +f 1067/356/106 1055/314/106 1056/363/106 1033/357/106 +f 1066/320/107 1028/319/107 1026/340/107 1042/368/107 1054/369/107 1052/370/107 1050/371/107 1048/372/107 1104/361/107 +f 1026/340/25 1014/311/25 1943/373/25 1944/374/25 1091/375/25 1089/376/25 1054/369/25 1042/368/25 +f 1054/369/22 1070/377/22 1053/378/22 +f 1068/379/23 1077/380/23 1076/381/23 1044/382/23 +f 1075/383/108 1068/379/108 1044/382/108 1043/384/108 +f 1044/382/23 1076/381/23 1078/385/23 1073/386/23 +f 1074/387/23 1079/388/23 1077/380/23 1068/379/23 +f 1073/386/23 1078/385/23 1079/388/23 1074/387/23 +f 1077/380/21 1081/389/21 1080/390/21 1076/381/21 +f 1942/98/26 1947/391/26 1941/392/26 1943/373/26 +f 1097/393/27 1091/375/27 1090/103/27 1088/102/27 +f 1054/369/109 1093/394/109 1094/395/109 1070/377/109 +f 1089/376/29 1097/396/29 1093/394/29 1054/369/29 +f 1058/317/104 1105/318/104 1104/361/104 1048/372/104 1057/349/104 +f 1112/326/110 1127/397/110 1126/398/110 1116/327/110 +f 1106/336/111 1133/399/111 1135/400/111 1121/351/111 +f 1121/351/112 1135/400/112 1123/401/112 1107/322/112 +f 1118/324/110 1132/402/110 1130/403/110 1113/325/110 +f 1114/332/113 1129/404/113 1125/405/113 1110/333/113 +f 1107/322/110 1123/401/110 1122/406/110 1120/323/110 +f 1119/335/114 1134/407/114 1133/399/114 1106/336/114 +f 1110/333/114 1125/405/114 1124/408/114 1117/334/114 +f 1115/330/113 1131/409/113 1128/410/113 1111/331/113 +f 1117/334/115 1145/411/115 1144/412/115 1119/335/115 +f 1108/329/116 1136/413/116 1138/414/116 1115/330/116 +f 1120/323/117 1147/415/117 1146/416/117 1118/324/117 +f 1113/325/118 1142/417/118 1141/418/118 1112/326/118 +f 1111/331/116 1140/419/116 1139/420/116 1114/332/116 +f 1116/327/118 1143/421/118 1137/422/118 1109/328/118 +f 1151/423/119 1149/424/119 1017/425/119 982/426/119 987/136/119 1150/135/119 1152/134/119 +f 1023/352/120 1158/427/120 1157/428/120 1148/353/120 +f 1694/429/121 1693/430/121 1148/431/121 1151/423/121 +f 1016/344/122 1933/350/122 1691/432/122 1692/345/122 +f 1695/146/123 1702/433/123 1700/434/123 1694/429/123 +f 1694/429/124 1151/423/124 1152/134/124 1695/146/124 +f 1692/345/125 1697/435/125 1701/436/125 1696/50/125 +f 1694/429/126 1700/434/126 1699/437/126 1693/430/126 +f 1693/354/127 1699/438/127 1698/439/127 1691/355/127 +f 1691/432/128 1698/440/128 1697/435/128 1692/345/128 +f 1737/441/48 1739/442/48 1740/443/48 1738/444/48 +f 1739/442/49 1741/445/49 1742/446/49 1740/443/49 +f 1741/445/50 1743/447/50 1744/448/50 1742/446/50 +f 1743/447/51 1745/449/51 1746/450/51 1744/448/51 +f 1745/449/52 1747/451/52 1748/452/52 1746/450/52 +f 1747/451/53 1749/453/53 1750/454/53 1748/452/53 +f 1749/453/54 1751/455/54 1752/456/54 1750/454/54 +f 1751/455/55 1753/457/55 1754/458/55 1752/456/55 +f 1753/457/56 1755/459/56 1756/460/56 1754/458/56 +f 1755/459/57 1757/461/57 1758/462/57 1756/460/57 +f 1757/461/58 1759/463/58 1760/464/58 1758/462/58 +f 1759/463/59 1761/465/59 1762/466/59 1760/464/59 +f 1761/465/60 1763/467/60 1764/468/60 1762/466/60 +f 1763/467/61 1765/469/61 1766/470/61 1764/468/61 +f 1765/469/62 1767/471/62 1768/472/62 1766/470/62 +f 1767/471/63 1769/473/63 1770/474/63 1768/472/63 +f 1769/473/64 1771/475/64 1772/476/64 1770/474/64 +f 1771/475/65 1773/477/65 1774/478/65 1772/476/65 +f 1773/477/66 1775/479/66 1776/480/66 1774/478/66 +f 1775/479/67 1777/481/67 1778/482/67 1776/480/67 +f 1777/481/68 1779/483/68 1780/484/68 1778/482/68 +f 1779/483/69 1781/485/69 1782/486/69 1780/484/69 +f 1781/485/70 1783/487/70 1784/488/70 1782/486/70 +f 1783/487/71 1785/489/71 1786/490/71 1784/488/71 +f 1785/489/72 1787/491/72 1788/492/72 1786/490/72 +f 1787/491/73 1789/493/73 1790/494/73 1788/492/73 +f 1789/493/74 1791/495/74 1792/496/74 1790/494/74 +f 1791/495/75 1793/497/75 1794/498/75 1792/496/75 +f 1793/497/76 1795/499/76 1796/500/76 1794/498/76 +f 1795/499/77 1797/501/77 1798/502/77 1796/500/77 +f 1740/503/25 1742/504/25 1744/505/25 1746/506/25 1748/507/25 1750/508/25 1752/509/25 1754/510/25 1756/511/25 1758/512/25 1760/513/25 1762/514/25 1764/515/25 1766/516/25 1768/517/25 1770/518/25 1772/519/25 1774/520/25 1776/521/25 1778/522/25 1780/523/25 1782/524/25 1784/525/25 1786/526/25 1788/527/25 1790/528/25 1792/529/25 1794/530/25 1796/531/25 1798/532/25 1800/533/25 1738/534/25 +f 1797/501/78 1799/535/78 1800/536/78 1798/502/78 +f 1799/535/79 1737/537/79 1738/538/79 1800/536/79 +f 1737/539/21 1799/540/21 1797/541/21 1795/542/21 1793/543/21 1791/544/21 1789/545/21 1787/546/21 1785/547/21 1783/548/21 1781/549/21 1779/550/21 1777/551/21 1775/552/21 1773/553/21 1771/554/21 1769/555/21 1767/556/21 1765/557/21 1763/558/21 1761/559/21 1759/560/21 1757/561/21 1755/562/21 1753/563/21 1751/564/21 1749/565/21 1747/566/21 1745/567/21 1743/568/21 1741/569/21 1739/570/21 +f 1928/285/129 983/3/129 1927/303/129 984/571/129 +f 991/306/130 1929/304/130 992/6/130 1930/572/130 +f 1020/573/131 1931/338/131 1932/337/131 1021/574/131 +f 1021/574/132 1932/337/132 1933/350/132 1018/309/132 +f 1018/309/133 1933/350/133 1929/304/133 991/306/133 +f 984/571/134 1927/303/134 1931/338/134 1020/573/134 +f 1021/574/135 1939/575/135 1938/576/135 1020/573/135 +f 1020/573/87 1938/576/87 1936/577/87 984/571/87 +f 1018/309/136 1940/308/136 1939/575/136 1021/574/136 +f 1930/572/3 1935/578/3 1937/307/3 991/306/3 +f 984/571/87 1936/577/87 1934/294/87 1928/285/87 +f 1090/103/89 1091/375/89 1944/374/89 1945/295/89 +f 1944/374/26 1952/579/26 1950/580/26 1946/581/26 +f 1942/98/90 1943/373/90 1014/311/90 988/16/90 +f 1944/374/91 1946/581/91 1948/582/91 1945/295/91 +f 1951/583/21 1949/584/21 1950/580/21 1952/579/21 +f 1941/392/91 1949/584/91 1951/583/91 1943/373/91 +f 1943/373/92 1951/583/92 1952/579/92 1944/374/92 +f 1946/581/93 1950/580/93 1949/584/93 1941/392/93 +usemtl Материал +f 697/150/137 700/147/137 699/151/137 698/154/137 +f 697/150/138 701/149/138 702/148/138 700/147/138 +f 1697/435/139 1698/440/139 1699/437/139 1700/434/139 +f 1697/435/140 1700/434/140 1702/433/140 1701/436/140 +usemtl Материал.001 +f 993/585/141 6/586/141 2/137/141 987/587/141 +f 12/588/21 13/589/21 14/590/21 15/591/21 16/592/21 11/593/21 +f 9/594/21 21/595/21 20/596/21 19/597/21 18/598/21 17/599/21 +f 14/590/142 13/589/142 42/600/142 44/601/142 +f 13/589/143 12/588/143 38/602/143 42/600/143 +f 152/67/144 158/603/144 161/604/144 159/140/144 +f 17/599/145 18/598/145 55/605/145 53/606/145 +f 11/593/146 16/592/146 48/607/146 39/608/146 +f 18/598/147 19/597/147 57/609/147 55/605/147 +f 19/597/148 20/596/148 59/610/148 57/609/148 +f 6/586/149 11/593/149 39/608/149 40/611/149 31/59/149 +f 15/591/150 14/590/150 44/601/150 46/612/150 +f 2/137/151 6/586/151 31/59/151 25/138/151 +f 16/592/152 15/591/152 46/612/152 48/607/152 +f 37/70/153 64/69/153 41/63/153 42/600/153 38/602/153 +f 41/63/154 43/62/154 44/601/154 42/600/154 +f 43/62/155 45/61/155 46/612/155 44/601/155 +f 45/61/156 47/60/156 48/607/156 46/612/156 +f 47/60/157 40/611/157 39/608/157 48/607/157 +f 12/588/158 4/613/158 30/71/158 37/70/158 38/602/158 +f 8/614/159 17/599/159 53/606/159 54/53/159 32/615/159 +f 72/616/160 55/617/160 56/618/160 65/619/160 +f 55/605/161 57/609/161 58/76/161 56/75/161 +f 57/609/162 59/610/162 60/77/162 58/76/162 +f 59/610/163 61/84/163 62/78/163 60/77/163 +f 69/56/21 72/55/21 73/620/21 71/74/21 70/73/21 68/72/21 +f 65/54/164 66/21/164 73/620/164 72/55/164 +f 66/21/165 109/20/165 63/19/165 71/74/165 73/620/165 +f 30/71/166 54/53/166 69/56/166 68/72/166 +f 69/621/167 53/622/167 55/617/167 72/616/167 +f 69/621/168 54/623/168 53/622/168 +f 79/624/21 82/94/21 81/92/21 80/625/21 +f 23/626/169 77/627/169 79/624/169 80/625/169 +f 52/87/170 23/626/170 80/625/170 81/92/170 +f 77/627/171 76/86/171 82/94/171 79/624/171 +f 84/88/172 86/93/172 90/628/172 88/96/172 +f 89/97/173 88/96/173 90/628/173 91/629/173 +f 87/95/174 85/89/174 89/97/174 91/629/174 +f 86/93/21 87/95/21 91/629/21 90/628/21 +f 985/630/170 23/626/170 52/87/170 51/91/170 106/631/170 9/594/170 1000/632/170 +f 985/630/175 1084/633/175 92/634/175 77/627/175 23/626/175 +f 1086/635/176 102/636/176 92/634/176 1084/633/176 +f 101/106/177 102/637/177 1086/635/177 1088/102/177 +f 77/638/178 93/639/178 102/636/178 100/640/178 +f 96/641/179 97/105/179 98/104/179 99/642/179 +f 96/641/21 100/643/21 102/637/21 101/106/21 97/105/21 +f 76/86/180 77/627/180 100/643/180 96/641/180 +f 83/90/181 76/86/181 96/641/181 99/642/181 +f 99/644/182 88/96/182 89/645/182 83/646/182 +f 61/84/183 59/610/183 105/647/183 104/648/183 78/85/183 +f 99/642/184 98/104/184 107/649/184 103/650/184 +f 106/631/185 51/91/185 99/642/185 103/650/185 +f 20/596/183 103/650/183 107/649/183 59/610/183 +f 149/122/186 150/125/186 136/113/186 128/118/186 +f 130/107/187 147/132/187 142/123/187 135/120/187 +f 151/126/188 148/121/188 138/117/188 126/116/188 +f 143/129/189 133/115/189 134/112/189 146/128/189 +f 143/129/190 146/128/190 145/127/190 144/130/190 +f 142/123/191 147/132/191 141/131/191 140/124/191 +f 148/121/192 151/126/192 150/125/192 149/122/192 +f 131/108/193 132/119/193 144/130/193 145/127/193 +f 113/34/194 112/33/194 140/124/194 141/131/194 +f 152/143/195 154/651/195 153/652/195 +f 156/653/196 157/654/196 158/603/196 155/655/196 +f 153/139/197 25/138/197 156/653/197 155/655/197 +f 25/138/198 31/59/198 157/654/198 156/653/198 +f 152/67/199 153/139/199 155/655/199 158/603/199 +f 160/141/200 159/140/200 161/604/200 162/656/200 +f 158/603/201 157/654/201 162/656/201 161/604/201 +f 157/654/149 31/59/149 160/141/149 162/656/149 +f 154/133/202 153/139/202 1150/135/202 1152/134/202 +f 153/652/203 25/657/203 2/658/203 987/659/203 1150/660/203 +f 163/661/204 169/662/204 176/663/204 170/664/204 +f 168/665/205 167/666/205 174/667/205 175/668/205 +f 166/669/206 165/670/206 172/671/206 173/672/206 +f 164/673/207 163/661/207 170/664/207 171/674/207 +f 169/662/208 168/665/208 175/668/208 176/663/208 +f 167/666/209 166/669/209 173/672/209 174/667/209 +f 165/670/210 164/673/210 171/674/210 172/671/210 +f 174/667/211 173/672/211 180/675/211 181/676/211 +f 172/671/212 171/674/212 178/677/212 179/678/212 +f 170/664/213 176/663/213 183/679/213 177/680/213 +f 175/668/214 174/667/214 181/676/214 182/681/214 +f 173/672/215 172/671/215 179/678/215 180/675/215 +f 171/674/216 170/664/216 177/680/216 178/677/216 +f 176/663/217 175/668/217 182/681/217 183/679/217 +f 202/682/25 201/683/25 214/684/25 217/685/25 +f 210/686/25 209/687/25 222/688/25 225/689/25 +f 206/690/25 205/691/25 218/692/25 221/693/25 +f 198/694/25 211/695/25 224/696/25 213/697/25 +f 184/698/218 226/699/218 247/700/218 246/701/218 +f 208/702/25 207/703/25 220/704/25 223/705/25 +f 204/706/25 203/707/25 216/708/25 219/709/25 +f 204/706/21 219/709/21 232/710/21 235/711/21 +f 206/690/21 221/693/21 187/712/21 188/713/21 +f 205/691/21 204/706/21 235/711/21 234/714/21 +f 207/703/21 206/690/21 188/713/21 189/715/21 +f 218/692/21 205/691/21 234/714/21 233/716/21 +f 198/694/21 213/697/21 193/717/21 190/718/21 +f 219/709/23 218/692/23 233/716/23 232/710/23 +f 200/719/25 199/720/25 212/721/25 215/722/25 +f 187/712/219 186/723/219 248/724/219 251/725/219 +f 227/726/220 185/727/220 245/728/220 244/729/220 +f 239/730/221 236/731/221 264/732/221 267/733/221 +f 230/734/222 231/735/222 252/736/222 243/737/222 +f 238/738/223 239/730/223 267/733/223 266/739/223 +f 229/740/224 230/734/224 243/737/224 242/741/224 +f 221/693/23 220/704/23 186/723/23 187/712/23 +f 215/722/23 214/684/23 237/742/23 236/731/23 +f 220/704/21 207/703/21 189/715/21 186/723/21 +f 214/684/21 201/683/21 238/738/21 237/742/21 +f 223/705/23 222/688/23 184/698/23 185/727/23 +f 201/683/21 200/719/21 239/730/21 238/738/21 +f 222/688/21 209/687/21 226/699/21 184/698/21 +f 211/695/21 210/686/21 196/743/21 197/744/21 +f 200/719/21 215/722/21 236/731/21 239/730/21 +f 209/687/21 208/702/21 227/726/21 226/699/21 +f 210/686/21 225/689/21 195/745/21 196/743/21 +f 208/702/21 223/705/21 185/727/21 227/726/21 +f 225/689/23 224/696/23 194/746/23 195/745/23 +f 203/707/21 202/682/21 229/740/21 228/747/21 +f 224/696/21 211/695/21 197/744/21 194/746/21 +f 202/682/21 217/685/21 230/734/21 229/740/21 +f 213/697/23 212/721/23 192/748/23 193/717/23 +f 217/685/23 216/708/23 231/735/23 230/734/23 +f 212/721/21 199/720/21 191/749/21 192/748/21 +f 216/708/21 203/707/21 228/747/21 231/735/21 +f 199/720/21 198/694/21 190/718/21 191/749/21 +f 261/750/25 260/751/25 258/752/25 259/753/25 +f 257/754/25 254/755/25 255/756/25 256/757/25 +f 250/758/25 251/725/25 248/724/25 249/759/25 +f 246/701/25 247/700/25 244/729/25 245/728/25 +f 242/741/25 243/737/25 252/736/25 253/760/25 +f 241/761/25 262/762/25 263/763/25 240/764/25 +f 265/765/25 266/739/25 267/733/25 264/732/25 +f 189/715/225 188/713/225 250/758/225 249/759/225 +f 186/723/226 189/715/226 249/759/226 248/724/226 +f 226/699/227 227/726/227 244/729/227 247/700/227 +f 188/713/228 187/712/228 251/725/228 250/758/228 +f 185/727/229 184/698/229 246/701/229 245/728/229 +f 231/735/230 228/747/230 253/760/230 252/736/230 +f 228/747/231 229/740/231 242/741/231 253/760/231 +f 191/749/232 190/718/232 255/756/232 254/755/232 +f 193/717/233 192/748/233 257/754/233 256/757/233 +f 194/746/234 197/744/234 259/753/234 258/752/234 +f 233/716/235 234/714/235 262/762/235 241/761/235 +f 195/745/236 194/746/236 258/752/236 260/751/236 +f 234/714/237 235/711/237 263/763/237 262/762/237 +f 196/743/238 195/745/238 260/751/238 261/750/238 +f 235/711/239 232/710/239 240/764/239 263/763/239 +f 197/744/240 196/743/240 261/750/240 259/753/240 +f 236/731/241 237/742/241 265/765/241 264/732/241 +f 192/748/242 191/749/242 254/755/242 257/754/242 +f 237/742/243 238/738/243 266/739/243 265/765/243 +f 232/710/244 233/716/244 241/761/244 240/764/244 +f 190/718/245 193/717/245 256/757/245 255/756/245 +f 164/673/21 165/670/21 166/669/21 167/666/21 168/665/21 169/662/21 163/661/21 +f 428/766/204 434/767/204 441/768/204 435/769/204 +f 433/770/205 432/771/205 439/772/205 440/773/205 +f 431/774/206 430/775/206 437/776/206 438/777/206 +f 429/778/207 428/766/207 435/769/207 436/779/207 +f 434/767/208 433/770/208 440/773/208 441/768/208 +f 432/771/209 431/774/209 438/777/209 439/772/209 +f 430/775/210 429/778/210 436/779/210 437/776/210 +f 439/772/211 438/777/211 445/780/211 446/781/211 +f 437/776/212 436/779/212 443/782/212 444/783/212 +f 435/769/213 441/768/213 448/784/213 442/785/213 +f 440/773/214 439/772/214 446/781/214 447/786/214 +f 438/777/215 437/776/215 444/783/215 445/780/215 +f 436/779/246 435/769/246 442/785/246 443/782/246 +f 441/768/217 440/773/217 447/786/217 448/784/217 +f 467/787/25 466/788/25 479/789/25 482/790/25 +f 475/791/25 474/792/25 487/793/25 490/794/25 +f 471/795/25 470/796/25 483/797/25 486/798/25 +f 463/799/25 476/800/25 489/801/25 478/802/25 +f 449/803/218 491/804/218 512/805/218 511/806/218 +f 473/807/25 472/808/25 485/809/25 488/810/25 +f 469/811/25 468/812/25 481/813/25 484/814/25 +f 469/811/21 484/814/21 497/815/21 500/816/21 +f 471/795/21 486/798/21 452/817/21 453/818/21 +f 470/796/21 469/811/21 500/816/21 499/819/21 +f 472/808/21 471/795/21 453/818/21 454/820/21 +f 483/797/21 470/796/21 499/819/21 498/821/21 +f 463/799/21 478/802/21 458/822/21 455/823/21 +f 484/814/23 483/797/23 498/821/23 497/815/23 +f 465/824/25 464/825/25 477/826/25 480/827/25 +f 452/817/219 451/828/219 513/829/219 516/830/219 +f 492/831/220 450/832/220 510/833/220 509/834/220 +f 504/835/221 501/836/221 529/837/221 532/838/221 +f 495/839/222 496/840/222 517/841/222 508/842/222 +f 503/843/223 504/835/223 532/838/223 531/844/223 +f 494/845/224 495/839/224 508/842/224 507/846/224 +f 486/798/23 485/809/23 451/828/23 452/817/23 +f 480/827/23 479/789/23 502/847/23 501/836/23 +f 485/809/21 472/808/21 454/820/21 451/828/21 +f 479/789/21 466/788/21 503/843/21 502/847/21 +f 488/810/23 487/793/23 449/803/23 450/832/23 +f 466/788/21 465/824/21 504/835/21 503/843/21 +f 487/793/21 474/792/21 491/804/21 449/803/21 +f 476/800/21 475/791/21 461/848/21 462/849/21 +f 465/824/21 480/827/21 501/836/21 504/835/21 +f 474/792/21 473/807/21 492/831/21 491/804/21 +f 475/791/21 490/794/21 460/850/21 461/848/21 +f 473/807/21 488/810/21 450/832/21 492/831/21 +f 490/794/23 489/801/23 459/851/23 460/850/23 +f 468/812/21 467/787/21 494/845/21 493/852/21 +f 489/801/21 476/800/21 462/849/21 459/851/21 +f 467/787/21 482/790/21 495/839/21 494/845/21 +f 478/802/23 477/826/23 457/853/23 458/822/23 +f 482/790/23 481/813/23 496/840/23 495/839/23 +f 477/826/21 464/825/21 456/854/21 457/853/21 +f 481/813/21 468/812/21 493/852/21 496/840/21 +f 464/825/21 463/799/21 455/823/21 456/854/21 +f 526/855/25 525/856/25 523/857/25 524/858/25 +f 522/859/25 519/860/25 520/861/25 521/862/25 +f 515/863/25 516/830/25 513/829/25 514/864/25 +f 511/806/25 512/805/25 509/834/25 510/833/25 +f 507/846/25 508/842/25 517/841/25 518/865/25 +f 506/866/25 527/867/25 528/868/25 505/869/25 +f 530/870/25 531/844/25 532/838/25 529/837/25 +f 454/820/225 453/818/225 515/863/225 514/864/225 +f 451/828/226 454/820/226 514/864/226 513/829/226 +f 491/804/227 492/831/227 509/834/227 512/805/227 +f 453/818/228 452/817/228 516/830/228 515/863/228 +f 450/832/229 449/803/229 511/806/229 510/833/229 +f 496/840/230 493/852/230 518/865/230 517/841/230 +f 493/852/231 494/845/231 507/846/231 518/865/231 +f 456/854/232 455/823/232 520/861/232 519/860/232 +f 458/822/233 457/853/233 522/859/233 521/862/233 +f 459/851/234 462/849/234 524/858/234 523/857/234 +f 498/821/235 499/819/235 527/867/235 506/866/235 +f 460/850/236 459/851/236 523/857/236 525/856/236 +f 499/819/237 500/816/237 528/868/237 527/867/237 +f 461/848/238 460/850/238 525/856/238 526/855/238 +f 500/816/239 497/815/239 505/869/239 528/868/239 +f 462/849/240 461/848/240 526/855/240 524/858/240 +f 501/836/241 502/847/241 530/870/241 529/837/241 +f 457/853/242 456/854/242 519/860/242 522/859/242 +f 502/847/243 503/843/243 531/844/243 530/870/243 +f 497/815/244 498/821/244 506/866/244 505/869/244 +f 455/823/245 458/822/245 521/862/245 520/861/245 +f 429/778/21 430/775/21 431/774/21 432/771/21 433/770/21 434/767/21 428/766/21 +f 993/585/247 987/587/247 982/426/247 994/871/247 +f 1004/872/25 1003/873/25 1008/874/25 1007/875/25 1006/876/25 1005/877/25 +f 999/878/25 1009/879/25 1010/880/25 1011/881/25 1012/882/25 1013/883/25 +f 1006/876/142 1036/884/142 1034/885/142 1005/877/142 +f 1005/877/143 1034/885/143 1030/886/143 1004/872/143 +f 1148/353/144 1157/428/144 1159/887/144 1156/888/144 +f 1009/879/145 1045/889/145 1047/890/145 1010/880/145 +f 1003/873/146 1031/891/146 1040/892/146 1008/874/146 +f 1010/880/147 1047/890/147 1049/893/147 1011/881/147 +f 1011/881/148 1049/893/148 1051/894/148 1012/882/148 +f 994/871/149 1023/352/149 1032/895/149 1031/891/149 1003/873/149 +f 1007/875/150 1038/896/150 1036/884/150 1006/876/150 +f 982/426/248 1017/425/248 1023/352/248 994/871/248 +f 1008/874/152 1040/892/152 1038/896/152 1007/875/152 +f 1029/362/249 1030/886/249 1034/885/249 1033/357/249 1056/363/249 +f 1033/357/250 1034/885/250 1036/884/250 1035/358/250 +f 1035/358/251 1036/884/251 1038/896/251 1037/359/251 +f 1037/359/252 1038/896/252 1040/892/252 1039/360/252 +f 1039/360/253 1040/892/253 1031/891/253 1032/895/253 +f 1004/872/254 1030/886/254 1029/362/254 1022/366/254 989/897/254 +f 997/898/255 1024/899/255 1046/346/255 1045/889/255 1009/879/255 +f 1064/900/256 1057/901/256 1048/902/256 1047/903/256 +f 1047/890/257 1048/372/257 1050/371/257 1049/893/257 +f 1049/893/258 1050/371/258 1052/370/258 1051/894/258 +f 1051/894/259 1052/370/259 1054/369/259 1053/378/259 +f 1061/347/25 1060/365/25 1062/364/25 1063/367/25 1065/904/25 1064/348/25 +f 1057/349/260 1064/348/260 1065/904/260 1058/317/260 +f 1058/317/261 1065/904/261 1063/367/261 1055/314/261 1105/318/261 +f 1022/366/166 1060/365/166 1061/347/166 1046/346/166 +f 1061/905/262 1064/900/262 1047/903/262 1045/906/262 +f 1061/905/168 1045/906/168 1046/907/168 +f 1071/908/25 1072/909/25 1073/386/25 1074/387/25 +f 1015/910/169 1072/909/169 1071/908/169 1069/911/169 +f 1044/382/170 1073/386/170 1072/909/170 1015/910/170 +f 1069/911/171 1071/908/171 1074/387/171 1068/379/171 +f 1076/381/172 1080/390/172 1082/912/172 1078/385/172 +f 1081/389/173 1083/913/173 1082/912/173 1080/390/173 +f 1079/388/174 1083/913/174 1081/389/174 1077/380/174 +f 1078/385/25 1082/912/25 1083/913/25 1079/388/25 +f 985/630/170 1000/632/170 999/878/170 1102/914/170 1043/384/170 1044/382/170 1015/910/170 +f 985/630/175 1015/910/175 1069/911/175 1085/915/175 1084/633/175 +f 1086/635/176 1084/633/176 1085/915/176 1098/916/176 +f 1097/396/177 1088/102/177 1086/635/177 1098/917/177 +f 1069/918/263 1096/919/263 1098/916/263 1087/920/263 +f 1092/921/264 1095/922/264 1094/395/264 1093/394/264 +f 1092/921/25 1093/394/25 1097/396/25 1098/917/25 1096/923/25 +f 1068/379/265 1092/921/265 1096/923/265 1069/911/265 +f 1075/383/266 1095/922/266 1092/921/266 1068/379/266 +f 1095/924/267 1075/925/267 1081/926/267 1080/390/267 +f 1053/378/183 1070/377/183 1100/927/183 1101/928/183 1051/894/183 +f 1095/922/184 1099/929/184 1103/930/184 1094/395/184 +f 1102/914/268 1099/929/268 1095/922/268 1043/384/268 +f 1012/882/183 1051/894/183 1103/930/183 1099/929/183 +f 1145/411/269 1124/408/269 1132/402/269 1146/416/269 +f 1126/398/270 1131/409/270 1138/414/270 1143/421/270 +f 1147/415/271 1122/406/271 1134/407/271 1144/412/271 +f 1139/420/272 1142/417/272 1130/403/272 1129/404/272 +f 1139/420/273 1140/419/273 1141/418/273 1142/417/273 +f 1138/414/274 1136/413/274 1137/422/274 1143/421/274 +f 1144/412/275 1145/411/275 1146/416/275 1147/415/275 +f 1127/397/276 1141/418/276 1140/419/276 1128/410/276 +f 1109/328/277 1137/422/277 1136/413/277 1108/329/277 +f 1148/431/278 1149/931/278 1151/932/278 +f 1154/933/279 1153/934/279 1156/888/279 1155/935/279 +f 1149/424/280 1153/934/280 1154/933/280 1017/425/280 +f 1017/425/281 1154/933/281 1155/935/281 1023/352/281 +f 1148/353/282 1156/888/282 1153/934/282 1149/424/282 +f 1158/427/200 1160/936/200 1159/887/200 1157/428/200 +f 1156/888/283 1159/887/283 1160/936/283 1155/935/283 +f 1155/935/149 1160/936/149 1158/427/149 1023/352/149 +f 1151/423/284 1152/134/284 1150/135/284 1149/424/284 +f 1149/931/285 1150/660/285 987/659/285 982/937/285 1017/938/285 +f 1161/939/286 1168/940/286 1174/941/286 1167/942/286 +f 1166/943/287 1173/944/287 1172/945/287 1165/946/287 +f 1164/947/288 1171/948/288 1170/949/288 1163/950/288 +f 1162/951/289 1169/952/289 1168/940/289 1161/939/289 +f 1167/942/290 1174/941/290 1173/944/290 1166/943/290 +f 1165/946/291 1172/945/291 1171/948/291 1164/947/291 +f 1163/950/292 1170/949/292 1169/952/292 1162/951/292 +f 1172/945/293 1179/953/293 1178/954/293 1171/948/293 +f 1170/949/294 1177/955/294 1176/956/294 1169/952/294 +f 1168/940/295 1175/957/295 1181/958/295 1174/941/295 +f 1173/944/296 1180/959/296 1179/953/296 1172/945/296 +f 1171/948/297 1178/954/297 1177/955/297 1170/949/297 +f 1169/952/298 1176/956/298 1175/957/298 1168/940/298 +f 1174/941/299 1181/958/299 1180/959/299 1173/944/299 +f 1200/960/21 1215/961/21 1212/962/21 1199/963/21 +f 1208/964/21 1223/965/21 1220/966/21 1207/967/21 +f 1204/968/21 1219/969/21 1216/970/21 1203/971/21 +f 1196/972/21 1211/973/21 1222/974/21 1209/975/21 +f 1182/976/300 1244/977/300 1245/978/300 1224/979/300 +f 1206/980/21 1221/981/21 1218/982/21 1205/983/21 +f 1202/984/21 1217/985/21 1214/986/21 1201/987/21 +f 1202/984/25 1233/988/25 1230/989/25 1217/985/25 +f 1204/968/25 1186/990/25 1185/991/25 1219/969/25 +f 1203/971/25 1232/992/25 1233/988/25 1202/984/25 +f 1205/983/25 1187/993/25 1186/990/25 1204/968/25 +f 1216/970/25 1231/994/25 1232/992/25 1203/971/25 +f 1196/972/25 1188/995/25 1191/996/25 1211/973/25 +f 1217/985/23 1230/989/23 1231/994/23 1216/970/23 +f 1198/997/21 1213/998/21 1210/999/21 1197/1000/21 +f 1185/991/301 1249/1001/301 1246/1002/301 1184/1003/301 +f 1225/1004/302 1242/1005/302 1243/1006/302 1183/1007/302 +f 1237/1008/303 1265/1009/303 1262/1010/303 1234/1011/303 +f 1228/1012/304 1241/1013/304 1250/1014/304 1229/1015/304 +f 1236/1016/305 1264/1017/305 1265/1009/305 1237/1008/305 +f 1227/1018/306 1240/1019/306 1241/1013/306 1228/1012/306 +f 1219/969/23 1185/991/23 1184/1003/23 1218/982/23 +f 1213/998/23 1234/1011/23 1235/1020/23 1212/962/23 +f 1218/982/25 1184/1003/25 1187/993/25 1205/983/25 +f 1212/962/25 1235/1020/25 1236/1016/25 1199/963/25 +f 1221/981/23 1183/1007/23 1182/976/23 1220/966/23 +f 1199/963/25 1236/1016/25 1237/1008/25 1198/997/25 +f 1220/966/25 1182/976/25 1224/979/25 1207/967/25 +f 1209/975/25 1195/1021/25 1194/1022/25 1208/964/25 +f 1198/997/25 1237/1008/25 1234/1011/25 1213/998/25 +f 1207/967/25 1224/979/25 1225/1004/25 1206/980/25 +f 1208/964/25 1194/1022/25 1193/1023/25 1223/965/25 +f 1206/980/25 1225/1004/25 1183/1007/25 1221/981/25 +f 1223/965/23 1193/1023/23 1192/1024/23 1222/974/23 +f 1201/987/25 1226/1025/25 1227/1018/25 1200/960/25 +f 1222/974/25 1192/1024/25 1195/1021/25 1209/975/25 +f 1200/960/25 1227/1018/25 1228/1012/25 1215/961/25 +f 1211/973/23 1191/996/23 1190/1026/23 1210/999/23 +f 1215/961/23 1228/1012/23 1229/1015/23 1214/986/23 +f 1210/999/25 1190/1026/25 1189/1027/25 1197/1000/25 +f 1214/986/25 1229/1015/25 1226/1025/25 1201/987/25 +f 1197/1000/25 1189/1027/25 1188/995/25 1196/972/25 +f 1259/1028/21 1257/1029/21 1256/1030/21 1258/1031/21 +f 1255/1032/21 1254/1033/21 1253/1034/21 1252/1035/21 +f 1248/1036/21 1247/1037/21 1246/1002/21 1249/1001/21 +f 1244/977/21 1243/1006/21 1242/1005/21 1245/978/21 +f 1240/1019/21 1251/1038/21 1250/1014/21 1241/1013/21 +f 1239/1039/21 1238/1040/21 1261/1041/21 1260/1042/21 +f 1263/1043/21 1262/1010/21 1265/1009/21 1264/1017/21 +f 1187/993/307 1247/1037/307 1248/1036/307 1186/990/307 +f 1184/1003/308 1246/1002/308 1247/1037/308 1187/993/308 +f 1224/979/309 1245/978/309 1242/1005/309 1225/1004/309 +f 1186/990/310 1248/1036/310 1249/1001/310 1185/991/310 +f 1183/1007/311 1243/1006/311 1244/977/311 1182/976/311 +f 1229/1015/312 1250/1014/312 1251/1038/312 1226/1025/312 +f 1226/1025/313 1251/1038/313 1240/1019/313 1227/1018/313 +f 1189/1027/314 1252/1035/314 1253/1034/314 1188/995/314 +f 1191/996/315 1254/1033/315 1255/1032/315 1190/1026/315 +f 1192/1024/316 1256/1030/316 1257/1029/316 1195/1021/316 +f 1231/994/317 1239/1039/317 1260/1042/317 1232/992/317 +f 1193/1023/318 1258/1031/318 1256/1030/318 1192/1024/318 +f 1232/992/319 1260/1042/319 1261/1041/319 1233/988/319 +f 1194/1022/320 1259/1028/320 1258/1031/320 1193/1023/320 +f 1233/988/321 1261/1041/321 1238/1040/321 1230/989/321 +f 1195/1021/322 1257/1029/322 1259/1028/322 1194/1022/322 +f 1234/1011/323 1262/1010/323 1263/1043/323 1235/1020/323 +f 1190/1026/324 1255/1032/324 1252/1035/324 1189/1027/324 +f 1235/1020/325 1263/1043/325 1264/1017/325 1236/1016/325 +f 1230/989/326 1238/1040/326 1239/1039/326 1231/994/326 +f 1188/995/327 1253/1034/327 1254/1033/327 1191/996/327 +f 1162/951/25 1161/939/25 1167/942/25 1166/943/25 1165/946/25 1164/947/25 1163/950/25 +f 1426/1044/286 1433/1045/286 1439/1046/286 1432/1047/286 +f 1431/1048/287 1438/1049/287 1437/1050/287 1430/1051/287 +f 1429/1052/288 1436/1053/288 1435/1054/288 1428/1055/288 +f 1427/1056/289 1434/1057/289 1433/1045/289 1426/1044/289 +f 1432/1047/290 1439/1046/290 1438/1049/290 1431/1048/290 +f 1430/1051/291 1437/1050/291 1436/1053/291 1429/1052/291 +f 1428/1055/292 1435/1054/292 1434/1057/292 1427/1056/292 +f 1437/1050/293 1444/1058/293 1443/1059/293 1436/1053/293 +f 1435/1054/294 1442/1060/294 1441/1061/294 1434/1057/294 +f 1433/1045/295 1440/1062/295 1446/1063/295 1439/1046/295 +f 1438/1049/296 1445/1064/296 1444/1058/296 1437/1050/296 +f 1436/1053/297 1443/1059/297 1442/1060/297 1435/1054/297 +f 1434/1057/328 1441/1061/328 1440/1062/328 1433/1045/328 +f 1439/1046/299 1446/1063/299 1445/1064/299 1438/1049/299 +f 1465/1065/21 1480/1066/21 1477/1067/21 1464/1068/21 +f 1473/1069/21 1488/1070/21 1485/1071/21 1472/1072/21 +f 1469/1073/21 1484/1074/21 1481/1075/21 1468/1076/21 +f 1461/1077/21 1476/1078/21 1487/1079/21 1474/1080/21 +f 1447/1081/300 1509/1082/300 1510/1083/300 1489/1084/300 +f 1471/1085/21 1486/1086/21 1483/1087/21 1470/1088/21 +f 1467/1089/21 1482/1090/21 1479/1091/21 1466/1092/21 +f 1467/1089/25 1498/1093/25 1495/1094/25 1482/1090/25 +f 1469/1073/25 1451/1095/25 1450/1096/25 1484/1074/25 +f 1468/1076/25 1497/1097/25 1498/1093/25 1467/1089/25 +f 1470/1088/25 1452/1098/25 1451/1095/25 1469/1073/25 +f 1481/1075/25 1496/1099/25 1497/1097/25 1468/1076/25 +f 1461/1077/25 1453/1100/25 1456/1101/25 1476/1078/25 +f 1482/1090/23 1495/1094/23 1496/1099/23 1481/1075/23 +f 1463/1102/21 1478/1103/21 1475/1104/21 1462/1105/21 +f 1450/1096/301 1514/1106/301 1511/1107/301 1449/1108/301 +f 1490/1109/302 1507/1110/302 1508/1111/302 1448/1112/302 +f 1502/1113/303 1530/1114/303 1527/1115/303 1499/1116/303 +f 1493/1117/304 1506/1118/304 1515/1119/304 1494/1120/304 +f 1501/1121/305 1529/1122/305 1530/1114/305 1502/1113/305 +f 1492/1123/306 1505/1124/306 1506/1118/306 1493/1117/306 +f 1484/1074/23 1450/1096/23 1449/1108/23 1483/1087/23 +f 1478/1103/23 1499/1116/23 1500/1125/23 1477/1067/23 +f 1483/1087/25 1449/1108/25 1452/1098/25 1470/1088/25 +f 1477/1067/25 1500/1125/25 1501/1121/25 1464/1068/25 +f 1486/1086/23 1448/1112/23 1447/1081/23 1485/1071/23 +f 1464/1068/25 1501/1121/25 1502/1113/25 1463/1102/25 +f 1485/1071/25 1447/1081/25 1489/1084/25 1472/1072/25 +f 1474/1080/25 1460/1126/25 1459/1127/25 1473/1069/25 +f 1463/1102/25 1502/1113/25 1499/1116/25 1478/1103/25 +f 1472/1072/25 1489/1084/25 1490/1109/25 1471/1085/25 +f 1473/1069/25 1459/1127/25 1458/1128/25 1488/1070/25 +f 1471/1085/25 1490/1109/25 1448/1112/25 1486/1086/25 +f 1488/1070/23 1458/1128/23 1457/1129/23 1487/1079/23 +f 1466/1092/25 1491/1130/25 1492/1123/25 1465/1065/25 +f 1487/1079/25 1457/1129/25 1460/1126/25 1474/1080/25 +f 1465/1065/25 1492/1123/25 1493/1117/25 1480/1066/25 +f 1476/1078/23 1456/1101/23 1455/1131/23 1475/1104/23 +f 1480/1066/23 1493/1117/23 1494/1120/23 1479/1091/23 +f 1475/1104/25 1455/1131/25 1454/1132/25 1462/1105/25 +f 1479/1091/25 1494/1120/25 1491/1130/25 1466/1092/25 +f 1462/1105/25 1454/1132/25 1453/1100/25 1461/1077/25 +f 1524/1133/21 1522/1134/21 1521/1135/21 1523/1136/21 +f 1520/1137/21 1519/1138/21 1518/1139/21 1517/1140/21 +f 1513/1141/21 1512/1142/21 1511/1107/21 1514/1106/21 +f 1509/1082/21 1508/1111/21 1507/1110/21 1510/1083/21 +f 1505/1124/21 1516/1143/21 1515/1119/21 1506/1118/21 +f 1504/1144/21 1503/1145/21 1526/1146/21 1525/1147/21 +f 1528/1148/21 1527/1115/21 1530/1114/21 1529/1122/21 +f 1452/1098/307 1512/1142/307 1513/1141/307 1451/1095/307 +f 1449/1108/308 1511/1107/308 1512/1142/308 1452/1098/308 +f 1489/1084/309 1510/1083/309 1507/1110/309 1490/1109/309 +f 1451/1095/310 1513/1141/310 1514/1106/310 1450/1096/310 +f 1448/1112/311 1508/1111/311 1509/1082/311 1447/1081/311 +f 1494/1120/312 1515/1119/312 1516/1143/312 1491/1130/312 +f 1491/1130/313 1516/1143/313 1505/1124/313 1492/1123/313 +f 1454/1132/314 1517/1140/314 1518/1139/314 1453/1100/314 +f 1456/1101/315 1519/1138/315 1520/1137/315 1455/1131/315 +f 1457/1129/316 1521/1135/316 1522/1134/316 1460/1126/316 +f 1496/1099/317 1504/1144/317 1525/1147/317 1497/1097/317 +f 1458/1128/318 1523/1136/318 1521/1135/318 1457/1129/318 +f 1497/1097/319 1525/1147/319 1526/1146/319 1498/1093/319 +f 1459/1127/320 1524/1133/320 1523/1136/320 1458/1128/320 +f 1498/1093/321 1526/1146/321 1503/1145/321 1495/1094/321 +f 1460/1126/322 1522/1134/322 1524/1133/322 1459/1127/322 +f 1499/1116/323 1527/1115/323 1528/1148/323 1500/1125/323 +f 1455/1131/324 1520/1137/324 1517/1140/324 1454/1132/324 +f 1500/1125/325 1528/1148/325 1529/1122/325 1501/1121/325 +f 1495/1094/326 1503/1145/326 1504/1144/326 1496/1099/326 +f 1453/1100/327 1518/1139/327 1519/1138/327 1456/1101/327 +f 1427/1056/25 1426/1044/25 1432/1047/25 1431/1048/25 1430/1051/25 1429/1052/25 1428/1055/25 +usemtl Материал.003 +f 132/119/329 131/108/329 130/107/329 135/120/329 +f 128/118/330 136/113/330 134/112/330 133/115/330 129/114/330 +f 127/111/12 126/116/12 138/117/12 137/110/12 139/109/12 +f 937/291/331 936/290/331 934/292/331 1934/294/331 933/293/331 935/12/331 938/11/331 +f 1128/410/332 1131/409/332 1126/398/332 1127/397/332 +f 1124/408/333 1125/405/333 1129/404/333 1130/403/333 1132/402/333 +f 1123/401/100 1135/400/100 1133/399/100 1134/407/100 1122/406/100 +f 1939/575/334 1940/308/334 1937/307/334 1935/578/334 1934/294/334 1936/577/334 1938/576/334 +usemtl Материал.002 +f 998/1149/335 8/614/335 4/613/335 12/588/335 11/593/335 6/586/335 993/585/335 990/1150/335 +f 1000/632/336 9/594/336 17/599/336 8/614/336 998/1149/336 +f 4/613/337 8/614/337 32/615/337 54/53/337 30/71/337 +f 289/1151/338 290/1152/338 322/1153/338 321/1154/338 +f 276/1155/339 277/1156/339 309/1157/339 308/1158/339 +f 290/1152/340 291/1159/340 323/1160/340 322/1153/340 +f 277/1156/341 278/1161/341 310/1162/341 309/1157/341 +f 291/1159/342 292/1163/342 324/1164/342 323/1160/342 +f 278/1161/343 279/1165/343 311/1166/343 310/1162/343 +f 292/1163/344 293/1167/344 325/1168/344 324/1164/344 +f 279/1165/345 280/1169/345 312/1170/345 311/1166/345 +f 293/1167/346 294/1171/346 326/1172/346 325/1168/346 +f 280/1169/347 281/1173/347 313/1174/347 312/1170/347 +f 294/1171/348 295/1175/348 327/1176/348 326/1172/348 +f 281/1173/349 282/1177/349 314/1178/349 313/1174/349 +f 268/1179/350 269/1180/350 301/1181/350 300/1182/350 +f 295/1175/351 296/1183/351 328/1184/351 327/1176/351 +f 282/1177/352 283/1185/352 315/1186/352 314/1178/352 +f 269/1180/353 270/1187/353 302/1188/353 301/1181/353 +f 296/1183/354 297/1189/354 329/1190/354 328/1184/354 +f 283/1185/355 284/1191/355 316/1192/355 315/1186/355 +f 270/1187/356 271/1193/356 303/1194/356 302/1188/356 +f 297/1189/357 298/1195/357 330/1196/357 329/1190/357 +f 284/1191/358 285/1197/358 317/1198/358 316/1192/358 +f 271/1193/359 272/1199/359 304/1200/359 303/1194/359 +f 298/1195/360 299/1201/360 331/1202/360 330/1196/360 +f 285/1197/361 286/1203/361 318/1204/361 317/1198/361 +f 272/1199/362 273/1205/362 305/1206/362 304/1200/362 +f 299/1201/363 268/1179/363 300/1182/363 331/1202/363 +f 286/1203/364 287/1207/364 319/1208/364 318/1204/364 +f 273/1205/365 274/1209/365 306/1210/365 305/1206/365 +f 287/1207/366 288/1211/366 320/1212/366 319/1208/366 +f 274/1209/367 275/1213/367 307/1214/367 306/1210/367 +f 288/1211/368 289/1151/368 321/1154/368 320/1212/368 +f 275/1213/369 276/1155/369 308/1158/369 307/1214/369 +f 316/1192/370 317/1198/370 349/1215/370 348/1216/370 +f 303/1194/371 304/1200/371 336/1217/371 335/1218/371 +f 330/1196/372 331/1202/372 363/1219/372 362/1220/372 +f 317/1198/373 318/1204/373 350/1221/373 349/1215/373 +f 304/1200/374 305/1206/374 337/1222/374 336/1217/374 +f 331/1202/375 300/1182/375 332/1223/375 363/1219/375 +f 318/1204/376 319/1208/376 351/1224/376 350/1221/376 +f 305/1206/377 306/1210/377 338/1225/377 337/1222/377 +f 319/1208/378 320/1212/378 352/1226/378 351/1224/378 +f 306/1210/379 307/1214/379 339/1227/379 338/1225/379 +f 320/1212/380 321/1154/380 353/1228/380 352/1226/380 +f 307/1214/381 308/1158/381 340/1229/381 339/1227/381 +f 321/1154/382 322/1153/382 354/1230/382 353/1228/382 +f 308/1158/383 309/1157/383 341/1231/383 340/1229/383 +f 322/1153/384 323/1160/384 355/1232/384 354/1230/384 +f 309/1157/385 310/1162/385 342/1233/385 341/1231/385 +f 323/1160/386 324/1164/386 356/1234/386 355/1232/386 +f 310/1162/387 311/1166/387 343/1235/387 342/1233/387 +f 324/1164/388 325/1168/388 357/1236/388 356/1234/388 +f 311/1166/389 312/1170/389 344/1237/389 343/1235/389 +f 325/1168/390 326/1172/390 358/1238/390 357/1236/390 +f 312/1170/391 313/1174/391 345/1239/391 344/1237/391 +f 326/1172/392 327/1176/392 359/1240/392 358/1238/392 +f 313/1174/393 314/1178/393 346/1241/393 345/1239/393 +f 300/1182/394 301/1181/394 333/1242/394 332/1223/394 +f 327/1176/395 328/1184/395 360/1243/395 359/1240/395 +f 314/1178/396 315/1186/396 347/1244/396 346/1241/396 +f 301/1181/397 302/1188/397 334/1245/397 333/1242/397 +f 328/1184/398 329/1190/398 361/1246/398 360/1243/398 +f 315/1186/399 316/1192/399 348/1216/399 347/1244/399 +f 302/1188/400 303/1194/400 335/1218/400 334/1245/400 +f 329/1190/401 330/1196/401 362/1220/401 361/1246/401 +f 351/1224/402 352/1226/402 384/1247/402 383/1248/402 +f 338/1225/403 339/1227/403 371/1249/403 370/1250/403 +f 352/1226/404 353/1228/404 385/1251/404 384/1247/404 +f 339/1227/405 340/1229/405 372/1252/405 371/1249/405 +f 353/1228/406 354/1230/406 386/1253/406 385/1251/406 +f 340/1229/407 341/1231/407 373/1254/407 372/1252/407 +f 354/1230/408 355/1232/408 387/1255/408 386/1253/408 +f 341/1231/409 342/1233/409 374/1256/409 373/1254/409 +f 355/1232/410 356/1234/410 388/1257/410 387/1255/410 +f 342/1233/411 343/1235/411 375/1258/411 374/1256/411 +f 356/1234/412 357/1236/412 389/1259/412 388/1257/412 +f 343/1235/413 344/1237/413 376/1260/413 375/1258/413 +f 357/1236/414 358/1238/414 390/1261/414 389/1259/414 +f 344/1237/415 345/1239/415 377/1262/415 376/1260/415 +f 358/1238/416 359/1240/416 391/1263/416 390/1261/416 +f 345/1239/417 346/1241/417 378/1264/417 377/1262/417 +f 332/1223/418 333/1242/418 365/1265/418 364/1266/418 +f 359/1240/419 360/1243/419 392/1267/419 391/1263/419 +f 346/1241/420 347/1244/420 379/1268/420 378/1264/420 +f 333/1242/421 334/1245/421 366/1269/421 365/1265/421 +f 360/1243/422 361/1246/422 393/1270/422 392/1267/422 +f 347/1244/423 348/1216/423 380/1271/423 379/1268/423 +f 334/1245/424 335/1218/424 367/1272/424 366/1269/424 +f 361/1246/425 362/1220/425 394/1273/425 393/1270/425 +f 348/1216/426 349/1215/426 381/1274/426 380/1271/426 +f 335/1218/427 336/1217/427 368/1275/427 367/1272/427 +f 362/1220/428 363/1219/428 395/1276/428 394/1273/428 +f 349/1215/429 350/1221/429 382/1277/429 381/1274/429 +f 336/1217/430 337/1222/430 369/1278/430 368/1275/430 +f 363/1219/431 332/1223/431 364/1266/431 395/1276/431 +f 350/1221/432 351/1224/432 383/1248/432 382/1277/432 +f 337/1222/433 338/1225/433 370/1250/433 369/1278/433 +f 290/1152/58 289/1151/58 417/1279/58 418/1280/58 +f 277/1156/71 276/1155/71 404/1281/71 405/1282/71 +f 291/1159/57 290/1152/57 418/1280/57 419/1283/57 +f 278/1161/70 277/1156/70 405/1282/70 406/1284/70 +f 292/1163/56 291/1159/56 419/1283/56 420/1285/56 +f 279/1165/69 278/1161/69 406/1284/69 407/1286/69 +f 293/1167/55 292/1163/55 420/1285/55 421/1287/55 +f 280/1169/68 279/1165/68 407/1286/68 408/1288/68 +f 294/1171/54 293/1167/54 421/1287/54 422/1289/54 +f 281/1173/67 280/1169/67 408/1288/67 409/1290/67 +f 295/1175/53 294/1171/53 422/1289/53 423/1291/53 +f 282/1177/66 281/1173/66 409/1290/66 410/1292/66 +f 269/1180/79 268/1179/79 396/1293/79 397/1294/79 +f 296/1183/52 295/1175/52 423/1291/52 424/1295/52 +f 283/1185/65 282/1177/65 410/1292/65 411/1296/65 +f 270/1187/78 269/1180/78 397/1294/78 398/1297/78 +f 297/1189/51 296/1183/51 424/1295/51 425/1298/51 +f 284/1191/64 283/1185/64 411/1296/64 412/1299/64 +f 271/1193/77 270/1187/77 398/1297/77 399/1300/77 +f 298/1195/50 297/1189/50 425/1298/50 426/1301/50 +f 285/1197/63 284/1191/63 412/1299/63 413/1302/63 +f 272/1199/76 271/1193/76 399/1300/76 400/1303/76 +f 299/1201/49 298/1195/49 426/1301/49 427/1304/49 +f 286/1203/62 285/1197/62 413/1302/62 414/1305/62 +f 273/1205/75 272/1199/75 400/1303/75 401/1306/75 +f 268/1179/48 299/1201/48 427/1304/48 396/1293/48 +f 287/1207/61 286/1203/61 414/1305/61 415/1307/61 +f 274/1209/74 273/1205/74 401/1306/74 402/1308/74 +f 288/1211/60 287/1207/60 415/1307/60 416/1309/60 +f 275/1213/73 274/1209/73 402/1308/73 403/1310/73 +f 289/1151/59 288/1211/59 416/1309/59 417/1279/59 +f 276/1155/72 275/1213/72 403/1310/72 404/1281/72 +f 554/1311/338 555/1312/338 587/1313/338 586/1314/338 +f 541/1315/434 542/1316/434 574/1317/434 573/1318/434 +f 555/1312/340 556/1319/340 588/1320/340 587/1313/340 +f 542/1316/341 543/1321/341 575/1322/341 574/1317/341 +f 556/1319/435 557/1323/435 589/1324/435 588/1320/435 +f 543/1321/343 544/1325/343 576/1326/343 575/1322/343 +f 557/1323/344 558/1327/344 590/1328/344 589/1324/344 +f 544/1325/345 545/1329/345 577/1330/345 576/1326/345 +f 558/1327/346 559/1331/346 591/1332/346 590/1328/346 +f 545/1329/347 546/1333/347 578/1334/347 577/1330/347 +f 559/1331/348 560/1335/348 592/1336/348 591/1332/348 +f 546/1333/349 547/1337/349 579/1338/349 578/1334/349 +f 533/1339/350 534/1340/350 566/1341/350 565/1342/350 +f 560/1335/351 561/1343/351 593/1344/351 592/1336/351 +f 547/1337/352 548/1345/352 580/1346/352 579/1338/352 +f 534/1340/353 535/1347/353 567/1348/353 566/1341/353 +f 561/1343/354 562/1349/354 594/1350/354 593/1344/354 +f 548/1345/355 549/1351/355 581/1352/355 580/1346/355 +f 535/1347/356 536/1353/356 568/1354/356 567/1348/356 +f 562/1349/357 563/1355/357 595/1356/357 594/1350/357 +f 549/1351/358 550/1357/358 582/1358/358 581/1352/358 +f 536/1353/359 537/1359/359 569/1360/359 568/1354/359 +f 563/1355/360 564/1361/360 596/1362/360 595/1356/360 +f 550/1357/361 551/1363/361 583/1364/361 582/1358/361 +f 537/1359/362 538/1365/362 570/1366/362 569/1360/362 +f 564/1361/363 533/1339/363 565/1342/363 596/1362/363 +f 551/1363/364 552/1367/364 584/1368/364 583/1364/364 +f 538/1365/365 539/1369/365 571/1370/365 570/1366/365 +f 552/1367/366 553/1371/366 585/1372/366 584/1368/366 +f 539/1369/367 540/1373/367 572/1374/367 571/1370/367 +f 553/1371/368 554/1311/368 586/1314/368 585/1372/368 +f 540/1373/369 541/1315/369 573/1318/369 572/1374/369 +f 581/1352/370 582/1358/370 614/1375/370 613/1376/370 +f 568/1354/371 569/1360/371 601/1377/371 600/1378/371 +f 595/1356/372 596/1362/372 628/1379/372 627/1380/372 +f 582/1358/373 583/1364/373 615/1381/373 614/1375/373 +f 569/1360/374 570/1366/374 602/1382/374 601/1377/374 +f 596/1362/375 565/1342/375 597/1383/375 628/1379/375 +f 583/1364/376 584/1368/376 616/1384/376 615/1381/376 +f 570/1366/377 571/1370/377 603/1385/377 602/1382/377 +f 584/1368/378 585/1372/378 617/1386/378 616/1384/378 +f 571/1370/379 572/1374/379 604/1387/379 603/1385/379 +f 585/1372/380 586/1314/380 618/1388/380 617/1386/380 +f 572/1374/381 573/1318/381 605/1389/381 604/1387/381 +f 586/1314/382 587/1313/382 619/1390/382 618/1388/382 +f 573/1318/383 574/1317/383 606/1391/383 605/1389/383 +f 587/1313/384 588/1320/384 620/1392/384 619/1390/384 +f 574/1317/385 575/1322/385 607/1393/385 606/1391/385 +f 588/1320/386 589/1324/386 621/1394/386 620/1392/386 +f 575/1322/387 576/1326/387 608/1395/387 607/1393/387 +f 589/1324/388 590/1328/388 622/1396/388 621/1394/388 +f 576/1326/389 577/1330/389 609/1397/389 608/1395/389 +f 590/1328/390 591/1332/390 623/1398/390 622/1396/390 +f 577/1330/391 578/1334/391 610/1399/391 609/1397/391 +f 591/1332/392 592/1336/392 624/1400/392 623/1398/392 +f 578/1334/393 579/1338/393 611/1401/393 610/1399/393 +f 565/1342/394 566/1341/394 598/1402/394 597/1383/394 +f 592/1336/395 593/1344/395 625/1403/395 624/1400/395 +f 579/1338/396 580/1346/396 612/1404/396 611/1401/396 +f 566/1341/397 567/1348/397 599/1405/397 598/1402/397 +f 593/1344/398 594/1350/398 626/1406/398 625/1403/398 +f 580/1346/399 581/1352/399 613/1376/399 612/1404/399 +f 567/1348/400 568/1354/400 600/1378/400 599/1405/400 +f 594/1350/401 595/1356/401 627/1380/401 626/1406/401 +f 616/1384/402 617/1386/402 649/1407/402 648/1408/402 +f 603/1385/403 604/1387/403 636/1409/403 635/1410/403 +f 617/1386/404 618/1388/404 650/1411/404 649/1407/404 +f 604/1387/405 605/1389/405 637/1412/405 636/1409/405 +f 618/1388/406 619/1390/406 651/1413/406 650/1411/406 +f 605/1389/407 606/1391/407 638/1414/407 637/1412/407 +f 619/1390/408 620/1392/408 652/1415/408 651/1413/408 +f 606/1391/409 607/1393/409 639/1416/409 638/1414/409 +f 620/1392/410 621/1394/410 653/1417/410 652/1415/410 +f 607/1393/411 608/1395/411 640/1418/411 639/1416/411 +f 621/1394/412 622/1396/412 654/1419/412 653/1417/412 +f 608/1395/413 609/1397/413 641/1420/413 640/1418/413 +f 622/1396/414 623/1398/414 655/1421/414 654/1419/414 +f 609/1397/415 610/1399/415 642/1422/415 641/1420/415 +f 623/1398/416 624/1400/416 656/1423/416 655/1421/416 +f 610/1399/417 611/1401/417 643/1424/417 642/1422/417 +f 597/1383/418 598/1402/418 630/1425/418 629/1426/418 +f 624/1400/419 625/1403/419 657/1427/419 656/1423/419 +f 611/1401/420 612/1404/420 644/1428/420 643/1424/420 +f 598/1402/421 599/1405/421 631/1429/421 630/1425/421 +f 625/1403/422 626/1406/422 658/1430/422 657/1427/422 +f 612/1404/423 613/1376/423 645/1431/423 644/1428/423 +f 599/1405/424 600/1378/424 632/1432/424 631/1429/424 +f 626/1406/425 627/1380/425 659/1433/425 658/1430/425 +f 613/1376/426 614/1375/426 646/1434/426 645/1431/426 +f 600/1378/427 601/1377/427 633/1435/427 632/1432/427 +f 627/1380/428 628/1379/428 660/1436/428 659/1433/428 +f 614/1375/429 615/1381/429 647/1437/429 646/1434/429 +f 601/1377/430 602/1382/430 634/1438/430 633/1435/430 +f 628/1379/431 597/1383/431 629/1426/431 660/1436/431 +f 615/1381/432 616/1384/432 648/1408/432 647/1437/432 +f 602/1382/433 603/1385/433 635/1410/433 634/1438/433 +f 555/1312/58 554/1311/58 682/1439/58 683/1440/58 +f 542/1316/71 541/1315/71 669/1441/71 670/1442/71 +f 556/1319/57 555/1312/57 683/1440/57 684/1443/57 +f 543/1321/70 542/1316/70 670/1442/70 671/1444/70 +f 557/1323/56 556/1319/56 684/1443/56 685/1445/56 +f 544/1325/69 543/1321/69 671/1444/69 672/1446/69 +f 558/1327/55 557/1323/55 685/1445/55 686/1447/55 +f 545/1329/68 544/1325/68 672/1446/68 673/1448/68 +f 559/1331/54 558/1327/54 686/1447/54 687/1449/54 +f 546/1333/67 545/1329/67 673/1448/67 674/1450/67 +f 560/1335/53 559/1331/53 687/1449/53 688/1451/53 +f 547/1337/66 546/1333/66 674/1450/66 675/1452/66 +f 534/1340/79 533/1339/79 661/1453/79 662/1454/79 +f 561/1343/52 560/1335/52 688/1451/52 689/1455/52 +f 548/1345/65 547/1337/65 675/1452/65 676/1456/65 +f 535/1347/78 534/1340/78 662/1454/78 663/1457/78 +f 562/1349/51 561/1343/51 689/1455/51 690/1458/51 +f 549/1351/64 548/1345/64 676/1456/64 677/1459/64 +f 536/1353/77 535/1347/77 663/1457/77 664/1460/77 +f 563/1355/50 562/1349/50 690/1458/50 691/1461/50 +f 550/1357/63 549/1351/63 677/1459/63 678/1462/63 +f 537/1359/76 536/1353/76 664/1460/76 665/1463/76 +f 564/1361/49 563/1355/49 691/1461/49 692/1464/49 +f 551/1363/62 550/1357/62 678/1462/62 679/1465/62 +f 538/1365/75 537/1359/75 665/1463/75 666/1466/75 +f 533/1339/48 564/1361/48 692/1464/48 661/1453/48 +f 552/1367/61 551/1363/61 679/1465/61 680/1467/61 +f 539/1369/74 538/1365/74 666/1466/74 667/1468/74 +f 553/1371/60 552/1367/60 680/1467/60 681/1469/60 +f 540/1373/73 539/1369/73 667/1468/73 668/1470/73 +f 554/1311/59 553/1371/59 681/1469/59 682/1439/59 +f 541/1315/72 540/1373/72 668/1470/72 669/1441/72 +f 414/1305/436 413/1302/436 720/1471/436 721/1472/436 +f 401/1306/437 400/1303/437 707/1473/437 708/1474/437 +f 396/1293/438 427/1304/438 734/1475/438 703/1476/438 +f 415/1307/439 414/1305/439 721/1472/439 722/1477/439 +f 402/1308/440 401/1306/440 708/1474/440 709/1478/440 +f 416/1309/441 415/1307/441 722/1477/441 723/1479/441 +f 403/1310/442 402/1308/442 709/1478/442 710/1480/442 +f 417/1279/443 416/1309/443 723/1479/443 724/1481/443 +f 404/1281/444 403/1310/444 710/1480/444 711/1482/444 +f 418/1280/445 417/1279/445 724/1481/445 725/1483/445 +f 405/1282/446 404/1281/446 711/1482/446 712/1484/446 +f 419/1283/447 418/1280/447 725/1483/447 726/1485/447 +f 406/1284/448 405/1282/448 712/1484/448 713/1486/448 +f 420/1285/449 419/1283/449 726/1485/449 727/1487/449 +f 407/1286/450 406/1284/450 713/1486/450 714/1488/450 +f 421/1287/451 420/1285/451 727/1487/451 728/1489/451 +f 408/1288/452 407/1286/452 714/1488/452 715/1490/452 +f 422/1289/453 421/1287/453 728/1489/453 729/1491/453 +f 409/1290/454 408/1288/454 715/1490/454 716/1492/454 +f 423/1291/455 422/1289/455 729/1491/455 730/1493/455 +f 410/1292/456 409/1290/456 716/1492/456 717/1494/456 +f 397/1294/457 396/1293/457 703/1476/457 704/1495/457 +f 424/1295/458 423/1291/458 730/1493/458 731/1496/458 +f 411/1296/459 410/1292/459 717/1494/459 718/1497/459 +f 398/1297/460 397/1294/460 704/1495/460 705/1498/460 +f 425/1298/461 424/1295/461 731/1496/461 732/1499/461 +f 412/1299/462 411/1296/462 718/1497/462 719/1500/462 +f 399/1300/463 398/1297/463 705/1498/463 706/1501/463 +f 426/1301/464 425/1298/464 732/1499/464 733/1502/464 +f 413/1302/465 412/1299/465 719/1500/465 720/1471/465 +f 400/1303/466 399/1300/466 706/1501/466 707/1473/466 +f 427/1304/467 426/1301/467 733/1502/467 734/1475/467 +f 704/1495/25 703/1476/25 734/1475/25 733/1502/25 732/1499/25 731/1496/25 730/1493/25 729/1491/25 728/1489/25 727/1487/25 726/1485/25 725/1483/25 724/1481/25 723/1479/25 722/1477/25 721/1472/25 720/1471/25 719/1500/25 718/1497/25 717/1494/25 716/1492/25 715/1490/25 714/1488/25 713/1486/25 712/1484/25 711/1482/25 710/1480/25 709/1478/25 708/1474/25 707/1473/25 706/1501/25 705/1498/25 +f 869/1503/51 870/1504/51 872/1505/51 871/1506/51 +f 802/1507/21 735/1508/21 862/1509/21 860/1510/21 858/1511/21 856/1512/21 854/1513/21 852/1514/21 850/1515/21 848/1516/21 846/1517/21 844/1518/21 842/1519/21 840/1520/21 838/1521/21 836/1522/21 834/1523/21 832/1524/21 830/1525/21 828/1526/21 826/1527/21 824/1528/21 822/1529/21 820/1530/21 818/1531/21 816/1532/21 814/1533/21 812/1534/21 810/1535/21 808/1536/21 806/1537/21 804/1538/21 +f 864/1539/25 865/1540/25 867/1541/25 869/1542/25 871/1543/25 873/1544/25 875/1545/25 877/1546/25 879/1547/25 881/1548/25 883/1549/25 885/1550/25 887/1551/25 889/1552/25 891/1553/25 893/1554/25 895/1555/25 897/1556/25 899/1557/25 901/1558/25 903/1559/25 905/1560/25 907/1561/25 909/1562/25 911/1563/25 913/1564/25 915/1565/25 917/1566/25 919/1567/25 921/1568/25 923/1569/25 925/1570/25 +f 857/1571/77 858/1572/77 860/1573/77 859/1574/77 +f 873/1575/53 874/1576/53 876/1577/53 875/1578/53 +f 855/1579/76 856/1580/76 858/1572/76 857/1571/76 +f 875/1578/54 876/1577/54 878/1581/54 877/1582/54 +f 853/1583/75 854/1584/75 856/1580/75 855/1579/75 +f 877/1582/55 878/1581/55 880/1585/55 879/1586/55 +f 851/1587/74 852/1588/74 854/1584/74 853/1583/74 +f 879/1586/56 880/1585/56 882/1589/56 881/1590/56 +f 849/1591/73 850/1592/73 852/1588/73 851/1587/73 +f 881/1590/57 882/1589/57 884/1593/57 883/1594/57 +f 847/1595/72 848/1596/72 850/1592/72 849/1591/72 +f 883/1594/58 884/1593/58 886/1597/58 885/1598/58 +f 845/1599/71 846/1600/71 848/1596/71 847/1595/71 +f 885/1598/59 886/1597/59 888/1601/59 887/1602/59 +f 843/1603/70 844/1604/70 846/1600/70 845/1599/70 +f 887/1602/60 888/1601/60 890/1605/60 889/1606/60 +f 841/1607/69 842/1608/69 844/1604/69 843/1603/69 +f 889/1606/61 890/1605/61 892/1609/61 891/1610/61 +f 839/1611/68 840/1612/68 842/1608/68 841/1607/68 +f 891/1610/62 892/1609/62 894/1613/62 893/1614/62 +f 837/1615/67 838/1616/67 840/1612/67 839/1611/67 +f 893/1614/63 894/1613/63 896/1617/63 895/1618/63 +f 835/1619/66 836/1620/66 838/1616/66 837/1615/66 +f 895/1618/64 896/1617/64 898/1621/64 897/1622/64 +f 833/1623/65 834/1624/65 836/1620/65 835/1619/65 +f 897/1622/65 898/1621/65 900/1625/65 899/1626/65 +f 831/1627/64 832/1628/64 834/1624/64 833/1623/64 +f 899/1626/66 900/1625/66 902/1629/66 901/1630/66 +f 829/1631/63 830/1632/63 832/1628/63 831/1627/63 +f 901/1630/67 902/1629/67 904/1633/67 903/1634/67 +f 827/1635/62 828/1636/62 830/1632/62 829/1631/62 +f 903/1634/68 904/1633/68 906/1637/68 905/1638/68 +f 825/1639/61 826/1640/61 828/1636/61 827/1635/61 +f 905/1638/69 906/1637/69 908/1641/69 907/1642/69 +f 823/1643/60 824/1644/60 826/1640/60 825/1639/60 +f 907/1642/70 908/1641/70 910/1645/70 909/1646/70 +f 821/1647/59 822/1648/59 824/1644/59 823/1643/59 +f 909/1646/71 910/1645/71 912/1649/71 911/1650/71 +f 819/1651/58 820/1652/58 822/1648/58 821/1647/58 +f 911/1650/72 912/1649/72 914/1653/72 913/1654/72 +f 817/1655/57 818/1656/57 820/1652/57 819/1651/57 +f 913/1654/73 914/1653/73 916/1657/73 915/1658/73 +f 815/1659/56 816/1660/56 818/1656/56 817/1655/56 +f 915/1658/74 916/1657/74 918/1661/74 917/1662/74 +f 813/1663/55 814/1664/55 816/1660/55 815/1659/55 +f 917/1662/75 918/1661/75 920/1665/75 919/1666/75 +f 811/1667/54 812/1668/54 814/1664/54 813/1663/54 +f 919/1666/76 920/1665/76 922/1669/76 921/1670/76 +f 809/1671/53 810/1672/53 812/1668/53 811/1667/53 +f 921/1670/77 922/1669/77 924/1673/77 923/1674/77 +f 807/1675/52 808/1676/52 810/1672/52 809/1671/52 +f 866/1677/21 863/1678/21 926/1679/21 924/1680/21 922/1681/21 920/1682/21 918/1683/21 916/1684/21 914/1685/21 912/1686/21 910/1687/21 908/1688/21 906/1689/21 904/1690/21 902/1691/21 900/1692/21 898/1693/21 896/1694/21 894/1695/21 892/1696/21 890/1697/21 888/1698/21 886/1699/21 884/1700/21 882/1701/21 880/1702/21 878/1703/21 876/1704/21 874/1705/21 872/1706/21 870/1707/21 868/1708/21 +f 805/1709/51 806/1710/51 808/1676/51 807/1675/51 +f 736/1711/25 801/1712/25 803/1713/25 805/1714/25 807/1715/25 809/1716/25 811/1717/25 813/1718/25 815/1719/25 817/1720/25 819/1721/25 821/1722/25 823/1723/25 825/1724/25 827/1725/25 829/1726/25 831/1727/25 833/1728/25 835/1729/25 837/1730/25 839/1731/25 841/1732/25 843/1733/25 845/1734/25 847/1735/25 849/1736/25 851/1737/25 853/1738/25 855/1739/25 857/1740/25 859/1741/25 861/1742/25 +f 803/1743/50 804/1744/50 806/1710/50 805/1709/50 +f 861/1745/79 862/1746/79 735/1747/79 736/1748/79 +f 801/1749/49 802/1750/49 804/1744/49 803/1743/49 +f 736/1751/48 735/1752/48 802/1750/48 801/1749/48 +f 871/1506/52 872/1505/52 874/1576/52 873/1575/52 +f 859/1574/78 860/1573/78 862/1746/78 861/1745/78 +f 867/1753/50 868/1754/50 870/1504/50 869/1503/50 +f 925/1755/79 926/1756/79 863/1757/79 864/1758/79 +f 865/1759/49 866/1760/49 868/1754/49 867/1753/49 +f 864/1761/48 863/1762/48 866/1760/48 865/1759/48 +f 923/1674/78 924/1673/78 926/1756/78 925/1755/78 +f 686/1447/468 685/1445/468 973/1763/468 974/1764/468 +f 673/1448/469 672/1446/469 960/1765/469 961/1766/469 +f 687/1449/470 686/1447/470 974/1764/470 975/1767/470 +f 674/1450/471 673/1448/471 961/1766/471 962/1768/471 +f 688/1451/472 687/1449/472 975/1767/472 976/1769/472 +f 675/1452/473 674/1450/473 962/1768/473 963/1770/473 +f 662/1454/474 661/1453/474 949/1771/474 950/1772/474 +f 689/1455/475 688/1451/475 976/1769/475 977/1773/475 +f 676/1456/476 675/1452/476 963/1770/476 964/1774/476 +f 663/1457/477 662/1454/477 950/1772/477 951/1775/477 +f 690/1458/478 689/1455/478 977/1773/478 978/1776/478 +f 677/1459/479 676/1456/479 964/1774/479 965/1777/479 +f 664/1460/480 663/1457/480 951/1775/480 952/1778/480 +f 691/1461/481 690/1458/481 978/1776/481 979/1779/481 +f 678/1462/482 677/1459/482 965/1777/482 966/1780/482 +f 665/1463/483 664/1460/483 952/1778/483 953/1781/483 +f 692/1464/484 691/1461/484 979/1779/484 980/1782/484 +f 679/1465/485 678/1462/485 966/1780/485 967/1783/485 +f 666/1466/486 665/1463/486 953/1781/486 954/1784/486 +f 661/1453/487 692/1464/487 980/1782/487 949/1771/487 +f 680/1467/488 679/1465/488 967/1783/488 968/1785/488 +f 667/1468/489 666/1466/489 954/1784/489 955/1786/489 +f 681/1469/490 680/1467/490 968/1785/490 969/1787/490 +f 668/1470/491 667/1468/491 955/1786/491 956/1788/491 +f 682/1439/492 681/1469/492 969/1787/492 970/1789/492 +f 669/1441/493 668/1470/493 956/1788/493 957/1790/493 +f 683/1440/494 682/1439/494 970/1789/494 971/1791/494 +f 670/1442/495 669/1441/495 957/1790/495 958/1792/495 +f 684/1443/496 683/1440/496 971/1791/496 972/1793/496 +f 671/1444/497 670/1442/497 958/1792/497 959/1794/497 +f 685/1445/498 684/1443/498 972/1793/498 973/1763/498 +f 672/1446/499 671/1444/499 959/1794/499 960/1765/499 +f 950/1772/25 949/1771/25 980/1782/25 979/1779/25 978/1776/25 977/1773/25 976/1769/25 975/1767/25 974/1764/25 973/1763/25 972/1793/25 971/1791/25 970/1789/25 969/1787/25 968/1785/25 967/1783/25 966/1780/25 965/1777/25 964/1774/25 963/1770/25 962/1768/25 961/1766/25 960/1765/25 959/1794/25 958/1792/25 957/1790/25 956/1788/25 955/1786/25 954/1784/25 953/1781/25 952/1778/25 951/1775/25 +f 998/1149/335 990/1150/335 993/585/335 994/871/335 1003/873/335 1004/872/335 989/897/335 997/898/335 +f 1000/632/336 998/1149/336 997/898/336 1009/879/336 999/878/336 +f 989/897/500 1022/366/500 1046/346/500 1024/899/500 997/898/500 +f 1287/1795/501 1319/1796/501 1320/1797/501 1288/1798/501 +f 1274/1799/502 1306/1800/502 1307/1801/502 1275/1802/502 +f 1288/1798/503 1320/1797/503 1321/1803/503 1289/1804/503 +f 1275/1802/504 1307/1801/504 1308/1805/504 1276/1806/504 +f 1289/1804/505 1321/1803/505 1322/1807/505 1290/1808/505 +f 1276/1806/506 1308/1805/506 1309/1809/506 1277/1810/506 +f 1290/1808/507 1322/1807/507 1323/1811/507 1291/1812/507 +f 1277/1810/508 1309/1809/508 1310/1813/508 1278/1814/508 +f 1291/1812/509 1323/1811/509 1324/1815/509 1292/1816/509 +f 1278/1814/510 1310/1813/510 1311/1817/510 1279/1818/510 +f 1292/1816/511 1324/1815/511 1325/1819/511 1293/1820/511 +f 1279/1818/512 1311/1817/512 1312/1821/512 1280/1822/512 +f 1266/1823/513 1298/1824/513 1299/1825/513 1267/1826/513 +f 1293/1820/514 1325/1819/514 1326/1827/514 1294/1828/514 +f 1280/1822/515 1312/1821/515 1313/1829/515 1281/1830/515 +f 1267/1826/516 1299/1825/516 1300/1831/516 1268/1832/516 +f 1294/1828/517 1326/1827/517 1327/1833/517 1295/1834/517 +f 1281/1830/518 1313/1829/518 1314/1835/518 1282/1836/518 +f 1268/1832/519 1300/1831/519 1301/1837/519 1269/1838/519 +f 1295/1834/520 1327/1833/520 1328/1839/520 1296/1840/520 +f 1282/1836/521 1314/1835/521 1315/1841/521 1283/1842/521 +f 1269/1838/522 1301/1837/522 1302/1843/522 1270/1844/522 +f 1296/1840/523 1328/1839/523 1329/1845/523 1297/1846/523 +f 1283/1842/524 1315/1841/524 1316/1847/524 1284/1848/524 +f 1270/1844/525 1302/1843/525 1303/1849/525 1271/1850/525 +f 1297/1846/526 1329/1845/526 1298/1824/526 1266/1823/526 +f 1284/1848/527 1316/1847/527 1317/1851/527 1285/1852/527 +f 1271/1850/528 1303/1849/528 1304/1853/528 1272/1854/528 +f 1285/1852/529 1317/1851/529 1318/1855/529 1286/1856/529 +f 1272/1854/530 1304/1853/530 1305/1857/530 1273/1858/530 +f 1286/1856/531 1318/1855/531 1319/1796/531 1287/1795/531 +f 1273/1858/532 1305/1857/532 1306/1800/532 1274/1799/532 +f 1314/1835/533 1346/1859/533 1347/1860/533 1315/1841/533 +f 1301/1837/534 1333/1861/534 1334/1862/534 1302/1843/534 +f 1328/1839/535 1360/1863/535 1361/1864/535 1329/1845/535 +f 1315/1841/536 1347/1860/536 1348/1865/536 1316/1847/536 +f 1302/1843/537 1334/1862/537 1335/1866/537 1303/1849/537 +f 1329/1845/538 1361/1864/538 1330/1867/538 1298/1824/538 +f 1316/1847/539 1348/1865/539 1349/1868/539 1317/1851/539 +f 1303/1849/540 1335/1866/540 1336/1869/540 1304/1853/540 +f 1317/1851/541 1349/1868/541 1350/1870/541 1318/1855/541 +f 1304/1853/542 1336/1869/542 1337/1871/542 1305/1857/542 +f 1318/1855/543 1350/1870/543 1351/1872/543 1319/1796/543 +f 1305/1857/544 1337/1871/544 1338/1873/544 1306/1800/544 +f 1319/1796/545 1351/1872/545 1352/1874/545 1320/1797/545 +f 1306/1800/546 1338/1873/546 1339/1875/546 1307/1801/546 +f 1320/1797/547 1352/1874/547 1353/1876/547 1321/1803/547 +f 1307/1801/548 1339/1875/548 1340/1877/548 1308/1805/548 +f 1321/1803/549 1353/1876/549 1354/1878/549 1322/1807/549 +f 1308/1805/550 1340/1877/550 1341/1879/550 1309/1809/550 +f 1322/1807/551 1354/1878/551 1355/1880/551 1323/1811/551 +f 1309/1809/552 1341/1879/552 1342/1881/552 1310/1813/552 +f 1323/1811/553 1355/1880/553 1356/1882/553 1324/1815/553 +f 1310/1813/554 1342/1881/554 1343/1883/554 1311/1817/554 +f 1324/1815/555 1356/1882/555 1357/1884/555 1325/1819/555 +f 1311/1817/556 1343/1883/556 1344/1885/556 1312/1821/556 +f 1298/1824/557 1330/1867/557 1331/1886/557 1299/1825/557 +f 1325/1819/558 1357/1884/558 1358/1887/558 1326/1827/558 +f 1312/1821/559 1344/1885/559 1345/1888/559 1313/1829/559 +f 1299/1825/560 1331/1886/560 1332/1889/560 1300/1831/560 +f 1326/1827/561 1358/1887/561 1359/1890/561 1327/1833/561 +f 1313/1829/562 1345/1888/562 1346/1859/562 1314/1835/562 +f 1300/1831/563 1332/1889/563 1333/1861/563 1301/1837/563 +f 1327/1833/564 1359/1890/564 1360/1863/564 1328/1839/564 +f 1349/1868/565 1381/1891/565 1382/1892/565 1350/1870/565 +f 1336/1869/566 1368/1893/566 1369/1894/566 1337/1871/566 +f 1350/1870/567 1382/1892/567 1383/1895/567 1351/1872/567 +f 1337/1871/568 1369/1894/568 1370/1896/568 1338/1873/568 +f 1351/1872/569 1383/1895/569 1384/1897/569 1352/1874/569 +f 1338/1873/570 1370/1896/570 1371/1898/570 1339/1875/570 +f 1352/1874/571 1384/1897/571 1385/1899/571 1353/1876/571 +f 1339/1875/572 1371/1898/572 1372/1900/572 1340/1877/572 +f 1353/1876/573 1385/1899/573 1386/1901/573 1354/1878/573 +f 1340/1877/574 1372/1900/574 1373/1902/574 1341/1879/574 +f 1354/1878/575 1386/1901/575 1387/1903/575 1355/1880/575 +f 1341/1879/576 1373/1902/576 1374/1904/576 1342/1881/576 +f 1355/1880/577 1387/1903/577 1388/1905/577 1356/1882/577 +f 1342/1881/578 1374/1904/578 1375/1906/578 1343/1883/578 +f 1356/1882/579 1388/1905/579 1389/1907/579 1357/1884/579 +f 1343/1883/580 1375/1906/580 1376/1908/580 1344/1885/580 +f 1330/1867/581 1362/1909/581 1363/1910/581 1331/1886/581 +f 1357/1884/582 1389/1907/582 1390/1911/582 1358/1887/582 +f 1344/1885/583 1376/1908/583 1377/1912/583 1345/1888/583 +f 1331/1886/584 1363/1910/584 1364/1913/584 1332/1889/584 +f 1358/1887/585 1390/1911/585 1391/1914/585 1359/1890/585 +f 1345/1888/586 1377/1912/586 1378/1915/586 1346/1859/586 +f 1332/1889/587 1364/1913/587 1365/1916/587 1333/1861/587 +f 1359/1890/588 1391/1914/588 1392/1917/588 1360/1863/588 +f 1346/1859/589 1378/1915/589 1379/1918/589 1347/1860/589 +f 1333/1861/590 1365/1916/590 1366/1919/590 1334/1862/590 +f 1360/1863/591 1392/1917/591 1393/1920/591 1361/1864/591 +f 1347/1860/592 1379/1918/592 1380/1921/592 1348/1865/592 +f 1334/1862/593 1366/1919/593 1367/1922/593 1335/1866/593 +f 1361/1864/594 1393/1920/594 1362/1909/594 1330/1867/594 +f 1348/1865/595 1380/1921/595 1381/1891/595 1349/1868/595 +f 1335/1866/596 1367/1922/596 1368/1893/596 1336/1869/596 +f 1288/1798/58 1416/1923/58 1415/1924/58 1287/1795/58 +f 1275/1802/71 1403/1925/71 1402/1926/71 1274/1799/71 +f 1289/1804/57 1417/1927/57 1416/1923/57 1288/1798/57 +f 1276/1806/70 1404/1928/70 1403/1925/70 1275/1802/70 +f 1290/1808/56 1418/1929/56 1417/1927/56 1289/1804/56 +f 1277/1810/69 1405/1930/69 1404/1928/69 1276/1806/69 +f 1291/1812/55 1419/1931/55 1418/1929/55 1290/1808/55 +f 1278/1814/68 1406/1932/68 1405/1930/68 1277/1810/68 +f 1292/1816/54 1420/1933/54 1419/1931/54 1291/1812/54 +f 1279/1818/67 1407/1934/67 1406/1932/67 1278/1814/67 +f 1293/1820/53 1421/1935/53 1420/1933/53 1292/1816/53 +f 1280/1822/66 1408/1936/66 1407/1934/66 1279/1818/66 +f 1267/1826/79 1395/1937/79 1394/1938/79 1266/1823/79 +f 1294/1828/52 1422/1939/52 1421/1935/52 1293/1820/52 +f 1281/1830/65 1409/1940/65 1408/1936/65 1280/1822/65 +f 1268/1832/78 1396/1941/78 1395/1937/78 1267/1826/78 +f 1295/1834/51 1423/1942/51 1422/1939/51 1294/1828/51 +f 1282/1836/64 1410/1943/64 1409/1940/64 1281/1830/64 +f 1269/1838/77 1397/1944/77 1396/1941/77 1268/1832/77 +f 1296/1840/50 1424/1945/50 1423/1942/50 1295/1834/50 +f 1283/1842/63 1411/1946/63 1410/1943/63 1282/1836/63 +f 1270/1844/76 1398/1947/76 1397/1944/76 1269/1838/76 +f 1297/1846/49 1425/1948/49 1424/1945/49 1296/1840/49 +f 1284/1848/62 1412/1949/62 1411/1946/62 1283/1842/62 +f 1271/1850/75 1399/1950/75 1398/1947/75 1270/1844/75 +f 1266/1823/48 1394/1938/48 1425/1948/48 1297/1846/48 +f 1285/1852/61 1413/1951/61 1412/1949/61 1284/1848/61 +f 1272/1854/74 1400/1952/74 1399/1950/74 1271/1850/74 +f 1286/1856/60 1414/1953/60 1413/1951/60 1285/1852/60 +f 1273/1858/73 1401/1954/73 1400/1952/73 1272/1854/73 +f 1287/1795/59 1415/1924/59 1414/1953/59 1286/1856/59 +f 1274/1799/72 1402/1926/72 1401/1954/72 1273/1858/72 +f 1552/1955/501 1584/1956/501 1585/1957/501 1553/1958/501 +f 1539/1959/597 1571/1960/597 1572/1961/597 1540/1962/597 +f 1553/1958/503 1585/1957/503 1586/1963/503 1554/1964/503 +f 1540/1962/504 1572/1961/504 1573/1965/504 1541/1966/504 +f 1554/1964/505 1586/1963/505 1587/1967/505 1555/1968/505 +f 1541/1966/506 1573/1965/506 1574/1969/506 1542/1970/506 +f 1555/1968/507 1587/1967/507 1588/1971/507 1556/1972/507 +f 1542/1970/508 1574/1969/508 1575/1973/508 1543/1974/508 +f 1556/1972/509 1588/1971/509 1589/1975/509 1557/1976/509 +f 1543/1974/510 1575/1973/510 1576/1977/510 1544/1978/510 +f 1557/1976/511 1589/1975/511 1590/1979/511 1558/1980/511 +f 1544/1978/512 1576/1977/512 1577/1981/512 1545/1982/512 +f 1531/1983/598 1563/1984/598 1564/1985/598 1532/1986/598 +f 1558/1980/514 1590/1979/514 1591/1987/514 1559/1988/514 +f 1545/1982/515 1577/1981/515 1578/1989/515 1546/1990/515 +f 1532/1986/516 1564/1985/516 1565/1991/516 1533/1992/516 +f 1559/1988/517 1591/1987/517 1592/1993/517 1560/1994/517 +f 1546/1990/518 1578/1989/518 1579/1995/518 1547/1996/518 +f 1533/1992/519 1565/1991/519 1566/1997/519 1534/1998/519 +f 1560/1994/520 1592/1993/520 1593/1999/520 1561/2000/520 +f 1547/1996/521 1579/1995/521 1580/2001/521 1548/2002/521 +f 1534/1998/522 1566/1997/522 1567/2003/522 1535/2004/522 +f 1561/2000/523 1593/1999/523 1594/2005/523 1562/2006/523 +f 1548/2002/524 1580/2001/524 1581/2007/524 1549/2008/524 +f 1535/2004/525 1567/2003/525 1568/2009/525 1536/2010/525 +f 1562/2006/526 1594/2005/526 1563/1984/526 1531/1983/526 +f 1549/2008/527 1581/2007/527 1582/2011/527 1550/2012/527 +f 1536/2010/528 1568/2009/528 1569/2013/528 1537/2014/528 +f 1550/2012/529 1582/2011/529 1583/2015/529 1551/2016/529 +f 1537/2014/530 1569/2013/530 1570/2017/530 1538/2018/530 +f 1551/2016/531 1583/2015/531 1584/1956/531 1552/1955/531 +f 1538/2018/532 1570/2017/532 1571/1960/532 1539/1959/532 +f 1579/1995/533 1611/2019/533 1612/2020/533 1580/2001/533 +f 1566/1997/534 1598/2021/534 1599/2022/534 1567/2003/534 +f 1593/1999/535 1625/2023/535 1626/2024/535 1594/2005/535 +f 1580/2001/536 1612/2020/536 1613/2025/536 1581/2007/536 +f 1567/2003/537 1599/2022/537 1600/2026/537 1568/2009/537 +f 1594/2005/538 1626/2024/538 1595/2027/538 1563/1984/538 +f 1581/2007/539 1613/2025/539 1614/2028/539 1582/2011/539 +f 1568/2009/540 1600/2026/540 1601/2029/540 1569/2013/540 +f 1582/2011/541 1614/2028/541 1615/2030/541 1583/2015/541 +f 1569/2013/542 1601/2029/542 1602/2031/542 1570/2017/542 +f 1583/2015/543 1615/2030/543 1616/2032/543 1584/1956/543 +f 1570/2017/544 1602/2031/544 1603/2033/544 1571/1960/544 +f 1584/1956/545 1616/2032/545 1617/2034/545 1585/1957/545 +f 1571/1960/546 1603/2033/546 1604/2035/546 1572/1961/546 +f 1585/1957/547 1617/2034/547 1618/2036/547 1586/1963/547 +f 1572/1961/548 1604/2035/548 1605/2037/548 1573/1965/548 +f 1586/1963/549 1618/2036/549 1619/2038/549 1587/1967/549 +f 1573/1965/550 1605/2037/550 1606/2039/550 1574/1969/550 +f 1587/1967/551 1619/2038/551 1620/2040/551 1588/1971/551 +f 1574/1969/552 1606/2039/552 1607/2041/552 1575/1973/552 +f 1588/1971/553 1620/2040/553 1621/2042/553 1589/1975/553 +f 1575/1973/554 1607/2041/554 1608/2043/554 1576/1977/554 +f 1589/1975/555 1621/2042/555 1622/2044/555 1590/1979/555 +f 1576/1977/556 1608/2043/556 1609/2045/556 1577/1981/556 +f 1563/1984/557 1595/2027/557 1596/2046/557 1564/1985/557 +f 1590/1979/558 1622/2044/558 1623/2047/558 1591/1987/558 +f 1577/1981/559 1609/2045/559 1610/2048/559 1578/1989/559 +f 1564/1985/560 1596/2046/560 1597/2049/560 1565/1991/560 +f 1591/1987/561 1623/2047/561 1624/2050/561 1592/1993/561 +f 1578/1989/562 1610/2048/562 1611/2019/562 1579/1995/562 +f 1565/1991/563 1597/2049/563 1598/2021/563 1566/1997/563 +f 1592/1993/564 1624/2050/564 1625/2023/564 1593/1999/564 +f 1614/2028/565 1646/2051/565 1647/2052/565 1615/2030/565 +f 1601/2029/566 1633/2053/566 1634/2054/566 1602/2031/566 +f 1615/2030/567 1647/2052/567 1648/2055/567 1616/2032/567 +f 1602/2031/568 1634/2054/568 1635/2056/568 1603/2033/568 +f 1616/2032/569 1648/2055/569 1649/2057/569 1617/2034/569 +f 1603/2033/570 1635/2056/570 1636/2058/570 1604/2035/570 +f 1617/2034/571 1649/2057/571 1650/2059/571 1618/2036/571 +f 1604/2035/572 1636/2058/572 1637/2060/572 1605/2037/572 +f 1618/2036/573 1650/2059/573 1651/2061/573 1619/2038/573 +f 1605/2037/574 1637/2060/574 1638/2062/574 1606/2039/574 +f 1619/2038/575 1651/2061/575 1652/2063/575 1620/2040/575 +f 1606/2039/576 1638/2062/576 1639/2064/576 1607/2041/576 +f 1620/2040/577 1652/2063/577 1653/2065/577 1621/2042/577 +f 1607/2041/578 1639/2064/578 1640/2066/578 1608/2043/578 +f 1621/2042/579 1653/2065/579 1654/2067/579 1622/2044/579 +f 1608/2043/580 1640/2066/580 1641/2068/580 1609/2045/580 +f 1595/2027/581 1627/2069/581 1628/2070/581 1596/2046/581 +f 1622/2044/582 1654/2067/582 1655/2071/582 1623/2047/582 +f 1609/2045/583 1641/2068/583 1642/2072/583 1610/2048/583 +f 1596/2046/584 1628/2070/584 1629/2073/584 1597/2049/584 +f 1623/2047/585 1655/2071/585 1656/2074/585 1624/2050/585 +f 1610/2048/586 1642/2072/586 1643/2075/586 1611/2019/586 +f 1597/2049/587 1629/2073/587 1630/2076/587 1598/2021/587 +f 1624/2050/588 1656/2074/588 1657/2077/588 1625/2023/588 +f 1611/2019/589 1643/2075/589 1644/2078/589 1612/2020/589 +f 1598/2021/590 1630/2076/590 1631/2079/590 1599/2022/590 +f 1625/2023/591 1657/2077/591 1658/2080/591 1626/2024/591 +f 1612/2020/592 1644/2078/592 1645/2081/592 1613/2025/592 +f 1599/2022/593 1631/2079/593 1632/2082/593 1600/2026/593 +f 1626/2024/594 1658/2080/594 1627/2069/594 1595/2027/594 +f 1613/2025/595 1645/2081/595 1646/2051/595 1614/2028/595 +f 1600/2026/596 1632/2082/596 1633/2053/596 1601/2029/596 +f 1553/1958/58 1681/2083/58 1680/2084/58 1552/1955/58 +f 1540/1962/71 1668/2085/71 1667/2086/71 1539/1959/71 +f 1554/1964/57 1682/2087/57 1681/2083/57 1553/1958/57 +f 1541/1966/70 1669/2088/70 1668/2085/70 1540/1962/70 +f 1555/1968/56 1683/2089/56 1682/2087/56 1554/1964/56 +f 1542/1970/69 1670/2090/69 1669/2088/69 1541/1966/69 +f 1556/1972/55 1684/2091/55 1683/2089/55 1555/1968/55 +f 1543/1974/68 1671/2092/68 1670/2090/68 1542/1970/68 +f 1557/1976/54 1685/2093/54 1684/2091/54 1556/1972/54 +f 1544/1978/67 1672/2094/67 1671/2092/67 1543/1974/67 +f 1558/1980/53 1686/2095/53 1685/2093/53 1557/1976/53 +f 1545/1982/66 1673/2096/66 1672/2094/66 1544/1978/66 +f 1532/1986/79 1660/2097/79 1659/2098/79 1531/1983/79 +f 1559/1988/52 1687/2099/52 1686/2095/52 1558/1980/52 +f 1546/1990/65 1674/2100/65 1673/2096/65 1545/1982/65 +f 1533/1992/78 1661/2101/78 1660/2097/78 1532/1986/78 +f 1560/1994/51 1688/2102/51 1687/2099/51 1559/1988/51 +f 1547/1996/64 1675/2103/64 1674/2100/64 1546/1990/64 +f 1534/1998/77 1662/2104/77 1661/2101/77 1533/1992/77 +f 1561/2000/50 1689/2105/50 1688/2102/50 1560/1994/50 +f 1548/2002/63 1676/2106/63 1675/2103/63 1547/1996/63 +f 1535/2004/76 1663/2107/76 1662/2104/76 1534/1998/76 +f 1562/2006/49 1690/2108/49 1689/2105/49 1561/2000/49 +f 1549/2008/62 1677/2109/62 1676/2106/62 1548/2002/62 +f 1536/2010/75 1664/2110/75 1663/2107/75 1535/2004/75 +f 1531/1983/48 1659/2098/48 1690/2108/48 1562/2006/48 +f 1550/2012/61 1678/2111/61 1677/2109/61 1549/2008/61 +f 1537/2014/74 1665/2112/74 1664/2110/74 1536/2010/74 +f 1551/2016/60 1679/2113/60 1678/2111/60 1550/2012/60 +f 1538/2018/73 1666/2114/73 1665/2112/73 1537/2014/73 +f 1552/1955/59 1680/2084/59 1679/2113/59 1551/2016/59 +f 1539/1959/72 1667/2086/72 1666/2114/72 1538/2018/72 +f 1412/1949/599 1721/2115/599 1720/2116/599 1411/1946/599 +f 1399/1950/600 1708/2117/600 1707/2118/600 1398/1947/600 +f 1394/1938/601 1703/2119/601 1734/2120/601 1425/1948/601 +f 1413/1951/602 1722/2121/602 1721/2115/602 1412/1949/602 +f 1400/1952/603 1709/2122/603 1708/2117/603 1399/1950/603 +f 1414/1953/604 1723/2123/604 1722/2121/604 1413/1951/604 +f 1401/1954/605 1710/2124/605 1709/2122/605 1400/1952/605 +f 1415/1924/606 1724/2125/606 1723/2123/606 1414/1953/606 +f 1402/1926/607 1711/2126/607 1710/2124/607 1401/1954/607 +f 1416/1923/608 1725/2127/608 1724/2125/608 1415/1924/608 +f 1403/1925/609 1712/2128/609 1711/2126/609 1402/1926/609 +f 1417/1927/610 1726/2129/610 1725/2127/610 1416/1923/610 +f 1404/1928/611 1713/2130/611 1712/2128/611 1403/1925/611 +f 1418/1929/612 1727/2131/612 1726/2129/612 1417/1927/612 +f 1405/1930/613 1714/2132/613 1713/2130/613 1404/1928/613 +f 1419/1931/614 1728/2133/614 1727/2131/614 1418/1929/614 +f 1406/1932/615 1715/2134/615 1714/2132/615 1405/1930/615 +f 1420/1933/616 1729/2135/616 1728/2133/616 1419/1931/616 +f 1407/1934/617 1716/2136/617 1715/2134/617 1406/1932/617 +f 1421/1935/618 1730/2137/618 1729/2135/618 1420/1933/618 +f 1408/1936/619 1717/2138/619 1716/2136/619 1407/1934/619 +f 1395/1937/620 1704/2139/620 1703/2119/620 1394/1938/620 +f 1422/1939/621 1731/2140/621 1730/2137/621 1421/1935/621 +f 1409/1940/622 1718/2141/622 1717/2138/622 1408/1936/622 +f 1396/1941/623 1705/2142/623 1704/2139/623 1395/1937/623 +f 1423/1942/624 1732/2143/624 1731/2140/624 1422/1939/624 +f 1410/1943/625 1719/2144/625 1718/2141/625 1409/1940/625 +f 1397/1944/626 1706/2145/626 1705/2142/626 1396/1941/626 +f 1424/1945/627 1733/2146/627 1732/2143/627 1423/1942/627 +f 1411/1946/628 1720/2116/628 1719/2144/628 1410/1943/628 +f 1398/1947/629 1707/2118/629 1706/2145/629 1397/1944/629 +f 1425/1948/630 1734/2120/630 1733/2146/630 1424/1945/630 +f 1704/2139/21 1705/2142/21 1706/2145/21 1707/2118/21 1708/2117/21 1709/2122/21 1710/2124/21 1711/2126/21 1712/2128/21 1713/2130/21 1714/2132/21 1715/2134/21 1716/2136/21 1717/2138/21 1718/2141/21 1719/2144/21 1720/2116/21 1721/2115/21 1722/2121/21 1723/2123/21 1724/2125/21 1725/2127/21 1726/2129/21 1727/2131/21 1728/2133/21 1729/2135/21 1730/2137/21 1731/2140/21 1732/2143/21 1733/2146/21 1734/2120/21 1703/2119/21 +f 1869/2147/51 1871/2148/51 1872/2149/51 1870/2150/51 +f 1802/2151/25 1804/2152/25 1806/2153/25 1808/2154/25 1810/2155/25 1812/2156/25 1814/2157/25 1816/2158/25 1818/2159/25 1820/2160/25 1822/2161/25 1824/2162/25 1826/2163/25 1828/2164/25 1830/2165/25 1832/2166/25 1834/2167/25 1836/2168/25 1838/2169/25 1840/2170/25 1842/2171/25 1844/2172/25 1846/2173/25 1848/2174/25 1850/2175/25 1852/2176/25 1854/2177/25 1856/2178/25 1858/2179/25 1860/2180/25 1862/2181/25 1735/2182/25 +f 1864/2183/21 1925/2184/21 1923/2185/21 1921/2186/21 1919/2187/21 1917/2188/21 1915/2189/21 1913/2190/21 1911/2191/21 1909/2192/21 1907/2193/21 1905/2194/21 1903/2195/21 1901/2196/21 1899/2197/21 1897/2198/21 1895/2199/21 1893/2200/21 1891/2201/21 1889/2202/21 1887/2203/21 1885/2204/21 1883/2205/21 1881/2206/21 1879/2207/21 1877/2208/21 1875/2209/21 1873/2210/21 1871/2211/21 1869/2212/21 1867/2213/21 1865/2214/21 +f 1857/2215/77 1859/2216/77 1860/2217/77 1858/2218/77 +f 1873/2219/53 1875/2220/53 1876/2221/53 1874/2222/53 +f 1855/2223/76 1857/2215/76 1858/2218/76 1856/2224/76 +f 1875/2220/54 1877/2225/54 1878/2226/54 1876/2221/54 +f 1853/2227/75 1855/2223/75 1856/2224/75 1854/2228/75 +f 1877/2225/55 1879/2229/55 1880/2230/55 1878/2226/55 +f 1851/2231/74 1853/2227/74 1854/2228/74 1852/2232/74 +f 1879/2229/56 1881/2233/56 1882/2234/56 1880/2230/56 +f 1849/2235/73 1851/2231/73 1852/2232/73 1850/2236/73 +f 1881/2233/57 1883/2237/57 1884/2238/57 1882/2234/57 +f 1847/2239/72 1849/2235/72 1850/2236/72 1848/2240/72 +f 1883/2237/58 1885/2241/58 1886/2242/58 1884/2238/58 +f 1845/2243/71 1847/2239/71 1848/2240/71 1846/2244/71 +f 1885/2241/59 1887/2245/59 1888/2246/59 1886/2242/59 +f 1843/2247/70 1845/2243/70 1846/2244/70 1844/2248/70 +f 1887/2245/60 1889/2249/60 1890/2250/60 1888/2246/60 +f 1841/2251/69 1843/2247/69 1844/2248/69 1842/2252/69 +f 1889/2249/61 1891/2253/61 1892/2254/61 1890/2250/61 +f 1839/2255/68 1841/2251/68 1842/2252/68 1840/2256/68 +f 1891/2253/62 1893/2257/62 1894/2258/62 1892/2254/62 +f 1837/2259/67 1839/2255/67 1840/2256/67 1838/2260/67 +f 1893/2257/63 1895/2261/63 1896/2262/63 1894/2258/63 +f 1835/2263/66 1837/2259/66 1838/2260/66 1836/2264/66 +f 1895/2261/64 1897/2265/64 1898/2266/64 1896/2262/64 +f 1833/2267/65 1835/2263/65 1836/2264/65 1834/2268/65 +f 1897/2265/65 1899/2269/65 1900/2270/65 1898/2266/65 +f 1831/2271/64 1833/2267/64 1834/2268/64 1832/2272/64 +f 1899/2269/66 1901/2273/66 1902/2274/66 1900/2270/66 +f 1829/2275/63 1831/2271/63 1832/2272/63 1830/2276/63 +f 1901/2273/67 1903/2277/67 1904/2278/67 1902/2274/67 +f 1827/2279/62 1829/2275/62 1830/2276/62 1828/2280/62 +f 1903/2277/68 1905/2281/68 1906/2282/68 1904/2278/68 +f 1825/2283/61 1827/2279/61 1828/2280/61 1826/2284/61 +f 1905/2281/69 1907/2285/69 1908/2286/69 1906/2282/69 +f 1823/2287/60 1825/2283/60 1826/2284/60 1824/2288/60 +f 1907/2285/70 1909/2289/70 1910/2290/70 1908/2286/70 +f 1821/2291/59 1823/2287/59 1824/2288/59 1822/2292/59 +f 1909/2289/71 1911/2293/71 1912/2294/71 1910/2290/71 +f 1819/2295/58 1821/2291/58 1822/2292/58 1820/2296/58 +f 1911/2293/72 1913/2297/72 1914/2298/72 1912/2294/72 +f 1817/2299/57 1819/2295/57 1820/2296/57 1818/2300/57 +f 1913/2297/73 1915/2301/73 1916/2302/73 1914/2298/73 +f 1815/2303/56 1817/2299/56 1818/2300/56 1816/2304/56 +f 1915/2301/74 1917/2305/74 1918/2306/74 1916/2302/74 +f 1813/2307/55 1815/2303/55 1816/2304/55 1814/2308/55 +f 1917/2305/75 1919/2309/75 1920/2310/75 1918/2306/75 +f 1811/2311/54 1813/2307/54 1814/2308/54 1812/2312/54 +f 1919/2309/76 1921/2313/76 1922/2314/76 1920/2310/76 +f 1809/2315/53 1811/2311/53 1812/2312/53 1810/2316/53 +f 1921/2313/77 1923/2317/77 1924/2318/77 1922/2314/77 +f 1807/2319/52 1809/2315/52 1810/2316/52 1808/2320/52 +f 1866/2321/25 1868/2322/25 1870/2323/25 1872/2324/25 1874/2325/25 1876/2326/25 1878/2327/25 1880/2328/25 1882/2329/25 1884/2330/25 1886/2331/25 1888/2332/25 1890/2333/25 1892/2334/25 1894/2335/25 1896/2336/25 1898/2337/25 1900/2338/25 1902/2339/25 1904/2340/25 1906/2341/25 1908/2342/25 1910/2343/25 1912/2344/25 1914/2345/25 1916/2346/25 1918/2347/25 1920/2348/25 1922/2349/25 1924/2350/25 1926/2351/25 1863/2352/25 +f 1805/2353/51 1807/2319/51 1808/2320/51 1806/2354/51 +f 1736/2355/21 1861/2356/21 1859/2357/21 1857/2358/21 1855/2359/21 1853/2360/21 1851/2361/21 1849/2362/21 1847/2363/21 1845/2364/21 1843/2365/21 1841/2366/21 1839/2367/21 1837/2368/21 1835/2369/21 1833/2370/21 1831/2371/21 1829/2372/21 1827/2373/21 1825/2374/21 1823/2375/21 1821/2376/21 1819/2377/21 1817/2378/21 1815/2379/21 1813/2380/21 1811/2381/21 1809/2382/21 1807/2383/21 1805/2384/21 1803/2385/21 1801/2386/21 +f 1803/2387/50 1805/2353/50 1806/2354/50 1804/2388/50 +f 1861/2389/79 1736/2390/79 1735/2391/79 1862/2392/79 +f 1801/2393/49 1803/2387/49 1804/2388/49 1802/2394/49 +f 1736/2395/48 1801/2393/48 1802/2394/48 1735/2396/48 +f 1871/2148/52 1873/2219/52 1874/2222/52 1872/2149/52 +f 1859/2216/78 1861/2389/78 1862/2392/78 1860/2217/78 +f 1867/2397/50 1869/2147/50 1870/2150/50 1868/2398/50 +f 1925/2399/79 1864/2400/79 1863/2401/79 1926/2402/79 +f 1865/2403/49 1867/2397/49 1868/2398/49 1866/2404/49 +f 1864/2405/48 1865/2403/48 1866/2404/48 1863/2406/48 +f 1923/2317/78 1925/2399/78 1926/2402/78 1924/2318/78 +f 1684/2091/631 1978/2407/631 1977/2408/631 1683/2089/631 +f 1671/2092/632 1965/2409/632 1964/2410/632 1670/2090/632 +f 1685/2093/633 1979/2411/633 1978/2407/633 1684/2091/633 +f 1672/2094/634 1966/2412/634 1965/2409/634 1671/2092/634 +f 1686/2095/635 1980/2413/635 1979/2411/635 1685/2093/635 +f 1673/2096/636 1967/2414/636 1966/2412/636 1672/2094/636 +f 1660/2097/637 1954/2415/637 1953/2416/637 1659/2098/637 +f 1687/2099/638 1981/2417/638 1980/2413/638 1686/2095/638 +f 1674/2100/639 1968/2418/639 1967/2414/639 1673/2096/639 +f 1661/2101/640 1955/2419/640 1954/2415/640 1660/2097/640 +f 1688/2102/641 1982/2420/641 1981/2417/641 1687/2099/641 +f 1675/2103/642 1969/2421/642 1968/2418/642 1674/2100/642 +f 1662/2104/643 1956/2422/643 1955/2419/643 1661/2101/643 +f 1689/2105/644 1983/2423/644 1982/2420/644 1688/2102/644 +f 1676/2106/645 1970/2424/645 1969/2421/645 1675/2103/645 +f 1663/2107/646 1957/2425/646 1956/2422/646 1662/2104/646 +f 1690/2108/647 1984/2426/647 1983/2423/647 1689/2105/647 +f 1677/2109/648 1971/2427/648 1970/2424/648 1676/2106/648 +f 1664/2110/649 1958/2428/649 1957/2425/649 1663/2107/649 +f 1659/2098/650 1953/2416/650 1984/2426/650 1690/2108/650 +f 1678/2111/651 1972/2429/651 1971/2427/651 1677/2109/651 +f 1665/2112/652 1959/2430/652 1958/2428/652 1664/2110/652 +f 1679/2113/653 1973/2431/653 1972/2429/653 1678/2111/653 +f 1666/2114/654 1960/2432/654 1959/2430/654 1665/2112/654 +f 1680/2084/655 1974/2433/655 1973/2431/655 1679/2113/655 +f 1667/2086/656 1961/2434/656 1960/2432/656 1666/2114/656 +f 1681/2083/657 1975/2435/657 1974/2433/657 1680/2084/657 +f 1668/2085/658 1962/2436/658 1961/2434/658 1667/2086/658 +f 1682/2087/659 1976/2437/659 1975/2435/659 1681/2083/659 +f 1669/2088/660 1963/2438/660 1962/2436/660 1668/2085/660 +f 1683/2089/661 1977/2408/661 1976/2437/661 1682/2087/661 +f 1670/2090/662 1964/2410/662 1963/2438/662 1669/2088/662 +f 1954/2415/21 1955/2419/21 1956/2422/21 1957/2425/21 1958/2428/21 1959/2430/21 1960/2432/21 1961/2434/21 1962/2436/21 1963/2438/21 1964/2410/21 1965/2409/21 1966/2412/21 1967/2414/21 1968/2418/21 1969/2421/21 1970/2424/21 1971/2427/21 1972/2429/21 1973/2431/21 1974/2433/21 1975/2435/21 1976/2437/21 1977/2408/21 1978/2407/21 1979/2411/21 1980/2413/21 1981/2417/21 1982/2420/21 1983/2423/21 1984/2426/21 1953/2416/21 +usemtl Материал.004 +f 944/299/92 943/100/92 939/99/92 942/296/92 +f 1948/582/92 1946/581/92 1941/392/92 1947/391/92 +l 4 990 +l 992 993 +l 995 998 +l 93 92 +l 21 103 +l 105 107 +l 989 990 +l 1087 1085 +l 1013 1099 +l 1101 1103 diff --git a/src/framework.rs b/src/framework.rs new file mode 100644 index 0000000..482d970 --- /dev/null +++ b/src/framework.rs @@ -0,0 +1,639 @@ +use std::future::Future; +#[cfg(target_arch = "wasm32")] +use std::str::FromStr; +#[cfg(not(target_arch = "wasm32"))] +use std::time::Instant; +#[cfg(target_arch = "wasm32")] +use web_sys::{ImageBitmapRenderingContext, OffscreenCanvas}; +use winit::{ + event::{self, WindowEvent}, + event_loop::{ControlFlow, EventLoop}, +}; + +#[allow(dead_code)] +pub fn cast_slice(data: &[T]) -> &[u8] { + use std::{mem::size_of, slice::from_raw_parts}; + + unsafe { from_raw_parts(data.as_ptr() as *const u8, data.len() * size_of::()) } +} + +#[allow(dead_code)] +pub enum ShaderStage { + Vertex, + Fragment, + Compute, +} + +pub trait Example: 'static + Sized { + fn optional_features() -> wgpu::Features { + wgpu::Features::empty() + } + fn required_features() -> wgpu::Features { + wgpu::Features::empty() + } + fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities { + wgpu::DownlevelCapabilities { + flags: wgpu::DownlevelFlags::empty(), + shader_model: wgpu::ShaderModel::Sm5, + ..wgpu::DownlevelCapabilities::default() + } + } + fn required_limits() -> wgpu::Limits { + wgpu::Limits::downlevel_webgl2_defaults() // These downlevel limits will allow the code to run on all possible hardware + } + fn init( + config: &wgpu::SurfaceConfiguration, + adapter: &wgpu::Adapter, + device: &wgpu::Device, + queue: &wgpu::Queue, + ) -> Self; + fn resize( + &mut self, + config: &wgpu::SurfaceConfiguration, + device: &wgpu::Device, + queue: &wgpu::Queue, + ); + fn update(&mut self, event: WindowEvent); + fn render( + &mut self, + view: &wgpu::TextureView, + device: &wgpu::Device, + queue: &wgpu::Queue, + spawner: &Spawner, + ); +} + +struct Setup { + window: winit::window::Window, + event_loop: EventLoop<()>, + instance: wgpu::Instance, + size: winit::dpi::PhysicalSize, + surface: wgpu::Surface, + adapter: wgpu::Adapter, + device: wgpu::Device, + queue: wgpu::Queue, + #[cfg(target_arch = "wasm32")] + offscreen_canvas_setup: Option, +} + +#[cfg(target_arch = "wasm32")] +struct OffscreenCanvasSetup { + offscreen_canvas: OffscreenCanvas, + bitmap_renderer: ImageBitmapRenderingContext, +} + +async fn setup(title: &str) -> Setup { + #[cfg(not(target_arch = "wasm32"))] + { + env_logger::init(); + }; + + let event_loop = EventLoop::new(); + let mut builder = winit::window::WindowBuilder::new(); + builder = builder.with_title(title); + #[cfg(windows_OFF)] // TODO + { + use winit::platform::windows::WindowBuilderExtWindows; + builder = builder.with_no_redirection_bitmap(true); + } + let window = builder.build(&event_loop).unwrap(); + + #[cfg(target_arch = "wasm32")] + { + use winit::platform::web::WindowExtWebSys; + let query_string = web_sys::window().unwrap().location().search().unwrap(); + let level: log::Level = parse_url_query_string(&query_string, "RUST_LOG") + .and_then(|x| x.parse().ok()) + .unwrap_or(log::Level::Error); + console_log::init_with_level(level).expect("could not initialize logger"); + std::panic::set_hook(Box::new(console_error_panic_hook::hook)); + // On wasm, append the canvas to the document body + web_sys::window() + .and_then(|win| win.document()) + .and_then(|doc| doc.body()) + .and_then(|body| { + body.append_child(&web_sys::Element::from(window.canvas())) + .ok() + }) + .expect("couldn't append canvas to document body"); + } + + #[cfg(target_arch = "wasm32")] + let mut offscreen_canvas_setup: Option = None; + #[cfg(target_arch = "wasm32")] + { + use wasm_bindgen::JsCast; + use winit::platform::web::WindowExtWebSys; + + let query_string = web_sys::window().unwrap().location().search().unwrap(); + if let Some(offscreen_canvas_param) = + parse_url_query_string(&query_string, "offscreen_canvas") + { + if FromStr::from_str(offscreen_canvas_param) == Ok(true) { + log::info!("Creating OffscreenCanvasSetup"); + + let offscreen_canvas = + OffscreenCanvas::new(1024, 768).expect("couldn't create OffscreenCanvas"); + + let bitmap_renderer = window + .canvas() + .get_context("bitmaprenderer") + .expect("couldn't create ImageBitmapRenderingContext (Result)") + .expect("couldn't create ImageBitmapRenderingContext (Option)") + .dyn_into::() + .expect("couldn't convert into ImageBitmapRenderingContext"); + + offscreen_canvas_setup = Some(OffscreenCanvasSetup { + offscreen_canvas, + bitmap_renderer, + }) + } + } + }; + + log::info!("Initializing the surface..."); + + let backends = wgpu::util::backend_bits_from_env().unwrap_or_else(wgpu::Backends::all); + let dx12_shader_compiler = wgpu::util::dx12_shader_compiler_from_env().unwrap_or_default(); + + let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + backends, + dx12_shader_compiler, + }); + let (size, surface) = unsafe { + let size = window.inner_size(); + + #[cfg(any(not(target_arch = "wasm32"), target_os = "emscripten"))] + let surface = instance.create_surface(&window).unwrap(); + #[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))] + let surface = { + if let Some(offscreen_canvas_setup) = &offscreen_canvas_setup { + log::info!("Creating surface from OffscreenCanvas"); + instance.create_surface_from_offscreen_canvas( + offscreen_canvas_setup.offscreen_canvas.clone(), + ) + } else { + instance.create_surface(&window) + } + } + .unwrap(); + + (size, surface) + }; + let adapter = wgpu::util::initialize_adapter_from_env_or_default(&instance, Some(&surface)) + .await + .expect("No suitable GPU adapters found on the system!"); + + #[cfg(not(target_arch = "wasm32"))] + { + let adapter_info = adapter.get_info(); + println!("Using {} ({:?})", adapter_info.name, adapter_info.backend); + } + + let optional_features = E::optional_features(); + let required_features = E::required_features(); + let adapter_features = adapter.features(); + assert!( + adapter_features.contains(required_features), + "Adapter does not support required features for this example: {:?}", + required_features - adapter_features + ); + + let required_downlevel_capabilities = E::required_downlevel_capabilities(); + let downlevel_capabilities = adapter.get_downlevel_capabilities(); + assert!( + downlevel_capabilities.shader_model >= required_downlevel_capabilities.shader_model, + "Adapter does not support the minimum shader model required to run this example: {:?}", + required_downlevel_capabilities.shader_model + ); + assert!( + downlevel_capabilities + .flags + .contains(required_downlevel_capabilities.flags), + "Adapter does not support the downlevel capabilities required to run this example: {:?}", + required_downlevel_capabilities.flags - downlevel_capabilities.flags + ); + + // Make sure we use the texture resolution limits from the adapter, so we can support images the size of the surface. + let needed_limits = E::required_limits().using_resolution(adapter.limits()); + + let trace_dir = std::env::var("WGPU_TRACE"); + let (device, queue) = adapter + .request_device( + &wgpu::DeviceDescriptor { + label: None, + features: (optional_features & adapter_features) | required_features, + limits: needed_limits, + }, + trace_dir.ok().as_ref().map(std::path::Path::new), + ) + .await + .expect("Unable to find a suitable GPU adapter!"); + + Setup { + window, + event_loop, + instance, + size, + surface, + adapter, + device, + queue, + #[cfg(target_arch = "wasm32")] + offscreen_canvas_setup, + } +} + +fn start( + #[cfg(not(target_arch = "wasm32"))] Setup { + window, + event_loop, + instance, + size, + surface, + adapter, + device, + queue, + }: Setup, + #[cfg(target_arch = "wasm32")] Setup { + window, + event_loop, + instance, + size, + surface, + adapter, + device, + queue, + offscreen_canvas_setup, + }: Setup, +) { + let spawner = Spawner::new(); + let mut config = surface + .get_default_config(&adapter, size.width, size.height) + .expect("Surface isn't supported by the adapter."); + let surface_view_format = config.format.add_srgb_suffix(); + config.view_formats.push(surface_view_format); + surface.configure(&device, &config); + + log::info!("Initializing the example..."); + let mut example = E::init(&config, &adapter, &device, &queue); + + #[cfg(not(target_arch = "wasm32"))] + let mut last_frame_inst = Instant::now(); + #[cfg(not(target_arch = "wasm32"))] + let (mut frame_count, mut accum_time) = (0, 0.0); + + log::info!("Entering render loop..."); + event_loop.run(move |event, _, control_flow| { + let _ = (&instance, &adapter); // force ownership by the closure + *control_flow = if cfg!(feature = "metal-auto-capture") { + ControlFlow::Exit + } else { + ControlFlow::Poll + }; + match event { + event::Event::RedrawEventsCleared => { + #[cfg(not(target_arch = "wasm32"))] + spawner.run_until_stalled(); + + window.request_redraw(); + } + event::Event::WindowEvent { + event: + WindowEvent::Resized(size) + | WindowEvent::ScaleFactorChanged { + new_inner_size: &mut size, + .. + }, + .. + } => { + // Once winit is fixed, the detection conditions here can be removed. + // https://github.com/rust-windowing/winit/issues/2876 + let max_dimension = adapter.limits().max_texture_dimension_2d; + if size.width > max_dimension || size.height > max_dimension { + log::warn!( + "The resizing size {:?} exceeds the limit of {}.", + size, + max_dimension + ); + } else { + log::info!("Resizing to {:?}", size); + config.width = size.width.max(1); + config.height = size.height.max(1); + example.resize(&config, &device, &queue); + surface.configure(&device, &config); + } + } + event::Event::WindowEvent { event, .. } => match event { + WindowEvent::KeyboardInput { + input: + event::KeyboardInput { + virtual_keycode: Some(event::VirtualKeyCode::Escape), + state: event::ElementState::Pressed, + .. + }, + .. + } + | WindowEvent::CloseRequested => { + *control_flow = ControlFlow::Exit; + } + #[cfg(not(target_arch = "wasm32"))] + WindowEvent::KeyboardInput { + input: + event::KeyboardInput { + virtual_keycode: Some(event::VirtualKeyCode::R), + state: event::ElementState::Pressed, + .. + }, + .. + } => { + println!("{:#?}", instance.generate_report()); + } + _ => { + example.update(event); + } + }, + event::Event::RedrawRequested(_) => { + #[cfg(not(target_arch = "wasm32"))] + { + accum_time += last_frame_inst.elapsed().as_secs_f32(); + last_frame_inst = Instant::now(); + frame_count += 1; + if frame_count == 100 { + println!( + "Avg frame time {}ms", + accum_time * 1000.0 / frame_count as f32 + ); + accum_time = 0.0; + frame_count = 0; + } + } + + let frame = match surface.get_current_texture() { + Ok(frame) => frame, + Err(_) => { + surface.configure(&device, &config); + surface + .get_current_texture() + .expect("Failed to acquire next surface texture!") + } + }; + let view = frame.texture.create_view(&wgpu::TextureViewDescriptor { + format: Some(surface_view_format), + ..wgpu::TextureViewDescriptor::default() + }); + + example.render(&view, &device, &queue, &spawner); + + frame.present(); + + #[cfg(target_arch = "wasm32")] + { + if let Some(offscreen_canvas_setup) = &offscreen_canvas_setup { + let image_bitmap = offscreen_canvas_setup + .offscreen_canvas + .transfer_to_image_bitmap() + .expect("couldn't transfer offscreen canvas to image bitmap."); + offscreen_canvas_setup + .bitmap_renderer + .transfer_from_image_bitmap(&image_bitmap); + + log::info!("Transferring OffscreenCanvas to ImageBitmapRenderer"); + } + } + } + _ => {} + } + }); +} + +#[cfg(not(target_arch = "wasm32"))] +pub struct Spawner<'a> { + executor: async_executor::LocalExecutor<'a>, +} + +#[cfg(not(target_arch = "wasm32"))] +impl<'a> Spawner<'a> { + fn new() -> Self { + Self { + executor: async_executor::LocalExecutor::new(), + } + } + + #[allow(dead_code)] + pub fn spawn_local(&self, future: impl Future + 'a) { + self.executor.spawn(future).detach(); + } + + fn run_until_stalled(&self) { + while self.executor.try_tick() {} + } +} + +#[cfg(target_arch = "wasm32")] +pub struct Spawner {} + +#[cfg(target_arch = "wasm32")] +impl Spawner { + fn new() -> Self { + Self {} + } + + #[allow(dead_code)] + pub fn spawn_local(&self, future: impl Future + 'static) { + wasm_bindgen_futures::spawn_local(future); + } +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn run(title: &str) { + let setup = pollster::block_on(setup::(title)); + start::(setup); +} + +#[cfg(target_arch = "wasm32")] +pub fn run(title: &str) { + use wasm_bindgen::{prelude::*, JsCast}; + + let title = title.to_owned(); + wasm_bindgen_futures::spawn_local(async move { + let setup = setup::(&title).await; + let start_closure = Closure::once_into_js(move || start::(setup)); + + // make sure to handle JS exceptions thrown inside start. + // Otherwise wasm_bindgen_futures Queue would break and never handle any tasks again. + // This is required, because winit uses JS exception for control flow to escape from `run`. + if let Err(error) = call_catch(&start_closure) { + let is_control_flow_exception = error.dyn_ref::().map_or(false, |e| { + e.message().includes("Using exceptions for control flow", 0) + }); + + if !is_control_flow_exception { + web_sys::console::error_1(&error); + } + } + + #[wasm_bindgen] + extern "C" { + #[wasm_bindgen(catch, js_namespace = Function, js_name = "prototype.call.call")] + fn call_catch(this: &JsValue) -> Result<(), JsValue>; + } + }); +} + +#[cfg(target_arch = "wasm32")] +/// Parse the query string as returned by `web_sys::window()?.location().search()?` and get a +/// specific key out of it. +pub fn parse_url_query_string<'a>(query: &'a str, search_key: &str) -> Option<&'a str> { + let query_string = query.strip_prefix('?')?; + + for pair in query_string.split('&') { + let mut pair = pair.split('='); + let key = pair.next()?; + let value = pair.next()?; + + if key == search_key { + return Some(value); + } + } + + None +} + +pub use wgpu_test::image::ComparisonType; + +pub struct FrameworkRefTest { + // Path to the reference image, relative to the root of the repo. + pub image_path: &'static str, + pub width: u32, + pub height: u32, + pub optional_features: wgpu::Features, + pub base_test_parameters: wgpu_test::TestParameters, + /// Comparisons against FLIP statistics that determine if the test passes or fails. + pub comparisons: &'static [ComparisonType], +} + +#[allow(dead_code)] +pub fn test(mut params: FrameworkRefTest) { + use std::mem; + + assert_eq!(params.width % 64, 0, "width needs to be aligned 64"); + + let features = E::required_features() | params.optional_features; + + wgpu_test::initialize_test( + mem::take(&mut params.base_test_parameters).features(features), + |ctx| { + let spawner = Spawner::new(); + + let dst_texture = ctx.device.create_texture(&wgpu::TextureDescriptor { + label: Some("destination"), + size: wgpu::Extent3d { + width: params.width, + height: params.height, + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Rgba8UnormSrgb, + usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::COPY_SRC, + view_formats: &[], + }); + + let dst_view = dst_texture.create_view(&wgpu::TextureViewDescriptor::default()); + + let dst_buffer = ctx.device.create_buffer(&wgpu::BufferDescriptor { + label: Some("image map buffer"), + size: params.width as u64 * params.height as u64 * 4, + usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ, + mapped_at_creation: false, + }); + + let mut example = E::init( + &wgpu::SurfaceConfiguration { + usage: wgpu::TextureUsages::RENDER_ATTACHMENT, + format: wgpu::TextureFormat::Rgba8UnormSrgb, + width: params.width, + height: params.height, + present_mode: wgpu::PresentMode::Fifo, + alpha_mode: wgpu::CompositeAlphaMode::Auto, + view_formats: vec![wgpu::TextureFormat::Rgba8UnormSrgb], + }, + &ctx.adapter, + &ctx.device, + &ctx.queue, + ); + + example.render(&dst_view, &ctx.device, &ctx.queue, &spawner); + + // Handle specific case for bunnymark + #[allow(deprecated)] + if params.image_path == "/examples/bunnymark/screenshot.png" { + // Press spacebar to spawn bunnies + example.update(winit::event::WindowEvent::KeyboardInput { + input: winit::event::KeyboardInput { + scancode: 0, + state: winit::event::ElementState::Pressed, + virtual_keycode: Some(winit::event::VirtualKeyCode::Space), + modifiers: winit::event::ModifiersState::empty(), + }, + device_id: unsafe { winit::event::DeviceId::dummy() }, + is_synthetic: false, + }); + + // Step 3 extra frames + for _ in 0..3 { + example.render(&dst_view, &ctx.device, &ctx.queue, &spawner); + } + } + + let mut cmd_buf = ctx + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor::default()); + + cmd_buf.copy_texture_to_buffer( + wgpu::ImageCopyTexture { + texture: &dst_texture, + mip_level: 0, + origin: wgpu::Origin3d::ZERO, + aspect: wgpu::TextureAspect::All, + }, + wgpu::ImageCopyBuffer { + buffer: &dst_buffer, + layout: wgpu::ImageDataLayout { + offset: 0, + bytes_per_row: Some(params.width * 4), + rows_per_image: None, + }, + }, + wgpu::Extent3d { + width: params.width, + height: params.height, + depth_or_array_layers: 1, + }, + ); + + ctx.queue.submit(Some(cmd_buf.finish())); + + let dst_buffer_slice = dst_buffer.slice(..); + dst_buffer_slice.map_async(wgpu::MapMode::Read, |_| ()); + ctx.device.poll(wgpu::Maintain::Wait); + let bytes = dst_buffer_slice.get_mapped_range().to_vec(); + + wgpu_test::image::compare_image_output( + env!("CARGO_MANIFEST_DIR").to_string() + "/../../" + params.image_path, + ctx.adapter_info.backend, + params.width, + params.height, + &bytes, + params.comparisons, + ); + }, + ); +} + +// This allows treating the framework as a standalone example, +// thus avoiding listing the example names in `Cargo.toml`. +#[allow(dead_code)] +fn main() {} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..0c71749 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1 @@ +pub mod framework; diff --git a/src/main.rs b/src/main.rs index e7a11a9..bfb5c10 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,523 @@ -fn main() { - println!("Hello, world!"); +use bytemuck::{Pod, Zeroable}; +use std::{borrow::Cow, f32::consts}; +use wgpu::{util::DeviceExt, AstcBlock, AstcChannel}; + +const IMAGE_SIZE: u32 = 128; + +#[derive(Clone, Copy, Pod, Zeroable)] +#[repr(C)] +struct Vertex { + pos: [f32; 3], + normal: [f32; 3], +} + +struct Entity { + vertex_count: u32, + vertex_buf: wgpu::Buffer, +} + +// Note: we use the Y=up coordinate space in this example. +struct Camera { + screen_size: (u32, u32), + angle_y: f32, + angle_xz: f32, + dist: f32, +} + +const MODEL_CENTER_Y: f32 = 2.0; + +impl Camera { + fn to_uniform_data(&self) -> [f32; 16 * 3 + 4] { + let aspect = self.screen_size.0 as f32 / self.screen_size.1 as f32; + let proj = glam::Mat4::perspective_rh(consts::FRAC_PI_4, aspect, 1.0, 50.0); + let cam_pos = glam::Vec3::new( + self.angle_xz.cos() * self.angle_y.sin() * self.dist, + self.angle_xz.sin() * self.dist + MODEL_CENTER_Y, + self.angle_xz.cos() * self.angle_y.cos() * self.dist, + ); + let view = glam::Mat4::look_at_rh( + cam_pos, + glam::Vec3::new(0f32, MODEL_CENTER_Y, 0.0), + glam::Vec3::Y, + ); + let proj_inv = proj.inverse(); + + let mut raw = [0f32; 16 * 3 + 4]; + raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); + raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); + raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view)[..]); + raw[48..51].copy_from_slice(AsRef::<[f32; 3]>::as_ref(&cam_pos)); + raw[51] = 1.0; + raw + } +} + +pub struct Skybox { + camera: Camera, + sky_pipeline: wgpu::RenderPipeline, + entity_pipeline: wgpu::RenderPipeline, + bind_group: wgpu::BindGroup, + uniform_buf: wgpu::Buffer, + entities: Vec, + depth_view: wgpu::TextureView, + staging_belt: wgpu::util::StagingBelt, +} + +impl Skybox { + const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth24Plus; + + fn create_depth_texture( + config: &wgpu::SurfaceConfiguration, + device: &wgpu::Device, + ) -> wgpu::TextureView { + let depth_texture = device.create_texture(&wgpu::TextureDescriptor { + size: wgpu::Extent3d { + width: config.width, + height: config.height, + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: Self::DEPTH_FORMAT, + usage: wgpu::TextureUsages::RENDER_ATTACHMENT, + label: None, + view_formats: &[], + }); + + depth_texture.create_view(&wgpu::TextureViewDescriptor::default()) + } +} + +impl wgpu_example::framework::Example for Skybox { + fn optional_features() -> wgpu::Features { + wgpu::Features::TEXTURE_COMPRESSION_ASTC + | wgpu::Features::TEXTURE_COMPRESSION_ETC2 + | wgpu::Features::TEXTURE_COMPRESSION_BC + } + + fn init( + config: &wgpu::SurfaceConfiguration, + _adapter: &wgpu::Adapter, + device: &wgpu::Device, + queue: &wgpu::Queue, + ) -> Self { + let mut entities = Vec::new(); + { + let source = include_bytes!("../models/teslacyberv3.0.obj"); + let data = obj::ObjData::load_buf(&source[..]).unwrap(); + let mut vertices = Vec::new(); + for object in data.objects { + for group in object.groups { + vertices.clear(); + for poly in group.polys { + for end_index in 2..poly.0.len() { + for &index in &[0, end_index - 1, end_index] { + let obj::IndexTuple(position_id, _texture_id, normal_id) = + poly.0[index]; + vertices.push(Vertex { + pos: data.position[position_id], + normal: data.normal[normal_id.unwrap()], + }) + } + } + } + let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Vertex"), + contents: bytemuck::cast_slice(&vertices), + usage: wgpu::BufferUsages::VERTEX, + }); + entities.push(Entity { + vertex_count: vertices.len() as u32, + vertex_buf, + }); + } + } + } + + let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: None, + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { filterable: true }, + multisampled: false, + view_dimension: wgpu::TextureViewDimension::Cube, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 2, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), + count: None, + }, + ], + }); + + // Create the render pipeline + let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: None, + source: wgpu::ShaderSource::Wgsl(Cow::Borrowed(include_str!("shader.wgsl"))), + }); + + let camera = Camera { + screen_size: (config.width, config.height), + angle_xz: 0.2, + angle_y: 0.2, + dist: 20.0, + }; + let raw_uniforms = camera.to_uniform_data(); + let uniform_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Buffer"), + contents: bytemuck::cast_slice(&raw_uniforms), + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + }); + + let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: None, + bind_group_layouts: &[&bind_group_layout], + push_constant_ranges: &[], + }); + + // Create the render pipelines + let sky_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Sky"), + layout: Some(&pipeline_layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: "vs_sky", + buffers: &[], + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fs_sky", + targets: &[Some(config.view_formats[0].into())], + }), + primitive: wgpu::PrimitiveState { + front_face: wgpu::FrontFace::Cw, + ..Default::default() + }, + depth_stencil: Some(wgpu::DepthStencilState { + format: Self::DEPTH_FORMAT, + depth_write_enabled: false, + depth_compare: wgpu::CompareFunction::LessEqual, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), + multisample: wgpu::MultisampleState::default(), + multiview: None, + }); + let entity_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Entity"), + layout: Some(&pipeline_layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: "vs_entity", + buffers: &[wgpu::VertexBufferLayout { + array_stride: std::mem::size_of::() as wgpu::BufferAddress, + step_mode: wgpu::VertexStepMode::Vertex, + attributes: &wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x3], + }], + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fs_entity", + targets: &[Some(config.view_formats[0].into())], + }), + primitive: wgpu::PrimitiveState { + front_face: wgpu::FrontFace::Cw, + ..Default::default() + }, + depth_stencil: Some(wgpu::DepthStencilState { + format: Self::DEPTH_FORMAT, + depth_write_enabled: true, + depth_compare: wgpu::CompareFunction::LessEqual, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), + multisample: wgpu::MultisampleState::default(), + multiview: None, + }); + + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { + label: None, + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: wgpu::FilterMode::Linear, + min_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::FilterMode::Linear, + ..Default::default() + }); + + let device_features = device.features(); + + let skybox_format = if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ASTC) { + log::info!("Using ASTC"); + wgpu::TextureFormat::Astc { + block: AstcBlock::B4x4, + channel: AstcChannel::UnormSrgb, + } + } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ETC2) { + log::info!("Using ETC2"); + wgpu::TextureFormat::Etc2Rgb8UnormSrgb + } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_BC) { + log::info!("Using BC"); + wgpu::TextureFormat::Bc1RgbaUnormSrgb + } else { + log::info!("Using plain"); + wgpu::TextureFormat::Bgra8UnormSrgb + }; + + let size = wgpu::Extent3d { + width: IMAGE_SIZE, + height: IMAGE_SIZE, + depth_or_array_layers: 6, + }; + + let layer_size = wgpu::Extent3d { + depth_or_array_layers: 1, + ..size + }; + let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); + + log::debug!( + "Copying {:?} skybox images of size {}, {}, 6 with {} mips to gpu", + skybox_format, + IMAGE_SIZE, + IMAGE_SIZE, + max_mips, + ); + + let bytes = match skybox_format { + wgpu::TextureFormat::Astc { + block: AstcBlock::B4x4, + channel: AstcChannel::UnormSrgb, + } => &include_bytes!("../images/astc.dds")[..], + wgpu::TextureFormat::Etc2Rgb8UnormSrgb => &include_bytes!("../images/etc2.dds")[..], + wgpu::TextureFormat::Bc1RgbaUnormSrgb => &include_bytes!("../images/bc1.dds")[..], + wgpu::TextureFormat::Bgra8UnormSrgb => &include_bytes!("../images/bgra.dds")[..], + _ => unreachable!(), + }; + + let image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); + + let texture = device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor { + size, + mip_level_count: max_mips, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: skybox_format, + usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + label: None, + view_formats: &[], + }, + &image.data, + ); + + let texture_view = texture.create_view(&wgpu::TextureViewDescriptor { + label: None, + dimension: Some(wgpu::TextureViewDimension::Cube), + ..wgpu::TextureViewDescriptor::default() + }); + let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &bind_group_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: uniform_buf.as_entire_binding(), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(&texture_view), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: wgpu::BindingResource::Sampler(&sampler), + }, + ], + label: None, + }); + + let depth_view = Self::create_depth_texture(config, device); + + Skybox { + camera, + sky_pipeline, + entity_pipeline, + bind_group, + uniform_buf, + entities, + depth_view, + staging_belt: wgpu::util::StagingBelt::new(0x100), + } + } + + #[allow(clippy::single_match)] + fn update(&mut self, event: winit::event::WindowEvent) { + match event { + winit::event::WindowEvent::CursorMoved { position, .. } => { + let norm_x = position.x as f32 / self.camera.screen_size.0 as f32 - 0.5; + let norm_y = position.y as f32 / self.camera.screen_size.1 as f32 - 0.5; + self.camera.angle_y = norm_x * 5.0; + self.camera.angle_xz = norm_y; + } + _ => {} + } + } + + fn resize( + &mut self, + config: &wgpu::SurfaceConfiguration, + device: &wgpu::Device, + _queue: &wgpu::Queue, + ) { + self.depth_view = Self::create_depth_texture(config, device); + self.camera.screen_size = (config.width, config.height); + } + + fn render( + &mut self, + view: &wgpu::TextureView, + device: &wgpu::Device, + queue: &wgpu::Queue, + _spawner: &wgpu_example::framework::Spawner, + ) { + let mut encoder = + device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); + + // update rotation + let raw_uniforms = self.camera.to_uniform_data(); + self.staging_belt + .write_buffer( + &mut encoder, + &self.uniform_buf, + 0, + wgpu::BufferSize::new((raw_uniforms.len() * 4) as wgpu::BufferAddress).unwrap(), + device, + ) + .copy_from_slice(bytemuck::cast_slice(&raw_uniforms)); + + self.staging_belt.finish(); + + { + let mut rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: None, + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Clear(wgpu::Color { + r: 0.1, + g: 0.2, + b: 0.3, + a: 1.0, + }), + store: true, + }, + })], + depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment { + view: &self.depth_view, + depth_ops: Some(wgpu::Operations { + load: wgpu::LoadOp::Clear(1.0), + store: false, + }), + stencil_ops: None, + }), + }); + + rpass.set_bind_group(0, &self.bind_group, &[]); + rpass.set_pipeline(&self.entity_pipeline); + + for entity in self.entities.iter() { + rpass.set_vertex_buffer(0, entity.vertex_buf.slice(..)); + rpass.draw(0..entity.vertex_count, 0..1); + } + + rpass.set_pipeline(&self.sky_pipeline); + rpass.draw(0..3, 0..1); + } + + queue.submit(std::iter::once(encoder.finish())); + + self.staging_belt.recall(); + } +} + +fn main() { + wgpu_example::framework::run::("skybox"); +} + +wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); + +#[test] +#[wasm_bindgen_test::wasm_bindgen_test] +fn skybox() { + wgpu_example::framework::test::(wgpu_example::framework::FrameworkRefTest { + image_path: "/examples/skybox/screenshot.png", + width: 1024, + height: 768, + optional_features: wgpu::Features::default(), + base_test_parameters: wgpu_test::TestParameters::default().specific_failure( + Some(wgpu::Backends::GL), + None, + Some("ANGLE"), + false, + ), + comparisons: &[wgpu_test::ComparisonType::Mean(0.015)], + }); +} + +#[test] +#[wasm_bindgen_test::wasm_bindgen_test] +fn skybox_bc1() { + wgpu_example::framework::test::(wgpu_example::framework::FrameworkRefTest { + image_path: "/examples/skybox/screenshot-bc1.png", + width: 1024, + height: 768, + optional_features: wgpu::Features::TEXTURE_COMPRESSION_BC, + base_test_parameters: wgpu_test::TestParameters::default(), // https://bugs.chromium.org/p/angleproject/issues/detail?id=7056 + comparisons: &[wgpu_test::ComparisonType::Mean(0.02)], + }); +} + +#[test] +#[wasm_bindgen_test::wasm_bindgen_test] +fn skybox_etc2() { + wgpu_example::framework::test::(wgpu_example::framework::FrameworkRefTest { + image_path: "/examples/skybox/screenshot-etc2.png", + width: 1024, + height: 768, + optional_features: wgpu::Features::TEXTURE_COMPRESSION_ETC2, + base_test_parameters: wgpu_test::TestParameters::default(), // https://bugs.chromium.org/p/angleproject/issues/detail?id=7056 + comparisons: &[wgpu_test::ComparisonType::Mean(0.015)], + }); +} + +#[test] +#[wasm_bindgen_test::wasm_bindgen_test] +fn skybox_astc() { + wgpu_example::framework::test::(wgpu_example::framework::FrameworkRefTest { + image_path: "/examples/skybox/screenshot-astc.png", + width: 1024, + height: 768, + optional_features: wgpu::Features::TEXTURE_COMPRESSION_ASTC, + base_test_parameters: wgpu_test::TestParameters::default(), // https://bugs.chromium.org/p/angleproject/issues/detail?id=7056 + comparisons: &[wgpu_test::ComparisonType::Mean(0.016)], + }); } diff --git a/src/shader.wgsl b/src/shader.wgsl new file mode 100644 index 0000000..deb6715 --- /dev/null +++ b/src/shader.wgsl @@ -0,0 +1,80 @@ +struct SkyOutput { + @builtin(position) position: vec4, + @location(0) uv: vec3, +}; + +struct Data { + // from camera to screen + proj: mat4x4, + // from screen to camera + proj_inv: mat4x4, + // from world to camera + view: mat4x4, + // camera position + cam_pos: vec4, +}; +@group(0) +@binding(0) +var r_data: Data; + +@vertex +fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { + // hacky way to draw a large triangle + let tmp1 = i32(vertex_index) / 2; + let tmp2 = i32(vertex_index) & 1; + let pos = vec4( + f32(tmp1) * 4.0 - 1.0, + f32(tmp2) * 4.0 - 1.0, + 1.0, + 1.0 + ); + + // transposition = inversion for this orthonormal matrix + let inv_model_view = transpose(mat3x3(r_data.view[0].xyz, r_data.view[1].xyz, r_data.view[2].xyz)); + let unprojected = r_data.proj_inv * pos; + + var result: SkyOutput; + result.uv = inv_model_view * unprojected.xyz; + result.position = pos; + return result; +} + +struct EntityOutput { + @builtin(position) position: vec4, + @location(1) normal: vec3, + @location(3) view: vec3, +}; + +@vertex +fn vs_entity( + @location(0) pos: vec3, + @location(1) normal: vec3, +) -> EntityOutput { + var result: EntityOutput; + result.normal = normal; + result.view = pos - r_data.cam_pos.xyz; + result.position = r_data.proj * r_data.view * vec4(pos, 1.0); + return result; +} + +@group(0) +@binding(1) +var r_texture: texture_cube; +@group(0) +@binding(2) +var r_sampler: sampler; + +@fragment +fn fs_sky(vertex: SkyOutput) -> @location(0) vec4 { + return textureSample(r_texture, r_sampler, vertex.uv); +} + +@fragment +fn fs_entity(vertex: EntityOutput) -> @location(0) vec4 { + let incident = normalize(vertex.view); + let normal = normalize(vertex.normal); + let reflected = incident - 2.0 * dot(normal, incident) * normal; + + let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb; + return vec4(vec3(0.1) + 0.5 * reflected_color, 1.0); +} From 33f8162f8572d3da375c6f491cf300470603cc81 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 29 Aug 2023 18:21:07 -0700 Subject: [PATCH 014/482] add a bunch of crates --- Cargo.lock | 309 ++++++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 8 ++ 2 files changed, 315 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9abbb6f..4ab86d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,6 +44,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "aho-corasick" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" +dependencies = [ + "memchr", +] + [[package]] name = "android-activity" version = "0.4.3" @@ -98,6 +107,35 @@ dependencies = [ "libloading 0.7.4", ] +[[package]] +name = "async-executor" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +dependencies = [ + "async-lock", + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-task" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" + [[package]] name = "autocfg" version = "1.1.0" @@ -182,6 +220,26 @@ name = "bytemuck" version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "calloop" @@ -235,6 +293,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642" +[[package]] +name = "concurrent-queue" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "core-foundation" version = "0.9.3" @@ -284,6 +351,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + [[package]] name = "d3d12" version = "0.7.0" @@ -295,6 +371,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "ddsfile" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "594ecd967c2f40db5dde8da4c356975fc1fe030e951c7c3962f6dc2e80042e87" +dependencies = [ + "bitflags 1.3.2", + "byteorder", + "enum_primitive", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -316,12 +403,70 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +[[package]] +name = "enum_primitive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" +dependencies = [ + "num-traits 0.1.43", +] + +[[package]] +name = "env_logger" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "fdeflate" version = "0.3.0" @@ -383,6 +528,33 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + [[package]] name = "getrandom" version = "0.2.10" @@ -400,6 +572,12 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +[[package]] +name = "glam" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42218cb640844e3872cc3c153dc975229e080a6c4733b34709ef445610550226" + [[package]] name = "glow" version = "0.12.3" @@ -494,12 +672,24 @@ dependencies = [ "winapi", ] +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + [[package]] name = "hexf-parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "indexmap" version = "1.9.3" @@ -532,6 +722,17 @@ dependencies = [ "web-sys", ] +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi", + "rustix", + "windows-sys 0.48.0", +] + [[package]] name = "jni-sys" version = "0.3.0" @@ -599,6 +800,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" + [[package]] name = "lock_api" version = "0.4.10" @@ -703,7 +910,7 @@ dependencies = [ "hexf-parse", "indexmap 1.9.3", "log", - "num-traits", + "num-traits 0.2.16", "rustc-hash", "spirv", "termcolor", @@ -775,6 +982,15 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-traits" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +dependencies = [ + "num-traits 0.2.16", +] + [[package]] name = "num-traits" version = "0.2.16" @@ -826,6 +1042,12 @@ dependencies = [ "syn 2.0.29", ] +[[package]] +name = "obj" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059c95245738cdc7b40078cdd51a23200252a4c0a0a6dd005136152b3f467a4a" + [[package]] name = "objc" version = "0.2.7" @@ -904,6 +1126,12 @@ dependencies = [ "ttf-parser", ] +[[package]] +name = "parking" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" + [[package]] name = "parking_lot" version = "0.12.1" @@ -939,6 +1167,12 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + [[package]] name = "pkg-config" version = "0.3.27" @@ -958,6 +1192,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "pollster" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -1013,6 +1253,35 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "regex" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + [[package]] name = "renderdoc-sys" version = "1.0.0" @@ -1031,6 +1300,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustix" +version = "0.38.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed6248e1caa625eb708e266e06159f135e8c26f2bb7ceb72dc4b2766d0340964" +dependencies = [ + "bitflags 2.4.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -1062,6 +1344,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "slotmap" version = "1.0.6" @@ -1103,7 +1394,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" dependencies = [ "bitflags 1.3.2", - "num-traits", + "num-traits 0.2.16", ] [[package]] @@ -1116,6 +1407,14 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" name = "strafe-client" version = "0.1.0" dependencies = [ + "async-executor", + "bytemuck", + "ddsfile", + "env_logger", + "glam", + "log", + "obj", + "pollster", "wgpu", "winit", ] @@ -1255,6 +1554,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index e948f59..f6c2eea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,5 +6,13 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +async-executor = "1.5.1" +bytemuck = { version = "1.13.1", features = ["derive"] } +ddsfile = "0.5.1" +env_logger = "0.10.0" +glam = "0.24.1" +log = "0.4.20" +obj = "0.10.2" +pollster = "0.3.0" wgpu = "0.17.0" winit = "0.28.6" From 6e43fda9f333ce745e02e675154c516614daed5d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 29 Aug 2023 18:39:40 -0700 Subject: [PATCH 015/482] wgpu_example is strafe_client --- src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index bfb5c10..c7d00c0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -89,7 +89,7 @@ impl Skybox { } } -impl wgpu_example::framework::Example for Skybox { +impl strafe_client::framework::Example for Skybox { fn optional_features() -> wgpu::Features { wgpu::Features::TEXTURE_COMPRESSION_ASTC | wgpu::Features::TEXTURE_COMPRESSION_ETC2 @@ -396,7 +396,7 @@ impl wgpu_example::framework::Example for Skybox { view: &wgpu::TextureView, device: &wgpu::Device, queue: &wgpu::Queue, - _spawner: &wgpu_example::framework::Spawner, + _spawner: &strafe_client::framework::Spawner, ) { let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); @@ -460,7 +460,7 @@ impl wgpu_example::framework::Example for Skybox { } fn main() { - wgpu_example::framework::run::("skybox"); + strafe_client::framework::run::("skybox"); } wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); From 5af15fe443b0ade308116303e032c9ee2a25bd09 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 29 Aug 2023 18:39:00 -0700 Subject: [PATCH 016/482] delete tests --- src/framework.rs | 133 ----------------------------------------------- src/main.rs | 59 --------------------- 2 files changed, 192 deletions(-) diff --git a/src/framework.rs b/src/framework.rs index 482d970..85cbb51 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -500,139 +500,6 @@ pub fn parse_url_query_string<'a>(query: &'a str, search_key: &str) -> Option<&' None } -pub use wgpu_test::image::ComparisonType; - -pub struct FrameworkRefTest { - // Path to the reference image, relative to the root of the repo. - pub image_path: &'static str, - pub width: u32, - pub height: u32, - pub optional_features: wgpu::Features, - pub base_test_parameters: wgpu_test::TestParameters, - /// Comparisons against FLIP statistics that determine if the test passes or fails. - pub comparisons: &'static [ComparisonType], -} - -#[allow(dead_code)] -pub fn test(mut params: FrameworkRefTest) { - use std::mem; - - assert_eq!(params.width % 64, 0, "width needs to be aligned 64"); - - let features = E::required_features() | params.optional_features; - - wgpu_test::initialize_test( - mem::take(&mut params.base_test_parameters).features(features), - |ctx| { - let spawner = Spawner::new(); - - let dst_texture = ctx.device.create_texture(&wgpu::TextureDescriptor { - label: Some("destination"), - size: wgpu::Extent3d { - width: params.width, - height: params.height, - depth_or_array_layers: 1, - }, - mip_level_count: 1, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format: wgpu::TextureFormat::Rgba8UnormSrgb, - usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::COPY_SRC, - view_formats: &[], - }); - - let dst_view = dst_texture.create_view(&wgpu::TextureViewDescriptor::default()); - - let dst_buffer = ctx.device.create_buffer(&wgpu::BufferDescriptor { - label: Some("image map buffer"), - size: params.width as u64 * params.height as u64 * 4, - usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ, - mapped_at_creation: false, - }); - - let mut example = E::init( - &wgpu::SurfaceConfiguration { - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - format: wgpu::TextureFormat::Rgba8UnormSrgb, - width: params.width, - height: params.height, - present_mode: wgpu::PresentMode::Fifo, - alpha_mode: wgpu::CompositeAlphaMode::Auto, - view_formats: vec![wgpu::TextureFormat::Rgba8UnormSrgb], - }, - &ctx.adapter, - &ctx.device, - &ctx.queue, - ); - - example.render(&dst_view, &ctx.device, &ctx.queue, &spawner); - - // Handle specific case for bunnymark - #[allow(deprecated)] - if params.image_path == "/examples/bunnymark/screenshot.png" { - // Press spacebar to spawn bunnies - example.update(winit::event::WindowEvent::KeyboardInput { - input: winit::event::KeyboardInput { - scancode: 0, - state: winit::event::ElementState::Pressed, - virtual_keycode: Some(winit::event::VirtualKeyCode::Space), - modifiers: winit::event::ModifiersState::empty(), - }, - device_id: unsafe { winit::event::DeviceId::dummy() }, - is_synthetic: false, - }); - - // Step 3 extra frames - for _ in 0..3 { - example.render(&dst_view, &ctx.device, &ctx.queue, &spawner); - } - } - - let mut cmd_buf = ctx - .device - .create_command_encoder(&wgpu::CommandEncoderDescriptor::default()); - - cmd_buf.copy_texture_to_buffer( - wgpu::ImageCopyTexture { - texture: &dst_texture, - mip_level: 0, - origin: wgpu::Origin3d::ZERO, - aspect: wgpu::TextureAspect::All, - }, - wgpu::ImageCopyBuffer { - buffer: &dst_buffer, - layout: wgpu::ImageDataLayout { - offset: 0, - bytes_per_row: Some(params.width * 4), - rows_per_image: None, - }, - }, - wgpu::Extent3d { - width: params.width, - height: params.height, - depth_or_array_layers: 1, - }, - ); - - ctx.queue.submit(Some(cmd_buf.finish())); - - let dst_buffer_slice = dst_buffer.slice(..); - dst_buffer_slice.map_async(wgpu::MapMode::Read, |_| ()); - ctx.device.poll(wgpu::Maintain::Wait); - let bytes = dst_buffer_slice.get_mapped_range().to_vec(); - - wgpu_test::image::compare_image_output( - env!("CARGO_MANIFEST_DIR").to_string() + "/../../" + params.image_path, - ctx.adapter_info.backend, - params.width, - params.height, - &bytes, - params.comparisons, - ); - }, - ); -} - // This allows treating the framework as a standalone example, // thus avoiding listing the example names in `Cargo.toml`. #[allow(dead_code)] diff --git a/src/main.rs b/src/main.rs index c7d00c0..9902575 100644 --- a/src/main.rs +++ b/src/main.rs @@ -462,62 +462,3 @@ impl strafe_client::framework::Example for Skybox { fn main() { strafe_client::framework::run::("skybox"); } - -wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); - -#[test] -#[wasm_bindgen_test::wasm_bindgen_test] -fn skybox() { - wgpu_example::framework::test::(wgpu_example::framework::FrameworkRefTest { - image_path: "/examples/skybox/screenshot.png", - width: 1024, - height: 768, - optional_features: wgpu::Features::default(), - base_test_parameters: wgpu_test::TestParameters::default().specific_failure( - Some(wgpu::Backends::GL), - None, - Some("ANGLE"), - false, - ), - comparisons: &[wgpu_test::ComparisonType::Mean(0.015)], - }); -} - -#[test] -#[wasm_bindgen_test::wasm_bindgen_test] -fn skybox_bc1() { - wgpu_example::framework::test::(wgpu_example::framework::FrameworkRefTest { - image_path: "/examples/skybox/screenshot-bc1.png", - width: 1024, - height: 768, - optional_features: wgpu::Features::TEXTURE_COMPRESSION_BC, - base_test_parameters: wgpu_test::TestParameters::default(), // https://bugs.chromium.org/p/angleproject/issues/detail?id=7056 - comparisons: &[wgpu_test::ComparisonType::Mean(0.02)], - }); -} - -#[test] -#[wasm_bindgen_test::wasm_bindgen_test] -fn skybox_etc2() { - wgpu_example::framework::test::(wgpu_example::framework::FrameworkRefTest { - image_path: "/examples/skybox/screenshot-etc2.png", - width: 1024, - height: 768, - optional_features: wgpu::Features::TEXTURE_COMPRESSION_ETC2, - base_test_parameters: wgpu_test::TestParameters::default(), // https://bugs.chromium.org/p/angleproject/issues/detail?id=7056 - comparisons: &[wgpu_test::ComparisonType::Mean(0.015)], - }); -} - -#[test] -#[wasm_bindgen_test::wasm_bindgen_test] -fn skybox_astc() { - wgpu_example::framework::test::(wgpu_example::framework::FrameworkRefTest { - image_path: "/examples/skybox/screenshot-astc.png", - width: 1024, - height: 768, - optional_features: wgpu::Features::TEXTURE_COMPRESSION_ASTC, - base_test_parameters: wgpu_test::TestParameters::default(), // https://bugs.chromium.org/p/angleproject/issues/detail?id=7056 - comparisons: &[wgpu_test::ComparisonType::Mean(0.016)], - }); -} From e3ef2eddd4732f60dc576d0ffddcf9874d98310f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 29 Aug 2023 20:11:47 -0700 Subject: [PATCH 017/482] fix wasm warning --- src/framework.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/framework.rs b/src/framework.rs index 85cbb51..8b674cb 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -453,7 +453,7 @@ pub fn run(title: &str) { #[cfg(target_arch = "wasm32")] pub fn run(title: &str) { - use wasm_bindgen::{prelude::*, JsCast}; + use wasm_bindgen::prelude::*; let title = title.to_owned(); wasm_bindgen_futures::spawn_local(async move { From 72a6e364292842c792242755ef01778ad5189ade Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 30 Aug 2023 15:18:05 -0700 Subject: [PATCH 018/482] add ground pipeline --- src/main.rs | 32 ++++++++++++++++++++++++++++++++ src/shader.wgsl | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/src/main.rs b/src/main.rs index 9902575..b843eae 100644 --- a/src/main.rs +++ b/src/main.rs @@ -56,6 +56,7 @@ pub struct Skybox { camera: Camera, sky_pipeline: wgpu::RenderPipeline, entity_pipeline: wgpu::RenderPipeline, + ground_pipeline: wgpu::RenderPipeline, bind_group: wgpu::BindGroup, uniform_buf: wgpu::Buffer, entities: Vec, @@ -251,6 +252,33 @@ impl strafe_client::framework::Example for Skybox { multisample: wgpu::MultisampleState::default(), multiview: None, }); + let ground_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Ground"), + layout: Some(&pipeline_layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: "vs_ground", + buffers: &[], + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fs_ground", + targets: &[Some(config.view_formats[0].into())], + }), + primitive: wgpu::PrimitiveState { + front_face: wgpu::FrontFace::Cw, + ..Default::default() + }, + depth_stencil: Some(wgpu::DepthStencilState { + format: Self::DEPTH_FORMAT, + depth_write_enabled: false, + depth_compare: wgpu::CompareFunction::LessEqual, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), + multisample: wgpu::MultisampleState::default(), + multiview: None, + }); let sampler = device.create_sampler(&wgpu::SamplerDescriptor { label: None, @@ -360,6 +388,7 @@ impl strafe_client::framework::Example for Skybox { camera, sky_pipeline, entity_pipeline, + ground_pipeline, bind_group, uniform_buf, entities, @@ -449,6 +478,9 @@ impl strafe_client::framework::Example for Skybox { rpass.draw(0..entity.vertex_count, 0..1); } + rpass.set_pipeline(&self.ground_pipeline); + rpass.draw(0..3, 0..1); + rpass.set_pipeline(&self.sky_pipeline); rpass.draw(0..3, 0..1); } diff --git a/src/shader.wgsl b/src/shader.wgsl index deb6715..7ae2d05 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -39,6 +39,32 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { return result; } +struct GroundOutput { + @builtin(position) position: vec4, + @location(1) normal: vec3, + @location(3) view: vec3, + @location(4) pos: vec3, +}; + +@vertex +fn vs_ground(@builtin(vertex_index) vertex_index: u32) -> GroundOutput { + // hacky way to draw two triangles that make a square + let tmp1 = (i32(vertex_index)-i32(vertex_index)/3*2) / 2; + let tmp2 = (i32(vertex_index)-i32(vertex_index)/3*2) & 1; + let pos = vec3( + f32(tmp1) * 2.0 - 1.0, + 0.0, + f32(tmp2) * 2.0 - 1.0 + ) * 100.0; + + var result: GroundOutput; + result.normal = vec3(0.0,1.0,0.0); + result.pos = pos; + result.view = pos - r_data.cam_pos.xyz; + result.position = r_data.proj * r_data.view * vec4(pos, 1.0); + return result; +} + struct EntityOutput { @builtin(position) position: vec4, @location(1) normal: vec3, @@ -78,3 +104,15 @@ fn fs_entity(vertex: EntityOutput) -> @location(0) vec4 { let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb; return vec4(vec3(0.1) + 0.5 * reflected_color, 1.0); } + +@fragment +fn fs_ground(vertex: GroundOutput) -> @location(0) vec4 { + //let incident = normalize(vertex.view); + //let normal = normalize(vertex.normal+vec3(cos(vertex.pos.x)/16.0,0.0,sin(vertex.pos.z)/16.0)); + //let reflected = incident - 2.0 * dot(normal, incident) * normal; + + //let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb; + //return vec4(vec3(0.1) + 0.5 * reflected_color, 1.0); + let dir = vec3(-1.0)+vec3(vertex.pos.x/16.%1.0,0.0,vertex.pos.z/16.%1.0)*2.0; + return vec4(textureSample(r_texture, r_sampler, dir).rgb, 1.0); +} From 24eba89bfab66b11013eba2c46c9bb17b140ee1f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 30 Aug 2023 15:20:19 -0700 Subject: [PATCH 019/482] enable write depth buffer --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index b843eae..2df9b91 100644 --- a/src/main.rs +++ b/src/main.rs @@ -271,7 +271,7 @@ impl strafe_client::framework::Example for Skybox { }, depth_stencil: Some(wgpu::DepthStencilState { format: Self::DEPTH_FORMAT, - depth_write_enabled: false, + depth_write_enabled: true, depth_compare: wgpu::CompareFunction::LessEqual, stencil: wgpu::StencilState::default(), bias: wgpu::DepthBiasState::default(), From d790bbc2803230c2e2b9a6906fd9aaeefe20be09 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 30 Aug 2023 15:40:16 -0700 Subject: [PATCH 020/482] rename confusing variable --- src/shader.wgsl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shader.wgsl b/src/shader.wgsl index 7ae2d05..cf11303 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -1,6 +1,6 @@ struct SkyOutput { @builtin(position) position: vec4, - @location(0) uv: vec3, + @location(0) sampledir: vec3, }; struct Data { @@ -34,7 +34,7 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { let unprojected = r_data.proj_inv * pos; var result: SkyOutput; - result.uv = inv_model_view * unprojected.xyz; + result.sampledir = inv_model_view * unprojected.xyz; result.position = pos; return result; } @@ -92,7 +92,7 @@ var r_sampler: sampler; @fragment fn fs_sky(vertex: SkyOutput) -> @location(0) vec4 { - return textureSample(r_texture, r_sampler, vertex.uv); + return textureSample(r_texture, r_sampler, vertex.sampledir); } @fragment From 2f9068a5a116c5a5c54f95a3c0ceb01479a74ea3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 30 Aug 2023 16:33:35 -0700 Subject: [PATCH 021/482] draw two triangles --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 2df9b91..798d587 100644 --- a/src/main.rs +++ b/src/main.rs @@ -479,7 +479,7 @@ impl strafe_client::framework::Example for Skybox { } rpass.set_pipeline(&self.ground_pipeline); - rpass.draw(0..3, 0..1); + rpass.draw(0..6, 0..1); rpass.set_pipeline(&self.sky_pipeline); rpass.draw(0..3, 0..1); From 3c73aeeaa87ec3c1ccb9a73453a2e04ed3acde1f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 30 Aug 2023 16:33:48 -0700 Subject: [PATCH 022/482] change lines grouping --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 798d587..3f789b3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -471,8 +471,8 @@ impl strafe_client::framework::Example for Skybox { }); rpass.set_bind_group(0, &self.bind_group, &[]); - rpass.set_pipeline(&self.entity_pipeline); + rpass.set_pipeline(&self.entity_pipeline); for entity in self.entities.iter() { rpass.set_vertex_buffer(0, entity.vertex_buf.slice(..)); rpass.draw(0..entity.vertex_count, 0..1); From 7784999da1f194dcef3f55f688cd37eedba5528d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 30 Aug 2023 16:54:15 -0700 Subject: [PATCH 023/482] tidy up unused shader values --- src/shader.wgsl | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/shader.wgsl b/src/shader.wgsl index cf11303..41c0e59 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -41,8 +41,6 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { struct GroundOutput { @builtin(position) position: vec4, - @location(1) normal: vec3, - @location(3) view: vec3, @location(4) pos: vec3, }; @@ -58,9 +56,7 @@ fn vs_ground(@builtin(vertex_index) vertex_index: u32) -> GroundOutput { ) * 100.0; var result: GroundOutput; - result.normal = vec3(0.0,1.0,0.0); result.pos = pos; - result.view = pos - r_data.cam_pos.xyz; result.position = r_data.proj * r_data.view * vec4(pos, 1.0); return result; } @@ -107,12 +103,6 @@ fn fs_entity(vertex: EntityOutput) -> @location(0) vec4 { @fragment fn fs_ground(vertex: GroundOutput) -> @location(0) vec4 { - //let incident = normalize(vertex.view); - //let normal = normalize(vertex.normal+vec3(cos(vertex.pos.x)/16.0,0.0,sin(vertex.pos.z)/16.0)); - //let reflected = incident - 2.0 * dot(normal, incident) * normal; - - //let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb; - //return vec4(vec3(0.1) + 0.5 * reflected_color, 1.0); let dir = vec3(-1.0)+vec3(vertex.pos.x/16.%1.0,0.0,vertex.pos.z/16.%1.0)*2.0; return vec4(textureSample(r_texture, r_sampler, dir).rgb, 1.0); } From da6df39febd2f648cc6b3db498798a116b5d17ea Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 30 Aug 2023 19:13:23 -0700 Subject: [PATCH 024/482] jump n shoot --- src/framework.rs | 10 ++++ src/main.rs | 139 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 124 insertions(+), 25 deletions(-) diff --git a/src/framework.rs b/src/framework.rs index 8b674cb..3fe157c 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -54,6 +54,7 @@ pub trait Example: 'static + Sized { queue: &wgpu::Queue, ); fn update(&mut self, event: WindowEvent); + fn move_mouse(&mut self, delta: (f64,f64)); fn render( &mut self, view: &wgpu::TextureView, @@ -353,6 +354,15 @@ fn start( example.update(event); } }, + event::Event::DeviceEvent { + event: + winit::event::DeviceEvent::MouseMotion { + delta, + }, + .. + } => { + example.move_mouse(delta); + }, event::Event::RedrawRequested(_) => { #[cfg(not(target_arch = "wasm32"))] { diff --git a/src/main.rs b/src/main.rs index 3f789b3..c765f46 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use bytemuck::{Pod, Zeroable}; -use std::{borrow::Cow, f32::consts}; +use std::{borrow::Cow, f32::consts,time::Instant}; use wgpu::{util::DeviceExt, AstcBlock, AstcChannel}; const IMAGE_SIZE: u32 = 128; @@ -18,35 +18,66 @@ struct Entity { // Note: we use the Y=up coordinate space in this example. struct Camera { + time: Instant, + pos: glam::Vec3, + vel: glam::Vec3, + gravity: glam::Vec3, screen_size: (u32, u32), - angle_y: f32, - angle_xz: f32, - dist: f32, + yaw: f32, + pitch: f32, + controls: u32, + mv: f32, } -const MODEL_CENTER_Y: f32 = 2.0; +const CONTROL_MOVEFORWARD:u32 = 0b00000001; +const CONTROL_MOVEBACK:u32 = 0b00000010; +const CONTROL_MOVERIGHT:u32 = 0b00000100; +const CONTROL_MOVELEFT:u32 = 0b00001000; +const CONTROL_MOVEUP:u32 = 0b00010000; +const CONTROL_MOVEDOWN:u32 = 0b00100000; +//const CONTROL_JUMP:u32 = 0b01000000; +//const CONTROL_ZOOM:u32 = 0b10000000; + +const FORWARD_DIR:glam::Vec3 = glam::Vec3::new(0.0,0.0,-1.0); +const RIGHT_DIR:glam::Vec3 = glam::Vec3::new(1.0,0.0,0.0); +const UP_DIR:glam::Vec3 = glam::Vec3::new(0.0,1.0,0.0); + +fn get_control_dir(controls: u32) -> glam::Vec3{ + //don't get fancy just do it + let mut control_dir:glam::Vec3 = glam::Vec3::new(0.0,0.0,0.0); + if controls & CONTROL_MOVEFORWARD == CONTROL_MOVEFORWARD { + control_dir+=FORWARD_DIR; + } + if controls & CONTROL_MOVEBACK == CONTROL_MOVEBACK { + control_dir+=-FORWARD_DIR; + } + if controls & CONTROL_MOVELEFT == CONTROL_MOVELEFT { + control_dir+=-RIGHT_DIR; + } + if controls & CONTROL_MOVERIGHT == CONTROL_MOVERIGHT { + control_dir+=RIGHT_DIR; + } + if controls & CONTROL_MOVEUP == CONTROL_MOVEUP { + control_dir+=UP_DIR; + } + if controls & CONTROL_MOVEDOWN == CONTROL_MOVEDOWN { + control_dir+=-UP_DIR; + } + return control_dir +} impl Camera { fn to_uniform_data(&self) -> [f32; 16 * 3 + 4] { let aspect = self.screen_size.0 as f32 / self.screen_size.1 as f32; - let proj = glam::Mat4::perspective_rh(consts::FRAC_PI_4, aspect, 1.0, 50.0); - let cam_pos = glam::Vec3::new( - self.angle_xz.cos() * self.angle_y.sin() * self.dist, - self.angle_xz.sin() * self.dist + MODEL_CENTER_Y, - self.angle_xz.cos() * self.angle_y.cos() * self.dist, - ); - let view = glam::Mat4::look_at_rh( - cam_pos, - glam::Vec3::new(0f32, MODEL_CENTER_Y, 0.0), - glam::Vec3::Y, - ); + let proj = glam::Mat4::perspective_rh(consts::FRAC_PI_4, aspect, 1.0, 200.0); + let view = (glam::Mat4::from_translation(self.pos) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32)).inverse(); let proj_inv = proj.inverse(); let mut raw = [0f32; 16 * 3 + 4]; raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view)[..]); - raw[48..51].copy_from_slice(AsRef::<[f32; 3]>::as_ref(&cam_pos)); + raw[48..51].copy_from_slice(AsRef::<[f32; 3]>::as_ref(&self.pos)); raw[51] = 1.0; raw } @@ -175,10 +206,15 @@ impl strafe_client::framework::Example for Skybox { }); let camera = Camera { + time: Instant::now(), + pos: glam::Vec3 { x: 5.0, y: 5.0, z: 5.0 }, + vel: glam::Vec3 { x: 0.0, y: 0.0, z: 0.0 }, + gravity: glam::Vec3 { x: 0.0, y: -50.0, z: 0.0 }, screen_size: (config.width, config.height), - angle_xz: 0.2, - angle_y: 0.2, - dist: 20.0, + pitch: 0.0, + yaw: 0.0, + mv: 2.7, + controls:0, }; let raw_uniforms = camera.to_uniform_data(); let uniform_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { @@ -400,16 +436,52 @@ impl strafe_client::framework::Example for Skybox { #[allow(clippy::single_match)] fn update(&mut self, event: winit::event::WindowEvent) { match event { - winit::event::WindowEvent::CursorMoved { position, .. } => { - let norm_x = position.x as f32 / self.camera.screen_size.0 as f32 - 0.5; - let norm_y = position.y as f32 / self.camera.screen_size.1 as f32 - 0.5; - self.camera.angle_y = norm_x * 5.0; - self.camera.angle_xz = norm_y; + winit::event::WindowEvent::KeyboardInput { + input: + winit::event::KeyboardInput { + state, + virtual_keycode: Some(keycode), + .. + }, + .. + } => { + match (state,keycode) { + (k,winit::event::VirtualKeyCode::W) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEFORWARD, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEFORWARD, + } + (k,winit::event::VirtualKeyCode::A) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVELEFT, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVELEFT, + } + (k,winit::event::VirtualKeyCode::S) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEBACK, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEBACK, + } + (k,winit::event::VirtualKeyCode::D) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVERIGHT, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVERIGHT, + } + (k,winit::event::VirtualKeyCode::E) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEUP, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEUP, + } + (k,winit::event::VirtualKeyCode::Q) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEDOWN, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEDOWN, + } + _ => (), + } } _ => {} } } + fn move_mouse(&mut self, delta: (f64,f64)) { + self.camera.pitch+=(delta.1/-512.) as f32; + self.camera.yaw+=(delta.0/-512.) as f32; + } + fn resize( &mut self, config: &wgpu::SurfaceConfiguration, @@ -427,6 +499,23 @@ impl strafe_client::framework::Example for Skybox { queue: &wgpu::Queue, _spawner: &strafe_client::framework::Spawner, ) { + let time = Instant::now(); + + //physique + let dt=(time-self.camera.time).as_secs_f32(); + self.camera.time=time; + let camera_mat=glam::Mat3::from_euler(glam::EulerRot::YXZ,self.camera.yaw,self.camera.pitch,0f32); + let control_dir=camera_mat*get_control_dir(self.camera.controls&(CONTROL_MOVELEFT|CONTROL_MOVERIGHT)); + let d=self.camera.vel.dot(control_dir); + if d Date: Wed, 30 Aug 2023 19:17:00 -0700 Subject: [PATCH 025/482] 90 fov of course --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index c765f46..cb73509 100644 --- a/src/main.rs +++ b/src/main.rs @@ -69,7 +69,7 @@ fn get_control_dir(controls: u32) -> glam::Vec3{ impl Camera { fn to_uniform_data(&self) -> [f32; 16 * 3 + 4] { let aspect = self.screen_size.0 as f32 / self.screen_size.1 as f32; - let proj = glam::Mat4::perspective_rh(consts::FRAC_PI_4, aspect, 1.0, 200.0); + let proj = glam::Mat4::perspective_rh(consts::FRAC_PI_2, aspect, 1.0, 200.0); let view = (glam::Mat4::from_translation(self.pos) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32)).inverse(); let proj_inv = proj.inverse(); From 7be6126557768a0010e8b70f3a3ab21242b6c510 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 30 Aug 2023 20:08:58 -0700 Subject: [PATCH 026/482] v0.1 --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index cb73509..945ff9a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -581,5 +581,5 @@ impl strafe_client::framework::Example for Skybox { } fn main() { - strafe_client::framework::run::("skybox"); + strafe_client::framework::run::("Strafe Client v0.1"); } From bf4c3f3154ebf61b691e12c5e356eb0e45e46d11 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 30 Aug 2023 21:03:25 -0700 Subject: [PATCH 027/482] Licensing is too scary, keep my options open for now --- CONTRIBUTING.md | 1 + LICENSE | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..fbf96cc --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1 @@ +By contributing code to the [StrafesNET project](https://git.itzana.me/StrafesNET/strafe-client), you agree to license your contribution under the [License](LICENSE). \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..06f8db2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,8 @@ +/******************************************************* +* Copyright (C) 2023 Rhys Lloyd +* +* This file is part of the StrafesNET bhop/surf client. +* +* StrafesNET can not be copied and/or distributed +* without the express permission of Rhys Lloyd +*******************************************************/ \ No newline at end of file From 804ce4a01711f8b2558bd74fec2df74b3f56f99d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 30 Aug 2023 21:25:34 -0700 Subject: [PATCH 028/482] add readme --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..c73835f --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Strafe Client +In development client for jumping on squares (and riding on triangles) + +## How to build and run +1. Have rust and git installed +2. `git clone https://git.itzana.me/StrafesNET/strafe-client` +3. `cd strafe-client` +4. `cargo run --release` From 42a35746eafbc2e606756276f203a235140355df Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 30 Aug 2023 21:33:02 -0700 Subject: [PATCH 029/482] add image --- README.md | 2 ++ strafe.png | Bin 0 -> 22091 bytes 2 files changed, 2 insertions(+) create mode 100644 strafe.png diff --git a/README.md b/README.md index c73835f..d7c1688 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ + + # Strafe Client In development client for jumping on squares (and riding on triangles) diff --git a/strafe.png b/strafe.png new file mode 100644 index 0000000000000000000000000000000000000000..f69306d910f2f3bb3fd02f6f6723d9acf1e23ebe GIT binary patch literal 22091 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 Date: Thu, 31 Aug 2023 00:54:34 -0700 Subject: [PATCH 030/482] fix forward and back --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 945ff9a..83f3312 100644 --- a/src/main.rs +++ b/src/main.rs @@ -504,8 +504,8 @@ impl strafe_client::framework::Example for Skybox { //physique let dt=(time-self.camera.time).as_secs_f32(); self.camera.time=time; - let camera_mat=glam::Mat3::from_euler(glam::EulerRot::YXZ,self.camera.yaw,self.camera.pitch,0f32); - let control_dir=camera_mat*get_control_dir(self.camera.controls&(CONTROL_MOVELEFT|CONTROL_MOVERIGHT)); + let camera_mat=glam::Mat3::from_euler(glam::EulerRot::YXZ,self.camera.yaw,0f32,0f32); + let control_dir=camera_mat*get_control_dir(self.camera.controls&(CONTROL_MOVELEFT|CONTROL_MOVERIGHT|CONTROL_MOVEFORWARD|CONTROL_MOVEBACK)); let d=self.camera.vel.dot(control_dir); if d Date: Thu, 31 Aug 2023 00:54:50 -0700 Subject: [PATCH 031/482] double gravity --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 83f3312..99bbe59 100644 --- a/src/main.rs +++ b/src/main.rs @@ -209,7 +209,7 @@ impl strafe_client::framework::Example for Skybox { time: Instant::now(), pos: glam::Vec3 { x: 5.0, y: 5.0, z: 5.0 }, vel: glam::Vec3 { x: 0.0, y: 0.0, z: 0.0 }, - gravity: glam::Vec3 { x: 0.0, y: -50.0, z: 0.0 }, + gravity: glam::Vec3 { x: 0.0, y: -100.0, z: 0.0 }, screen_size: (config.width, config.height), pitch: 0.0, yaw: 0.0, From 4fbe0d8a5745ba31d9b0391fa71f9d749f8a2eb9 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 31 Aug 2023 00:55:27 -0700 Subject: [PATCH 032/482] use camera offset --- src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 99bbe59..57968c0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,6 +23,7 @@ struct Camera { vel: glam::Vec3, gravity: glam::Vec3, screen_size: (u32, u32), + offset: glam::Vec3, yaw: f32, pitch: f32, controls: u32, @@ -70,7 +71,7 @@ impl Camera { fn to_uniform_data(&self) -> [f32; 16 * 3 + 4] { let aspect = self.screen_size.0 as f32 / self.screen_size.1 as f32; let proj = glam::Mat4::perspective_rh(consts::FRAC_PI_2, aspect, 1.0, 200.0); - let view = (glam::Mat4::from_translation(self.pos) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32)).inverse(); + let view = (glam::Mat4::from_translation(self.pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32)).inverse(); let proj_inv = proj.inverse(); let mut raw = [0f32; 16 * 3 + 4]; @@ -211,6 +212,7 @@ impl strafe_client::framework::Example for Skybox { vel: glam::Vec3 { x: 0.0, y: 0.0, z: 0.0 }, gravity: glam::Vec3 { x: 0.0, y: -100.0, z: 0.0 }, screen_size: (config.width, config.height), + offset: glam::Vec3::new(0.0,4.5,0.0), pitch: 0.0, yaw: 0.0, mv: 2.7, From 3019e663d6047c4f099e5da13deb1b1312353349 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 31 Aug 2023 00:56:00 -0700 Subject: [PATCH 033/482] add jump --- src/main.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 57968c0..467d7cb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,6 +28,7 @@ struct Camera { pitch: f32, controls: u32, mv: f32, + grounded: bool, } const CONTROL_MOVEFORWARD:u32 = 0b00000001; @@ -36,7 +37,7 @@ const CONTROL_MOVERIGHT:u32 = 0b00000100; const CONTROL_MOVELEFT:u32 = 0b00001000; const CONTROL_MOVEUP:u32 = 0b00010000; const CONTROL_MOVEDOWN:u32 = 0b00100000; -//const CONTROL_JUMP:u32 = 0b01000000; +const CONTROL_JUMP:u32 = 0b01000000; //const CONTROL_ZOOM:u32 = 0b10000000; const FORWARD_DIR:glam::Vec3 = glam::Vec3::new(0.0,0.0,-1.0); @@ -217,6 +218,7 @@ impl strafe_client::framework::Example for Skybox { yaw: 0.0, mv: 2.7, controls:0, + grounded: true, }; let raw_uniforms = camera.to_uniform_data(); let uniform_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { @@ -472,6 +474,10 @@ impl strafe_client::framework::Example for Skybox { winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEDOWN, winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEDOWN, } + (k,winit::event::VirtualKeyCode::Space) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_JUMP, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_JUMP, + } _ => (), } } @@ -514,7 +520,13 @@ impl strafe_client::framework::Example for Skybox { } self.camera.vel+=self.camera.gravity*dt; self.camera.pos+=self.camera.vel*dt; - if self.camera.pos.y<5.0&&self.camera.vel.y<0.0 { + if self.camera.pos.y<0.0{ + self.camera.pos.y=0.0; + self.camera.vel.y=0.0; + self.camera.grounded=true; + } + if self.camera.grounded&&(self.camera.controls&CONTROL_JUMP)!=0 { + self.camera.grounded=false; self.camera.vel+=glam::Vec3 { x: 0.0, y: 50.0, z: 0.0 }; } From 80d258231600659d0b1b7007322502d2edf1c76f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 31 Aug 2023 00:55:53 -0700 Subject: [PATCH 034/482] this looks nicer --- src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index 467d7cb..6e3d333 100644 --- a/src/main.rs +++ b/src/main.rs @@ -209,8 +209,8 @@ impl strafe_client::framework::Example for Skybox { let camera = Camera { time: Instant::now(), - pos: glam::Vec3 { x: 5.0, y: 5.0, z: 5.0 }, - vel: glam::Vec3 { x: 0.0, y: 0.0, z: 0.0 }, + pos: glam::Vec3::new(5.0,0.0,5.0), + vel: glam::Vec3::new(0.0,0.0,0.0), gravity: glam::Vec3 { x: 0.0, y: -100.0, z: 0.0 }, screen_size: (config.width, config.height), offset: glam::Vec3::new(0.0,4.5,0.0), @@ -527,7 +527,7 @@ impl strafe_client::framework::Example for Skybox { } if self.camera.grounded&&(self.camera.controls&CONTROL_JUMP)!=0 { self.camera.grounded=false; - self.camera.vel+=glam::Vec3 { x: 0.0, y: 50.0, z: 0.0 }; + self.camera.vel+=glam::Vec3::new(0.0,50.0,0.0); } let mut encoder = From 4ee5a0fb2b61ec05a1aae9f9f9f3500aeae0d7c5 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 31 Aug 2023 01:04:14 -0700 Subject: [PATCH 035/482] add friction --- src/main.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main.rs b/src/main.rs index 6e3d333..af0354c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,6 +22,7 @@ struct Camera { pos: glam::Vec3, vel: glam::Vec3, gravity: glam::Vec3, + friction: f32, screen_size: (u32, u32), offset: glam::Vec3, yaw: f32, @@ -212,6 +213,7 @@ impl strafe_client::framework::Example for Skybox { pos: glam::Vec3::new(5.0,0.0,5.0), vel: glam::Vec3::new(0.0,0.0,0.0), gravity: glam::Vec3 { x: 0.0, y: -100.0, z: 0.0 }, + friction: 80.0, screen_size: (config.width, config.height), offset: glam::Vec3::new(0.0,4.5,0.0), pitch: 0.0, @@ -529,6 +531,14 @@ impl strafe_client::framework::Example for Skybox { self.camera.grounded=false; self.camera.vel+=glam::Vec3::new(0.0,50.0,0.0); } + if self.camera.grounded { + let applied_friction=self.camera.friction*dt; + if applied_friction*applied_friction Date: Thu, 31 Aug 2023 02:21:39 -0700 Subject: [PATCH 036/482] brain lol --- src/shader.wgsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shader.wgsl b/src/shader.wgsl index 41c0e59..c44f459 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -47,8 +47,8 @@ struct GroundOutput { @vertex fn vs_ground(@builtin(vertex_index) vertex_index: u32) -> GroundOutput { // hacky way to draw two triangles that make a square - let tmp1 = (i32(vertex_index)-i32(vertex_index)/3*2) / 2; - let tmp2 = (i32(vertex_index)-i32(vertex_index)/3*2) & 1; + let tmp1 = i32(vertex_index)/2-i32(vertex_index)/3; + let tmp2 = i32(vertex_index)&1; let pos = vec3( f32(tmp1) * 2.0 - 1.0, 0.0, From 7a23ef27347f5f289d659101546986f319965425 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 31 Aug 2023 12:04:18 -0700 Subject: [PATCH 037/482] add walking --- src/main.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index af0354c..cdd96b2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,6 +30,7 @@ struct Camera { controls: u32, mv: f32, grounded: bool, + walkspeed: f32, } const CONTROL_MOVEFORWARD:u32 = 0b00000001; @@ -221,6 +222,7 @@ impl strafe_client::framework::Example for Skybox { mv: 2.7, controls:0, grounded: true, + walkspeed: 18.0, }; let raw_uniforms = camera.to_uniform_data(); let uniform_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { @@ -533,10 +535,12 @@ impl strafe_client::framework::Example for Skybox { } if self.camera.grounded { let applied_friction=self.camera.friction*dt; - if applied_friction*applied_friction Date: Thu, 31 Aug 2023 12:10:49 -0700 Subject: [PATCH 038/482] rbhop jump power --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index cdd96b2..5a83204 100644 --- a/src/main.rs +++ b/src/main.rs @@ -531,7 +531,7 @@ impl strafe_client::framework::Example for Skybox { } if self.camera.grounded&&(self.camera.controls&CONTROL_JUMP)!=0 { self.camera.grounded=false; - self.camera.vel+=glam::Vec3::new(0.0,50.0,0.0); + self.camera.vel+=glam::Vec3::new(0.0,0.715588/2.0*100.0,0.0); } if self.camera.grounded { let applied_friction=self.camera.friction*dt; From 49fde16c4f5e18eeb712aef79df9783b6a0a2eb4 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 31 Aug 2023 12:16:51 -0700 Subject: [PATCH 039/482] rbhop friction --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 5a83204..dd4c57c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -214,7 +214,7 @@ impl strafe_client::framework::Example for Skybox { pos: glam::Vec3::new(5.0,0.0,5.0), vel: glam::Vec3::new(0.0,0.0,0.0), gravity: glam::Vec3 { x: 0.0, y: -100.0, z: 0.0 }, - friction: 80.0, + friction: 90.0, screen_size: (config.width, config.height), offset: glam::Vec3::new(0.0,4.5,0.0), pitch: 0.0, From 7c247b6949231157c0b4a77f6946158137f70fe3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 31 Aug 2023 12:37:53 -0700 Subject: [PATCH 040/482] fix strafe bug --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index dd4c57c..7f43f4e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -517,7 +517,7 @@ impl strafe_client::framework::Example for Skybox { let dt=(time-self.camera.time).as_secs_f32(); self.camera.time=time; let camera_mat=glam::Mat3::from_euler(glam::EulerRot::YXZ,self.camera.yaw,0f32,0f32); - let control_dir=camera_mat*get_control_dir(self.camera.controls&(CONTROL_MOVELEFT|CONTROL_MOVERIGHT|CONTROL_MOVEFORWARD|CONTROL_MOVEBACK)); + let control_dir=camera_mat*get_control_dir(self.camera.controls&(CONTROL_MOVELEFT|CONTROL_MOVERIGHT|CONTROL_MOVEFORWARD|CONTROL_MOVEBACK)).normalize_or_zero(); let d=self.camera.vel.dot(control_dir); if d Date: Thu, 31 Aug 2023 22:47:55 -0700 Subject: [PATCH 041/482] use slope fov --- src/main.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7f43f4e..46cc18f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use bytemuck::{Pod, Zeroable}; -use std::{borrow::Cow, f32::consts,time::Instant}; +use std::{borrow::Cow, time::Instant}; use wgpu::{util::DeviceExt, AstcBlock, AstcChannel}; const IMAGE_SIZE: u32 = 128; @@ -25,6 +25,7 @@ struct Camera { friction: f32, screen_size: (u32, u32), offset: glam::Vec3, + fov: f32, yaw: f32, pitch: f32, controls: u32, @@ -70,10 +71,22 @@ fn get_control_dir(controls: u32) -> glam::Vec3{ return control_dir } + #[inline] + fn perspective_rh(fov_y_slope: f32, aspect_ratio: f32, z_near: f32, z_far: f32) -> glam::Mat4 { + //glam_assert!(z_near > 0.0 && z_far > 0.0); + let r = z_far / (z_near - z_far); + glam::Mat4::from_cols( + glam::Vec4::new(1.0/(fov_y_slope * aspect_ratio), 0.0, 0.0, 0.0), + glam::Vec4::new(0.0, 1.0/fov_y_slope, 0.0, 0.0), + glam::Vec4::new(0.0, 0.0, r, -1.0), + glam::Vec4::new(0.0, 0.0, r * z_near, 0.0), + ) + } + impl Camera { fn to_uniform_data(&self) -> [f32; 16 * 3 + 4] { let aspect = self.screen_size.0 as f32 / self.screen_size.1 as f32; - let proj = glam::Mat4::perspective_rh(consts::FRAC_PI_2, aspect, 1.0, 200.0); + let proj = perspective_rh(self.fov, aspect, 1.0, 200.0); let view = (glam::Mat4::from_translation(self.pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32)).inverse(); let proj_inv = proj.inverse(); @@ -217,6 +230,7 @@ impl strafe_client::framework::Example for Skybox { friction: 90.0, screen_size: (config.width, config.height), offset: glam::Vec3::new(0.0,4.5,0.0), + fov: 1.0, //fov_slope = tan(fov_y/2) pitch: 0.0, yaw: 0.0, mv: 2.7, From 7179f20e67f86fc7303ea6b3c3c80e1c1dd3fa9b Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 31 Aug 2023 22:48:17 -0700 Subject: [PATCH 042/482] add zoom --- src/main.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 46cc18f..2b04b3a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,7 +41,7 @@ const CONTROL_MOVELEFT:u32 = 0b00001000; const CONTROL_MOVEUP:u32 = 0b00010000; const CONTROL_MOVEDOWN:u32 = 0b00100000; const CONTROL_JUMP:u32 = 0b01000000; -//const CONTROL_ZOOM:u32 = 0b10000000; +const CONTROL_ZOOM:u32 = 0b10000000; const FORWARD_DIR:glam::Vec3 = glam::Vec3::new(0.0,0.0,-1.0); const RIGHT_DIR:glam::Vec3 = glam::Vec3::new(1.0,0.0,0.0); @@ -86,7 +86,12 @@ fn get_control_dir(controls: u32) -> glam::Vec3{ impl Camera { fn to_uniform_data(&self) -> [f32; 16 * 3 + 4] { let aspect = self.screen_size.0 as f32 / self.screen_size.1 as f32; - let proj = perspective_rh(self.fov, aspect, 1.0, 200.0); + let fov = if self.controls&CONTROL_ZOOM==0 { + self.fov + }else{ + self.fov/5.0 + }; + let proj = perspective_rh(fov, aspect, 1.0, 200.0); let view = (glam::Mat4::from_translation(self.pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32)).inverse(); let proj_inv = proj.inverse(); @@ -496,6 +501,10 @@ impl strafe_client::framework::Example for Skybox { winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_JUMP, winit::event::ElementState::Released => self.camera.controls&=!CONTROL_JUMP, } + (k,winit::event::VirtualKeyCode::Z) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_ZOOM, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_ZOOM, + } _ => (), } } From ce5f6fceb9726b1ad8ad53eb4f02f7328a4b3eee Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 1 Sep 2023 00:02:50 -0700 Subject: [PATCH 043/482] modulo is implemented incorrectly by the shader language --- src/shader.wgsl | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/shader.wgsl b/src/shader.wgsl index c44f459..6553cce 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -101,8 +101,20 @@ fn fs_entity(vertex: EntityOutput) -> @location(0) vec4 { return vec4(vec3(0.1) + 0.5 * reflected_color, 1.0); } +fn modulo_euclidean (a: f32, b: f32) -> f32 { + var m = a % b; + if (m < 0.0) { + if (b < 0.0) { + m -= b; + } else { + m += b; + } + } + return m; +} + @fragment fn fs_ground(vertex: GroundOutput) -> @location(0) vec4 { - let dir = vec3(-1.0)+vec3(vertex.pos.x/16.%1.0,0.0,vertex.pos.z/16.%1.0)*2.0; + let dir = vec3(-1.0)+vec3(modulo_euclidean(vertex.pos.x/16.,1.0),0.0,modulo_euclidean(vertex.pos.z/16.,1.0))*2.0; return vec4(textureSample(r_texture, r_sampler, dir).rgb, 1.0); } From bda898a1f1ebfd683000c6cc9e6d0a18ecbb05e2 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 1 Sep 2023 20:27:28 -0700 Subject: [PATCH 044/482] struct style init straggler --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 2b04b3a..87c014d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -231,7 +231,7 @@ impl strafe_client::framework::Example for Skybox { time: Instant::now(), pos: glam::Vec3::new(5.0,0.0,5.0), vel: glam::Vec3::new(0.0,0.0,0.0), - gravity: glam::Vec3 { x: 0.0, y: -100.0, z: 0.0 }, + gravity: glam::Vec3::new(0.0,-100.0,0.0), friction: 90.0, screen_size: (config.width, config.height), offset: glam::Vec3::new(0.0,4.5,0.0), From 82da9bf40f3c523c91cff26e757d301a882e32f5 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 1 Sep 2023 20:28:37 -0700 Subject: [PATCH 045/482] why not be accurate --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 87c014d..1a904c7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -513,8 +513,8 @@ impl strafe_client::framework::Example for Skybox { } fn move_mouse(&mut self, delta: (f64,f64)) { - self.camera.pitch+=(delta.1/-512.) as f32; - self.camera.yaw+=(delta.0/-512.) as f32; + self.camera.pitch=(self.camera.pitch as f64+delta.1/-512.) as f32; + self.camera.yaw=(self.camera.yaw as f64+delta.0/-512.) as f32; } fn resize( From ad46418e79a16cba0430a32165155acb5fca44b6 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 00:18:07 -0700 Subject: [PATCH 046/482] expand baseplate --- src/shader.wgsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shader.wgsl b/src/shader.wgsl index 6553cce..08e8ffe 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -53,7 +53,7 @@ fn vs_ground(@builtin(vertex_index) vertex_index: u32) -> GroundOutput { f32(tmp1) * 2.0 - 1.0, 0.0, f32(tmp2) * 2.0 - 1.0 - ) * 100.0; + ) * 160.0; var result: GroundOutput; result.pos = pos; From e347d4fd51b6a74ae68fa7281c345ba554dde5eb Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 1 Sep 2023 15:55:51 -0700 Subject: [PATCH 047/482] vertex index buffer is very cool --- src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.rs b/src/main.rs index 1a904c7..5d36a9f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -619,6 +619,8 @@ impl strafe_client::framework::Example for Skybox { } rpass.set_pipeline(&self.ground_pipeline); + //rpass.set_index_buffer(&[0u16,1,2,1,2,3][..] as wgpu::BufferSlice, wgpu::IndexFormat::Uint16); + //rpass.draw_indexed(0..4, 0, 0..1); rpass.draw(0..6, 0..1); rpass.set_pipeline(&self.sky_pipeline); From c3290e2ce6d68b95ab6a1050b57e5ca4a9c7b968 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 12:23:08 -0700 Subject: [PATCH 048/482] macro version into window title --- src/main.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 5d36a9f..40e2be7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -634,5 +634,9 @@ impl strafe_client::framework::Example for Skybox { } fn main() { - strafe_client::framework::run::("Strafe Client v0.1"); + strafe_client::framework::run::( + format!("Strafe Client v{}", + env!("CARGO_PKG_VERSION") + ).as_str() + ); } From df43dc6f6e222f41e0a03bc18ccbdc0292a5559a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 1 Sep 2023 14:22:12 -0700 Subject: [PATCH 049/482] add suzanne --- models/suzanne.obj | 2580 ++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 66 +- 2 files changed, 2614 insertions(+), 32 deletions(-) create mode 100644 models/suzanne.obj diff --git a/models/suzanne.obj b/models/suzanne.obj new file mode 100644 index 0000000..7d657dc --- /dev/null +++ b/models/suzanne.obj @@ -0,0 +1,2580 @@ +# Blender3D v249 OBJ File: suzanne.blend +# www.blender3d.org +v 0.437500 0.164063 0.765625 +v -0.437500 0.164063 0.765625 +v 0.500000 0.093750 0.687500 +v -0.500000 0.093750 0.687500 +v 0.546875 0.054688 0.578125 +v -0.546875 0.054688 0.578125 +v 0.351563 -0.023438 0.617188 +v -0.351563 -0.023438 0.617188 +v 0.351563 0.031250 0.718750 +v -0.351563 0.031250 0.718750 +v 0.351563 0.132813 0.781250 +v -0.351563 0.132813 0.781250 +v 0.273438 0.164063 0.796875 +v -0.273438 0.164063 0.796875 +v 0.203125 0.093750 0.742188 +v -0.203125 0.093750 0.742188 +v 0.156250 0.054688 0.648438 +v -0.156250 0.054688 0.648438 +v 0.078125 0.242188 0.656250 +v -0.078125 0.242188 0.656250 +v 0.140625 0.242188 0.742188 +v -0.140625 0.242188 0.742188 +v 0.242188 0.242188 0.796875 +v -0.242188 0.242188 0.796875 +v 0.273438 0.328125 0.796875 +v -0.273438 0.328125 0.796875 +v 0.203125 0.390625 0.742188 +v -0.203125 0.390625 0.742188 +v 0.156250 0.437500 0.648438 +v -0.156250 0.437500 0.648438 +v 0.351563 0.515625 0.617188 +v -0.351563 0.515625 0.617188 +v 0.351563 0.453125 0.718750 +v -0.351563 0.453125 0.718750 +v 0.351563 0.359375 0.781250 +v -0.351563 0.359375 0.781250 +v 0.437500 0.328125 0.765625 +v -0.437500 0.328125 0.765625 +v 0.500000 0.390625 0.687500 +v -0.500000 0.390625 0.687500 +v 0.546875 0.437500 0.578125 +v -0.546875 0.437500 0.578125 +v 0.625000 0.242188 0.562500 +v -0.625000 0.242188 0.562500 +v 0.562500 0.242188 0.671875 +v -0.562500 0.242188 0.671875 +v 0.468750 0.242188 0.757813 +v -0.468750 0.242188 0.757813 +v 0.476563 0.242188 0.773438 +v -0.476563 0.242188 0.773438 +v 0.445313 0.335938 0.781250 +v -0.445313 0.335938 0.781250 +v 0.351563 0.375000 0.804688 +v -0.351563 0.375000 0.804688 +v 0.265625 0.335938 0.820313 +v -0.265625 0.335938 0.820313 +v 0.226563 0.242188 0.820313 +v -0.226563 0.242188 0.820313 +v 0.265625 0.156250 0.820313 +v -0.265625 0.156250 0.820313 +v 0.351563 0.242188 0.828125 +v -0.351563 0.242188 0.828125 +v 0.351563 0.117188 0.804688 +v -0.351563 0.117188 0.804688 +v 0.445313 0.156250 0.781250 +v -0.445313 0.156250 0.781250 +v 0.000000 0.429688 0.742188 +v 0.000000 0.351563 0.820313 +v 0.000000 -0.679688 0.734375 +v 0.000000 -0.320313 0.781250 +v 0.000000 -0.187500 0.796875 +v 0.000000 -0.773438 0.718750 +v 0.000000 0.406250 0.601563 +v 0.000000 0.570313 0.570313 +v 0.000000 0.898438 -0.546875 +v 0.000000 0.562500 -0.851563 +v 0.000000 0.070313 -0.828125 +v 0.000000 -0.382813 -0.351563 +v 0.203125 -0.187500 0.562500 +v -0.203125 -0.187500 0.562500 +v 0.312500 -0.437500 0.570313 +v -0.312500 -0.437500 0.570313 +v 0.351563 -0.695313 0.570313 +v -0.351563 -0.695313 0.570313 +v 0.367188 -0.890625 0.531250 +v -0.367188 -0.890625 0.531250 +v 0.328125 -0.945313 0.523438 +v -0.328125 -0.945313 0.523438 +v 0.179688 -0.968750 0.554688 +v -0.179688 -0.968750 0.554688 +v 0.000000 -0.984375 0.578125 +v 0.437500 -0.140625 0.531250 +v -0.437500 -0.140625 0.531250 +v 0.632813 -0.039063 0.539063 +v -0.632813 -0.039063 0.539063 +v 0.828125 0.148438 0.445313 +v -0.828125 0.148438 0.445313 +v 0.859375 0.429688 0.593750 +v -0.859375 0.429688 0.593750 +v 0.710938 0.484375 0.625000 +v -0.710938 0.484375 0.625000 +v 0.492188 0.601563 0.687500 +v -0.492188 0.601563 0.687500 +v 0.320313 0.757813 0.734375 +v -0.320313 0.757813 0.734375 +v 0.156250 0.718750 0.757813 +v -0.156250 0.718750 0.757813 +v 0.062500 0.492188 0.750000 +v -0.062500 0.492188 0.750000 +v 0.164063 0.414063 0.773438 +v -0.164063 0.414063 0.773438 +v 0.125000 0.304688 0.765625 +v -0.125000 0.304688 0.765625 +v 0.203125 0.093750 0.742188 +v -0.203125 0.093750 0.742188 +v 0.375000 0.015625 0.703125 +v -0.375000 0.015625 0.703125 +v 0.492188 0.062500 0.671875 +v -0.492188 0.062500 0.671875 +v 0.625000 0.187500 0.648438 +v -0.625000 0.187500 0.648438 +v 0.640625 0.296875 0.648438 +v -0.640625 0.296875 0.648438 +v 0.601563 0.375000 0.664063 +v -0.601563 0.375000 0.664063 +v 0.429688 0.437500 0.718750 +v -0.429688 0.437500 0.718750 +v 0.250000 0.468750 0.757813 +v -0.250000 0.468750 0.757813 +v 0.000000 -0.765625 0.734375 +v 0.109375 -0.718750 0.734375 +v -0.109375 -0.718750 0.734375 +v 0.117188 -0.835938 0.710938 +v -0.117188 -0.835938 0.710938 +v 0.062500 -0.882813 0.695313 +v -0.062500 -0.882813 0.695313 +v 0.000000 -0.890625 0.687500 +v 0.000000 -0.195313 0.750000 +v 0.000000 -0.140625 0.742188 +v 0.101563 -0.148438 0.742188 +v -0.101563 -0.148438 0.742188 +v 0.125000 -0.226563 0.750000 +v -0.125000 -0.226563 0.750000 +v 0.085938 -0.289063 0.742188 +v -0.085938 -0.289063 0.742188 +v 0.398438 -0.046875 0.671875 +v -0.398438 -0.046875 0.671875 +v 0.617188 0.054688 0.625000 +v -0.617188 0.054688 0.625000 +v 0.726563 0.203125 0.601563 +v -0.726563 0.203125 0.601563 +v 0.742188 0.375000 0.656250 +v -0.742188 0.375000 0.656250 +v 0.687500 0.414063 0.726563 +v -0.687500 0.414063 0.726563 +v 0.437500 0.546875 0.796875 +v -0.437500 0.546875 0.796875 +v 0.312500 0.640625 0.835938 +v -0.312500 0.640625 0.835938 +v 0.203125 0.617188 0.851563 +v -0.203125 0.617188 0.851563 +v 0.101563 0.429688 0.843750 +v -0.101563 0.429688 0.843750 +v 0.125000 -0.101563 0.812500 +v -0.125000 -0.101563 0.812500 +v 0.210938 -0.445313 0.710938 +v -0.210938 -0.445313 0.710938 +v 0.250000 -0.703125 0.687500 +v -0.250000 -0.703125 0.687500 +v 0.265625 -0.820313 0.664063 +v -0.265625 -0.820313 0.664063 +v 0.234375 -0.914063 0.632813 +v -0.234375 -0.914063 0.632813 +v 0.164063 -0.929688 0.632813 +v -0.164063 -0.929688 0.632813 +v 0.000000 -0.945313 0.640625 +v 0.000000 0.046875 0.726563 +v 0.000000 0.210938 0.765625 +v 0.328125 0.476563 0.742188 +v -0.328125 0.476563 0.742188 +v 0.164063 0.140625 0.750000 +v -0.164063 0.140625 0.750000 +v 0.132813 0.210938 0.757813 +v -0.132813 0.210938 0.757813 +v 0.117188 -0.687500 0.734375 +v -0.117188 -0.687500 0.734375 +v 0.078125 -0.445313 0.750000 +v -0.078125 -0.445313 0.750000 +v 0.000000 -0.445313 0.750000 +v 0.000000 -0.328125 0.742188 +v 0.093750 -0.273438 0.781250 +v -0.093750 -0.273438 0.781250 +v 0.132813 -0.226563 0.796875 +v -0.132813 -0.226563 0.796875 +v 0.109375 -0.132813 0.781250 +v -0.109375 -0.132813 0.781250 +v 0.039063 -0.125000 0.781250 +v -0.039063 -0.125000 0.781250 +v 0.000000 -0.203125 0.828125 +v 0.046875 -0.148438 0.812500 +v -0.046875 -0.148438 0.812500 +v 0.093750 -0.156250 0.812500 +v -0.093750 -0.156250 0.812500 +v 0.109375 -0.226563 0.828125 +v -0.109375 -0.226563 0.828125 +v 0.078125 -0.250000 0.804688 +v -0.078125 -0.250000 0.804688 +v 0.000000 -0.289063 0.804688 +v 0.257813 -0.312500 0.554688 +v -0.257813 -0.312500 0.554688 +v 0.164063 -0.242188 0.710938 +v -0.164063 -0.242188 0.710938 +v 0.179688 -0.312500 0.710938 +v -0.179688 -0.312500 0.710938 +v 0.234375 -0.250000 0.554688 +v -0.234375 -0.250000 0.554688 +v 0.000000 -0.875000 0.687500 +v 0.046875 -0.867188 0.687500 +v -0.046875 -0.867188 0.687500 +v 0.093750 -0.820313 0.710938 +v -0.093750 -0.820313 0.710938 +v 0.093750 -0.742188 0.726563 +v -0.093750 -0.742188 0.726563 +v 0.000000 -0.781250 0.656250 +v 0.093750 -0.750000 0.664063 +v -0.093750 -0.750000 0.664063 +v 0.093750 -0.812500 0.640625 +v -0.093750 -0.812500 0.640625 +v 0.046875 -0.851563 0.632813 +v -0.046875 -0.851563 0.632813 +v 0.000000 -0.859375 0.632813 +v 0.171875 0.218750 0.781250 +v -0.171875 0.218750 0.781250 +v 0.187500 0.156250 0.773438 +v -0.187500 0.156250 0.773438 +v 0.335938 0.429688 0.757813 +v -0.335938 0.429688 0.757813 +v 0.273438 0.421875 0.773438 +v -0.273438 0.421875 0.773438 +v 0.421875 0.398438 0.773438 +v -0.421875 0.398438 0.773438 +v 0.562500 0.351563 0.695313 +v -0.562500 0.351563 0.695313 +v 0.585938 0.289063 0.687500 +v -0.585938 0.289063 0.687500 +v 0.578125 0.195313 0.679688 +v -0.578125 0.195313 0.679688 +v 0.476563 0.101563 0.718750 +v -0.476563 0.101563 0.718750 +v 0.375000 0.062500 0.742188 +v -0.375000 0.062500 0.742188 +v 0.226563 0.109375 0.781250 +v -0.226563 0.109375 0.781250 +v 0.179688 0.296875 0.781250 +v -0.179688 0.296875 0.781250 +v 0.210938 0.375000 0.781250 +v -0.210938 0.375000 0.781250 +v 0.234375 0.359375 0.757813 +v -0.234375 0.359375 0.757813 +v 0.195313 0.296875 0.757813 +v -0.195313 0.296875 0.757813 +v 0.242188 0.125000 0.757813 +v -0.242188 0.125000 0.757813 +v 0.375000 0.085938 0.726563 +v -0.375000 0.085938 0.726563 +v 0.460938 0.117188 0.703125 +v -0.460938 0.117188 0.703125 +v 0.546875 0.210938 0.671875 +v -0.546875 0.210938 0.671875 +v 0.554688 0.281250 0.671875 +v -0.554688 0.281250 0.671875 +v 0.531250 0.335938 0.679688 +v -0.531250 0.335938 0.679688 +v 0.414063 0.390625 0.750000 +v -0.414063 0.390625 0.750000 +v 0.281250 0.398438 0.765625 +v -0.281250 0.398438 0.765625 +v 0.335938 0.406250 0.750000 +v -0.335938 0.406250 0.750000 +v 0.203125 0.171875 0.750000 +v -0.203125 0.171875 0.750000 +v 0.195313 0.226563 0.750000 +v -0.195313 0.226563 0.750000 +v 0.109375 0.460938 0.609375 +v -0.109375 0.460938 0.609375 +v 0.195313 0.664063 0.617188 +v -0.195313 0.664063 0.617188 +v 0.335938 0.687500 0.593750 +v -0.335938 0.687500 0.593750 +v 0.484375 0.554688 0.554688 +v -0.484375 0.554688 0.554688 +v 0.679688 0.453125 0.492188 +v -0.679688 0.453125 0.492188 +v 0.796875 0.406250 0.460938 +v -0.796875 0.406250 0.460938 +v 0.773438 0.164063 0.375000 +v -0.773438 0.164063 0.375000 +v 0.601563 0.000000 0.414063 +v -0.601563 0.000000 0.414063 +v 0.437500 -0.093750 0.468750 +v -0.437500 -0.093750 0.468750 +v 0.000000 0.898438 0.289063 +v 0.000000 0.984375 -0.078125 +v 0.000000 -0.195313 -0.671875 +v 0.000000 -0.460938 0.187500 +v 0.000000 -0.976563 0.460938 +v 0.000000 -0.804688 0.343750 +v 0.000000 -0.570313 0.320313 +v 0.000000 -0.484375 0.281250 +v 0.851563 0.234375 0.054688 +v -0.851563 0.234375 0.054688 +v 0.859375 0.320313 -0.046875 +v -0.859375 0.320313 -0.046875 +v 0.773438 0.265625 -0.437500 +v -0.773438 0.265625 -0.437500 +v 0.460938 0.437500 -0.703125 +v -0.460938 0.437500 -0.703125 +v 0.734375 -0.046875 0.070313 +v -0.734375 -0.046875 0.070313 +v 0.593750 -0.125000 -0.164063 +v -0.593750 -0.125000 -0.164063 +v 0.640625 -0.007813 -0.429688 +v -0.640625 -0.007813 -0.429688 +v 0.335938 0.054688 -0.664063 +v -0.335938 0.054688 -0.664063 +v 0.234375 -0.351563 0.406250 +v -0.234375 -0.351563 0.406250 +v 0.179688 -0.414063 0.257813 +v -0.179688 -0.414063 0.257813 +v 0.289063 -0.710938 0.382813 +v -0.289063 -0.710938 0.382813 +v 0.250000 -0.500000 0.390625 +v -0.250000 -0.500000 0.390625 +v 0.328125 -0.914063 0.398438 +v -0.328125 -0.914063 0.398438 +v 0.140625 -0.757813 0.367188 +v -0.140625 -0.757813 0.367188 +v 0.125000 -0.539063 0.359375 +v -0.125000 -0.539063 0.359375 +v 0.164063 -0.945313 0.437500 +v -0.164063 -0.945313 0.437500 +v 0.218750 -0.281250 0.429688 +v -0.218750 -0.281250 0.429688 +v 0.210938 -0.226563 0.468750 +v -0.210938 -0.226563 0.468750 +v 0.203125 -0.171875 0.500000 +v -0.203125 -0.171875 0.500000 +v 0.210938 -0.390625 0.164063 +v -0.210938 -0.390625 0.164063 +v 0.296875 -0.312500 -0.265625 +v -0.296875 -0.312500 -0.265625 +v 0.343750 -0.148438 -0.539063 +v -0.343750 -0.148438 -0.539063 +v 0.453125 0.867188 -0.382813 +v -0.453125 0.867188 -0.382813 +v 0.453125 0.929688 -0.070313 +v -0.453125 0.929688 -0.070313 +v 0.453125 0.851563 0.234375 +v -0.453125 0.851563 0.234375 +v 0.460938 0.523438 0.429688 +v -0.460938 0.523438 0.429688 +v 0.726563 0.406250 0.335938 +v -0.726563 0.406250 0.335938 +v 0.632813 0.453125 0.281250 +v -0.632813 0.453125 0.281250 +v 0.640625 0.703125 0.054688 +v -0.640625 0.703125 0.054688 +v 0.796875 0.562500 0.125000 +v -0.796875 0.562500 0.125000 +v 0.796875 0.617188 -0.117188 +v -0.796875 0.617188 -0.117188 +v 0.640625 0.750000 -0.195313 +v -0.640625 0.750000 -0.195313 +v 0.640625 0.679688 -0.445313 +v -0.640625 0.679688 -0.445313 +v 0.796875 0.539063 -0.359375 +v -0.796875 0.539063 -0.359375 +v 0.617188 0.328125 -0.585938 +v -0.617188 0.328125 -0.585938 +v 0.484375 0.023438 -0.546875 +v -0.484375 0.023438 -0.546875 +v 0.820313 0.328125 -0.203125 +v -0.820313 0.328125 -0.203125 +v 0.406250 -0.171875 0.148438 +v -0.406250 -0.171875 0.148438 +v 0.429688 -0.195313 -0.210938 +v -0.429688 -0.195313 -0.210938 +v 0.890625 0.406250 -0.234375 +v -0.890625 0.406250 -0.234375 +v 0.773438 -0.140625 -0.125000 +v -0.773438 -0.140625 -0.125000 +v 1.039063 -0.101563 -0.328125 +v -1.039063 -0.101563 -0.328125 +v 1.281250 0.054688 -0.429688 +v -1.281250 0.054688 -0.429688 +v 1.351563 0.320313 -0.421875 +v -1.351563 0.320313 -0.421875 +v 1.234375 0.507813 -0.421875 +v -1.234375 0.507813 -0.421875 +v 1.023438 0.476563 -0.312500 +v -1.023438 0.476563 -0.312500 +v 1.015625 0.414063 -0.289063 +v -1.015625 0.414063 -0.289063 +v 1.187500 0.437500 -0.390625 +v -1.187500 0.437500 -0.390625 +v 1.265625 0.289063 -0.406250 +v -1.265625 0.289063 -0.406250 +v 1.210938 0.078125 -0.406250 +v -1.210938 0.078125 -0.406250 +v 1.031250 -0.039063 -0.304688 +v -1.031250 -0.039063 -0.304688 +v 0.828125 -0.070313 -0.132813 +v -0.828125 -0.070313 -0.132813 +v 0.921875 0.359375 -0.218750 +v -0.921875 0.359375 -0.218750 +v 0.945313 0.304688 -0.289063 +v -0.945313 0.304688 -0.289063 +v 0.882813 -0.023438 -0.210938 +v -0.882813 -0.023438 -0.210938 +v 1.039063 0.000000 -0.367188 +v -1.039063 0.000000 -0.367188 +v 1.187500 0.093750 -0.445313 +v -1.187500 0.093750 -0.445313 +v 1.234375 0.250000 -0.445313 +v -1.234375 0.250000 -0.445313 +v 1.171875 0.359375 -0.437500 +v -1.171875 0.359375 -0.437500 +v 1.023438 0.343750 -0.359375 +v -1.023438 0.343750 -0.359375 +v 0.843750 0.289063 -0.210938 +v -0.843750 0.289063 -0.210938 +v 0.835938 0.171875 -0.273438 +v -0.835938 0.171875 -0.273438 +v 0.757813 0.093750 -0.273438 +v -0.757813 0.093750 -0.273438 +v 0.820313 0.085938 -0.273438 +v -0.820313 0.085938 -0.273438 +v 0.843750 0.015625 -0.273438 +v -0.843750 0.015625 -0.273438 +v 0.812500 -0.015625 -0.273438 +v -0.812500 -0.015625 -0.273438 +v 0.726563 0.000000 -0.070313 +v -0.726563 0.000000 -0.070313 +v 0.718750 -0.023438 -0.171875 +v -0.718750 -0.023438 -0.171875 +v 0.718750 0.039063 -0.187500 +v -0.718750 0.039063 -0.187500 +v 0.796875 0.203125 -0.210938 +v -0.796875 0.203125 -0.210938 +v 0.890625 0.242188 -0.265625 +v -0.890625 0.242188 -0.265625 +v 0.890625 0.234375 -0.320313 +v -0.890625 0.234375 -0.320313 +v 0.812500 -0.015625 -0.320313 +v -0.812500 -0.015625 -0.320313 +v 0.851563 0.015625 -0.320313 +v -0.851563 0.015625 -0.320313 +v 0.828125 0.078125 -0.320313 +v -0.828125 0.078125 -0.320313 +v 0.765625 0.093750 -0.320313 +v -0.765625 0.093750 -0.320313 +v 0.843750 0.171875 -0.320313 +v -0.843750 0.171875 -0.320313 +v 1.039063 0.328125 -0.414063 +v -1.039063 0.328125 -0.414063 +v 1.187500 0.343750 -0.484375 +v -1.187500 0.343750 -0.484375 +v 1.257813 0.242188 -0.492188 +v -1.257813 0.242188 -0.492188 +v 1.210938 0.085938 -0.484375 +v -1.210938 0.085938 -0.484375 +v 1.046875 0.000000 -0.421875 +v -1.046875 0.000000 -0.421875 +v 0.882813 -0.015625 -0.265625 +v -0.882813 -0.015625 -0.265625 +v 0.953125 0.289063 -0.343750 +v -0.953125 0.289063 -0.343750 +v 0.890625 0.109375 -0.328125 +v -0.890625 0.109375 -0.328125 +v 0.937500 0.062500 -0.335938 +v -0.937500 0.062500 -0.335938 +v 1.000000 0.125000 -0.367188 +v -1.000000 0.125000 -0.367188 +v 0.960938 0.171875 -0.351563 +v -0.960938 0.171875 -0.351563 +v 1.015625 0.234375 -0.375000 +v -1.015625 0.234375 -0.375000 +v 1.054688 0.187500 -0.382813 +v -1.054688 0.187500 -0.382813 +v 1.109375 0.210938 -0.390625 +v -1.109375 0.210938 -0.390625 +v 1.085938 0.273438 -0.390625 +v -1.085938 0.273438 -0.390625 +v 1.023438 0.437500 -0.484375 +v -1.023438 0.437500 -0.484375 +v 1.250000 0.468750 -0.546875 +v -1.250000 0.468750 -0.546875 +v 1.367188 0.296875 -0.500000 +v -1.367188 0.296875 -0.500000 +v 1.312500 0.054688 -0.531250 +v -1.312500 0.054688 -0.531250 +v 1.039063 -0.085938 -0.492188 +v -1.039063 -0.085938 -0.492188 +v 0.789063 -0.125000 -0.328125 +v -0.789063 -0.125000 -0.328125 +v 0.859375 0.382813 -0.382813 +v -0.859375 0.382813 -0.382813 +v -1.023438 0.476563 -0.312500 +v -1.234375 0.507813 -0.421875 +v -0.890625 0.406250 -0.234375 +v -0.820313 0.328125 -0.203125 +vt 0.315596 0.792535 +vt 0.331462 0.787091 +vt 0.331944 0.799704 +vt 0.049262 0.798007 +vt 0.050304 0.785428 +vt 0.065913 0.791570 +vt 0.321453 0.778649 +vt 0.060677 0.777438 +vt 0.310368 0.778802 +vt 0.071744 0.778083 +vt 0.302416 0.786560 +vt 0.079345 0.786186 +vt 0.301514 0.798474 +vt 0.079717 0.798128 +vt 0.308740 0.806873 +vt 0.072125 0.806199 +vt 0.321648 0.808687 +vt 0.059149 0.807438 +vt 0.048462 0.201858 +vt 0.040084 0.207259 +vt 0.043232 0.202821 +vt 0.043249 0.220655 +vt 0.040093 0.216224 +vt 0.048480 0.221607 +vt 0.563710 0.649220 +vt 0.540594 0.657349 +vt 0.547067 0.627433 +vt 0.974643 0.218739 +vt 0.968169 0.188824 +vt 0.991286 0.196952 +vt 0.166564 0.702856 +vt 0.160061 0.635503 +vt 0.218800 0.643864 +vt 0.646379 0.202310 +vt 0.587641 0.210669 +vt 0.594146 0.143318 +vt 0.231653 0.710981 +vt 0.181122 0.727399 +vt 0.174315 0.716236 +vt 0.601897 0.129938 +vt 0.608704 0.118775 +vt 0.659234 0.135195 +vt 0.266169 0.503056 +vt 0.270502 0.531304 +vt 0.237927 0.525958 +vt 0.665505 0.320215 +vt 0.698081 0.314870 +vt 0.693747 0.343118 +vt 0.392095 0.783569 +vt 0.421339 0.774990 +vt 0.422693 0.793271 +vt 0.628129 0.465996 +vt 0.613733 0.456434 +vt 0.634389 0.436387 +vt 0.501778 0.870396 +vt 0.507486 0.857499 +vt 0.528577 0.865850 +vt 0.643384 0.583025 +vt 0.644052 0.562152 +vt 0.656465 0.561923 +vt 0.766386 0.787223 +vt 0.745292 0.810963 +vt 0.708792 0.802136 +vt 0.769147 0.634951 +vt 0.732033 0.641034 +vt 0.711181 0.618495 +vt 0.849461 0.545148 +vt 0.823375 0.497849 +vt 0.897469 0.500666 +vt 0.902318 0.546395 +vt 0.572425 0.679855 +vt 0.643837 0.668801 +vt 0.623443 0.718088 +vt 0.572425 0.724426 +vt 0.726607 0.540494 +vt 0.753364 0.518460 +vt 0.715449 0.680462 +vt 0.749227 0.698466 +vt 0.695922 0.534580 +vt 0.693526 0.510498 +vt 0.772837 0.655221 +vt 0.784620 0.679820 +vt 0.718163 0.580185 +vt 0.809389 0.599417 +vt 0.761761 0.743313 +vt 0.667750 0.767676 +vt 0.693110 0.564191 +vt 0.797155 0.722534 +vt 0.682009 0.616616 +vt 0.795802 0.787304 +vt 0.719538 0.655221 +vt 0.756895 0.826983 +vt 0.782765 0.655221 +vt 0.695179 0.821970 +vt 0.843059 0.610497 +vt 0.635588 0.780626 +vt 0.634422 0.561399 +vt 0.628274 0.581967 +vt 0.511020 0.847430 +vt 0.533908 0.850607 +vt 0.633815 0.551490 +vt 0.613046 0.571327 +vt 0.530368 0.831407 +vt 0.501394 0.842435 +vt 0.626589 0.538875 +vt 0.604527 0.544684 +vt 0.508929 0.810914 +vt 0.492547 0.829318 +vt 0.618247 0.522587 +vt 0.602583 0.501781 +vt 0.480939 0.813120 +vt 0.469234 0.787943 +vt 0.616652 0.502716 +vt 0.613925 0.497595 +vt 0.459358 0.796431 +vt 0.462840 0.801566 +vt 0.644899 0.511966 +vt 0.630336 0.517087 +vt 0.628893 0.504351 +vt 0.635735 0.498392 +vt 0.458270 0.813966 +vt 0.469630 0.821874 +vt 0.457144 0.833207 +vt 0.449054 0.817297 +vt 0.637359 0.534149 +vt 0.654293 0.524569 +vt 0.464258 0.849211 +vt 0.482600 0.837505 +vt 0.644187 0.548520 +vt 0.659377 0.540935 +vt 0.478087 0.863369 +vt 0.493557 0.851414 +vt 0.597230 0.539263 +vt 0.595257 0.495349 +vt 0.466971 0.777596 +vt 0.507407 0.801398 +vt 0.605628 0.572478 +vt 0.534801 0.825096 +vt 0.627145 0.592333 +vt 0.544318 0.853620 +vt 0.651887 0.586528 +vt 0.528822 0.875551 +vt 0.665532 0.557472 +vt 0.492878 0.878439 +vt 0.669345 0.535984 +vt 0.467321 0.871200 +vt 0.612569 0.491986 +vt 0.454710 0.792385 +vt 0.619277 0.495381 +vt 0.454636 0.800448 +vt 0.628580 0.496763 +vt 0.451294 0.809743 +vt 0.636682 0.490206 +vt 0.440853 0.813605 +vt 0.652342 0.504728 +vt 0.446182 0.836397 +vt 0.664409 0.519225 +vt 0.453285 0.856119 +vt 0.666191 0.492411 +vt 0.717596 0.474672 +vt 0.382398 0.879324 +vt 0.427166 0.842398 +vt 0.681733 0.511408 +vt 0.427493 0.877628 +vt 0.435523 0.867805 +vt 0.685777 0.532869 +vt 0.453231 0.887054 +vt 0.588528 0.478377 +vt 0.454313 0.762782 +vt 0.446975 0.900429 +vt 0.713425 0.237886 +vt 0.709019 0.215724 +vt 0.755152 0.224403 +vt 0.762923 0.242445 +vt 0.327574 0.621771 +vt 0.281440 0.630451 +vt 0.285847 0.608289 +vt 0.335345 0.603729 +vt 0.576794 0.465515 +vt 0.583867 0.423087 +vt 0.405805 0.730353 +vt 0.448347 0.745304 +vt 0.686035 0.253032 +vt 0.258456 0.593142 +vt 0.683851 0.556229 +vt 0.482266 0.899349 +vt 0.670531 0.597684 +vt 0.532990 0.898426 +vt 0.630909 0.604157 +vt 0.553941 0.861896 +vt 0.596864 0.576275 +vt 0.542184 0.818594 +vt 0.585561 0.529242 +vt 0.503791 0.785451 +vt 0.572425 0.529736 +vt 0.510638 0.773572 +vt 0.587548 0.588270 +vt 0.557294 0.815416 +vt 0.629961 0.623919 +vt 0.572425 0.868524 +vt 0.548104 0.914571 +vt 0.488130 0.914571 +vt 0.658830 0.266292 +vt 0.631691 0.281488 +vt 0.204112 0.564686 +vt 0.231252 0.579881 +vt 0.706402 0.288928 +vt 0.278823 0.557246 +vt 0.743528 0.317934 +vt 0.752264 0.346660 +vt 0.324686 0.499513 +vt 0.315950 0.528240 +vt 0.743309 0.289810 +vt 0.315731 0.556363 +vt 0.700326 0.147967 +vt 0.272746 0.698208 +vt 0.795874 0.266472 +vt 0.775660 0.289442 +vt 0.757507 0.263314 +vt 0.348083 0.556732 +vt 0.329929 0.582860 +vt 0.368297 0.579702 +vt 0.804056 0.232825 +vt 0.376478 0.613349 +vt 0.810124 0.179100 +vt 0.382547 0.667075 +vt 0.753847 0.157090 +vt 0.811201 0.146834 +vt 0.383624 0.699341 +vt 0.326269 0.689085 +vt 0.879685 0.183943 +vt 0.888071 0.157228 +vt 0.460496 0.688946 +vt 0.452109 0.662231 +vt 0.925222 0.140531 +vt 0.947451 0.149372 +vt 0.519876 0.696801 +vt 0.497647 0.705643 +vt 0.876420 0.258223 +vt 0.946138 0.286262 +vt 0.518561 0.559910 +vt 0.448843 0.587951 +vt 0.829953 0.196170 +vt 0.837053 0.152275 +vt 0.409477 0.693900 +vt 0.402377 0.650004 +vt 0.829888 0.255993 +vt 0.402311 0.590181 +vt 0.852096 0.297194 +vt 0.813695 0.289418 +vt 0.424519 0.548979 +vt 0.386117 0.556756 +vt 0.820842 0.328587 +vt 0.789451 0.311961 +vt 0.393264 0.517587 +vt 0.361873 0.534212 +vt 0.840465 0.403536 +vt 0.762603 0.423087 +vt 0.412887 0.442637 +vt 0.335024 0.423087 +vt 0.909248 0.345901 +vt 0.481670 0.500271 +vt 0.676670 0.402805 +vt 0.249092 0.443369 +vt 0.573469 0.193539 +vt 0.579214 0.151927 +vt 0.151632 0.694246 +vt 0.145888 0.652633 +vt 0.546919 0.227092 +vt 0.536510 0.214419 +vt 0.119340 0.619080 +vt 0.108931 0.631753 +vt 0.588792 0.317539 +vt 0.161214 0.528634 +vt 0.630429 0.371564 +vt 0.202851 0.474609 +vt 0.657494 0.118541 +vt 0.164237 0.319427 +vt 0.169464 0.304721 +vt 0.210459 0.345510 +vt 0.169574 0.118572 +vt 0.164356 0.103821 +vt 0.210731 0.077759 +vt 0.229913 0.727634 +vt 0.589956 0.115821 +vt 0.153468 0.300432 +vt 0.153526 0.122857 +vt 0.162374 0.730353 +vt 0.578472 0.119429 +vt 0.553653 0.120209 +vt 0.126070 0.725964 +vt 0.150890 0.726744 +vt 0.546510 0.159800 +vt 0.509384 0.119033 +vt 0.081800 0.727137 +vt 0.118929 0.686371 +vt 0.534072 0.185482 +vt 0.106492 0.660689 +vt 0.462352 0.161885 +vt 0.478174 0.145123 +vt 0.493641 0.175543 +vt 0.505521 0.150780 +vt 0.077939 0.695390 +vt 0.050592 0.701044 +vt 0.066060 0.670626 +vt 0.034770 0.684282 +vt 0.476706 0.124129 +vt 0.049122 0.722039 +vt 0.465324 0.131169 +vt 0.037741 0.714998 +vt 0.446348 0.149671 +vt 0.018765 0.696495 +vt 0.445483 0.184898 +vt 0.427581 0.175095 +vt 0.000000 0.671069 +vt 0.017903 0.661268 +vt 0.480167 0.198327 +vt 0.052588 0.647841 +vt 0.521714 0.207472 +vt 0.094135 0.638699 +vt 0.701979 0.120236 +vt 0.274400 0.725940 +vt 0.757541 0.138176 +vt 0.329963 0.708000 +vt 0.817327 0.117813 +vt 0.389751 0.728363 +vt 0.844767 0.126748 +vt 0.417191 0.719428 +vt 0.893893 0.126476 +vt 0.466319 0.719698 +vt 0.936543 0.115821 +vt 0.508970 0.730353 +vt 0.965717 0.128368 +vt 0.538144 0.717805 +vt 0.989276 0.166159 +vt 0.561701 0.680013 +vt 1.000000 0.175243 +vt 0.572425 0.670929 +vt 0.289028 0.269037 +vt 0.283878 0.263049 +vt 0.299187 0.258321 +vt 0.300964 0.267357 +vt 0.299421 0.165436 +vt 0.284101 0.160633 +vt 0.289287 0.154655 +vt 0.301244 0.156393 +vt 0.317793 0.260767 +vt 0.316733 0.267304 +vt 0.318078 0.163079 +vt 0.317052 0.156521 +vt 0.335398 0.269583 +vt 0.330421 0.276220 +vt 0.335777 0.154335 +vt 0.330824 0.147649 +vt 0.278552 0.277080 +vt 0.273734 0.272912 +vt 0.273975 0.150706 +vt 0.278818 0.146548 +vt 0.271078 0.306358 +vt 0.264864 0.305818 +vt 0.265194 0.117691 +vt 0.271427 0.117166 +vt 0.278613 0.324240 +vt 0.274006 0.327477 +vt 0.274436 0.095993 +vt 0.279049 0.099253 +vt 0.298062 0.342565 +vt 0.294660 0.349561 +vt 0.295240 0.073895 +vt 0.298634 0.080932 +vt 0.312476 0.342961 +vt 0.315033 0.350198 +vt 0.315702 0.073322 +vt 0.313108 0.080584 +vt 0.323281 0.337709 +vt 0.328696 0.344302 +vt 0.329405 0.079293 +vt 0.323940 0.085897 +vt 0.335361 0.313857 +vt 0.339396 0.315576 +vt 0.340031 0.108187 +vt 0.335968 0.109893 +vt 0.339920 0.298303 +vt 0.345292 0.298556 +vt 0.345869 0.125306 +vt 0.340471 0.125531 +vt 0.339277 0.286081 +vt 0.344398 0.284332 +vt 0.344895 0.139582 +vt 0.339764 0.137799 +vt 0.345671 0.260159 +vt 0.355483 0.280619 +vt 0.356003 0.143373 +vt 0.346021 0.163854 +vt 0.356162 0.297750 +vt 0.356783 0.126174 +vt 0.349494 0.319809 +vt 0.350195 0.103982 +vt 0.333524 0.354692 +vt 0.334295 0.068869 +vt 0.317323 0.364551 +vt 0.318050 0.058911 +vt 0.293154 0.361782 +vt 0.293765 0.061619 +vt 0.263750 0.335417 +vt 0.264168 0.087998 +vt 0.251373 0.309082 +vt 0.251676 0.114380 +vt 0.264926 0.265507 +vt 0.265122 0.158092 +vt 0.278030 0.255522 +vt 0.278212 0.168150 +vt 0.320744 0.246538 +vt 0.320956 0.177355 +vt 0.296570 0.247318 +vt 0.296748 0.176443 +vt 0.038845 0.211743 +vt 0.047440 0.211734 +vt 0.055230 0.211728 +vt 0.057303 0.228458 +vt 0.057278 0.194991 +vt 0.041287 0.229096 +vt 0.041253 0.194380 +vt 0.032564 0.220061 +vt 0.032546 0.203437 +vt 0.030743 0.211752 +vt 0.029931 0.223131 +vt 0.028053 0.211756 +vt 0.029906 0.200372 +vt 0.038587 0.233067 +vt 0.038544 0.190412 +vt 0.061533 0.231825 +vt 0.061505 0.191616 +vt 0.057382 0.211726 +vt 0.168191 0.258703 +vt 0.213958 0.246887 +vt 0.214040 0.176591 +vt 0.168236 0.164676 +vt 0.148297 0.258447 +vt 0.138777 0.299079 +vt 0.138791 0.124216 +vt 0.148319 0.164919 +vt 0.115455 0.259296 +vt 0.109657 0.296761 +vt 0.109611 0.126556 +vt 0.115440 0.164070 +vt 0.119233 0.228698 +vt 0.156540 0.233552 +vt 0.156556 0.189842 +vt 0.119230 0.194690 +vt 0.173998 0.244074 +vt 0.174035 0.179329 +vt 0.195860 0.238258 +vt 0.195909 0.185188 +vt 0.203534 0.211734 +vt 0.252997 0.211802 +vt 0.171285 0.225095 +vt 0.164455 0.211704 +vt 0.180017 0.211713 +vt 0.177113 0.227468 +vt 0.171300 0.198319 +vt 0.177134 0.195952 +vt 0.185539 0.227013 +vt 0.187516 0.221322 +vt 0.187531 0.202116 +vt 0.185563 0.196419 +vt 0.176585 0.232500 +vt 0.165993 0.229894 +vt 0.176611 0.190916 +vt 0.166011 0.193512 +vt 0.189406 0.230672 +vt 0.189438 0.192766 +vt 0.193574 0.221791 +vt 0.193592 0.201656 +vt 0.186479 0.211718 +vt 0.156919 0.211701 +vt 0.148476 0.211699 +vt 0.427853 0.115821 +vt 0.427581 0.104121 +vt 0.441185 0.104121 +vt 0.427581 0.011703 +vt 0.427581 0.000000 +vt 0.441181 0.011386 +vt 0.067509 0.234045 +vt 0.071465 0.211716 +vt 0.067479 0.189385 +vt 0.119764 0.211696 +vt 0.060932 0.261035 +vt 0.038121 0.261699 +vt 0.038025 0.161756 +vt 0.060860 0.162382 +vt 0.019864 0.255578 +vt 0.019760 0.167921 +vt 0.016617 0.242679 +vt 0.016537 0.180842 +vt 0.014466 0.211775 +vt 0.297831 0.211892 +vt 0.340508 0.212027 +vt 0.356498 0.241635 +vt 0.356742 0.182510 +vt 0.236517 0.317748 +vt 0.236802 0.105655 +vt 0.264789 0.363401 +vt 0.265286 0.059917 +vt 0.296951 0.385966 +vt 0.297650 0.037339 +vt 0.337996 0.385300 +vt 0.338890 0.038126 +vt 0.349401 0.368365 +vt 0.350300 0.055183 +vt 0.377282 0.319664 +vt 0.378129 0.104260 +vt 0.394788 0.292204 +vt 0.395576 0.131978 +vt 0.391029 0.270263 +vt 0.391643 0.154015 +vt 0.368661 0.212151 +vt 0.379482 0.228055 +vt 0.379686 0.196331 +vt 0.420379 0.261837 +vt 0.421104 0.162716 +vt 0.426533 0.298960 +vt 0.427581 0.125377 +vt 0.396664 0.342212 +vt 0.397734 0.081667 +vt 0.365156 0.387054 +vt 0.366203 0.036443 +vt 0.346744 0.416452 +vt 0.347768 0.006839 +vt 0.278009 0.423087 +vt 0.278714 0.000000 +vt 0.241964 0.376122 +vt 0.242399 0.047096 +vt 0.055563 0.291878 +vt 0.055443 0.131506 +vt 0.014495 0.288026 +vt 0.014318 0.135436 +vt 0.003828 0.279132 +vt 0.003650 0.144368 +vt 0.000113 0.248111 +vt 0.000000 0.175447 +vt 0.000000 0.211799 +vt 0.046962 0.798865 +vt 0.047306 0.784561 +vt 0.334495 0.786358 +vt 0.334204 0.800664 +vt 0.058429 0.773633 +vt 0.323868 0.774947 +vt 0.072992 0.774071 +vt 0.309301 0.774739 +vt 0.084403 0.784016 +vt 0.297459 0.784168 +vt 0.083417 0.800146 +vt 0.297728 0.800325 +vt 0.073091 0.810538 +vt 0.307582 0.811166 +vt 0.057505 0.810093 +vt 0.323173 0.811412 +vt 0.024988 0.807478 +vt 0.047717 0.829014 +vt 0.332112 0.830749 +vt 0.355774 0.810244 +vt 0.000000 0.817350 +vt 0.033121 0.852785 +vt 0.345638 0.855146 +vt 0.380299 0.821215 +vt 0.083391 0.855019 +vt 0.078555 0.829097 +vt 0.301299 0.829463 +vt 0.295318 0.855146 +vt 0.100718 0.807888 +vt 0.280100 0.807291 +vt 0.123146 0.821929 +vt 0.257070 0.820323 +vt 0.127501 0.768220 +vt 0.103229 0.776171 +vt 0.279000 0.775494 +vt 0.255105 0.766472 +vt 0.079351 0.756089 +vt 0.303746 0.756492 +vt 0.089008 0.730353 +vt 0.295241 0.730353 +vt 0.049398 0.755271 +vt 0.035422 0.733227 +vt 0.333706 0.757005 +vt 0.348646 0.735604 +vt 0.026877 0.776230 +vt 0.355274 0.778943 +vt 0.000000 0.770061 +vt 0.382398 0.773973 +vn 0.189764 -0.003571 0.981811 +vn 0.646809 -0.758202 0.082095 +vn 0.999573 -0.014496 -0.024445 +vn -0.999573 -0.014496 -0.024445 +vn -0.646809 -0.758202 0.082095 +vn -0.189764 -0.003571 0.981811 +vn -0.085788 -0.982971 0.162389 +vn 0.085788 -0.982971 0.162389 +vn -0.744835 -0.623768 0.236824 +vn 0.744835 -0.623768 0.236824 +vn -0.870968 -0.014710 0.491104 +vn 0.870968 -0.014710 0.491104 +vn -0.758354 0.606128 0.239692 +vn 0.758354 0.606128 0.239692 +vn -0.085788 0.982513 0.165105 +vn 0.085788 0.982513 0.165105 +vn 0.655141 0.750633 0.085574 +vn -0.655141 0.750633 0.085574 +vn -0.349284 -0.719932 0.599719 +vn -0.173681 0.215735 0.960845 +vn -0.809839 0.388287 0.439741 +vn 0.809839 0.388287 0.439741 +vn 0.173681 0.215735 0.960845 +vn 0.349284 -0.719932 0.599719 +vn 0.000000 0.794183 0.607654 +vn -0.508652 0.858119 -0.069887 +vn 0.000000 0.487075 0.873348 +vn 0.508652 0.858119 -0.069887 +vn 0.981414 -0.186682 0.043947 +vn 0.569811 -0.821711 0.007813 +vn 0.563463 -0.814570 0.137669 +vn -0.563463 -0.814570 0.137669 +vn -0.569811 -0.821711 0.007813 +vn -0.981414 -0.186682 0.043947 +vn 0.475845 -0.876247 0.075381 +vn 0.850520 -0.525529 -0.020692 +vn 0.876949 -0.163823 0.451766 +vn -0.876949 -0.163823 0.451766 +vn -0.850520 -0.525529 -0.020692 +vn -0.475845 -0.876247 0.075381 +vn 0.448286 -0.367870 -0.814661 +vn 0.530534 -0.539445 -0.653829 +vn 0.513077 -0.674673 -0.530595 +vn -0.513077 -0.674673 -0.530595 +vn -0.530534 -0.539445 -0.653829 +vn -0.448286 -0.367870 -0.814661 +vn 0.888180 -0.439955 -0.132389 +vn 0.588519 0.226966 0.775933 +vn 0.911527 -0.115268 0.394665 +vn -0.911527 -0.115268 0.394665 +vn -0.588519 0.226966 0.775933 +vn -0.888180 -0.439955 -0.132389 +vn 0.468886 -0.304727 0.829005 +vn 0.251564 0.260781 0.932005 +vn -0.003082 -0.330882 0.943632 +vn 0.003082 -0.330882 0.943632 +vn -0.251564 0.260781 0.932005 +vn -0.468886 -0.304727 0.829005 +vn 0.473067 0.578997 -0.664022 +vn 0.992462 0.028626 -0.118900 +vn 0.459975 -0.380261 -0.802362 +vn -0.459975 -0.380261 -0.802362 +vn -0.992462 0.028626 -0.118900 +vn -0.473067 0.578997 -0.664022 +vn -0.059908 -0.804712 -0.590594 +vn -0.346141 -0.637287 -0.688498 +vn -0.330546 -0.943236 0.031281 +vn -0.073672 -0.594989 0.800317 +vn 0.330546 -0.943236 0.031281 +vn 0.346141 -0.637287 -0.688498 +vn 0.059908 -0.804712 -0.590594 +vn 0.073672 -0.594989 0.800317 +vn 0.593738 0.595264 -0.541368 +vn -0.626057 -0.002686 -0.779748 +vn 0.626057 -0.002686 -0.779748 +vn -0.593738 0.595264 -0.541368 +vn 0.127689 0.703757 0.698843 +vn -0.713828 0.382183 0.586810 +vn 0.713828 0.382183 0.586810 +vn -0.127689 0.703757 0.698843 +vn 0.378063 0.560045 -0.737144 +vn 0.036805 -0.708457 -0.704764 +vn -0.378063 0.560045 -0.737144 +vn -0.036805 -0.708457 -0.704764 +vn -0.031556 0.838710 0.543626 +vn 0.031556 0.838710 0.543626 +vn -0.361156 0.848689 0.386303 +vn 0.361156 0.848689 0.386303 +vn -0.716392 0.204474 0.667043 +vn 0.716392 0.204474 0.667043 +vn -0.662038 -0.413770 0.624866 +vn 0.662038 -0.413770 0.624866 +vn -0.530229 -0.655751 0.537370 +vn 0.530229 -0.655751 0.537370 +vn -0.437483 0.001221 0.899197 +vn 0.550981 -0.138096 0.822993 +vn 0.437483 0.001221 0.899197 +vn -0.550981 -0.138096 0.822993 +vn -0.315958 -0.102298 0.943205 +vn 0.608539 0.296121 0.736167 +vn -0.608539 0.296121 0.736167 +vn 0.315958 -0.102298 0.943205 +vn -0.445479 -0.088778 0.890866 +vn -0.257698 0.600024 0.757317 +vn 0.257698 0.600024 0.757317 +vn 0.445479 -0.088778 0.890866 +vn -0.327799 0.169927 0.929319 +vn 0.041780 0.927213 0.372112 +vn 0.327799 0.169927 0.929319 +vn -0.041780 0.927213 0.372112 +vn -0.277932 0.260201 0.924680 +vn -0.750725 0.111545 0.651112 +vn 0.750725 0.111545 0.651112 +vn 0.277932 0.260201 0.924680 +vn -0.437910 -0.293985 0.849574 +vn -0.183782 0.036836 0.982269 +vn -0.554216 0.387219 0.736808 +vn -0.814325 0.253426 0.522111 +vn 0.554216 0.387219 0.736808 +vn 0.183782 0.036836 0.982269 +vn 0.437910 -0.293985 0.849574 +vn 0.814325 0.253426 0.522111 +vn -0.326670 -0.001617 0.945128 +vn -0.704337 -0.526872 0.475692 +vn 0.704337 -0.526872 0.475692 +vn 0.326670 -0.001617 0.945128 +vn -0.308786 0.134617 0.941527 +vn -0.629170 -0.371441 0.682730 +vn 0.629170 -0.371441 0.682730 +vn 0.308786 0.134617 0.941527 +vn 0.146184 0.948637 0.280465 +vn -0.137516 0.905820 0.400708 +vn 0.137516 0.905820 0.400708 +vn -0.146184 0.948637 0.280465 +vn 0.723746 0.690023 -0.005219 +vn -0.723746 0.690023 -0.005219 +vn 0.994690 -0.078005 0.067019 +vn -0.994690 -0.078005 0.067019 +vn 0.200934 -0.758141 0.620350 +vn -0.200934 -0.758141 0.620350 +vn -0.541246 -0.672658 0.504501 +vn 0.541246 -0.672658 0.504501 +vn -0.690054 -0.553209 0.466628 +vn 0.690054 -0.553209 0.466628 +vn -0.464003 0.686666 0.559557 +vn 0.464003 0.686666 0.559557 +vn -0.827448 -0.135899 0.544786 +vn 0.827448 -0.135899 0.544786 +vn -0.466231 0.808863 0.358196 +vn 0.466231 0.808863 0.358196 +vn -0.743980 -0.022919 0.667776 +vn 0.743980 -0.022919 0.667776 +vn -0.711295 -0.638325 0.294137 +vn 0.711295 -0.638325 0.294137 +vn -0.709769 -0.501999 0.494125 +vn 0.709769 -0.501999 0.494125 +vn -0.818903 -0.425520 0.385113 +vn -0.992523 -0.071444 -0.098758 +vn 0.992523 -0.071444 -0.098758 +vn 0.818903 -0.425520 0.385113 +vn -0.439192 -0.273568 0.855708 +vn 0.439192 -0.273568 0.855708 +vn -0.414686 -0.059877 0.907956 +vn 0.414686 -0.059877 0.907956 +vn -0.341563 0.452132 0.823939 +vn 0.341563 0.452132 0.823939 +vn -0.724509 -0.684927 0.076632 +vn -0.987548 -0.123020 0.097995 +vn 0.987548 -0.123020 0.097995 +vn 0.724509 -0.684927 0.076632 +vn -0.572741 -0.088443 0.814936 +vn 0.572741 -0.088443 0.814936 +vn -0.291818 -0.152104 0.944273 +vn 0.291818 -0.152104 0.944273 +vn 0.239662 -0.128605 0.962279 +vn -0.239662 -0.128605 0.962279 +vn 0.187017 0.370678 0.909696 +vn -0.187017 0.370678 0.909696 +vn -0.455794 0.423170 0.783044 +vn 0.455794 0.423170 0.783044 +vn -0.543504 -0.813379 -0.207343 +vn -0.560045 -0.814417 -0.151738 +vn 0.560045 -0.814417 -0.151738 +vn 0.543504 -0.813379 -0.207343 +vn -0.615375 -0.087649 -0.783319 +vn -0.447310 0.229530 -0.864406 +vn 0.447310 0.229530 -0.864406 +vn 0.615375 -0.087649 -0.783319 +vn -0.547166 -0.832179 -0.089785 +vn 0.547166 -0.832179 -0.089785 +vn -0.873135 0.486984 -0.020264 +vn -0.865352 0.331217 -0.376049 +vn 0.865352 0.331217 -0.376049 +vn 0.873135 0.486984 -0.020264 +vn -0.748741 0.518387 0.413038 +vn 0.748741 0.518387 0.413038 +vn -0.766167 0.634816 0.099612 +vn 0.766167 0.634816 0.099612 +vn -0.953185 -0.248299 -0.172430 +vn -0.665639 0.602496 -0.440321 +vn 0.665639 0.602496 -0.440321 +vn 0.953185 -0.248299 -0.172430 +vn -0.322642 0.847713 0.421033 +vn -0.188574 0.788934 -0.584765 +vn 0.188574 0.788934 -0.584765 +vn 0.322642 0.847713 0.421033 +vn -0.239784 0.745262 -0.622120 +vn 0.494247 0.520585 -0.696158 +vn -0.494247 0.520585 -0.696158 +vn 0.239784 0.745262 -0.622120 +vn -0.480697 0.731223 0.483932 +vn 0.000000 0.758690 0.651418 +vn 0.480697 0.731223 0.483932 +vn -0.489242 0.762963 0.422498 +vn -0.363109 0.908567 -0.206458 +vn 0.363109 0.908567 -0.206458 +vn 0.489242 0.762963 0.422498 +vn -0.645039 0.694540 0.318613 +vn 0.645039 0.694540 0.318613 +vn -0.492843 0.869015 0.043062 +vn -0.679434 0.728965 -0.083468 +vn 0.492843 0.869015 0.043062 +vn 0.679434 0.728965 -0.083468 +vn -0.391736 0.826014 -0.405225 +vn -0.644398 0.527207 -0.553880 +vn 0.391736 0.826014 -0.405225 +vn 0.644398 0.527207 -0.553880 +vn 0.000000 0.800714 -0.599017 +vn 0.000000 0.330729 -0.943693 +vn 0.000000 0.999664 0.025636 +vn 0.000000 -0.271462 -0.962432 +vn -0.685293 -0.583148 -0.436232 +vn -0.907224 0.252602 -0.336253 +vn 0.907224 0.252602 -0.336253 +vn 0.685293 -0.583148 -0.436232 +vn 0.000000 -0.984344 -0.176214 +vn 0.000000 -0.736351 -0.676565 +vn 0.000000 -0.948759 -0.315928 +vn 0.000000 -0.648244 -0.761406 +vn -0.317362 -0.946959 -0.049959 +vn -0.838282 -0.408155 0.361461 +vn 0.838282 -0.408155 0.361461 +vn 0.317362 -0.946959 -0.049959 +vn -0.939360 0.325999 0.106113 +vn 0.939360 0.325999 0.106113 +vn -0.930631 0.340159 0.134770 +vn -0.960143 0.231361 0.156774 +vn 0.960143 0.231361 0.156774 +vn 0.930631 0.340159 0.134770 +vn -0.812555 -0.001068 -0.582842 +vn -0.979583 0.093387 0.177862 +vn 0.979583 0.093387 0.177862 +vn 0.812555 -0.001068 -0.582842 +vn -0.272530 -0.301157 -0.913785 +vn 0.272530 -0.301157 -0.913785 +vn -0.090915 -0.776330 -0.623707 +vn -0.506851 -0.488144 -0.710471 +vn -0.142521 -0.147282 -0.978759 +vn -0.637257 0.093326 -0.764946 +vn 0.637257 0.093326 -0.764946 +vn 0.506851 -0.488144 -0.710471 +vn 0.142521 -0.147282 -0.978759 +vn 0.090915 -0.776330 -0.623707 +vn -0.937284 -0.254250 0.238350 +vn 0.937284 -0.254250 0.238350 +vn -0.430525 -0.895260 0.114597 +vn 0.430525 -0.895260 0.114597 +vn -0.158391 -0.974822 0.156774 +vn 0.158391 -0.974822 0.156774 +vn 0.000000 -0.915860 -0.401440 +vn 0.000000 -0.946440 0.322855 +vn 0.000000 -0.336802 -0.941557 +vn 0.000000 -0.175726 -0.984436 +vn -0.599231 -0.773980 0.204566 +vn 0.599231 -0.773980 0.204566 +vn -0.890988 -0.423261 -0.164037 +vn 0.890988 -0.423261 -0.164037 +vn -0.851985 0.219275 0.475387 +vn 0.851985 0.219275 0.475387 +vn -0.509171 0.852229 0.119999 +vn 0.509171 0.852229 0.119999 +vn -0.610431 0.759148 0.225867 +vn 0.610431 0.759148 0.225867 +vn -0.182470 0.981780 0.052492 +vn 0.182470 0.981780 0.052492 +vn 0.520371 0.770348 0.368389 +vn -0.520371 0.770348 0.368389 +vn 0.852718 0.504257 0.136204 +vn -0.852718 0.504257 0.136204 +vn 0.000000 0.970214 0.242164 +vn -0.709647 0.261818 0.654042 +vn 0.067293 -0.064272 0.995636 +vn -0.246590 -0.034089 0.968505 +vn -0.809717 -0.010224 0.586688 +vn 0.246590 -0.034089 0.968505 +vn -0.067293 -0.064272 0.995636 +vn 0.709647 0.261818 0.654042 +vn 0.809717 -0.010224 0.586688 +vn -0.465835 -0.080325 0.881191 +vn -0.737114 -0.244179 0.630085 +vn 0.465835 -0.080325 0.881191 +vn 0.737114 -0.244179 0.630085 +vn -0.211951 -0.085971 0.973479 +vn -0.367504 -0.376476 0.850398 +vn 0.211951 -0.085971 0.973479 +vn 0.367504 -0.376476 0.850398 +vn -0.430280 0.556597 0.710624 +vn -0.020081 -0.072939 0.997131 +vn 0.020081 -0.072939 0.997131 +vn 0.430280 0.556597 0.710624 +vn -0.090976 0.597339 0.796777 +vn -0.187933 -0.091617 0.977874 +vn 0.187933 -0.091617 0.977874 +vn 0.090976 0.597339 0.796777 +vn 0.165929 0.609363 0.775292 +vn -0.203314 0.092532 0.974700 +vn 0.203314 0.092532 0.974700 +vn -0.165929 0.609363 0.775292 +vn 0.269295 0.241676 0.932218 +vn -0.314219 -0.132420 0.940062 +vn 0.314219 -0.132420 0.940062 +vn -0.269295 0.241676 0.932218 +vn 0.420057 -0.118992 0.899625 +vn -0.119755 -0.070925 0.990234 +vn 0.119755 -0.070925 0.990234 +vn -0.420057 -0.118992 0.899625 +vn 0.226142 -0.606586 0.762139 +vn -0.320841 0.040712 0.946226 +vn 0.320841 0.040712 0.946226 +vn -0.226142 -0.606586 0.762139 +vn 0.232612 -0.746055 0.623890 +vn -0.074557 -0.391644 0.917081 +vn 0.074557 -0.391644 0.917081 +vn -0.232612 -0.746055 0.623890 +vn -0.121250 -0.313883 0.941679 +vn -0.146702 -0.035707 0.988525 +vn 0.146702 -0.035707 0.988525 +vn 0.121250 -0.313883 0.941679 +vn -0.216834 -0.273721 0.937010 +vn -0.187445 0.001160 0.982269 +vn 0.187445 0.001160 0.982269 +vn 0.216834 -0.273721 0.937010 +vn -0.303018 -0.201941 0.931333 +vn -0.253090 -0.161809 0.953795 +vn 0.253090 -0.161809 0.953795 +vn 0.303018 -0.201941 0.931333 +vn -0.140110 -0.091189 0.985900 +vn 0.140110 -0.091189 0.985900 +vn -0.237983 0.050172 0.969939 +vn 0.237983 0.050172 0.969939 +vn -0.312662 -0.237922 0.919553 +vn 0.312662 -0.237922 0.919553 +vn -0.373791 -0.105197 0.921506 +vn 0.373791 -0.105197 0.921506 +vn -0.470595 -0.164647 0.866817 +vn 0.470595 -0.164647 0.866817 +vn -0.439222 -0.376141 0.815821 +vn 0.439222 -0.376141 0.815821 +vn -0.219611 -0.540635 0.812037 +vn 0.219611 -0.540635 0.812037 +vn 0.166967 -0.374828 0.911893 +vn -0.166967 -0.374828 0.911893 +vn 0.201849 -0.277596 0.939238 +vn -0.201849 -0.277596 0.939238 +vn 0.001160 -0.165563 0.986175 +vn -0.001160 -0.165563 0.986175 +vn 0.292917 -0.174108 0.940123 +vn -0.292917 -0.174108 0.940123 +vn 0.000000 0.732200 0.681051 +vn 0.000000 -0.603626 0.797266 +vn 0.000000 -0.971740 0.235908 +vn 0.131779 -0.608295 0.782678 +vn -0.131779 -0.608295 0.782678 +vn 0.759117 0.068392 0.647298 +vn -0.759117 0.068392 0.647298 +vn 0.405957 0.643605 0.648793 +vn -0.405957 0.643605 0.648793 +vn 0.000000 0.598346 0.801202 +vn 0.073855 -0.330546 0.940855 +vn 0.000000 -0.124516 0.992187 +vn -0.073855 -0.330546 0.940855 +vn -0.085116 -0.339244 0.936827 +vn 0.085116 -0.339244 0.936827 +vn -0.141881 -0.148350 0.978698 +vn 0.141881 -0.148350 0.978698 +vn 0.000000 -0.482803 0.875698 +vn -0.692984 -0.001343 0.720908 +vn -0.095523 -0.326090 0.940489 +vn 0.095523 -0.326090 0.940489 +vn 0.692984 -0.001343 0.720908 +vn -0.646687 0.162603 0.745201 +vn 0.646687 0.162603 0.745201 +vn -0.593463 0.121860 0.795556 +vn 0.593463 0.121860 0.795556 +vn -0.124363 0.009674 0.992187 +vn -0.509995 -0.457717 0.728233 +vn 0.509995 -0.457717 0.728233 +vn 0.124363 0.009674 0.992187 +vn -0.972137 -0.167882 0.163549 +vn 0.972137 -0.167882 0.163549 +vn -0.715995 0.572161 0.399945 +vn 0.715995 0.572161 0.399945 +vn 0.000000 0.430525 0.902554 +vn 0.000000 0.010865 0.999939 +vn -0.221839 -0.606037 0.763848 +vn 0.000000 -0.492935 0.870022 +vn 0.000000 0.010315 0.999939 +vn -0.294320 -0.184484 0.937712 +vn 0.221839 -0.606037 0.763848 +vn 0.294320 -0.184484 0.937712 +vn -0.396924 0.534989 0.745781 +vn 0.247780 0.568224 0.784661 +vn -0.247780 0.568224 0.784661 +vn 0.396924 0.534989 0.745781 +vn -0.868221 -0.261330 0.421735 +vn -0.555986 -0.690695 0.462355 +vn 0.868221 -0.261330 0.421735 +vn 0.555986 -0.690695 0.462355 +vn -0.753075 0.649892 0.102298 +vn 0.753075 0.649892 0.102298 +vn 0.194189 0.935697 0.294473 +vn -0.194189 0.935697 0.294473 +vn 0.000000 0.788965 0.614399 +vn 0.000000 -0.888638 0.458571 +vn 0.000000 -0.336772 0.941557 +vn 0.000000 -0.251991 0.967711 +vn -0.188360 -0.040132 0.981262 +vn 0.000000 -0.032899 0.999451 +vn 0.188360 -0.040132 0.981262 +vn 0.000000 0.000000 1.000000 +vn -0.572039 -0.018708 0.820002 +vn -0.536332 -0.212409 0.816828 +vn 0.536332 -0.212409 0.816828 +vn 0.572039 -0.018708 0.820002 +vn -0.357707 -0.638325 0.681570 +vn 0.357707 -0.638325 0.681570 +vn -0.154302 -0.754112 0.638325 +vn 0.154302 -0.754112 0.638325 +vn 0.000000 -0.743461 0.668752 +vn 0.000000 -0.189123 0.981933 +vn 0.000000 -0.114475 0.993408 +vn 0.001404 -0.055635 0.998444 +vn -0.001404 -0.055635 0.998444 +vn -0.336283 -0.512833 0.789850 +vn 0.336283 -0.512833 0.789850 +vn -0.454543 -0.337077 0.824458 +vn 0.454543 -0.337077 0.824458 +vn -0.543474 -0.308603 0.780602 +vn 0.543474 -0.308603 0.780602 +vn -0.387158 -0.187811 0.902646 +vn 0.387158 -0.187811 0.902646 +vn -0.430647 -0.144902 0.890805 +vn 0.430647 -0.144902 0.890805 +vn -0.234016 -0.120548 0.964721 +vn 0.234016 -0.120548 0.964721 +vn -0.263833 0.168798 0.949675 +vn 0.263833 0.168798 0.949675 +vn 0.196722 0.141881 0.970122 +vn -0.196722 0.141881 0.970122 +vn -0.906766 -0.008332 0.421522 +vn -0.744133 -0.640919 0.188269 +vn 0.744133 -0.640919 0.188269 +vn 0.906766 -0.008332 0.421522 +vn -0.044191 -0.974395 0.220313 +vn 0.044191 -0.974395 0.220313 +vn 0.639943 -0.761498 0.102786 +vn -0.639943 -0.761498 0.102786 +vn 0.955504 -0.011444 0.294717 +vn -0.955504 -0.011444 0.294717 +vn 0.649678 0.754387 0.093570 +vn -0.649678 0.754387 0.093570 +vn -0.037049 0.978881 0.200903 +vn 0.037049 0.978881 0.200903 +vn -0.752342 0.635395 0.173742 +vn 0.752342 0.635395 0.173742 +vn -0.811792 -0.002777 0.583880 +vn -0.596942 0.486770 0.637684 +vn 0.596942 0.486770 0.637684 +vn 0.811792 -0.002777 0.583880 +vn -0.868221 -0.005829 0.496109 +vn -0.719504 0.473006 0.508469 +vn 0.719504 0.473006 0.508469 +vn 0.868221 -0.005829 0.496109 +vn -0.204260 0.828761 0.520951 +vn -0.095767 0.717277 0.690146 +vn 0.095767 0.717277 0.690146 +vn 0.204260 0.828761 0.520951 +vn 0.451704 0.459883 0.764458 +vn -0.451704 0.459883 0.764458 +vn 0.450362 0.693899 0.561815 +vn -0.450362 0.693899 0.561815 +vn 0.805536 0.109409 0.582324 +vn 0.691488 -0.074099 0.718558 +vn -0.691488 -0.074099 0.718558 +vn -0.805536 0.109409 0.582324 +vn 0.386212 -0.474685 0.790857 +vn -0.386212 -0.474685 0.790857 +vn 0.557756 -0.629109 0.541368 +vn -0.557756 -0.629109 0.541368 +vn -0.091159 -0.723716 0.684011 +vn -0.199744 -0.858058 0.473067 +vn 0.091159 -0.723716 0.684011 +vn 0.199744 -0.858058 0.473067 +vn -0.597949 -0.496475 0.629231 +vn 0.597949 -0.496475 0.629231 +vn -0.723197 -0.488907 0.487747 +vn 0.723197 -0.488907 0.487747 +usemtl Material_ray.png +s 1 +f 61/1/1 65/2/2 49/3/3 +f 50/4/4 66/5/5 62/6/6 +f 63/7/7 65/2/2 61/1/1 +f 62/6/6 66/5/5 64/8/8 +f 61/1/1 59/9/9 63/7/7 +f 64/8/8 60/10/10 62/6/6 +f 61/1/1 57/11/11 59/9/9 +f 60/10/10 58/12/12 62/6/6 +f 61/1/1 55/13/13 57/11/11 +f 58/12/12 56/14/14 62/6/6 +f 61/1/1 53/15/15 55/13/13 +f 56/14/14 54/16/16 62/6/6 +f 61/1/1 51/17/17 53/15/15 +f 54/16/16 52/18/18 62/6/6 +f 61/1/1 49/3/3 51/17/17 +f 52/18/18 50/4/4 62/6/6 +f 225/19/19 229/20/20 227/21/21 +f 228/22/22 230/23/23 226/24/24 +f 73/25/25 284/26/26 74/27/27 +f 74/28/27 285/29/28 73/30/25 +f 342/31/29 348/32/30 384/33/31 +f 385/34/32 349/35/33 343/36/34 +f 300/37/35 346/38/36 344/39/37 +f 345/40/38 347/41/39 301/42/40 +f 324/43/41 380/44/42 352/45/43 +f 353/46/44 381/47/45 325/48/46 +f 442/49/47 444/50/48 446/51/49 +f 447/52/50 445/53/51 443/54/52 +f 464/55/53 492/56/54 466/57/55 +f 467/58/56 493/59/57 465/60/58 +f 496/61/59 498/62/60 500/63/61 +f 501/64/62 499/65/63 497/66/64 +f 505/67/65 323/68/66 321/69/67 +f 505/67/65 321/69/67 391/70/68 +f 320/71/69 322/72/70 504/73/71 +f 320/71/69 504/73/71 390/74/72 +f 505/67/65 507/75/73 315/76/74 +f 505/67/65 315/76/74 323/68/66 +f 314/77/75 506/78/76 504/73/71 +f 314/77/75 504/73/71 322/72/70 +f 389/79/77 383/80/78 507/75/73 +f 383/80/78 315/76/74 507/75/73 +f 314/77/75 382/81/79 506/78/76 +f 382/81/79 388/82/80 506/78/76 +f 501/64/62 497/66/64 495/83/81 +f 501/64/62 495/83/81 503/84/82 +f 494/85/83 496/61/59 500/63/61 +f 494/85/83 500/63/61 502/86/84 +f 505/67/65 503/84/82 507/75/73 +f 503/84/82 495/83/81 507/75/73 +f 494/85/83 502/86/84 506/78/76 +f 502/86/84 504/73/71 506/78/76 +f 495/83/81 401/87/85 507/75/73 +f 401/87/85 389/79/77 507/75/73 +f 388/82/80 400/88/86 506/78/76 +f 400/88/86 494/85/83 506/78/76 +f 497/66/64 399/89/87 495/83/81 +f 399/89/87 401/87/85 495/83/81 +f 400/88/86 398/90/88 494/85/83 +f 398/90/88 496/61/59 494/85/83 +f 499/65/63 397/91/89 497/66/64 +f 397/91/89 399/89/87 497/66/64 +f 398/90/88 396/92/90 496/61/59 +f 396/92/90 498/62/60 496/61/59 +f 501/64/62 395/93/91 499/65/63 +f 395/93/91 397/91/89 499/65/63 +f 396/92/90 394/94/92 498/62/60 +f 394/94/92 500/63/61 498/62/60 +f 503/84/82 393/95/93 395/93/91 +f 503/84/82 395/93/91 501/64/62 +f 394/94/92 392/96/94 502/86/84 +f 394/94/92 502/86/84 500/63/61 +f 505/67/65 391/70/68 393/95/93 +f 505/67/65 393/95/93 503/84/82 +f 392/96/94 390/74/72 504/73/71 +f 392/96/94 504/73/71 502/86/84 +f 491/97/95 493/59/57 467/58/56 +f 491/97/95 467/58/56 469/98/96 +f 466/57/55 492/56/54 490/99/97 +f 466/57/55 490/99/97 468/100/98 +f 489/101/99 491/97/95 471/102/100 +f 491/97/95 469/98/96 471/102/100 +f 468/100/98 490/99/97 470/103/101 +f 490/99/97 488/104/102 470/103/101 +f 483/105/103 489/101/99 473/106/104 +f 489/101/99 471/102/100 473/106/104 +f 470/103/101 488/104/102 472/107/105 +f 488/104/102 482/108/106 472/107/105 +f 481/109/107 483/105/103 473/106/104 +f 481/109/107 473/106/104 475/110/108 +f 472/107/105 482/108/106 480/111/109 +f 472/107/105 480/111/109 474/112/110 +f 481/109/107 475/110/108 457/113/111 +f 475/110/108 455/114/112 457/113/111 +f 454/115/113 474/112/110 456/116/114 +f 474/112/110 480/111/109 456/116/114 +f 463/117/115 479/118/116 459/119/117 +f 463/117/115 459/119/117 461/120/118 +f 458/121/119 478/122/120 462/123/121 +f 458/121/119 462/123/121 460/124/122 +f 479/118/116 463/117/115 485/125/123 +f 463/117/115 453/126/124 485/125/123 +f 452/127/125 462/123/121 484/128/126 +f 462/123/121 478/122/120 484/128/126 +f 487/129/127 485/125/123 477/130/128 +f 485/125/123 453/126/124 477/130/128 +f 452/127/125 484/128/126 476/131/129 +f 484/128/126 486/132/130 476/131/129 +f 487/129/127 477/130/128 465/60/58 +f 487/129/127 465/60/58 493/59/57 +f 464/55/53 476/131/129 486/132/130 +f 464/55/53 486/132/130 492/56/54 +f 491/97/95 489/101/99 493/59/57 +f 489/101/99 487/129/127 493/59/57 +f 486/132/130 488/104/102 492/56/54 +f 488/104/102 490/99/97 492/56/54 +f 489/101/99 483/105/103 485/125/123 +f 489/101/99 485/125/123 487/129/127 +f 484/128/126 482/108/106 488/104/102 +f 484/128/126 488/104/102 486/132/130 +f 483/105/103 481/109/107 485/125/123 +f 481/109/107 479/118/116 485/125/123 +f 478/122/120 480/111/109 484/128/126 +f 480/111/109 482/108/106 484/128/126 +f 481/109/107 457/113/111 479/118/116 +f 457/113/111 459/119/117 479/118/116 +f 458/121/119 456/116/114 478/122/120 +f 456/116/114 480/111/109 478/122/120 +f 473/106/104 421/133/131 475/110/108 +f 421/133/131 419/134/132 475/110/108 +f 418/135/133 420/136/134 474/112/110 +f 420/136/134 472/107/105 474/112/110 +f 471/102/100 423/137/135 473/106/104 +f 423/137/135 421/133/131 473/106/104 +f 420/136/134 422/138/136 472/107/105 +f 422/138/136 470/103/101 472/107/105 +f 469/98/96 425/139/137 471/102/100 +f 425/139/137 423/137/135 471/102/100 +f 422/138/136 424/140/138 470/103/101 +f 424/140/138 468/100/98 470/103/101 +f 467/58/56 427/141/139 425/139/137 +f 467/58/56 425/139/137 469/98/96 +f 424/140/138 426/142/140 466/57/55 +f 424/140/138 466/57/55 468/100/98 +f 465/60/58 429/143/141 427/141/139 +f 465/60/58 427/141/139 467/58/56 +f 426/142/140 428/144/142 464/55/53 +f 426/142/140 464/55/53 466/57/55 +f 477/130/128 417/145/143 429/143/141 +f 477/130/128 429/143/141 465/60/58 +f 428/144/142 416/146/144 476/131/129 +f 428/144/142 476/131/129 464/55/53 +f 475/110/108 419/134/132 441/147/145 +f 475/110/108 441/147/145 455/114/112 +f 440/148/146 418/135/133 474/112/110 +f 440/148/146 474/112/110 454/115/113 +f 455/114/112 441/147/145 439/149/147 +f 455/114/112 439/149/147 457/113/111 +f 438/150/148 440/148/146 454/115/113 +f 438/150/148 454/115/113 456/116/114 +f 457/113/111 439/149/147 459/119/117 +f 439/149/147 437/151/149 459/119/117 +f 436/152/150 438/150/148 458/121/119 +f 438/150/148 456/116/114 458/121/119 +f 459/119/117 437/151/149 461/120/118 +f 437/151/149 435/153/151 461/120/118 +f 434/154/152 436/152/150 460/124/122 +f 436/152/150 458/121/119 460/124/122 +f 461/120/118 435/153/151 433/155/153 +f 461/120/118 433/155/153 463/117/115 +f 432/156/154 434/154/152 460/124/122 +f 432/156/154 460/124/122 462/123/121 +f 463/117/115 433/155/153 453/126/124 +f 433/155/153 451/157/155 453/126/124 +f 450/158/156 432/156/154 452/127/125 +f 432/156/154 462/123/121 452/127/125 +f 453/126/124 451/157/155 417/145/143 +f 453/126/124 417/145/143 477/130/128 +f 416/146/144 450/158/156 452/127/125 +f 416/146/144 452/127/125 476/131/129 +f 447/52/50 443/54/52 449/159/157 +f 443/54/52 313/160/158 449/159/157 +f 312/161/159 442/49/47 448/162/160 +f 442/49/47 446/51/49 448/162/160 +f 431/163/161 449/159/157 383/80/78 +f 449/159/157 313/160/158 383/80/78 +f 312/161/159 448/162/160 382/164/79 +f 448/162/160 430/165/162 382/164/79 +f 451/157/155 431/163/161 417/145/143 +f 431/163/161 415/166/163 417/145/143 +f 414/167/164 430/165/162 416/146/144 +f 430/165/162 450/158/156 416/146/144 +f 433/155/153 449/159/157 451/157/155 +f 449/159/157 431/163/161 451/157/155 +f 430/165/162 448/162/160 450/158/156 +f 448/162/160 432/156/154 450/158/156 +f 447/52/50 449/159/157 435/153/151 +f 449/159/157 433/155/153 435/153/151 +f 432/156/154 448/162/160 434/154/152 +f 448/162/160 446/51/49 434/154/152 +f 439/149/147 447/52/50 435/153/151 +f 439/149/147 435/153/151 437/151/149 +f 434/154/152 446/51/49 438/150/148 +f 434/154/152 438/150/148 436/152/150 +f 445/53/51 447/52/50 441/147/145 +f 447/52/50 439/149/147 441/147/145 +f 438/150/148 446/51/49 440/148/146 +f 446/51/49 444/50/48 440/148/146 +f 441/147/145 419/134/132 413/168/165 +f 441/147/145 413/168/165 445/53/51 +f 412/169/166 418/135/133 440/148/146 +f 412/169/166 440/148/146 444/50/48 +f 415/166/163 431/163/161 383/80/78 +f 415/166/163 383/80/78 389/79/77 +f 382/164/79 430/165/162 414/167/164 +f 382/164/79 414/167/164 388/170/80 +f 443/171/52 319/172/167 311/173/168 +f 443/171/52 311/173/168 313/174/158 +f 310/175/169 318/176/170 442/177/47 +f 310/175/169 442/177/47 312/178/159 +f 413/168/165 391/179/68 445/53/51 +f 391/179/68 321/180/67 445/53/51 +f 320/181/69 390/182/72 444/50/48 +f 390/182/72 412/169/166 444/50/48 +f 445/53/51 321/180/67 443/54/52 +f 321/183/67 319/172/167 443/171/52 +f 318/176/170 320/184/69 442/177/47 +f 320/181/69 444/50/48 442/49/47 +f 417/145/143 415/166/163 403/185/171 +f 417/145/143 403/185/171 429/143/141 +f 402/186/172 414/167/164 416/146/144 +f 402/186/172 416/146/144 428/144/142 +f 427/141/139 429/143/141 405/187/173 +f 429/143/141 403/185/171 405/187/173 +f 402/186/172 428/144/142 404/188/174 +f 428/144/142 426/142/140 404/188/174 +f 425/139/137 427/141/139 407/189/175 +f 427/141/139 405/187/173 407/189/175 +f 404/188/174 426/142/140 406/190/176 +f 426/142/140 424/140/138 406/190/176 +f 423/137/135 425/139/137 409/191/177 +f 425/139/137 407/189/175 409/191/177 +f 406/190/176 424/140/138 408/192/178 +f 424/140/138 422/138/136 408/192/178 +f 421/133/131 423/137/135 409/191/177 +f 421/133/131 409/191/177 411/193/179 +f 408/192/178 422/138/136 420/136/134 +f 408/192/178 420/136/134 410/194/180 +f 419/134/132 421/133/131 411/193/179 +f 419/134/132 411/193/179 413/168/165 +f 410/194/180 420/136/134 418/135/133 +f 410/194/180 418/135/133 412/169/166 +f 413/168/165 411/193/179 393/195/93 +f 413/168/165 393/195/93 391/179/68 +f 392/196/94 410/194/180 412/169/166 +f 392/196/94 412/169/166 390/182/72 +f 411/193/179 409/191/177 393/195/93 +f 409/191/177 395/197/91 393/195/93 +f 394/198/92 408/192/178 392/196/94 +f 408/192/178 410/194/180 392/196/94 +f 409/191/177 407/189/175 395/197/91 +f 407/189/175 397/199/89 395/197/91 +f 396/200/90 406/190/176 394/198/92 +f 406/190/176 408/192/178 394/198/92 +f 407/189/175 405/187/173 397/199/89 +f 405/187/173 399/89/87 397/199/89 +f 398/201/88 404/188/174 396/200/90 +f 404/188/174 406/190/176 396/200/90 +f 405/187/173 403/185/171 401/87/85 +f 405/187/173 401/87/85 399/89/87 +f 400/202/86 402/186/172 404/188/174 +f 400/202/86 404/188/174 398/201/88 +f 415/166/163 389/79/77 403/185/171 +f 389/79/77 401/87/85 403/185/171 +f 400/202/86 388/170/80 402/186/172 +f 388/170/80 414/167/164 402/186/172 +f 381/47/45 353/46/44 387/203/181 +f 353/46/44 351/204/182 387/203/181 +f 350/205/183 352/45/43 386/206/184 +f 352/45/43 380/44/42 386/206/184 +f 381/47/45 387/203/181 323/207/66 +f 387/203/181 321/183/67 323/207/66 +f 320/184/69 386/206/184 322/208/70 +f 386/206/184 380/44/42 322/208/70 +f 381/47/45 379/209/185 325/48/46 +f 379/209/185 317/210/186 325/48/46 +f 316/211/187 378/212/188 324/43/41 +f 378/212/188 380/44/42 324/43/41 +f 381/47/45 323/207/66 379/209/185 +f 323/207/66 315/213/74 379/209/185 +f 314/214/75 322/208/70 378/212/188 +f 322/208/70 380/44/42 378/212/188 +f 343/36/34 345/40/38 301/42/40 +f 343/36/34 301/42/40 385/34/32 +f 300/37/35 344/39/37 342/31/29 +f 300/37/35 342/31/29 384/33/31 +f 385/34/32 301/42/40 299/215/189 +f 385/34/32 299/215/189 319/172/167 +f 298/216/190 300/37/35 384/33/31 +f 298/216/190 384/33/31 318/176/170 +f 387/203/181 385/34/32 321/183/67 +f 385/34/32 319/172/167 321/183/67 +f 318/176/170 384/33/31 320/184/69 +f 384/33/31 386/206/184 320/184/69 +f 387/203/181 351/204/182 385/34/32 +f 351/204/182 349/35/33 385/34/32 +f 348/32/30 350/205/183 384/33/31 +f 350/205/183 386/206/184 384/33/31 +f 371/217/191 377/218/192 383/219/78 +f 377/218/192 315/213/74 383/219/78 +f 314/214/75 376/220/193 382/221/79 +f 376/220/193 370/222/194 382/221/79 +f 371/217/191 383/219/78 313/174/158 +f 371/217/191 313/174/158 369/223/195 +f 312/178/159 382/221/79 370/222/194 +f 312/178/159 370/222/194 368/224/196 +f 369/223/195 313/174/158 311/173/168 +f 369/223/195 311/173/168 363/225/197 +f 310/175/169 312/178/159 368/224/196 +f 310/175/169 368/224/196 362/226/198 +f 311/173/168 297/227/199 363/225/197 +f 297/227/199 295/228/200 363/225/197 +f 294/229/201 296/230/202 362/226/198 +f 296/230/202 310/175/169 362/226/198 +f 361/231/203 291/232/204 285/29/28 +f 361/231/203 285/29/28 74/28/27 +f 284/26/26 290/233/205 360/234/206 +f 284/26/26 360/234/206 74/27/27 +f 289/235/207 287/236/208 291/232/204 +f 287/236/208 285/29/28 291/232/204 +f 284/26/26 286/237/209 290/233/205 +f 286/237/209 288/238/210 290/233/205 +f 359/239/211 361/231/203 302/240/212 +f 361/231/203 74/28/27 302/240/212 +f 74/27/27 360/234/206 302/241/212 +f 360/234/206 358/242/213 302/241/212 +f 365/243/214 293/244/215 361/231/203 +f 293/244/215 291/232/204 361/231/203 +f 290/233/205 292/245/216 360/234/206 +f 292/245/216 364/246/217 360/234/206 +f 365/243/214 361/231/203 359/239/211 +f 365/243/214 359/239/211 367/247/218 +f 358/242/213 360/234/206 364/246/217 +f 358/242/213 364/246/217 366/248/219 +f 367/247/218 359/239/211 357/249/220 +f 367/247/218 357/249/220 373/250/221 +f 356/251/222 358/242/213 366/248/219 +f 356/251/222 366/248/219 372/252/223 +f 373/250/221 357/249/220 355/253/224 +f 373/250/221 355/253/224 375/254/225 +f 354/255/226 356/251/222 372/252/223 +f 354/255/226 372/252/223 374/256/227 +f 375/254/225 355/253/224 317/210/186 +f 375/254/225 317/210/186 379/209/185 +f 316/211/187 354/255/226 374/256/227 +f 316/211/187 374/256/227 378/212/188 +f 375/254/225 379/209/185 377/218/192 +f 379/209/185 315/213/74 377/218/192 +f 314/214/75 378/212/188 376/220/193 +f 378/212/188 374/256/227 376/220/193 +f 377/218/192 371/217/191 373/250/221 +f 377/218/192 373/250/221 375/254/225 +f 372/252/223 370/222/194 376/220/193 +f 372/252/223 376/220/193 374/256/227 +f 371/217/191 369/223/195 367/247/218 +f 371/217/191 367/247/218 373/250/221 +f 366/248/219 368/224/196 370/222/194 +f 366/248/219 370/222/194 372/252/223 +f 369/223/195 363/225/197 365/243/214 +f 369/223/195 365/243/214 367/247/218 +f 364/246/217 362/226/198 368/224/196 +f 364/246/217 368/224/196 366/248/219 +f 363/225/197 295/228/200 293/244/215 +f 363/225/197 293/244/215 365/243/214 +f 292/245/216 294/229/201 362/226/198 +f 292/245/216 362/226/198 364/246/217 +f 317/210/186 355/253/224 75/257/228 +f 317/210/186 75/257/228 76/258/229 +f 75/259/228 354/255/226 316/211/187 +f 75/259/228 316/211/187 76/260/229 +f 355/253/224 357/249/220 303/261/230 +f 355/253/224 303/261/230 75/257/228 +f 303/262/230 356/251/222 354/255/226 +f 303/262/230 354/255/226 75/259/228 +f 357/249/220 359/239/211 303/261/230 +f 359/239/211 302/240/212 303/261/230 +f 302/241/212 358/242/213 303/262/230 +f 358/242/213 356/251/222 303/262/230 +f 325/48/46 317/210/186 77/263/231 +f 317/210/186 76/258/229 77/263/231 +f 76/260/229 316/211/187 77/264/231 +f 316/211/187 324/43/41 77/264/231 +f 319/172/167 299/215/189 297/227/199 +f 319/172/167 297/227/199 311/173/168 +f 296/230/202 298/216/190 318/176/170 +f 296/230/202 318/176/170 310/175/169 +f 349/35/33 329/265/232 343/36/34 +f 329/265/232 327/266/233 343/36/34 +f 326/267/234 328/268/235 342/31/29 +f 328/268/235 348/32/30 342/31/29 +f 329/265/232 349/35/33 305/269/236 +f 329/265/232 305/269/236 309/270/237 +f 305/271/236 348/32/30 328/268/235 +f 305/271/236 328/268/235 309/272/237 +f 349/35/33 351/204/182 78/273/238 +f 349/35/33 78/273/238 305/269/236 +f 78/274/238 350/205/183 348/32/30 +f 78/274/238 348/32/30 305/271/236 +f 351/204/182 353/46/44 78/273/238 +f 353/46/44 304/275/239 78/273/238 +f 304/276/239 352/45/43 78/274/238 +f 352/45/43 350/205/183 78/274/238 +f 353/46/44 325/48/46 304/275/239 +f 325/48/46 77/263/231 304/275/239 +f 77/264/231 324/43/41 304/276/239 +f 324/43/41 352/45/43 304/276/239 +f 301/42/40 347/41/39 93/277/240 +f 347/278/39 80/279/241 93/280/240 +f 79/281/242 346/282/36 92/283/243 +f 346/38/36 300/37/35 92/284/243 +f 345/40/38 216/285/244 347/41/39 +f 216/286/244 80/279/241 347/278/39 +f 79/281/242 215/287/245 346/282/36 +f 215/288/245 344/39/37 346/38/36 +f 343/36/34 327/266/233 210/289/246 +f 327/266/233 82/290/247 210/289/246 +f 81/291/248 326/267/234 209/292/249 +f 326/267/234 342/31/29 209/292/249 +f 345/40/38 343/36/34 216/285/244 +f 343/36/34 210/289/246 216/285/244 +f 209/292/249 342/31/29 215/288/245 +f 342/31/29 344/39/37 215/288/245 +f 333/293/250 84/294/251 82/290/247 +f 333/293/250 82/290/247 327/266/233 +f 81/291/248 83/295/252 332/296/253 +f 81/291/248 332/296/253 326/267/234 +f 339/297/254 333/293/250 329/265/232 +f 333/293/250 327/266/233 329/265/232 +f 326/267/234 332/296/253 328/268/235 +f 332/296/253 338/298/255 328/268/235 +f 341/299/256 335/300/257 337/301/258 +f 335/300/257 331/302/259 337/301/258 +f 330/303/260 334/304/261 336/305/262 +f 334/304/261 340/306/263 336/305/262 +f 339/297/254 337/301/258 331/302/259 +f 339/297/254 331/302/259 333/293/250 +f 330/303/260 336/305/262 338/298/255 +f 330/303/260 338/298/255 332/296/253 +f 331/302/259 86/307/264 84/294/251 +f 331/302/259 84/294/251 333/293/250 +f 83/295/252 85/308/265 330/303/260 +f 83/295/252 330/303/260 332/296/253 +f 335/300/257 88/309/266 86/307/264 +f 335/300/257 86/307/264 331/302/259 +f 85/308/265 87/310/267 334/304/261 +f 85/308/265 334/304/261 330/303/260 +f 341/299/256 90/311/268 88/309/266 +f 341/299/256 88/309/266 335/300/257 +f 87/310/267 89/312/269 340/306/263 +f 87/310/267 340/306/263 334/304/261 +f 306/313/270 91/314/271 90/311/268 +f 306/313/270 90/311/268 341/299/256 +f 89/312/269 91/315/271 306/316/270 +f 89/312/269 306/316/270 340/306/263 +f 337/301/258 307/317/272 341/299/256 +f 307/317/272 306/313/270 341/299/256 +f 306/316/270 307/318/272 340/306/263 +f 307/318/272 336/305/262 340/306/263 +f 339/297/254 308/319/273 337/301/258 +f 308/319/273 307/317/272 337/301/258 +f 307/318/272 308/320/273 336/305/262 +f 308/320/273 338/298/255 336/305/262 +f 329/265/232 309/270/237 339/297/254 +f 309/270/237 308/319/273 339/297/254 +f 308/320/273 309/272/237 338/298/255 +f 309/272/237 328/268/235 338/298/255 +f 301/42/40 93/277/240 95/321/274 +f 301/42/40 95/321/274 299/215/189 +f 94/322/275 92/284/243 300/37/35 +f 94/322/275 300/37/35 298/216/190 +f 299/215/189 95/321/274 97/323/276 +f 299/215/189 97/323/276 297/227/199 +f 96/324/277 94/322/275 298/216/190 +f 96/324/277 298/216/190 296/230/202 +f 297/227/199 97/323/276 295/228/200 +f 97/323/276 99/325/278 295/228/200 +f 98/326/279 96/324/277 294/229/201 +f 96/324/277 296/230/202 294/229/201 +f 295/228/200 99/325/278 101/327/280 +f 295/228/200 101/327/280 293/244/215 +f 100/328/281 98/326/279 294/229/201 +f 100/328/281 294/229/201 292/245/216 +f 293/244/215 101/327/280 291/232/204 +f 101/327/280 103/329/282 291/232/204 +f 102/330/283 100/328/281 290/233/205 +f 100/328/281 292/245/216 290/233/205 +f 291/232/204 103/329/282 289/235/207 +f 103/329/282 105/331/284 289/235/207 +f 104/332/285 102/330/283 288/238/210 +f 102/330/283 290/233/205 288/238/210 +f 289/235/207 105/331/284 287/236/208 +f 105/331/284 107/333/286 287/236/208 +f 106/334/287 104/332/285 286/237/209 +f 104/332/285 288/238/210 286/237/209 +f 287/236/208 107/333/286 109/335/288 +f 287/236/208 109/335/288 285/29/28 +f 108/336/289 106/334/287 286/237/209 +f 108/336/289 286/237/209 284/26/26 +f 285/29/28 109/335/288 67/337/290 +f 285/29/28 67/337/290 73/30/25 +f 67/338/290 108/336/289 284/26/26 +f 67/338/290 284/26/26 73/25/25 +f 281/339/291 235/340/292 233/341/293 +f 281/339/291 233/341/293 283/342/294 +f 232/343/295 234/344/296 280/345/297 +f 232/343/295 280/345/297 282/346/298 +f 283/342/294 233/341/293 255/347/299 +f 283/342/294 255/347/299 261/348/300 +f 254/349/301 232/343/295 282/346/298 +f 254/349/301 282/346/298 260/350/302 +f 261/348/300 255/347/299 257/351/303 +f 261/348/300 257/351/303 259/352/304 +f 256/353/305 254/349/301 260/350/302 +f 256/353/305 260/350/302 258/354/306 +f 263/355/307 253/356/308 235/340/292 +f 263/355/307 235/340/292 281/339/291 +f 234/344/296 252/357/309 262/358/310 +f 234/344/296 262/358/310 280/345/297 +f 265/359/311 251/360/312 263/355/307 +f 251/360/312 253/356/308 263/355/307 +f 252/357/309 250/361/313 262/358/310 +f 250/361/313 264/362/314 262/358/310 +f 267/363/315 249/364/316 265/359/311 +f 249/364/316 251/360/312 265/359/311 +f 250/361/313 248/365/317 264/362/314 +f 248/365/317 266/366/318 264/362/314 +f 269/367/319 247/368/320 249/364/316 +f 269/367/319 249/364/316 267/363/315 +f 248/365/317 246/369/321 268/370/322 +f 248/365/317 268/370/322 266/366/318 +f 271/371/323 245/372/324 269/367/319 +f 245/372/324 247/368/320 269/367/319 +f 246/369/321 244/373/325 268/370/322 +f 244/373/325 270/374/326 268/370/322 +f 273/375/327 243/376/328 245/372/324 +f 273/375/327 245/372/324 271/371/323 +f 244/373/325 242/377/329 272/378/330 +f 244/373/325 272/378/330 270/374/326 +f 275/379/331 241/380/332 273/375/327 +f 241/380/332 243/376/328 273/375/327 +f 242/377/329 240/381/333 272/378/330 +f 240/381/333 274/382/334 272/378/330 +f 279/383/335 237/384/336 275/379/331 +f 237/384/336 241/380/332 275/379/331 +f 240/381/333 236/385/337 274/382/334 +f 236/385/337 278/386/338 274/382/334 +f 277/387/339 239/388/340 237/384/336 +f 277/387/339 237/384/336 279/383/335 +f 236/385/337 238/389/341 276/390/342 +f 236/385/337 276/390/342 278/386/338 +f 259/352/304 257/351/303 239/388/340 +f 259/352/304 239/388/340 277/387/339 +f 238/389/341 256/353/305 258/354/306 +f 238/389/341 258/354/306 276/390/342 +f 257/351/303 111/391/343 129/392/344 +f 257/351/303 129/392/344 239/388/340 +f 128/393/345 110/394/346 256/353/305 +f 128/393/345 256/353/305 238/389/341 +f 239/388/340 129/392/344 180/395/347 +f 239/388/340 180/395/347 237/384/336 +f 179/396/348 128/393/345 238/389/341 +f 179/396/348 238/389/341 236/385/337 +f 237/384/336 180/395/347 127/397/349 +f 237/384/336 127/397/349 241/380/332 +f 126/398/350 179/396/348 236/385/337 +f 126/398/350 236/385/337 240/381/333 +f 241/380/332 127/397/349 243/376/328 +f 127/397/349 125/399/351 243/376/328 +f 124/400/352 126/398/350 242/377/329 +f 126/398/350 240/381/333 242/377/329 +f 243/376/328 125/399/351 245/372/324 +f 125/399/351 123/401/353 245/372/324 +f 122/402/354 124/400/352 244/373/325 +f 124/400/352 242/377/329 244/373/325 +f 245/372/324 123/401/353 121/403/355 +f 245/372/324 121/403/355 247/368/320 +f 120/404/356 122/402/354 244/373/325 +f 120/404/356 244/373/325 246/369/321 +f 247/368/320 121/403/355 119/405/357 +f 247/368/320 119/405/357 249/364/316 +f 118/406/358 120/404/356 246/369/321 +f 118/406/358 246/369/321 248/365/317 +f 249/364/316 119/405/357 117/407/359 +f 249/364/316 117/407/359 251/360/312 +f 116/408/360 118/406/358 248/365/317 +f 116/408/360 248/365/317 250/361/313 +f 251/360/312 117/407/359 115/409/361 +f 251/360/312 115/409/361 253/356/308 +f 114/410/362 116/408/360 250/361/313 +f 114/410/362 250/361/313 252/357/309 +f 253/356/308 115/409/361 235/340/292 +f 115/409/361 182/411/363 235/340/292 +f 181/412/364 114/410/362 234/344/296 +f 114/410/362 252/357/309 234/344/296 +f 255/347/299 113/413/365 257/351/303 +f 113/413/365 111/391/343 257/351/303 +f 110/394/346 112/414/366 256/353/305 +f 112/414/366 254/349/301 256/353/305 +f 233/341/293 184/415/367 113/413/365 +f 233/341/293 113/413/365 255/347/299 +f 112/414/366 183/416/368 232/343/295 +f 112/414/366 232/343/295 254/349/301 +f 235/340/292 182/411/363 184/415/367 +f 235/340/292 184/415/367 233/341/293 +f 183/416/368 181/412/364 234/344/296 +f 183/416/368 234/344/296 232/343/295 +f 230/23/23 231/417/369 224/418/370 +f 230/23/23 224/418/370 226/24/24 +f 224/418/370 231/417/369 229/20/20 +f 224/418/370 229/20/20 225/19/19 +f 224/418/370 72/419/371 226/24/24 +f 72/419/371 223/420/372 226/24/24 +f 222/421/373 72/419/371 225/19/19 +f 72/419/371 224/418/370 225/19/19 +f 226/24/24 223/420/372 221/422/374 +f 226/24/24 221/422/374 228/22/22 +f 220/423/375 222/421/373 225/19/19 +f 220/423/375 225/19/19 227/21/21 +f 228/22/22 221/422/374 219/424/376 +f 228/22/22 219/424/376 230/23/23 +f 218/425/377 220/423/375 227/21/21 +f 218/425/377 227/21/21 229/20/20 +f 230/23/23 219/424/376 231/417/369 +f 219/424/376 217/426/378 231/417/369 +f 217/426/378 218/425/377 231/417/369 +f 218/425/377 229/20/20 231/417/369 +f 219/424/376 136/427/379 137/428/380 +f 219/424/376 137/428/380 217/426/378 +f 137/428/380 135/429/381 218/425/377 +f 137/428/380 218/425/377 217/426/378 +f 221/422/374 134/430/382 136/427/379 +f 221/422/374 136/427/379 219/424/376 +f 135/429/381 133/431/383 220/423/375 +f 135/429/381 220/423/375 218/425/377 +f 223/420/372 132/432/384 134/430/382 +f 223/420/372 134/430/382 221/422/374 +f 133/431/383 131/433/385 222/421/373 +f 133/431/383 222/421/373 220/423/375 +f 72/419/371 130/434/386 223/420/372 +f 130/434/386 132/432/384 223/420/372 +f 131/433/385 130/434/386 222/421/373 +f 130/434/386 72/419/371 222/421/373 +f 212/435/387 165/436/388 80/279/241 +f 212/435/387 80/279/241 216/286/244 +f 79/281/242 164/437/389 211/438/390 +f 79/281/242 211/438/390 215/287/245 +f 212/435/387 216/286/244 214/439/391 +f 216/286/244 210/440/246 214/439/391 +f 209/441/249 215/287/245 213/442/392 +f 215/287/245 211/438/390 213/442/392 +f 214/439/391 210/440/246 167/443/393 +f 210/440/246 82/444/247 167/443/393 +f 81/445/248 209/441/249 166/446/394 +f 209/441/249 213/442/392 166/446/394 +f 167/443/393 188/447/395 214/439/391 +f 188/447/395 145/448/396 214/439/391 +f 144/449/397 187/450/398 213/442/392 +f 187/450/398 166/446/394 213/442/392 +f 214/439/391 145/448/396 212/435/387 +f 145/448/396 143/451/399 212/435/387 +f 142/452/400 144/449/397 211/438/390 +f 144/449/397 213/442/392 211/438/390 +f 212/435/387 143/451/399 141/453/401 +f 212/435/387 141/453/401 165/436/388 +f 140/454/402 142/452/400 211/438/390 +f 140/454/402 211/438/390 164/437/389 +f 165/436/388 141/453/401 139/455/403 +f 165/436/388 139/455/403 177/456/404 +f 139/455/403 140/454/402 164/437/389 +f 139/455/403 164/437/389 177/456/404 +f 207/457/405 208/458/406 199/459/407 +f 207/457/405 199/459/407 205/460/408 +f 199/459/407 208/458/406 206/461/409 +f 199/459/407 206/461/409 204/462/410 +f 203/463/411 205/460/408 201/464/412 +f 205/460/408 199/459/407 201/464/412 +f 199/459/407 204/462/410 200/465/413 +f 204/462/410 202/466/414 200/465/413 +f 207/457/405 205/460/408 194/467/415 +f 207/457/405 194/467/415 192/468/416 +f 193/469/417 204/462/410 206/461/409 +f 193/469/417 206/461/409 191/470/418 +f 205/460/408 203/463/411 194/467/415 +f 203/463/411 196/471/419 194/467/415 +f 195/472/420 202/466/414 193/469/417 +f 202/466/414 204/462/410 193/469/417 +f 203/463/411 201/464/412 198/473/421 +f 203/463/411 198/473/421 196/471/419 +f 197/474/422 200/465/413 202/466/414 +f 197/474/422 202/466/414 195/472/420 +f 201/464/412 199/459/407 71/475/423 +f 201/464/412 71/475/423 198/473/421 +f 71/475/423 199/459/407 200/465/413 +f 71/475/423 200/465/413 197/474/422 +f 207/457/405 192/468/416 208/458/406 +f 192/468/416 70/476/424 208/458/406 +f 70/476/424 191/470/418 208/458/406 +f 191/470/418 206/461/409 208/458/406 +f 192/468/416 145/448/396 70/476/424 +f 145/448/396 190/477/425 70/476/424 +f 190/477/425 144/449/397 70/476/424 +f 144/449/397 191/470/418 70/476/424 +f 198/473/421 71/475/423 139/455/403 +f 71/478/423 138/479/426 139/480/403 +f 138/481/426 71/482/423 139/483/403 +f 71/475/423 197/474/422 139/455/403 +f 196/471/419 198/473/421 141/453/401 +f 198/473/421 139/455/403 141/453/401 +f 139/455/403 197/474/422 140/454/402 +f 197/474/422 195/472/420 140/454/402 +f 194/467/415 196/471/419 143/451/399 +f 196/471/419 141/453/401 143/451/399 +f 140/454/402 195/472/420 142/452/400 +f 195/472/420 193/469/417 142/452/400 +f 192/468/416 194/467/415 143/451/399 +f 192/468/416 143/451/399 145/448/396 +f 142/452/400 193/469/417 191/470/418 +f 142/452/400 191/470/418 144/449/397 +f 186/484/427 132/432/384 69/485/428 +f 132/432/384 130/434/386 69/485/428 +f 130/434/386 131/433/385 69/485/428 +f 131/433/385 185/486/429 69/485/428 +f 189/487/430 188/447/395 69/485/428 +f 188/447/395 186/484/427 69/485/428 +f 185/486/429 187/450/398 69/485/428 +f 187/450/398 189/487/430 69/485/428 +f 189/487/430 190/477/425 188/447/395 +f 190/477/425 145/448/396 188/447/395 +f 144/449/397 190/477/425 187/450/398 +f 190/477/425 189/487/430 187/450/398 +f 169/488/431 171/489/432 132/432/384 +f 169/488/431 132/432/384 186/484/427 +f 131/433/385 170/490/433 168/491/434 +f 131/433/385 168/491/434 185/486/429 +f 186/484/427 188/447/395 167/443/393 +f 186/484/427 167/443/393 169/488/431 +f 166/446/394 187/450/398 185/486/429 +f 166/446/394 185/486/429 168/491/434 +f 173/492/435 134/430/382 171/489/432 +f 134/430/382 132/432/384 171/489/432 +f 131/433/385 133/431/383 170/490/433 +f 133/431/383 172/493/436 170/490/433 +f 175/494/437 136/427/379 134/430/382 +f 175/494/437 134/430/382 173/492/435 +f 133/431/383 135/429/381 174/495/438 +f 133/431/383 174/495/438 172/493/436 +f 176/496/439 137/428/380 136/427/379 +f 176/496/439 136/427/379 175/494/437 +f 135/429/381 137/428/380 176/496/439 +f 135/429/381 176/496/439 174/495/438 +f 184/415/367 182/411/363 178/497/440 +f 182/411/363 177/456/404 178/497/440 +f 177/456/404 181/412/364 178/497/440 +f 181/412/364 183/416/368 178/497/440 +f 178/497/440 68/498/441 113/413/365 +f 178/497/440 113/413/365 184/415/367 +f 112/414/366 68/498/441 178/497/440 +f 112/414/366 178/497/440 183/416/368 +f 68/498/441 163/499/442 113/413/365 +f 163/499/442 111/391/343 113/413/365 +f 110/394/346 162/500/443 112/414/366 +f 162/500/443 68/498/441 112/414/366 +f 177/456/404 182/411/363 115/409/361 +f 177/456/404 115/409/361 165/436/388 +f 114/410/362 181/412/364 177/456/404 +f 114/410/362 177/456/404 164/437/389 +f 147/501/444 165/436/388 115/409/361 +f 147/501/444 115/409/361 117/407/359 +f 114/410/362 164/437/389 146/502/445 +f 114/410/362 146/502/445 116/408/360 +f 149/503/446 147/501/444 119/405/357 +f 147/501/444 117/407/359 119/405/357 +f 116/408/360 146/502/445 118/406/358 +f 146/502/445 148/504/447 118/406/358 +f 151/505/448 149/503/446 121/403/355 +f 149/503/446 119/405/357 121/403/355 +f 118/406/358 148/504/447 120/404/356 +f 148/504/447 150/506/449 120/404/356 +f 153/507/450 151/505/448 123/401/353 +f 151/505/448 121/403/355 123/401/353 +f 120/404/356 150/506/449 122/402/354 +f 150/506/449 152/508/451 122/402/354 +f 155/509/452 153/507/450 125/399/351 +f 153/507/450 123/401/353 125/399/351 +f 122/402/354 152/508/451 124/400/352 +f 152/508/451 154/510/453 124/400/352 +f 157/511/454 155/509/452 127/397/349 +f 155/509/452 125/399/351 127/397/349 +f 124/400/352 154/510/453 126/398/350 +f 154/510/453 156/512/455 126/398/350 +f 159/513/456 157/511/454 180/395/347 +f 157/511/454 127/397/349 180/395/347 +f 126/398/350 156/512/455 179/396/348 +f 156/512/455 158/514/457 179/396/348 +f 159/513/456 180/395/347 129/392/344 +f 159/513/456 129/392/344 161/515/458 +f 128/393/345 179/396/348 158/514/457 +f 128/393/345 158/514/457 160/516/459 +f 161/515/458 129/392/344 163/499/442 +f 129/392/344 111/391/343 163/499/442 +f 110/394/346 128/393/345 162/500/443 +f 128/393/345 160/516/459 162/500/443 +f 68/498/441 67/517/290 163/499/442 +f 67/517/290 109/518/288 163/499/442 +f 108/519/289 67/517/290 162/500/443 +f 67/517/290 68/498/441 162/500/443 +f 163/499/442 109/518/288 161/515/458 +f 109/518/288 107/520/286 161/515/458 +f 106/521/287 108/519/289 160/516/459 +f 108/519/289 162/500/443 160/516/459 +f 161/515/458 107/520/286 159/513/456 +f 107/520/286 105/522/284 159/513/456 +f 104/523/285 106/521/287 158/514/457 +f 106/521/287 160/516/459 158/514/457 +f 159/513/456 105/522/284 103/524/282 +f 159/513/456 103/524/282 157/511/454 +f 102/525/283 104/523/285 158/514/457 +f 102/525/283 158/514/457 156/512/455 +f 157/511/454 103/524/282 155/509/452 +f 103/524/282 101/526/280 155/509/452 +f 100/527/281 102/525/283 154/510/453 +f 102/525/283 156/512/455 154/510/453 +f 155/509/452 101/526/280 153/507/450 +f 101/526/280 99/528/278 153/507/450 +f 98/529/279 100/527/281 152/508/451 +f 100/527/281 154/510/453 152/508/451 +f 153/507/450 99/528/278 151/505/448 +f 99/528/278 97/530/276 151/505/448 +f 96/531/277 98/529/279 150/506/449 +f 98/529/279 152/508/451 150/506/449 +f 151/505/448 97/530/276 95/532/274 +f 151/505/448 95/532/274 149/503/446 +f 94/533/275 96/531/277 150/506/449 +f 94/533/275 150/506/449 148/504/447 +f 149/503/446 95/532/274 147/501/444 +f 95/532/274 93/280/240 147/501/444 +f 92/283/243 94/533/275 146/502/445 +f 94/533/275 148/504/447 146/502/445 +f 147/501/444 93/280/240 80/279/241 +f 147/501/444 80/279/241 165/436/388 +f 79/281/242 92/283/243 146/502/445 +f 79/281/242 146/502/445 164/437/389 +f 169/488/431 167/443/393 82/444/247 +f 169/488/431 82/444/247 84/534/251 +f 81/445/248 166/446/394 168/491/434 +f 81/445/248 168/491/434 83/535/252 +f 171/489/432 169/488/431 84/534/251 +f 171/489/432 84/534/251 86/536/264 +f 83/535/252 168/491/434 170/490/433 +f 83/535/252 170/490/433 85/537/265 +f 173/492/435 171/489/432 86/536/264 +f 173/492/435 86/536/264 88/538/266 +f 85/537/265 170/490/433 172/493/436 +f 85/537/265 172/493/436 87/539/267 +f 175/494/437 173/492/435 90/540/268 +f 173/492/435 88/538/266 90/540/268 +f 87/539/267 172/493/436 89/541/269 +f 172/493/436 174/495/438 89/541/269 +f 176/496/439 175/494/437 91/542/271 +f 175/494/437 90/540/268 91/542/271 +f 89/541/269 174/495/438 91/542/271 +f 174/495/438 176/496/439 91/542/271 +f 50/4/4 48/543/460 2/544/461 +f 50/4/4 2/544/461 66/5/5 +f 1/545/462 47/546/463 49/3/3 +f 1/545/462 49/3/3 65/2/2 +f 66/5/5 2/544/461 12/547/464 +f 66/5/5 12/547/464 64/8/8 +f 11/548/465 1/545/462 65/2/2 +f 11/548/465 65/2/2 63/7/7 +f 64/8/8 12/547/464 14/549/466 +f 64/8/8 14/549/466 60/10/10 +f 13/550/467 11/548/465 63/7/7 +f 13/550/467 63/7/7 59/9/9 +f 60/10/10 14/549/466 24/551/468 +f 60/10/10 24/551/468 58/12/12 +f 23/552/469 13/550/467 59/9/9 +f 23/552/469 59/9/9 57/11/11 +f 58/12/12 24/551/468 56/14/14 +f 24/551/468 26/553/470 56/14/14 +f 25/554/471 23/552/469 55/13/13 +f 23/552/469 57/11/11 55/13/13 +f 56/14/14 26/553/470 54/16/16 +f 26/553/470 36/555/472 54/16/16 +f 35/556/473 25/554/471 53/15/15 +f 25/554/471 55/13/13 53/15/15 +f 54/16/16 36/555/472 52/18/18 +f 36/555/472 38/557/474 52/18/18 +f 37/558/475 35/556/473 51/17/17 +f 35/556/473 53/15/15 51/17/17 +f 52/18/18 38/557/474 50/4/4 +f 38/557/474 48/543/460 50/4/4 +f 47/546/463 37/558/475 49/3/3 +f 37/558/475 51/17/17 49/3/3 +f 46/559/476 48/543/460 40/560/477 +f 48/543/460 38/557/474 40/560/477 +f 37/558/475 47/546/463 39/561/478 +f 47/546/463 45/562/479 39/561/478 +f 44/563/480 46/559/476 42/564/481 +f 46/559/476 40/560/477 42/564/481 +f 39/561/478 45/562/479 41/565/482 +f 45/562/479 43/566/483 41/565/482 +f 42/564/481 40/560/477 32/567/484 +f 40/560/477 34/568/485 32/567/484 +f 33/569/486 39/561/478 31/570/487 +f 39/561/478 41/565/482 31/570/487 +f 40/560/477 38/557/474 34/568/485 +f 38/557/474 36/555/472 34/568/485 +f 35/556/473 37/558/475 33/569/486 +f 37/558/475 39/561/478 33/569/486 +f 34/568/485 36/555/472 28/571/488 +f 36/555/472 26/553/470 28/571/488 +f 25/554/471 35/556/473 27/572/489 +f 35/556/473 33/569/486 27/572/489 +f 32/567/484 34/568/485 30/573/490 +f 34/568/485 28/571/488 30/573/490 +f 27/572/489 33/569/486 29/574/491 +f 33/569/486 31/570/487 29/574/491 +f 30/573/490 28/571/488 20/575/492 +f 28/571/488 22/576/493 20/575/492 +f 21/577/494 27/572/489 19/578/495 +f 27/572/489 29/574/491 19/578/495 +f 28/571/488 26/553/470 24/551/468 +f 28/571/488 24/551/468 22/576/493 +f 23/552/469 25/554/471 27/572/489 +f 23/552/469 27/572/489 21/577/494 +f 22/576/493 24/551/468 16/579/496 +f 24/551/468 14/549/466 16/579/496 +f 13/550/467 23/552/469 15/580/497 +f 23/552/469 21/577/494 15/580/497 +f 20/575/492 22/576/493 18/581/498 +f 22/576/493 16/579/496 18/581/498 +f 15/580/497 21/577/494 17/582/499 +f 21/577/494 19/578/495 17/582/499 +f 18/581/498 16/579/496 10/583/500 +f 18/581/498 10/583/500 8/584/501 +f 9/585/502 15/580/497 17/582/499 +f 9/585/502 17/582/499 7/586/503 +f 16/579/496 14/549/466 12/547/464 +f 16/579/496 12/547/464 10/583/500 +f 11/548/465 13/550/467 15/580/497 +f 11/548/465 15/580/497 9/585/502 +f 10/583/500 12/547/464 2/544/461 +f 10/583/500 2/544/461 4/587/504 +f 1/545/462 11/548/465 9/585/502 +f 1/545/462 9/585/502 3/588/505 +f 8/584/501 10/583/500 4/587/504 +f 8/584/501 4/587/504 6/589/506 +f 3/588/505 9/585/502 7/586/503 +f 3/588/505 7/586/503 5/590/507 +f 6/589/506 4/587/504 46/559/476 +f 6/589/506 46/559/476 44/563/480 +f 45/562/479 3/588/505 5/590/507 +f 45/562/479 5/590/507 43/566/483 +f 4/587/504 2/544/461 48/543/460 +f 4/587/504 48/543/460 46/559/476 +f 47/546/463 1/545/462 3/588/505 +f 47/546/463 3/588/505 45/562/479 diff --git a/src/main.rs b/src/main.rs index 40e2be7..f025c6f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -143,6 +143,37 @@ impl Skybox { } } +fn add_obj(device:&wgpu::Device,entities:& mut Vec,source:&[u8]){ + let data = obj::ObjData::load_buf(&source[..]).unwrap(); + let mut vertices = Vec::new(); + for object in data.objects { + for group in object.groups { + vertices.clear(); + for poly in group.polys { + for end_index in 2..poly.0.len() { + for &index in &[0, end_index - 1, end_index] { + let obj::IndexTuple(position_id, _texture_id, normal_id) = + poly.0[index]; + vertices.push(Vertex { + pos: data.position[position_id], + normal: data.normal[normal_id.unwrap()], + }) + } + } + } + let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Vertex"), + contents: bytemuck::cast_slice(&vertices), + usage: wgpu::BufferUsages::VERTEX, + }); + entities.push(Entity { + vertex_count: vertices.len() as u32, + vertex_buf, + }); + } + } +} + impl strafe_client::framework::Example for Skybox { fn optional_features() -> wgpu::Features { wgpu::Features::TEXTURE_COMPRESSION_ASTC @@ -156,38 +187,9 @@ impl strafe_client::framework::Example for Skybox { device: &wgpu::Device, queue: &wgpu::Queue, ) -> Self { - let mut entities = Vec::new(); - { - let source = include_bytes!("../models/teslacyberv3.0.obj"); - let data = obj::ObjData::load_buf(&source[..]).unwrap(); - let mut vertices = Vec::new(); - for object in data.objects { - for group in object.groups { - vertices.clear(); - for poly in group.polys { - for end_index in 2..poly.0.len() { - for &index in &[0, end_index - 1, end_index] { - let obj::IndexTuple(position_id, _texture_id, normal_id) = - poly.0[index]; - vertices.push(Vertex { - pos: data.position[position_id], - normal: data.normal[normal_id.unwrap()], - }) - } - } - } - let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Vertex"), - contents: bytemuck::cast_slice(&vertices), - usage: wgpu::BufferUsages::VERTEX, - }); - entities.push(Entity { - vertex_count: vertices.len() as u32, - vertex_buf, - }); - } - } - } + let mut entities = Vec::::new(); + add_obj(device,& mut entities,include_bytes!("../models/teslacyberv3.0.obj")); + add_obj(device,& mut entities,include_bytes!("../models/suzanne.obj")); let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: None, From d4172f5040d18502f31a493d099ef5e78e3e8cb8 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 1 Sep 2023 14:57:04 -0700 Subject: [PATCH 050/482] rename uniform_buf to camera_buf --- src/main.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index f025c6f..1115de2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -111,7 +111,7 @@ pub struct Skybox { entity_pipeline: wgpu::RenderPipeline, ground_pipeline: wgpu::RenderPipeline, bind_group: wgpu::BindGroup, - uniform_buf: wgpu::Buffer, + camera_buf: wgpu::Buffer, entities: Vec, depth_view: wgpu::TextureView, staging_belt: wgpu::util::StagingBelt, @@ -245,10 +245,10 @@ impl strafe_client::framework::Example for Skybox { grounded: true, walkspeed: 18.0, }; - let raw_uniforms = camera.to_uniform_data(); - let uniform_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Buffer"), - contents: bytemuck::cast_slice(&raw_uniforms), + let camera_uniforms = camera.to_uniform_data(); + let camera_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Camera"), + contents: bytemuck::cast_slice(&camera_uniforms), usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, }); @@ -433,7 +433,7 @@ impl strafe_client::framework::Example for Skybox { entries: &[ wgpu::BindGroupEntry { binding: 0, - resource: uniform_buf.as_entire_binding(), + resource: camera_buf.as_entire_binding(), }, wgpu::BindGroupEntry { binding: 1, @@ -455,7 +455,7 @@ impl strafe_client::framework::Example for Skybox { entity_pipeline, ground_pipeline, bind_group, - uniform_buf, + camera_buf, entities, depth_view, staging_belt: wgpu::util::StagingBelt::new(0x100), @@ -573,16 +573,16 @@ impl strafe_client::framework::Example for Skybox { device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); // update rotation - let raw_uniforms = self.camera.to_uniform_data(); + let camera_uniforms = self.camera.to_uniform_data(); self.staging_belt .write_buffer( &mut encoder, - &self.uniform_buf, + &self.camera_buf, 0, - wgpu::BufferSize::new((raw_uniforms.len() * 4) as wgpu::BufferAddress).unwrap(), + wgpu::BufferSize::new((camera_uniforms.len() * 4) as wgpu::BufferAddress).unwrap(), device, ) - .copy_from_slice(bytemuck::cast_slice(&raw_uniforms)); + .copy_from_slice(bytemuck::cast_slice(&camera_uniforms)); self.staging_belt.finish(); From c9cb22be68e6269f0dda32a8ab529ec86d46c658 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 1 Sep 2023 14:57:38 -0700 Subject: [PATCH 051/482] comment on value --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 1115de2..0e9bcde 100644 --- a/src/main.rs +++ b/src/main.rs @@ -100,7 +100,7 @@ impl Camera { raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view)[..]); raw[48..51].copy_from_slice(AsRef::<[f32; 3]>::as_ref(&self.pos)); - raw[51] = 1.0; + raw[51] = 1.0;//cam_pos is vec4 raw } } From 8792b8e782fcf2d534fc060abe413d9450ce3418 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 1 Sep 2023 14:59:42 -0700 Subject: [PATCH 052/482] add entity CFrames --- src/main.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/shader.wgsl | 17 ++++++++++++++--- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index 0e9bcde..a855ed6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,6 +12,7 @@ struct Vertex { } struct Entity { + transform: glam::Affine3A, vertex_count: u32, vertex_buf: wgpu::Buffer, } @@ -34,6 +35,8 @@ struct Camera { walkspeed: f32, } +const MAGIC_ENTITIES: usize = 7; + const CONTROL_MOVEFORWARD:u32 = 0b00000001; const CONTROL_MOVEBACK:u32 = 0b00000010; const CONTROL_MOVERIGHT:u32 = 0b00000100; @@ -112,6 +115,7 @@ pub struct Skybox { ground_pipeline: wgpu::RenderPipeline, bind_group: wgpu::BindGroup, camera_buf: wgpu::Buffer, + entity_buf: wgpu::Buffer, entities: Vec, depth_view: wgpu::TextureView, staging_belt: wgpu::util::StagingBelt, @@ -143,6 +147,15 @@ impl Skybox { } } +fn get_entity_uniform_data(entities:& Vec) -> [f32; (9+3)*MAGIC_ENTITIES] { + let mut raw = [0f32; (9+3)*MAGIC_ENTITIES]; + for (i,entity) in entities.iter().enumerate() { + raw[i*12..(i+1)*12-3].copy_from_slice(&AsRef::<[f32; 9]>::as_ref(&glam::Mat3::from(entity.transform.matrix3))[..]); + raw[i*12+9..(i+1)*12].copy_from_slice(AsRef::<[f32; 3]>::as_ref(&glam::Vec3::from(entity.transform.translation))); + } + raw +} + fn add_obj(device:&wgpu::Device,entities:& mut Vec,source:&[u8]){ let data = obj::ObjData::load_buf(&source[..]).unwrap(); let mut vertices = Vec::new(); @@ -167,6 +180,7 @@ fn add_obj(device:&wgpu::Device,entities:& mut Vec,source:&[u8]){ usage: wgpu::BufferUsages::VERTEX, }); entities.push(Entity { + transform: glam::Affine3A::default(), vertex_count: vertices.len() as u32, vertex_buf, }); @@ -190,6 +204,8 @@ impl strafe_client::framework::Example for Skybox { let mut entities = Vec::::new(); add_obj(device,& mut entities,include_bytes!("../models/teslacyberv3.0.obj")); add_obj(device,& mut entities,include_bytes!("../models/suzanne.obj")); + println!("entities.len = {:?}", entities.len()); + entities[6].transform=glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)); let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: None, @@ -220,6 +236,16 @@ impl strafe_client::framework::Example for Skybox { ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), count: None, }, + wgpu::BindGroupLayoutEntry { + binding: 3, + visibility: wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, ], }); @@ -252,6 +278,13 @@ impl strafe_client::framework::Example for Skybox { usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, }); + let entity_uniforms = get_entity_uniform_data(&entities); + let entity_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("EntityData"), + contents: bytemuck::cast_slice(&entity_uniforms), + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + }); + let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { label: None, bind_group_layouts: &[&bind_group_layout], @@ -443,6 +476,10 @@ impl strafe_client::framework::Example for Skybox { binding: 2, resource: wgpu::BindingResource::Sampler(&sampler), }, + wgpu::BindGroupEntry { + binding: 3, + resource: entity_buf.as_entire_binding(), + }, ], label: None, }); @@ -456,6 +493,7 @@ impl strafe_client::framework::Example for Skybox { ground_pipeline, bind_group, camera_buf, + entity_buf, entities, depth_view, staging_belt: wgpu::util::StagingBelt::new(0x100), @@ -583,6 +621,16 @@ impl strafe_client::framework::Example for Skybox { device, ) .copy_from_slice(bytemuck::cast_slice(&camera_uniforms)); + let entity_uniforms = get_entity_uniform_data(&self.entities); + self.staging_belt + .write_buffer( + &mut encoder, + &self.entity_buf,//description of where data will be written when command is executed + 0,//offset in staging belt? + wgpu::BufferSize::new((entity_uniforms.len() * 4) as wgpu::BufferAddress).unwrap(), + device, + ) + .copy_from_slice(bytemuck::cast_slice(&entity_uniforms)); self.staging_belt.finish(); diff --git a/src/shader.wgsl b/src/shader.wgsl index 08e8ffe..2ef5ce8 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -67,15 +67,26 @@ struct EntityOutput { @location(3) view: vec3, }; + +struct EntityTransform { + matrix3: mat3x3, + translation: vec3, +}; +@group(0) +@binding(3) +var r_EntityTransforms: array; + @vertex fn vs_entity( + @builtin(instance_index) instance_index: u32, @location(0) pos: vec3, @location(1) normal: vec3, ) -> EntityOutput { + var position: vec3 = r_EntityTransforms[instance_index].matrix3 * pos+r_EntityTransforms[instance_index].translation; var result: EntityOutput; - result.normal = normal; - result.view = pos - r_data.cam_pos.xyz; - result.position = r_data.proj * r_data.view * vec4(pos, 1.0); + result.normal = r_EntityTransforms[instance_index].matrix3 * normal; + result.view = position - r_data.cam_pos.xyz; + result.position = r_data.proj * r_data.view * vec4(position, 1.0); return result; } From cce9800045a372a3e9def7651759c1c0252e10b7 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 00:17:33 -0700 Subject: [PATCH 053/482] no fragment --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index a855ed6..dbbd50c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -212,7 +212,7 @@ impl strafe_client::framework::Example for Skybox { entries: &[ wgpu::BindGroupLayoutEntry { binding: 0, - visibility: wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT, + visibility: wgpu::ShaderStages::VERTEX, ty: wgpu::BindingType::Buffer { ty: wgpu::BufferBindingType::Uniform, has_dynamic_offset: false, @@ -238,7 +238,7 @@ impl strafe_client::framework::Example for Skybox { }, wgpu::BindGroupLayoutEntry { binding: 3, - visibility: wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT, + visibility: wgpu::ShaderStages::VERTEX, ty: wgpu::BindingType::Buffer { ty: wgpu::BufferBindingType::Uniform, has_dynamic_offset: false, From 87f674238de63e4e65740b51d281a81ebf3388c8 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 12:22:38 -0700 Subject: [PATCH 054/482] add model_bind_group --- src/main.rs | 34 ++++++++++++++++++++++++---------- src/shader.wgsl | 11 +++++------ 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/main.rs b/src/main.rs index dbbd50c..d7d8975 100644 --- a/src/main.rs +++ b/src/main.rs @@ -113,7 +113,8 @@ pub struct Skybox { sky_pipeline: wgpu::RenderPipeline, entity_pipeline: wgpu::RenderPipeline, ground_pipeline: wgpu::RenderPipeline, - bind_group: wgpu::BindGroup, + main_bind_group: wgpu::BindGroup, + model_bind_group: wgpu::BindGroup, camera_buf: wgpu::Buffer, entity_buf: wgpu::Buffer, entities: Vec, @@ -207,7 +208,7 @@ impl strafe_client::framework::Example for Skybox { println!("entities.len = {:?}", entities.len()); entities[6].transform=glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)); - let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + let main_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: None, entries: &[ wgpu::BindGroupLayoutEntry { @@ -236,8 +237,13 @@ impl strafe_client::framework::Example for Skybox { ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), count: None, }, + ], + }); + let model_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: None, + entries: &[ wgpu::BindGroupLayoutEntry { - binding: 3, + binding: 0, visibility: wgpu::ShaderStages::VERTEX, ty: wgpu::BindingType::Buffer { ty: wgpu::BufferBindingType::Uniform, @@ -287,7 +293,7 @@ impl strafe_client::framework::Example for Skybox { let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { label: None, - bind_group_layouts: &[&bind_group_layout], + bind_group_layouts: &[&main_bind_group_layout, &model_bind_group_layout], push_constant_ranges: &[], }); @@ -461,8 +467,8 @@ impl strafe_client::framework::Example for Skybox { dimension: Some(wgpu::TextureViewDimension::Cube), ..wgpu::TextureViewDescriptor::default() }); - let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - layout: &bind_group_layout, + let main_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &main_bind_group_layout, entries: &[ wgpu::BindGroupEntry { binding: 0, @@ -476,12 +482,18 @@ impl strafe_client::framework::Example for Skybox { binding: 2, resource: wgpu::BindingResource::Sampler(&sampler), }, + ], + label: Some("Camera"), + }); + let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &model_bind_group_layout, + entries: &[ wgpu::BindGroupEntry { - binding: 3, + binding: 0, resource: entity_buf.as_entire_binding(), }, ], - label: None, + label: Some("Model"), }); let depth_view = Self::create_depth_texture(config, device); @@ -491,7 +503,8 @@ impl strafe_client::framework::Example for Skybox { sky_pipeline, entity_pipeline, ground_pipeline, - bind_group, + main_bind_group, + model_bind_group, camera_buf, entity_buf, entities, @@ -660,7 +673,8 @@ impl strafe_client::framework::Example for Skybox { }), }); - rpass.set_bind_group(0, &self.bind_group, &[]); + rpass.set_bind_group(0, &self.main_bind_group, &[]); + rpass.set_bind_group(1, &self.model_bind_group, &[]); rpass.set_pipeline(&self.entity_pipeline); for entity in self.entities.iter() { diff --git a/src/shader.wgsl b/src/shader.wgsl index 2ef5ce8..e85e6d7 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -72,19 +72,18 @@ struct EntityTransform { matrix3: mat3x3, translation: vec3, }; -@group(0) -@binding(3) -var r_EntityTransforms: array; +@group(1) +@binding(0) +var r_EntityTransform: EntityTransform; @vertex fn vs_entity( - @builtin(instance_index) instance_index: u32, @location(0) pos: vec3, @location(1) normal: vec3, ) -> EntityOutput { - var position: vec3 = r_EntityTransforms[instance_index].matrix3 * pos+r_EntityTransforms[instance_index].translation; + var position: vec3 = r_EntityTransform.matrix3 * pos+r_EntityTransform.translation; var result: EntityOutput; - result.normal = r_EntityTransforms[instance_index].matrix3 * normal; + result.normal = r_EntityTransform.matrix3 * normal; result.view = position - r_data.cam_pos.xyz; result.position = r_data.proj * r_data.view * vec4(position, 1.0); return result; From 1a1509f3152d00a2751f85b0afac58d937ddb680 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 13:05:40 -0700 Subject: [PATCH 055/482] try one entity, convert to mat4x4 --- src/main.rs | 15 +++++---------- src/shader.wgsl | 15 +++++---------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/main.rs b/src/main.rs index d7d8975..ccc0980 100644 --- a/src/main.rs +++ b/src/main.rs @@ -35,8 +35,6 @@ struct Camera { walkspeed: f32, } -const MAGIC_ENTITIES: usize = 7; - const CONTROL_MOVEFORWARD:u32 = 0b00000001; const CONTROL_MOVEBACK:u32 = 0b00000010; const CONTROL_MOVERIGHT:u32 = 0b00000100; @@ -148,12 +146,9 @@ impl Skybox { } } -fn get_entity_uniform_data(entities:& Vec) -> [f32; (9+3)*MAGIC_ENTITIES] { - let mut raw = [0f32; (9+3)*MAGIC_ENTITIES]; - for (i,entity) in entities.iter().enumerate() { - raw[i*12..(i+1)*12-3].copy_from_slice(&AsRef::<[f32; 9]>::as_ref(&glam::Mat3::from(entity.transform.matrix3))[..]); - raw[i*12+9..(i+1)*12].copy_from_slice(AsRef::<[f32; 3]>::as_ref(&glam::Vec3::from(entity.transform.translation))); - } +fn get_entity_uniform_data(entity:&Entity) -> [f32; 4*4] { + let mut raw = [0f32; 4*4]; + raw[0..16].copy_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&glam::Mat4::from(entity.transform))[..]); raw } @@ -284,7 +279,7 @@ impl strafe_client::framework::Example for Skybox { usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, }); - let entity_uniforms = get_entity_uniform_data(&entities); + let entity_uniforms = get_entity_uniform_data(&entities[6]); let entity_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("EntityData"), contents: bytemuck::cast_slice(&entity_uniforms), @@ -634,7 +629,7 @@ impl strafe_client::framework::Example for Skybox { device, ) .copy_from_slice(bytemuck::cast_slice(&camera_uniforms)); - let entity_uniforms = get_entity_uniform_data(&self.entities); + let entity_uniforms = get_entity_uniform_data(&self.entities[6]); self.staging_belt .write_buffer( &mut encoder, diff --git a/src/shader.wgsl b/src/shader.wgsl index e85e6d7..fe4ee93 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -67,25 +67,20 @@ struct EntityOutput { @location(3) view: vec3, }; - -struct EntityTransform { - matrix3: mat3x3, - translation: vec3, -}; @group(1) @binding(0) -var r_EntityTransform: EntityTransform; +var r_EntityTransform: mat4x4; @vertex fn vs_entity( @location(0) pos: vec3, @location(1) normal: vec3, ) -> EntityOutput { - var position: vec3 = r_EntityTransform.matrix3 * pos+r_EntityTransform.translation; + var position: vec4 = r_EntityTransform * vec4(pos, 1.0); var result: EntityOutput; - result.normal = r_EntityTransform.matrix3 * normal; - result.view = position - r_data.cam_pos.xyz; - result.position = r_data.proj * r_data.view * vec4(position, 1.0); + result.normal = (r_EntityTransform * vec4(normal, 0.0)).xyz; + result.view = position.xyz - r_data.cam_pos.xyz; + result.position = r_data.proj * r_data.view * position; return result; } From 69c7896011bd0ec7331d67f69a4d5ac5a9367486 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 14:58:18 -0700 Subject: [PATCH 056/482] binding group per model --- src/main.rs | 120 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 72 insertions(+), 48 deletions(-) diff --git a/src/main.rs b/src/main.rs index ccc0980..70d9233 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,11 +12,23 @@ struct Vertex { } struct Entity { - transform: glam::Affine3A, vertex_count: u32, vertex_buf: wgpu::Buffer, } +//temp? +struct ModelData { + transform: glam::Affine3A, + entities: Vec, +} + +struct Model { + transform: glam::Affine3A, + entities: Vec, + bind_group: wgpu::BindGroup, + model_buf: wgpu::Buffer, +} + // Note: we use the Y=up coordinate space in this example. struct Camera { time: Instant, @@ -112,10 +124,8 @@ pub struct Skybox { entity_pipeline: wgpu::RenderPipeline, ground_pipeline: wgpu::RenderPipeline, main_bind_group: wgpu::BindGroup, - model_bind_group: wgpu::BindGroup, camera_buf: wgpu::Buffer, - entity_buf: wgpu::Buffer, - entities: Vec, + models: Vec, depth_view: wgpu::TextureView, staging_belt: wgpu::util::StagingBelt, } @@ -146,16 +156,17 @@ impl Skybox { } } -fn get_entity_uniform_data(entity:&Entity) -> [f32; 4*4] { +fn get_transform_uniform_data(transform:&glam::Affine3A) -> [f32; 4*4] { let mut raw = [0f32; 4*4]; - raw[0..16].copy_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&glam::Mat4::from(entity.transform))[..]); + raw[0..16].copy_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&glam::Mat4::from(*transform))[..]); raw } -fn add_obj(device:&wgpu::Device,entities:& mut Vec,source:&[u8]){ +fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,source:&[u8]){ let data = obj::ObjData::load_buf(&source[..]).unwrap(); let mut vertices = Vec::new(); for object in data.objects { + let mut entities = Vec::::new(); for group in object.groups { vertices.clear(); for poly in group.polys { @@ -176,11 +187,14 @@ fn add_obj(device:&wgpu::Device,entities:& mut Vec,source:&[u8]){ usage: wgpu::BufferUsages::VERTEX, }); entities.push(Entity { - transform: glam::Affine3A::default(), vertex_count: vertices.len() as u32, vertex_buf, }); } + modeldatas.push(ModelData { + transform: glam::Affine3A::default(), + entities, + }) } } @@ -197,11 +211,11 @@ impl strafe_client::framework::Example for Skybox { device: &wgpu::Device, queue: &wgpu::Queue, ) -> Self { - let mut entities = Vec::::new(); - add_obj(device,& mut entities,include_bytes!("../models/teslacyberv3.0.obj")); - add_obj(device,& mut entities,include_bytes!("../models/suzanne.obj")); - println!("entities.len = {:?}", entities.len()); - entities[6].transform=glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)); + let mut modeldatas = Vec::::new(); + add_obj(device,& mut modeldatas,include_bytes!("../models/teslacyberv3.0.obj")); + add_obj(device,& mut modeldatas,include_bytes!("../models/suzanne.obj")); + println!("models.len = {:?}", modeldatas.len()); + modeldatas[1].transform=glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)); let main_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: None, @@ -279,13 +293,6 @@ impl strafe_client::framework::Example for Skybox { usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, }); - let entity_uniforms = get_entity_uniform_data(&entities[6]); - let entity_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("EntityData"), - contents: bytemuck::cast_slice(&entity_uniforms), - usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, - }); - let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { label: None, bind_group_layouts: &[&main_bind_group_layout, &model_bind_group_layout], @@ -480,16 +487,31 @@ impl strafe_client::framework::Example for Skybox { ], label: Some("Camera"), }); - let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - layout: &model_bind_group_layout, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: entity_buf.as_entire_binding(), - }, - ], - label: Some("Model"), - }); + let mut models = Vec::::new(); + for (i,modeldata) in modeldatas.drain(..).enumerate() { + let model_uniforms = get_transform_uniform_data(&modeldata.transform); + let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some(format!("Model{}",i).as_str()), + contents: bytemuck::cast_slice(&model_uniforms), + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + }); + let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &model_bind_group_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: model_buf.as_entire_binding(), + }, + ], + label: Some(format!("Model{}",i).as_str()), + }); + models.push(Model{ + transform: modeldata.transform, + entities: modeldata.entities, + bind_group: model_bind_group, + model_buf: model_buf, + }) + } let depth_view = Self::create_depth_texture(config, device); @@ -499,10 +521,8 @@ impl strafe_client::framework::Example for Skybox { entity_pipeline, ground_pipeline, main_bind_group, - model_bind_group, camera_buf, - entity_buf, - entities, + models, depth_view, staging_belt: wgpu::util::StagingBelt::new(0x100), } @@ -629,17 +649,18 @@ impl strafe_client::framework::Example for Skybox { device, ) .copy_from_slice(bytemuck::cast_slice(&camera_uniforms)); - let entity_uniforms = get_entity_uniform_data(&self.entities[6]); - self.staging_belt - .write_buffer( - &mut encoder, - &self.entity_buf,//description of where data will be written when command is executed - 0,//offset in staging belt? - wgpu::BufferSize::new((entity_uniforms.len() * 4) as wgpu::BufferAddress).unwrap(), - device, - ) - .copy_from_slice(bytemuck::cast_slice(&entity_uniforms)); - + for model in self.models.iter() { + let model_uniforms = get_transform_uniform_data(&model.transform); + self.staging_belt + .write_buffer( + &mut encoder, + &model.model_buf,//description of where data will be written when command is executed + 0,//offset in staging belt? + wgpu::BufferSize::new((model_uniforms.len() * 4) as wgpu::BufferAddress).unwrap(), + device, + ) + .copy_from_slice(bytemuck::cast_slice(&model_uniforms)); + } self.staging_belt.finish(); { @@ -669,12 +690,15 @@ impl strafe_client::framework::Example for Skybox { }); rpass.set_bind_group(0, &self.main_bind_group, &[]); - rpass.set_bind_group(1, &self.model_bind_group, &[]); rpass.set_pipeline(&self.entity_pipeline); - for entity in self.entities.iter() { - rpass.set_vertex_buffer(0, entity.vertex_buf.slice(..)); - rpass.draw(0..entity.vertex_count, 0..1); + for model in self.models.iter() { + rpass.set_bind_group(1, &model.bind_group, &[]); + + for entity in model.entities.iter() { + rpass.set_vertex_buffer(0, entity.vertex_buf.slice(..)); + rpass.draw(0..entity.vertex_count, 0..1); + } } rpass.set_pipeline(&self.ground_pipeline); From 946687639a8aebb04c039c42ee13dc53d167c547 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 15:02:19 -0700 Subject: [PATCH 057/482] v0.2.0 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4ab86d8..ca30b0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1405,7 +1405,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strafe-client" -version = "0.1.0" +version = "0.2.0" dependencies = [ "async-executor", "bytemuck", diff --git a/Cargo.toml b/Cargo.toml index f6c2eea..c99fc4c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strafe-client" -version = "0.1.0" +version = "0.2.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 1776dc4c39f2747c45993f1a9b6ea16d15505a0a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 15:10:31 -0700 Subject: [PATCH 058/482] add comments about moving data --- src/main.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main.rs b/src/main.rs index 70d9233..9f971cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -487,6 +487,8 @@ impl strafe_client::framework::Example for Skybox { ], label: Some("Camera"), }); + + //drain the modeldata vec so entities can be /moved/ to models.entities let mut models = Vec::::new(); for (i,modeldata) in modeldatas.drain(..).enumerate() { let model_uniforms = get_transform_uniform_data(&modeldata.transform); @@ -505,6 +507,7 @@ impl strafe_client::framework::Example for Skybox { ], label: Some(format!("Model{}",i).as_str()), }); + //all of these are being moved here models.push(Model{ transform: modeldata.transform, entities: modeldata.entities, From abd002e3bf049ecb29e9731226242dc7ee163bcb Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 15:15:22 -0700 Subject: [PATCH 059/482] optimize release builds a bit --- Cargo.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index c99fc4c..5a9789d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,3 +16,8 @@ obj = "0.10.2" pollster = "0.3.0" wgpu = "0.17.0" winit = "0.28.6" + +[profile.release] +lto = true +strip = true +codegen-units = 1 From 988f204358a1f11c6a20992b8e1bdb0bddb6b5d3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 18:51:53 -0700 Subject: [PATCH 060/482] comment on updating uniforms --- src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.rs b/src/main.rs index 9f971cf..09b37b6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -652,6 +652,7 @@ impl strafe_client::framework::Example for Skybox { device, ) .copy_from_slice(bytemuck::cast_slice(&camera_uniforms)); + //This code only needs to run when the uniforms change for model in self.models.iter() { let model_uniforms = get_transform_uniform_data(&model.transform); self.staging_belt From 0b230b759783e061c0c28433ff691b50627b1743 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 12:09:21 -0700 Subject: [PATCH 061/482] add teapot --- models/teapot.obj | 9965 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 9965 insertions(+) create mode 100644 models/teapot.obj diff --git a/models/teapot.obj b/models/teapot.obj new file mode 100644 index 0000000..c839837 --- /dev/null +++ b/models/teapot.obj @@ -0,0 +1,9965 @@ +v -3.000000 1.800000 0.000000 +v -2.991600 1.800000 -0.081000 +v -2.991600 1.800000 0.081000 +v -2.989450 1.666162 0.000000 +v -2.985000 1.921950 0.000000 +v -2.985000 1.921950 0.000000 +v -2.981175 1.667844 -0.081000 +v -2.981175 1.667844 0.081000 +v -2.976687 1.920243 -0.081000 +v -2.976687 1.920243 0.081000 +v -2.968800 1.800000 -0.144000 +v -2.968800 1.800000 0.144000 +v -2.958713 1.672406 -0.144000 +v -2.958713 1.672406 0.144000 +v -2.957600 1.534800 0.000000 +v -2.957600 1.534800 0.000000 +v -2.954122 1.915609 -0.144000 +v -2.954122 1.915609 0.144000 +v -2.949693 1.537790 -0.081000 +v -2.949693 1.537790 0.081000 +v -2.940000 2.019600 0.000000 +v -2.935200 1.800000 -0.189000 +v -2.935200 1.800000 0.189000 +v -2.931958 2.016526 0.081000 +v -2.931958 2.016526 -0.081000 +v -2.928230 1.545907 -0.144000 +v -2.928230 1.545907 0.144000 +v -2.925611 1.679131 -0.189000 +v -2.925611 1.679131 0.189000 +v -2.920870 1.908779 -0.189000 +v -2.920870 1.908779 0.189000 +v -2.910131 2.008181 -0.144000 +v -2.910131 2.008181 0.144000 +v -2.904150 1.406137 0.000000 +v -2.904150 1.406137 0.000000 +v -2.896846 1.410135 0.081000 +v -2.896846 1.410135 -0.081000 +v -2.896602 1.557869 -0.189000 +v -2.896602 1.557869 0.189000 +v -2.894400 1.800000 -0.216000 +v -2.894400 1.800000 0.216000 +v -2.885416 1.687296 -0.216000 +v -2.885416 1.687296 0.216000 +v -2.880491 1.900487 -0.216000 +v -2.880491 1.900487 0.216000 +v -2.877965 1.995883 -0.189000 +v -2.877965 1.995883 0.189000 +v -2.877022 1.420985 -0.144000 +v -2.877022 1.420985 0.144000 +v -2.865000 2.095650 0.000000 +v -2.858195 1.572394 0.216000 +v -2.858195 1.572394 -0.216000 +v -2.857432 2.091511 -0.081000 +v -2.857432 2.091511 0.081000 +v -2.850000 1.800000 -0.225000 +v -2.850000 1.800000 0.225000 +v -2.847806 1.436974 0.189000 +v -2.847806 1.436974 -0.189000 +v -2.841675 1.696181 0.225000 +v -2.841675 1.696181 -0.225000 +v -2.838906 1.980950 -0.216000 +v -2.838906 1.980950 0.216000 +v -2.836889 2.080276 -0.144000 +v -2.836889 2.080276 0.144000 +v -2.836550 1.891463 -0.225000 +v -2.836550 1.891463 0.225000 +v -2.828800 1.280400 0.000000 +v -2.822326 1.285171 -0.081000 +v -2.822326 1.285171 0.081000 +v -2.816400 1.588200 -0.225000 +v -2.816400 1.588200 0.225000 +v -2.812331 1.456390 0.216000 +v -2.812331 1.456390 -0.216000 +v -2.806615 2.063720 -0.189000 +v -2.806615 2.063720 0.189000 +v -2.805600 1.800000 -0.216000 +v -2.805600 1.800000 0.216000 +v -2.804755 1.298122 -0.144000 +v -2.804755 1.298122 0.144000 +v -2.797934 1.705067 -0.216000 +v -2.797934 1.705067 0.216000 +v -2.796400 1.964700 0.225000 +v -2.796400 1.964700 -0.225000 +v -2.792609 1.882438 -0.216000 +v -2.792609 1.882438 0.216000 +v -2.778861 1.317206 -0.189000 +v -2.778861 1.317206 0.189000 +v -2.774605 1.604006 0.216000 +v -2.774605 1.604006 -0.216000 +v -2.773725 1.477519 0.225000 +v -2.773725 1.477519 -0.225000 +v -2.769854 2.043616 -0.216000 +v -2.769854 2.043616 0.216000 +v -2.764800 1.800000 -0.189000 +v -2.764800 1.800000 0.189000 +v -2.760000 2.152800 0.000000 +v -2.760000 2.152800 0.000000 +v -2.757739 1.713232 -0.189000 +v -2.757739 1.713232 0.189000 +v -2.753894 1.948450 -0.216000 +v -2.753894 1.948450 0.216000 +v -2.753123 2.147861 -0.081000 +v -2.753123 2.147861 0.081000 +v -2.752230 1.874146 -0.189000 +v -2.752230 1.874146 0.189000 +v -2.747418 1.340381 -0.216000 +v -2.747418 1.340381 0.216000 +v -2.736198 1.618531 -0.189000 +v -2.736198 1.618531 0.189000 +v -2.735119 1.498648 0.216000 +v -2.735119 1.498648 -0.216000 +v -2.734458 2.134454 -0.144000 +v -2.734458 2.134454 0.144000 +v -2.731250 1.157813 0.000000 +v -2.731250 1.157813 0.000000 +v -2.731200 1.800000 -0.144000 +v -2.731200 1.800000 0.144000 +v -2.729850 2.021737 -0.225000 +v -2.729850 2.021737 0.225000 +v -2.725825 1.163194 0.081000 +v -2.725825 1.163194 -0.081000 +v -2.724637 1.719956 -0.144000 +v -2.724637 1.719956 0.144000 +v -2.718978 1.867316 -0.144000 +v -2.718978 1.867316 0.144000 +v -2.714835 1.933517 -0.189000 +v -2.714835 1.933517 0.189000 +v -2.713200 1.365600 -0.225000 +v -2.713200 1.365600 0.225000 +v -2.711100 1.177800 -0.144000 +v -2.711100 1.177800 0.144000 +v -2.708400 1.800000 -0.081000 +v -2.708400 1.800000 0.081000 +v -2.706950 2.114698 -0.189000 +v -2.706950 2.114698 0.189000 +v -2.704570 1.630493 -0.144000 +v -2.704570 1.630493 0.144000 +v -2.702175 1.724519 -0.081000 +v -2.702175 1.724519 0.081000 +v -2.700000 1.800000 0.000000 +v -2.699644 1.518063 0.189000 +v -2.699644 1.518063 -0.189000 +v -2.696413 1.862682 -0.081000 +v -2.696413 1.862682 0.081000 +v -2.693900 1.726200 0.000000 +v -2.689846 1.999859 -0.216000 +v -2.689846 1.999859 0.216000 +v -2.689400 1.199325 -0.189000 +v -2.689400 1.199325 0.189000 +v -2.688100 1.860975 0.000000 +v -2.688100 1.860975 0.000000 +v -2.683107 1.638610 -0.081000 +v -2.683107 1.638610 0.081000 +v -2.682669 1.921219 -0.144000 +v -2.682669 1.921219 0.144000 +v -2.678982 1.390819 -0.216000 +v -2.678982 1.390819 0.216000 +v -2.675200 1.641600 0.000000 +v -2.675200 1.641600 0.000000 +v -2.673549 2.090707 -0.216000 +v -2.673549 2.090707 0.216000 +v -2.670428 1.534053 -0.144000 +v -2.670428 1.534053 0.144000 +v -2.663050 1.225463 -0.216000 +v -2.663050 1.225463 0.216000 +v -2.660842 1.912874 0.081000 +v -2.660842 1.912874 -0.081000 +v -2.653085 1.979755 -0.189000 +v -2.653085 1.979755 0.189000 +v -2.652800 1.909800 0.000000 +v -2.652800 1.909800 0.000000 +v -2.650604 1.544903 0.081000 +v -2.650604 1.544903 -0.081000 +v -2.647539 1.413994 -0.189000 +v -2.647539 1.413994 0.189000 +v -2.643300 1.548900 0.000000 +v -2.637200 2.064600 -0.225000 +v -2.637200 2.064600 0.225000 +v -2.634375 1.253906 0.225000 +v -2.634375 1.253906 -0.225000 +v -2.625000 2.193750 0.000000 +v -2.622811 1.963199 -0.144000 +v -2.622811 1.963199 0.144000 +v -2.621645 1.433078 -0.144000 +v -2.621645 1.433078 0.144000 +v -2.619050 2.188238 -0.081000 +v -2.619050 2.188238 0.081000 +v -2.611200 1.038600 0.000000 +v -2.611200 1.038600 0.000000 +v -2.607034 1.044497 0.081000 +v -2.607034 1.044497 -0.081000 +v -2.605700 1.282350 -0.216000 +v -2.605700 1.282350 0.216000 +v -2.604074 1.446029 -0.081000 +v -2.604074 1.446029 0.081000 +v -2.602900 2.173275 -0.144000 +v -2.602900 2.173275 0.144000 +v -2.602268 1.951964 -0.081000 +v -2.602268 1.951964 0.081000 +v -2.600851 2.038493 -0.216000 +v -2.600851 2.038493 0.216000 +v -2.597600 1.450800 0.000000 +v -2.595725 1.060502 -0.144000 +v -2.595725 1.060502 0.144000 +v -2.594700 1.947825 0.000000 +v -2.579350 1.308488 -0.189000 +v -2.579350 1.308488 0.189000 +v -2.579100 2.151225 -0.189000 +v -2.579100 2.151225 0.189000 +v -2.579059 1.084090 -0.189000 +v -2.579059 1.084090 0.189000 +v -2.567450 2.014502 -0.189000 +v -2.567450 2.014502 0.189000 +v -2.558822 1.112731 0.216000 +v -2.558822 1.112731 -0.216000 +v -2.557650 1.330013 -0.144000 +v -2.557650 1.330013 0.144000 +v -2.550200 2.124450 -0.216000 +v -2.550200 2.124450 0.216000 +v -2.542925 1.344619 0.081000 +v -2.542925 1.344619 -0.081000 +v -2.539942 1.994746 -0.144000 +v -2.539942 1.994746 0.144000 +v -2.537500 1.350000 0.000000 +v -2.537500 1.350000 0.000000 +v -2.536800 1.143900 0.225000 +v -2.536800 1.143900 -0.225000 +v -2.521277 1.981339 -0.081000 +v -2.521277 1.981339 0.081000 +v -2.518750 2.095312 -0.225000 +v -2.518750 2.095312 0.225000 +v -2.514778 1.175069 0.216000 +v -2.514778 1.175069 -0.216000 +v -2.514400 1.976400 0.000000 +v -2.514400 1.976400 0.000000 +v -2.494541 1.203710 -0.189000 +v -2.494541 1.203710 0.189000 +v -2.487300 2.066175 -0.216000 +v -2.487300 2.066175 0.216000 +v -2.477875 1.227298 -0.144000 +v -2.477875 1.227298 0.144000 +v -2.468350 0.922987 0.000000 +v -2.466566 1.243303 0.081000 +v -2.466566 1.243303 -0.081000 +v -2.465644 0.929375 -0.081000 +v -2.465644 0.929375 0.081000 +v -2.462400 1.249200 0.000000 +v -2.462400 1.249200 0.000000 +v -2.460000 2.221200 0.000000 +v -2.460000 2.221200 0.000000 +v -2.458400 2.039400 -0.189000 +v -2.458400 2.039400 0.189000 +v -2.458298 0.946711 -0.144000 +v -2.458298 0.946711 0.144000 +v -2.455229 2.215303 -0.081000 +v -2.455229 2.215303 0.081000 +v -2.447474 0.972260 0.189000 +v -2.447474 0.972260 -0.189000 +v -2.442278 2.199298 -0.144000 +v -2.442278 2.199298 0.144000 +v -2.434600 2.017350 -0.144000 +v -2.434600 2.017350 0.144000 +v -2.434329 1.003283 -0.216000 +v -2.434329 1.003283 0.216000 +v -2.423194 2.175710 -0.189000 +v -2.423194 2.175710 0.189000 +v -2.420025 1.037044 -0.225000 +v -2.420025 1.037044 0.225000 +v -2.418450 2.002387 -0.081000 +v -2.418450 2.002388 0.081000 +v -2.412500 1.996875 0.000000 +v -2.412500 1.996875 0.000000 +v -2.405721 1.070804 -0.216000 +v -2.405721 1.070804 0.216000 +v -2.400019 2.147069 -0.216000 +v -2.400019 2.147069 0.216000 +v -2.392576 1.101828 -0.189000 +v -2.392576 1.101828 0.189000 +v -2.381752 1.127376 -0.144000 +v -2.381752 1.127376 0.144000 +v -2.374800 2.115900 -0.225000 +v -2.374800 2.115900 0.225000 +v -2.374406 1.144713 0.081000 +v -2.374406 1.144713 -0.081000 +v -2.371700 1.151100 0.000000 +v -2.349581 2.084731 -0.216000 +v -2.349581 2.084731 0.216000 +v -2.326406 2.056090 -0.189000 +v -2.326406 2.056090 0.189000 +v -2.307322 2.032502 -0.144000 +v -2.307322 2.032502 0.144000 +v -2.302400 0.811200 0.000000 +v -2.302400 0.811200 0.000000 +v -2.301347 0.818122 0.081000 +v -2.301347 0.818122 -0.081000 +v -2.298490 0.836909 0.144000 +v -2.298490 0.836909 -0.144000 +v -2.294371 2.016497 -0.081000 +v -2.294371 2.016497 0.081000 +v -2.294278 0.864595 0.189000 +v -2.294278 0.864595 -0.189000 +v -2.289600 2.010600 0.000000 +v -2.289600 2.010600 0.000000 +v -2.289165 0.898214 0.216000 +v -2.289165 0.898214 -0.216000 +v -2.283600 0.934800 0.225000 +v -2.283600 0.934800 -0.225000 +v -2.278035 0.971386 0.216000 +v -2.278035 0.971386 -0.216000 +v -2.272922 1.005005 0.189000 +v -2.272922 1.005005 -0.189000 +v -2.268710 1.032691 -0.144000 +v -2.268710 1.032691 0.144000 +v -2.265853 1.051478 0.081000 +v -2.265853 1.051478 -0.081000 +v -2.265000 2.237850 0.000000 +v -2.264800 1.058400 0.000000 +v -2.264800 1.058400 0.000000 +v -2.261676 2.231720 -0.081000 +v -2.261676 2.231720 0.081000 +v -2.252655 2.215082 -0.144000 +v -2.252655 2.215082 0.144000 +v -2.239361 2.190562 -0.189000 +v -2.239361 2.190562 0.189000 +v -2.223218 2.160788 -0.216000 +v -2.223218 2.160788 0.216000 +v -2.205650 2.128387 0.225000 +v -2.205650 2.128388 -0.225000 +v -2.188082 2.095987 -0.216000 +v -2.188082 2.095987 0.216000 +v -2.171939 2.066213 -0.189000 +v -2.171939 2.066213 0.189000 +v -2.158645 2.041693 -0.144000 +v -2.158645 2.041693 0.144000 +v -2.149624 2.025055 -0.081000 +v -2.149624 2.025055 0.081000 +v -2.146300 2.018925 0.000000 +v -2.141100 0.973800 0.000000 +v -2.141100 0.973800 0.000000 +v -2.140315 0.966231 0.081000 +v -2.140315 0.966231 -0.081000 +v -2.138183 0.945685 0.144000 +v -2.138183 0.945685 -0.144000 +v -2.135041 0.915407 0.189000 +v -2.135041 0.915407 -0.189000 +v -2.131226 0.878641 0.216000 +v -2.131226 0.878641 -0.216000 +v -2.127075 0.838631 0.225000 +v -2.127075 0.838631 -0.225000 +v -2.122924 0.798621 0.216000 +v -2.122924 0.798621 -0.216000 +v -2.119109 0.761855 0.189000 +v -2.119109 0.761855 -0.189000 +v -2.115967 0.731578 0.144000 +v -2.115967 0.731578 -0.144000 +v -2.113835 0.711032 0.081000 +v -2.113835 0.711032 -0.081000 +v -2.113050 0.703463 0.000000 +v -2.113050 0.703463 0.000000 +v -2.040000 2.246400 0.000000 +v -2.040000 2.246400 0.000000 +v -2.038410 2.240150 -0.081000 +v -2.038410 2.240150 0.081000 +v -2.034093 2.223187 -0.144000 +v -2.034093 2.223187 0.144000 +v -2.027731 2.198189 -0.189000 +v -2.027731 2.198189 0.189000 +v -2.020006 2.167834 0.216000 +v -2.020006 2.167834 -0.216000 +v -2.011600 2.134800 0.225000 +v -2.011600 2.134800 -0.225000 +v -2.003194 2.101766 0.216000 +v -2.003194 2.101766 -0.216000 +v -2.000000 0.900000 0.000000 +v -2.000000 0.900000 0.000000 +v -2.000000 0.900000 0.000000 +v -1.997200 0.891600 0.081000 +v -1.997200 0.891600 -0.081000 +v -1.995469 2.071411 -0.189000 +v -1.995469 2.071411 0.189000 +v -1.992750 1.037175 -0.000000 +v -1.992750 1.037175 0.000000 +v -1.989600 0.868800 0.144000 +v -1.989600 0.868800 -0.144000 +v -1.989107 2.046413 0.144000 +v -1.989107 2.046413 -0.144000 +v -1.986000 0.771675 0.000000 +v -1.986000 0.771675 0.000000 +v -1.984790 2.029450 -0.081000 +v -1.984790 2.029450 0.081000 +v -1.983200 2.023200 0.000000 +v -1.983200 2.023200 0.000000 +v -1.978400 0.835200 0.189000 +v -1.978400 0.835200 -0.189000 +v -1.974240 0.900000 -0.328160 +v -1.974240 0.900000 -0.328160 +v -1.974240 0.900000 0.328160 +v -1.972000 1.178400 -0.000000 +v -1.972000 1.178400 0.000000 +v -1.967083 1.037175 -0.326970 +v -1.967083 1.037175 0.326970 +v -1.964800 0.794400 0.216000 +v -1.964800 0.794400 -0.216000 +v -1.960420 0.771675 -0.325863 +v -1.960420 0.771675 0.325863 +v -1.950000 0.750000 -0.225000 +v -1.950000 0.750000 0.225000 +v -1.948000 0.656400 0.000000 +v -1.948000 0.656400 0.000000 +v -1.946601 1.178400 -0.323566 +v -1.946601 1.178400 0.323566 +v -1.939250 1.323225 0.000000 +v -1.939250 1.323225 0.000000 +v -1.935200 0.705600 0.216000 +v -1.935200 0.705600 -0.216000 +v -1.922910 0.656400 -0.319628 +v -1.922910 0.656400 0.319628 +v -1.921600 0.664800 0.189000 +v -1.921600 0.664800 -0.189000 +v -1.914272 1.323225 -0.318192 +v -1.914272 1.323225 0.318192 +v -1.910400 0.631200 0.144000 +v -1.910400 0.631200 -0.144000 +v -1.902800 0.608400 0.081000 +v -1.902800 0.608400 -0.081000 +v -1.900000 0.600000 0.000000 +v -1.900000 0.600000 0.000000 +v -1.899520 0.900000 -0.638080 +v -1.899520 0.900000 -0.638080 +v -1.899520 0.900000 0.638080 +v -1.899520 0.900000 0.638080 +v -1.896000 1.471200 0.000000 +v -1.896000 1.471200 0.000000 +v -1.892634 1.037175 -0.635767 +v -1.892634 1.037175 0.635767 +v -1.892000 0.553725 0.000000 +v -1.892000 0.553725 0.000000 +v -1.886223 0.771675 -0.633613 +v -1.886223 0.771675 0.633613 +v -1.872927 1.178400 -0.629147 +v -1.872927 1.178400 0.629147 +v -1.871580 1.471200 -0.311096 +v -1.871580 1.471200 0.311096 +v -1.867631 0.553725 -0.310439 +v -1.867631 0.553725 0.310439 +v -1.850132 0.656400 -0.621490 +v -1.850132 0.656400 0.621490 +v -1.843750 1.621875 0.000000 +v -1.843750 1.621875 0.000000 +v -1.841822 1.323225 -0.618698 +v -1.841822 1.323225 0.618698 +v -1.824000 0.463200 -0.000000 +v -1.824000 0.463200 0.000000 +v -1.820003 1.621875 -0.302522 +v -1.820003 1.621875 0.302523 +v -1.800900 2.024775 0.000000 +v -1.800745 1.471200 -0.604900 +v -1.800745 1.471200 0.604900 +v -1.800507 0.463200 -0.299282 +v -1.800507 0.463200 0.299282 +v -1.800455 2.031069 -0.081000 +v -1.800455 2.031069 0.081000 +v -1.799246 2.048152 -0.144000 +v -1.799246 2.048152 0.144000 +v -1.797466 2.073326 -0.189000 +v -1.797466 2.073326 0.189000 +v -1.796946 0.553725 -0.603624 +v -1.796946 0.553725 0.603624 +v -1.795303 2.103896 -0.216000 +v -1.795303 2.103896 0.216000 +v -1.792950 2.137163 -0.225000 +v -1.792950 2.137163 0.225000 +v -1.790597 2.170429 -0.216000 +v -1.790597 2.170429 0.216000 +v -1.788434 2.200999 -0.189000 +v -1.788434 2.200999 0.189000 +v -1.786654 2.226173 -0.144000 +v -1.786654 2.226173 0.144000 +v -1.785445 2.243256 -0.081000 +v -1.785445 2.243256 0.081000 +v -1.785000 2.249550 0.000000 +v -1.784000 1.774800 -0.000000 +v -1.784000 1.774800 0.000000 +v -1.779680 0.900000 -0.925920 +v -1.779680 0.900000 -0.925920 +v -1.779680 0.900000 0.925920 +v -1.779680 0.900000 0.925920 +v -1.773229 1.037175 -0.922564 +v -1.773229 1.037175 0.922564 +v -1.767222 0.771675 -0.919439 +v -1.767222 0.771675 0.919439 +v -1.761022 1.774800 -0.292719 +v -1.761022 1.774800 0.292719 +v -1.754764 1.178400 -0.912957 +v -1.754764 1.178400 0.912957 +v -1.751120 1.621875 -0.588230 +v -1.751120 1.621875 0.588230 +v -1.750000 0.384375 -0.000000 +v -1.750000 0.384375 0.000000 +v -1.733408 0.656400 -0.901846 +v -1.733408 0.656400 0.901846 +v -1.732362 0.463200 -0.581929 +v -1.732362 0.463200 0.581929 +v -1.727460 0.384375 -0.287140 +v -1.727460 0.384375 0.287140 +v -1.725622 1.323225 -0.897795 +v -1.725622 1.323225 0.897795 +v -1.718250 1.929525 -0.000000 +v -1.718250 1.929525 0.000000 +v -1.696119 1.929525 -0.281930 +v -1.696119 1.929525 0.281930 +v -1.694372 1.774800 -0.569167 +v -1.694372 1.774800 0.569167 +v -1.687137 1.471200 -0.877772 +v -1.687137 1.471200 0.877772 +v -1.683577 0.553725 -0.875920 +v -1.683577 0.553725 0.875920 +v -1.676000 0.316800 0.000000 +v -1.676000 0.316800 0.000000 +v -1.662080 0.384375 -0.558320 +v -1.662080 0.384375 0.558320 +v -1.654413 0.316800 -0.274998 +v -1.654413 0.316800 0.274998 +v -1.648000 2.085600 0.000000 +v -1.648000 2.085600 0.000000 +v -1.640643 1.621875 -0.853583 +v -1.640643 1.621875 0.853583 +v -1.631925 1.929525 -0.548190 +v -1.631925 1.929525 0.548190 +v -1.626774 2.085600 -0.270404 +v -1.626774 2.085600 0.270404 +v -1.623068 0.463200 -0.844439 +v -1.623068 0.463200 0.844439 +v -1.618560 0.900000 -1.187840 +v -1.618560 0.900000 -1.187840 +v -1.618560 0.900000 1.187840 +v -1.618560 0.900000 1.187840 +v -1.612693 1.037175 -1.183534 +v -1.612693 1.037175 1.183534 +v -1.608000 0.260025 -0.000000 +v -1.608000 0.260025 0.000000 +v -1.607230 0.771675 -1.179525 +v -1.607230 0.771675 1.179525 +v -1.600000 2.025000 0.000000 +v -1.597200 2.031300 -0.081000 +v -1.597200 2.031300 0.081000 +v -1.595900 1.178400 -1.171210 +v -1.595900 1.178400 1.171210 +v -1.591798 0.316800 -0.534711 +v -1.591798 0.316800 0.534711 +v -1.589600 2.048400 -0.144000 +v -1.589600 2.048400 0.144000 +v -1.587475 1.774800 -0.825921 +v -1.587475 1.774800 0.825921 +v -1.587289 0.260025 0.263841 +v -1.587289 0.260025 -0.263841 +v -1.578400 2.073600 -0.189000 +v -1.578400 2.073600 0.189000 +v -1.576477 0.656400 -1.156956 +v -1.576477 0.656400 1.156956 +v -1.574750 2.242575 0.000000 +v -1.574750 2.242575 0.000000 +v -1.569396 1.323225 -1.151759 +v -1.569396 1.323225 1.151759 +v -1.565204 2.085600 -0.525778 +v -1.565204 2.085600 0.525778 +v -1.564800 2.104200 -0.216000 +v -1.564800 2.104200 0.216000 +v -1.557220 0.384375 -0.810180 +v -1.557220 0.384375 0.810180 +v -1.554467 2.242575 -0.258385 +v -1.554467 2.242575 0.258385 +v -1.552000 0.213600 0.000000 +v -1.552000 0.213600 0.000000 +v -1.550000 2.137500 -0.225000 +v -1.550000 2.137500 0.225000 +v -1.535200 2.170800 -0.216000 +v -1.535200 2.170800 0.216000 +v -1.534395 1.471200 -1.126072 +v -1.534395 1.471200 1.126072 +v -1.532010 0.213600 0.254652 +v -1.532010 0.213600 -0.254652 +v -1.531158 0.553725 -1.123697 +v -1.531158 0.553725 1.123697 +v -1.528968 1.929525 -0.795481 +v -1.528968 1.929525 0.795481 +v -1.527214 0.260025 -0.513016 +v -1.527214 0.260025 0.513016 +v -1.521600 2.201400 -0.189000 +v -1.521600 2.201400 0.189000 +v -1.514000 0.177075 0.000000 +v -1.514000 0.177075 0.000000 +v -1.510400 2.226600 -0.144000 +v -1.510400 2.226600 0.144000 +v -1.502800 2.243700 -0.081000 +v -1.502800 2.243700 0.081000 +v -1.500000 2.400000 0.000000 +v -1.500000 0.150000 0.000000 +v -1.500000 2.250000 0.000000 +v -1.500000 2.400000 0.000000 +v -1.500000 0.150000 0.000000 +v -1.496475 0.127575 -0.000000 +v -1.496475 0.127575 0.000000 +v -1.495635 2.242575 -0.502408 +v -1.495635 2.242575 0.502408 +v -1.494500 0.177075 0.248417 +v -1.494500 0.177075 -0.248417 +v -1.492110 1.621875 -1.095040 +v -1.492110 1.621875 1.095040 +v -1.491372 0.316800 -0.775921 +v -1.491372 0.316800 0.775921 +v -1.480800 0.105600 0.000000 +v -1.480800 0.105600 -0.000000 +v -1.480680 2.400000 -0.246120 +v -1.480680 0.150000 0.246120 +v -1.480680 2.400000 0.246120 +v -1.480680 0.150000 -0.246120 +v -1.480680 0.150000 -0.246120 +v -1.480680 0.150000 0.246120 +v -1.480325 2.435437 0.000000 +v -1.480325 2.435437 0.000000 +v -1.477200 0.127575 0.245542 +v -1.477200 0.127575 -0.245542 +v -1.476127 0.463200 -1.083310 +v -1.476127 0.463200 1.083310 +v -1.474028 0.213600 0.495150 +v -1.474028 0.213600 -0.495150 +v -1.466456 2.085600 -0.762958 +v -1.466456 2.085600 0.762958 +v -1.461727 0.105600 -0.242970 +v -1.461727 0.105600 0.242970 +v -1.461258 2.435437 -0.242892 +v -1.461258 2.435437 0.242892 +v -1.459600 2.463000 0.000000 +v -1.459600 2.463000 0.000000 +v -1.445325 0.084525 0.000000 +v -1.445325 0.084525 0.000000 +v -1.443756 1.774800 -1.059553 +v -1.443756 1.774800 1.059553 +v -1.440800 2.463000 -0.239491 +v -1.440800 2.463000 0.239491 +v -1.439025 2.482687 0.000000 +v -1.437937 0.177075 0.483027 +v -1.437937 0.177075 -0.483027 +v -1.430863 0.260025 0.744440 +v -1.430863 0.260025 -0.744440 +v -1.426709 0.084525 -0.237149 +v -1.426709 0.084525 0.237149 +v -1.424640 2.400000 -0.478560 +v -1.424640 0.150000 -0.478560 +v -1.424640 0.150000 -0.478560 +v -1.424640 0.150000 0.478560 +v -1.424640 0.150000 0.478560 +v -1.424640 2.400000 0.478560 +v -1.421292 0.127575 0.477435 +v -1.421292 0.127575 -0.477435 +v -1.420490 2.482687 -0.236115 +v -1.420490 2.482687 0.236115 +v -1.420000 0.900000 -1.420000 +v -1.420000 0.900000 -1.420000 +v -1.420000 0.900000 1.420000 +v -1.420000 0.900000 1.420000 +v -1.419800 2.494500 0.000000 +v -1.419800 2.494500 0.000000 +v -1.416240 0.384375 -1.039360 +v -1.416240 0.384375 1.039360 +v -1.414853 1.037175 -1.414853 +v -1.414853 1.037175 1.414853 +v -1.410060 0.771675 -1.410060 +v -1.410060 0.771675 1.410060 +v -1.406405 0.105600 -0.472434 +v -1.406405 0.105600 0.472434 +v -1.405953 2.435437 -0.472283 +v -1.405953 2.435437 0.472283 +v -1.403125 2.498438 0.000000 +v -1.403125 2.498438 0.000000 +v -1.401513 2.494500 -0.232961 +v -1.401513 2.494500 0.232961 +v -1.401276 2.242575 -0.729046 +v -1.401276 2.242575 0.729046 +v -1.400120 1.178400 -1.400120 +v -1.400120 1.178400 1.400120 +v -1.400000 2.400000 0.000000 +v -1.400000 2.400000 0.000000 +v -1.390545 1.929525 -1.020503 +v -1.390545 1.929525 1.020503 +v -1.390200 2.494500 0.000000 +v -1.390200 2.494500 0.000000 +v -1.386270 2.463000 -0.465671 +v -1.386270 2.463000 0.465671 +v -1.385925 2.435437 0.000000 +v -1.385925 2.435437 0.000000 +v -1.385053 2.498438 -0.230225 +v -1.385053 2.498438 0.230225 +v -1.383080 0.656400 -1.383080 +v -1.383080 0.656400 1.383080 +v -1.382400 0.064800 -0.000000 +v -1.382400 0.064800 0.000000 +v -1.382225 2.482687 -0.000000 +v -1.382225 2.482687 0.000000 +v -1.381968 2.400000 -0.229712 +v -1.381968 2.400000 0.229712 +v -1.381032 0.213600 0.718514 +v -1.381032 0.213600 -0.718514 +v -1.380400 2.463000 0.000000 +v -1.380400 2.463000 0.000000 +v -1.376868 1.323225 -1.376867 +v -1.376867 1.323225 1.376868 +v -1.372712 0.084525 -0.461116 +v -1.372712 0.084525 0.461116 +v -1.372294 2.494500 -0.228104 +v -1.372294 2.494500 0.228104 +v -1.368074 2.435437 -0.227403 +v -1.368074 2.435437 0.227403 +v -1.366728 2.482687 -0.459107 +v -1.366728 2.482687 0.459107 +v -1.364595 0.064800 -0.226824 +v -1.364595 0.064800 0.226824 +v -1.364422 2.482687 -0.226795 +v -1.364422 2.482687 0.226795 +v -1.362620 2.463000 -0.226496 +v -1.362620 2.463000 0.226496 +v -1.356353 0.316800 -0.995410 +v -1.356353 0.316800 0.995410 +v -1.348469 2.494500 -0.452973 +v -1.348469 2.494500 0.452973 +v -1.347218 0.177075 0.700921 +v -1.347218 0.177075 -0.700921 +v -1.346160 1.471200 -1.346160 +v -1.346160 1.471200 1.346160 +v -1.343320 0.553725 -1.343320 +v -1.343320 0.553725 1.343320 +v -1.334760 2.400000 -0.694440 +v -1.334760 0.150000 -0.694440 +v -1.334760 0.150000 0.694440 +v -1.334760 0.150000 0.694440 +v -1.334760 2.400000 0.694440 +v -1.334760 0.150000 -0.694440 +v -1.333693 2.085600 -0.978780 +v -1.333693 2.085600 0.978780 +v -1.332632 2.498438 -0.447653 +v -1.332632 2.498438 0.447653 +v -1.331623 0.127575 0.692808 +v -1.331623 0.127575 -0.692808 +v -1.329664 2.400000 -0.446656 +v -1.329664 2.400000 0.446656 +v -1.320356 2.494500 -0.443529 +v -1.320356 2.494500 0.443529 +v -1.317675 0.105600 -0.685551 +v -1.317675 0.105600 0.685551 +v -1.317252 2.435437 -0.685331 +v -1.317252 2.435437 0.685331 +v -1.316296 2.435437 -0.442166 +v -1.316296 2.435437 0.442166 +v -1.312948 0.064800 0.441041 +v -1.312948 0.064800 -0.441041 +v -1.312782 2.482687 -0.440985 +v -1.312782 2.482687 0.440985 +v -1.311049 2.463000 -0.440403 +v -1.311049 2.463000 0.440403 +v -1.309063 1.621875 -1.309063 +v -1.309063 1.621875 1.309063 +v -1.301322 0.260025 0.955023 +v -1.301322 0.260025 -0.955023 +v -1.300000 2.400000 0.000000 +v -1.300000 2.400000 0.000000 +v -1.298810 2.463000 -0.675736 +v -1.298810 2.463000 0.675736 +v -1.295040 0.463200 -1.295040 +v -1.295040 0.463200 1.295040 +v -1.286108 0.084525 -0.669128 +v -1.286108 0.084525 0.669128 +v -1.284375 0.046875 0.000000 +v -1.284375 0.046875 0.000000 +v -1.283256 2.400000 -0.213304 +v -1.283256 2.400000 0.213304 +v -1.280502 2.482687 -0.666211 +v -1.280502 2.482687 0.666211 +v -1.274600 2.440800 0.000000 +v -1.274600 2.440800 0.000000 +v -1.274414 2.242575 -0.935276 +v -1.274414 2.242575 0.935276 +v -1.267832 0.046875 -0.210740 +v -1.267832 0.046875 0.210740 +v -1.266640 1.774800 -1.266640 +v -1.266640 1.774800 1.266640 +v -1.263395 2.494500 -0.657311 +v -1.263395 2.494500 0.657311 +v -1.258183 2.440800 0.209136 +v -1.258183 2.440800 -0.209136 +v -1.256003 0.213600 0.921764 +v -1.256003 0.213600 -0.921764 +v -1.248557 2.498438 -0.649591 +v -1.248557 2.498438 0.649591 +v -1.245776 2.400000 -0.648144 +v -1.245776 2.400000 0.648144 +v -1.242500 0.384375 -1.242500 +v -1.242500 0.384375 1.242500 +v -1.237056 2.494500 -0.643607 +v -1.237056 2.494500 0.643607 +v -1.234688 2.400000 -0.414752 +v -1.234688 2.400000 0.414752 +v -1.233252 2.435437 -0.641628 +v -1.233252 2.435437 0.641628 +v -1.230115 0.064800 -0.639996 +v -1.230115 0.064800 0.639996 +v -1.229959 2.482687 -0.639915 +v -1.229959 2.482687 0.639915 +v -1.228335 2.463000 -0.639070 +v -1.228335 2.463000 0.639070 +v -1.225250 0.177075 0.899195 +v -1.225250 0.177075 -0.899195 +v -1.219958 1.929525 1.219958 +v -1.219958 1.929525 -1.219958 +v -1.219848 0.046875 -0.409767 +v -1.219848 0.046875 0.409767 +v -1.213920 2.400000 -0.890880 +v -1.213920 0.150000 -0.890880 +v -1.213920 0.150000 -0.890880 +v -1.213920 0.150000 0.890880 +v -1.213920 0.150000 0.890880 +v -1.213920 2.400000 0.890880 +v -1.211067 0.127575 0.888786 +v -1.211067 0.127575 -0.888786 +v -1.210564 2.440800 0.406648 +v -1.210564 2.440800 -0.406648 +v -1.204800 2.474400 0.000000 +v -1.204800 2.474400 0.000000 +v -1.198382 0.105600 -0.879477 +v -1.198382 0.105600 0.879477 +v -1.197997 2.435437 -0.879195 +v -1.197997 2.435437 0.879195 +v -1.189960 0.316800 -1.189960 +v -1.189960 0.316800 1.189960 +v -1.189282 2.474400 -0.197684 +v -1.189282 2.474400 0.197684 +v -1.187840 0.900000 -1.618560 +v -1.187840 0.900000 -1.618560 +v -1.187840 0.900000 1.618560 +v -1.187840 0.900000 1.618560 +v -1.183534 1.037175 -1.612693 +v -1.183534 1.037175 1.612693 +v -1.181225 2.463000 -0.866886 +v -1.181225 2.463000 0.866886 +v -1.179525 0.771675 -1.607230 +v -1.179525 0.771675 1.607230 +v -1.171210 1.178400 -1.595900 +v -1.171210 1.178400 1.595900 +v -1.170080 2.085600 -1.170080 +v -1.170080 2.085600 1.170080 +v -1.169673 0.084525 -0.858407 +v -1.169673 0.084525 0.858407 +v -1.164574 2.482687 -0.854666 +v -1.164574 2.482687 0.854666 +v -1.156956 0.656400 -1.576477 +v -1.156956 0.656400 1.576477 +v -1.156792 2.400000 -0.601848 +v -1.156792 2.400000 0.601848 +v -1.151759 1.323225 -1.569396 +v -1.151759 1.323225 1.569396 +v -1.149016 2.494500 -0.843248 +v -1.149016 2.494500 0.843248 +v -1.144271 2.474400 -0.384379 +v -1.144271 2.474400 0.384379 +v -1.143600 0.031200 0.000000 +v -1.143600 0.031200 0.000000 +v -1.142888 0.046875 -0.594614 +v -1.142888 0.046875 0.594614 +v -1.141680 0.260025 1.141680 +v -1.141680 0.260025 -1.141680 +v -1.135521 2.498438 -0.833344 +v -1.135521 2.498438 0.833344 +v -1.134190 2.440800 0.590089 +v -1.134190 2.440800 -0.590089 +v -1.132992 2.400000 -0.831488 +v -1.132992 2.400000 0.831488 +v -1.128870 0.031200 -0.187642 +v -1.128870 0.031200 0.187642 +v -1.126072 1.471200 -1.534395 +v -1.126072 1.471200 1.534395 +v -1.125061 2.494500 -0.825668 +v -1.125061 2.494500 0.825668 +v -1.123697 0.553725 -1.531158 +v -1.123697 0.553725 1.531158 +v -1.121601 2.435437 -0.823129 +v -1.121601 2.435437 0.823129 +v -1.118749 0.064800 -0.821035 +v -1.118749 0.064800 0.821035 +v -1.118607 2.482687 -0.820931 +v -1.118607 2.482687 0.820931 +v -1.118073 2.242575 -1.118073 +v -1.118073 2.242575 1.118073 +v -1.117130 2.463000 -0.819847 +v -1.117130 2.463000 0.819847 +v -1.101920 0.213600 1.101920 +v -1.101920 0.213600 -1.101920 +v -1.100200 2.502600 0.000000 +v -1.100200 2.502600 0.000000 +v -1.095040 1.621875 -1.492110 +v -1.095040 1.621875 1.492110 +v -1.086146 0.031200 0.364854 +v -1.086146 0.031200 -0.364854 +v -1.086029 2.502600 0.180521 +v -1.086029 2.502600 -0.180521 +v -1.083310 0.463200 -1.476127 +v -1.083310 0.463200 1.476127 +v -1.074940 0.177075 -1.074940 +v -1.074940 0.177075 1.074940 +v -1.072079 2.474400 -0.557774 +v -1.072079 2.474400 0.557774 +v -1.065000 2.400000 -1.065000 +v -1.065000 0.150000 -1.065000 +v -1.065000 0.150000 1.065000 +v -1.065000 2.400000 1.065000 +v -1.062497 0.127575 1.062497 +v -1.062497 0.127575 -1.062497 +v -1.059553 1.774800 -1.443756 +v -1.059553 1.774800 1.443756 +v -1.052064 2.400000 -0.772096 +v -1.052064 2.400000 0.772096 +v -1.051368 0.105600 -1.051368 +v -1.051368 0.105600 1.051368 +v -1.051031 2.435437 -1.051031 +v -1.051031 2.435437 1.051031 +v -1.044926 2.502600 -0.351008 +v -1.044926 2.502600 0.351008 +v -1.039419 0.046875 -0.762816 +v -1.039419 0.046875 0.762816 +v -1.039360 0.384375 -1.416240 +v -1.039360 0.384375 1.416240 +v -1.036316 2.463000 -1.036316 +v -1.036316 2.463000 1.036316 +v -1.031508 2.440800 0.757010 +v -1.031508 2.440800 -0.757010 +v -1.026181 0.084525 -1.026181 +v -1.026181 0.084525 1.026181 +v -1.021708 2.482687 -1.021708 +v -1.021708 2.482687 1.021708 +v -1.020503 1.929525 -1.390545 +v -1.020503 1.929525 1.390545 +v -1.017621 0.031200 0.529441 +v -1.017621 0.031200 -0.529441 +v -1.008058 2.494500 -1.008058 +v -1.008058 2.494500 1.008058 +v -0.996219 2.498438 -0.996219 +v -0.996219 2.498438 0.996219 +v -0.995410 0.316800 -1.356353 +v -0.995410 0.316800 1.356353 +v -0.994000 2.400000 -0.994000 +v -0.994000 2.400000 0.994000 +v -0.987042 2.494500 -0.987042 +v -0.987042 2.494500 0.987042 +v -0.984007 2.435437 -0.984007 +v -0.984007 2.435437 0.984007 +v -0.981504 0.064800 0.981504 +v -0.981504 0.064800 -0.981504 +v -0.981380 2.482687 -0.981380 +v -0.981380 2.482687 0.981380 +v -0.980084 2.463000 -0.980084 +v -0.980084 2.463000 0.980084 +v -0.979002 2.502600 0.509349 +v -0.979002 2.502600 -0.509349 +v -0.978780 2.085600 -1.333693 +v -0.978780 2.085600 1.333693 +v -0.975021 2.474400 -0.715555 +v -0.975021 2.474400 0.715555 +v -0.970400 2.527200 0.000000 +v -0.970400 2.527200 0.000000 +v -0.957901 2.527200 -0.159223 +v -0.957901 2.527200 0.159223 +v -0.955023 0.260025 1.301322 +v -0.955023 0.260025 -1.301322 +v -0.952425 0.018225 -0.000000 +v -0.952425 0.018225 0.000000 +v -0.940158 0.018225 0.156274 +v -0.940158 0.018225 -0.156274 +v -0.935276 2.242575 -1.274414 +v -0.935276 2.242575 1.274414 +v -0.925920 0.900000 -1.779680 +v -0.925920 0.900000 1.779680 +v -0.925920 0.900000 1.779680 +v -0.925920 0.900000 -1.779680 +v -0.925493 0.031200 0.679207 +v -0.925493 0.031200 -0.679207 +v -0.923000 2.400000 -0.923000 +v -0.923000 2.400000 0.923000 +v -0.922564 1.037175 1.773229 +v -0.922564 1.037175 -1.773229 +v -0.921764 0.213600 1.256003 +v -0.921764 0.213600 -1.256003 +v -0.921647 2.527200 -0.309596 +v -0.921647 2.527200 0.309596 +v -0.919439 0.771675 -1.767222 +v -0.919439 0.771675 1.767222 +v -0.912957 1.178400 -1.754764 +v -0.912957 1.178400 1.754764 +v -0.911906 0.046875 -0.911906 +v -0.911906 0.046875 0.911906 +v -0.904966 2.440800 0.904966 +v -0.904966 2.440800 -0.904966 +v -0.904575 0.018225 0.303862 +v -0.904575 0.018225 -0.303862 +v -0.901846 0.656400 -1.733408 +v -0.901846 0.656400 1.733408 +v -0.899195 0.177075 1.225250 +v -0.899195 0.177075 -1.225250 +v -0.897795 1.323225 -1.725622 +v -0.897795 1.323225 1.725622 +v -0.890880 0.150000 -1.213920 +v -0.890880 0.150000 1.213920 +v -0.890880 2.400000 -1.213920 +v -0.890880 0.150000 -1.213920 +v -0.890880 0.150000 1.213920 +v -0.890880 2.400000 1.213920 +v -0.890370 2.502600 -0.653431 +v -0.890370 2.502600 0.653431 +v -0.888786 0.127575 1.211067 +v -0.888786 0.127575 -1.211067 +v -0.879477 0.105600 -1.198382 +v -0.879477 0.105600 1.198382 +v -0.879195 2.435437 -1.197997 +v -0.879195 2.435437 1.197997 +v -0.877772 1.471200 -1.687137 +v -0.877772 1.471200 1.687137 +v -0.875920 0.553725 -1.683577 +v -0.875920 0.553725 1.683577 +v -0.866886 2.463000 -1.181225 +v -0.866886 2.463000 1.181225 +v -0.863501 2.527200 -0.449256 +v -0.863501 2.527200 0.449256 +v -0.858407 0.084525 -1.169673 +v -0.858407 0.084525 1.169673 +v -0.855408 2.474400 -0.855408 +v -0.855408 2.474400 0.855408 +v -0.854666 2.482687 -1.164574 +v -0.854666 2.482687 1.164574 +v -0.853583 1.621875 -1.640643 +v -0.853583 1.621875 1.640643 +v -0.847506 0.018225 -0.440935 +v -0.847506 0.018225 0.440935 +v -0.844439 0.463200 1.623068 +v -0.844439 0.463200 -1.623068 +v -0.843248 2.494500 -1.149016 +v -0.843248 2.494500 1.149016 +v -0.833344 2.498438 -1.135521 +v -0.833344 2.498438 1.135521 +v -0.831488 2.400000 -1.132992 +v -0.831488 2.400000 1.132992 +v -0.825921 1.774800 1.587475 +v -0.825921 1.774800 -1.587475 +v -0.825668 2.494500 -1.125061 +v -0.825668 2.494500 1.125061 +v -0.825000 2.550000 0.000000 +v -0.825000 2.550000 0.000000 +v -0.823129 2.435437 -1.121601 +v -0.823129 2.435437 1.121601 +v -0.821035 0.064800 1.118749 +v -0.821035 0.064800 -1.118749 +v -0.820931 2.482687 1.118607 +v -0.820931 2.482687 -1.118607 +v -0.819847 2.463000 -1.117130 +v -0.819847 2.463000 1.117130 +v -0.814374 2.550000 -0.135366 +v -0.814374 2.550000 0.135366 +v -0.811956 0.031200 0.811956 +v -0.811956 0.031200 -0.811956 +v -0.810180 0.384375 1.557220 +v -0.810180 0.384375 -1.557220 +v -0.795481 1.929525 1.528968 +v -0.795481 1.929525 -1.528968 +v -0.785325 2.527200 -0.576340 +v -0.785325 2.527200 0.576340 +v -0.783552 2.550000 -0.263208 +v -0.783552 2.550000 0.263208 +v -0.781142 2.502600 -0.781142 +v -0.781142 2.502600 0.781142 +v -0.775921 0.316800 -1.491372 +v -0.775921 0.316800 1.491372 +v -0.772096 2.400000 -1.052064 +v -0.772096 2.400000 1.052064 +v -0.770779 0.018225 0.565664 +v -0.770779 0.018225 -0.565664 +v -0.762958 2.085600 -1.466456 +v -0.762958 2.085600 1.466456 +v -0.762816 0.046875 -1.039419 +v -0.762816 0.046875 1.039419 +v -0.757010 2.440800 1.031508 +v -0.757010 2.440800 -1.031508 +v -0.744440 0.260025 1.430863 +v -0.744440 0.260025 -1.430863 +v -0.734118 2.550000 -0.381942 +v -0.734118 2.550000 0.381942 +v -0.729046 2.242575 -1.401276 +v -0.729046 2.242575 1.401276 +v -0.718514 0.213600 1.381032 +v -0.718514 0.213600 -1.381032 +v -0.715555 2.474400 -0.975021 +v -0.715555 2.474400 0.975021 +v -0.703200 0.008400 0.000000 +v -0.700921 0.177075 1.347218 +v -0.700921 0.177075 -1.347218 +v -0.694440 0.150000 -1.334760 +v -0.694440 0.150000 1.334760 +v -0.694440 2.400000 1.334760 +v -0.694440 0.150000 1.334760 +v -0.694440 2.400000 -1.334760 +v -0.694440 0.150000 -1.334760 +v -0.694143 0.008400 -0.115381 +v -0.694143 0.008400 0.115381 +v -0.692808 0.127575 1.331623 +v -0.692808 0.127575 -1.331623 +v -0.688984 2.527200 -0.688984 +v -0.688984 2.527200 0.688984 +v -0.685551 0.105600 -1.317675 +v -0.685551 0.105600 1.317675 +v -0.685331 2.435437 -1.317252 +v -0.685331 2.435437 1.317252 +v -0.679207 0.031200 -0.925493 +v -0.679207 0.031200 0.925493 +v -0.676222 0.018225 0.676222 +v -0.676222 0.018225 -0.676222 +v -0.675736 2.463000 -1.298810 +v -0.675736 2.463000 1.298810 +v -0.673600 2.572800 0.000000 +v -0.673600 2.572800 0.000000 +v -0.669128 0.084525 -1.286108 +v -0.669128 0.084525 1.286108 +v -0.667871 0.008400 -0.224349 +v -0.667871 0.008400 0.224349 +v -0.667656 2.550000 -0.489984 +v -0.667656 2.550000 0.489984 +v -0.666211 2.482687 1.280502 +v -0.666211 2.482687 -1.280502 +v -0.664924 2.572800 -0.110524 +v -0.664924 2.572800 0.110524 +v -0.657311 2.494500 -1.263395 +v -0.657311 2.494500 1.263395 +v -0.653431 2.502600 -0.890370 +v -0.653431 2.502600 0.890370 +v -0.649591 2.498438 -1.248557 +v -0.649591 2.498438 1.248557 +v -0.648144 2.400000 -1.245776 +v -0.648144 2.400000 1.245776 +v -0.643607 2.494500 -1.237056 +v -0.643607 2.494500 1.237056 +v -0.641628 2.435437 -1.233252 +v -0.641628 2.435437 1.233252 +v -0.639996 0.064800 -1.230115 +v -0.639996 0.064800 1.230115 +v -0.639915 2.482687 1.229959 +v -0.639915 2.482687 -1.229959 +v -0.639758 2.572800 -0.214905 +v -0.639758 2.572800 0.214905 +v -0.639070 2.463000 -1.228335 +v -0.639070 2.463000 1.228335 +v -0.638080 0.900000 -1.899520 +v -0.638080 0.900000 -1.899520 +v -0.638080 0.900000 1.899520 +v -0.638080 0.900000 1.899520 +v -0.635767 1.037175 -1.892634 +v -0.635767 1.037175 1.892634 +v -0.633613 0.771675 -1.886223 +v -0.633613 0.771675 1.886223 +v -0.629147 1.178400 -1.872927 +v -0.629147 1.178400 1.872927 +v -0.625735 0.008400 0.325553 +v -0.625735 0.008400 -0.325553 +v -0.621490 0.656400 -1.850132 +v -0.621490 0.656400 1.850132 +v -0.618698 1.323225 -1.841822 +v -0.618698 1.323225 1.841822 +v -0.604900 1.471200 -1.800745 +v -0.604900 1.471200 1.800745 +v -0.603624 0.553725 -1.796946 +v -0.603624 0.553725 1.796946 +v -0.601848 2.400000 -1.156792 +v -0.601848 2.400000 1.156792 +v -0.599396 2.572800 -0.311850 +v -0.599396 2.572800 0.311850 +v -0.594614 0.046875 -1.142888 +v -0.594614 0.046875 1.142888 +v -0.590089 2.440800 1.134190 +v -0.590089 2.440800 -1.134190 +v -0.588230 1.621875 -1.751120 +v -0.588230 1.621875 1.751120 +v -0.585750 2.550000 -0.585750 +v -0.585750 2.550000 0.585750 +v -0.581929 0.463200 -1.732362 +v -0.581929 0.463200 1.732362 +v -0.576340 2.527200 -0.785325 +v -0.576340 2.527200 0.785325 +v -0.569167 1.774800 -1.694372 +v -0.569167 1.774800 1.694372 +v -0.569086 0.008400 -0.417645 +v -0.569086 0.008400 0.417645 +v -0.565664 0.018225 0.770779 +v -0.565664 0.018225 -0.770779 +v -0.558320 0.384375 -1.662080 +v -0.558320 0.384375 1.662080 +v -0.557774 2.474400 -1.072079 +v -0.557774 2.474400 1.072079 +v -0.548190 1.929525 -1.631925 +v -0.548190 1.929525 1.631925 +v -0.545131 2.572800 -0.400065 +v -0.545131 2.572800 0.400065 +v -0.534711 0.316800 -1.591798 +v -0.534711 0.316800 1.591798 +v -0.529441 0.031200 -1.017621 +v -0.529441 0.031200 1.017621 +v -0.525800 2.597400 0.000000 +v -0.525800 2.597400 0.000000 +v -0.525778 2.085600 -1.565204 +v -0.525778 2.085600 1.565204 +v -0.519028 2.597400 0.086273 +v -0.519028 2.597400 -0.086273 +v -0.513016 0.260025 -1.527214 +v -0.513016 0.260025 1.527214 +v -0.509349 2.502600 0.979002 +v -0.509349 2.502600 -0.979002 +v -0.502408 2.242575 -1.495635 +v -0.502408 2.242575 1.495635 +v -0.499384 2.597400 -0.167751 +v -0.499384 2.597400 0.167751 +v -0.499272 0.008400 -0.499272 +v -0.499272 0.008400 0.499272 +v -0.495150 0.213600 -1.474028 +v -0.495150 0.213600 1.474028 +v -0.489984 2.550000 -0.667656 +v -0.489984 2.550000 0.667656 +v -0.483027 0.177075 -1.437937 +v -0.483027 0.177075 1.437937 +v -0.478560 0.150000 1.424640 +v -0.478560 2.400000 -1.424640 +v -0.478560 0.150000 -1.424640 +v -0.478560 0.150000 -1.424640 +v -0.478560 0.150000 1.424640 +v -0.478560 2.400000 1.424640 +v -0.478256 2.572800 -0.478256 +v -0.478256 2.572800 0.478256 +v -0.477435 0.127575 1.421292 +v -0.477435 0.127575 -1.421292 +v -0.472434 0.105600 1.406405 +v -0.472434 0.105600 -1.406405 +v -0.472283 2.435437 -1.405953 +v -0.472283 2.435437 1.405953 +v -0.467878 2.597400 -0.243424 +v -0.467878 2.597400 0.243424 +v -0.465671 2.463000 -1.386270 +v -0.465671 2.463000 1.386270 +v -0.461116 0.084525 1.372712 +v -0.461116 0.084525 -1.372712 +v -0.459107 2.482687 -1.366728 +v -0.459107 2.482687 1.366728 +v -0.452973 2.494500 -1.348469 +v -0.452973 2.494500 1.348469 +v -0.449256 2.527200 -0.863501 +v -0.449256 2.527200 0.863501 +v -0.447653 2.498438 -1.332632 +v -0.447653 2.498438 1.332632 +v -0.446656 2.400000 -1.329664 +v -0.446656 2.400000 1.329664 +v -0.443529 2.494500 -1.320356 +v -0.443529 2.494500 1.320356 +v -0.442166 2.435437 -1.316296 +v -0.442166 2.435437 1.316296 +v -0.441041 0.064800 1.312948 +v -0.441041 0.064800 -1.312948 +v -0.440985 2.482687 -1.312782 +v -0.440985 2.482687 1.312782 +v -0.440935 0.018225 0.847506 +v -0.440935 0.018225 -0.847506 +v -0.440403 2.463000 -1.311049 +v -0.440403 2.463000 1.311049 +v -0.425519 2.597400 0.312283 +v -0.425519 2.597400 -0.312283 +v -0.417645 0.008400 -0.569086 +v -0.417645 0.008400 0.569086 +v -0.414752 2.400000 -1.234688 +v -0.414752 2.400000 1.234688 +v -0.409767 0.046875 1.219848 +v -0.409767 0.046875 -1.219848 +v -0.406648 2.440800 -1.210564 +v -0.406648 2.440800 1.210564 +v -0.400065 2.572800 -0.545131 +v -0.400065 2.572800 0.545131 +v -0.391200 2.625600 0.000000 +v -0.391200 2.625600 0.000000 +v -0.388275 0.002175 -0.000000 +v -0.388275 0.002175 0.000000 +v -0.386161 2.625600 -0.064188 +v -0.386161 2.625600 0.064188 +v -0.384379 2.474400 -1.144271 +v -0.384379 2.474400 1.144271 +v -0.383274 0.002175 -0.063708 +v -0.383274 0.002175 0.063708 +v -0.381942 2.550000 -0.734118 +v -0.381942 2.550000 0.734118 +v -0.373318 2.597400 -0.373318 +v -0.373318 2.597400 0.373318 +v -0.371546 2.625600 -0.124808 +v -0.371546 2.625600 0.124808 +v -0.368768 0.002175 -0.123875 +v -0.368768 0.002175 0.123875 +v -0.364854 0.031200 1.086146 +v -0.364854 0.031200 -1.086146 +v -0.358400 3.034800 0.000000 +v -0.358400 3.034800 0.000000 +v -0.358200 3.081150 0.000000 +v -0.358200 3.081150 0.000000 +v -0.353807 3.034800 -0.059016 +v -0.353807 3.034800 0.059016 +v -0.353610 3.081150 -0.058988 +v -0.353610 3.081150 0.058988 +v -0.351008 2.502600 -1.044926 +v -0.351008 2.502600 1.044926 +v -0.348105 2.625600 -0.181110 +v -0.348105 2.625600 0.181110 +v -0.345503 0.002175 -0.179756 +v -0.345503 0.002175 0.179756 +v -0.340477 3.034800 -0.114676 +v -0.340477 3.034800 0.114676 +v -0.340289 3.081150 -0.114619 +v -0.340289 3.081150 0.114619 +v -0.328160 0.900000 -1.974240 +v -0.328160 0.900000 1.974240 +v -0.328160 0.900000 1.974240 +v -0.326970 1.037175 -1.967083 +v -0.326970 1.037175 1.967083 +v -0.325863 0.771675 -1.960420 +v -0.325863 0.771675 1.960420 +v -0.325553 0.008400 -0.625735 +v -0.325553 0.008400 0.625735 +v -0.325000 2.981250 0.000000 +v -0.325000 2.981250 0.000000 +v -0.323566 1.178400 -1.946601 +v -0.323566 1.178400 1.946601 +v -0.320834 2.981250 -0.053508 +v -0.320834 2.981250 0.053508 +v -0.319628 0.656400 -1.922910 +v -0.319628 0.656400 1.922910 +v -0.319082 3.034800 -0.166306 +v -0.319082 3.034800 0.166306 +v -0.318907 3.081150 -0.166221 +v -0.318907 3.081150 0.166221 +v -0.318192 1.323225 -1.914272 +v -0.318192 1.323225 1.914272 +v -0.316590 2.625600 -0.232342 +v -0.316590 2.625600 0.232342 +v -0.314223 0.002175 -0.230604 +v -0.314223 0.002175 0.230604 +v -0.312283 2.597400 -0.425519 +v -0.312283 2.597400 0.425519 +v -0.311850 2.572800 -0.599396 +v -0.311850 2.572800 0.599396 +v -0.311096 1.471200 -1.871580 +v -0.311096 1.471200 1.871580 +v -0.310439 0.553725 -1.867631 +v -0.310439 0.553725 1.867631 +v -0.309596 2.527200 -0.921647 +v -0.309596 2.527200 0.921647 +v -0.308800 3.117600 0.000000 +v -0.308800 3.117600 0.000000 +v -0.308744 2.981250 -0.103976 +v -0.308744 2.981250 0.103976 +v -0.304843 3.117600 -0.050855 +v -0.304843 3.117600 0.050855 +v -0.303862 0.018225 0.904575 +v -0.303862 0.018225 -0.904575 +v -0.302523 1.621875 -1.820003 +v -0.302522 1.621875 1.820003 +v -0.299282 0.463200 -1.800507 +v -0.299282 0.463200 1.800507 +v -0.293360 3.117600 -0.098814 +v -0.293360 3.117600 0.098814 +v -0.292719 1.774800 -1.761022 +v -0.292719 1.774800 1.761022 +v -0.290295 3.034800 -0.213234 +v -0.290295 3.034800 0.213234 +v -0.290138 3.081150 -0.213123 +v -0.290138 3.081150 0.213123 +v -0.289340 2.981250 -0.150793 +v -0.289340 2.981250 0.150793 +v -0.287140 0.384375 -1.727460 +v -0.287140 0.384375 1.727460 +v -0.281930 1.929525 1.696119 +v -0.281930 1.929525 -1.696119 +v -0.279400 2.659200 0.000000 +v -0.277752 2.625600 -0.277752 +v -0.277752 2.625600 0.277752 +v -0.275801 2.659200 -0.045844 +v -0.275801 2.659200 0.045844 +v -0.275675 0.002175 -0.275675 +v -0.275675 0.002175 0.275675 +v -0.274998 0.316800 -1.654413 +v -0.274998 0.316800 1.654413 +v -0.274928 3.117600 -0.143301 +v -0.274928 3.117600 0.143301 +v -0.273600 2.923200 0.000000 +v -0.273600 2.923200 0.000000 +v -0.270404 2.085600 -1.626774 +v -0.270404 2.085600 1.626774 +v -0.270092 2.923200 -0.045032 +v -0.270092 2.923200 0.045032 +v -0.265363 2.659200 -0.089140 +v -0.265363 2.659200 0.089140 +v -0.263841 0.260025 1.587289 +v -0.263841 0.260025 -1.587289 +v -0.263232 2.981250 -0.193348 +v -0.263232 2.981250 0.193348 +v -0.263208 2.550000 -0.783552 +v -0.263208 2.550000 0.783552 +v -0.259910 2.923200 -0.087511 +v -0.259910 2.923200 0.087511 +v -0.258385 2.242575 -1.554467 +v -0.258385 2.242575 1.554467 +v -0.254788 3.034800 -0.254788 +v -0.254788 3.034800 0.254788 +v -0.254653 3.081150 -0.254653 +v -0.254653 3.081150 0.254653 +v -0.254652 0.213600 -1.532010 +v -0.254652 0.213600 1.532010 +v -0.250127 3.117600 -0.183734 +v -0.250127 3.117600 0.183734 +v -0.248621 2.659200 0.129351 +v -0.248621 2.659200 -0.129351 +v -0.248417 0.177075 -1.494500 +v -0.248417 0.177075 1.494500 +v -0.246120 0.150000 1.480680 +v -0.246120 2.400000 -1.480680 +v -0.246120 0.150000 -1.480680 +v -0.246120 0.150000 -1.480680 +v -0.246120 0.150000 1.480680 +v -0.246120 2.400000 1.480680 +v -0.245542 0.127575 1.477200 +v -0.245542 0.127575 -1.477200 +v -0.243569 2.923200 -0.126920 +v -0.243569 2.923200 0.126920 +v -0.243424 2.597400 0.467878 +v -0.243424 2.597400 -0.467878 +v -0.242970 0.105600 1.461727 +v -0.242970 0.105600 -1.461727 +v -0.242892 2.435437 -1.461258 +v -0.242892 2.435437 1.461258 +v -0.239491 2.463000 -1.440800 +v -0.239491 2.463000 1.440800 +v -0.237149 0.084525 1.426709 +v -0.237149 0.084525 -1.426709 +v -0.236115 2.482687 -1.420490 +v -0.236115 2.482687 1.420490 +v -0.232961 2.494500 -1.401513 +v -0.232961 2.494500 1.401513 +v -0.232342 2.625600 -0.316590 +v -0.232342 2.625600 0.316590 +v -0.231031 2.981250 -0.231031 +v -0.231031 2.981250 0.231031 +v -0.230604 0.002175 -0.314223 +v -0.230604 0.002175 0.314223 +v -0.230225 2.498438 -1.385053 +v -0.230225 2.498438 1.385053 +v -0.229712 2.400000 -1.381968 +v -0.229712 2.400000 1.381968 +v -0.228104 2.494500 -1.372294 +v -0.228104 2.494500 1.372294 +v -0.227403 2.435437 -1.368074 +v -0.227403 2.435437 1.368074 +v -0.226824 0.064800 1.364595 +v -0.226824 0.064800 -1.364595 +v -0.226795 2.482687 1.364422 +v -0.226795 2.482687 -1.364422 +v -0.226496 2.463000 -1.362620 +v -0.226496 2.463000 1.362620 +v -0.226113 2.659200 -0.165941 +v -0.226113 2.659200 0.165941 +v -0.224349 0.008400 0.667871 +v -0.224349 0.008400 -0.667871 +v -0.221585 2.923200 -0.162745 +v -0.221585 2.923200 0.162745 +v -0.219800 2.863350 0.000000 +v -0.219800 2.863350 0.000000 +v -0.219536 3.117600 -0.219536 +v -0.219536 3.117600 0.219536 +v -0.216979 2.863350 0.036157 +v -0.216979 2.863350 -0.036157 +v -0.214905 2.572800 -0.639758 +v -0.214905 2.572800 0.639758 +v -0.213304 2.400000 -1.283256 +v -0.213304 2.400000 1.283256 +v -0.213234 3.034800 -0.290295 +v -0.213234 3.034800 0.290295 +v -0.213123 3.081150 -0.290138 +v -0.213123 3.081150 0.290138 +v -0.210740 0.046875 -1.267832 +v -0.210740 0.046875 1.267832 +v -0.209136 2.440800 -1.258183 +v -0.209136 2.440800 1.258183 +v -0.208794 2.863350 0.070270 +v -0.208794 2.863350 -0.070270 +v -0.200000 2.700000 0.000000 +v -0.200000 2.700000 0.000000 +v -0.200000 2.700000 0.000000 +v -0.200000 2.700000 0.000000 +v -0.198374 2.659200 -0.198374 +v -0.198374 2.659200 0.198374 +v -0.197684 2.474400 -1.189282 +v -0.197684 2.474400 1.189282 +v -0.197424 2.700000 -0.032816 +v -0.197424 2.700000 0.032816 +v -0.197424 2.700000 0.032816 +v -0.197424 2.700000 -0.032816 +v -0.195658 2.863350 -0.101925 +v -0.195658 2.863350 0.101925 +v -0.194600 3.141450 0.000000 +v -0.194600 3.141450 0.000000 +v -0.194472 2.923200 -0.194472 +v -0.194472 2.923200 0.194472 +v -0.193348 2.981250 -0.263232 +v -0.193348 2.981250 0.263232 +v -0.192107 3.141450 -0.032048 +v -0.192107 3.141450 0.032048 +v -0.189952 2.700000 -0.063808 +v -0.189952 2.700000 0.063808 +v -0.189952 2.700000 0.063808 +v -0.189952 2.700000 -0.063808 +v -0.187642 0.031200 1.128870 +v -0.187642 0.031200 -1.128870 +v -0.184870 3.141450 -0.062272 +v -0.184870 3.141450 0.062272 +v -0.183734 3.117600 -0.250127 +v -0.183734 3.117600 0.250127 +v -0.181110 2.625600 0.348105 +v -0.181110 2.625600 -0.348105 +v -0.180521 2.502600 -1.086029 +v -0.180521 2.502600 1.086029 +v -0.179756 0.002175 -0.345503 +v -0.179756 0.002175 0.345503 +v -0.179200 2.804400 0.000000 +v -0.179200 2.804400 0.000000 +v -0.177989 2.863350 -0.130707 +v -0.177989 2.863350 0.130707 +v -0.177968 2.700000 -0.092592 +v -0.177968 2.700000 0.092592 +v -0.177968 2.700000 0.092592 +v -0.177968 2.700000 -0.092592 +v -0.176897 2.804400 0.029450 +v -0.176897 2.804400 -0.029450 +v -0.173255 3.141450 -0.090306 +v -0.173255 3.141450 0.090306 +v -0.170215 2.804400 0.057246 +v -0.170215 2.804400 -0.057246 +v -0.167751 2.597400 -0.499384 +v -0.167751 2.597400 0.499384 +v -0.167400 2.749050 0.000000 +v -0.167400 2.749050 0.000000 +v -0.166306 3.034800 -0.319082 +v -0.166306 3.034800 0.319082 +v -0.166221 3.081150 0.318907 +v -0.166221 3.081150 -0.318907 +v -0.165941 2.659200 -0.226113 +v -0.165941 2.659200 0.226113 +v -0.165245 2.749050 0.027480 +v -0.165245 2.749050 -0.027480 +v -0.162745 2.923200 -0.221585 +v -0.162745 2.923200 0.221585 +v -0.161856 2.700000 -0.118784 +v -0.161856 2.700000 0.118784 +v -0.161856 2.700000 0.118784 +v -0.161856 2.700000 -0.118784 +v -0.159496 2.804400 0.083047 +v -0.159496 2.804400 -0.083047 +v -0.159223 2.527200 -0.957901 +v -0.159223 2.527200 0.957901 +v -0.158995 2.749050 0.053428 +v -0.158995 2.749050 -0.053428 +v -0.157626 3.141450 -0.115787 +v -0.157626 3.141450 0.115787 +v -0.156274 0.018225 0.940158 +v -0.156274 0.018225 -0.940158 +v -0.156200 2.863350 -0.156200 +v -0.156200 2.863350 0.156200 +v -0.150793 2.981250 -0.289340 +v -0.150793 2.981250 0.289340 +v -0.148969 2.749050 0.077523 +v -0.148969 2.749050 -0.077523 +v -0.145078 2.804400 0.106513 +v -0.145078 2.804400 -0.106513 +v -0.143301 3.117600 -0.274928 +v -0.143301 3.117600 0.274928 +v -0.142000 2.700000 -0.142000 +v -0.142000 2.700000 0.142000 +v -0.142000 2.700000 0.142000 +v -0.142000 2.700000 -0.142000 +v -0.138348 3.141450 -0.138348 +v -0.138348 3.141450 0.138348 +v -0.135489 2.749050 0.099446 +v -0.135489 2.749050 -0.099446 +v -0.135366 2.550000 -0.814374 +v -0.135366 2.550000 0.814374 +v -0.130707 2.863350 -0.177989 +v -0.130707 2.863350 0.177989 +v -0.129351 2.659200 0.248621 +v -0.129351 2.659200 -0.248621 +v -0.127304 2.804400 0.127304 +v -0.127304 2.804400 -0.127304 +v -0.126920 2.923200 -0.243569 +v -0.126920 2.923200 0.243569 +v -0.124808 2.625600 -0.371546 +v -0.124808 2.625600 0.371546 +v -0.123875 0.002175 0.368768 +v -0.123875 0.002175 -0.368768 +v -0.118874 2.749050 0.118874 +v -0.118874 2.749050 -0.118874 +v -0.118784 2.700000 -0.161856 +v -0.118784 2.700000 0.161856 +v -0.118784 2.700000 0.161856 +v -0.118784 2.700000 -0.161856 +v -0.115787 3.141450 -0.157626 +v -0.115787 3.141450 0.157626 +v -0.115381 0.008400 0.694143 +v -0.115381 0.008400 -0.694143 +v -0.114676 3.034800 -0.340477 +v -0.114676 3.034800 0.340477 +v -0.114619 3.081150 -0.340289 +v -0.114619 3.081150 0.340289 +v -0.110524 2.572800 -0.664924 +v -0.110524 2.572800 0.664924 +v -0.106513 2.804400 -0.145078 +v -0.106513 2.804400 0.145078 +v -0.103976 2.981250 -0.308744 +v -0.103976 2.981250 0.308744 +v -0.101925 2.863350 -0.195658 +v -0.101925 2.863350 0.195658 +v -0.099446 2.749050 0.135489 +v -0.099446 2.749050 -0.135489 +v -0.098814 3.117600 -0.293360 +v -0.098814 3.117600 0.293360 +v -0.092592 2.700000 -0.177968 +v -0.092592 2.700000 0.177968 +v -0.092592 2.700000 -0.177968 +v -0.092592 2.700000 0.177968 +v -0.090306 3.141450 -0.173255 +v -0.090306 3.141450 0.173255 +v -0.089140 2.659200 -0.265363 +v -0.089140 2.659200 0.265363 +v -0.087511 2.923200 -0.259910 +v -0.087511 2.923200 0.259910 +v -0.086273 2.597400 -0.519028 +v -0.086273 2.597400 0.519028 +v -0.083047 2.804400 -0.159496 +v -0.083047 2.804400 0.159496 +v -0.077523 2.749050 -0.148969 +v -0.077523 2.749050 0.148969 +v -0.070270 2.863350 -0.208794 +v -0.070270 2.863350 0.208794 +v -0.064188 2.625600 -0.386161 +v -0.064188 2.625600 0.386161 +v -0.063808 2.700000 -0.189952 +v -0.063808 2.700000 0.189952 +v -0.063808 2.700000 -0.189952 +v -0.063808 2.700000 0.189952 +v -0.063708 0.002175 0.383274 +v -0.063708 0.002175 -0.383274 +v -0.062272 3.141450 -0.184870 +v -0.062272 3.141450 0.184870 +v -0.059016 3.034800 -0.353807 +v -0.059016 3.034800 0.353807 +v -0.058988 3.081150 -0.353610 +v -0.058988 3.081150 0.353610 +v -0.057246 2.804400 -0.170215 +v -0.057246 2.804400 0.170215 +v -0.053508 2.981250 -0.320834 +v -0.053508 2.981250 0.320834 +v -0.053428 2.749050 -0.158995 +v -0.053428 2.749050 0.158995 +v -0.050855 3.117600 -0.304843 +v -0.050855 3.117600 0.304843 +v -0.045844 2.659200 -0.275801 +v -0.045844 2.659200 0.275801 +v -0.045032 2.923200 -0.270092 +v -0.045032 2.923200 0.270092 +v -0.036157 2.863350 -0.216979 +v -0.036157 2.863350 0.216979 +v -0.032816 2.700000 -0.197424 +v -0.032816 2.700000 0.197424 +v -0.032816 2.700000 -0.197424 +v -0.032816 2.700000 0.197424 +v -0.032048 3.141450 -0.192107 +v -0.032048 3.141450 0.192107 +v -0.029450 2.804400 -0.176897 +v -0.029450 2.804400 0.176897 +v -0.027480 2.749050 -0.165245 +v -0.027480 2.749050 0.165245 +v -0.000000 0.260025 1.608000 +v -0.000000 1.929525 1.718250 +v -0.000000 2.085600 -1.648000 +v -0.000000 0.656400 -1.948000 +v -0.000000 0.771675 -1.986000 +v -0.000000 2.482687 1.382225 +v -0.000000 2.700000 -0.200000 +v -0.000000 0.127575 1.496475 +v -0.000000 2.474400 -1.204800 +v -0.000000 2.749050 -0.167400 +v -0.000000 0.018225 0.952425 +v -0.000000 0.046875 -1.284375 +v -0.000000 0.064800 1.382400 +v -0.000000 0.384375 1.750000 +v -0.000000 0.463200 1.824000 +v -0.000000 0.553725 -1.892000 +v -0.000000 1.037175 1.992750 +v -0.000000 1.178400 1.972000 +v -0.000000 1.323225 -1.939250 +v -0.000000 1.621875 -1.843750 +v -0.000000 1.774800 1.784000 +v -0.000000 2.400000 -1.300000 +v -0.000000 2.435437 -1.480325 +v -0.000000 2.435437 -1.385925 +v -0.000000 2.463000 -1.459600 +v -0.000000 2.463000 -1.380400 +v -0.000000 2.494500 -1.390200 +v -0.000000 2.502600 -1.100200 +v -0.000000 2.804400 -0.179200 +v -0.000000 2.863350 -0.219800 +v -0.000000 2.572800 -0.673600 +v -0.000000 0.105600 1.480800 +v -0.000000 0.177075 -1.514000 +v -0.000000 2.494500 -1.419800 +v -0.000000 2.527200 -0.970400 +v -0.000000 2.923200 -0.273600 +v -0.000000 3.117600 -0.308800 +v -0.000000 2.597400 -0.525800 +v -0.000000 2.700000 -0.200000 +v -0.000000 2.981250 -0.325000 +v -0.000000 3.141450 -0.194600 +v -0.000000 0.002175 0.388275 +v -0.000000 3.081150 -0.358200 +v 0.000000 0.000000 0.000000 +v 0.000000 0.002175 -0.388275 +v 0.000000 0.002175 0.388275 +v 0.000000 0.008400 -0.703200 +v 0.000000 0.008400 0.703200 +v 0.000000 0.018225 -0.952425 +v 0.000000 0.018225 0.952425 +v 0.000000 0.031200 -1.143600 +v 0.000000 0.031200 -1.143600 +v 0.000000 0.031200 1.143600 +v 0.000000 0.031200 1.143600 +v 0.000000 0.046875 -1.284375 +v 0.000000 0.046875 1.284375 +v 0.000000 0.064800 -1.382400 +v 0.000000 0.064800 1.382400 +v 0.000000 0.084525 -1.445325 +v 0.000000 0.084525 -1.445325 +v 0.000000 0.084525 1.445325 +v 0.000000 0.084525 1.445325 +v 0.000000 0.105600 -1.480800 +v 0.000000 0.105600 1.480800 +v 0.000000 0.127575 -1.496475 +v 0.000000 0.127575 1.496475 +v 0.000000 0.150000 -1.500000 +v 0.000000 0.150000 -1.500000 +v 0.000000 0.150000 1.500000 +v 0.000000 0.150000 1.500000 +v 0.000000 0.177075 -1.514000 +v 0.000000 0.177075 1.514000 +v 0.000000 0.213600 -1.552000 +v 0.000000 0.213600 -1.552000 +v 0.000000 0.213600 1.552000 +v 0.000000 0.213600 1.552000 +v 0.000000 0.260025 -1.608000 +v 0.000000 0.260025 1.608000 +v 0.000000 0.316800 -1.676000 +v 0.000000 0.316800 -1.676000 +v 0.000000 0.316800 1.676000 +v 0.000000 0.316800 1.676000 +v 0.000000 0.384375 -1.750000 +v 0.000000 0.384375 1.750000 +v 0.000000 0.463200 -1.824000 +v 0.000000 0.463200 1.824000 +v 0.000000 0.553725 -1.892000 +v 0.000000 0.553725 1.892000 +v 0.000000 0.656400 -1.948000 +v 0.000000 0.656400 1.948000 +v 0.000000 0.771675 -1.986000 +v 0.000000 0.771675 1.986000 +v 0.000000 0.900000 -2.000000 +v 0.000000 0.900000 -2.000000 +v 0.000000 0.900000 2.000000 +v 0.000000 0.900000 2.000000 +v 0.000000 1.037175 -1.992750 +v 0.000000 1.037175 1.992750 +v 0.000000 1.178400 -1.972000 +v 0.000000 1.178400 1.972000 +v 0.000000 1.323225 -1.939250 +v 0.000000 1.323225 1.939250 +v 0.000000 1.471200 -1.896000 +v 0.000000 1.471200 -1.896000 +v 0.000000 1.471200 1.896000 +v 0.000000 1.471200 1.896000 +v 0.000000 1.621875 -1.843750 +v 0.000000 1.621875 1.843750 +v 0.000000 1.774800 -1.784000 +v 0.000000 1.774800 1.784000 +v 0.000000 1.929525 -1.718250 +v 0.000000 1.929525 1.718250 +v 0.000000 2.085600 -1.648000 +v 0.000000 2.085600 1.648000 +v 0.000000 2.242575 -1.574750 +v 0.000000 2.242575 -1.574750 +v 0.000000 2.242575 1.574750 +v 0.000000 2.242575 1.574750 +v 0.000000 2.400000 -1.500000 +v 0.000000 2.400000 -1.500000 +v 0.000000 2.400000 -1.400000 +v 0.000000 2.400000 -1.400000 +v 0.000000 2.400000 -1.300000 +v 0.000000 2.400000 1.300000 +v 0.000000 2.400000 1.400000 +v 0.000000 2.400000 1.400000 +v 0.000000 2.400000 1.500000 +v 0.000000 2.400000 1.500000 +v 0.000000 2.435437 -1.480325 +v 0.000000 2.435437 -1.385925 +v 0.000000 2.435437 1.385925 +v 0.000000 2.435437 1.480325 +v 0.000000 2.440800 -1.274600 +v 0.000000 2.440800 -1.274600 +v 0.000000 2.440800 1.274600 +v 0.000000 2.440800 1.274600 +v 0.000000 2.463000 -1.459600 +v 0.000000 2.463000 -1.380400 +v 0.000000 2.463000 1.380400 +v 0.000000 2.463000 1.459600 +v 0.000000 2.474400 -1.204800 +v 0.000000 2.474400 1.204800 +v 0.000000 2.482687 -1.439025 +v 0.000000 2.482687 -1.382225 +v 0.000000 2.482687 1.382225 +v 0.000000 2.482687 1.439025 +v 0.000000 2.494500 -1.419800 +v 0.000000 2.494500 -1.390200 +v 0.000000 2.494500 1.390200 +v 0.000000 2.494500 1.419800 +v 0.000000 2.498438 -1.403125 +v 0.000000 2.498438 -1.403125 +v 0.000000 2.498438 1.403125 +v 0.000000 2.498438 1.403125 +v 0.000000 2.502600 -1.100200 +v 0.000000 2.502600 1.100200 +v 0.000000 2.527200 -0.970400 +v 0.000000 2.527200 0.970400 +v 0.000000 2.550000 -0.825000 +v 0.000000 2.550000 -0.825000 +v 0.000000 2.550000 0.825000 +v 0.000000 2.550000 0.825000 +v 0.000000 2.572800 -0.673600 +v 0.000000 2.572800 0.673600 +v 0.000000 2.597400 -0.525800 +v 0.000000 2.597400 0.525800 +v 0.000000 2.625600 -0.391200 +v 0.000000 2.625600 -0.391200 +v 0.000000 2.625600 0.391200 +v 0.000000 2.625600 0.391200 +v 0.000000 2.659200 -0.279400 +v 0.000000 2.659200 0.279400 +v 0.000000 2.700000 -0.200000 +v 0.000000 2.700000 -0.200000 +v 0.000000 2.700000 0.200000 +v 0.000000 2.700000 0.200000 +v 0.000000 2.749050 -0.167400 +v 0.000000 2.749050 0.167400 +v 0.000000 2.804400 -0.179200 +v 0.000000 2.804400 0.179200 +v 0.000000 2.863350 -0.219800 +v 0.000000 2.863350 0.219800 +v 0.000000 2.923200 -0.273600 +v 0.000000 2.923200 0.273600 +v 0.000000 2.981250 -0.325000 +v 0.000000 2.981250 0.325000 +v 0.000000 3.034800 -0.358400 +v 0.000000 3.034800 -0.358400 +v 0.000000 3.034800 0.358400 +v 0.000000 3.034800 0.358400 +v 0.000000 3.081150 -0.358200 +v 0.000000 3.081150 0.358200 +v 0.000000 3.117600 -0.308800 +v 0.000000 3.117600 0.308800 +v 0.000000 3.141450 -0.194600 +v 0.000000 3.141450 0.194600 +v 0.000000 3.150000 0.000000 +v 0.000000 0.002175 -0.388275 +v 0.000000 3.081150 0.358200 +v 0.000000 2.597400 0.525800 +v 0.000000 2.700000 0.200000 +v 0.000000 2.981250 0.325000 +v 0.000000 3.141450 0.194600 +v 0.000000 3.117600 0.308800 +v 0.000000 0.105600 -1.480800 +v 0.000000 0.177075 1.514000 +v 0.000000 2.494500 1.419800 +v 0.000000 2.527200 0.970400 +v 0.000000 2.923200 0.273600 +v 0.000000 2.572800 0.673600 +v 0.000000 2.863350 0.219800 +v 0.000000 0.018225 -0.952425 +v 0.000000 0.046875 1.284375 +v 0.000000 0.064800 -1.382400 +v 0.000000 0.384375 -1.750000 +v 0.000000 0.463200 -1.824000 +v 0.000000 0.553725 1.892000 +v 0.000000 1.037175 -1.992750 +v 0.000000 1.178400 -1.972000 +v 0.000000 1.323225 1.939250 +v 0.000000 1.621875 1.843750 +v 0.000000 1.774800 -1.784000 +v 0.000000 2.400000 1.300000 +v 0.000000 2.435437 1.385925 +v 0.000000 2.435437 1.480325 +v 0.000000 2.463000 1.380400 +v 0.000000 2.463000 1.459600 +v 0.000000 2.494500 1.390200 +v 0.000000 2.502600 1.100200 +v 0.000000 2.804400 0.179200 +v 0.000000 2.749050 0.167400 +v 0.000000 0.127575 -1.496475 +v 0.000000 2.474400 1.204800 +v 0.000000 0.656400 1.948000 +v 0.000000 0.771675 1.986000 +v 0.000000 2.482687 -1.382225 +v 0.000000 2.700000 0.200000 +v 0.000000 0.260025 -1.608000 +v 0.000000 1.929525 -1.718250 +v 0.000000 2.085600 1.648000 +v 0.027480 2.749050 -0.165245 +v 0.027480 2.749050 0.165245 +v 0.029450 2.804400 -0.176897 +v 0.029450 2.804400 0.176897 +v 0.032048 3.141450 -0.192107 +v 0.032048 3.141450 0.192107 +v 0.032816 2.700000 -0.197424 +v 0.032816 2.700000 0.197424 +v 0.032816 2.700000 -0.197424 +v 0.032816 2.700000 0.197424 +v 0.036157 2.863350 -0.216979 +v 0.036157 2.863350 0.216979 +v 0.045032 2.923200 -0.270092 +v 0.045032 2.923200 0.270092 +v 0.045844 2.659200 -0.275801 +v 0.045844 2.659200 0.275801 +v 0.050855 3.117600 -0.304843 +v 0.050855 3.117600 0.304843 +v 0.053428 2.749050 -0.158995 +v 0.053428 2.749050 0.158995 +v 0.053508 2.981250 -0.320834 +v 0.053508 2.981250 0.320834 +v 0.057246 2.804400 -0.170215 +v 0.057246 2.804400 0.170215 +v 0.058988 3.081150 -0.353610 +v 0.058988 3.081150 0.353610 +v 0.059016 3.034800 -0.353807 +v 0.059016 3.034800 0.353807 +v 0.062272 3.141450 -0.184870 +v 0.062272 3.141450 0.184870 +v 0.063708 0.002175 0.383274 +v 0.063708 0.002175 -0.383274 +v 0.063808 2.700000 -0.189952 +v 0.063808 2.700000 0.189952 +v 0.063808 2.700000 -0.189952 +v 0.063808 2.700000 0.189952 +v 0.064188 2.625600 -0.386161 +v 0.064188 2.625600 0.386161 +v 0.070270 2.863350 -0.208794 +v 0.070270 2.863350 0.208794 +v 0.077523 2.749050 -0.148969 +v 0.077523 2.749050 0.148969 +v 0.083047 2.804400 -0.159496 +v 0.083047 2.804400 0.159496 +v 0.086273 2.597400 -0.519028 +v 0.086273 2.597400 0.519028 +v 0.087511 2.923200 -0.259910 +v 0.087511 2.923200 0.259910 +v 0.089140 2.659200 -0.265363 +v 0.089140 2.659200 0.265363 +v 0.090306 3.141450 -0.173255 +v 0.090306 3.141450 0.173255 +v 0.092592 2.700000 -0.177968 +v 0.092592 2.700000 0.177968 +v 0.092592 2.700000 -0.177968 +v 0.092592 2.700000 0.177968 +v 0.098814 3.117600 -0.293360 +v 0.098814 3.117600 0.293360 +v 0.099446 2.749050 0.135489 +v 0.099446 2.749050 -0.135489 +v 0.101925 2.863350 -0.195658 +v 0.101925 2.863350 0.195658 +v 0.103976 2.981250 -0.308744 +v 0.103976 2.981250 0.308744 +v 0.106513 2.804400 -0.145078 +v 0.106513 2.804400 0.145078 +v 0.110524 2.572800 -0.664924 +v 0.110524 2.572800 0.664924 +v 0.114619 3.081150 -0.340289 +v 0.114619 3.081150 0.340289 +v 0.114676 3.034800 -0.340477 +v 0.114676 3.034800 0.340477 +v 0.115381 0.008400 0.694143 +v 0.115381 0.008400 -0.694143 +v 0.115787 3.141450 -0.157626 +v 0.115787 3.141450 0.157626 +v 0.118784 2.700000 0.161856 +v 0.118784 2.700000 -0.161856 +v 0.118784 2.700000 -0.161856 +v 0.118784 2.700000 0.161856 +v 0.118874 2.749050 0.118874 +v 0.118874 2.749050 -0.118874 +v 0.123875 0.002175 0.368768 +v 0.123875 0.002175 -0.368768 +v 0.124808 2.625600 -0.371546 +v 0.124808 2.625600 0.371546 +v 0.126920 2.923200 -0.243569 +v 0.126920 2.923200 0.243569 +v 0.127304 2.804400 0.127304 +v 0.127304 2.804400 -0.127304 +v 0.129351 2.659200 0.248621 +v 0.129351 2.659200 -0.248621 +v 0.130707 2.863350 -0.177989 +v 0.130707 2.863350 0.177989 +v 0.135366 2.550000 -0.814374 +v 0.135366 2.550000 0.814374 +v 0.135489 2.749050 0.099446 +v 0.135489 2.749050 -0.099446 +v 0.138348 3.141450 -0.138348 +v 0.138348 3.141450 0.138348 +v 0.142000 2.700000 0.142000 +v 0.142000 2.700000 -0.142000 +v 0.142000 2.700000 -0.142000 +v 0.142000 2.700000 0.142000 +v 0.143301 3.117600 -0.274928 +v 0.143301 3.117600 0.274928 +v 0.145078 2.804400 0.106513 +v 0.145078 2.804400 -0.106513 +v 0.148969 2.749050 0.077523 +v 0.148969 2.749050 -0.077523 +v 0.150793 2.981250 -0.289340 +v 0.150793 2.981250 0.289340 +v 0.156200 2.863350 -0.156200 +v 0.156200 2.863350 0.156200 +v 0.156274 0.018225 0.940158 +v 0.156274 0.018225 -0.940158 +v 0.157626 3.141450 -0.115787 +v 0.157626 3.141450 0.115787 +v 0.158995 2.749050 0.053428 +v 0.158995 2.749050 -0.053428 +v 0.159223 2.527200 -0.957901 +v 0.159223 2.527200 0.957901 +v 0.159496 2.804400 0.083047 +v 0.159496 2.804400 -0.083047 +v 0.161856 2.700000 0.118784 +v 0.161856 2.700000 -0.118784 +v 0.161856 2.700000 -0.118784 +v 0.161856 2.700000 0.118784 +v 0.162745 2.923200 -0.221585 +v 0.162745 2.923200 0.221585 +v 0.165245 2.749050 0.027480 +v 0.165245 2.749050 -0.027480 +v 0.165941 2.659200 -0.226113 +v 0.165941 2.659200 0.226113 +v 0.166221 3.081150 0.318907 +v 0.166221 3.081150 -0.318907 +v 0.166306 3.034800 -0.319082 +v 0.166306 3.034800 0.319082 +v 0.167400 2.749050 -0.000000 +v 0.167400 2.749050 0.000000 +v 0.167751 2.597400 -0.499384 +v 0.167751 2.597400 0.499384 +v 0.170215 2.804400 0.057246 +v 0.170215 2.804400 -0.057246 +v 0.173255 3.141450 -0.090306 +v 0.173255 3.141450 0.090306 +v 0.176897 2.804400 0.029450 +v 0.176897 2.804400 -0.029450 +v 0.177968 2.700000 0.092592 +v 0.177968 2.700000 -0.092592 +v 0.177968 2.700000 -0.092592 +v 0.177968 2.700000 0.092592 +v 0.177989 2.863350 -0.130707 +v 0.177989 2.863350 0.130707 +v 0.179200 2.804400 -0.000000 +v 0.179200 2.804400 0.000000 +v 0.179756 0.002175 -0.345503 +v 0.179756 0.002175 0.345503 +v 0.180521 2.502600 -1.086029 +v 0.180521 2.502600 1.086029 +v 0.181110 2.625600 0.348105 +v 0.181110 2.625600 -0.348105 +v 0.183734 3.117600 -0.250127 +v 0.183734 3.117600 0.250127 +v 0.184870 3.141450 -0.062272 +v 0.184870 3.141450 0.062272 +v 0.187642 0.031200 1.128870 +v 0.187642 0.031200 -1.128870 +v 0.189952 2.700000 0.063808 +v 0.189952 2.700000 -0.063808 +v 0.189952 2.700000 -0.063808 +v 0.189952 2.700000 0.063808 +v 0.192107 3.141450 -0.032048 +v 0.192107 3.141450 0.032048 +v 0.193348 2.981250 -0.263232 +v 0.193348 2.981250 0.263232 +v 0.194472 2.923200 -0.194472 +v 0.194472 2.923200 0.194472 +v 0.194600 3.141450 0.000000 +v 0.194600 3.141450 -0.000000 +v 0.195658 2.863350 -0.101925 +v 0.195658 2.863350 0.101925 +v 0.197424 2.700000 0.032816 +v 0.197424 2.700000 -0.032816 +v 0.197424 2.700000 -0.032816 +v 0.197424 2.700000 0.032816 +v 0.197684 2.474400 -1.189282 +v 0.197684 2.474400 1.189282 +v 0.198374 2.659200 -0.198374 +v 0.198374 2.659200 0.198374 +v 0.200000 2.700000 -0.000000 +v 0.200000 2.700000 0.000000 +v 0.200000 2.700000 0.000000 +v 0.200000 2.700000 -0.000000 +v 0.208794 2.863350 0.070270 +v 0.208794 2.863350 -0.070270 +v 0.209136 2.440800 -1.258183 +v 0.209136 2.440800 1.258183 +v 0.210740 0.046875 -1.267832 +v 0.210740 0.046875 1.267832 +v 0.213123 3.081150 -0.290138 +v 0.213123 3.081150 0.290138 +v 0.213234 3.034800 -0.290295 +v 0.213234 3.034800 0.290295 +v 0.213304 2.400000 -1.283256 +v 0.213304 2.400000 1.283256 +v 0.214905 2.572800 -0.639758 +v 0.214905 2.572800 0.639758 +v 0.216979 2.863350 0.036157 +v 0.216979 2.863350 -0.036157 +v 0.219536 3.117600 -0.219536 +v 0.219536 3.117600 0.219536 +v 0.219800 2.863350 -0.000000 +v 0.219800 2.863350 0.000000 +v 0.221585 2.923200 -0.162745 +v 0.221585 2.923200 0.162745 +v 0.224349 0.008400 0.667871 +v 0.224349 0.008400 -0.667871 +v 0.226113 2.659200 -0.165941 +v 0.226113 2.659200 0.165941 +v 0.226496 2.463000 -1.362620 +v 0.226496 2.463000 1.362620 +v 0.226795 2.482687 1.364422 +v 0.226795 2.482687 -1.364422 +v 0.226824 0.064800 1.364595 +v 0.226824 0.064800 -1.364595 +v 0.227403 2.435437 -1.368074 +v 0.227403 2.435437 1.368074 +v 0.228104 2.494500 -1.372294 +v 0.228104 2.494500 1.372294 +v 0.229712 2.400000 -1.381968 +v 0.229712 2.400000 1.381968 +v 0.230225 2.498438 -1.385053 +v 0.230225 2.498438 1.385053 +v 0.230604 0.002175 -0.314223 +v 0.230604 0.002175 0.314223 +v 0.231031 2.981250 -0.231031 +v 0.231031 2.981250 0.231031 +v 0.232342 2.625600 -0.316590 +v 0.232342 2.625600 0.316590 +v 0.232961 2.494500 -1.401513 +v 0.232961 2.494500 1.401513 +v 0.236115 2.482687 -1.420490 +v 0.236115 2.482687 1.420490 +v 0.237149 0.084525 1.426709 +v 0.237149 0.084525 -1.426709 +v 0.239491 2.463000 -1.440800 +v 0.239491 2.463000 1.440800 +v 0.242892 2.435437 -1.461258 +v 0.242892 2.435437 1.461258 +v 0.242970 0.105600 1.461727 +v 0.242970 0.105600 -1.461727 +v 0.243424 2.597400 0.467878 +v 0.243424 2.597400 -0.467878 +v 0.243569 2.923200 -0.126920 +v 0.243569 2.923200 0.126920 +v 0.245542 0.127575 1.477200 +v 0.245542 0.127575 -1.477200 +v 0.246120 0.150000 -1.480680 +v 0.246120 2.400000 -1.480680 +v 0.246120 0.150000 1.480680 +v 0.246120 0.150000 1.480680 +v 0.246120 2.400000 1.480680 +v 0.246120 0.150000 -1.480680 +v 0.248417 0.177075 -1.494500 +v 0.248417 0.177075 1.494500 +v 0.248621 2.659200 0.129351 +v 0.248621 2.659200 -0.129351 +v 0.250127 3.117600 -0.183734 +v 0.250127 3.117600 0.183734 +v 0.254652 0.213600 -1.532010 +v 0.254652 0.213600 1.532010 +v 0.254653 3.081150 -0.254653 +v 0.254653 3.081150 0.254653 +v 0.254788 3.034800 -0.254788 +v 0.254788 3.034800 0.254788 +v 0.258385 2.242575 -1.554467 +v 0.258385 2.242575 1.554467 +v 0.259910 2.923200 -0.087511 +v 0.259910 2.923200 0.087511 +v 0.263208 2.550000 -0.783552 +v 0.263208 2.550000 0.783552 +v 0.263232 2.981250 -0.193348 +v 0.263232 2.981250 0.193348 +v 0.263841 0.260025 1.587289 +v 0.263841 0.260025 -1.587289 +v 0.265363 2.659200 -0.089140 +v 0.265363 2.659200 0.089140 +v 0.270092 2.923200 -0.045032 +v 0.270092 2.923200 0.045032 +v 0.270404 2.085600 -1.626774 +v 0.270404 2.085600 1.626774 +v 0.273600 2.923200 -0.000000 +v 0.273600 2.923200 0.000000 +v 0.274928 3.117600 -0.143301 +v 0.274928 3.117600 0.143301 +v 0.274998 0.316800 -1.654413 +v 0.274998 0.316800 1.654413 +v 0.275675 0.002175 -0.275675 +v 0.275675 0.002175 0.275675 +v 0.275801 2.659200 -0.045844 +v 0.275801 2.659200 0.045844 +v 0.277752 2.625600 -0.277752 +v 0.277752 2.625600 0.277752 +v 0.279400 2.659200 0.000000 +v 0.281930 1.929525 1.696119 +v 0.281930 1.929525 -1.696119 +v 0.287140 0.384375 -1.727460 +v 0.287140 0.384375 1.727460 +v 0.289340 2.981250 -0.150793 +v 0.289340 2.981250 0.150793 +v 0.290138 3.081150 -0.213123 +v 0.290138 3.081150 0.213123 +v 0.290295 3.034800 -0.213234 +v 0.290295 3.034800 0.213234 +v 0.292719 1.774800 -1.761022 +v 0.292719 1.774800 1.761022 +v 0.293360 3.117600 -0.098814 +v 0.293360 3.117600 0.098814 +v 0.299282 0.463200 -1.800507 +v 0.299282 0.463200 1.800507 +v 0.302522 1.621875 -1.820003 +v 0.302523 1.621875 1.820003 +v 0.303862 0.018225 0.904575 +v 0.303862 0.018225 -0.904575 +v 0.304843 3.117600 -0.050855 +v 0.304843 3.117600 0.050855 +v 0.308744 2.981250 -0.103976 +v 0.308744 2.981250 0.103976 +v 0.308800 3.117600 0.000000 +v 0.308800 3.117600 -0.000000 +v 0.309596 2.527200 -0.921647 +v 0.309596 2.527200 0.921647 +v 0.310439 0.553725 -1.867631 +v 0.310439 0.553725 1.867631 +v 0.311096 1.471200 -1.871580 +v 0.311096 1.471200 1.871580 +v 0.311850 2.572800 -0.599396 +v 0.311850 2.572800 0.599396 +v 0.312283 2.597400 -0.425519 +v 0.312283 2.597400 0.425519 +v 0.314223 0.002175 -0.230604 +v 0.314223 0.002175 0.230604 +v 0.316590 2.625600 -0.232342 +v 0.316590 2.625600 0.232342 +v 0.318192 1.323225 -1.914272 +v 0.318192 1.323225 1.914272 +v 0.318907 3.081150 -0.166221 +v 0.318907 3.081150 0.166221 +v 0.319082 3.034800 -0.166306 +v 0.319082 3.034800 0.166306 +v 0.319628 0.656400 -1.922910 +v 0.319628 0.656400 1.922910 +v 0.320834 2.981250 -0.053508 +v 0.320834 2.981250 0.053508 +v 0.323566 1.178400 -1.946601 +v 0.323566 1.178400 1.946601 +v 0.325000 2.981250 0.000000 +v 0.325000 2.981250 -0.000000 +v 0.325553 0.008400 -0.625735 +v 0.325553 0.008400 0.625735 +v 0.325863 0.771675 -1.960420 +v 0.325863 0.771675 1.960420 +v 0.326970 1.037175 -1.967083 +v 0.326970 1.037175 1.967083 +v 0.328160 0.900000 -1.974240 +v 0.328160 0.900000 -1.974240 +v 0.328160 0.900000 1.974240 +v 0.340289 3.081150 -0.114619 +v 0.340289 3.081150 0.114619 +v 0.340477 3.034800 -0.114676 +v 0.340477 3.034800 0.114676 +v 0.345503 0.002175 -0.179756 +v 0.345503 0.002175 0.179756 +v 0.348105 2.625600 -0.181110 +v 0.348105 2.625600 0.181110 +v 0.351008 2.502600 -1.044926 +v 0.351008 2.502600 1.044926 +v 0.353610 3.081150 -0.058988 +v 0.353610 3.081150 0.058988 +v 0.353807 3.034800 -0.059016 +v 0.353807 3.034800 0.059016 +v 0.358200 3.081150 -0.000000 +v 0.358200 3.081150 0.000000 +v 0.358400 3.034800 0.000000 +v 0.358400 3.034800 0.000000 +v 0.364854 0.031200 1.086146 +v 0.364854 0.031200 -1.086146 +v 0.368768 0.002175 -0.123875 +v 0.368768 0.002175 0.123875 +v 0.371546 2.625600 -0.124808 +v 0.371546 2.625600 0.124808 +v 0.373318 2.597400 -0.373318 +v 0.373318 2.597400 0.373318 +v 0.381942 2.550000 -0.734118 +v 0.381942 2.550000 0.734118 +v 0.383274 0.002175 -0.063708 +v 0.383274 0.002175 0.063708 +v 0.384379 2.474400 -1.144271 +v 0.384379 2.474400 1.144271 +v 0.386161 2.625600 -0.064188 +v 0.386161 2.625600 0.064188 +v 0.388275 0.002175 0.000000 +v 0.388275 0.002175 0.000000 +v 0.391200 2.625600 0.000000 +v 0.391200 2.625600 0.000000 +v 0.400065 2.572800 -0.545131 +v 0.400065 2.572800 0.545131 +v 0.406648 2.440800 -1.210564 +v 0.406648 2.440800 1.210564 +v 0.409767 0.046875 1.219848 +v 0.409767 0.046875 -1.219848 +v 0.414752 2.400000 -1.234688 +v 0.414752 2.400000 1.234688 +v 0.417645 0.008400 -0.569086 +v 0.417645 0.008400 0.569086 +v 0.425519 2.597400 0.312283 +v 0.425519 2.597400 -0.312283 +v 0.440403 2.463000 -1.311049 +v 0.440403 2.463000 1.311049 +v 0.440935 0.018225 0.847506 +v 0.440935 0.018225 -0.847506 +v 0.440985 2.482687 -1.312782 +v 0.440985 2.482687 1.312782 +v 0.441041 0.064800 1.312948 +v 0.441041 0.064800 -1.312948 +v 0.442166 2.435437 -1.316296 +v 0.442166 2.435437 1.316296 +v 0.443529 2.494500 -1.320356 +v 0.443529 2.494500 1.320356 +v 0.446656 2.400000 -1.329664 +v 0.446656 2.400000 1.329664 +v 0.447653 2.498438 -1.332632 +v 0.447653 2.498438 1.332632 +v 0.449256 2.527200 -0.863501 +v 0.449256 2.527200 0.863501 +v 0.452973 2.494500 -1.348469 +v 0.452973 2.494500 1.348469 +v 0.459107 2.482687 -1.366728 +v 0.459107 2.482687 1.366728 +v 0.461116 0.084525 1.372712 +v 0.461116 0.084525 -1.372712 +v 0.465671 2.463000 -1.386270 +v 0.465671 2.463000 1.386270 +v 0.467878 2.597400 -0.243424 +v 0.467878 2.597400 0.243424 +v 0.472283 2.435437 -1.405953 +v 0.472283 2.435437 1.405953 +v 0.472434 0.105600 1.406405 +v 0.472434 0.105600 -1.406405 +v 0.477435 0.127575 1.421292 +v 0.477435 0.127575 -1.421292 +v 0.478256 2.572800 -0.478256 +v 0.478256 2.572800 0.478256 +v 0.478560 0.150000 -1.424640 +v 0.478560 2.400000 -1.424640 +v 0.478560 0.150000 1.424640 +v 0.478560 0.150000 1.424640 +v 0.478560 0.150000 -1.424640 +v 0.478560 2.400000 1.424640 +v 0.483027 0.177075 -1.437937 +v 0.483027 0.177075 1.437937 +v 0.489984 2.550000 -0.667656 +v 0.489984 2.550000 0.667656 +v 0.495150 0.213600 -1.474028 +v 0.495150 0.213600 1.474028 +v 0.499272 0.008400 -0.499272 +v 0.499272 0.008400 0.499272 +v 0.499384 2.597400 -0.167751 +v 0.499384 2.597400 0.167751 +v 0.502408 2.242575 -1.495635 +v 0.502408 2.242575 1.495635 +v 0.509349 2.502600 0.979002 +v 0.509349 2.502600 -0.979002 +v 0.513016 0.260025 -1.527214 +v 0.513016 0.260025 1.527214 +v 0.519028 2.597400 0.086273 +v 0.519028 2.597400 -0.086273 +v 0.525778 2.085600 -1.565204 +v 0.525778 2.085600 1.565204 +v 0.525800 2.597400 -0.000000 +v 0.525800 2.597400 0.000000 +v 0.529441 0.031200 -1.017621 +v 0.529441 0.031200 1.017621 +v 0.534711 0.316800 -1.591798 +v 0.534711 0.316800 1.591798 +v 0.545131 2.572800 -0.400065 +v 0.545131 2.572800 0.400065 +v 0.548190 1.929525 -1.631925 +v 0.548190 1.929525 1.631925 +v 0.557774 2.474400 -1.072079 +v 0.557774 2.474400 1.072079 +v 0.558320 0.384375 -1.662080 +v 0.558320 0.384375 1.662080 +v 0.565664 0.018225 0.770779 +v 0.565664 0.018225 -0.770779 +v 0.569086 0.008400 -0.417645 +v 0.569086 0.008400 0.417645 +v 0.569167 1.774800 -1.694372 +v 0.569167 1.774800 1.694372 +v 0.576340 2.527200 -0.785325 +v 0.576340 2.527200 0.785325 +v 0.581929 0.463200 -1.732362 +v 0.581929 0.463200 1.732362 +v 0.585750 2.550000 -0.585750 +v 0.585750 2.550000 0.585750 +v 0.588230 1.621875 -1.751120 +v 0.588230 1.621875 1.751120 +v 0.590089 2.440800 1.134190 +v 0.590089 2.440800 -1.134190 +v 0.594614 0.046875 -1.142888 +v 0.594614 0.046875 1.142888 +v 0.599396 2.572800 -0.311850 +v 0.599396 2.572800 0.311850 +v 0.601848 2.400000 -1.156792 +v 0.601848 2.400000 1.156792 +v 0.603624 0.553725 -1.796946 +v 0.603624 0.553725 1.796946 +v 0.604900 1.471200 -1.800745 +v 0.604900 1.471200 1.800745 +v 0.618698 1.323225 -1.841822 +v 0.618698 1.323225 1.841822 +v 0.621490 0.656400 -1.850132 +v 0.621490 0.656400 1.850132 +v 0.625735 0.008400 0.325553 +v 0.625735 0.008400 -0.325553 +v 0.629147 1.178400 -1.872927 +v 0.629147 1.178400 1.872927 +v 0.633613 0.771675 -1.886223 +v 0.633613 0.771675 1.886223 +v 0.635767 1.037175 -1.892634 +v 0.635767 1.037175 1.892634 +v 0.638080 0.900000 -1.899520 +v 0.638080 0.900000 -1.899520 +v 0.638080 0.900000 1.899520 +v 0.638080 0.900000 1.899520 +v 0.639070 2.463000 -1.228335 +v 0.639070 2.463000 1.228335 +v 0.639758 2.572800 -0.214905 +v 0.639758 2.572800 0.214905 +v 0.639915 2.482687 1.229959 +v 0.639915 2.482687 -1.229959 +v 0.639996 0.064800 -1.230115 +v 0.639996 0.064800 1.230115 +v 0.641628 2.435437 -1.233252 +v 0.641628 2.435437 1.233252 +v 0.643607 2.494500 -1.237056 +v 0.643607 2.494500 1.237056 +v 0.648144 2.400000 -1.245776 +v 0.648144 2.400000 1.245776 +v 0.649591 2.498438 -1.248557 +v 0.649591 2.498438 1.248557 +v 0.653431 2.502600 -0.890370 +v 0.653431 2.502600 0.890370 +v 0.657311 2.494500 -1.263395 +v 0.657311 2.494500 1.263395 +v 0.664924 2.572800 -0.110524 +v 0.664924 2.572800 0.110524 +v 0.666211 2.482687 1.280502 +v 0.666211 2.482687 -1.280502 +v 0.667656 2.550000 -0.489984 +v 0.667656 2.550000 0.489984 +v 0.667871 0.008400 -0.224349 +v 0.667871 0.008400 0.224349 +v 0.669128 0.084525 -1.286108 +v 0.669128 0.084525 1.286108 +v 0.673600 2.572800 0.000000 +v 0.673600 2.572800 -0.000000 +v 0.675736 2.463000 -1.298810 +v 0.675736 2.463000 1.298810 +v 0.676222 0.018225 0.676222 +v 0.676222 0.018225 -0.676222 +v 0.679207 0.031200 -0.925493 +v 0.679207 0.031200 0.925493 +v 0.685331 2.435437 -1.317252 +v 0.685331 2.435437 1.317252 +v 0.685551 0.105600 -1.317675 +v 0.685551 0.105600 1.317675 +v 0.688984 2.527200 -0.688984 +v 0.688984 2.527200 0.688984 +v 0.692808 0.127575 1.331623 +v 0.692808 0.127575 -1.331623 +v 0.694143 0.008400 -0.115381 +v 0.694143 0.008400 0.115381 +v 0.694440 0.150000 1.334760 +v 0.694440 0.150000 -1.334760 +v 0.694440 2.400000 1.334760 +v 0.694440 0.150000 -1.334760 +v 0.694440 0.150000 1.334760 +v 0.694440 2.400000 -1.334760 +v 0.700921 0.177075 1.347218 +v 0.700921 0.177075 -1.347218 +v 0.703200 0.008400 0.000000 +v 0.715555 2.474400 -0.975021 +v 0.715555 2.474400 0.975021 +v 0.718514 0.213600 1.381032 +v 0.718514 0.213600 -1.381032 +v 0.729046 2.242575 -1.401276 +v 0.729046 2.242575 1.401276 +v 0.734118 2.550000 -0.381942 +v 0.734118 2.550000 0.381942 +v 0.744440 0.260025 1.430863 +v 0.744440 0.260025 -1.430863 +v 0.757010 2.440800 1.031508 +v 0.757010 2.440800 -1.031508 +v 0.762816 0.046875 -1.039419 +v 0.762816 0.046875 1.039419 +v 0.762958 2.085600 -1.466456 +v 0.762958 2.085600 1.466456 +v 0.770779 0.018225 0.565664 +v 0.770779 0.018225 -0.565664 +v 0.772096 2.400000 -1.052064 +v 0.772096 2.400000 1.052064 +v 0.775921 0.316800 -1.491372 +v 0.775921 0.316800 1.491372 +v 0.781142 2.502600 -0.781142 +v 0.781142 2.502600 0.781142 +v 0.783552 2.550000 -0.263208 +v 0.783552 2.550000 0.263208 +v 0.785325 2.527200 -0.576340 +v 0.785325 2.527200 0.576340 +v 0.795481 1.929525 1.528968 +v 0.795481 1.929525 -1.528968 +v 0.810180 0.384375 1.557220 +v 0.810180 0.384375 -1.557220 +v 0.811956 0.031200 0.811956 +v 0.811956 0.031200 -0.811956 +v 0.814374 2.550000 -0.135366 +v 0.814374 2.550000 0.135366 +v 0.819847 2.463000 -1.117130 +v 0.819847 2.463000 1.117130 +v 0.820931 2.482687 1.118607 +v 0.820931 2.482687 -1.118607 +v 0.821035 0.064800 1.118749 +v 0.821035 0.064800 -1.118749 +v 0.823129 2.435437 -1.121601 +v 0.823129 2.435437 1.121601 +v 0.825000 2.550000 0.000000 +v 0.825000 2.550000 0.000000 +v 0.825668 2.494500 -1.125061 +v 0.825668 2.494500 1.125061 +v 0.825921 1.774800 1.587475 +v 0.825921 1.774800 -1.587475 +v 0.831488 2.400000 -1.132992 +v 0.831488 2.400000 1.132992 +v 0.833344 2.498438 -1.135521 +v 0.833344 2.498438 1.135521 +v 0.843248 2.494500 -1.149016 +v 0.843248 2.494500 1.149016 +v 0.844439 0.463200 1.623068 +v 0.844439 0.463200 -1.623068 +v 0.847506 0.018225 -0.440935 +v 0.847506 0.018225 0.440935 +v 0.853583 1.621875 -1.640643 +v 0.853583 1.621875 1.640643 +v 0.854666 2.482687 -1.164574 +v 0.854666 2.482687 1.164574 +v 0.855408 2.474400 -0.855408 +v 0.855408 2.474400 0.855408 +v 0.858407 0.084525 -1.169673 +v 0.858407 0.084525 1.169673 +v 0.863501 2.527200 -0.449256 +v 0.863501 2.527200 0.449256 +v 0.866886 2.463000 -1.181225 +v 0.866886 2.463000 1.181225 +v 0.875920 0.553725 -1.683577 +v 0.875920 0.553725 1.683577 +v 0.877772 1.471200 -1.687137 +v 0.877772 1.471200 1.687137 +v 0.879195 2.435437 -1.197997 +v 0.879195 2.435437 1.197997 +v 0.879477 0.105600 -1.198382 +v 0.879477 0.105600 1.198382 +v 0.888786 0.127575 1.211067 +v 0.888786 0.127575 -1.211067 +v 0.890370 2.502600 -0.653431 +v 0.890370 2.502600 0.653431 +v 0.890880 0.150000 -1.213920 +v 0.890880 0.150000 1.213920 +v 0.890880 2.400000 -1.213920 +v 0.890880 0.150000 -1.213920 +v 0.890880 0.150000 1.213920 +v 0.890880 2.400000 1.213920 +v 0.897795 1.323225 -1.725622 +v 0.897795 1.323225 1.725622 +v 0.899195 0.177075 1.225250 +v 0.899195 0.177075 -1.225250 +v 0.901846 0.656400 -1.733408 +v 0.901846 0.656400 1.733408 +v 0.904575 0.018225 0.303862 +v 0.904575 0.018225 -0.303862 +v 0.904966 2.440800 0.904966 +v 0.904966 2.440800 -0.904966 +v 0.911906 0.046875 -0.911906 +v 0.911906 0.046875 0.911906 +v 0.912957 1.178400 -1.754764 +v 0.912957 1.178400 1.754764 +v 0.919439 0.771675 -1.767222 +v 0.919439 0.771675 1.767222 +v 0.921647 2.527200 -0.309596 +v 0.921647 2.527200 0.309596 +v 0.921764 0.213600 1.256003 +v 0.921764 0.213600 -1.256003 +v 0.922564 1.037175 1.773229 +v 0.922564 1.037175 -1.773229 +v 0.923000 2.400000 -0.923000 +v 0.923000 2.400000 0.923000 +v 0.925493 0.031200 0.679207 +v 0.925493 0.031200 -0.679207 +v 0.925920 0.900000 1.779680 +v 0.925920 0.900000 -1.779680 +v 0.925920 0.900000 -1.779680 +v 0.925920 0.900000 1.779680 +v 0.935276 2.242575 -1.274414 +v 0.935276 2.242575 1.274414 +v 0.940158 0.018225 0.156274 +v 0.940158 0.018225 -0.156274 +v 0.952425 0.018225 0.000000 +v 0.952425 0.018225 0.000000 +v 0.955023 0.260025 1.301322 +v 0.955023 0.260025 -1.301322 +v 0.957901 2.527200 -0.159223 +v 0.957901 2.527200 0.159223 +v 0.970400 2.527200 0.000000 +v 0.970400 2.527200 -0.000000 +v 0.975021 2.474400 -0.715555 +v 0.975021 2.474400 0.715555 +v 0.978780 2.085600 -1.333693 +v 0.978780 2.085600 1.333693 +v 0.979002 2.502600 0.509349 +v 0.979002 2.502600 -0.509349 +v 0.980084 2.463000 -0.980084 +v 0.980084 2.463000 0.980084 +v 0.981380 2.482687 -0.981380 +v 0.981380 2.482687 0.981380 +v 0.981504 0.064800 0.981504 +v 0.981504 0.064800 -0.981504 +v 0.984007 2.435437 -0.984007 +v 0.984007 2.435437 0.984007 +v 0.987042 2.494500 -0.987042 +v 0.987042 2.494500 0.987042 +v 0.994000 2.400000 -0.994000 +v 0.994000 2.400000 0.994000 +v 0.995410 0.316800 -1.356353 +v 0.995410 0.316800 1.356353 +v 0.996219 2.498438 -0.996219 +v 0.996219 2.498438 0.996219 +v 1.008058 2.494500 -1.008058 +v 1.008058 2.494500 1.008058 +v 1.017621 0.031200 0.529441 +v 1.017621 0.031200 -0.529441 +v 1.020503 1.929525 -1.390545 +v 1.020503 1.929525 1.390545 +v 1.021708 2.482687 -1.021708 +v 1.021708 2.482687 1.021708 +v 1.026181 0.084525 -1.026181 +v 1.026181 0.084525 1.026181 +v 1.031508 2.440800 0.757010 +v 1.031508 2.440800 -0.757010 +v 1.036316 2.463000 -1.036316 +v 1.036316 2.463000 1.036316 +v 1.039360 0.384375 -1.416240 +v 1.039360 0.384375 1.416240 +v 1.039419 0.046875 -0.762816 +v 1.039419 0.046875 0.762816 +v 1.044926 2.502600 -0.351008 +v 1.044926 2.502600 0.351008 +v 1.051031 2.435437 -1.051031 +v 1.051031 2.435437 1.051031 +v 1.051368 0.105600 -1.051368 +v 1.051368 0.105600 1.051368 +v 1.052064 2.400000 -0.772096 +v 1.052064 2.400000 0.772096 +v 1.059553 1.774800 -1.443756 +v 1.059553 1.774800 1.443756 +v 1.062497 0.127575 1.062497 +v 1.062497 0.127575 -1.062497 +v 1.065000 0.150000 -1.065000 +v 1.065000 0.150000 1.065000 +v 1.065000 2.400000 -1.065000 +v 1.065000 2.400000 1.065000 +v 1.072079 2.474400 -0.557774 +v 1.072079 2.474400 0.557774 +v 1.074940 0.177075 -1.074940 +v 1.074940 0.177075 1.074940 +v 1.083310 0.463200 -1.476127 +v 1.083310 0.463200 1.476127 +v 1.086029 2.502600 0.180521 +v 1.086029 2.502600 -0.180521 +v 1.086146 0.031200 0.364854 +v 1.086146 0.031200 -0.364854 +v 1.095040 1.621875 -1.492110 +v 1.095040 1.621875 1.492110 +v 1.100200 2.502600 -0.000000 +v 1.100200 2.502600 0.000000 +v 1.101920 0.213600 1.101920 +v 1.101920 0.213600 -1.101920 +v 1.117130 2.463000 -0.819847 +v 1.117130 2.463000 0.819847 +v 1.118073 2.242575 -1.118073 +v 1.118073 2.242575 1.118073 +v 1.118607 2.482687 -0.820931 +v 1.118607 2.482687 0.820931 +v 1.118749 0.064800 -0.821035 +v 1.118749 0.064800 0.821035 +v 1.121601 2.435437 -0.823129 +v 1.121601 2.435437 0.823129 +v 1.123697 0.553725 -1.531158 +v 1.123697 0.553725 1.531158 +v 1.125061 2.494500 -0.825668 +v 1.125061 2.494500 0.825668 +v 1.126072 1.471200 -1.534395 +v 1.126072 1.471200 1.534395 +v 1.128870 0.031200 -0.187642 +v 1.128870 0.031200 0.187642 +v 1.132992 2.400000 -0.831488 +v 1.132992 2.400000 0.831488 +v 1.134190 2.440800 0.590089 +v 1.134190 2.440800 -0.590089 +v 1.135521 2.498438 -0.833344 +v 1.135521 2.498438 0.833344 +v 1.141680 0.260025 1.141680 +v 1.141680 0.260025 -1.141680 +v 1.142888 0.046875 -0.594614 +v 1.142888 0.046875 0.594614 +v 1.143600 0.031200 0.000000 +v 1.143600 0.031200 0.000000 +v 1.144271 2.474400 -0.384379 +v 1.144271 2.474400 0.384379 +v 1.149016 2.494500 -0.843248 +v 1.149016 2.494500 0.843248 +v 1.151759 1.323225 -1.569396 +v 1.151759 1.323225 1.569396 +v 1.156792 2.400000 -0.601848 +v 1.156792 2.400000 0.601848 +v 1.156956 0.656400 -1.576477 +v 1.156956 0.656400 1.576477 +v 1.164574 2.482687 -0.854666 +v 1.164574 2.482687 0.854666 +v 1.169673 0.084525 -0.858407 +v 1.169673 0.084525 0.858407 +v 1.170080 2.085600 -1.170080 +v 1.170080 2.085600 1.170080 +v 1.171210 1.178400 -1.595900 +v 1.171210 1.178400 1.595900 +v 1.179525 0.771675 -1.607230 +v 1.179525 0.771675 1.607230 +v 1.181225 2.463000 -0.866886 +v 1.181225 2.463000 0.866886 +v 1.183534 1.037175 -1.612693 +v 1.183534 1.037175 1.612693 +v 1.187840 0.900000 -1.618560 +v 1.187840 0.900000 -1.618560 +v 1.187840 0.900000 1.618560 +v 1.187840 0.900000 1.618560 +v 1.189282 2.474400 -0.197684 +v 1.189282 2.474400 0.197684 +v 1.189960 0.316800 -1.189960 +v 1.189960 0.316800 1.189960 +v 1.197997 2.435437 -0.879195 +v 1.197997 2.435437 0.879195 +v 1.198382 0.105600 -0.879477 +v 1.198382 0.105600 0.879477 +v 1.204800 2.474400 0.000000 +v 1.204800 2.474400 -0.000000 +v 1.210564 2.440800 0.406648 +v 1.210564 2.440800 -0.406648 +v 1.211067 0.127575 0.888786 +v 1.211067 0.127575 -0.888786 +v 1.213920 0.150000 -0.890880 +v 1.213920 0.150000 -0.890880 +v 1.213920 0.150000 0.890880 +v 1.213920 0.150000 0.890880 +v 1.213920 2.400000 -0.890880 +v 1.213920 2.400000 0.890880 +v 1.219848 0.046875 -0.409767 +v 1.219848 0.046875 0.409767 +v 1.219958 1.929525 1.219958 +v 1.219958 1.929525 -1.219958 +v 1.225250 0.177075 0.899195 +v 1.225250 0.177075 -0.899195 +v 1.228335 2.463000 -0.639070 +v 1.228335 2.463000 0.639070 +v 1.229959 2.482687 -0.639915 +v 1.229959 2.482687 0.639915 +v 1.230115 0.064800 -0.639996 +v 1.230115 0.064800 0.639996 +v 1.233252 2.435437 -0.641628 +v 1.233252 2.435437 0.641628 +v 1.234688 2.400000 -0.414752 +v 1.234688 2.400000 0.414752 +v 1.237056 2.494500 -0.643607 +v 1.237056 2.494500 0.643607 +v 1.242500 0.384375 -1.242500 +v 1.242500 0.384375 1.242500 +v 1.245776 2.400000 -0.648144 +v 1.245776 2.400000 0.648144 +v 1.248557 2.498438 -0.649591 +v 1.248557 2.498438 0.649591 +v 1.256003 0.213600 0.921764 +v 1.256003 0.213600 -0.921764 +v 1.258183 2.440800 0.209136 +v 1.258183 2.440800 -0.209136 +v 1.263395 2.494500 -0.657311 +v 1.263395 2.494500 0.657311 +v 1.266640 1.774800 -1.266640 +v 1.266640 1.774800 1.266640 +v 1.267832 0.046875 -0.210740 +v 1.267832 0.046875 0.210740 +v 1.274414 2.242575 -0.935276 +v 1.274414 2.242575 0.935276 +v 1.274600 2.440800 0.000000 +v 1.274600 2.440800 0.000000 +v 1.280502 2.482687 -0.666211 +v 1.280502 2.482687 0.666211 +v 1.283256 2.400000 -0.213304 +v 1.283256 2.400000 0.213304 +v 1.284375 0.046875 0.000000 +v 1.284375 0.046875 -0.000000 +v 1.286108 0.084525 -0.669128 +v 1.286108 0.084525 0.669128 +v 1.295040 0.463200 -1.295040 +v 1.295040 0.463200 1.295040 +v 1.298810 2.463000 -0.675736 +v 1.298810 2.463000 0.675736 +v 1.300000 2.400000 0.000000 +v 1.300000 2.400000 -0.000000 +v 1.301322 0.260025 0.955023 +v 1.301322 0.260025 -0.955023 +v 1.309063 1.621875 -1.309063 +v 1.309063 1.621875 1.309063 +v 1.311049 2.463000 -0.440403 +v 1.311049 2.463000 0.440403 +v 1.312782 2.482687 -0.440985 +v 1.312782 2.482687 0.440985 +v 1.312948 0.064800 0.441041 +v 1.312948 0.064800 -0.441041 +v 1.316296 2.435437 -0.442166 +v 1.316296 2.435437 0.442166 +v 1.317252 2.435437 -0.685331 +v 1.317252 2.435437 0.685331 +v 1.317675 0.105600 -0.685551 +v 1.317675 0.105600 0.685551 +v 1.320356 2.494500 -0.443529 +v 1.320356 2.494500 0.443529 +v 1.329664 2.400000 -0.446656 +v 1.329664 2.400000 0.446656 +v 1.331623 0.127575 0.692808 +v 1.331623 0.127575 -0.692808 +v 1.332632 2.498438 -0.447653 +v 1.332632 2.498438 0.447653 +v 1.333693 2.085600 -0.978780 +v 1.333693 2.085600 0.978780 +v 1.334760 0.150000 0.694440 +v 1.334760 0.150000 -0.694440 +v 1.334760 0.150000 -0.694440 +v 1.334760 0.150000 0.694440 +v 1.334760 2.400000 -0.694440 +v 1.334760 2.400000 0.694440 +v 1.343320 0.553725 -1.343320 +v 1.343320 0.553725 1.343320 +v 1.346160 1.471200 -1.346160 +v 1.346160 1.471200 1.346160 +v 1.347218 0.177075 0.700921 +v 1.347218 0.177075 -0.700921 +v 1.348469 2.494500 -0.452973 +v 1.348469 2.494500 0.452973 +v 1.356353 0.316800 -0.995410 +v 1.356353 0.316800 0.995410 +v 1.362620 2.463000 -0.226496 +v 1.362620 2.463000 0.226496 +v 1.364422 2.482687 -0.226795 +v 1.364422 2.482687 0.226795 +v 1.364595 0.064800 -0.226824 +v 1.364595 0.064800 0.226824 +v 1.366728 2.482687 -0.459107 +v 1.366728 2.482687 0.459107 +v 1.368074 2.435437 -0.227403 +v 1.368074 2.435437 0.227403 +v 1.372294 2.494500 -0.228104 +v 1.372294 2.494500 0.228104 +v 1.372712 0.084525 -0.461116 +v 1.372712 0.084525 0.461116 +v 1.376867 1.323225 -1.376868 +v 1.376868 1.323225 1.376867 +v 1.380400 2.463000 0.000000 +v 1.380400 2.463000 -0.000000 +v 1.381032 0.213600 0.718514 +v 1.381032 0.213600 -0.718514 +v 1.381968 2.400000 -0.229712 +v 1.381968 2.400000 0.229712 +v 1.382225 2.482687 0.000000 +v 1.382225 2.482687 0.000000 +v 1.382400 0.064800 0.000000 +v 1.382400 0.064800 0.000000 +v 1.383080 0.656400 -1.383080 +v 1.383080 0.656400 1.383080 +v 1.385053 2.498438 -0.230225 +v 1.385053 2.498438 0.230225 +v 1.385925 2.435437 0.000000 +v 1.385925 2.435437 -0.000000 +v 1.386270 2.463000 -0.465671 +v 1.386270 2.463000 0.465671 +v 1.390200 2.494500 0.000000 +v 1.390200 2.494500 -0.000000 +v 1.390545 1.929525 -1.020503 +v 1.390545 1.929525 1.020503 +v 1.400000 2.400000 0.000000 +v 1.400000 2.400000 0.000000 +v 1.400120 1.178400 -1.400120 +v 1.400120 1.178400 1.400120 +v 1.401276 2.242575 -0.729046 +v 1.401276 2.242575 0.729046 +v 1.401513 2.494500 -0.232961 +v 1.401513 2.494500 0.232961 +v 1.403125 2.498438 0.000000 +v 1.403125 2.498438 0.000000 +v 1.405953 2.435437 -0.472283 +v 1.405953 2.435437 0.472283 +v 1.406405 0.105600 -0.472434 +v 1.406405 0.105600 0.472434 +v 1.410060 0.771675 -1.410060 +v 1.410060 0.771675 1.410060 +v 1.414853 1.037175 -1.414853 +v 1.414853 1.037175 1.414853 +v 1.416240 0.384375 -1.039360 +v 1.416240 0.384375 1.039360 +v 1.419800 2.494500 0.000000 +v 1.419800 2.494500 -0.000000 +v 1.420000 0.900000 -1.420000 +v 1.420000 0.900000 -1.420000 +v 1.420000 0.900000 1.420000 +v 1.420000 0.900000 1.420000 +v 1.420490 2.482687 -0.236115 +v 1.420490 2.482687 0.236115 +v 1.421292 0.127575 0.477435 +v 1.421292 0.127575 -0.477435 +v 1.424640 0.150000 -0.478560 +v 1.424640 0.150000 -0.478560 +v 1.424640 0.150000 0.478560 +v 1.424640 0.150000 0.478560 +v 1.424640 2.400000 -0.478560 +v 1.424640 2.400000 0.478560 +v 1.426709 0.084525 -0.237149 +v 1.426709 0.084525 0.237149 +v 1.430863 0.260025 0.744440 +v 1.430863 0.260025 -0.744440 +v 1.437937 0.177075 0.483027 +v 1.437937 0.177075 -0.483027 +v 1.439025 2.482687 0.000000 +v 1.440800 2.463000 -0.239491 +v 1.440800 2.463000 0.239491 +v 1.443756 1.774800 -1.059553 +v 1.443756 1.774800 1.059553 +v 1.445325 0.084525 0.000000 +v 1.445325 0.084525 0.000000 +v 1.459600 2.463000 0.000000 +v 1.459600 2.463000 -0.000000 +v 1.461258 2.435437 -0.242892 +v 1.461258 2.435437 0.242892 +v 1.461727 0.105600 -0.242970 +v 1.461727 0.105600 0.242970 +v 1.466456 2.085600 -0.762958 +v 1.466456 2.085600 0.762958 +v 1.474028 0.213600 0.495150 +v 1.474028 0.213600 -0.495150 +v 1.476127 0.463200 -1.083310 +v 1.476127 0.463200 1.083310 +v 1.477200 0.127575 0.245542 +v 1.477200 0.127575 -0.245542 +v 1.480325 2.435437 0.000000 +v 1.480325 2.435437 -0.000000 +v 1.480680 0.150000 -0.246120 +v 1.480680 0.150000 0.246120 +v 1.480680 0.150000 0.246120 +v 1.480680 0.150000 -0.246120 +v 1.480680 2.400000 -0.246120 +v 1.480680 2.400000 0.246120 +v 1.480800 0.105600 0.000000 +v 1.480800 0.105600 0.000000 +v 1.491372 0.316800 -0.775921 +v 1.491372 0.316800 0.775921 +v 1.492110 1.621875 -1.095040 +v 1.492110 1.621875 1.095040 +v 1.494500 0.177075 0.248417 +v 1.494500 0.177075 -0.248417 +v 1.495635 2.242575 -0.502408 +v 1.495635 2.242575 0.502408 +v 1.496475 0.127575 0.000000 +v 1.496475 0.127575 0.000000 +v 1.500000 0.150000 0.000000 +v 1.500000 0.150000 0.000000 +v 1.500000 2.400000 0.000000 +v 1.500000 2.400000 0.000000 +v 1.514000 0.177075 -0.000000 +v 1.514000 0.177075 0.000000 +v 1.527214 0.260025 -0.513016 +v 1.527214 0.260025 0.513016 +v 1.528968 1.929525 -0.795481 +v 1.528968 1.929525 0.795481 +v 1.531158 0.553725 -1.123697 +v 1.531158 0.553725 1.123697 +v 1.532010 0.213600 0.254652 +v 1.532010 0.213600 -0.254652 +v 1.534395 1.471200 -1.126072 +v 1.534395 1.471200 1.126072 +v 1.552000 0.213600 0.000000 +v 1.552000 0.213600 0.000000 +v 1.554467 2.242575 -0.258385 +v 1.554467 2.242575 0.258385 +v 1.557220 0.384375 -0.810180 +v 1.557220 0.384375 0.810180 +v 1.565204 2.085600 -0.525778 +v 1.565204 2.085600 0.525778 +v 1.569396 1.323225 -1.151759 +v 1.569396 1.323225 1.151759 +v 1.574750 2.242575 0.000000 +v 1.574750 2.242575 0.000000 +v 1.576477 0.656400 -1.156956 +v 1.576477 0.656400 1.156956 +v 1.587289 0.260025 0.263841 +v 1.587289 0.260025 -0.263841 +v 1.587475 1.774800 -0.825921 +v 1.587475 1.774800 0.825921 +v 1.591798 0.316800 -0.534711 +v 1.591798 0.316800 0.534711 +v 1.595900 1.178400 -1.171210 +v 1.595900 1.178400 1.171210 +v 1.607230 0.771675 -1.179525 +v 1.607230 0.771675 1.179525 +v 1.608000 0.260025 0.000000 +v 1.608000 0.260025 0.000000 +v 1.612693 1.037175 -1.183534 +v 1.612693 1.037175 1.183534 +v 1.618560 0.900000 -1.187840 +v 1.618560 0.900000 -1.187840 +v 1.618560 0.900000 1.187840 +v 1.618560 0.900000 1.187840 +v 1.623068 0.463200 -0.844439 +v 1.623068 0.463200 0.844439 +v 1.626774 2.085600 -0.270404 +v 1.626774 2.085600 0.270404 +v 1.631925 1.929525 -0.548190 +v 1.631925 1.929525 0.548190 +v 1.640643 1.621875 -0.853583 +v 1.640643 1.621875 0.853583 +v 1.648000 2.085600 0.000000 +v 1.648000 2.085600 -0.000000 +v 1.654413 0.316800 -0.274998 +v 1.654413 0.316800 0.274998 +v 1.662080 0.384375 -0.558320 +v 1.662080 0.384375 0.558320 +v 1.676000 0.316800 0.000000 +v 1.676000 0.316800 0.000000 +v 1.683577 0.553725 -0.875920 +v 1.683577 0.553725 0.875920 +v 1.687137 1.471200 -0.877772 +v 1.687137 1.471200 0.877772 +v 1.694372 1.774800 -0.569167 +v 1.694372 1.774800 0.569167 +v 1.696119 1.929525 -0.281930 +v 1.696119 1.929525 0.281930 +v 1.700000 0.600000 0.000000 +v 1.700000 0.600000 0.000000 +v 1.700000 0.623100 0.178200 +v 1.700000 0.623100 -0.178200 +v 1.700000 0.685800 -0.316800 +v 1.700000 0.685800 0.316800 +v 1.700000 0.778200 0.415800 +v 1.700000 0.778200 -0.415800 +v 1.700000 0.890400 -0.475200 +v 1.700000 0.890400 0.475200 +v 1.700000 1.012500 -0.495000 +v 1.700000 1.012500 0.495000 +v 1.700000 1.134600 -0.475200 +v 1.700000 1.134600 0.475200 +v 1.700000 1.246800 0.415800 +v 1.700000 1.246800 -0.415800 +v 1.700000 1.339200 -0.316800 +v 1.700000 1.339200 0.316800 +v 1.700000 1.401900 0.178200 +v 1.700000 1.401900 -0.178200 +v 1.700000 1.425000 0.000000 +v 1.700000 1.425000 0.000000 +v 1.718250 1.929525 0.000000 +v 1.718250 1.929525 0.000000 +v 1.725622 1.323225 -0.897795 +v 1.725622 1.323225 0.897795 +v 1.727460 0.384375 -0.287140 +v 1.727460 0.384375 0.287140 +v 1.732362 0.463200 -0.581929 +v 1.732362 0.463200 0.581929 +v 1.733408 0.656400 -0.901846 +v 1.733408 0.656400 0.901846 +v 1.750000 0.384375 0.000000 +v 1.750000 0.384375 0.000000 +v 1.751120 1.621875 -0.588230 +v 1.751120 1.621875 0.588230 +v 1.754764 1.178400 -0.912957 +v 1.754764 1.178400 0.912957 +v 1.761022 1.774800 -0.292719 +v 1.761022 1.774800 0.292719 +v 1.767222 0.771675 -0.919439 +v 1.767222 0.771675 0.919439 +v 1.773229 1.037175 -0.922564 +v 1.773229 1.037175 0.922564 +v 1.779680 0.900000 -0.925920 +v 1.779680 0.900000 -0.925920 +v 1.779680 0.900000 0.925920 +v 1.779680 0.900000 0.925920 +v 1.784000 1.774800 0.000000 +v 1.784000 1.774800 0.000000 +v 1.796946 0.553725 -0.603624 +v 1.796946 0.553725 0.603624 +v 1.800507 0.463200 -0.299282 +v 1.800507 0.463200 0.299282 +v 1.800745 1.471200 -0.604900 +v 1.800745 1.471200 0.604900 +v 1.820003 1.621875 -0.302523 +v 1.820003 1.621875 0.302522 +v 1.824000 0.463200 0.000000 +v 1.824000 0.463200 0.000000 +v 1.841822 1.323225 -0.618698 +v 1.841822 1.323225 0.618698 +v 1.843750 1.621875 0.000000 +v 1.843750 1.621875 -0.000000 +v 1.850132 0.656400 -0.621490 +v 1.850132 0.656400 0.621490 +v 1.867631 0.553725 -0.310439 +v 1.867631 0.553725 0.310439 +v 1.871580 1.471200 -0.311096 +v 1.871580 1.471200 0.311096 +v 1.872927 1.178400 -0.629147 +v 1.872927 1.178400 0.629147 +v 1.886223 0.771675 -0.633613 +v 1.886223 0.771675 0.633613 +v 1.892000 0.553725 0.000000 +v 1.892000 0.553725 -0.000000 +v 1.892634 1.037175 -0.635767 +v 1.892634 1.037175 0.635767 +v 1.896000 1.471200 0.000000 +v 1.896000 1.471200 0.000000 +v 1.899520 0.900000 -0.638080 +v 1.899520 0.900000 -0.638080 +v 1.899520 0.900000 0.638080 +v 1.899520 0.900000 0.638080 +v 1.914272 1.323225 -0.318192 +v 1.914272 1.323225 0.318192 +v 1.922910 0.656400 -0.319628 +v 1.922910 0.656400 0.319628 +v 1.935900 1.444200 0.000000 +v 1.935900 1.444200 0.000000 +v 1.939250 1.323225 0.000000 +v 1.939250 1.323225 -0.000000 +v 1.939394 1.423221 -0.175100 +v 1.939394 1.423221 0.175100 +v 1.946601 1.178400 -0.323566 +v 1.946601 1.178400 0.323566 +v 1.948000 0.656400 0.000000 +v 1.948000 0.656400 -0.000000 +v 1.948879 1.366278 -0.311290 +v 1.948879 1.366278 0.311290 +v 1.960420 0.771675 -0.325863 +v 1.960420 0.771675 0.325863 +v 1.962857 1.282362 -0.408568 +v 1.962857 1.282362 0.408568 +v 1.967083 1.037175 -0.326970 +v 1.967083 1.037175 0.326970 +v 1.972000 1.178400 0.000000 +v 1.972000 1.178400 0.000000 +v 1.974240 0.900000 -0.328160 +v 1.974240 0.900000 0.328160 +v 1.974240 0.900000 0.328160 +v 1.979830 1.180464 -0.466934 +v 1.979830 1.180464 0.466934 +v 1.986000 0.771675 0.000000 +v 1.986000 0.771675 -0.000000 +v 1.992750 1.037175 0.000000 +v 1.992750 1.037175 0.000000 +v 1.998300 1.069575 -0.486390 +v 1.998300 1.069575 0.486390 +v 2.000000 0.900000 0.000000 +v 2.000000 0.900000 0.000000 +v 2.016770 0.958686 -0.466934 +v 2.016770 0.958686 0.466934 +v 2.033743 0.856788 -0.408568 +v 2.033743 0.856788 0.408568 +v 2.047721 0.772872 0.311290 +v 2.047721 0.772872 -0.311290 +v 2.057206 0.715929 0.175100 +v 2.057206 0.715929 -0.175100 +v 2.060700 0.694950 0.000000 +v 2.060700 0.694950 0.000000 +v 2.111200 1.497600 0.000000 +v 2.111200 1.497600 0.000000 +v 2.116979 1.479120 -0.166687 +v 2.116979 1.479120 0.166687 +v 2.132666 1.428960 -0.296333 +v 2.132666 1.428960 0.296333 +v 2.155782 1.355040 -0.388937 +v 2.155782 1.355040 0.388937 +v 2.183853 1.265280 -0.444499 +v 2.183853 1.265280 0.444499 +v 2.214400 1.167600 -0.463020 +v 2.214400 1.167600 0.463020 +v 2.237300 1.578900 0.000000 +v 2.237300 1.578900 0.000000 +v 2.244457 1.563171 -0.154289 +v 2.244457 1.563171 0.154289 +v 2.244947 1.069920 -0.444499 +v 2.244947 1.069920 0.444499 +v 2.263882 1.520478 -0.274291 +v 2.263882 1.520478 0.274291 +v 2.273018 0.980160 -0.388937 +v 2.273018 0.980160 0.388937 +v 2.292510 1.457562 -0.360007 +v 2.292510 1.457562 0.360007 +v 2.296134 0.906240 -0.296333 +v 2.296134 0.906240 0.296333 +v 2.311821 0.856080 -0.166687 +v 2.311821 0.856080 0.166687 +v 2.317600 0.837600 0.000000 +v 2.317600 0.837600 0.000000 +v 2.325600 1.681800 0.000000 +v 2.325600 1.681800 0.000000 +v 2.327271 1.381164 -0.411437 +v 2.327271 1.381164 0.411437 +v 2.333530 1.668948 -0.139234 +v 2.333530 1.668948 0.139234 +v 2.355053 1.634064 -0.247526 +v 2.355053 1.634064 0.247526 +v 2.365100 1.298025 -0.428580 +v 2.365100 1.298025 0.428580 +v 2.386771 1.582656 -0.324878 +v 2.386771 1.582656 0.324878 +v 2.387500 1.800000 0.000000 +v 2.387500 1.800000 0.000000 +v 2.395900 1.790025 0.122850 +v 2.395900 1.790025 -0.122850 +v 2.402929 1.214886 -0.411437 +v 2.402929 1.214886 0.411437 +v 2.418700 1.762950 -0.218400 +v 2.418700 1.762950 0.218400 +v 2.425286 1.520232 -0.371290 +v 2.425286 1.520232 0.371290 +v 2.434400 1.927200 0.000000 +v 2.434400 1.927200 0.000000 +v 2.437690 1.138488 -0.360007 +v 2.437690 1.138488 0.360007 +v 2.443270 1.919976 0.106466 +v 2.443270 1.919976 -0.106466 +v 2.452300 1.723050 -0.286650 +v 2.452300 1.723050 0.286650 +v 2.466318 1.075572 -0.274291 +v 2.466318 1.075572 0.274291 +v 2.467200 1.452300 -0.386760 +v 2.467200 1.452300 0.386760 +v 2.467347 1.900368 0.189274 +v 2.467347 1.900368 -0.189274 +v 2.477700 2.057100 0.000000 +v 2.477700 2.057100 0.000000 +v 2.485743 1.032879 -0.154289 +v 2.485743 1.032879 0.154289 +v 2.487343 2.052375 -0.091411 +v 2.487343 2.052375 0.091411 +v 2.492900 1.017150 0.000000 +v 2.492900 1.017150 0.000000 +v 2.493100 1.674600 -0.327600 +v 2.493100 1.674600 0.327600 +v 2.502829 1.871472 0.248422 +v 2.502829 1.871472 -0.248422 +v 2.509114 1.384368 -0.371290 +v 2.509114 1.384368 0.371290 +v 2.513518 2.039550 0.162509 +v 2.513518 2.039550 -0.162509 +v 2.528800 2.183400 0.000000 +v 2.537500 1.621875 -0.341250 +v 2.537500 1.621875 0.341250 +v 2.539821 2.180796 -0.079013 +v 2.539821 2.180796 0.079013 +v 2.545914 1.836384 -0.283910 +v 2.545914 1.836384 0.283910 +v 2.547629 1.321944 -0.324878 +v 2.547629 1.321944 0.324878 +v 2.552090 2.020650 -0.213293 +v 2.552090 2.020650 0.213293 +v 2.569734 2.173728 -0.140467 +v 2.569734 2.173728 0.140467 +v 2.579347 1.270536 -0.247526 +v 2.579347 1.270536 0.247526 +v 2.581900 1.569150 -0.327600 +v 2.581900 1.569150 0.327600 +v 2.592800 1.798200 -0.295740 +v 2.592800 1.798200 0.295740 +v 2.598929 1.997700 -0.243763 +v 2.598929 1.997700 0.243763 +v 2.599100 2.299800 0.000000 +v 2.599100 2.299800 0.000000 +v 2.600870 1.235652 -0.139234 +v 2.600870 1.235652 0.139234 +v 2.608800 1.222800 0.000000 +v 2.608800 1.222800 0.000000 +v 2.612406 2.298813 0.070600 +v 2.612406 2.298813 -0.070600 +v 2.613818 2.163312 -0.184363 +v 2.613818 2.163312 0.184363 +v 2.622700 1.520700 -0.286650 +v 2.622700 1.520700 0.286650 +v 2.639686 1.760016 -0.283910 +v 2.639686 1.760016 0.283910 +v 2.648521 2.296134 0.125510 +v 2.648521 2.296134 -0.125510 +v 2.649900 1.972725 0.253920 +v 2.649900 1.972725 -0.253920 +v 2.656300 1.480800 -0.218400 +v 2.656300 1.480800 0.218400 +v 2.667347 2.150664 -0.210701 +v 2.667347 2.150664 0.210701 +v 2.679100 1.453725 0.122850 +v 2.679100 1.453725 -0.122850 +v 2.682771 1.724928 0.248422 +v 2.682771 1.724928 -0.248422 +v 2.687500 1.443750 0.000000 +v 2.687500 1.443750 0.000000 +v 2.700000 2.400000 0.000000 +v 2.700000 2.400000 0.000000 +v 2.700000 2.400000 0.000000 +v 2.700871 1.947750 -0.243763 +v 2.700871 1.947750 0.243763 +v 2.701743 2.292186 0.164732 +v 2.701743 2.292186 -0.164732 +v 2.716800 2.400000 0.067500 +v 2.716800 2.400000 -0.067500 +v 2.716800 2.400000 -0.067500 +v 2.716800 2.400000 0.067500 +v 2.718253 1.696032 0.189274 +v 2.718253 1.696032 -0.189274 +v 2.725600 2.136900 -0.219480 +v 2.725600 2.136900 0.219480 +v 2.729800 2.420250 0.000000 +v 2.742330 1.676424 0.106466 +v 2.742330 1.676424 -0.106466 +v 2.747407 2.420406 -0.066744 +v 2.747407 2.420406 0.066744 +v 2.747710 1.924800 -0.213293 +v 2.747710 1.924800 0.213293 +v 2.751200 1.669200 0.000000 +v 2.751200 1.669200 0.000000 +v 2.758400 2.436000 0.000000 +v 2.762400 2.400000 0.120000 +v 2.762400 2.400000 -0.120000 +v 2.762400 2.400000 -0.120000 +v 2.762400 2.400000 0.120000 +v 2.766370 2.287392 0.188266 +v 2.766370 2.287392 -0.188266 +v 2.776365 2.436302 -0.064692 +v 2.776365 2.436302 0.064692 +v 2.783853 2.123136 -0.210701 +v 2.783853 2.123136 0.210701 +v 2.784600 2.447250 0.000000 +v 2.784600 2.447250 0.000000 +v 2.786282 1.905900 0.162509 +v 2.786282 1.905900 -0.162509 +v 2.795198 2.420829 -0.118656 +v 2.795198 2.420829 0.118656 +v 2.800000 2.400000 0.000000 +v 2.802528 2.447680 -0.061668 +v 2.802528 2.447680 0.061668 +v 2.807200 2.454000 0.000000 +v 2.811200 2.400000 -0.040500 +v 2.811200 2.400000 0.040500 +v 2.812457 1.893075 0.091411 +v 2.812457 1.893075 -0.091411 +v 2.822100 1.888350 0.000000 +v 2.822100 1.888350 0.000000 +v 2.824200 2.420250 0.000000 +v 2.824200 2.420250 0.000000 +v 2.824750 2.454529 -0.057996 +v 2.824750 2.454529 0.057996 +v 2.825000 2.456250 0.000000 +v 2.825000 2.456250 0.000000 +v 2.825126 2.437123 -0.115008 +v 2.825126 2.437123 0.115008 +v 2.829600 2.400000 0.157500 +v 2.829600 2.400000 -0.157500 +v 2.829600 2.400000 -0.157500 +v 2.829600 2.400000 0.157500 +v 2.836672 2.420519 -0.041256 +v 2.836672 2.420519 0.041256 +v 2.836700 2.282175 0.196110 +v 2.836700 2.282175 -0.196110 +v 2.836800 2.454000 0.000000 +v 2.836800 2.454000 0.000000 +v 2.837382 2.110488 -0.184363 +v 2.837382 2.110488 0.184363 +v 2.837600 2.436000 0.000000 +v 2.837600 2.436000 0.000000 +v 2.841400 2.447250 0.000000 +v 2.841400 2.447250 0.000000 +v 2.841600 2.400000 -0.072000 +v 2.841600 2.400000 0.072000 +v 2.841887 2.456841 -0.054000 +v 2.841887 2.456841 0.054000 +v 2.851189 2.448847 -0.109632 +v 2.851189 2.448847 0.109632 +v 2.851331 2.436454 -0.043308 +v 2.851331 2.436454 0.043308 +v 2.852794 2.454605 -0.050004 +v 2.852794 2.454605 0.050004 +v 2.856323 2.447812 -0.046332 +v 2.856323 2.447812 0.046332 +v 2.865626 2.421453 -0.155736 +v 2.865626 2.421453 0.155736 +v 2.870524 2.421250 -0.073344 +v 2.870524 2.421250 0.073344 +v 2.872387 2.455966 -0.103104 +v 2.872387 2.455966 0.103104 +v 2.881466 2.100072 -0.140467 +v 2.881466 2.100072 0.140467 +v 2.886400 2.400000 -0.094500 +v 2.886400 2.400000 0.094500 +v 2.887725 2.458444 -0.096000 +v 2.887725 2.458444 0.096000 +v 2.888602 2.437685 -0.076992 +v 2.888602 2.437685 0.076992 +v 2.896205 2.456246 0.088896 +v 2.896205 2.456246 -0.088896 +v 2.896829 2.449338 -0.082368 +v 2.896829 2.449338 0.082368 +v 2.896986 2.438333 -0.150948 +v 2.896986 2.438333 0.150948 +v 2.907030 2.276958 0.188266 +v 2.907030 2.276958 -0.188266 +v 2.911200 2.400000 -0.180000 +v 2.911200 2.400000 -0.180000 +v 2.911200 2.400000 0.180000 +v 2.911379 2.093004 -0.079013 +v 2.911379 2.093004 0.079013 +v 2.920412 2.422328 -0.096264 +v 2.920412 2.422328 0.096264 +v 2.922400 2.090400 0.000000 +v 2.922899 2.450567 -0.143892 +v 2.922899 2.450567 0.143892 +v 2.940800 2.400000 -0.108000 +v 2.940800 2.400000 0.108000 +v 2.942589 2.458082 -0.135324 +v 2.942589 2.458082 0.135324 +v 2.943526 2.439499 -0.101052 +v 2.943526 2.439499 0.101052 +v 2.951146 2.422210 -0.177984 +v 2.951146 2.422210 0.177984 +v 2.955275 2.460806 -0.126000 +v 2.955275 2.460806 0.126000 +v 2.956523 2.451588 -0.108108 +v 2.956523 2.451588 0.108108 +v 2.960179 2.458666 -0.116676 +v 2.960179 2.458666 0.116676 +v 2.971657 2.272164 0.164732 +v 2.971657 2.272164 -0.164732 +v 2.980990 2.423636 0.110016 +v 2.980990 2.423636 -0.110016 +v 2.984243 2.439802 -0.172512 +v 2.984243 2.439802 0.172512 +v 3.000000 2.400000 -0.187500 +v 3.000000 2.400000 -0.187500 +v 3.000000 2.400000 -0.112500 +v 3.000000 2.400000 0.112500 +v 3.000000 2.400000 0.187500 +v 3.009977 2.452655 -0.164448 +v 3.009977 2.452655 0.164448 +v 3.010221 2.441702 -0.115488 +v 3.010221 2.441702 0.115488 +v 3.024879 2.268216 0.125510 +v 3.024879 2.268216 -0.125510 +v 3.027834 2.460653 -0.154656 +v 3.027834 2.460653 0.154656 +v 3.029007 2.454319 -0.123552 +v 3.029007 2.454319 0.123552 +v 3.037300 2.463675 -0.144000 +v 3.037300 2.463675 0.144000 +v 3.037862 2.461603 0.133344 +v 3.037862 2.461603 -0.133344 +v 3.044212 2.423034 -0.185400 +v 3.044212 2.423034 0.185400 +v 3.046912 2.425059 0.114600 +v 3.046912 2.425059 -0.114600 +v 3.059200 2.400000 -0.108000 +v 3.059200 2.400000 0.108000 +v 3.060994 2.265537 0.070600 +v 3.060994 2.265537 -0.070600 +v 3.074300 2.264550 0.000000 +v 3.074300 2.264550 0.000000 +v 3.079200 2.441400 -0.179700 +v 3.079200 2.441400 0.179700 +v 3.082800 2.444100 -0.120300 +v 3.082800 2.444100 0.120300 +v 3.088800 2.400000 -0.180000 +v 3.088800 2.400000 -0.180000 +v 3.088800 2.400000 0.180000 +v 3.104737 2.454928 -0.171300 +v 3.104738 2.454928 0.171300 +v 3.107887 2.457291 -0.128700 +v 3.107887 2.457291 0.128700 +v 3.112835 2.426483 0.110016 +v 3.112835 2.426483 -0.110016 +v 3.113600 2.400000 -0.094500 +v 3.113600 2.400000 0.094500 +v 3.120600 2.463450 0.161100 +v 3.120600 2.463450 -0.161100 +v 3.122400 2.464800 0.138900 +v 3.122400 2.464800 -0.138900 +v 3.126562 2.466797 -0.150000 +v 3.126562 2.466797 0.150000 +v 3.137279 2.423859 -0.177984 +v 3.137279 2.423859 0.177984 +v 3.155379 2.446498 -0.115488 +v 3.155379 2.446498 0.115488 +v 3.158400 2.400000 -0.072000 +v 3.158400 2.400000 0.072000 +v 3.170400 2.400000 -0.157500 +v 3.170400 2.400000 0.157500 +v 3.170400 2.400000 -0.157500 +v 3.173413 2.427791 -0.096264 +v 3.173413 2.427791 0.096264 +v 3.174157 2.442998 -0.172512 +v 3.174157 2.442998 0.172512 +v 3.186768 2.460263 -0.123552 +v 3.186768 2.460263 0.123552 +v 3.188800 2.400000 -0.040500 +v 3.188800 2.400000 0.040500 +v 3.199498 2.457201 -0.164448 +v 3.199498 2.457201 0.164448 +v 3.200000 2.400000 0.000000 +v 3.206938 2.467997 0.133344 +v 3.206938 2.467997 -0.133344 +v 3.213366 2.466247 -0.154656 +v 3.213366 2.466247 0.154656 +v 3.215825 2.469919 -0.144000 +v 3.215825 2.469919 0.144000 +v 3.222074 2.448701 -0.101052 +v 3.222074 2.448701 0.101052 +v 3.222799 2.424616 -0.155736 +v 3.222799 2.424616 0.155736 +v 3.223301 2.428868 -0.073344 +v 3.223301 2.428868 0.073344 +v 3.237600 2.400000 -0.120000 +v 3.237600 2.400000 0.120000 +v 3.237600 2.400000 -0.120000 +v 3.257153 2.429599 -0.041256 +v 3.257153 2.429599 0.041256 +v 3.259252 2.462994 -0.108108 +v 3.259252 2.462994 0.108108 +v 3.261414 2.444467 -0.150948 +v 3.261414 2.444467 0.150948 +v 3.269625 2.429869 0.000000 +v 3.269625 2.429869 0.000000 +v 3.276998 2.450515 -0.076992 +v 3.276998 2.450515 0.076992 +v 3.283200 2.400000 -0.067500 +v 3.283200 2.400000 0.067500 +v 3.283200 2.400000 -0.067500 +v 3.284621 2.470934 -0.116676 +v 3.284621 2.470934 0.116676 +v 3.286576 2.459289 -0.143892 +v 3.286576 2.459289 0.143892 +v 3.293227 2.425240 -0.118656 +v 3.293227 2.425240 0.118656 +v 3.297850 2.472787 -0.126000 +v 3.297850 2.472788 0.126000 +v 3.298611 2.468818 -0.135324 +v 3.298611 2.468818 0.135324 +v 3.300000 2.400000 0.000000 +v 3.300000 2.400000 0.000000 +v 3.314269 2.451746 -0.043308 +v 3.314269 2.451746 0.043308 +v 3.318946 2.465243 -0.082368 +v 3.318946 2.465243 0.082368 +v 3.328000 2.452200 0.000000 +v 3.328000 2.452200 0.000000 +v 3.333274 2.445677 -0.115008 +v 3.333274 2.445677 0.115008 +v 3.341018 2.425663 -0.066744 +v 3.341018 2.425663 0.066744 +v 3.348595 2.473354 0.088896 +v 3.348595 2.473354 -0.088896 +v 3.358286 2.461009 -0.109632 +v 3.358286 2.461009 0.109632 +v 3.358625 2.425819 0.000000 +v 3.359452 2.466769 -0.046332 +v 3.359452 2.466769 0.046332 +v 3.365400 2.475150 -0.096000 +v 3.365400 2.475150 0.096000 +v 3.368813 2.470934 -0.103104 +v 3.368813 2.470934 0.103104 +v 3.374375 2.467331 0.000000 +v 3.374375 2.467331 0.000000 +v 3.382035 2.446498 -0.064692 +v 3.382035 2.446498 0.064692 +v 3.392006 2.474995 -0.050004 +v 3.392006 2.474995 0.050004 +v 3.400000 2.446800 0.000000 +v 3.406947 2.462176 -0.061668 +v 3.406947 2.462176 0.061668 +v 3.408000 2.475600 0.000000 +v 3.408000 2.475600 0.000000 +v 3.411237 2.476753 -0.054000 +v 3.411237 2.476753 0.054000 +v 3.416450 2.472371 -0.057996 +v 3.416450 2.472371 0.057996 +v 3.424875 2.462606 0.000000 +v 3.428125 2.477344 0.000000 +v 3.428125 2.477344 0.000000 +v 3.434000 2.472900 0.000000 + +f 2909 2921 2939 +f 2939 2931 2909 +f 2869 2877 2921 +f 2921 2909 2869 +f 2819 2827 2877 +f 2877 2869 2819 +f 2737 2747 2827 +f 2827 2819 2737 +f 2669 2673 2747 +f 2747 2737 2669 +f 2567 2575 2673 +f 2673 2669 2567 +f 2476 2480 2575 +f 2575 2567 2476 +f 2358 2362 2480 +f 2480 2476 2358 +f 2158 2162 2362 +f 2362 2358 2158 +f 1715 1812 2162 +f 2162 2158 1715 +f 2901 2909 2931 +f 2931 2917 2901 +f 2863 2869 2909 +f 2909 2901 2863 +f 2813 2819 2869 +f 2869 2863 2813 +f 2729 2737 2819 +f 2819 2813 2729 +f 2663 2669 2737 +f 2737 2729 2663 +f 2561 2567 2669 +f 2669 2663 2561 +f 2468 2476 2567 +f 2567 2561 2468 +f 2350 2358 2476 +f 2476 2468 2350 +f 2152 2158 2358 +f 2358 2350 2152 +f 1717 1715 2158 +f 2158 2152 1717 +f 2903 2901 2917 +f 2917 2923 2903 +f 2865 2863 2901 +f 2901 2903 2865 +f 2815 2813 2863 +f 2863 2865 2815 +f 2733 2729 2813 +f 2813 2815 2733 +f 2665 2663 2729 +f 2729 2733 2665 +f 2564 2561 2663 +f 2663 2665 2564 +f 2473 2468 2561 +f 2561 2564 2473 +f 2354 2350 2468 +f 2468 2473 2354 +f 2155 2152 2350 +f 2350 2354 2155 +f 1927 1717 2152 +f 2152 2155 1927 +f 2911 2903 2923 +f 2923 2935 2911 +f 2875 2865 2903 +f 2903 2911 2875 +f 2823 2815 2865 +f 2865 2875 2823 +f 2741 2733 2815 +f 2815 2823 2741 +f 2671 2665 2733 +f 2733 2741 2671 +f 2571 2564 2665 +f 2665 2671 2571 +f 2478 2473 2564 +f 2564 2571 2478 +f 2360 2354 2473 +f 2473 2478 2360 +f 2160 2155 2354 +f 2354 2360 2160 +f 1718 1927 2155 +f 2155 2160 1718 +f 2929 2911 2935 +f 2935 2947 2929 +f 2881 2875 2911 +f 2911 2929 2881 +f 2829 2823 2875 +f 2875 2881 2829 +f 2751 2741 2823 +f 2823 2829 2751 +f 2677 2671 2741 +f 2741 2751 2677 +f 2577 2571 2671 +f 2671 2677 2577 +f 2482 2478 2571 +f 2571 2577 2482 +f 2364 2360 2478 +f 2478 2482 2364 +f 2164 2160 2360 +f 2360 2364 2164 +f 1842 1718 2160 +f 2160 2164 1842 +f 2945 2929 2947 +f 2947 2959 2945 +f 2897 2881 2929 +f 2929 2945 2897 +f 2835 2829 2881 +f 2881 2897 2835 +f 2761 2751 2829 +f 2829 2835 2761 +f 2679 2677 2751 +f 2751 2761 2679 +f 2579 2577 2677 +f 2677 2679 2579 +f 2486 2482 2577 +f 2577 2579 2486 +f 2368 2364 2482 +f 2482 2486 2368 +f 2172 2164 2364 +f 2364 2368 2172 +f 1725 1842 2164 +f 2164 2172 1725 +f 2965 2945 2959 +f 2959 2981 2965 +f 2907 2897 2945 +f 2945 2965 2907 +f 2845 2835 2897 +f 2897 2907 2845 +f 2769 2761 2835 +f 2835 2845 2769 +f 2685 2679 2761 +f 2761 2769 2685 +f 2587 2579 2679 +f 2679 2685 2587 +f 2491 2486 2579 +f 2579 2587 2491 +f 2370 2368 2486 +f 2486 2491 2370 +f 2174 2172 2368 +f 2368 2370 2174 +f 1834 1725 2172 +f 2172 2174 1834 +f 2982 2965 2981 +f 2981 2988 2982 +f 2933 2907 2965 +f 2965 2982 2933 +f 2855 2845 2907 +f 2907 2933 2855 +f 2779 2769 2845 +f 2845 2855 2779 +f 2691 2685 2769 +f 2769 2779 2691 +f 2595 2587 2685 +f 2685 2691 2595 +f 2500 2491 2587 +f 2587 2595 2500 +f 2374 2370 2491 +f 2491 2500 2374 +f 2178 2174 2370 +f 2370 2374 2178 +f 1716 1834 2174 +f 2174 2178 1716 +f 2990 2982 2988 +f 2988 3002 2990 +f 2949 2933 2982 +f 2982 2990 2949 +f 2871 2855 2933 +f 2933 2949 2871 +f 2791 2779 2855 +f 2855 2871 2791 +f 2699 2691 2779 +f 2779 2791 2699 +f 2601 2595 2691 +f 2691 2699 2601 +f 2506 2500 2595 +f 2595 2601 2506 +f 2378 2374 2500 +f 2500 2506 2378 +f 2180 2178 2374 +f 2374 2378 2180 +f 1714 1716 2178 +f 2178 2180 1714 +f 3008 2990 3002 +f 3002 3024 3008 +f 2973 2949 2990 +f 2990 3008 2973 +f 2889 2871 2949 +f 2949 2973 2889 +f 2805 2791 2871 +f 2871 2889 2805 +f 2711 2699 2791 +f 2791 2805 2711 +f 2611 2601 2699 +f 2699 2711 2611 +f 2521 2506 2601 +f 2601 2611 2521 +f 2387 2378 2506 +f 2506 2521 2387 +f 2191 2180 2378 +f 2378 2387 2191 +f 1810 1714 2180 +f 2180 2191 1810 +f 1464 1460 1813 +f 1813 1821 1464 +f 1264 1260 1460 +f 1460 1464 1264 +f 1146 1142 1260 +f 1260 1264 1146 +f 1055 1047 1142 +f 1142 1146 1055 +f 953 949 1047 +f 1047 1055 953 +f 885 875 949 +f 949 953 885 +f 803 795 875 +f 875 885 803 +f 753 745 795 +f 795 803 753 +f 713 701 745 +f 745 753 713 +f 691 683 701 +f 701 713 691 +f 1470 1464 1821 +f 1821 1829 1470 +f 1272 1264 1464 +f 1464 1470 1272 +f 1154 1146 1264 +f 1264 1272 1154 +f 1061 1055 1146 +f 1146 1154 1061 +f 959 953 1055 +f 1055 1061 959 +f 893 885 953 +f 953 959 893 +f 809 803 885 +f 885 893 809 +f 759 753 803 +f 803 809 759 +f 721 713 753 +f 753 759 721 +f 705 691 713 +f 713 721 705 +f 1469 1470 1829 +f 1829 1835 1469 +f 1268 1272 1470 +f 1470 1469 1268 +f 1151 1154 1272 +f 1272 1268 1151 +f 1060 1061 1154 +f 1154 1151 1060 +f 957 959 1061 +f 1061 1060 957 +f 889 893 959 +f 959 957 889 +f 807 809 893 +f 893 889 807 +f 757 759 809 +f 809 807 757 +f 719 721 759 +f 759 757 719 +f 699 705 721 +f 721 719 699 +f 1462 1469 1835 +f 1835 1839 1462 +f 1262 1268 1469 +f 1469 1462 1262 +f 1144 1151 1268 +f 1268 1262 1144 +f 1051 1060 1151 +f 1151 1144 1051 +f 951 957 1060 +f 1060 1051 951 +f 881 889 957 +f 957 951 881 +f 799 807 889 +f 889 881 799 +f 747 757 807 +f 807 799 747 +f 711 719 757 +f 757 747 711 +f 687 699 719 +f 719 711 687 +f 1458 1462 1839 +f 1839 1843 1458 +f 1258 1262 1462 +f 1462 1458 1258 +f 1140 1144 1262 +f 1262 1258 1140 +f 1045 1051 1144 +f 1144 1140 1045 +f 945 951 1051 +f 1051 1045 945 +f 871 881 951 +f 951 945 871 +f 793 799 881 +f 881 871 793 +f 741 747 799 +f 799 793 741 +f 693 711 747 +f 747 741 693 +f 675 687 711 +f 711 693 675 +f 1450 1458 1843 +f 1843 1838 1450 +f 1254 1258 1458 +f 1458 1450 1254 +f 1136 1140 1258 +f 1258 1254 1136 +f 1043 1045 1140 +f 1140 1136 1043 +f 943 945 1045 +f 1045 1043 943 +f 861 871 945 +f 945 943 861 +f 787 793 871 +f 871 861 787 +f 725 741 793 +f 793 787 725 +f 677 693 741 +f 741 725 677 +f 663 675 693 +f 693 677 663 +f 1448 1450 1838 +f 1838 1834 1448 +f 1252 1254 1450 +f 1450 1448 1252 +f 1133 1136 1254 +f 1254 1252 1133 +f 1035 1043 1136 +f 1136 1133 1035 +f 937 943 1043 +f 1043 1035 937 +f 853 861 943 +f 943 937 853 +f 777 787 861 +f 861 853 777 +f 715 725 787 +f 787 777 715 +f 657 677 725 +f 725 715 657 +f 642 663 677 +f 677 657 642 +f 1444 1448 1834 +f 1834 1828 1444 +f 1248 1252 1448 +f 1448 1444 1248 +f 1122 1133 1252 +f 1252 1248 1122 +f 1027 1035 1133 +f 1133 1122 1027 +f 931 937 1035 +f 1035 1027 931 +f 843 853 937 +f 937 931 843 +f 767 777 853 +f 853 843 767 +f 689 715 777 +f 777 767 689 +f 640 657 715 +f 715 689 640 +f 634 642 657 +f 657 640 634 +f 1442 1444 1828 +f 1828 1820 1442 +f 1244 1248 1444 +f 1444 1442 1244 +f 1116 1122 1248 +f 1248 1244 1116 +f 1021 1027 1122 +f 1122 1116 1021 +f 923 931 1027 +f 1027 1021 923 +f 831 843 931 +f 931 923 831 +f 751 767 843 +f 843 831 751 +f 673 689 767 +f 767 751 673 +f 632 640 689 +f 689 673 632 +f 620 634 640 +f 640 632 620 +f 1429 1442 1820 +f 1820 1811 1429 +f 1233 1244 1442 +f 1442 1429 1233 +f 1106 1116 1244 +f 1244 1233 1106 +f 1011 1021 1116 +f 1116 1106 1011 +f 911 923 1021 +f 1021 1011 911 +f 817 831 923 +f 923 911 817 +f 733 751 831 +f 831 817 733 +f 649 673 751 +f 751 733 649 +f 614 632 673 +f 673 649 614 +f 597 620 632 +f 632 614 597 +f 714 702 684 +f 684 692 714 +f 754 746 702 +f 702 714 754 +f 804 796 746 +f 746 754 804 +f 886 876 796 +f 796 804 886 +f 954 950 876 +f 876 886 954 +f 1056 1048 950 +f 950 954 1056 +f 1147 1143 1048 +f 1048 1056 1147 +f 1265 1261 1143 +f 1143 1147 1265 +f 1465 1461 1261 +f 1261 1265 1465 +f 1915 1817 1461 +f 1461 1465 1915 +f 722 714 692 +f 692 706 722 +f 760 754 714 +f 714 722 760 +f 810 804 754 +f 754 760 810 +f 894 886 804 +f 804 810 894 +f 960 954 886 +f 886 894 960 +f 1062 1056 954 +f 954 960 1062 +f 1155 1147 1056 +f 1056 1062 1155 +f 1273 1265 1147 +f 1147 1155 1273 +f 1471 1465 1265 +f 1265 1273 1471 +f 1917 1915 1465 +f 1465 1471 1917 +f 720 722 706 +f 706 700 720 +f 758 760 722 +f 722 720 758 +f 808 810 760 +f 760 758 808 +f 890 894 810 +f 810 808 890 +f 958 960 894 +f 894 890 958 +f 1059 1062 960 +f 960 958 1059 +f 1150 1155 1062 +f 1062 1059 1150 +f 1269 1273 1155 +f 1155 1150 1269 +f 1468 1471 1273 +f 1273 1269 1468 +f 1697 1917 1471 +f 1471 1468 1697 +f 712 720 700 +f 700 688 712 +f 748 758 720 +f 720 712 748 +f 800 808 758 +f 758 748 800 +f 882 890 808 +f 808 800 882 +f 952 958 890 +f 890 882 952 +f 1052 1059 958 +f 958 952 1052 +f 1145 1150 1059 +f 1059 1052 1145 +f 1263 1269 1150 +f 1150 1145 1263 +f 1463 1468 1269 +f 1269 1263 1463 +f 1919 1697 1468 +f 1468 1463 1919 +f 694 712 688 +f 688 676 694 +f 742 748 712 +f 712 694 742 +f 794 800 748 +f 748 742 794 +f 872 882 800 +f 800 794 872 +f 946 952 882 +f 882 872 946 +f 1046 1052 952 +f 952 946 1046 +f 1141 1145 1052 +f 1052 1046 1141 +f 1259 1263 1145 +f 1145 1141 1259 +f 1459 1463 1263 +f 1263 1259 1459 +f 1845 1919 1463 +f 1463 1459 1845 +f 678 694 676 +f 676 664 678 +f 726 742 694 +f 694 678 726 +f 788 794 742 +f 742 726 788 +f 862 872 794 +f 794 788 862 +f 944 946 872 +f 872 862 944 +f 1044 1046 946 +f 946 944 1044 +f 1137 1141 1046 +f 1046 1044 1137 +f 1255 1259 1141 +f 1141 1137 1255 +f 1451 1459 1259 +f 1259 1255 1451 +f 1898 1845 1459 +f 1459 1451 1898 +f 658 678 664 +f 664 642 658 +f 716 726 678 +f 678 658 716 +f 778 788 726 +f 726 716 778 +f 854 862 788 +f 788 778 854 +f 938 944 862 +f 862 854 938 +f 1036 1044 944 +f 944 938 1036 +f 1132 1137 1044 +f 1044 1036 1132 +f 1253 1255 1137 +f 1137 1132 1253 +f 1449 1451 1255 +f 1255 1253 1449 +f 1837 1898 1451 +f 1451 1449 1837 +f 641 658 642 +f 642 635 641 +f 690 716 658 +f 658 641 690 +f 768 778 716 +f 716 690 768 +f 844 854 778 +f 778 768 844 +f 932 938 854 +f 854 844 932 +f 1028 1036 938 +f 938 932 1028 +f 1123 1132 1036 +f 1036 1028 1123 +f 1249 1253 1132 +f 1132 1123 1249 +f 1445 1449 1253 +f 1253 1249 1445 +f 1918 1837 1449 +f 1449 1445 1918 +f 633 641 635 +f 635 621 633 +f 674 690 641 +f 641 633 674 +f 752 768 690 +f 690 674 752 +f 832 844 768 +f 768 752 832 +f 924 932 844 +f 844 832 924 +f 1022 1028 932 +f 932 924 1022 +f 1117 1123 1028 +f 1028 1022 1117 +f 1245 1249 1123 +f 1123 1117 1245 +f 1443 1445 1249 +f 1249 1245 1443 +f 1916 1918 1445 +f 1445 1443 1916 +f 616 633 621 +f 621 600 616 +f 654 674 633 +f 633 616 654 +f 737 752 674 +f 674 654 737 +f 822 832 752 +f 752 737 822 +f 914 924 832 +f 832 822 914 +f 1014 1022 924 +f 924 914 1014 +f 1104 1117 1022 +f 1022 1014 1104 +f 1237 1245 1117 +f 1117 1104 1237 +f 1433 1443 1245 +f 1245 1237 1433 +f 1819 1916 1443 +f 1443 1433 1819 +f 2159 2163 1816 +f 1816 1822 2159 +f 2359 2363 2163 +f 2163 2159 2359 +f 2477 2481 2363 +f 2363 2359 2477 +f 2568 2576 2481 +f 2481 2477 2568 +f 2670 2674 2576 +f 2576 2568 2670 +f 2738 2748 2674 +f 2674 2670 2738 +f 2820 2828 2748 +f 2748 2738 2820 +f 2870 2878 2828 +f 2828 2820 2870 +f 2910 2922 2878 +f 2878 2870 2910 +f 2932 2940 2922 +f 2922 2910 2932 +f 2153 2159 1822 +f 1822 1830 2153 +f 2351 2359 2159 +f 2159 2153 2351 +f 2469 2477 2359 +f 2359 2351 2469 +f 2562 2568 2477 +f 2477 2469 2562 +f 2664 2670 2568 +f 2568 2562 2664 +f 2730 2738 2670 +f 2670 2664 2730 +f 2814 2820 2738 +f 2738 2730 2814 +f 2864 2870 2820 +f 2820 2814 2864 +f 2902 2910 2870 +f 2870 2864 2902 +f 2918 2932 2910 +f 2910 2902 2918 +f 2154 2153 1830 +f 1830 1836 2154 +f 2355 2351 2153 +f 2153 2154 2355 +f 2472 2469 2351 +f 2351 2355 2472 +f 2563 2562 2469 +f 2469 2472 2563 +f 2666 2664 2562 +f 2562 2563 2666 +f 2734 2730 2664 +f 2664 2666 2734 +f 2816 2814 2730 +f 2730 2734 2816 +f 2866 2864 2814 +f 2814 2816 2866 +f 2904 2902 2864 +f 2864 2866 2904 +f 2924 2918 2902 +f 2902 2904 2924 +f 2161 2154 1836 +f 1836 1840 2161 +f 2361 2355 2154 +f 2154 2161 2361 +f 2479 2472 2355 +f 2355 2361 2479 +f 2572 2563 2472 +f 2472 2479 2572 +f 2672 2666 2563 +f 2563 2572 2672 +f 2742 2734 2666 +f 2666 2672 2742 +f 2824 2816 2734 +f 2734 2742 2824 +f 2876 2866 2816 +f 2816 2824 2876 +f 2912 2904 2866 +f 2866 2876 2912 +f 2936 2924 2904 +f 2904 2912 2936 +f 2165 2161 1840 +f 1840 1844 2165 +f 2365 2361 2161 +f 2161 2165 2365 +f 2483 2479 2361 +f 2361 2365 2483 +f 2578 2572 2479 +f 2479 2483 2578 +f 2678 2672 2572 +f 2572 2578 2678 +f 2752 2742 2672 +f 2672 2678 2752 +f 2830 2824 2742 +f 2742 2752 2830 +f 2882 2876 2824 +f 2824 2830 2882 +f 2930 2912 2876 +f 2876 2882 2930 +f 2948 2936 2912 +f 2912 2930 2948 +f 2173 2165 1844 +f 1844 1841 2173 +f 2369 2365 2165 +f 2165 2173 2369 +f 2487 2483 2365 +f 2365 2369 2487 +f 2580 2578 2483 +f 2483 2487 2580 +f 2680 2678 2578 +f 2578 2580 2680 +f 2762 2752 2678 +f 2678 2680 2762 +f 2836 2830 2752 +f 2752 2762 2836 +f 2898 2882 2830 +f 2830 2836 2898 +f 2946 2930 2882 +f 2882 2898 2946 +f 2960 2948 2930 +f 2930 2946 2960 +f 2175 2173 1841 +f 1841 1837 2175 +f 2371 2369 2173 +f 2173 2175 2371 +f 2490 2487 2369 +f 2369 2371 2490 +f 2588 2580 2487 +f 2487 2490 2588 +f 2686 2680 2580 +f 2580 2588 2686 +f 2770 2762 2680 +f 2680 2686 2770 +f 2846 2836 2762 +f 2762 2770 2846 +f 2908 2898 2836 +f 2836 2846 2908 +f 2966 2946 2898 +f 2898 2908 2966 +f 2981 2960 2946 +f 2946 2966 2981 +f 2179 2175 1837 +f 1837 1831 2179 +f 2375 2371 2175 +f 2175 2179 2375 +f 2501 2490 2371 +f 2371 2375 2501 +f 2596 2588 2490 +f 2490 2501 2596 +f 2692 2686 2588 +f 2588 2596 2692 +f 2780 2770 2686 +f 2686 2692 2780 +f 2856 2846 2770 +f 2770 2780 2856 +f 2934 2908 2846 +f 2846 2856 2934 +f 2983 2966 2908 +f 2908 2934 2983 +f 2989 2981 2966 +f 2966 2983 2989 +f 2181 2179 1831 +f 1831 1823 2181 +f 2379 2375 2179 +f 2179 2181 2379 +f 2507 2501 2375 +f 2375 2379 2507 +f 2602 2596 2501 +f 2501 2507 2602 +f 2700 2692 2596 +f 2596 2602 2700 +f 2792 2780 2692 +f 2692 2700 2792 +f 2872 2856 2780 +f 2780 2792 2872 +f 2950 2934 2856 +f 2856 2872 2950 +f 2991 2983 2934 +f 2934 2950 2991 +f 3003 2989 2983 +f 2983 2991 3003 +f 2194 2181 1823 +f 1823 1818 2194 +f 2391 2379 2181 +f 2181 2194 2391 +f 2518 2507 2379 +f 2379 2391 2518 +f 2614 2602 2507 +f 2507 2518 2614 +f 2712 2700 2602 +f 2602 2614 2712 +f 2806 2792 2700 +f 2700 2712 2806 +f 2890 2872 2792 +f 2792 2806 2890 +f 2974 2950 2872 +f 2872 2890 2974 +f 3009 2991 2950 +f 2950 2974 3009 +f 3025 3003 2991 +f 2991 3009 3025 +f 3040 3008 3024 +f 3024 3048 3040 +f 3018 2973 3008 +f 3008 3040 3018 +f 2943 2889 2973 +f 2973 3018 2943 +f 2841 2805 2889 +f 2889 2943 2841 +f 2731 2711 2805 +f 2805 2841 2731 +f 2645 2611 2711 +f 2711 2731 2645 +f 2529 2521 2611 +f 2611 2645 2529 +f 2402 2387 2521 +f 2521 2529 2402 +f 2208 2191 2387 +f 2387 2402 2208 +f 1806 1810 2191 +f 2191 2208 1806 +f 3072 3040 3048 +f 3048 3078 3072 +f 3044 3018 3040 +f 3040 3072 3044 +f 2994 2943 3018 +f 3018 3044 2994 +f 2883 2841 2943 +f 2943 2994 2883 +f 2773 2731 2841 +f 2841 2883 2773 +f 2659 2645 2731 +f 2731 2773 2659 +f 2539 2529 2645 +f 2645 2659 2539 +f 2410 2402 2529 +f 2529 2539 2410 +f 2222 2208 2402 +f 2402 2410 2222 +f 1694 1806 2208 +f 2208 2222 1694 +f 3092 3072 3078 +f 3078 3116 3092 +f 3074 3044 3072 +f 3072 3092 3074 +f 3030 2994 3044 +f 3044 3074 3030 +f 2937 2883 2994 +f 2994 3030 2937 +f 2810 2773 2883 +f 2883 2937 2810 +f 2683 2659 2773 +f 2773 2810 2683 +f 2554 2539 2659 +f 2659 2683 2554 +f 2420 2410 2539 +f 2539 2554 2420 +f 2238 2222 2410 +f 2410 2420 2238 +f 1930 1694 2222 +f 2222 2238 1930 +f 3132 3092 3116 +f 3116 3142 3132 +f 3090 3074 3092 +f 3092 3132 3090 +f 3054 3030 3074 +f 3074 3090 3054 +f 2984 2937 3030 +f 3030 3054 2984 +f 2837 2810 2937 +f 2937 2984 2837 +f 2705 2683 2810 +f 2810 2837 2705 +f 2574 2554 2683 +f 2683 2705 2574 +f 2430 2420 2554 +f 2554 2574 2430 +f 2247 2238 2420 +f 2420 2430 2247 +f 1913 1930 2238 +f 2238 2247 1913 +f 3150 3132 3142 +f 3142 3156 3150 +f 3128 3090 3132 +f 3132 3150 3128 +f 3076 3054 3090 +f 3090 3128 3076 +f 3014 2984 3054 +f 3054 3076 3014 +f 2861 2837 2984 +f 2984 3014 2861 +f 2723 2705 2837 +f 2837 2861 2723 +f 2585 2574 2705 +f 2705 2723 2585 +f 2438 2430 2574 +f 2574 2585 2438 +f 2253 2247 2430 +f 2430 2438 2253 +f 1711 1913 2247 +f 2247 2253 1711 +f 3162 3150 3156 +f 3156 3172 3162 +f 3148 3128 3150 +f 3150 3162 3148 +f 3088 3076 3128 +f 3128 3148 3088 +f 3036 3014 3076 +f 3076 3088 3036 +f 2893 2861 3014 +f 3014 3036 2893 +f 2743 2723 2861 +f 2861 2893 2743 +f 2599 2585 2723 +f 2723 2743 2599 +f 2450 2438 2585 +f 2585 2599 2450 +f 2267 2253 2438 +f 2438 2450 2267 +f 1794 1711 2253 +f 2253 2267 1794 +f 3178 3162 3172 +f 3172 3184 3178 +f 3154 3148 3162 +f 3162 3178 3154 +f 3118 3088 3148 +f 3148 3154 3118 +f 3046 3036 3088 +f 3088 3118 3046 +f 2915 2893 3036 +f 3036 3046 2915 +f 2763 2743 2893 +f 2893 2915 2763 +f 2615 2599 2743 +f 2743 2763 2615 +f 2452 2450 2599 +f 2599 2615 2452 +f 2277 2267 2450 +f 2450 2452 2277 +f 1710 1794 2267 +f 2267 2277 1710 +f 3188 3178 3184 +f 3184 3200 3188 +f 3164 3154 3178 +f 3178 3188 3164 +f 3130 3118 3154 +f 3154 3164 3130 +f 3058 3046 3118 +f 3118 3130 3058 +f 2941 2915 3046 +f 3046 3058 2941 +f 2775 2763 2915 +f 2915 2941 2775 +f 2627 2615 2763 +f 2763 2775 2627 +f 2458 2452 2615 +f 2615 2627 2458 +f 2287 2277 2452 +f 2452 2458 2287 +f 1910 1710 2277 +f 2277 2287 1910 +f 3198 3188 3200 +f 3200 3209 3198 +f 3170 3164 3188 +f 3188 3198 3170 +f 3136 3130 3164 +f 3164 3170 3136 +f 3064 3058 3130 +f 3130 3136 3064 +f 2955 2941 3058 +f 3058 3064 2955 +f 2781 2775 2941 +f 2941 2955 2781 +f 2636 2627 2775 +f 2775 2781 2636 +f 2462 2458 2627 +f 2627 2636 2462 +f 2295 2287 2458 +f 2458 2462 2295 +f 1909 1910 2287 +f 2287 2295 1909 +f 3202 3198 3209 +f 3209 3213 3202 +f 3174 3170 3198 +f 3198 3202 3174 +f 3138 3136 3170 +f 3170 3174 3138 +f 3066 3064 3136 +f 3136 3138 3066 +f 2961 2955 3064 +f 3064 3066 2961 +f 2783 2781 2955 +f 2955 2961 2783 +f 2642 2636 2781 +f 2781 2783 2642 +f 2464 2462 2636 +f 2636 2642 2464 +f 2297 2295 2462 +f 2462 2464 2297 +f 1784 1909 2295 +f 2295 2297 1784 +f 1414 1429 1811 +f 1811 1807 1414 +f 1220 1233 1429 +f 1429 1414 1220 +f 1093 1106 1233 +f 1233 1220 1093 +f 977 1011 1106 +f 1106 1093 977 +f 891 911 1011 +f 1011 977 891 +f 781 817 911 +f 911 891 781 +f 679 733 817 +f 817 781 679 +f 604 649 733 +f 733 679 604 +f 571 614 649 +f 649 604 571 +f 561 597 614 +f 614 571 561 +f 1400 1414 1807 +f 1807 1804 1400 +f 1212 1220 1414 +f 1414 1400 1212 +f 1083 1093 1220 +f 1220 1212 1083 +f 963 977 1093 +f 1093 1083 963 +f 849 891 977 +f 977 963 849 +f 739 781 891 +f 891 849 739 +f 628 679 781 +f 781 739 628 +f 565 604 679 +f 679 628 565 +f 530 571 604 +f 604 565 530 +f 524 561 571 +f 571 530 524 +f 1386 1400 1804 +f 1804 1802 1386 +f 1202 1212 1400 +f 1400 1386 1202 +f 1070 1083 1212 +f 1212 1202 1070 +f 939 963 1083 +f 1083 1070 939 +f 814 849 963 +f 963 939 814 +f 685 739 849 +f 849 814 685 +f 585 628 739 +f 739 685 585 +f 528 565 628 +f 628 585 528 +f 510 530 565 +f 565 528 510 +f 508 524 530 +f 530 510 508 +f 1375 1386 1802 +f 1802 1800 1375 +f 1192 1202 1386 +f 1386 1375 1192 +f 1050 1070 1202 +f 1202 1192 1050 +f 917 939 1070 +f 1070 1050 917 +f 785 814 939 +f 939 917 785 +f 638 685 814 +f 814 785 638 +f 553 585 685 +f 685 638 553 +f 512 528 585 +f 585 553 512 +f 492 510 528 +f 528 512 492 +f 482 508 510 +f 510 492 482 +f 1369 1375 1800 +f 1800 1798 1369 +f 1184 1192 1375 +f 1375 1369 1184 +f 1037 1050 1192 +f 1192 1184 1037 +f 899 917 1050 +f 1050 1037 899 +f 761 785 917 +f 917 899 761 +f 608 638 785 +f 785 761 608 +f 526 553 638 +f 638 608 526 +f 496 512 553 +f 553 526 496 +f 454 492 512 +f 512 496 454 +f 448 482 492 +f 492 454 448 +f 1355 1369 1798 +f 1798 1795 1355 +f 1172 1184 1369 +f 1369 1355 1172 +f 1023 1037 1184 +f 1184 1172 1023 +f 879 899 1037 +f 1037 1023 879 +f 729 761 899 +f 899 879 729 +f 579 608 761 +f 761 729 579 +f 514 526 608 +f 608 579 514 +f 457 496 526 +f 526 514 457 +f 442 454 496 +f 496 457 442 +f 432 448 454 +f 454 442 432 +f 1345 1355 1795 +f 1795 1792 1345 +f 1170 1172 1355 +f 1355 1345 1170 +f 1007 1023 1172 +f 1172 1170 1007 +f 859 879 1023 +f 1023 1007 859 +f 707 729 879 +f 879 859 707 +f 563 579 729 +f 729 707 563 +f 506 514 579 +f 579 563 506 +f 450 457 514 +f 514 506 450 +f 420 442 457 +f 457 450 420 +f 412 432 442 +f 442 420 412 +f 1335 1345 1792 +f 1792 1790 1335 +f 1164 1170 1345 +f 1345 1335 1164 +f 995 1007 1170 +f 1170 1164 995 +f 847 859 1007 +f 1007 995 847 +f 681 707 859 +f 859 847 681 +f 547 563 707 +f 707 681 547 +f 494 506 563 +f 563 547 494 +f 440 450 506 +f 506 494 440 +f 410 420 450 +f 450 440 410 +f 398 412 420 +f 420 410 398 +f 1327 1335 1790 +f 1790 1788 1327 +f 1160 1164 1335 +f 1335 1327 1160 +f 988 995 1164 +f 1164 1160 988 +f 841 847 995 +f 995 988 841 +f 667 681 847 +f 847 841 667 +f 538 547 681 +f 681 667 538 +f 488 494 547 +f 547 538 488 +f 434 440 494 +f 494 488 434 +f 400 410 440 +f 440 434 400 +f 381 398 410 +f 410 400 381 +f 1324 1327 1788 +f 1788 1785 1324 +f 1156 1160 1327 +f 1327 1324 1156 +f 979 988 1160 +f 1160 1156 979 +f 837 841 988 +f 988 979 837 +f 659 667 841 +f 841 837 659 +f 534 538 667 +f 667 659 534 +f 484 488 538 +f 538 534 484 +f 428 434 488 +f 488 484 428 +f 395 400 434 +f 434 428 395 +f 374 381 400 +f 400 395 374 +f 572 616 600 +f 600 562 572 +f 605 654 616 +f 616 572 605 +f 680 737 654 +f 654 605 680 +f 782 822 737 +f 737 680 782 +f 892 914 822 +f 822 782 892 +f 978 1014 914 +f 914 892 978 +f 1094 1104 1014 +f 1014 978 1094 +f 1221 1237 1104 +f 1104 1094 1221 +f 1415 1433 1237 +f 1237 1221 1415 +f 1809 1819 1433 +f 1433 1415 1809 +f 531 572 562 +f 562 525 531 +f 566 605 572 +f 572 531 566 +f 629 680 605 +f 605 566 629 +f 740 782 680 +f 680 629 740 +f 850 892 782 +f 782 740 850 +f 964 978 892 +f 892 850 964 +f 1084 1094 978 +f 978 964 1084 +f 1213 1221 1094 +f 1094 1084 1213 +f 1401 1415 1221 +f 1221 1213 1401 +f 1931 1809 1415 +f 1415 1401 1931 +f 511 531 525 +f 525 509 511 +f 529 566 531 +f 531 511 529 +f 586 629 566 +f 566 529 586 +f 686 740 629 +f 629 586 686 +f 813 850 740 +f 740 686 813 +f 940 964 850 +f 850 813 940 +f 1069 1084 964 +f 964 940 1069 +f 1203 1213 1084 +f 1084 1069 1203 +f 1385 1401 1213 +f 1213 1203 1385 +f 1693 1931 1401 +f 1401 1385 1693 +f 493 511 509 +f 509 483 493 +f 513 529 511 +f 511 493 513 +f 554 586 529 +f 529 513 554 +f 639 686 586 +f 586 554 639 +f 786 813 686 +f 686 639 786 +f 918 940 813 +f 813 786 918 +f 1049 1069 940 +f 940 918 1049 +f 1193 1203 1069 +f 1069 1049 1193 +f 1376 1385 1203 +f 1203 1193 1376 +f 1712 1693 1385 +f 1385 1376 1712 +f 455 493 483 +f 483 449 455 +f 497 513 493 +f 493 455 497 +f 527 554 513 +f 513 497 527 +f 609 639 554 +f 554 527 609 +f 762 786 639 +f 639 609 762 +f 900 918 786 +f 786 762 900 +f 1038 1049 918 +f 918 900 1038 +f 1185 1193 1049 +f 1049 1038 1185 +f 1370 1376 1193 +f 1193 1185 1370 +f 1912 1712 1376 +f 1376 1370 1912 +f 443 455 449 +f 449 433 443 +f 458 497 455 +f 455 443 458 +f 515 527 497 +f 497 458 515 +f 580 609 527 +f 527 515 580 +f 730 762 609 +f 609 580 730 +f 880 900 762 +f 762 730 880 +f 1024 1038 900 +f 900 880 1024 +f 1173 1185 1038 +f 1038 1024 1173 +f 1356 1370 1185 +f 1185 1173 1356 +f 1797 1912 1370 +f 1370 1356 1797 +f 421 443 433 +f 433 413 421 +f 451 458 443 +f 443 421 451 +f 507 515 458 +f 458 451 507 +f 564 580 515 +f 515 507 564 +f 708 730 580 +f 580 564 708 +f 860 880 730 +f 730 708 860 +f 1008 1024 880 +f 880 860 1008 +f 1171 1173 1024 +f 1024 1008 1171 +f 1346 1356 1173 +f 1173 1171 1346 +f 1911 1797 1356 +f 1356 1346 1911 +f 411 421 413 +f 413 399 411 +f 441 451 421 +f 421 411 441 +f 495 507 451 +f 451 441 495 +f 548 564 507 +f 507 495 548 +f 682 708 564 +f 564 548 682 +f 848 860 708 +f 708 682 848 +f 996 1008 860 +f 860 848 996 +f 1165 1171 1008 +f 1008 996 1165 +f 1336 1346 1171 +f 1171 1165 1336 +f 1709 1911 1346 +f 1346 1336 1709 +f 401 411 399 +f 399 382 401 +f 435 441 411 +f 411 401 435 +f 489 495 441 +f 441 435 489 +f 539 548 495 +f 495 489 539 +f 668 682 548 +f 548 539 668 +f 842 848 682 +f 682 668 842 +f 987 996 848 +f 848 842 987 +f 1161 1165 996 +f 996 987 1161 +f 1328 1336 1165 +f 1165 1161 1328 +f 1708 1709 1336 +f 1336 1328 1708 +f 397 401 382 +f 382 376 397 +f 431 435 401 +f 401 397 431 +f 487 489 435 +f 435 431 487 +f 537 539 489 +f 489 487 537 +f 662 668 539 +f 539 537 662 +f 840 842 668 +f 668 662 840 +f 981 987 842 +f 842 840 981 +f 1159 1161 987 +f 987 981 1159 +f 1326 1328 1161 +f 1161 1159 1326 +f 1787 1708 1328 +f 1328 1326 1787 +f 2209 2194 1818 +f 1818 1808 2209 +f 2403 2391 2194 +f 2194 2209 2403 +f 2530 2518 2391 +f 2391 2403 2530 +f 2646 2614 2518 +f 2518 2530 2646 +f 2732 2712 2614 +f 2614 2646 2732 +f 2842 2806 2712 +f 2712 2732 2842 +f 2944 2890 2806 +f 2806 2842 2944 +f 3019 2974 2890 +f 2890 2944 3019 +f 3041 3009 2974 +f 2974 3019 3041 +f 3049 3025 3009 +f 3009 3041 3049 +f 2223 2209 1808 +f 1808 1805 2223 +f 2411 2403 2209 +f 2209 2223 2411 +f 2540 2530 2403 +f 2403 2411 2540 +f 2660 2646 2530 +f 2530 2540 2660 +f 2774 2732 2646 +f 2646 2660 2774 +f 2884 2842 2732 +f 2732 2774 2884 +f 2995 2944 2842 +f 2842 2884 2995 +f 3045 3019 2944 +f 2944 2995 3045 +f 3073 3041 3019 +f 3019 3045 3073 +f 3079 3049 3041 +f 3041 3073 3079 +f 2237 2223 1805 +f 1805 1803 2237 +f 2421 2411 2223 +f 2223 2237 2421 +f 2553 2540 2411 +f 2411 2421 2553 +f 2684 2660 2540 +f 2540 2553 2684 +f 2809 2774 2660 +f 2660 2684 2809 +f 2938 2884 2774 +f 2774 2809 2938 +f 3031 2995 2884 +f 2884 2938 3031 +f 3075 3045 2995 +f 2995 3031 3075 +f 3093 3073 3045 +f 3045 3075 3093 +f 3117 3079 3073 +f 3073 3093 3117 +f 2248 2237 1803 +f 1803 1801 2248 +f 2431 2421 2237 +f 2237 2248 2431 +f 2573 2553 2421 +f 2421 2431 2573 +f 2706 2684 2553 +f 2553 2573 2706 +f 2838 2809 2684 +f 2684 2706 2838 +f 2985 2938 2809 +f 2809 2838 2985 +f 3055 3031 2938 +f 2938 2985 3055 +f 3091 3075 3031 +f 3031 3055 3091 +f 3133 3093 3075 +f 3075 3091 3133 +f 3143 3117 3093 +f 3093 3133 3143 +f 2254 2248 1801 +f 1801 1799 2254 +f 2439 2431 2248 +f 2248 2254 2439 +f 2586 2573 2431 +f 2431 2439 2586 +f 2724 2706 2573 +f 2573 2586 2724 +f 2862 2838 2706 +f 2706 2724 2862 +f 3015 2985 2838 +f 2838 2862 3015 +f 3077 3055 2985 +f 2985 3015 3077 +f 3129 3091 3055 +f 3055 3077 3129 +f 3151 3133 3091 +f 3091 3129 3151 +f 3157 3143 3133 +f 3133 3151 3157 +f 2268 2254 1799 +f 1799 1796 2268 +f 2451 2439 2254 +f 2254 2268 2451 +f 2600 2586 2439 +f 2439 2451 2600 +f 2744 2724 2586 +f 2586 2600 2744 +f 2894 2862 2724 +f 2724 2744 2894 +f 3037 3015 2862 +f 2862 2894 3037 +f 3089 3077 3015 +f 3015 3037 3089 +f 3149 3129 3077 +f 3077 3089 3149 +f 3163 3151 3129 +f 3129 3149 3163 +f 3173 3157 3151 +f 3151 3163 3173 +f 2278 2268 1796 +f 1796 1793 2278 +f 2453 2451 2268 +f 2268 2278 2453 +f 2616 2600 2451 +f 2451 2453 2616 +f 2764 2744 2600 +f 2600 2616 2764 +f 2916 2894 2744 +f 2744 2764 2916 +f 3047 3037 2894 +f 2894 2916 3047 +f 3119 3089 3037 +f 3037 3047 3119 +f 3155 3149 3089 +f 3089 3119 3155 +f 3179 3163 3149 +f 3149 3155 3179 +f 3185 3173 3163 +f 3163 3179 3185 +f 2288 2278 1793 +f 1793 1791 2288 +f 2459 2453 2278 +f 2278 2288 2459 +f 2628 2616 2453 +f 2453 2459 2628 +f 2776 2764 2616 +f 2616 2628 2776 +f 2942 2916 2764 +f 2764 2776 2942 +f 3059 3047 2916 +f 2916 2942 3059 +f 3131 3119 3047 +f 3047 3059 3131 +f 3165 3155 3119 +f 3119 3131 3165 +f 3189 3179 3155 +f 3155 3165 3189 +f 3201 3185 3179 +f 3179 3189 3201 +f 2296 2288 1791 +f 1791 1789 2296 +f 2463 2459 2288 +f 2288 2296 2463 +f 2635 2628 2459 +f 2459 2463 2635 +f 2782 2776 2628 +f 2628 2635 2782 +f 2956 2942 2776 +f 2776 2782 2956 +f 3065 3059 2942 +f 2942 2956 3065 +f 3137 3131 3059 +f 3059 3065 3137 +f 3171 3165 3131 +f 3131 3137 3171 +f 3199 3189 3165 +f 3165 3171 3199 +f 3210 3201 3189 +f 3189 3199 3210 +f 2299 2296 1789 +f 1789 1786 2299 +f 2467 2463 2296 +f 2296 2299 2467 +f 2644 2635 2463 +f 2463 2467 2644 +f 2786 2782 2635 +f 2635 2644 2786 +f 2964 2956 2782 +f 2782 2786 2964 +f 3069 3065 2956 +f 2956 2964 3069 +f 3141 3137 3065 +f 3065 3069 3141 +f 3177 3171 3137 +f 3137 3141 3177 +f 3204 3199 3171 +f 3171 3177 3204 +f 3214 3210 3199 +f 3199 3204 3214 +f 3194 3202 3213 +f 3213 3207 3194 +f 3166 3175 3202 +f 3202 3194 3166 +f 3134 3139 3175 +f 3175 3166 3134 +f 3060 3067 3139 +f 3139 3134 3060 +f 2953 2962 3067 +f 3067 3060 2953 +f 2777 2784 2962 +f 2962 2953 2777 +f 2629 2643 2784 +f 2784 2777 2629 +f 2460 2465 2643 +f 2643 2629 2460 +f 2293 2298 2465 +f 2465 2460 2293 +f 1696 1785 2298 +f 2298 2293 1696 +f 3180 3194 3207 +f 3207 3190 3180 +f 3158 3166 3194 +f 3194 3180 3158 +f 3124 3134 3166 +f 3166 3158 3124 +f 3050 3060 3134 +f 3134 3124 3050 +f 2927 2953 3060 +f 3060 3050 2927 +f 2767 2777 2953 +f 2953 2927 2767 +f 2619 2629 2777 +f 2777 2767 2619 +f 2454 2460 2629 +f 2629 2619 2454 +f 2283 2293 2460 +f 2460 2454 2283 +f 1695 1696 2293 +f 2293 2283 1695 +f 3160 3180 3190 +f 3190 3168 3160 +f 3144 3158 3180 +f 3180 3160 3144 +f 3086 3124 3158 +f 3158 3144 3086 +f 3032 3050 3124 +f 3124 3086 3032 +f 2891 2927 3050 +f 3050 3032 2891 +f 2739 2767 2927 +f 2927 2891 2739 +f 2597 2619 2767 +f 2767 2739 2597 +f 2448 2454 2619 +f 2619 2597 2448 +f 2265 2283 2454 +f 2454 2448 2265 +f 1707 1695 2283 +f 2283 2265 1707 +f 3146 3160 3168 +f 3168 3152 3146 +f 3122 3144 3160 +f 3160 3146 3122 +f 3070 3086 3144 +f 3144 3122 3070 +f 2998 3032 3086 +f 3086 3070 2998 +f 2853 2891 3032 +f 3032 2998 2853 +f 2717 2739 2891 +f 2891 2853 2717 +f 2582 2597 2739 +f 2739 2717 2582 +f 2434 2448 2597 +f 2597 2582 2434 +f 2251 2265 2448 +f 2448 2434 2251 +f 1907 1707 2265 +f 2265 2251 1907 +f 3120 3146 3152 +f 3152 3126 3120 +f 3082 3122 3146 +f 3146 3120 3082 +f 3042 3070 3122 +f 3122 3082 3042 +f 2957 2998 3070 +f 3070 3042 2957 +f 2825 2853 2998 +f 2998 2957 2825 +f 2693 2717 2853 +f 2853 2825 2693 +f 2556 2582 2717 +f 2717 2693 2556 +f 2424 2434 2582 +f 2582 2556 2424 +f 2239 2251 2434 +f 2434 2424 2239 +f 1906 1907 2251 +f 2251 2239 1906 +f 3080 3120 3126 +f 3126 3084 3080 +f 3056 3082 3120 +f 3120 3080 3056 +f 3012 3042 3082 +f 3082 3056 3012 +f 2899 2957 3042 +f 3042 3012 2899 +f 2789 2825 2957 +f 2957 2899 2789 +f 2675 2693 2825 +f 2825 2789 2675 +f 2545 2556 2693 +f 2693 2675 2545 +f 2416 2424 2556 +f 2556 2545 2416 +f 2228 2239 2424 +f 2424 2416 2228 +f 1770 1906 2239 +f 2239 2228 1770 +f 3053 3080 3084 +f 3084 3062 3053 +f 3028 3056 3080 +f 3080 3053 3028 +f 2978 3012 3056 +f 3056 3028 2978 +f 2860 2899 3012 +f 3012 2978 2860 +f 2754 2789 2899 +f 2899 2860 2754 +f 2652 2675 2789 +f 2789 2754 2652 +f 2534 2545 2675 +f 2675 2652 2534 +f 2406 2416 2545 +f 2545 2534 2406 +f 2217 2228 2416 +f 2416 2406 2217 +f 1929 1770 2228 +f 2228 2217 1929 +f 3035 3053 3062 +f 3062 3039 3035 +f 2997 3028 3053 +f 3053 3035 2997 +f 2920 2978 3028 +f 3028 2997 2920 +f 2832 2860 2978 +f 2978 2920 2832 +f 2728 2754 2860 +f 2860 2832 2728 +f 2634 2652 2754 +f 2754 2728 2634 +f 2528 2534 2652 +f 2652 2634 2528 +f 2396 2406 2534 +f 2534 2528 2396 +f 2202 2217 2406 +f 2406 2396 2202 +f 1765 1929 2217 +f 2217 2202 1765 +f 3017 3035 3039 +f 3039 3027 3017 +f 2980 2997 3035 +f 3035 3017 2980 +f 2896 2920 2997 +f 2997 2980 2896 +f 2812 2832 2920 +f 2920 2896 2812 +f 2715 2728 2832 +f 2832 2812 2715 +f 2618 2634 2728 +f 2728 2715 2618 +f 2523 2528 2634 +f 2634 2618 2523 +f 2392 2396 2528 +f 2528 2523 2392 +f 2196 2202 2396 +f 2396 2392 2196 +f 1724 1765 2202 +f 2202 2196 1724 +f 3007 3017 3027 +f 3027 3023 3007 +f 2969 2980 3017 +f 3017 3007 2969 +f 2887 2896 2980 +f 2980 2969 2887 +f 2802 2812 2896 +f 2896 2887 2802 +f 2709 2715 2812 +f 2812 2802 2709 +f 2609 2618 2715 +f 2715 2709 2609 +f 2519 2523 2618 +f 2618 2609 2519 +f 2386 2392 2523 +f 2523 2519 2386 +f 2190 2196 2392 +f 2392 2386 2190 +f 1759 1724 2196 +f 2196 2190 1759 +f 1329 1324 1785 +f 1785 1782 1329 +f 1162 1157 1324 +f 1324 1329 1162 +f 993 982 1157 +f 1157 1162 993 +f 845 838 982 +f 982 993 845 +f 669 660 838 +f 838 845 669 +f 542 535 660 +f 660 669 542 +f 490 485 535 +f 535 542 490 +f 438 429 485 +f 485 490 438 +f 404 396 429 +f 429 438 404 +f 387 376 396 +f 396 404 387 +f 1339 1329 1782 +f 1782 1780 1339 +f 1168 1162 1329 +f 1329 1339 1168 +f 1003 993 1162 +f 1162 1168 1003 +f 855 845 993 +f 993 1003 855 +f 695 669 845 +f 845 855 695 +f 559 542 669 +f 669 695 559 +f 500 490 542 +f 542 559 500 +f 446 438 490 +f 490 500 446 +f 416 404 438 +f 438 446 416 +f 408 387 404 +f 404 416 408 +f 1357 1339 1780 +f 1780 1778 1357 +f 1174 1168 1339 +f 1339 1357 1174 +f 1025 1003 1168 +f 1168 1174 1025 +f 883 855 1003 +f 1003 1025 883 +f 731 695 855 +f 855 883 731 +f 583 559 695 +f 695 731 583 +f 516 500 559 +f 559 583 516 +f 467 446 500 +f 500 516 467 +f 444 416 446 +f 446 467 444 +f 436 408 416 +f 416 444 436 +f 1371 1357 1778 +f 1778 1776 1371 +f 1188 1174 1357 +f 1357 1371 1188 +f 1042 1025 1174 +f 1174 1188 1042 +f 905 883 1025 +f 1025 1042 905 +f 769 731 883 +f 883 905 769 +f 624 583 731 +f 731 769 624 +f 532 516 583 +f 583 624 532 +f 502 467 516 +f 516 532 502 +f 459 444 467 +f 467 502 459 +f 452 436 444 +f 444 459 452 +f 1383 1371 1776 +f 1776 1774 1383 +f 1198 1188 1371 +f 1371 1383 1198 +f 1068 1042 1188 +f 1188 1198 1068 +f 929 905 1042 +f 1042 1068 929 +f 797 769 905 +f 905 929 797 +f 665 624 769 +f 769 797 665 +f 569 532 624 +f 624 665 569 +f 520 502 532 +f 532 569 520 +f 504 459 502 +f 502 520 504 +f 498 452 459 +f 459 504 498 +f 1394 1383 1774 +f 1774 1771 1394 +f 1206 1198 1383 +f 1383 1394 1206 +f 1077 1068 1198 +f 1198 1206 1077 +f 947 929 1068 +f 1068 1077 947 +f 833 797 929 +f 929 947 833 +f 723 665 797 +f 797 833 723 +f 610 569 665 +f 665 723 610 +f 549 520 569 +f 569 610 549 +f 522 504 520 +f 520 549 522 +f 518 498 504 +f 504 522 518 +f 1407 1394 1771 +f 1771 1768 1407 +f 1216 1206 1394 +f 1394 1407 1216 +f 1090 1077 1206 +f 1206 1216 1090 +f 972 947 1077 +f 1077 1090 972 +f 870 833 947 +f 947 972 870 +f 764 723 833 +f 833 870 764 +f 646 610 723 +f 723 764 646 +f 587 549 610 +f 610 646 587 +f 556 522 549 +f 549 587 556 +f 540 518 522 +f 522 556 540 +f 1420 1407 1768 +f 1768 1764 1420 +f 1226 1216 1407 +f 1407 1420 1226 +f 1096 1090 1216 +f 1216 1226 1096 +f 990 972 1090 +f 1090 1096 990 +f 896 870 972 +f 972 990 896 +f 792 764 870 +f 870 896 792 +f 704 646 764 +f 764 792 704 +f 627 587 646 +f 646 704 627 +f 582 556 587 +f 587 627 582 +f 574 540 556 +f 556 582 574 +f 1426 1420 1764 +f 1764 1762 1426 +f 1230 1226 1420 +f 1420 1426 1230 +f 1101 1096 1226 +f 1226 1230 1101 +f 1006 990 1096 +f 1096 1101 1006 +f 907 896 990 +f 990 1006 907 +f 812 792 896 +f 896 907 812 +f 728 704 792 +f 792 812 728 +f 644 627 704 +f 704 728 644 +f 607 582 627 +f 627 644 607 +f 592 574 582 +f 582 607 592 +f 1430 1426 1762 +f 1762 1758 1430 +f 1234 1230 1426 +f 1426 1430 1234 +f 1107 1101 1230 +f 1230 1234 1107 +f 1012 1006 1101 +f 1101 1107 1012 +f 912 907 1006 +f 1006 1012 912 +f 819 812 907 +f 907 912 819 +f 738 728 812 +f 812 819 738 +f 651 644 728 +f 728 738 651 +f 618 607 644 +f 644 651 618 +f 601 592 607 +f 607 618 601 +f 405 397 376 +f 376 388 405 +f 439 430 397 +f 397 405 439 +f 491 486 430 +f 430 439 491 +f 543 536 486 +f 486 491 543 +f 670 661 536 +f 536 543 670 +f 846 839 661 +f 661 670 846 +f 994 980 839 +f 839 846 994 +f 1163 1158 980 +f 980 994 1163 +f 1330 1325 1158 +f 1158 1163 1330 +f 1926 1786 1325 +f 1325 1330 1926 +f 417 405 388 +f 388 409 417 +f 447 439 405 +f 405 417 447 +f 501 491 439 +f 439 447 501 +f 560 543 491 +f 491 501 560 +f 696 670 543 +f 543 560 696 +f 856 846 670 +f 670 696 856 +f 1004 994 846 +f 846 856 1004 +f 1169 1163 994 +f 994 1004 1169 +f 1340 1330 1163 +f 1163 1169 1340 +f 1925 1926 1330 +f 1330 1340 1925 +f 445 417 409 +f 409 437 445 +f 468 447 417 +f 417 445 468 +f 517 501 447 +f 447 468 517 +f 584 560 501 +f 501 517 584 +f 732 696 560 +f 560 584 732 +f 884 856 696 +f 696 732 884 +f 1026 1004 856 +f 856 884 1026 +f 1175 1169 1004 +f 1004 1026 1175 +f 1358 1340 1169 +f 1169 1175 1358 +f 1908 1925 1340 +f 1340 1358 1908 +f 460 445 437 +f 437 453 460 +f 503 468 445 +f 445 460 503 +f 533 517 468 +f 468 503 533 +f 625 584 517 +f 517 533 625 +f 770 732 584 +f 584 625 770 +f 906 884 732 +f 732 770 906 +f 1041 1026 884 +f 884 906 1041 +f 1189 1175 1026 +f 1026 1041 1189 +f 1372 1358 1175 +f 1175 1189 1372 +f 1706 1908 1358 +f 1358 1372 1706 +f 505 460 453 +f 453 499 505 +f 521 503 460 +f 460 505 521 +f 570 533 503 +f 503 521 570 +f 666 625 533 +f 533 570 666 +f 798 770 625 +f 625 666 798 +f 930 906 770 +f 770 798 930 +f 1067 1041 906 +f 906 930 1067 +f 1199 1189 1041 +f 1041 1067 1199 +f 1384 1372 1189 +f 1189 1199 1384 +f 1705 1706 1372 +f 1372 1384 1705 +f 523 505 499 +f 499 519 523 +f 550 521 505 +f 505 523 550 +f 611 570 521 +f 521 550 611 +f 724 666 570 +f 570 611 724 +f 834 798 666 +f 666 724 834 +f 948 930 798 +f 798 834 948 +f 1078 1067 930 +f 930 948 1078 +f 1207 1199 1067 +f 1067 1078 1207 +f 1395 1384 1199 +f 1199 1207 1395 +f 1773 1705 1384 +f 1384 1395 1773 +f 555 523 519 +f 519 541 555 +f 588 550 523 +f 523 555 588 +f 645 611 550 +f 550 588 645 +f 763 724 611 +f 611 645 763 +f 869 834 724 +f 724 763 869 +f 971 948 834 +f 834 869 971 +f 1089 1078 948 +f 948 971 1089 +f 1217 1207 1078 +f 1078 1089 1217 +f 1406 1395 1207 +f 1207 1217 1406 +f 1692 1773 1395 +f 1395 1406 1692 +f 581 555 541 +f 541 573 581 +f 626 588 555 +f 555 581 626 +f 703 645 588 +f 588 626 703 +f 791 763 645 +f 645 703 791 +f 895 869 763 +f 763 791 895 +f 989 971 869 +f 869 895 989 +f 1095 1089 971 +f 971 989 1095 +f 1227 1217 1089 +f 1089 1095 1227 +f 1421 1406 1217 +f 1217 1227 1421 +f 1766 1692 1406 +f 1406 1421 1766 +f 606 581 573 +f 573 591 606 +f 643 626 581 +f 581 606 643 +f 727 703 626 +f 626 643 727 +f 811 791 703 +f 703 727 811 +f 908 895 791 +f 791 811 908 +f 1005 989 895 +f 895 908 1005 +f 1100 1095 989 +f 989 1005 1100 +f 1231 1227 1095 +f 1095 1100 1231 +f 1427 1421 1227 +f 1227 1231 1427 +f 1897 1766 1421 +f 1421 1427 1897 +f 615 606 591 +f 591 598 615 +f 653 643 606 +f 606 615 653 +f 735 727 643 +f 643 653 735 +f 820 811 727 +f 727 735 820 +f 913 908 811 +f 811 820 913 +f 1013 1005 908 +f 908 913 1013 +f 1103 1100 1005 +f 1005 1013 1103 +f 1236 1231 1100 +f 1100 1103 1236 +f 1432 1427 1231 +f 1231 1236 1432 +f 1760 1897 1427 +f 1427 1432 1760 +f 2294 2299 1786 +f 1786 1783 2294 +f 2461 2466 2299 +f 2299 2294 2461 +f 2630 2641 2466 +f 2466 2461 2630 +f 2778 2785 2641 +f 2641 2630 2778 +f 2954 2963 2785 +f 2785 2778 2954 +f 3061 3068 2963 +f 2963 2954 3061 +f 3135 3140 3068 +f 3068 3061 3135 +f 3167 3176 3140 +f 3140 3135 3167 +f 3195 3203 3176 +f 3176 3167 3195 +f 3208 3213 3203 +f 3203 3195 3208 +f 2284 2294 1783 +f 1783 1781 2284 +f 2455 2461 2294 +f 2294 2284 2455 +f 2620 2630 2461 +f 2461 2455 2620 +f 2768 2778 2630 +f 2630 2620 2768 +f 2928 2954 2778 +f 2778 2768 2928 +f 3051 3061 2954 +f 2954 2928 3051 +f 3125 3135 3061 +f 3061 3051 3125 +f 3159 3167 3135 +f 3135 3125 3159 +f 3181 3195 3167 +f 3167 3159 3181 +f 3191 3208 3195 +f 3195 3181 3191 +f 2266 2284 1781 +f 1781 1779 2266 +f 2449 2455 2284 +f 2284 2266 2449 +f 2598 2620 2455 +f 2455 2449 2598 +f 2740 2768 2620 +f 2620 2598 2740 +f 2892 2928 2768 +f 2768 2740 2892 +f 3033 3051 2928 +f 2928 2892 3033 +f 3087 3125 3051 +f 3051 3033 3087 +f 3145 3159 3125 +f 3125 3087 3145 +f 3161 3181 3159 +f 3159 3145 3161 +f 3169 3191 3181 +f 3181 3161 3169 +f 2252 2266 1779 +f 1779 1777 2252 +f 2435 2449 2266 +f 2266 2252 2435 +f 2581 2598 2449 +f 2449 2435 2581 +f 2718 2740 2598 +f 2598 2581 2718 +f 2854 2892 2740 +f 2740 2718 2854 +f 2999 3033 2892 +f 2892 2854 2999 +f 3071 3087 3033 +f 3033 2999 3071 +f 3123 3145 3087 +f 3087 3071 3123 +f 3147 3161 3145 +f 3145 3123 3147 +f 3153 3169 3161 +f 3161 3147 3153 +f 2240 2252 1777 +f 1777 1775 2240 +f 2425 2435 2252 +f 2252 2240 2425 +f 2555 2581 2435 +f 2435 2425 2555 +f 2694 2718 2581 +f 2581 2555 2694 +f 2826 2854 2718 +f 2718 2694 2826 +f 2958 2999 2854 +f 2854 2826 2958 +f 3043 3071 2999 +f 2999 2958 3043 +f 3083 3123 3071 +f 3071 3043 3083 +f 3121 3147 3123 +f 3123 3083 3121 +f 3127 3153 3147 +f 3147 3121 3127 +f 2229 2240 1775 +f 1775 1772 2229 +f 2417 2425 2240 +f 2240 2229 2417 +f 2546 2555 2425 +f 2425 2417 2546 +f 2676 2694 2555 +f 2555 2546 2676 +f 2790 2826 2694 +f 2694 2676 2790 +f 2900 2958 2826 +f 2826 2790 2900 +f 3013 3043 2958 +f 2958 2900 3013 +f 3057 3083 3043 +f 3043 3013 3057 +f 3081 3121 3083 +f 3083 3057 3081 +f 3085 3127 3121 +f 3121 3081 3085 +f 2216 2229 1772 +f 1772 1769 2216 +f 2407 2417 2229 +f 2229 2216 2407 +f 2533 2546 2417 +f 2417 2407 2533 +f 2651 2676 2546 +f 2546 2533 2651 +f 2753 2790 2676 +f 2676 2651 2753 +f 2859 2900 2790 +f 2790 2753 2859 +f 2977 3013 2900 +f 2900 2859 2977 +f 3029 3057 3013 +f 3013 2977 3029 +f 3052 3081 3057 +f 3057 3029 3052 +f 3063 3085 3081 +f 3081 3052 3063 +f 2203 2216 1769 +f 1769 1767 2203 +f 2397 2407 2216 +f 2216 2203 2397 +f 2527 2533 2407 +f 2407 2397 2527 +f 2633 2651 2533 +f 2533 2527 2633 +f 2727 2753 2651 +f 2651 2633 2727 +f 2831 2859 2753 +f 2753 2727 2831 +f 2919 2977 2859 +f 2859 2831 2919 +f 2996 3029 2977 +f 2977 2919 2996 +f 3034 3052 3029 +f 3029 2996 3034 +f 3038 3063 3052 +f 3052 3034 3038 +f 2197 2203 1767 +f 1767 1763 2197 +f 2393 2397 2203 +f 2203 2197 2393 +f 2522 2527 2397 +f 2397 2393 2522 +f 2617 2633 2527 +f 2527 2522 2617 +f 2716 2727 2633 +f 2633 2617 2716 +f 2811 2831 2727 +f 2727 2716 2811 +f 2895 2919 2831 +f 2831 2811 2895 +f 2979 2996 2919 +f 2919 2895 2979 +f 3016 3034 2996 +f 2996 2979 3016 +f 3026 3038 3034 +f 3034 3016 3026 +f 2193 2197 1763 +f 1763 1761 2193 +f 2389 2393 2197 +f 2197 2193 2389 +f 2516 2522 2393 +f 2393 2389 2516 +f 2610 2617 2522 +f 2522 2516 2610 +f 2710 2716 2617 +f 2617 2610 2710 +f 2803 2811 2716 +f 2716 2710 2803 +f 2885 2895 2811 +f 2811 2803 2885 +f 2971 2979 2895 +f 2895 2885 2971 +f 3005 3016 2979 +f 2979 2971 3005 +f 3022 3026 3016 +f 3016 3005 3022 +f 461 545 544 +f 544 456 461 +f 463 551 545 +f 545 461 463 +f 465 557 551 +f 551 463 465 +f 469 567 557 +f 557 465 469 +f 471 575 567 +f 567 469 471 +f 473 577 575 +f 575 471 473 +f 475 589 577 +f 577 473 475 +f 477 593 589 +f 589 475 477 +f 479 595 593 +f 593 477 479 +f 481 599 595 +f 595 479 481 +f 389 461 456 +f 456 392 389 +f 386 463 461 +f 461 389 386 +f 379 465 463 +f 463 386 379 +f 373 469 465 +f 465 379 373 +f 371 471 469 +f 469 373 371 +f 369 473 471 +f 471 371 369 +f 366 475 473 +f 473 369 366 +f 364 477 475 +f 475 366 364 +f 362 479 477 +f 477 364 362 +f 361 481 479 +f 479 362 361 +f 335 389 392 +f 392 337 335 +f 333 386 389 +f 389 335 333 +f 331 379 386 +f 386 333 331 +f 329 373 379 +f 379 331 329 +f 328 371 373 +f 373 329 328 +f 325 369 371 +f 371 328 325 +f 323 366 369 +f 369 325 323 +f 321 364 366 +f 366 323 321 +f 319 362 364 +f 364 321 319 +f 316 361 362 +f 362 319 316 +f 298 335 337 +f 337 302 298 +f 290 333 335 +f 335 298 290 +f 288 331 333 +f 333 290 288 +f 286 329 331 +f 331 288 286 +f 281 328 329 +f 329 286 281 +f 275 325 328 +f 328 281 275 +f 265 323 325 +f 325 275 265 +f 259 321 323 +f 323 265 259 +f 255 319 321 +f 321 259 255 +f 249 316 319 +f 319 255 249 +f 269 298 302 +f 302 271 269 +f 261 290 298 +f 298 269 261 +f 251 288 290 +f 290 261 251 +f 238 286 288 +f 288 251 238 +f 230 281 286 +f 286 238 230 +f 218 275 281 +f 281 230 218 +f 208 265 275 +f 275 218 208 +f 196 259 265 +f 265 208 196 +f 186 255 259 +f 259 196 186 +f 181 249 255 +f 255 186 181 +f 228 269 271 +f 271 234 228 +f 222 261 269 +f 269 228 222 +f 212 251 261 +f 261 222 212 +f 200 238 251 +f 251 212 200 +f 177 230 238 +f 238 200 177 +f 160 218 230 +f 230 177 160 +f 134 208 218 +f 218 160 134 +f 112 196 208 +f 208 134 112 +f 102 186 196 +f 196 112 102 +f 96 181 186 +f 186 102 96 +f 198 228 234 +f 234 205 198 +f 182 222 228 +f 228 198 182 +f 168 212 222 +f 222 182 168 +f 146 200 212 +f 212 168 146 +f 118 177 200 +f 200 146 118 +f 92 160 177 +f 177 118 92 +f 74 134 160 +f 160 92 74 +f 63 112 134 +f 134 74 63 +f 53 102 112 +f 112 63 53 +f 50 96 102 +f 102 53 50 +f 167 198 205 +f 205 170 167 +f 154 182 198 +f 198 167 154 +f 126 168 182 +f 182 154 126 +f 100 146 168 +f 168 126 100 +f 83 118 146 +f 146 100 83 +f 61 92 118 +f 118 83 61 +f 46 74 92 +f 92 61 46 +f 32 63 74 +f 74 46 32 +f 25 53 63 +f 63 32 25 +f 21 50 53 +f 53 25 21 +f 143 167 170 +f 170 150 143 +f 124 154 167 +f 167 143 124 +f 104 126 154 +f 154 124 104 +f 84 100 126 +f 126 104 84 +f 65 83 100 +f 100 84 65 +f 44 61 83 +f 83 65 44 +f 30 46 61 +f 61 44 30 +f 17 32 46 +f 46 30 17 +f 9 25 32 +f 32 17 9 +f 5 21 25 +f 25 9 5 +f 132 143 150 +f 150 140 132 +f 116 124 143 +f 143 132 116 +f 94 104 124 +f 124 116 94 +f 76 84 104 +f 104 94 76 +f 55 65 84 +f 84 76 55 +f 40 44 65 +f 65 55 40 +f 22 30 44 +f 44 40 22 +f 11 17 30 +f 30 22 11 +f 2 9 17 +f 17 11 2 +f 1 5 9 +f 9 2 1 +f 480 596 599 +f 599 481 480 +f 478 594 596 +f 596 480 478 +f 476 590 594 +f 594 478 476 +f 474 578 590 +f 590 476 474 +f 472 576 578 +f 578 474 472 +f 470 568 576 +f 576 472 470 +f 466 558 568 +f 568 470 466 +f 464 552 558 +f 558 466 464 +f 462 546 552 +f 552 464 462 +f 456 544 546 +f 546 462 456 +f 363 480 481 +f 481 360 363 +f 365 478 480 +f 480 363 365 +f 367 476 478 +f 478 365 367 +f 368 474 476 +f 476 367 368 +f 370 472 474 +f 474 368 370 +f 372 470 472 +f 472 370 372 +f 380 466 470 +f 470 372 380 +f 385 464 466 +f 466 380 385 +f 390 462 464 +f 464 385 390 +f 391 456 462 +f 462 390 391 +f 320 363 360 +f 360 316 320 +f 322 365 363 +f 363 320 322 +f 324 367 365 +f 365 322 324 +f 326 368 367 +f 367 324 326 +f 327 370 368 +f 368 326 327 +f 330 372 370 +f 370 327 330 +f 332 380 372 +f 372 330 332 +f 334 385 380 +f 380 332 334 +f 336 390 385 +f 385 334 336 +f 337 391 390 +f 390 336 337 +f 256 320 316 +f 316 250 256 +f 260 322 320 +f 320 256 260 +f 266 324 322 +f 322 260 266 +f 276 326 324 +f 324 266 276 +f 282 327 326 +f 326 276 282 +f 287 330 327 +f 327 282 287 +f 289 332 330 +f 330 287 289 +f 291 334 332 +f 332 289 291 +f 299 336 334 +f 334 291 299 +f 303 337 336 +f 336 299 303 +f 187 256 250 +f 250 181 187 +f 197 260 256 +f 256 187 197 +f 209 266 260 +f 260 197 209 +f 219 276 266 +f 266 209 219 +f 231 282 276 +f 276 219 231 +f 239 287 282 +f 282 231 239 +f 252 289 287 +f 287 239 252 +f 262 291 289 +f 289 252 262 +f 270 299 291 +f 291 262 270 +f 272 303 299 +f 299 270 272 +f 103 187 181 +f 181 97 103 +f 113 197 187 +f 187 103 113 +f 135 209 197 +f 197 113 135 +f 161 219 209 +f 209 135 161 +f 178 231 219 +f 219 161 178 +f 201 239 231 +f 231 178 201 +f 213 252 239 +f 239 201 213 +f 223 262 252 +f 252 213 223 +f 229 270 262 +f 262 223 229 +f 235 272 270 +f 270 229 235 +f 54 103 97 +f 97 50 54 +f 64 113 103 +f 103 54 64 +f 75 135 113 +f 113 64 75 +f 93 161 135 +f 135 75 93 +f 119 178 161 +f 161 93 119 +f 147 201 178 +f 178 119 147 +f 169 213 201 +f 201 147 169 +f 183 223 213 +f 213 169 183 +f 199 229 223 +f 223 183 199 +f 205 235 229 +f 229 199 205 +f 24 54 50 +f 50 21 24 +f 33 64 54 +f 54 24 33 +f 47 75 64 +f 64 33 47 +f 62 93 75 +f 75 47 62 +f 82 119 93 +f 93 62 82 +f 101 147 119 +f 119 82 101 +f 127 169 147 +f 147 101 127 +f 155 183 169 +f 169 127 155 +f 166 199 183 +f 183 155 166 +f 171 205 199 +f 199 166 171 +f 10 24 21 +f 21 6 10 +f 18 33 24 +f 24 10 18 +f 31 47 33 +f 33 18 31 +f 45 62 47 +f 47 31 45 +f 66 82 62 +f 62 45 66 +f 85 101 82 +f 82 66 85 +f 105 127 101 +f 101 85 105 +f 125 155 127 +f 127 105 125 +f 144 166 155 +f 155 125 144 +f 151 171 166 +f 166 144 151 +f 3 10 6 +f 6 1 3 +f 12 18 10 +f 10 3 12 +f 23 31 18 +f 18 12 23 +f 41 45 31 +f 31 23 41 +f 56 66 45 +f 45 41 56 +f 77 85 66 +f 66 56 77 +f 95 105 85 +f 85 77 95 +f 117 125 105 +f 105 95 117 +f 133 144 125 +f 125 117 133 +f 140 151 144 +f 144 133 140 +f 138 132 140 +f 140 145 138 +f 122 116 132 +f 132 138 122 +f 98 94 116 +f 116 122 98 +f 80 76 94 +f 94 98 80 +f 60 55 76 +f 76 80 60 +f 42 40 55 +f 55 60 42 +f 28 22 40 +f 40 42 28 +f 13 11 22 +f 22 28 13 +f 7 2 11 +f 11 13 7 +f 4 1 2 +f 2 7 4 +f 152 138 145 +f 145 158 152 +f 136 122 138 +f 138 152 136 +f 108 98 122 +f 122 136 108 +f 89 80 98 +f 98 108 89 +f 70 60 80 +f 80 89 70 +f 52 42 60 +f 60 70 52 +f 38 28 42 +f 42 52 38 +f 26 13 28 +f 28 38 26 +f 19 7 13 +f 13 26 19 +f 15 4 7 +f 7 19 15 +f 173 152 158 +f 158 176 173 +f 162 136 152 +f 152 173 162 +f 142 108 136 +f 136 162 142 +f 111 89 108 +f 108 142 111 +f 91 70 89 +f 89 111 91 +f 73 52 70 +f 70 91 73 +f 58 38 52 +f 52 73 58 +f 48 26 38 +f 38 58 48 +f 37 19 26 +f 26 48 37 +f 35 15 19 +f 19 37 35 +f 194 173 176 +f 176 202 194 +f 184 162 173 +f 173 194 184 +f 174 142 162 +f 162 184 174 +f 156 111 142 +f 142 174 156 +f 128 91 111 +f 111 156 128 +f 106 73 91 +f 91 128 106 +f 86 58 73 +f 73 106 86 +f 78 48 58 +f 58 86 78 +f 68 37 48 +f 48 78 68 +f 67 35 37 +f 37 68 67 +f 221 194 202 +f 202 225 221 +f 216 184 194 +f 194 221 216 +f 206 174 184 +f 184 216 206 +f 192 156 174 +f 174 206 192 +f 180 128 156 +f 156 192 180 +f 164 106 128 +f 128 180 164 +f 148 86 106 +f 106 164 148 +f 130 78 86 +f 86 148 130 +f 121 68 78 +f 78 130 121 +f 115 67 68 +f 68 121 115 +f 244 221 225 +f 225 247 244 +f 240 216 221 +f 221 244 240 +f 236 206 216 +f 216 240 236 +f 233 192 206 +f 206 236 233 +f 227 180 192 +f 192 233 227 +f 215 164 180 +f 180 227 215 +f 210 148 164 +f 164 215 210 +f 203 130 148 +f 148 210 203 +f 191 121 130 +f 130 203 191 +f 188 115 121 +f 121 191 188 +f 284 244 247 +f 247 285 284 +f 279 240 244 +f 244 284 279 +f 277 236 240 +f 240 279 277 +f 273 233 236 +f 236 277 273 +f 267 227 233 +f 233 273 267 +f 263 215 227 +f 227 267 263 +f 258 210 215 +f 215 263 258 +f 253 203 210 +f 210 258 253 +f 245 191 203 +f 203 253 245 +f 242 188 191 +f 191 245 242 +f 315 284 285 +f 285 318 315 +f 312 279 284 +f 284 315 312 +f 311 277 279 +f 279 312 311 +f 309 273 277 +f 277 311 309 +f 307 267 273 +f 273 309 307 +f 305 263 267 +f 267 307 305 +f 301 258 263 +f 263 305 301 +f 297 253 258 +f 258 301 297 +f 295 245 253 +f 253 297 295 +f 293 242 245 +f 245 295 293 +f 341 315 318 +f 318 339 341 +f 343 312 315 +f 315 341 343 +f 345 311 312 +f 312 343 345 +f 347 309 311 +f 311 345 347 +f 349 307 309 +f 309 347 349 +f 351 305 307 +f 307 349 351 +f 353 301 305 +f 305 351 353 +f 355 297 301 +f 301 353 355 +f 357 295 297 +f 297 355 357 +f 359 293 295 +f 295 357 359 +f 378 341 339 +f 339 376 378 +f 384 343 341 +f 341 378 384 +f 394 345 343 +f 343 384 394 +f 403 347 345 +f 345 394 403 +f 406 349 347 +f 347 403 406 +f 415 351 349 +f 349 406 415 +f 419 353 351 +f 351 415 419 +f 423 355 353 +f 353 419 423 +f 425 357 355 +f 355 423 425 +f 427 359 357 +f 357 425 427 +f 8 3 1 +f 1 4 8 +f 14 12 3 +f 3 8 14 +f 29 23 12 +f 12 14 29 +f 43 41 23 +f 23 29 43 +f 59 56 41 +f 41 43 59 +f 81 77 56 +f 56 59 81 +f 99 95 77 +f 77 81 99 +f 123 117 95 +f 95 99 123 +f 139 133 117 +f 117 123 139 +f 145 140 133 +f 133 139 145 +f 20 8 4 +f 4 16 20 +f 27 14 8 +f 8 20 27 +f 39 29 14 +f 14 27 39 +f 51 43 29 +f 29 39 51 +f 71 59 43 +f 43 51 71 +f 88 81 59 +f 59 71 88 +f 109 99 81 +f 81 88 109 +f 137 123 99 +f 99 109 137 +f 153 139 123 +f 123 137 153 +f 159 145 139 +f 139 153 159 +f 36 20 16 +f 16 34 36 +f 49 27 20 +f 20 36 49 +f 57 39 27 +f 27 49 57 +f 72 51 39 +f 39 57 72 +f 90 71 51 +f 51 72 90 +f 110 88 71 +f 71 90 110 +f 141 109 88 +f 88 110 141 +f 163 137 109 +f 109 141 163 +f 172 153 137 +f 137 163 172 +f 176 159 153 +f 153 172 176 +f 69 36 34 +f 34 67 69 +f 79 49 36 +f 36 69 79 +f 87 57 49 +f 49 79 87 +f 107 72 57 +f 57 87 107 +f 129 90 72 +f 72 107 129 +f 157 110 90 +f 90 129 157 +f 175 141 110 +f 110 157 175 +f 185 163 141 +f 141 175 185 +f 195 172 163 +f 163 185 195 +f 202 176 172 +f 172 195 202 +f 120 69 67 +f 67 114 120 +f 131 79 69 +f 69 120 131 +f 149 87 79 +f 79 131 149 +f 165 107 87 +f 87 149 165 +f 179 129 107 +f 107 165 179 +f 193 157 129 +f 129 179 193 +f 207 175 157 +f 157 193 207 +f 217 185 175 +f 175 207 217 +f 220 195 185 +f 185 217 220 +f 224 202 195 +f 195 220 224 +f 190 120 114 +f 114 189 190 +f 204 131 120 +f 120 190 204 +f 211 149 131 +f 131 204 211 +f 214 165 149 +f 149 211 214 +f 226 179 165 +f 165 214 226 +f 232 193 179 +f 179 226 232 +f 237 207 193 +f 193 232 237 +f 241 217 207 +f 207 237 241 +f 243 220 217 +f 217 241 243 +f 248 224 220 +f 220 243 248 +f 246 190 189 +f 189 242 246 +f 254 204 190 +f 190 246 254 +f 257 211 204 +f 204 254 257 +f 264 214 211 +f 211 257 264 +f 268 226 214 +f 214 264 268 +f 274 232 226 +f 226 268 274 +f 278 237 232 +f 232 274 278 +f 280 241 237 +f 237 278 280 +f 283 243 241 +f 241 280 283 +f 285 248 243 +f 243 283 285 +f 294 246 242 +f 242 292 294 +f 296 254 246 +f 246 294 296 +f 300 257 254 +f 254 296 300 +f 304 264 257 +f 257 300 304 +f 306 268 264 +f 264 304 306 +f 308 274 268 +f 268 306 308 +f 310 278 274 +f 274 308 310 +f 313 280 278 +f 278 310 313 +f 314 283 280 +f 280 313 314 +f 317 285 283 +f 283 314 317 +f 356 294 292 +f 292 358 356 +f 354 296 294 +f 294 356 354 +f 352 300 296 +f 296 354 352 +f 350 304 300 +f 300 352 350 +f 348 306 304 +f 304 350 348 +f 346 308 306 +f 306 348 346 +f 344 310 308 +f 308 346 344 +f 342 313 310 +f 310 344 342 +f 340 314 313 +f 313 342 340 +f 338 317 314 +f 314 340 338 +f 424 356 358 +f 358 426 424 +f 422 354 356 +f 356 424 422 +f 418 352 354 +f 354 422 418 +f 414 350 352 +f 352 418 414 +f 407 348 350 +f 350 414 407 +f 402 346 348 +f 348 407 402 +f 393 344 346 +f 346 402 393 +f 383 342 344 +f 344 393 383 +f 377 340 342 +f 342 383 377 +f 375 338 340 +f 340 377 375 +f 3186 3113 3115 +f 3115 3182 3186 +f 3192 3110 3113 +f 3113 3186 3192 +f 3196 3109 3110 +f 3110 3192 3196 +f 3205 3106 3109 +f 3109 3196 3205 +f 3211 3104 3106 +f 3106 3205 3211 +f 3215 3102 3104 +f 3104 3211 3215 +f 3217 3101 3102 +f 3102 3215 3217 +f 3220 3098 3101 +f 3101 3217 3220 +f 3222 3097 3098 +f 3098 3220 3222 +f 3223 3095 3097 +f 3097 3222 3223 +f 3227 3186 3182 +f 3182 3225 3227 +f 3229 3192 3186 +f 3186 3227 3229 +f 3231 3196 3192 +f 3192 3229 3231 +f 3233 3205 3196 +f 3196 3231 3233 +f 3235 3211 3205 +f 3205 3233 3235 +f 3241 3215 3211 +f 3211 3235 3241 +f 3245 3217 3215 +f 3215 3241 3245 +f 3249 3220 3217 +f 3217 3245 3249 +f 3251 3222 3220 +f 3220 3249 3251 +f 3253 3223 3222 +f 3222 3251 3253 +f 3239 3227 3225 +f 3225 3237 3239 +f 3243 3229 3227 +f 3227 3239 3243 +f 3247 3231 3229 +f 3229 3243 3247 +f 3257 3233 3231 +f 3231 3247 3257 +f 3263 3235 3233 +f 3233 3257 3263 +f 3271 3241 3235 +f 3235 3263 3271 +f 3279 3245 3241 +f 3241 3271 3279 +f 3285 3249 3245 +f 3245 3279 3285 +f 3293 3251 3249 +f 3249 3285 3293 +f 3297 3253 3251 +f 3251 3293 3297 +f 3259 3239 3237 +f 3237 3255 3259 +f 3261 3243 3239 +f 3239 3259 3261 +f 3265 3247 3243 +f 3243 3261 3265 +f 3275 3257 3247 +f 3247 3265 3275 +f 3287 3263 3257 +f 3257 3275 3287 +f 3303 3271 3263 +f 3263 3287 3303 +f 3314 3279 3271 +f 3271 3303 3314 +f 3320 3285 3279 +f 3279 3314 3320 +f 3330 3293 3285 +f 3285 3320 3330 +f 3332 3297 3293 +f 3293 3330 3332 +f 3270 3259 3255 +f 3255 3268 3270 +f 3273 3261 3259 +f 3259 3270 3273 +f 3283 3265 3261 +f 3261 3273 3283 +f 3299 3275 3265 +f 3265 3283 3299 +f 3308 3287 3275 +f 3275 3299 3308 +f 3322 3303 3287 +f 3287 3308 3322 +f 3338 3314 3303 +f 3303 3322 3338 +f 3346 3320 3314 +f 3314 3338 3346 +f 3351 3330 3320 +f 3320 3346 3351 +f 3355 3332 3330 +f 3330 3351 3355 +f 3282 3270 3268 +f 3268 3278 3282 +f 3290 3273 3270 +f 3270 3282 3290 +f 3302 3283 3273 +f 3273 3290 3302 +f 3312 3299 3283 +f 3283 3302 3312 +f 3324 3308 3299 +f 3299 3312 3324 +f 3340 3322 3308 +f 3308 3324 3340 +f 3353 3338 3322 +f 3322 3340 3353 +f 3368 3346 3338 +f 3338 3353 3368 +f 3373 3351 3346 +f 3346 3368 3373 +f 3379 3355 3351 +f 3351 3373 3379 +f 3295 3282 3278 +f 3278 3292 3295 +f 3306 3290 3282 +f 3282 3295 3306 +f 3316 3302 3290 +f 3290 3306 3316 +f 3326 3312 3302 +f 3302 3316 3326 +f 3345 3324 3312 +f 3312 3326 3345 +f 3359 3340 3324 +f 3324 3345 3359 +f 3376 3353 3340 +f 3340 3359 3376 +f 3394 3368 3353 +f 3353 3376 3394 +f 3404 3373 3368 +f 3368 3394 3404 +f 3406 3379 3373 +f 3373 3404 3406 +f 3310 3295 3292 +f 3292 3307 3310 +f 3318 3306 3295 +f 3295 3310 3318 +f 3336 3316 3306 +f 3306 3318 3336 +f 3348 3326 3316 +f 3316 3336 3348 +f 3369 3345 3326 +f 3326 3348 3369 +f 3389 3359 3345 +f 3345 3369 3389 +f 3425 3376 3359 +f 3359 3389 3425 +f 3449 3394 3376 +f 3376 3425 3449 +f 3468 3404 3394 +f 3394 3449 3468 +f 3472 3406 3404 +f 3404 3468 3472 +f 3335 3310 3307 +f 3307 3329 3335 +f 3343 3318 3310 +f 3310 3335 3343 +f 3362 3336 3318 +f 3318 3343 3362 +f 3386 3348 3336 +f 3336 3362 3386 +f 3422 3369 3348 +f 3348 3386 3422 +f 3464 3389 3369 +f 3369 3422 3464 +f 3490 3425 3389 +f 3389 3464 3490 +f 3505 3449 3425 +f 3425 3490 3505 +f 3521 3468 3449 +f 3449 3505 3521 +f 3523 3472 3468 +f 3468 3521 3523 +f 3364 3335 3329 +f 3329 3357 3364 +f 3382 3343 3335 +f 3335 3364 3382 +f 3416 3362 3343 +f 3343 3382 3416 +f 3465 3386 3362 +f 3362 3416 3465 +f 3495 3422 3386 +f 3386 3465 3495 +f 3528 3464 3422 +f 3422 3495 3528 +f 3553 3490 3464 +f 3464 3528 3553 +f 3579 3505 3490 +f 3490 3553 3579 +f 3592 3521 3505 +f 3505 3579 3592 +f 3604 3523 3521 +f 3521 3592 3604 +f 3221 3096 3094 +f 3094 3224 3221 +f 3219 3099 3096 +f 3096 3221 3219 +f 3218 3100 3099 +f 3099 3219 3218 +f 3216 3103 3100 +f 3100 3218 3216 +f 3212 3105 3103 +f 3103 3216 3212 +f 3206 3107 3105 +f 3105 3212 3206 +f 3197 3108 3107 +f 3107 3206 3197 +f 3193 3111 3108 +f 3108 3197 3193 +f 3187 3112 3111 +f 3111 3193 3187 +f 3183 3114 3112 +f 3112 3187 3183 +f 3252 3221 3224 +f 3224 3254 3252 +f 3250 3219 3221 +f 3221 3252 3250 +f 3246 3218 3219 +f 3219 3250 3246 +f 3242 3216 3218 +f 3218 3246 3242 +f 3236 3212 3216 +f 3216 3242 3236 +f 3234 3206 3212 +f 3212 3236 3234 +f 3232 3197 3206 +f 3206 3234 3232 +f 3230 3193 3197 +f 3197 3232 3230 +f 3228 3187 3193 +f 3193 3230 3228 +f 3226 3183 3187 +f 3187 3228 3226 +f 3294 3252 3254 +f 3254 3298 3294 +f 3286 3250 3252 +f 3252 3294 3286 +f 3280 3246 3250 +f 3250 3286 3280 +f 3272 3242 3246 +f 3246 3280 3272 +f 3264 3236 3242 +f 3242 3272 3264 +f 3258 3234 3236 +f 3236 3264 3258 +f 3248 3232 3234 +f 3234 3258 3248 +f 3244 3230 3232 +f 3232 3248 3244 +f 3240 3228 3230 +f 3230 3244 3240 +f 3238 3226 3228 +f 3228 3240 3238 +f 3331 3294 3298 +f 3298 3333 3331 +f 3321 3286 3294 +f 3294 3331 3321 +f 3315 3280 3286 +f 3286 3321 3315 +f 3304 3272 3280 +f 3280 3315 3304 +f 3288 3264 3272 +f 3272 3304 3288 +f 3276 3258 3264 +f 3264 3288 3276 +f 3266 3248 3258 +f 3258 3276 3266 +f 3262 3244 3248 +f 3248 3266 3262 +f 3260 3240 3244 +f 3244 3262 3260 +f 3256 3238 3240 +f 3240 3260 3256 +f 3350 3331 3333 +f 3333 3354 3350 +f 3347 3321 3331 +f 3331 3350 3347 +f 3339 3315 3321 +f 3321 3347 3339 +f 3323 3304 3315 +f 3315 3339 3323 +f 3309 3288 3304 +f 3304 3323 3309 +f 3300 3276 3288 +f 3288 3309 3300 +f 3284 3266 3276 +f 3276 3300 3284 +f 3274 3262 3266 +f 3266 3284 3274 +f 3269 3260 3262 +f 3262 3274 3269 +f 3267 3256 3260 +f 3260 3269 3267 +f 3372 3350 3354 +f 3354 3378 3372 +f 3367 3347 3350 +f 3350 3372 3367 +f 3352 3339 3347 +f 3347 3367 3352 +f 3341 3323 3339 +f 3339 3352 3341 +f 3325 3309 3323 +f 3323 3341 3325 +f 3313 3300 3309 +f 3309 3325 3313 +f 3301 3284 3300 +f 3300 3313 3301 +f 3289 3274 3284 +f 3284 3301 3289 +f 3281 3269 3274 +f 3274 3289 3281 +f 3277 3267 3269 +f 3269 3281 3277 +f 3403 3372 3378 +f 3378 3405 3403 +f 3393 3367 3372 +f 3372 3403 3393 +f 3377 3352 3367 +f 3367 3393 3377 +f 3360 3341 3352 +f 3352 3377 3360 +f 3344 3325 3341 +f 3341 3360 3344 +f 3327 3313 3325 +f 3325 3344 3327 +f 3317 3301 3313 +f 3313 3327 3317 +f 3305 3289 3301 +f 3301 3317 3305 +f 3296 3281 3289 +f 3289 3305 3296 +f 3291 3277 3281 +f 3281 3296 3291 +f 3469 3403 3405 +f 3405 3472 3469 +f 3450 3393 3403 +f 3403 3469 3450 +f 3426 3377 3393 +f 3393 3450 3426 +f 3390 3360 3377 +f 3377 3426 3390 +f 3370 3344 3360 +f 3360 3390 3370 +f 3349 3327 3344 +f 3344 3370 3349 +f 3337 3317 3327 +f 3327 3349 3337 +f 3319 3305 3317 +f 3317 3337 3319 +f 3311 3296 3305 +f 3305 3319 3311 +f 3307 3291 3296 +f 3296 3311 3307 +f 3520 3469 3472 +f 3472 3522 3520 +f 3504 3450 3469 +f 3469 3520 3504 +f 3489 3426 3450 +f 3450 3504 3489 +f 3463 3390 3426 +f 3426 3489 3463 +f 3421 3370 3390 +f 3390 3463 3421 +f 3385 3349 3370 +f 3370 3421 3385 +f 3361 3337 3349 +f 3349 3385 3361 +f 3342 3319 3337 +f 3337 3361 3342 +f 3334 3311 3319 +f 3319 3342 3334 +f 3328 3307 3311 +f 3311 3334 3328 +f 3591 3520 3522 +f 3522 3603 3591 +f 3578 3504 3520 +f 3520 3591 3578 +f 3552 3489 3504 +f 3504 3578 3552 +f 3530 3463 3489 +f 3489 3552 3530 +f 3499 3421 3463 +f 3463 3530 3499 +f 3467 3385 3421 +f 3421 3499 3467 +f 3415 3361 3385 +f 3385 3467 3415 +f 3381 3342 3361 +f 3361 3415 3381 +f 3363 3334 3342 +f 3342 3381 3363 +f 3356 3328 3334 +f 3334 3363 3356 +f 3374 3365 3358 +f 3358 3371 3374 +f 3395 3383 3365 +f 3365 3374 3395 +f 3443 3417 3383 +f 3383 3395 3443 +f 3481 3466 3417 +f 3417 3443 3481 +f 3514 3496 3466 +f 3466 3481 3514 +f 3545 3529 3496 +f 3496 3514 3545 +f 3573 3551 3529 +f 3529 3545 3573 +f 3597 3577 3551 +f 3551 3573 3597 +f 3613 3590 3577 +f 3577 3597 3613 +f 3619 3603 3590 +f 3590 3613 3619 +f 3387 3374 3371 +f 3371 3380 3387 +f 3413 3395 3374 +f 3374 3387 3413 +f 3461 3443 3395 +f 3395 3413 3461 +f 3493 3481 3443 +f 3443 3461 3493 +f 3524 3514 3481 +f 3481 3493 3524 +f 3556 3545 3514 +f 3514 3524 3556 +f 3584 3573 3545 +f 3545 3556 3584 +f 3611 3597 3573 +f 3573 3584 3611 +f 3628 3613 3597 +f 3597 3611 3628 +f 3632 3619 3613 +f 3613 3628 3632 +f 3398 3387 3380 +f 3380 3391 3398 +f 3435 3413 3387 +f 3387 3398 3435 +f 3473 3461 3413 +f 3413 3435 3473 +f 3500 3493 3461 +f 3461 3473 3500 +f 3531 3524 3493 +f 3493 3500 3531 +f 3562 3556 3524 +f 3524 3531 3562 +f 3595 3584 3556 +f 3556 3562 3595 +f 3617 3611 3584 +f 3584 3595 3617 +f 3633 3628 3611 +f 3611 3617 3633 +f 3641 3632 3628 +f 3628 3633 3641 +f 3409 3398 3391 +f 3391 3400 3409 +f 3447 3435 3398 +f 3398 3409 3447 +f 3477 3473 3435 +f 3435 3447 3477 +f 3506 3500 3473 +f 3473 3477 3506 +f 3540 3531 3500 +f 3500 3506 3540 +f 3567 3562 3531 +f 3531 3540 3567 +f 3601 3595 3562 +f 3562 3567 3601 +f 3624 3617 3595 +f 3595 3601 3624 +f 3639 3633 3617 +f 3617 3624 3639 +f 3644 3641 3633 +f 3633 3639 3644 +f 3433 3409 3400 +f 3400 3411 3433 +f 3453 3447 3409 +f 3409 3433 3453 +f 3483 3477 3447 +f 3447 3453 3483 +f 3510 3506 3477 +f 3477 3483 3510 +f 3543 3540 3506 +f 3506 3510 3543 +f 3569 3567 3540 +f 3540 3543 3569 +f 3599 3601 3567 +f 3567 3569 3599 +f 3622 3624 3601 +f 3601 3599 3622 +f 3637 3639 3624 +f 3624 3622 3637 +f 3642 3644 3639 +f 3639 3637 3642 +f 3439 3433 3411 +f 3411 3424 3439 +f 3458 3453 3433 +f 3433 3439 3458 +f 3487 3483 3453 +f 3453 3458 3487 +f 3513 3510 3483 +f 3483 3487 3513 +f 3542 3543 3510 +f 3510 3513 3542 +f 3566 3569 3543 +f 3543 3542 3566 +f 3593 3599 3569 +f 3569 3566 3593 +f 3616 3622 3599 +f 3599 3593 3616 +f 3630 3637 3622 +f 3622 3616 3630 +f 3636 3642 3637 +f 3637 3630 3636 +f 3441 3439 3424 +f 3424 3429 3441 +f 3459 3458 3439 +f 3439 3441 3459 +f 3485 3487 3458 +f 3458 3459 3485 +f 3508 3513 3487 +f 3487 3485 3508 +f 3533 3542 3513 +f 3513 3508 3533 +f 3558 3566 3542 +f 3542 3533 3558 +f 3582 3593 3566 +f 3566 3558 3582 +f 3607 3616 3593 +f 3593 3582 3607 +f 3620 3630 3616 +f 3616 3607 3620 +f 3626 3636 3630 +f 3630 3620 3626 +f 3437 3441 3429 +f 3429 3427 3437 +f 3455 3459 3441 +f 3441 3437 3455 +f 3479 3485 3459 +f 3459 3455 3479 +f 3502 3508 3485 +f 3485 3479 3502 +f 3526 3533 3508 +f 3508 3502 3526 +f 3547 3558 3533 +f 3533 3526 3547 +f 3571 3582 3558 +f 3558 3547 3571 +f 3588 3607 3582 +f 3582 3571 3588 +f 3605 3620 3607 +f 3607 3588 3605 +f 3609 3626 3620 +f 3620 3605 3609 +f 3419 3437 3427 +f 3427 3408 3419 +f 3445 3455 3437 +f 3437 3419 3445 +f 3470 3479 3455 +f 3455 3445 3470 +f 3492 3502 3479 +f 3479 3470 3492 +f 3517 3526 3502 +f 3502 3492 3517 +f 3536 3547 3526 +f 3526 3517 3536 +f 3554 3571 3547 +f 3547 3536 3554 +f 3575 3588 3571 +f 3571 3554 3575 +f 3580 3605 3588 +f 3588 3575 3580 +f 3587 3609 3605 +f 3605 3580 3587 +f 3401 3419 3408 +f 3408 3397 3401 +f 3431 3445 3419 +f 3419 3401 3431 +f 3451 3470 3445 +f 3445 3431 3451 +f 3475 3492 3470 +f 3470 3451 3475 +f 3497 3517 3492 +f 3492 3475 3497 +f 3518 3536 3517 +f 3517 3497 3518 +f 3537 3554 3536 +f 3536 3518 3537 +f 3549 3575 3554 +f 3554 3537 3549 +f 3560 3580 3575 +f 3575 3549 3560 +f 3564 3587 3580 +f 3580 3560 3564 +f 3614 3591 3603 +f 3603 3619 3614 +f 3598 3578 3591 +f 3591 3614 3598 +f 3574 3552 3578 +f 3578 3598 3574 +f 3546 3530 3552 +f 3552 3574 3546 +f 3515 3499 3530 +f 3530 3546 3515 +f 3482 3467 3499 +f 3499 3515 3482 +f 3444 3418 3467 +f 3467 3482 3444 +f 3396 3384 3418 +f 3418 3444 3396 +f 3375 3366 3384 +f 3384 3396 3375 +f 3371 3358 3366 +f 3366 3375 3371 +f 3629 3614 3619 +f 3619 3632 3629 +f 3612 3598 3614 +f 3614 3629 3612 +f 3585 3574 3598 +f 3598 3612 3585 +f 3557 3546 3574 +f 3574 3585 3557 +f 3525 3515 3546 +f 3546 3557 3525 +f 3494 3482 3515 +f 3515 3525 3494 +f 3462 3444 3482 +f 3482 3494 3462 +f 3414 3396 3444 +f 3444 3462 3414 +f 3388 3375 3396 +f 3396 3414 3388 +f 3380 3371 3375 +f 3375 3388 3380 +f 3634 3629 3632 +f 3632 3641 3634 +f 3618 3612 3629 +f 3629 3634 3618 +f 3596 3585 3612 +f 3612 3618 3596 +f 3563 3557 3585 +f 3585 3596 3563 +f 3532 3525 3557 +f 3557 3563 3532 +f 3501 3494 3525 +f 3525 3532 3501 +f 3474 3462 3494 +f 3494 3501 3474 +f 3436 3414 3462 +f 3462 3474 3436 +f 3399 3388 3414 +f 3414 3436 3399 +f 3392 3380 3388 +f 3388 3399 3392 +f 3640 3634 3641 +f 3641 3644 3640 +f 3625 3618 3634 +f 3634 3640 3625 +f 3602 3596 3618 +f 3618 3625 3602 +f 3568 3563 3596 +f 3596 3602 3568 +f 3539 3532 3563 +f 3563 3568 3539 +f 3507 3501 3532 +f 3532 3539 3507 +f 3478 3474 3501 +f 3501 3507 3478 +f 3448 3436 3474 +f 3474 3478 3448 +f 3410 3399 3436 +f 3436 3448 3410 +f 3400 3392 3399 +f 3399 3410 3400 +f 3638 3640 3644 +f 3644 3643 3638 +f 3623 3625 3640 +f 3640 3638 3623 +f 3600 3602 3625 +f 3625 3623 3600 +f 3570 3568 3602 +f 3602 3600 3570 +f 3544 3539 3568 +f 3568 3570 3544 +f 3511 3507 3539 +f 3539 3544 3511 +f 3484 3478 3507 +f 3507 3511 3484 +f 3454 3448 3478 +f 3478 3484 3454 +f 3434 3410 3448 +f 3448 3454 3434 +f 3412 3400 3410 +f 3410 3434 3412 +f 3631 3638 3643 +f 3643 3635 3631 +f 3615 3623 3638 +f 3638 3631 3615 +f 3594 3600 3623 +f 3623 3615 3594 +f 3565 3570 3600 +f 3600 3594 3565 +f 3541 3544 3570 +f 3570 3565 3541 +f 3512 3511 3544 +f 3544 3541 3512 +f 3488 3484 3511 +f 3511 3512 3488 +f 3457 3454 3484 +f 3484 3488 3457 +f 3440 3434 3454 +f 3454 3457 3440 +f 3423 3412 3434 +f 3434 3440 3423 +f 3621 3631 3635 +f 3635 3627 3621 +f 3608 3615 3631 +f 3631 3621 3608 +f 3583 3594 3615 +f 3615 3608 3583 +f 3559 3565 3594 +f 3594 3583 3559 +f 3534 3541 3565 +f 3565 3559 3534 +f 3509 3512 3541 +f 3541 3534 3509 +f 3486 3488 3512 +f 3512 3509 3486 +f 3460 3457 3488 +f 3488 3486 3460 +f 3442 3440 3457 +f 3457 3460 3442 +f 3430 3423 3440 +f 3440 3442 3430 +f 3606 3621 3627 +f 3627 3610 3606 +f 3589 3608 3621 +f 3621 3606 3589 +f 3572 3583 3608 +f 3608 3589 3572 +f 3548 3559 3583 +f 3583 3572 3548 +f 3527 3534 3559 +f 3559 3548 3527 +f 3503 3509 3534 +f 3534 3527 3503 +f 3480 3486 3509 +f 3509 3503 3480 +f 3456 3460 3486 +f 3486 3480 3456 +f 3438 3442 3460 +f 3460 3456 3438 +f 3428 3430 3442 +f 3442 3438 3428 +f 3581 3606 3610 +f 3610 3586 3581 +f 3576 3589 3606 +f 3606 3581 3576 +f 3555 3572 3589 +f 3589 3576 3555 +f 3535 3548 3572 +f 3572 3555 3535 +f 3516 3527 3548 +f 3548 3535 3516 +f 3491 3503 3527 +f 3527 3516 3491 +f 3471 3480 3503 +f 3503 3491 3471 +f 3446 3456 3480 +f 3480 3471 3446 +f 3420 3438 3456 +f 3456 3446 3420 +f 3407 3428 3438 +f 3438 3420 3407 +f 3561 3581 3586 +f 3586 3564 3561 +f 3550 3576 3581 +f 3581 3561 3550 +f 3538 3555 3576 +f 3576 3550 3538 +f 3519 3535 3555 +f 3555 3538 3519 +f 3498 3516 3535 +f 3535 3519 3498 +f 3476 3491 3516 +f 3516 3498 3476 +f 3452 3471 3491 +f 3491 3476 3452 +f 3432 3446 3471 +f 3471 3452 3432 +f 3402 3420 3446 +f 3446 3432 3402 +f 3397 3407 3420 +f 3420 3402 3397 +f 1888 2110 2104 +f 1888 2104 2096 +f 1888 2096 2076 +f 1888 2076 2048 +f 1888 2048 2030 +f 1888 2030 2006 +f 1888 2006 1982 +f 1888 1982 1960 +f 1888 1960 1936 +f 1888 1936 1732 +f 2257 2104 2110 +f 2110 2261 2257 +f 2249 2096 2104 +f 2104 2257 2249 +f 2226 2076 2096 +f 2096 2249 2226 +f 2200 2048 2076 +f 2076 2226 2200 +f 2142 2030 2048 +f 2048 2200 2142 +f 2094 2006 2030 +f 2030 2142 2094 +f 2036 1982 2006 +f 2006 2094 2036 +f 1988 1960 1982 +f 1982 2036 1988 +f 1948 1936 1960 +f 1960 1988 1948 +f 1728 1732 1936 +f 1936 1948 1728 +f 2310 2257 2261 +f 2261 2315 2310 +f 2300 2249 2257 +f 2257 2310 2300 +f 2279 2226 2249 +f 2249 2300 2279 +f 2243 2200 2226 +f 2226 2279 2243 +f 2204 2142 2200 +f 2200 2243 2204 +f 2132 2094 2142 +f 2142 2204 2132 +f 2067 2036 2094 +f 2094 2132 2067 +f 2000 1988 2036 +f 2036 2067 2000 +f 1956 1948 1988 +f 1988 2000 1956 +f 1734 1728 1948 +f 1948 1956 1734 +f 2312 2310 2315 +f 2315 2316 2312 +f 2302 2300 2310 +f 2310 2312 2302 +f 2281 2279 2300 +f 2300 2302 2281 +f 2245 2243 2279 +f 2279 2281 2245 +f 2206 2204 2243 +f 2243 2245 2206 +f 2134 2132 2204 +f 2204 2206 2134 +f 2068 2067 2132 +f 2132 2134 2068 +f 2002 2000 2067 +f 2067 2068 2002 +f 1958 1956 2000 +f 2000 2002 1958 +f 1878 1734 1956 +f 1956 1958 1878 +f 2285 2312 2316 +f 2316 2289 2285 +f 2259 2302 2312 +f 2312 2285 2259 +f 2241 2281 2302 +f 2302 2259 2241 +f 2214 2245 2281 +f 2281 2241 2214 +f 2168 2206 2245 +f 2245 2214 2168 +f 2106 2134 2206 +f 2206 2168 2106 +f 2042 2068 2134 +f 2134 2106 2042 +f 1994 2002 2068 +f 2068 2042 1994 +f 1952 1958 2002 +f 2002 1994 1952 +f 1731 1878 1958 +f 1958 1952 1731 +f 2220 2285 2289 +f 2289 2225 2220 +f 2210 2259 2285 +f 2285 2220 2210 +f 2186 2241 2259 +f 2259 2210 2186 +f 2146 2214 2241 +f 2241 2186 2146 +f 2108 2168 2214 +f 2214 2146 2108 +f 2060 2106 2168 +f 2168 2108 2060 +f 2018 2042 2106 +f 2106 2060 2018 +f 1978 1994 2042 +f 2042 2018 1978 +f 1944 1952 1994 +f 1994 1978 1944 +f 1727 1731 1952 +f 1952 1944 1727 +f 2141 2220 2225 +f 2225 2145 2141 +f 2127 2210 2220 +f 2220 2141 2127 +f 2112 2186 2210 +f 2210 2127 2112 +f 2084 2146 2186 +f 2186 2112 2084 +f 2044 2108 2146 +f 2146 2084 2044 +f 2024 2060 2108 +f 2108 2044 2024 +f 1992 2018 2060 +f 2060 2024 1992 +f 1970 1978 2018 +f 2018 1992 1970 +f 1942 1944 1978 +f 1978 1970 1942 +f 1721 1727 1944 +f 1944 1942 1721 +f 2079 2141 2145 +f 2145 2087 2079 +f 2075 2127 2141 +f 2141 2079 2075 +f 2055 2112 2127 +f 2127 2075 2055 +f 2039 2084 2112 +f 2112 2055 2039 +f 2021 2044 2084 +f 2084 2039 2021 +f 1996 2024 2044 +f 2044 2021 1996 +f 1974 1992 2024 +f 2024 1996 1974 +f 1954 1970 1992 +f 1992 1974 1954 +f 1934 1942 1970 +f 1970 1954 1934 +f 1720 1721 1942 +f 1942 1934 1720 +f 2063 2079 2087 +f 2087 2071 2063 +f 2051 2075 2079 +f 2079 2063 2051 +f 2041 2055 2075 +f 2075 2051 2041 +f 2029 2039 2055 +f 2055 2041 2029 +f 2013 2021 2039 +f 2039 2029 2013 +f 1991 1996 2021 +f 2021 2013 1991 +f 1972 1974 1996 +f 1996 1991 1972 +f 1950 1954 1974 +f 1974 1972 1950 +f 1932 1934 1954 +f 1954 1950 1932 +f 1701 1720 1934 +f 1934 1932 1701 +f 2115 2063 2071 +f 2071 2123 2115 +f 2101 2051 2063 +f 2063 2115 2101 +f 2081 2041 2051 +f 2051 2101 2081 +f 2057 2029 2041 +f 2041 2081 2057 +f 2033 2013 2029 +f 2029 2057 2033 +f 2009 1991 2013 +f 2013 2033 2009 +f 1984 1972 1991 +f 1991 2009 1984 +f 1964 1950 1972 +f 1972 1984 1964 +f 1938 1932 1950 +f 1950 1964 1938 +f 1698 1701 1932 +f 1932 1938 1698 +f 1888 1886 1686 +f 1888 1686 1662 +f 1888 1662 1640 +f 1888 1640 1616 +f 1888 1616 1592 +f 1888 1592 1574 +f 1888 1574 1546 +f 1888 1546 1526 +f 1888 1526 1518 +f 1888 1518 1512 +f 1674 1686 1886 +f 1886 1884 1674 +f 1634 1662 1686 +f 1686 1674 1634 +f 1586 1640 1662 +f 1662 1634 1586 +f 1528 1616 1640 +f 1640 1586 1528 +f 1480 1592 1616 +f 1616 1528 1480 +f 1422 1574 1592 +f 1592 1480 1422 +f 1396 1546 1574 +f 1574 1422 1396 +f 1373 1526 1546 +f 1546 1396 1373 +f 1365 1518 1526 +f 1526 1373 1365 +f 1361 1512 1518 +f 1518 1365 1361 +f 1666 1674 1884 +f 1884 1882 1666 +f 1622 1634 1674 +f 1674 1666 1622 +f 1557 1586 1634 +f 1634 1622 1557 +f 1490 1528 1586 +f 1586 1557 1490 +f 1418 1480 1528 +f 1528 1490 1418 +f 1379 1422 1480 +f 1480 1418 1379 +f 1343 1396 1422 +f 1422 1379 1343 +f 1322 1373 1396 +f 1396 1343 1322 +f 1312 1365 1373 +f 1373 1322 1312 +f 1309 1361 1365 +f 1365 1312 1309 +f 1664 1666 1882 +f 1882 1879 1664 +f 1620 1622 1666 +f 1666 1664 1620 +f 1554 1557 1622 +f 1622 1620 1554 +f 1488 1490 1557 +f 1557 1554 1488 +f 1416 1418 1490 +f 1490 1488 1416 +f 1377 1379 1418 +f 1418 1416 1377 +f 1341 1343 1379 +f 1379 1377 1341 +f 1320 1322 1343 +f 1343 1341 1320 +f 1310 1312 1322 +f 1322 1320 1310 +f 1306 1309 1312 +f 1312 1310 1306 +f 1670 1664 1879 +f 1879 1876 1670 +f 1628 1620 1664 +f 1664 1670 1628 +f 1580 1554 1620 +f 1620 1628 1580 +f 1516 1488 1554 +f 1554 1580 1516 +f 1454 1416 1488 +f 1488 1516 1454 +f 1408 1377 1416 +f 1416 1454 1408 +f 1381 1341 1377 +f 1377 1408 1381 +f 1363 1320 1341 +f 1341 1381 1363 +f 1337 1310 1320 +f 1320 1363 1337 +f 1333 1306 1310 +f 1310 1337 1333 +f 1678 1670 1876 +f 1876 1874 1678 +f 1644 1628 1670 +f 1670 1678 1644 +f 1604 1580 1628 +f 1628 1644 1604 +f 1562 1516 1580 +f 1580 1604 1562 +f 1514 1454 1516 +f 1516 1562 1514 +f 1476 1408 1454 +f 1454 1514 1476 +f 1436 1381 1408 +f 1408 1476 1436 +f 1412 1363 1381 +f 1381 1436 1412 +f 1402 1337 1363 +f 1363 1412 1402 +f 1399 1333 1337 +f 1337 1402 1399 +f 1680 1678 1874 +f 1874 1872 1680 +f 1652 1644 1678 +f 1678 1680 1652 +f 1630 1604 1644 +f 1644 1652 1630 +f 1598 1562 1604 +f 1604 1630 1598 +f 1578 1514 1562 +f 1562 1598 1578 +f 1538 1476 1514 +f 1514 1578 1538 +f 1510 1436 1476 +f 1476 1538 1510 +f 1497 1412 1436 +f 1436 1510 1497 +f 1483 1402 1412 +f 1412 1497 1483 +f 1479 1399 1402 +f 1402 1483 1479 +f 1688 1680 1872 +f 1872 1870 1688 +f 1668 1652 1680 +f 1680 1688 1668 +f 1648 1630 1652 +f 1652 1668 1648 +f 1626 1598 1630 +f 1630 1648 1626 +f 1603 1578 1598 +f 1598 1626 1603 +f 1585 1538 1578 +f 1578 1603 1585 +f 1569 1510 1538 +f 1538 1585 1569 +f 1549 1497 1510 +f 1510 1569 1549 +f 1545 1483 1497 +f 1497 1549 1545 +f 1537 1479 1483 +f 1483 1545 1537 +f 1690 1688 1870 +f 1870 1868 1690 +f 1672 1668 1688 +f 1688 1690 1672 +f 1650 1648 1668 +f 1668 1672 1650 +f 1633 1626 1648 +f 1648 1650 1633 +f 1611 1603 1626 +f 1626 1633 1611 +f 1595 1585 1603 +f 1603 1611 1595 +f 1583 1569 1585 +f 1585 1595 1583 +f 1573 1549 1569 +f 1569 1583 1573 +f 1561 1545 1549 +f 1549 1573 1561 +f 1553 1537 1545 +f 1545 1561 1553 +f 1684 1690 1868 +f 1868 1865 1684 +f 1658 1672 1690 +f 1690 1684 1658 +f 1638 1650 1672 +f 1672 1658 1638 +f 1615 1633 1650 +f 1650 1638 1615 +f 1591 1611 1633 +f 1633 1615 1591 +f 1567 1595 1611 +f 1611 1591 1567 +f 1543 1583 1595 +f 1595 1567 1543 +f 1523 1573 1583 +f 1583 1543 1523 +f 1509 1561 1573 +f 1573 1523 1509 +f 1501 1553 1561 +f 1561 1509 1501 +f 1888 1513 1519 +f 1888 1519 1527 +f 1888 1527 1547 +f 1888 1547 1575 +f 1888 1575 1593 +f 1888 1593 1617 +f 1888 1617 1641 +f 1888 1641 1663 +f 1888 1663 1687 +f 1888 1687 1894 +f 1366 1519 1513 +f 1513 1362 1366 +f 1374 1527 1519 +f 1519 1366 1374 +f 1397 1547 1527 +f 1527 1374 1397 +f 1423 1575 1547 +f 1547 1397 1423 +f 1481 1593 1575 +f 1575 1423 1481 +f 1529 1617 1593 +f 1593 1481 1529 +f 1587 1641 1617 +f 1617 1529 1587 +f 1635 1663 1641 +f 1641 1587 1635 +f 1675 1687 1663 +f 1663 1635 1675 +f 1895 1894 1687 +f 1687 1675 1895 +f 1313 1366 1362 +f 1362 1308 1313 +f 1323 1374 1366 +f 1366 1313 1323 +f 1344 1397 1374 +f 1374 1323 1344 +f 1380 1423 1397 +f 1397 1344 1380 +f 1419 1481 1423 +f 1423 1380 1419 +f 1491 1529 1481 +f 1481 1419 1491 +f 1556 1587 1529 +f 1529 1491 1556 +f 1623 1635 1587 +f 1587 1556 1623 +f 1667 1675 1635 +f 1635 1623 1667 +f 1890 1895 1675 +f 1675 1667 1890 +f 1311 1313 1308 +f 1308 1307 1311 +f 1321 1323 1313 +f 1313 1311 1321 +f 1342 1344 1323 +f 1323 1321 1342 +f 1378 1380 1344 +f 1344 1342 1378 +f 1417 1419 1380 +f 1380 1378 1417 +f 1489 1491 1419 +f 1419 1417 1489 +f 1555 1556 1491 +f 1491 1489 1555 +f 1621 1623 1556 +f 1556 1555 1621 +f 1665 1667 1623 +f 1623 1621 1665 +f 1881 1890 1667 +f 1667 1665 1881 +f 1338 1311 1307 +f 1307 1334 1338 +f 1364 1321 1311 +f 1311 1338 1364 +f 1382 1342 1321 +f 1321 1364 1382 +f 1409 1378 1342 +f 1342 1382 1409 +f 1455 1417 1378 +f 1378 1409 1455 +f 1517 1489 1417 +f 1417 1455 1517 +f 1581 1555 1489 +f 1489 1517 1581 +f 1629 1621 1555 +f 1555 1581 1629 +f 1671 1665 1621 +f 1621 1629 1671 +f 1893 1881 1665 +f 1665 1671 1893 +f 1403 1338 1334 +f 1334 1398 1403 +f 1413 1364 1338 +f 1338 1403 1413 +f 1437 1382 1364 +f 1364 1413 1437 +f 1477 1409 1382 +f 1382 1437 1477 +f 1515 1455 1409 +f 1409 1477 1515 +f 1563 1517 1455 +f 1455 1515 1563 +f 1605 1581 1517 +f 1517 1563 1605 +f 1645 1629 1581 +f 1581 1605 1645 +f 1679 1671 1629 +f 1629 1645 1679 +f 1900 1893 1671 +f 1671 1679 1900 +f 1482 1403 1398 +f 1398 1478 1482 +f 1496 1413 1403 +f 1403 1482 1496 +f 1511 1437 1413 +f 1413 1496 1511 +f 1539 1477 1437 +f 1437 1511 1539 +f 1579 1515 1477 +f 1477 1539 1579 +f 1599 1563 1515 +f 1515 1579 1599 +f 1631 1605 1563 +f 1563 1599 1631 +f 1653 1645 1605 +f 1605 1631 1653 +f 1681 1679 1645 +f 1645 1653 1681 +f 1902 1900 1679 +f 1679 1681 1902 +f 1544 1482 1478 +f 1478 1536 1544 +f 1548 1496 1482 +f 1482 1544 1548 +f 1568 1511 1496 +f 1496 1548 1568 +f 1584 1539 1511 +f 1511 1568 1584 +f 1602 1579 1539 +f 1539 1584 1602 +f 1627 1599 1579 +f 1579 1602 1627 +f 1649 1631 1599 +f 1599 1627 1649 +f 1669 1653 1631 +f 1631 1649 1669 +f 1689 1681 1653 +f 1653 1669 1689 +f 1921 1902 1681 +f 1681 1689 1921 +f 1560 1544 1536 +f 1536 1552 1560 +f 1572 1548 1544 +f 1544 1560 1572 +f 1582 1568 1548 +f 1548 1572 1582 +f 1594 1584 1568 +f 1568 1582 1594 +f 1610 1602 1584 +f 1584 1594 1610 +f 1632 1627 1602 +f 1602 1610 1632 +f 1651 1649 1627 +f 1627 1632 1651 +f 1673 1669 1649 +f 1649 1651 1673 +f 1691 1689 1669 +f 1669 1673 1691 +f 1922 1921 1689 +f 1689 1691 1922 +f 1508 1560 1552 +f 1552 1500 1508 +f 1522 1572 1560 +f 1560 1508 1522 +f 1542 1582 1572 +f 1572 1522 1542 +f 1566 1594 1582 +f 1582 1542 1566 +f 1590 1610 1594 +f 1594 1566 1590 +f 1614 1632 1610 +f 1610 1590 1614 +f 1639 1651 1632 +f 1632 1614 1639 +f 1659 1673 1651 +f 1651 1639 1659 +f 1685 1691 1673 +f 1673 1659 1685 +f 1928 1922 1691 +f 1691 1685 1928 +f 1888 1887 1937 +f 1888 1937 1961 +f 1888 1961 1983 +f 1888 1983 2007 +f 1888 2007 2031 +f 1888 2031 2049 +f 1888 2049 2077 +f 1888 2077 2097 +f 1888 2097 2105 +f 1888 2105 2111 +f 1949 1937 1887 +f 1887 1885 1949 +f 1989 1961 1937 +f 1937 1949 1989 +f 2037 1983 1961 +f 1961 1989 2037 +f 2095 2007 1983 +f 1983 2037 2095 +f 2143 2031 2007 +f 2007 2095 2143 +f 2201 2049 2031 +f 2031 2143 2201 +f 2227 2077 2049 +f 2049 2201 2227 +f 2250 2097 2077 +f 2077 2227 2250 +f 2258 2105 2097 +f 2097 2250 2258 +f 2262 2111 2105 +f 2105 2258 2262 +f 1957 1949 1885 +f 1885 1883 1957 +f 2001 1989 1949 +f 1949 1957 2001 +f 2066 2037 1989 +f 1989 2001 2066 +f 2133 2095 2037 +f 2037 2066 2133 +f 2205 2143 2095 +f 2095 2133 2205 +f 2244 2201 2143 +f 2143 2205 2244 +f 2280 2227 2201 +f 2201 2244 2280 +f 2301 2250 2227 +f 2227 2280 2301 +f 2311 2258 2250 +f 2250 2301 2311 +f 2314 2262 2258 +f 2258 2311 2314 +f 1959 1957 1883 +f 1883 1880 1959 +f 2003 2001 1957 +f 1957 1959 2003 +f 2069 2066 2001 +f 2001 2003 2069 +f 2135 2133 2066 +f 2066 2069 2135 +f 2207 2205 2133 +f 2133 2135 2207 +f 2246 2244 2205 +f 2205 2207 2246 +f 2282 2280 2244 +f 2244 2246 2282 +f 2303 2301 2280 +f 2280 2282 2303 +f 2313 2311 2301 +f 2301 2303 2313 +f 2317 2314 2311 +f 2311 2313 2317 +f 1953 1959 1880 +f 1880 1877 1953 +f 1995 2003 1959 +f 1959 1953 1995 +f 2043 2069 2003 +f 2003 1995 2043 +f 2107 2135 2069 +f 2069 2043 2107 +f 2169 2207 2135 +f 2135 2107 2169 +f 2215 2246 2207 +f 2207 2169 2215 +f 2242 2282 2246 +f 2246 2215 2242 +f 2260 2303 2282 +f 2282 2242 2260 +f 2286 2313 2303 +f 2303 2260 2286 +f 2290 2317 2313 +f 2313 2286 2290 +f 1945 1953 1877 +f 1877 1875 1945 +f 1979 1995 1953 +f 1953 1945 1979 +f 2019 2043 1995 +f 1995 1979 2019 +f 2061 2107 2043 +f 2043 2019 2061 +f 2109 2169 2107 +f 2107 2061 2109 +f 2147 2215 2169 +f 2169 2109 2147 +f 2187 2242 2215 +f 2215 2147 2187 +f 2211 2260 2242 +f 2242 2187 2211 +f 2221 2286 2260 +f 2260 2211 2221 +f 2224 2290 2286 +f 2286 2221 2224 +f 1943 1945 1875 +f 1875 1873 1943 +f 1971 1979 1945 +f 1945 1943 1971 +f 1993 2019 1979 +f 1979 1971 1993 +f 2025 2061 2019 +f 2019 1993 2025 +f 2045 2109 2061 +f 2061 2025 2045 +f 2085 2147 2109 +f 2109 2045 2085 +f 2113 2187 2147 +f 2147 2085 2113 +f 2126 2211 2187 +f 2187 2113 2126 +f 2140 2221 2211 +f 2211 2126 2140 +f 2144 2224 2221 +f 2221 2140 2144 +f 1935 1943 1873 +f 1873 1871 1935 +f 1955 1971 1943 +f 1943 1935 1955 +f 1975 1993 1971 +f 1971 1955 1975 +f 1997 2025 1993 +f 1993 1975 1997 +f 2020 2045 2025 +f 2025 1997 2020 +f 2038 2085 2045 +f 2045 2020 2038 +f 2054 2113 2085 +f 2085 2038 2054 +f 2074 2126 2113 +f 2113 2054 2074 +f 2078 2140 2126 +f 2126 2074 2078 +f 2086 2144 2140 +f 2140 2078 2086 +f 1933 1935 1871 +f 1871 1869 1933 +f 1951 1955 1935 +f 1935 1933 1951 +f 1973 1975 1955 +f 1955 1951 1973 +f 1990 1997 1975 +f 1975 1973 1990 +f 2012 2020 1997 +f 1997 1990 2012 +f 2028 2038 2020 +f 2020 2012 2028 +f 2040 2054 2038 +f 2038 2028 2040 +f 2050 2074 2054 +f 2054 2040 2050 +f 2062 2078 2074 +f 2074 2050 2062 +f 2070 2086 2078 +f 2078 2062 2070 +f 1939 1933 1869 +f 1869 1866 1939 +f 1965 1951 1933 +f 1933 1939 1965 +f 1985 1973 1951 +f 1951 1965 1985 +f 2008 1990 1973 +f 1973 1985 2008 +f 2032 2012 1990 +f 1990 2008 2032 +f 2056 2028 2012 +f 2012 2032 2056 +f 2080 2040 2028 +f 2028 2056 2080 +f 2100 2050 2040 +f 2040 2080 2100 +f 2114 2062 2050 +f 2050 2100 2114 +f 2122 2070 2062 +f 2062 2114 2122 +f 2232 2116 2124 +f 2124 2236 2232 +f 2218 2102 2116 +f 2116 2232 2218 +f 2199 2082 2102 +f 2102 2218 2199 +f 2150 2058 2082 +f 2082 2199 2150 +f 2120 2034 2058 +f 2058 2150 2120 +f 2064 2010 2034 +f 2034 2120 2064 +f 2023 1986 2010 +f 2010 2064 2023 +f 1980 1966 1986 +f 1986 2023 1980 +f 1946 1940 1966 +f 1966 1980 1946 +f 1862 1730 1940 +f 1940 1946 1862 +f 2332 2232 2236 +f 2236 2336 2332 +f 2322 2218 2232 +f 2232 2332 2322 +f 2306 2199 2218 +f 2218 2322 2306 +f 2275 2150 2199 +f 2199 2306 2275 +f 2234 2120 2150 +f 2150 2275 2234 +f 2170 2064 2120 +f 2120 2234 2170 +f 2093 2023 2064 +f 2064 2170 2093 +f 2016 1980 2023 +f 2023 2093 2016 +f 1968 1946 1980 +f 1980 2016 1968 +f 1858 1862 1946 +f 1946 1968 1858 +f 2409 2332 2336 +f 2336 2413 2409 +f 2400 2322 2332 +f 2332 2409 2400 +f 2376 2306 2322 +f 2322 2400 2376 +f 2349 2275 2306 +f 2306 2376 2349 +f 2324 2234 2275 +f 2275 2349 2324 +f 2271 2170 2234 +f 2234 2324 2271 +f 2185 2093 2170 +f 2170 2271 2185 +f 2072 2016 2093 +f 2093 2185 2072 +f 1976 1968 2016 +f 2016 2072 1976 +f 1729 1858 1968 +f 1968 1976 1729 +f 2488 2409 2413 +f 2413 2498 2488 +f 2470 2400 2409 +f 2409 2488 2470 +f 2444 2376 2400 +f 2400 2470 2444 +f 2418 2349 2376 +f 2376 2444 2418 +f 2384 2324 2349 +f 2349 2418 2384 +f 2338 2271 2324 +f 2324 2384 2338 +f 2269 2185 2271 +f 2271 2338 2269 +f 2138 2072 2185 +f 2185 2269 2138 +f 1998 1976 2072 +f 2072 2138 1998 +f 1722 1729 1976 +f 1976 1998 1722 +f 2559 2488 2498 +f 2498 2569 2559 +f 2549 2470 2488 +f 2488 2559 2549 +f 2531 2444 2470 +f 2470 2549 2531 +f 2492 2418 2444 +f 2444 2531 2492 +f 2436 2384 2418 +f 2418 2492 2436 +f 2394 2338 2384 +f 2384 2436 2394 +f 2326 2269 2338 +f 2338 2394 2326 +f 2212 2138 2269 +f 2269 2326 2212 +f 2026 1998 2138 +f 2138 2212 2026 +f 1850 1722 1998 +f 1998 2026 1850 +f 2653 2559 2569 +f 2569 2655 2653 +f 2631 2549 2559 +f 2559 2653 2631 +f 2593 2531 2549 +f 2549 2631 2593 +f 2551 2492 2531 +f 2531 2593 2551 +f 2510 2436 2492 +f 2492 2551 2510 +f 2432 2394 2436 +f 2436 2510 2432 +f 2366 2326 2394 +f 2394 2432 2366 +f 2263 2212 2326 +f 2326 2366 2263 +f 2052 2026 2212 +f 2212 2263 2052 +f 1726 1850 2026 +f 2026 2052 1726 +f 2720 2653 2655 +f 2655 2726 2720 +f 2697 2631 2653 +f 2653 2720 2697 +f 2662 2593 2631 +f 2631 2697 2662 +f 2607 2551 2593 +f 2593 2662 2607 +f 2547 2510 2551 +f 2551 2607 2547 +f 2484 2432 2510 +f 2510 2547 2484 +f 2405 2366 2432 +f 2432 2484 2405 +f 2308 2263 2366 +f 2366 2405 2308 +f 2090 2052 2263 +f 2263 2308 2090 +f 1719 1726 2052 +f 2052 2090 1719 +f 2787 2720 2726 +f 2726 2795 2787 +f 2759 2697 2720 +f 2720 2787 2759 +f 2713 2662 2697 +f 2697 2759 2713 +f 2657 2607 2662 +f 2662 2713 2657 +f 2589 2547 2607 +f 2607 2657 2589 +f 2525 2484 2547 +f 2547 2589 2525 +f 2422 2405 2484 +f 2484 2525 2422 +f 2330 2308 2405 +f 2405 2422 2330 +f 2118 2090 2308 +f 2308 2330 2118 +f 1700 1719 2090 +f 2090 2118 1700 +f 2834 2787 2795 +f 2795 2844 2834 +f 2798 2759 2787 +f 2787 2834 2798 +f 2750 2713 2759 +f 2759 2798 2750 +f 2690 2657 2713 +f 2713 2750 2690 +f 2624 2589 2657 +f 2657 2690 2624 +f 2536 2525 2589 +f 2589 2624 2536 +f 2441 2422 2525 +f 2525 2536 2441 +f 2340 2330 2422 +f 2422 2441 2340 +f 2128 2118 2330 +f 2330 2340 2128 +f 1825 1700 2118 +f 2118 2128 1825 +f 2847 2834 2844 +f 2844 2857 2847 +f 2821 2798 2834 +f 2834 2847 2821 +f 2765 2750 2798 +f 2798 2821 2765 +f 2703 2690 2750 +f 2750 2765 2703 +f 2637 2624 2690 +f 2690 2703 2637 +f 2543 2536 2624 +f 2624 2637 2543 +f 2446 2441 2536 +f 2536 2543 2446 +f 2344 2340 2441 +f 2441 2446 2344 +f 2136 2128 2340 +f 2340 2344 2136 +f 1713 1825 2128 +f 2128 2136 1713 +f 1676 1682 1864 +f 1864 1862 1676 +f 1642 1656 1682 +f 1682 1676 1642 +f 1601 1636 1656 +f 1656 1642 1601 +f 1558 1612 1636 +f 1636 1601 1558 +f 1502 1588 1612 +f 1612 1558 1502 +f 1472 1564 1588 +f 1588 1502 1472 +f 1425 1540 1564 +f 1564 1472 1425 +f 1404 1520 1540 +f 1540 1425 1404 +f 1390 1506 1520 +f 1520 1404 1390 +f 1387 1498 1506 +f 1506 1390 1387 +f 1654 1676 1862 +f 1862 1859 1654 +f 1606 1642 1676 +f 1676 1654 1606 +f 1531 1601 1642 +f 1642 1606 1531 +f 1452 1558 1601 +f 1601 1531 1452 +f 1388 1502 1558 +f 1558 1452 1388 +f 1347 1472 1502 +f 1502 1388 1347 +f 1316 1425 1472 +f 1472 1347 1316 +f 1300 1404 1425 +f 1425 1316 1300 +f 1290 1390 1404 +f 1404 1300 1290 +f 1286 1387 1390 +f 1390 1290 1286 +f 1646 1654 1859 +f 1859 1856 1646 +f 1550 1606 1654 +f 1654 1646 1550 +f 1439 1531 1606 +f 1606 1550 1439 +f 1351 1452 1531 +f 1531 1439 1351 +f 1298 1388 1452 +f 1452 1351 1298 +f 1275 1347 1388 +f 1388 1298 1275 +f 1246 1316 1347 +f 1347 1275 1246 +f 1222 1300 1316 +f 1316 1246 1222 +f 1215 1290 1300 +f 1300 1222 1215 +f 1211 1286 1290 +f 1290 1215 1211 +f 1624 1646 1856 +f 1856 1854 1624 +f 1484 1550 1646 +f 1646 1624 1484 +f 1353 1439 1550 +f 1550 1484 1353 +f 1284 1351 1439 +f 1439 1353 1284 +f 1238 1298 1351 +f 1351 1284 1238 +f 1204 1275 1298 +f 1298 1238 1204 +f 1178 1246 1275 +f 1275 1204 1178 +f 1152 1222 1246 +f 1246 1178 1152 +f 1134 1215 1222 +f 1222 1152 1134 +f 1124 1211 1215 +f 1215 1134 1124 +f 1596 1624 1854 +f 1854 1851 1596 +f 1410 1484 1624 +f 1624 1596 1410 +f 1296 1353 1484 +f 1484 1410 1296 +f 1228 1284 1353 +f 1353 1296 1228 +f 1186 1238 1284 +f 1284 1228 1186 +f 1130 1204 1238 +f 1238 1186 1130 +f 1091 1178 1204 +f 1204 1130 1091 +f 1073 1152 1178 +f 1178 1091 1073 +f 1063 1134 1152 +f 1152 1073 1063 +f 1053 1124 1134 +f 1134 1063 1053 +f 1570 1596 1851 +f 1851 1848 1570 +f 1359 1410 1596 +f 1596 1570 1359 +f 1256 1296 1410 +f 1410 1359 1256 +f 1190 1228 1296 +f 1296 1256 1190 +f 1112 1186 1228 +f 1228 1190 1112 +f 1071 1130 1186 +f 1186 1112 1071 +f 1029 1091 1130 +f 1130 1071 1029 +f 991 1073 1091 +f 1091 1029 991 +f 969 1063 1073 +f 1073 991 969 +f 967 1053 1063 +f 1063 969 967 +f 1532 1570 1848 +f 1848 1846 1532 +f 1314 1359 1570 +f 1570 1532 1314 +f 1219 1256 1359 +f 1359 1314 1219 +f 1138 1190 1256 +f 1256 1219 1138 +f 1075 1112 1190 +f 1190 1138 1075 +f 1015 1071 1112 +f 1112 1075 1015 +f 962 1029 1071 +f 1071 1015 962 +f 925 991 1029 +f 1029 962 925 +f 904 969 991 +f 991 925 904 +f 898 967 969 +f 969 904 898 +f 1504 1532 1846 +f 1846 1832 1504 +f 1292 1314 1532 +f 1532 1504 1292 +f 1200 1219 1314 +f 1314 1292 1200 +f 1097 1138 1219 +f 1219 1200 1097 +f 1033 1075 1138 +f 1138 1097 1033 +f 965 1015 1075 +f 1075 1033 965 +f 909 962 1015 +f 1015 965 909 +f 863 925 962 +f 962 909 863 +f 835 904 925 +f 925 863 835 +f 827 898 904 +f 904 835 827 +f 1494 1504 1832 +f 1832 1824 1494 +f 1282 1292 1504 +f 1504 1494 1282 +f 1183 1200 1292 +f 1292 1282 1183 +f 1088 1097 1200 +f 1200 1183 1088 +f 1000 1033 1097 +f 1097 1088 1000 +f 934 965 1033 +f 1033 1000 934 +f 874 909 965 +f 965 934 874 +f 826 863 909 +f 909 874 826 +f 790 835 863 +f 863 826 790 +f 780 827 835 +f 835 790 780 +f 1486 1494 1824 +f 1824 1814 1486 +f 1278 1282 1494 +f 1494 1486 1278 +f 1176 1183 1282 +f 1282 1278 1176 +f 1079 1088 1183 +f 1183 1176 1079 +f 985 1000 1088 +f 1088 1079 985 +f 919 934 1000 +f 1000 985 919 +f 857 874 934 +f 934 919 857 +f 801 826 874 +f 874 857 801 +f 775 790 826 +f 826 801 775 +f 765 780 790 +f 790 775 765 +f 1391 1507 1499 +f 1499 1387 1391 +f 1405 1521 1507 +f 1507 1391 1405 +f 1424 1541 1521 +f 1521 1405 1424 +f 1473 1565 1541 +f 1541 1424 1473 +f 1503 1589 1565 +f 1565 1473 1503 +f 1559 1613 1589 +f 1589 1503 1559 +f 1600 1637 1613 +f 1613 1559 1600 +f 1643 1657 1637 +f 1637 1600 1643 +f 1677 1683 1657 +f 1657 1643 1677 +f 1863 1892 1683 +f 1683 1677 1863 +f 1291 1391 1387 +f 1387 1287 1291 +f 1301 1405 1391 +f 1391 1291 1301 +f 1317 1424 1405 +f 1405 1301 1317 +f 1348 1473 1424 +f 1424 1317 1348 +f 1389 1503 1473 +f 1473 1348 1389 +f 1453 1559 1503 +f 1503 1389 1453 +f 1530 1600 1559 +f 1559 1453 1530 +f 1607 1643 1600 +f 1600 1530 1607 +f 1655 1677 1643 +f 1643 1607 1655 +f 1861 1863 1677 +f 1677 1655 1861 +f 1214 1291 1287 +f 1287 1210 1214 +f 1223 1301 1291 +f 1291 1214 1223 +f 1247 1317 1301 +f 1301 1223 1247 +f 1274 1348 1317 +f 1317 1247 1274 +f 1299 1389 1348 +f 1348 1274 1299 +f 1352 1453 1389 +f 1389 1299 1352 +f 1438 1530 1453 +f 1453 1352 1438 +f 1551 1607 1530 +f 1530 1438 1551 +f 1647 1655 1607 +f 1607 1551 1647 +f 1891 1861 1655 +f 1655 1647 1891 +f 1135 1214 1210 +f 1210 1125 1135 +f 1153 1223 1214 +f 1214 1135 1153 +f 1179 1247 1223 +f 1223 1153 1179 +f 1205 1274 1247 +f 1247 1179 1205 +f 1239 1299 1274 +f 1274 1205 1239 +f 1285 1352 1299 +f 1299 1239 1285 +f 1354 1438 1352 +f 1352 1285 1354 +f 1485 1551 1438 +f 1438 1354 1485 +f 1625 1647 1551 +f 1551 1485 1625 +f 1901 1891 1647 +f 1647 1625 1901 +f 1064 1135 1125 +f 1125 1054 1064 +f 1074 1153 1135 +f 1135 1064 1074 +f 1092 1179 1153 +f 1153 1074 1092 +f 1131 1205 1179 +f 1179 1092 1131 +f 1187 1239 1205 +f 1205 1131 1187 +f 1229 1285 1239 +f 1239 1187 1229 +f 1297 1354 1285 +f 1285 1229 1297 +f 1411 1485 1354 +f 1354 1297 1411 +f 1597 1625 1485 +f 1485 1411 1597 +f 1853 1901 1625 +f 1625 1597 1853 +f 970 1064 1054 +f 1054 968 970 +f 992 1074 1064 +f 1064 970 992 +f 1030 1092 1074 +f 1074 992 1030 +f 1072 1131 1092 +f 1092 1030 1072 +f 1113 1187 1131 +f 1131 1072 1113 +f 1191 1229 1187 +f 1187 1113 1191 +f 1257 1297 1229 +f 1229 1191 1257 +f 1360 1411 1297 +f 1297 1257 1360 +f 1571 1597 1411 +f 1411 1360 1571 +f 1899 1853 1597 +f 1597 1571 1899 +f 903 970 968 +f 968 897 903 +f 926 992 970 +f 970 903 926 +f 961 1030 992 +f 992 926 961 +f 1016 1072 1030 +f 1030 961 1016 +f 1076 1113 1072 +f 1072 1016 1076 +f 1139 1191 1113 +f 1113 1076 1139 +f 1218 1257 1191 +f 1191 1139 1218 +f 1315 1360 1257 +f 1257 1218 1315 +f 1533 1571 1360 +f 1360 1315 1533 +f 1920 1899 1571 +f 1571 1533 1920 +f 836 903 897 +f 897 828 836 +f 864 926 903 +f 903 836 864 +f 910 961 926 +f 926 864 910 +f 966 1016 961 +f 961 910 966 +f 1034 1076 1016 +f 1016 966 1034 +f 1098 1139 1076 +f 1076 1034 1098 +f 1201 1218 1139 +f 1139 1098 1201 +f 1293 1315 1218 +f 1218 1201 1293 +f 1505 1533 1315 +f 1315 1293 1505 +f 1924 1920 1533 +f 1533 1505 1924 +f 789 836 828 +f 828 779 789 +f 825 864 836 +f 836 789 825 +f 873 910 864 +f 864 825 873 +f 933 966 910 +f 910 873 933 +f 999 1034 966 +f 966 933 999 +f 1087 1098 1034 +f 1034 999 1087 +f 1182 1201 1098 +f 1098 1087 1182 +f 1283 1293 1201 +f 1201 1182 1283 +f 1495 1505 1293 +f 1293 1283 1495 +f 1826 1924 1505 +f 1505 1495 1826 +f 776 789 779 +f 779 766 776 +f 802 825 789 +f 789 776 802 +f 858 873 825 +f 825 802 858 +f 920 933 873 +f 873 858 920 +f 986 999 933 +f 933 920 986 +f 1080 1087 999 +f 999 986 1080 +f 1177 1182 1087 +f 1087 1080 1177 +f 1279 1283 1182 +f 1182 1177 1279 +f 1487 1495 1283 +f 1283 1279 1487 +f 1914 1826 1495 +f 1495 1487 1914 +f 1947 1941 1867 +f 1867 1863 1947 +f 1981 1967 1941 +f 1941 1947 1981 +f 2022 1987 1967 +f 1967 1981 2022 +f 2065 2011 1987 +f 1987 2022 2065 +f 2121 2035 2011 +f 2011 2065 2121 +f 2151 2059 2035 +f 2035 2121 2151 +f 2198 2083 2059 +f 2059 2151 2198 +f 2219 2103 2083 +f 2083 2198 2219 +f 2233 2117 2103 +f 2103 2219 2233 +f 2236 2125 2117 +f 2117 2233 2236 +f 1969 1947 1863 +f 1863 1860 1969 +f 2017 1981 1947 +f 1947 1969 2017 +f 2092 2022 1981 +f 1981 2017 2092 +f 2171 2065 2022 +f 2022 2092 2171 +f 2235 2121 2065 +f 2065 2171 2235 +f 2276 2151 2121 +f 2121 2235 2276 +f 2307 2198 2151 +f 2151 2276 2307 +f 2323 2219 2198 +f 2198 2307 2323 +f 2333 2233 2219 +f 2219 2323 2333 +f 2337 2236 2233 +f 2233 2333 2337 +f 1977 1969 1860 +f 1860 1857 1977 +f 2073 2017 1969 +f 1969 1977 2073 +f 2184 2092 2017 +f 2017 2073 2184 +f 2272 2171 2092 +f 2092 2184 2272 +f 2325 2235 2171 +f 2171 2272 2325 +f 2348 2276 2235 +f 2235 2325 2348 +f 2377 2307 2276 +f 2276 2348 2377 +f 2401 2323 2307 +f 2307 2377 2401 +f 2408 2333 2323 +f 2323 2401 2408 +f 2412 2337 2333 +f 2333 2408 2412 +f 1999 1977 1857 +f 1857 1855 1999 +f 2139 2073 1977 +f 1977 1999 2139 +f 2270 2184 2073 +f 2073 2139 2270 +f 2339 2272 2184 +f 2184 2270 2339 +f 2385 2325 2272 +f 2272 2339 2385 +f 2419 2348 2325 +f 2325 2385 2419 +f 2445 2377 2348 +f 2348 2419 2445 +f 2471 2401 2377 +f 2377 2445 2471 +f 2489 2408 2401 +f 2401 2471 2489 +f 2499 2412 2408 +f 2408 2489 2499 +f 2027 1999 1855 +f 1855 1852 2027 +f 2213 2139 1999 +f 1999 2027 2213 +f 2327 2270 2139 +f 2139 2213 2327 +f 2395 2339 2270 +f 2270 2327 2395 +f 2437 2385 2339 +f 2339 2395 2437 +f 2493 2419 2385 +f 2385 2437 2493 +f 2532 2445 2419 +f 2419 2493 2532 +f 2550 2471 2445 +f 2445 2532 2550 +f 2560 2489 2471 +f 2471 2550 2560 +f 2570 2499 2489 +f 2489 2560 2570 +f 2053 2027 1852 +f 1852 1849 2053 +f 2264 2213 2027 +f 2027 2053 2264 +f 2367 2327 2213 +f 2213 2264 2367 +f 2433 2395 2327 +f 2327 2367 2433 +f 2511 2437 2395 +f 2395 2433 2511 +f 2552 2493 2437 +f 2437 2511 2552 +f 2594 2532 2493 +f 2493 2552 2594 +f 2632 2550 2532 +f 2532 2594 2632 +f 2654 2560 2550 +f 2550 2632 2654 +f 2656 2570 2560 +f 2560 2654 2656 +f 2091 2053 1849 +f 1849 1847 2091 +f 2309 2264 2053 +f 2053 2091 2309 +f 2404 2367 2264 +f 2264 2309 2404 +f 2485 2433 2367 +f 2367 2404 2485 +f 2548 2511 2433 +f 2433 2485 2548 +f 2608 2552 2511 +f 2511 2548 2608 +f 2661 2594 2552 +f 2552 2608 2661 +f 2698 2632 2594 +f 2594 2661 2698 +f 2719 2654 2632 +f 2632 2698 2719 +f 2725 2656 2654 +f 2654 2719 2725 +f 2119 2091 1847 +f 1847 1833 2119 +f 2331 2309 2091 +f 2091 2119 2331 +f 2423 2404 2309 +f 2309 2331 2423 +f 2526 2485 2404 +f 2404 2423 2526 +f 2590 2548 2485 +f 2485 2526 2590 +f 2658 2608 2548 +f 2548 2590 2658 +f 2714 2661 2608 +f 2608 2658 2714 +f 2760 2698 2661 +f 2661 2714 2760 +f 2788 2719 2698 +f 2698 2760 2788 +f 2796 2725 2719 +f 2719 2788 2796 +f 2129 2119 1833 +f 1833 1827 2129 +f 2341 2331 2119 +f 2119 2129 2341 +f 2440 2423 2331 +f 2331 2341 2440 +f 2535 2526 2423 +f 2423 2440 2535 +f 2623 2590 2526 +f 2526 2535 2623 +f 2689 2658 2590 +f 2590 2623 2689 +f 2749 2714 2658 +f 2658 2689 2749 +f 2797 2760 2714 +f 2714 2749 2797 +f 2833 2788 2760 +f 2760 2797 2833 +f 2843 2796 2788 +f 2788 2833 2843 +f 2137 2129 1827 +f 1827 1815 2137 +f 2345 2341 2129 +f 2129 2137 2345 +f 2447 2440 2341 +f 2341 2345 2447 +f 2544 2535 2440 +f 2440 2447 2544 +f 2638 2623 2535 +f 2535 2544 2638 +f 2704 2689 2623 +f 2623 2638 2704 +f 2766 2749 2689 +f 2689 2704 2766 +f 2822 2797 2749 +f 2749 2766 2822 +f 2848 2833 2797 +f 2797 2822 2848 +f 2858 2843 2833 +f 2833 2848 2858 +f 1735 2334 2329 +f 1735 2329 2321 +f 1735 2321 2305 +f 1735 2305 2274 +f 1735 2274 2231 +f 1735 2231 2167 +f 1735 2167 2089 +f 1735 2089 2014 +f 1735 2014 1962 +f 1735 1962 1733 +f 2515 2329 2334 +f 2334 2524 2515 +f 2495 2321 2329 +f 2329 2515 2495 +f 2456 2305 2321 +f 2321 2495 2456 +f 2429 2274 2305 +f 2305 2456 2429 +f 2399 2231 2274 +f 2274 2429 2399 +f 2347 2167 2231 +f 2231 2399 2347 +f 2292 2089 2167 +f 2167 2347 2292 +f 2148 2014 2089 +f 2089 2292 2148 +f 2004 1962 2014 +f 2014 2148 2004 +f 1739 1733 1962 +f 1962 2004 1739 +f 2647 2515 2524 +f 2524 2649 2647 +f 2621 2495 2515 +f 2515 2647 2621 +f 2584 2456 2495 +f 2495 2621 2584 +f 2541 2429 2456 +f 2456 2584 2541 +f 2502 2399 2429 +f 2429 2541 2502 +f 2426 2347 2399 +f 2399 2502 2426 +f 2352 2292 2347 +f 2347 2426 2352 +f 2255 2148 2292 +f 2292 2352 2255 +f 2046 2004 2148 +f 2148 2255 2046 +f 1702 1739 2004 +f 2004 2046 1702 +f 2746 2647 2649 +f 2649 2757 2746 +f 2721 2621 2647 +f 2647 2746 2721 +f 2681 2584 2621 +f 2621 2721 2681 +f 2639 2541 2584 +f 2584 2681 2639 +f 2557 2502 2541 +f 2541 2639 2557 +f 2505 2426 2502 +f 2502 2557 2505 +f 2415 2352 2426 +f 2426 2505 2415 +f 2318 2255 2352 +f 2352 2415 2318 +f 2098 2046 2255 +f 2255 2318 2098 +f 1745 1702 2046 +f 2046 2098 1745 +f 2840 2746 2757 +f 2757 2849 2840 +f 2808 2721 2746 +f 2746 2840 2808 +f 2756 2681 2721 +f 2721 2808 2756 +f 2696 2639 2681 +f 2681 2756 2696 +f 2626 2557 2639 +f 2639 2696 2626 +f 2538 2505 2557 +f 2557 2626 2538 +f 2443 2415 2505 +f 2505 2538 2443 +f 2342 2318 2415 +f 2415 2443 2342 +f 2131 2098 2318 +f 2318 2342 2131 +f 1904 1745 2098 +f 2098 2131 1904 +f 2906 2840 2849 +f 2849 2925 2906 +f 2867 2808 2840 +f 2840 2906 2867 +f 2818 2756 2808 +f 2808 2867 2818 +f 2736 2696 2756 +f 2756 2818 2736 +f 2667 2626 2696 +f 2696 2736 2667 +f 2565 2538 2626 +f 2626 2667 2565 +f 2475 2443 2538 +f 2538 2565 2475 +f 2356 2342 2443 +f 2443 2475 2356 +f 2156 2131 2342 +f 2342 2356 2156 +f 1704 1904 2131 +f 2131 2156 1704 +f 2976 2906 2925 +f 2925 2987 2976 +f 2914 2867 2906 +f 2906 2976 2914 +f 2852 2818 2867 +f 2867 2914 2852 +f 2772 2736 2818 +f 2818 2852 2772 +f 2688 2667 2736 +f 2736 2772 2688 +f 2592 2565 2667 +f 2667 2688 2592 +f 2497 2475 2565 +f 2565 2592 2497 +f 2372 2356 2475 +f 2475 2497 2372 +f 2176 2156 2356 +f 2356 2372 2176 +f 1752 1704 2156 +f 2156 2176 1752 +f 2993 2976 2987 +f 2987 3011 2993 +f 2952 2914 2976 +f 2976 2993 2952 +f 2874 2852 2914 +f 2914 2952 2874 +f 2794 2772 2852 +f 2852 2874 2794 +f 2702 2688 2772 +f 2772 2794 2702 +f 2604 2592 2688 +f 2688 2702 2604 +f 2509 2497 2592 +f 2592 2604 2509 +f 2380 2372 2497 +f 2497 2509 2380 +f 2182 2176 2372 +f 2372 2380 2182 +f 1723 1752 2176 +f 2176 2182 1723 +f 3000 2993 3011 +f 3011 3020 3000 +f 2967 2952 2993 +f 2993 3000 2967 +f 2879 2874 2952 +f 2952 2967 2879 +f 2799 2794 2874 +f 2874 2879 2799 +f 2707 2702 2794 +f 2794 2799 2707 +f 2605 2604 2702 +f 2702 2707 2605 +f 2512 2509 2604 +f 2604 2605 2512 +f 2382 2380 2509 +f 2509 2512 2382 +f 2188 2182 2380 +f 2380 2382 2188 +f 1699 1723 2182 +f 2182 2188 1699 +f 3006 3000 3020 +f 3020 3022 3006 +f 2972 2967 3000 +f 3000 3006 2972 +f 2888 2879 2967 +f 2967 2972 2888 +f 2804 2799 2879 +f 2879 2888 2804 +f 2710 2707 2799 +f 2799 2804 2710 +f 2613 2605 2707 +f 2707 2710 2613 +f 2520 2512 2605 +f 2605 2613 2520 +f 2388 2382 2512 +f 2512 2520 2388 +f 2192 2188 2382 +f 2382 2388 2192 +f 1760 1699 2188 +f 2188 2192 1760 +f 1735 1737 1660 +f 1735 1660 1608 +f 1735 1608 1535 +f 1735 1535 1457 +f 1735 1457 1393 +f 1735 1393 1350 +f 1735 1350 1319 +f 1735 1319 1303 +f 1735 1303 1295 +f 1735 1295 1288 +f 1618 1660 1737 +f 1737 1739 1618 +f 1474 1608 1660 +f 1660 1618 1474 +f 1332 1535 1608 +f 1608 1474 1332 +f 1277 1457 1535 +f 1535 1332 1277 +f 1225 1393 1457 +f 1457 1277 1225 +f 1195 1350 1393 +f 1393 1225 1195 +f 1166 1319 1350 +f 1350 1195 1166 +f 1129 1303 1319 +f 1319 1166 1129 +f 1109 1295 1303 +f 1303 1129 1109 +f 1099 1288 1295 +f 1295 1109 1099 +f 1576 1618 1739 +f 1739 1741 1576 +f 1367 1474 1618 +f 1618 1576 1367 +f 1270 1332 1474 +f 1474 1367 1270 +f 1196 1277 1332 +f 1332 1270 1196 +f 1120 1225 1277 +f 1277 1196 1120 +f 1081 1195 1225 +f 1225 1120 1081 +f 1040 1166 1195 +f 1195 1081 1040 +f 1001 1129 1166 +f 1166 1040 1001 +f 975 1109 1129 +f 1129 1001 975 +f 973 1099 1109 +f 1109 975 973 +f 1524 1576 1741 +f 1741 1744 1524 +f 1304 1367 1576 +f 1576 1524 1304 +f 1209 1270 1367 +f 1367 1304 1209 +f 1119 1196 1270 +f 1270 1209 1119 +f 1065 1120 1196 +f 1196 1119 1065 +f 983 1081 1120 +f 1120 1065 983 +f 941 1040 1081 +f 1081 983 941 +f 901 1001 1040 +f 1040 941 901 +f 878 975 1001 +f 1001 901 878 +f 865 973 975 +f 975 878 865 +f 1493 1524 1744 +f 1744 1747 1493 +f 1280 1304 1524 +f 1524 1493 1280 +f 1181 1209 1304 +f 1304 1280 1181 +f 1086 1119 1209 +f 1209 1181 1086 +f 998 1065 1119 +f 1119 1086 998 +f 928 983 1065 +f 1065 998 928 +f 868 941 983 +f 983 928 868 +f 816 901 941 +f 941 868 816 +f 784 878 901 +f 901 816 784 +f 773 865 878 +f 878 784 773 +f 1466 1493 1747 +f 1747 1749 1466 +f 1266 1280 1493 +f 1493 1466 1266 +f 1149 1181 1280 +f 1280 1266 1149 +f 1057 1086 1181 +f 1181 1149 1057 +f 955 998 1086 +f 1086 1057 955 +f 888 928 998 +f 998 955 888 +f 806 868 928 +f 928 888 806 +f 755 816 868 +f 868 806 755 +f 718 784 816 +f 816 755 718 +f 697 773 784 +f 784 718 697 +f 1446 1466 1749 +f 1749 1753 1446 +f 1250 1266 1466 +f 1466 1446 1250 +f 1127 1149 1266 +f 1266 1250 1127 +f 1032 1057 1149 +f 1149 1127 1032 +f 936 955 1057 +f 1057 1032 936 +f 852 888 955 +f 955 936 852 +f 772 806 888 +f 888 852 772 +f 710 755 806 +f 806 772 710 +f 648 718 755 +f 755 710 648 +f 637 697 718 +f 718 648 637 +f 1440 1446 1753 +f 1753 1755 1440 +f 1242 1250 1446 +f 1446 1440 1242 +f 1115 1127 1250 +f 1250 1242 1115 +f 1020 1032 1127 +f 1127 1115 1020 +f 922 936 1032 +f 1032 1020 922 +f 830 852 936 +f 936 922 830 +f 750 772 852 +f 852 830 750 +f 672 710 772 +f 772 750 672 +f 631 648 710 +f 710 672 631 +f 613 637 648 +f 648 631 613 +f 1434 1440 1755 +f 1755 1757 1434 +f 1240 1242 1440 +f 1440 1434 1240 +f 1110 1115 1242 +f 1242 1240 1110 +f 1017 1020 1115 +f 1115 1110 1017 +f 915 922 1020 +f 1020 1017 915 +f 823 830 922 +f 922 915 823 +f 743 750 830 +f 830 823 743 +f 655 672 750 +f 750 743 655 +f 622 631 672 +f 672 655 622 +f 602 613 631 +f 631 622 602 +f 1428 1434 1757 +f 1757 1760 1428 +f 1232 1240 1434 +f 1434 1428 1232 +f 1105 1110 1240 +f 1240 1232 1105 +f 1010 1017 1110 +f 1110 1105 1010 +f 913 915 1017 +f 1017 1010 913 +f 821 823 915 +f 915 913 821 +f 736 743 823 +f 823 821 736 +f 652 655 743 +f 743 736 652 +f 619 622 655 +f 655 652 619 +f 601 602 622 +f 622 619 601 +f 1735 1289 1294 +f 1735 1294 1302 +f 1735 1302 1318 +f 1735 1318 1349 +f 1735 1349 1392 +f 1735 1392 1456 +f 1735 1456 1534 +f 1735 1534 1609 +f 1735 1609 1661 +f 1735 1661 1889 +f 1108 1294 1289 +f 1289 1099 1108 +f 1128 1302 1294 +f 1294 1108 1128 +f 1167 1318 1302 +f 1302 1128 1167 +f 1194 1349 1318 +f 1318 1167 1194 +f 1224 1392 1349 +f 1349 1194 1224 +f 1276 1456 1392 +f 1392 1224 1276 +f 1331 1534 1456 +f 1456 1276 1331 +f 1475 1609 1534 +f 1534 1331 1475 +f 1619 1661 1609 +f 1609 1475 1619 +f 1738 1889 1661 +f 1661 1619 1738 +f 976 1108 1099 +f 1099 974 976 +f 1002 1128 1108 +f 1108 976 1002 +f 1039 1167 1128 +f 1128 1002 1039 +f 1082 1194 1167 +f 1167 1039 1082 +f 1121 1224 1194 +f 1194 1082 1121 +f 1197 1276 1224 +f 1224 1121 1197 +f 1271 1331 1276 +f 1276 1197 1271 +f 1368 1475 1331 +f 1331 1271 1368 +f 1577 1619 1475 +f 1475 1368 1577 +f 1903 1738 1619 +f 1619 1577 1903 +f 877 976 974 +f 974 866 877 +f 902 1002 976 +f 976 877 902 +f 942 1039 1002 +f 1002 902 942 +f 984 1082 1039 +f 1039 942 984 +f 1066 1121 1082 +f 1082 984 1066 +f 1118 1197 1121 +f 1121 1066 1118 +f 1208 1271 1197 +f 1197 1118 1208 +f 1305 1368 1271 +f 1271 1208 1305 +f 1525 1577 1368 +f 1368 1305 1525 +f 1742 1903 1577 +f 1577 1525 1742 +f 783 877 866 +f 866 774 783 +f 815 902 877 +f 877 783 815 +f 867 942 902 +f 902 815 867 +f 927 984 942 +f 942 867 927 +f 997 1066 984 +f 984 927 997 +f 1085 1118 1066 +f 1066 997 1085 +f 1180 1208 1118 +f 1118 1085 1180 +f 1281 1305 1208 +f 1208 1180 1281 +f 1492 1525 1305 +f 1305 1281 1492 +f 1703 1742 1525 +f 1525 1492 1703 +f 717 783 774 +f 774 698 717 +f 756 815 783 +f 783 717 756 +f 805 867 815 +f 815 756 805 +f 887 927 867 +f 867 805 887 +f 956 997 927 +f 927 887 956 +f 1058 1085 997 +f 997 956 1058 +f 1148 1180 1085 +f 1085 1058 1148 +f 1267 1281 1180 +f 1180 1148 1267 +f 1467 1492 1281 +f 1281 1267 1467 +f 1905 1703 1492 +f 1492 1467 1905 +f 647 717 698 +f 698 636 647 +f 709 756 717 +f 717 647 709 +f 771 805 756 +f 756 709 771 +f 851 887 805 +f 805 771 851 +f 935 956 887 +f 887 851 935 +f 1031 1058 956 +f 956 935 1031 +f 1126 1148 1058 +f 1058 1031 1126 +f 1251 1267 1148 +f 1148 1126 1251 +f 1447 1467 1267 +f 1267 1251 1447 +f 1751 1905 1467 +f 1467 1447 1751 +f 630 647 636 +f 636 612 630 +f 671 709 647 +f 647 630 671 +f 749 771 709 +f 709 671 749 +f 829 851 771 +f 771 749 829 +f 921 935 851 +f 851 829 921 +f 1019 1031 935 +f 935 921 1019 +f 1114 1126 1031 +f 1031 1019 1114 +f 1243 1251 1126 +f 1126 1114 1243 +f 1441 1447 1251 +f 1251 1243 1441 +f 1896 1751 1447 +f 1447 1441 1896 +f 623 630 612 +f 612 603 623 +f 656 671 630 +f 630 623 656 +f 744 749 671 +f 671 656 744 +f 824 829 749 +f 749 744 824 +f 916 921 829 +f 829 824 916 +f 1018 1019 921 +f 921 916 1018 +f 1111 1114 1019 +f 1019 1018 1111 +f 1241 1243 1114 +f 1114 1111 1241 +f 1435 1441 1243 +f 1243 1241 1435 +f 1923 1896 1441 +f 1441 1435 1923 +f 617 623 603 +f 603 601 617 +f 650 656 623 +f 623 617 650 +f 734 744 656 +f 656 650 734 +f 818 824 744 +f 744 734 818 +f 912 916 824 +f 824 818 912 +f 1009 1018 916 +f 916 912 1009 +f 1102 1111 1018 +f 1018 1009 1102 +f 1235 1241 1111 +f 1111 1102 1235 +f 1431 1435 1241 +f 1241 1235 1431 +f 1759 1923 1435 +f 1435 1431 1759 +f 1735 1736 1963 +f 1735 1963 2015 +f 1735 2015 2088 +f 1735 2088 2166 +f 1735 2166 2230 +f 1735 2230 2273 +f 1735 2273 2304 +f 1735 2304 2320 +f 1735 2320 2328 +f 1735 2328 2335 +f 2005 1963 1736 +f 1736 1738 2005 +f 2149 2015 1963 +f 1963 2005 2149 +f 2291 2088 2015 +f 2015 2149 2291 +f 2346 2166 2088 +f 2088 2291 2346 +f 2398 2230 2166 +f 2166 2346 2398 +f 2428 2273 2230 +f 2230 2398 2428 +f 2457 2304 2273 +f 2273 2428 2457 +f 2494 2320 2304 +f 2304 2457 2494 +f 2514 2328 2320 +f 2320 2494 2514 +f 2524 2335 2328 +f 2328 2514 2524 +f 2047 2005 1738 +f 1738 1740 2047 +f 2256 2149 2005 +f 2005 2047 2256 +f 2353 2291 2149 +f 2149 2256 2353 +f 2427 2346 2291 +f 2291 2353 2427 +f 2503 2398 2346 +f 2346 2427 2503 +f 2542 2428 2398 +f 2398 2503 2542 +f 2583 2457 2428 +f 2428 2542 2583 +f 2622 2494 2457 +f 2457 2583 2622 +f 2648 2514 2494 +f 2494 2622 2648 +f 2650 2524 2514 +f 2514 2648 2650 +f 2099 2047 1740 +f 1740 1743 2099 +f 2319 2256 2047 +f 2047 2099 2319 +f 2414 2353 2256 +f 2256 2319 2414 +f 2504 2427 2353 +f 2353 2414 2504 +f 2558 2503 2427 +f 2427 2504 2558 +f 2640 2542 2503 +f 2503 2558 2640 +f 2682 2583 2542 +f 2542 2640 2682 +f 2722 2622 2583 +f 2583 2682 2722 +f 2745 2648 2622 +f 2622 2722 2745 +f 2758 2650 2648 +f 2648 2745 2758 +f 2130 2099 1743 +f 1743 1746 2130 +f 2343 2319 2099 +f 2099 2130 2343 +f 2442 2414 2319 +f 2319 2343 2442 +f 2537 2504 2414 +f 2414 2442 2537 +f 2625 2558 2504 +f 2504 2537 2625 +f 2695 2640 2558 +f 2558 2625 2695 +f 2755 2682 2640 +f 2640 2695 2755 +f 2807 2722 2682 +f 2682 2755 2807 +f 2839 2745 2722 +f 2722 2807 2839 +f 2850 2758 2745 +f 2745 2839 2850 +f 2157 2130 1746 +f 1746 1748 2157 +f 2357 2343 2130 +f 2130 2157 2357 +f 2474 2442 2343 +f 2343 2357 2474 +f 2566 2537 2442 +f 2442 2474 2566 +f 2668 2625 2537 +f 2537 2566 2668 +f 2735 2695 2625 +f 2625 2668 2735 +f 2817 2755 2695 +f 2695 2735 2817 +f 2868 2807 2755 +f 2755 2817 2868 +f 2905 2839 2807 +f 2807 2868 2905 +f 2926 2850 2839 +f 2839 2905 2926 +f 2177 2157 1748 +f 1748 1750 2177 +f 2373 2357 2157 +f 2157 2177 2373 +f 2496 2474 2357 +f 2357 2373 2496 +f 2591 2566 2474 +f 2474 2496 2591 +f 2687 2668 2566 +f 2566 2591 2687 +f 2771 2735 2668 +f 2668 2687 2771 +f 2851 2817 2735 +f 2735 2771 2851 +f 2913 2868 2817 +f 2817 2851 2913 +f 2975 2905 2868 +f 2868 2913 2975 +f 2986 2926 2905 +f 2905 2975 2986 +f 2183 2177 1750 +f 1750 1754 2183 +f 2381 2373 2177 +f 2177 2183 2381 +f 2508 2496 2373 +f 2373 2381 2508 +f 2603 2591 2496 +f 2496 2508 2603 +f 2701 2687 2591 +f 2591 2603 2701 +f 2793 2771 2687 +f 2687 2701 2793 +f 2873 2851 2771 +f 2771 2793 2873 +f 2951 2913 2851 +f 2851 2873 2951 +f 2992 2975 2913 +f 2913 2951 2992 +f 3010 2986 2975 +f 2975 2992 3010 +f 2189 2183 1754 +f 1754 1756 2189 +f 2383 2381 2183 +f 2183 2189 2383 +f 2513 2508 2381 +f 2381 2383 2513 +f 2606 2603 2508 +f 2508 2513 2606 +f 2708 2701 2603 +f 2603 2606 2708 +f 2800 2793 2701 +f 2701 2708 2800 +f 2880 2873 2793 +f 2793 2800 2880 +f 2968 2951 2873 +f 2873 2880 2968 +f 3001 2992 2951 +f 2951 2968 3001 +f 3021 3010 2992 +f 2992 3001 3021 +f 2195 2189 1756 +f 1756 1759 2195 +f 2390 2383 2189 +f 2189 2195 2390 +f 2517 2513 2383 +f 2383 2390 2517 +f 2612 2606 2513 +f 2513 2517 2612 +f 2709 2708 2606 +f 2606 2612 2709 +f 2801 2800 2708 +f 2708 2709 2801 +f 2886 2880 2800 +f 2800 2801 2886 +f 2970 2968 2880 +f 2880 2886 2970 +f 3004 3001 2968 +f 2968 2970 3004 +f 3022 3021 3001 +f 3001 3004 3022 From b5880d484a712f9ba693143a36c311ab5d5958c1 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 13:01:15 -0700 Subject: [PATCH 062/482] use teapot with normals --- models/teapot.obj | 12829 ++++++++++---------------------------------- 1 file changed, 2865 insertions(+), 9964 deletions(-) diff --git a/models/teapot.obj b/models/teapot.obj index c839837..b6c6810 100644 --- a/models/teapot.obj +++ b/models/teapot.obj @@ -1,9965 +1,2866 @@ -v -3.000000 1.800000 0.000000 -v -2.991600 1.800000 -0.081000 -v -2.991600 1.800000 0.081000 -v -2.989450 1.666162 0.000000 -v -2.985000 1.921950 0.000000 -v -2.985000 1.921950 0.000000 -v -2.981175 1.667844 -0.081000 -v -2.981175 1.667844 0.081000 -v -2.976687 1.920243 -0.081000 -v -2.976687 1.920243 0.081000 -v -2.968800 1.800000 -0.144000 -v -2.968800 1.800000 0.144000 -v -2.958713 1.672406 -0.144000 -v -2.958713 1.672406 0.144000 -v -2.957600 1.534800 0.000000 -v -2.957600 1.534800 0.000000 -v -2.954122 1.915609 -0.144000 -v -2.954122 1.915609 0.144000 -v -2.949693 1.537790 -0.081000 -v -2.949693 1.537790 0.081000 -v -2.940000 2.019600 0.000000 -v -2.935200 1.800000 -0.189000 -v -2.935200 1.800000 0.189000 -v -2.931958 2.016526 0.081000 -v -2.931958 2.016526 -0.081000 -v -2.928230 1.545907 -0.144000 -v -2.928230 1.545907 0.144000 -v -2.925611 1.679131 -0.189000 -v -2.925611 1.679131 0.189000 -v -2.920870 1.908779 -0.189000 -v -2.920870 1.908779 0.189000 -v -2.910131 2.008181 -0.144000 -v -2.910131 2.008181 0.144000 -v -2.904150 1.406137 0.000000 -v -2.904150 1.406137 0.000000 -v -2.896846 1.410135 0.081000 -v -2.896846 1.410135 -0.081000 -v -2.896602 1.557869 -0.189000 -v -2.896602 1.557869 0.189000 -v -2.894400 1.800000 -0.216000 -v -2.894400 1.800000 0.216000 -v -2.885416 1.687296 -0.216000 -v -2.885416 1.687296 0.216000 -v -2.880491 1.900487 -0.216000 -v -2.880491 1.900487 0.216000 -v -2.877965 1.995883 -0.189000 -v -2.877965 1.995883 0.189000 -v -2.877022 1.420985 -0.144000 -v -2.877022 1.420985 0.144000 -v -2.865000 2.095650 0.000000 -v -2.858195 1.572394 0.216000 -v -2.858195 1.572394 -0.216000 -v -2.857432 2.091511 -0.081000 -v -2.857432 2.091511 0.081000 -v -2.850000 1.800000 -0.225000 -v -2.850000 1.800000 0.225000 -v -2.847806 1.436974 0.189000 -v -2.847806 1.436974 -0.189000 -v -2.841675 1.696181 0.225000 -v -2.841675 1.696181 -0.225000 -v -2.838906 1.980950 -0.216000 -v -2.838906 1.980950 0.216000 -v -2.836889 2.080276 -0.144000 -v -2.836889 2.080276 0.144000 -v -2.836550 1.891463 -0.225000 -v -2.836550 1.891463 0.225000 -v -2.828800 1.280400 0.000000 -v -2.822326 1.285171 -0.081000 -v -2.822326 1.285171 0.081000 -v -2.816400 1.588200 -0.225000 -v -2.816400 1.588200 0.225000 -v -2.812331 1.456390 0.216000 -v -2.812331 1.456390 -0.216000 -v -2.806615 2.063720 -0.189000 -v -2.806615 2.063720 0.189000 -v -2.805600 1.800000 -0.216000 -v -2.805600 1.800000 0.216000 -v -2.804755 1.298122 -0.144000 -v -2.804755 1.298122 0.144000 -v -2.797934 1.705067 -0.216000 -v -2.797934 1.705067 0.216000 -v -2.796400 1.964700 0.225000 -v -2.796400 1.964700 -0.225000 -v -2.792609 1.882438 -0.216000 -v -2.792609 1.882438 0.216000 -v -2.778861 1.317206 -0.189000 -v -2.778861 1.317206 0.189000 -v -2.774605 1.604006 0.216000 -v -2.774605 1.604006 -0.216000 -v -2.773725 1.477519 0.225000 -v -2.773725 1.477519 -0.225000 -v -2.769854 2.043616 -0.216000 -v -2.769854 2.043616 0.216000 -v -2.764800 1.800000 -0.189000 -v -2.764800 1.800000 0.189000 -v -2.760000 2.152800 0.000000 -v -2.760000 2.152800 0.000000 -v -2.757739 1.713232 -0.189000 -v -2.757739 1.713232 0.189000 -v -2.753894 1.948450 -0.216000 -v -2.753894 1.948450 0.216000 -v -2.753123 2.147861 -0.081000 -v -2.753123 2.147861 0.081000 -v -2.752230 1.874146 -0.189000 -v -2.752230 1.874146 0.189000 -v -2.747418 1.340381 -0.216000 -v -2.747418 1.340381 0.216000 -v -2.736198 1.618531 -0.189000 -v -2.736198 1.618531 0.189000 -v -2.735119 1.498648 0.216000 -v -2.735119 1.498648 -0.216000 -v -2.734458 2.134454 -0.144000 -v -2.734458 2.134454 0.144000 -v -2.731250 1.157813 0.000000 -v -2.731250 1.157813 0.000000 -v -2.731200 1.800000 -0.144000 -v -2.731200 1.800000 0.144000 -v -2.729850 2.021737 -0.225000 -v -2.729850 2.021737 0.225000 -v -2.725825 1.163194 0.081000 -v -2.725825 1.163194 -0.081000 -v -2.724637 1.719956 -0.144000 -v -2.724637 1.719956 0.144000 -v -2.718978 1.867316 -0.144000 -v -2.718978 1.867316 0.144000 -v -2.714835 1.933517 -0.189000 -v -2.714835 1.933517 0.189000 -v -2.713200 1.365600 -0.225000 -v -2.713200 1.365600 0.225000 -v -2.711100 1.177800 -0.144000 -v -2.711100 1.177800 0.144000 -v -2.708400 1.800000 -0.081000 -v -2.708400 1.800000 0.081000 -v -2.706950 2.114698 -0.189000 -v -2.706950 2.114698 0.189000 -v -2.704570 1.630493 -0.144000 -v -2.704570 1.630493 0.144000 -v -2.702175 1.724519 -0.081000 -v -2.702175 1.724519 0.081000 -v -2.700000 1.800000 0.000000 -v -2.699644 1.518063 0.189000 -v -2.699644 1.518063 -0.189000 -v -2.696413 1.862682 -0.081000 -v -2.696413 1.862682 0.081000 -v -2.693900 1.726200 0.000000 -v -2.689846 1.999859 -0.216000 -v -2.689846 1.999859 0.216000 -v -2.689400 1.199325 -0.189000 -v -2.689400 1.199325 0.189000 -v -2.688100 1.860975 0.000000 -v -2.688100 1.860975 0.000000 -v -2.683107 1.638610 -0.081000 -v -2.683107 1.638610 0.081000 -v -2.682669 1.921219 -0.144000 -v -2.682669 1.921219 0.144000 -v -2.678982 1.390819 -0.216000 -v -2.678982 1.390819 0.216000 -v -2.675200 1.641600 0.000000 -v -2.675200 1.641600 0.000000 -v -2.673549 2.090707 -0.216000 -v -2.673549 2.090707 0.216000 -v -2.670428 1.534053 -0.144000 -v -2.670428 1.534053 0.144000 -v -2.663050 1.225463 -0.216000 -v -2.663050 1.225463 0.216000 -v -2.660842 1.912874 0.081000 -v -2.660842 1.912874 -0.081000 -v -2.653085 1.979755 -0.189000 -v -2.653085 1.979755 0.189000 -v -2.652800 1.909800 0.000000 -v -2.652800 1.909800 0.000000 -v -2.650604 1.544903 0.081000 -v -2.650604 1.544903 -0.081000 -v -2.647539 1.413994 -0.189000 -v -2.647539 1.413994 0.189000 -v -2.643300 1.548900 0.000000 -v -2.637200 2.064600 -0.225000 -v -2.637200 2.064600 0.225000 -v -2.634375 1.253906 0.225000 -v -2.634375 1.253906 -0.225000 -v -2.625000 2.193750 0.000000 -v -2.622811 1.963199 -0.144000 -v -2.622811 1.963199 0.144000 -v -2.621645 1.433078 -0.144000 -v -2.621645 1.433078 0.144000 -v -2.619050 2.188238 -0.081000 -v -2.619050 2.188238 0.081000 -v -2.611200 1.038600 0.000000 -v -2.611200 1.038600 0.000000 -v -2.607034 1.044497 0.081000 -v -2.607034 1.044497 -0.081000 -v -2.605700 1.282350 -0.216000 -v -2.605700 1.282350 0.216000 -v -2.604074 1.446029 -0.081000 -v -2.604074 1.446029 0.081000 -v -2.602900 2.173275 -0.144000 -v -2.602900 2.173275 0.144000 -v -2.602268 1.951964 -0.081000 -v -2.602268 1.951964 0.081000 -v -2.600851 2.038493 -0.216000 -v -2.600851 2.038493 0.216000 -v -2.597600 1.450800 0.000000 -v -2.595725 1.060502 -0.144000 -v -2.595725 1.060502 0.144000 -v -2.594700 1.947825 0.000000 -v -2.579350 1.308488 -0.189000 -v -2.579350 1.308488 0.189000 -v -2.579100 2.151225 -0.189000 -v -2.579100 2.151225 0.189000 -v -2.579059 1.084090 -0.189000 -v -2.579059 1.084090 0.189000 -v -2.567450 2.014502 -0.189000 -v -2.567450 2.014502 0.189000 -v -2.558822 1.112731 0.216000 -v -2.558822 1.112731 -0.216000 -v -2.557650 1.330013 -0.144000 -v -2.557650 1.330013 0.144000 -v -2.550200 2.124450 -0.216000 -v -2.550200 2.124450 0.216000 -v -2.542925 1.344619 0.081000 -v -2.542925 1.344619 -0.081000 -v -2.539942 1.994746 -0.144000 -v -2.539942 1.994746 0.144000 -v -2.537500 1.350000 0.000000 -v -2.537500 1.350000 0.000000 -v -2.536800 1.143900 0.225000 -v -2.536800 1.143900 -0.225000 -v -2.521277 1.981339 -0.081000 -v -2.521277 1.981339 0.081000 -v -2.518750 2.095312 -0.225000 -v -2.518750 2.095312 0.225000 -v -2.514778 1.175069 0.216000 -v -2.514778 1.175069 -0.216000 -v -2.514400 1.976400 0.000000 -v -2.514400 1.976400 0.000000 -v -2.494541 1.203710 -0.189000 -v -2.494541 1.203710 0.189000 -v -2.487300 2.066175 -0.216000 -v -2.487300 2.066175 0.216000 -v -2.477875 1.227298 -0.144000 -v -2.477875 1.227298 0.144000 -v -2.468350 0.922987 0.000000 -v -2.466566 1.243303 0.081000 -v -2.466566 1.243303 -0.081000 -v -2.465644 0.929375 -0.081000 -v -2.465644 0.929375 0.081000 -v -2.462400 1.249200 0.000000 -v -2.462400 1.249200 0.000000 -v -2.460000 2.221200 0.000000 -v -2.460000 2.221200 0.000000 -v -2.458400 2.039400 -0.189000 -v -2.458400 2.039400 0.189000 -v -2.458298 0.946711 -0.144000 -v -2.458298 0.946711 0.144000 -v -2.455229 2.215303 -0.081000 -v -2.455229 2.215303 0.081000 -v -2.447474 0.972260 0.189000 -v -2.447474 0.972260 -0.189000 -v -2.442278 2.199298 -0.144000 -v -2.442278 2.199298 0.144000 -v -2.434600 2.017350 -0.144000 -v -2.434600 2.017350 0.144000 -v -2.434329 1.003283 -0.216000 -v -2.434329 1.003283 0.216000 -v -2.423194 2.175710 -0.189000 -v -2.423194 2.175710 0.189000 -v -2.420025 1.037044 -0.225000 -v -2.420025 1.037044 0.225000 -v -2.418450 2.002387 -0.081000 -v -2.418450 2.002388 0.081000 -v -2.412500 1.996875 0.000000 -v -2.412500 1.996875 0.000000 -v -2.405721 1.070804 -0.216000 -v -2.405721 1.070804 0.216000 -v -2.400019 2.147069 -0.216000 -v -2.400019 2.147069 0.216000 -v -2.392576 1.101828 -0.189000 -v -2.392576 1.101828 0.189000 -v -2.381752 1.127376 -0.144000 -v -2.381752 1.127376 0.144000 -v -2.374800 2.115900 -0.225000 -v -2.374800 2.115900 0.225000 -v -2.374406 1.144713 0.081000 -v -2.374406 1.144713 -0.081000 -v -2.371700 1.151100 0.000000 -v -2.349581 2.084731 -0.216000 -v -2.349581 2.084731 0.216000 -v -2.326406 2.056090 -0.189000 -v -2.326406 2.056090 0.189000 -v -2.307322 2.032502 -0.144000 -v -2.307322 2.032502 0.144000 -v -2.302400 0.811200 0.000000 -v -2.302400 0.811200 0.000000 -v -2.301347 0.818122 0.081000 -v -2.301347 0.818122 -0.081000 -v -2.298490 0.836909 0.144000 -v -2.298490 0.836909 -0.144000 -v -2.294371 2.016497 -0.081000 -v -2.294371 2.016497 0.081000 -v -2.294278 0.864595 0.189000 -v -2.294278 0.864595 -0.189000 -v -2.289600 2.010600 0.000000 -v -2.289600 2.010600 0.000000 -v -2.289165 0.898214 0.216000 -v -2.289165 0.898214 -0.216000 -v -2.283600 0.934800 0.225000 -v -2.283600 0.934800 -0.225000 -v -2.278035 0.971386 0.216000 -v -2.278035 0.971386 -0.216000 -v -2.272922 1.005005 0.189000 -v -2.272922 1.005005 -0.189000 -v -2.268710 1.032691 -0.144000 -v -2.268710 1.032691 0.144000 -v -2.265853 1.051478 0.081000 -v -2.265853 1.051478 -0.081000 -v -2.265000 2.237850 0.000000 -v -2.264800 1.058400 0.000000 -v -2.264800 1.058400 0.000000 -v -2.261676 2.231720 -0.081000 -v -2.261676 2.231720 0.081000 -v -2.252655 2.215082 -0.144000 -v -2.252655 2.215082 0.144000 -v -2.239361 2.190562 -0.189000 -v -2.239361 2.190562 0.189000 -v -2.223218 2.160788 -0.216000 -v -2.223218 2.160788 0.216000 -v -2.205650 2.128387 0.225000 -v -2.205650 2.128388 -0.225000 -v -2.188082 2.095987 -0.216000 -v -2.188082 2.095987 0.216000 -v -2.171939 2.066213 -0.189000 -v -2.171939 2.066213 0.189000 -v -2.158645 2.041693 -0.144000 -v -2.158645 2.041693 0.144000 -v -2.149624 2.025055 -0.081000 -v -2.149624 2.025055 0.081000 -v -2.146300 2.018925 0.000000 -v -2.141100 0.973800 0.000000 -v -2.141100 0.973800 0.000000 -v -2.140315 0.966231 0.081000 -v -2.140315 0.966231 -0.081000 -v -2.138183 0.945685 0.144000 -v -2.138183 0.945685 -0.144000 -v -2.135041 0.915407 0.189000 -v -2.135041 0.915407 -0.189000 -v -2.131226 0.878641 0.216000 -v -2.131226 0.878641 -0.216000 -v -2.127075 0.838631 0.225000 -v -2.127075 0.838631 -0.225000 -v -2.122924 0.798621 0.216000 -v -2.122924 0.798621 -0.216000 -v -2.119109 0.761855 0.189000 -v -2.119109 0.761855 -0.189000 -v -2.115967 0.731578 0.144000 -v -2.115967 0.731578 -0.144000 -v -2.113835 0.711032 0.081000 -v -2.113835 0.711032 -0.081000 -v -2.113050 0.703463 0.000000 -v -2.113050 0.703463 0.000000 -v -2.040000 2.246400 0.000000 -v -2.040000 2.246400 0.000000 -v -2.038410 2.240150 -0.081000 -v -2.038410 2.240150 0.081000 -v -2.034093 2.223187 -0.144000 -v -2.034093 2.223187 0.144000 -v -2.027731 2.198189 -0.189000 -v -2.027731 2.198189 0.189000 -v -2.020006 2.167834 0.216000 -v -2.020006 2.167834 -0.216000 -v -2.011600 2.134800 0.225000 -v -2.011600 2.134800 -0.225000 -v -2.003194 2.101766 0.216000 -v -2.003194 2.101766 -0.216000 -v -2.000000 0.900000 0.000000 -v -2.000000 0.900000 0.000000 -v -2.000000 0.900000 0.000000 -v -1.997200 0.891600 0.081000 -v -1.997200 0.891600 -0.081000 -v -1.995469 2.071411 -0.189000 -v -1.995469 2.071411 0.189000 -v -1.992750 1.037175 -0.000000 -v -1.992750 1.037175 0.000000 -v -1.989600 0.868800 0.144000 -v -1.989600 0.868800 -0.144000 -v -1.989107 2.046413 0.144000 -v -1.989107 2.046413 -0.144000 -v -1.986000 0.771675 0.000000 -v -1.986000 0.771675 0.000000 -v -1.984790 2.029450 -0.081000 -v -1.984790 2.029450 0.081000 -v -1.983200 2.023200 0.000000 -v -1.983200 2.023200 0.000000 -v -1.978400 0.835200 0.189000 -v -1.978400 0.835200 -0.189000 -v -1.974240 0.900000 -0.328160 -v -1.974240 0.900000 -0.328160 -v -1.974240 0.900000 0.328160 -v -1.972000 1.178400 -0.000000 -v -1.972000 1.178400 0.000000 -v -1.967083 1.037175 -0.326970 -v -1.967083 1.037175 0.326970 -v -1.964800 0.794400 0.216000 -v -1.964800 0.794400 -0.216000 -v -1.960420 0.771675 -0.325863 -v -1.960420 0.771675 0.325863 -v -1.950000 0.750000 -0.225000 -v -1.950000 0.750000 0.225000 -v -1.948000 0.656400 0.000000 -v -1.948000 0.656400 0.000000 -v -1.946601 1.178400 -0.323566 -v -1.946601 1.178400 0.323566 -v -1.939250 1.323225 0.000000 -v -1.939250 1.323225 0.000000 -v -1.935200 0.705600 0.216000 -v -1.935200 0.705600 -0.216000 -v -1.922910 0.656400 -0.319628 -v -1.922910 0.656400 0.319628 -v -1.921600 0.664800 0.189000 -v -1.921600 0.664800 -0.189000 -v -1.914272 1.323225 -0.318192 -v -1.914272 1.323225 0.318192 -v -1.910400 0.631200 0.144000 -v -1.910400 0.631200 -0.144000 -v -1.902800 0.608400 0.081000 -v -1.902800 0.608400 -0.081000 -v -1.900000 0.600000 0.000000 -v -1.900000 0.600000 0.000000 -v -1.899520 0.900000 -0.638080 -v -1.899520 0.900000 -0.638080 -v -1.899520 0.900000 0.638080 -v -1.899520 0.900000 0.638080 -v -1.896000 1.471200 0.000000 -v -1.896000 1.471200 0.000000 -v -1.892634 1.037175 -0.635767 -v -1.892634 1.037175 0.635767 -v -1.892000 0.553725 0.000000 -v -1.892000 0.553725 0.000000 -v -1.886223 0.771675 -0.633613 -v -1.886223 0.771675 0.633613 -v -1.872927 1.178400 -0.629147 -v -1.872927 1.178400 0.629147 -v -1.871580 1.471200 -0.311096 -v -1.871580 1.471200 0.311096 -v -1.867631 0.553725 -0.310439 -v -1.867631 0.553725 0.310439 -v -1.850132 0.656400 -0.621490 -v -1.850132 0.656400 0.621490 -v -1.843750 1.621875 0.000000 -v -1.843750 1.621875 0.000000 -v -1.841822 1.323225 -0.618698 -v -1.841822 1.323225 0.618698 -v -1.824000 0.463200 -0.000000 -v -1.824000 0.463200 0.000000 -v -1.820003 1.621875 -0.302522 -v -1.820003 1.621875 0.302523 -v -1.800900 2.024775 0.000000 -v -1.800745 1.471200 -0.604900 -v -1.800745 1.471200 0.604900 -v -1.800507 0.463200 -0.299282 -v -1.800507 0.463200 0.299282 -v -1.800455 2.031069 -0.081000 -v -1.800455 2.031069 0.081000 -v -1.799246 2.048152 -0.144000 -v -1.799246 2.048152 0.144000 -v -1.797466 2.073326 -0.189000 -v -1.797466 2.073326 0.189000 -v -1.796946 0.553725 -0.603624 -v -1.796946 0.553725 0.603624 -v -1.795303 2.103896 -0.216000 -v -1.795303 2.103896 0.216000 -v -1.792950 2.137163 -0.225000 -v -1.792950 2.137163 0.225000 -v -1.790597 2.170429 -0.216000 -v -1.790597 2.170429 0.216000 -v -1.788434 2.200999 -0.189000 -v -1.788434 2.200999 0.189000 -v -1.786654 2.226173 -0.144000 -v -1.786654 2.226173 0.144000 -v -1.785445 2.243256 -0.081000 -v -1.785445 2.243256 0.081000 -v -1.785000 2.249550 0.000000 -v -1.784000 1.774800 -0.000000 -v -1.784000 1.774800 0.000000 -v -1.779680 0.900000 -0.925920 -v -1.779680 0.900000 -0.925920 -v -1.779680 0.900000 0.925920 -v -1.779680 0.900000 0.925920 -v -1.773229 1.037175 -0.922564 -v -1.773229 1.037175 0.922564 -v -1.767222 0.771675 -0.919439 -v -1.767222 0.771675 0.919439 -v -1.761022 1.774800 -0.292719 -v -1.761022 1.774800 0.292719 -v -1.754764 1.178400 -0.912957 -v -1.754764 1.178400 0.912957 -v -1.751120 1.621875 -0.588230 -v -1.751120 1.621875 0.588230 -v -1.750000 0.384375 -0.000000 -v -1.750000 0.384375 0.000000 -v -1.733408 0.656400 -0.901846 -v -1.733408 0.656400 0.901846 -v -1.732362 0.463200 -0.581929 -v -1.732362 0.463200 0.581929 -v -1.727460 0.384375 -0.287140 -v -1.727460 0.384375 0.287140 -v -1.725622 1.323225 -0.897795 -v -1.725622 1.323225 0.897795 -v -1.718250 1.929525 -0.000000 -v -1.718250 1.929525 0.000000 -v -1.696119 1.929525 -0.281930 -v -1.696119 1.929525 0.281930 -v -1.694372 1.774800 -0.569167 -v -1.694372 1.774800 0.569167 -v -1.687137 1.471200 -0.877772 -v -1.687137 1.471200 0.877772 -v -1.683577 0.553725 -0.875920 -v -1.683577 0.553725 0.875920 -v -1.676000 0.316800 0.000000 -v -1.676000 0.316800 0.000000 -v -1.662080 0.384375 -0.558320 -v -1.662080 0.384375 0.558320 -v -1.654413 0.316800 -0.274998 -v -1.654413 0.316800 0.274998 -v -1.648000 2.085600 0.000000 -v -1.648000 2.085600 0.000000 -v -1.640643 1.621875 -0.853583 -v -1.640643 1.621875 0.853583 -v -1.631925 1.929525 -0.548190 -v -1.631925 1.929525 0.548190 -v -1.626774 2.085600 -0.270404 -v -1.626774 2.085600 0.270404 -v -1.623068 0.463200 -0.844439 -v -1.623068 0.463200 0.844439 -v -1.618560 0.900000 -1.187840 -v -1.618560 0.900000 -1.187840 -v -1.618560 0.900000 1.187840 -v -1.618560 0.900000 1.187840 -v -1.612693 1.037175 -1.183534 -v -1.612693 1.037175 1.183534 -v -1.608000 0.260025 -0.000000 -v -1.608000 0.260025 0.000000 -v -1.607230 0.771675 -1.179525 -v -1.607230 0.771675 1.179525 -v -1.600000 2.025000 0.000000 -v -1.597200 2.031300 -0.081000 -v -1.597200 2.031300 0.081000 -v -1.595900 1.178400 -1.171210 -v -1.595900 1.178400 1.171210 -v -1.591798 0.316800 -0.534711 -v -1.591798 0.316800 0.534711 -v -1.589600 2.048400 -0.144000 -v -1.589600 2.048400 0.144000 -v -1.587475 1.774800 -0.825921 -v -1.587475 1.774800 0.825921 -v -1.587289 0.260025 0.263841 -v -1.587289 0.260025 -0.263841 -v -1.578400 2.073600 -0.189000 -v -1.578400 2.073600 0.189000 -v -1.576477 0.656400 -1.156956 -v -1.576477 0.656400 1.156956 -v -1.574750 2.242575 0.000000 -v -1.574750 2.242575 0.000000 -v -1.569396 1.323225 -1.151759 -v -1.569396 1.323225 1.151759 -v -1.565204 2.085600 -0.525778 -v -1.565204 2.085600 0.525778 -v -1.564800 2.104200 -0.216000 -v -1.564800 2.104200 0.216000 -v -1.557220 0.384375 -0.810180 -v -1.557220 0.384375 0.810180 -v -1.554467 2.242575 -0.258385 -v -1.554467 2.242575 0.258385 -v -1.552000 0.213600 0.000000 -v -1.552000 0.213600 0.000000 -v -1.550000 2.137500 -0.225000 -v -1.550000 2.137500 0.225000 -v -1.535200 2.170800 -0.216000 -v -1.535200 2.170800 0.216000 -v -1.534395 1.471200 -1.126072 -v -1.534395 1.471200 1.126072 -v -1.532010 0.213600 0.254652 -v -1.532010 0.213600 -0.254652 -v -1.531158 0.553725 -1.123697 -v -1.531158 0.553725 1.123697 -v -1.528968 1.929525 -0.795481 -v -1.528968 1.929525 0.795481 -v -1.527214 0.260025 -0.513016 -v -1.527214 0.260025 0.513016 -v -1.521600 2.201400 -0.189000 -v -1.521600 2.201400 0.189000 -v -1.514000 0.177075 0.000000 -v -1.514000 0.177075 0.000000 -v -1.510400 2.226600 -0.144000 -v -1.510400 2.226600 0.144000 -v -1.502800 2.243700 -0.081000 -v -1.502800 2.243700 0.081000 -v -1.500000 2.400000 0.000000 -v -1.500000 0.150000 0.000000 -v -1.500000 2.250000 0.000000 -v -1.500000 2.400000 0.000000 -v -1.500000 0.150000 0.000000 -v -1.496475 0.127575 -0.000000 -v -1.496475 0.127575 0.000000 -v -1.495635 2.242575 -0.502408 -v -1.495635 2.242575 0.502408 -v -1.494500 0.177075 0.248417 -v -1.494500 0.177075 -0.248417 -v -1.492110 1.621875 -1.095040 -v -1.492110 1.621875 1.095040 -v -1.491372 0.316800 -0.775921 -v -1.491372 0.316800 0.775921 -v -1.480800 0.105600 0.000000 -v -1.480800 0.105600 -0.000000 -v -1.480680 2.400000 -0.246120 -v -1.480680 0.150000 0.246120 -v -1.480680 2.400000 0.246120 -v -1.480680 0.150000 -0.246120 -v -1.480680 0.150000 -0.246120 -v -1.480680 0.150000 0.246120 -v -1.480325 2.435437 0.000000 -v -1.480325 2.435437 0.000000 -v -1.477200 0.127575 0.245542 -v -1.477200 0.127575 -0.245542 -v -1.476127 0.463200 -1.083310 -v -1.476127 0.463200 1.083310 -v -1.474028 0.213600 0.495150 -v -1.474028 0.213600 -0.495150 -v -1.466456 2.085600 -0.762958 -v -1.466456 2.085600 0.762958 -v -1.461727 0.105600 -0.242970 -v -1.461727 0.105600 0.242970 -v -1.461258 2.435437 -0.242892 -v -1.461258 2.435437 0.242892 -v -1.459600 2.463000 0.000000 -v -1.459600 2.463000 0.000000 -v -1.445325 0.084525 0.000000 -v -1.445325 0.084525 0.000000 -v -1.443756 1.774800 -1.059553 -v -1.443756 1.774800 1.059553 -v -1.440800 2.463000 -0.239491 -v -1.440800 2.463000 0.239491 -v -1.439025 2.482687 0.000000 -v -1.437937 0.177075 0.483027 -v -1.437937 0.177075 -0.483027 -v -1.430863 0.260025 0.744440 -v -1.430863 0.260025 -0.744440 -v -1.426709 0.084525 -0.237149 -v -1.426709 0.084525 0.237149 -v -1.424640 2.400000 -0.478560 -v -1.424640 0.150000 -0.478560 -v -1.424640 0.150000 -0.478560 -v -1.424640 0.150000 0.478560 -v -1.424640 0.150000 0.478560 -v -1.424640 2.400000 0.478560 -v -1.421292 0.127575 0.477435 -v -1.421292 0.127575 -0.477435 -v -1.420490 2.482687 -0.236115 -v -1.420490 2.482687 0.236115 -v -1.420000 0.900000 -1.420000 -v -1.420000 0.900000 -1.420000 -v -1.420000 0.900000 1.420000 -v -1.420000 0.900000 1.420000 -v -1.419800 2.494500 0.000000 -v -1.419800 2.494500 0.000000 -v -1.416240 0.384375 -1.039360 -v -1.416240 0.384375 1.039360 -v -1.414853 1.037175 -1.414853 -v -1.414853 1.037175 1.414853 -v -1.410060 0.771675 -1.410060 -v -1.410060 0.771675 1.410060 -v -1.406405 0.105600 -0.472434 -v -1.406405 0.105600 0.472434 -v -1.405953 2.435437 -0.472283 -v -1.405953 2.435437 0.472283 -v -1.403125 2.498438 0.000000 -v -1.403125 2.498438 0.000000 -v -1.401513 2.494500 -0.232961 -v -1.401513 2.494500 0.232961 -v -1.401276 2.242575 -0.729046 -v -1.401276 2.242575 0.729046 -v -1.400120 1.178400 -1.400120 -v -1.400120 1.178400 1.400120 -v -1.400000 2.400000 0.000000 -v -1.400000 2.400000 0.000000 -v -1.390545 1.929525 -1.020503 -v -1.390545 1.929525 1.020503 -v -1.390200 2.494500 0.000000 -v -1.390200 2.494500 0.000000 -v -1.386270 2.463000 -0.465671 -v -1.386270 2.463000 0.465671 -v -1.385925 2.435437 0.000000 -v -1.385925 2.435437 0.000000 -v -1.385053 2.498438 -0.230225 -v -1.385053 2.498438 0.230225 -v -1.383080 0.656400 -1.383080 -v -1.383080 0.656400 1.383080 -v -1.382400 0.064800 -0.000000 -v -1.382400 0.064800 0.000000 -v -1.382225 2.482687 -0.000000 -v -1.382225 2.482687 0.000000 -v -1.381968 2.400000 -0.229712 -v -1.381968 2.400000 0.229712 -v -1.381032 0.213600 0.718514 -v -1.381032 0.213600 -0.718514 -v -1.380400 2.463000 0.000000 -v -1.380400 2.463000 0.000000 -v -1.376868 1.323225 -1.376867 -v -1.376867 1.323225 1.376868 -v -1.372712 0.084525 -0.461116 -v -1.372712 0.084525 0.461116 -v -1.372294 2.494500 -0.228104 -v -1.372294 2.494500 0.228104 -v -1.368074 2.435437 -0.227403 -v -1.368074 2.435437 0.227403 -v -1.366728 2.482687 -0.459107 -v -1.366728 2.482687 0.459107 -v -1.364595 0.064800 -0.226824 -v -1.364595 0.064800 0.226824 -v -1.364422 2.482687 -0.226795 -v -1.364422 2.482687 0.226795 -v -1.362620 2.463000 -0.226496 -v -1.362620 2.463000 0.226496 -v -1.356353 0.316800 -0.995410 -v -1.356353 0.316800 0.995410 -v -1.348469 2.494500 -0.452973 -v -1.348469 2.494500 0.452973 -v -1.347218 0.177075 0.700921 -v -1.347218 0.177075 -0.700921 -v -1.346160 1.471200 -1.346160 -v -1.346160 1.471200 1.346160 -v -1.343320 0.553725 -1.343320 -v -1.343320 0.553725 1.343320 -v -1.334760 2.400000 -0.694440 -v -1.334760 0.150000 -0.694440 -v -1.334760 0.150000 0.694440 -v -1.334760 0.150000 0.694440 -v -1.334760 2.400000 0.694440 -v -1.334760 0.150000 -0.694440 -v -1.333693 2.085600 -0.978780 -v -1.333693 2.085600 0.978780 -v -1.332632 2.498438 -0.447653 -v -1.332632 2.498438 0.447653 -v -1.331623 0.127575 0.692808 -v -1.331623 0.127575 -0.692808 -v -1.329664 2.400000 -0.446656 -v -1.329664 2.400000 0.446656 -v -1.320356 2.494500 -0.443529 -v -1.320356 2.494500 0.443529 -v -1.317675 0.105600 -0.685551 -v -1.317675 0.105600 0.685551 -v -1.317252 2.435437 -0.685331 -v -1.317252 2.435437 0.685331 -v -1.316296 2.435437 -0.442166 -v -1.316296 2.435437 0.442166 -v -1.312948 0.064800 0.441041 -v -1.312948 0.064800 -0.441041 -v -1.312782 2.482687 -0.440985 -v -1.312782 2.482687 0.440985 -v -1.311049 2.463000 -0.440403 -v -1.311049 2.463000 0.440403 -v -1.309063 1.621875 -1.309063 -v -1.309063 1.621875 1.309063 -v -1.301322 0.260025 0.955023 -v -1.301322 0.260025 -0.955023 -v -1.300000 2.400000 0.000000 -v -1.300000 2.400000 0.000000 -v -1.298810 2.463000 -0.675736 -v -1.298810 2.463000 0.675736 -v -1.295040 0.463200 -1.295040 -v -1.295040 0.463200 1.295040 -v -1.286108 0.084525 -0.669128 -v -1.286108 0.084525 0.669128 -v -1.284375 0.046875 0.000000 -v -1.284375 0.046875 0.000000 -v -1.283256 2.400000 -0.213304 -v -1.283256 2.400000 0.213304 -v -1.280502 2.482687 -0.666211 -v -1.280502 2.482687 0.666211 -v -1.274600 2.440800 0.000000 -v -1.274600 2.440800 0.000000 -v -1.274414 2.242575 -0.935276 -v -1.274414 2.242575 0.935276 -v -1.267832 0.046875 -0.210740 -v -1.267832 0.046875 0.210740 -v -1.266640 1.774800 -1.266640 -v -1.266640 1.774800 1.266640 -v -1.263395 2.494500 -0.657311 -v -1.263395 2.494500 0.657311 -v -1.258183 2.440800 0.209136 -v -1.258183 2.440800 -0.209136 -v -1.256003 0.213600 0.921764 -v -1.256003 0.213600 -0.921764 -v -1.248557 2.498438 -0.649591 -v -1.248557 2.498438 0.649591 -v -1.245776 2.400000 -0.648144 -v -1.245776 2.400000 0.648144 -v -1.242500 0.384375 -1.242500 -v -1.242500 0.384375 1.242500 -v -1.237056 2.494500 -0.643607 -v -1.237056 2.494500 0.643607 -v -1.234688 2.400000 -0.414752 -v -1.234688 2.400000 0.414752 -v -1.233252 2.435437 -0.641628 -v -1.233252 2.435437 0.641628 -v -1.230115 0.064800 -0.639996 -v -1.230115 0.064800 0.639996 -v -1.229959 2.482687 -0.639915 -v -1.229959 2.482687 0.639915 -v -1.228335 2.463000 -0.639070 -v -1.228335 2.463000 0.639070 -v -1.225250 0.177075 0.899195 -v -1.225250 0.177075 -0.899195 -v -1.219958 1.929525 1.219958 -v -1.219958 1.929525 -1.219958 -v -1.219848 0.046875 -0.409767 -v -1.219848 0.046875 0.409767 -v -1.213920 2.400000 -0.890880 -v -1.213920 0.150000 -0.890880 -v -1.213920 0.150000 -0.890880 -v -1.213920 0.150000 0.890880 -v -1.213920 0.150000 0.890880 -v -1.213920 2.400000 0.890880 -v -1.211067 0.127575 0.888786 -v -1.211067 0.127575 -0.888786 -v -1.210564 2.440800 0.406648 -v -1.210564 2.440800 -0.406648 -v -1.204800 2.474400 0.000000 -v -1.204800 2.474400 0.000000 -v -1.198382 0.105600 -0.879477 -v -1.198382 0.105600 0.879477 -v -1.197997 2.435437 -0.879195 -v -1.197997 2.435437 0.879195 -v -1.189960 0.316800 -1.189960 -v -1.189960 0.316800 1.189960 -v -1.189282 2.474400 -0.197684 -v -1.189282 2.474400 0.197684 -v -1.187840 0.900000 -1.618560 -v -1.187840 0.900000 -1.618560 -v -1.187840 0.900000 1.618560 -v -1.187840 0.900000 1.618560 -v -1.183534 1.037175 -1.612693 -v -1.183534 1.037175 1.612693 -v -1.181225 2.463000 -0.866886 -v -1.181225 2.463000 0.866886 -v -1.179525 0.771675 -1.607230 -v -1.179525 0.771675 1.607230 -v -1.171210 1.178400 -1.595900 -v -1.171210 1.178400 1.595900 -v -1.170080 2.085600 -1.170080 -v -1.170080 2.085600 1.170080 -v -1.169673 0.084525 -0.858407 -v -1.169673 0.084525 0.858407 -v -1.164574 2.482687 -0.854666 -v -1.164574 2.482687 0.854666 -v -1.156956 0.656400 -1.576477 -v -1.156956 0.656400 1.576477 -v -1.156792 2.400000 -0.601848 -v -1.156792 2.400000 0.601848 -v -1.151759 1.323225 -1.569396 -v -1.151759 1.323225 1.569396 -v -1.149016 2.494500 -0.843248 -v -1.149016 2.494500 0.843248 -v -1.144271 2.474400 -0.384379 -v -1.144271 2.474400 0.384379 -v -1.143600 0.031200 0.000000 -v -1.143600 0.031200 0.000000 -v -1.142888 0.046875 -0.594614 -v -1.142888 0.046875 0.594614 -v -1.141680 0.260025 1.141680 -v -1.141680 0.260025 -1.141680 -v -1.135521 2.498438 -0.833344 -v -1.135521 2.498438 0.833344 -v -1.134190 2.440800 0.590089 -v -1.134190 2.440800 -0.590089 -v -1.132992 2.400000 -0.831488 -v -1.132992 2.400000 0.831488 -v -1.128870 0.031200 -0.187642 -v -1.128870 0.031200 0.187642 -v -1.126072 1.471200 -1.534395 -v -1.126072 1.471200 1.534395 -v -1.125061 2.494500 -0.825668 -v -1.125061 2.494500 0.825668 -v -1.123697 0.553725 -1.531158 -v -1.123697 0.553725 1.531158 -v -1.121601 2.435437 -0.823129 -v -1.121601 2.435437 0.823129 -v -1.118749 0.064800 -0.821035 -v -1.118749 0.064800 0.821035 -v -1.118607 2.482687 -0.820931 -v -1.118607 2.482687 0.820931 -v -1.118073 2.242575 -1.118073 -v -1.118073 2.242575 1.118073 -v -1.117130 2.463000 -0.819847 -v -1.117130 2.463000 0.819847 -v -1.101920 0.213600 1.101920 -v -1.101920 0.213600 -1.101920 -v -1.100200 2.502600 0.000000 -v -1.100200 2.502600 0.000000 -v -1.095040 1.621875 -1.492110 -v -1.095040 1.621875 1.492110 -v -1.086146 0.031200 0.364854 -v -1.086146 0.031200 -0.364854 -v -1.086029 2.502600 0.180521 -v -1.086029 2.502600 -0.180521 -v -1.083310 0.463200 -1.476127 -v -1.083310 0.463200 1.476127 -v -1.074940 0.177075 -1.074940 -v -1.074940 0.177075 1.074940 -v -1.072079 2.474400 -0.557774 -v -1.072079 2.474400 0.557774 -v -1.065000 2.400000 -1.065000 -v -1.065000 0.150000 -1.065000 -v -1.065000 0.150000 1.065000 -v -1.065000 2.400000 1.065000 -v -1.062497 0.127575 1.062497 -v -1.062497 0.127575 -1.062497 -v -1.059553 1.774800 -1.443756 -v -1.059553 1.774800 1.443756 -v -1.052064 2.400000 -0.772096 -v -1.052064 2.400000 0.772096 -v -1.051368 0.105600 -1.051368 -v -1.051368 0.105600 1.051368 -v -1.051031 2.435437 -1.051031 -v -1.051031 2.435437 1.051031 -v -1.044926 2.502600 -0.351008 -v -1.044926 2.502600 0.351008 -v -1.039419 0.046875 -0.762816 -v -1.039419 0.046875 0.762816 -v -1.039360 0.384375 -1.416240 -v -1.039360 0.384375 1.416240 -v -1.036316 2.463000 -1.036316 -v -1.036316 2.463000 1.036316 -v -1.031508 2.440800 0.757010 -v -1.031508 2.440800 -0.757010 -v -1.026181 0.084525 -1.026181 -v -1.026181 0.084525 1.026181 -v -1.021708 2.482687 -1.021708 -v -1.021708 2.482687 1.021708 -v -1.020503 1.929525 -1.390545 -v -1.020503 1.929525 1.390545 -v -1.017621 0.031200 0.529441 -v -1.017621 0.031200 -0.529441 -v -1.008058 2.494500 -1.008058 -v -1.008058 2.494500 1.008058 -v -0.996219 2.498438 -0.996219 -v -0.996219 2.498438 0.996219 -v -0.995410 0.316800 -1.356353 -v -0.995410 0.316800 1.356353 -v -0.994000 2.400000 -0.994000 -v -0.994000 2.400000 0.994000 -v -0.987042 2.494500 -0.987042 -v -0.987042 2.494500 0.987042 -v -0.984007 2.435437 -0.984007 -v -0.984007 2.435437 0.984007 -v -0.981504 0.064800 0.981504 -v -0.981504 0.064800 -0.981504 -v -0.981380 2.482687 -0.981380 -v -0.981380 2.482687 0.981380 -v -0.980084 2.463000 -0.980084 -v -0.980084 2.463000 0.980084 -v -0.979002 2.502600 0.509349 -v -0.979002 2.502600 -0.509349 -v -0.978780 2.085600 -1.333693 -v -0.978780 2.085600 1.333693 -v -0.975021 2.474400 -0.715555 -v -0.975021 2.474400 0.715555 -v -0.970400 2.527200 0.000000 -v -0.970400 2.527200 0.000000 -v -0.957901 2.527200 -0.159223 -v -0.957901 2.527200 0.159223 -v -0.955023 0.260025 1.301322 -v -0.955023 0.260025 -1.301322 -v -0.952425 0.018225 -0.000000 -v -0.952425 0.018225 0.000000 -v -0.940158 0.018225 0.156274 -v -0.940158 0.018225 -0.156274 -v -0.935276 2.242575 -1.274414 -v -0.935276 2.242575 1.274414 -v -0.925920 0.900000 -1.779680 -v -0.925920 0.900000 1.779680 -v -0.925920 0.900000 1.779680 -v -0.925920 0.900000 -1.779680 -v -0.925493 0.031200 0.679207 -v -0.925493 0.031200 -0.679207 -v -0.923000 2.400000 -0.923000 -v -0.923000 2.400000 0.923000 -v -0.922564 1.037175 1.773229 -v -0.922564 1.037175 -1.773229 -v -0.921764 0.213600 1.256003 -v -0.921764 0.213600 -1.256003 -v -0.921647 2.527200 -0.309596 -v -0.921647 2.527200 0.309596 -v -0.919439 0.771675 -1.767222 -v -0.919439 0.771675 1.767222 -v -0.912957 1.178400 -1.754764 -v -0.912957 1.178400 1.754764 -v -0.911906 0.046875 -0.911906 -v -0.911906 0.046875 0.911906 -v -0.904966 2.440800 0.904966 -v -0.904966 2.440800 -0.904966 -v -0.904575 0.018225 0.303862 -v -0.904575 0.018225 -0.303862 -v -0.901846 0.656400 -1.733408 -v -0.901846 0.656400 1.733408 -v -0.899195 0.177075 1.225250 -v -0.899195 0.177075 -1.225250 -v -0.897795 1.323225 -1.725622 -v -0.897795 1.323225 1.725622 -v -0.890880 0.150000 -1.213920 -v -0.890880 0.150000 1.213920 -v -0.890880 2.400000 -1.213920 -v -0.890880 0.150000 -1.213920 -v -0.890880 0.150000 1.213920 -v -0.890880 2.400000 1.213920 -v -0.890370 2.502600 -0.653431 -v -0.890370 2.502600 0.653431 -v -0.888786 0.127575 1.211067 -v -0.888786 0.127575 -1.211067 -v -0.879477 0.105600 -1.198382 -v -0.879477 0.105600 1.198382 -v -0.879195 2.435437 -1.197997 -v -0.879195 2.435437 1.197997 -v -0.877772 1.471200 -1.687137 -v -0.877772 1.471200 1.687137 -v -0.875920 0.553725 -1.683577 -v -0.875920 0.553725 1.683577 -v -0.866886 2.463000 -1.181225 -v -0.866886 2.463000 1.181225 -v -0.863501 2.527200 -0.449256 -v -0.863501 2.527200 0.449256 -v -0.858407 0.084525 -1.169673 -v -0.858407 0.084525 1.169673 -v -0.855408 2.474400 -0.855408 -v -0.855408 2.474400 0.855408 -v -0.854666 2.482687 -1.164574 -v -0.854666 2.482687 1.164574 -v -0.853583 1.621875 -1.640643 -v -0.853583 1.621875 1.640643 -v -0.847506 0.018225 -0.440935 -v -0.847506 0.018225 0.440935 -v -0.844439 0.463200 1.623068 -v -0.844439 0.463200 -1.623068 -v -0.843248 2.494500 -1.149016 -v -0.843248 2.494500 1.149016 -v -0.833344 2.498438 -1.135521 -v -0.833344 2.498438 1.135521 -v -0.831488 2.400000 -1.132992 -v -0.831488 2.400000 1.132992 -v -0.825921 1.774800 1.587475 -v -0.825921 1.774800 -1.587475 -v -0.825668 2.494500 -1.125061 -v -0.825668 2.494500 1.125061 -v -0.825000 2.550000 0.000000 -v -0.825000 2.550000 0.000000 -v -0.823129 2.435437 -1.121601 -v -0.823129 2.435437 1.121601 -v -0.821035 0.064800 1.118749 -v -0.821035 0.064800 -1.118749 -v -0.820931 2.482687 1.118607 -v -0.820931 2.482687 -1.118607 -v -0.819847 2.463000 -1.117130 -v -0.819847 2.463000 1.117130 -v -0.814374 2.550000 -0.135366 -v -0.814374 2.550000 0.135366 -v -0.811956 0.031200 0.811956 -v -0.811956 0.031200 -0.811956 -v -0.810180 0.384375 1.557220 -v -0.810180 0.384375 -1.557220 -v -0.795481 1.929525 1.528968 -v -0.795481 1.929525 -1.528968 -v -0.785325 2.527200 -0.576340 -v -0.785325 2.527200 0.576340 -v -0.783552 2.550000 -0.263208 -v -0.783552 2.550000 0.263208 -v -0.781142 2.502600 -0.781142 -v -0.781142 2.502600 0.781142 -v -0.775921 0.316800 -1.491372 -v -0.775921 0.316800 1.491372 -v -0.772096 2.400000 -1.052064 -v -0.772096 2.400000 1.052064 -v -0.770779 0.018225 0.565664 -v -0.770779 0.018225 -0.565664 -v -0.762958 2.085600 -1.466456 -v -0.762958 2.085600 1.466456 -v -0.762816 0.046875 -1.039419 -v -0.762816 0.046875 1.039419 -v -0.757010 2.440800 1.031508 -v -0.757010 2.440800 -1.031508 -v -0.744440 0.260025 1.430863 -v -0.744440 0.260025 -1.430863 -v -0.734118 2.550000 -0.381942 -v -0.734118 2.550000 0.381942 -v -0.729046 2.242575 -1.401276 -v -0.729046 2.242575 1.401276 -v -0.718514 0.213600 1.381032 -v -0.718514 0.213600 -1.381032 -v -0.715555 2.474400 -0.975021 -v -0.715555 2.474400 0.975021 -v -0.703200 0.008400 0.000000 -v -0.700921 0.177075 1.347218 -v -0.700921 0.177075 -1.347218 -v -0.694440 0.150000 -1.334760 -v -0.694440 0.150000 1.334760 -v -0.694440 2.400000 1.334760 -v -0.694440 0.150000 1.334760 -v -0.694440 2.400000 -1.334760 -v -0.694440 0.150000 -1.334760 -v -0.694143 0.008400 -0.115381 -v -0.694143 0.008400 0.115381 -v -0.692808 0.127575 1.331623 -v -0.692808 0.127575 -1.331623 -v -0.688984 2.527200 -0.688984 -v -0.688984 2.527200 0.688984 -v -0.685551 0.105600 -1.317675 -v -0.685551 0.105600 1.317675 -v -0.685331 2.435437 -1.317252 -v -0.685331 2.435437 1.317252 -v -0.679207 0.031200 -0.925493 -v -0.679207 0.031200 0.925493 -v -0.676222 0.018225 0.676222 -v -0.676222 0.018225 -0.676222 -v -0.675736 2.463000 -1.298810 -v -0.675736 2.463000 1.298810 -v -0.673600 2.572800 0.000000 -v -0.673600 2.572800 0.000000 -v -0.669128 0.084525 -1.286108 -v -0.669128 0.084525 1.286108 -v -0.667871 0.008400 -0.224349 -v -0.667871 0.008400 0.224349 -v -0.667656 2.550000 -0.489984 -v -0.667656 2.550000 0.489984 -v -0.666211 2.482687 1.280502 -v -0.666211 2.482687 -1.280502 -v -0.664924 2.572800 -0.110524 -v -0.664924 2.572800 0.110524 -v -0.657311 2.494500 -1.263395 -v -0.657311 2.494500 1.263395 -v -0.653431 2.502600 -0.890370 -v -0.653431 2.502600 0.890370 -v -0.649591 2.498438 -1.248557 -v -0.649591 2.498438 1.248557 -v -0.648144 2.400000 -1.245776 -v -0.648144 2.400000 1.245776 -v -0.643607 2.494500 -1.237056 -v -0.643607 2.494500 1.237056 -v -0.641628 2.435437 -1.233252 -v -0.641628 2.435437 1.233252 -v -0.639996 0.064800 -1.230115 -v -0.639996 0.064800 1.230115 -v -0.639915 2.482687 1.229959 -v -0.639915 2.482687 -1.229959 -v -0.639758 2.572800 -0.214905 -v -0.639758 2.572800 0.214905 -v -0.639070 2.463000 -1.228335 -v -0.639070 2.463000 1.228335 -v -0.638080 0.900000 -1.899520 -v -0.638080 0.900000 -1.899520 -v -0.638080 0.900000 1.899520 -v -0.638080 0.900000 1.899520 -v -0.635767 1.037175 -1.892634 -v -0.635767 1.037175 1.892634 -v -0.633613 0.771675 -1.886223 -v -0.633613 0.771675 1.886223 -v -0.629147 1.178400 -1.872927 -v -0.629147 1.178400 1.872927 -v -0.625735 0.008400 0.325553 -v -0.625735 0.008400 -0.325553 -v -0.621490 0.656400 -1.850132 -v -0.621490 0.656400 1.850132 -v -0.618698 1.323225 -1.841822 -v -0.618698 1.323225 1.841822 -v -0.604900 1.471200 -1.800745 -v -0.604900 1.471200 1.800745 -v -0.603624 0.553725 -1.796946 -v -0.603624 0.553725 1.796946 -v -0.601848 2.400000 -1.156792 -v -0.601848 2.400000 1.156792 -v -0.599396 2.572800 -0.311850 -v -0.599396 2.572800 0.311850 -v -0.594614 0.046875 -1.142888 -v -0.594614 0.046875 1.142888 -v -0.590089 2.440800 1.134190 -v -0.590089 2.440800 -1.134190 -v -0.588230 1.621875 -1.751120 -v -0.588230 1.621875 1.751120 -v -0.585750 2.550000 -0.585750 -v -0.585750 2.550000 0.585750 -v -0.581929 0.463200 -1.732362 -v -0.581929 0.463200 1.732362 -v -0.576340 2.527200 -0.785325 -v -0.576340 2.527200 0.785325 -v -0.569167 1.774800 -1.694372 -v -0.569167 1.774800 1.694372 -v -0.569086 0.008400 -0.417645 -v -0.569086 0.008400 0.417645 -v -0.565664 0.018225 0.770779 -v -0.565664 0.018225 -0.770779 -v -0.558320 0.384375 -1.662080 -v -0.558320 0.384375 1.662080 -v -0.557774 2.474400 -1.072079 -v -0.557774 2.474400 1.072079 -v -0.548190 1.929525 -1.631925 -v -0.548190 1.929525 1.631925 -v -0.545131 2.572800 -0.400065 -v -0.545131 2.572800 0.400065 -v -0.534711 0.316800 -1.591798 -v -0.534711 0.316800 1.591798 -v -0.529441 0.031200 -1.017621 -v -0.529441 0.031200 1.017621 -v -0.525800 2.597400 0.000000 -v -0.525800 2.597400 0.000000 -v -0.525778 2.085600 -1.565204 -v -0.525778 2.085600 1.565204 -v -0.519028 2.597400 0.086273 -v -0.519028 2.597400 -0.086273 -v -0.513016 0.260025 -1.527214 -v -0.513016 0.260025 1.527214 -v -0.509349 2.502600 0.979002 -v -0.509349 2.502600 -0.979002 -v -0.502408 2.242575 -1.495635 -v -0.502408 2.242575 1.495635 -v -0.499384 2.597400 -0.167751 -v -0.499384 2.597400 0.167751 -v -0.499272 0.008400 -0.499272 -v -0.499272 0.008400 0.499272 -v -0.495150 0.213600 -1.474028 -v -0.495150 0.213600 1.474028 -v -0.489984 2.550000 -0.667656 -v -0.489984 2.550000 0.667656 -v -0.483027 0.177075 -1.437937 -v -0.483027 0.177075 1.437937 -v -0.478560 0.150000 1.424640 -v -0.478560 2.400000 -1.424640 -v -0.478560 0.150000 -1.424640 -v -0.478560 0.150000 -1.424640 -v -0.478560 0.150000 1.424640 -v -0.478560 2.400000 1.424640 -v -0.478256 2.572800 -0.478256 -v -0.478256 2.572800 0.478256 -v -0.477435 0.127575 1.421292 -v -0.477435 0.127575 -1.421292 -v -0.472434 0.105600 1.406405 -v -0.472434 0.105600 -1.406405 -v -0.472283 2.435437 -1.405953 -v -0.472283 2.435437 1.405953 -v -0.467878 2.597400 -0.243424 -v -0.467878 2.597400 0.243424 -v -0.465671 2.463000 -1.386270 -v -0.465671 2.463000 1.386270 -v -0.461116 0.084525 1.372712 -v -0.461116 0.084525 -1.372712 -v -0.459107 2.482687 -1.366728 -v -0.459107 2.482687 1.366728 -v -0.452973 2.494500 -1.348469 -v -0.452973 2.494500 1.348469 -v -0.449256 2.527200 -0.863501 -v -0.449256 2.527200 0.863501 -v -0.447653 2.498438 -1.332632 -v -0.447653 2.498438 1.332632 -v -0.446656 2.400000 -1.329664 -v -0.446656 2.400000 1.329664 -v -0.443529 2.494500 -1.320356 -v -0.443529 2.494500 1.320356 -v -0.442166 2.435437 -1.316296 -v -0.442166 2.435437 1.316296 -v -0.441041 0.064800 1.312948 -v -0.441041 0.064800 -1.312948 -v -0.440985 2.482687 -1.312782 -v -0.440985 2.482687 1.312782 -v -0.440935 0.018225 0.847506 -v -0.440935 0.018225 -0.847506 -v -0.440403 2.463000 -1.311049 -v -0.440403 2.463000 1.311049 -v -0.425519 2.597400 0.312283 -v -0.425519 2.597400 -0.312283 -v -0.417645 0.008400 -0.569086 -v -0.417645 0.008400 0.569086 -v -0.414752 2.400000 -1.234688 -v -0.414752 2.400000 1.234688 -v -0.409767 0.046875 1.219848 -v -0.409767 0.046875 -1.219848 -v -0.406648 2.440800 -1.210564 -v -0.406648 2.440800 1.210564 -v -0.400065 2.572800 -0.545131 -v -0.400065 2.572800 0.545131 -v -0.391200 2.625600 0.000000 -v -0.391200 2.625600 0.000000 -v -0.388275 0.002175 -0.000000 -v -0.388275 0.002175 0.000000 -v -0.386161 2.625600 -0.064188 -v -0.386161 2.625600 0.064188 -v -0.384379 2.474400 -1.144271 -v -0.384379 2.474400 1.144271 -v -0.383274 0.002175 -0.063708 -v -0.383274 0.002175 0.063708 -v -0.381942 2.550000 -0.734118 -v -0.381942 2.550000 0.734118 -v -0.373318 2.597400 -0.373318 -v -0.373318 2.597400 0.373318 -v -0.371546 2.625600 -0.124808 -v -0.371546 2.625600 0.124808 -v -0.368768 0.002175 -0.123875 -v -0.368768 0.002175 0.123875 -v -0.364854 0.031200 1.086146 -v -0.364854 0.031200 -1.086146 -v -0.358400 3.034800 0.000000 -v -0.358400 3.034800 0.000000 -v -0.358200 3.081150 0.000000 -v -0.358200 3.081150 0.000000 -v -0.353807 3.034800 -0.059016 -v -0.353807 3.034800 0.059016 -v -0.353610 3.081150 -0.058988 -v -0.353610 3.081150 0.058988 -v -0.351008 2.502600 -1.044926 -v -0.351008 2.502600 1.044926 -v -0.348105 2.625600 -0.181110 -v -0.348105 2.625600 0.181110 -v -0.345503 0.002175 -0.179756 -v -0.345503 0.002175 0.179756 -v -0.340477 3.034800 -0.114676 -v -0.340477 3.034800 0.114676 -v -0.340289 3.081150 -0.114619 -v -0.340289 3.081150 0.114619 -v -0.328160 0.900000 -1.974240 -v -0.328160 0.900000 1.974240 -v -0.328160 0.900000 1.974240 -v -0.326970 1.037175 -1.967083 -v -0.326970 1.037175 1.967083 -v -0.325863 0.771675 -1.960420 -v -0.325863 0.771675 1.960420 -v -0.325553 0.008400 -0.625735 -v -0.325553 0.008400 0.625735 -v -0.325000 2.981250 0.000000 -v -0.325000 2.981250 0.000000 -v -0.323566 1.178400 -1.946601 -v -0.323566 1.178400 1.946601 -v -0.320834 2.981250 -0.053508 -v -0.320834 2.981250 0.053508 -v -0.319628 0.656400 -1.922910 -v -0.319628 0.656400 1.922910 -v -0.319082 3.034800 -0.166306 -v -0.319082 3.034800 0.166306 -v -0.318907 3.081150 -0.166221 -v -0.318907 3.081150 0.166221 -v -0.318192 1.323225 -1.914272 -v -0.318192 1.323225 1.914272 -v -0.316590 2.625600 -0.232342 -v -0.316590 2.625600 0.232342 -v -0.314223 0.002175 -0.230604 -v -0.314223 0.002175 0.230604 -v -0.312283 2.597400 -0.425519 -v -0.312283 2.597400 0.425519 -v -0.311850 2.572800 -0.599396 -v -0.311850 2.572800 0.599396 -v -0.311096 1.471200 -1.871580 -v -0.311096 1.471200 1.871580 -v -0.310439 0.553725 -1.867631 -v -0.310439 0.553725 1.867631 -v -0.309596 2.527200 -0.921647 -v -0.309596 2.527200 0.921647 -v -0.308800 3.117600 0.000000 -v -0.308800 3.117600 0.000000 -v -0.308744 2.981250 -0.103976 -v -0.308744 2.981250 0.103976 -v -0.304843 3.117600 -0.050855 -v -0.304843 3.117600 0.050855 -v -0.303862 0.018225 0.904575 -v -0.303862 0.018225 -0.904575 -v -0.302523 1.621875 -1.820003 -v -0.302522 1.621875 1.820003 -v -0.299282 0.463200 -1.800507 -v -0.299282 0.463200 1.800507 -v -0.293360 3.117600 -0.098814 -v -0.293360 3.117600 0.098814 -v -0.292719 1.774800 -1.761022 -v -0.292719 1.774800 1.761022 -v -0.290295 3.034800 -0.213234 -v -0.290295 3.034800 0.213234 -v -0.290138 3.081150 -0.213123 -v -0.290138 3.081150 0.213123 -v -0.289340 2.981250 -0.150793 -v -0.289340 2.981250 0.150793 -v -0.287140 0.384375 -1.727460 -v -0.287140 0.384375 1.727460 -v -0.281930 1.929525 1.696119 -v -0.281930 1.929525 -1.696119 -v -0.279400 2.659200 0.000000 -v -0.277752 2.625600 -0.277752 -v -0.277752 2.625600 0.277752 -v -0.275801 2.659200 -0.045844 -v -0.275801 2.659200 0.045844 -v -0.275675 0.002175 -0.275675 -v -0.275675 0.002175 0.275675 -v -0.274998 0.316800 -1.654413 -v -0.274998 0.316800 1.654413 -v -0.274928 3.117600 -0.143301 -v -0.274928 3.117600 0.143301 -v -0.273600 2.923200 0.000000 -v -0.273600 2.923200 0.000000 -v -0.270404 2.085600 -1.626774 -v -0.270404 2.085600 1.626774 -v -0.270092 2.923200 -0.045032 -v -0.270092 2.923200 0.045032 -v -0.265363 2.659200 -0.089140 -v -0.265363 2.659200 0.089140 -v -0.263841 0.260025 1.587289 -v -0.263841 0.260025 -1.587289 -v -0.263232 2.981250 -0.193348 -v -0.263232 2.981250 0.193348 -v -0.263208 2.550000 -0.783552 -v -0.263208 2.550000 0.783552 -v -0.259910 2.923200 -0.087511 -v -0.259910 2.923200 0.087511 -v -0.258385 2.242575 -1.554467 -v -0.258385 2.242575 1.554467 -v -0.254788 3.034800 -0.254788 -v -0.254788 3.034800 0.254788 -v -0.254653 3.081150 -0.254653 -v -0.254653 3.081150 0.254653 -v -0.254652 0.213600 -1.532010 -v -0.254652 0.213600 1.532010 -v -0.250127 3.117600 -0.183734 -v -0.250127 3.117600 0.183734 -v -0.248621 2.659200 0.129351 -v -0.248621 2.659200 -0.129351 -v -0.248417 0.177075 -1.494500 -v -0.248417 0.177075 1.494500 -v -0.246120 0.150000 1.480680 -v -0.246120 2.400000 -1.480680 -v -0.246120 0.150000 -1.480680 -v -0.246120 0.150000 -1.480680 -v -0.246120 0.150000 1.480680 -v -0.246120 2.400000 1.480680 -v -0.245542 0.127575 1.477200 -v -0.245542 0.127575 -1.477200 -v -0.243569 2.923200 -0.126920 -v -0.243569 2.923200 0.126920 -v -0.243424 2.597400 0.467878 -v -0.243424 2.597400 -0.467878 -v -0.242970 0.105600 1.461727 -v -0.242970 0.105600 -1.461727 -v -0.242892 2.435437 -1.461258 -v -0.242892 2.435437 1.461258 -v -0.239491 2.463000 -1.440800 -v -0.239491 2.463000 1.440800 -v -0.237149 0.084525 1.426709 -v -0.237149 0.084525 -1.426709 -v -0.236115 2.482687 -1.420490 -v -0.236115 2.482687 1.420490 -v -0.232961 2.494500 -1.401513 -v -0.232961 2.494500 1.401513 -v -0.232342 2.625600 -0.316590 -v -0.232342 2.625600 0.316590 -v -0.231031 2.981250 -0.231031 -v -0.231031 2.981250 0.231031 -v -0.230604 0.002175 -0.314223 -v -0.230604 0.002175 0.314223 -v -0.230225 2.498438 -1.385053 -v -0.230225 2.498438 1.385053 -v -0.229712 2.400000 -1.381968 -v -0.229712 2.400000 1.381968 -v -0.228104 2.494500 -1.372294 -v -0.228104 2.494500 1.372294 -v -0.227403 2.435437 -1.368074 -v -0.227403 2.435437 1.368074 -v -0.226824 0.064800 1.364595 -v -0.226824 0.064800 -1.364595 -v -0.226795 2.482687 1.364422 -v -0.226795 2.482687 -1.364422 -v -0.226496 2.463000 -1.362620 -v -0.226496 2.463000 1.362620 -v -0.226113 2.659200 -0.165941 -v -0.226113 2.659200 0.165941 -v -0.224349 0.008400 0.667871 -v -0.224349 0.008400 -0.667871 -v -0.221585 2.923200 -0.162745 -v -0.221585 2.923200 0.162745 -v -0.219800 2.863350 0.000000 -v -0.219800 2.863350 0.000000 -v -0.219536 3.117600 -0.219536 -v -0.219536 3.117600 0.219536 -v -0.216979 2.863350 0.036157 -v -0.216979 2.863350 -0.036157 -v -0.214905 2.572800 -0.639758 -v -0.214905 2.572800 0.639758 -v -0.213304 2.400000 -1.283256 -v -0.213304 2.400000 1.283256 -v -0.213234 3.034800 -0.290295 -v -0.213234 3.034800 0.290295 -v -0.213123 3.081150 -0.290138 -v -0.213123 3.081150 0.290138 -v -0.210740 0.046875 -1.267832 -v -0.210740 0.046875 1.267832 -v -0.209136 2.440800 -1.258183 -v -0.209136 2.440800 1.258183 -v -0.208794 2.863350 0.070270 -v -0.208794 2.863350 -0.070270 -v -0.200000 2.700000 0.000000 -v -0.200000 2.700000 0.000000 -v -0.200000 2.700000 0.000000 -v -0.200000 2.700000 0.000000 -v -0.198374 2.659200 -0.198374 -v -0.198374 2.659200 0.198374 -v -0.197684 2.474400 -1.189282 -v -0.197684 2.474400 1.189282 -v -0.197424 2.700000 -0.032816 -v -0.197424 2.700000 0.032816 -v -0.197424 2.700000 0.032816 -v -0.197424 2.700000 -0.032816 -v -0.195658 2.863350 -0.101925 -v -0.195658 2.863350 0.101925 -v -0.194600 3.141450 0.000000 -v -0.194600 3.141450 0.000000 -v -0.194472 2.923200 -0.194472 -v -0.194472 2.923200 0.194472 -v -0.193348 2.981250 -0.263232 -v -0.193348 2.981250 0.263232 -v -0.192107 3.141450 -0.032048 -v -0.192107 3.141450 0.032048 -v -0.189952 2.700000 -0.063808 -v -0.189952 2.700000 0.063808 -v -0.189952 2.700000 0.063808 -v -0.189952 2.700000 -0.063808 -v -0.187642 0.031200 1.128870 -v -0.187642 0.031200 -1.128870 -v -0.184870 3.141450 -0.062272 -v -0.184870 3.141450 0.062272 -v -0.183734 3.117600 -0.250127 -v -0.183734 3.117600 0.250127 -v -0.181110 2.625600 0.348105 -v -0.181110 2.625600 -0.348105 -v -0.180521 2.502600 -1.086029 -v -0.180521 2.502600 1.086029 -v -0.179756 0.002175 -0.345503 -v -0.179756 0.002175 0.345503 -v -0.179200 2.804400 0.000000 -v -0.179200 2.804400 0.000000 -v -0.177989 2.863350 -0.130707 -v -0.177989 2.863350 0.130707 -v -0.177968 2.700000 -0.092592 -v -0.177968 2.700000 0.092592 -v -0.177968 2.700000 0.092592 -v -0.177968 2.700000 -0.092592 -v -0.176897 2.804400 0.029450 -v -0.176897 2.804400 -0.029450 -v -0.173255 3.141450 -0.090306 -v -0.173255 3.141450 0.090306 -v -0.170215 2.804400 0.057246 -v -0.170215 2.804400 -0.057246 -v -0.167751 2.597400 -0.499384 -v -0.167751 2.597400 0.499384 -v -0.167400 2.749050 0.000000 -v -0.167400 2.749050 0.000000 -v -0.166306 3.034800 -0.319082 -v -0.166306 3.034800 0.319082 -v -0.166221 3.081150 0.318907 -v -0.166221 3.081150 -0.318907 -v -0.165941 2.659200 -0.226113 -v -0.165941 2.659200 0.226113 -v -0.165245 2.749050 0.027480 -v -0.165245 2.749050 -0.027480 -v -0.162745 2.923200 -0.221585 -v -0.162745 2.923200 0.221585 -v -0.161856 2.700000 -0.118784 -v -0.161856 2.700000 0.118784 -v -0.161856 2.700000 0.118784 -v -0.161856 2.700000 -0.118784 -v -0.159496 2.804400 0.083047 -v -0.159496 2.804400 -0.083047 -v -0.159223 2.527200 -0.957901 -v -0.159223 2.527200 0.957901 -v -0.158995 2.749050 0.053428 -v -0.158995 2.749050 -0.053428 -v -0.157626 3.141450 -0.115787 -v -0.157626 3.141450 0.115787 -v -0.156274 0.018225 0.940158 -v -0.156274 0.018225 -0.940158 -v -0.156200 2.863350 -0.156200 -v -0.156200 2.863350 0.156200 -v -0.150793 2.981250 -0.289340 -v -0.150793 2.981250 0.289340 -v -0.148969 2.749050 0.077523 -v -0.148969 2.749050 -0.077523 -v -0.145078 2.804400 0.106513 -v -0.145078 2.804400 -0.106513 -v -0.143301 3.117600 -0.274928 -v -0.143301 3.117600 0.274928 -v -0.142000 2.700000 -0.142000 -v -0.142000 2.700000 0.142000 -v -0.142000 2.700000 0.142000 -v -0.142000 2.700000 -0.142000 -v -0.138348 3.141450 -0.138348 -v -0.138348 3.141450 0.138348 -v -0.135489 2.749050 0.099446 -v -0.135489 2.749050 -0.099446 -v -0.135366 2.550000 -0.814374 -v -0.135366 2.550000 0.814374 -v -0.130707 2.863350 -0.177989 -v -0.130707 2.863350 0.177989 -v -0.129351 2.659200 0.248621 -v -0.129351 2.659200 -0.248621 -v -0.127304 2.804400 0.127304 -v -0.127304 2.804400 -0.127304 -v -0.126920 2.923200 -0.243569 -v -0.126920 2.923200 0.243569 -v -0.124808 2.625600 -0.371546 -v -0.124808 2.625600 0.371546 -v -0.123875 0.002175 0.368768 -v -0.123875 0.002175 -0.368768 -v -0.118874 2.749050 0.118874 -v -0.118874 2.749050 -0.118874 -v -0.118784 2.700000 -0.161856 -v -0.118784 2.700000 0.161856 -v -0.118784 2.700000 0.161856 -v -0.118784 2.700000 -0.161856 -v -0.115787 3.141450 -0.157626 -v -0.115787 3.141450 0.157626 -v -0.115381 0.008400 0.694143 -v -0.115381 0.008400 -0.694143 -v -0.114676 3.034800 -0.340477 -v -0.114676 3.034800 0.340477 -v -0.114619 3.081150 -0.340289 -v -0.114619 3.081150 0.340289 -v -0.110524 2.572800 -0.664924 -v -0.110524 2.572800 0.664924 -v -0.106513 2.804400 -0.145078 -v -0.106513 2.804400 0.145078 -v -0.103976 2.981250 -0.308744 -v -0.103976 2.981250 0.308744 -v -0.101925 2.863350 -0.195658 -v -0.101925 2.863350 0.195658 -v -0.099446 2.749050 0.135489 -v -0.099446 2.749050 -0.135489 -v -0.098814 3.117600 -0.293360 -v -0.098814 3.117600 0.293360 -v -0.092592 2.700000 -0.177968 -v -0.092592 2.700000 0.177968 -v -0.092592 2.700000 -0.177968 -v -0.092592 2.700000 0.177968 -v -0.090306 3.141450 -0.173255 -v -0.090306 3.141450 0.173255 -v -0.089140 2.659200 -0.265363 -v -0.089140 2.659200 0.265363 -v -0.087511 2.923200 -0.259910 -v -0.087511 2.923200 0.259910 -v -0.086273 2.597400 -0.519028 -v -0.086273 2.597400 0.519028 -v -0.083047 2.804400 -0.159496 -v -0.083047 2.804400 0.159496 -v -0.077523 2.749050 -0.148969 -v -0.077523 2.749050 0.148969 -v -0.070270 2.863350 -0.208794 -v -0.070270 2.863350 0.208794 -v -0.064188 2.625600 -0.386161 -v -0.064188 2.625600 0.386161 -v -0.063808 2.700000 -0.189952 -v -0.063808 2.700000 0.189952 -v -0.063808 2.700000 -0.189952 -v -0.063808 2.700000 0.189952 -v -0.063708 0.002175 0.383274 -v -0.063708 0.002175 -0.383274 -v -0.062272 3.141450 -0.184870 -v -0.062272 3.141450 0.184870 -v -0.059016 3.034800 -0.353807 -v -0.059016 3.034800 0.353807 -v -0.058988 3.081150 -0.353610 -v -0.058988 3.081150 0.353610 -v -0.057246 2.804400 -0.170215 -v -0.057246 2.804400 0.170215 -v -0.053508 2.981250 -0.320834 -v -0.053508 2.981250 0.320834 -v -0.053428 2.749050 -0.158995 -v -0.053428 2.749050 0.158995 -v -0.050855 3.117600 -0.304843 -v -0.050855 3.117600 0.304843 -v -0.045844 2.659200 -0.275801 -v -0.045844 2.659200 0.275801 -v -0.045032 2.923200 -0.270092 -v -0.045032 2.923200 0.270092 -v -0.036157 2.863350 -0.216979 -v -0.036157 2.863350 0.216979 -v -0.032816 2.700000 -0.197424 -v -0.032816 2.700000 0.197424 -v -0.032816 2.700000 -0.197424 -v -0.032816 2.700000 0.197424 -v -0.032048 3.141450 -0.192107 -v -0.032048 3.141450 0.192107 -v -0.029450 2.804400 -0.176897 -v -0.029450 2.804400 0.176897 -v -0.027480 2.749050 -0.165245 -v -0.027480 2.749050 0.165245 -v -0.000000 0.260025 1.608000 -v -0.000000 1.929525 1.718250 -v -0.000000 2.085600 -1.648000 -v -0.000000 0.656400 -1.948000 -v -0.000000 0.771675 -1.986000 -v -0.000000 2.482687 1.382225 -v -0.000000 2.700000 -0.200000 -v -0.000000 0.127575 1.496475 -v -0.000000 2.474400 -1.204800 -v -0.000000 2.749050 -0.167400 -v -0.000000 0.018225 0.952425 -v -0.000000 0.046875 -1.284375 -v -0.000000 0.064800 1.382400 -v -0.000000 0.384375 1.750000 -v -0.000000 0.463200 1.824000 -v -0.000000 0.553725 -1.892000 -v -0.000000 1.037175 1.992750 -v -0.000000 1.178400 1.972000 -v -0.000000 1.323225 -1.939250 -v -0.000000 1.621875 -1.843750 -v -0.000000 1.774800 1.784000 -v -0.000000 2.400000 -1.300000 -v -0.000000 2.435437 -1.480325 -v -0.000000 2.435437 -1.385925 -v -0.000000 2.463000 -1.459600 -v -0.000000 2.463000 -1.380400 -v -0.000000 2.494500 -1.390200 -v -0.000000 2.502600 -1.100200 -v -0.000000 2.804400 -0.179200 -v -0.000000 2.863350 -0.219800 -v -0.000000 2.572800 -0.673600 -v -0.000000 0.105600 1.480800 -v -0.000000 0.177075 -1.514000 -v -0.000000 2.494500 -1.419800 -v -0.000000 2.527200 -0.970400 -v -0.000000 2.923200 -0.273600 -v -0.000000 3.117600 -0.308800 -v -0.000000 2.597400 -0.525800 -v -0.000000 2.700000 -0.200000 -v -0.000000 2.981250 -0.325000 -v -0.000000 3.141450 -0.194600 -v -0.000000 0.002175 0.388275 -v -0.000000 3.081150 -0.358200 -v 0.000000 0.000000 0.000000 -v 0.000000 0.002175 -0.388275 -v 0.000000 0.002175 0.388275 -v 0.000000 0.008400 -0.703200 -v 0.000000 0.008400 0.703200 -v 0.000000 0.018225 -0.952425 -v 0.000000 0.018225 0.952425 -v 0.000000 0.031200 -1.143600 -v 0.000000 0.031200 -1.143600 -v 0.000000 0.031200 1.143600 -v 0.000000 0.031200 1.143600 -v 0.000000 0.046875 -1.284375 -v 0.000000 0.046875 1.284375 -v 0.000000 0.064800 -1.382400 -v 0.000000 0.064800 1.382400 -v 0.000000 0.084525 -1.445325 -v 0.000000 0.084525 -1.445325 -v 0.000000 0.084525 1.445325 -v 0.000000 0.084525 1.445325 -v 0.000000 0.105600 -1.480800 -v 0.000000 0.105600 1.480800 -v 0.000000 0.127575 -1.496475 -v 0.000000 0.127575 1.496475 -v 0.000000 0.150000 -1.500000 -v 0.000000 0.150000 -1.500000 -v 0.000000 0.150000 1.500000 -v 0.000000 0.150000 1.500000 -v 0.000000 0.177075 -1.514000 -v 0.000000 0.177075 1.514000 -v 0.000000 0.213600 -1.552000 -v 0.000000 0.213600 -1.552000 -v 0.000000 0.213600 1.552000 -v 0.000000 0.213600 1.552000 -v 0.000000 0.260025 -1.608000 -v 0.000000 0.260025 1.608000 -v 0.000000 0.316800 -1.676000 -v 0.000000 0.316800 -1.676000 -v 0.000000 0.316800 1.676000 -v 0.000000 0.316800 1.676000 -v 0.000000 0.384375 -1.750000 -v 0.000000 0.384375 1.750000 -v 0.000000 0.463200 -1.824000 -v 0.000000 0.463200 1.824000 -v 0.000000 0.553725 -1.892000 -v 0.000000 0.553725 1.892000 -v 0.000000 0.656400 -1.948000 -v 0.000000 0.656400 1.948000 -v 0.000000 0.771675 -1.986000 -v 0.000000 0.771675 1.986000 -v 0.000000 0.900000 -2.000000 -v 0.000000 0.900000 -2.000000 -v 0.000000 0.900000 2.000000 -v 0.000000 0.900000 2.000000 -v 0.000000 1.037175 -1.992750 -v 0.000000 1.037175 1.992750 -v 0.000000 1.178400 -1.972000 -v 0.000000 1.178400 1.972000 -v 0.000000 1.323225 -1.939250 -v 0.000000 1.323225 1.939250 -v 0.000000 1.471200 -1.896000 -v 0.000000 1.471200 -1.896000 -v 0.000000 1.471200 1.896000 -v 0.000000 1.471200 1.896000 -v 0.000000 1.621875 -1.843750 -v 0.000000 1.621875 1.843750 -v 0.000000 1.774800 -1.784000 -v 0.000000 1.774800 1.784000 -v 0.000000 1.929525 -1.718250 -v 0.000000 1.929525 1.718250 -v 0.000000 2.085600 -1.648000 -v 0.000000 2.085600 1.648000 -v 0.000000 2.242575 -1.574750 -v 0.000000 2.242575 -1.574750 -v 0.000000 2.242575 1.574750 -v 0.000000 2.242575 1.574750 -v 0.000000 2.400000 -1.500000 -v 0.000000 2.400000 -1.500000 -v 0.000000 2.400000 -1.400000 -v 0.000000 2.400000 -1.400000 -v 0.000000 2.400000 -1.300000 -v 0.000000 2.400000 1.300000 -v 0.000000 2.400000 1.400000 -v 0.000000 2.400000 1.400000 -v 0.000000 2.400000 1.500000 -v 0.000000 2.400000 1.500000 -v 0.000000 2.435437 -1.480325 -v 0.000000 2.435437 -1.385925 -v 0.000000 2.435437 1.385925 -v 0.000000 2.435437 1.480325 -v 0.000000 2.440800 -1.274600 -v 0.000000 2.440800 -1.274600 -v 0.000000 2.440800 1.274600 -v 0.000000 2.440800 1.274600 -v 0.000000 2.463000 -1.459600 -v 0.000000 2.463000 -1.380400 -v 0.000000 2.463000 1.380400 -v 0.000000 2.463000 1.459600 -v 0.000000 2.474400 -1.204800 -v 0.000000 2.474400 1.204800 -v 0.000000 2.482687 -1.439025 -v 0.000000 2.482687 -1.382225 -v 0.000000 2.482687 1.382225 -v 0.000000 2.482687 1.439025 -v 0.000000 2.494500 -1.419800 -v 0.000000 2.494500 -1.390200 -v 0.000000 2.494500 1.390200 -v 0.000000 2.494500 1.419800 -v 0.000000 2.498438 -1.403125 -v 0.000000 2.498438 -1.403125 -v 0.000000 2.498438 1.403125 -v 0.000000 2.498438 1.403125 -v 0.000000 2.502600 -1.100200 -v 0.000000 2.502600 1.100200 -v 0.000000 2.527200 -0.970400 -v 0.000000 2.527200 0.970400 -v 0.000000 2.550000 -0.825000 -v 0.000000 2.550000 -0.825000 -v 0.000000 2.550000 0.825000 -v 0.000000 2.550000 0.825000 -v 0.000000 2.572800 -0.673600 -v 0.000000 2.572800 0.673600 -v 0.000000 2.597400 -0.525800 -v 0.000000 2.597400 0.525800 -v 0.000000 2.625600 -0.391200 -v 0.000000 2.625600 -0.391200 -v 0.000000 2.625600 0.391200 -v 0.000000 2.625600 0.391200 -v 0.000000 2.659200 -0.279400 -v 0.000000 2.659200 0.279400 -v 0.000000 2.700000 -0.200000 -v 0.000000 2.700000 -0.200000 -v 0.000000 2.700000 0.200000 -v 0.000000 2.700000 0.200000 -v 0.000000 2.749050 -0.167400 -v 0.000000 2.749050 0.167400 -v 0.000000 2.804400 -0.179200 -v 0.000000 2.804400 0.179200 -v 0.000000 2.863350 -0.219800 -v 0.000000 2.863350 0.219800 -v 0.000000 2.923200 -0.273600 -v 0.000000 2.923200 0.273600 -v 0.000000 2.981250 -0.325000 -v 0.000000 2.981250 0.325000 -v 0.000000 3.034800 -0.358400 -v 0.000000 3.034800 -0.358400 -v 0.000000 3.034800 0.358400 -v 0.000000 3.034800 0.358400 -v 0.000000 3.081150 -0.358200 -v 0.000000 3.081150 0.358200 -v 0.000000 3.117600 -0.308800 -v 0.000000 3.117600 0.308800 -v 0.000000 3.141450 -0.194600 -v 0.000000 3.141450 0.194600 -v 0.000000 3.150000 0.000000 -v 0.000000 0.002175 -0.388275 -v 0.000000 3.081150 0.358200 -v 0.000000 2.597400 0.525800 -v 0.000000 2.700000 0.200000 -v 0.000000 2.981250 0.325000 -v 0.000000 3.141450 0.194600 -v 0.000000 3.117600 0.308800 -v 0.000000 0.105600 -1.480800 -v 0.000000 0.177075 1.514000 -v 0.000000 2.494500 1.419800 -v 0.000000 2.527200 0.970400 -v 0.000000 2.923200 0.273600 -v 0.000000 2.572800 0.673600 -v 0.000000 2.863350 0.219800 -v 0.000000 0.018225 -0.952425 -v 0.000000 0.046875 1.284375 -v 0.000000 0.064800 -1.382400 -v 0.000000 0.384375 -1.750000 -v 0.000000 0.463200 -1.824000 -v 0.000000 0.553725 1.892000 -v 0.000000 1.037175 -1.992750 -v 0.000000 1.178400 -1.972000 -v 0.000000 1.323225 1.939250 -v 0.000000 1.621875 1.843750 -v 0.000000 1.774800 -1.784000 -v 0.000000 2.400000 1.300000 -v 0.000000 2.435437 1.385925 -v 0.000000 2.435437 1.480325 -v 0.000000 2.463000 1.380400 -v 0.000000 2.463000 1.459600 -v 0.000000 2.494500 1.390200 -v 0.000000 2.502600 1.100200 -v 0.000000 2.804400 0.179200 -v 0.000000 2.749050 0.167400 -v 0.000000 0.127575 -1.496475 -v 0.000000 2.474400 1.204800 -v 0.000000 0.656400 1.948000 -v 0.000000 0.771675 1.986000 -v 0.000000 2.482687 -1.382225 -v 0.000000 2.700000 0.200000 -v 0.000000 0.260025 -1.608000 -v 0.000000 1.929525 -1.718250 -v 0.000000 2.085600 1.648000 -v 0.027480 2.749050 -0.165245 -v 0.027480 2.749050 0.165245 -v 0.029450 2.804400 -0.176897 -v 0.029450 2.804400 0.176897 -v 0.032048 3.141450 -0.192107 -v 0.032048 3.141450 0.192107 -v 0.032816 2.700000 -0.197424 -v 0.032816 2.700000 0.197424 -v 0.032816 2.700000 -0.197424 -v 0.032816 2.700000 0.197424 -v 0.036157 2.863350 -0.216979 -v 0.036157 2.863350 0.216979 -v 0.045032 2.923200 -0.270092 -v 0.045032 2.923200 0.270092 -v 0.045844 2.659200 -0.275801 -v 0.045844 2.659200 0.275801 -v 0.050855 3.117600 -0.304843 -v 0.050855 3.117600 0.304843 -v 0.053428 2.749050 -0.158995 -v 0.053428 2.749050 0.158995 -v 0.053508 2.981250 -0.320834 -v 0.053508 2.981250 0.320834 -v 0.057246 2.804400 -0.170215 -v 0.057246 2.804400 0.170215 -v 0.058988 3.081150 -0.353610 -v 0.058988 3.081150 0.353610 -v 0.059016 3.034800 -0.353807 -v 0.059016 3.034800 0.353807 -v 0.062272 3.141450 -0.184870 -v 0.062272 3.141450 0.184870 -v 0.063708 0.002175 0.383274 -v 0.063708 0.002175 -0.383274 -v 0.063808 2.700000 -0.189952 -v 0.063808 2.700000 0.189952 -v 0.063808 2.700000 -0.189952 -v 0.063808 2.700000 0.189952 -v 0.064188 2.625600 -0.386161 -v 0.064188 2.625600 0.386161 -v 0.070270 2.863350 -0.208794 -v 0.070270 2.863350 0.208794 -v 0.077523 2.749050 -0.148969 -v 0.077523 2.749050 0.148969 -v 0.083047 2.804400 -0.159496 -v 0.083047 2.804400 0.159496 -v 0.086273 2.597400 -0.519028 -v 0.086273 2.597400 0.519028 -v 0.087511 2.923200 -0.259910 -v 0.087511 2.923200 0.259910 -v 0.089140 2.659200 -0.265363 -v 0.089140 2.659200 0.265363 -v 0.090306 3.141450 -0.173255 -v 0.090306 3.141450 0.173255 -v 0.092592 2.700000 -0.177968 -v 0.092592 2.700000 0.177968 -v 0.092592 2.700000 -0.177968 -v 0.092592 2.700000 0.177968 -v 0.098814 3.117600 -0.293360 -v 0.098814 3.117600 0.293360 -v 0.099446 2.749050 0.135489 -v 0.099446 2.749050 -0.135489 -v 0.101925 2.863350 -0.195658 -v 0.101925 2.863350 0.195658 -v 0.103976 2.981250 -0.308744 -v 0.103976 2.981250 0.308744 -v 0.106513 2.804400 -0.145078 -v 0.106513 2.804400 0.145078 -v 0.110524 2.572800 -0.664924 -v 0.110524 2.572800 0.664924 -v 0.114619 3.081150 -0.340289 -v 0.114619 3.081150 0.340289 -v 0.114676 3.034800 -0.340477 -v 0.114676 3.034800 0.340477 -v 0.115381 0.008400 0.694143 -v 0.115381 0.008400 -0.694143 -v 0.115787 3.141450 -0.157626 -v 0.115787 3.141450 0.157626 -v 0.118784 2.700000 0.161856 -v 0.118784 2.700000 -0.161856 -v 0.118784 2.700000 -0.161856 -v 0.118784 2.700000 0.161856 -v 0.118874 2.749050 0.118874 -v 0.118874 2.749050 -0.118874 -v 0.123875 0.002175 0.368768 -v 0.123875 0.002175 -0.368768 -v 0.124808 2.625600 -0.371546 -v 0.124808 2.625600 0.371546 -v 0.126920 2.923200 -0.243569 -v 0.126920 2.923200 0.243569 -v 0.127304 2.804400 0.127304 -v 0.127304 2.804400 -0.127304 -v 0.129351 2.659200 0.248621 -v 0.129351 2.659200 -0.248621 -v 0.130707 2.863350 -0.177989 -v 0.130707 2.863350 0.177989 -v 0.135366 2.550000 -0.814374 -v 0.135366 2.550000 0.814374 -v 0.135489 2.749050 0.099446 -v 0.135489 2.749050 -0.099446 -v 0.138348 3.141450 -0.138348 -v 0.138348 3.141450 0.138348 -v 0.142000 2.700000 0.142000 -v 0.142000 2.700000 -0.142000 -v 0.142000 2.700000 -0.142000 -v 0.142000 2.700000 0.142000 -v 0.143301 3.117600 -0.274928 -v 0.143301 3.117600 0.274928 -v 0.145078 2.804400 0.106513 -v 0.145078 2.804400 -0.106513 -v 0.148969 2.749050 0.077523 -v 0.148969 2.749050 -0.077523 -v 0.150793 2.981250 -0.289340 -v 0.150793 2.981250 0.289340 -v 0.156200 2.863350 -0.156200 -v 0.156200 2.863350 0.156200 -v 0.156274 0.018225 0.940158 -v 0.156274 0.018225 -0.940158 -v 0.157626 3.141450 -0.115787 -v 0.157626 3.141450 0.115787 -v 0.158995 2.749050 0.053428 -v 0.158995 2.749050 -0.053428 -v 0.159223 2.527200 -0.957901 -v 0.159223 2.527200 0.957901 -v 0.159496 2.804400 0.083047 -v 0.159496 2.804400 -0.083047 -v 0.161856 2.700000 0.118784 -v 0.161856 2.700000 -0.118784 -v 0.161856 2.700000 -0.118784 -v 0.161856 2.700000 0.118784 -v 0.162745 2.923200 -0.221585 -v 0.162745 2.923200 0.221585 -v 0.165245 2.749050 0.027480 -v 0.165245 2.749050 -0.027480 -v 0.165941 2.659200 -0.226113 -v 0.165941 2.659200 0.226113 -v 0.166221 3.081150 0.318907 -v 0.166221 3.081150 -0.318907 -v 0.166306 3.034800 -0.319082 -v 0.166306 3.034800 0.319082 -v 0.167400 2.749050 -0.000000 -v 0.167400 2.749050 0.000000 -v 0.167751 2.597400 -0.499384 -v 0.167751 2.597400 0.499384 -v 0.170215 2.804400 0.057246 -v 0.170215 2.804400 -0.057246 -v 0.173255 3.141450 -0.090306 -v 0.173255 3.141450 0.090306 -v 0.176897 2.804400 0.029450 -v 0.176897 2.804400 -0.029450 -v 0.177968 2.700000 0.092592 -v 0.177968 2.700000 -0.092592 -v 0.177968 2.700000 -0.092592 -v 0.177968 2.700000 0.092592 -v 0.177989 2.863350 -0.130707 -v 0.177989 2.863350 0.130707 -v 0.179200 2.804400 -0.000000 -v 0.179200 2.804400 0.000000 -v 0.179756 0.002175 -0.345503 -v 0.179756 0.002175 0.345503 -v 0.180521 2.502600 -1.086029 -v 0.180521 2.502600 1.086029 -v 0.181110 2.625600 0.348105 -v 0.181110 2.625600 -0.348105 -v 0.183734 3.117600 -0.250127 -v 0.183734 3.117600 0.250127 -v 0.184870 3.141450 -0.062272 -v 0.184870 3.141450 0.062272 -v 0.187642 0.031200 1.128870 -v 0.187642 0.031200 -1.128870 -v 0.189952 2.700000 0.063808 -v 0.189952 2.700000 -0.063808 -v 0.189952 2.700000 -0.063808 -v 0.189952 2.700000 0.063808 -v 0.192107 3.141450 -0.032048 -v 0.192107 3.141450 0.032048 -v 0.193348 2.981250 -0.263232 -v 0.193348 2.981250 0.263232 -v 0.194472 2.923200 -0.194472 -v 0.194472 2.923200 0.194472 -v 0.194600 3.141450 0.000000 -v 0.194600 3.141450 -0.000000 -v 0.195658 2.863350 -0.101925 -v 0.195658 2.863350 0.101925 -v 0.197424 2.700000 0.032816 -v 0.197424 2.700000 -0.032816 -v 0.197424 2.700000 -0.032816 -v 0.197424 2.700000 0.032816 -v 0.197684 2.474400 -1.189282 -v 0.197684 2.474400 1.189282 -v 0.198374 2.659200 -0.198374 -v 0.198374 2.659200 0.198374 -v 0.200000 2.700000 -0.000000 -v 0.200000 2.700000 0.000000 -v 0.200000 2.700000 0.000000 -v 0.200000 2.700000 -0.000000 -v 0.208794 2.863350 0.070270 -v 0.208794 2.863350 -0.070270 -v 0.209136 2.440800 -1.258183 -v 0.209136 2.440800 1.258183 -v 0.210740 0.046875 -1.267832 -v 0.210740 0.046875 1.267832 -v 0.213123 3.081150 -0.290138 -v 0.213123 3.081150 0.290138 -v 0.213234 3.034800 -0.290295 -v 0.213234 3.034800 0.290295 -v 0.213304 2.400000 -1.283256 -v 0.213304 2.400000 1.283256 -v 0.214905 2.572800 -0.639758 -v 0.214905 2.572800 0.639758 -v 0.216979 2.863350 0.036157 -v 0.216979 2.863350 -0.036157 -v 0.219536 3.117600 -0.219536 -v 0.219536 3.117600 0.219536 -v 0.219800 2.863350 -0.000000 -v 0.219800 2.863350 0.000000 -v 0.221585 2.923200 -0.162745 -v 0.221585 2.923200 0.162745 -v 0.224349 0.008400 0.667871 -v 0.224349 0.008400 -0.667871 -v 0.226113 2.659200 -0.165941 -v 0.226113 2.659200 0.165941 -v 0.226496 2.463000 -1.362620 -v 0.226496 2.463000 1.362620 -v 0.226795 2.482687 1.364422 -v 0.226795 2.482687 -1.364422 -v 0.226824 0.064800 1.364595 -v 0.226824 0.064800 -1.364595 -v 0.227403 2.435437 -1.368074 -v 0.227403 2.435437 1.368074 -v 0.228104 2.494500 -1.372294 -v 0.228104 2.494500 1.372294 -v 0.229712 2.400000 -1.381968 -v 0.229712 2.400000 1.381968 -v 0.230225 2.498438 -1.385053 -v 0.230225 2.498438 1.385053 -v 0.230604 0.002175 -0.314223 -v 0.230604 0.002175 0.314223 -v 0.231031 2.981250 -0.231031 -v 0.231031 2.981250 0.231031 -v 0.232342 2.625600 -0.316590 -v 0.232342 2.625600 0.316590 -v 0.232961 2.494500 -1.401513 -v 0.232961 2.494500 1.401513 -v 0.236115 2.482687 -1.420490 -v 0.236115 2.482687 1.420490 -v 0.237149 0.084525 1.426709 -v 0.237149 0.084525 -1.426709 -v 0.239491 2.463000 -1.440800 -v 0.239491 2.463000 1.440800 -v 0.242892 2.435437 -1.461258 -v 0.242892 2.435437 1.461258 -v 0.242970 0.105600 1.461727 -v 0.242970 0.105600 -1.461727 -v 0.243424 2.597400 0.467878 -v 0.243424 2.597400 -0.467878 -v 0.243569 2.923200 -0.126920 -v 0.243569 2.923200 0.126920 -v 0.245542 0.127575 1.477200 -v 0.245542 0.127575 -1.477200 -v 0.246120 0.150000 -1.480680 -v 0.246120 2.400000 -1.480680 -v 0.246120 0.150000 1.480680 -v 0.246120 0.150000 1.480680 -v 0.246120 2.400000 1.480680 -v 0.246120 0.150000 -1.480680 -v 0.248417 0.177075 -1.494500 -v 0.248417 0.177075 1.494500 -v 0.248621 2.659200 0.129351 -v 0.248621 2.659200 -0.129351 -v 0.250127 3.117600 -0.183734 -v 0.250127 3.117600 0.183734 -v 0.254652 0.213600 -1.532010 -v 0.254652 0.213600 1.532010 -v 0.254653 3.081150 -0.254653 -v 0.254653 3.081150 0.254653 -v 0.254788 3.034800 -0.254788 -v 0.254788 3.034800 0.254788 -v 0.258385 2.242575 -1.554467 -v 0.258385 2.242575 1.554467 -v 0.259910 2.923200 -0.087511 -v 0.259910 2.923200 0.087511 -v 0.263208 2.550000 -0.783552 -v 0.263208 2.550000 0.783552 -v 0.263232 2.981250 -0.193348 -v 0.263232 2.981250 0.193348 -v 0.263841 0.260025 1.587289 -v 0.263841 0.260025 -1.587289 -v 0.265363 2.659200 -0.089140 -v 0.265363 2.659200 0.089140 -v 0.270092 2.923200 -0.045032 -v 0.270092 2.923200 0.045032 -v 0.270404 2.085600 -1.626774 -v 0.270404 2.085600 1.626774 -v 0.273600 2.923200 -0.000000 -v 0.273600 2.923200 0.000000 -v 0.274928 3.117600 -0.143301 -v 0.274928 3.117600 0.143301 -v 0.274998 0.316800 -1.654413 -v 0.274998 0.316800 1.654413 -v 0.275675 0.002175 -0.275675 -v 0.275675 0.002175 0.275675 -v 0.275801 2.659200 -0.045844 -v 0.275801 2.659200 0.045844 -v 0.277752 2.625600 -0.277752 -v 0.277752 2.625600 0.277752 -v 0.279400 2.659200 0.000000 -v 0.281930 1.929525 1.696119 -v 0.281930 1.929525 -1.696119 -v 0.287140 0.384375 -1.727460 -v 0.287140 0.384375 1.727460 -v 0.289340 2.981250 -0.150793 -v 0.289340 2.981250 0.150793 -v 0.290138 3.081150 -0.213123 -v 0.290138 3.081150 0.213123 -v 0.290295 3.034800 -0.213234 -v 0.290295 3.034800 0.213234 -v 0.292719 1.774800 -1.761022 -v 0.292719 1.774800 1.761022 -v 0.293360 3.117600 -0.098814 -v 0.293360 3.117600 0.098814 -v 0.299282 0.463200 -1.800507 -v 0.299282 0.463200 1.800507 -v 0.302522 1.621875 -1.820003 -v 0.302523 1.621875 1.820003 -v 0.303862 0.018225 0.904575 -v 0.303862 0.018225 -0.904575 -v 0.304843 3.117600 -0.050855 -v 0.304843 3.117600 0.050855 -v 0.308744 2.981250 -0.103976 -v 0.308744 2.981250 0.103976 -v 0.308800 3.117600 0.000000 -v 0.308800 3.117600 -0.000000 -v 0.309596 2.527200 -0.921647 -v 0.309596 2.527200 0.921647 -v 0.310439 0.553725 -1.867631 -v 0.310439 0.553725 1.867631 -v 0.311096 1.471200 -1.871580 -v 0.311096 1.471200 1.871580 -v 0.311850 2.572800 -0.599396 -v 0.311850 2.572800 0.599396 -v 0.312283 2.597400 -0.425519 -v 0.312283 2.597400 0.425519 -v 0.314223 0.002175 -0.230604 -v 0.314223 0.002175 0.230604 -v 0.316590 2.625600 -0.232342 -v 0.316590 2.625600 0.232342 -v 0.318192 1.323225 -1.914272 -v 0.318192 1.323225 1.914272 -v 0.318907 3.081150 -0.166221 -v 0.318907 3.081150 0.166221 -v 0.319082 3.034800 -0.166306 -v 0.319082 3.034800 0.166306 -v 0.319628 0.656400 -1.922910 -v 0.319628 0.656400 1.922910 -v 0.320834 2.981250 -0.053508 -v 0.320834 2.981250 0.053508 -v 0.323566 1.178400 -1.946601 -v 0.323566 1.178400 1.946601 -v 0.325000 2.981250 0.000000 -v 0.325000 2.981250 -0.000000 -v 0.325553 0.008400 -0.625735 -v 0.325553 0.008400 0.625735 -v 0.325863 0.771675 -1.960420 -v 0.325863 0.771675 1.960420 -v 0.326970 1.037175 -1.967083 -v 0.326970 1.037175 1.967083 -v 0.328160 0.900000 -1.974240 -v 0.328160 0.900000 -1.974240 -v 0.328160 0.900000 1.974240 -v 0.340289 3.081150 -0.114619 -v 0.340289 3.081150 0.114619 -v 0.340477 3.034800 -0.114676 -v 0.340477 3.034800 0.114676 -v 0.345503 0.002175 -0.179756 -v 0.345503 0.002175 0.179756 -v 0.348105 2.625600 -0.181110 -v 0.348105 2.625600 0.181110 -v 0.351008 2.502600 -1.044926 -v 0.351008 2.502600 1.044926 -v 0.353610 3.081150 -0.058988 -v 0.353610 3.081150 0.058988 -v 0.353807 3.034800 -0.059016 -v 0.353807 3.034800 0.059016 -v 0.358200 3.081150 -0.000000 -v 0.358200 3.081150 0.000000 -v 0.358400 3.034800 0.000000 -v 0.358400 3.034800 0.000000 -v 0.364854 0.031200 1.086146 -v 0.364854 0.031200 -1.086146 -v 0.368768 0.002175 -0.123875 -v 0.368768 0.002175 0.123875 -v 0.371546 2.625600 -0.124808 -v 0.371546 2.625600 0.124808 -v 0.373318 2.597400 -0.373318 -v 0.373318 2.597400 0.373318 -v 0.381942 2.550000 -0.734118 -v 0.381942 2.550000 0.734118 -v 0.383274 0.002175 -0.063708 -v 0.383274 0.002175 0.063708 -v 0.384379 2.474400 -1.144271 -v 0.384379 2.474400 1.144271 -v 0.386161 2.625600 -0.064188 -v 0.386161 2.625600 0.064188 -v 0.388275 0.002175 0.000000 -v 0.388275 0.002175 0.000000 -v 0.391200 2.625600 0.000000 -v 0.391200 2.625600 0.000000 -v 0.400065 2.572800 -0.545131 -v 0.400065 2.572800 0.545131 -v 0.406648 2.440800 -1.210564 -v 0.406648 2.440800 1.210564 -v 0.409767 0.046875 1.219848 -v 0.409767 0.046875 -1.219848 -v 0.414752 2.400000 -1.234688 -v 0.414752 2.400000 1.234688 -v 0.417645 0.008400 -0.569086 -v 0.417645 0.008400 0.569086 -v 0.425519 2.597400 0.312283 -v 0.425519 2.597400 -0.312283 -v 0.440403 2.463000 -1.311049 -v 0.440403 2.463000 1.311049 -v 0.440935 0.018225 0.847506 -v 0.440935 0.018225 -0.847506 -v 0.440985 2.482687 -1.312782 -v 0.440985 2.482687 1.312782 -v 0.441041 0.064800 1.312948 -v 0.441041 0.064800 -1.312948 -v 0.442166 2.435437 -1.316296 -v 0.442166 2.435437 1.316296 -v 0.443529 2.494500 -1.320356 -v 0.443529 2.494500 1.320356 -v 0.446656 2.400000 -1.329664 -v 0.446656 2.400000 1.329664 -v 0.447653 2.498438 -1.332632 -v 0.447653 2.498438 1.332632 -v 0.449256 2.527200 -0.863501 -v 0.449256 2.527200 0.863501 -v 0.452973 2.494500 -1.348469 -v 0.452973 2.494500 1.348469 -v 0.459107 2.482687 -1.366728 -v 0.459107 2.482687 1.366728 -v 0.461116 0.084525 1.372712 -v 0.461116 0.084525 -1.372712 -v 0.465671 2.463000 -1.386270 -v 0.465671 2.463000 1.386270 -v 0.467878 2.597400 -0.243424 -v 0.467878 2.597400 0.243424 -v 0.472283 2.435437 -1.405953 -v 0.472283 2.435437 1.405953 -v 0.472434 0.105600 1.406405 -v 0.472434 0.105600 -1.406405 -v 0.477435 0.127575 1.421292 -v 0.477435 0.127575 -1.421292 -v 0.478256 2.572800 -0.478256 -v 0.478256 2.572800 0.478256 -v 0.478560 0.150000 -1.424640 -v 0.478560 2.400000 -1.424640 -v 0.478560 0.150000 1.424640 -v 0.478560 0.150000 1.424640 -v 0.478560 0.150000 -1.424640 -v 0.478560 2.400000 1.424640 -v 0.483027 0.177075 -1.437937 -v 0.483027 0.177075 1.437937 -v 0.489984 2.550000 -0.667656 -v 0.489984 2.550000 0.667656 -v 0.495150 0.213600 -1.474028 -v 0.495150 0.213600 1.474028 -v 0.499272 0.008400 -0.499272 -v 0.499272 0.008400 0.499272 -v 0.499384 2.597400 -0.167751 -v 0.499384 2.597400 0.167751 -v 0.502408 2.242575 -1.495635 -v 0.502408 2.242575 1.495635 -v 0.509349 2.502600 0.979002 -v 0.509349 2.502600 -0.979002 -v 0.513016 0.260025 -1.527214 -v 0.513016 0.260025 1.527214 -v 0.519028 2.597400 0.086273 -v 0.519028 2.597400 -0.086273 -v 0.525778 2.085600 -1.565204 -v 0.525778 2.085600 1.565204 -v 0.525800 2.597400 -0.000000 -v 0.525800 2.597400 0.000000 -v 0.529441 0.031200 -1.017621 -v 0.529441 0.031200 1.017621 -v 0.534711 0.316800 -1.591798 -v 0.534711 0.316800 1.591798 -v 0.545131 2.572800 -0.400065 -v 0.545131 2.572800 0.400065 -v 0.548190 1.929525 -1.631925 -v 0.548190 1.929525 1.631925 -v 0.557774 2.474400 -1.072079 -v 0.557774 2.474400 1.072079 -v 0.558320 0.384375 -1.662080 -v 0.558320 0.384375 1.662080 -v 0.565664 0.018225 0.770779 -v 0.565664 0.018225 -0.770779 -v 0.569086 0.008400 -0.417645 -v 0.569086 0.008400 0.417645 -v 0.569167 1.774800 -1.694372 -v 0.569167 1.774800 1.694372 -v 0.576340 2.527200 -0.785325 -v 0.576340 2.527200 0.785325 -v 0.581929 0.463200 -1.732362 -v 0.581929 0.463200 1.732362 -v 0.585750 2.550000 -0.585750 -v 0.585750 2.550000 0.585750 -v 0.588230 1.621875 -1.751120 -v 0.588230 1.621875 1.751120 -v 0.590089 2.440800 1.134190 -v 0.590089 2.440800 -1.134190 -v 0.594614 0.046875 -1.142888 -v 0.594614 0.046875 1.142888 -v 0.599396 2.572800 -0.311850 -v 0.599396 2.572800 0.311850 -v 0.601848 2.400000 -1.156792 -v 0.601848 2.400000 1.156792 -v 0.603624 0.553725 -1.796946 -v 0.603624 0.553725 1.796946 -v 0.604900 1.471200 -1.800745 -v 0.604900 1.471200 1.800745 -v 0.618698 1.323225 -1.841822 -v 0.618698 1.323225 1.841822 -v 0.621490 0.656400 -1.850132 -v 0.621490 0.656400 1.850132 -v 0.625735 0.008400 0.325553 -v 0.625735 0.008400 -0.325553 -v 0.629147 1.178400 -1.872927 -v 0.629147 1.178400 1.872927 -v 0.633613 0.771675 -1.886223 -v 0.633613 0.771675 1.886223 -v 0.635767 1.037175 -1.892634 -v 0.635767 1.037175 1.892634 -v 0.638080 0.900000 -1.899520 -v 0.638080 0.900000 -1.899520 -v 0.638080 0.900000 1.899520 -v 0.638080 0.900000 1.899520 -v 0.639070 2.463000 -1.228335 -v 0.639070 2.463000 1.228335 -v 0.639758 2.572800 -0.214905 -v 0.639758 2.572800 0.214905 -v 0.639915 2.482687 1.229959 -v 0.639915 2.482687 -1.229959 -v 0.639996 0.064800 -1.230115 -v 0.639996 0.064800 1.230115 -v 0.641628 2.435437 -1.233252 -v 0.641628 2.435437 1.233252 -v 0.643607 2.494500 -1.237056 -v 0.643607 2.494500 1.237056 -v 0.648144 2.400000 -1.245776 -v 0.648144 2.400000 1.245776 -v 0.649591 2.498438 -1.248557 -v 0.649591 2.498438 1.248557 -v 0.653431 2.502600 -0.890370 -v 0.653431 2.502600 0.890370 -v 0.657311 2.494500 -1.263395 -v 0.657311 2.494500 1.263395 -v 0.664924 2.572800 -0.110524 -v 0.664924 2.572800 0.110524 -v 0.666211 2.482687 1.280502 -v 0.666211 2.482687 -1.280502 -v 0.667656 2.550000 -0.489984 -v 0.667656 2.550000 0.489984 -v 0.667871 0.008400 -0.224349 -v 0.667871 0.008400 0.224349 -v 0.669128 0.084525 -1.286108 -v 0.669128 0.084525 1.286108 -v 0.673600 2.572800 0.000000 -v 0.673600 2.572800 -0.000000 -v 0.675736 2.463000 -1.298810 -v 0.675736 2.463000 1.298810 -v 0.676222 0.018225 0.676222 -v 0.676222 0.018225 -0.676222 -v 0.679207 0.031200 -0.925493 -v 0.679207 0.031200 0.925493 -v 0.685331 2.435437 -1.317252 -v 0.685331 2.435437 1.317252 -v 0.685551 0.105600 -1.317675 -v 0.685551 0.105600 1.317675 -v 0.688984 2.527200 -0.688984 -v 0.688984 2.527200 0.688984 -v 0.692808 0.127575 1.331623 -v 0.692808 0.127575 -1.331623 -v 0.694143 0.008400 -0.115381 -v 0.694143 0.008400 0.115381 -v 0.694440 0.150000 1.334760 -v 0.694440 0.150000 -1.334760 -v 0.694440 2.400000 1.334760 -v 0.694440 0.150000 -1.334760 -v 0.694440 0.150000 1.334760 -v 0.694440 2.400000 -1.334760 -v 0.700921 0.177075 1.347218 -v 0.700921 0.177075 -1.347218 -v 0.703200 0.008400 0.000000 -v 0.715555 2.474400 -0.975021 -v 0.715555 2.474400 0.975021 -v 0.718514 0.213600 1.381032 -v 0.718514 0.213600 -1.381032 -v 0.729046 2.242575 -1.401276 -v 0.729046 2.242575 1.401276 -v 0.734118 2.550000 -0.381942 -v 0.734118 2.550000 0.381942 -v 0.744440 0.260025 1.430863 -v 0.744440 0.260025 -1.430863 -v 0.757010 2.440800 1.031508 -v 0.757010 2.440800 -1.031508 -v 0.762816 0.046875 -1.039419 -v 0.762816 0.046875 1.039419 -v 0.762958 2.085600 -1.466456 -v 0.762958 2.085600 1.466456 -v 0.770779 0.018225 0.565664 -v 0.770779 0.018225 -0.565664 -v 0.772096 2.400000 -1.052064 -v 0.772096 2.400000 1.052064 -v 0.775921 0.316800 -1.491372 -v 0.775921 0.316800 1.491372 -v 0.781142 2.502600 -0.781142 -v 0.781142 2.502600 0.781142 -v 0.783552 2.550000 -0.263208 -v 0.783552 2.550000 0.263208 -v 0.785325 2.527200 -0.576340 -v 0.785325 2.527200 0.576340 -v 0.795481 1.929525 1.528968 -v 0.795481 1.929525 -1.528968 -v 0.810180 0.384375 1.557220 -v 0.810180 0.384375 -1.557220 -v 0.811956 0.031200 0.811956 -v 0.811956 0.031200 -0.811956 -v 0.814374 2.550000 -0.135366 -v 0.814374 2.550000 0.135366 -v 0.819847 2.463000 -1.117130 -v 0.819847 2.463000 1.117130 -v 0.820931 2.482687 1.118607 -v 0.820931 2.482687 -1.118607 -v 0.821035 0.064800 1.118749 -v 0.821035 0.064800 -1.118749 -v 0.823129 2.435437 -1.121601 -v 0.823129 2.435437 1.121601 -v 0.825000 2.550000 0.000000 -v 0.825000 2.550000 0.000000 -v 0.825668 2.494500 -1.125061 -v 0.825668 2.494500 1.125061 -v 0.825921 1.774800 1.587475 -v 0.825921 1.774800 -1.587475 -v 0.831488 2.400000 -1.132992 -v 0.831488 2.400000 1.132992 -v 0.833344 2.498438 -1.135521 -v 0.833344 2.498438 1.135521 -v 0.843248 2.494500 -1.149016 -v 0.843248 2.494500 1.149016 -v 0.844439 0.463200 1.623068 -v 0.844439 0.463200 -1.623068 -v 0.847506 0.018225 -0.440935 -v 0.847506 0.018225 0.440935 -v 0.853583 1.621875 -1.640643 -v 0.853583 1.621875 1.640643 -v 0.854666 2.482687 -1.164574 -v 0.854666 2.482687 1.164574 -v 0.855408 2.474400 -0.855408 -v 0.855408 2.474400 0.855408 -v 0.858407 0.084525 -1.169673 -v 0.858407 0.084525 1.169673 -v 0.863501 2.527200 -0.449256 -v 0.863501 2.527200 0.449256 -v 0.866886 2.463000 -1.181225 -v 0.866886 2.463000 1.181225 -v 0.875920 0.553725 -1.683577 -v 0.875920 0.553725 1.683577 -v 0.877772 1.471200 -1.687137 -v 0.877772 1.471200 1.687137 -v 0.879195 2.435437 -1.197997 -v 0.879195 2.435437 1.197997 -v 0.879477 0.105600 -1.198382 -v 0.879477 0.105600 1.198382 -v 0.888786 0.127575 1.211067 -v 0.888786 0.127575 -1.211067 -v 0.890370 2.502600 -0.653431 -v 0.890370 2.502600 0.653431 -v 0.890880 0.150000 -1.213920 -v 0.890880 0.150000 1.213920 -v 0.890880 2.400000 -1.213920 -v 0.890880 0.150000 -1.213920 -v 0.890880 0.150000 1.213920 -v 0.890880 2.400000 1.213920 -v 0.897795 1.323225 -1.725622 -v 0.897795 1.323225 1.725622 -v 0.899195 0.177075 1.225250 -v 0.899195 0.177075 -1.225250 -v 0.901846 0.656400 -1.733408 -v 0.901846 0.656400 1.733408 -v 0.904575 0.018225 0.303862 -v 0.904575 0.018225 -0.303862 -v 0.904966 2.440800 0.904966 -v 0.904966 2.440800 -0.904966 -v 0.911906 0.046875 -0.911906 -v 0.911906 0.046875 0.911906 -v 0.912957 1.178400 -1.754764 -v 0.912957 1.178400 1.754764 -v 0.919439 0.771675 -1.767222 -v 0.919439 0.771675 1.767222 -v 0.921647 2.527200 -0.309596 -v 0.921647 2.527200 0.309596 -v 0.921764 0.213600 1.256003 -v 0.921764 0.213600 -1.256003 -v 0.922564 1.037175 1.773229 -v 0.922564 1.037175 -1.773229 -v 0.923000 2.400000 -0.923000 -v 0.923000 2.400000 0.923000 -v 0.925493 0.031200 0.679207 -v 0.925493 0.031200 -0.679207 -v 0.925920 0.900000 1.779680 -v 0.925920 0.900000 -1.779680 -v 0.925920 0.900000 -1.779680 -v 0.925920 0.900000 1.779680 -v 0.935276 2.242575 -1.274414 -v 0.935276 2.242575 1.274414 -v 0.940158 0.018225 0.156274 -v 0.940158 0.018225 -0.156274 -v 0.952425 0.018225 0.000000 -v 0.952425 0.018225 0.000000 -v 0.955023 0.260025 1.301322 -v 0.955023 0.260025 -1.301322 -v 0.957901 2.527200 -0.159223 -v 0.957901 2.527200 0.159223 -v 0.970400 2.527200 0.000000 -v 0.970400 2.527200 -0.000000 -v 0.975021 2.474400 -0.715555 -v 0.975021 2.474400 0.715555 -v 0.978780 2.085600 -1.333693 -v 0.978780 2.085600 1.333693 -v 0.979002 2.502600 0.509349 -v 0.979002 2.502600 -0.509349 -v 0.980084 2.463000 -0.980084 -v 0.980084 2.463000 0.980084 -v 0.981380 2.482687 -0.981380 -v 0.981380 2.482687 0.981380 -v 0.981504 0.064800 0.981504 -v 0.981504 0.064800 -0.981504 -v 0.984007 2.435437 -0.984007 -v 0.984007 2.435437 0.984007 -v 0.987042 2.494500 -0.987042 -v 0.987042 2.494500 0.987042 -v 0.994000 2.400000 -0.994000 -v 0.994000 2.400000 0.994000 -v 0.995410 0.316800 -1.356353 -v 0.995410 0.316800 1.356353 -v 0.996219 2.498438 -0.996219 -v 0.996219 2.498438 0.996219 -v 1.008058 2.494500 -1.008058 -v 1.008058 2.494500 1.008058 -v 1.017621 0.031200 0.529441 -v 1.017621 0.031200 -0.529441 -v 1.020503 1.929525 -1.390545 -v 1.020503 1.929525 1.390545 -v 1.021708 2.482687 -1.021708 -v 1.021708 2.482687 1.021708 -v 1.026181 0.084525 -1.026181 -v 1.026181 0.084525 1.026181 -v 1.031508 2.440800 0.757010 -v 1.031508 2.440800 -0.757010 -v 1.036316 2.463000 -1.036316 -v 1.036316 2.463000 1.036316 -v 1.039360 0.384375 -1.416240 -v 1.039360 0.384375 1.416240 -v 1.039419 0.046875 -0.762816 -v 1.039419 0.046875 0.762816 -v 1.044926 2.502600 -0.351008 -v 1.044926 2.502600 0.351008 -v 1.051031 2.435437 -1.051031 -v 1.051031 2.435437 1.051031 -v 1.051368 0.105600 -1.051368 -v 1.051368 0.105600 1.051368 -v 1.052064 2.400000 -0.772096 -v 1.052064 2.400000 0.772096 -v 1.059553 1.774800 -1.443756 -v 1.059553 1.774800 1.443756 -v 1.062497 0.127575 1.062497 -v 1.062497 0.127575 -1.062497 -v 1.065000 0.150000 -1.065000 -v 1.065000 0.150000 1.065000 -v 1.065000 2.400000 -1.065000 -v 1.065000 2.400000 1.065000 -v 1.072079 2.474400 -0.557774 -v 1.072079 2.474400 0.557774 -v 1.074940 0.177075 -1.074940 -v 1.074940 0.177075 1.074940 -v 1.083310 0.463200 -1.476127 -v 1.083310 0.463200 1.476127 -v 1.086029 2.502600 0.180521 -v 1.086029 2.502600 -0.180521 -v 1.086146 0.031200 0.364854 -v 1.086146 0.031200 -0.364854 -v 1.095040 1.621875 -1.492110 -v 1.095040 1.621875 1.492110 -v 1.100200 2.502600 -0.000000 -v 1.100200 2.502600 0.000000 -v 1.101920 0.213600 1.101920 -v 1.101920 0.213600 -1.101920 -v 1.117130 2.463000 -0.819847 -v 1.117130 2.463000 0.819847 -v 1.118073 2.242575 -1.118073 -v 1.118073 2.242575 1.118073 -v 1.118607 2.482687 -0.820931 -v 1.118607 2.482687 0.820931 -v 1.118749 0.064800 -0.821035 -v 1.118749 0.064800 0.821035 -v 1.121601 2.435437 -0.823129 -v 1.121601 2.435437 0.823129 -v 1.123697 0.553725 -1.531158 -v 1.123697 0.553725 1.531158 -v 1.125061 2.494500 -0.825668 -v 1.125061 2.494500 0.825668 -v 1.126072 1.471200 -1.534395 -v 1.126072 1.471200 1.534395 -v 1.128870 0.031200 -0.187642 -v 1.128870 0.031200 0.187642 -v 1.132992 2.400000 -0.831488 -v 1.132992 2.400000 0.831488 -v 1.134190 2.440800 0.590089 -v 1.134190 2.440800 -0.590089 -v 1.135521 2.498438 -0.833344 -v 1.135521 2.498438 0.833344 -v 1.141680 0.260025 1.141680 -v 1.141680 0.260025 -1.141680 -v 1.142888 0.046875 -0.594614 -v 1.142888 0.046875 0.594614 -v 1.143600 0.031200 0.000000 -v 1.143600 0.031200 0.000000 -v 1.144271 2.474400 -0.384379 -v 1.144271 2.474400 0.384379 -v 1.149016 2.494500 -0.843248 -v 1.149016 2.494500 0.843248 -v 1.151759 1.323225 -1.569396 -v 1.151759 1.323225 1.569396 -v 1.156792 2.400000 -0.601848 -v 1.156792 2.400000 0.601848 -v 1.156956 0.656400 -1.576477 -v 1.156956 0.656400 1.576477 -v 1.164574 2.482687 -0.854666 -v 1.164574 2.482687 0.854666 -v 1.169673 0.084525 -0.858407 -v 1.169673 0.084525 0.858407 -v 1.170080 2.085600 -1.170080 -v 1.170080 2.085600 1.170080 -v 1.171210 1.178400 -1.595900 -v 1.171210 1.178400 1.595900 -v 1.179525 0.771675 -1.607230 -v 1.179525 0.771675 1.607230 -v 1.181225 2.463000 -0.866886 -v 1.181225 2.463000 0.866886 -v 1.183534 1.037175 -1.612693 -v 1.183534 1.037175 1.612693 -v 1.187840 0.900000 -1.618560 -v 1.187840 0.900000 -1.618560 -v 1.187840 0.900000 1.618560 -v 1.187840 0.900000 1.618560 -v 1.189282 2.474400 -0.197684 -v 1.189282 2.474400 0.197684 -v 1.189960 0.316800 -1.189960 -v 1.189960 0.316800 1.189960 -v 1.197997 2.435437 -0.879195 -v 1.197997 2.435437 0.879195 -v 1.198382 0.105600 -0.879477 -v 1.198382 0.105600 0.879477 -v 1.204800 2.474400 0.000000 -v 1.204800 2.474400 -0.000000 -v 1.210564 2.440800 0.406648 -v 1.210564 2.440800 -0.406648 -v 1.211067 0.127575 0.888786 -v 1.211067 0.127575 -0.888786 -v 1.213920 0.150000 -0.890880 -v 1.213920 0.150000 -0.890880 -v 1.213920 0.150000 0.890880 -v 1.213920 0.150000 0.890880 -v 1.213920 2.400000 -0.890880 -v 1.213920 2.400000 0.890880 -v 1.219848 0.046875 -0.409767 -v 1.219848 0.046875 0.409767 -v 1.219958 1.929525 1.219958 -v 1.219958 1.929525 -1.219958 -v 1.225250 0.177075 0.899195 -v 1.225250 0.177075 -0.899195 -v 1.228335 2.463000 -0.639070 -v 1.228335 2.463000 0.639070 -v 1.229959 2.482687 -0.639915 -v 1.229959 2.482687 0.639915 -v 1.230115 0.064800 -0.639996 -v 1.230115 0.064800 0.639996 -v 1.233252 2.435437 -0.641628 -v 1.233252 2.435437 0.641628 -v 1.234688 2.400000 -0.414752 -v 1.234688 2.400000 0.414752 -v 1.237056 2.494500 -0.643607 -v 1.237056 2.494500 0.643607 -v 1.242500 0.384375 -1.242500 -v 1.242500 0.384375 1.242500 -v 1.245776 2.400000 -0.648144 -v 1.245776 2.400000 0.648144 -v 1.248557 2.498438 -0.649591 -v 1.248557 2.498438 0.649591 -v 1.256003 0.213600 0.921764 -v 1.256003 0.213600 -0.921764 -v 1.258183 2.440800 0.209136 -v 1.258183 2.440800 -0.209136 -v 1.263395 2.494500 -0.657311 -v 1.263395 2.494500 0.657311 -v 1.266640 1.774800 -1.266640 -v 1.266640 1.774800 1.266640 -v 1.267832 0.046875 -0.210740 -v 1.267832 0.046875 0.210740 -v 1.274414 2.242575 -0.935276 -v 1.274414 2.242575 0.935276 -v 1.274600 2.440800 0.000000 -v 1.274600 2.440800 0.000000 -v 1.280502 2.482687 -0.666211 -v 1.280502 2.482687 0.666211 -v 1.283256 2.400000 -0.213304 -v 1.283256 2.400000 0.213304 -v 1.284375 0.046875 0.000000 -v 1.284375 0.046875 -0.000000 -v 1.286108 0.084525 -0.669128 -v 1.286108 0.084525 0.669128 -v 1.295040 0.463200 -1.295040 -v 1.295040 0.463200 1.295040 -v 1.298810 2.463000 -0.675736 -v 1.298810 2.463000 0.675736 -v 1.300000 2.400000 0.000000 -v 1.300000 2.400000 -0.000000 -v 1.301322 0.260025 0.955023 -v 1.301322 0.260025 -0.955023 -v 1.309063 1.621875 -1.309063 -v 1.309063 1.621875 1.309063 -v 1.311049 2.463000 -0.440403 -v 1.311049 2.463000 0.440403 -v 1.312782 2.482687 -0.440985 -v 1.312782 2.482687 0.440985 -v 1.312948 0.064800 0.441041 -v 1.312948 0.064800 -0.441041 -v 1.316296 2.435437 -0.442166 -v 1.316296 2.435437 0.442166 -v 1.317252 2.435437 -0.685331 -v 1.317252 2.435437 0.685331 -v 1.317675 0.105600 -0.685551 -v 1.317675 0.105600 0.685551 -v 1.320356 2.494500 -0.443529 -v 1.320356 2.494500 0.443529 -v 1.329664 2.400000 -0.446656 -v 1.329664 2.400000 0.446656 -v 1.331623 0.127575 0.692808 -v 1.331623 0.127575 -0.692808 -v 1.332632 2.498438 -0.447653 -v 1.332632 2.498438 0.447653 -v 1.333693 2.085600 -0.978780 -v 1.333693 2.085600 0.978780 -v 1.334760 0.150000 0.694440 -v 1.334760 0.150000 -0.694440 -v 1.334760 0.150000 -0.694440 -v 1.334760 0.150000 0.694440 -v 1.334760 2.400000 -0.694440 -v 1.334760 2.400000 0.694440 -v 1.343320 0.553725 -1.343320 -v 1.343320 0.553725 1.343320 -v 1.346160 1.471200 -1.346160 -v 1.346160 1.471200 1.346160 -v 1.347218 0.177075 0.700921 -v 1.347218 0.177075 -0.700921 -v 1.348469 2.494500 -0.452973 -v 1.348469 2.494500 0.452973 -v 1.356353 0.316800 -0.995410 -v 1.356353 0.316800 0.995410 -v 1.362620 2.463000 -0.226496 -v 1.362620 2.463000 0.226496 -v 1.364422 2.482687 -0.226795 -v 1.364422 2.482687 0.226795 -v 1.364595 0.064800 -0.226824 -v 1.364595 0.064800 0.226824 -v 1.366728 2.482687 -0.459107 -v 1.366728 2.482687 0.459107 -v 1.368074 2.435437 -0.227403 -v 1.368074 2.435437 0.227403 -v 1.372294 2.494500 -0.228104 -v 1.372294 2.494500 0.228104 -v 1.372712 0.084525 -0.461116 -v 1.372712 0.084525 0.461116 -v 1.376867 1.323225 -1.376868 -v 1.376868 1.323225 1.376867 -v 1.380400 2.463000 0.000000 -v 1.380400 2.463000 -0.000000 -v 1.381032 0.213600 0.718514 -v 1.381032 0.213600 -0.718514 -v 1.381968 2.400000 -0.229712 -v 1.381968 2.400000 0.229712 -v 1.382225 2.482687 0.000000 -v 1.382225 2.482687 0.000000 -v 1.382400 0.064800 0.000000 -v 1.382400 0.064800 0.000000 -v 1.383080 0.656400 -1.383080 -v 1.383080 0.656400 1.383080 -v 1.385053 2.498438 -0.230225 -v 1.385053 2.498438 0.230225 -v 1.385925 2.435437 0.000000 -v 1.385925 2.435437 -0.000000 -v 1.386270 2.463000 -0.465671 -v 1.386270 2.463000 0.465671 -v 1.390200 2.494500 0.000000 -v 1.390200 2.494500 -0.000000 -v 1.390545 1.929525 -1.020503 -v 1.390545 1.929525 1.020503 -v 1.400000 2.400000 0.000000 -v 1.400000 2.400000 0.000000 -v 1.400120 1.178400 -1.400120 -v 1.400120 1.178400 1.400120 -v 1.401276 2.242575 -0.729046 -v 1.401276 2.242575 0.729046 -v 1.401513 2.494500 -0.232961 -v 1.401513 2.494500 0.232961 -v 1.403125 2.498438 0.000000 -v 1.403125 2.498438 0.000000 -v 1.405953 2.435437 -0.472283 -v 1.405953 2.435437 0.472283 -v 1.406405 0.105600 -0.472434 -v 1.406405 0.105600 0.472434 -v 1.410060 0.771675 -1.410060 -v 1.410060 0.771675 1.410060 -v 1.414853 1.037175 -1.414853 -v 1.414853 1.037175 1.414853 -v 1.416240 0.384375 -1.039360 -v 1.416240 0.384375 1.039360 -v 1.419800 2.494500 0.000000 -v 1.419800 2.494500 -0.000000 -v 1.420000 0.900000 -1.420000 -v 1.420000 0.900000 -1.420000 -v 1.420000 0.900000 1.420000 -v 1.420000 0.900000 1.420000 -v 1.420490 2.482687 -0.236115 -v 1.420490 2.482687 0.236115 -v 1.421292 0.127575 0.477435 -v 1.421292 0.127575 -0.477435 -v 1.424640 0.150000 -0.478560 -v 1.424640 0.150000 -0.478560 -v 1.424640 0.150000 0.478560 -v 1.424640 0.150000 0.478560 -v 1.424640 2.400000 -0.478560 -v 1.424640 2.400000 0.478560 -v 1.426709 0.084525 -0.237149 -v 1.426709 0.084525 0.237149 -v 1.430863 0.260025 0.744440 -v 1.430863 0.260025 -0.744440 -v 1.437937 0.177075 0.483027 -v 1.437937 0.177075 -0.483027 -v 1.439025 2.482687 0.000000 -v 1.440800 2.463000 -0.239491 -v 1.440800 2.463000 0.239491 -v 1.443756 1.774800 -1.059553 -v 1.443756 1.774800 1.059553 -v 1.445325 0.084525 0.000000 -v 1.445325 0.084525 0.000000 -v 1.459600 2.463000 0.000000 -v 1.459600 2.463000 -0.000000 -v 1.461258 2.435437 -0.242892 -v 1.461258 2.435437 0.242892 -v 1.461727 0.105600 -0.242970 -v 1.461727 0.105600 0.242970 -v 1.466456 2.085600 -0.762958 -v 1.466456 2.085600 0.762958 -v 1.474028 0.213600 0.495150 -v 1.474028 0.213600 -0.495150 -v 1.476127 0.463200 -1.083310 -v 1.476127 0.463200 1.083310 -v 1.477200 0.127575 0.245542 -v 1.477200 0.127575 -0.245542 -v 1.480325 2.435437 0.000000 -v 1.480325 2.435437 -0.000000 -v 1.480680 0.150000 -0.246120 -v 1.480680 0.150000 0.246120 -v 1.480680 0.150000 0.246120 -v 1.480680 0.150000 -0.246120 -v 1.480680 2.400000 -0.246120 -v 1.480680 2.400000 0.246120 -v 1.480800 0.105600 0.000000 -v 1.480800 0.105600 0.000000 -v 1.491372 0.316800 -0.775921 -v 1.491372 0.316800 0.775921 -v 1.492110 1.621875 -1.095040 -v 1.492110 1.621875 1.095040 -v 1.494500 0.177075 0.248417 -v 1.494500 0.177075 -0.248417 -v 1.495635 2.242575 -0.502408 -v 1.495635 2.242575 0.502408 -v 1.496475 0.127575 0.000000 -v 1.496475 0.127575 0.000000 -v 1.500000 0.150000 0.000000 -v 1.500000 0.150000 0.000000 -v 1.500000 2.400000 0.000000 -v 1.500000 2.400000 0.000000 -v 1.514000 0.177075 -0.000000 -v 1.514000 0.177075 0.000000 -v 1.527214 0.260025 -0.513016 -v 1.527214 0.260025 0.513016 -v 1.528968 1.929525 -0.795481 -v 1.528968 1.929525 0.795481 -v 1.531158 0.553725 -1.123697 -v 1.531158 0.553725 1.123697 -v 1.532010 0.213600 0.254652 -v 1.532010 0.213600 -0.254652 -v 1.534395 1.471200 -1.126072 -v 1.534395 1.471200 1.126072 -v 1.552000 0.213600 0.000000 -v 1.552000 0.213600 0.000000 -v 1.554467 2.242575 -0.258385 -v 1.554467 2.242575 0.258385 -v 1.557220 0.384375 -0.810180 -v 1.557220 0.384375 0.810180 -v 1.565204 2.085600 -0.525778 -v 1.565204 2.085600 0.525778 -v 1.569396 1.323225 -1.151759 -v 1.569396 1.323225 1.151759 -v 1.574750 2.242575 0.000000 -v 1.574750 2.242575 0.000000 -v 1.576477 0.656400 -1.156956 -v 1.576477 0.656400 1.156956 -v 1.587289 0.260025 0.263841 -v 1.587289 0.260025 -0.263841 -v 1.587475 1.774800 -0.825921 -v 1.587475 1.774800 0.825921 -v 1.591798 0.316800 -0.534711 -v 1.591798 0.316800 0.534711 -v 1.595900 1.178400 -1.171210 -v 1.595900 1.178400 1.171210 -v 1.607230 0.771675 -1.179525 -v 1.607230 0.771675 1.179525 -v 1.608000 0.260025 0.000000 -v 1.608000 0.260025 0.000000 -v 1.612693 1.037175 -1.183534 -v 1.612693 1.037175 1.183534 -v 1.618560 0.900000 -1.187840 -v 1.618560 0.900000 -1.187840 -v 1.618560 0.900000 1.187840 -v 1.618560 0.900000 1.187840 -v 1.623068 0.463200 -0.844439 -v 1.623068 0.463200 0.844439 -v 1.626774 2.085600 -0.270404 -v 1.626774 2.085600 0.270404 -v 1.631925 1.929525 -0.548190 -v 1.631925 1.929525 0.548190 -v 1.640643 1.621875 -0.853583 -v 1.640643 1.621875 0.853583 -v 1.648000 2.085600 0.000000 -v 1.648000 2.085600 -0.000000 -v 1.654413 0.316800 -0.274998 -v 1.654413 0.316800 0.274998 -v 1.662080 0.384375 -0.558320 -v 1.662080 0.384375 0.558320 -v 1.676000 0.316800 0.000000 -v 1.676000 0.316800 0.000000 -v 1.683577 0.553725 -0.875920 -v 1.683577 0.553725 0.875920 -v 1.687137 1.471200 -0.877772 -v 1.687137 1.471200 0.877772 -v 1.694372 1.774800 -0.569167 -v 1.694372 1.774800 0.569167 -v 1.696119 1.929525 -0.281930 -v 1.696119 1.929525 0.281930 -v 1.700000 0.600000 0.000000 -v 1.700000 0.600000 0.000000 -v 1.700000 0.623100 0.178200 -v 1.700000 0.623100 -0.178200 -v 1.700000 0.685800 -0.316800 -v 1.700000 0.685800 0.316800 -v 1.700000 0.778200 0.415800 -v 1.700000 0.778200 -0.415800 -v 1.700000 0.890400 -0.475200 -v 1.700000 0.890400 0.475200 -v 1.700000 1.012500 -0.495000 -v 1.700000 1.012500 0.495000 -v 1.700000 1.134600 -0.475200 -v 1.700000 1.134600 0.475200 -v 1.700000 1.246800 0.415800 -v 1.700000 1.246800 -0.415800 -v 1.700000 1.339200 -0.316800 -v 1.700000 1.339200 0.316800 -v 1.700000 1.401900 0.178200 -v 1.700000 1.401900 -0.178200 -v 1.700000 1.425000 0.000000 -v 1.700000 1.425000 0.000000 -v 1.718250 1.929525 0.000000 -v 1.718250 1.929525 0.000000 -v 1.725622 1.323225 -0.897795 -v 1.725622 1.323225 0.897795 -v 1.727460 0.384375 -0.287140 -v 1.727460 0.384375 0.287140 -v 1.732362 0.463200 -0.581929 -v 1.732362 0.463200 0.581929 -v 1.733408 0.656400 -0.901846 -v 1.733408 0.656400 0.901846 -v 1.750000 0.384375 0.000000 -v 1.750000 0.384375 0.000000 -v 1.751120 1.621875 -0.588230 -v 1.751120 1.621875 0.588230 -v 1.754764 1.178400 -0.912957 -v 1.754764 1.178400 0.912957 -v 1.761022 1.774800 -0.292719 -v 1.761022 1.774800 0.292719 -v 1.767222 0.771675 -0.919439 -v 1.767222 0.771675 0.919439 -v 1.773229 1.037175 -0.922564 -v 1.773229 1.037175 0.922564 -v 1.779680 0.900000 -0.925920 -v 1.779680 0.900000 -0.925920 -v 1.779680 0.900000 0.925920 -v 1.779680 0.900000 0.925920 -v 1.784000 1.774800 0.000000 -v 1.784000 1.774800 0.000000 -v 1.796946 0.553725 -0.603624 -v 1.796946 0.553725 0.603624 -v 1.800507 0.463200 -0.299282 -v 1.800507 0.463200 0.299282 -v 1.800745 1.471200 -0.604900 -v 1.800745 1.471200 0.604900 -v 1.820003 1.621875 -0.302523 -v 1.820003 1.621875 0.302522 -v 1.824000 0.463200 0.000000 -v 1.824000 0.463200 0.000000 -v 1.841822 1.323225 -0.618698 -v 1.841822 1.323225 0.618698 -v 1.843750 1.621875 0.000000 -v 1.843750 1.621875 -0.000000 -v 1.850132 0.656400 -0.621490 -v 1.850132 0.656400 0.621490 -v 1.867631 0.553725 -0.310439 -v 1.867631 0.553725 0.310439 -v 1.871580 1.471200 -0.311096 -v 1.871580 1.471200 0.311096 -v 1.872927 1.178400 -0.629147 -v 1.872927 1.178400 0.629147 -v 1.886223 0.771675 -0.633613 -v 1.886223 0.771675 0.633613 -v 1.892000 0.553725 0.000000 -v 1.892000 0.553725 -0.000000 -v 1.892634 1.037175 -0.635767 -v 1.892634 1.037175 0.635767 -v 1.896000 1.471200 0.000000 -v 1.896000 1.471200 0.000000 -v 1.899520 0.900000 -0.638080 -v 1.899520 0.900000 -0.638080 -v 1.899520 0.900000 0.638080 -v 1.899520 0.900000 0.638080 -v 1.914272 1.323225 -0.318192 -v 1.914272 1.323225 0.318192 -v 1.922910 0.656400 -0.319628 -v 1.922910 0.656400 0.319628 -v 1.935900 1.444200 0.000000 -v 1.935900 1.444200 0.000000 -v 1.939250 1.323225 0.000000 -v 1.939250 1.323225 -0.000000 -v 1.939394 1.423221 -0.175100 -v 1.939394 1.423221 0.175100 -v 1.946601 1.178400 -0.323566 -v 1.946601 1.178400 0.323566 -v 1.948000 0.656400 0.000000 -v 1.948000 0.656400 -0.000000 -v 1.948879 1.366278 -0.311290 -v 1.948879 1.366278 0.311290 -v 1.960420 0.771675 -0.325863 -v 1.960420 0.771675 0.325863 -v 1.962857 1.282362 -0.408568 -v 1.962857 1.282362 0.408568 -v 1.967083 1.037175 -0.326970 -v 1.967083 1.037175 0.326970 -v 1.972000 1.178400 0.000000 -v 1.972000 1.178400 0.000000 -v 1.974240 0.900000 -0.328160 -v 1.974240 0.900000 0.328160 -v 1.974240 0.900000 0.328160 -v 1.979830 1.180464 -0.466934 -v 1.979830 1.180464 0.466934 -v 1.986000 0.771675 0.000000 -v 1.986000 0.771675 -0.000000 -v 1.992750 1.037175 0.000000 -v 1.992750 1.037175 0.000000 -v 1.998300 1.069575 -0.486390 -v 1.998300 1.069575 0.486390 -v 2.000000 0.900000 0.000000 -v 2.000000 0.900000 0.000000 -v 2.016770 0.958686 -0.466934 -v 2.016770 0.958686 0.466934 -v 2.033743 0.856788 -0.408568 -v 2.033743 0.856788 0.408568 -v 2.047721 0.772872 0.311290 -v 2.047721 0.772872 -0.311290 -v 2.057206 0.715929 0.175100 -v 2.057206 0.715929 -0.175100 -v 2.060700 0.694950 0.000000 -v 2.060700 0.694950 0.000000 -v 2.111200 1.497600 0.000000 -v 2.111200 1.497600 0.000000 -v 2.116979 1.479120 -0.166687 -v 2.116979 1.479120 0.166687 -v 2.132666 1.428960 -0.296333 -v 2.132666 1.428960 0.296333 -v 2.155782 1.355040 -0.388937 -v 2.155782 1.355040 0.388937 -v 2.183853 1.265280 -0.444499 -v 2.183853 1.265280 0.444499 -v 2.214400 1.167600 -0.463020 -v 2.214400 1.167600 0.463020 -v 2.237300 1.578900 0.000000 -v 2.237300 1.578900 0.000000 -v 2.244457 1.563171 -0.154289 -v 2.244457 1.563171 0.154289 -v 2.244947 1.069920 -0.444499 -v 2.244947 1.069920 0.444499 -v 2.263882 1.520478 -0.274291 -v 2.263882 1.520478 0.274291 -v 2.273018 0.980160 -0.388937 -v 2.273018 0.980160 0.388937 -v 2.292510 1.457562 -0.360007 -v 2.292510 1.457562 0.360007 -v 2.296134 0.906240 -0.296333 -v 2.296134 0.906240 0.296333 -v 2.311821 0.856080 -0.166687 -v 2.311821 0.856080 0.166687 -v 2.317600 0.837600 0.000000 -v 2.317600 0.837600 0.000000 -v 2.325600 1.681800 0.000000 -v 2.325600 1.681800 0.000000 -v 2.327271 1.381164 -0.411437 -v 2.327271 1.381164 0.411437 -v 2.333530 1.668948 -0.139234 -v 2.333530 1.668948 0.139234 -v 2.355053 1.634064 -0.247526 -v 2.355053 1.634064 0.247526 -v 2.365100 1.298025 -0.428580 -v 2.365100 1.298025 0.428580 -v 2.386771 1.582656 -0.324878 -v 2.386771 1.582656 0.324878 -v 2.387500 1.800000 0.000000 -v 2.387500 1.800000 0.000000 -v 2.395900 1.790025 0.122850 -v 2.395900 1.790025 -0.122850 -v 2.402929 1.214886 -0.411437 -v 2.402929 1.214886 0.411437 -v 2.418700 1.762950 -0.218400 -v 2.418700 1.762950 0.218400 -v 2.425286 1.520232 -0.371290 -v 2.425286 1.520232 0.371290 -v 2.434400 1.927200 0.000000 -v 2.434400 1.927200 0.000000 -v 2.437690 1.138488 -0.360007 -v 2.437690 1.138488 0.360007 -v 2.443270 1.919976 0.106466 -v 2.443270 1.919976 -0.106466 -v 2.452300 1.723050 -0.286650 -v 2.452300 1.723050 0.286650 -v 2.466318 1.075572 -0.274291 -v 2.466318 1.075572 0.274291 -v 2.467200 1.452300 -0.386760 -v 2.467200 1.452300 0.386760 -v 2.467347 1.900368 0.189274 -v 2.467347 1.900368 -0.189274 -v 2.477700 2.057100 0.000000 -v 2.477700 2.057100 0.000000 -v 2.485743 1.032879 -0.154289 -v 2.485743 1.032879 0.154289 -v 2.487343 2.052375 -0.091411 -v 2.487343 2.052375 0.091411 -v 2.492900 1.017150 0.000000 -v 2.492900 1.017150 0.000000 -v 2.493100 1.674600 -0.327600 -v 2.493100 1.674600 0.327600 -v 2.502829 1.871472 0.248422 -v 2.502829 1.871472 -0.248422 -v 2.509114 1.384368 -0.371290 -v 2.509114 1.384368 0.371290 -v 2.513518 2.039550 0.162509 -v 2.513518 2.039550 -0.162509 -v 2.528800 2.183400 0.000000 -v 2.537500 1.621875 -0.341250 -v 2.537500 1.621875 0.341250 -v 2.539821 2.180796 -0.079013 -v 2.539821 2.180796 0.079013 -v 2.545914 1.836384 -0.283910 -v 2.545914 1.836384 0.283910 -v 2.547629 1.321944 -0.324878 -v 2.547629 1.321944 0.324878 -v 2.552090 2.020650 -0.213293 -v 2.552090 2.020650 0.213293 -v 2.569734 2.173728 -0.140467 -v 2.569734 2.173728 0.140467 -v 2.579347 1.270536 -0.247526 -v 2.579347 1.270536 0.247526 -v 2.581900 1.569150 -0.327600 -v 2.581900 1.569150 0.327600 -v 2.592800 1.798200 -0.295740 -v 2.592800 1.798200 0.295740 -v 2.598929 1.997700 -0.243763 -v 2.598929 1.997700 0.243763 -v 2.599100 2.299800 0.000000 -v 2.599100 2.299800 0.000000 -v 2.600870 1.235652 -0.139234 -v 2.600870 1.235652 0.139234 -v 2.608800 1.222800 0.000000 -v 2.608800 1.222800 0.000000 -v 2.612406 2.298813 0.070600 -v 2.612406 2.298813 -0.070600 -v 2.613818 2.163312 -0.184363 -v 2.613818 2.163312 0.184363 -v 2.622700 1.520700 -0.286650 -v 2.622700 1.520700 0.286650 -v 2.639686 1.760016 -0.283910 -v 2.639686 1.760016 0.283910 -v 2.648521 2.296134 0.125510 -v 2.648521 2.296134 -0.125510 -v 2.649900 1.972725 0.253920 -v 2.649900 1.972725 -0.253920 -v 2.656300 1.480800 -0.218400 -v 2.656300 1.480800 0.218400 -v 2.667347 2.150664 -0.210701 -v 2.667347 2.150664 0.210701 -v 2.679100 1.453725 0.122850 -v 2.679100 1.453725 -0.122850 -v 2.682771 1.724928 0.248422 -v 2.682771 1.724928 -0.248422 -v 2.687500 1.443750 0.000000 -v 2.687500 1.443750 0.000000 -v 2.700000 2.400000 0.000000 -v 2.700000 2.400000 0.000000 -v 2.700000 2.400000 0.000000 -v 2.700871 1.947750 -0.243763 -v 2.700871 1.947750 0.243763 -v 2.701743 2.292186 0.164732 -v 2.701743 2.292186 -0.164732 -v 2.716800 2.400000 0.067500 -v 2.716800 2.400000 -0.067500 -v 2.716800 2.400000 -0.067500 -v 2.716800 2.400000 0.067500 -v 2.718253 1.696032 0.189274 -v 2.718253 1.696032 -0.189274 -v 2.725600 2.136900 -0.219480 -v 2.725600 2.136900 0.219480 -v 2.729800 2.420250 0.000000 -v 2.742330 1.676424 0.106466 -v 2.742330 1.676424 -0.106466 -v 2.747407 2.420406 -0.066744 -v 2.747407 2.420406 0.066744 -v 2.747710 1.924800 -0.213293 -v 2.747710 1.924800 0.213293 -v 2.751200 1.669200 0.000000 -v 2.751200 1.669200 0.000000 -v 2.758400 2.436000 0.000000 -v 2.762400 2.400000 0.120000 -v 2.762400 2.400000 -0.120000 -v 2.762400 2.400000 -0.120000 -v 2.762400 2.400000 0.120000 -v 2.766370 2.287392 0.188266 -v 2.766370 2.287392 -0.188266 -v 2.776365 2.436302 -0.064692 -v 2.776365 2.436302 0.064692 -v 2.783853 2.123136 -0.210701 -v 2.783853 2.123136 0.210701 -v 2.784600 2.447250 0.000000 -v 2.784600 2.447250 0.000000 -v 2.786282 1.905900 0.162509 -v 2.786282 1.905900 -0.162509 -v 2.795198 2.420829 -0.118656 -v 2.795198 2.420829 0.118656 -v 2.800000 2.400000 0.000000 -v 2.802528 2.447680 -0.061668 -v 2.802528 2.447680 0.061668 -v 2.807200 2.454000 0.000000 -v 2.811200 2.400000 -0.040500 -v 2.811200 2.400000 0.040500 -v 2.812457 1.893075 0.091411 -v 2.812457 1.893075 -0.091411 -v 2.822100 1.888350 0.000000 -v 2.822100 1.888350 0.000000 -v 2.824200 2.420250 0.000000 -v 2.824200 2.420250 0.000000 -v 2.824750 2.454529 -0.057996 -v 2.824750 2.454529 0.057996 -v 2.825000 2.456250 0.000000 -v 2.825000 2.456250 0.000000 -v 2.825126 2.437123 -0.115008 -v 2.825126 2.437123 0.115008 -v 2.829600 2.400000 0.157500 -v 2.829600 2.400000 -0.157500 -v 2.829600 2.400000 -0.157500 -v 2.829600 2.400000 0.157500 -v 2.836672 2.420519 -0.041256 -v 2.836672 2.420519 0.041256 -v 2.836700 2.282175 0.196110 -v 2.836700 2.282175 -0.196110 -v 2.836800 2.454000 0.000000 -v 2.836800 2.454000 0.000000 -v 2.837382 2.110488 -0.184363 -v 2.837382 2.110488 0.184363 -v 2.837600 2.436000 0.000000 -v 2.837600 2.436000 0.000000 -v 2.841400 2.447250 0.000000 -v 2.841400 2.447250 0.000000 -v 2.841600 2.400000 -0.072000 -v 2.841600 2.400000 0.072000 -v 2.841887 2.456841 -0.054000 -v 2.841887 2.456841 0.054000 -v 2.851189 2.448847 -0.109632 -v 2.851189 2.448847 0.109632 -v 2.851331 2.436454 -0.043308 -v 2.851331 2.436454 0.043308 -v 2.852794 2.454605 -0.050004 -v 2.852794 2.454605 0.050004 -v 2.856323 2.447812 -0.046332 -v 2.856323 2.447812 0.046332 -v 2.865626 2.421453 -0.155736 -v 2.865626 2.421453 0.155736 -v 2.870524 2.421250 -0.073344 -v 2.870524 2.421250 0.073344 -v 2.872387 2.455966 -0.103104 -v 2.872387 2.455966 0.103104 -v 2.881466 2.100072 -0.140467 -v 2.881466 2.100072 0.140467 -v 2.886400 2.400000 -0.094500 -v 2.886400 2.400000 0.094500 -v 2.887725 2.458444 -0.096000 -v 2.887725 2.458444 0.096000 -v 2.888602 2.437685 -0.076992 -v 2.888602 2.437685 0.076992 -v 2.896205 2.456246 0.088896 -v 2.896205 2.456246 -0.088896 -v 2.896829 2.449338 -0.082368 -v 2.896829 2.449338 0.082368 -v 2.896986 2.438333 -0.150948 -v 2.896986 2.438333 0.150948 -v 2.907030 2.276958 0.188266 -v 2.907030 2.276958 -0.188266 -v 2.911200 2.400000 -0.180000 -v 2.911200 2.400000 -0.180000 -v 2.911200 2.400000 0.180000 -v 2.911379 2.093004 -0.079013 -v 2.911379 2.093004 0.079013 -v 2.920412 2.422328 -0.096264 -v 2.920412 2.422328 0.096264 -v 2.922400 2.090400 0.000000 -v 2.922899 2.450567 -0.143892 -v 2.922899 2.450567 0.143892 -v 2.940800 2.400000 -0.108000 -v 2.940800 2.400000 0.108000 -v 2.942589 2.458082 -0.135324 -v 2.942589 2.458082 0.135324 -v 2.943526 2.439499 -0.101052 -v 2.943526 2.439499 0.101052 -v 2.951146 2.422210 -0.177984 -v 2.951146 2.422210 0.177984 -v 2.955275 2.460806 -0.126000 -v 2.955275 2.460806 0.126000 -v 2.956523 2.451588 -0.108108 -v 2.956523 2.451588 0.108108 -v 2.960179 2.458666 -0.116676 -v 2.960179 2.458666 0.116676 -v 2.971657 2.272164 0.164732 -v 2.971657 2.272164 -0.164732 -v 2.980990 2.423636 0.110016 -v 2.980990 2.423636 -0.110016 -v 2.984243 2.439802 -0.172512 -v 2.984243 2.439802 0.172512 -v 3.000000 2.400000 -0.187500 -v 3.000000 2.400000 -0.187500 -v 3.000000 2.400000 -0.112500 -v 3.000000 2.400000 0.112500 -v 3.000000 2.400000 0.187500 -v 3.009977 2.452655 -0.164448 -v 3.009977 2.452655 0.164448 -v 3.010221 2.441702 -0.115488 -v 3.010221 2.441702 0.115488 -v 3.024879 2.268216 0.125510 -v 3.024879 2.268216 -0.125510 -v 3.027834 2.460653 -0.154656 -v 3.027834 2.460653 0.154656 -v 3.029007 2.454319 -0.123552 -v 3.029007 2.454319 0.123552 -v 3.037300 2.463675 -0.144000 -v 3.037300 2.463675 0.144000 -v 3.037862 2.461603 0.133344 -v 3.037862 2.461603 -0.133344 -v 3.044212 2.423034 -0.185400 -v 3.044212 2.423034 0.185400 -v 3.046912 2.425059 0.114600 -v 3.046912 2.425059 -0.114600 -v 3.059200 2.400000 -0.108000 -v 3.059200 2.400000 0.108000 -v 3.060994 2.265537 0.070600 -v 3.060994 2.265537 -0.070600 -v 3.074300 2.264550 0.000000 -v 3.074300 2.264550 0.000000 -v 3.079200 2.441400 -0.179700 -v 3.079200 2.441400 0.179700 -v 3.082800 2.444100 -0.120300 -v 3.082800 2.444100 0.120300 -v 3.088800 2.400000 -0.180000 -v 3.088800 2.400000 -0.180000 -v 3.088800 2.400000 0.180000 -v 3.104737 2.454928 -0.171300 -v 3.104738 2.454928 0.171300 -v 3.107887 2.457291 -0.128700 -v 3.107887 2.457291 0.128700 -v 3.112835 2.426483 0.110016 -v 3.112835 2.426483 -0.110016 -v 3.113600 2.400000 -0.094500 -v 3.113600 2.400000 0.094500 -v 3.120600 2.463450 0.161100 -v 3.120600 2.463450 -0.161100 -v 3.122400 2.464800 0.138900 -v 3.122400 2.464800 -0.138900 -v 3.126562 2.466797 -0.150000 -v 3.126562 2.466797 0.150000 -v 3.137279 2.423859 -0.177984 -v 3.137279 2.423859 0.177984 -v 3.155379 2.446498 -0.115488 -v 3.155379 2.446498 0.115488 -v 3.158400 2.400000 -0.072000 -v 3.158400 2.400000 0.072000 -v 3.170400 2.400000 -0.157500 -v 3.170400 2.400000 0.157500 -v 3.170400 2.400000 -0.157500 -v 3.173413 2.427791 -0.096264 -v 3.173413 2.427791 0.096264 -v 3.174157 2.442998 -0.172512 -v 3.174157 2.442998 0.172512 -v 3.186768 2.460263 -0.123552 -v 3.186768 2.460263 0.123552 -v 3.188800 2.400000 -0.040500 -v 3.188800 2.400000 0.040500 -v 3.199498 2.457201 -0.164448 -v 3.199498 2.457201 0.164448 -v 3.200000 2.400000 0.000000 -v 3.206938 2.467997 0.133344 -v 3.206938 2.467997 -0.133344 -v 3.213366 2.466247 -0.154656 -v 3.213366 2.466247 0.154656 -v 3.215825 2.469919 -0.144000 -v 3.215825 2.469919 0.144000 -v 3.222074 2.448701 -0.101052 -v 3.222074 2.448701 0.101052 -v 3.222799 2.424616 -0.155736 -v 3.222799 2.424616 0.155736 -v 3.223301 2.428868 -0.073344 -v 3.223301 2.428868 0.073344 -v 3.237600 2.400000 -0.120000 -v 3.237600 2.400000 0.120000 -v 3.237600 2.400000 -0.120000 -v 3.257153 2.429599 -0.041256 -v 3.257153 2.429599 0.041256 -v 3.259252 2.462994 -0.108108 -v 3.259252 2.462994 0.108108 -v 3.261414 2.444467 -0.150948 -v 3.261414 2.444467 0.150948 -v 3.269625 2.429869 0.000000 -v 3.269625 2.429869 0.000000 -v 3.276998 2.450515 -0.076992 -v 3.276998 2.450515 0.076992 -v 3.283200 2.400000 -0.067500 -v 3.283200 2.400000 0.067500 -v 3.283200 2.400000 -0.067500 -v 3.284621 2.470934 -0.116676 -v 3.284621 2.470934 0.116676 -v 3.286576 2.459289 -0.143892 -v 3.286576 2.459289 0.143892 -v 3.293227 2.425240 -0.118656 -v 3.293227 2.425240 0.118656 -v 3.297850 2.472787 -0.126000 -v 3.297850 2.472788 0.126000 -v 3.298611 2.468818 -0.135324 -v 3.298611 2.468818 0.135324 -v 3.300000 2.400000 0.000000 -v 3.300000 2.400000 0.000000 -v 3.314269 2.451746 -0.043308 -v 3.314269 2.451746 0.043308 -v 3.318946 2.465243 -0.082368 -v 3.318946 2.465243 0.082368 -v 3.328000 2.452200 0.000000 -v 3.328000 2.452200 0.000000 -v 3.333274 2.445677 -0.115008 -v 3.333274 2.445677 0.115008 -v 3.341018 2.425663 -0.066744 -v 3.341018 2.425663 0.066744 -v 3.348595 2.473354 0.088896 -v 3.348595 2.473354 -0.088896 -v 3.358286 2.461009 -0.109632 -v 3.358286 2.461009 0.109632 -v 3.358625 2.425819 0.000000 -v 3.359452 2.466769 -0.046332 -v 3.359452 2.466769 0.046332 -v 3.365400 2.475150 -0.096000 -v 3.365400 2.475150 0.096000 -v 3.368813 2.470934 -0.103104 -v 3.368813 2.470934 0.103104 -v 3.374375 2.467331 0.000000 -v 3.374375 2.467331 0.000000 -v 3.382035 2.446498 -0.064692 -v 3.382035 2.446498 0.064692 -v 3.392006 2.474995 -0.050004 -v 3.392006 2.474995 0.050004 -v 3.400000 2.446800 0.000000 -v 3.406947 2.462176 -0.061668 -v 3.406947 2.462176 0.061668 -v 3.408000 2.475600 0.000000 -v 3.408000 2.475600 0.000000 -v 3.411237 2.476753 -0.054000 -v 3.411237 2.476753 0.054000 -v 3.416450 2.472371 -0.057996 -v 3.416450 2.472371 0.057996 -v 3.424875 2.462606 0.000000 -v 3.428125 2.477344 0.000000 -v 3.428125 2.477344 0.000000 -v 3.434000 2.472900 0.000000 +# Max2Obj Version 4.0 Mar 10th, 2001 +# +# object Teapot01 to come ... +# +v 5.929688 4.125000 0.000000 +v 5.832031 4.494141 0.000000 +v 5.945313 4.617188 0.000000 +v 6.175781 4.494141 0.000000 +v 6.429688 4.125000 0.000000 +v 5.387188 4.125000 2.747500 +v 5.297100 4.494141 2.709170 +v 5.401602 4.617188 2.753633 +v 5.614209 4.494141 2.844092 +v 5.848437 4.125000 2.943750 +v 3.899688 4.125000 4.970000 +v 3.830352 4.494141 4.900664 +v 3.910782 4.617188 4.981094 +v 4.074414 4.494141 5.144727 +v 4.254687 4.125000 5.325000 +v 1.677188 4.125000 6.457500 +v 1.638858 4.494141 6.367412 +v 1.683320 4.617188 6.471914 +v 1.773780 4.494141 6.684522 +v 1.873438 4.125000 6.918750 +v -1.070312 4.125000 7.000000 +v -1.070312 4.494141 6.902344 +v -1.070312 4.617188 7.015625 +v -1.070312 4.494141 7.246094 +v -1.070312 4.125000 7.500000 +v -4.007656 4.125000 6.457500 +v -3.859572 4.494141 6.367412 +v -3.847676 4.617188 6.471914 +v -3.917371 4.494141 6.684522 +v -4.014062 4.125000 6.918750 +v -6.209063 4.125000 4.970000 +v -6.042168 4.494141 4.900664 +v -6.072500 4.617188 4.981094 +v -6.217675 4.494141 5.144727 +v -6.395312 4.125000 5.325000 +v -7.591093 4.125000 2.747500 +v -7.464421 4.494141 2.709170 +v -7.550137 4.617188 2.753633 +v -7.755822 4.494141 2.844092 +v -7.989062 4.125000 2.943750 +v -8.070313 4.125000 0.000000 +v -7.972656 4.494141 0.000000 +v -8.085938 4.617188 0.000000 +v -8.316406 4.494141 0.000000 +v -8.570313 4.125000 0.000000 +v -7.527812 4.125000 -2.747500 +v -7.437724 4.494141 -2.709170 +v -7.542227 4.617188 -2.753633 +v -7.754834 4.494141 -2.844092 +v -7.989062 4.125000 -2.943750 +v -6.040312 4.125000 -4.970000 +v -5.970977 4.494141 -4.900664 +v -6.051406 4.617188 -4.981094 +v -6.215039 4.494141 -5.144727 +v -6.395312 4.125000 -5.325000 +v -3.817812 4.125000 -6.457500 +v -3.779482 4.494141 -6.367412 +v -3.823945 4.617188 -6.471914 +v -3.914404 4.494141 -6.684522 +v -4.014062 4.125000 -6.918750 +v -1.070312 4.125000 -7.000000 +v -1.070312 4.494141 -6.902344 +v -1.070312 4.617188 -7.015625 +v -1.070312 4.494141 -7.246094 +v -1.070312 4.125000 -7.500000 +v 1.677188 4.125000 -6.457500 +v 1.638858 4.494141 -6.367412 +v 1.683320 4.617188 -6.471914 +v 1.773780 4.494141 -6.684522 +v 1.873438 4.125000 -6.918750 +v 3.899688 4.125000 -4.970000 +v 3.830352 4.494141 -4.900664 +v 3.910782 4.617188 -4.981094 +v 4.074414 4.494141 -5.144727 +v 4.254687 4.125000 -5.325000 +v 5.387188 4.125000 -2.747500 +v 5.297100 4.494141 -2.709170 +v 5.401602 4.617188 -2.753633 +v 5.614209 4.494141 -2.844092 +v 5.848437 4.125000 -2.943750 +v 7.347656 2.162109 0.000000 +v 8.148438 0.234375 0.000000 +v 8.714844 -1.623047 0.000000 +v 8.929688 -3.375000 0.000000 +v 6.695264 2.162109 3.304053 +v 7.433985 0.234375 3.618360 +v 7.956494 -1.623047 3.840674 +v 8.154688 -3.375000 3.925000 +v 4.906446 2.162109 5.976758 +v 5.475000 0.234375 6.545312 +v 5.877149 -1.623047 6.947461 +v 6.029688 -3.375000 7.100000 +v 2.233740 2.162109 7.765576 +v 2.548047 0.234375 8.504297 +v 2.770362 -1.623047 9.026807 +v 2.854688 -3.375000 9.225000 +v -1.070312 2.162109 8.417969 +v -1.070312 0.234375 9.218750 +v -1.070312 -1.623047 9.785156 +v -1.070312 -3.375000 10.000000 +v -4.374365 2.162109 7.765576 +v -4.688672 0.234375 8.504297 +v -4.910986 -1.623047 9.026807 +v -4.995313 -3.375000 9.225000 +v -7.047071 2.162109 5.976758 +v -7.615624 0.234375 6.545312 +v -8.017773 -1.623047 6.947461 +v -8.170312 -3.375000 7.100000 +v -8.835889 2.162109 3.304053 +v -9.574610 0.234375 3.618360 +v -10.097119 -1.623047 3.840674 +v -10.295313 -3.375000 3.925000 +v -9.488281 2.162109 0.000000 +v -10.289063 0.234375 0.000000 +v -10.855469 -1.623047 0.000000 +v -11.070313 -3.375000 0.000000 +v -8.835889 2.162109 -3.304053 +v -9.574610 0.234375 -3.618360 +v -10.097119 -1.623047 -3.840674 +v -10.295313 -3.375000 -3.925000 +v -7.047071 2.162109 -5.976758 +v -7.615624 0.234375 -6.545312 +v -8.017773 -1.623047 -6.947461 +v -8.170312 -3.375000 -7.100000 +v -4.374365 2.162109 -7.765576 +v -4.688672 0.234375 -8.504297 +v -4.910986 -1.623047 -9.026807 +v -4.995313 -3.375000 -9.225000 +v -1.070312 2.162109 -8.417969 +v -1.070312 0.234375 -9.218750 +v -1.070312 -1.623047 -9.785156 +v -1.070312 -3.375000 -10.000000 +v 2.233740 2.162109 -7.765576 +v 2.548047 0.234375 -8.504297 +v 2.770362 -1.623047 -9.026807 +v 2.854688 -3.375000 -9.225000 +v 4.906446 2.162109 -5.976758 +v 5.475000 0.234375 -6.545312 +v 5.877149 -1.623047 -6.947461 +v 6.029688 -3.375000 -7.100000 +v 6.695264 2.162109 -3.304053 +v 7.433985 0.234375 -3.618360 +v 7.956494 -1.623047 -3.840674 +v 8.154688 -3.375000 -3.925000 +v 8.539063 -4.857422 0.000000 +v 7.679688 -5.953125 0.000000 +v 6.820313 -6.697266 0.000000 +v 6.429688 -7.125000 0.000000 +v 7.794336 -4.857422 3.771680 +v 7.001562 -5.953125 3.434375 +v 6.208789 -6.697266 3.097070 +v 5.848437 -7.125000 2.943750 +v 5.752343 -4.857422 6.822656 +v 5.142187 -5.953125 6.212500 +v 4.532031 -6.697266 5.602344 +v 4.254687 -7.125000 5.325000 +v 2.701367 -4.857422 8.864649 +v 2.364063 -5.953125 8.071875 +v 2.026758 -6.697266 7.279101 +v 1.873438 -7.125000 6.918750 +v -1.070312 -4.857422 9.609375 +v -1.070312 -5.953125 8.750000 +v -1.070312 -6.697266 7.890625 +v -1.070312 -7.125000 7.500000 +v -4.841992 -4.857422 8.864649 +v -4.504687 -5.953125 8.071875 +v -4.167383 -6.697266 7.279101 +v -4.014062 -7.125000 6.918750 +v -7.892968 -4.857422 6.822656 +v -7.282812 -5.953125 6.212500 +v -6.672656 -6.697266 5.602344 +v -6.395312 -7.125000 5.325000 +v -9.934961 -4.857422 3.771680 +v -9.142187 -5.953125 3.434375 +v -8.349414 -6.697266 3.097070 +v -7.989062 -7.125000 2.943750 +v -10.679688 -4.857422 0.000000 +v -9.820313 -5.953125 0.000000 +v -8.960938 -6.697266 0.000000 +v -8.570313 -7.125000 0.000000 +v -9.934961 -4.857422 -3.771680 +v -9.142187 -5.953125 -3.434375 +v -8.349414 -6.697266 -3.097070 +v -7.989062 -7.125000 -2.943750 +v -7.892968 -4.857422 -6.822656 +v -7.282812 -5.953125 -6.212500 +v -6.672656 -6.697266 -5.602344 +v -6.395312 -7.125000 -5.325000 +v -4.841992 -4.857422 -8.864649 +v -4.504687 -5.953125 -8.071875 +v -4.167383 -6.697266 -7.279101 +v -4.014062 -7.125000 -6.918750 +v -1.070312 -4.857422 -9.609375 +v -1.070312 -5.953125 -8.750000 +v -1.070312 -6.697266 -7.890625 +v -1.070312 -7.125000 -7.500000 +v 2.701367 -4.857422 -8.864649 +v 2.364063 -5.953125 -8.071875 +v 2.026758 -6.697266 -7.279101 +v 1.873438 -7.125000 -6.918750 +v 5.752343 -4.857422 -6.822656 +v 5.142187 -5.953125 -6.212500 +v 4.532031 -6.697266 -5.602344 +v 4.254687 -7.125000 -5.325000 +v 7.794336 -4.857422 -3.771680 +v 7.001562 -5.953125 -3.434375 +v 6.208789 -6.697266 -3.097070 +v 5.848437 -7.125000 -2.943750 +v 6.259766 -7.400391 0.000000 +v 5.351563 -7.640625 0.000000 +v 3.107422 -7.810547 0.000000 +v -1.070312 -7.875000 0.000000 +v 5.691685 -7.400391 2.877056 +v 4.853868 -7.640625 2.520586 +v 2.783648 -7.810547 1.639761 +v 4.134043 -7.400391 5.204355 +v 3.489219 -7.640625 4.559531 +v 1.895879 -7.810547 2.966191 +v 1.806743 -7.400391 6.761997 +v 1.450274 -7.640625 5.924180 +v 0.569448 -7.810547 3.853960 +v -1.070312 -7.400391 7.330078 +v -1.070312 -7.640625 6.421875 +v -1.070312 -7.810547 4.177734 +v -3.947368 -7.400391 6.761997 +v -3.590898 -7.640625 5.924180 +v -2.710073 -7.810547 3.853960 +v -6.274668 -7.400391 5.204355 +v -5.629844 -7.640625 4.559531 +v -4.036504 -7.810547 2.966191 +v -7.832309 -7.400391 2.877056 +v -6.994492 -7.640625 2.520586 +v -4.924272 -7.810547 1.639761 +v -8.400391 -7.400391 0.000000 +v -7.492188 -7.640625 0.000000 +v -5.248047 -7.810547 0.000000 +v -7.832309 -7.400391 -2.877056 +v -6.994492 -7.640625 -2.520586 +v -4.924272 -7.810547 -1.639761 +v -6.274668 -7.400391 -5.204355 +v -5.629844 -7.640625 -4.559531 +v -4.036504 -7.810547 -2.966191 +v -3.947368 -7.400391 -6.761997 +v -3.590898 -7.640625 -5.924180 +v -2.710073 -7.810547 -3.853960 +v -1.070312 -7.400391 -7.330078 +v -1.070312 -7.640625 -6.421875 +v -1.070312 -7.810547 -4.177734 +v 1.806743 -7.400391 -6.761997 +v 1.450274 -7.640625 -5.924180 +v 0.569448 -7.810547 -3.853960 +v 4.134043 -7.400391 -5.204355 +v 3.489219 -7.640625 -4.559531 +v 1.895879 -7.810547 -2.966191 +v 5.691685 -7.400391 -2.877056 +v 4.853868 -7.640625 -2.520586 +v 2.783648 -7.810547 -1.639761 +v -9.070313 2.250000 0.000000 +v -11.406250 2.232422 0.000000 +v -13.132813 2.109375 0.000000 +v -14.203125 1.775391 0.000000 +v -14.570313 1.125000 0.000000 +v -8.992188 2.425781 0.843750 +v -11.475830 2.405457 0.843750 +v -13.298828 2.263184 0.843750 +v -14.421631 1.877014 0.843750 +v -14.804688 1.125000 0.843750 +v -8.820313 2.812500 1.125000 +v -11.628906 2.786134 1.125000 +v -13.664063 2.601563 1.125000 +v -14.902344 2.100586 1.125000 +v -15.320313 1.125000 1.125000 +v -8.648438 3.199219 0.843750 +v -11.781982 3.166809 0.843750 +v -14.029297 2.939941 0.843750 +v -15.383057 2.324158 0.843750 +v -15.835938 1.125000 0.843750 +v -8.570313 3.375000 0.000000 +v -11.851563 3.339844 0.000000 +v -14.195313 3.093750 0.000000 +v -15.601563 2.425781 0.000000 +v -16.070313 1.125000 0.000000 +v -8.648438 3.199219 -0.843750 +v -11.781982 3.166809 -0.843750 +v -14.029297 2.939941 -0.843750 +v -15.383057 2.324158 -0.843750 +v -15.835938 1.125000 -0.843750 +v -8.820313 2.812500 -1.125000 +v -11.628906 2.786134 -1.125000 +v -13.664063 2.601563 -1.125000 +v -14.902344 2.100586 -1.125000 +v -15.320313 1.125000 -1.125000 +v -8.992188 2.425781 -0.843750 +v -11.475830 2.405457 -0.843750 +v -13.298828 2.263184 -0.843750 +v -14.421631 1.877014 -0.843750 +v -14.804688 1.125000 -0.843750 +v -14.375000 0.105469 0.000000 +v -13.757813 -1.125000 0.000000 +v -12.671875 -2.355469 0.000000 +v -11.070313 -3.375000 0.000000 +v -14.588013 0.007050 0.843750 +v -13.909180 -1.275146 0.843750 +v -12.724976 -2.540863 0.843750 +v -10.992188 -3.609375 0.843750 +v -15.056641 -0.209473 1.125000 +v -14.242188 -1.605469 1.125000 +v -12.841797 -2.948730 1.125000 +v -10.820313 -4.125000 1.125000 +v -15.525269 -0.425995 0.843750 +v -14.575195 -1.935791 0.843750 +v -12.958618 -3.356598 0.843750 +v -10.648438 -4.640625 0.843750 +v -15.738281 -0.524414 0.000000 +v -14.726563 -2.085938 0.000000 +v -13.011719 -3.541992 0.000000 +v -10.570313 -4.875000 0.000000 +v -15.525269 -0.425995 -0.843750 +v -14.575195 -1.935791 -0.843750 +v -12.958618 -3.356598 -0.843750 +v -10.648438 -4.640625 -0.843750 +v -15.056641 -0.209473 -1.125000 +v -14.242188 -1.605469 -1.125000 +v -12.841797 -2.948730 -1.125000 +v -10.820313 -4.125000 -1.125000 +v -14.588013 0.007050 -0.843750 +v -13.909180 -1.275146 -0.843750 +v -12.724976 -2.540863 -0.843750 +v -10.992188 -3.609375 -0.843750 +v 7.429688 -0.750000 0.000000 +v 9.828125 -0.199219 0.000000 +v 10.867188 1.125000 0.000000 +v 11.437500 2.730469 0.000000 +v 12.429688 4.125000 0.000000 +v 7.429688 -1.394531 1.856250 +v 10.011230 -0.677124 1.676074 +v 11.101563 0.846680 1.279688 +v 11.723145 2.629761 0.883301 +v 12.898438 4.125000 0.703125 +v 7.429688 -2.812500 2.475000 +v 10.414063 -1.728516 2.234766 +v 11.617188 0.234375 1.706250 +v 12.351563 2.408203 1.177734 +v 13.929688 4.125000 0.937500 +v 7.429688 -4.230469 1.856250 +v 10.816895 -2.779907 1.676074 +v 12.132813 -0.377930 1.279688 +v 12.979980 2.186646 0.883301 +v 14.960938 4.125000 0.703125 +v 7.429688 -4.875000 0.000000 +v 11.000000 -3.257813 0.000000 +v 12.367188 -0.656250 0.000000 +v 13.265625 2.085938 0.000000 +v 15.429688 4.125000 0.000000 +v 7.429688 -4.230469 -1.856250 +v 10.816895 -2.779907 -1.676074 +v 12.132813 -0.377930 -1.279688 +v 12.979980 2.186646 -0.883301 +v 14.960938 4.125000 -0.703125 +v 7.429688 -2.812500 -2.475000 +v 10.414063 -1.728516 -2.234766 +v 11.617188 0.234375 -1.706250 +v 12.351563 2.408203 -1.177734 +v 13.929688 4.125000 -0.937500 +v 7.429688 -1.394531 -1.856250 +v 10.011230 -0.677124 -1.676074 +v 11.101563 0.846680 -1.279688 +v 11.723145 2.629761 -0.883301 +v 12.898438 4.125000 -0.703125 +v 12.789063 4.335938 0.000000 +v 13.054688 4.406250 0.000000 +v 13.132813 4.335938 0.000000 +v 12.929688 4.125000 0.000000 +v 13.291077 4.346237 0.659180 +v 13.525879 4.422729 0.562500 +v 13.532898 4.350357 0.465820 +v 13.242188 4.125000 0.421875 +v 14.395508 4.368896 0.878906 +v 14.562500 4.458984 0.750000 +v 14.413086 4.382080 0.621094 +v 13.929688 4.125000 0.562500 +v 15.499939 4.391556 0.659180 +v 15.599121 4.495239 0.562500 +v 15.293274 4.413804 0.465820 +v 14.617188 4.125000 0.421875 +v 16.001953 4.401855 0.000000 +v 16.070313 4.511719 0.000000 +v 15.693359 4.428224 0.000000 +v 14.929688 4.125000 0.000000 +v 15.499939 4.391556 -0.659180 +v 15.599121 4.495239 -0.562500 +v 15.293274 4.413804 -0.465820 +v 14.617188 4.125000 -0.421875 +v 14.395508 4.368896 -0.878906 +v 14.562500 4.458984 -0.750000 +v 14.413086 4.382080 -0.621094 +v 13.929688 4.125000 -0.562500 +v 13.291077 4.346237 -0.659180 +v 13.525879 4.422729 -0.562500 +v 13.532898 4.350357 -0.465820 +v 13.242188 4.125000 -0.421875 +v -1.070312 7.875000 0.000000 +v 0.632813 7.628906 0.000000 +v 0.554688 7.031250 0.000000 +v -0.085937 6.292969 0.000000 +v -0.070312 5.625000 0.000000 +v 0.501414 7.628906 0.670256 +v 0.429278 7.031250 0.639395 +v -0.162029 6.292969 0.386960 +v -0.147812 5.625000 0.392500 +v 0.140489 7.628906 1.210801 +v 0.084844 7.031250 1.155156 +v -0.370879 6.292969 0.699434 +v -0.360312 5.625000 0.710000 +v -0.400056 7.628906 1.571726 +v -0.430918 7.031250 1.499590 +v -0.683352 6.292969 0.908284 +v -0.677812 5.625000 0.922500 +v -1.070312 7.628906 1.703125 +v -1.070312 7.031250 1.625000 +v -1.070312 6.292969 0.984375 +v -1.070312 5.625000 1.000000 +v -1.740569 7.628906 1.571726 +v -1.709707 7.031250 1.499590 +v -1.457273 6.292969 0.908284 +v -1.462812 5.625000 0.922500 +v -2.281113 7.628906 1.210801 +v -2.225469 7.031250 1.155156 +v -1.769746 6.292969 0.699434 +v -1.780312 5.625000 0.710000 +v -2.642038 7.628906 0.670256 +v -2.569902 7.031250 0.639395 +v -1.978596 6.292969 0.386960 +v -1.992812 5.625000 0.392500 +v -2.773438 7.628906 0.000000 +v -2.695313 7.031250 0.000000 +v -2.054687 6.292969 0.000000 +v -2.070312 5.625000 0.000000 +v -2.642038 7.628906 -0.670256 +v -2.569902 7.031250 -0.639395 +v -1.978596 6.292969 -0.386960 +v -1.992812 5.625000 -0.392500 +v -2.281113 7.628906 -1.210801 +v -2.225469 7.031250 -1.155156 +v -1.769746 6.292969 -0.699434 +v -1.780312 5.625000 -0.710000 +v -1.740569 7.628906 -1.571726 +v -1.709707 7.031250 -1.499590 +v -1.457273 6.292969 -0.908284 +v -1.462812 5.625000 -0.922500 +v -1.070312 7.628906 -1.703125 +v -1.070312 7.031250 -1.625000 +v -1.070312 6.292969 -0.984375 +v -1.070312 5.625000 -1.000000 +v -0.400056 7.628906 -1.571726 +v -0.430918 7.031250 -1.499590 +v -0.683352 6.292969 -0.908284 +v -0.677812 5.625000 -0.922500 +v 0.140489 7.628906 -1.210801 +v 0.084844 7.031250 -1.155156 +v -0.370879 6.292969 -0.699434 +v -0.360312 5.625000 -0.710000 +v 0.501414 7.628906 -0.670256 +v 0.429278 7.031250 -0.639395 +v -0.162029 6.292969 -0.386960 +v -0.147812 5.625000 -0.392500 +v 1.210938 5.179688 0.000000 +v 3.054688 4.875000 0.000000 +v 4.710938 4.570313 0.000000 +v 5.429688 4.125000 0.000000 +v 1.034141 5.179688 0.895391 +v 2.735000 4.875000 1.619062 +v 4.262891 4.570313 2.269140 +v 4.925938 4.125000 2.551250 +v 0.549375 5.179688 1.619688 +v 1.858438 4.875000 2.928750 +v 3.034375 4.570313 4.104687 +v 3.544688 4.125000 4.615000 +v -0.174922 5.179688 2.104453 +v 0.548750 4.875000 3.805313 +v 1.198828 4.570313 5.333203 +v 1.480938 4.125000 5.996250 +v -1.070312 5.179688 2.281250 +v -1.070312 4.875000 4.125000 +v -1.070312 4.570313 5.781250 +v -1.070312 4.125000 6.500000 +v -1.965703 5.179688 2.104453 +v -2.689375 4.875000 3.805313 +v -3.339453 4.570313 5.333203 +v -3.621562 4.125000 5.996250 +v -2.690000 5.179688 1.619688 +v -3.999062 4.875000 2.928750 +v -5.174999 4.570313 4.104687 +v -5.685312 4.125000 4.615000 +v -3.174765 5.179688 0.895391 +v -4.875625 4.875000 1.619062 +v -6.403516 4.570313 2.269140 +v -7.066563 4.125000 2.551250 +v -3.351562 5.179688 0.000000 +v -5.195313 4.875000 0.000000 +v -6.851563 4.570313 0.000000 +v -7.570313 4.125000 0.000000 +v -3.174765 5.179688 -0.895391 +v -4.875625 4.875000 -1.619062 +v -6.403516 4.570313 -2.269140 +v -7.066563 4.125000 -2.551250 +v -2.690000 5.179688 -1.619688 +v -3.999062 4.875000 -2.928750 +v -5.174999 4.570313 -4.104687 +v -5.685312 4.125000 -4.615000 +v -1.965703 5.179688 -2.104453 +v -2.689375 4.875000 -3.805313 +v -3.339453 4.570313 -5.333203 +v -3.621562 4.125000 -5.996250 +v -1.070312 5.179688 -2.281250 +v -1.070312 4.875000 -4.125000 +v -1.070312 4.570313 -5.781250 +v -1.070312 4.125000 -6.500000 +v -0.174922 5.179688 -2.104453 +v 0.548750 4.875000 -3.805313 +v 1.198828 4.570313 -5.333203 +v 1.480938 4.125000 -5.996250 +v 0.549375 5.179688 -1.619688 +v 1.858438 4.875000 -2.928750 +v 3.034375 4.570313 -4.104687 +v 3.544688 4.125000 -4.615000 +v 1.034141 5.179688 -0.895391 +v 2.735000 4.875000 -1.619062 +v 4.262891 4.570313 -2.269140 +v 4.925938 4.125000 -2.551250 +# 530 vertices -f 2909 2921 2939 -f 2939 2931 2909 -f 2869 2877 2921 -f 2921 2909 2869 -f 2819 2827 2877 -f 2877 2869 2819 -f 2737 2747 2827 -f 2827 2819 2737 -f 2669 2673 2747 -f 2747 2737 2669 -f 2567 2575 2673 -f 2673 2669 2567 -f 2476 2480 2575 -f 2575 2567 2476 -f 2358 2362 2480 -f 2480 2476 2358 -f 2158 2162 2362 -f 2362 2358 2158 -f 1715 1812 2162 -f 2162 2158 1715 -f 2901 2909 2931 -f 2931 2917 2901 -f 2863 2869 2909 -f 2909 2901 2863 -f 2813 2819 2869 -f 2869 2863 2813 -f 2729 2737 2819 -f 2819 2813 2729 -f 2663 2669 2737 -f 2737 2729 2663 -f 2561 2567 2669 -f 2669 2663 2561 -f 2468 2476 2567 -f 2567 2561 2468 -f 2350 2358 2476 -f 2476 2468 2350 -f 2152 2158 2358 -f 2358 2350 2152 -f 1717 1715 2158 -f 2158 2152 1717 -f 2903 2901 2917 -f 2917 2923 2903 -f 2865 2863 2901 -f 2901 2903 2865 -f 2815 2813 2863 -f 2863 2865 2815 -f 2733 2729 2813 -f 2813 2815 2733 -f 2665 2663 2729 -f 2729 2733 2665 -f 2564 2561 2663 -f 2663 2665 2564 -f 2473 2468 2561 -f 2561 2564 2473 -f 2354 2350 2468 -f 2468 2473 2354 -f 2155 2152 2350 -f 2350 2354 2155 -f 1927 1717 2152 -f 2152 2155 1927 -f 2911 2903 2923 -f 2923 2935 2911 -f 2875 2865 2903 -f 2903 2911 2875 -f 2823 2815 2865 -f 2865 2875 2823 -f 2741 2733 2815 -f 2815 2823 2741 -f 2671 2665 2733 -f 2733 2741 2671 -f 2571 2564 2665 -f 2665 2671 2571 -f 2478 2473 2564 -f 2564 2571 2478 -f 2360 2354 2473 -f 2473 2478 2360 -f 2160 2155 2354 -f 2354 2360 2160 -f 1718 1927 2155 -f 2155 2160 1718 -f 2929 2911 2935 -f 2935 2947 2929 -f 2881 2875 2911 -f 2911 2929 2881 -f 2829 2823 2875 -f 2875 2881 2829 -f 2751 2741 2823 -f 2823 2829 2751 -f 2677 2671 2741 -f 2741 2751 2677 -f 2577 2571 2671 -f 2671 2677 2577 -f 2482 2478 2571 -f 2571 2577 2482 -f 2364 2360 2478 -f 2478 2482 2364 -f 2164 2160 2360 -f 2360 2364 2164 -f 1842 1718 2160 -f 2160 2164 1842 -f 2945 2929 2947 -f 2947 2959 2945 -f 2897 2881 2929 -f 2929 2945 2897 -f 2835 2829 2881 -f 2881 2897 2835 -f 2761 2751 2829 -f 2829 2835 2761 -f 2679 2677 2751 -f 2751 2761 2679 -f 2579 2577 2677 -f 2677 2679 2579 -f 2486 2482 2577 -f 2577 2579 2486 -f 2368 2364 2482 -f 2482 2486 2368 -f 2172 2164 2364 -f 2364 2368 2172 -f 1725 1842 2164 -f 2164 2172 1725 -f 2965 2945 2959 -f 2959 2981 2965 -f 2907 2897 2945 -f 2945 2965 2907 -f 2845 2835 2897 -f 2897 2907 2845 -f 2769 2761 2835 -f 2835 2845 2769 -f 2685 2679 2761 -f 2761 2769 2685 -f 2587 2579 2679 -f 2679 2685 2587 -f 2491 2486 2579 -f 2579 2587 2491 -f 2370 2368 2486 -f 2486 2491 2370 -f 2174 2172 2368 -f 2368 2370 2174 -f 1834 1725 2172 -f 2172 2174 1834 -f 2982 2965 2981 -f 2981 2988 2982 -f 2933 2907 2965 -f 2965 2982 2933 -f 2855 2845 2907 -f 2907 2933 2855 -f 2779 2769 2845 -f 2845 2855 2779 -f 2691 2685 2769 -f 2769 2779 2691 -f 2595 2587 2685 -f 2685 2691 2595 -f 2500 2491 2587 -f 2587 2595 2500 -f 2374 2370 2491 -f 2491 2500 2374 -f 2178 2174 2370 -f 2370 2374 2178 -f 1716 1834 2174 -f 2174 2178 1716 -f 2990 2982 2988 -f 2988 3002 2990 -f 2949 2933 2982 -f 2982 2990 2949 -f 2871 2855 2933 -f 2933 2949 2871 -f 2791 2779 2855 -f 2855 2871 2791 -f 2699 2691 2779 -f 2779 2791 2699 -f 2601 2595 2691 -f 2691 2699 2601 -f 2506 2500 2595 -f 2595 2601 2506 -f 2378 2374 2500 -f 2500 2506 2378 -f 2180 2178 2374 -f 2374 2378 2180 -f 1714 1716 2178 -f 2178 2180 1714 -f 3008 2990 3002 -f 3002 3024 3008 -f 2973 2949 2990 -f 2990 3008 2973 -f 2889 2871 2949 -f 2949 2973 2889 -f 2805 2791 2871 -f 2871 2889 2805 -f 2711 2699 2791 -f 2791 2805 2711 -f 2611 2601 2699 -f 2699 2711 2611 -f 2521 2506 2601 -f 2601 2611 2521 -f 2387 2378 2506 -f 2506 2521 2387 -f 2191 2180 2378 -f 2378 2387 2191 -f 1810 1714 2180 -f 2180 2191 1810 -f 1464 1460 1813 -f 1813 1821 1464 -f 1264 1260 1460 -f 1460 1464 1264 -f 1146 1142 1260 -f 1260 1264 1146 -f 1055 1047 1142 -f 1142 1146 1055 -f 953 949 1047 -f 1047 1055 953 -f 885 875 949 -f 949 953 885 -f 803 795 875 -f 875 885 803 -f 753 745 795 -f 795 803 753 -f 713 701 745 -f 745 753 713 -f 691 683 701 -f 701 713 691 -f 1470 1464 1821 -f 1821 1829 1470 -f 1272 1264 1464 -f 1464 1470 1272 -f 1154 1146 1264 -f 1264 1272 1154 -f 1061 1055 1146 -f 1146 1154 1061 -f 959 953 1055 -f 1055 1061 959 -f 893 885 953 -f 953 959 893 -f 809 803 885 -f 885 893 809 -f 759 753 803 -f 803 809 759 -f 721 713 753 -f 753 759 721 -f 705 691 713 -f 713 721 705 -f 1469 1470 1829 -f 1829 1835 1469 -f 1268 1272 1470 -f 1470 1469 1268 -f 1151 1154 1272 -f 1272 1268 1151 -f 1060 1061 1154 -f 1154 1151 1060 -f 957 959 1061 -f 1061 1060 957 -f 889 893 959 -f 959 957 889 -f 807 809 893 -f 893 889 807 -f 757 759 809 -f 809 807 757 -f 719 721 759 -f 759 757 719 -f 699 705 721 -f 721 719 699 -f 1462 1469 1835 -f 1835 1839 1462 -f 1262 1268 1469 -f 1469 1462 1262 -f 1144 1151 1268 -f 1268 1262 1144 -f 1051 1060 1151 -f 1151 1144 1051 -f 951 957 1060 -f 1060 1051 951 -f 881 889 957 -f 957 951 881 -f 799 807 889 -f 889 881 799 -f 747 757 807 -f 807 799 747 -f 711 719 757 -f 757 747 711 -f 687 699 719 -f 719 711 687 -f 1458 1462 1839 -f 1839 1843 1458 -f 1258 1262 1462 -f 1462 1458 1258 -f 1140 1144 1262 -f 1262 1258 1140 -f 1045 1051 1144 -f 1144 1140 1045 -f 945 951 1051 -f 1051 1045 945 -f 871 881 951 -f 951 945 871 -f 793 799 881 -f 881 871 793 -f 741 747 799 -f 799 793 741 -f 693 711 747 -f 747 741 693 -f 675 687 711 -f 711 693 675 -f 1450 1458 1843 -f 1843 1838 1450 -f 1254 1258 1458 -f 1458 1450 1254 -f 1136 1140 1258 -f 1258 1254 1136 -f 1043 1045 1140 -f 1140 1136 1043 -f 943 945 1045 -f 1045 1043 943 -f 861 871 945 -f 945 943 861 -f 787 793 871 -f 871 861 787 -f 725 741 793 -f 793 787 725 -f 677 693 741 -f 741 725 677 -f 663 675 693 -f 693 677 663 -f 1448 1450 1838 -f 1838 1834 1448 -f 1252 1254 1450 -f 1450 1448 1252 -f 1133 1136 1254 -f 1254 1252 1133 -f 1035 1043 1136 -f 1136 1133 1035 -f 937 943 1043 -f 1043 1035 937 -f 853 861 943 -f 943 937 853 -f 777 787 861 -f 861 853 777 -f 715 725 787 -f 787 777 715 -f 657 677 725 -f 725 715 657 -f 642 663 677 -f 677 657 642 -f 1444 1448 1834 -f 1834 1828 1444 -f 1248 1252 1448 -f 1448 1444 1248 -f 1122 1133 1252 -f 1252 1248 1122 -f 1027 1035 1133 -f 1133 1122 1027 -f 931 937 1035 -f 1035 1027 931 -f 843 853 937 -f 937 931 843 -f 767 777 853 -f 853 843 767 -f 689 715 777 -f 777 767 689 -f 640 657 715 -f 715 689 640 -f 634 642 657 -f 657 640 634 -f 1442 1444 1828 -f 1828 1820 1442 -f 1244 1248 1444 -f 1444 1442 1244 -f 1116 1122 1248 -f 1248 1244 1116 -f 1021 1027 1122 -f 1122 1116 1021 -f 923 931 1027 -f 1027 1021 923 -f 831 843 931 -f 931 923 831 -f 751 767 843 -f 843 831 751 -f 673 689 767 -f 767 751 673 -f 632 640 689 -f 689 673 632 -f 620 634 640 -f 640 632 620 -f 1429 1442 1820 -f 1820 1811 1429 -f 1233 1244 1442 -f 1442 1429 1233 -f 1106 1116 1244 -f 1244 1233 1106 -f 1011 1021 1116 -f 1116 1106 1011 -f 911 923 1021 -f 1021 1011 911 -f 817 831 923 -f 923 911 817 -f 733 751 831 -f 831 817 733 -f 649 673 751 -f 751 733 649 -f 614 632 673 -f 673 649 614 -f 597 620 632 -f 632 614 597 -f 714 702 684 -f 684 692 714 -f 754 746 702 -f 702 714 754 -f 804 796 746 -f 746 754 804 -f 886 876 796 -f 796 804 886 -f 954 950 876 -f 876 886 954 -f 1056 1048 950 -f 950 954 1056 -f 1147 1143 1048 -f 1048 1056 1147 -f 1265 1261 1143 -f 1143 1147 1265 -f 1465 1461 1261 -f 1261 1265 1465 -f 1915 1817 1461 -f 1461 1465 1915 -f 722 714 692 -f 692 706 722 -f 760 754 714 -f 714 722 760 -f 810 804 754 -f 754 760 810 -f 894 886 804 -f 804 810 894 -f 960 954 886 -f 886 894 960 -f 1062 1056 954 -f 954 960 1062 -f 1155 1147 1056 -f 1056 1062 1155 -f 1273 1265 1147 -f 1147 1155 1273 -f 1471 1465 1265 -f 1265 1273 1471 -f 1917 1915 1465 -f 1465 1471 1917 -f 720 722 706 -f 706 700 720 -f 758 760 722 -f 722 720 758 -f 808 810 760 -f 760 758 808 -f 890 894 810 -f 810 808 890 -f 958 960 894 -f 894 890 958 -f 1059 1062 960 -f 960 958 1059 -f 1150 1155 1062 -f 1062 1059 1150 -f 1269 1273 1155 -f 1155 1150 1269 -f 1468 1471 1273 -f 1273 1269 1468 -f 1697 1917 1471 -f 1471 1468 1697 -f 712 720 700 -f 700 688 712 -f 748 758 720 -f 720 712 748 -f 800 808 758 -f 758 748 800 -f 882 890 808 -f 808 800 882 -f 952 958 890 -f 890 882 952 -f 1052 1059 958 -f 958 952 1052 -f 1145 1150 1059 -f 1059 1052 1145 -f 1263 1269 1150 -f 1150 1145 1263 -f 1463 1468 1269 -f 1269 1263 1463 -f 1919 1697 1468 -f 1468 1463 1919 -f 694 712 688 -f 688 676 694 -f 742 748 712 -f 712 694 742 -f 794 800 748 -f 748 742 794 -f 872 882 800 -f 800 794 872 -f 946 952 882 -f 882 872 946 -f 1046 1052 952 -f 952 946 1046 -f 1141 1145 1052 -f 1052 1046 1141 -f 1259 1263 1145 -f 1145 1141 1259 -f 1459 1463 1263 -f 1263 1259 1459 -f 1845 1919 1463 -f 1463 1459 1845 -f 678 694 676 -f 676 664 678 -f 726 742 694 -f 694 678 726 -f 788 794 742 -f 742 726 788 -f 862 872 794 -f 794 788 862 -f 944 946 872 -f 872 862 944 -f 1044 1046 946 -f 946 944 1044 -f 1137 1141 1046 -f 1046 1044 1137 -f 1255 1259 1141 -f 1141 1137 1255 -f 1451 1459 1259 -f 1259 1255 1451 -f 1898 1845 1459 -f 1459 1451 1898 -f 658 678 664 -f 664 642 658 -f 716 726 678 -f 678 658 716 -f 778 788 726 -f 726 716 778 -f 854 862 788 -f 788 778 854 -f 938 944 862 -f 862 854 938 -f 1036 1044 944 -f 944 938 1036 -f 1132 1137 1044 -f 1044 1036 1132 -f 1253 1255 1137 -f 1137 1132 1253 -f 1449 1451 1255 -f 1255 1253 1449 -f 1837 1898 1451 -f 1451 1449 1837 -f 641 658 642 -f 642 635 641 -f 690 716 658 -f 658 641 690 -f 768 778 716 -f 716 690 768 -f 844 854 778 -f 778 768 844 -f 932 938 854 -f 854 844 932 -f 1028 1036 938 -f 938 932 1028 -f 1123 1132 1036 -f 1036 1028 1123 -f 1249 1253 1132 -f 1132 1123 1249 -f 1445 1449 1253 -f 1253 1249 1445 -f 1918 1837 1449 -f 1449 1445 1918 -f 633 641 635 -f 635 621 633 -f 674 690 641 -f 641 633 674 -f 752 768 690 -f 690 674 752 -f 832 844 768 -f 768 752 832 -f 924 932 844 -f 844 832 924 -f 1022 1028 932 -f 932 924 1022 -f 1117 1123 1028 -f 1028 1022 1117 -f 1245 1249 1123 -f 1123 1117 1245 -f 1443 1445 1249 -f 1249 1245 1443 -f 1916 1918 1445 -f 1445 1443 1916 -f 616 633 621 -f 621 600 616 -f 654 674 633 -f 633 616 654 -f 737 752 674 -f 674 654 737 -f 822 832 752 -f 752 737 822 -f 914 924 832 -f 832 822 914 -f 1014 1022 924 -f 924 914 1014 -f 1104 1117 1022 -f 1022 1014 1104 -f 1237 1245 1117 -f 1117 1104 1237 -f 1433 1443 1245 -f 1245 1237 1433 -f 1819 1916 1443 -f 1443 1433 1819 -f 2159 2163 1816 -f 1816 1822 2159 -f 2359 2363 2163 -f 2163 2159 2359 -f 2477 2481 2363 -f 2363 2359 2477 -f 2568 2576 2481 -f 2481 2477 2568 -f 2670 2674 2576 -f 2576 2568 2670 -f 2738 2748 2674 -f 2674 2670 2738 -f 2820 2828 2748 -f 2748 2738 2820 -f 2870 2878 2828 -f 2828 2820 2870 -f 2910 2922 2878 -f 2878 2870 2910 -f 2932 2940 2922 -f 2922 2910 2932 -f 2153 2159 1822 -f 1822 1830 2153 -f 2351 2359 2159 -f 2159 2153 2351 -f 2469 2477 2359 -f 2359 2351 2469 -f 2562 2568 2477 -f 2477 2469 2562 -f 2664 2670 2568 -f 2568 2562 2664 -f 2730 2738 2670 -f 2670 2664 2730 -f 2814 2820 2738 -f 2738 2730 2814 -f 2864 2870 2820 -f 2820 2814 2864 -f 2902 2910 2870 -f 2870 2864 2902 -f 2918 2932 2910 -f 2910 2902 2918 -f 2154 2153 1830 -f 1830 1836 2154 -f 2355 2351 2153 -f 2153 2154 2355 -f 2472 2469 2351 -f 2351 2355 2472 -f 2563 2562 2469 -f 2469 2472 2563 -f 2666 2664 2562 -f 2562 2563 2666 -f 2734 2730 2664 -f 2664 2666 2734 -f 2816 2814 2730 -f 2730 2734 2816 -f 2866 2864 2814 -f 2814 2816 2866 -f 2904 2902 2864 -f 2864 2866 2904 -f 2924 2918 2902 -f 2902 2904 2924 -f 2161 2154 1836 -f 1836 1840 2161 -f 2361 2355 2154 -f 2154 2161 2361 -f 2479 2472 2355 -f 2355 2361 2479 -f 2572 2563 2472 -f 2472 2479 2572 -f 2672 2666 2563 -f 2563 2572 2672 -f 2742 2734 2666 -f 2666 2672 2742 -f 2824 2816 2734 -f 2734 2742 2824 -f 2876 2866 2816 -f 2816 2824 2876 -f 2912 2904 2866 -f 2866 2876 2912 -f 2936 2924 2904 -f 2904 2912 2936 -f 2165 2161 1840 -f 1840 1844 2165 -f 2365 2361 2161 -f 2161 2165 2365 -f 2483 2479 2361 -f 2361 2365 2483 -f 2578 2572 2479 -f 2479 2483 2578 -f 2678 2672 2572 -f 2572 2578 2678 -f 2752 2742 2672 -f 2672 2678 2752 -f 2830 2824 2742 -f 2742 2752 2830 -f 2882 2876 2824 -f 2824 2830 2882 -f 2930 2912 2876 -f 2876 2882 2930 -f 2948 2936 2912 -f 2912 2930 2948 -f 2173 2165 1844 -f 1844 1841 2173 -f 2369 2365 2165 -f 2165 2173 2369 -f 2487 2483 2365 -f 2365 2369 2487 -f 2580 2578 2483 -f 2483 2487 2580 -f 2680 2678 2578 -f 2578 2580 2680 -f 2762 2752 2678 -f 2678 2680 2762 -f 2836 2830 2752 -f 2752 2762 2836 -f 2898 2882 2830 -f 2830 2836 2898 -f 2946 2930 2882 -f 2882 2898 2946 -f 2960 2948 2930 -f 2930 2946 2960 -f 2175 2173 1841 -f 1841 1837 2175 -f 2371 2369 2173 -f 2173 2175 2371 -f 2490 2487 2369 -f 2369 2371 2490 -f 2588 2580 2487 -f 2487 2490 2588 -f 2686 2680 2580 -f 2580 2588 2686 -f 2770 2762 2680 -f 2680 2686 2770 -f 2846 2836 2762 -f 2762 2770 2846 -f 2908 2898 2836 -f 2836 2846 2908 -f 2966 2946 2898 -f 2898 2908 2966 -f 2981 2960 2946 -f 2946 2966 2981 -f 2179 2175 1837 -f 1837 1831 2179 -f 2375 2371 2175 -f 2175 2179 2375 -f 2501 2490 2371 -f 2371 2375 2501 -f 2596 2588 2490 -f 2490 2501 2596 -f 2692 2686 2588 -f 2588 2596 2692 -f 2780 2770 2686 -f 2686 2692 2780 -f 2856 2846 2770 -f 2770 2780 2856 -f 2934 2908 2846 -f 2846 2856 2934 -f 2983 2966 2908 -f 2908 2934 2983 -f 2989 2981 2966 -f 2966 2983 2989 -f 2181 2179 1831 -f 1831 1823 2181 -f 2379 2375 2179 -f 2179 2181 2379 -f 2507 2501 2375 -f 2375 2379 2507 -f 2602 2596 2501 -f 2501 2507 2602 -f 2700 2692 2596 -f 2596 2602 2700 -f 2792 2780 2692 -f 2692 2700 2792 -f 2872 2856 2780 -f 2780 2792 2872 -f 2950 2934 2856 -f 2856 2872 2950 -f 2991 2983 2934 -f 2934 2950 2991 -f 3003 2989 2983 -f 2983 2991 3003 -f 2194 2181 1823 -f 1823 1818 2194 -f 2391 2379 2181 -f 2181 2194 2391 -f 2518 2507 2379 -f 2379 2391 2518 -f 2614 2602 2507 -f 2507 2518 2614 -f 2712 2700 2602 -f 2602 2614 2712 -f 2806 2792 2700 -f 2700 2712 2806 -f 2890 2872 2792 -f 2792 2806 2890 -f 2974 2950 2872 -f 2872 2890 2974 -f 3009 2991 2950 -f 2950 2974 3009 -f 3025 3003 2991 -f 2991 3009 3025 -f 3040 3008 3024 -f 3024 3048 3040 -f 3018 2973 3008 -f 3008 3040 3018 -f 2943 2889 2973 -f 2973 3018 2943 -f 2841 2805 2889 -f 2889 2943 2841 -f 2731 2711 2805 -f 2805 2841 2731 -f 2645 2611 2711 -f 2711 2731 2645 -f 2529 2521 2611 -f 2611 2645 2529 -f 2402 2387 2521 -f 2521 2529 2402 -f 2208 2191 2387 -f 2387 2402 2208 -f 1806 1810 2191 -f 2191 2208 1806 -f 3072 3040 3048 -f 3048 3078 3072 -f 3044 3018 3040 -f 3040 3072 3044 -f 2994 2943 3018 -f 3018 3044 2994 -f 2883 2841 2943 -f 2943 2994 2883 -f 2773 2731 2841 -f 2841 2883 2773 -f 2659 2645 2731 -f 2731 2773 2659 -f 2539 2529 2645 -f 2645 2659 2539 -f 2410 2402 2529 -f 2529 2539 2410 -f 2222 2208 2402 -f 2402 2410 2222 -f 1694 1806 2208 -f 2208 2222 1694 -f 3092 3072 3078 -f 3078 3116 3092 -f 3074 3044 3072 -f 3072 3092 3074 -f 3030 2994 3044 -f 3044 3074 3030 -f 2937 2883 2994 -f 2994 3030 2937 -f 2810 2773 2883 -f 2883 2937 2810 -f 2683 2659 2773 -f 2773 2810 2683 -f 2554 2539 2659 -f 2659 2683 2554 -f 2420 2410 2539 -f 2539 2554 2420 -f 2238 2222 2410 -f 2410 2420 2238 -f 1930 1694 2222 -f 2222 2238 1930 -f 3132 3092 3116 -f 3116 3142 3132 -f 3090 3074 3092 -f 3092 3132 3090 -f 3054 3030 3074 -f 3074 3090 3054 -f 2984 2937 3030 -f 3030 3054 2984 -f 2837 2810 2937 -f 2937 2984 2837 -f 2705 2683 2810 -f 2810 2837 2705 -f 2574 2554 2683 -f 2683 2705 2574 -f 2430 2420 2554 -f 2554 2574 2430 -f 2247 2238 2420 -f 2420 2430 2247 -f 1913 1930 2238 -f 2238 2247 1913 -f 3150 3132 3142 -f 3142 3156 3150 -f 3128 3090 3132 -f 3132 3150 3128 -f 3076 3054 3090 -f 3090 3128 3076 -f 3014 2984 3054 -f 3054 3076 3014 -f 2861 2837 2984 -f 2984 3014 2861 -f 2723 2705 2837 -f 2837 2861 2723 -f 2585 2574 2705 -f 2705 2723 2585 -f 2438 2430 2574 -f 2574 2585 2438 -f 2253 2247 2430 -f 2430 2438 2253 -f 1711 1913 2247 -f 2247 2253 1711 -f 3162 3150 3156 -f 3156 3172 3162 -f 3148 3128 3150 -f 3150 3162 3148 -f 3088 3076 3128 -f 3128 3148 3088 -f 3036 3014 3076 -f 3076 3088 3036 -f 2893 2861 3014 -f 3014 3036 2893 -f 2743 2723 2861 -f 2861 2893 2743 -f 2599 2585 2723 -f 2723 2743 2599 -f 2450 2438 2585 -f 2585 2599 2450 -f 2267 2253 2438 -f 2438 2450 2267 -f 1794 1711 2253 -f 2253 2267 1794 -f 3178 3162 3172 -f 3172 3184 3178 -f 3154 3148 3162 -f 3162 3178 3154 -f 3118 3088 3148 -f 3148 3154 3118 -f 3046 3036 3088 -f 3088 3118 3046 -f 2915 2893 3036 -f 3036 3046 2915 -f 2763 2743 2893 -f 2893 2915 2763 -f 2615 2599 2743 -f 2743 2763 2615 -f 2452 2450 2599 -f 2599 2615 2452 -f 2277 2267 2450 -f 2450 2452 2277 -f 1710 1794 2267 -f 2267 2277 1710 -f 3188 3178 3184 -f 3184 3200 3188 -f 3164 3154 3178 -f 3178 3188 3164 -f 3130 3118 3154 -f 3154 3164 3130 -f 3058 3046 3118 -f 3118 3130 3058 -f 2941 2915 3046 -f 3046 3058 2941 -f 2775 2763 2915 -f 2915 2941 2775 -f 2627 2615 2763 -f 2763 2775 2627 -f 2458 2452 2615 -f 2615 2627 2458 -f 2287 2277 2452 -f 2452 2458 2287 -f 1910 1710 2277 -f 2277 2287 1910 -f 3198 3188 3200 -f 3200 3209 3198 -f 3170 3164 3188 -f 3188 3198 3170 -f 3136 3130 3164 -f 3164 3170 3136 -f 3064 3058 3130 -f 3130 3136 3064 -f 2955 2941 3058 -f 3058 3064 2955 -f 2781 2775 2941 -f 2941 2955 2781 -f 2636 2627 2775 -f 2775 2781 2636 -f 2462 2458 2627 -f 2627 2636 2462 -f 2295 2287 2458 -f 2458 2462 2295 -f 1909 1910 2287 -f 2287 2295 1909 -f 3202 3198 3209 -f 3209 3213 3202 -f 3174 3170 3198 -f 3198 3202 3174 -f 3138 3136 3170 -f 3170 3174 3138 -f 3066 3064 3136 -f 3136 3138 3066 -f 2961 2955 3064 -f 3064 3066 2961 -f 2783 2781 2955 -f 2955 2961 2783 -f 2642 2636 2781 -f 2781 2783 2642 -f 2464 2462 2636 -f 2636 2642 2464 -f 2297 2295 2462 -f 2462 2464 2297 -f 1784 1909 2295 -f 2295 2297 1784 -f 1414 1429 1811 -f 1811 1807 1414 -f 1220 1233 1429 -f 1429 1414 1220 -f 1093 1106 1233 -f 1233 1220 1093 -f 977 1011 1106 -f 1106 1093 977 -f 891 911 1011 -f 1011 977 891 -f 781 817 911 -f 911 891 781 -f 679 733 817 -f 817 781 679 -f 604 649 733 -f 733 679 604 -f 571 614 649 -f 649 604 571 -f 561 597 614 -f 614 571 561 -f 1400 1414 1807 -f 1807 1804 1400 -f 1212 1220 1414 -f 1414 1400 1212 -f 1083 1093 1220 -f 1220 1212 1083 -f 963 977 1093 -f 1093 1083 963 -f 849 891 977 -f 977 963 849 -f 739 781 891 -f 891 849 739 -f 628 679 781 -f 781 739 628 -f 565 604 679 -f 679 628 565 -f 530 571 604 -f 604 565 530 -f 524 561 571 -f 571 530 524 -f 1386 1400 1804 -f 1804 1802 1386 -f 1202 1212 1400 -f 1400 1386 1202 -f 1070 1083 1212 -f 1212 1202 1070 -f 939 963 1083 -f 1083 1070 939 -f 814 849 963 -f 963 939 814 -f 685 739 849 -f 849 814 685 -f 585 628 739 -f 739 685 585 -f 528 565 628 -f 628 585 528 -f 510 530 565 -f 565 528 510 -f 508 524 530 -f 530 510 508 -f 1375 1386 1802 -f 1802 1800 1375 -f 1192 1202 1386 -f 1386 1375 1192 -f 1050 1070 1202 -f 1202 1192 1050 -f 917 939 1070 -f 1070 1050 917 -f 785 814 939 -f 939 917 785 -f 638 685 814 -f 814 785 638 -f 553 585 685 -f 685 638 553 -f 512 528 585 -f 585 553 512 -f 492 510 528 -f 528 512 492 -f 482 508 510 -f 510 492 482 -f 1369 1375 1800 -f 1800 1798 1369 -f 1184 1192 1375 -f 1375 1369 1184 -f 1037 1050 1192 -f 1192 1184 1037 -f 899 917 1050 -f 1050 1037 899 -f 761 785 917 -f 917 899 761 -f 608 638 785 -f 785 761 608 -f 526 553 638 -f 638 608 526 -f 496 512 553 -f 553 526 496 -f 454 492 512 -f 512 496 454 -f 448 482 492 -f 492 454 448 -f 1355 1369 1798 -f 1798 1795 1355 -f 1172 1184 1369 -f 1369 1355 1172 -f 1023 1037 1184 -f 1184 1172 1023 -f 879 899 1037 -f 1037 1023 879 -f 729 761 899 -f 899 879 729 -f 579 608 761 -f 761 729 579 -f 514 526 608 -f 608 579 514 -f 457 496 526 -f 526 514 457 -f 442 454 496 -f 496 457 442 -f 432 448 454 -f 454 442 432 -f 1345 1355 1795 -f 1795 1792 1345 -f 1170 1172 1355 -f 1355 1345 1170 -f 1007 1023 1172 -f 1172 1170 1007 -f 859 879 1023 -f 1023 1007 859 -f 707 729 879 -f 879 859 707 -f 563 579 729 -f 729 707 563 -f 506 514 579 -f 579 563 506 -f 450 457 514 -f 514 506 450 -f 420 442 457 -f 457 450 420 -f 412 432 442 -f 442 420 412 -f 1335 1345 1792 -f 1792 1790 1335 -f 1164 1170 1345 -f 1345 1335 1164 -f 995 1007 1170 -f 1170 1164 995 -f 847 859 1007 -f 1007 995 847 -f 681 707 859 -f 859 847 681 -f 547 563 707 -f 707 681 547 -f 494 506 563 -f 563 547 494 -f 440 450 506 -f 506 494 440 -f 410 420 450 -f 450 440 410 -f 398 412 420 -f 420 410 398 -f 1327 1335 1790 -f 1790 1788 1327 -f 1160 1164 1335 -f 1335 1327 1160 -f 988 995 1164 -f 1164 1160 988 -f 841 847 995 -f 995 988 841 -f 667 681 847 -f 847 841 667 -f 538 547 681 -f 681 667 538 -f 488 494 547 -f 547 538 488 -f 434 440 494 -f 494 488 434 -f 400 410 440 -f 440 434 400 -f 381 398 410 -f 410 400 381 -f 1324 1327 1788 -f 1788 1785 1324 -f 1156 1160 1327 -f 1327 1324 1156 -f 979 988 1160 -f 1160 1156 979 -f 837 841 988 -f 988 979 837 -f 659 667 841 -f 841 837 659 -f 534 538 667 -f 667 659 534 -f 484 488 538 -f 538 534 484 -f 428 434 488 -f 488 484 428 -f 395 400 434 -f 434 428 395 -f 374 381 400 -f 400 395 374 -f 572 616 600 -f 600 562 572 -f 605 654 616 -f 616 572 605 -f 680 737 654 -f 654 605 680 -f 782 822 737 -f 737 680 782 -f 892 914 822 -f 822 782 892 -f 978 1014 914 -f 914 892 978 -f 1094 1104 1014 -f 1014 978 1094 -f 1221 1237 1104 -f 1104 1094 1221 -f 1415 1433 1237 -f 1237 1221 1415 -f 1809 1819 1433 -f 1433 1415 1809 -f 531 572 562 -f 562 525 531 -f 566 605 572 -f 572 531 566 -f 629 680 605 -f 605 566 629 -f 740 782 680 -f 680 629 740 -f 850 892 782 -f 782 740 850 -f 964 978 892 -f 892 850 964 -f 1084 1094 978 -f 978 964 1084 -f 1213 1221 1094 -f 1094 1084 1213 -f 1401 1415 1221 -f 1221 1213 1401 -f 1931 1809 1415 -f 1415 1401 1931 -f 511 531 525 -f 525 509 511 -f 529 566 531 -f 531 511 529 -f 586 629 566 -f 566 529 586 -f 686 740 629 -f 629 586 686 -f 813 850 740 -f 740 686 813 -f 940 964 850 -f 850 813 940 -f 1069 1084 964 -f 964 940 1069 -f 1203 1213 1084 -f 1084 1069 1203 -f 1385 1401 1213 -f 1213 1203 1385 -f 1693 1931 1401 -f 1401 1385 1693 -f 493 511 509 -f 509 483 493 -f 513 529 511 -f 511 493 513 -f 554 586 529 -f 529 513 554 -f 639 686 586 -f 586 554 639 -f 786 813 686 -f 686 639 786 -f 918 940 813 -f 813 786 918 -f 1049 1069 940 -f 940 918 1049 -f 1193 1203 1069 -f 1069 1049 1193 -f 1376 1385 1203 -f 1203 1193 1376 -f 1712 1693 1385 -f 1385 1376 1712 -f 455 493 483 -f 483 449 455 -f 497 513 493 -f 493 455 497 -f 527 554 513 -f 513 497 527 -f 609 639 554 -f 554 527 609 -f 762 786 639 -f 639 609 762 -f 900 918 786 -f 786 762 900 -f 1038 1049 918 -f 918 900 1038 -f 1185 1193 1049 -f 1049 1038 1185 -f 1370 1376 1193 -f 1193 1185 1370 -f 1912 1712 1376 -f 1376 1370 1912 -f 443 455 449 -f 449 433 443 -f 458 497 455 -f 455 443 458 -f 515 527 497 -f 497 458 515 -f 580 609 527 -f 527 515 580 -f 730 762 609 -f 609 580 730 -f 880 900 762 -f 762 730 880 -f 1024 1038 900 -f 900 880 1024 -f 1173 1185 1038 -f 1038 1024 1173 -f 1356 1370 1185 -f 1185 1173 1356 -f 1797 1912 1370 -f 1370 1356 1797 -f 421 443 433 -f 433 413 421 -f 451 458 443 -f 443 421 451 -f 507 515 458 -f 458 451 507 -f 564 580 515 -f 515 507 564 -f 708 730 580 -f 580 564 708 -f 860 880 730 -f 730 708 860 -f 1008 1024 880 -f 880 860 1008 -f 1171 1173 1024 -f 1024 1008 1171 -f 1346 1356 1173 -f 1173 1171 1346 -f 1911 1797 1356 -f 1356 1346 1911 -f 411 421 413 -f 413 399 411 -f 441 451 421 -f 421 411 441 -f 495 507 451 -f 451 441 495 -f 548 564 507 -f 507 495 548 -f 682 708 564 -f 564 548 682 -f 848 860 708 -f 708 682 848 -f 996 1008 860 -f 860 848 996 -f 1165 1171 1008 -f 1008 996 1165 -f 1336 1346 1171 -f 1171 1165 1336 -f 1709 1911 1346 -f 1346 1336 1709 -f 401 411 399 -f 399 382 401 -f 435 441 411 -f 411 401 435 -f 489 495 441 -f 441 435 489 -f 539 548 495 -f 495 489 539 -f 668 682 548 -f 548 539 668 -f 842 848 682 -f 682 668 842 -f 987 996 848 -f 848 842 987 -f 1161 1165 996 -f 996 987 1161 -f 1328 1336 1165 -f 1165 1161 1328 -f 1708 1709 1336 -f 1336 1328 1708 -f 397 401 382 -f 382 376 397 -f 431 435 401 -f 401 397 431 -f 487 489 435 -f 435 431 487 -f 537 539 489 -f 489 487 537 -f 662 668 539 -f 539 537 662 -f 840 842 668 -f 668 662 840 -f 981 987 842 -f 842 840 981 -f 1159 1161 987 -f 987 981 1159 -f 1326 1328 1161 -f 1161 1159 1326 -f 1787 1708 1328 -f 1328 1326 1787 -f 2209 2194 1818 -f 1818 1808 2209 -f 2403 2391 2194 -f 2194 2209 2403 -f 2530 2518 2391 -f 2391 2403 2530 -f 2646 2614 2518 -f 2518 2530 2646 -f 2732 2712 2614 -f 2614 2646 2732 -f 2842 2806 2712 -f 2712 2732 2842 -f 2944 2890 2806 -f 2806 2842 2944 -f 3019 2974 2890 -f 2890 2944 3019 -f 3041 3009 2974 -f 2974 3019 3041 -f 3049 3025 3009 -f 3009 3041 3049 -f 2223 2209 1808 -f 1808 1805 2223 -f 2411 2403 2209 -f 2209 2223 2411 -f 2540 2530 2403 -f 2403 2411 2540 -f 2660 2646 2530 -f 2530 2540 2660 -f 2774 2732 2646 -f 2646 2660 2774 -f 2884 2842 2732 -f 2732 2774 2884 -f 2995 2944 2842 -f 2842 2884 2995 -f 3045 3019 2944 -f 2944 2995 3045 -f 3073 3041 3019 -f 3019 3045 3073 -f 3079 3049 3041 -f 3041 3073 3079 -f 2237 2223 1805 -f 1805 1803 2237 -f 2421 2411 2223 -f 2223 2237 2421 -f 2553 2540 2411 -f 2411 2421 2553 -f 2684 2660 2540 -f 2540 2553 2684 -f 2809 2774 2660 -f 2660 2684 2809 -f 2938 2884 2774 -f 2774 2809 2938 -f 3031 2995 2884 -f 2884 2938 3031 -f 3075 3045 2995 -f 2995 3031 3075 -f 3093 3073 3045 -f 3045 3075 3093 -f 3117 3079 3073 -f 3073 3093 3117 -f 2248 2237 1803 -f 1803 1801 2248 -f 2431 2421 2237 -f 2237 2248 2431 -f 2573 2553 2421 -f 2421 2431 2573 -f 2706 2684 2553 -f 2553 2573 2706 -f 2838 2809 2684 -f 2684 2706 2838 -f 2985 2938 2809 -f 2809 2838 2985 -f 3055 3031 2938 -f 2938 2985 3055 -f 3091 3075 3031 -f 3031 3055 3091 -f 3133 3093 3075 -f 3075 3091 3133 -f 3143 3117 3093 -f 3093 3133 3143 -f 2254 2248 1801 -f 1801 1799 2254 -f 2439 2431 2248 -f 2248 2254 2439 -f 2586 2573 2431 -f 2431 2439 2586 -f 2724 2706 2573 -f 2573 2586 2724 -f 2862 2838 2706 -f 2706 2724 2862 -f 3015 2985 2838 -f 2838 2862 3015 -f 3077 3055 2985 -f 2985 3015 3077 -f 3129 3091 3055 -f 3055 3077 3129 -f 3151 3133 3091 -f 3091 3129 3151 -f 3157 3143 3133 -f 3133 3151 3157 -f 2268 2254 1799 -f 1799 1796 2268 -f 2451 2439 2254 -f 2254 2268 2451 -f 2600 2586 2439 -f 2439 2451 2600 -f 2744 2724 2586 -f 2586 2600 2744 -f 2894 2862 2724 -f 2724 2744 2894 -f 3037 3015 2862 -f 2862 2894 3037 -f 3089 3077 3015 -f 3015 3037 3089 -f 3149 3129 3077 -f 3077 3089 3149 -f 3163 3151 3129 -f 3129 3149 3163 -f 3173 3157 3151 -f 3151 3163 3173 -f 2278 2268 1796 -f 1796 1793 2278 -f 2453 2451 2268 -f 2268 2278 2453 -f 2616 2600 2451 -f 2451 2453 2616 -f 2764 2744 2600 -f 2600 2616 2764 -f 2916 2894 2744 -f 2744 2764 2916 -f 3047 3037 2894 -f 2894 2916 3047 -f 3119 3089 3037 -f 3037 3047 3119 -f 3155 3149 3089 -f 3089 3119 3155 -f 3179 3163 3149 -f 3149 3155 3179 -f 3185 3173 3163 -f 3163 3179 3185 -f 2288 2278 1793 -f 1793 1791 2288 -f 2459 2453 2278 -f 2278 2288 2459 -f 2628 2616 2453 -f 2453 2459 2628 -f 2776 2764 2616 -f 2616 2628 2776 -f 2942 2916 2764 -f 2764 2776 2942 -f 3059 3047 2916 -f 2916 2942 3059 -f 3131 3119 3047 -f 3047 3059 3131 -f 3165 3155 3119 -f 3119 3131 3165 -f 3189 3179 3155 -f 3155 3165 3189 -f 3201 3185 3179 -f 3179 3189 3201 -f 2296 2288 1791 -f 1791 1789 2296 -f 2463 2459 2288 -f 2288 2296 2463 -f 2635 2628 2459 -f 2459 2463 2635 -f 2782 2776 2628 -f 2628 2635 2782 -f 2956 2942 2776 -f 2776 2782 2956 -f 3065 3059 2942 -f 2942 2956 3065 -f 3137 3131 3059 -f 3059 3065 3137 -f 3171 3165 3131 -f 3131 3137 3171 -f 3199 3189 3165 -f 3165 3171 3199 -f 3210 3201 3189 -f 3189 3199 3210 -f 2299 2296 1789 -f 1789 1786 2299 -f 2467 2463 2296 -f 2296 2299 2467 -f 2644 2635 2463 -f 2463 2467 2644 -f 2786 2782 2635 -f 2635 2644 2786 -f 2964 2956 2782 -f 2782 2786 2964 -f 3069 3065 2956 -f 2956 2964 3069 -f 3141 3137 3065 -f 3065 3069 3141 -f 3177 3171 3137 -f 3137 3141 3177 -f 3204 3199 3171 -f 3171 3177 3204 -f 3214 3210 3199 -f 3199 3204 3214 -f 3194 3202 3213 -f 3213 3207 3194 -f 3166 3175 3202 -f 3202 3194 3166 -f 3134 3139 3175 -f 3175 3166 3134 -f 3060 3067 3139 -f 3139 3134 3060 -f 2953 2962 3067 -f 3067 3060 2953 -f 2777 2784 2962 -f 2962 2953 2777 -f 2629 2643 2784 -f 2784 2777 2629 -f 2460 2465 2643 -f 2643 2629 2460 -f 2293 2298 2465 -f 2465 2460 2293 -f 1696 1785 2298 -f 2298 2293 1696 -f 3180 3194 3207 -f 3207 3190 3180 -f 3158 3166 3194 -f 3194 3180 3158 -f 3124 3134 3166 -f 3166 3158 3124 -f 3050 3060 3134 -f 3134 3124 3050 -f 2927 2953 3060 -f 3060 3050 2927 -f 2767 2777 2953 -f 2953 2927 2767 -f 2619 2629 2777 -f 2777 2767 2619 -f 2454 2460 2629 -f 2629 2619 2454 -f 2283 2293 2460 -f 2460 2454 2283 -f 1695 1696 2293 -f 2293 2283 1695 -f 3160 3180 3190 -f 3190 3168 3160 -f 3144 3158 3180 -f 3180 3160 3144 -f 3086 3124 3158 -f 3158 3144 3086 -f 3032 3050 3124 -f 3124 3086 3032 -f 2891 2927 3050 -f 3050 3032 2891 -f 2739 2767 2927 -f 2927 2891 2739 -f 2597 2619 2767 -f 2767 2739 2597 -f 2448 2454 2619 -f 2619 2597 2448 -f 2265 2283 2454 -f 2454 2448 2265 -f 1707 1695 2283 -f 2283 2265 1707 -f 3146 3160 3168 -f 3168 3152 3146 -f 3122 3144 3160 -f 3160 3146 3122 -f 3070 3086 3144 -f 3144 3122 3070 -f 2998 3032 3086 -f 3086 3070 2998 -f 2853 2891 3032 -f 3032 2998 2853 -f 2717 2739 2891 -f 2891 2853 2717 -f 2582 2597 2739 -f 2739 2717 2582 -f 2434 2448 2597 -f 2597 2582 2434 -f 2251 2265 2448 -f 2448 2434 2251 -f 1907 1707 2265 -f 2265 2251 1907 -f 3120 3146 3152 -f 3152 3126 3120 -f 3082 3122 3146 -f 3146 3120 3082 -f 3042 3070 3122 -f 3122 3082 3042 -f 2957 2998 3070 -f 3070 3042 2957 -f 2825 2853 2998 -f 2998 2957 2825 -f 2693 2717 2853 -f 2853 2825 2693 -f 2556 2582 2717 -f 2717 2693 2556 -f 2424 2434 2582 -f 2582 2556 2424 -f 2239 2251 2434 -f 2434 2424 2239 -f 1906 1907 2251 -f 2251 2239 1906 -f 3080 3120 3126 -f 3126 3084 3080 -f 3056 3082 3120 -f 3120 3080 3056 -f 3012 3042 3082 -f 3082 3056 3012 -f 2899 2957 3042 -f 3042 3012 2899 -f 2789 2825 2957 -f 2957 2899 2789 -f 2675 2693 2825 -f 2825 2789 2675 -f 2545 2556 2693 -f 2693 2675 2545 -f 2416 2424 2556 -f 2556 2545 2416 -f 2228 2239 2424 -f 2424 2416 2228 -f 1770 1906 2239 -f 2239 2228 1770 -f 3053 3080 3084 -f 3084 3062 3053 -f 3028 3056 3080 -f 3080 3053 3028 -f 2978 3012 3056 -f 3056 3028 2978 -f 2860 2899 3012 -f 3012 2978 2860 -f 2754 2789 2899 -f 2899 2860 2754 -f 2652 2675 2789 -f 2789 2754 2652 -f 2534 2545 2675 -f 2675 2652 2534 -f 2406 2416 2545 -f 2545 2534 2406 -f 2217 2228 2416 -f 2416 2406 2217 -f 1929 1770 2228 -f 2228 2217 1929 -f 3035 3053 3062 -f 3062 3039 3035 -f 2997 3028 3053 -f 3053 3035 2997 -f 2920 2978 3028 -f 3028 2997 2920 -f 2832 2860 2978 -f 2978 2920 2832 -f 2728 2754 2860 -f 2860 2832 2728 -f 2634 2652 2754 -f 2754 2728 2634 -f 2528 2534 2652 -f 2652 2634 2528 -f 2396 2406 2534 -f 2534 2528 2396 -f 2202 2217 2406 -f 2406 2396 2202 -f 1765 1929 2217 -f 2217 2202 1765 -f 3017 3035 3039 -f 3039 3027 3017 -f 2980 2997 3035 -f 3035 3017 2980 -f 2896 2920 2997 -f 2997 2980 2896 -f 2812 2832 2920 -f 2920 2896 2812 -f 2715 2728 2832 -f 2832 2812 2715 -f 2618 2634 2728 -f 2728 2715 2618 -f 2523 2528 2634 -f 2634 2618 2523 -f 2392 2396 2528 -f 2528 2523 2392 -f 2196 2202 2396 -f 2396 2392 2196 -f 1724 1765 2202 -f 2202 2196 1724 -f 3007 3017 3027 -f 3027 3023 3007 -f 2969 2980 3017 -f 3017 3007 2969 -f 2887 2896 2980 -f 2980 2969 2887 -f 2802 2812 2896 -f 2896 2887 2802 -f 2709 2715 2812 -f 2812 2802 2709 -f 2609 2618 2715 -f 2715 2709 2609 -f 2519 2523 2618 -f 2618 2609 2519 -f 2386 2392 2523 -f 2523 2519 2386 -f 2190 2196 2392 -f 2392 2386 2190 -f 1759 1724 2196 -f 2196 2190 1759 -f 1329 1324 1785 -f 1785 1782 1329 -f 1162 1157 1324 -f 1324 1329 1162 -f 993 982 1157 -f 1157 1162 993 -f 845 838 982 -f 982 993 845 -f 669 660 838 -f 838 845 669 -f 542 535 660 -f 660 669 542 -f 490 485 535 -f 535 542 490 -f 438 429 485 -f 485 490 438 -f 404 396 429 -f 429 438 404 -f 387 376 396 -f 396 404 387 -f 1339 1329 1782 -f 1782 1780 1339 -f 1168 1162 1329 -f 1329 1339 1168 -f 1003 993 1162 -f 1162 1168 1003 -f 855 845 993 -f 993 1003 855 -f 695 669 845 -f 845 855 695 -f 559 542 669 -f 669 695 559 -f 500 490 542 -f 542 559 500 -f 446 438 490 -f 490 500 446 -f 416 404 438 -f 438 446 416 -f 408 387 404 -f 404 416 408 -f 1357 1339 1780 -f 1780 1778 1357 -f 1174 1168 1339 -f 1339 1357 1174 -f 1025 1003 1168 -f 1168 1174 1025 -f 883 855 1003 -f 1003 1025 883 -f 731 695 855 -f 855 883 731 -f 583 559 695 -f 695 731 583 -f 516 500 559 -f 559 583 516 -f 467 446 500 -f 500 516 467 -f 444 416 446 -f 446 467 444 -f 436 408 416 -f 416 444 436 -f 1371 1357 1778 -f 1778 1776 1371 -f 1188 1174 1357 -f 1357 1371 1188 -f 1042 1025 1174 -f 1174 1188 1042 -f 905 883 1025 -f 1025 1042 905 -f 769 731 883 -f 883 905 769 -f 624 583 731 -f 731 769 624 -f 532 516 583 -f 583 624 532 -f 502 467 516 -f 516 532 502 -f 459 444 467 -f 467 502 459 -f 452 436 444 -f 444 459 452 -f 1383 1371 1776 -f 1776 1774 1383 -f 1198 1188 1371 -f 1371 1383 1198 -f 1068 1042 1188 -f 1188 1198 1068 -f 929 905 1042 -f 1042 1068 929 -f 797 769 905 -f 905 929 797 -f 665 624 769 -f 769 797 665 -f 569 532 624 -f 624 665 569 -f 520 502 532 -f 532 569 520 -f 504 459 502 -f 502 520 504 -f 498 452 459 -f 459 504 498 -f 1394 1383 1774 -f 1774 1771 1394 -f 1206 1198 1383 -f 1383 1394 1206 -f 1077 1068 1198 -f 1198 1206 1077 -f 947 929 1068 -f 1068 1077 947 -f 833 797 929 -f 929 947 833 -f 723 665 797 -f 797 833 723 -f 610 569 665 -f 665 723 610 -f 549 520 569 -f 569 610 549 -f 522 504 520 -f 520 549 522 -f 518 498 504 -f 504 522 518 -f 1407 1394 1771 -f 1771 1768 1407 -f 1216 1206 1394 -f 1394 1407 1216 -f 1090 1077 1206 -f 1206 1216 1090 -f 972 947 1077 -f 1077 1090 972 -f 870 833 947 -f 947 972 870 -f 764 723 833 -f 833 870 764 -f 646 610 723 -f 723 764 646 -f 587 549 610 -f 610 646 587 -f 556 522 549 -f 549 587 556 -f 540 518 522 -f 522 556 540 -f 1420 1407 1768 -f 1768 1764 1420 -f 1226 1216 1407 -f 1407 1420 1226 -f 1096 1090 1216 -f 1216 1226 1096 -f 990 972 1090 -f 1090 1096 990 -f 896 870 972 -f 972 990 896 -f 792 764 870 -f 870 896 792 -f 704 646 764 -f 764 792 704 -f 627 587 646 -f 646 704 627 -f 582 556 587 -f 587 627 582 -f 574 540 556 -f 556 582 574 -f 1426 1420 1764 -f 1764 1762 1426 -f 1230 1226 1420 -f 1420 1426 1230 -f 1101 1096 1226 -f 1226 1230 1101 -f 1006 990 1096 -f 1096 1101 1006 -f 907 896 990 -f 990 1006 907 -f 812 792 896 -f 896 907 812 -f 728 704 792 -f 792 812 728 -f 644 627 704 -f 704 728 644 -f 607 582 627 -f 627 644 607 -f 592 574 582 -f 582 607 592 -f 1430 1426 1762 -f 1762 1758 1430 -f 1234 1230 1426 -f 1426 1430 1234 -f 1107 1101 1230 -f 1230 1234 1107 -f 1012 1006 1101 -f 1101 1107 1012 -f 912 907 1006 -f 1006 1012 912 -f 819 812 907 -f 907 912 819 -f 738 728 812 -f 812 819 738 -f 651 644 728 -f 728 738 651 -f 618 607 644 -f 644 651 618 -f 601 592 607 -f 607 618 601 -f 405 397 376 -f 376 388 405 -f 439 430 397 -f 397 405 439 -f 491 486 430 -f 430 439 491 -f 543 536 486 -f 486 491 543 -f 670 661 536 -f 536 543 670 -f 846 839 661 -f 661 670 846 -f 994 980 839 -f 839 846 994 -f 1163 1158 980 -f 980 994 1163 -f 1330 1325 1158 -f 1158 1163 1330 -f 1926 1786 1325 -f 1325 1330 1926 -f 417 405 388 -f 388 409 417 -f 447 439 405 -f 405 417 447 -f 501 491 439 -f 439 447 501 -f 560 543 491 -f 491 501 560 -f 696 670 543 -f 543 560 696 -f 856 846 670 -f 670 696 856 -f 1004 994 846 -f 846 856 1004 -f 1169 1163 994 -f 994 1004 1169 -f 1340 1330 1163 -f 1163 1169 1340 -f 1925 1926 1330 -f 1330 1340 1925 -f 445 417 409 -f 409 437 445 -f 468 447 417 -f 417 445 468 -f 517 501 447 -f 447 468 517 -f 584 560 501 -f 501 517 584 -f 732 696 560 -f 560 584 732 -f 884 856 696 -f 696 732 884 -f 1026 1004 856 -f 856 884 1026 -f 1175 1169 1004 -f 1004 1026 1175 -f 1358 1340 1169 -f 1169 1175 1358 -f 1908 1925 1340 -f 1340 1358 1908 -f 460 445 437 -f 437 453 460 -f 503 468 445 -f 445 460 503 -f 533 517 468 -f 468 503 533 -f 625 584 517 -f 517 533 625 -f 770 732 584 -f 584 625 770 -f 906 884 732 -f 732 770 906 -f 1041 1026 884 -f 884 906 1041 -f 1189 1175 1026 -f 1026 1041 1189 -f 1372 1358 1175 -f 1175 1189 1372 -f 1706 1908 1358 -f 1358 1372 1706 -f 505 460 453 -f 453 499 505 -f 521 503 460 -f 460 505 521 -f 570 533 503 -f 503 521 570 -f 666 625 533 -f 533 570 666 -f 798 770 625 -f 625 666 798 -f 930 906 770 -f 770 798 930 -f 1067 1041 906 -f 906 930 1067 -f 1199 1189 1041 -f 1041 1067 1199 -f 1384 1372 1189 -f 1189 1199 1384 -f 1705 1706 1372 -f 1372 1384 1705 -f 523 505 499 -f 499 519 523 -f 550 521 505 -f 505 523 550 -f 611 570 521 -f 521 550 611 -f 724 666 570 -f 570 611 724 -f 834 798 666 -f 666 724 834 -f 948 930 798 -f 798 834 948 -f 1078 1067 930 -f 930 948 1078 -f 1207 1199 1067 -f 1067 1078 1207 -f 1395 1384 1199 -f 1199 1207 1395 -f 1773 1705 1384 -f 1384 1395 1773 -f 555 523 519 -f 519 541 555 -f 588 550 523 -f 523 555 588 -f 645 611 550 -f 550 588 645 -f 763 724 611 -f 611 645 763 -f 869 834 724 -f 724 763 869 -f 971 948 834 -f 834 869 971 -f 1089 1078 948 -f 948 971 1089 -f 1217 1207 1078 -f 1078 1089 1217 -f 1406 1395 1207 -f 1207 1217 1406 -f 1692 1773 1395 -f 1395 1406 1692 -f 581 555 541 -f 541 573 581 -f 626 588 555 -f 555 581 626 -f 703 645 588 -f 588 626 703 -f 791 763 645 -f 645 703 791 -f 895 869 763 -f 763 791 895 -f 989 971 869 -f 869 895 989 -f 1095 1089 971 -f 971 989 1095 -f 1227 1217 1089 -f 1089 1095 1227 -f 1421 1406 1217 -f 1217 1227 1421 -f 1766 1692 1406 -f 1406 1421 1766 -f 606 581 573 -f 573 591 606 -f 643 626 581 -f 581 606 643 -f 727 703 626 -f 626 643 727 -f 811 791 703 -f 703 727 811 -f 908 895 791 -f 791 811 908 -f 1005 989 895 -f 895 908 1005 -f 1100 1095 989 -f 989 1005 1100 -f 1231 1227 1095 -f 1095 1100 1231 -f 1427 1421 1227 -f 1227 1231 1427 -f 1897 1766 1421 -f 1421 1427 1897 -f 615 606 591 -f 591 598 615 -f 653 643 606 -f 606 615 653 -f 735 727 643 -f 643 653 735 -f 820 811 727 -f 727 735 820 -f 913 908 811 -f 811 820 913 -f 1013 1005 908 -f 908 913 1013 -f 1103 1100 1005 -f 1005 1013 1103 -f 1236 1231 1100 -f 1100 1103 1236 -f 1432 1427 1231 -f 1231 1236 1432 -f 1760 1897 1427 -f 1427 1432 1760 -f 2294 2299 1786 -f 1786 1783 2294 -f 2461 2466 2299 -f 2299 2294 2461 -f 2630 2641 2466 -f 2466 2461 2630 -f 2778 2785 2641 -f 2641 2630 2778 -f 2954 2963 2785 -f 2785 2778 2954 -f 3061 3068 2963 -f 2963 2954 3061 -f 3135 3140 3068 -f 3068 3061 3135 -f 3167 3176 3140 -f 3140 3135 3167 -f 3195 3203 3176 -f 3176 3167 3195 -f 3208 3213 3203 -f 3203 3195 3208 -f 2284 2294 1783 -f 1783 1781 2284 -f 2455 2461 2294 -f 2294 2284 2455 -f 2620 2630 2461 -f 2461 2455 2620 -f 2768 2778 2630 -f 2630 2620 2768 -f 2928 2954 2778 -f 2778 2768 2928 -f 3051 3061 2954 -f 2954 2928 3051 -f 3125 3135 3061 -f 3061 3051 3125 -f 3159 3167 3135 -f 3135 3125 3159 -f 3181 3195 3167 -f 3167 3159 3181 -f 3191 3208 3195 -f 3195 3181 3191 -f 2266 2284 1781 -f 1781 1779 2266 -f 2449 2455 2284 -f 2284 2266 2449 -f 2598 2620 2455 -f 2455 2449 2598 -f 2740 2768 2620 -f 2620 2598 2740 -f 2892 2928 2768 -f 2768 2740 2892 -f 3033 3051 2928 -f 2928 2892 3033 -f 3087 3125 3051 -f 3051 3033 3087 -f 3145 3159 3125 -f 3125 3087 3145 -f 3161 3181 3159 -f 3159 3145 3161 -f 3169 3191 3181 -f 3181 3161 3169 -f 2252 2266 1779 -f 1779 1777 2252 -f 2435 2449 2266 -f 2266 2252 2435 -f 2581 2598 2449 -f 2449 2435 2581 -f 2718 2740 2598 -f 2598 2581 2718 -f 2854 2892 2740 -f 2740 2718 2854 -f 2999 3033 2892 -f 2892 2854 2999 -f 3071 3087 3033 -f 3033 2999 3071 -f 3123 3145 3087 -f 3087 3071 3123 -f 3147 3161 3145 -f 3145 3123 3147 -f 3153 3169 3161 -f 3161 3147 3153 -f 2240 2252 1777 -f 1777 1775 2240 -f 2425 2435 2252 -f 2252 2240 2425 -f 2555 2581 2435 -f 2435 2425 2555 -f 2694 2718 2581 -f 2581 2555 2694 -f 2826 2854 2718 -f 2718 2694 2826 -f 2958 2999 2854 -f 2854 2826 2958 -f 3043 3071 2999 -f 2999 2958 3043 -f 3083 3123 3071 -f 3071 3043 3083 -f 3121 3147 3123 -f 3123 3083 3121 -f 3127 3153 3147 -f 3147 3121 3127 -f 2229 2240 1775 -f 1775 1772 2229 -f 2417 2425 2240 -f 2240 2229 2417 -f 2546 2555 2425 -f 2425 2417 2546 -f 2676 2694 2555 -f 2555 2546 2676 -f 2790 2826 2694 -f 2694 2676 2790 -f 2900 2958 2826 -f 2826 2790 2900 -f 3013 3043 2958 -f 2958 2900 3013 -f 3057 3083 3043 -f 3043 3013 3057 -f 3081 3121 3083 -f 3083 3057 3081 -f 3085 3127 3121 -f 3121 3081 3085 -f 2216 2229 1772 -f 1772 1769 2216 -f 2407 2417 2229 -f 2229 2216 2407 -f 2533 2546 2417 -f 2417 2407 2533 -f 2651 2676 2546 -f 2546 2533 2651 -f 2753 2790 2676 -f 2676 2651 2753 -f 2859 2900 2790 -f 2790 2753 2859 -f 2977 3013 2900 -f 2900 2859 2977 -f 3029 3057 3013 -f 3013 2977 3029 -f 3052 3081 3057 -f 3057 3029 3052 -f 3063 3085 3081 -f 3081 3052 3063 -f 2203 2216 1769 -f 1769 1767 2203 -f 2397 2407 2216 -f 2216 2203 2397 -f 2527 2533 2407 -f 2407 2397 2527 -f 2633 2651 2533 -f 2533 2527 2633 -f 2727 2753 2651 -f 2651 2633 2727 -f 2831 2859 2753 -f 2753 2727 2831 -f 2919 2977 2859 -f 2859 2831 2919 -f 2996 3029 2977 -f 2977 2919 2996 -f 3034 3052 3029 -f 3029 2996 3034 -f 3038 3063 3052 -f 3052 3034 3038 -f 2197 2203 1767 -f 1767 1763 2197 -f 2393 2397 2203 -f 2203 2197 2393 -f 2522 2527 2397 -f 2397 2393 2522 -f 2617 2633 2527 -f 2527 2522 2617 -f 2716 2727 2633 -f 2633 2617 2716 -f 2811 2831 2727 -f 2727 2716 2811 -f 2895 2919 2831 -f 2831 2811 2895 -f 2979 2996 2919 -f 2919 2895 2979 -f 3016 3034 2996 -f 2996 2979 3016 -f 3026 3038 3034 -f 3034 3016 3026 -f 2193 2197 1763 -f 1763 1761 2193 -f 2389 2393 2197 -f 2197 2193 2389 -f 2516 2522 2393 -f 2393 2389 2516 -f 2610 2617 2522 -f 2522 2516 2610 -f 2710 2716 2617 -f 2617 2610 2710 -f 2803 2811 2716 -f 2716 2710 2803 -f 2885 2895 2811 -f 2811 2803 2885 -f 2971 2979 2895 -f 2895 2885 2971 -f 3005 3016 2979 -f 2979 2971 3005 -f 3022 3026 3016 -f 3016 3005 3022 -f 461 545 544 -f 544 456 461 -f 463 551 545 -f 545 461 463 -f 465 557 551 -f 551 463 465 -f 469 567 557 -f 557 465 469 -f 471 575 567 -f 567 469 471 -f 473 577 575 -f 575 471 473 -f 475 589 577 -f 577 473 475 -f 477 593 589 -f 589 475 477 -f 479 595 593 -f 593 477 479 -f 481 599 595 -f 595 479 481 -f 389 461 456 -f 456 392 389 -f 386 463 461 -f 461 389 386 -f 379 465 463 -f 463 386 379 -f 373 469 465 -f 465 379 373 -f 371 471 469 -f 469 373 371 -f 369 473 471 -f 471 371 369 -f 366 475 473 -f 473 369 366 -f 364 477 475 -f 475 366 364 -f 362 479 477 -f 477 364 362 -f 361 481 479 -f 479 362 361 -f 335 389 392 -f 392 337 335 -f 333 386 389 -f 389 335 333 -f 331 379 386 -f 386 333 331 -f 329 373 379 -f 379 331 329 -f 328 371 373 -f 373 329 328 -f 325 369 371 -f 371 328 325 -f 323 366 369 -f 369 325 323 -f 321 364 366 -f 366 323 321 -f 319 362 364 -f 364 321 319 -f 316 361 362 -f 362 319 316 -f 298 335 337 -f 337 302 298 -f 290 333 335 -f 335 298 290 -f 288 331 333 -f 333 290 288 -f 286 329 331 -f 331 288 286 -f 281 328 329 -f 329 286 281 -f 275 325 328 -f 328 281 275 -f 265 323 325 -f 325 275 265 -f 259 321 323 -f 323 265 259 -f 255 319 321 -f 321 259 255 -f 249 316 319 -f 319 255 249 -f 269 298 302 -f 302 271 269 -f 261 290 298 -f 298 269 261 -f 251 288 290 -f 290 261 251 -f 238 286 288 -f 288 251 238 -f 230 281 286 -f 286 238 230 -f 218 275 281 -f 281 230 218 -f 208 265 275 -f 275 218 208 -f 196 259 265 -f 265 208 196 -f 186 255 259 -f 259 196 186 -f 181 249 255 -f 255 186 181 -f 228 269 271 -f 271 234 228 -f 222 261 269 -f 269 228 222 -f 212 251 261 -f 261 222 212 -f 200 238 251 -f 251 212 200 -f 177 230 238 -f 238 200 177 -f 160 218 230 -f 230 177 160 -f 134 208 218 -f 218 160 134 -f 112 196 208 -f 208 134 112 -f 102 186 196 -f 196 112 102 -f 96 181 186 -f 186 102 96 -f 198 228 234 -f 234 205 198 -f 182 222 228 -f 228 198 182 -f 168 212 222 -f 222 182 168 -f 146 200 212 -f 212 168 146 -f 118 177 200 -f 200 146 118 -f 92 160 177 -f 177 118 92 -f 74 134 160 -f 160 92 74 -f 63 112 134 -f 134 74 63 -f 53 102 112 -f 112 63 53 -f 50 96 102 -f 102 53 50 -f 167 198 205 -f 205 170 167 -f 154 182 198 -f 198 167 154 -f 126 168 182 -f 182 154 126 -f 100 146 168 -f 168 126 100 -f 83 118 146 -f 146 100 83 -f 61 92 118 -f 118 83 61 -f 46 74 92 -f 92 61 46 -f 32 63 74 -f 74 46 32 -f 25 53 63 -f 63 32 25 -f 21 50 53 -f 53 25 21 -f 143 167 170 -f 170 150 143 -f 124 154 167 -f 167 143 124 -f 104 126 154 -f 154 124 104 -f 84 100 126 -f 126 104 84 -f 65 83 100 -f 100 84 65 -f 44 61 83 -f 83 65 44 -f 30 46 61 -f 61 44 30 -f 17 32 46 -f 46 30 17 -f 9 25 32 -f 32 17 9 -f 5 21 25 -f 25 9 5 -f 132 143 150 -f 150 140 132 -f 116 124 143 -f 143 132 116 -f 94 104 124 -f 124 116 94 -f 76 84 104 -f 104 94 76 -f 55 65 84 -f 84 76 55 -f 40 44 65 -f 65 55 40 -f 22 30 44 -f 44 40 22 -f 11 17 30 -f 30 22 11 -f 2 9 17 -f 17 11 2 -f 1 5 9 -f 9 2 1 -f 480 596 599 -f 599 481 480 -f 478 594 596 -f 596 480 478 -f 476 590 594 -f 594 478 476 -f 474 578 590 -f 590 476 474 -f 472 576 578 -f 578 474 472 -f 470 568 576 -f 576 472 470 -f 466 558 568 -f 568 470 466 -f 464 552 558 -f 558 466 464 -f 462 546 552 -f 552 464 462 -f 456 544 546 -f 546 462 456 -f 363 480 481 -f 481 360 363 -f 365 478 480 -f 480 363 365 -f 367 476 478 -f 478 365 367 -f 368 474 476 -f 476 367 368 -f 370 472 474 -f 474 368 370 -f 372 470 472 -f 472 370 372 -f 380 466 470 -f 470 372 380 -f 385 464 466 -f 466 380 385 -f 390 462 464 -f 464 385 390 -f 391 456 462 -f 462 390 391 -f 320 363 360 -f 360 316 320 -f 322 365 363 -f 363 320 322 -f 324 367 365 -f 365 322 324 -f 326 368 367 -f 367 324 326 -f 327 370 368 -f 368 326 327 -f 330 372 370 -f 370 327 330 -f 332 380 372 -f 372 330 332 -f 334 385 380 -f 380 332 334 -f 336 390 385 -f 385 334 336 -f 337 391 390 -f 390 336 337 -f 256 320 316 -f 316 250 256 -f 260 322 320 -f 320 256 260 -f 266 324 322 -f 322 260 266 -f 276 326 324 -f 324 266 276 -f 282 327 326 -f 326 276 282 -f 287 330 327 -f 327 282 287 -f 289 332 330 -f 330 287 289 -f 291 334 332 -f 332 289 291 -f 299 336 334 -f 334 291 299 -f 303 337 336 -f 336 299 303 -f 187 256 250 -f 250 181 187 -f 197 260 256 -f 256 187 197 -f 209 266 260 -f 260 197 209 -f 219 276 266 -f 266 209 219 -f 231 282 276 -f 276 219 231 -f 239 287 282 -f 282 231 239 -f 252 289 287 -f 287 239 252 -f 262 291 289 -f 289 252 262 -f 270 299 291 -f 291 262 270 -f 272 303 299 -f 299 270 272 -f 103 187 181 -f 181 97 103 -f 113 197 187 -f 187 103 113 -f 135 209 197 -f 197 113 135 -f 161 219 209 -f 209 135 161 -f 178 231 219 -f 219 161 178 -f 201 239 231 -f 231 178 201 -f 213 252 239 -f 239 201 213 -f 223 262 252 -f 252 213 223 -f 229 270 262 -f 262 223 229 -f 235 272 270 -f 270 229 235 -f 54 103 97 -f 97 50 54 -f 64 113 103 -f 103 54 64 -f 75 135 113 -f 113 64 75 -f 93 161 135 -f 135 75 93 -f 119 178 161 -f 161 93 119 -f 147 201 178 -f 178 119 147 -f 169 213 201 -f 201 147 169 -f 183 223 213 -f 213 169 183 -f 199 229 223 -f 223 183 199 -f 205 235 229 -f 229 199 205 -f 24 54 50 -f 50 21 24 -f 33 64 54 -f 54 24 33 -f 47 75 64 -f 64 33 47 -f 62 93 75 -f 75 47 62 -f 82 119 93 -f 93 62 82 -f 101 147 119 -f 119 82 101 -f 127 169 147 -f 147 101 127 -f 155 183 169 -f 169 127 155 -f 166 199 183 -f 183 155 166 -f 171 205 199 -f 199 166 171 -f 10 24 21 -f 21 6 10 -f 18 33 24 -f 24 10 18 -f 31 47 33 -f 33 18 31 -f 45 62 47 -f 47 31 45 -f 66 82 62 -f 62 45 66 -f 85 101 82 -f 82 66 85 -f 105 127 101 -f 101 85 105 -f 125 155 127 -f 127 105 125 -f 144 166 155 -f 155 125 144 -f 151 171 166 -f 166 144 151 -f 3 10 6 -f 6 1 3 -f 12 18 10 -f 10 3 12 -f 23 31 18 -f 18 12 23 -f 41 45 31 -f 31 23 41 -f 56 66 45 -f 45 41 56 -f 77 85 66 -f 66 56 77 -f 95 105 85 -f 85 77 95 -f 117 125 105 -f 105 95 117 -f 133 144 125 -f 125 117 133 -f 140 151 144 -f 144 133 140 -f 138 132 140 -f 140 145 138 -f 122 116 132 -f 132 138 122 -f 98 94 116 -f 116 122 98 -f 80 76 94 -f 94 98 80 -f 60 55 76 -f 76 80 60 -f 42 40 55 -f 55 60 42 -f 28 22 40 -f 40 42 28 -f 13 11 22 -f 22 28 13 -f 7 2 11 -f 11 13 7 -f 4 1 2 -f 2 7 4 -f 152 138 145 -f 145 158 152 -f 136 122 138 -f 138 152 136 -f 108 98 122 -f 122 136 108 -f 89 80 98 -f 98 108 89 -f 70 60 80 -f 80 89 70 -f 52 42 60 -f 60 70 52 -f 38 28 42 -f 42 52 38 -f 26 13 28 -f 28 38 26 -f 19 7 13 -f 13 26 19 -f 15 4 7 -f 7 19 15 -f 173 152 158 -f 158 176 173 -f 162 136 152 -f 152 173 162 -f 142 108 136 -f 136 162 142 -f 111 89 108 -f 108 142 111 -f 91 70 89 -f 89 111 91 -f 73 52 70 -f 70 91 73 -f 58 38 52 -f 52 73 58 -f 48 26 38 -f 38 58 48 -f 37 19 26 -f 26 48 37 -f 35 15 19 -f 19 37 35 -f 194 173 176 -f 176 202 194 -f 184 162 173 -f 173 194 184 -f 174 142 162 -f 162 184 174 -f 156 111 142 -f 142 174 156 -f 128 91 111 -f 111 156 128 -f 106 73 91 -f 91 128 106 -f 86 58 73 -f 73 106 86 -f 78 48 58 -f 58 86 78 -f 68 37 48 -f 48 78 68 -f 67 35 37 -f 37 68 67 -f 221 194 202 -f 202 225 221 -f 216 184 194 -f 194 221 216 -f 206 174 184 -f 184 216 206 -f 192 156 174 -f 174 206 192 -f 180 128 156 -f 156 192 180 -f 164 106 128 -f 128 180 164 -f 148 86 106 -f 106 164 148 -f 130 78 86 -f 86 148 130 -f 121 68 78 -f 78 130 121 -f 115 67 68 -f 68 121 115 -f 244 221 225 -f 225 247 244 -f 240 216 221 -f 221 244 240 -f 236 206 216 -f 216 240 236 -f 233 192 206 -f 206 236 233 -f 227 180 192 -f 192 233 227 -f 215 164 180 -f 180 227 215 -f 210 148 164 -f 164 215 210 -f 203 130 148 -f 148 210 203 -f 191 121 130 -f 130 203 191 -f 188 115 121 -f 121 191 188 -f 284 244 247 -f 247 285 284 -f 279 240 244 -f 244 284 279 -f 277 236 240 -f 240 279 277 -f 273 233 236 -f 236 277 273 -f 267 227 233 -f 233 273 267 -f 263 215 227 -f 227 267 263 -f 258 210 215 -f 215 263 258 -f 253 203 210 -f 210 258 253 -f 245 191 203 -f 203 253 245 -f 242 188 191 -f 191 245 242 -f 315 284 285 -f 285 318 315 -f 312 279 284 -f 284 315 312 -f 311 277 279 -f 279 312 311 -f 309 273 277 -f 277 311 309 -f 307 267 273 -f 273 309 307 -f 305 263 267 -f 267 307 305 -f 301 258 263 -f 263 305 301 -f 297 253 258 -f 258 301 297 -f 295 245 253 -f 253 297 295 -f 293 242 245 -f 245 295 293 -f 341 315 318 -f 318 339 341 -f 343 312 315 -f 315 341 343 -f 345 311 312 -f 312 343 345 -f 347 309 311 -f 311 345 347 -f 349 307 309 -f 309 347 349 -f 351 305 307 -f 307 349 351 -f 353 301 305 -f 305 351 353 -f 355 297 301 -f 301 353 355 -f 357 295 297 -f 297 355 357 -f 359 293 295 -f 295 357 359 -f 378 341 339 -f 339 376 378 -f 384 343 341 -f 341 378 384 -f 394 345 343 -f 343 384 394 -f 403 347 345 -f 345 394 403 -f 406 349 347 -f 347 403 406 -f 415 351 349 -f 349 406 415 -f 419 353 351 -f 351 415 419 -f 423 355 353 -f 353 419 423 -f 425 357 355 -f 355 423 425 -f 427 359 357 -f 357 425 427 -f 8 3 1 -f 1 4 8 -f 14 12 3 -f 3 8 14 -f 29 23 12 -f 12 14 29 -f 43 41 23 -f 23 29 43 -f 59 56 41 -f 41 43 59 -f 81 77 56 -f 56 59 81 -f 99 95 77 -f 77 81 99 -f 123 117 95 -f 95 99 123 -f 139 133 117 -f 117 123 139 -f 145 140 133 -f 133 139 145 -f 20 8 4 -f 4 16 20 -f 27 14 8 -f 8 20 27 -f 39 29 14 -f 14 27 39 -f 51 43 29 -f 29 39 51 -f 71 59 43 -f 43 51 71 -f 88 81 59 -f 59 71 88 -f 109 99 81 -f 81 88 109 -f 137 123 99 -f 99 109 137 -f 153 139 123 -f 123 137 153 -f 159 145 139 -f 139 153 159 -f 36 20 16 -f 16 34 36 -f 49 27 20 -f 20 36 49 -f 57 39 27 -f 27 49 57 -f 72 51 39 -f 39 57 72 -f 90 71 51 -f 51 72 90 -f 110 88 71 -f 71 90 110 -f 141 109 88 -f 88 110 141 -f 163 137 109 -f 109 141 163 -f 172 153 137 -f 137 163 172 -f 176 159 153 -f 153 172 176 -f 69 36 34 -f 34 67 69 -f 79 49 36 -f 36 69 79 -f 87 57 49 -f 49 79 87 -f 107 72 57 -f 57 87 107 -f 129 90 72 -f 72 107 129 -f 157 110 90 -f 90 129 157 -f 175 141 110 -f 110 157 175 -f 185 163 141 -f 141 175 185 -f 195 172 163 -f 163 185 195 -f 202 176 172 -f 172 195 202 -f 120 69 67 -f 67 114 120 -f 131 79 69 -f 69 120 131 -f 149 87 79 -f 79 131 149 -f 165 107 87 -f 87 149 165 -f 179 129 107 -f 107 165 179 -f 193 157 129 -f 129 179 193 -f 207 175 157 -f 157 193 207 -f 217 185 175 -f 175 207 217 -f 220 195 185 -f 185 217 220 -f 224 202 195 -f 195 220 224 -f 190 120 114 -f 114 189 190 -f 204 131 120 -f 120 190 204 -f 211 149 131 -f 131 204 211 -f 214 165 149 -f 149 211 214 -f 226 179 165 -f 165 214 226 -f 232 193 179 -f 179 226 232 -f 237 207 193 -f 193 232 237 -f 241 217 207 -f 207 237 241 -f 243 220 217 -f 217 241 243 -f 248 224 220 -f 220 243 248 -f 246 190 189 -f 189 242 246 -f 254 204 190 -f 190 246 254 -f 257 211 204 -f 204 254 257 -f 264 214 211 -f 211 257 264 -f 268 226 214 -f 214 264 268 -f 274 232 226 -f 226 268 274 -f 278 237 232 -f 232 274 278 -f 280 241 237 -f 237 278 280 -f 283 243 241 -f 241 280 283 -f 285 248 243 -f 243 283 285 -f 294 246 242 -f 242 292 294 -f 296 254 246 -f 246 294 296 -f 300 257 254 -f 254 296 300 -f 304 264 257 -f 257 300 304 -f 306 268 264 -f 264 304 306 -f 308 274 268 -f 268 306 308 -f 310 278 274 -f 274 308 310 -f 313 280 278 -f 278 310 313 -f 314 283 280 -f 280 313 314 -f 317 285 283 -f 283 314 317 -f 356 294 292 -f 292 358 356 -f 354 296 294 -f 294 356 354 -f 352 300 296 -f 296 354 352 -f 350 304 300 -f 300 352 350 -f 348 306 304 -f 304 350 348 -f 346 308 306 -f 306 348 346 -f 344 310 308 -f 308 346 344 -f 342 313 310 -f 310 344 342 -f 340 314 313 -f 313 342 340 -f 338 317 314 -f 314 340 338 -f 424 356 358 -f 358 426 424 -f 422 354 356 -f 356 424 422 -f 418 352 354 -f 354 422 418 -f 414 350 352 -f 352 418 414 -f 407 348 350 -f 350 414 407 -f 402 346 348 -f 348 407 402 -f 393 344 346 -f 346 402 393 -f 383 342 344 -f 344 393 383 -f 377 340 342 -f 342 383 377 -f 375 338 340 -f 340 377 375 -f 3186 3113 3115 -f 3115 3182 3186 -f 3192 3110 3113 -f 3113 3186 3192 -f 3196 3109 3110 -f 3110 3192 3196 -f 3205 3106 3109 -f 3109 3196 3205 -f 3211 3104 3106 -f 3106 3205 3211 -f 3215 3102 3104 -f 3104 3211 3215 -f 3217 3101 3102 -f 3102 3215 3217 -f 3220 3098 3101 -f 3101 3217 3220 -f 3222 3097 3098 -f 3098 3220 3222 -f 3223 3095 3097 -f 3097 3222 3223 -f 3227 3186 3182 -f 3182 3225 3227 -f 3229 3192 3186 -f 3186 3227 3229 -f 3231 3196 3192 -f 3192 3229 3231 -f 3233 3205 3196 -f 3196 3231 3233 -f 3235 3211 3205 -f 3205 3233 3235 -f 3241 3215 3211 -f 3211 3235 3241 -f 3245 3217 3215 -f 3215 3241 3245 -f 3249 3220 3217 -f 3217 3245 3249 -f 3251 3222 3220 -f 3220 3249 3251 -f 3253 3223 3222 -f 3222 3251 3253 -f 3239 3227 3225 -f 3225 3237 3239 -f 3243 3229 3227 -f 3227 3239 3243 -f 3247 3231 3229 -f 3229 3243 3247 -f 3257 3233 3231 -f 3231 3247 3257 -f 3263 3235 3233 -f 3233 3257 3263 -f 3271 3241 3235 -f 3235 3263 3271 -f 3279 3245 3241 -f 3241 3271 3279 -f 3285 3249 3245 -f 3245 3279 3285 -f 3293 3251 3249 -f 3249 3285 3293 -f 3297 3253 3251 -f 3251 3293 3297 -f 3259 3239 3237 -f 3237 3255 3259 -f 3261 3243 3239 -f 3239 3259 3261 -f 3265 3247 3243 -f 3243 3261 3265 -f 3275 3257 3247 -f 3247 3265 3275 -f 3287 3263 3257 -f 3257 3275 3287 -f 3303 3271 3263 -f 3263 3287 3303 -f 3314 3279 3271 -f 3271 3303 3314 -f 3320 3285 3279 -f 3279 3314 3320 -f 3330 3293 3285 -f 3285 3320 3330 -f 3332 3297 3293 -f 3293 3330 3332 -f 3270 3259 3255 -f 3255 3268 3270 -f 3273 3261 3259 -f 3259 3270 3273 -f 3283 3265 3261 -f 3261 3273 3283 -f 3299 3275 3265 -f 3265 3283 3299 -f 3308 3287 3275 -f 3275 3299 3308 -f 3322 3303 3287 -f 3287 3308 3322 -f 3338 3314 3303 -f 3303 3322 3338 -f 3346 3320 3314 -f 3314 3338 3346 -f 3351 3330 3320 -f 3320 3346 3351 -f 3355 3332 3330 -f 3330 3351 3355 -f 3282 3270 3268 -f 3268 3278 3282 -f 3290 3273 3270 -f 3270 3282 3290 -f 3302 3283 3273 -f 3273 3290 3302 -f 3312 3299 3283 -f 3283 3302 3312 -f 3324 3308 3299 -f 3299 3312 3324 -f 3340 3322 3308 -f 3308 3324 3340 -f 3353 3338 3322 -f 3322 3340 3353 -f 3368 3346 3338 -f 3338 3353 3368 -f 3373 3351 3346 -f 3346 3368 3373 -f 3379 3355 3351 -f 3351 3373 3379 -f 3295 3282 3278 -f 3278 3292 3295 -f 3306 3290 3282 -f 3282 3295 3306 -f 3316 3302 3290 -f 3290 3306 3316 -f 3326 3312 3302 -f 3302 3316 3326 -f 3345 3324 3312 -f 3312 3326 3345 -f 3359 3340 3324 -f 3324 3345 3359 -f 3376 3353 3340 -f 3340 3359 3376 -f 3394 3368 3353 -f 3353 3376 3394 -f 3404 3373 3368 -f 3368 3394 3404 -f 3406 3379 3373 -f 3373 3404 3406 -f 3310 3295 3292 -f 3292 3307 3310 -f 3318 3306 3295 -f 3295 3310 3318 -f 3336 3316 3306 -f 3306 3318 3336 -f 3348 3326 3316 -f 3316 3336 3348 -f 3369 3345 3326 -f 3326 3348 3369 -f 3389 3359 3345 -f 3345 3369 3389 -f 3425 3376 3359 -f 3359 3389 3425 -f 3449 3394 3376 -f 3376 3425 3449 -f 3468 3404 3394 -f 3394 3449 3468 -f 3472 3406 3404 -f 3404 3468 3472 -f 3335 3310 3307 -f 3307 3329 3335 -f 3343 3318 3310 -f 3310 3335 3343 -f 3362 3336 3318 -f 3318 3343 3362 -f 3386 3348 3336 -f 3336 3362 3386 -f 3422 3369 3348 -f 3348 3386 3422 -f 3464 3389 3369 -f 3369 3422 3464 -f 3490 3425 3389 -f 3389 3464 3490 -f 3505 3449 3425 -f 3425 3490 3505 -f 3521 3468 3449 -f 3449 3505 3521 -f 3523 3472 3468 -f 3468 3521 3523 -f 3364 3335 3329 -f 3329 3357 3364 -f 3382 3343 3335 -f 3335 3364 3382 -f 3416 3362 3343 -f 3343 3382 3416 -f 3465 3386 3362 -f 3362 3416 3465 -f 3495 3422 3386 -f 3386 3465 3495 -f 3528 3464 3422 -f 3422 3495 3528 -f 3553 3490 3464 -f 3464 3528 3553 -f 3579 3505 3490 -f 3490 3553 3579 -f 3592 3521 3505 -f 3505 3579 3592 -f 3604 3523 3521 -f 3521 3592 3604 -f 3221 3096 3094 -f 3094 3224 3221 -f 3219 3099 3096 -f 3096 3221 3219 -f 3218 3100 3099 -f 3099 3219 3218 -f 3216 3103 3100 -f 3100 3218 3216 -f 3212 3105 3103 -f 3103 3216 3212 -f 3206 3107 3105 -f 3105 3212 3206 -f 3197 3108 3107 -f 3107 3206 3197 -f 3193 3111 3108 -f 3108 3197 3193 -f 3187 3112 3111 -f 3111 3193 3187 -f 3183 3114 3112 -f 3112 3187 3183 -f 3252 3221 3224 -f 3224 3254 3252 -f 3250 3219 3221 -f 3221 3252 3250 -f 3246 3218 3219 -f 3219 3250 3246 -f 3242 3216 3218 -f 3218 3246 3242 -f 3236 3212 3216 -f 3216 3242 3236 -f 3234 3206 3212 -f 3212 3236 3234 -f 3232 3197 3206 -f 3206 3234 3232 -f 3230 3193 3197 -f 3197 3232 3230 -f 3228 3187 3193 -f 3193 3230 3228 -f 3226 3183 3187 -f 3187 3228 3226 -f 3294 3252 3254 -f 3254 3298 3294 -f 3286 3250 3252 -f 3252 3294 3286 -f 3280 3246 3250 -f 3250 3286 3280 -f 3272 3242 3246 -f 3246 3280 3272 -f 3264 3236 3242 -f 3242 3272 3264 -f 3258 3234 3236 -f 3236 3264 3258 -f 3248 3232 3234 -f 3234 3258 3248 -f 3244 3230 3232 -f 3232 3248 3244 -f 3240 3228 3230 -f 3230 3244 3240 -f 3238 3226 3228 -f 3228 3240 3238 -f 3331 3294 3298 -f 3298 3333 3331 -f 3321 3286 3294 -f 3294 3331 3321 -f 3315 3280 3286 -f 3286 3321 3315 -f 3304 3272 3280 -f 3280 3315 3304 -f 3288 3264 3272 -f 3272 3304 3288 -f 3276 3258 3264 -f 3264 3288 3276 -f 3266 3248 3258 -f 3258 3276 3266 -f 3262 3244 3248 -f 3248 3266 3262 -f 3260 3240 3244 -f 3244 3262 3260 -f 3256 3238 3240 -f 3240 3260 3256 -f 3350 3331 3333 -f 3333 3354 3350 -f 3347 3321 3331 -f 3331 3350 3347 -f 3339 3315 3321 -f 3321 3347 3339 -f 3323 3304 3315 -f 3315 3339 3323 -f 3309 3288 3304 -f 3304 3323 3309 -f 3300 3276 3288 -f 3288 3309 3300 -f 3284 3266 3276 -f 3276 3300 3284 -f 3274 3262 3266 -f 3266 3284 3274 -f 3269 3260 3262 -f 3262 3274 3269 -f 3267 3256 3260 -f 3260 3269 3267 -f 3372 3350 3354 -f 3354 3378 3372 -f 3367 3347 3350 -f 3350 3372 3367 -f 3352 3339 3347 -f 3347 3367 3352 -f 3341 3323 3339 -f 3339 3352 3341 -f 3325 3309 3323 -f 3323 3341 3325 -f 3313 3300 3309 -f 3309 3325 3313 -f 3301 3284 3300 -f 3300 3313 3301 -f 3289 3274 3284 -f 3284 3301 3289 -f 3281 3269 3274 -f 3274 3289 3281 -f 3277 3267 3269 -f 3269 3281 3277 -f 3403 3372 3378 -f 3378 3405 3403 -f 3393 3367 3372 -f 3372 3403 3393 -f 3377 3352 3367 -f 3367 3393 3377 -f 3360 3341 3352 -f 3352 3377 3360 -f 3344 3325 3341 -f 3341 3360 3344 -f 3327 3313 3325 -f 3325 3344 3327 -f 3317 3301 3313 -f 3313 3327 3317 -f 3305 3289 3301 -f 3301 3317 3305 -f 3296 3281 3289 -f 3289 3305 3296 -f 3291 3277 3281 -f 3281 3296 3291 -f 3469 3403 3405 -f 3405 3472 3469 -f 3450 3393 3403 -f 3403 3469 3450 -f 3426 3377 3393 -f 3393 3450 3426 -f 3390 3360 3377 -f 3377 3426 3390 -f 3370 3344 3360 -f 3360 3390 3370 -f 3349 3327 3344 -f 3344 3370 3349 -f 3337 3317 3327 -f 3327 3349 3337 -f 3319 3305 3317 -f 3317 3337 3319 -f 3311 3296 3305 -f 3305 3319 3311 -f 3307 3291 3296 -f 3296 3311 3307 -f 3520 3469 3472 -f 3472 3522 3520 -f 3504 3450 3469 -f 3469 3520 3504 -f 3489 3426 3450 -f 3450 3504 3489 -f 3463 3390 3426 -f 3426 3489 3463 -f 3421 3370 3390 -f 3390 3463 3421 -f 3385 3349 3370 -f 3370 3421 3385 -f 3361 3337 3349 -f 3349 3385 3361 -f 3342 3319 3337 -f 3337 3361 3342 -f 3334 3311 3319 -f 3319 3342 3334 -f 3328 3307 3311 -f 3311 3334 3328 -f 3591 3520 3522 -f 3522 3603 3591 -f 3578 3504 3520 -f 3520 3591 3578 -f 3552 3489 3504 -f 3504 3578 3552 -f 3530 3463 3489 -f 3489 3552 3530 -f 3499 3421 3463 -f 3463 3530 3499 -f 3467 3385 3421 -f 3421 3499 3467 -f 3415 3361 3385 -f 3385 3467 3415 -f 3381 3342 3361 -f 3361 3415 3381 -f 3363 3334 3342 -f 3342 3381 3363 -f 3356 3328 3334 -f 3334 3363 3356 -f 3374 3365 3358 -f 3358 3371 3374 -f 3395 3383 3365 -f 3365 3374 3395 -f 3443 3417 3383 -f 3383 3395 3443 -f 3481 3466 3417 -f 3417 3443 3481 -f 3514 3496 3466 -f 3466 3481 3514 -f 3545 3529 3496 -f 3496 3514 3545 -f 3573 3551 3529 -f 3529 3545 3573 -f 3597 3577 3551 -f 3551 3573 3597 -f 3613 3590 3577 -f 3577 3597 3613 -f 3619 3603 3590 -f 3590 3613 3619 -f 3387 3374 3371 -f 3371 3380 3387 -f 3413 3395 3374 -f 3374 3387 3413 -f 3461 3443 3395 -f 3395 3413 3461 -f 3493 3481 3443 -f 3443 3461 3493 -f 3524 3514 3481 -f 3481 3493 3524 -f 3556 3545 3514 -f 3514 3524 3556 -f 3584 3573 3545 -f 3545 3556 3584 -f 3611 3597 3573 -f 3573 3584 3611 -f 3628 3613 3597 -f 3597 3611 3628 -f 3632 3619 3613 -f 3613 3628 3632 -f 3398 3387 3380 -f 3380 3391 3398 -f 3435 3413 3387 -f 3387 3398 3435 -f 3473 3461 3413 -f 3413 3435 3473 -f 3500 3493 3461 -f 3461 3473 3500 -f 3531 3524 3493 -f 3493 3500 3531 -f 3562 3556 3524 -f 3524 3531 3562 -f 3595 3584 3556 -f 3556 3562 3595 -f 3617 3611 3584 -f 3584 3595 3617 -f 3633 3628 3611 -f 3611 3617 3633 -f 3641 3632 3628 -f 3628 3633 3641 -f 3409 3398 3391 -f 3391 3400 3409 -f 3447 3435 3398 -f 3398 3409 3447 -f 3477 3473 3435 -f 3435 3447 3477 -f 3506 3500 3473 -f 3473 3477 3506 -f 3540 3531 3500 -f 3500 3506 3540 -f 3567 3562 3531 -f 3531 3540 3567 -f 3601 3595 3562 -f 3562 3567 3601 -f 3624 3617 3595 -f 3595 3601 3624 -f 3639 3633 3617 -f 3617 3624 3639 -f 3644 3641 3633 -f 3633 3639 3644 -f 3433 3409 3400 -f 3400 3411 3433 -f 3453 3447 3409 -f 3409 3433 3453 -f 3483 3477 3447 -f 3447 3453 3483 -f 3510 3506 3477 -f 3477 3483 3510 -f 3543 3540 3506 -f 3506 3510 3543 -f 3569 3567 3540 -f 3540 3543 3569 -f 3599 3601 3567 -f 3567 3569 3599 -f 3622 3624 3601 -f 3601 3599 3622 -f 3637 3639 3624 -f 3624 3622 3637 -f 3642 3644 3639 -f 3639 3637 3642 -f 3439 3433 3411 -f 3411 3424 3439 -f 3458 3453 3433 -f 3433 3439 3458 -f 3487 3483 3453 -f 3453 3458 3487 -f 3513 3510 3483 -f 3483 3487 3513 -f 3542 3543 3510 -f 3510 3513 3542 -f 3566 3569 3543 -f 3543 3542 3566 -f 3593 3599 3569 -f 3569 3566 3593 -f 3616 3622 3599 -f 3599 3593 3616 -f 3630 3637 3622 -f 3622 3616 3630 -f 3636 3642 3637 -f 3637 3630 3636 -f 3441 3439 3424 -f 3424 3429 3441 -f 3459 3458 3439 -f 3439 3441 3459 -f 3485 3487 3458 -f 3458 3459 3485 -f 3508 3513 3487 -f 3487 3485 3508 -f 3533 3542 3513 -f 3513 3508 3533 -f 3558 3566 3542 -f 3542 3533 3558 -f 3582 3593 3566 -f 3566 3558 3582 -f 3607 3616 3593 -f 3593 3582 3607 -f 3620 3630 3616 -f 3616 3607 3620 -f 3626 3636 3630 -f 3630 3620 3626 -f 3437 3441 3429 -f 3429 3427 3437 -f 3455 3459 3441 -f 3441 3437 3455 -f 3479 3485 3459 -f 3459 3455 3479 -f 3502 3508 3485 -f 3485 3479 3502 -f 3526 3533 3508 -f 3508 3502 3526 -f 3547 3558 3533 -f 3533 3526 3547 -f 3571 3582 3558 -f 3558 3547 3571 -f 3588 3607 3582 -f 3582 3571 3588 -f 3605 3620 3607 -f 3607 3588 3605 -f 3609 3626 3620 -f 3620 3605 3609 -f 3419 3437 3427 -f 3427 3408 3419 -f 3445 3455 3437 -f 3437 3419 3445 -f 3470 3479 3455 -f 3455 3445 3470 -f 3492 3502 3479 -f 3479 3470 3492 -f 3517 3526 3502 -f 3502 3492 3517 -f 3536 3547 3526 -f 3526 3517 3536 -f 3554 3571 3547 -f 3547 3536 3554 -f 3575 3588 3571 -f 3571 3554 3575 -f 3580 3605 3588 -f 3588 3575 3580 -f 3587 3609 3605 -f 3605 3580 3587 -f 3401 3419 3408 -f 3408 3397 3401 -f 3431 3445 3419 -f 3419 3401 3431 -f 3451 3470 3445 -f 3445 3431 3451 -f 3475 3492 3470 -f 3470 3451 3475 -f 3497 3517 3492 -f 3492 3475 3497 -f 3518 3536 3517 -f 3517 3497 3518 -f 3537 3554 3536 -f 3536 3518 3537 -f 3549 3575 3554 -f 3554 3537 3549 -f 3560 3580 3575 -f 3575 3549 3560 -f 3564 3587 3580 -f 3580 3560 3564 -f 3614 3591 3603 -f 3603 3619 3614 -f 3598 3578 3591 -f 3591 3614 3598 -f 3574 3552 3578 -f 3578 3598 3574 -f 3546 3530 3552 -f 3552 3574 3546 -f 3515 3499 3530 -f 3530 3546 3515 -f 3482 3467 3499 -f 3499 3515 3482 -f 3444 3418 3467 -f 3467 3482 3444 -f 3396 3384 3418 -f 3418 3444 3396 -f 3375 3366 3384 -f 3384 3396 3375 -f 3371 3358 3366 -f 3366 3375 3371 -f 3629 3614 3619 -f 3619 3632 3629 -f 3612 3598 3614 -f 3614 3629 3612 -f 3585 3574 3598 -f 3598 3612 3585 -f 3557 3546 3574 -f 3574 3585 3557 -f 3525 3515 3546 -f 3546 3557 3525 -f 3494 3482 3515 -f 3515 3525 3494 -f 3462 3444 3482 -f 3482 3494 3462 -f 3414 3396 3444 -f 3444 3462 3414 -f 3388 3375 3396 -f 3396 3414 3388 -f 3380 3371 3375 -f 3375 3388 3380 -f 3634 3629 3632 -f 3632 3641 3634 -f 3618 3612 3629 -f 3629 3634 3618 -f 3596 3585 3612 -f 3612 3618 3596 -f 3563 3557 3585 -f 3585 3596 3563 -f 3532 3525 3557 -f 3557 3563 3532 -f 3501 3494 3525 -f 3525 3532 3501 -f 3474 3462 3494 -f 3494 3501 3474 -f 3436 3414 3462 -f 3462 3474 3436 -f 3399 3388 3414 -f 3414 3436 3399 -f 3392 3380 3388 -f 3388 3399 3392 -f 3640 3634 3641 -f 3641 3644 3640 -f 3625 3618 3634 -f 3634 3640 3625 -f 3602 3596 3618 -f 3618 3625 3602 -f 3568 3563 3596 -f 3596 3602 3568 -f 3539 3532 3563 -f 3563 3568 3539 -f 3507 3501 3532 -f 3532 3539 3507 -f 3478 3474 3501 -f 3501 3507 3478 -f 3448 3436 3474 -f 3474 3478 3448 -f 3410 3399 3436 -f 3436 3448 3410 -f 3400 3392 3399 -f 3399 3410 3400 -f 3638 3640 3644 -f 3644 3643 3638 -f 3623 3625 3640 -f 3640 3638 3623 -f 3600 3602 3625 -f 3625 3623 3600 -f 3570 3568 3602 -f 3602 3600 3570 -f 3544 3539 3568 -f 3568 3570 3544 -f 3511 3507 3539 -f 3539 3544 3511 -f 3484 3478 3507 -f 3507 3511 3484 -f 3454 3448 3478 -f 3478 3484 3454 -f 3434 3410 3448 -f 3448 3454 3434 -f 3412 3400 3410 -f 3410 3434 3412 -f 3631 3638 3643 -f 3643 3635 3631 -f 3615 3623 3638 -f 3638 3631 3615 -f 3594 3600 3623 -f 3623 3615 3594 -f 3565 3570 3600 -f 3600 3594 3565 -f 3541 3544 3570 -f 3570 3565 3541 -f 3512 3511 3544 -f 3544 3541 3512 -f 3488 3484 3511 -f 3511 3512 3488 -f 3457 3454 3484 -f 3484 3488 3457 -f 3440 3434 3454 -f 3454 3457 3440 -f 3423 3412 3434 -f 3434 3440 3423 -f 3621 3631 3635 -f 3635 3627 3621 -f 3608 3615 3631 -f 3631 3621 3608 -f 3583 3594 3615 -f 3615 3608 3583 -f 3559 3565 3594 -f 3594 3583 3559 -f 3534 3541 3565 -f 3565 3559 3534 -f 3509 3512 3541 -f 3541 3534 3509 -f 3486 3488 3512 -f 3512 3509 3486 -f 3460 3457 3488 -f 3488 3486 3460 -f 3442 3440 3457 -f 3457 3460 3442 -f 3430 3423 3440 -f 3440 3442 3430 -f 3606 3621 3627 -f 3627 3610 3606 -f 3589 3608 3621 -f 3621 3606 3589 -f 3572 3583 3608 -f 3608 3589 3572 -f 3548 3559 3583 -f 3583 3572 3548 -f 3527 3534 3559 -f 3559 3548 3527 -f 3503 3509 3534 -f 3534 3527 3503 -f 3480 3486 3509 -f 3509 3503 3480 -f 3456 3460 3486 -f 3486 3480 3456 -f 3438 3442 3460 -f 3460 3456 3438 -f 3428 3430 3442 -f 3442 3438 3428 -f 3581 3606 3610 -f 3610 3586 3581 -f 3576 3589 3606 -f 3606 3581 3576 -f 3555 3572 3589 -f 3589 3576 3555 -f 3535 3548 3572 -f 3572 3555 3535 -f 3516 3527 3548 -f 3548 3535 3516 -f 3491 3503 3527 -f 3527 3516 3491 -f 3471 3480 3503 -f 3503 3491 3471 -f 3446 3456 3480 -f 3480 3471 3446 -f 3420 3438 3456 -f 3456 3446 3420 -f 3407 3428 3438 -f 3438 3420 3407 -f 3561 3581 3586 -f 3586 3564 3561 -f 3550 3576 3581 -f 3581 3561 3550 -f 3538 3555 3576 -f 3576 3550 3538 -f 3519 3535 3555 -f 3555 3538 3519 -f 3498 3516 3535 -f 3535 3519 3498 -f 3476 3491 3516 -f 3516 3498 3476 -f 3452 3471 3491 -f 3491 3476 3452 -f 3432 3446 3471 -f 3471 3452 3432 -f 3402 3420 3446 -f 3446 3432 3402 -f 3397 3407 3420 -f 3420 3402 3397 -f 1888 2110 2104 -f 1888 2104 2096 -f 1888 2096 2076 -f 1888 2076 2048 -f 1888 2048 2030 -f 1888 2030 2006 -f 1888 2006 1982 -f 1888 1982 1960 -f 1888 1960 1936 -f 1888 1936 1732 -f 2257 2104 2110 -f 2110 2261 2257 -f 2249 2096 2104 -f 2104 2257 2249 -f 2226 2076 2096 -f 2096 2249 2226 -f 2200 2048 2076 -f 2076 2226 2200 -f 2142 2030 2048 -f 2048 2200 2142 -f 2094 2006 2030 -f 2030 2142 2094 -f 2036 1982 2006 -f 2006 2094 2036 -f 1988 1960 1982 -f 1982 2036 1988 -f 1948 1936 1960 -f 1960 1988 1948 -f 1728 1732 1936 -f 1936 1948 1728 -f 2310 2257 2261 -f 2261 2315 2310 -f 2300 2249 2257 -f 2257 2310 2300 -f 2279 2226 2249 -f 2249 2300 2279 -f 2243 2200 2226 -f 2226 2279 2243 -f 2204 2142 2200 -f 2200 2243 2204 -f 2132 2094 2142 -f 2142 2204 2132 -f 2067 2036 2094 -f 2094 2132 2067 -f 2000 1988 2036 -f 2036 2067 2000 -f 1956 1948 1988 -f 1988 2000 1956 -f 1734 1728 1948 -f 1948 1956 1734 -f 2312 2310 2315 -f 2315 2316 2312 -f 2302 2300 2310 -f 2310 2312 2302 -f 2281 2279 2300 -f 2300 2302 2281 -f 2245 2243 2279 -f 2279 2281 2245 -f 2206 2204 2243 -f 2243 2245 2206 -f 2134 2132 2204 -f 2204 2206 2134 -f 2068 2067 2132 -f 2132 2134 2068 -f 2002 2000 2067 -f 2067 2068 2002 -f 1958 1956 2000 -f 2000 2002 1958 -f 1878 1734 1956 -f 1956 1958 1878 -f 2285 2312 2316 -f 2316 2289 2285 -f 2259 2302 2312 -f 2312 2285 2259 -f 2241 2281 2302 -f 2302 2259 2241 -f 2214 2245 2281 -f 2281 2241 2214 -f 2168 2206 2245 -f 2245 2214 2168 -f 2106 2134 2206 -f 2206 2168 2106 -f 2042 2068 2134 -f 2134 2106 2042 -f 1994 2002 2068 -f 2068 2042 1994 -f 1952 1958 2002 -f 2002 1994 1952 -f 1731 1878 1958 -f 1958 1952 1731 -f 2220 2285 2289 -f 2289 2225 2220 -f 2210 2259 2285 -f 2285 2220 2210 -f 2186 2241 2259 -f 2259 2210 2186 -f 2146 2214 2241 -f 2241 2186 2146 -f 2108 2168 2214 -f 2214 2146 2108 -f 2060 2106 2168 -f 2168 2108 2060 -f 2018 2042 2106 -f 2106 2060 2018 -f 1978 1994 2042 -f 2042 2018 1978 -f 1944 1952 1994 -f 1994 1978 1944 -f 1727 1731 1952 -f 1952 1944 1727 -f 2141 2220 2225 -f 2225 2145 2141 -f 2127 2210 2220 -f 2220 2141 2127 -f 2112 2186 2210 -f 2210 2127 2112 -f 2084 2146 2186 -f 2186 2112 2084 -f 2044 2108 2146 -f 2146 2084 2044 -f 2024 2060 2108 -f 2108 2044 2024 -f 1992 2018 2060 -f 2060 2024 1992 -f 1970 1978 2018 -f 2018 1992 1970 -f 1942 1944 1978 -f 1978 1970 1942 -f 1721 1727 1944 -f 1944 1942 1721 -f 2079 2141 2145 -f 2145 2087 2079 -f 2075 2127 2141 -f 2141 2079 2075 -f 2055 2112 2127 -f 2127 2075 2055 -f 2039 2084 2112 -f 2112 2055 2039 -f 2021 2044 2084 -f 2084 2039 2021 -f 1996 2024 2044 -f 2044 2021 1996 -f 1974 1992 2024 -f 2024 1996 1974 -f 1954 1970 1992 -f 1992 1974 1954 -f 1934 1942 1970 -f 1970 1954 1934 -f 1720 1721 1942 -f 1942 1934 1720 -f 2063 2079 2087 -f 2087 2071 2063 -f 2051 2075 2079 -f 2079 2063 2051 -f 2041 2055 2075 -f 2075 2051 2041 -f 2029 2039 2055 -f 2055 2041 2029 -f 2013 2021 2039 -f 2039 2029 2013 -f 1991 1996 2021 -f 2021 2013 1991 -f 1972 1974 1996 -f 1996 1991 1972 -f 1950 1954 1974 -f 1974 1972 1950 -f 1932 1934 1954 -f 1954 1950 1932 -f 1701 1720 1934 -f 1934 1932 1701 -f 2115 2063 2071 -f 2071 2123 2115 -f 2101 2051 2063 -f 2063 2115 2101 -f 2081 2041 2051 -f 2051 2101 2081 -f 2057 2029 2041 -f 2041 2081 2057 -f 2033 2013 2029 -f 2029 2057 2033 -f 2009 1991 2013 -f 2013 2033 2009 -f 1984 1972 1991 -f 1991 2009 1984 -f 1964 1950 1972 -f 1972 1984 1964 -f 1938 1932 1950 -f 1950 1964 1938 -f 1698 1701 1932 -f 1932 1938 1698 -f 1888 1886 1686 -f 1888 1686 1662 -f 1888 1662 1640 -f 1888 1640 1616 -f 1888 1616 1592 -f 1888 1592 1574 -f 1888 1574 1546 -f 1888 1546 1526 -f 1888 1526 1518 -f 1888 1518 1512 -f 1674 1686 1886 -f 1886 1884 1674 -f 1634 1662 1686 -f 1686 1674 1634 -f 1586 1640 1662 -f 1662 1634 1586 -f 1528 1616 1640 -f 1640 1586 1528 -f 1480 1592 1616 -f 1616 1528 1480 -f 1422 1574 1592 -f 1592 1480 1422 -f 1396 1546 1574 -f 1574 1422 1396 -f 1373 1526 1546 -f 1546 1396 1373 -f 1365 1518 1526 -f 1526 1373 1365 -f 1361 1512 1518 -f 1518 1365 1361 -f 1666 1674 1884 -f 1884 1882 1666 -f 1622 1634 1674 -f 1674 1666 1622 -f 1557 1586 1634 -f 1634 1622 1557 -f 1490 1528 1586 -f 1586 1557 1490 -f 1418 1480 1528 -f 1528 1490 1418 -f 1379 1422 1480 -f 1480 1418 1379 -f 1343 1396 1422 -f 1422 1379 1343 -f 1322 1373 1396 -f 1396 1343 1322 -f 1312 1365 1373 -f 1373 1322 1312 -f 1309 1361 1365 -f 1365 1312 1309 -f 1664 1666 1882 -f 1882 1879 1664 -f 1620 1622 1666 -f 1666 1664 1620 -f 1554 1557 1622 -f 1622 1620 1554 -f 1488 1490 1557 -f 1557 1554 1488 -f 1416 1418 1490 -f 1490 1488 1416 -f 1377 1379 1418 -f 1418 1416 1377 -f 1341 1343 1379 -f 1379 1377 1341 -f 1320 1322 1343 -f 1343 1341 1320 -f 1310 1312 1322 -f 1322 1320 1310 -f 1306 1309 1312 -f 1312 1310 1306 -f 1670 1664 1879 -f 1879 1876 1670 -f 1628 1620 1664 -f 1664 1670 1628 -f 1580 1554 1620 -f 1620 1628 1580 -f 1516 1488 1554 -f 1554 1580 1516 -f 1454 1416 1488 -f 1488 1516 1454 -f 1408 1377 1416 -f 1416 1454 1408 -f 1381 1341 1377 -f 1377 1408 1381 -f 1363 1320 1341 -f 1341 1381 1363 -f 1337 1310 1320 -f 1320 1363 1337 -f 1333 1306 1310 -f 1310 1337 1333 -f 1678 1670 1876 -f 1876 1874 1678 -f 1644 1628 1670 -f 1670 1678 1644 -f 1604 1580 1628 -f 1628 1644 1604 -f 1562 1516 1580 -f 1580 1604 1562 -f 1514 1454 1516 -f 1516 1562 1514 -f 1476 1408 1454 -f 1454 1514 1476 -f 1436 1381 1408 -f 1408 1476 1436 -f 1412 1363 1381 -f 1381 1436 1412 -f 1402 1337 1363 -f 1363 1412 1402 -f 1399 1333 1337 -f 1337 1402 1399 -f 1680 1678 1874 -f 1874 1872 1680 -f 1652 1644 1678 -f 1678 1680 1652 -f 1630 1604 1644 -f 1644 1652 1630 -f 1598 1562 1604 -f 1604 1630 1598 -f 1578 1514 1562 -f 1562 1598 1578 -f 1538 1476 1514 -f 1514 1578 1538 -f 1510 1436 1476 -f 1476 1538 1510 -f 1497 1412 1436 -f 1436 1510 1497 -f 1483 1402 1412 -f 1412 1497 1483 -f 1479 1399 1402 -f 1402 1483 1479 -f 1688 1680 1872 -f 1872 1870 1688 -f 1668 1652 1680 -f 1680 1688 1668 -f 1648 1630 1652 -f 1652 1668 1648 -f 1626 1598 1630 -f 1630 1648 1626 -f 1603 1578 1598 -f 1598 1626 1603 -f 1585 1538 1578 -f 1578 1603 1585 -f 1569 1510 1538 -f 1538 1585 1569 -f 1549 1497 1510 -f 1510 1569 1549 -f 1545 1483 1497 -f 1497 1549 1545 -f 1537 1479 1483 -f 1483 1545 1537 -f 1690 1688 1870 -f 1870 1868 1690 -f 1672 1668 1688 -f 1688 1690 1672 -f 1650 1648 1668 -f 1668 1672 1650 -f 1633 1626 1648 -f 1648 1650 1633 -f 1611 1603 1626 -f 1626 1633 1611 -f 1595 1585 1603 -f 1603 1611 1595 -f 1583 1569 1585 -f 1585 1595 1583 -f 1573 1549 1569 -f 1569 1583 1573 -f 1561 1545 1549 -f 1549 1573 1561 -f 1553 1537 1545 -f 1545 1561 1553 -f 1684 1690 1868 -f 1868 1865 1684 -f 1658 1672 1690 -f 1690 1684 1658 -f 1638 1650 1672 -f 1672 1658 1638 -f 1615 1633 1650 -f 1650 1638 1615 -f 1591 1611 1633 -f 1633 1615 1591 -f 1567 1595 1611 -f 1611 1591 1567 -f 1543 1583 1595 -f 1595 1567 1543 -f 1523 1573 1583 -f 1583 1543 1523 -f 1509 1561 1573 -f 1573 1523 1509 -f 1501 1553 1561 -f 1561 1509 1501 -f 1888 1513 1519 -f 1888 1519 1527 -f 1888 1527 1547 -f 1888 1547 1575 -f 1888 1575 1593 -f 1888 1593 1617 -f 1888 1617 1641 -f 1888 1641 1663 -f 1888 1663 1687 -f 1888 1687 1894 -f 1366 1519 1513 -f 1513 1362 1366 -f 1374 1527 1519 -f 1519 1366 1374 -f 1397 1547 1527 -f 1527 1374 1397 -f 1423 1575 1547 -f 1547 1397 1423 -f 1481 1593 1575 -f 1575 1423 1481 -f 1529 1617 1593 -f 1593 1481 1529 -f 1587 1641 1617 -f 1617 1529 1587 -f 1635 1663 1641 -f 1641 1587 1635 -f 1675 1687 1663 -f 1663 1635 1675 -f 1895 1894 1687 -f 1687 1675 1895 -f 1313 1366 1362 -f 1362 1308 1313 -f 1323 1374 1366 -f 1366 1313 1323 -f 1344 1397 1374 -f 1374 1323 1344 -f 1380 1423 1397 -f 1397 1344 1380 -f 1419 1481 1423 -f 1423 1380 1419 -f 1491 1529 1481 -f 1481 1419 1491 -f 1556 1587 1529 -f 1529 1491 1556 -f 1623 1635 1587 -f 1587 1556 1623 -f 1667 1675 1635 -f 1635 1623 1667 -f 1890 1895 1675 -f 1675 1667 1890 -f 1311 1313 1308 -f 1308 1307 1311 -f 1321 1323 1313 -f 1313 1311 1321 -f 1342 1344 1323 -f 1323 1321 1342 -f 1378 1380 1344 -f 1344 1342 1378 -f 1417 1419 1380 -f 1380 1378 1417 -f 1489 1491 1419 -f 1419 1417 1489 -f 1555 1556 1491 -f 1491 1489 1555 -f 1621 1623 1556 -f 1556 1555 1621 -f 1665 1667 1623 -f 1623 1621 1665 -f 1881 1890 1667 -f 1667 1665 1881 -f 1338 1311 1307 -f 1307 1334 1338 -f 1364 1321 1311 -f 1311 1338 1364 -f 1382 1342 1321 -f 1321 1364 1382 -f 1409 1378 1342 -f 1342 1382 1409 -f 1455 1417 1378 -f 1378 1409 1455 -f 1517 1489 1417 -f 1417 1455 1517 -f 1581 1555 1489 -f 1489 1517 1581 -f 1629 1621 1555 -f 1555 1581 1629 -f 1671 1665 1621 -f 1621 1629 1671 -f 1893 1881 1665 -f 1665 1671 1893 -f 1403 1338 1334 -f 1334 1398 1403 -f 1413 1364 1338 -f 1338 1403 1413 -f 1437 1382 1364 -f 1364 1413 1437 -f 1477 1409 1382 -f 1382 1437 1477 -f 1515 1455 1409 -f 1409 1477 1515 -f 1563 1517 1455 -f 1455 1515 1563 -f 1605 1581 1517 -f 1517 1563 1605 -f 1645 1629 1581 -f 1581 1605 1645 -f 1679 1671 1629 -f 1629 1645 1679 -f 1900 1893 1671 -f 1671 1679 1900 -f 1482 1403 1398 -f 1398 1478 1482 -f 1496 1413 1403 -f 1403 1482 1496 -f 1511 1437 1413 -f 1413 1496 1511 -f 1539 1477 1437 -f 1437 1511 1539 -f 1579 1515 1477 -f 1477 1539 1579 -f 1599 1563 1515 -f 1515 1579 1599 -f 1631 1605 1563 -f 1563 1599 1631 -f 1653 1645 1605 -f 1605 1631 1653 -f 1681 1679 1645 -f 1645 1653 1681 -f 1902 1900 1679 -f 1679 1681 1902 -f 1544 1482 1478 -f 1478 1536 1544 -f 1548 1496 1482 -f 1482 1544 1548 -f 1568 1511 1496 -f 1496 1548 1568 -f 1584 1539 1511 -f 1511 1568 1584 -f 1602 1579 1539 -f 1539 1584 1602 -f 1627 1599 1579 -f 1579 1602 1627 -f 1649 1631 1599 -f 1599 1627 1649 -f 1669 1653 1631 -f 1631 1649 1669 -f 1689 1681 1653 -f 1653 1669 1689 -f 1921 1902 1681 -f 1681 1689 1921 -f 1560 1544 1536 -f 1536 1552 1560 -f 1572 1548 1544 -f 1544 1560 1572 -f 1582 1568 1548 -f 1548 1572 1582 -f 1594 1584 1568 -f 1568 1582 1594 -f 1610 1602 1584 -f 1584 1594 1610 -f 1632 1627 1602 -f 1602 1610 1632 -f 1651 1649 1627 -f 1627 1632 1651 -f 1673 1669 1649 -f 1649 1651 1673 -f 1691 1689 1669 -f 1669 1673 1691 -f 1922 1921 1689 -f 1689 1691 1922 -f 1508 1560 1552 -f 1552 1500 1508 -f 1522 1572 1560 -f 1560 1508 1522 -f 1542 1582 1572 -f 1572 1522 1542 -f 1566 1594 1582 -f 1582 1542 1566 -f 1590 1610 1594 -f 1594 1566 1590 -f 1614 1632 1610 -f 1610 1590 1614 -f 1639 1651 1632 -f 1632 1614 1639 -f 1659 1673 1651 -f 1651 1639 1659 -f 1685 1691 1673 -f 1673 1659 1685 -f 1928 1922 1691 -f 1691 1685 1928 -f 1888 1887 1937 -f 1888 1937 1961 -f 1888 1961 1983 -f 1888 1983 2007 -f 1888 2007 2031 -f 1888 2031 2049 -f 1888 2049 2077 -f 1888 2077 2097 -f 1888 2097 2105 -f 1888 2105 2111 -f 1949 1937 1887 -f 1887 1885 1949 -f 1989 1961 1937 -f 1937 1949 1989 -f 2037 1983 1961 -f 1961 1989 2037 -f 2095 2007 1983 -f 1983 2037 2095 -f 2143 2031 2007 -f 2007 2095 2143 -f 2201 2049 2031 -f 2031 2143 2201 -f 2227 2077 2049 -f 2049 2201 2227 -f 2250 2097 2077 -f 2077 2227 2250 -f 2258 2105 2097 -f 2097 2250 2258 -f 2262 2111 2105 -f 2105 2258 2262 -f 1957 1949 1885 -f 1885 1883 1957 -f 2001 1989 1949 -f 1949 1957 2001 -f 2066 2037 1989 -f 1989 2001 2066 -f 2133 2095 2037 -f 2037 2066 2133 -f 2205 2143 2095 -f 2095 2133 2205 -f 2244 2201 2143 -f 2143 2205 2244 -f 2280 2227 2201 -f 2201 2244 2280 -f 2301 2250 2227 -f 2227 2280 2301 -f 2311 2258 2250 -f 2250 2301 2311 -f 2314 2262 2258 -f 2258 2311 2314 -f 1959 1957 1883 -f 1883 1880 1959 -f 2003 2001 1957 -f 1957 1959 2003 -f 2069 2066 2001 -f 2001 2003 2069 -f 2135 2133 2066 -f 2066 2069 2135 -f 2207 2205 2133 -f 2133 2135 2207 -f 2246 2244 2205 -f 2205 2207 2246 -f 2282 2280 2244 -f 2244 2246 2282 -f 2303 2301 2280 -f 2280 2282 2303 -f 2313 2311 2301 -f 2301 2303 2313 -f 2317 2314 2311 -f 2311 2313 2317 -f 1953 1959 1880 -f 1880 1877 1953 -f 1995 2003 1959 -f 1959 1953 1995 -f 2043 2069 2003 -f 2003 1995 2043 -f 2107 2135 2069 -f 2069 2043 2107 -f 2169 2207 2135 -f 2135 2107 2169 -f 2215 2246 2207 -f 2207 2169 2215 -f 2242 2282 2246 -f 2246 2215 2242 -f 2260 2303 2282 -f 2282 2242 2260 -f 2286 2313 2303 -f 2303 2260 2286 -f 2290 2317 2313 -f 2313 2286 2290 -f 1945 1953 1877 -f 1877 1875 1945 -f 1979 1995 1953 -f 1953 1945 1979 -f 2019 2043 1995 -f 1995 1979 2019 -f 2061 2107 2043 -f 2043 2019 2061 -f 2109 2169 2107 -f 2107 2061 2109 -f 2147 2215 2169 -f 2169 2109 2147 -f 2187 2242 2215 -f 2215 2147 2187 -f 2211 2260 2242 -f 2242 2187 2211 -f 2221 2286 2260 -f 2260 2211 2221 -f 2224 2290 2286 -f 2286 2221 2224 -f 1943 1945 1875 -f 1875 1873 1943 -f 1971 1979 1945 -f 1945 1943 1971 -f 1993 2019 1979 -f 1979 1971 1993 -f 2025 2061 2019 -f 2019 1993 2025 -f 2045 2109 2061 -f 2061 2025 2045 -f 2085 2147 2109 -f 2109 2045 2085 -f 2113 2187 2147 -f 2147 2085 2113 -f 2126 2211 2187 -f 2187 2113 2126 -f 2140 2221 2211 -f 2211 2126 2140 -f 2144 2224 2221 -f 2221 2140 2144 -f 1935 1943 1873 -f 1873 1871 1935 -f 1955 1971 1943 -f 1943 1935 1955 -f 1975 1993 1971 -f 1971 1955 1975 -f 1997 2025 1993 -f 1993 1975 1997 -f 2020 2045 2025 -f 2025 1997 2020 -f 2038 2085 2045 -f 2045 2020 2038 -f 2054 2113 2085 -f 2085 2038 2054 -f 2074 2126 2113 -f 2113 2054 2074 -f 2078 2140 2126 -f 2126 2074 2078 -f 2086 2144 2140 -f 2140 2078 2086 -f 1933 1935 1871 -f 1871 1869 1933 -f 1951 1955 1935 -f 1935 1933 1951 -f 1973 1975 1955 -f 1955 1951 1973 -f 1990 1997 1975 -f 1975 1973 1990 -f 2012 2020 1997 -f 1997 1990 2012 -f 2028 2038 2020 -f 2020 2012 2028 -f 2040 2054 2038 -f 2038 2028 2040 -f 2050 2074 2054 -f 2054 2040 2050 -f 2062 2078 2074 -f 2074 2050 2062 -f 2070 2086 2078 -f 2078 2062 2070 -f 1939 1933 1869 -f 1869 1866 1939 -f 1965 1951 1933 -f 1933 1939 1965 -f 1985 1973 1951 -f 1951 1965 1985 -f 2008 1990 1973 -f 1973 1985 2008 -f 2032 2012 1990 -f 1990 2008 2032 -f 2056 2028 2012 -f 2012 2032 2056 -f 2080 2040 2028 -f 2028 2056 2080 -f 2100 2050 2040 -f 2040 2080 2100 -f 2114 2062 2050 -f 2050 2100 2114 -f 2122 2070 2062 -f 2062 2114 2122 -f 2232 2116 2124 -f 2124 2236 2232 -f 2218 2102 2116 -f 2116 2232 2218 -f 2199 2082 2102 -f 2102 2218 2199 -f 2150 2058 2082 -f 2082 2199 2150 -f 2120 2034 2058 -f 2058 2150 2120 -f 2064 2010 2034 -f 2034 2120 2064 -f 2023 1986 2010 -f 2010 2064 2023 -f 1980 1966 1986 -f 1986 2023 1980 -f 1946 1940 1966 -f 1966 1980 1946 -f 1862 1730 1940 -f 1940 1946 1862 -f 2332 2232 2236 -f 2236 2336 2332 -f 2322 2218 2232 -f 2232 2332 2322 -f 2306 2199 2218 -f 2218 2322 2306 -f 2275 2150 2199 -f 2199 2306 2275 -f 2234 2120 2150 -f 2150 2275 2234 -f 2170 2064 2120 -f 2120 2234 2170 -f 2093 2023 2064 -f 2064 2170 2093 -f 2016 1980 2023 -f 2023 2093 2016 -f 1968 1946 1980 -f 1980 2016 1968 -f 1858 1862 1946 -f 1946 1968 1858 -f 2409 2332 2336 -f 2336 2413 2409 -f 2400 2322 2332 -f 2332 2409 2400 -f 2376 2306 2322 -f 2322 2400 2376 -f 2349 2275 2306 -f 2306 2376 2349 -f 2324 2234 2275 -f 2275 2349 2324 -f 2271 2170 2234 -f 2234 2324 2271 -f 2185 2093 2170 -f 2170 2271 2185 -f 2072 2016 2093 -f 2093 2185 2072 -f 1976 1968 2016 -f 2016 2072 1976 -f 1729 1858 1968 -f 1968 1976 1729 -f 2488 2409 2413 -f 2413 2498 2488 -f 2470 2400 2409 -f 2409 2488 2470 -f 2444 2376 2400 -f 2400 2470 2444 -f 2418 2349 2376 -f 2376 2444 2418 -f 2384 2324 2349 -f 2349 2418 2384 -f 2338 2271 2324 -f 2324 2384 2338 -f 2269 2185 2271 -f 2271 2338 2269 -f 2138 2072 2185 -f 2185 2269 2138 -f 1998 1976 2072 -f 2072 2138 1998 -f 1722 1729 1976 -f 1976 1998 1722 -f 2559 2488 2498 -f 2498 2569 2559 -f 2549 2470 2488 -f 2488 2559 2549 -f 2531 2444 2470 -f 2470 2549 2531 -f 2492 2418 2444 -f 2444 2531 2492 -f 2436 2384 2418 -f 2418 2492 2436 -f 2394 2338 2384 -f 2384 2436 2394 -f 2326 2269 2338 -f 2338 2394 2326 -f 2212 2138 2269 -f 2269 2326 2212 -f 2026 1998 2138 -f 2138 2212 2026 -f 1850 1722 1998 -f 1998 2026 1850 -f 2653 2559 2569 -f 2569 2655 2653 -f 2631 2549 2559 -f 2559 2653 2631 -f 2593 2531 2549 -f 2549 2631 2593 -f 2551 2492 2531 -f 2531 2593 2551 -f 2510 2436 2492 -f 2492 2551 2510 -f 2432 2394 2436 -f 2436 2510 2432 -f 2366 2326 2394 -f 2394 2432 2366 -f 2263 2212 2326 -f 2326 2366 2263 -f 2052 2026 2212 -f 2212 2263 2052 -f 1726 1850 2026 -f 2026 2052 1726 -f 2720 2653 2655 -f 2655 2726 2720 -f 2697 2631 2653 -f 2653 2720 2697 -f 2662 2593 2631 -f 2631 2697 2662 -f 2607 2551 2593 -f 2593 2662 2607 -f 2547 2510 2551 -f 2551 2607 2547 -f 2484 2432 2510 -f 2510 2547 2484 -f 2405 2366 2432 -f 2432 2484 2405 -f 2308 2263 2366 -f 2366 2405 2308 -f 2090 2052 2263 -f 2263 2308 2090 -f 1719 1726 2052 -f 2052 2090 1719 -f 2787 2720 2726 -f 2726 2795 2787 -f 2759 2697 2720 -f 2720 2787 2759 -f 2713 2662 2697 -f 2697 2759 2713 -f 2657 2607 2662 -f 2662 2713 2657 -f 2589 2547 2607 -f 2607 2657 2589 -f 2525 2484 2547 -f 2547 2589 2525 -f 2422 2405 2484 -f 2484 2525 2422 -f 2330 2308 2405 -f 2405 2422 2330 -f 2118 2090 2308 -f 2308 2330 2118 -f 1700 1719 2090 -f 2090 2118 1700 -f 2834 2787 2795 -f 2795 2844 2834 -f 2798 2759 2787 -f 2787 2834 2798 -f 2750 2713 2759 -f 2759 2798 2750 -f 2690 2657 2713 -f 2713 2750 2690 -f 2624 2589 2657 -f 2657 2690 2624 -f 2536 2525 2589 -f 2589 2624 2536 -f 2441 2422 2525 -f 2525 2536 2441 -f 2340 2330 2422 -f 2422 2441 2340 -f 2128 2118 2330 -f 2330 2340 2128 -f 1825 1700 2118 -f 2118 2128 1825 -f 2847 2834 2844 -f 2844 2857 2847 -f 2821 2798 2834 -f 2834 2847 2821 -f 2765 2750 2798 -f 2798 2821 2765 -f 2703 2690 2750 -f 2750 2765 2703 -f 2637 2624 2690 -f 2690 2703 2637 -f 2543 2536 2624 -f 2624 2637 2543 -f 2446 2441 2536 -f 2536 2543 2446 -f 2344 2340 2441 -f 2441 2446 2344 -f 2136 2128 2340 -f 2340 2344 2136 -f 1713 1825 2128 -f 2128 2136 1713 -f 1676 1682 1864 -f 1864 1862 1676 -f 1642 1656 1682 -f 1682 1676 1642 -f 1601 1636 1656 -f 1656 1642 1601 -f 1558 1612 1636 -f 1636 1601 1558 -f 1502 1588 1612 -f 1612 1558 1502 -f 1472 1564 1588 -f 1588 1502 1472 -f 1425 1540 1564 -f 1564 1472 1425 -f 1404 1520 1540 -f 1540 1425 1404 -f 1390 1506 1520 -f 1520 1404 1390 -f 1387 1498 1506 -f 1506 1390 1387 -f 1654 1676 1862 -f 1862 1859 1654 -f 1606 1642 1676 -f 1676 1654 1606 -f 1531 1601 1642 -f 1642 1606 1531 -f 1452 1558 1601 -f 1601 1531 1452 -f 1388 1502 1558 -f 1558 1452 1388 -f 1347 1472 1502 -f 1502 1388 1347 -f 1316 1425 1472 -f 1472 1347 1316 -f 1300 1404 1425 -f 1425 1316 1300 -f 1290 1390 1404 -f 1404 1300 1290 -f 1286 1387 1390 -f 1390 1290 1286 -f 1646 1654 1859 -f 1859 1856 1646 -f 1550 1606 1654 -f 1654 1646 1550 -f 1439 1531 1606 -f 1606 1550 1439 -f 1351 1452 1531 -f 1531 1439 1351 -f 1298 1388 1452 -f 1452 1351 1298 -f 1275 1347 1388 -f 1388 1298 1275 -f 1246 1316 1347 -f 1347 1275 1246 -f 1222 1300 1316 -f 1316 1246 1222 -f 1215 1290 1300 -f 1300 1222 1215 -f 1211 1286 1290 -f 1290 1215 1211 -f 1624 1646 1856 -f 1856 1854 1624 -f 1484 1550 1646 -f 1646 1624 1484 -f 1353 1439 1550 -f 1550 1484 1353 -f 1284 1351 1439 -f 1439 1353 1284 -f 1238 1298 1351 -f 1351 1284 1238 -f 1204 1275 1298 -f 1298 1238 1204 -f 1178 1246 1275 -f 1275 1204 1178 -f 1152 1222 1246 -f 1246 1178 1152 -f 1134 1215 1222 -f 1222 1152 1134 -f 1124 1211 1215 -f 1215 1134 1124 -f 1596 1624 1854 -f 1854 1851 1596 -f 1410 1484 1624 -f 1624 1596 1410 -f 1296 1353 1484 -f 1484 1410 1296 -f 1228 1284 1353 -f 1353 1296 1228 -f 1186 1238 1284 -f 1284 1228 1186 -f 1130 1204 1238 -f 1238 1186 1130 -f 1091 1178 1204 -f 1204 1130 1091 -f 1073 1152 1178 -f 1178 1091 1073 -f 1063 1134 1152 -f 1152 1073 1063 -f 1053 1124 1134 -f 1134 1063 1053 -f 1570 1596 1851 -f 1851 1848 1570 -f 1359 1410 1596 -f 1596 1570 1359 -f 1256 1296 1410 -f 1410 1359 1256 -f 1190 1228 1296 -f 1296 1256 1190 -f 1112 1186 1228 -f 1228 1190 1112 -f 1071 1130 1186 -f 1186 1112 1071 -f 1029 1091 1130 -f 1130 1071 1029 -f 991 1073 1091 -f 1091 1029 991 -f 969 1063 1073 -f 1073 991 969 -f 967 1053 1063 -f 1063 969 967 -f 1532 1570 1848 -f 1848 1846 1532 -f 1314 1359 1570 -f 1570 1532 1314 -f 1219 1256 1359 -f 1359 1314 1219 -f 1138 1190 1256 -f 1256 1219 1138 -f 1075 1112 1190 -f 1190 1138 1075 -f 1015 1071 1112 -f 1112 1075 1015 -f 962 1029 1071 -f 1071 1015 962 -f 925 991 1029 -f 1029 962 925 -f 904 969 991 -f 991 925 904 -f 898 967 969 -f 969 904 898 -f 1504 1532 1846 -f 1846 1832 1504 -f 1292 1314 1532 -f 1532 1504 1292 -f 1200 1219 1314 -f 1314 1292 1200 -f 1097 1138 1219 -f 1219 1200 1097 -f 1033 1075 1138 -f 1138 1097 1033 -f 965 1015 1075 -f 1075 1033 965 -f 909 962 1015 -f 1015 965 909 -f 863 925 962 -f 962 909 863 -f 835 904 925 -f 925 863 835 -f 827 898 904 -f 904 835 827 -f 1494 1504 1832 -f 1832 1824 1494 -f 1282 1292 1504 -f 1504 1494 1282 -f 1183 1200 1292 -f 1292 1282 1183 -f 1088 1097 1200 -f 1200 1183 1088 -f 1000 1033 1097 -f 1097 1088 1000 -f 934 965 1033 -f 1033 1000 934 -f 874 909 965 -f 965 934 874 -f 826 863 909 -f 909 874 826 -f 790 835 863 -f 863 826 790 -f 780 827 835 -f 835 790 780 -f 1486 1494 1824 -f 1824 1814 1486 -f 1278 1282 1494 -f 1494 1486 1278 -f 1176 1183 1282 -f 1282 1278 1176 -f 1079 1088 1183 -f 1183 1176 1079 -f 985 1000 1088 -f 1088 1079 985 -f 919 934 1000 -f 1000 985 919 -f 857 874 934 -f 934 919 857 -f 801 826 874 -f 874 857 801 -f 775 790 826 -f 826 801 775 -f 765 780 790 -f 790 775 765 -f 1391 1507 1499 -f 1499 1387 1391 -f 1405 1521 1507 -f 1507 1391 1405 -f 1424 1541 1521 -f 1521 1405 1424 -f 1473 1565 1541 -f 1541 1424 1473 -f 1503 1589 1565 -f 1565 1473 1503 -f 1559 1613 1589 -f 1589 1503 1559 -f 1600 1637 1613 -f 1613 1559 1600 -f 1643 1657 1637 -f 1637 1600 1643 -f 1677 1683 1657 -f 1657 1643 1677 -f 1863 1892 1683 -f 1683 1677 1863 -f 1291 1391 1387 -f 1387 1287 1291 -f 1301 1405 1391 -f 1391 1291 1301 -f 1317 1424 1405 -f 1405 1301 1317 -f 1348 1473 1424 -f 1424 1317 1348 -f 1389 1503 1473 -f 1473 1348 1389 -f 1453 1559 1503 -f 1503 1389 1453 -f 1530 1600 1559 -f 1559 1453 1530 -f 1607 1643 1600 -f 1600 1530 1607 -f 1655 1677 1643 -f 1643 1607 1655 -f 1861 1863 1677 -f 1677 1655 1861 -f 1214 1291 1287 -f 1287 1210 1214 -f 1223 1301 1291 -f 1291 1214 1223 -f 1247 1317 1301 -f 1301 1223 1247 -f 1274 1348 1317 -f 1317 1247 1274 -f 1299 1389 1348 -f 1348 1274 1299 -f 1352 1453 1389 -f 1389 1299 1352 -f 1438 1530 1453 -f 1453 1352 1438 -f 1551 1607 1530 -f 1530 1438 1551 -f 1647 1655 1607 -f 1607 1551 1647 -f 1891 1861 1655 -f 1655 1647 1891 -f 1135 1214 1210 -f 1210 1125 1135 -f 1153 1223 1214 -f 1214 1135 1153 -f 1179 1247 1223 -f 1223 1153 1179 -f 1205 1274 1247 -f 1247 1179 1205 -f 1239 1299 1274 -f 1274 1205 1239 -f 1285 1352 1299 -f 1299 1239 1285 -f 1354 1438 1352 -f 1352 1285 1354 -f 1485 1551 1438 -f 1438 1354 1485 -f 1625 1647 1551 -f 1551 1485 1625 -f 1901 1891 1647 -f 1647 1625 1901 -f 1064 1135 1125 -f 1125 1054 1064 -f 1074 1153 1135 -f 1135 1064 1074 -f 1092 1179 1153 -f 1153 1074 1092 -f 1131 1205 1179 -f 1179 1092 1131 -f 1187 1239 1205 -f 1205 1131 1187 -f 1229 1285 1239 -f 1239 1187 1229 -f 1297 1354 1285 -f 1285 1229 1297 -f 1411 1485 1354 -f 1354 1297 1411 -f 1597 1625 1485 -f 1485 1411 1597 -f 1853 1901 1625 -f 1625 1597 1853 -f 970 1064 1054 -f 1054 968 970 -f 992 1074 1064 -f 1064 970 992 -f 1030 1092 1074 -f 1074 992 1030 -f 1072 1131 1092 -f 1092 1030 1072 -f 1113 1187 1131 -f 1131 1072 1113 -f 1191 1229 1187 -f 1187 1113 1191 -f 1257 1297 1229 -f 1229 1191 1257 -f 1360 1411 1297 -f 1297 1257 1360 -f 1571 1597 1411 -f 1411 1360 1571 -f 1899 1853 1597 -f 1597 1571 1899 -f 903 970 968 -f 968 897 903 -f 926 992 970 -f 970 903 926 -f 961 1030 992 -f 992 926 961 -f 1016 1072 1030 -f 1030 961 1016 -f 1076 1113 1072 -f 1072 1016 1076 -f 1139 1191 1113 -f 1113 1076 1139 -f 1218 1257 1191 -f 1191 1139 1218 -f 1315 1360 1257 -f 1257 1218 1315 -f 1533 1571 1360 -f 1360 1315 1533 -f 1920 1899 1571 -f 1571 1533 1920 -f 836 903 897 -f 897 828 836 -f 864 926 903 -f 903 836 864 -f 910 961 926 -f 926 864 910 -f 966 1016 961 -f 961 910 966 -f 1034 1076 1016 -f 1016 966 1034 -f 1098 1139 1076 -f 1076 1034 1098 -f 1201 1218 1139 -f 1139 1098 1201 -f 1293 1315 1218 -f 1218 1201 1293 -f 1505 1533 1315 -f 1315 1293 1505 -f 1924 1920 1533 -f 1533 1505 1924 -f 789 836 828 -f 828 779 789 -f 825 864 836 -f 836 789 825 -f 873 910 864 -f 864 825 873 -f 933 966 910 -f 910 873 933 -f 999 1034 966 -f 966 933 999 -f 1087 1098 1034 -f 1034 999 1087 -f 1182 1201 1098 -f 1098 1087 1182 -f 1283 1293 1201 -f 1201 1182 1283 -f 1495 1505 1293 -f 1293 1283 1495 -f 1826 1924 1505 -f 1505 1495 1826 -f 776 789 779 -f 779 766 776 -f 802 825 789 -f 789 776 802 -f 858 873 825 -f 825 802 858 -f 920 933 873 -f 873 858 920 -f 986 999 933 -f 933 920 986 -f 1080 1087 999 -f 999 986 1080 -f 1177 1182 1087 -f 1087 1080 1177 -f 1279 1283 1182 -f 1182 1177 1279 -f 1487 1495 1283 -f 1283 1279 1487 -f 1914 1826 1495 -f 1495 1487 1914 -f 1947 1941 1867 -f 1867 1863 1947 -f 1981 1967 1941 -f 1941 1947 1981 -f 2022 1987 1967 -f 1967 1981 2022 -f 2065 2011 1987 -f 1987 2022 2065 -f 2121 2035 2011 -f 2011 2065 2121 -f 2151 2059 2035 -f 2035 2121 2151 -f 2198 2083 2059 -f 2059 2151 2198 -f 2219 2103 2083 -f 2083 2198 2219 -f 2233 2117 2103 -f 2103 2219 2233 -f 2236 2125 2117 -f 2117 2233 2236 -f 1969 1947 1863 -f 1863 1860 1969 -f 2017 1981 1947 -f 1947 1969 2017 -f 2092 2022 1981 -f 1981 2017 2092 -f 2171 2065 2022 -f 2022 2092 2171 -f 2235 2121 2065 -f 2065 2171 2235 -f 2276 2151 2121 -f 2121 2235 2276 -f 2307 2198 2151 -f 2151 2276 2307 -f 2323 2219 2198 -f 2198 2307 2323 -f 2333 2233 2219 -f 2219 2323 2333 -f 2337 2236 2233 -f 2233 2333 2337 -f 1977 1969 1860 -f 1860 1857 1977 -f 2073 2017 1969 -f 1969 1977 2073 -f 2184 2092 2017 -f 2017 2073 2184 -f 2272 2171 2092 -f 2092 2184 2272 -f 2325 2235 2171 -f 2171 2272 2325 -f 2348 2276 2235 -f 2235 2325 2348 -f 2377 2307 2276 -f 2276 2348 2377 -f 2401 2323 2307 -f 2307 2377 2401 -f 2408 2333 2323 -f 2323 2401 2408 -f 2412 2337 2333 -f 2333 2408 2412 -f 1999 1977 1857 -f 1857 1855 1999 -f 2139 2073 1977 -f 1977 1999 2139 -f 2270 2184 2073 -f 2073 2139 2270 -f 2339 2272 2184 -f 2184 2270 2339 -f 2385 2325 2272 -f 2272 2339 2385 -f 2419 2348 2325 -f 2325 2385 2419 -f 2445 2377 2348 -f 2348 2419 2445 -f 2471 2401 2377 -f 2377 2445 2471 -f 2489 2408 2401 -f 2401 2471 2489 -f 2499 2412 2408 -f 2408 2489 2499 -f 2027 1999 1855 -f 1855 1852 2027 -f 2213 2139 1999 -f 1999 2027 2213 -f 2327 2270 2139 -f 2139 2213 2327 -f 2395 2339 2270 -f 2270 2327 2395 -f 2437 2385 2339 -f 2339 2395 2437 -f 2493 2419 2385 -f 2385 2437 2493 -f 2532 2445 2419 -f 2419 2493 2532 -f 2550 2471 2445 -f 2445 2532 2550 -f 2560 2489 2471 -f 2471 2550 2560 -f 2570 2499 2489 -f 2489 2560 2570 -f 2053 2027 1852 -f 1852 1849 2053 -f 2264 2213 2027 -f 2027 2053 2264 -f 2367 2327 2213 -f 2213 2264 2367 -f 2433 2395 2327 -f 2327 2367 2433 -f 2511 2437 2395 -f 2395 2433 2511 -f 2552 2493 2437 -f 2437 2511 2552 -f 2594 2532 2493 -f 2493 2552 2594 -f 2632 2550 2532 -f 2532 2594 2632 -f 2654 2560 2550 -f 2550 2632 2654 -f 2656 2570 2560 -f 2560 2654 2656 -f 2091 2053 1849 -f 1849 1847 2091 -f 2309 2264 2053 -f 2053 2091 2309 -f 2404 2367 2264 -f 2264 2309 2404 -f 2485 2433 2367 -f 2367 2404 2485 -f 2548 2511 2433 -f 2433 2485 2548 -f 2608 2552 2511 -f 2511 2548 2608 -f 2661 2594 2552 -f 2552 2608 2661 -f 2698 2632 2594 -f 2594 2661 2698 -f 2719 2654 2632 -f 2632 2698 2719 -f 2725 2656 2654 -f 2654 2719 2725 -f 2119 2091 1847 -f 1847 1833 2119 -f 2331 2309 2091 -f 2091 2119 2331 -f 2423 2404 2309 -f 2309 2331 2423 -f 2526 2485 2404 -f 2404 2423 2526 -f 2590 2548 2485 -f 2485 2526 2590 -f 2658 2608 2548 -f 2548 2590 2658 -f 2714 2661 2608 -f 2608 2658 2714 -f 2760 2698 2661 -f 2661 2714 2760 -f 2788 2719 2698 -f 2698 2760 2788 -f 2796 2725 2719 -f 2719 2788 2796 -f 2129 2119 1833 -f 1833 1827 2129 -f 2341 2331 2119 -f 2119 2129 2341 -f 2440 2423 2331 -f 2331 2341 2440 -f 2535 2526 2423 -f 2423 2440 2535 -f 2623 2590 2526 -f 2526 2535 2623 -f 2689 2658 2590 -f 2590 2623 2689 -f 2749 2714 2658 -f 2658 2689 2749 -f 2797 2760 2714 -f 2714 2749 2797 -f 2833 2788 2760 -f 2760 2797 2833 -f 2843 2796 2788 -f 2788 2833 2843 -f 2137 2129 1827 -f 1827 1815 2137 -f 2345 2341 2129 -f 2129 2137 2345 -f 2447 2440 2341 -f 2341 2345 2447 -f 2544 2535 2440 -f 2440 2447 2544 -f 2638 2623 2535 -f 2535 2544 2638 -f 2704 2689 2623 -f 2623 2638 2704 -f 2766 2749 2689 -f 2689 2704 2766 -f 2822 2797 2749 -f 2749 2766 2822 -f 2848 2833 2797 -f 2797 2822 2848 -f 2858 2843 2833 -f 2833 2848 2858 -f 1735 2334 2329 -f 1735 2329 2321 -f 1735 2321 2305 -f 1735 2305 2274 -f 1735 2274 2231 -f 1735 2231 2167 -f 1735 2167 2089 -f 1735 2089 2014 -f 1735 2014 1962 -f 1735 1962 1733 -f 2515 2329 2334 -f 2334 2524 2515 -f 2495 2321 2329 -f 2329 2515 2495 -f 2456 2305 2321 -f 2321 2495 2456 -f 2429 2274 2305 -f 2305 2456 2429 -f 2399 2231 2274 -f 2274 2429 2399 -f 2347 2167 2231 -f 2231 2399 2347 -f 2292 2089 2167 -f 2167 2347 2292 -f 2148 2014 2089 -f 2089 2292 2148 -f 2004 1962 2014 -f 2014 2148 2004 -f 1739 1733 1962 -f 1962 2004 1739 -f 2647 2515 2524 -f 2524 2649 2647 -f 2621 2495 2515 -f 2515 2647 2621 -f 2584 2456 2495 -f 2495 2621 2584 -f 2541 2429 2456 -f 2456 2584 2541 -f 2502 2399 2429 -f 2429 2541 2502 -f 2426 2347 2399 -f 2399 2502 2426 -f 2352 2292 2347 -f 2347 2426 2352 -f 2255 2148 2292 -f 2292 2352 2255 -f 2046 2004 2148 -f 2148 2255 2046 -f 1702 1739 2004 -f 2004 2046 1702 -f 2746 2647 2649 -f 2649 2757 2746 -f 2721 2621 2647 -f 2647 2746 2721 -f 2681 2584 2621 -f 2621 2721 2681 -f 2639 2541 2584 -f 2584 2681 2639 -f 2557 2502 2541 -f 2541 2639 2557 -f 2505 2426 2502 -f 2502 2557 2505 -f 2415 2352 2426 -f 2426 2505 2415 -f 2318 2255 2352 -f 2352 2415 2318 -f 2098 2046 2255 -f 2255 2318 2098 -f 1745 1702 2046 -f 2046 2098 1745 -f 2840 2746 2757 -f 2757 2849 2840 -f 2808 2721 2746 -f 2746 2840 2808 -f 2756 2681 2721 -f 2721 2808 2756 -f 2696 2639 2681 -f 2681 2756 2696 -f 2626 2557 2639 -f 2639 2696 2626 -f 2538 2505 2557 -f 2557 2626 2538 -f 2443 2415 2505 -f 2505 2538 2443 -f 2342 2318 2415 -f 2415 2443 2342 -f 2131 2098 2318 -f 2318 2342 2131 -f 1904 1745 2098 -f 2098 2131 1904 -f 2906 2840 2849 -f 2849 2925 2906 -f 2867 2808 2840 -f 2840 2906 2867 -f 2818 2756 2808 -f 2808 2867 2818 -f 2736 2696 2756 -f 2756 2818 2736 -f 2667 2626 2696 -f 2696 2736 2667 -f 2565 2538 2626 -f 2626 2667 2565 -f 2475 2443 2538 -f 2538 2565 2475 -f 2356 2342 2443 -f 2443 2475 2356 -f 2156 2131 2342 -f 2342 2356 2156 -f 1704 1904 2131 -f 2131 2156 1704 -f 2976 2906 2925 -f 2925 2987 2976 -f 2914 2867 2906 -f 2906 2976 2914 -f 2852 2818 2867 -f 2867 2914 2852 -f 2772 2736 2818 -f 2818 2852 2772 -f 2688 2667 2736 -f 2736 2772 2688 -f 2592 2565 2667 -f 2667 2688 2592 -f 2497 2475 2565 -f 2565 2592 2497 -f 2372 2356 2475 -f 2475 2497 2372 -f 2176 2156 2356 -f 2356 2372 2176 -f 1752 1704 2156 -f 2156 2176 1752 -f 2993 2976 2987 -f 2987 3011 2993 -f 2952 2914 2976 -f 2976 2993 2952 -f 2874 2852 2914 -f 2914 2952 2874 -f 2794 2772 2852 -f 2852 2874 2794 -f 2702 2688 2772 -f 2772 2794 2702 -f 2604 2592 2688 -f 2688 2702 2604 -f 2509 2497 2592 -f 2592 2604 2509 -f 2380 2372 2497 -f 2497 2509 2380 -f 2182 2176 2372 -f 2372 2380 2182 -f 1723 1752 2176 -f 2176 2182 1723 -f 3000 2993 3011 -f 3011 3020 3000 -f 2967 2952 2993 -f 2993 3000 2967 -f 2879 2874 2952 -f 2952 2967 2879 -f 2799 2794 2874 -f 2874 2879 2799 -f 2707 2702 2794 -f 2794 2799 2707 -f 2605 2604 2702 -f 2702 2707 2605 -f 2512 2509 2604 -f 2604 2605 2512 -f 2382 2380 2509 -f 2509 2512 2382 -f 2188 2182 2380 -f 2380 2382 2188 -f 1699 1723 2182 -f 2182 2188 1699 -f 3006 3000 3020 -f 3020 3022 3006 -f 2972 2967 3000 -f 3000 3006 2972 -f 2888 2879 2967 -f 2967 2972 2888 -f 2804 2799 2879 -f 2879 2888 2804 -f 2710 2707 2799 -f 2799 2804 2710 -f 2613 2605 2707 -f 2707 2710 2613 -f 2520 2512 2605 -f 2605 2613 2520 -f 2388 2382 2512 -f 2512 2520 2388 -f 2192 2188 2382 -f 2382 2388 2192 -f 1760 1699 2188 -f 2188 2192 1760 -f 1735 1737 1660 -f 1735 1660 1608 -f 1735 1608 1535 -f 1735 1535 1457 -f 1735 1457 1393 -f 1735 1393 1350 -f 1735 1350 1319 -f 1735 1319 1303 -f 1735 1303 1295 -f 1735 1295 1288 -f 1618 1660 1737 -f 1737 1739 1618 -f 1474 1608 1660 -f 1660 1618 1474 -f 1332 1535 1608 -f 1608 1474 1332 -f 1277 1457 1535 -f 1535 1332 1277 -f 1225 1393 1457 -f 1457 1277 1225 -f 1195 1350 1393 -f 1393 1225 1195 -f 1166 1319 1350 -f 1350 1195 1166 -f 1129 1303 1319 -f 1319 1166 1129 -f 1109 1295 1303 -f 1303 1129 1109 -f 1099 1288 1295 -f 1295 1109 1099 -f 1576 1618 1739 -f 1739 1741 1576 -f 1367 1474 1618 -f 1618 1576 1367 -f 1270 1332 1474 -f 1474 1367 1270 -f 1196 1277 1332 -f 1332 1270 1196 -f 1120 1225 1277 -f 1277 1196 1120 -f 1081 1195 1225 -f 1225 1120 1081 -f 1040 1166 1195 -f 1195 1081 1040 -f 1001 1129 1166 -f 1166 1040 1001 -f 975 1109 1129 -f 1129 1001 975 -f 973 1099 1109 -f 1109 975 973 -f 1524 1576 1741 -f 1741 1744 1524 -f 1304 1367 1576 -f 1576 1524 1304 -f 1209 1270 1367 -f 1367 1304 1209 -f 1119 1196 1270 -f 1270 1209 1119 -f 1065 1120 1196 -f 1196 1119 1065 -f 983 1081 1120 -f 1120 1065 983 -f 941 1040 1081 -f 1081 983 941 -f 901 1001 1040 -f 1040 941 901 -f 878 975 1001 -f 1001 901 878 -f 865 973 975 -f 975 878 865 -f 1493 1524 1744 -f 1744 1747 1493 -f 1280 1304 1524 -f 1524 1493 1280 -f 1181 1209 1304 -f 1304 1280 1181 -f 1086 1119 1209 -f 1209 1181 1086 -f 998 1065 1119 -f 1119 1086 998 -f 928 983 1065 -f 1065 998 928 -f 868 941 983 -f 983 928 868 -f 816 901 941 -f 941 868 816 -f 784 878 901 -f 901 816 784 -f 773 865 878 -f 878 784 773 -f 1466 1493 1747 -f 1747 1749 1466 -f 1266 1280 1493 -f 1493 1466 1266 -f 1149 1181 1280 -f 1280 1266 1149 -f 1057 1086 1181 -f 1181 1149 1057 -f 955 998 1086 -f 1086 1057 955 -f 888 928 998 -f 998 955 888 -f 806 868 928 -f 928 888 806 -f 755 816 868 -f 868 806 755 -f 718 784 816 -f 816 755 718 -f 697 773 784 -f 784 718 697 -f 1446 1466 1749 -f 1749 1753 1446 -f 1250 1266 1466 -f 1466 1446 1250 -f 1127 1149 1266 -f 1266 1250 1127 -f 1032 1057 1149 -f 1149 1127 1032 -f 936 955 1057 -f 1057 1032 936 -f 852 888 955 -f 955 936 852 -f 772 806 888 -f 888 852 772 -f 710 755 806 -f 806 772 710 -f 648 718 755 -f 755 710 648 -f 637 697 718 -f 718 648 637 -f 1440 1446 1753 -f 1753 1755 1440 -f 1242 1250 1446 -f 1446 1440 1242 -f 1115 1127 1250 -f 1250 1242 1115 -f 1020 1032 1127 -f 1127 1115 1020 -f 922 936 1032 -f 1032 1020 922 -f 830 852 936 -f 936 922 830 -f 750 772 852 -f 852 830 750 -f 672 710 772 -f 772 750 672 -f 631 648 710 -f 710 672 631 -f 613 637 648 -f 648 631 613 -f 1434 1440 1755 -f 1755 1757 1434 -f 1240 1242 1440 -f 1440 1434 1240 -f 1110 1115 1242 -f 1242 1240 1110 -f 1017 1020 1115 -f 1115 1110 1017 -f 915 922 1020 -f 1020 1017 915 -f 823 830 922 -f 922 915 823 -f 743 750 830 -f 830 823 743 -f 655 672 750 -f 750 743 655 -f 622 631 672 -f 672 655 622 -f 602 613 631 -f 631 622 602 -f 1428 1434 1757 -f 1757 1760 1428 -f 1232 1240 1434 -f 1434 1428 1232 -f 1105 1110 1240 -f 1240 1232 1105 -f 1010 1017 1110 -f 1110 1105 1010 -f 913 915 1017 -f 1017 1010 913 -f 821 823 915 -f 915 913 821 -f 736 743 823 -f 823 821 736 -f 652 655 743 -f 743 736 652 -f 619 622 655 -f 655 652 619 -f 601 602 622 -f 622 619 601 -f 1735 1289 1294 -f 1735 1294 1302 -f 1735 1302 1318 -f 1735 1318 1349 -f 1735 1349 1392 -f 1735 1392 1456 -f 1735 1456 1534 -f 1735 1534 1609 -f 1735 1609 1661 -f 1735 1661 1889 -f 1108 1294 1289 -f 1289 1099 1108 -f 1128 1302 1294 -f 1294 1108 1128 -f 1167 1318 1302 -f 1302 1128 1167 -f 1194 1349 1318 -f 1318 1167 1194 -f 1224 1392 1349 -f 1349 1194 1224 -f 1276 1456 1392 -f 1392 1224 1276 -f 1331 1534 1456 -f 1456 1276 1331 -f 1475 1609 1534 -f 1534 1331 1475 -f 1619 1661 1609 -f 1609 1475 1619 -f 1738 1889 1661 -f 1661 1619 1738 -f 976 1108 1099 -f 1099 974 976 -f 1002 1128 1108 -f 1108 976 1002 -f 1039 1167 1128 -f 1128 1002 1039 -f 1082 1194 1167 -f 1167 1039 1082 -f 1121 1224 1194 -f 1194 1082 1121 -f 1197 1276 1224 -f 1224 1121 1197 -f 1271 1331 1276 -f 1276 1197 1271 -f 1368 1475 1331 -f 1331 1271 1368 -f 1577 1619 1475 -f 1475 1368 1577 -f 1903 1738 1619 -f 1619 1577 1903 -f 877 976 974 -f 974 866 877 -f 902 1002 976 -f 976 877 902 -f 942 1039 1002 -f 1002 902 942 -f 984 1082 1039 -f 1039 942 984 -f 1066 1121 1082 -f 1082 984 1066 -f 1118 1197 1121 -f 1121 1066 1118 -f 1208 1271 1197 -f 1197 1118 1208 -f 1305 1368 1271 -f 1271 1208 1305 -f 1525 1577 1368 -f 1368 1305 1525 -f 1742 1903 1577 -f 1577 1525 1742 -f 783 877 866 -f 866 774 783 -f 815 902 877 -f 877 783 815 -f 867 942 902 -f 902 815 867 -f 927 984 942 -f 942 867 927 -f 997 1066 984 -f 984 927 997 -f 1085 1118 1066 -f 1066 997 1085 -f 1180 1208 1118 -f 1118 1085 1180 -f 1281 1305 1208 -f 1208 1180 1281 -f 1492 1525 1305 -f 1305 1281 1492 -f 1703 1742 1525 -f 1525 1492 1703 -f 717 783 774 -f 774 698 717 -f 756 815 783 -f 783 717 756 -f 805 867 815 -f 815 756 805 -f 887 927 867 -f 867 805 887 -f 956 997 927 -f 927 887 956 -f 1058 1085 997 -f 997 956 1058 -f 1148 1180 1085 -f 1085 1058 1148 -f 1267 1281 1180 -f 1180 1148 1267 -f 1467 1492 1281 -f 1281 1267 1467 -f 1905 1703 1492 -f 1492 1467 1905 -f 647 717 698 -f 698 636 647 -f 709 756 717 -f 717 647 709 -f 771 805 756 -f 756 709 771 -f 851 887 805 -f 805 771 851 -f 935 956 887 -f 887 851 935 -f 1031 1058 956 -f 956 935 1031 -f 1126 1148 1058 -f 1058 1031 1126 -f 1251 1267 1148 -f 1148 1126 1251 -f 1447 1467 1267 -f 1267 1251 1447 -f 1751 1905 1467 -f 1467 1447 1751 -f 630 647 636 -f 636 612 630 -f 671 709 647 -f 647 630 671 -f 749 771 709 -f 709 671 749 -f 829 851 771 -f 771 749 829 -f 921 935 851 -f 851 829 921 -f 1019 1031 935 -f 935 921 1019 -f 1114 1126 1031 -f 1031 1019 1114 -f 1243 1251 1126 -f 1126 1114 1243 -f 1441 1447 1251 -f 1251 1243 1441 -f 1896 1751 1447 -f 1447 1441 1896 -f 623 630 612 -f 612 603 623 -f 656 671 630 -f 630 623 656 -f 744 749 671 -f 671 656 744 -f 824 829 749 -f 749 744 824 -f 916 921 829 -f 829 824 916 -f 1018 1019 921 -f 921 916 1018 -f 1111 1114 1019 -f 1019 1018 1111 -f 1241 1243 1114 -f 1114 1111 1241 -f 1435 1441 1243 -f 1243 1241 1435 -f 1923 1896 1441 -f 1441 1435 1923 -f 617 623 603 -f 603 601 617 -f 650 656 623 -f 623 617 650 -f 734 744 656 -f 656 650 734 -f 818 824 744 -f 744 734 818 -f 912 916 824 -f 824 818 912 -f 1009 1018 916 -f 916 912 1009 -f 1102 1111 1018 -f 1018 1009 1102 -f 1235 1241 1111 -f 1111 1102 1235 -f 1431 1435 1241 -f 1241 1235 1431 -f 1759 1923 1435 -f 1435 1431 1759 -f 1735 1736 1963 -f 1735 1963 2015 -f 1735 2015 2088 -f 1735 2088 2166 -f 1735 2166 2230 -f 1735 2230 2273 -f 1735 2273 2304 -f 1735 2304 2320 -f 1735 2320 2328 -f 1735 2328 2335 -f 2005 1963 1736 -f 1736 1738 2005 -f 2149 2015 1963 -f 1963 2005 2149 -f 2291 2088 2015 -f 2015 2149 2291 -f 2346 2166 2088 -f 2088 2291 2346 -f 2398 2230 2166 -f 2166 2346 2398 -f 2428 2273 2230 -f 2230 2398 2428 -f 2457 2304 2273 -f 2273 2428 2457 -f 2494 2320 2304 -f 2304 2457 2494 -f 2514 2328 2320 -f 2320 2494 2514 -f 2524 2335 2328 -f 2328 2514 2524 -f 2047 2005 1738 -f 1738 1740 2047 -f 2256 2149 2005 -f 2005 2047 2256 -f 2353 2291 2149 -f 2149 2256 2353 -f 2427 2346 2291 -f 2291 2353 2427 -f 2503 2398 2346 -f 2346 2427 2503 -f 2542 2428 2398 -f 2398 2503 2542 -f 2583 2457 2428 -f 2428 2542 2583 -f 2622 2494 2457 -f 2457 2583 2622 -f 2648 2514 2494 -f 2494 2622 2648 -f 2650 2524 2514 -f 2514 2648 2650 -f 2099 2047 1740 -f 1740 1743 2099 -f 2319 2256 2047 -f 2047 2099 2319 -f 2414 2353 2256 -f 2256 2319 2414 -f 2504 2427 2353 -f 2353 2414 2504 -f 2558 2503 2427 -f 2427 2504 2558 -f 2640 2542 2503 -f 2503 2558 2640 -f 2682 2583 2542 -f 2542 2640 2682 -f 2722 2622 2583 -f 2583 2682 2722 -f 2745 2648 2622 -f 2622 2722 2745 -f 2758 2650 2648 -f 2648 2745 2758 -f 2130 2099 1743 -f 1743 1746 2130 -f 2343 2319 2099 -f 2099 2130 2343 -f 2442 2414 2319 -f 2319 2343 2442 -f 2537 2504 2414 -f 2414 2442 2537 -f 2625 2558 2504 -f 2504 2537 2625 -f 2695 2640 2558 -f 2558 2625 2695 -f 2755 2682 2640 -f 2640 2695 2755 -f 2807 2722 2682 -f 2682 2755 2807 -f 2839 2745 2722 -f 2722 2807 2839 -f 2850 2758 2745 -f 2745 2839 2850 -f 2157 2130 1746 -f 1746 1748 2157 -f 2357 2343 2130 -f 2130 2157 2357 -f 2474 2442 2343 -f 2343 2357 2474 -f 2566 2537 2442 -f 2442 2474 2566 -f 2668 2625 2537 -f 2537 2566 2668 -f 2735 2695 2625 -f 2625 2668 2735 -f 2817 2755 2695 -f 2695 2735 2817 -f 2868 2807 2755 -f 2755 2817 2868 -f 2905 2839 2807 -f 2807 2868 2905 -f 2926 2850 2839 -f 2839 2905 2926 -f 2177 2157 1748 -f 1748 1750 2177 -f 2373 2357 2157 -f 2157 2177 2373 -f 2496 2474 2357 -f 2357 2373 2496 -f 2591 2566 2474 -f 2474 2496 2591 -f 2687 2668 2566 -f 2566 2591 2687 -f 2771 2735 2668 -f 2668 2687 2771 -f 2851 2817 2735 -f 2735 2771 2851 -f 2913 2868 2817 -f 2817 2851 2913 -f 2975 2905 2868 -f 2868 2913 2975 -f 2986 2926 2905 -f 2905 2975 2986 -f 2183 2177 1750 -f 1750 1754 2183 -f 2381 2373 2177 -f 2177 2183 2381 -f 2508 2496 2373 -f 2373 2381 2508 -f 2603 2591 2496 -f 2496 2508 2603 -f 2701 2687 2591 -f 2591 2603 2701 -f 2793 2771 2687 -f 2687 2701 2793 -f 2873 2851 2771 -f 2771 2793 2873 -f 2951 2913 2851 -f 2851 2873 2951 -f 2992 2975 2913 -f 2913 2951 2992 -f 3010 2986 2975 -f 2975 2992 3010 -f 2189 2183 1754 -f 1754 1756 2189 -f 2383 2381 2183 -f 2183 2189 2383 -f 2513 2508 2381 -f 2381 2383 2513 -f 2606 2603 2508 -f 2508 2513 2606 -f 2708 2701 2603 -f 2603 2606 2708 -f 2800 2793 2701 -f 2701 2708 2800 -f 2880 2873 2793 -f 2793 2800 2880 -f 2968 2951 2873 -f 2873 2880 2968 -f 3001 2992 2951 -f 2951 2968 3001 -f 3021 3010 2992 -f 2992 3001 3021 -f 2195 2189 1756 -f 1756 1759 2195 -f 2390 2383 2189 -f 2189 2195 2390 -f 2517 2513 2383 -f 2383 2390 2517 -f 2612 2606 2513 -f 2513 2517 2612 -f 2709 2708 2606 -f 2606 2612 2709 -f 2801 2800 2708 -f 2708 2709 2801 -f 2886 2880 2800 -f 2800 2801 2886 -f 2970 2968 2880 -f 2880 2886 2970 -f 3004 3001 2968 -f 2968 2970 3004 -f 3022 3021 3001 -f 3001 3004 3022 +vt 2.000000 2.000000 0.000000 +vt 2.000000 1.975000 0.000000 +vt 2.000000 1.950000 0.000000 +vt 2.000000 1.925000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 1.750000 2.000000 0.000000 +vt 1.750000 1.975000 0.000000 +vt 1.750000 1.950000 0.000000 +vt 1.750000 1.925000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.500000 2.000000 0.000000 +vt 1.500000 1.975000 0.000000 +vt 1.500000 1.950000 0.000000 +vt 1.500000 1.925000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.250000 2.000000 0.000000 +vt 1.250000 1.975000 0.000000 +vt 1.250000 1.950000 0.000000 +vt 1.250000 1.925000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 0.750000 2.000000 0.000000 +vt 0.750000 1.975000 0.000000 +vt 0.750000 1.950000 0.000000 +vt 0.750000 1.925000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.500000 2.000000 0.000000 +vt 0.500000 1.975000 0.000000 +vt 0.500000 1.950000 0.000000 +vt 0.500000 1.925000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.250000 2.000000 0.000000 +vt 0.250000 1.975000 0.000000 +vt 0.250000 1.950000 0.000000 +vt 0.250000 1.925000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.000000 2.000000 0.000000 +vt 0.000000 1.975000 0.000000 +vt 0.000000 1.950000 0.000000 +vt 0.000000 1.925000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 2.000000 2.000000 0.000000 +vt 2.000000 1.975000 0.000000 +vt 2.000000 1.950000 0.000000 +vt 2.000000 1.925000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 1.750000 2.000000 0.000000 +vt 1.750000 1.975000 0.000000 +vt 1.750000 1.950000 0.000000 +vt 1.750000 1.925000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.500000 2.000000 0.000000 +vt 1.500000 1.975000 0.000000 +vt 1.500000 1.950000 0.000000 +vt 1.500000 1.925000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.250000 2.000000 0.000000 +vt 1.250000 1.975000 0.000000 +vt 1.250000 1.950000 0.000000 +vt 1.250000 1.925000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 0.750000 2.000000 0.000000 +vt 0.750000 1.975000 0.000000 +vt 0.750000 1.950000 0.000000 +vt 0.750000 1.925000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.500000 2.000000 0.000000 +vt 0.500000 1.975000 0.000000 +vt 0.500000 1.950000 0.000000 +vt 0.500000 1.925000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.250000 2.000000 0.000000 +vt 0.250000 1.975000 0.000000 +vt 0.250000 1.950000 0.000000 +vt 0.250000 1.925000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.000000 2.000000 0.000000 +vt 0.000000 1.975000 0.000000 +vt 0.000000 1.950000 0.000000 +vt 0.000000 1.925000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 2.000000 1.675000 0.000000 +vt 2.000000 1.450000 0.000000 +vt 2.000000 1.225000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.750000 1.675000 0.000000 +vt 1.750000 1.450000 0.000000 +vt 1.750000 1.225000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.500000 1.675000 0.000000 +vt 1.500000 1.450000 0.000000 +vt 1.500000 1.225000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.250000 1.675000 0.000000 +vt 1.250000 1.450000 0.000000 +vt 1.250000 1.225000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.750000 1.675000 0.000000 +vt 0.750000 1.450000 0.000000 +vt 0.750000 1.225000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.500000 1.675000 0.000000 +vt 0.500000 1.450000 0.000000 +vt 0.500000 1.225000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.250000 1.675000 0.000000 +vt 0.250000 1.450000 0.000000 +vt 0.250000 1.225000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 0.000000 1.675000 0.000000 +vt 0.000000 1.450000 0.000000 +vt 0.000000 1.225000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 2.000000 1.675000 0.000000 +vt 2.000000 1.450000 0.000000 +vt 2.000000 1.225000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.750000 1.675000 0.000000 +vt 1.750000 1.450000 0.000000 +vt 1.750000 1.225000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.500000 1.675000 0.000000 +vt 1.500000 1.450000 0.000000 +vt 1.500000 1.225000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.250000 1.675000 0.000000 +vt 1.250000 1.450000 0.000000 +vt 1.250000 1.225000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.750000 1.675000 0.000000 +vt 0.750000 1.450000 0.000000 +vt 0.750000 1.225000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.500000 1.675000 0.000000 +vt 0.500000 1.450000 0.000000 +vt 0.500000 1.225000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.250000 1.675000 0.000000 +vt 0.250000 1.450000 0.000000 +vt 0.250000 1.225000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 0.000000 1.675000 0.000000 +vt 0.000000 1.450000 0.000000 +vt 0.000000 1.225000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 2.000000 0.850000 0.000000 +vt 2.000000 0.700000 0.000000 +vt 2.000000 0.550000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.750000 0.850000 0.000000 +vt 1.750000 0.700000 0.000000 +vt 1.750000 0.550000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.500000 0.850000 0.000000 +vt 1.500000 0.700000 0.000000 +vt 1.500000 0.550000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.250000 0.850000 0.000000 +vt 1.250000 0.700000 0.000000 +vt 1.250000 0.550000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.850000 0.000000 +vt 0.750000 0.700000 0.000000 +vt 0.750000 0.550000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.850000 0.000000 +vt 0.500000 0.700000 0.000000 +vt 0.500000 0.550000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.850000 0.000000 +vt 0.250000 0.700000 0.000000 +vt 0.250000 0.550000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.850000 0.000000 +vt 0.000000 0.700000 0.000000 +vt 0.000000 0.550000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 2.000000 0.850000 0.000000 +vt 2.000000 0.700000 0.000000 +vt 2.000000 0.550000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.750000 0.850000 0.000000 +vt 1.750000 0.700000 0.000000 +vt 1.750000 0.550000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.500000 0.850000 0.000000 +vt 1.500000 0.700000 0.000000 +vt 1.500000 0.550000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.250000 0.850000 0.000000 +vt 1.250000 0.700000 0.000000 +vt 1.250000 0.550000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.850000 0.000000 +vt 0.750000 0.700000 0.000000 +vt 0.750000 0.550000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.850000 0.000000 +vt 0.500000 0.700000 0.000000 +vt 0.500000 0.550000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.850000 0.000000 +vt 0.250000 0.700000 0.000000 +vt 0.250000 0.550000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.850000 0.000000 +vt 0.000000 0.700000 0.000000 +vt 0.000000 0.550000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 2.000000 0.300000 0.000000 +vt 2.000000 0.200000 0.000000 +vt 2.000000 0.100000 0.000000 +vt 2.000000 0.000000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.750000 0.300000 0.000000 +vt 1.750000 0.200000 0.000000 +vt 1.750000 0.100000 0.000000 +vt 1.750000 0.000000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.500000 0.300000 0.000000 +vt 1.500000 0.200000 0.000000 +vt 1.500000 0.100000 0.000000 +vt 1.500000 0.000000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.250000 0.300000 0.000000 +vt 1.250000 0.200000 0.000000 +vt 1.250000 0.100000 0.000000 +vt 1.250000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.750000 0.300000 0.000000 +vt 0.750000 0.200000 0.000000 +vt 0.750000 0.100000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.500000 0.300000 0.000000 +vt 0.500000 0.200000 0.000000 +vt 0.500000 0.100000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.250000 0.300000 0.000000 +vt 0.250000 0.200000 0.000000 +vt 0.250000 0.100000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 0.000000 0.300000 0.000000 +vt 0.000000 0.200000 0.000000 +vt 0.000000 0.100000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 2.000000 0.300000 0.000000 +vt 2.000000 0.200000 0.000000 +vt 2.000000 0.100000 0.000000 +vt 2.000000 0.000000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.750000 0.300000 0.000000 +vt 1.750000 0.200000 0.000000 +vt 1.750000 0.100000 0.000000 +vt 1.750000 0.000000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.500000 0.300000 0.000000 +vt 1.500000 0.200000 0.000000 +vt 1.500000 0.100000 0.000000 +vt 1.500000 0.000000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.250000 0.300000 0.000000 +vt 1.250000 0.200000 0.000000 +vt 1.250000 0.100000 0.000000 +vt 1.250000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.750000 0.300000 0.000000 +vt 0.750000 0.200000 0.000000 +vt 0.750000 0.100000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.500000 0.300000 0.000000 +vt 0.500000 0.200000 0.000000 +vt 0.500000 0.100000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.250000 0.300000 0.000000 +vt 0.250000 0.200000 0.000000 +vt 0.250000 0.100000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 0.000000 0.300000 0.000000 +vt 0.000000 0.200000 0.000000 +vt 0.000000 0.100000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.875000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.625000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.875000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.625000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.875000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.625000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.875000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.625000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.875000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.625000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.875000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.625000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.875000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.625000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.875000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.625000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.875000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.625000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.875000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.625000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.375000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.125000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.375000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.125000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.375000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.125000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.375000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.125000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.375000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.125000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.375000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.125000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.375000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.125000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.375000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.125000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.375000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.125000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.375000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.125000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 0.225000 0.000000 +vt 0.500000 0.450000 0.000000 +vt 0.500000 0.675000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.625000 0.225000 0.000000 +vt 0.625000 0.450000 0.000000 +vt 0.625000 0.675000 0.000000 +vt 0.625000 0.900000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.750000 0.225000 0.000000 +vt 0.750000 0.450000 0.000000 +vt 0.750000 0.675000 0.000000 +vt 0.750000 0.900000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.875000 0.225000 0.000000 +vt 0.875000 0.450000 0.000000 +vt 0.875000 0.675000 0.000000 +vt 0.875000 0.900000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 0.225000 0.000000 +vt 1.000000 0.450000 0.000000 +vt 1.000000 0.675000 0.000000 +vt 1.000000 0.900000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 0.000000 0.225000 0.000000 +vt 0.000000 0.450000 0.000000 +vt 0.000000 0.675000 0.000000 +vt 0.000000 0.900000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.125000 0.225000 0.000000 +vt 0.125000 0.450000 0.000000 +vt 0.125000 0.675000 0.000000 +vt 0.125000 0.900000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.250000 0.225000 0.000000 +vt 0.250000 0.450000 0.000000 +vt 0.250000 0.675000 0.000000 +vt 0.250000 0.900000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.375000 0.225000 0.000000 +vt 0.375000 0.450000 0.000000 +vt 0.375000 0.675000 0.000000 +vt 0.375000 0.900000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 0.225000 0.000000 +vt 0.500000 0.450000 0.000000 +vt 0.500000 0.675000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.500000 0.925000 0.000000 +vt 0.500000 0.950000 0.000000 +vt 0.500000 0.975000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.625000 0.900000 0.000000 +vt 0.625000 0.925000 0.000000 +vt 0.625000 0.950000 0.000000 +vt 0.625000 0.975000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.750000 0.900000 0.000000 +vt 0.750000 0.925000 0.000000 +vt 0.750000 0.950000 0.000000 +vt 0.750000 0.975000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.875000 0.900000 0.000000 +vt 0.875000 0.925000 0.000000 +vt 0.875000 0.950000 0.000000 +vt 0.875000 0.975000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 1.000000 0.900000 0.000000 +vt 1.000000 0.925000 0.000000 +vt 1.000000 0.950000 0.000000 +vt 1.000000 0.975000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.000000 0.900000 0.000000 +vt 0.000000 0.925000 0.000000 +vt 0.000000 0.950000 0.000000 +vt 0.000000 0.975000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.125000 0.900000 0.000000 +vt 0.125000 0.925000 0.000000 +vt 0.125000 0.950000 0.000000 +vt 0.125000 0.975000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.250000 0.900000 0.000000 +vt 0.250000 0.925000 0.000000 +vt 0.250000 0.950000 0.000000 +vt 0.250000 0.975000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.375000 0.900000 0.000000 +vt 0.375000 0.925000 0.000000 +vt 0.375000 0.950000 0.000000 +vt 0.375000 0.975000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.500000 0.925000 0.000000 +vt 0.500000 0.950000 0.000000 +vt 0.500000 0.975000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +# 800 texture vertices + +vn -0.966742 -0.255752 0.000000 +vn -0.966824 0.255443 0.000000 +vn -0.092052 0.995754 0.000000 +vn 0.682050 0.731305 0.000000 +vn 0.870301 0.492521 0.000000 +vn -0.893014 -0.256345 -0.369882 +vn -0.893437 0.255996 -0.369102 +vn -0.083877 0.995843 -0.035507 +vn 0.629724 0.731860 0.260439 +vn 0.803725 0.493370 0.332584 +vn -0.683407 -0.256728 -0.683407 +vn -0.683531 0.256068 -0.683531 +vn -0.064925 0.995776 -0.064925 +vn 0.481399 0.732469 0.481399 +vn 0.614804 0.493997 0.614804 +vn -0.369882 -0.256345 -0.893014 +vn -0.369102 0.255996 -0.893437 +vn -0.035507 0.995843 -0.083877 +vn 0.260439 0.731860 0.629724 +vn 0.332584 0.493369 0.803725 +vn -0.002848 -0.257863 -0.966177 +vn -0.001923 0.254736 -0.967009 +vn -0.000266 0.995734 -0.092270 +vn 0.000024 0.731295 0.682061 +vn -0.000000 0.492521 0.870301 +vn 0.379058 -0.359300 -0.852771 +vn 0.377110 0.149085 -0.914091 +vn 0.027502 0.992081 -0.122552 +vn -0.261010 0.726762 0.635367 +vn -0.332485 0.492546 0.804271 +vn 0.663548 -0.410790 -0.625264 +vn 0.712664 0.073722 -0.697621 +vn 0.099726 0.987509 -0.121983 +vn -0.487320 0.723754 0.488569 +vn -0.615242 0.492602 0.615484 +vn 0.880028 -0.332906 -0.338709 +vn 0.917276 0.167113 -0.361493 +vn 0.113584 0.992365 -0.048070 +vn -0.634150 0.727508 0.261889 +vn -0.804126 0.492634 0.332705 +vn 0.966690 -0.255738 0.010454 +vn 0.967442 0.252962 0.008103 +vn 0.093436 0.995624 0.001281 +vn -0.682167 0.731196 -0.000343 +vn -0.870322 0.492483 -0.000054 +vn 0.893014 -0.256345 0.369882 +vn 0.893437 0.255996 0.369102 +vn 0.083877 0.995843 0.035507 +vn -0.629724 0.731860 -0.260439 +vn -0.803725 0.493370 -0.332584 +vn 0.683407 -0.256728 0.683407 +vn 0.683531 0.256068 0.683531 +vn 0.064925 0.995776 0.064925 +vn -0.481399 0.732469 -0.481399 +vn -0.614804 0.493997 -0.614804 +vn 0.369882 -0.256345 0.893014 +vn 0.369102 0.255996 0.893437 +vn 0.035507 0.995843 0.083877 +vn -0.260439 0.731860 -0.629724 +vn -0.332584 0.493369 -0.803725 +vn 0.000000 -0.255752 0.966742 +vn 0.000000 0.255443 0.966824 +vn 0.000000 0.995754 0.092052 +vn 0.000000 0.731305 -0.682050 +vn 0.000000 0.492521 -0.870301 +vn -0.369882 -0.256345 0.893014 +vn -0.369102 0.255996 0.893437 +vn -0.035507 0.995843 0.083877 +vn 0.260439 0.731860 -0.629724 +vn 0.332584 0.493370 -0.803725 +vn -0.683407 -0.256728 0.683407 +vn -0.683531 0.256068 0.683531 +vn -0.064925 0.995776 0.064925 +vn 0.481399 0.732469 -0.481399 +vn 0.614804 0.493997 -0.614804 +vn -0.893014 -0.256345 0.369882 +vn -0.893437 0.255996 0.369102 +vn -0.083877 0.995843 0.035507 +vn 0.629724 0.731860 -0.260439 +vn 0.803725 0.493369 -0.332584 +vn 0.915321 0.402725 -0.000000 +vn 0.941808 0.336151 0.000000 +vn 0.978690 0.205342 0.000000 +vn 0.997804 -0.066240 -0.000000 +vn 0.845438 0.403546 0.349835 +vn 0.869996 0.336859 0.360047 +vn 0.904193 0.205791 0.374280 +vn 0.921879 -0.066370 0.381752 +vn 0.646802 0.404096 0.646802 +vn 0.665655 0.337351 0.665655 +vn 0.691923 0.206120 0.691923 +vn 0.705543 -0.066480 0.705542 +vn 0.349835 0.403546 0.845438 +vn 0.360047 0.336859 0.869996 +vn 0.374280 0.205791 0.904193 +vn 0.381752 -0.066369 0.921879 +vn 0.000000 0.402725 0.915321 +vn -0.000000 0.336151 0.941808 +vn 0.000000 0.205342 0.978690 +vn 0.000000 -0.066240 0.997804 +vn -0.349835 0.403546 0.845438 +vn -0.360047 0.336859 0.869996 +vn -0.374280 0.205791 0.904193 +vn -0.381752 -0.066370 0.921879 +vn -0.646802 0.404096 0.646802 +vn -0.665655 0.337351 0.665655 +vn -0.691923 0.206120 0.691923 +vn -0.705542 -0.066480 0.705543 +vn -0.845438 0.403546 0.349835 +vn -0.869996 0.336859 0.360047 +vn -0.904193 0.205791 0.374280 +vn -0.921879 -0.066369 0.381752 +vn -0.915321 0.402725 0.000000 +vn -0.941808 0.336151 -0.000000 +vn -0.978690 0.205342 0.000000 +vn -0.997804 -0.066240 0.000000 +vn -0.845438 0.403546 -0.349835 +vn -0.869996 0.336859 -0.360047 +vn -0.904193 0.205791 -0.374280 +vn -0.921879 -0.066370 -0.381752 +vn -0.646802 0.404096 -0.646802 +vn -0.665655 0.337351 -0.665655 +vn -0.691923 0.206120 -0.691923 +vn -0.705543 -0.066480 -0.705542 +vn -0.349835 0.403546 -0.845438 +vn -0.360047 0.336859 -0.869996 +vn -0.374280 0.205791 -0.904193 +vn -0.381752 -0.066369 -0.921879 +vn -0.000000 0.402725 -0.915321 +vn 0.000000 0.336151 -0.941808 +vn -0.000000 0.205342 -0.978690 +vn -0.000000 -0.066240 -0.997804 +vn 0.349835 0.403546 -0.845438 +vn 0.360047 0.336859 -0.869996 +vn 0.374280 0.205791 -0.904193 +vn 0.381752 -0.066370 -0.921879 +vn 0.646802 0.404096 -0.646802 +vn 0.665655 0.337351 -0.665655 +vn 0.691923 0.206120 -0.691923 +vn 0.705542 -0.066480 -0.705543 +vn 0.845438 0.403546 -0.349835 +vn 0.869996 0.336859 -0.360047 +vn 0.904193 0.205791 -0.374280 +vn 0.921879 -0.066369 -0.381752 +vn 0.900182 -0.435513 0.000000 +vn 0.729611 -0.683863 0.000000 +vn 0.693951 -0.720022 -0.000000 +vn 0.793950 -0.607983 0.000000 +vn 0.831437 -0.436180 0.344179 +vn 0.673512 -0.684666 0.278594 +vn 0.640399 -0.720924 0.264874 +vn 0.732949 -0.608995 0.303167 +vn 0.636092 -0.436778 0.636092 +vn 0.514965 -0.685290 0.514965 +vn 0.489651 -0.721446 0.489651 +vn 0.560555 -0.609554 0.560555 +vn 0.344179 -0.436180 0.831437 +vn 0.278595 -0.684666 0.673512 +vn 0.264874 -0.720924 0.640399 +vn 0.303167 -0.608995 0.732949 +vn -0.000000 -0.435513 0.900182 +vn -0.000000 -0.683863 0.729611 +vn 0.000000 -0.720022 0.693951 +vn -0.000000 -0.607983 0.793950 +vn -0.344179 -0.436180 0.831437 +vn -0.278594 -0.684666 0.673512 +vn -0.264874 -0.720924 0.640399 +vn -0.303167 -0.608995 0.732949 +vn -0.636092 -0.436778 0.636092 +vn -0.514965 -0.685290 0.514965 +vn -0.489651 -0.721446 0.489651 +vn -0.560555 -0.609554 0.560555 +vn -0.831437 -0.436180 0.344179 +vn -0.673512 -0.684666 0.278595 +vn -0.640399 -0.720924 0.264874 +vn -0.732949 -0.608995 0.303167 +vn -0.900182 -0.435513 -0.000000 +vn -0.729611 -0.683863 -0.000000 +vn -0.693951 -0.720022 0.000000 +vn -0.793950 -0.607983 -0.000000 +vn -0.831437 -0.436180 -0.344179 +vn -0.673512 -0.684666 -0.278594 +vn -0.640399 -0.720924 -0.264874 +vn -0.732949 -0.608995 -0.303167 +vn -0.636092 -0.436778 -0.636092 +vn -0.514965 -0.685290 -0.514965 +vn -0.489651 -0.721446 -0.489651 +vn -0.560555 -0.609554 -0.560555 +vn -0.344179 -0.436180 -0.831437 +vn -0.278595 -0.684666 -0.673512 +vn -0.264874 -0.720924 -0.640399 +vn -0.303167 -0.608995 -0.732949 +vn 0.000000 -0.435513 -0.900182 +vn 0.000000 -0.683863 -0.729611 +vn -0.000000 -0.720022 -0.693951 +vn 0.000000 -0.607983 -0.793950 +vn 0.344179 -0.436180 -0.831437 +vn 0.278594 -0.684666 -0.673512 +vn 0.264874 -0.720924 -0.640399 +vn 0.303167 -0.608995 -0.732949 +vn 0.636092 -0.436778 -0.636092 +vn 0.514965 -0.685290 -0.514965 +vn 0.489651 -0.721446 -0.489651 +vn 0.560555 -0.609554 -0.560555 +vn 0.831437 -0.436180 -0.344179 +vn 0.673512 -0.684666 -0.278595 +vn 0.640399 -0.720924 -0.264874 +vn 0.732949 -0.608995 -0.303167 +vn 0.623860 -0.781536 0.000000 +vn 0.177291 -0.984159 -0.000000 +vn 0.049207 -0.998789 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.576230 -0.781801 0.238217 +vn 0.163628 -0.984208 0.067527 +vn 0.045422 -0.998792 0.018736 +vn 0.440416 -0.782348 0.440416 +vn 0.124903 -0.984276 0.124903 +vn 0.034662 -0.998798 0.034662 +vn 0.238217 -0.781801 0.576230 +vn 0.067527 -0.984208 0.163628 +vn 0.018736 -0.998792 0.045422 +vn -0.000000 -0.781536 0.623860 +vn 0.000000 -0.984159 0.177291 +vn -0.000000 -0.998789 0.049207 +vn -0.238217 -0.781801 0.576230 +vn -0.067527 -0.984208 0.163628 +vn -0.018736 -0.998792 0.045422 +vn -0.440416 -0.782348 0.440416 +vn -0.124903 -0.984276 0.124903 +vn -0.034662 -0.998798 0.034662 +vn -0.576230 -0.781801 0.238217 +vn -0.163628 -0.984208 0.067527 +vn -0.045422 -0.998792 0.018736 +vn -0.623860 -0.781536 -0.000000 +vn -0.177291 -0.984159 0.000000 +vn -0.049207 -0.998789 -0.000000 +vn -0.576230 -0.781801 -0.238217 +vn -0.163628 -0.984208 -0.067527 +vn -0.045422 -0.998792 -0.018736 +vn -0.440416 -0.782348 -0.440416 +vn -0.124903 -0.984276 -0.124903 +vn -0.034662 -0.998798 -0.034662 +vn -0.238217 -0.781801 -0.576230 +vn -0.067527 -0.984208 -0.163628 +vn -0.018736 -0.998792 -0.045422 +vn 0.000000 -0.781536 -0.623860 +vn -0.000000 -0.984159 -0.177291 +vn 0.000000 -0.998789 -0.049207 +vn 0.238217 -0.781801 -0.576230 +vn 0.067527 -0.984208 -0.163628 +vn 0.018736 -0.998792 -0.045422 +vn 0.440416 -0.782348 -0.440416 +vn 0.124903 -0.984276 -0.124903 +vn 0.034662 -0.998798 -0.034662 +vn 0.576230 -0.781801 -0.238217 +vn 0.163628 -0.984208 -0.067527 +vn 0.045422 -0.998792 -0.018736 +vn 0.007786 -0.999970 -0.000216 +vn 0.039138 -0.999233 -0.000989 +vn 0.179512 -0.983746 -0.004369 +vn 0.612299 -0.790557 -0.010460 +vn 0.986152 -0.165708 -0.006670 +vn 0.007039 -0.812495 0.582926 +vn 0.036127 -0.837257 0.545614 +vn 0.161846 -0.810421 0.563048 +vn 0.482365 -0.595148 0.642746 +vn 0.738720 -0.114594 0.664199 +vn -0.001909 0.162121 0.986769 +vn 0.002762 0.017107 0.999850 +vn 0.010533 0.073398 0.997247 +vn -0.066041 0.130070 0.989303 +vn -0.094427 0.016594 0.995393 +vn -0.009203 0.871509 0.490293 +vn -0.048606 0.840609 0.539457 +vn -0.223298 0.802880 0.552739 +vn -0.596365 0.559971 0.575135 +vn -0.803337 0.068236 0.591603 +vn -0.010561 0.999944 0.000103 +vn -0.058798 0.998270 0.000710 +vn -0.280710 0.959787 0.003269 +vn -0.749723 0.661738 0.004268 +vn -0.997351 0.072714 0.002059 +vn -0.008792 0.871493 -0.490330 +vn -0.046494 0.841178 -0.538756 +vn -0.217909 0.806807 -0.549161 +vn -0.597291 0.560026 -0.574121 +vn -0.804000 0.062913 -0.591292 +vn -0.001806 0.161691 -0.986840 +vn 0.002031 0.014555 -0.999892 +vn 0.009215 0.060069 -0.998152 +vn -0.059334 0.113865 -0.991723 +vn -0.086899 0.012290 -0.996141 +vn 0.006418 -0.812379 -0.583095 +vn 0.033783 -0.837512 -0.545373 +vn 0.157113 -0.811947 -0.562190 +vn 0.484406 -0.589366 -0.646528 +vn 0.738870 -0.101320 -0.666187 +vn 0.946512 0.322650 -0.003357 +vn 0.825830 0.563870 -0.007452 +vn 0.650011 0.759893 -0.006937 +vn 0.532429 0.846459 -0.005245 +vn 0.725608 0.259351 0.637361 +vn 0.645945 0.461988 0.607719 +vn 0.531615 0.636660 0.558614 +vn 0.424964 0.681717 0.595540 +vn -0.049562 -0.019755 0.998576 +vn -0.037816 -0.035624 0.998650 +vn -0.037914 -0.036512 0.998614 +vn -0.168854 -0.297945 0.939530 +vn -0.742342 -0.299166 0.599523 +vn -0.619602 -0.529406 0.579502 +vn -0.483708 -0.685760 0.543837 +vn -0.445293 -0.794355 0.413177 +vn -0.926513 -0.376258 0.001996 +vn -0.753920 -0.656952 0.004317 +vn -0.566224 -0.824244 0.003461 +vn -0.481804 -0.876277 0.001850 +vn -0.744675 -0.294425 -0.598977 +vn -0.621949 -0.528114 -0.578165 +vn -0.481171 -0.688340 -0.542828 +vn -0.438055 -0.797035 -0.415744 +vn -0.044337 -0.017056 -0.998871 +vn -0.026176 -0.028166 -0.999260 +vn -0.025294 -0.028332 -0.999278 +vn -0.157482 -0.289392 -0.944167 +vn 0.728244 0.252410 -0.637142 +vn 0.647055 0.459725 -0.608254 +vn 0.522994 0.640657 -0.562170 +vn 0.409978 0.682857 -0.604669 +vn -0.230787 0.972982 -0.006523 +vn -0.548936 0.835863 -0.001511 +vn -0.875671 0.482806 0.009893 +vn -0.877554 0.479097 0.019092 +vn -0.696190 0.717439 0.024497 +vn -0.152877 0.687211 0.710190 +vn -0.316721 0.637750 0.702113 +vn -0.601067 0.471452 0.645330 +vn -0.635889 0.446090 0.629801 +vn -0.435746 0.601008 0.670011 +vn 0.111113 -0.085070 0.990160 +vn 0.223310 0.006540 0.974726 +vn 0.190097 0.154964 0.969458 +vn 0.005271 0.189482 0.981870 +vn -0.011752 0.246688 0.969024 +vn 0.343906 -0.722796 0.599412 +vn 0.572489 -0.567656 0.591627 +vn 0.787436 -0.256459 0.560512 +vn 0.647097 -0.306374 0.698141 +vn 0.427528 -0.499343 0.753576 +vn 0.410926 -0.911668 0.001284 +vn 0.671520 -0.740986 -0.000899 +vn 0.922026 -0.387060 -0.007253 +vn 0.846910 -0.531556 -0.013854 +vn 0.535924 -0.844201 -0.010505 +vn 0.341188 -0.722823 -0.600931 +vn 0.578664 -0.561139 -0.591838 +vn 0.784869 -0.251020 -0.566542 +vn 0.642681 -0.302257 -0.703990 +vn 0.418589 -0.500042 -0.758117 +vn 0.115806 -0.079139 -0.990114 +vn 0.232811 0.012565 -0.972441 +vn 0.206662 0.153601 -0.966280 +vn 0.024500 0.161443 -0.986578 +vn 0.003382 0.211115 -0.977455 +vn -0.134912 0.687491 -0.713551 +vn -0.319540 0.633073 -0.705063 +vn -0.603902 0.461442 -0.649903 +vn -0.631815 0.437169 -0.640072 +vn -0.424306 0.612706 -0.666750 +vn -0.425801 0.904753 0.010805 +vn 0.022046 0.999756 0.001623 +vn 0.999598 0.025875 0.011556 +vn 0.709587 -0.704552 0.009672 +vn -0.259858 0.791937 0.552548 +vn 0.009539 0.999720 -0.021674 +vn 0.410157 0.332912 -0.849082 +vn 0.541523 -0.548619 -0.637001 +vn 0.046311 0.455223 0.889172 +vn -0.010688 0.988794 0.148900 +vn -0.044376 0.682946 -0.729120 +vn 0.122824 0.009233 -0.992385 +vn 0.481839 -0.180440 0.857480 +vn 0.455272 0.736752 0.499925 +vn -0.220542 0.907193 -0.358277 +vn -0.235919 0.657250 -0.715797 +vn 0.728094 -0.685300 -0.015585 +vn 0.888738 0.458112 -0.016679 +vn -0.260098 0.965582 0.000800 +vn -0.371611 0.928378 -0.004418 +vn 0.480165 -0.178362 -0.858853 +vn 0.488102 0.716802 -0.497947 +vn -0.222004 0.905399 0.361892 +vn -0.235405 0.663180 0.710477 +vn 0.058720 0.437702 -0.897200 +vn 0.001326 0.986459 -0.164002 +vn -0.044190 0.681675 0.730319 +vn 0.138801 -0.034188 0.989730 +vn -0.258890 0.797206 -0.545380 +vn 0.012270 0.999739 0.019287 +vn 0.398632 0.354890 0.845663 +vn 0.537564 -0.581398 0.610738 +vn 0.000000 1.000000 0.000000 +vn 0.824540 0.565804 0.000017 +vn 0.917701 -0.397272 0.000034 +vn 0.935269 -0.353939 0.000113 +vn 0.780712 0.624890 0.000075 +vn 0.762640 0.565035 0.314825 +vn 0.847982 -0.397998 0.350034 +vn 0.864141 -0.355261 0.356441 +vn 0.720992 0.625625 0.297933 +vn 0.583357 0.565165 0.583338 +vn 0.648485 -0.398726 0.648448 +vn 0.660872 -0.355894 0.660748 +vn 0.551862 0.625290 0.551780 +vn 0.314824 0.565051 0.762629 +vn 0.350045 -0.397976 0.847988 +vn 0.356474 -0.355199 0.864153 +vn 0.297983 0.625515 0.721067 +vn -0.000017 0.565804 0.824540 +vn -0.000034 -0.397272 0.917701 +vn -0.000113 -0.353939 0.935269 +vn -0.000075 0.624890 0.780712 +vn -0.314825 0.565035 0.762640 +vn -0.350034 -0.397998 0.847982 +vn -0.356441 -0.355261 0.864141 +vn -0.297933 0.625625 0.720992 +vn -0.583338 0.565165 0.583357 +vn -0.648448 -0.398726 0.648485 +vn -0.660748 -0.355894 0.660872 +vn -0.551780 0.625290 0.551862 +vn -0.762629 0.565051 0.314824 +vn -0.847988 -0.397976 0.350045 +vn -0.864153 -0.355199 0.356474 +vn -0.721067 0.625515 0.297983 +vn -0.824540 0.565804 -0.000017 +vn -0.917701 -0.397272 -0.000034 +vn -0.935269 -0.353939 -0.000113 +vn -0.780712 0.624890 -0.000075 +vn -0.762640 0.565035 -0.314825 +vn -0.847982 -0.397998 -0.350034 +vn -0.864141 -0.355261 -0.356441 +vn -0.720992 0.625625 -0.297933 +vn -0.583357 0.565165 -0.583338 +vn -0.648485 -0.398726 -0.648448 +vn -0.660872 -0.355894 -0.660748 +vn -0.551862 0.625290 -0.551780 +vn -0.314824 0.565051 -0.762629 +vn -0.350045 -0.397976 -0.847988 +vn -0.356474 -0.355199 -0.864153 +vn -0.297983 0.625515 -0.721067 +vn 0.000017 0.565804 -0.824540 +vn 0.000034 -0.397272 -0.917701 +vn 0.000113 -0.353939 -0.935269 +vn 0.000075 0.624890 -0.780712 +vn 0.314825 0.565035 -0.762640 +vn 0.350034 -0.397998 -0.847982 +vn 0.356441 -0.355261 -0.864141 +vn 0.297933 0.625625 -0.720992 +vn 0.583338 0.565165 -0.583357 +vn 0.648448 -0.398726 -0.648485 +vn 0.660748 -0.355894 -0.660872 +vn 0.551780 0.625290 -0.551862 +vn 0.762629 0.565051 -0.314824 +vn 0.847988 -0.397976 -0.350045 +vn 0.864153 -0.355199 -0.356474 +vn 0.721067 0.625515 -0.297983 +vn 0.236583 0.971611 -0.000000 +vn 0.173084 0.984907 -0.000000 +vn 0.379703 0.925108 -0.000000 +vn 0.526673 0.850068 0.000000 +vn 0.217978 0.971775 0.090216 +vn 0.159589 0.984977 0.065961 +vn 0.350498 0.925311 0.144740 +vn 0.485590 0.850653 0.201474 +vn 0.166631 0.971838 0.166631 +vn 0.121908 0.985026 0.121908 +vn 0.267668 0.925585 0.267668 +vn 0.371315 0.851029 0.371315 +vn 0.090216 0.971775 0.217978 +vn 0.065961 0.984977 0.159589 +vn 0.144740 0.925311 0.350498 +vn 0.201475 0.850653 0.485590 +vn 0.000000 0.971611 0.236583 +vn 0.000000 0.984907 0.173084 +vn 0.000000 0.925108 0.379703 +vn -0.000000 0.850068 0.526673 +vn -0.090216 0.971775 0.217978 +vn -0.065961 0.984977 0.159589 +vn -0.144740 0.925311 0.350498 +vn -0.201474 0.850653 0.485590 +vn -0.166631 0.971838 0.166631 +vn -0.121908 0.985026 0.121908 +vn -0.267668 0.925585 0.267668 +vn -0.371315 0.851029 0.371315 +vn -0.217978 0.971775 0.090216 +vn -0.159589 0.984977 0.065961 +vn -0.350498 0.925311 0.144740 +vn -0.485590 0.850653 0.201475 +vn -0.236583 0.971611 0.000000 +vn -0.173084 0.984907 0.000000 +vn -0.379703 0.925108 0.000000 +vn -0.526673 0.850068 -0.000000 +vn -0.217978 0.971775 -0.090216 +vn -0.159589 0.984977 -0.065961 +vn -0.350498 0.925311 -0.144740 +vn -0.485590 0.850653 -0.201474 +vn -0.166631 0.971838 -0.166631 +vn -0.121908 0.985026 -0.121908 +vn -0.267668 0.925585 -0.267668 +vn -0.371315 0.851029 -0.371315 +vn -0.090216 0.971775 -0.217978 +vn -0.065961 0.984977 -0.159589 +vn -0.144740 0.925311 -0.350498 +vn -0.201475 0.850653 -0.485590 +vn -0.000000 0.971611 -0.236583 +vn -0.000000 0.984907 -0.173084 +vn -0.000000 0.925108 -0.379703 +vn 0.000000 0.850068 -0.526673 +vn 0.090216 0.971775 -0.217978 +vn 0.065961 0.984977 -0.159589 +vn 0.144740 0.925311 -0.350498 +vn 0.201474 0.850653 -0.485590 +vn 0.166631 0.971838 -0.166631 +vn 0.121908 0.985026 -0.121908 +vn 0.267668 0.925585 -0.267668 +vn 0.371315 0.851029 -0.371315 +vn 0.217978 0.971775 -0.090216 +vn 0.159589 0.984977 -0.065961 +vn 0.350498 0.925311 -0.144740 +vn 0.485590 0.850653 -0.201475 +# 530 vertex normals + +g Teapot01 +f 1/1/1 6/6/6 7/7/7 +f 7/7/7 2/2/2 1/1/1 +f 2/2/2 7/7/7 8/8/8 +f 8/8/8 3/3/3 2/2/2 +f 3/3/3 8/8/8 9/9/9 +f 9/9/9 4/4/4 3/3/3 +f 4/4/4 9/9/9 10/10/10 +f 10/10/10 5/5/5 4/4/4 +f 6/6/6 11/11/11 12/12/12 +f 12/12/12 7/7/7 6/6/6 +f 7/7/7 12/12/12 13/13/13 +f 13/13/13 8/8/8 7/7/7 +f 8/8/8 13/13/13 14/14/14 +f 14/14/14 9/9/9 8/8/8 +f 9/9/9 14/14/14 15/15/15 +f 15/15/15 10/10/10 9/9/9 +f 11/11/11 16/16/16 17/17/17 +f 17/17/17 12/12/12 11/11/11 +f 12/12/12 17/17/17 18/18/18 +f 18/18/18 13/13/13 12/12/12 +f 13/13/13 18/18/18 19/19/19 +f 19/19/19 14/14/14 13/13/13 +f 14/14/14 19/19/19 20/20/20 +f 20/20/20 15/15/15 14/14/14 +f 16/16/16 21/21/21 22/22/22 +f 22/22/22 17/17/17 16/16/16 +f 17/17/17 22/22/22 23/23/23 +f 23/23/23 18/18/18 17/17/17 +f 18/18/18 23/23/23 24/24/24 +f 24/24/24 19/19/19 18/18/18 +f 19/19/19 24/24/24 25/25/25 +f 25/25/25 20/20/20 19/19/19 +f 21/26/21 26/31/26 27/32/27 +f 27/32/27 22/27/22 21/26/21 +f 22/27/22 27/32/27 28/33/28 +f 28/33/28 23/28/23 22/27/22 +f 23/28/23 28/33/28 29/34/29 +f 29/34/29 24/29/24 23/28/23 +f 24/29/24 29/34/29 30/35/30 +f 30/35/30 25/30/25 24/29/24 +f 26/31/26 31/36/31 32/37/32 +f 32/37/32 27/32/27 26/31/26 +f 27/32/27 32/37/32 33/38/33 +f 33/38/33 28/33/28 27/32/27 +f 28/33/28 33/38/33 34/39/34 +f 34/39/34 29/34/29 28/33/28 +f 29/34/29 34/39/34 35/40/35 +f 35/40/35 30/35/30 29/34/29 +f 31/36/31 36/41/36 37/42/37 +f 37/42/37 32/37/32 31/36/31 +f 32/37/32 37/42/37 38/43/38 +f 38/43/38 33/38/33 32/37/32 +f 33/38/33 38/43/38 39/44/39 +f 39/44/39 34/39/34 33/38/33 +f 34/39/34 39/44/39 40/45/40 +f 40/45/40 35/40/35 34/39/34 +f 36/41/36 41/46/41 42/47/42 +f 42/47/42 37/42/37 36/41/36 +f 37/42/37 42/47/42 43/48/43 +f 43/48/43 38/43/38 37/42/37 +f 38/43/38 43/48/43 44/49/44 +f 44/49/44 39/44/39 38/43/38 +f 39/44/39 44/49/44 45/50/45 +f 45/50/45 40/45/40 39/44/39 +f 41/51/41 46/56/46 47/57/47 +f 47/57/47 42/52/42 41/51/41 +f 42/52/42 47/57/47 48/58/48 +f 48/58/48 43/53/43 42/52/42 +f 43/53/43 48/58/48 49/59/49 +f 49/59/49 44/54/44 43/53/43 +f 44/54/44 49/59/49 50/60/50 +f 50/60/50 45/55/45 44/54/44 +f 46/56/46 51/61/51 52/62/52 +f 52/62/52 47/57/47 46/56/46 +f 47/57/47 52/62/52 53/63/53 +f 53/63/53 48/58/48 47/57/47 +f 48/58/48 53/63/53 54/64/54 +f 54/64/54 49/59/49 48/58/48 +f 49/59/49 54/64/54 55/65/55 +f 55/65/55 50/60/50 49/59/49 +f 51/61/51 56/66/56 57/67/57 +f 57/67/57 52/62/52 51/61/51 +f 52/62/52 57/67/57 58/68/58 +f 58/68/58 53/63/53 52/62/52 +f 53/63/53 58/68/58 59/69/59 +f 59/69/59 54/64/54 53/63/53 +f 54/64/54 59/69/59 60/70/60 +f 60/70/60 55/65/55 54/64/54 +f 56/66/56 61/71/61 62/72/62 +f 62/72/62 57/67/57 56/66/56 +f 57/67/57 62/72/62 63/73/63 +f 63/73/63 58/68/58 57/67/57 +f 58/68/58 63/73/63 64/74/64 +f 64/74/64 59/69/59 58/68/58 +f 59/69/59 64/74/64 65/75/65 +f 65/75/65 60/70/60 59/69/59 +f 61/76/61 66/81/66 67/82/67 +f 67/82/67 62/77/62 61/76/61 +f 62/77/62 67/82/67 68/83/68 +f 68/83/68 63/78/63 62/77/62 +f 63/78/63 68/83/68 69/84/69 +f 69/84/69 64/79/64 63/78/63 +f 64/79/64 69/84/69 70/85/70 +f 70/85/70 65/80/65 64/79/64 +f 66/81/66 71/86/71 72/87/72 +f 72/87/72 67/82/67 66/81/66 +f 67/82/67 72/87/72 73/88/73 +f 73/88/73 68/83/68 67/82/67 +f 68/83/68 73/88/73 74/89/74 +f 74/89/74 69/84/69 68/83/68 +f 69/84/69 74/89/74 75/90/75 +f 75/90/75 70/85/70 69/84/69 +f 71/86/71 76/91/76 77/92/77 +f 77/92/77 72/87/72 71/86/71 +f 72/87/72 77/92/77 78/93/78 +f 78/93/78 73/88/73 72/87/72 +f 73/88/73 78/93/78 79/94/79 +f 79/94/79 74/89/74 73/88/73 +f 74/89/74 79/94/79 80/95/80 +f 80/95/80 75/90/75 74/89/74 +f 76/91/76 1/96/1 2/97/2 +f 2/97/2 77/92/77 76/91/76 +f 77/92/77 2/97/2 3/98/3 +f 3/98/3 78/93/78 77/92/77 +f 78/93/78 3/98/3 4/99/4 +f 4/99/4 79/94/79 78/93/78 +f 79/94/79 4/99/4 5/100/5 +f 5/100/5 80/95/80 79/94/79 +f 5/101/5 10/106/10 85/107/85 +f 85/107/85 81/102/81 5/101/5 +f 81/102/81 85/107/85 86/108/86 +f 86/108/86 82/103/82 81/102/81 +f 82/103/82 86/108/86 87/109/87 +f 87/109/87 83/104/83 82/103/82 +f 83/104/83 87/109/87 88/110/88 +f 88/110/88 84/105/84 83/104/83 +f 10/106/10 15/111/15 89/112/89 +f 89/112/89 85/107/85 10/106/10 +f 85/107/85 89/112/89 90/113/90 +f 90/113/90 86/108/86 85/107/85 +f 86/108/86 90/113/90 91/114/91 +f 91/114/91 87/109/87 86/108/86 +f 87/109/87 91/114/91 92/115/92 +f 92/115/92 88/110/88 87/109/87 +f 15/111/15 20/116/20 93/117/93 +f 93/117/93 89/112/89 15/111/15 +f 89/112/89 93/117/93 94/118/94 +f 94/118/94 90/113/90 89/112/89 +f 90/113/90 94/118/94 95/119/95 +f 95/119/95 91/114/91 90/113/90 +f 91/114/91 95/119/95 96/120/96 +f 96/120/96 92/115/92 91/114/91 +f 20/116/20 25/121/25 97/122/97 +f 97/122/97 93/117/93 20/116/20 +f 93/117/93 97/122/97 98/123/98 +f 98/123/98 94/118/94 93/117/93 +f 94/118/94 98/123/98 99/124/99 +f 99/124/99 95/119/95 94/118/94 +f 95/119/95 99/124/99 100/125/100 +f 100/125/100 96/120/96 95/119/95 +f 25/126/25 30/131/30 101/132/101 +f 101/132/101 97/127/97 25/126/25 +f 97/127/97 101/132/101 102/133/102 +f 102/133/102 98/128/98 97/127/97 +f 98/128/98 102/133/102 103/134/103 +f 103/134/103 99/129/99 98/128/98 +f 99/129/99 103/134/103 104/135/104 +f 104/135/104 100/130/100 99/129/99 +f 30/131/30 35/136/35 105/137/105 +f 105/137/105 101/132/101 30/131/30 +f 101/132/101 105/137/105 106/138/106 +f 106/138/106 102/133/102 101/132/101 +f 102/133/102 106/138/106 107/139/107 +f 107/139/107 103/134/103 102/133/102 +f 103/134/103 107/139/107 108/140/108 +f 108/140/108 104/135/104 103/134/103 +f 35/136/35 40/141/40 109/142/109 +f 109/142/109 105/137/105 35/136/35 +f 105/137/105 109/142/109 110/143/110 +f 110/143/110 106/138/106 105/137/105 +f 106/138/106 110/143/110 111/144/111 +f 111/144/111 107/139/107 106/138/106 +f 107/139/107 111/144/111 112/145/112 +f 112/145/112 108/140/108 107/139/107 +f 40/141/40 45/146/45 113/147/113 +f 113/147/113 109/142/109 40/141/40 +f 109/142/109 113/147/113 114/148/114 +f 114/148/114 110/143/110 109/142/109 +f 110/143/110 114/148/114 115/149/115 +f 115/149/115 111/144/111 110/143/110 +f 111/144/111 115/149/115 116/150/116 +f 116/150/116 112/145/112 111/144/111 +f 45/151/45 50/156/50 117/157/117 +f 117/157/117 113/152/113 45/151/45 +f 113/152/113 117/157/117 118/158/118 +f 118/158/118 114/153/114 113/152/113 +f 114/153/114 118/158/118 119/159/119 +f 119/159/119 115/154/115 114/153/114 +f 115/154/115 119/159/119 120/160/120 +f 120/160/120 116/155/116 115/154/115 +f 50/156/50 55/161/55 121/162/121 +f 121/162/121 117/157/117 50/156/50 +f 117/157/117 121/162/121 122/163/122 +f 122/163/122 118/158/118 117/157/117 +f 118/158/118 122/163/122 123/164/123 +f 123/164/123 119/159/119 118/158/118 +f 119/159/119 123/164/123 124/165/124 +f 124/165/124 120/160/120 119/159/119 +f 55/161/55 60/166/60 125/167/125 +f 125/167/125 121/162/121 55/161/55 +f 121/162/121 125/167/125 126/168/126 +f 126/168/126 122/163/122 121/162/121 +f 122/163/122 126/168/126 127/169/127 +f 127/169/127 123/164/123 122/163/122 +f 123/164/123 127/169/127 128/170/128 +f 128/170/128 124/165/124 123/164/123 +f 60/166/60 65/171/65 129/172/129 +f 129/172/129 125/167/125 60/166/60 +f 125/167/125 129/172/129 130/173/130 +f 130/173/130 126/168/126 125/167/125 +f 126/168/126 130/173/130 131/174/131 +f 131/174/131 127/169/127 126/168/126 +f 127/169/127 131/174/131 132/175/132 +f 132/175/132 128/170/128 127/169/127 +f 65/176/65 70/181/70 133/182/133 +f 133/182/133 129/177/129 65/176/65 +f 129/177/129 133/182/133 134/183/134 +f 134/183/134 130/178/130 129/177/129 +f 130/178/130 134/183/134 135/184/135 +f 135/184/135 131/179/131 130/178/130 +f 131/179/131 135/184/135 136/185/136 +f 136/185/136 132/180/132 131/179/131 +f 70/181/70 75/186/75 137/187/137 +f 137/187/137 133/182/133 70/181/70 +f 133/182/133 137/187/137 138/188/138 +f 138/188/138 134/183/134 133/182/133 +f 134/183/134 138/188/138 139/189/139 +f 139/189/139 135/184/135 134/183/134 +f 135/184/135 139/189/139 140/190/140 +f 140/190/140 136/185/136 135/184/135 +f 75/186/75 80/191/80 141/192/141 +f 141/192/141 137/187/137 75/186/75 +f 137/187/137 141/192/141 142/193/142 +f 142/193/142 138/188/138 137/187/137 +f 138/188/138 142/193/142 143/194/143 +f 143/194/143 139/189/139 138/188/138 +f 139/189/139 143/194/143 144/195/144 +f 144/195/144 140/190/140 139/189/139 +f 80/191/80 5/196/5 81/197/81 +f 81/197/81 141/192/141 80/191/80 +f 141/192/141 81/197/81 82/198/82 +f 82/198/82 142/193/142 141/192/141 +f 142/193/142 82/198/82 83/199/83 +f 83/199/83 143/194/143 142/193/142 +f 143/194/143 83/199/83 84/200/84 +f 84/200/84 144/195/144 143/194/143 +f 84/201/84 88/206/88 149/207/149 +f 149/207/149 145/202/145 84/201/84 +f 145/202/145 149/207/149 150/208/150 +f 150/208/150 146/203/146 145/202/145 +f 146/203/146 150/208/150 151/209/151 +f 151/209/151 147/204/147 146/203/146 +f 147/204/147 151/209/151 152/210/152 +f 152/210/152 148/205/148 147/204/147 +f 88/206/88 92/211/92 153/212/153 +f 153/212/153 149/207/149 88/206/88 +f 149/207/149 153/212/153 154/213/154 +f 154/213/154 150/208/150 149/207/149 +f 150/208/150 154/213/154 155/214/155 +f 155/214/155 151/209/151 150/208/150 +f 151/209/151 155/214/155 156/215/156 +f 156/215/156 152/210/152 151/209/151 +f 92/211/92 96/216/96 157/217/157 +f 157/217/157 153/212/153 92/211/92 +f 153/212/153 157/217/157 158/218/158 +f 158/218/158 154/213/154 153/212/153 +f 154/213/154 158/218/158 159/219/159 +f 159/219/159 155/214/155 154/213/154 +f 155/214/155 159/219/159 160/220/160 +f 160/220/160 156/215/156 155/214/155 +f 96/216/96 100/221/100 161/222/161 +f 161/222/161 157/217/157 96/216/96 +f 157/217/157 161/222/161 162/223/162 +f 162/223/162 158/218/158 157/217/157 +f 158/218/158 162/223/162 163/224/163 +f 163/224/163 159/219/159 158/218/158 +f 159/219/159 163/224/163 164/225/164 +f 164/225/164 160/220/160 159/219/159 +f 100/226/100 104/231/104 165/232/165 +f 165/232/165 161/227/161 100/226/100 +f 161/227/161 165/232/165 166/233/166 +f 166/233/166 162/228/162 161/227/161 +f 162/228/162 166/233/166 167/234/167 +f 167/234/167 163/229/163 162/228/162 +f 163/229/163 167/234/167 168/235/168 +f 168/235/168 164/230/164 163/229/163 +f 104/231/104 108/236/108 169/237/169 +f 169/237/169 165/232/165 104/231/104 +f 165/232/165 169/237/169 170/238/170 +f 170/238/170 166/233/166 165/232/165 +f 166/233/166 170/238/170 171/239/171 +f 171/239/171 167/234/167 166/233/166 +f 167/234/167 171/239/171 172/240/172 +f 172/240/172 168/235/168 167/234/167 +f 108/236/108 112/241/112 173/242/173 +f 173/242/173 169/237/169 108/236/108 +f 169/237/169 173/242/173 174/243/174 +f 174/243/174 170/238/170 169/237/169 +f 170/238/170 174/243/174 175/244/175 +f 175/244/175 171/239/171 170/238/170 +f 171/239/171 175/244/175 176/245/176 +f 176/245/176 172/240/172 171/239/171 +f 112/241/112 116/246/116 177/247/177 +f 177/247/177 173/242/173 112/241/112 +f 173/242/173 177/247/177 178/248/178 +f 178/248/178 174/243/174 173/242/173 +f 174/243/174 178/248/178 179/249/179 +f 179/249/179 175/244/175 174/243/174 +f 175/244/175 179/249/179 180/250/180 +f 180/250/180 176/245/176 175/244/175 +f 116/251/116 120/256/120 181/257/181 +f 181/257/181 177/252/177 116/251/116 +f 177/252/177 181/257/181 182/258/182 +f 182/258/182 178/253/178 177/252/177 +f 178/253/178 182/258/182 183/259/183 +f 183/259/183 179/254/179 178/253/178 +f 179/254/179 183/259/183 184/260/184 +f 184/260/184 180/255/180 179/254/179 +f 120/256/120 124/261/124 185/262/185 +f 185/262/185 181/257/181 120/256/120 +f 181/257/181 185/262/185 186/263/186 +f 186/263/186 182/258/182 181/257/181 +f 182/258/182 186/263/186 187/264/187 +f 187/264/187 183/259/183 182/258/182 +f 183/259/183 187/264/187 188/265/188 +f 188/265/188 184/260/184 183/259/183 +f 124/261/124 128/266/128 189/267/189 +f 189/267/189 185/262/185 124/261/124 +f 185/262/185 189/267/189 190/268/190 +f 190/268/190 186/263/186 185/262/185 +f 186/263/186 190/268/190 191/269/191 +f 191/269/191 187/264/187 186/263/186 +f 187/264/187 191/269/191 192/270/192 +f 192/270/192 188/265/188 187/264/187 +f 128/266/128 132/271/132 193/272/193 +f 193/272/193 189/267/189 128/266/128 +f 189/267/189 193/272/193 194/273/194 +f 194/273/194 190/268/190 189/267/189 +f 190/268/190 194/273/194 195/274/195 +f 195/274/195 191/269/191 190/268/190 +f 191/269/191 195/274/195 196/275/196 +f 196/275/196 192/270/192 191/269/191 +f 132/276/132 136/281/136 197/282/197 +f 197/282/197 193/277/193 132/276/132 +f 193/277/193 197/282/197 198/283/198 +f 198/283/198 194/278/194 193/277/193 +f 194/278/194 198/283/198 199/284/199 +f 199/284/199 195/279/195 194/278/194 +f 195/279/195 199/284/199 200/285/200 +f 200/285/200 196/280/196 195/279/195 +f 136/281/136 140/286/140 201/287/201 +f 201/287/201 197/282/197 136/281/136 +f 197/282/197 201/287/201 202/288/202 +f 202/288/202 198/283/198 197/282/197 +f 198/283/198 202/288/202 203/289/203 +f 203/289/203 199/284/199 198/283/198 +f 199/284/199 203/289/203 204/290/204 +f 204/290/204 200/285/200 199/284/199 +f 140/286/140 144/291/144 205/292/205 +f 205/292/205 201/287/201 140/286/140 +f 201/287/201 205/292/205 206/293/206 +f 206/293/206 202/288/202 201/287/201 +f 202/288/202 206/293/206 207/294/207 +f 207/294/207 203/289/203 202/288/202 +f 203/289/203 207/294/207 208/295/208 +f 208/295/208 204/290/204 203/289/203 +f 144/291/144 84/296/84 145/297/145 +f 145/297/145 205/292/205 144/291/144 +f 205/292/205 145/297/145 146/298/146 +f 146/298/146 206/293/206 205/292/205 +f 206/293/206 146/298/146 147/299/147 +f 147/299/147 207/294/207 206/293/206 +f 207/294/207 147/299/147 148/300/148 +f 148/300/148 208/295/208 207/294/207 +f 148/301/148 152/306/152 213/307/213 +f 213/307/213 209/302/209 148/301/148 +f 209/302/209 213/307/213 214/308/214 +f 214/308/214 210/303/210 209/302/209 +f 210/303/210 214/308/214 215/309/215 +f 215/309/215 211/304/211 210/303/210 +f 211/304/211 215/309/215 212/310/212 +f 152/306/152 156/311/156 216/312/216 +f 216/312/216 213/307/213 152/306/152 +f 213/307/213 216/312/216 217/313/217 +f 217/313/217 214/308/214 213/307/213 +f 214/308/214 217/313/217 218/314/218 +f 218/314/218 215/309/215 214/308/214 +f 215/309/215 218/314/218 212/315/212 +f 156/311/156 160/316/160 219/317/219 +f 219/317/219 216/312/216 156/311/156 +f 216/312/216 219/317/219 220/318/220 +f 220/318/220 217/313/217 216/312/216 +f 217/313/217 220/318/220 221/319/221 +f 221/319/221 218/314/218 217/313/217 +f 218/314/218 221/319/221 212/320/212 +f 160/316/160 164/321/164 222/322/222 +f 222/322/222 219/317/219 160/316/160 +f 219/317/219 222/322/222 223/323/223 +f 223/323/223 220/318/220 219/317/219 +f 220/318/220 223/323/223 224/324/224 +f 224/324/224 221/319/221 220/318/220 +f 221/319/221 224/324/224 212/325/212 +f 164/326/164 168/331/168 225/332/225 +f 225/332/225 222/327/222 164/326/164 +f 222/327/222 225/332/225 226/333/226 +f 226/333/226 223/328/223 222/327/222 +f 223/328/223 226/333/226 227/334/227 +f 227/334/227 224/329/224 223/328/223 +f 224/329/224 227/334/227 212/335/212 +f 168/331/168 172/336/172 228/337/228 +f 228/337/228 225/332/225 168/331/168 +f 225/332/225 228/337/228 229/338/229 +f 229/338/229 226/333/226 225/332/225 +f 226/333/226 229/338/229 230/339/230 +f 230/339/230 227/334/227 226/333/226 +f 227/334/227 230/339/230 212/340/212 +f 172/336/172 176/341/176 231/342/231 +f 231/342/231 228/337/228 172/336/172 +f 228/337/228 231/342/231 232/343/232 +f 232/343/232 229/338/229 228/337/228 +f 229/338/229 232/343/232 233/344/233 +f 233/344/233 230/339/230 229/338/229 +f 230/339/230 233/344/233 212/345/212 +f 176/341/176 180/346/180 234/347/234 +f 234/347/234 231/342/231 176/341/176 +f 231/342/231 234/347/234 235/348/235 +f 235/348/235 232/343/232 231/342/231 +f 232/343/232 235/348/235 236/349/236 +f 236/349/236 233/344/233 232/343/232 +f 233/344/233 236/349/236 212/350/212 +f 180/351/180 184/356/184 237/357/237 +f 237/357/237 234/352/234 180/351/180 +f 234/352/234 237/357/237 238/358/238 +f 238/358/238 235/353/235 234/352/234 +f 235/353/235 238/358/238 239/359/239 +f 239/359/239 236/354/236 235/353/235 +f 236/354/236 239/359/239 212/360/212 +f 184/356/184 188/361/188 240/362/240 +f 240/362/240 237/357/237 184/356/184 +f 237/357/237 240/362/240 241/363/241 +f 241/363/241 238/358/238 237/357/237 +f 238/358/238 241/363/241 242/364/242 +f 242/364/242 239/359/239 238/358/238 +f 239/359/239 242/364/242 212/365/212 +f 188/361/188 192/366/192 243/367/243 +f 243/367/243 240/362/240 188/361/188 +f 240/362/240 243/367/243 244/368/244 +f 244/368/244 241/363/241 240/362/240 +f 241/363/241 244/368/244 245/369/245 +f 245/369/245 242/364/242 241/363/241 +f 242/364/242 245/369/245 212/370/212 +f 192/366/192 196/371/196 246/372/246 +f 246/372/246 243/367/243 192/366/192 +f 243/367/243 246/372/246 247/373/247 +f 247/373/247 244/368/244 243/367/243 +f 244/368/244 247/373/247 248/374/248 +f 248/374/248 245/369/245 244/368/244 +f 245/369/245 248/374/248 212/375/212 +f 196/376/196 200/381/200 249/382/249 +f 249/382/249 246/377/246 196/376/196 +f 246/377/246 249/382/249 250/383/250 +f 250/383/250 247/378/247 246/377/246 +f 247/378/247 250/383/250 251/384/251 +f 251/384/251 248/379/248 247/378/247 +f 248/379/248 251/384/251 212/385/212 +f 200/381/200 204/386/204 252/387/252 +f 252/387/252 249/382/249 200/381/200 +f 249/382/249 252/387/252 253/388/253 +f 253/388/253 250/383/250 249/382/249 +f 250/383/250 253/388/253 254/389/254 +f 254/389/254 251/384/251 250/383/250 +f 251/384/251 254/389/254 212/390/212 +f 204/386/204 208/391/208 255/392/255 +f 255/392/255 252/387/252 204/386/204 +f 252/387/252 255/392/255 256/393/256 +f 256/393/256 253/388/253 252/387/252 +f 253/388/253 256/393/256 257/394/257 +f 257/394/257 254/389/254 253/388/253 +f 254/389/254 257/394/257 212/395/212 +f 208/391/208 148/396/148 209/397/209 +f 209/397/209 255/392/255 208/391/208 +f 255/392/255 209/397/209 210/398/210 +f 210/398/210 256/393/256 255/392/255 +f 256/393/256 210/398/210 211/399/211 +f 211/399/211 257/394/257 256/393/256 +f 257/394/257 211/399/211 212/400/212 +f 258/401/258 263/406/263 264/407/264 +f 264/407/264 259/402/259 258/401/258 +f 259/402/259 264/407/264 265/408/265 +f 265/408/265 260/403/260 259/402/259 +f 260/403/260 265/408/265 266/409/266 +f 266/409/266 261/404/261 260/403/260 +f 261/404/261 266/409/266 267/410/267 +f 267/410/267 262/405/262 261/404/261 +f 263/406/263 268/411/268 269/412/269 +f 269/412/269 264/407/264 263/406/263 +f 264/407/264 269/412/269 270/413/270 +f 270/413/270 265/408/265 264/407/264 +f 265/408/265 270/413/270 271/414/271 +f 271/414/271 266/409/266 265/408/265 +f 266/409/266 271/414/271 272/415/272 +f 272/415/272 267/410/267 266/409/266 +f 268/411/268 273/416/273 274/417/274 +f 274/417/274 269/412/269 268/411/268 +f 269/412/269 274/417/274 275/418/275 +f 275/418/275 270/413/270 269/412/269 +f 270/413/270 275/418/275 276/419/276 +f 276/419/276 271/414/271 270/413/270 +f 271/414/271 276/419/276 277/420/277 +f 277/420/277 272/415/272 271/414/271 +f 273/416/273 278/421/278 279/422/279 +f 279/422/279 274/417/274 273/416/273 +f 274/417/274 279/422/279 280/423/280 +f 280/423/280 275/418/275 274/417/274 +f 275/418/275 280/423/280 281/424/281 +f 281/424/281 276/419/276 275/418/275 +f 276/419/276 281/424/281 282/425/282 +f 282/425/282 277/420/277 276/419/276 +f 278/426/278 283/431/283 284/432/284 +f 284/432/284 279/427/279 278/426/278 +f 279/427/279 284/432/284 285/433/285 +f 285/433/285 280/428/280 279/427/279 +f 280/428/280 285/433/285 286/434/286 +f 286/434/286 281/429/281 280/428/280 +f 281/429/281 286/434/286 287/435/287 +f 287/435/287 282/430/282 281/429/281 +f 283/431/283 288/436/288 289/437/289 +f 289/437/289 284/432/284 283/431/283 +f 284/432/284 289/437/289 290/438/290 +f 290/438/290 285/433/285 284/432/284 +f 285/433/285 290/438/290 291/439/291 +f 291/439/291 286/434/286 285/433/285 +f 286/434/286 291/439/291 292/440/292 +f 292/440/292 287/435/287 286/434/286 +f 288/436/288 293/441/293 294/442/294 +f 294/442/294 289/437/289 288/436/288 +f 289/437/289 294/442/294 295/443/295 +f 295/443/295 290/438/290 289/437/289 +f 290/438/290 295/443/295 296/444/296 +f 296/444/296 291/439/291 290/438/290 +f 291/439/291 296/444/296 297/445/297 +f 297/445/297 292/440/292 291/439/291 +f 293/441/293 258/446/258 259/447/259 +f 259/447/259 294/442/294 293/441/293 +f 294/442/294 259/447/259 260/448/260 +f 260/448/260 295/443/295 294/442/294 +f 295/443/295 260/448/260 261/449/261 +f 261/449/261 296/444/296 295/443/295 +f 296/444/296 261/449/261 262/450/262 +f 262/450/262 297/445/297 296/444/296 +f 262/451/262 267/456/267 302/457/302 +f 302/457/302 298/452/298 262/451/262 +f 298/452/298 302/457/302 303/458/303 +f 303/458/303 299/453/299 298/452/298 +f 299/453/299 303/458/303 304/459/304 +f 304/459/304 300/454/300 299/453/299 +f 300/454/300 304/459/304 305/460/305 +f 305/460/305 301/455/301 300/454/300 +f 267/456/267 272/461/272 306/462/306 +f 306/462/306 302/457/302 267/456/267 +f 302/457/302 306/462/306 307/463/307 +f 307/463/307 303/458/303 302/457/302 +f 303/458/303 307/463/307 308/464/308 +f 308/464/308 304/459/304 303/458/303 +f 304/459/304 308/464/308 309/465/309 +f 309/465/309 305/460/305 304/459/304 +f 272/461/272 277/466/277 310/467/310 +f 310/467/310 306/462/306 272/461/272 +f 306/462/306 310/467/310 311/468/311 +f 311/468/311 307/463/307 306/462/306 +f 307/463/307 311/468/311 312/469/312 +f 312/469/312 308/464/308 307/463/307 +f 308/464/308 312/469/312 313/470/313 +f 313/470/313 309/465/309 308/464/308 +f 277/466/277 282/471/282 314/472/314 +f 314/472/314 310/467/310 277/466/277 +f 310/467/310 314/472/314 315/473/315 +f 315/473/315 311/468/311 310/467/310 +f 311/468/311 315/473/315 316/474/316 +f 316/474/316 312/469/312 311/468/311 +f 312/469/312 316/474/316 317/475/317 +f 317/475/317 313/470/313 312/469/312 +f 282/476/282 287/481/287 318/482/318 +f 318/482/318 314/477/314 282/476/282 +f 314/477/314 318/482/318 319/483/319 +f 319/483/319 315/478/315 314/477/314 +f 315/478/315 319/483/319 320/484/320 +f 320/484/320 316/479/316 315/478/315 +f 316/479/316 320/484/320 321/485/321 +f 321/485/321 317/480/317 316/479/316 +f 287/481/287 292/486/292 322/487/322 +f 322/487/322 318/482/318 287/481/287 +f 318/482/318 322/487/322 323/488/323 +f 323/488/323 319/483/319 318/482/318 +f 319/483/319 323/488/323 324/489/324 +f 324/489/324 320/484/320 319/483/319 +f 320/484/320 324/489/324 325/490/325 +f 325/490/325 321/485/321 320/484/320 +f 292/486/292 297/491/297 326/492/326 +f 326/492/326 322/487/322 292/486/292 +f 322/487/322 326/492/326 327/493/327 +f 327/493/327 323/488/323 322/487/322 +f 323/488/323 327/493/327 328/494/328 +f 328/494/328 324/489/324 323/488/323 +f 324/489/324 328/494/328 329/495/329 +f 329/495/329 325/490/325 324/489/324 +f 297/491/297 262/496/262 298/497/298 +f 298/497/298 326/492/326 297/491/297 +f 326/492/326 298/497/298 299/498/299 +f 299/498/299 327/493/327 326/492/326 +f 327/493/327 299/498/299 300/499/300 +f 300/499/300 328/494/328 327/493/327 +f 328/494/328 300/499/300 301/500/301 +f 301/500/301 329/495/329 328/494/328 +f 330/501/330 335/506/335 336/507/336 +f 336/507/336 331/502/331 330/501/330 +f 331/502/331 336/507/336 337/508/337 +f 337/508/337 332/503/332 331/502/331 +f 332/503/332 337/508/337 338/509/338 +f 338/509/338 333/504/333 332/503/332 +f 333/504/333 338/509/338 339/510/339 +f 339/510/339 334/505/334 333/504/333 +f 335/506/335 340/511/340 341/512/341 +f 341/512/341 336/507/336 335/506/335 +f 336/507/336 341/512/341 342/513/342 +f 342/513/342 337/508/337 336/507/336 +f 337/508/337 342/513/342 343/514/343 +f 343/514/343 338/509/338 337/508/337 +f 338/509/338 343/514/343 344/515/344 +f 344/515/344 339/510/339 338/509/338 +f 340/511/340 345/516/345 346/517/346 +f 346/517/346 341/512/341 340/511/340 +f 341/512/341 346/517/346 347/518/347 +f 347/518/347 342/513/342 341/512/341 +f 342/513/342 347/518/347 348/519/348 +f 348/519/348 343/514/343 342/513/342 +f 343/514/343 348/519/348 349/520/349 +f 349/520/349 344/515/344 343/514/343 +f 345/516/345 350/521/350 351/522/351 +f 351/522/351 346/517/346 345/516/345 +f 346/517/346 351/522/351 352/523/352 +f 352/523/352 347/518/347 346/517/346 +f 347/518/347 352/523/352 353/524/353 +f 353/524/353 348/519/348 347/518/347 +f 348/519/348 353/524/353 354/525/354 +f 354/525/354 349/520/349 348/519/348 +f 350/526/350 355/531/355 356/532/356 +f 356/532/356 351/527/351 350/526/350 +f 351/527/351 356/532/356 357/533/357 +f 357/533/357 352/528/352 351/527/351 +f 352/528/352 357/533/357 358/534/358 +f 358/534/358 353/529/353 352/528/352 +f 353/529/353 358/534/358 359/535/359 +f 359/535/359 354/530/354 353/529/353 +f 355/531/355 360/536/360 361/537/361 +f 361/537/361 356/532/356 355/531/355 +f 356/532/356 361/537/361 362/538/362 +f 362/538/362 357/533/357 356/532/356 +f 357/533/357 362/538/362 363/539/363 +f 363/539/363 358/534/358 357/533/357 +f 358/534/358 363/539/363 364/540/364 +f 364/540/364 359/535/359 358/534/358 +f 360/536/360 365/541/365 366/542/366 +f 366/542/366 361/537/361 360/536/360 +f 361/537/361 366/542/366 367/543/367 +f 367/543/367 362/538/362 361/537/361 +f 362/538/362 367/543/367 368/544/368 +f 368/544/368 363/539/363 362/538/362 +f 363/539/363 368/544/368 369/545/369 +f 369/545/369 364/540/364 363/539/363 +f 365/541/365 330/546/330 331/547/331 +f 331/547/331 366/542/366 365/541/365 +f 366/542/366 331/547/331 332/548/332 +f 332/548/332 367/543/367 366/542/366 +f 367/543/367 332/548/332 333/549/333 +f 333/549/333 368/544/368 367/543/367 +f 368/544/368 333/549/333 334/550/334 +f 334/550/334 369/545/369 368/544/368 +f 334/551/334 339/556/339 374/557/374 +f 374/557/374 370/552/370 334/551/334 +f 370/552/370 374/557/374 375/558/375 +f 375/558/375 371/553/371 370/552/370 +f 371/553/371 375/558/375 376/559/376 +f 376/559/376 372/554/372 371/553/371 +f 372/554/372 376/559/376 377/560/377 +f 377/560/377 373/555/373 372/554/372 +f 339/556/339 344/561/344 378/562/378 +f 378/562/378 374/557/374 339/556/339 +f 374/557/374 378/562/378 379/563/379 +f 379/563/379 375/558/375 374/557/374 +f 375/558/375 379/563/379 380/564/380 +f 380/564/380 376/559/376 375/558/375 +f 376/559/376 380/564/380 381/565/381 +f 381/565/381 377/560/377 376/559/376 +f 344/561/344 349/566/349 382/567/382 +f 382/567/382 378/562/378 344/561/344 +f 378/562/378 382/567/382 383/568/383 +f 383/568/383 379/563/379 378/562/378 +f 379/563/379 383/568/383 384/569/384 +f 384/569/384 380/564/380 379/563/379 +f 380/564/380 384/569/384 385/570/385 +f 385/570/385 381/565/381 380/564/380 +f 349/566/349 354/571/354 386/572/386 +f 386/572/386 382/567/382 349/566/349 +f 382/567/382 386/572/386 387/573/387 +f 387/573/387 383/568/383 382/567/382 +f 383/568/383 387/573/387 388/574/388 +f 388/574/388 384/569/384 383/568/383 +f 384/569/384 388/574/388 389/575/389 +f 389/575/389 385/570/385 384/569/384 +f 354/576/354 359/581/359 390/582/390 +f 390/582/390 386/577/386 354/576/354 +f 386/577/386 390/582/390 391/583/391 +f 391/583/391 387/578/387 386/577/386 +f 387/578/387 391/583/391 392/584/392 +f 392/584/392 388/579/388 387/578/387 +f 388/579/388 392/584/392 393/585/393 +f 393/585/393 389/580/389 388/579/388 +f 359/581/359 364/586/364 394/587/394 +f 394/587/394 390/582/390 359/581/359 +f 390/582/390 394/587/394 395/588/395 +f 395/588/395 391/583/391 390/582/390 +f 391/583/391 395/588/395 396/589/396 +f 396/589/396 392/584/392 391/583/391 +f 392/584/392 396/589/396 397/590/397 +f 397/590/397 393/585/393 392/584/392 +f 364/586/364 369/591/369 398/592/398 +f 398/592/398 394/587/394 364/586/364 +f 394/587/394 398/592/398 399/593/399 +f 399/593/399 395/588/395 394/587/394 +f 395/588/395 399/593/399 400/594/400 +f 400/594/400 396/589/396 395/588/395 +f 396/589/396 400/594/400 401/595/401 +f 401/595/401 397/590/397 396/589/396 +f 369/591/369 334/596/334 370/597/370 +f 370/597/370 398/592/398 369/591/369 +f 398/592/398 370/597/370 371/598/371 +f 371/598/371 399/593/399 398/592/398 +f 399/593/399 371/598/371 372/599/372 +f 372/599/372 400/594/400 399/593/399 +f 400/594/400 372/599/372 373/600/373 +f 373/600/373 401/595/401 400/594/400 +f 407/607/407 403/602/403 402/601/402 +f 403/602/403 407/607/407 408/608/408 +f 408/608/408 404/603/404 403/602/403 +f 404/603/404 408/608/408 409/609/409 +f 409/609/409 405/604/405 404/603/404 +f 405/604/405 409/609/409 410/610/410 +f 410/610/410 406/605/406 405/604/405 +f 411/612/411 407/607/407 402/606/402 +f 407/607/407 411/612/411 412/613/412 +f 412/613/412 408/608/408 407/607/407 +f 408/608/408 412/613/412 413/614/413 +f 413/614/413 409/609/409 408/608/408 +f 409/609/409 413/614/413 414/615/414 +f 414/615/414 410/610/410 409/609/409 +f 415/617/415 411/612/411 402/611/402 +f 411/612/411 415/617/415 416/618/416 +f 416/618/416 412/613/412 411/612/411 +f 412/613/412 416/618/416 417/619/417 +f 417/619/417 413/614/413 412/613/412 +f 413/614/413 417/619/417 418/620/418 +f 418/620/418 414/615/414 413/614/413 +f 419/622/419 415/617/415 402/616/402 +f 415/617/415 419/622/419 420/623/420 +f 420/623/420 416/618/416 415/617/415 +f 416/618/416 420/623/420 421/624/421 +f 421/624/421 417/619/417 416/618/416 +f 417/619/417 421/624/421 422/625/422 +f 422/625/422 418/620/418 417/619/417 +f 423/632/423 419/627/419 402/626/402 +f 419/627/419 423/632/423 424/633/424 +f 424/633/424 420/628/420 419/627/419 +f 420/628/420 424/633/424 425/634/425 +f 425/634/425 421/629/421 420/628/420 +f 421/629/421 425/634/425 426/635/426 +f 426/635/426 422/630/422 421/629/421 +f 427/637/427 423/632/423 402/631/402 +f 423/632/423 427/637/427 428/638/428 +f 428/638/428 424/633/424 423/632/423 +f 424/633/424 428/638/428 429/639/429 +f 429/639/429 425/634/425 424/633/424 +f 425/634/425 429/639/429 430/640/430 +f 430/640/430 426/635/426 425/634/425 +f 431/642/431 427/637/427 402/636/402 +f 427/637/427 431/642/431 432/643/432 +f 432/643/432 428/638/428 427/637/427 +f 428/638/428 432/643/432 433/644/433 +f 433/644/433 429/639/429 428/638/428 +f 429/639/429 433/644/433 434/645/434 +f 434/645/434 430/640/430 429/639/429 +f 435/647/435 431/642/431 402/641/402 +f 431/642/431 435/647/435 436/648/436 +f 436/648/436 432/643/432 431/642/431 +f 432/643/432 436/648/436 437/649/437 +f 437/649/437 433/644/433 432/643/432 +f 433/644/433 437/649/437 438/650/438 +f 438/650/438 434/645/434 433/644/433 +f 439/657/439 435/652/435 402/651/402 +f 435/652/435 439/657/439 440/658/440 +f 440/658/440 436/653/436 435/652/435 +f 436/653/436 440/658/440 441/659/441 +f 441/659/441 437/654/437 436/653/436 +f 437/654/437 441/659/441 442/660/442 +f 442/660/442 438/655/438 437/654/437 +f 443/662/443 439/657/439 402/656/402 +f 439/657/439 443/662/443 444/663/444 +f 444/663/444 440/658/440 439/657/439 +f 440/658/440 444/663/444 445/664/445 +f 445/664/445 441/659/441 440/658/440 +f 441/659/441 445/664/445 446/665/446 +f 446/665/446 442/660/442 441/659/441 +f 447/667/447 443/662/443 402/661/402 +f 443/662/443 447/667/447 448/668/448 +f 448/668/448 444/663/444 443/662/443 +f 444/663/444 448/668/448 449/669/449 +f 449/669/449 445/664/445 444/663/444 +f 445/664/445 449/669/449 450/670/450 +f 450/670/450 446/665/446 445/664/445 +f 451/672/451 447/667/447 402/666/402 +f 447/667/447 451/672/451 452/673/452 +f 452/673/452 448/668/448 447/667/447 +f 448/668/448 452/673/452 453/674/453 +f 453/674/453 449/669/449 448/668/448 +f 449/669/449 453/674/453 454/675/454 +f 454/675/454 450/670/450 449/669/449 +f 455/682/455 451/677/451 402/676/402 +f 451/677/451 455/682/455 456/683/456 +f 456/683/456 452/678/452 451/677/451 +f 452/678/452 456/683/456 457/684/457 +f 457/684/457 453/679/453 452/678/452 +f 453/679/453 457/684/457 458/685/458 +f 458/685/458 454/680/454 453/679/453 +f 459/687/459 455/682/455 402/681/402 +f 455/682/455 459/687/459 460/688/460 +f 460/688/460 456/683/456 455/682/455 +f 456/683/456 460/688/460 461/689/461 +f 461/689/461 457/684/457 456/683/456 +f 457/684/457 461/689/461 462/690/462 +f 462/690/462 458/685/458 457/684/457 +f 463/692/463 459/687/459 402/686/402 +f 459/687/459 463/692/463 464/693/464 +f 464/693/464 460/688/460 459/687/459 +f 460/688/460 464/693/464 465/694/465 +f 465/694/465 461/689/461 460/688/460 +f 461/689/461 465/694/465 466/695/466 +f 466/695/466 462/690/462 461/689/461 +f 403/697/403 463/692/463 402/691/402 +f 463/692/463 403/697/403 404/698/404 +f 404/698/404 464/693/464 463/692/463 +f 464/693/464 404/698/404 405/699/405 +f 405/699/405 465/694/465 464/693/464 +f 465/694/465 405/699/405 406/700/406 +f 406/700/406 466/695/466 465/694/465 +f 406/701/406 410/706/410 471/707/471 +f 471/707/471 467/702/467 406/701/406 +f 467/702/467 471/707/471 472/708/472 +f 472/708/472 468/703/468 467/702/467 +f 468/703/468 472/708/472 473/709/473 +f 473/709/473 469/704/469 468/703/468 +f 469/704/469 473/709/473 474/710/474 +f 474/710/474 470/705/470 469/704/469 +f 410/706/410 414/711/414 475/712/475 +f 475/712/475 471/707/471 410/706/410 +f 471/707/471 475/712/475 476/713/476 +f 476/713/476 472/708/472 471/707/471 +f 472/708/472 476/713/476 477/714/477 +f 477/714/477 473/709/473 472/708/472 +f 473/709/473 477/714/477 478/715/478 +f 478/715/478 474/710/474 473/709/473 +f 414/711/414 418/716/418 479/717/479 +f 479/717/479 475/712/475 414/711/414 +f 475/712/475 479/717/479 480/718/480 +f 480/718/480 476/713/476 475/712/475 +f 476/713/476 480/718/480 481/719/481 +f 481/719/481 477/714/477 476/713/476 +f 477/714/477 481/719/481 482/720/482 +f 482/720/482 478/715/478 477/714/477 +f 418/716/418 422/721/422 483/722/483 +f 483/722/483 479/717/479 418/716/418 +f 479/717/479 483/722/483 484/723/484 +f 484/723/484 480/718/480 479/717/479 +f 480/718/480 484/723/484 485/724/485 +f 485/724/485 481/719/481 480/718/480 +f 481/719/481 485/724/485 486/725/486 +f 486/725/486 482/720/482 481/719/481 +f 422/726/422 426/731/426 487/732/487 +f 487/732/487 483/727/483 422/726/422 +f 483/727/483 487/732/487 488/733/488 +f 488/733/488 484/728/484 483/727/483 +f 484/728/484 488/733/488 489/734/489 +f 489/734/489 485/729/485 484/728/484 +f 485/729/485 489/734/489 490/735/490 +f 490/735/490 486/730/486 485/729/485 +f 426/731/426 430/736/430 491/737/491 +f 491/737/491 487/732/487 426/731/426 +f 487/732/487 491/737/491 492/738/492 +f 492/738/492 488/733/488 487/732/487 +f 488/733/488 492/738/492 493/739/493 +f 493/739/493 489/734/489 488/733/488 +f 489/734/489 493/739/493 494/740/494 +f 494/740/494 490/735/490 489/734/489 +f 430/736/430 434/741/434 495/742/495 +f 495/742/495 491/737/491 430/736/430 +f 491/737/491 495/742/495 496/743/496 +f 496/743/496 492/738/492 491/737/491 +f 492/738/492 496/743/496 497/744/497 +f 497/744/497 493/739/493 492/738/492 +f 493/739/493 497/744/497 498/745/498 +f 498/745/498 494/740/494 493/739/493 +f 434/741/434 438/746/438 499/747/499 +f 499/747/499 495/742/495 434/741/434 +f 495/742/495 499/747/499 500/748/500 +f 500/748/500 496/743/496 495/742/495 +f 496/743/496 500/748/500 501/749/501 +f 501/749/501 497/744/497 496/743/496 +f 497/744/497 501/749/501 502/750/502 +f 502/750/502 498/745/498 497/744/497 +f 438/751/438 442/756/442 503/757/503 +f 503/757/503 499/752/499 438/751/438 +f 499/752/499 503/757/503 504/758/504 +f 504/758/504 500/753/500 499/752/499 +f 500/753/500 504/758/504 505/759/505 +f 505/759/505 501/754/501 500/753/500 +f 501/754/501 505/759/505 506/760/506 +f 506/760/506 502/755/502 501/754/501 +f 442/756/442 446/761/446 507/762/507 +f 507/762/507 503/757/503 442/756/442 +f 503/757/503 507/762/507 508/763/508 +f 508/763/508 504/758/504 503/757/503 +f 504/758/504 508/763/508 509/764/509 +f 509/764/509 505/759/505 504/758/504 +f 505/759/505 509/764/509 510/765/510 +f 510/765/510 506/760/506 505/759/505 +f 446/761/446 450/766/450 511/767/511 +f 511/767/511 507/762/507 446/761/446 +f 507/762/507 511/767/511 512/768/512 +f 512/768/512 508/763/508 507/762/507 +f 508/763/508 512/768/512 513/769/513 +f 513/769/513 509/764/509 508/763/508 +f 509/764/509 513/769/513 514/770/514 +f 514/770/514 510/765/510 509/764/509 +f 450/766/450 454/771/454 515/772/515 +f 515/772/515 511/767/511 450/766/450 +f 511/767/511 515/772/515 516/773/516 +f 516/773/516 512/768/512 511/767/511 +f 512/768/512 516/773/516 517/774/517 +f 517/774/517 513/769/513 512/768/512 +f 513/769/513 517/774/517 518/775/518 +f 518/775/518 514/770/514 513/769/513 +f 454/776/454 458/781/458 519/782/519 +f 519/782/519 515/777/515 454/776/454 +f 515/777/515 519/782/519 520/783/520 +f 520/783/520 516/778/516 515/777/515 +f 516/778/516 520/783/520 521/784/521 +f 521/784/521 517/779/517 516/778/516 +f 517/779/517 521/784/521 522/785/522 +f 522/785/522 518/780/518 517/779/517 +f 458/781/458 462/786/462 523/787/523 +f 523/787/523 519/782/519 458/781/458 +f 519/782/519 523/787/523 524/788/524 +f 524/788/524 520/783/520 519/782/519 +f 520/783/520 524/788/524 525/789/525 +f 525/789/525 521/784/521 520/783/520 +f 521/784/521 525/789/525 526/790/526 +f 526/790/526 522/785/522 521/784/521 +f 462/786/462 466/791/466 527/792/527 +f 527/792/527 523/787/523 462/786/462 +f 523/787/523 527/792/527 528/793/528 +f 528/793/528 524/788/524 523/787/523 +f 524/788/524 528/793/528 529/794/529 +f 529/794/529 525/789/525 524/788/524 +f 525/789/525 529/794/529 530/795/530 +f 530/795/530 526/790/526 525/789/525 +f 466/791/466 406/796/406 467/797/467 +f 467/797/467 527/792/527 466/791/466 +f 527/792/527 467/797/467 468/798/468 +f 468/798/468 528/793/528 527/792/527 +f 528/793/528 468/798/468 469/799/469 +f 469/799/469 529/794/529 528/793/528 +f 529/794/529 469/799/469 470/800/470 +f 470/800/470 530/795/530 529/794/529 +# 992 faces + +g From 2dba9554ea29dcbd4a84d42006e080ee5bec9502 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 13:02:48 -0700 Subject: [PATCH 063/482] draw teapot --- src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.rs b/src/main.rs index 09b37b6..377eddc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -214,8 +214,10 @@ impl strafe_client::framework::Example for Skybox { let mut modeldatas = Vec::::new(); add_obj(device,& mut modeldatas,include_bytes!("../models/teslacyberv3.0.obj")); add_obj(device,& mut modeldatas,include_bytes!("../models/suzanne.obj")); + add_obj(device,& mut modeldatas,include_bytes!("../models/teapot.obj")); println!("models.len = {:?}", modeldatas.len()); modeldatas[1].transform=glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)); + modeldatas[2].transform=glam::Affine3A::from_translation(glam::vec3(-10.,5.,10.)); let main_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: None, From 75695946a03f5520a0ec4a4418072c6a59c785fe Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 13:59:33 -0700 Subject: [PATCH 064/482] indexed rendering --- src/main.rs | 51 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/src/main.rs b/src/main.rs index 377eddc..ea2c3e9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,18 +12,20 @@ struct Vertex { } struct Entity { - vertex_count: u32, - vertex_buf: wgpu::Buffer, + index_count: u32, + index_buf: wgpu::Buffer, } //temp? struct ModelData { transform: glam::Affine3A, + vertex_buf: wgpu::Buffer, entities: Vec, } struct Model { transform: glam::Affine3A, + vertex_buf: wgpu::Buffer, entities: Vec, bind_group: wgpu::BindGroup, model_buf: wgpu::Buffer, @@ -165,34 +167,47 @@ fn get_transform_uniform_data(transform:&glam::Affine3A) -> [f32; 4*4] { fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,source:&[u8]){ let data = obj::ObjData::load_buf(&source[..]).unwrap(); let mut vertices = Vec::new(); + let mut vertex_index = std::collections::HashMap::::new(); for object in data.objects { let mut entities = Vec::::new(); for group in object.groups { - vertices.clear(); + let mut indices = Vec::new(); for poly in group.polys { for end_index in 2..poly.0.len() { for &index in &[0, end_index - 1, end_index] { - let obj::IndexTuple(position_id, _texture_id, normal_id) = - poly.0[index]; - vertices.push(Vertex { - pos: data.position[position_id], - normal: data.normal[normal_id.unwrap()], - }) + let vert = poly.0[index]; + if let Some(&i)=vertex_index.get(&vert){ + indices.push(i as u16); + }else{ + let i=vertices.len() as u16; + vertices.push(Vertex { + pos: data.position[vert.0], + normal: data.normal[vert.2.unwrap()], + }); + vertex_index.insert(vert,i); + indices.push(i); + } } } } - let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Vertex"), - contents: bytemuck::cast_slice(&vertices), - usage: wgpu::BufferUsages::VERTEX, + let index_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Index"), + contents: bytemuck::cast_slice(&indices), + usage: wgpu::BufferUsages::INDEX, }); entities.push(Entity { - vertex_count: vertices.len() as u32, - vertex_buf, + index_buf, + index_count: indices.len() as u32, }); } + let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Vertex"), + contents: bytemuck::cast_slice(&vertices), + usage: wgpu::BufferUsages::VERTEX, + }); modeldatas.push(ModelData { transform: glam::Affine3A::default(), + vertex_buf, entities, }) } @@ -512,6 +527,7 @@ impl strafe_client::framework::Example for Skybox { //all of these are being moved here models.push(Model{ transform: modeldata.transform, + vertex_buf:modeldata.vertex_buf, entities: modeldata.entities, bind_group: model_bind_group, model_buf: model_buf, @@ -700,10 +716,11 @@ impl strafe_client::framework::Example for Skybox { rpass.set_pipeline(&self.entity_pipeline); for model in self.models.iter() { rpass.set_bind_group(1, &model.bind_group, &[]); + rpass.set_vertex_buffer(0, model.vertex_buf.slice(..)); for entity in model.entities.iter() { - rpass.set_vertex_buffer(0, entity.vertex_buf.slice(..)); - rpass.draw(0..entity.vertex_count, 0..1); + rpass.set_index_buffer(entity.index_buf.slice(..), wgpu::IndexFormat::Uint16); + rpass.draw_indexed(0..entity.index_count, 0, 0..1); } } From fd34fbe36752ad866bf1c07a530c667bfa744c4f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 13:59:47 -0700 Subject: [PATCH 065/482] save 1 nanosecond --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index ea2c3e9..090908d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -506,7 +506,7 @@ impl strafe_client::framework::Example for Skybox { }); //drain the modeldata vec so entities can be /moved/ to models.entities - let mut models = Vec::::new(); + let mut models = Vec::::with_capacity(modeldatas.len()); for (i,modeldata) in modeldatas.drain(..).enumerate() { let model_uniforms = get_transform_uniform_data(&modeldata.transform); let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { From a9977c0bd2b93e44e2506fc296a4cabca413d499 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 14:13:40 -0700 Subject: [PATCH 066/482] fix cam_pos bug --- src/main.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 090908d..924e7ca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -107,15 +107,15 @@ impl Camera { self.fov/5.0 }; let proj = perspective_rh(fov, aspect, 1.0, 200.0); - let view = (glam::Mat4::from_translation(self.pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32)).inverse(); + let view = glam::Mat4::from_translation(self.pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32); + let view_inv = view.inverse(); let proj_inv = proj.inverse(); let mut raw = [0f32; 16 * 3 + 4]; raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); - raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view)[..]); - raw[48..51].copy_from_slice(AsRef::<[f32; 3]>::as_ref(&self.pos)); - raw[51] = 1.0;//cam_pos is vec4 + raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view_inv)[..]); + raw[48..52].copy_from_slice(AsRef::<[f32; 4]>::as_ref(&view.col(3))); raw } } From 5fb9f8b1bce2f7b8d30f9618b1feee2f261570f8 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 14:18:31 -0700 Subject: [PATCH 067/482] tweak matrices --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 924e7ca..b8d66d4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -106,10 +106,10 @@ impl Camera { }else{ self.fov/5.0 }; - let proj = perspective_rh(fov, aspect, 1.0, 200.0); + let proj = perspective_rh(fov, aspect, 0.5, 1000.0); + let proj_inv = proj.inverse(); let view = glam::Mat4::from_translation(self.pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32); let view_inv = view.inverse(); - let proj_inv = proj.inverse(); let mut raw = [0f32; 16 * 3 + 4]; raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); From 8aad878d4949beb024571ff3ab86206178a36881 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 14:11:56 -0700 Subject: [PATCH 068/482] texture coordinates + fake fresnel using dot --- src/main.rs | 4 +++- src/shader.wgsl | 14 ++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index b8d66d4..bd20b34 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ const IMAGE_SIZE: u32 = 128; #[repr(C)] struct Vertex { pos: [f32; 3], + texture: [f32; 2], normal: [f32; 3], } @@ -182,6 +183,7 @@ fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,source:&[u8]){ let i=vertices.len() as u16; vertices.push(Vertex { pos: data.position[vert.0], + texture: data.texture[vert.1.unwrap()], normal: data.normal[vert.2.unwrap()], }); vertex_index.insert(vert,i); @@ -353,7 +355,7 @@ impl strafe_client::framework::Example for Skybox { buffers: &[wgpu::VertexBufferLayout { array_stride: std::mem::size_of::() as wgpu::BufferAddress, step_mode: wgpu::VertexStepMode::Vertex, - attributes: &wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x3], + attributes: &wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x2, 2 => Float32x3], }], }, fragment: Some(wgpu::FragmentState { diff --git a/src/shader.wgsl b/src/shader.wgsl index fe4ee93..c3e98ad 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -63,7 +63,8 @@ fn vs_ground(@builtin(vertex_index) vertex_index: u32) -> GroundOutput { struct EntityOutput { @builtin(position) position: vec4, - @location(1) normal: vec3, + @location(1) texture: vec2, + @location(2) normal: vec3, @location(3) view: vec3, }; @@ -74,11 +75,13 @@ var r_EntityTransform: mat4x4; @vertex fn vs_entity( @location(0) pos: vec3, - @location(1) normal: vec3, + @location(1) texture: vec2, + @location(2) normal: vec3, ) -> EntityOutput { var position: vec4 = r_EntityTransform * vec4(pos, 1.0); var result: EntityOutput; result.normal = (r_EntityTransform * vec4(normal, 0.0)).xyz; + result.texture=texture; result.view = position.xyz - r_data.cam_pos.xyz; result.position = r_data.proj * r_data.view * position; return result; @@ -100,10 +103,13 @@ fn fs_sky(vertex: SkyOutput) -> @location(0) vec4 { fn fs_entity(vertex: EntityOutput) -> @location(0) vec4 { let incident = normalize(vertex.view); let normal = normalize(vertex.normal); - let reflected = incident - 2.0 * dot(normal, incident) * normal; + let d = dot(normal, incident); + let reflected = incident - 2.0 * d * normal; + let dir = vec3(-1.0)+2.0*vec3(vertex.texture.x,0.0,vertex.texture.y); + let texture_color = textureSample(r_texture, r_sampler, dir).rgb; let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb; - return vec4(vec3(0.1) + 0.5 * reflected_color, 1.0); + return vec4(mix(vec3(0.1) + 0.5 * reflected_color,texture_color,abs(d)), 1.0); } fn modulo_euclidean (a: f32, b: f32) -> f32 { From 355956e532b923f4f62c14d43d04d411a05f1e5c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 14:30:30 -0700 Subject: [PATCH 069/482] change equation for bigger reflectionless area --- src/shader.wgsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shader.wgsl b/src/shader.wgsl index c3e98ad..dd55d4e 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -109,7 +109,7 @@ fn fs_entity(vertex: EntityOutput) -> @location(0) vec4 { let dir = vec3(-1.0)+2.0*vec3(vertex.texture.x,0.0,vertex.texture.y); let texture_color = textureSample(r_texture, r_sampler, dir).rgb; let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb; - return vec4(mix(vec3(0.1) + 0.5 * reflected_color,texture_color,abs(d)), 1.0); + return vec4(mix(vec3(0.1) + 0.5 * reflected_color,texture_color,1.0-pow(1.0-abs(d),2.0)), 1.0); } fn modulo_euclidean (a: f32, b: f32) -> f32 { From 7effceff03b93cd33fdd7341911521422ed4f83e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 14:39:44 -0700 Subject: [PATCH 070/482] convert spaces to tabs --- src/framework.rs | 820 ++++++++++++++--------------- src/main.rs | 1302 +++++++++++++++++++++++----------------------- src/shader.wgsl | 148 +++--- 3 files changed, 1135 insertions(+), 1135 deletions(-) diff --git a/src/framework.rs b/src/framework.rs index 3fe157c..d18609f 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -6,438 +6,438 @@ use std::time::Instant; #[cfg(target_arch = "wasm32")] use web_sys::{ImageBitmapRenderingContext, OffscreenCanvas}; use winit::{ - event::{self, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + event::{self, WindowEvent}, + event_loop::{ControlFlow, EventLoop}, }; #[allow(dead_code)] pub fn cast_slice(data: &[T]) -> &[u8] { - use std::{mem::size_of, slice::from_raw_parts}; + use std::{mem::size_of, slice::from_raw_parts}; - unsafe { from_raw_parts(data.as_ptr() as *const u8, data.len() * size_of::()) } + unsafe { from_raw_parts(data.as_ptr() as *const u8, data.len() * size_of::()) } } #[allow(dead_code)] pub enum ShaderStage { - Vertex, - Fragment, - Compute, + Vertex, + Fragment, + Compute, } pub trait Example: 'static + Sized { - fn optional_features() -> wgpu::Features { - wgpu::Features::empty() - } - fn required_features() -> wgpu::Features { - wgpu::Features::empty() - } - fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities { - wgpu::DownlevelCapabilities { - flags: wgpu::DownlevelFlags::empty(), - shader_model: wgpu::ShaderModel::Sm5, - ..wgpu::DownlevelCapabilities::default() - } - } - fn required_limits() -> wgpu::Limits { - wgpu::Limits::downlevel_webgl2_defaults() // These downlevel limits will allow the code to run on all possible hardware - } - fn init( - config: &wgpu::SurfaceConfiguration, - adapter: &wgpu::Adapter, - device: &wgpu::Device, - queue: &wgpu::Queue, - ) -> Self; - fn resize( - &mut self, - config: &wgpu::SurfaceConfiguration, - device: &wgpu::Device, - queue: &wgpu::Queue, - ); - fn update(&mut self, event: WindowEvent); - fn move_mouse(&mut self, delta: (f64,f64)); - fn render( - &mut self, - view: &wgpu::TextureView, - device: &wgpu::Device, - queue: &wgpu::Queue, - spawner: &Spawner, - ); + fn optional_features() -> wgpu::Features { + wgpu::Features::empty() + } + fn required_features() -> wgpu::Features { + wgpu::Features::empty() + } + fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities { + wgpu::DownlevelCapabilities { + flags: wgpu::DownlevelFlags::empty(), + shader_model: wgpu::ShaderModel::Sm5, + ..wgpu::DownlevelCapabilities::default() + } + } + fn required_limits() -> wgpu::Limits { + wgpu::Limits::downlevel_webgl2_defaults() // These downlevel limits will allow the code to run on all possible hardware + } + fn init( + config: &wgpu::SurfaceConfiguration, + adapter: &wgpu::Adapter, + device: &wgpu::Device, + queue: &wgpu::Queue, + ) -> Self; + fn resize( + &mut self, + config: &wgpu::SurfaceConfiguration, + device: &wgpu::Device, + queue: &wgpu::Queue, + ); + fn update(&mut self, event: WindowEvent); + fn move_mouse(&mut self, delta: (f64,f64)); + fn render( + &mut self, + view: &wgpu::TextureView, + device: &wgpu::Device, + queue: &wgpu::Queue, + spawner: &Spawner, + ); } struct Setup { - window: winit::window::Window, - event_loop: EventLoop<()>, - instance: wgpu::Instance, - size: winit::dpi::PhysicalSize, - surface: wgpu::Surface, - adapter: wgpu::Adapter, - device: wgpu::Device, - queue: wgpu::Queue, - #[cfg(target_arch = "wasm32")] - offscreen_canvas_setup: Option, + window: winit::window::Window, + event_loop: EventLoop<()>, + instance: wgpu::Instance, + size: winit::dpi::PhysicalSize, + surface: wgpu::Surface, + adapter: wgpu::Adapter, + device: wgpu::Device, + queue: wgpu::Queue, + #[cfg(target_arch = "wasm32")] + offscreen_canvas_setup: Option, } #[cfg(target_arch = "wasm32")] struct OffscreenCanvasSetup { - offscreen_canvas: OffscreenCanvas, - bitmap_renderer: ImageBitmapRenderingContext, + offscreen_canvas: OffscreenCanvas, + bitmap_renderer: ImageBitmapRenderingContext, } async fn setup(title: &str) -> Setup { - #[cfg(not(target_arch = "wasm32"))] - { - env_logger::init(); - }; + #[cfg(not(target_arch = "wasm32"))] + { + env_logger::init(); + }; - let event_loop = EventLoop::new(); - let mut builder = winit::window::WindowBuilder::new(); - builder = builder.with_title(title); - #[cfg(windows_OFF)] // TODO - { - use winit::platform::windows::WindowBuilderExtWindows; - builder = builder.with_no_redirection_bitmap(true); - } - let window = builder.build(&event_loop).unwrap(); + let event_loop = EventLoop::new(); + let mut builder = winit::window::WindowBuilder::new(); + builder = builder.with_title(title); + #[cfg(windows_OFF)] // TODO + { + use winit::platform::windows::WindowBuilderExtWindows; + builder = builder.with_no_redirection_bitmap(true); + } + let window = builder.build(&event_loop).unwrap(); - #[cfg(target_arch = "wasm32")] - { - use winit::platform::web::WindowExtWebSys; - let query_string = web_sys::window().unwrap().location().search().unwrap(); - let level: log::Level = parse_url_query_string(&query_string, "RUST_LOG") - .and_then(|x| x.parse().ok()) - .unwrap_or(log::Level::Error); - console_log::init_with_level(level).expect("could not initialize logger"); - std::panic::set_hook(Box::new(console_error_panic_hook::hook)); - // On wasm, append the canvas to the document body - web_sys::window() - .and_then(|win| win.document()) - .and_then(|doc| doc.body()) - .and_then(|body| { - body.append_child(&web_sys::Element::from(window.canvas())) - .ok() - }) - .expect("couldn't append canvas to document body"); - } + #[cfg(target_arch = "wasm32")] + { + use winit::platform::web::WindowExtWebSys; + let query_string = web_sys::window().unwrap().location().search().unwrap(); + let level: log::Level = parse_url_query_string(&query_string, "RUST_LOG") + .and_then(|x| x.parse().ok()) + .unwrap_or(log::Level::Error); + console_log::init_with_level(level).expect("could not initialize logger"); + std::panic::set_hook(Box::new(console_error_panic_hook::hook)); + // On wasm, append the canvas to the document body + web_sys::window() + .and_then(|win| win.document()) + .and_then(|doc| doc.body()) + .and_then(|body| { + body.append_child(&web_sys::Element::from(window.canvas())) + .ok() + }) + .expect("couldn't append canvas to document body"); + } - #[cfg(target_arch = "wasm32")] - let mut offscreen_canvas_setup: Option = None; - #[cfg(target_arch = "wasm32")] - { - use wasm_bindgen::JsCast; - use winit::platform::web::WindowExtWebSys; + #[cfg(target_arch = "wasm32")] + let mut offscreen_canvas_setup: Option = None; + #[cfg(target_arch = "wasm32")] + { + use wasm_bindgen::JsCast; + use winit::platform::web::WindowExtWebSys; - let query_string = web_sys::window().unwrap().location().search().unwrap(); - if let Some(offscreen_canvas_param) = - parse_url_query_string(&query_string, "offscreen_canvas") - { - if FromStr::from_str(offscreen_canvas_param) == Ok(true) { - log::info!("Creating OffscreenCanvasSetup"); + let query_string = web_sys::window().unwrap().location().search().unwrap(); + if let Some(offscreen_canvas_param) = + parse_url_query_string(&query_string, "offscreen_canvas") + { + if FromStr::from_str(offscreen_canvas_param) == Ok(true) { + log::info!("Creating OffscreenCanvasSetup"); - let offscreen_canvas = - OffscreenCanvas::new(1024, 768).expect("couldn't create OffscreenCanvas"); + let offscreen_canvas = + OffscreenCanvas::new(1024, 768).expect("couldn't create OffscreenCanvas"); - let bitmap_renderer = window - .canvas() - .get_context("bitmaprenderer") - .expect("couldn't create ImageBitmapRenderingContext (Result)") - .expect("couldn't create ImageBitmapRenderingContext (Option)") - .dyn_into::() - .expect("couldn't convert into ImageBitmapRenderingContext"); + let bitmap_renderer = window + .canvas() + .get_context("bitmaprenderer") + .expect("couldn't create ImageBitmapRenderingContext (Result)") + .expect("couldn't create ImageBitmapRenderingContext (Option)") + .dyn_into::() + .expect("couldn't convert into ImageBitmapRenderingContext"); - offscreen_canvas_setup = Some(OffscreenCanvasSetup { - offscreen_canvas, - bitmap_renderer, - }) - } - } - }; + offscreen_canvas_setup = Some(OffscreenCanvasSetup { + offscreen_canvas, + bitmap_renderer, + }) + } + } + }; - log::info!("Initializing the surface..."); + log::info!("Initializing the surface..."); - let backends = wgpu::util::backend_bits_from_env().unwrap_or_else(wgpu::Backends::all); - let dx12_shader_compiler = wgpu::util::dx12_shader_compiler_from_env().unwrap_or_default(); + let backends = wgpu::util::backend_bits_from_env().unwrap_or_else(wgpu::Backends::all); + let dx12_shader_compiler = wgpu::util::dx12_shader_compiler_from_env().unwrap_or_default(); - let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { - backends, - dx12_shader_compiler, - }); - let (size, surface) = unsafe { - let size = window.inner_size(); + let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + backends, + dx12_shader_compiler, + }); + let (size, surface) = unsafe { + let size = window.inner_size(); - #[cfg(any(not(target_arch = "wasm32"), target_os = "emscripten"))] - let surface = instance.create_surface(&window).unwrap(); - #[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))] - let surface = { - if let Some(offscreen_canvas_setup) = &offscreen_canvas_setup { - log::info!("Creating surface from OffscreenCanvas"); - instance.create_surface_from_offscreen_canvas( - offscreen_canvas_setup.offscreen_canvas.clone(), - ) - } else { - instance.create_surface(&window) - } - } - .unwrap(); + #[cfg(any(not(target_arch = "wasm32"), target_os = "emscripten"))] + let surface = instance.create_surface(&window).unwrap(); + #[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))] + let surface = { + if let Some(offscreen_canvas_setup) = &offscreen_canvas_setup { + log::info!("Creating surface from OffscreenCanvas"); + instance.create_surface_from_offscreen_canvas( + offscreen_canvas_setup.offscreen_canvas.clone(), + ) + } else { + instance.create_surface(&window) + } + } + .unwrap(); - (size, surface) - }; - let adapter = wgpu::util::initialize_adapter_from_env_or_default(&instance, Some(&surface)) - .await - .expect("No suitable GPU adapters found on the system!"); + (size, surface) + }; + let adapter = wgpu::util::initialize_adapter_from_env_or_default(&instance, Some(&surface)) + .await + .expect("No suitable GPU adapters found on the system!"); - #[cfg(not(target_arch = "wasm32"))] - { - let adapter_info = adapter.get_info(); - println!("Using {} ({:?})", adapter_info.name, adapter_info.backend); - } + #[cfg(not(target_arch = "wasm32"))] + { + let adapter_info = adapter.get_info(); + println!("Using {} ({:?})", adapter_info.name, adapter_info.backend); + } - let optional_features = E::optional_features(); - let required_features = E::required_features(); - let adapter_features = adapter.features(); - assert!( - adapter_features.contains(required_features), - "Adapter does not support required features for this example: {:?}", - required_features - adapter_features - ); + let optional_features = E::optional_features(); + let required_features = E::required_features(); + let adapter_features = adapter.features(); + assert!( + adapter_features.contains(required_features), + "Adapter does not support required features for this example: {:?}", + required_features - adapter_features + ); - let required_downlevel_capabilities = E::required_downlevel_capabilities(); - let downlevel_capabilities = adapter.get_downlevel_capabilities(); - assert!( - downlevel_capabilities.shader_model >= required_downlevel_capabilities.shader_model, - "Adapter does not support the minimum shader model required to run this example: {:?}", - required_downlevel_capabilities.shader_model - ); - assert!( - downlevel_capabilities - .flags - .contains(required_downlevel_capabilities.flags), - "Adapter does not support the downlevel capabilities required to run this example: {:?}", - required_downlevel_capabilities.flags - downlevel_capabilities.flags - ); + let required_downlevel_capabilities = E::required_downlevel_capabilities(); + let downlevel_capabilities = adapter.get_downlevel_capabilities(); + assert!( + downlevel_capabilities.shader_model >= required_downlevel_capabilities.shader_model, + "Adapter does not support the minimum shader model required to run this example: {:?}", + required_downlevel_capabilities.shader_model + ); + assert!( + downlevel_capabilities + .flags + .contains(required_downlevel_capabilities.flags), + "Adapter does not support the downlevel capabilities required to run this example: {:?}", + required_downlevel_capabilities.flags - downlevel_capabilities.flags + ); - // Make sure we use the texture resolution limits from the adapter, so we can support images the size of the surface. - let needed_limits = E::required_limits().using_resolution(adapter.limits()); + // Make sure we use the texture resolution limits from the adapter, so we can support images the size of the surface. + let needed_limits = E::required_limits().using_resolution(adapter.limits()); - let trace_dir = std::env::var("WGPU_TRACE"); - let (device, queue) = adapter - .request_device( - &wgpu::DeviceDescriptor { - label: None, - features: (optional_features & adapter_features) | required_features, - limits: needed_limits, - }, - trace_dir.ok().as_ref().map(std::path::Path::new), - ) - .await - .expect("Unable to find a suitable GPU adapter!"); + let trace_dir = std::env::var("WGPU_TRACE"); + let (device, queue) = adapter + .request_device( + &wgpu::DeviceDescriptor { + label: None, + features: (optional_features & adapter_features) | required_features, + limits: needed_limits, + }, + trace_dir.ok().as_ref().map(std::path::Path::new), + ) + .await + .expect("Unable to find a suitable GPU adapter!"); - Setup { - window, - event_loop, - instance, - size, - surface, - adapter, - device, - queue, - #[cfg(target_arch = "wasm32")] - offscreen_canvas_setup, - } + Setup { + window, + event_loop, + instance, + size, + surface, + adapter, + device, + queue, + #[cfg(target_arch = "wasm32")] + offscreen_canvas_setup, + } } fn start( - #[cfg(not(target_arch = "wasm32"))] Setup { - window, - event_loop, - instance, - size, - surface, - adapter, - device, - queue, - }: Setup, - #[cfg(target_arch = "wasm32")] Setup { - window, - event_loop, - instance, - size, - surface, - adapter, - device, - queue, - offscreen_canvas_setup, - }: Setup, + #[cfg(not(target_arch = "wasm32"))] Setup { + window, + event_loop, + instance, + size, + surface, + adapter, + device, + queue, + }: Setup, + #[cfg(target_arch = "wasm32")] Setup { + window, + event_loop, + instance, + size, + surface, + adapter, + device, + queue, + offscreen_canvas_setup, + }: Setup, ) { - let spawner = Spawner::new(); - let mut config = surface - .get_default_config(&adapter, size.width, size.height) - .expect("Surface isn't supported by the adapter."); - let surface_view_format = config.format.add_srgb_suffix(); - config.view_formats.push(surface_view_format); - surface.configure(&device, &config); + let spawner = Spawner::new(); + let mut config = surface + .get_default_config(&adapter, size.width, size.height) + .expect("Surface isn't supported by the adapter."); + let surface_view_format = config.format.add_srgb_suffix(); + config.view_formats.push(surface_view_format); + surface.configure(&device, &config); - log::info!("Initializing the example..."); - let mut example = E::init(&config, &adapter, &device, &queue); + log::info!("Initializing the example..."); + let mut example = E::init(&config, &adapter, &device, &queue); - #[cfg(not(target_arch = "wasm32"))] - let mut last_frame_inst = Instant::now(); - #[cfg(not(target_arch = "wasm32"))] - let (mut frame_count, mut accum_time) = (0, 0.0); + #[cfg(not(target_arch = "wasm32"))] + let mut last_frame_inst = Instant::now(); + #[cfg(not(target_arch = "wasm32"))] + let (mut frame_count, mut accum_time) = (0, 0.0); - log::info!("Entering render loop..."); - event_loop.run(move |event, _, control_flow| { - let _ = (&instance, &adapter); // force ownership by the closure - *control_flow = if cfg!(feature = "metal-auto-capture") { - ControlFlow::Exit - } else { - ControlFlow::Poll - }; - match event { - event::Event::RedrawEventsCleared => { - #[cfg(not(target_arch = "wasm32"))] - spawner.run_until_stalled(); + log::info!("Entering render loop..."); + event_loop.run(move |event, _, control_flow| { + let _ = (&instance, &adapter); // force ownership by the closure + *control_flow = if cfg!(feature = "metal-auto-capture") { + ControlFlow::Exit + } else { + ControlFlow::Poll + }; + match event { + event::Event::RedrawEventsCleared => { + #[cfg(not(target_arch = "wasm32"))] + spawner.run_until_stalled(); - window.request_redraw(); - } - event::Event::WindowEvent { - event: - WindowEvent::Resized(size) - | WindowEvent::ScaleFactorChanged { - new_inner_size: &mut size, - .. - }, - .. - } => { - // Once winit is fixed, the detection conditions here can be removed. - // https://github.com/rust-windowing/winit/issues/2876 - let max_dimension = adapter.limits().max_texture_dimension_2d; - if size.width > max_dimension || size.height > max_dimension { - log::warn!( - "The resizing size {:?} exceeds the limit of {}.", - size, - max_dimension - ); - } else { - log::info!("Resizing to {:?}", size); - config.width = size.width.max(1); - config.height = size.height.max(1); - example.resize(&config, &device, &queue); - surface.configure(&device, &config); - } - } - event::Event::WindowEvent { event, .. } => match event { - WindowEvent::KeyboardInput { - input: - event::KeyboardInput { - virtual_keycode: Some(event::VirtualKeyCode::Escape), - state: event::ElementState::Pressed, - .. - }, - .. - } - | WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - #[cfg(not(target_arch = "wasm32"))] - WindowEvent::KeyboardInput { - input: - event::KeyboardInput { - virtual_keycode: Some(event::VirtualKeyCode::R), - state: event::ElementState::Pressed, - .. - }, - .. - } => { - println!("{:#?}", instance.generate_report()); - } - _ => { - example.update(event); - } - }, - event::Event::DeviceEvent { - event: - winit::event::DeviceEvent::MouseMotion { - delta, - }, - .. - } => { - example.move_mouse(delta); - }, - event::Event::RedrawRequested(_) => { - #[cfg(not(target_arch = "wasm32"))] - { - accum_time += last_frame_inst.elapsed().as_secs_f32(); - last_frame_inst = Instant::now(); - frame_count += 1; - if frame_count == 100 { - println!( - "Avg frame time {}ms", - accum_time * 1000.0 / frame_count as f32 - ); - accum_time = 0.0; - frame_count = 0; - } - } + window.request_redraw(); + } + event::Event::WindowEvent { + event: + WindowEvent::Resized(size) + | WindowEvent::ScaleFactorChanged { + new_inner_size: &mut size, + .. + }, + .. + } => { + // Once winit is fixed, the detection conditions here can be removed. + // https://github.com/rust-windowing/winit/issues/2876 + let max_dimension = adapter.limits().max_texture_dimension_2d; + if size.width > max_dimension || size.height > max_dimension { + log::warn!( + "The resizing size {:?} exceeds the limit of {}.", + size, + max_dimension + ); + } else { + log::info!("Resizing to {:?}", size); + config.width = size.width.max(1); + config.height = size.height.max(1); + example.resize(&config, &device, &queue); + surface.configure(&device, &config); + } + } + event::Event::WindowEvent { event, .. } => match event { + WindowEvent::KeyboardInput { + input: + event::KeyboardInput { + virtual_keycode: Some(event::VirtualKeyCode::Escape), + state: event::ElementState::Pressed, + .. + }, + .. + } + | WindowEvent::CloseRequested => { + *control_flow = ControlFlow::Exit; + } + #[cfg(not(target_arch = "wasm32"))] + WindowEvent::KeyboardInput { + input: + event::KeyboardInput { + virtual_keycode: Some(event::VirtualKeyCode::R), + state: event::ElementState::Pressed, + .. + }, + .. + } => { + println!("{:#?}", instance.generate_report()); + } + _ => { + example.update(event); + } + }, + event::Event::DeviceEvent { + event: + winit::event::DeviceEvent::MouseMotion { + delta, + }, + .. + } => { + example.move_mouse(delta); + }, + event::Event::RedrawRequested(_) => { + #[cfg(not(target_arch = "wasm32"))] + { + accum_time += last_frame_inst.elapsed().as_secs_f32(); + last_frame_inst = Instant::now(); + frame_count += 1; + if frame_count == 100 { + println!( + "Avg frame time {}ms", + accum_time * 1000.0 / frame_count as f32 + ); + accum_time = 0.0; + frame_count = 0; + } + } - let frame = match surface.get_current_texture() { - Ok(frame) => frame, - Err(_) => { - surface.configure(&device, &config); - surface - .get_current_texture() - .expect("Failed to acquire next surface texture!") - } - }; - let view = frame.texture.create_view(&wgpu::TextureViewDescriptor { - format: Some(surface_view_format), - ..wgpu::TextureViewDescriptor::default() - }); + let frame = match surface.get_current_texture() { + Ok(frame) => frame, + Err(_) => { + surface.configure(&device, &config); + surface + .get_current_texture() + .expect("Failed to acquire next surface texture!") + } + }; + let view = frame.texture.create_view(&wgpu::TextureViewDescriptor { + format: Some(surface_view_format), + ..wgpu::TextureViewDescriptor::default() + }); - example.render(&view, &device, &queue, &spawner); + example.render(&view, &device, &queue, &spawner); - frame.present(); + frame.present(); - #[cfg(target_arch = "wasm32")] - { - if let Some(offscreen_canvas_setup) = &offscreen_canvas_setup { - let image_bitmap = offscreen_canvas_setup - .offscreen_canvas - .transfer_to_image_bitmap() - .expect("couldn't transfer offscreen canvas to image bitmap."); - offscreen_canvas_setup - .bitmap_renderer - .transfer_from_image_bitmap(&image_bitmap); + #[cfg(target_arch = "wasm32")] + { + if let Some(offscreen_canvas_setup) = &offscreen_canvas_setup { + let image_bitmap = offscreen_canvas_setup + .offscreen_canvas + .transfer_to_image_bitmap() + .expect("couldn't transfer offscreen canvas to image bitmap."); + offscreen_canvas_setup + .bitmap_renderer + .transfer_from_image_bitmap(&image_bitmap); - log::info!("Transferring OffscreenCanvas to ImageBitmapRenderer"); - } - } - } - _ => {} - } - }); + log::info!("Transferring OffscreenCanvas to ImageBitmapRenderer"); + } + } + } + _ => {} + } + }); } #[cfg(not(target_arch = "wasm32"))] pub struct Spawner<'a> { - executor: async_executor::LocalExecutor<'a>, + executor: async_executor::LocalExecutor<'a>, } #[cfg(not(target_arch = "wasm32"))] impl<'a> Spawner<'a> { - fn new() -> Self { - Self { - executor: async_executor::LocalExecutor::new(), - } - } + fn new() -> Self { + Self { + executor: async_executor::LocalExecutor::new(), + } + } - #[allow(dead_code)] - pub fn spawn_local(&self, future: impl Future + 'a) { - self.executor.spawn(future).detach(); - } + #[allow(dead_code)] + pub fn spawn_local(&self, future: impl Future + 'a) { + self.executor.spawn(future).detach(); + } - fn run_until_stalled(&self) { - while self.executor.try_tick() {} - } + fn run_until_stalled(&self) { + while self.executor.try_tick() {} + } } #[cfg(target_arch = "wasm32")] @@ -445,69 +445,69 @@ pub struct Spawner {} #[cfg(target_arch = "wasm32")] impl Spawner { - fn new() -> Self { - Self {} - } + fn new() -> Self { + Self {} + } - #[allow(dead_code)] - pub fn spawn_local(&self, future: impl Future + 'static) { - wasm_bindgen_futures::spawn_local(future); - } + #[allow(dead_code)] + pub fn spawn_local(&self, future: impl Future + 'static) { + wasm_bindgen_futures::spawn_local(future); + } } #[cfg(not(target_arch = "wasm32"))] pub fn run(title: &str) { - let setup = pollster::block_on(setup::(title)); - start::(setup); + let setup = pollster::block_on(setup::(title)); + start::(setup); } #[cfg(target_arch = "wasm32")] pub fn run(title: &str) { - use wasm_bindgen::prelude::*; + use wasm_bindgen::prelude::*; - let title = title.to_owned(); - wasm_bindgen_futures::spawn_local(async move { - let setup = setup::(&title).await; - let start_closure = Closure::once_into_js(move || start::(setup)); + let title = title.to_owned(); + wasm_bindgen_futures::spawn_local(async move { + let setup = setup::(&title).await; + let start_closure = Closure::once_into_js(move || start::(setup)); - // make sure to handle JS exceptions thrown inside start. - // Otherwise wasm_bindgen_futures Queue would break and never handle any tasks again. - // This is required, because winit uses JS exception for control flow to escape from `run`. - if let Err(error) = call_catch(&start_closure) { - let is_control_flow_exception = error.dyn_ref::().map_or(false, |e| { - e.message().includes("Using exceptions for control flow", 0) - }); + // make sure to handle JS exceptions thrown inside start. + // Otherwise wasm_bindgen_futures Queue would break and never handle any tasks again. + // This is required, because winit uses JS exception for control flow to escape from `run`. + if let Err(error) = call_catch(&start_closure) { + let is_control_flow_exception = error.dyn_ref::().map_or(false, |e| { + e.message().includes("Using exceptions for control flow", 0) + }); - if !is_control_flow_exception { - web_sys::console::error_1(&error); - } - } + if !is_control_flow_exception { + web_sys::console::error_1(&error); + } + } - #[wasm_bindgen] - extern "C" { - #[wasm_bindgen(catch, js_namespace = Function, js_name = "prototype.call.call")] - fn call_catch(this: &JsValue) -> Result<(), JsValue>; - } - }); + #[wasm_bindgen] + extern "C" { + #[wasm_bindgen(catch, js_namespace = Function, js_name = "prototype.call.call")] + fn call_catch(this: &JsValue) -> Result<(), JsValue>; + } + }); } #[cfg(target_arch = "wasm32")] /// Parse the query string as returned by `web_sys::window()?.location().search()?` and get a /// specific key out of it. pub fn parse_url_query_string<'a>(query: &'a str, search_key: &str) -> Option<&'a str> { - let query_string = query.strip_prefix('?')?; + let query_string = query.strip_prefix('?')?; - for pair in query_string.split('&') { - let mut pair = pair.split('='); - let key = pair.next()?; - let value = pair.next()?; + for pair in query_string.split('&') { + let mut pair = pair.split('='); + let key = pair.next()?; + let value = pair.next()?; - if key == search_key { - return Some(value); - } - } + if key == search_key { + return Some(value); + } + } - None + None } // This allows treating the framework as a standalone example, diff --git a/src/main.rs b/src/main.rs index bd20b34..dce64d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,47 +7,47 @@ const IMAGE_SIZE: u32 = 128; #[derive(Clone, Copy, Pod, Zeroable)] #[repr(C)] struct Vertex { - pos: [f32; 3], - texture: [f32; 2], - normal: [f32; 3], + pos: [f32; 3], + texture: [f32; 2], + normal: [f32; 3], } struct Entity { - index_count: u32, - index_buf: wgpu::Buffer, + index_count: u32, + index_buf: wgpu::Buffer, } //temp? struct ModelData { - transform: glam::Affine3A, - vertex_buf: wgpu::Buffer, - entities: Vec, + transform: glam::Affine3A, + vertex_buf: wgpu::Buffer, + entities: Vec, } struct Model { - transform: glam::Affine3A, - vertex_buf: wgpu::Buffer, - entities: Vec, - bind_group: wgpu::BindGroup, - model_buf: wgpu::Buffer, + transform: glam::Affine3A, + vertex_buf: wgpu::Buffer, + entities: Vec, + bind_group: wgpu::BindGroup, + model_buf: wgpu::Buffer, } // Note: we use the Y=up coordinate space in this example. struct Camera { - time: Instant, - pos: glam::Vec3, - vel: glam::Vec3, - gravity: glam::Vec3, - friction: f32, - screen_size: (u32, u32), - offset: glam::Vec3, - fov: f32, - yaw: f32, - pitch: f32, - controls: u32, - mv: f32, - grounded: bool, - walkspeed: f32, + time: Instant, + pos: glam::Vec3, + vel: glam::Vec3, + gravity: glam::Vec3, + friction: f32, + screen_size: (u32, u32), + offset: glam::Vec3, + fov: f32, + yaw: f32, + pitch: f32, + controls: u32, + mv: f32, + grounded: bool, + walkspeed: f32, } const CONTROL_MOVEFORWARD:u32 = 0b00000001; @@ -64,687 +64,687 @@ const RIGHT_DIR:glam::Vec3 = glam::Vec3::new(1.0,0.0,0.0); const UP_DIR:glam::Vec3 = glam::Vec3::new(0.0,1.0,0.0); fn get_control_dir(controls: u32) -> glam::Vec3{ - //don't get fancy just do it - let mut control_dir:glam::Vec3 = glam::Vec3::new(0.0,0.0,0.0); - if controls & CONTROL_MOVEFORWARD == CONTROL_MOVEFORWARD { - control_dir+=FORWARD_DIR; - } - if controls & CONTROL_MOVEBACK == CONTROL_MOVEBACK { - control_dir+=-FORWARD_DIR; - } - if controls & CONTROL_MOVELEFT == CONTROL_MOVELEFT { - control_dir+=-RIGHT_DIR; - } - if controls & CONTROL_MOVERIGHT == CONTROL_MOVERIGHT { - control_dir+=RIGHT_DIR; - } - if controls & CONTROL_MOVEUP == CONTROL_MOVEUP { - control_dir+=UP_DIR; - } - if controls & CONTROL_MOVEDOWN == CONTROL_MOVEDOWN { - control_dir+=-UP_DIR; - } - return control_dir + //don't get fancy just do it + let mut control_dir:glam::Vec3 = glam::Vec3::new(0.0,0.0,0.0); + if controls & CONTROL_MOVEFORWARD == CONTROL_MOVEFORWARD { + control_dir+=FORWARD_DIR; + } + if controls & CONTROL_MOVEBACK == CONTROL_MOVEBACK { + control_dir+=-FORWARD_DIR; + } + if controls & CONTROL_MOVELEFT == CONTROL_MOVELEFT { + control_dir+=-RIGHT_DIR; + } + if controls & CONTROL_MOVERIGHT == CONTROL_MOVERIGHT { + control_dir+=RIGHT_DIR; + } + if controls & CONTROL_MOVEUP == CONTROL_MOVEUP { + control_dir+=UP_DIR; + } + if controls & CONTROL_MOVEDOWN == CONTROL_MOVEDOWN { + control_dir+=-UP_DIR; + } + return control_dir } - #[inline] - fn perspective_rh(fov_y_slope: f32, aspect_ratio: f32, z_near: f32, z_far: f32) -> glam::Mat4 { - //glam_assert!(z_near > 0.0 && z_far > 0.0); - let r = z_far / (z_near - z_far); - glam::Mat4::from_cols( - glam::Vec4::new(1.0/(fov_y_slope * aspect_ratio), 0.0, 0.0, 0.0), - glam::Vec4::new(0.0, 1.0/fov_y_slope, 0.0, 0.0), - glam::Vec4::new(0.0, 0.0, r, -1.0), - glam::Vec4::new(0.0, 0.0, r * z_near, 0.0), - ) - } + #[inline] + fn perspective_rh(fov_y_slope: f32, aspect_ratio: f32, z_near: f32, z_far: f32) -> glam::Mat4 { + //glam_assert!(z_near > 0.0 && z_far > 0.0); + let r = z_far / (z_near - z_far); + glam::Mat4::from_cols( + glam::Vec4::new(1.0/(fov_y_slope * aspect_ratio), 0.0, 0.0, 0.0), + glam::Vec4::new(0.0, 1.0/fov_y_slope, 0.0, 0.0), + glam::Vec4::new(0.0, 0.0, r, -1.0), + glam::Vec4::new(0.0, 0.0, r * z_near, 0.0), + ) + } impl Camera { - fn to_uniform_data(&self) -> [f32; 16 * 3 + 4] { - let aspect = self.screen_size.0 as f32 / self.screen_size.1 as f32; - let fov = if self.controls&CONTROL_ZOOM==0 { - self.fov - }else{ - self.fov/5.0 - }; - let proj = perspective_rh(fov, aspect, 0.5, 1000.0); - let proj_inv = proj.inverse(); - let view = glam::Mat4::from_translation(self.pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32); - let view_inv = view.inverse(); + fn to_uniform_data(&self) -> [f32; 16 * 3 + 4] { + let aspect = self.screen_size.0 as f32 / self.screen_size.1 as f32; + let fov = if self.controls&CONTROL_ZOOM==0 { + self.fov + }else{ + self.fov/5.0 + }; + let proj = perspective_rh(fov, aspect, 0.5, 1000.0); + let proj_inv = proj.inverse(); + let view = glam::Mat4::from_translation(self.pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32); + let view_inv = view.inverse(); - let mut raw = [0f32; 16 * 3 + 4]; - raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); - raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); - raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view_inv)[..]); - raw[48..52].copy_from_slice(AsRef::<[f32; 4]>::as_ref(&view.col(3))); - raw - } + let mut raw = [0f32; 16 * 3 + 4]; + raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); + raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); + raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view_inv)[..]); + raw[48..52].copy_from_slice(AsRef::<[f32; 4]>::as_ref(&view.col(3))); + raw + } } pub struct Skybox { - camera: Camera, - sky_pipeline: wgpu::RenderPipeline, - entity_pipeline: wgpu::RenderPipeline, - ground_pipeline: wgpu::RenderPipeline, - main_bind_group: wgpu::BindGroup, - camera_buf: wgpu::Buffer, - models: Vec, - depth_view: wgpu::TextureView, - staging_belt: wgpu::util::StagingBelt, + camera: Camera, + sky_pipeline: wgpu::RenderPipeline, + entity_pipeline: wgpu::RenderPipeline, + ground_pipeline: wgpu::RenderPipeline, + main_bind_group: wgpu::BindGroup, + camera_buf: wgpu::Buffer, + models: Vec, + depth_view: wgpu::TextureView, + staging_belt: wgpu::util::StagingBelt, } impl Skybox { - const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth24Plus; + const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth24Plus; - fn create_depth_texture( - config: &wgpu::SurfaceConfiguration, - device: &wgpu::Device, - ) -> wgpu::TextureView { - let depth_texture = device.create_texture(&wgpu::TextureDescriptor { - size: wgpu::Extent3d { - width: config.width, - height: config.height, - depth_or_array_layers: 1, - }, - mip_level_count: 1, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format: Self::DEPTH_FORMAT, - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - label: None, - view_formats: &[], - }); + fn create_depth_texture( + config: &wgpu::SurfaceConfiguration, + device: &wgpu::Device, + ) -> wgpu::TextureView { + let depth_texture = device.create_texture(&wgpu::TextureDescriptor { + size: wgpu::Extent3d { + width: config.width, + height: config.height, + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: Self::DEPTH_FORMAT, + usage: wgpu::TextureUsages::RENDER_ATTACHMENT, + label: None, + view_formats: &[], + }); - depth_texture.create_view(&wgpu::TextureViewDescriptor::default()) - } + depth_texture.create_view(&wgpu::TextureViewDescriptor::default()) + } } fn get_transform_uniform_data(transform:&glam::Affine3A) -> [f32; 4*4] { - let mut raw = [0f32; 4*4]; - raw[0..16].copy_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&glam::Mat4::from(*transform))[..]); - raw + let mut raw = [0f32; 4*4]; + raw[0..16].copy_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&glam::Mat4::from(*transform))[..]); + raw } fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,source:&[u8]){ - let data = obj::ObjData::load_buf(&source[..]).unwrap(); - let mut vertices = Vec::new(); - let mut vertex_index = std::collections::HashMap::::new(); - for object in data.objects { - let mut entities = Vec::::new(); - for group in object.groups { - let mut indices = Vec::new(); - for poly in group.polys { - for end_index in 2..poly.0.len() { - for &index in &[0, end_index - 1, end_index] { - let vert = poly.0[index]; - if let Some(&i)=vertex_index.get(&vert){ - indices.push(i as u16); - }else{ - let i=vertices.len() as u16; - vertices.push(Vertex { - pos: data.position[vert.0], - texture: data.texture[vert.1.unwrap()], - normal: data.normal[vert.2.unwrap()], - }); - vertex_index.insert(vert,i); - indices.push(i); - } - } - } - } - let index_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Index"), - contents: bytemuck::cast_slice(&indices), - usage: wgpu::BufferUsages::INDEX, - }); - entities.push(Entity { - index_buf, - index_count: indices.len() as u32, - }); - } - let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Vertex"), - contents: bytemuck::cast_slice(&vertices), - usage: wgpu::BufferUsages::VERTEX, - }); - modeldatas.push(ModelData { - transform: glam::Affine3A::default(), - vertex_buf, - entities, - }) - } + let data = obj::ObjData::load_buf(&source[..]).unwrap(); + let mut vertices = Vec::new(); + let mut vertex_index = std::collections::HashMap::::new(); + for object in data.objects { + let mut entities = Vec::::new(); + for group in object.groups { + let mut indices = Vec::new(); + for poly in group.polys { + for end_index in 2..poly.0.len() { + for &index in &[0, end_index - 1, end_index] { + let vert = poly.0[index]; + if let Some(&i)=vertex_index.get(&vert){ + indices.push(i as u16); + }else{ + let i=vertices.len() as u16; + vertices.push(Vertex { + pos: data.position[vert.0], + texture: data.texture[vert.1.unwrap()], + normal: data.normal[vert.2.unwrap()], + }); + vertex_index.insert(vert,i); + indices.push(i); + } + } + } + } + let index_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Index"), + contents: bytemuck::cast_slice(&indices), + usage: wgpu::BufferUsages::INDEX, + }); + entities.push(Entity { + index_buf, + index_count: indices.len() as u32, + }); + } + let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Vertex"), + contents: bytemuck::cast_slice(&vertices), + usage: wgpu::BufferUsages::VERTEX, + }); + modeldatas.push(ModelData { + transform: glam::Affine3A::default(), + vertex_buf, + entities, + }) + } } impl strafe_client::framework::Example for Skybox { - fn optional_features() -> wgpu::Features { - wgpu::Features::TEXTURE_COMPRESSION_ASTC - | wgpu::Features::TEXTURE_COMPRESSION_ETC2 - | wgpu::Features::TEXTURE_COMPRESSION_BC - } + fn optional_features() -> wgpu::Features { + wgpu::Features::TEXTURE_COMPRESSION_ASTC + | wgpu::Features::TEXTURE_COMPRESSION_ETC2 + | wgpu::Features::TEXTURE_COMPRESSION_BC + } - fn init( - config: &wgpu::SurfaceConfiguration, - _adapter: &wgpu::Adapter, - device: &wgpu::Device, - queue: &wgpu::Queue, - ) -> Self { - let mut modeldatas = Vec::::new(); - add_obj(device,& mut modeldatas,include_bytes!("../models/teslacyberv3.0.obj")); - add_obj(device,& mut modeldatas,include_bytes!("../models/suzanne.obj")); - add_obj(device,& mut modeldatas,include_bytes!("../models/teapot.obj")); - println!("models.len = {:?}", modeldatas.len()); - modeldatas[1].transform=glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)); - modeldatas[2].transform=glam::Affine3A::from_translation(glam::vec3(-10.,5.,10.)); + fn init( + config: &wgpu::SurfaceConfiguration, + _adapter: &wgpu::Adapter, + device: &wgpu::Device, + queue: &wgpu::Queue, + ) -> Self { + let mut modeldatas = Vec::::new(); + add_obj(device,& mut modeldatas,include_bytes!("../models/teslacyberv3.0.obj")); + add_obj(device,& mut modeldatas,include_bytes!("../models/suzanne.obj")); + add_obj(device,& mut modeldatas,include_bytes!("../models/teapot.obj")); + println!("models.len = {:?}", modeldatas.len()); + modeldatas[1].transform=glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)); + modeldatas[2].transform=glam::Affine3A::from_translation(glam::vec3(-10.,5.,10.)); - let main_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { - label: None, - entries: &[ - wgpu::BindGroupLayoutEntry { - binding: 0, - visibility: wgpu::ShaderStages::VERTEX, - ty: wgpu::BindingType::Buffer { - ty: wgpu::BufferBindingType::Uniform, - has_dynamic_offset: false, - min_binding_size: None, - }, - count: None, - }, - wgpu::BindGroupLayoutEntry { - binding: 1, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Texture { - sample_type: wgpu::TextureSampleType::Float { filterable: true }, - multisampled: false, - view_dimension: wgpu::TextureViewDimension::Cube, - }, - count: None, - }, - wgpu::BindGroupLayoutEntry { - binding: 2, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), - count: None, - }, - ], - }); - let model_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { - label: None, - entries: &[ - wgpu::BindGroupLayoutEntry { - binding: 0, - visibility: wgpu::ShaderStages::VERTEX, - ty: wgpu::BindingType::Buffer { - ty: wgpu::BufferBindingType::Uniform, - has_dynamic_offset: false, - min_binding_size: None, - }, - count: None, - }, - ], - }); + let main_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: None, + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::VERTEX, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { filterable: true }, + multisampled: false, + view_dimension: wgpu::TextureViewDimension::Cube, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 2, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), + count: None, + }, + ], + }); + let model_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: None, + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::VERTEX, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + ], + }); - // Create the render pipeline - let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { - label: None, - source: wgpu::ShaderSource::Wgsl(Cow::Borrowed(include_str!("shader.wgsl"))), - }); + // Create the render pipeline + let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: None, + source: wgpu::ShaderSource::Wgsl(Cow::Borrowed(include_str!("shader.wgsl"))), + }); - let camera = Camera { - time: Instant::now(), - pos: glam::Vec3::new(5.0,0.0,5.0), - vel: glam::Vec3::new(0.0,0.0,0.0), - gravity: glam::Vec3::new(0.0,-100.0,0.0), - friction: 90.0, - screen_size: (config.width, config.height), - offset: glam::Vec3::new(0.0,4.5,0.0), - fov: 1.0, //fov_slope = tan(fov_y/2) - pitch: 0.0, - yaw: 0.0, - mv: 2.7, - controls:0, - grounded: true, - walkspeed: 18.0, - }; - let camera_uniforms = camera.to_uniform_data(); - let camera_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Camera"), - contents: bytemuck::cast_slice(&camera_uniforms), - usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, - }); + let camera = Camera { + time: Instant::now(), + pos: glam::Vec3::new(5.0,0.0,5.0), + vel: glam::Vec3::new(0.0,0.0,0.0), + gravity: glam::Vec3::new(0.0,-100.0,0.0), + friction: 90.0, + screen_size: (config.width, config.height), + offset: glam::Vec3::new(0.0,4.5,0.0), + fov: 1.0, //fov_slope = tan(fov_y/2) + pitch: 0.0, + yaw: 0.0, + mv: 2.7, + controls:0, + grounded: true, + walkspeed: 18.0, + }; + let camera_uniforms = camera.to_uniform_data(); + let camera_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Camera"), + contents: bytemuck::cast_slice(&camera_uniforms), + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + }); - let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { - label: None, - bind_group_layouts: &[&main_bind_group_layout, &model_bind_group_layout], - push_constant_ranges: &[], - }); + let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: None, + bind_group_layouts: &[&main_bind_group_layout, &model_bind_group_layout], + push_constant_ranges: &[], + }); - // Create the render pipelines - let sky_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some("Sky"), - layout: Some(&pipeline_layout), - vertex: wgpu::VertexState { - module: &shader, - entry_point: "vs_sky", - buffers: &[], - }, - fragment: Some(wgpu::FragmentState { - module: &shader, - entry_point: "fs_sky", - targets: &[Some(config.view_formats[0].into())], - }), - primitive: wgpu::PrimitiveState { - front_face: wgpu::FrontFace::Cw, - ..Default::default() - }, - depth_stencil: Some(wgpu::DepthStencilState { - format: Self::DEPTH_FORMAT, - depth_write_enabled: false, - depth_compare: wgpu::CompareFunction::LessEqual, - stencil: wgpu::StencilState::default(), - bias: wgpu::DepthBiasState::default(), - }), - multisample: wgpu::MultisampleState::default(), - multiview: None, - }); - let entity_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some("Entity"), - layout: Some(&pipeline_layout), - vertex: wgpu::VertexState { - module: &shader, - entry_point: "vs_entity", - buffers: &[wgpu::VertexBufferLayout { - array_stride: std::mem::size_of::() as wgpu::BufferAddress, - step_mode: wgpu::VertexStepMode::Vertex, - attributes: &wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x2, 2 => Float32x3], - }], - }, - fragment: Some(wgpu::FragmentState { - module: &shader, - entry_point: "fs_entity", - targets: &[Some(config.view_formats[0].into())], - }), - primitive: wgpu::PrimitiveState { - front_face: wgpu::FrontFace::Cw, - ..Default::default() - }, - depth_stencil: Some(wgpu::DepthStencilState { - format: Self::DEPTH_FORMAT, - depth_write_enabled: true, - depth_compare: wgpu::CompareFunction::LessEqual, - stencil: wgpu::StencilState::default(), - bias: wgpu::DepthBiasState::default(), - }), - multisample: wgpu::MultisampleState::default(), - multiview: None, - }); - let ground_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some("Ground"), - layout: Some(&pipeline_layout), - vertex: wgpu::VertexState { - module: &shader, - entry_point: "vs_ground", - buffers: &[], - }, - fragment: Some(wgpu::FragmentState { - module: &shader, - entry_point: "fs_ground", - targets: &[Some(config.view_formats[0].into())], - }), - primitive: wgpu::PrimitiveState { - front_face: wgpu::FrontFace::Cw, - ..Default::default() - }, - depth_stencil: Some(wgpu::DepthStencilState { - format: Self::DEPTH_FORMAT, - depth_write_enabled: true, - depth_compare: wgpu::CompareFunction::LessEqual, - stencil: wgpu::StencilState::default(), - bias: wgpu::DepthBiasState::default(), - }), - multisample: wgpu::MultisampleState::default(), - multiview: None, - }); + // Create the render pipelines + let sky_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Sky"), + layout: Some(&pipeline_layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: "vs_sky", + buffers: &[], + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fs_sky", + targets: &[Some(config.view_formats[0].into())], + }), + primitive: wgpu::PrimitiveState { + front_face: wgpu::FrontFace::Cw, + ..Default::default() + }, + depth_stencil: Some(wgpu::DepthStencilState { + format: Self::DEPTH_FORMAT, + depth_write_enabled: false, + depth_compare: wgpu::CompareFunction::LessEqual, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), + multisample: wgpu::MultisampleState::default(), + multiview: None, + }); + let entity_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Entity"), + layout: Some(&pipeline_layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: "vs_entity", + buffers: &[wgpu::VertexBufferLayout { + array_stride: std::mem::size_of::() as wgpu::BufferAddress, + step_mode: wgpu::VertexStepMode::Vertex, + attributes: &wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x2, 2 => Float32x3], + }], + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fs_entity", + targets: &[Some(config.view_formats[0].into())], + }), + primitive: wgpu::PrimitiveState { + front_face: wgpu::FrontFace::Cw, + ..Default::default() + }, + depth_stencil: Some(wgpu::DepthStencilState { + format: Self::DEPTH_FORMAT, + depth_write_enabled: true, + depth_compare: wgpu::CompareFunction::LessEqual, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), + multisample: wgpu::MultisampleState::default(), + multiview: None, + }); + let ground_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Ground"), + layout: Some(&pipeline_layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: "vs_ground", + buffers: &[], + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fs_ground", + targets: &[Some(config.view_formats[0].into())], + }), + primitive: wgpu::PrimitiveState { + front_face: wgpu::FrontFace::Cw, + ..Default::default() + }, + depth_stencil: Some(wgpu::DepthStencilState { + format: Self::DEPTH_FORMAT, + depth_write_enabled: true, + depth_compare: wgpu::CompareFunction::LessEqual, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), + multisample: wgpu::MultisampleState::default(), + multiview: None, + }); - let sampler = device.create_sampler(&wgpu::SamplerDescriptor { - label: None, - address_mode_u: wgpu::AddressMode::ClampToEdge, - address_mode_v: wgpu::AddressMode::ClampToEdge, - address_mode_w: wgpu::AddressMode::ClampToEdge, - mag_filter: wgpu::FilterMode::Linear, - min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Linear, - ..Default::default() - }); + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { + label: None, + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: wgpu::FilterMode::Linear, + min_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::FilterMode::Linear, + ..Default::default() + }); - let device_features = device.features(); + let device_features = device.features(); - let skybox_format = if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ASTC) { - log::info!("Using ASTC"); - wgpu::TextureFormat::Astc { - block: AstcBlock::B4x4, - channel: AstcChannel::UnormSrgb, - } - } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ETC2) { - log::info!("Using ETC2"); - wgpu::TextureFormat::Etc2Rgb8UnormSrgb - } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_BC) { - log::info!("Using BC"); - wgpu::TextureFormat::Bc1RgbaUnormSrgb - } else { - log::info!("Using plain"); - wgpu::TextureFormat::Bgra8UnormSrgb - }; + let skybox_format = if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ASTC) { + log::info!("Using ASTC"); + wgpu::TextureFormat::Astc { + block: AstcBlock::B4x4, + channel: AstcChannel::UnormSrgb, + } + } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ETC2) { + log::info!("Using ETC2"); + wgpu::TextureFormat::Etc2Rgb8UnormSrgb + } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_BC) { + log::info!("Using BC"); + wgpu::TextureFormat::Bc1RgbaUnormSrgb + } else { + log::info!("Using plain"); + wgpu::TextureFormat::Bgra8UnormSrgb + }; - let size = wgpu::Extent3d { - width: IMAGE_SIZE, - height: IMAGE_SIZE, - depth_or_array_layers: 6, - }; + let size = wgpu::Extent3d { + width: IMAGE_SIZE, + height: IMAGE_SIZE, + depth_or_array_layers: 6, + }; - let layer_size = wgpu::Extent3d { - depth_or_array_layers: 1, - ..size - }; - let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); + let layer_size = wgpu::Extent3d { + depth_or_array_layers: 1, + ..size + }; + let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); - log::debug!( - "Copying {:?} skybox images of size {}, {}, 6 with {} mips to gpu", - skybox_format, - IMAGE_SIZE, - IMAGE_SIZE, - max_mips, - ); + log::debug!( + "Copying {:?} skybox images of size {}, {}, 6 with {} mips to gpu", + skybox_format, + IMAGE_SIZE, + IMAGE_SIZE, + max_mips, + ); - let bytes = match skybox_format { - wgpu::TextureFormat::Astc { - block: AstcBlock::B4x4, - channel: AstcChannel::UnormSrgb, - } => &include_bytes!("../images/astc.dds")[..], - wgpu::TextureFormat::Etc2Rgb8UnormSrgb => &include_bytes!("../images/etc2.dds")[..], - wgpu::TextureFormat::Bc1RgbaUnormSrgb => &include_bytes!("../images/bc1.dds")[..], - wgpu::TextureFormat::Bgra8UnormSrgb => &include_bytes!("../images/bgra.dds")[..], - _ => unreachable!(), - }; + let bytes = match skybox_format { + wgpu::TextureFormat::Astc { + block: AstcBlock::B4x4, + channel: AstcChannel::UnormSrgb, + } => &include_bytes!("../images/astc.dds")[..], + wgpu::TextureFormat::Etc2Rgb8UnormSrgb => &include_bytes!("../images/etc2.dds")[..], + wgpu::TextureFormat::Bc1RgbaUnormSrgb => &include_bytes!("../images/bc1.dds")[..], + wgpu::TextureFormat::Bgra8UnormSrgb => &include_bytes!("../images/bgra.dds")[..], + _ => unreachable!(), + }; - let image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); + let image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); - let texture = device.create_texture_with_data( - queue, - &wgpu::TextureDescriptor { - size, - mip_level_count: max_mips, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format: skybox_format, - usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, - label: None, - view_formats: &[], - }, - &image.data, - ); + let texture = device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor { + size, + mip_level_count: max_mips, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: skybox_format, + usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + label: None, + view_formats: &[], + }, + &image.data, + ); - let texture_view = texture.create_view(&wgpu::TextureViewDescriptor { - label: None, - dimension: Some(wgpu::TextureViewDimension::Cube), - ..wgpu::TextureViewDescriptor::default() - }); - let main_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - layout: &main_bind_group_layout, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: camera_buf.as_entire_binding(), - }, - wgpu::BindGroupEntry { - binding: 1, - resource: wgpu::BindingResource::TextureView(&texture_view), - }, - wgpu::BindGroupEntry { - binding: 2, - resource: wgpu::BindingResource::Sampler(&sampler), - }, - ], - label: Some("Camera"), - }); + let texture_view = texture.create_view(&wgpu::TextureViewDescriptor { + label: None, + dimension: Some(wgpu::TextureViewDimension::Cube), + ..wgpu::TextureViewDescriptor::default() + }); + let main_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &main_bind_group_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: camera_buf.as_entire_binding(), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(&texture_view), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: wgpu::BindingResource::Sampler(&sampler), + }, + ], + label: Some("Camera"), + }); - //drain the modeldata vec so entities can be /moved/ to models.entities - let mut models = Vec::::with_capacity(modeldatas.len()); - for (i,modeldata) in modeldatas.drain(..).enumerate() { - let model_uniforms = get_transform_uniform_data(&modeldata.transform); - let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some(format!("Model{}",i).as_str()), - contents: bytemuck::cast_slice(&model_uniforms), - usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, - }); - let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - layout: &model_bind_group_layout, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: model_buf.as_entire_binding(), - }, - ], - label: Some(format!("Model{}",i).as_str()), - }); - //all of these are being moved here - models.push(Model{ - transform: modeldata.transform, - vertex_buf:modeldata.vertex_buf, - entities: modeldata.entities, - bind_group: model_bind_group, - model_buf: model_buf, - }) - } + //drain the modeldata vec so entities can be /moved/ to models.entities + let mut models = Vec::::with_capacity(modeldatas.len()); + for (i,modeldata) in modeldatas.drain(..).enumerate() { + let model_uniforms = get_transform_uniform_data(&modeldata.transform); + let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some(format!("Model{}",i).as_str()), + contents: bytemuck::cast_slice(&model_uniforms), + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + }); + let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &model_bind_group_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: model_buf.as_entire_binding(), + }, + ], + label: Some(format!("Model{}",i).as_str()), + }); + //all of these are being moved here + models.push(Model{ + transform: modeldata.transform, + vertex_buf:modeldata.vertex_buf, + entities: modeldata.entities, + bind_group: model_bind_group, + model_buf: model_buf, + }) + } - let depth_view = Self::create_depth_texture(config, device); + let depth_view = Self::create_depth_texture(config, device); - Skybox { - camera, - sky_pipeline, - entity_pipeline, - ground_pipeline, - main_bind_group, - camera_buf, - models, - depth_view, - staging_belt: wgpu::util::StagingBelt::new(0x100), - } - } + Skybox { + camera, + sky_pipeline, + entity_pipeline, + ground_pipeline, + main_bind_group, + camera_buf, + models, + depth_view, + staging_belt: wgpu::util::StagingBelt::new(0x100), + } + } - #[allow(clippy::single_match)] - fn update(&mut self, event: winit::event::WindowEvent) { - match event { - winit::event::WindowEvent::KeyboardInput { - input: - winit::event::KeyboardInput { - state, - virtual_keycode: Some(keycode), - .. - }, - .. - } => { - match (state,keycode) { - (k,winit::event::VirtualKeyCode::W) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEFORWARD, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEFORWARD, - } - (k,winit::event::VirtualKeyCode::A) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVELEFT, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVELEFT, - } - (k,winit::event::VirtualKeyCode::S) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEBACK, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEBACK, - } - (k,winit::event::VirtualKeyCode::D) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVERIGHT, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVERIGHT, - } - (k,winit::event::VirtualKeyCode::E) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEUP, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEUP, - } - (k,winit::event::VirtualKeyCode::Q) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEDOWN, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEDOWN, - } - (k,winit::event::VirtualKeyCode::Space) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_JUMP, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_JUMP, - } - (k,winit::event::VirtualKeyCode::Z) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_ZOOM, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_ZOOM, - } - _ => (), - } - } - _ => {} - } - } + #[allow(clippy::single_match)] + fn update(&mut self, event: winit::event::WindowEvent) { + match event { + winit::event::WindowEvent::KeyboardInput { + input: + winit::event::KeyboardInput { + state, + virtual_keycode: Some(keycode), + .. + }, + .. + } => { + match (state,keycode) { + (k,winit::event::VirtualKeyCode::W) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEFORWARD, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEFORWARD, + } + (k,winit::event::VirtualKeyCode::A) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVELEFT, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVELEFT, + } + (k,winit::event::VirtualKeyCode::S) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEBACK, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEBACK, + } + (k,winit::event::VirtualKeyCode::D) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVERIGHT, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVERIGHT, + } + (k,winit::event::VirtualKeyCode::E) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEUP, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEUP, + } + (k,winit::event::VirtualKeyCode::Q) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEDOWN, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEDOWN, + } + (k,winit::event::VirtualKeyCode::Space) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_JUMP, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_JUMP, + } + (k,winit::event::VirtualKeyCode::Z) => match k { + winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_ZOOM, + winit::event::ElementState::Released => self.camera.controls&=!CONTROL_ZOOM, + } + _ => (), + } + } + _ => {} + } + } - fn move_mouse(&mut self, delta: (f64,f64)) { - self.camera.pitch=(self.camera.pitch as f64+delta.1/-512.) as f32; - self.camera.yaw=(self.camera.yaw as f64+delta.0/-512.) as f32; - } + fn move_mouse(&mut self, delta: (f64,f64)) { + self.camera.pitch=(self.camera.pitch as f64+delta.1/-512.) as f32; + self.camera.yaw=(self.camera.yaw as f64+delta.0/-512.) as f32; + } - fn resize( - &mut self, - config: &wgpu::SurfaceConfiguration, - device: &wgpu::Device, - _queue: &wgpu::Queue, - ) { - self.depth_view = Self::create_depth_texture(config, device); - self.camera.screen_size = (config.width, config.height); - } + fn resize( + &mut self, + config: &wgpu::SurfaceConfiguration, + device: &wgpu::Device, + _queue: &wgpu::Queue, + ) { + self.depth_view = Self::create_depth_texture(config, device); + self.camera.screen_size = (config.width, config.height); + } - fn render( - &mut self, - view: &wgpu::TextureView, - device: &wgpu::Device, - queue: &wgpu::Queue, - _spawner: &strafe_client::framework::Spawner, - ) { - let time = Instant::now(); + fn render( + &mut self, + view: &wgpu::TextureView, + device: &wgpu::Device, + queue: &wgpu::Queue, + _spawner: &strafe_client::framework::Spawner, + ) { + let time = Instant::now(); - //physique - let dt=(time-self.camera.time).as_secs_f32(); - self.camera.time=time; - let camera_mat=glam::Mat3::from_euler(glam::EulerRot::YXZ,self.camera.yaw,0f32,0f32); - let control_dir=camera_mat*get_control_dir(self.camera.controls&(CONTROL_MOVELEFT|CONTROL_MOVERIGHT|CONTROL_MOVEFORWARD|CONTROL_MOVEBACK)).normalize_or_zero(); - let d=self.camera.vel.dot(control_dir); - if d( - format!("Strafe Client v{}", - env!("CARGO_PKG_VERSION") - ).as_str() - ); + strafe_client::framework::run::( + format!("Strafe Client v{}", + env!("CARGO_PKG_VERSION") + ).as_str() + ); } diff --git a/src/shader.wgsl b/src/shader.wgsl index dd55d4e..a60fc5c 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -1,17 +1,17 @@ struct SkyOutput { - @builtin(position) position: vec4, - @location(0) sampledir: vec3, + @builtin(position) position: vec4, + @location(0) sampledir: vec3, }; struct Data { - // from camera to screen - proj: mat4x4, - // from screen to camera - proj_inv: mat4x4, - // from world to camera - view: mat4x4, - // camera position - cam_pos: vec4, + // from camera to screen + proj: mat4x4, + // from screen to camera + proj_inv: mat4x4, + // from world to camera + view: mat4x4, + // camera position + cam_pos: vec4, }; @group(0) @binding(0) @@ -19,53 +19,53 @@ var r_data: Data; @vertex fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { - // hacky way to draw a large triangle - let tmp1 = i32(vertex_index) / 2; - let tmp2 = i32(vertex_index) & 1; - let pos = vec4( - f32(tmp1) * 4.0 - 1.0, - f32(tmp2) * 4.0 - 1.0, - 1.0, - 1.0 - ); + // hacky way to draw a large triangle + let tmp1 = i32(vertex_index) / 2; + let tmp2 = i32(vertex_index) & 1; + let pos = vec4( + f32(tmp1) * 4.0 - 1.0, + f32(tmp2) * 4.0 - 1.0, + 1.0, + 1.0 + ); - // transposition = inversion for this orthonormal matrix - let inv_model_view = transpose(mat3x3(r_data.view[0].xyz, r_data.view[1].xyz, r_data.view[2].xyz)); - let unprojected = r_data.proj_inv * pos; + // transposition = inversion for this orthonormal matrix + let inv_model_view = transpose(mat3x3(r_data.view[0].xyz, r_data.view[1].xyz, r_data.view[2].xyz)); + let unprojected = r_data.proj_inv * pos; - var result: SkyOutput; - result.sampledir = inv_model_view * unprojected.xyz; - result.position = pos; - return result; + var result: SkyOutput; + result.sampledir = inv_model_view * unprojected.xyz; + result.position = pos; + return result; } struct GroundOutput { - @builtin(position) position: vec4, - @location(4) pos: vec3, + @builtin(position) position: vec4, + @location(4) pos: vec3, }; @vertex fn vs_ground(@builtin(vertex_index) vertex_index: u32) -> GroundOutput { - // hacky way to draw two triangles that make a square - let tmp1 = i32(vertex_index)/2-i32(vertex_index)/3; - let tmp2 = i32(vertex_index)&1; - let pos = vec3( - f32(tmp1) * 2.0 - 1.0, - 0.0, - f32(tmp2) * 2.0 - 1.0 - ) * 160.0; + // hacky way to draw two triangles that make a square + let tmp1 = i32(vertex_index)/2-i32(vertex_index)/3; + let tmp2 = i32(vertex_index)&1; + let pos = vec3( + f32(tmp1) * 2.0 - 1.0, + 0.0, + f32(tmp2) * 2.0 - 1.0 + ) * 160.0; - var result: GroundOutput; - result.pos = pos; - result.position = r_data.proj * r_data.view * vec4(pos, 1.0); - return result; + var result: GroundOutput; + result.pos = pos; + result.position = r_data.proj * r_data.view * vec4(pos, 1.0); + return result; } struct EntityOutput { - @builtin(position) position: vec4, - @location(1) texture: vec2, - @location(2) normal: vec3, - @location(3) view: vec3, + @builtin(position) position: vec4, + @location(1) texture: vec2, + @location(2) normal: vec3, + @location(3) view: vec3, }; @group(1) @@ -74,17 +74,17 @@ var r_EntityTransform: mat4x4; @vertex fn vs_entity( - @location(0) pos: vec3, - @location(1) texture: vec2, - @location(2) normal: vec3, + @location(0) pos: vec3, + @location(1) texture: vec2, + @location(2) normal: vec3, ) -> EntityOutput { - var position: vec4 = r_EntityTransform * vec4(pos, 1.0); - var result: EntityOutput; - result.normal = (r_EntityTransform * vec4(normal, 0.0)).xyz; - result.texture=texture; - result.view = position.xyz - r_data.cam_pos.xyz; - result.position = r_data.proj * r_data.view * position; - return result; + var position: vec4 = r_EntityTransform * vec4(pos, 1.0); + var result: EntityOutput; + result.normal = (r_EntityTransform * vec4(normal, 0.0)).xyz; + result.texture=texture; + result.view = position.xyz - r_data.cam_pos.xyz; + result.position = r_data.proj * r_data.view * position; + return result; } @group(0) @@ -96,36 +96,36 @@ var r_sampler: sampler; @fragment fn fs_sky(vertex: SkyOutput) -> @location(0) vec4 { - return textureSample(r_texture, r_sampler, vertex.sampledir); + return textureSample(r_texture, r_sampler, vertex.sampledir); } @fragment fn fs_entity(vertex: EntityOutput) -> @location(0) vec4 { - let incident = normalize(vertex.view); - let normal = normalize(vertex.normal); - let d = dot(normal, incident); - let reflected = incident - 2.0 * d * normal; + let incident = normalize(vertex.view); + let normal = normalize(vertex.normal); + let d = dot(normal, incident); + let reflected = incident - 2.0 * d * normal; - let dir = vec3(-1.0)+2.0*vec3(vertex.texture.x,0.0,vertex.texture.y); - let texture_color = textureSample(r_texture, r_sampler, dir).rgb; - let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb; - return vec4(mix(vec3(0.1) + 0.5 * reflected_color,texture_color,1.0-pow(1.0-abs(d),2.0)), 1.0); + let dir = vec3(-1.0)+2.0*vec3(vertex.texture.x,0.0,vertex.texture.y); + let texture_color = textureSample(r_texture, r_sampler, dir).rgb; + let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb; + return vec4(mix(vec3(0.1) + 0.5 * reflected_color,texture_color,1.0-pow(1.0-abs(d),2.0)), 1.0); } fn modulo_euclidean (a: f32, b: f32) -> f32 { - var m = a % b; - if (m < 0.0) { - if (b < 0.0) { - m -= b; - } else { - m += b; - } - } - return m; + var m = a % b; + if (m < 0.0) { + if (b < 0.0) { + m -= b; + } else { + m += b; + } + } + return m; } @fragment fn fs_ground(vertex: GroundOutput) -> @location(0) vec4 { - let dir = vec3(-1.0)+vec3(modulo_euclidean(vertex.pos.x/16.,1.0),0.0,modulo_euclidean(vertex.pos.z/16.,1.0))*2.0; - return vec4(textureSample(r_texture, r_sampler, dir).rgb, 1.0); + let dir = vec3(-1.0)+vec3(modulo_euclidean(vertex.pos.x/16.,1.0),0.0,modulo_euclidean(vertex.pos.z/16.,1.0))*2.0; + return vec4(textureSample(r_texture, r_sampler, dir).rgb, 1.0); } From 99d4e51ee82f5089b7b79f3e98dfd78ecf1e7e26 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 14:47:19 -0700 Subject: [PATCH 071/482] use Mat4 in place of Affine3A --- src/main.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index dce64d5..fd7e4f0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,13 +19,13 @@ struct Entity { //temp? struct ModelData { - transform: glam::Affine3A, + transform: glam::Mat4, vertex_buf: wgpu::Buffer, entities: Vec, } struct Model { - transform: glam::Affine3A, + transform: glam::Mat4, vertex_buf: wgpu::Buffer, entities: Vec, bind_group: wgpu::BindGroup, @@ -159,9 +159,9 @@ impl Skybox { } } -fn get_transform_uniform_data(transform:&glam::Affine3A) -> [f32; 4*4] { +fn get_transform_uniform_data(transform:&glam::Mat4) -> [f32; 4*4] { let mut raw = [0f32; 4*4]; - raw[0..16].copy_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&glam::Mat4::from(*transform))[..]); + raw[0..16].copy_from_slice(&AsRef::<[f32; 4*4]>::as_ref(transform)[..]); raw } @@ -208,7 +208,7 @@ fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,source:&[u8]){ usage: wgpu::BufferUsages::VERTEX, }); modeldatas.push(ModelData { - transform: glam::Affine3A::default(), + transform: glam::Mat4::default(), vertex_buf, entities, }) @@ -233,8 +233,8 @@ impl strafe_client::framework::Example for Skybox { add_obj(device,& mut modeldatas,include_bytes!("../models/suzanne.obj")); add_obj(device,& mut modeldatas,include_bytes!("../models/teapot.obj")); println!("models.len = {:?}", modeldatas.len()); - modeldatas[1].transform=glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)); - modeldatas[2].transform=glam::Affine3A::from_translation(glam::vec3(-10.,5.,10.)); + modeldatas[1].transform=glam::Mat4::from_translation(glam::vec3(10.,5.,10.)); + modeldatas[2].transform=glam::Mat4::from_translation(glam::vec3(-10.,5.,10.)); let main_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: None, From d72e3fcabd2ddf5adb6e9addf74007f9437634e1 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 19:08:23 -0700 Subject: [PATCH 072/482] use syntactic sugar --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index fd7e4f0..5ce8362 100644 --- a/src/main.rs +++ b/src/main.rs @@ -532,7 +532,7 @@ impl strafe_client::framework::Example for Skybox { vertex_buf:modeldata.vertex_buf, entities: modeldata.entities, bind_group: model_bind_group, - model_buf: model_buf, + model_buf, }) } From 05156d1741df63d810b8c3330691cd4ed477a1ed Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 6 Sep 2023 19:35:32 -0700 Subject: [PATCH 073/482] sens way too high --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5ce8362..720fa6e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -604,8 +604,8 @@ impl strafe_client::framework::Example for Skybox { } fn move_mouse(&mut self, delta: (f64,f64)) { - self.camera.pitch=(self.camera.pitch as f64+delta.1/-512.) as f32; - self.camera.yaw=(self.camera.yaw as f64+delta.0/-512.) as f32; + self.camera.pitch=(self.camera.pitch as f64+delta.1/-2048.) as f32; + self.camera.yaw=(self.camera.yaw as f64+delta.0/-2048.) as f32; } fn resize( From ea3134de51ef1dc2b20219468c81ebe7cd2e73e4 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 11:33:16 -0700 Subject: [PATCH 074/482] move physics into its own module --- src/body.rs | 65 ++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 74 +++++++++++++++++++---------------------------------- 3 files changed, 92 insertions(+), 48 deletions(-) create mode 100644 src/body.rs diff --git a/src/body.rs b/src/body.rs new file mode 100644 index 0000000..210bcbc --- /dev/null +++ b/src/body.rs @@ -0,0 +1,65 @@ +pub struct Body { + pub position: glam::Vec3,//I64 where 2^32 = 1 u + pub velocity: glam::Vec3,//I64 where 2^32 = 1 u/s + pub time: TIME,//nanoseconds x xxxxD! +} + +pub struct PhysicsState { + pub body: Body, + pub time: TIME, + pub strafe_tick_period: TIME, + pub tick: u32, + pub gravity: glam::Vec3, + pub friction: f32, + pub mv: f32, + pub grounded: bool, + pub walkspeed: f32, +} + +pub type TIME = i64; + +const CONTROL_JUMP:u32 = 0b01000000;//temp +impl PhysicsState { + //delete this, we are tickless gamers + pub fn run(&mut self, time: TIME, control_dir: glam::Vec3, controls: u32){ + let target_tick = (time/self.strafe_tick_period) as u32;//100t + //the game code can run for 1 month before running out of ticks + while self.tick glam::Vec3 { + let dt=(time-self.body.time) as f64/1_000_000_000f64; + self.body.position+self.body.velocity*(dt as f32)+self.gravity*((0.5*dt*dt) as f32) + } +} diff --git a/src/lib.rs b/src/lib.rs index 0c71749..2aaeac4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1 +1,2 @@ pub mod framework; +pub mod body; diff --git a/src/main.rs b/src/main.rs index 720fa6e..f862e1e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,20 +34,12 @@ struct Model { // Note: we use the Y=up coordinate space in this example. struct Camera { - time: Instant, - pos: glam::Vec3, - vel: glam::Vec3, - gravity: glam::Vec3, - friction: f32, screen_size: (u32, u32), offset: glam::Vec3, fov: f32, yaw: f32, pitch: f32, controls: u32, - mv: f32, - grounded: bool, - walkspeed: f32, } const CONTROL_MOVEFORWARD:u32 = 0b00000001; @@ -100,7 +92,7 @@ fn get_control_dir(controls: u32) -> glam::Vec3{ } impl Camera { - fn to_uniform_data(&self) -> [f32; 16 * 3 + 4] { + fn to_uniform_data(&self, pos: glam::Vec3) -> [f32; 16 * 3 + 4] { let aspect = self.screen_size.0 as f32 / self.screen_size.1 as f32; let fov = if self.controls&CONTROL_ZOOM==0 { self.fov @@ -109,7 +101,7 @@ impl Camera { }; let proj = perspective_rh(fov, aspect, 0.5, 1000.0); let proj_inv = proj.inverse(); - let view = glam::Mat4::from_translation(self.pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32); + let view = glam::Mat4::from_translation(pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32); let view_inv = view.inverse(); let mut raw = [0f32; 16 * 3 + 4]; @@ -122,7 +114,9 @@ impl Camera { } pub struct Skybox { + start_time: std::time::Instant, camera: Camera, + physics: strafe_client::body::PhysicsState, sky_pipeline: wgpu::RenderPipeline, entity_pipeline: wgpu::RenderPipeline, ground_pipeline: wgpu::RenderPipeline, @@ -290,22 +284,30 @@ impl strafe_client::framework::Example for Skybox { }); let camera = Camera { - time: Instant::now(), - pos: glam::Vec3::new(5.0,0.0,5.0), - vel: glam::Vec3::new(0.0,0.0,0.0), - gravity: glam::Vec3::new(0.0,-100.0,0.0), - friction: 90.0, screen_size: (config.width, config.height), offset: glam::Vec3::new(0.0,4.5,0.0), fov: 1.0, //fov_slope = tan(fov_y/2) pitch: 0.0, yaw: 0.0, - mv: 2.7, controls:0, + }; + let physics = strafe_client::body::PhysicsState { + body: strafe_client::body::Body { + position: glam::Vec3::new(5.0,0.0,5.0), + velocity: glam::Vec3::new(0.0,0.0,0.0), + time: 0, + }, + time: 0, + tick: 0, + strafe_tick_period: 1_000_000_000/100,//100t + gravity: glam::Vec3::new(0.0,-100.0,0.0), + friction: 90.0, + mv: 2.7, grounded: true, walkspeed: 18.0, }; - let camera_uniforms = camera.to_uniform_data(); + + let camera_uniforms = camera.to_uniform_data(physics.extrapolate_position(0)); let camera_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Camera"), contents: bytemuck::cast_slice(&camera_uniforms), @@ -539,7 +541,9 @@ impl strafe_client::framework::Example for Skybox { let depth_view = Self::create_depth_texture(config, device); Skybox { + start_time: Instant::now(), camera, + physics, sky_pipeline, entity_pipeline, ground_pipeline, @@ -625,44 +629,18 @@ impl strafe_client::framework::Example for Skybox { queue: &wgpu::Queue, _spawner: &strafe_client::framework::Spawner, ) { - let time = Instant::now(); - - //physique - let dt=(time-self.camera.time).as_secs_f32(); - self.camera.time=time; let camera_mat=glam::Mat3::from_euler(glam::EulerRot::YXZ,self.camera.yaw,0f32,0f32); let control_dir=camera_mat*get_control_dir(self.camera.controls&(CONTROL_MOVELEFT|CONTROL_MOVERIGHT|CONTROL_MOVEFORWARD|CONTROL_MOVEBACK)).normalize_or_zero(); - let d=self.camera.vel.dot(control_dir); - if d Date: Fri, 8 Sep 2023 11:33:20 -0700 Subject: [PATCH 075/482] brainstorm tickless events --- src/body.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/event.rs | 15 +++++++++++++++ src/lib.rs | 1 + src/main.rs | 1 + 4 files changed, 64 insertions(+) create mode 100644 src/event.rs diff --git a/src/body.rs b/src/body.rs index 210bcbc..7811718 100644 --- a/src/body.rs +++ b/src/body.rs @@ -6,6 +6,7 @@ pub struct Body { pub struct PhysicsState { pub body: Body, + //pub contacts: Vec, pub time: TIME, pub strafe_tick_period: TIME, pub tick: u32, @@ -14,6 +15,7 @@ pub struct PhysicsState { pub mv: f32, pub grounded: bool, pub walkspeed: f32, + pub jump_trying: bool, } pub type TIME = i64; @@ -62,4 +64,49 @@ impl PhysicsState { let dt=(time-self.body.time) as f64/1_000_000_000f64; self.body.position+self.body.velocity*(dt as f32)+self.gravity*((0.5*dt*dt) as f32) } + + fn next_strafe_event(&self) -> Option { + return Some(crate::event::EventStruct{ + time:(self.time/self.strafe_tick_period+1)*self.strafe_tick_period, + event:crate::event::EventEnum::StrafeTick + }); + } +} + +impl crate::event::EventTrait for PhysicsState { + //this little next event function can cache its return value and invalidate the cached value by watching the State. + fn next_event(&self) -> Option { + //JUST POLLING!!! NO MUTATION + let mut best_event: Option = None; + let collect_event = |test_event:Option|{ + match test_event { + Some(unwrap_test_event) => match best_event { + Some(unwrap_best_event) => if unwrap_test_event.time best_event=test_event, + }, + None => (), + } + }; + //check to see if yee need to jump (this is not the way lol) + if self.grounded&&self.jump_trying { + //scroll will be implemented with InputEvent::InstantJump rather than InputEvent::Jump(true) + collect_event(Some(crate::event::EventStruct{ + time:self.time, + event:crate::event::EventEnum::Jump + })); + } + //check for collision stop events with curent contacts + for collision_data in self.contacts.iter() { + collect_event(self.model.predict_collision(collision_data.model)); + } + //check for collision start events (against every part in the game with no optimization!!) + for &model in self.world.models { + collect_event(self.model.predict_collision(&model)); + } + //check to see when the next strafe tick is + collect_event(self.next_strafe_event()); + best_event + } } diff --git a/src/event.rs b/src/event.rs new file mode 100644 index 0000000..6f45098 --- /dev/null +++ b/src/event.rs @@ -0,0 +1,15 @@ +pub struct EventStruct { + pub time: crate::body::TIME, + pub event: EventEnum, +} + +pub enum EventEnum { + CollisionStart,//(Collideable),//Body::CollisionStart + CollisionEnd,//(Collideable),//Body::CollisionEnd + StrafeTick, + Jump, +} + +pub trait EventTrait { + fn next_event(&self) -> Option; +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 2aaeac4..b229c53 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,3 @@ pub mod framework; pub mod body; +pub mod event; diff --git a/src/main.rs b/src/main.rs index f862e1e..657e957 100644 --- a/src/main.rs +++ b/src/main.rs @@ -304,6 +304,7 @@ impl strafe_client::framework::Example for Skybox { friction: 90.0, mv: 2.7, grounded: true, + jump_trying: false, walkspeed: 18.0, }; From 5391b635fb3f893aa25052499d3df2296a3a7c8e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 11:38:34 -0700 Subject: [PATCH 076/482] reorder elements --- src/body.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/body.rs b/src/body.rs index 7811718..8dfe3f9 100644 --- a/src/body.rs +++ b/src/body.rs @@ -10,11 +10,11 @@ pub struct PhysicsState { pub time: TIME, pub strafe_tick_period: TIME, pub tick: u32, - pub gravity: glam::Vec3, - pub friction: f32, pub mv: f32, - pub grounded: bool, pub walkspeed: f32, + pub friction: f32, + pub gravity: glam::Vec3, + pub grounded: bool, pub jump_trying: bool, } From fc751a9fe8d85b54db3fa88c2f8e5463fec83e92 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 7 Sep 2023 20:08:07 -0700 Subject: [PATCH 077/482] stage sweep --- src/sweep.rs | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/sweep.rs diff --git a/src/sweep.rs b/src/sweep.rs new file mode 100644 index 0000000..428063f --- /dev/null +++ b/src/sweep.rs @@ -0,0 +1,8 @@ + +//something that implements body + hitbox + transform can predict collision +impl crate::sweep::PredictCollision for Model { + fn predict_collision(&self,other:&Model) -> Option { + //math! + None + } +} \ No newline at end of file From 101f0f8d12915f52d90207958cf6336387f38f34 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 12:03:32 -0700 Subject: [PATCH 078/482] localize EventStruct --- src/body.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/body.rs b/src/body.rs index 8dfe3f9..093c4b5 100644 --- a/src/body.rs +++ b/src/body.rs @@ -1,3 +1,5 @@ +use crate::event::EventStruct; + pub struct Body { pub position: glam::Vec3,//I64 where 2^32 = 1 u pub velocity: glam::Vec3,//I64 where 2^32 = 1 u/s @@ -65,8 +67,8 @@ impl PhysicsState { self.body.position+self.body.velocity*(dt as f32)+self.gravity*((0.5*dt*dt) as f32) } - fn next_strafe_event(&self) -> Option { - return Some(crate::event::EventStruct{ + fn next_strafe_event(&self) -> Option { + return Some(EventStruct{ time:(self.time/self.strafe_tick_period+1)*self.strafe_tick_period, event:crate::event::EventEnum::StrafeTick }); @@ -75,10 +77,10 @@ impl PhysicsState { impl crate::event::EventTrait for PhysicsState { //this little next event function can cache its return value and invalidate the cached value by watching the State. - fn next_event(&self) -> Option { + fn next_event(&self) -> Option { //JUST POLLING!!! NO MUTATION - let mut best_event: Option = None; - let collect_event = |test_event:Option|{ + let mut best_event: Option = None; + let collect_event = |test_event:Option|{ match test_event { Some(unwrap_test_event) => match best_event { Some(unwrap_best_event) => if unwrap_test_event.time Date: Fri, 8 Sep 2023 12:04:30 -0700 Subject: [PATCH 079/482] jump implementation details --- src/body.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/body.rs b/src/body.rs index 093c4b5..2e5f1fe 100644 --- a/src/body.rs +++ b/src/body.rs @@ -91,9 +91,9 @@ impl crate::event::EventTrait for PhysicsState { None => (), } }; - //check to see if yee need to jump (this is not the way lol) + //autohop (already pressing spacebar; the signal to begin trying to jump is different) if self.grounded&&self.jump_trying { - //scroll will be implemented with InputEvent::InstantJump rather than InputEvent::Jump(true) + //scroll will be implemented with InputEvent::Jump(true) but it blocks setting self.jump_trying=true collect_event(Some(EventStruct{ time:self.time, event:crate::event::EventEnum::Jump From 54bf0358d6e081def6eb608bb3285760e646058f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 12:27:45 -0700 Subject: [PATCH 080/482] can't stand the idea of 10 nanoseconds less than 66 ticks per second --- src/body.rs | 9 +++++---- src/main.rs | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/body.rs b/src/body.rs index 2e5f1fe..47e26c3 100644 --- a/src/body.rs +++ b/src/body.rs @@ -10,7 +10,8 @@ pub struct PhysicsState { pub body: Body, //pub contacts: Vec, pub time: TIME, - pub strafe_tick_period: TIME, + pub strafe_tick_num: TIME, + pub strafe_tick_den: TIME, pub tick: u32, pub mv: f32, pub walkspeed: f32, @@ -26,7 +27,7 @@ const CONTROL_JUMP:u32 = 0b01000000;//temp impl PhysicsState { //delete this, we are tickless gamers pub fn run(&mut self, time: TIME, control_dir: glam::Vec3, controls: u32){ - let target_tick = (time/self.strafe_tick_period) as u32;//100t + let target_tick = (time*self.strafe_tick_num/self.strafe_tick_den) as u32; //the game code can run for 1 month before running out of ticks while self.tick Option { return Some(EventStruct{ - time:(self.time/self.strafe_tick_period+1)*self.strafe_tick_period, + time:(self.time*self.strafe_tick_num/self.strafe_tick_den+1)*self.strafe_tick_den/self.strafe_tick_num, event:crate::event::EventEnum::StrafeTick }); } diff --git a/src/main.rs b/src/main.rs index 657e957..dc84666 100644 --- a/src/main.rs +++ b/src/main.rs @@ -299,7 +299,8 @@ impl strafe_client::framework::Example for Skybox { }, time: 0, tick: 0, - strafe_tick_period: 1_000_000_000/100,//100t + strafe_tick_num: 100,//100t + strafe_tick_den: 1_000_000_000, gravity: glam::Vec3::new(0.0,-100.0,0.0), friction: 90.0, mv: 2.7, From 1f1ef5d3ad2d7d653219de1169d1a6e5d95f574e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 12:28:16 -0700 Subject: [PATCH 081/482] there is no model --- src/body.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/body.rs b/src/body.rs index 47e26c3..b47a380 100644 --- a/src/body.rs +++ b/src/body.rs @@ -102,11 +102,11 @@ impl crate::event::EventTrait for PhysicsState { } //check for collision stop events with curent contacts for collision_data in self.contacts.iter() { - collect_event(self.model.predict_collision(collision_data.model)); + collect_event(self.predict_collision(collision_data.model)); } //check for collision start events (against every part in the game with no optimization!!) for &model in self.world.models { - collect_event(self.model.predict_collision(&model)); + collect_event(self.predict_collision(&model)); } //check to see when the next strafe tick is collect_event(self.next_strafe_event()); From f600092f13a42c80a22e399a680a2985b90b059c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 12:48:11 -0700 Subject: [PATCH 082/482] LETS GET RUSTY --- src/body.rs | 23 ++++++----------------- src/event.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/body.rs b/src/body.rs index b47a380..dec612e 100644 --- a/src/body.rs +++ b/src/body.rs @@ -80,36 +80,25 @@ impl crate::event::EventTrait for PhysicsState { //this little next event function can cache its return value and invalidate the cached value by watching the State. fn next_event(&self) -> Option { //JUST POLLING!!! NO MUTATION - let mut best_event: Option = None; - let collect_event = |test_event:Option|{ - match test_event { - Some(unwrap_test_event) => match best_event { - Some(unwrap_best_event) => if unwrap_test_event.time best_event=test_event, - }, - None => (), - } - }; + let mut best = crate::event::EventCollector::new(); //autohop (already pressing spacebar; the signal to begin trying to jump is different) if self.grounded&&self.jump_trying { //scroll will be implemented with InputEvent::Jump(true) but it blocks setting self.jump_trying=true - collect_event(Some(EventStruct{ + best.collect(Some(EventStruct{ time:self.time, event:crate::event::EventEnum::Jump })); } //check for collision stop events with curent contacts for collision_data in self.contacts.iter() { - collect_event(self.predict_collision(collision_data.model)); + best.collect(self.predict_collision(collision_data.model)); } //check for collision start events (against every part in the game with no optimization!!) for &model in self.world.models { - collect_event(self.predict_collision(&model)); + best.collect(self.predict_collision(&model)); } //check to see when the next strafe tick is - collect_event(self.next_strafe_event()); - best_event + best.collect(self.next_strafe_event()); + best.event() } } diff --git a/src/event.rs b/src/event.rs index 6f45098..d226031 100644 --- a/src/event.rs +++ b/src/event.rs @@ -12,4 +12,30 @@ pub enum EventEnum { pub trait EventTrait { fn next_event(&self) -> Option; +} + +//PROPER PRIVATE FIELDS!!! +pub struct EventCollector { + event: Option, +} +impl EventCollector { + pub fn new() -> Self { + Self{event:None} + } + + pub fn collect(&mut self,test_event:Option){ + match &test_event { + Some(unwrap_test_event) => match &self.event { + Some(unwrap_best_event) => if unwrap_test_event.time self.event=test_event, + }, + None => (), + } + } + pub fn event(self) -> Option { + //STEAL EVENT AND DESTROY EVENTCOLLECTOR + return self.event + } } \ No newline at end of file From e18e8a9a7d5b3f417cef2df6c3de150972ffb243 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 14:11:24 -0700 Subject: [PATCH 083/482] walk event --- src/body.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/body.rs b/src/body.rs index dec612e..24fdeca 100644 --- a/src/body.rs +++ b/src/body.rs @@ -54,6 +54,7 @@ impl PhysicsState { if applied_friction*applied_friction Option { + //check if you are accelerating towards a walk target velocity and create an event + return None; + } } impl crate::event::EventTrait for PhysicsState { @@ -96,9 +102,13 @@ impl crate::event::EventTrait for PhysicsState { //check for collision start events (against every part in the game with no optimization!!) for &model in self.world.models { best.collect(self.predict_collision(&model)); + if self.grounded { + //walk maintenance + best.collect(self.next_walk_event()); + }else{ + //check to see when the next strafe tick is + best.collect(self.next_strafe_event()); } - //check to see when the next strafe tick is - best.collect(self.next_strafe_event()); best.event() } } From e6862b5bad61abbd93dab80661f2a10ec982275a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 15:52:51 -0700 Subject: [PATCH 084/482] rename Model to ModelGRaphics + move model graphics gen code --- src/main.rs | 62 ++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/main.rs b/src/main.rs index dc84666..59faf74 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,7 +24,7 @@ struct ModelData { entities: Vec, } -struct Model { +struct ModelGraphics { transform: glam::Mat4, vertex_buf: wgpu::Buffer, entities: Vec, @@ -122,7 +122,7 @@ pub struct Skybox { ground_pipeline: wgpu::RenderPipeline, main_bind_group: wgpu::BindGroup, camera_buf: wgpu::Buffer, - models: Vec, + models: Vec, depth_view: wgpu::TextureView, staging_belt: wgpu::util::StagingBelt, } @@ -316,6 +316,35 @@ impl strafe_client::framework::Example for Skybox { usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, }); + //drain the modeldata vec so entities can be /moved/ to models.entities + let mut models = Vec::::with_capacity(modeldatas.len()); + for (i,modeldata) in modeldatas.drain(..).enumerate() { + let model_uniforms = get_transform_uniform_data(&modeldata.transform); + let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some(format!("ModelGraphics{}",i).as_str()), + contents: bytemuck::cast_slice(&model_uniforms), + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + }); + let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &model_bind_group_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: model_buf.as_entire_binding(), + }, + ], + label: Some(format!("ModelGraphics{}",i).as_str()), + }); + //all of these are being moved here + models.push(ModelGraphics{ + transform: modeldata.transform, + vertex_buf:modeldata.vertex_buf, + entities: modeldata.entities, + bind_group: model_bind_group, + model_buf, + }) + } + let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { label: None, bind_group_layouts: &[&main_bind_group_layout, &model_bind_group_layout], @@ -511,35 +540,6 @@ impl strafe_client::framework::Example for Skybox { label: Some("Camera"), }); - //drain the modeldata vec so entities can be /moved/ to models.entities - let mut models = Vec::::with_capacity(modeldatas.len()); - for (i,modeldata) in modeldatas.drain(..).enumerate() { - let model_uniforms = get_transform_uniform_data(&modeldata.transform); - let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some(format!("Model{}",i).as_str()), - contents: bytemuck::cast_slice(&model_uniforms), - usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, - }); - let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - layout: &model_bind_group_layout, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: model_buf.as_entire_binding(), - }, - ], - label: Some(format!("Model{}",i).as_str()), - }); - //all of these are being moved here - models.push(Model{ - transform: modeldata.transform, - vertex_buf:modeldata.vertex_buf, - entities: modeldata.entities, - bind_group: model_bind_group, - model_buf, - }) - } - let depth_view = Self::create_depth_texture(config, device); Skybox { From f11742ef3bc9c1e163b93d1e7f9160eb2900b2b9 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 15:54:22 -0700 Subject: [PATCH 085/482] RelativeCollision concept --- src/body.rs | 16 +++++++++++++++- src/event.rs | 4 ++-- src/main.rs | 1 + 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/body.rs b/src/body.rs index 24fdeca..f900da5 100644 --- a/src/body.rs +++ b/src/body.rs @@ -8,7 +8,7 @@ pub struct Body { pub struct PhysicsState { pub body: Body, - //pub contacts: Vec, + pub contacts: Vec, pub time: TIME, pub strafe_tick_num: TIME, pub strafe_tick_den: TIME, @@ -21,6 +21,20 @@ pub struct PhysicsState { pub jump_trying: bool, } +pub struct RelativeCollision { + face: Face,//just an id + model: u32,//using id to avoid lifetimes +} + +impl RelativeCollision { + pub fn mesh(&self,models:&Vec) -> TreyMesh { + return models.get(self.model as usize).unwrap().face_mesh(self.face) + } + pub fn normal(&self,models:&Vec) -> glam::Vec3 { + return models.get(self.model as usize).unwrap().face_normal(self.face) + } +} + pub type TIME = i64; const CONTROL_JUMP:u32 = 0b01000000;//temp diff --git a/src/event.rs b/src/event.rs index d226031..37fcf30 100644 --- a/src/event.rs +++ b/src/event.rs @@ -4,8 +4,8 @@ pub struct EventStruct { } pub enum EventEnum { - CollisionStart,//(Collideable),//Body::CollisionStart - CollisionEnd,//(Collideable),//Body::CollisionEnd + CollisionStart(crate::body::RelativeCollision),//Body::CollisionStart + CollisionEnd(crate::body::RelativeCollision),//Body::CollisionEnd StrafeTick, Jump, } diff --git a/src/main.rs b/src/main.rs index 59faf74..8bba40c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -307,6 +307,7 @@ impl strafe_client::framework::Example for Skybox { grounded: true, jump_trying: false, walkspeed: 18.0, + contacts: Vec::::new(), }; let camera_uniforms = camera.to_uniform_data(physics.extrapolate_position(0)); From 2c4e6f642ba08171aa4fb117c2b0c020a9af207c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 15:54:43 -0700 Subject: [PATCH 086/482] boilerplate --- src/body.rs | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/src/body.rs b/src/body.rs index f900da5..c6f4eb6 100644 --- a/src/body.rs +++ b/src/body.rs @@ -21,6 +21,125 @@ pub struct PhysicsState { pub jump_trying: bool, } +#[derive(Clone,Copy)] +enum AabbFace{ + Right,//+X + Top, + Back, + Left, + Bottom, + Front, +} + +struct Aabb { + min: glam::Vec3, + max: glam::Vec3, +} + +impl Aabb { + // const FACE_DATA: [[f32; 3]; 6] = [ + // [0.0f32, 0., 1.], + // [0.0f32, 0., -1.], + // [1.0f32, 0., 0.], + // [-1.0f32, 0., 0.], + // [0.0f32, 1., 0.], + // [0.0f32, -1., 0.], + // ]; + const VERTEX_DATA_RIGHT: &'static [glam::Vec3; 4] = &[ + glam::vec3(1., -1., -1.), + glam::vec3(1., 1., -1.), + glam::vec3(1., 1., 1.), + glam::vec3(1., -1., 1.), + ]; + const VERTEX_DATA_TOP: &'static [glam::Vec3; 4] = &[ + glam::vec3(1., 1., -1.), + glam::vec3(-1., 1., -1.), + glam::vec3(-1., 1., 1.), + glam::vec3(1., 1., 1.), + ]; + const VERTEX_DATA_BACK: &'static [glam::Vec3; 4] = &[ + glam::vec3(-1., -1., 1.), + glam::vec3(1., -1., 1.), + glam::vec3(1., 1., 1.), + glam::vec3(-1., 1., 1.), + ]; + const VERTEX_DATA_LEFT: &'static [glam::Vec3; 4] = &[ + glam::vec3(-1., -1., 1.), + glam::vec3(-1., 1., 1.), + glam::vec3(-1., 1., -1.), + glam::vec3(-1., -1., -1.), + ]; + const VERTEX_DATA_BOTTOM: &'static [glam::Vec3; 4] = &[ + glam::vec3(1., -1., 1.), + glam::vec3(-1., -1., 1.), + glam::vec3(-1., -1., -1.), + glam::vec3(1., -1., -1.), + ]; + const VERTEX_DATA_FRONT: &'static [glam::Vec3; 4] = &[ + glam::vec3(-1., 1., -1.), + glam::vec3(1., 1., -1.), + glam::vec3(1., -1., -1.), + glam::vec3(-1., -1., -1.), + ]; + + pub fn new() -> Self { + Self {min: glam::Vec3::INFINITY,max: glam::Vec3::NEG_INFINITY} + } + + pub fn grow(&mut self, point:glam::Vec3){ + self.min=self.min.min(point); + self.max=self.max.max(point); + } + + pub fn normal(face:AabbFace) -> glam::Vec3 { + match face { + AabbFace::Right => glam::vec3(1.,0.,0.), + AabbFace::Top => glam::vec3(0.,1.,0.), + AabbFace::Back => glam::vec3(0.,0.,1.), + AabbFace::Left => glam::vec3(-1.,0.,0.), + AabbFace::Bottom => glam::vec3(0.,-1.,0.), + AabbFace::Front => glam::vec3(0.,0.,-1.), + } + } + pub fn face_vertices(face:AabbFace) -> &'static [glam::Vec3;4] { + match face { + AabbFace::Right => Self::VERTEX_DATA_RIGHT, + AabbFace::Top => Self::VERTEX_DATA_TOP, + AabbFace::Back => Self::VERTEX_DATA_BACK, + AabbFace::Left => Self::VERTEX_DATA_LEFT, + AabbFace::Bottom => Self::VERTEX_DATA_BOTTOM, + AabbFace::Front => Self::VERTEX_DATA_FRONT, + } + } +} + +type Face = AabbFace; +type TreyMesh = Aabb; + +pub struct Model { + //A model is a thing that has a hitbox. can be represented by a list of TreyMesh-es + //in this iteration, all it needs is extents. + transform: glam::Mat4, +} + +impl Model { + pub fn face_vertices(&self,face:Face) -> &'static [glam::Vec3;4] { + Aabb::face_vertices(face) + } + pub fn face_mesh(&self,face:Face) -> TreyMesh { + let mut aabb=Aabb::new(); + for &vertex in self.face_vertices(face).iter() { + aabb.grow(vertex); + } + return aabb; + } + pub fn face_normal(&self,face:Face) -> glam::Vec3 { + let mut n=glam::Vec3Swizzles::xyzz(Aabb::normal(face)); + n.w=0.0;//what a man will do to avoid writing out the components + glam::Vec4Swizzles::xyz(self.transform*n)//this is wrong for scale + } +} + pub struct RelativeCollision { face: Face,//just an id model: u32,//using id to avoid lifetimes From addde65caab74f1e3eb0e2864af3cb04281d2982 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 15:55:33 -0700 Subject: [PATCH 087/482] fix up next_event lsp errors --- src/body.rs | 14 +++++++++++--- src/main.rs | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/body.rs b/src/body.rs index c6f4eb6..2caa81b 100644 --- a/src/body.rs +++ b/src/body.rs @@ -9,6 +9,7 @@ pub struct Body { pub struct PhysicsState { pub body: Body, pub contacts: Vec, + pub models_cringe_clone: Vec, pub time: TIME, pub strafe_tick_num: TIME, pub strafe_tick_den: TIME, @@ -213,6 +214,12 @@ impl PhysicsState { //check if you are accelerating towards a walk target velocity and create an event return None; } + fn predict_collision_end(&self,model:&Model) -> Option { + None + } + fn predict_collision_start(&self,model:&Model) -> Option { + None + } } impl crate::event::EventTrait for PhysicsState { @@ -230,11 +237,12 @@ impl crate::event::EventTrait for PhysicsState { } //check for collision stop events with curent contacts for collision_data in self.contacts.iter() { - best.collect(self.predict_collision(collision_data.model)); + best.collect(self.predict_collision_end(self.models_cringe_clone.get(collision_data.model as usize).unwrap())); } //check for collision start events (against every part in the game with no optimization!!) - for &model in self.world.models { - best.collect(self.predict_collision(&model)); + for model in &self.models_cringe_clone { + best.collect(self.predict_collision_start(model)); + } if self.grounded { //walk maintenance best.collect(self.next_walk_event()); diff --git a/src/main.rs b/src/main.rs index 8bba40c..652a04f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -308,6 +308,7 @@ impl strafe_client::framework::Example for Skybox { jump_trying: false, walkspeed: 18.0, contacts: Vec::::new(), + models_cringe_clone: modeldatas.iter().map(|m|crate::body::Model{transform:m.transform}), }; let camera_uniforms = camera.to_uniform_data(physics.extrapolate_position(0)); From 8c2dda52052b3130aa527c54c1b397557e82595f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 15:55:43 -0700 Subject: [PATCH 088/482] bad data normalization --- src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/body.rs b/src/body.rs index 2caa81b..1f5dd19 100644 --- a/src/body.rs +++ b/src/body.rs @@ -157,7 +157,7 @@ impl RelativeCollision { pub type TIME = i64; -const CONTROL_JUMP:u32 = 0b01000000;//temp +const CONTROL_JUMP:u32 = 0b01000000;//temp DATA NORMALIZATION!@#$ impl PhysicsState { //delete this, we are tickless gamers pub fn run(&mut self, time: TIME, control_dir: glam::Vec3, controls: u32){ From ff54a034874b549100e5af6f59a5e43fe613ce31 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 16:14:01 -0700 Subject: [PATCH 089/482] happy compiler happy programmer --- src/body.rs | 23 +++++++++++++---------- src/main.rs | 4 ++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/body.rs b/src/body.rs index 1f5dd19..74a9f43 100644 --- a/src/body.rs +++ b/src/body.rs @@ -23,7 +23,7 @@ pub struct PhysicsState { } #[derive(Clone,Copy)] -enum AabbFace{ +pub enum AabbFace{ Right,//+X Top, Back, @@ -32,7 +32,7 @@ enum AabbFace{ Front, } -struct Aabb { +pub struct Aabb { min: glam::Vec3, max: glam::Vec3, } @@ -46,37 +46,37 @@ impl Aabb { // [0.0f32, 1., 0.], // [0.0f32, -1., 0.], // ]; - const VERTEX_DATA_RIGHT: &'static [glam::Vec3; 4] = &[ + const VERTEX_DATA_RIGHT: [glam::Vec3; 4] = [ glam::vec3(1., -1., -1.), glam::vec3(1., 1., -1.), glam::vec3(1., 1., 1.), glam::vec3(1., -1., 1.), ]; - const VERTEX_DATA_TOP: &'static [glam::Vec3; 4] = &[ + const VERTEX_DATA_TOP: [glam::Vec3; 4] = [ glam::vec3(1., 1., -1.), glam::vec3(-1., 1., -1.), glam::vec3(-1., 1., 1.), glam::vec3(1., 1., 1.), ]; - const VERTEX_DATA_BACK: &'static [glam::Vec3; 4] = &[ + const VERTEX_DATA_BACK: [glam::Vec3; 4] = [ glam::vec3(-1., -1., 1.), glam::vec3(1., -1., 1.), glam::vec3(1., 1., 1.), glam::vec3(-1., 1., 1.), ]; - const VERTEX_DATA_LEFT: &'static [glam::Vec3; 4] = &[ + const VERTEX_DATA_LEFT: [glam::Vec3; 4] = [ glam::vec3(-1., -1., 1.), glam::vec3(-1., 1., 1.), glam::vec3(-1., 1., -1.), glam::vec3(-1., -1., -1.), ]; - const VERTEX_DATA_BOTTOM: &'static [glam::Vec3; 4] = &[ + const VERTEX_DATA_BOTTOM: [glam::Vec3; 4] = [ glam::vec3(1., -1., 1.), glam::vec3(-1., -1., 1.), glam::vec3(-1., -1., -1.), glam::vec3(1., -1., -1.), ]; - const VERTEX_DATA_FRONT: &'static [glam::Vec3; 4] = &[ + const VERTEX_DATA_FRONT: [glam::Vec3; 4] = [ glam::vec3(-1., 1., -1.), glam::vec3(1., 1., -1.), glam::vec3(1., -1., -1.), @@ -102,7 +102,7 @@ impl Aabb { AabbFace::Front => glam::vec3(0.,0.,-1.), } } - pub fn face_vertices(face:AabbFace) -> &'static [glam::Vec3;4] { + pub fn face_vertices(face:AabbFace) -> [glam::Vec3;4] { match face { AabbFace::Right => Self::VERTEX_DATA_RIGHT, AabbFace::Top => Self::VERTEX_DATA_TOP, @@ -124,7 +124,10 @@ pub struct Model { } impl Model { - pub fn face_vertices(&self,face:Face) -> &'static [glam::Vec3;4] { + pub fn new(transform:glam::Mat4) -> Self { + Self{transform} + } + pub fn face_vertices(&self,face:Face) -> [glam::Vec3;4] { Aabb::face_vertices(face) } pub fn face_mesh(&self,face:Face) -> TreyMesh { diff --git a/src/main.rs b/src/main.rs index 652a04f..d1c9d65 100644 --- a/src/main.rs +++ b/src/main.rs @@ -307,8 +307,8 @@ impl strafe_client::framework::Example for Skybox { grounded: true, jump_trying: false, walkspeed: 18.0, - contacts: Vec::::new(), - models_cringe_clone: modeldatas.iter().map(|m|crate::body::Model{transform:m.transform}), + contacts: Vec::::new(), + models_cringe_clone: modeldatas.iter().map(|m|strafe_client::body::Model::new(m.transform)).collect(), }; let camera_uniforms = camera.to_uniform_data(physics.extrapolate_position(0)); From 846f68164898b02cba471a3db1ad9733b551aae6 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 17:00:50 -0700 Subject: [PATCH 090/482] generic events --- src/body.rs | 23 +++++++++++++++-------- src/event.rs | 25 +++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/body.rs b/src/body.rs index 74a9f43..70a30b8 100644 --- a/src/body.rs +++ b/src/body.rs @@ -1,5 +1,12 @@ use crate::event::EventStruct; +pub enum PhysicsEvent { + CollisionStart(RelativeCollision), + CollisionEnd(RelativeCollision), + StrafeTick, + Jump, +} + pub struct Body { pub position: glam::Vec3,//I64 where 2^32 = 1 u pub velocity: glam::Vec3,//I64 where 2^32 = 1 u/s @@ -206,28 +213,28 @@ impl PhysicsState { self.body.position+self.body.velocity*(dt as f32)+self.gravity*((0.5*dt*dt) as f32) } - fn next_strafe_event(&self) -> Option { + fn next_strafe_event(&self) -> Option> { return Some(EventStruct{ time:(self.time*self.strafe_tick_num/self.strafe_tick_den+1)*self.strafe_tick_den/self.strafe_tick_num, - event:crate::event::EventEnum::StrafeTick + event:PhysicsEvent::StrafeTick }); } - fn next_walk_event(&self) -> Option { + fn next_walk_event(&self) -> Option> { //check if you are accelerating towards a walk target velocity and create an event return None; } - fn predict_collision_end(&self,model:&Model) -> Option { + fn predict_collision_end(&self,model:&Model) -> Option> { None } - fn predict_collision_start(&self,model:&Model) -> Option { + fn predict_collision_start(&self,model:&Model) -> Option> { None } } -impl crate::event::EventTrait for PhysicsState { +impl crate::event::EventEmitter for PhysicsState { //this little next event function can cache its return value and invalidate the cached value by watching the State. - fn next_event(&self) -> Option { + fn next_event(&self) -> Option> { //JUST POLLING!!! NO MUTATION let mut best = crate::event::EventCollector::new(); //autohop (already pressing spacebar; the signal to begin trying to jump is different) @@ -235,7 +242,7 @@ impl crate::event::EventTrait for PhysicsState { //scroll will be implemented with InputEvent::Jump(true) but it blocks setting self.jump_trying=true best.collect(Some(EventStruct{ time:self.time, - event:crate::event::EventEnum::Jump + event:PhysicsEvent::Jump })); } //check for collision stop events with curent contacts diff --git a/src/event.rs b/src/event.rs index 37fcf30..893039f 100644 --- a/src/event.rs +++ b/src/event.rs @@ -1,29 +1,22 @@ -pub struct EventStruct { +pub struct EventStruct { pub time: crate::body::TIME, - pub event: EventEnum, + pub event: E, } -pub enum EventEnum { - CollisionStart(crate::body::RelativeCollision),//Body::CollisionStart - CollisionEnd(crate::body::RelativeCollision),//Body::CollisionEnd - StrafeTick, - Jump, -} - -pub trait EventTrait { - fn next_event(&self) -> Option; +pub trait EventEmitter { + fn next_event(&self) -> Option>; } //PROPER PRIVATE FIELDS!!! -pub struct EventCollector { - event: Option, +pub struct EventCollector { + event: Option>, } -impl EventCollector { +impl EventCollector { pub fn new() -> Self { Self{event:None} } - pub fn collect(&mut self,test_event:Option){ + pub fn collect(&mut self,test_event:Option>){ match &test_event { Some(unwrap_test_event) => match &self.event { Some(unwrap_best_event) => if unwrap_test_event.time (), } } - pub fn event(self) -> Option { + pub fn event(self) -> Option> { //STEAL EVENT AND DESTROY EVENTCOLLECTOR return self.event } From a4ed50fc38cc993d309ac94c800d476892e1b697 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 17:15:49 -0700 Subject: [PATCH 091/482] EventConsumer --- src/body.rs | 6 ++++++ src/event.rs | 3 +++ 2 files changed, 9 insertions(+) diff --git a/src/body.rs b/src/body.rs index 70a30b8..6730de6 100644 --- a/src/body.rs +++ b/src/body.rs @@ -263,3 +263,9 @@ impl crate::event::EventEmitter for PhysicsState { best.event() } } + +impl crate::event::EventConsumer for PhysicsState { + fn process_event(&mut self, event:EventStruct) { + // + } +} \ No newline at end of file diff --git a/src/event.rs b/src/event.rs index 893039f..11e48e3 100644 --- a/src/event.rs +++ b/src/event.rs @@ -6,6 +6,9 @@ pub struct EventStruct { pub trait EventEmitter { fn next_event(&self) -> Option>; } +pub trait EventConsumer { + fn process_event(&mut self, event:EventStruct); +} //PROPER PRIVATE FIELDS!!! pub struct EventCollector { From 949897a55810aef7b7332c849d7e3d9f49f9d834 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 17:34:26 -0700 Subject: [PATCH 092/482] rename EventStruct to TimedInstruction --- src/body.rs | 48 ++++++++++++++++++++++++------------------------ src/event.rs | 38 +++++++++++++++++++------------------- src/lib.rs | 2 +- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/body.rs b/src/body.rs index 6730de6..5d02a11 100644 --- a/src/body.rs +++ b/src/body.rs @@ -1,6 +1,6 @@ -use crate::event::EventStruct; +use crate::instruction::TimedInstruction; -pub enum PhysicsEvent { +pub enum PhysicsInstruction { CollisionStart(RelativeCollision), CollisionEnd(RelativeCollision), StrafeTick, @@ -198,7 +198,7 @@ impl PhysicsState { if applied_friction*applied_friction Option> { - return Some(EventStruct{ + fn next_strafe_instruction(&self) -> Option> { + return Some(TimedInstruction{ time:(self.time*self.strafe_tick_num/self.strafe_tick_den+1)*self.strafe_tick_den/self.strafe_tick_num, - event:PhysicsEvent::StrafeTick + instruction:PhysicsInstruction::StrafeTick }); } - fn next_walk_event(&self) -> Option> { - //check if you are accelerating towards a walk target velocity and create an event + fn next_walk_instruction(&self) -> Option> { + //check if you are accelerating towards a walk target velocity and create an instruction return None; } - fn predict_collision_end(&self,model:&Model) -> Option> { + fn predict_collision_end(&self,model:&Model) -> Option> { None } - fn predict_collision_start(&self,model:&Model) -> Option> { + fn predict_collision_start(&self,model:&Model) -> Option> { None } } -impl crate::event::EventEmitter for PhysicsState { - //this little next event function can cache its return value and invalidate the cached value by watching the State. - fn next_event(&self) -> Option> { +impl crate::instruction::InstructionEmitter for PhysicsState { + //this little next instruction function can cache its return value and invalidate the cached value by watching the State. + fn next_instruction(&self) -> Option> { //JUST POLLING!!! NO MUTATION - let mut best = crate::event::EventCollector::new(); + let mut best = crate::instruction::InstructionCollector::new(); //autohop (already pressing spacebar; the signal to begin trying to jump is different) if self.grounded&&self.jump_trying { - //scroll will be implemented with InputEvent::Jump(true) but it blocks setting self.jump_trying=true - best.collect(Some(EventStruct{ + //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true + best.collect(Some(TimedInstruction{ time:self.time, - event:PhysicsEvent::Jump + instruction:PhysicsInstruction::Jump })); } - //check for collision stop events with curent contacts + //check for collision stop instructions with curent contacts for collision_data in self.contacts.iter() { best.collect(self.predict_collision_end(self.models_cringe_clone.get(collision_data.model as usize).unwrap())); } - //check for collision start events (against every part in the game with no optimization!!) + //check for collision start instructions (against every part in the game with no optimization!!) for model in &self.models_cringe_clone { best.collect(self.predict_collision_start(model)); } if self.grounded { //walk maintenance - best.collect(self.next_walk_event()); + best.collect(self.next_walk_instruction()); }else{ //check to see when the next strafe tick is - best.collect(self.next_strafe_event()); + best.collect(self.next_strafe_instruction()); } - best.event() + best.instruction() } } -impl crate::event::EventConsumer for PhysicsState { - fn process_event(&mut self, event:EventStruct) { +impl crate::instruction::InstructionConsumer for PhysicsState { + fn process_instruction(&mut self, instruction:TimedInstruction) { // } } \ No newline at end of file diff --git a/src/event.rs b/src/event.rs index 11e48e3..f45efe9 100644 --- a/src/event.rs +++ b/src/event.rs @@ -1,37 +1,37 @@ -pub struct EventStruct { +pub struct TimedInstruction { pub time: crate::body::TIME, - pub event: E, + pub instruction: I, } -pub trait EventEmitter { - fn next_event(&self) -> Option>; +pub trait InstructionEmitter { + fn next_instruction(&self) -> Option>; } -pub trait EventConsumer { - fn process_event(&mut self, event:EventStruct); +pub trait InstructionConsumer { + fn process_instruction(&mut self, instruction:TimedInstruction); } //PROPER PRIVATE FIELDS!!! -pub struct EventCollector { - event: Option>, +pub struct InstructionCollector { + instruction: Option>, } -impl EventCollector { +impl InstructionCollector { pub fn new() -> Self { - Self{event:None} + Self{instruction:None} } - pub fn collect(&mut self,test_event:Option>){ - match &test_event { - Some(unwrap_test_event) => match &self.event { - Some(unwrap_best_event) => if unwrap_test_event.time>){ + match &instruction { + Some(unwrap_instruction) => match &self.instruction { + Some(unwrap_best_instruction) => if unwrap_instruction.time self.event=test_event, + None => self.instruction=instruction, }, None => (), } } - pub fn event(self) -> Option> { - //STEAL EVENT AND DESTROY EVENTCOLLECTOR - return self.event + pub fn instruction(self) -> Option> { + //STEAL INSTRUCTION AND DESTROY INSTRUCTIONCOLLECTOR + return self.instruction } } \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index b229c53..fd9d95a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,3 @@ pub mod framework; pub mod body; -pub mod event; +pub mod instruction; From cead05b08bbd21ada4192d5fcc93463a4ad05671 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 17:31:16 -0700 Subject: [PATCH 093/482] rename event.rs to instruction.rs --- src/{event.rs => instruction.rs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{event.rs => instruction.rs} (100%) diff --git a/src/event.rs b/src/instruction.rs similarity index 100% rename from src/event.rs rename to src/instruction.rs From 53605746d46baa86da2cac28a30b55f9de90c0b6 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 20:12:58 -0700 Subject: [PATCH 094/482] rename best to collector --- src/body.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/body.rs b/src/body.rs index 5d02a11..7c79ea5 100644 --- a/src/body.rs +++ b/src/body.rs @@ -236,31 +236,31 @@ impl crate::instruction::InstructionEmitter for PhysicsState //this little next instruction function can cache its return value and invalidate the cached value by watching the State. fn next_instruction(&self) -> Option> { //JUST POLLING!!! NO MUTATION - let mut best = crate::instruction::InstructionCollector::new(); + let mut collector = crate::instruction::InstructionCollector::new(); //autohop (already pressing spacebar; the signal to begin trying to jump is different) if self.grounded&&self.jump_trying { //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true - best.collect(Some(TimedInstruction{ + collector.collect(Some(TimedInstruction{ time:self.time, instruction:PhysicsInstruction::Jump })); } //check for collision stop instructions with curent contacts for collision_data in self.contacts.iter() { - best.collect(self.predict_collision_end(self.models_cringe_clone.get(collision_data.model as usize).unwrap())); + collector.collect(self.predict_collision_end(self.models_cringe_clone.get(collision_data.model as usize).unwrap())); } //check for collision start instructions (against every part in the game with no optimization!!) for model in &self.models_cringe_clone { - best.collect(self.predict_collision_start(model)); + collector.collect(self.predict_collision_start(model)); } if self.grounded { //walk maintenance - best.collect(self.next_walk_instruction()); + collector.collect(self.next_walk_instruction()); }else{ //check to see when the next strafe tick is - best.collect(self.next_strafe_instruction()); + collector.collect(self.next_strafe_instruction()); } - best.instruction() + collector.instruction() } } From 4f5c9afed3c70d9a32855fe99d268d54f7619b8f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 20:13:30 -0700 Subject: [PATCH 095/482] comments on implementing game mechanics --- src/body.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/body.rs b/src/body.rs index 7c79ea5..b60c221 100644 --- a/src/body.rs +++ b/src/body.rs @@ -5,6 +5,12 @@ pub enum PhysicsInstruction { CollisionEnd(RelativeCollision), StrafeTick, Jump, + // Water, + // Spawn( + // Option, + // bool,//true = Trigger; false = teleport + // bool,//true = Force + // ) } pub struct Body { @@ -216,15 +222,48 @@ impl PhysicsState { fn next_strafe_instruction(&self) -> Option> { return Some(TimedInstruction{ time:(self.time*self.strafe_tick_num/self.strafe_tick_den+1)*self.strafe_tick_den/self.strafe_tick_num, + //only poll the physics if there is a before and after mouse event instruction:PhysicsInstruction::StrafeTick }); } + //state mutated on collision: + //Accelerator + //stair step-up + + //state mutated on instruction + //change fly acceleration (fly_sustain) + //change fly velocity + + //generic event emmiters + //PlatformStandTime + //walk/swim/air/ladder sounds + //VState? + + //falling under the map + // fn next_respawn_instruction(&self) -> Option> { + // if self.body.position Option> { + // return Some(TimedInstruction{ + // time:(self.time*self.strafe_tick_num/self.strafe_tick_den+1)*self.strafe_tick_den/self.strafe_tick_num, + // //only poll the physics if there is a before and after mouse event + // instruction:PhysicsInstruction::Water + // }); + // } + fn next_walk_instruction(&self) -> Option> { //check if you are accelerating towards a walk target velocity and create an instruction return None; } fn predict_collision_end(&self,model:&Model) -> Option> { + //must treat cancollide false objects differently: you may not exit through the same face you entered. None } fn predict_collision_start(&self,model:&Model) -> Option> { From 8daf4329914934eae6161f8c64a29e0fd1713e56 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 13:20:34 -0700 Subject: [PATCH 096/482] zeroes --- src/lib.rs | 1 + src/zeroes.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/zeroes.rs diff --git a/src/lib.rs b/src/lib.rs index fd9d95a..88b93b0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ pub mod framework; pub mod body; +pub mod zeroes; pub mod instruction; diff --git a/src/zeroes.rs b/src/zeroes.rs new file mode 100644 index 0000000..02fec71 --- /dev/null +++ b/src/zeroes.rs @@ -0,0 +1,27 @@ +//find roots of polynomials +pub fn zeroes2(a0:f32,a1:f32,a2:f32) -> Vec{ + if a2==0f32{ + return zeroes1(a0, a1); + } + let mut radicand=a1*a1-4f32*a2*a0; + if 0f32 Vec { + if a1==0f32{ + return vec![]; + } else { + return vec![-a0/a1]; + } +} \ No newline at end of file From 0fe14749d30fc8ff22b6acdd62d239dfcad5aef2 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 8 Sep 2023 20:14:18 -0700 Subject: [PATCH 097/482] wip: tickless physics --- src/body.rs | 118 +++++++++++++++++++++++++++++++++------------------- src/main.rs | 16 +++---- 2 files changed, 83 insertions(+), 51 deletions(-) diff --git a/src/body.rs b/src/body.rs index b60c221..ca3f490 100644 --- a/src/body.rs +++ b/src/body.rs @@ -5,6 +5,8 @@ pub enum PhysicsInstruction { CollisionEnd(RelativeCollision), StrafeTick, Jump, + SetWalkTargetVelocity(glam::Vec3), + ReachWalkTargetVelocity, // Water, // Spawn( // Option, @@ -14,15 +16,25 @@ pub enum PhysicsInstruction { } pub struct Body { - pub position: glam::Vec3,//I64 where 2^32 = 1 u - pub velocity: glam::Vec3,//I64 where 2^32 = 1 u/s - pub time: TIME,//nanoseconds x xxxxD! + position: glam::Vec3,//I64 where 2^32 = 1 u + velocity: glam::Vec3,//I64 where 2^32 = 1 u/s + acceleration: glam::Vec3,//I64 where 2^32 = 1 u/s/s + time: TIME,//nanoseconds x xxxxD! +} + +pub enum MoveRestriction { + Air, + Water, + Ground, + Ladder,//multiple ladders how } pub struct PhysicsState { pub body: Body, pub contacts: Vec, + //temp pub models_cringe_clone: Vec, + pub temp_control_dir: glam::Vec3, pub time: TIME, pub strafe_tick_num: TIME, pub strafe_tick_den: TIME, @@ -30,6 +42,7 @@ pub struct PhysicsState { pub mv: f32, pub walkspeed: f32, pub friction: f32, + pub walk_target_velocity: glam::Vec3, pub gravity: glam::Vec3, pub grounded: bool, pub jump_trying: bool, @@ -173,50 +186,45 @@ impl RelativeCollision { pub type TIME = i64; +impl Body { + pub fn with_position(position:glam::Vec3) -> Self { + Self{ + position: position, + velocity: glam::Vec3::ZERO, + acceleration: glam::Vec3::ZERO, + time: 0, + } + } + pub fn extrapolated_position(&self,time: TIME)->glam::Vec3{ + let dt=(time-self.time) as f64/1_000_000_000f64; + self.position+self.velocity*(dt as f32)+self.acceleration*((0.5*dt*dt) as f32) + } + pub fn advance_time(&mut self, time: TIME){ + self.position=self.extrapolated_position(time); + self.time=time; + } +} + const CONTROL_JUMP:u32 = 0b01000000;//temp DATA NORMALIZATION!@#$ impl PhysicsState { - //delete this, we are tickless gamers - pub fn run(&mut self, time: TIME, control_dir: glam::Vec3, controls: u32){ - let target_tick = (time*self.strafe_tick_num/self.strafe_tick_den) as u32; - //the game code can run for 1 month before running out of ticks - while self.tick glam::Vec3 { - let dt=(time-self.body.time) as f64/1_000_000_000f64; - self.body.position+self.body.velocity*(dt as f32)+self.gravity*((0.5*dt*dt) as f32) + pub fn advance_time(&mut self, time: TIME){ + self.body.advance_time(time); + self.time=time; } fn next_strafe_instruction(&self) -> Option> { @@ -304,7 +312,31 @@ impl crate::instruction::InstructionEmitter for PhysicsState } impl crate::instruction::InstructionConsumer for PhysicsState { - fn process_instruction(&mut self, instruction:TimedInstruction) { - // + fn process_instruction(&mut self, ins:TimedInstruction) { + //mutate position and velocity and time + self.advance_time(ins.time);//should this be in run? + match ins.instruction { + PhysicsInstruction::CollisionStart(_) => todo!(), + PhysicsInstruction::CollisionEnd(_) => todo!(), + PhysicsInstruction::StrafeTick => { + //let control_dir=self.get_control_dir();//this should respect your mouse interpolation settings + let d=self.body.velocity.dot(self.temp_control_dir); + if d { + self.grounded=false;//do I need this? + self.body.velocity+=glam::Vec3::new(0.0,0.715588/2.0*100.0,0.0); + } + PhysicsInstruction::ReachWalkTargetVelocity => { + //precisely set velocity + self.body.velocity=self.walk_target_velocity; + } + PhysicsInstruction::SetWalkTargetVelocity(v) => { + self.walk_target_velocity=v; + //calculate acceleration yada yada + }, + } } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index d1c9d65..c6e526e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -292,11 +292,7 @@ impl strafe_client::framework::Example for Skybox { controls:0, }; let physics = strafe_client::body::PhysicsState { - body: strafe_client::body::Body { - position: glam::Vec3::new(5.0,0.0,5.0), - velocity: glam::Vec3::new(0.0,0.0,0.0), - time: 0, - }, + body: strafe_client::body::Body::with_position(glam::Vec3::new(5.0,5.0,5.0)), time: 0, tick: 0, strafe_tick_num: 100,//100t @@ -306,12 +302,14 @@ impl strafe_client::framework::Example for Skybox { mv: 2.7, grounded: true, jump_trying: false, + temp_control_dir: glam::Vec3::ZERO, walkspeed: 18.0, contacts: Vec::::new(), models_cringe_clone: modeldatas.iter().map(|m|strafe_client::body::Model::new(m.transform)).collect(), + walk_target_velocity: glam::Vec3::ZERO, }; - let camera_uniforms = camera.to_uniform_data(physics.extrapolate_position(0)); + let camera_uniforms = camera.to_uniform_data(physics.body.extrapolated_position(0)); let camera_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Camera"), contents: bytemuck::cast_slice(&camera_uniforms), @@ -638,13 +636,15 @@ impl strafe_client::framework::Example for Skybox { let time=self.start_time.elapsed().as_nanos() as i64; - self.physics.run(time,control_dir,self.camera.controls); + self.physics.temp_control_dir=control_dir; + self.physics.jump_trying=self.camera.controls&CONTROL_JUMP!=0; + self.physics.run(time); let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); // update rotation - let camera_uniforms = self.camera.to_uniform_data(self.physics.extrapolate_position(time)); + let camera_uniforms = self.camera.to_uniform_data(self.physics.body.extrapolated_position(time)); self.staging_belt .write_buffer( &mut encoder, From a5aa89064b3c462b46cb35227cfd677639347535 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 9 Sep 2023 12:42:51 -0700 Subject: [PATCH 098/482] next_instruction non-optional time_limit --- src/body.rs | 11 ++++------- src/instruction.rs | 32 +++++++++++++++++++++----------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/body.rs b/src/body.rs index ca3f490..55cbb30 100644 --- a/src/body.rs +++ b/src/body.rs @@ -1,4 +1,4 @@ -use crate::instruction::TimedInstruction; +use crate::instruction::{InstructionEmitter, InstructionConsumer, TimedInstruction}; pub enum PhysicsInstruction { CollisionStart(RelativeCollision), @@ -210,10 +210,7 @@ impl PhysicsState { //tickless gaming pub fn run(&mut self, time: TIME){ //prepare is ommitted - everything is done via instructions. - while let Some(instruction) = self.next_instruction() {//collect - if time for PhysicsState { //this little next instruction function can cache its return value and invalidate the cached value by watching the State. - fn next_instruction(&self) -> Option> { + fn next_instruction(&self,time_limit:TIME) -> Option> { //JUST POLLING!!! NO MUTATION - let mut collector = crate::instruction::InstructionCollector::new(); + let mut collector = crate::instruction::InstructionCollector::new(time_limit); //autohop (already pressing spacebar; the signal to begin trying to jump is different) if self.grounded&&self.jump_trying { //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true diff --git a/src/instruction.rs b/src/instruction.rs index f45efe9..a56b848 100644 --- a/src/instruction.rs +++ b/src/instruction.rs @@ -4,7 +4,7 @@ pub struct TimedInstruction { } pub trait InstructionEmitter { - fn next_instruction(&self) -> Option>; + fn next_instruction(&self, time:crate::body::TIME) -> Option>; } pub trait InstructionConsumer { fn process_instruction(&mut self, instruction:TimedInstruction); @@ -12,26 +12,36 @@ pub trait InstructionConsumer { //PROPER PRIVATE FIELDS!!! pub struct InstructionCollector { - instruction: Option>, + time: crate::body::TIME, + instruction: Option, } impl InstructionCollector { - pub fn new() -> Self { - Self{instruction:None} + pub fn new(time:crate::body::TIME) -> Self { + Self{ + time, + instruction:None + } } pub fn collect(&mut self,instruction:Option>){ - match &instruction { - Some(unwrap_instruction) => match &self.instruction { - Some(unwrap_best_instruction) => if unwrap_instruction.time self.instruction=instruction, + match instruction { + Some(unwrap_instruction) => { + if unwrap_instruction.time (), } } pub fn instruction(self) -> Option> { //STEAL INSTRUCTION AND DESTROY INSTRUCTIONCOLLECTOR - return self.instruction + match self.instruction { + Some(instruction)=>Some(TimedInstruction{ + time:self.time, + instruction + }), + None => None, + } } } \ No newline at end of file From c5636f7fcd56d492017668b566125d5198c74e50 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 9 Sep 2023 14:05:00 -0700 Subject: [PATCH 099/482] delete unused --- src/body.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/body.rs b/src/body.rs index 55cbb30..c0fe94e 100644 --- a/src/body.rs +++ b/src/body.rs @@ -205,7 +205,6 @@ impl Body { } } -const CONTROL_JUMP:u32 = 0b01000000;//temp DATA NORMALIZATION!@#$ impl PhysicsState { //tickless gaming pub fn run(&mut self, time: TIME){ From dcfbee8de1c6c38e80bb660eb0b4f721e209d6b3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 10 Sep 2023 13:24:47 -0700 Subject: [PATCH 100/482] MouseInterpolationState --- src/body.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/body.rs b/src/body.rs index c0fe94e..f80726e 100644 --- a/src/body.rs +++ b/src/body.rs @@ -29,12 +29,56 @@ pub enum MoveRestriction { Ladder,//multiple ladders how } +enum MouseInterpolation { + First,//just checks the last value + Lerp,//lerps between +} + +enum InputInstruction { + MoveMouse(glam::IVec2), + Jump(bool), +} + +pub struct MouseInterpolationState { + interpolation: MouseInterpolation, + time0: TIME, + time1: TIME, + mouse0: glam::IVec2, + mouse1: glam::IVec2, +} + +impl MouseInterpolationState { + pub fn move_mouse(&mut self,time:TIME,pos:glam::IVec2){ + self.time0=self.time1; + self.mouse0=self.mouse1; + self.time1=time; + self.mouse1=pos; + } + pub fn interpolated_position(&self,time:TIME) -> glam::IVec2 { + match self.interpolation { + MouseInterpolation::First => self.mouse0, + MouseInterpolation::Lerp => { + let m0=self.mouse0.as_i64vec2(); + let m1=self.mouse1.as_i64vec2(); + //these are deltas + let t1t=(self.time1-time) as i64; + let tt0=(time-self.time0) as i64; + let dt=(self.time1-self.time0) as i64; + ((m0*t1t+m1*tt0)/dt).as_ivec2() + } + } + } +} + pub struct PhysicsState { pub body: Body, pub contacts: Vec, //temp pub models_cringe_clone: Vec, pub temp_control_dir: glam::Vec3, + //camera must exist in state because wormholes modify the camera, also camera punch + //pub camera: Camera, + //pub mouse_interpolation: MouseInterpolationState, pub time: TIME, pub strafe_tick_num: TIME, pub strafe_tick_den: TIME, From b070b9706fb6d25686097f19679972fdb96b962a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 10 Sep 2023 14:13:24 -0700 Subject: [PATCH 101/482] InputState --- src/body.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/body.rs b/src/body.rs index f80726e..a09141d 100644 --- a/src/body.rs +++ b/src/body.rs @@ -39,6 +39,18 @@ enum InputInstruction { Jump(bool), } +struct InputState { + controls: u32, + mouse_interpolation: MouseInterpolation, + time: TIME, +} + +impl InputState { + pub fn get_control(&self,control:u32) -> bool { + self.controls&control!=0 + } +} + pub struct MouseInterpolationState { interpolation: MouseInterpolation, time0: TIME, From a58464efb016f2bf3314a3da40189cee6b378cfe Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 12 Sep 2023 00:05:30 -0700 Subject: [PATCH 102/482] how will I do this --- src/body.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/body.rs b/src/body.rs index a09141d..bd24663 100644 --- a/src/body.rs +++ b/src/body.rs @@ -49,6 +49,12 @@ impl InputState { pub fn get_control(&self,control:u32) -> bool { self.controls&control!=0 } + pub fn process_instruction(&mut self,ins:InputInstruction){ + match ins { + InputInstruction::MoveMouse(m) => todo!("set mouse_interpolation"), + InputInstruction::Jump(b) => todo!("how does info about style modifiers get here"), + } + } } pub struct MouseInterpolationState { From 28c3f21736de7baf722df97d6a79bf192eb45f72 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 13:20:51 -0700 Subject: [PATCH 103/482] implement aabb collision --- src/body.rs | 326 ++++++++++++++++++++++++++++++++++++++++++++++++---- src/main.rs | 1 + 2 files changed, 307 insertions(+), 20 deletions(-) diff --git a/src/body.rs b/src/body.rs index bd24663..7960d24 100644 --- a/src/body.rs +++ b/src/body.rs @@ -1,4 +1,4 @@ -use crate::instruction::{InstructionEmitter, InstructionConsumer, TimedInstruction}; +use crate::{instruction::{InstructionEmitter, InstructionConsumer, TimedInstruction}, zeroes::zeroes2}; pub enum PhysicsInstruction { CollisionStart(RelativeCollision), @@ -90,6 +90,7 @@ impl MouseInterpolationState { pub struct PhysicsState { pub body: Body, + pub hitbox_size: glam::Vec3, pub contacts: Vec, //temp pub models_cringe_clone: Vec, @@ -134,6 +135,16 @@ impl Aabb { // [0.0f32, 1., 0.], // [0.0f32, -1., 0.], // ]; + const VERTEX_DATA: [glam::Vec3; 8] = [ + glam::vec3(1., -1., -1.), + glam::vec3(1., 1., -1.), + glam::vec3(1., 1., 1.), + glam::vec3(1., -1., 1.), + glam::vec3(-1., -1., 1.), + glam::vec3(-1., 1., 1.), + glam::vec3(-1., 1., -1.), + glam::vec3(-1., -1., -1.), + ]; const VERTEX_DATA_RIGHT: [glam::Vec3; 4] = [ glam::vec3(1., -1., -1.), glam::vec3(1., 1., -1.), @@ -190,7 +201,10 @@ impl Aabb { AabbFace::Front => glam::vec3(0.,0.,-1.), } } - pub fn face_vertices(face:AabbFace) -> [glam::Vec3;4] { + pub fn unit_vertices() -> [glam::Vec3;8] { + return Self::VERTEX_DATA; + } + pub fn unit_face_vertices(face:AabbFace) -> [glam::Vec3;4] { match face { AabbFace::Right => Self::VERTEX_DATA_RIGHT, AabbFace::Top => Self::VERTEX_DATA_TOP, @@ -202,7 +216,8 @@ impl Aabb { } } -type Face = AabbFace; +//pretend to be using what we want to eventually do +type TreyMeshFace = AabbFace; type TreyMesh = Aabb; pub struct Model { @@ -215,25 +230,34 @@ impl Model { pub fn new(transform:glam::Mat4) -> Self { Self{transform} } - pub fn face_vertices(&self,face:Face) -> [glam::Vec3;4] { - Aabb::face_vertices(face) + pub fn unit_vertices(&self) -> [glam::Vec3;8] { + Aabb::unit_vertices() } - pub fn face_mesh(&self,face:Face) -> TreyMesh { + pub fn mesh(&self) -> TreyMesh { let mut aabb=Aabb::new(); - for &vertex in self.face_vertices(face).iter() { - aabb.grow(vertex); + for &vertex in self.unit_vertices().iter() { + aabb.grow(glam::Vec4Swizzles::xyz(self.transform*vertex.extend(1.0))); } return aabb; } - pub fn face_normal(&self,face:Face) -> glam::Vec3 { - let mut n=glam::Vec3Swizzles::xyzz(Aabb::normal(face)); - n.w=0.0;//what a man will do to avoid writing out the components - glam::Vec4Swizzles::xyz(self.transform*n)//this is wrong for scale + pub fn unit_face_vertices(&self,face:TreyMeshFace) -> [glam::Vec3;4] { + Aabb::unit_face_vertices(face) + } + pub fn face_mesh(&self,face:TreyMeshFace) -> TreyMesh { + let mut aabb=Aabb::new(); + for &vertex in self.unit_face_vertices(face).iter() { + aabb.grow(glam::Vec4Swizzles::xyz(self.transform*vertex.extend(1.0))); + } + return aabb; + } + pub fn face_normal(&self,face:TreyMeshFace) -> glam::Vec3 { + glam::Vec4Swizzles::xyz(self.transform*Aabb::normal(face).extend(0.0))//this is wrong for scale } } +//need non-face (full model) variant for CanCollide false objects pub struct RelativeCollision { - face: Face,//just an id + face: TreyMeshFace,//just an id model: u32,//using id to avoid lifetimes } @@ -328,11 +352,250 @@ impl PhysicsState { //check if you are accelerating towards a walk target velocity and create an instruction return None; } - fn predict_collision_end(&self,model:&Model) -> Option> { + fn mesh(&self) -> TreyMesh { + let mut aabb=Aabb::new(); + for vertex in Aabb::unit_vertices(){ + aabb.grow(self.body.position+self.hitbox_size*vertex); + } + aabb + } + fn predict_collision_end(&self,model:&Model,time_limit:TIME,model_id:u32) -> Option> { //must treat cancollide false objects differently: you may not exit through the same face you entered. + //RelativeCollsion must reference the full model instead of a particular face + //this is Ctrl+C Ctrl+V of predict_collision_start but with v=-v before the calc and t=-t after the calc + //find best t + let mut best_delta_time=time_limit-self.body.time; + let mut best_face:Option=None; + let mesh0=self.mesh(); + let mesh1=model.mesh(); + let (p,v,a)=(self.body.position,-self.body.velocity,self.body.acceleration); + //collect x + for &t in zeroes2(mesh0.max.x-mesh1.min.x, v.x, a.x).iter() { + //negative t = back in time + //must be moving towards surface to collide + //must beat the current soonest collision time + //must be moving towards surface + let t_time=((-t as f64)*1_000_000_000f64) as TIME; + if 0<=t_time&&t_time Option> { + fn predict_collision_start(&self,model:&Model,time_limit:TIME,model_id:u32) -> Option> { + //find best t + let mut best_delta_time=time_limit-self.body.time; + let mut best_face:Option=None; + let mesh0=self.mesh(); + let mesh1=model.mesh(); + let (p,v,a)=(self.body.position,self.body.velocity,self.body.acceleration); + //collect x + for &t in zeroes2(mesh0.max.x-mesh1.min.x, v.x, a.x).iter() { + //negative t = back in time + //must be moving towards surface to collide + //must beat the current soonest collision time + //must be moving towards surface + let t_time=((t as f64)*1_000_000_000f64) as TIME; + if 0<=t_time&&t_time for PhysicsState } //check for collision stop instructions with curent contacts for collision_data in self.contacts.iter() { - collector.collect(self.predict_collision_end(self.models_cringe_clone.get(collision_data.model as usize).unwrap())); + collector.collect(self.predict_collision_end(self.models_cringe_clone.get(collision_data.model as usize).unwrap(),time_limit,collision_data.model)); } //check for collision start instructions (against every part in the game with no optimization!!) - for model in &self.models_cringe_clone { - collector.collect(self.predict_collision_start(model)); + for (i,model) in self.models_cringe_clone.iter().enumerate() { + collector.collect(self.predict_collision_start(model,time_limit,i as u32)); } if self.grounded { //walk maintenance @@ -374,8 +637,31 @@ impl crate::instruction::InstructionConsumer for PhysicsStat //mutate position and velocity and time self.advance_time(ins.time);//should this be in run? match ins.instruction { - PhysicsInstruction::CollisionStart(_) => todo!(), - PhysicsInstruction::CollisionEnd(_) => todo!(), + PhysicsInstruction::CollisionStart(c) => { + //flatten v + let n=c.normal(&self.models_cringe_clone); + let d=self.body.velocity.dot(n)/n.length_squared(); + self.body.velocity-=d*n; + //check ground + match c.face { + AabbFace::Top => { + //ground + self.grounded=true; + self.body.acceleration=glam::Vec3::ZERO; + }, + _ => (), + } + }, + PhysicsInstruction::CollisionEnd(c) => { + //check ground + match c.face { + AabbFace::Top => { + //ground + self.body.acceleration=self.gravity; + }, + _ => (), + } + }, PhysicsInstruction::StrafeTick => { //let control_dir=self.get_control_dir();//this should respect your mouse interpolation settings let d=self.body.velocity.dot(self.temp_control_dir); diff --git a/src/main.rs b/src/main.rs index c6e526e..514e7e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -307,6 +307,7 @@ impl strafe_client::framework::Example for Skybox { contacts: Vec::::new(), models_cringe_clone: modeldatas.iter().map(|m|strafe_client::body::Model::new(m.transform)).collect(), walk_target_velocity: glam::Vec3::ZERO, + hitbox_size: glam::vec3(2.0,5.0,2.0), }; let camera_uniforms = camera.to_uniform_data(physics.body.extrapolated_position(0)); From fd5d71e1af56710afb45f16a55cb5cdc33a60bda Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 13:44:43 -0700 Subject: [PATCH 104/482] use hashset for contacts --- src/body.rs | 9 +++++++-- src/main.rs | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/body.rs b/src/body.rs index 7960d24..87d69db 100644 --- a/src/body.rs +++ b/src/body.rs @@ -91,7 +91,8 @@ impl MouseInterpolationState { pub struct PhysicsState { pub body: Body, pub hitbox_size: glam::Vec3, - pub contacts: Vec, + pub contacts: std::collections::HashSet::, + //pub intersections: Vec, //temp pub models_cringe_clone: Vec, pub temp_control_dir: glam::Vec3, @@ -111,7 +112,7 @@ pub struct PhysicsState { pub jump_trying: bool, } -#[derive(Clone,Copy)] +#[derive(Clone,Copy,Hash,Eq,PartialEq)] pub enum AabbFace{ Right,//+X Top, @@ -256,6 +257,8 @@ impl Model { } //need non-face (full model) variant for CanCollide false objects +//OR have a separate list from contacts for model intersection +#[derive(Eq, Hash, PartialEq)] pub struct RelativeCollision { face: TreyMeshFace,//just an id model: u32,//using id to avoid lifetimes @@ -651,6 +654,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat }, _ => (), } + self.contacts.insert(c); }, PhysicsInstruction::CollisionEnd(c) => { //check ground @@ -661,6 +665,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat }, _ => (), } + self.contacts.remove(&c); }, PhysicsInstruction::StrafeTick => { //let control_dir=self.get_control_dir();//this should respect your mouse interpolation settings diff --git a/src/main.rs b/src/main.rs index 514e7e5..51f1848 100644 --- a/src/main.rs +++ b/src/main.rs @@ -304,7 +304,7 @@ impl strafe_client::framework::Example for Skybox { jump_trying: false, temp_control_dir: glam::Vec3::ZERO, walkspeed: 18.0, - contacts: Vec::::new(), + contacts: std::collections::HashSet::new(), models_cringe_clone: modeldatas.iter().map(|m|strafe_client::body::Model::new(m.transform)).collect(), walk_target_velocity: glam::Vec3::ZERO, hitbox_size: glam::vec3(2.0,5.0,2.0), From 5b55873bd566371cd03bc03a227aeb950a563ca1 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 13:56:23 -0700 Subject: [PATCH 105/482] halfsize --- src/body.rs | 4 ++-- src/main.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/body.rs b/src/body.rs index 87d69db..095da52 100644 --- a/src/body.rs +++ b/src/body.rs @@ -90,7 +90,7 @@ impl MouseInterpolationState { pub struct PhysicsState { pub body: Body, - pub hitbox_size: glam::Vec3, + pub hitbox_halfsize: glam::Vec3, pub contacts: std::collections::HashSet::, //pub intersections: Vec, //temp @@ -358,7 +358,7 @@ impl PhysicsState { fn mesh(&self) -> TreyMesh { let mut aabb=Aabb::new(); for vertex in Aabb::unit_vertices(){ - aabb.grow(self.body.position+self.hitbox_size*vertex); + aabb.grow(self.body.position+self.hitbox_halfsize*vertex); } aabb } diff --git a/src/main.rs b/src/main.rs index 51f1848..55c8184 100644 --- a/src/main.rs +++ b/src/main.rs @@ -307,7 +307,7 @@ impl strafe_client::framework::Example for Skybox { contacts: std::collections::HashSet::new(), models_cringe_clone: modeldatas.iter().map(|m|strafe_client::body::Model::new(m.transform)).collect(), walk_target_velocity: glam::Vec3::ZERO, - hitbox_size: glam::vec3(2.0,5.0,2.0), + hitbox_halfsize: glam::vec3(1.0,2.5,1.0), }; let camera_uniforms = camera.to_uniform_data(physics.body.extrapolated_position(0)); From 14a74c6e1ee5fadee43e6424adc304c1583f253b Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 14:55:11 -0700 Subject: [PATCH 106/482] consume vec --- src/body.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/body.rs b/src/body.rs index 095da52..38047d3 100644 --- a/src/body.rs +++ b/src/body.rs @@ -373,7 +373,7 @@ impl PhysicsState { let mesh1=model.mesh(); let (p,v,a)=(self.body.position,-self.body.velocity,self.body.acceleration); //collect x - for &t in zeroes2(mesh0.max.x-mesh1.min.x, v.x, a.x).iter() { + for t in zeroes2(mesh0.max.x-mesh1.min.x, v.x, a.x) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -389,7 +389,7 @@ impl PhysicsState { } } } - for &t in zeroes2(mesh0.min.x-mesh1.max.x, v.x, a.x).iter() { + for t in zeroes2(mesh0.min.x-mesh1.max.x, v.x, a.x) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -406,7 +406,7 @@ impl PhysicsState { } } //collect y - for &t in zeroes2(mesh0.max.y-mesh1.min.y, v.y, a.y).iter() { + for t in zeroes2(mesh0.max.y-mesh1.min.y, v.y, a.y) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -422,7 +422,7 @@ impl PhysicsState { } } } - for &t in zeroes2(mesh0.min.y-mesh1.max.y, v.y, a.y).iter() { + for t in zeroes2(mesh0.min.y-mesh1.max.y, v.y, a.y) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -439,7 +439,7 @@ impl PhysicsState { } } //collect z - for &t in zeroes2(mesh0.max.z-mesh1.min.z, v.z, a.z).iter() { + for t in zeroes2(mesh0.max.z-mesh1.min.z, v.z, a.z) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -455,7 +455,7 @@ impl PhysicsState { } } } - for &t in zeroes2(mesh0.min.z-mesh1.max.z, v.z, a.z).iter() { + for t in zeroes2(mesh0.min.z-mesh1.max.z, v.z, a.z) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -491,7 +491,7 @@ impl PhysicsState { let mesh1=model.mesh(); let (p,v,a)=(self.body.position,self.body.velocity,self.body.acceleration); //collect x - for &t in zeroes2(mesh0.max.x-mesh1.min.x, v.x, a.x).iter() { + for t in zeroes2(mesh0.max.x-mesh1.min.x, v.x, a.x) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -507,7 +507,7 @@ impl PhysicsState { } } } - for &t in zeroes2(mesh0.min.x-mesh1.max.x, v.x, a.x).iter() { + for t in zeroes2(mesh0.min.x-mesh1.max.x, v.x, a.x) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -524,7 +524,7 @@ impl PhysicsState { } } //collect y - for &t in zeroes2(mesh0.max.y-mesh1.min.y, v.y, a.y).iter() { + for t in zeroes2(mesh0.max.y-mesh1.min.y, v.y, a.y) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -540,7 +540,7 @@ impl PhysicsState { } } } - for &t in zeroes2(mesh0.min.y-mesh1.max.y, v.y, a.y).iter() { + for t in zeroes2(mesh0.min.y-mesh1.max.y, v.y, a.y) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -557,7 +557,7 @@ impl PhysicsState { } } //collect z - for &t in zeroes2(mesh0.max.z-mesh1.min.z, v.z, a.z).iter() { + for t in zeroes2(mesh0.max.z-mesh1.min.z, v.z, a.z) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -573,7 +573,7 @@ impl PhysicsState { } } } - for &t in zeroes2(mesh0.min.z-mesh1.max.z, v.z, a.z).iter() { + for t in zeroes2(mesh0.min.z-mesh1.max.z, v.z, a.z) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time From f1e26cb07a77635ffd532b25ff44ecab073433c7 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 14:55:35 -0700 Subject: [PATCH 107/482] don't print frame delta --- src/framework.rs | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/framework.rs b/src/framework.rs index d18609f..c5221b0 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -279,11 +279,6 @@ fn start( log::info!("Initializing the example..."); let mut example = E::init(&config, &adapter, &device, &queue); - #[cfg(not(target_arch = "wasm32"))] - let mut last_frame_inst = Instant::now(); - #[cfg(not(target_arch = "wasm32"))] - let (mut frame_count, mut accum_time) = (0, 0.0); - log::info!("Entering render loop..."); event_loop.run(move |event, _, control_flow| { let _ = (&instance, &adapter); // force ownership by the closure @@ -364,20 +359,6 @@ fn start( example.move_mouse(delta); }, event::Event::RedrawRequested(_) => { - #[cfg(not(target_arch = "wasm32"))] - { - accum_time += last_frame_inst.elapsed().as_secs_f32(); - last_frame_inst = Instant::now(); - frame_count += 1; - if frame_count == 100 { - println!( - "Avg frame time {}ms", - accum_time * 1000.0 / frame_count as f32 - ); - accum_time = 0.0; - frame_count = 0; - } - } let frame = match surface.get_current_texture() { Ok(frame) => frame, From 5a886b76d1b009de32bef6ba7442976306494533 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 14:57:01 -0700 Subject: [PATCH 108/482] comment about processed_time --- src/body.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/body.rs b/src/body.rs index 38047d3..7ac0313 100644 --- a/src/body.rs +++ b/src/body.rs @@ -20,6 +20,8 @@ pub struct Body { velocity: glam::Vec3,//I64 where 2^32 = 1 u/s acceleration: glam::Vec3,//I64 where 2^32 = 1 u/s/s time: TIME,//nanoseconds x xxxxD! + //origin_time = timestamp of position and velocity + //processed_time = starting time for new events. prevents colliding with the analytic euqation in the past } pub enum MoveRestriction { From 21ae7a0e4f1d4f1ccbd9c9a9af0f15a1cf5cb55c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 16:03:27 -0700 Subject: [PATCH 109/482] use pva for init --- src/body.rs | 8 ++++---- src/main.rs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/body.rs b/src/body.rs index 7ac0313..8cb2a45 100644 --- a/src/body.rs +++ b/src/body.rs @@ -278,11 +278,11 @@ impl RelativeCollision { pub type TIME = i64; impl Body { - pub fn with_position(position:glam::Vec3) -> Self { + pub fn with_pva(position:glam::Vec3,velocity:glam::Vec3,acceleration:glam::Vec3) -> Self { Self{ - position: position, - velocity: glam::Vec3::ZERO, - acceleration: glam::Vec3::ZERO, + position, + velocity, + acceleration, time: 0, } } diff --git a/src/main.rs b/src/main.rs index 55c8184..551dbef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -292,7 +292,7 @@ impl strafe_client::framework::Example for Skybox { controls:0, }; let physics = strafe_client::body::PhysicsState { - body: strafe_client::body::Body::with_position(glam::Vec3::new(5.0,5.0,5.0)), + body: strafe_client::body::Body::with_pva(glam::vec3(0.0,50.0,0.0),glam::vec3(0.0,0.0,0.0),glam::vec3(0.0,-100.0,0.0)), time: 0, tick: 0, strafe_tick_num: 100,//100t From 8137a26f813c3b23c864e785d83c1b6718256be2 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 16:04:02 -0700 Subject: [PATCH 110/482] standardize vec init --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 551dbef..bb44873 100644 --- a/src/main.rs +++ b/src/main.rs @@ -297,7 +297,7 @@ impl strafe_client::framework::Example for Skybox { tick: 0, strafe_tick_num: 100,//100t strafe_tick_den: 1_000_000_000, - gravity: glam::Vec3::new(0.0,-100.0,0.0), + gravity: glam::vec3(0.0,-100.0,0.0), friction: 90.0, mv: 2.7, grounded: true, From 765ed42b9dcc50f2d0ee77bb16be4db9bd0260fa Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 16:04:08 -0700 Subject: [PATCH 111/482] start in air --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index bb44873..b733d87 100644 --- a/src/main.rs +++ b/src/main.rs @@ -300,7 +300,7 @@ impl strafe_client::framework::Example for Skybox { gravity: glam::vec3(0.0,-100.0,0.0), friction: 90.0, mv: 2.7, - grounded: true, + grounded: false, jump_trying: false, temp_control_dir: glam::Vec3::ZERO, walkspeed: 18.0, From 3a0b3900ec6c674fc0145254942056d3e7e5d230 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 16:04:18 -0700 Subject: [PATCH 112/482] fix falling --- src/body.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/body.rs b/src/body.rs index 8cb2a45..00fa85f 100644 --- a/src/body.rs +++ b/src/body.rs @@ -290,8 +290,13 @@ impl Body { let dt=(time-self.time) as f64/1_000_000_000f64; self.position+self.velocity*(dt as f32)+self.acceleration*((0.5*dt*dt) as f32) } + pub fn extrapolated_velocity(&self,time: TIME)->glam::Vec3{ + let dt=(time-self.time) as f64/1_000_000_000f64; + self.velocity+self.acceleration*(dt as f32) + } pub fn advance_time(&mut self, time: TIME){ self.position=self.extrapolated_position(time); + self.velocity=self.extrapolated_velocity(time); self.time=time; } } From ad7abbdf1ccd8c9916fdbbc4f1cc85788ba3f22f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 18:06:03 -0700 Subject: [PATCH 113/482] rework predict_collision_end --- src/body.rs | 305 ++++++++++++++++++++++++--------------------- src/instruction.rs | 2 +- 2 files changed, 166 insertions(+), 141 deletions(-) diff --git a/src/body.rs b/src/body.rs index 00fa85f..964eeba 100644 --- a/src/body.rs +++ b/src/body.rs @@ -20,8 +20,6 @@ pub struct Body { velocity: glam::Vec3,//I64 where 2^32 = 1 u/s acceleration: glam::Vec3,//I64 where 2^32 = 1 u/s/s time: TIME,//nanoseconds x xxxxD! - //origin_time = timestamp of position and velocity - //processed_time = starting time for new events. prevents colliding with the analytic euqation in the past } pub enum MoveRestriction { @@ -260,7 +258,7 @@ impl Model { //need non-face (full model) variant for CanCollide false objects //OR have a separate list from contacts for model intersection -#[derive(Eq, Hash, PartialEq)] +#[derive(Clone,Eq,Hash,PartialEq)] pub struct RelativeCollision { face: TreyMeshFace,//just an id model: u32,//using id to avoid lifetimes @@ -303,9 +301,9 @@ impl Body { impl PhysicsState { //tickless gaming - pub fn run(&mut self, time: TIME){ + pub fn run(&mut self, time_limit:TIME){ //prepare is ommitted - everything is done via instructions. - while let Some(instruction) = self.next_instruction(time) {//collect + while let Some(instruction) = self.next_instruction(time_limit) {//collect //advance //self.advance_time(instruction.time); //process @@ -369,229 +367,256 @@ impl PhysicsState { } aabb } - fn predict_collision_end(&self,model:&Model,time_limit:TIME,model_id:u32) -> Option> { + fn predict_collision_end(&self,time:TIME,time_limit:TIME,collision_data:&RelativeCollision) -> Option> { //must treat cancollide false objects differently: you may not exit through the same face you entered. //RelativeCollsion must reference the full model instead of a particular face //this is Ctrl+C Ctrl+V of predict_collision_start but with v=-v before the calc and t=-t after the calc //find best t - let mut best_delta_time=time_limit-self.body.time; - let mut best_face:Option=None; + let mut best_time=time_limit; + let mut exit_face:Option=None; let mesh0=self.mesh(); - let mesh1=model.mesh(); - let (p,v,a)=(self.body.position,-self.body.velocity,self.body.acceleration); + let mesh1=self.models_cringe_clone.get(collision_data.model as usize).unwrap().mesh(); + let (v,a)=(-self.body.velocity,self.body.acceleration); //collect x - for t in zeroes2(mesh0.max.x-mesh1.min.x, v.x, a.x) { - //negative t = back in time - //must be moving towards surface to collide - //must beat the current soonest collision time - //must be moving towards surface - let t_time=((-t as f64)*1_000_000_000f64) as TIME; - if 0<=t_time&&t_time{ + for t in zeroes2(mesh0.max.x-mesh1.min.x,v.x,a.x) { + //negative t = back in time + //must be moving towards surface to collide + //must beat the current soonest collision time + //must be moving towards surface + let t_time=self.body.time+((-t as f64)*1_000_000_000f64) as TIME; + if time<=t_time&&t_time{ + //generate event if v.x<0||a.x<0 + if -v.x<0f32{ + best_time=time; + exit_face=Some(TreyMeshFace::Left); + } + }, + AabbFace::Right=>{ + //generate event if 0{ + for t in zeroes2(mesh0.max.y-mesh1.min.y,v.y,a.y) { + //negative t = back in time + //must be moving towards surface to collide + //must beat the current soonest collision time + //must be moving towards surface + let t_time=self.body.time+((-t as f64)*1_000_000_000f64) as TIME; + if time<=t_time&&t_time{ + //generate event if v.y<0||a.y<0 + if -v.y<0f32{ + best_time=time; + exit_face=Some(TreyMeshFace::Bottom); + } + }, + AabbFace::Top=>{ + //generate event if 0{ + for t in zeroes2(mesh0.max.z-mesh1.min.z,v.z,a.z) { + //negative t = back in time + //must be moving towards surface to collide + //must beat the current soonest collision time + //must be moving towards surface + let t_time=self.body.time+((-t as f64)*1_000_000_000f64) as TIME; + if time<=t_time&&t_time{ + //generate event if v.z<0||a.z<0 + if -v.z<0f32{ + best_time=time; + exit_face=Some(TreyMeshFace::Front); + } + }, + AabbFace::Back=>{ + //generate event if 0 Option> { + fn predict_collision_start(&self,time:TIME,time_limit:TIME,model_id:u32) -> Option> { //find best t - let mut best_delta_time=time_limit-self.body.time; + let mut best_time=time_limit; let mut best_face:Option=None; let mesh0=self.mesh(); - let mesh1=model.mesh(); + let mesh1=self.models_cringe_clone.get(model_id as usize).unwrap().mesh(); let (p,v,a)=(self.body.position,self.body.velocity,self.body.acceleration); //collect x - for t in zeroes2(mesh0.max.x-mesh1.min.x, v.x, a.x) { + for t in zeroes2(mesh0.max.x-mesh1.min.x,v.x,a.x) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time //must be moving towards surface - let t_time=((t as f64)*1_000_000_000f64) as TIME; - if 0<=t_time&&t_time for PhysicsState } //check for collision stop instructions with curent contacts for collision_data in self.contacts.iter() { - collector.collect(self.predict_collision_end(self.models_cringe_clone.get(collision_data.model as usize).unwrap(),time_limit,collision_data.model)); + collector.collect(self.predict_collision_end(self.time,time_limit,collision_data)); } //check for collision start instructions (against every part in the game with no optimization!!) - for (i,model) in self.models_cringe_clone.iter().enumerate() { - collector.collect(self.predict_collision_start(model,time_limit,i as u32)); + for i in 0..self.models_cringe_clone.len() { + collector.collect(self.predict_collision_start(self.time,time_limit,i as u32)); } if self.grounded { //walk maintenance diff --git a/src/instruction.rs b/src/instruction.rs index a56b848..9ac3869 100644 --- a/src/instruction.rs +++ b/src/instruction.rs @@ -4,7 +4,7 @@ pub struct TimedInstruction { } pub trait InstructionEmitter { - fn next_instruction(&self, time:crate::body::TIME) -> Option>; + fn next_instruction(&self, time_limit:crate::body::TIME) -> Option>; } pub trait InstructionConsumer { fn process_instruction(&mut self, instruction:TimedInstruction); From e67479a9bdae4d343f9c217b51df2073c2ea0b50 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 18:06:51 -0700 Subject: [PATCH 114/482] TEMP: move jump out --- src/body.rs | 8 -------- src/main.rs | 10 ++++++++++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/body.rs b/src/body.rs index 964eeba..f20a602 100644 --- a/src/body.rs +++ b/src/body.rs @@ -640,14 +640,6 @@ impl crate::instruction::InstructionEmitter for PhysicsState fn next_instruction(&self,time_limit:TIME) -> Option> { //JUST POLLING!!! NO MUTATION let mut collector = crate::instruction::InstructionCollector::new(time_limit); - //autohop (already pressing spacebar; the signal to begin trying to jump is different) - if self.grounded&&self.jump_trying { - //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true - collector.collect(Some(TimedInstruction{ - time:self.time, - instruction:PhysicsInstruction::Jump - })); - } //check for collision stop instructions with curent contacts for collision_data in self.contacts.iter() { collector.collect(self.predict_collision_end(self.time,time_limit,collision_data)); diff --git a/src/main.rs b/src/main.rs index b733d87..1d75792 100644 --- a/src/main.rs +++ b/src/main.rs @@ -641,6 +641,16 @@ impl strafe_client::framework::Example for Skybox { self.physics.jump_trying=self.camera.controls&CONTROL_JUMP!=0; self.physics.run(time); + //TOTALLY WRONG!!! + //autohop (already pressing spacebar; the signal to begin trying to jump is different) + if self.physics.grounded&&self.physics.jump_trying { + //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true + strafe_client::instruction::InstructionConsumer::process_instruction(&mut self.physics, strafe_client::instruction::TimedInstruction{ + time:time,//this is in the past when there is no instructions! + instruction:strafe_client::body::PhysicsInstruction::Jump + }); + } + let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); From a5f203484be15b91a9bd8b838587c7a4c964ecba Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 18:07:08 -0700 Subject: [PATCH 115/482] comment on CollisionEnd handling --- src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/body.rs b/src/body.rs index f20a602..bdee0eb 100644 --- a/src/body.rs +++ b/src/body.rs @@ -684,7 +684,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat //check ground match c.face { AabbFace::Top => { - //ground + //this needs to be ContactConstrainAcceleration(gravity) self.body.acceleration=self.gravity; }, _ => (), From bffc254a0dc39022769437b370f925e5645c2fb3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 18:27:02 -0700 Subject: [PATCH 116/482] put -t back --- src/body.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/body.rs b/src/body.rs index bdee0eb..20a1e6d 100644 --- a/src/body.rs +++ b/src/body.rs @@ -386,7 +386,7 @@ impl PhysicsState { //must beat the current soonest collision time //must be moving towards surface let t_time=self.body.time+((-t as f64)*1_000_000_000f64) as TIME; - if time<=t_time&&t_time Date: Mon, 18 Sep 2023 18:31:04 -0700 Subject: [PATCH 117/482] worthless opti --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 1d75792..30a0758 100644 --- a/src/main.rs +++ b/src/main.rs @@ -632,7 +632,7 @@ impl strafe_client::framework::Example for Skybox { queue: &wgpu::Queue, _spawner: &strafe_client::framework::Spawner, ) { - let camera_mat=glam::Mat3::from_euler(glam::EulerRot::YXZ,self.camera.yaw,0f32,0f32); + let camera_mat=glam::Mat3::from_rotation_y(self.camera.yaw); let control_dir=camera_mat*get_control_dir(self.camera.controls&(CONTROL_MOVELEFT|CONTROL_MOVERIGHT|CONTROL_MOVEFORWARD|CONTROL_MOVEBACK)).normalize_or_zero(); let time=self.start_time.elapsed().as_nanos() as i64; From 63ce06f069222fff21b642914bbeac8ef009b209 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 18:31:15 -0700 Subject: [PATCH 118/482] syntactic sugar --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 30a0758..423c109 100644 --- a/src/main.rs +++ b/src/main.rs @@ -646,7 +646,7 @@ impl strafe_client::framework::Example for Skybox { if self.physics.grounded&&self.physics.jump_trying { //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true strafe_client::instruction::InstructionConsumer::process_instruction(&mut self.physics, strafe_client::instruction::TimedInstruction{ - time:time,//this is in the past when there is no instructions! + time,//this is in the past when there is no instructions! instruction:strafe_client::body::PhysicsInstruction::Jump }); } From ca141c800cac766005f6e4933fdc8b4b212c24de Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 18:34:48 -0700 Subject: [PATCH 119/482] debug print instructions --- src/body.rs | 5 +++-- src/instruction.rs | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/body.rs b/src/body.rs index 20a1e6d..9576bfe 100644 --- a/src/body.rs +++ b/src/body.rs @@ -1,5 +1,6 @@ use crate::{instruction::{InstructionEmitter, InstructionConsumer, TimedInstruction}, zeroes::zeroes2}; +#[derive(Debug)] pub enum PhysicsInstruction { CollisionStart(RelativeCollision), CollisionEnd(RelativeCollision), @@ -112,7 +113,7 @@ pub struct PhysicsState { pub jump_trying: bool, } -#[derive(Clone,Copy,Hash,Eq,PartialEq)] +#[derive(Debug,Clone,Copy,Hash,Eq,PartialEq)] pub enum AabbFace{ Right,//+X Top, @@ -258,7 +259,7 @@ impl Model { //need non-face (full model) variant for CanCollide false objects //OR have a separate list from contacts for model intersection -#[derive(Clone,Eq,Hash,PartialEq)] +#[derive(Debug,Clone,Eq,Hash,PartialEq)] pub struct RelativeCollision { face: TreyMeshFace,//just an id model: u32,//using id to avoid lifetimes diff --git a/src/instruction.rs b/src/instruction.rs index 9ac3869..ece33d3 100644 --- a/src/instruction.rs +++ b/src/instruction.rs @@ -1,3 +1,4 @@ +#[derive(Debug)] pub struct TimedInstruction { pub time: crate::body::TIME, pub instruction: I, From 21dc425fc2cff10cf819136ff23aec44fe58c079 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 18:50:12 -0700 Subject: [PATCH 120/482] edit comments --- src/body.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/body.rs b/src/body.rs index 9576bfe..d54a6eb 100644 --- a/src/body.rs +++ b/src/body.rs @@ -525,8 +525,7 @@ impl PhysicsState { let (p,v,a)=(self.body.position,self.body.velocity,self.body.acceleration); //collect x for t in zeroes2(mesh0.max.x-mesh1.min.x,v.x,a.x) { - //negative t = back in time - //must be moving towards surface to collide + //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface let t_time=self.body.time+((t as f64)*1_000_000_000f64) as TIME; @@ -541,8 +540,7 @@ impl PhysicsState { } } for t in zeroes2(mesh0.min.x-mesh1.max.x,v.x,a.x) { - //negative t = back in time - //must be moving towards surface to collide + //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface let t_time=self.body.time+((t as f64)*1_000_000_000f64) as TIME; @@ -558,8 +556,7 @@ impl PhysicsState { } //collect y for t in zeroes2(mesh0.max.y-mesh1.min.y,v.y,a.y) { - //negative t = back in time - //must be moving towards surface to collide + //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface let t_time=self.body.time+((t as f64)*1_000_000_000f64) as TIME; @@ -574,8 +571,7 @@ impl PhysicsState { } } for t in zeroes2(mesh0.min.y-mesh1.max.y,v.y,a.y) { - //negative t = back in time - //must be moving towards surface to collide + //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface let t_time=self.body.time+((t as f64)*1_000_000_000f64) as TIME; @@ -591,8 +587,7 @@ impl PhysicsState { } //collect z for t in zeroes2(mesh0.max.z-mesh1.min.z,v.z,a.z) { - //negative t = back in time - //must be moving towards surface to collide + //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface let t_time=self.body.time+((t as f64)*1_000_000_000f64) as TIME; @@ -607,8 +602,7 @@ impl PhysicsState { } } for t in zeroes2(mesh0.min.z-mesh1.max.z,v.z,a.z) { - //negative t = back in time - //must be moving towards surface to collide + //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface let t_time=self.body.time+((t as f64)*1_000_000_000f64) as TIME; From 2f0a073fd561d6a6977c07e7a4eeb045bdedefd1 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 19:04:21 -0700 Subject: [PATCH 121/482] fix aabb normals + face_mesh --- src/body.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/body.rs b/src/body.rs index d54a6eb..46952e5 100644 --- a/src/body.rs +++ b/src/body.rs @@ -246,14 +246,20 @@ impl Model { Aabb::unit_face_vertices(face) } pub fn face_mesh(&self,face:TreyMeshFace) -> TreyMesh { - let mut aabb=Aabb::new(); - for &vertex in self.unit_face_vertices(face).iter() { - aabb.grow(glam::Vec4Swizzles::xyz(self.transform*vertex.extend(1.0))); + let mut aabb=self.mesh(); + //in this implementation face = worldspace aabb face + match face { + AabbFace::Right => aabb.min.x=aabb.max.x, + AabbFace::Top => aabb.min.y=aabb.max.y, + AabbFace::Back => aabb.min.z=aabb.max.z, + AabbFace::Left => aabb.max.x=aabb.min.x, + AabbFace::Bottom => aabb.max.y=aabb.min.y, + AabbFace::Front => aabb.max.z=aabb.min.z, } return aabb; } pub fn face_normal(&self,face:TreyMeshFace) -> glam::Vec3 { - glam::Vec4Swizzles::xyz(self.transform*Aabb::normal(face).extend(0.0))//this is wrong for scale + glam::Vec4Swizzles::xyz(Aabb::normal(face).extend(0.0))//this is wrong for scale } } From 7544c6e6ef10c4d8ca363a901b408a3b2a765ec0 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 19:47:15 -0700 Subject: [PATCH 122/482] fix roblox camera offset --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 423c109..8c6a3ce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -285,7 +285,7 @@ impl strafe_client::framework::Example for Skybox { let camera = Camera { screen_size: (config.width, config.height), - offset: glam::Vec3::new(0.0,4.5,0.0), + offset: glam::Vec3::new(0.0,4.5-2.5,0.0), fov: 1.0, //fov_slope = tan(fov_y/2) pitch: 0.0, yaw: 0.0, From 0632e322cfd68bec2148255e8f5d861161daf27d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 21:10:07 -0700 Subject: [PATCH 123/482] implement walk with hashing lole!! --- src/body.rs | 65 ++++++++++++++++++++++++++++++++++++++++++++++++----- src/main.rs | 15 +++++++++++-- 2 files changed, 73 insertions(+), 7 deletions(-) diff --git a/src/body.rs b/src/body.rs index 46952e5..6ec57d6 100644 --- a/src/body.rs +++ b/src/body.rs @@ -22,6 +22,25 @@ pub struct Body { acceleration: glam::Vec3,//I64 where 2^32 = 1 u/s/s time: TIME,//nanoseconds x xxxxD! } +trait MyHash{ + fn hash(&self) -> u64; +} +impl MyHash for Body { + fn hash(&self) -> u64 { + let mut hasher=std::collections::hash_map::DefaultHasher::new(); + for &el in self.position.as_ref().iter() { + std::hash::Hasher::write(&mut hasher, el.to_ne_bytes().as_slice()); + } + for &el in self.velocity.as_ref().iter() { + std::hash::Hasher::write(&mut hasher, el.to_ne_bytes().as_slice()); + } + for &el in self.acceleration.as_ref().iter() { + std::hash::Hasher::write(&mut hasher, el.to_ne_bytes().as_slice()); + } + std::hash::Hasher::write(&mut hasher, self.time.to_ne_bytes().as_slice()); + return std::hash::Hasher::finish(&hasher);//hash check to see if walk target is valid + } +} pub enum MoveRestriction { Air, @@ -89,6 +108,21 @@ impl MouseInterpolationState { } } +pub struct WalkState { + pub target_velocity: glam::Vec3, + pub target_time: TIME, + pub body_hash: u64, +} +impl WalkState { + pub fn new() -> Self { + Self{ + target_velocity:glam::Vec3::ZERO, + target_time:0, + body_hash:0,//oh no, hash collisions + } + } +} + pub struct PhysicsState { pub body: Body, pub hitbox_halfsize: glam::Vec3, @@ -105,9 +139,10 @@ pub struct PhysicsState { pub strafe_tick_den: TIME, pub tick: u32, pub mv: f32, + pub walk: WalkState, pub walkspeed: f32, pub friction: f32, - pub walk_target_velocity: glam::Vec3, + pub walk_accel: f32, pub gravity: glam::Vec3, pub grounded: bool, pub jump_trying: bool, @@ -364,8 +399,15 @@ impl PhysicsState { // } fn next_walk_instruction(&self) -> Option> { - //check if you are accelerating towards a walk target velocity and create an instruction - return None; + //check if you have a valid walk state and create an instruction + if self.walk.body_hash==self.body.hash(){ + Some(TimedInstruction{ + time:self.walk.target_time, + instruction:PhysicsInstruction::ReachWalkTargetVelocity + }) + }else{ + return None; + } } fn mesh(&self) -> TreyMesh { let mut aabb=Aabb::new(); @@ -705,11 +747,24 @@ impl crate::instruction::InstructionConsumer for PhysicsStat } PhysicsInstruction::ReachWalkTargetVelocity => { //precisely set velocity - self.body.velocity=self.walk_target_velocity; + self.body.acceleration=glam::Vec3::ZERO; + self.body.velocity=self.walk.target_velocity; + //what if it's exactly the same, and the time delta is 0? + //the hash will succeed and it will poll the same instruction infinitely... } PhysicsInstruction::SetWalkTargetVelocity(v) => { - self.walk_target_velocity=v; //calculate acceleration yada yada + let target_diff=v-self.body.velocity; + if target_diff==glam::Vec3::ZERO{ + self.body.acceleration=glam::Vec3::ZERO; + }else{ + let accel=self.walk_accel.min(self.gravity.length()*self.friction); + let time_delta=target_diff.length()/accel; + self.body.acceleration=target_diff/time_delta; + self.walk.target_velocity=v; + self.walk.target_time=self.body.time+((time_delta as f64)*1_000_000_000f64) as TIME; + self.walk.body_hash=self.body.hash();//hash check to see if walk target is valid + } }, } } diff --git a/src/main.rs b/src/main.rs index 8c6a3ce..63d8611 100644 --- a/src/main.rs +++ b/src/main.rs @@ -298,7 +298,8 @@ impl strafe_client::framework::Example for Skybox { strafe_tick_num: 100,//100t strafe_tick_den: 1_000_000_000, gravity: glam::vec3(0.0,-100.0,0.0), - friction: 90.0, + friction: 1.2, + walk_accel: 90.0, mv: 2.7, grounded: false, jump_trying: false, @@ -306,7 +307,7 @@ impl strafe_client::framework::Example for Skybox { walkspeed: 18.0, contacts: std::collections::HashSet::new(), models_cringe_clone: modeldatas.iter().map(|m|strafe_client::body::Model::new(m.transform)).collect(), - walk_target_velocity: glam::Vec3::ZERO, + walk: strafe_client::body::WalkState::new(), hitbox_halfsize: glam::vec3(1.0,2.5,1.0), }; @@ -637,6 +638,16 @@ impl strafe_client::framework::Example for Skybox { let time=self.start_time.elapsed().as_nanos() as i64; + let walk_target_velocity=self.physics.walkspeed*control_dir; + //autohop (already pressing spacebar; the signal to begin trying to jump is different) + if walk_target_velocity!=self.physics.walk.target_velocity { + //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true + strafe_client::instruction::InstructionConsumer::process_instruction(&mut self.physics, strafe_client::instruction::TimedInstruction{ + time,//this is in the past when there is no instructions! + instruction:strafe_client::body::PhysicsInstruction::SetWalkTargetVelocity(walk_target_velocity) + }); + } + self.physics.temp_control_dir=control_dir; self.physics.jump_trying=self.camera.controls&CONTROL_JUMP!=0; self.physics.run(time); From fd38502e0745c50c99393c64d42cba57358387a4 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 21:28:09 -0700 Subject: [PATCH 124/482] only walk if grounded --- src/body.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/body.rs b/src/body.rs index 6ec57d6..28258d7 100644 --- a/src/body.rs +++ b/src/body.rs @@ -400,7 +400,7 @@ impl PhysicsState { fn next_walk_instruction(&self) -> Option> { //check if you have a valid walk state and create an instruction - if self.walk.body_hash==self.body.hash(){ + if self.grounded&&self.walk.body_hash==self.body.hash(){ Some(TimedInstruction{ time:self.walk.target_time, instruction:PhysicsInstruction::ReachWalkTargetVelocity @@ -754,16 +754,18 @@ impl crate::instruction::InstructionConsumer for PhysicsStat } PhysicsInstruction::SetWalkTargetVelocity(v) => { //calculate acceleration yada yada - let target_diff=v-self.body.velocity; - if target_diff==glam::Vec3::ZERO{ - self.body.acceleration=glam::Vec3::ZERO; - }else{ - let accel=self.walk_accel.min(self.gravity.length()*self.friction); - let time_delta=target_diff.length()/accel; - self.body.acceleration=target_diff/time_delta; - self.walk.target_velocity=v; - self.walk.target_time=self.body.time+((time_delta as f64)*1_000_000_000f64) as TIME; - self.walk.body_hash=self.body.hash();//hash check to see if walk target is valid + if self.grounded{ + let target_diff=v-self.body.velocity; + if target_diff==glam::Vec3::ZERO{ + self.body.acceleration=glam::Vec3::ZERO; + }else{ + let accel=self.walk_accel.min(self.gravity.length()*self.friction); + let time_delta=target_diff.length()/accel; + self.body.acceleration=target_diff/time_delta; + self.walk.target_velocity=v; + self.walk.target_time=self.body.time+((time_delta as f64)*1_000_000_000f64) as TIME; + self.walk.body_hash=self.body.hash();//hash check to see if walk target is valid + } } }, } From 1dc98d9c2d161a7c341f075f60171d1727b0f70d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 23:33:52 -0700 Subject: [PATCH 125/482] stupid mistake --- src/body.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/body.rs b/src/body.rs index 28258d7..7c0ce27 100644 --- a/src/body.rs +++ b/src/body.rs @@ -429,7 +429,7 @@ impl PhysicsState { //collect x match collision_data.face { AabbFace::Top|AabbFace::Back|AabbFace::Bottom|AabbFace::Front=>{ - for t in zeroes2(mesh0.max.x-mesh1.min.x,v.x,a.x) { + for t in zeroes2(mesh0.max.x-mesh1.min.x,v.x,0.5*a.x) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -441,7 +441,7 @@ impl PhysicsState { exit_face=Some(TreyMeshFace::Left); } } - for t in zeroes2(mesh0.min.x-mesh1.max.x,v.x,a.x) { + for t in zeroes2(mesh0.min.x-mesh1.max.x,v.x,0.5*a.x) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -472,7 +472,7 @@ impl PhysicsState { //collect y match collision_data.face { AabbFace::Left|AabbFace::Back|AabbFace::Right|AabbFace::Front=>{ - for t in zeroes2(mesh0.max.y-mesh1.min.y,v.y,a.y) { + for t in zeroes2(mesh0.max.y-mesh1.min.y,v.y,0.5*a.y) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -484,7 +484,7 @@ impl PhysicsState { exit_face=Some(TreyMeshFace::Bottom); } } - for t in zeroes2(mesh0.min.y-mesh1.max.y,v.y,a.y) { + for t in zeroes2(mesh0.min.y-mesh1.max.y,v.y,0.5*a.y) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -515,7 +515,7 @@ impl PhysicsState { //collect z match collision_data.face { AabbFace::Left|AabbFace::Bottom|AabbFace::Right|AabbFace::Top=>{ - for t in zeroes2(mesh0.max.z-mesh1.min.z,v.z,a.z) { + for t in zeroes2(mesh0.max.z-mesh1.min.z,v.z,0.5*a.z) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -527,7 +527,7 @@ impl PhysicsState { exit_face=Some(TreyMeshFace::Front); } } - for t in zeroes2(mesh0.min.z-mesh1.max.z,v.z,a.z) { + for t in zeroes2(mesh0.min.z-mesh1.max.z,v.z,0.5*a.z) { //negative t = back in time //must be moving towards surface to collide //must beat the current soonest collision time @@ -572,7 +572,7 @@ impl PhysicsState { let mesh1=self.models_cringe_clone.get(model_id as usize).unwrap().mesh(); let (p,v,a)=(self.body.position,self.body.velocity,self.body.acceleration); //collect x - for t in zeroes2(mesh0.max.x-mesh1.min.x,v.x,a.x) { + for t in zeroes2(mesh0.max.x-mesh1.min.x,v.x,0.5*a.x) { //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface @@ -587,7 +587,7 @@ impl PhysicsState { } } } - for t in zeroes2(mesh0.min.x-mesh1.max.x,v.x,a.x) { + for t in zeroes2(mesh0.min.x-mesh1.max.x,v.x,0.5*a.x) { //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface @@ -603,7 +603,7 @@ impl PhysicsState { } } //collect y - for t in zeroes2(mesh0.max.y-mesh1.min.y,v.y,a.y) { + for t in zeroes2(mesh0.max.y-mesh1.min.y,v.y,0.5*a.y) { //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface @@ -618,7 +618,7 @@ impl PhysicsState { } } } - for t in zeroes2(mesh0.min.y-mesh1.max.y,v.y,a.y) { + for t in zeroes2(mesh0.min.y-mesh1.max.y,v.y,0.5*a.y) { //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface @@ -634,7 +634,7 @@ impl PhysicsState { } } //collect z - for t in zeroes2(mesh0.max.z-mesh1.min.z,v.z,a.z) { + for t in zeroes2(mesh0.max.z-mesh1.min.z,v.z,0.5*a.z) { //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface @@ -649,7 +649,7 @@ impl PhysicsState { } } } - for t in zeroes2(mesh0.min.z-mesh1.max.z,v.z,a.z) { + for t in zeroes2(mesh0.min.z-mesh1.max.z,v.z,0.5*a.z) { //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface From 17e71d884f7922bb45031f8f46b1979e066b02d7 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 23:36:14 -0700 Subject: [PATCH 126/482] SetControlDir + contact constrain + walk.state enum instead of hash --- src/body.rs | 136 +++++++++++++++++++++++++++++++++++++++------------- src/main.rs | 9 +++- 2 files changed, 110 insertions(+), 35 deletions(-) diff --git a/src/body.rs b/src/body.rs index 7c0ce27..82915ec 100644 --- a/src/body.rs +++ b/src/body.rs @@ -4,9 +4,11 @@ use crate::{instruction::{InstructionEmitter, InstructionConsumer, TimedInstruct pub enum PhysicsInstruction { CollisionStart(RelativeCollision), CollisionEnd(RelativeCollision), + SetControlDir(glam::Vec3), StrafeTick, Jump, SetWalkTargetVelocity(glam::Vec3), + RefreshWalkTarget, ReachWalkTargetVelocity, // Water, // Spawn( @@ -108,17 +110,22 @@ impl MouseInterpolationState { } } +pub enum WalkEnum{ + Reached, + Transient, + Invalid, +} pub struct WalkState { pub target_velocity: glam::Vec3, pub target_time: TIME, - pub body_hash: u64, + pub state: WalkEnum, } impl WalkState { pub fn new() -> Self { Self{ target_velocity:glam::Vec3::ZERO, target_time:0, - body_hash:0,//oh no, hash collisions + state:WalkEnum::Invalid, } } } @@ -359,6 +366,25 @@ impl PhysicsState { self.time=time; } + fn contact_constrain_velocity(&self,velocity:&mut glam::Vec3){ + for contact in self.contacts.iter() { + let n=contact.normal(&self.models_cringe_clone); + let d=velocity.dot(n); + if d<0f32{ + (*velocity)-=d/n.length_squared()*n; + } + } + } + fn contact_constrain_acceleration(&self,acceleration:&mut glam::Vec3){ + for contact in self.contacts.iter() { + let n=contact.normal(&self.models_cringe_clone); + let d=acceleration.dot(n); + if d<0f32{ + (*acceleration)-=d/n.length_squared()*n; + } + } + } + fn next_strafe_instruction(&self) -> Option> { return Some(TimedInstruction{ time:(self.time*self.strafe_tick_num/self.strafe_tick_den+1)*self.strafe_tick_den/self.strafe_tick_num, @@ -400,11 +426,18 @@ impl PhysicsState { fn next_walk_instruction(&self) -> Option> { //check if you have a valid walk state and create an instruction - if self.grounded&&self.walk.body_hash==self.body.hash(){ - Some(TimedInstruction{ - time:self.walk.target_time, - instruction:PhysicsInstruction::ReachWalkTargetVelocity - }) + if self.grounded{ + match self.walk.state{ + WalkEnum::Transient=>Some(TimedInstruction{ + time:self.walk.target_time, + instruction:PhysicsInstruction::ReachWalkTargetVelocity + }), + WalkEnum::Invalid=>Some(TimedInstruction{ + time:self.time, + instruction:PhysicsInstruction::RefreshWalkTarget, + }), + WalkEnum::Reached=>None, + } }else{ return None; } @@ -704,70 +737,107 @@ impl crate::instruction::InstructionEmitter for PhysicsState impl crate::instruction::InstructionConsumer for PhysicsState { fn process_instruction(&mut self, ins:TimedInstruction) { - //mutate position and velocity and time - self.advance_time(ins.time);//should this be in run? + match &ins.instruction { + PhysicsInstruction::StrafeTick => (), + _=>println!("{:?}",ins), + } + //selectively update body + match &ins.instruction { + PhysicsInstruction::SetWalkTargetVelocity(_) => (),//TODO: queue instructions and do self.time=ins.time, + PhysicsInstruction::RefreshWalkTarget + |PhysicsInstruction::ReachWalkTargetVelocity + |PhysicsInstruction::CollisionStart(_) + |PhysicsInstruction::CollisionEnd(_) + |PhysicsInstruction::StrafeTick + |PhysicsInstruction::SetControlDir(_) + |PhysicsInstruction::Jump => self.advance_time(ins.time), + } match ins.instruction { PhysicsInstruction::CollisionStart(c) => { - //flatten v - let n=c.normal(&self.models_cringe_clone); - let d=self.body.velocity.dot(n)/n.length_squared(); - self.body.velocity-=d*n; //check ground - match c.face { + match &c.face { AabbFace::Top => { //ground self.grounded=true; - self.body.acceleration=glam::Vec3::ZERO; }, _ => (), } self.contacts.insert(c); + //flatten v + let mut v=self.body.velocity; + self.contact_constrain_velocity(&mut v); + self.body.velocity=v; + self.walk.state=WalkEnum::Invalid; }, PhysicsInstruction::CollisionEnd(c) => { + self.contacts.remove(&c);//remove contact before calling contact_constrain_acceleration + let mut a=self.gravity; + self.contact_constrain_acceleration(&mut a); + self.body.acceleration=a; + self.walk.state=WalkEnum::Invalid; //check ground - match c.face { + match &c.face { AabbFace::Top => { - //this needs to be ContactConstrainAcceleration(gravity) - self.body.acceleration=self.gravity; + self.grounded=false; }, _ => (), } - self.contacts.remove(&c); + }, + PhysicsInstruction::SetControlDir(control_dir)=>{ + self.temp_control_dir=control_dir; + self.walk.state=WalkEnum::Invalid; }, PhysicsInstruction::StrafeTick => { //let control_dir=self.get_control_dir();//this should respect your mouse interpolation settings let d=self.body.velocity.dot(self.temp_control_dir); if d { self.grounded=false;//do I need this? - self.body.velocity+=glam::Vec3::new(0.0,0.715588/2.0*100.0,0.0); - } + let mut v=self.body.velocity+glam::Vec3::new(0.0,0.715588/2.0*100.0,0.0); + self.contact_constrain_velocity(&mut v); + self.body.velocity=v; + self.walk.state=WalkEnum::Invalid; + }, PhysicsInstruction::ReachWalkTargetVelocity => { //precisely set velocity - self.body.acceleration=glam::Vec3::ZERO; - self.body.velocity=self.walk.target_velocity; - //what if it's exactly the same, and the time delta is 0? - //the hash will succeed and it will poll the same instruction infinitely... - } - PhysicsInstruction::SetWalkTargetVelocity(v) => { + let mut a=glam::Vec3::ZERO; + self.contact_constrain_acceleration(&mut a); + self.body.acceleration=a; + let mut v=self.walk.target_velocity; + self.contact_constrain_velocity(&mut v); + self.body.velocity=v; + self.walk.state=WalkEnum::Reached; + }, + PhysicsInstruction::RefreshWalkTarget => { //calculate acceleration yada yada if self.grounded{ - let target_diff=v-self.body.velocity; + let mut target_diff=self.walk.target_velocity-self.body.velocity; + target_diff.y=0f32; if target_diff==glam::Vec3::ZERO{ - self.body.acceleration=glam::Vec3::ZERO; + let mut a=glam::Vec3::ZERO; + self.contact_constrain_acceleration(&mut a); + self.body.acceleration=a; + self.walk.state=WalkEnum::Reached; }else{ let accel=self.walk_accel.min(self.gravity.length()*self.friction); let time_delta=target_diff.length()/accel; - self.body.acceleration=target_diff/time_delta; - self.walk.target_velocity=v; + let mut a=target_diff/time_delta; + self.contact_constrain_acceleration(&mut a); + self.body.acceleration=a; self.walk.target_time=self.body.time+((time_delta as f64)*1_000_000_000f64) as TIME; - self.walk.body_hash=self.body.hash();//hash check to see if walk target is valid + self.walk.state=WalkEnum::Transient; } } }, + PhysicsInstruction::SetWalkTargetVelocity(v) => { + self.walk.target_velocity=v; + self.walk.state=WalkEnum::Invalid; + }, } } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 63d8611..6eb541a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -640,7 +640,7 @@ impl strafe_client::framework::Example for Skybox { let walk_target_velocity=self.physics.walkspeed*control_dir; //autohop (already pressing spacebar; the signal to begin trying to jump is different) - if walk_target_velocity!=self.physics.walk.target_velocity { + if self.physics.grounded&&walk_target_velocity!=self.physics.walk.target_velocity { //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true strafe_client::instruction::InstructionConsumer::process_instruction(&mut self.physics, strafe_client::instruction::TimedInstruction{ time,//this is in the past when there is no instructions! @@ -648,7 +648,12 @@ impl strafe_client::framework::Example for Skybox { }); } - self.physics.temp_control_dir=control_dir; + if control_dir!=self.physics.temp_control_dir { + strafe_client::instruction::InstructionConsumer::process_instruction(&mut self.physics, strafe_client::instruction::TimedInstruction{ + time, + instruction:strafe_client::body::PhysicsInstruction::SetControlDir(control_dir) + }); + } self.physics.jump_trying=self.camera.controls&CONTROL_JUMP!=0; self.physics.run(time); From 4951d1513db62ec41ad8147474aea782869d9cf3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 18 Sep 2023 23:57:42 -0700 Subject: [PATCH 127/482] stop skipping over time --- src/main.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6eb541a..fdd96a4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -638,6 +638,9 @@ impl strafe_client::framework::Example for Skybox { let time=self.start_time.elapsed().as_nanos() as i64; + self.physics.run(time); + + //ALL OF THIS IS TOTALLY WRONG!!! let walk_target_velocity=self.physics.walkspeed*control_dir; //autohop (already pressing spacebar; the signal to begin trying to jump is different) if self.physics.grounded&&walk_target_velocity!=self.physics.walk.target_velocity { @@ -654,10 +657,8 @@ impl strafe_client::framework::Example for Skybox { instruction:strafe_client::body::PhysicsInstruction::SetControlDir(control_dir) }); } - self.physics.jump_trying=self.camera.controls&CONTROL_JUMP!=0; - self.physics.run(time); - //TOTALLY WRONG!!! + self.physics.jump_trying=self.camera.controls&CONTROL_JUMP!=0; //autohop (already pressing spacebar; the signal to begin trying to jump is different) if self.physics.grounded&&self.physics.jump_trying { //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true From db5b3328bdd0bc9cc4a13f327bd9a99c2244af76 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 19 Sep 2023 00:00:06 -0700 Subject: [PATCH 128/482] update time for extern instructions --- src/body.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/body.rs b/src/body.rs index 82915ec..23e50d8 100644 --- a/src/body.rs +++ b/src/body.rs @@ -743,13 +743,13 @@ impl crate::instruction::InstructionConsumer for PhysicsStat } //selectively update body match &ins.instruction { - PhysicsInstruction::SetWalkTargetVelocity(_) => (),//TODO: queue instructions and do self.time=ins.time, + PhysicsInstruction::SetWalkTargetVelocity(_) + |PhysicsInstruction::SetControlDir(_) => self.time=ins.time,//TODO: queue instructions PhysicsInstruction::RefreshWalkTarget |PhysicsInstruction::ReachWalkTargetVelocity |PhysicsInstruction::CollisionStart(_) |PhysicsInstruction::CollisionEnd(_) |PhysicsInstruction::StrafeTick - |PhysicsInstruction::SetControlDir(_) |PhysicsInstruction::Jump => self.advance_time(ins.time), } match ins.instruction { From 58541281642faa660b969921103e25d81a299337 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 19 Sep 2023 00:00:14 -0700 Subject: [PATCH 129/482] edit comments --- src/main.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index fdd96a4..2fd5c60 100644 --- a/src/main.rs +++ b/src/main.rs @@ -644,9 +644,8 @@ impl strafe_client::framework::Example for Skybox { let walk_target_velocity=self.physics.walkspeed*control_dir; //autohop (already pressing spacebar; the signal to begin trying to jump is different) if self.physics.grounded&&walk_target_velocity!=self.physics.walk.target_velocity { - //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true strafe_client::instruction::InstructionConsumer::process_instruction(&mut self.physics, strafe_client::instruction::TimedInstruction{ - time,//this is in the past when there is no instructions! + time, instruction:strafe_client::body::PhysicsInstruction::SetWalkTargetVelocity(walk_target_velocity) }); } @@ -663,7 +662,7 @@ impl strafe_client::framework::Example for Skybox { if self.physics.grounded&&self.physics.jump_trying { //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true strafe_client::instruction::InstructionConsumer::process_instruction(&mut self.physics, strafe_client::instruction::TimedInstruction{ - time,//this is in the past when there is no instructions! + time, instruction:strafe_client::body::PhysicsInstruction::Jump }); } From 8e95fe484a327455b4974ab1f2731a0b00ec130a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 19 Sep 2023 00:58:26 -0700 Subject: [PATCH 130/482] unnecessary cast --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 2fd5c60..dc7187b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -172,7 +172,7 @@ fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,source:&[u8]){ for &index in &[0, end_index - 1, end_index] { let vert = poly.0[index]; if let Some(&i)=vertex_index.get(&vert){ - indices.push(i as u16); + indices.push(i); }else{ let i=vertices.len() as u16; vertices.push(Vertex { From d58f915082ea22816c5e6eef75dbf7ddca5da7ef Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 19 Sep 2023 01:21:00 -0700 Subject: [PATCH 131/482] v0.3.0 physics + walking --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ca30b0c..a2808d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1405,7 +1405,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strafe-client" -version = "0.2.0" +version = "0.3.0" dependencies = [ "async-executor", "bytemuck", diff --git a/Cargo.toml b/Cargo.toml index 5a9789d..7390db6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strafe-client" -version = "0.2.0" +version = "0.3.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 6f4fda8cc05e234f70fbcfad0c17a93387aad065 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 19 Sep 2023 17:54:43 -0700 Subject: [PATCH 132/482] clip walk target velocity in RefreshWalkTarget --- src/body.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/body.rs b/src/body.rs index 23e50d8..99d236e 100644 --- a/src/body.rs +++ b/src/body.rs @@ -816,7 +816,9 @@ impl crate::instruction::InstructionConsumer for PhysicsStat PhysicsInstruction::RefreshWalkTarget => { //calculate acceleration yada yada if self.grounded{ - let mut target_diff=self.walk.target_velocity-self.body.velocity; + let mut v=self.walk.target_velocity; + self.contact_constrain_velocity(&mut v); + let mut target_diff=v-self.body.velocity; target_diff.y=0f32; if target_diff==glam::Vec3::ZERO{ let mut a=glam::Vec3::ZERO; From 5fc404428410d896694570e3c1174070af4617ed Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 19 Sep 2023 18:14:24 -0700 Subject: [PATCH 133/482] small physics opti --- src/body.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/body.rs b/src/body.rs index 99d236e..293a99f 100644 --- a/src/body.rs +++ b/src/body.rs @@ -472,6 +472,7 @@ impl PhysicsState { //collect valid t best_time=t_time; exit_face=Some(TreyMeshFace::Left); + break; } } for t in zeroes2(mesh0.min.x-mesh1.max.x,v.x,0.5*a.x) { @@ -484,6 +485,7 @@ impl PhysicsState { //collect valid t best_time=t_time; exit_face=Some(TreyMeshFace::Right); + break; } } }, @@ -515,6 +517,7 @@ impl PhysicsState { //collect valid t best_time=t_time; exit_face=Some(TreyMeshFace::Bottom); + break; } } for t in zeroes2(mesh0.min.y-mesh1.max.y,v.y,0.5*a.y) { @@ -527,6 +530,7 @@ impl PhysicsState { //collect valid t best_time=t_time; exit_face=Some(TreyMeshFace::Top); + break; } } }, @@ -558,6 +562,7 @@ impl PhysicsState { //collect valid t best_time=t_time; exit_face=Some(TreyMeshFace::Front); + break; } } for t in zeroes2(mesh0.min.z-mesh1.max.z,v.z,0.5*a.z) { @@ -570,6 +575,7 @@ impl PhysicsState { //collect valid t best_time=t_time; exit_face=Some(TreyMeshFace::Back); + break; } } }, @@ -617,6 +623,7 @@ impl PhysicsState { //collect valid t best_time=t_time; best_face=Some(TreyMeshFace::Left); + break; } } } @@ -632,6 +639,7 @@ impl PhysicsState { //collect valid t best_time=t_time; best_face=Some(TreyMeshFace::Right); + break; } } } @@ -648,6 +656,7 @@ impl PhysicsState { //collect valid t best_time=t_time; best_face=Some(TreyMeshFace::Bottom); + break; } } } @@ -663,6 +672,7 @@ impl PhysicsState { //collect valid t best_time=t_time; best_face=Some(TreyMeshFace::Top); + break; } } } @@ -679,6 +689,7 @@ impl PhysicsState { //collect valid t best_time=t_time; best_face=Some(TreyMeshFace::Front); + break; } } } @@ -694,6 +705,7 @@ impl PhysicsState { //collect valid t best_time=t_time; best_face=Some(TreyMeshFace::Back); + break; } } } From cdf695ee6ea5329dcf5d33b82d6e13f06820cf0e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 13:02:47 -0700 Subject: [PATCH 134/482] label bind group --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index dc7187b..91ebc1e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -262,7 +262,7 @@ impl strafe_client::framework::Example for Skybox { ], }); let model_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { - label: None, + label: Some("Model"), entries: &[ wgpu::BindGroupLayoutEntry { binding: 0, From d16485ae6d9a099e23cda55850087cd7e82f2d3f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 13:28:00 -0700 Subject: [PATCH 135/482] replace visual ground with custom ground model! --- src/main.rs | 65 ++++++++++++++++++++----------------------------- src/shader.wgsl | 40 ------------------------------ 2 files changed, 26 insertions(+), 79 deletions(-) diff --git a/src/main.rs b/src/main.rs index 91ebc1e..a3349dd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -119,7 +119,6 @@ pub struct Skybox { physics: strafe_client::body::PhysicsState, sky_pipeline: wgpu::RenderPipeline, entity_pipeline: wgpu::RenderPipeline, - ground_pipeline: wgpu::RenderPipeline, main_bind_group: wgpu::BindGroup, camera_buf: wgpu::Buffer, models: Vec, @@ -159,8 +158,7 @@ fn get_transform_uniform_data(transform:&glam::Mat4) -> [f32; 4*4] { raw } -fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,source:&[u8]){ - let data = obj::ObjData::load_buf(&source[..]).unwrap(); +fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,data:obj::ObjData){ let mut vertices = Vec::new(); let mut vertex_index = std::collections::HashMap::::new(); for object in data.objects { @@ -223,12 +221,34 @@ impl strafe_client::framework::Example for Skybox { queue: &wgpu::Queue, ) -> Self { let mut modeldatas = Vec::::new(); - add_obj(device,& mut modeldatas,include_bytes!("../models/teslacyberv3.0.obj")); - add_obj(device,& mut modeldatas,include_bytes!("../models/suzanne.obj")); - add_obj(device,& mut modeldatas,include_bytes!("../models/teapot.obj")); + let ground=obj::ObjData{ + position: vec![[-1.0,0.0,-1.0],[1.0,0.0,-1.0],[1.0,0.0,1.0],[-1.0,0.0,1.0]], + texture: vec![[-1.0,-1.0],[1.0,-1.0],[1.0,1.0],[-1.0,1.0]], + normal: vec![[0.0,1.0,0.0]], + objects: vec![obj::Object{ + name: "Ground Object".to_owned(), + groups: vec![obj::Group{ + name: "Ground Group".to_owned(), + index: 0, + material: None, + polys: vec![obj::SimplePolygon(vec![ + obj::IndexTuple(0,Some(0),Some(0)), + obj::IndexTuple(1,Some(1),Some(0)), + obj::IndexTuple(2,Some(2),Some(0)), + obj::IndexTuple(3,Some(3),Some(0)), + ])] + }] + }], + material_libs: Vec::new(), + }; + add_obj(device,& mut modeldatas,obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap()); + add_obj(device,& mut modeldatas,obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap()); + add_obj(device,& mut modeldatas,obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap()); + add_obj(device,& mut modeldatas,ground); println!("models.len = {:?}", modeldatas.len()); modeldatas[1].transform=glam::Mat4::from_translation(glam::vec3(10.,5.,10.)); modeldatas[2].transform=glam::Mat4::from_translation(glam::vec3(-10.,5.,10.)); + modeldatas[3].transform=glam::Mat4::from_translation(glam::vec3(0.,-10.,0.))*glam::Mat4::from_scale(glam::vec3(160.0, 1.0, 160.0)); let main_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: None, @@ -412,33 +432,6 @@ impl strafe_client::framework::Example for Skybox { multisample: wgpu::MultisampleState::default(), multiview: None, }); - let ground_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some("Ground"), - layout: Some(&pipeline_layout), - vertex: wgpu::VertexState { - module: &shader, - entry_point: "vs_ground", - buffers: &[], - }, - fragment: Some(wgpu::FragmentState { - module: &shader, - entry_point: "fs_ground", - targets: &[Some(config.view_formats[0].into())], - }), - primitive: wgpu::PrimitiveState { - front_face: wgpu::FrontFace::Cw, - ..Default::default() - }, - depth_stencil: Some(wgpu::DepthStencilState { - format: Self::DEPTH_FORMAT, - depth_write_enabled: true, - depth_compare: wgpu::CompareFunction::LessEqual, - stencil: wgpu::StencilState::default(), - bias: wgpu::DepthBiasState::default(), - }), - multisample: wgpu::MultisampleState::default(), - multiview: None, - }); let sampler = device.create_sampler(&wgpu::SamplerDescriptor { label: None, @@ -550,7 +543,6 @@ impl strafe_client::framework::Example for Skybox { physics, sky_pipeline, entity_pipeline, - ground_pipeline, main_bind_group, camera_buf, models, @@ -735,11 +727,6 @@ impl strafe_client::framework::Example for Skybox { } } - rpass.set_pipeline(&self.ground_pipeline); - //rpass.set_index_buffer(&[0u16,1,2,1,2,3][..] as wgpu::BufferSlice, wgpu::IndexFormat::Uint16); - //rpass.draw_indexed(0..4, 0, 0..1); - rpass.draw(0..6, 0..1); - rpass.set_pipeline(&self.sky_pipeline); rpass.draw(0..3, 0..1); } diff --git a/src/shader.wgsl b/src/shader.wgsl index a60fc5c..e3fce46 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -39,28 +39,6 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { return result; } -struct GroundOutput { - @builtin(position) position: vec4, - @location(4) pos: vec3, -}; - -@vertex -fn vs_ground(@builtin(vertex_index) vertex_index: u32) -> GroundOutput { - // hacky way to draw two triangles that make a square - let tmp1 = i32(vertex_index)/2-i32(vertex_index)/3; - let tmp2 = i32(vertex_index)&1; - let pos = vec3( - f32(tmp1) * 2.0 - 1.0, - 0.0, - f32(tmp2) * 2.0 - 1.0 - ) * 160.0; - - var result: GroundOutput; - result.pos = pos; - result.position = r_data.proj * r_data.view * vec4(pos, 1.0); - return result; -} - struct EntityOutput { @builtin(position) position: vec4, @location(1) texture: vec2, @@ -111,21 +89,3 @@ fn fs_entity(vertex: EntityOutput) -> @location(0) vec4 { let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb; return vec4(mix(vec3(0.1) + 0.5 * reflected_color,texture_color,1.0-pow(1.0-abs(d),2.0)), 1.0); } - -fn modulo_euclidean (a: f32, b: f32) -> f32 { - var m = a % b; - if (m < 0.0) { - if (b < 0.0) { - m -= b; - } else { - m += b; - } - } - return m; -} - -@fragment -fn fs_ground(vertex: GroundOutput) -> @location(0) vec4 { - let dir = vec3(-1.0)+vec3(modulo_euclidean(vertex.pos.x/16.,1.0),0.0,modulo_euclidean(vertex.pos.z/16.,1.0))*2.0; - return vec4(textureSample(r_texture, r_sampler, dir).rgb, 1.0); -} From 7e427b3879da4c69187082bf069e7d74cd2e7155 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 13:03:25 -0700 Subject: [PATCH 136/482] instanced rendering --- src/main.rs | 36 ++++++++++++++++++++++-------------- src/shader.wgsl | 9 +++++---- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/main.rs b/src/main.rs index a3349dd..e78103f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,13 +19,13 @@ struct Entity { //temp? struct ModelData { - transform: glam::Mat4, + transforms: Vec, vertex_buf: wgpu::Buffer, entities: Vec, } struct ModelGraphics { - transform: glam::Mat4, + transforms: Vec, vertex_buf: wgpu::Buffer, entities: Vec, bind_group: wgpu::BindGroup, @@ -152,9 +152,13 @@ impl Skybox { } } -fn get_transform_uniform_data(transform:&glam::Mat4) -> [f32; 4*4] { - let mut raw = [0f32; 4*4]; - raw[0..16].copy_from_slice(&AsRef::<[f32; 4*4]>::as_ref(transform)[..]); +fn get_transform_uniform_data(transforms:&Vec) -> Vec { + let mut raw = Vec::with_capacity(4*4*transforms.len()); + for (i,t) in transforms.iter().enumerate(){ + let mut v = raw.split_off(4*4*i); + raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(t)[..]); + raw.append(&mut v); + } raw } @@ -200,7 +204,7 @@ fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,data:obj::ObjDat usage: wgpu::BufferUsages::VERTEX, }); modeldatas.push(ModelData { - transform: glam::Mat4::default(), + transforms: vec![glam::Mat4::default()], vertex_buf, entities, }) @@ -246,9 +250,13 @@ impl strafe_client::framework::Example for Skybox { add_obj(device,& mut modeldatas,obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap()); add_obj(device,& mut modeldatas,ground); println!("models.len = {:?}", modeldatas.len()); - modeldatas[1].transform=glam::Mat4::from_translation(glam::vec3(10.,5.,10.)); - modeldatas[2].transform=glam::Mat4::from_translation(glam::vec3(-10.,5.,10.)); - modeldatas[3].transform=glam::Mat4::from_translation(glam::vec3(0.,-10.,0.))*glam::Mat4::from_scale(glam::vec3(160.0, 1.0, 160.0)); + modeldatas[0].transforms[0]=glam::Mat4::from_translation(glam::vec3(10.,0.,-10.)); + modeldatas[1].transforms[0]=glam::Mat4::from_translation(glam::vec3(10.,5.,10.)); + modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(20.,5.,10.))); + modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,5.,20.))); + modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(20.,5.,20.))); + modeldatas[2].transforms[0]=glam::Mat4::from_translation(glam::vec3(-10.,5.,10.)); + modeldatas[3].transforms[0]=glam::Mat4::from_translation(glam::vec3(0.,0.,0.))*glam::Mat4::from_scale(glam::vec3(160.0, 1.0, 160.0)); let main_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: None, @@ -326,7 +334,7 @@ impl strafe_client::framework::Example for Skybox { temp_control_dir: glam::Vec3::ZERO, walkspeed: 18.0, contacts: std::collections::HashSet::new(), - models_cringe_clone: modeldatas.iter().map(|m|strafe_client::body::Model::new(m.transform)).collect(), + models_cringe_clone: modeldatas.iter().map(|m|m.transforms.iter().map(|t|strafe_client::body::Model::new(*t))).flatten().collect(), walk: strafe_client::body::WalkState::new(), hitbox_halfsize: glam::vec3(1.0,2.5,1.0), }; @@ -341,7 +349,7 @@ impl strafe_client::framework::Example for Skybox { //drain the modeldata vec so entities can be /moved/ to models.entities let mut models = Vec::::with_capacity(modeldatas.len()); for (i,modeldata) in modeldatas.drain(..).enumerate() { - let model_uniforms = get_transform_uniform_data(&modeldata.transform); + let model_uniforms = get_transform_uniform_data(&modeldata.transforms); let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some(format!("ModelGraphics{}",i).as_str()), contents: bytemuck::cast_slice(&model_uniforms), @@ -359,7 +367,7 @@ impl strafe_client::framework::Example for Skybox { }); //all of these are being moved here models.push(ModelGraphics{ - transform: modeldata.transform, + transforms: modeldata.transforms, vertex_buf:modeldata.vertex_buf, entities: modeldata.entities, bind_group: model_bind_group, @@ -675,7 +683,7 @@ impl strafe_client::framework::Example for Skybox { .copy_from_slice(bytemuck::cast_slice(&camera_uniforms)); //This code only needs to run when the uniforms change for model in self.models.iter() { - let model_uniforms = get_transform_uniform_data(&model.transform); + let model_uniforms = get_transform_uniform_data(&model.transforms); self.staging_belt .write_buffer( &mut encoder, @@ -723,7 +731,7 @@ impl strafe_client::framework::Example for Skybox { for entity in model.entities.iter() { rpass.set_index_buffer(entity.index_buf.slice(..), wgpu::IndexFormat::Uint16); - rpass.draw_indexed(0..entity.index_count, 0, 0..1); + rpass.draw_indexed(0..entity.index_count, 0, 0..model.transforms.len() as u32); } } diff --git a/src/shader.wgsl b/src/shader.wgsl index e3fce46..bcfa5fc 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -45,20 +45,21 @@ struct EntityOutput { @location(2) normal: vec3, @location(3) view: vec3, }; - +const MAX_ENTITY_INSTANCES=1024; @group(1) @binding(0) -var r_EntityTransform: mat4x4; +var r_EntityTransform: array,MAX_ENTITY_INSTANCES>; @vertex fn vs_entity( + @builtin(instance_index) instance: u32, @location(0) pos: vec3, @location(1) texture: vec2, @location(2) normal: vec3, ) -> EntityOutput { - var position: vec4 = r_EntityTransform * vec4(pos, 1.0); + var position: vec4 = r_EntityTransform[instance] * vec4(pos, 1.0); var result: EntityOutput; - result.normal = (r_EntityTransform * vec4(normal, 0.0)).xyz; + result.normal = (r_EntityTransform[instance] * vec4(normal, 0.0)).xyz; result.texture=texture; result.view = position.xyz - r_data.cam_pos.xyz; result.position = r_data.proj * r_data.view * position; From acb658f3e9636ada84167df98e3207f521ca079a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 14:07:11 -0700 Subject: [PATCH 137/482] goal: repeating ground texture --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index e78103f..1f03dea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -227,7 +227,7 @@ impl strafe_client::framework::Example for Skybox { let mut modeldatas = Vec::::new(); let ground=obj::ObjData{ position: vec![[-1.0,0.0,-1.0],[1.0,0.0,-1.0],[1.0,0.0,1.0],[-1.0,0.0,1.0]], - texture: vec![[-1.0,-1.0],[1.0,-1.0],[1.0,1.0],[-1.0,1.0]], + texture: vec![[-10.0,-10.0],[10.0,-10.0],[10.0,10.0],[-10.0,10.0]], normal: vec![[0.0,1.0,0.0]], objects: vec![obj::Object{ name: "Ground Object".to_owned(), From fb4a5efa1461a0c1e4d42076d2bb82698be982bc Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 15:57:06 -0700 Subject: [PATCH 138/482] split main bind group, rename everything, organize GraphicsData --- src/main.rs | 191 ++++++++++++++++++++++++++++++++---------------- src/shader.wgsl | 81 +++++++++++--------- 2 files changed, 175 insertions(+), 97 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1f03dea..c4170cd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -113,20 +113,29 @@ impl Camera { } } -pub struct Skybox { +pub struct GraphicsBindGroups { + camera: wgpu::BindGroup, + skybox_texture: wgpu::BindGroup, +} + +pub struct GraphicsPipelines { + skybox: wgpu::RenderPipeline, + model: wgpu::RenderPipeline, +} + +pub struct GraphicsData { start_time: std::time::Instant, camera: Camera, physics: strafe_client::body::PhysicsState, - sky_pipeline: wgpu::RenderPipeline, - entity_pipeline: wgpu::RenderPipeline, - main_bind_group: wgpu::BindGroup, + pipelines: GraphicsPipelines, + bind_groups: GraphicsBindGroups, camera_buf: wgpu::Buffer, models: Vec, depth_view: wgpu::TextureView, staging_belt: wgpu::util::StagingBelt, } -impl Skybox { +impl GraphicsData { const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth24Plus; fn create_depth_texture( @@ -211,7 +220,7 @@ fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,data:obj::ObjDat } } -impl strafe_client::framework::Example for Skybox { +impl strafe_client::framework::Example for GraphicsData { fn optional_features() -> wgpu::Features { wgpu::Features::TEXTURE_COMPRESSION_ASTC | wgpu::Features::TEXTURE_COMPRESSION_ETC2 @@ -258,8 +267,44 @@ impl strafe_client::framework::Example for Skybox { modeldatas[2].transforms[0]=glam::Mat4::from_translation(glam::vec3(-10.,5.,10.)); modeldatas[3].transforms[0]=glam::Mat4::from_translation(glam::vec3(0.,0.,0.))*glam::Mat4::from_scale(glam::vec3(160.0, 1.0, 160.0)); - let main_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + let camera_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: None, + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::VERTEX, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + ], + }); + let skybox_texture_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Some("Skybox Texture Bind Group Layout"), + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { filterable: true }, + multisampled: false, + view_dimension: wgpu::TextureViewDimension::Cube, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), + count: None, + }, + ], + }); + let model_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Some("Model Bind Group Layout"), entries: &[ wgpu::BindGroupLayoutEntry { binding: 0, @@ -277,7 +322,7 @@ impl strafe_client::framework::Example for Skybox { ty: wgpu::BindingType::Texture { sample_type: wgpu::TextureSampleType::Float { filterable: true }, multisampled: false, - view_dimension: wgpu::TextureViewDimension::Cube, + view_dimension: wgpu::TextureViewDimension::D2, }, count: None, }, @@ -289,20 +334,26 @@ impl strafe_client::framework::Example for Skybox { }, ], }); - let model_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { - label: Some("Model"), - entries: &[ - wgpu::BindGroupLayoutEntry { - binding: 0, - visibility: wgpu::ShaderStages::VERTEX, - ty: wgpu::BindingType::Buffer { - ty: wgpu::BufferBindingType::Uniform, - has_dynamic_offset: false, - min_binding_size: None, - }, - count: None, - }, - ], + + let clamp_sampler = device.create_sampler(&wgpu::SamplerDescriptor { + label: Some("Clamp Sampler"), + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: wgpu::FilterMode::Linear, + min_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::FilterMode::Linear, + ..Default::default() + }); + let repeat_sampler = device.create_sampler(&wgpu::SamplerDescriptor { + label: Some("Repeat Sampler"), + address_mode_u: wgpu::AddressMode::Repeat, + address_mode_v: wgpu::AddressMode::Repeat, + address_mode_w: wgpu::AddressMode::Repeat, + mag_filter: wgpu::FilterMode::Linear, + min_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::FilterMode::Linear, + ..Default::default() }); // Create the render pipeline @@ -362,6 +413,14 @@ impl strafe_client::framework::Example for Skybox { binding: 0, resource: model_buf.as_entire_binding(), }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(&squid_texture_view), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: wgpu::BindingResource::Sampler(&repeat_sampler), + }, ], label: Some(format!("ModelGraphics{}",i).as_str()), }); @@ -377,13 +436,17 @@ impl strafe_client::framework::Example for Skybox { let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { label: None, - bind_group_layouts: &[&main_bind_group_layout, &model_bind_group_layout], + bind_group_layouts: &[ + &camera_bind_group_layout, + &model_bind_group_layout, + &skybox_texture_bind_group_layout, + ], push_constant_ranges: &[], }); // Create the render pipelines let sky_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some("Sky"), + label: Some("Sky Pipeline"), layout: Some(&pipeline_layout), vertex: wgpu::VertexState { module: &shader, @@ -409,12 +472,12 @@ impl strafe_client::framework::Example for Skybox { multisample: wgpu::MultisampleState::default(), multiview: None, }); - let entity_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label: Some("Entity"), + let model_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Model Pipeline"), layout: Some(&pipeline_layout), vertex: wgpu::VertexState { module: &shader, - entry_point: "vs_entity", + entry_point: "vs_entity_texture", buffers: &[wgpu::VertexBufferLayout { array_stride: std::mem::size_of::() as wgpu::BufferAddress, step_mode: wgpu::VertexStepMode::Vertex, @@ -423,7 +486,7 @@ impl strafe_client::framework::Example for Skybox { }, fragment: Some(wgpu::FragmentState { module: &shader, - entry_point: "fs_entity", + entry_point: "fs_entity_texture", targets: &[Some(config.view_formats[0].into())], }), primitive: wgpu::PrimitiveState { @@ -441,17 +504,6 @@ impl strafe_client::framework::Example for Skybox { multiview: None, }); - let sampler = device.create_sampler(&wgpu::SamplerDescriptor { - label: None, - address_mode_u: wgpu::AddressMode::ClampToEdge, - address_mode_v: wgpu::AddressMode::ClampToEdge, - address_mode_w: wgpu::AddressMode::ClampToEdge, - mag_filter: wgpu::FilterMode::Linear, - min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Linear, - ..Default::default() - }); - let device_features = device.features(); let skybox_format = if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ASTC) { @@ -502,9 +554,9 @@ impl strafe_client::framework::Example for Skybox { _ => unreachable!(), }; - let image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); + let skybox_image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); - let texture = device.create_texture_with_data( + let skybox_texture = device.create_texture_with_data( queue, &wgpu::TextureDescriptor { size, @@ -513,45 +565,57 @@ impl strafe_client::framework::Example for Skybox { dimension: wgpu::TextureDimension::D2, format: skybox_format, usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, - label: None, + label: Some("Skybox Texture"), view_formats: &[], }, - &image.data, + &skybox_image.data, ); - let texture_view = texture.create_view(&wgpu::TextureViewDescriptor { - label: None, + let skybox_texture_view = skybox_texture.create_view(&wgpu::TextureViewDescriptor { + label: Some("Skybox Texture View"), dimension: Some(wgpu::TextureViewDimension::Cube), ..wgpu::TextureViewDescriptor::default() }); - let main_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - layout: &main_bind_group_layout, + + let camera_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &camera_bind_group_layout, entries: &[ wgpu::BindGroupEntry { binding: 0, resource: camera_buf.as_entire_binding(), }, - wgpu::BindGroupEntry { - binding: 1, - resource: wgpu::BindingResource::TextureView(&texture_view), - }, - wgpu::BindGroupEntry { - binding: 2, - resource: wgpu::BindingResource::Sampler(&sampler), - }, ], label: Some("Camera"), }); + let skybox_texture_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &skybox_texture_bind_group_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::TextureView(&skybox_texture_view), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::Sampler(&clamp_sampler), + }, + ], + label: Some("Sky Texture"), + }); let depth_view = Self::create_depth_texture(config, device); - Skybox { + GraphicsData { start_time: Instant::now(), camera, physics, - sky_pipeline, - entity_pipeline, - main_bind_group, + pipelines:GraphicsPipelines{ + skybox:sky_pipeline, + model:model_pipeline + }, + bind_groups:GraphicsBindGroups{ + camera:camera_bind_group, + skybox_texture:skybox_texture_bind_group, + }, camera_buf, models, depth_view, @@ -722,9 +786,10 @@ impl strafe_client::framework::Example for Skybox { }), }); - rpass.set_bind_group(0, &self.main_bind_group, &[]); + rpass.set_bind_group(0, &self.bind_groups.camera, &[]); + rpass.set_bind_group(2, &self.bind_groups.skybox_texture, &[]); - rpass.set_pipeline(&self.entity_pipeline); + rpass.set_pipeline(&self.pipelines.model); for model in self.models.iter() { rpass.set_bind_group(1, &model.bind_group, &[]); rpass.set_vertex_buffer(0, model.vertex_buf.slice(..)); @@ -735,7 +800,7 @@ impl strafe_client::framework::Example for Skybox { } } - rpass.set_pipeline(&self.sky_pipeline); + rpass.set_pipeline(&self.pipelines.skybox); rpass.draw(0..3, 0..1); } @@ -746,7 +811,7 @@ impl strafe_client::framework::Example for Skybox { } fn main() { - strafe_client::framework::run::( + strafe_client::framework::run::( format!("Strafe Client v{}", env!("CARGO_PKG_VERSION") ).as_str() diff --git a/src/shader.wgsl b/src/shader.wgsl index bcfa5fc..a2f1fe7 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -1,9 +1,4 @@ -struct SkyOutput { - @builtin(position) position: vec4, - @location(0) sampledir: vec3, -}; - -struct Data { +struct Camera { // from camera to screen proj: mat4x4, // from screen to camera @@ -13,9 +8,16 @@ struct Data { // camera position cam_pos: vec4, }; + +//group 0 is the camera @group(0) @binding(0) -var r_data: Data; +var camera: Camera; + +struct SkyOutput { + @builtin(position) position: vec4, + @location(0) sampledir: vec3, +}; @vertex fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { @@ -30,8 +32,8 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { ); // transposition = inversion for this orthonormal matrix - let inv_model_view = transpose(mat3x3(r_data.view[0].xyz, r_data.view[1].xyz, r_data.view[2].xyz)); - let unprojected = r_data.proj_inv * pos; + let inv_model_view = transpose(mat3x3(camera.view[0].xyz, camera.view[1].xyz, camera.view[2].xyz)); + let unprojected = camera.proj_inv * pos; var result: SkyOutput; result.sampledir = inv_model_view * unprojected.xyz; @@ -39,54 +41,65 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { return result; } -struct EntityOutput { +const MAX_ENTITY_INSTANCES=1024; +//group 1 is the model +@group(1) +@binding(0) +var entity_transforms: array,MAX_ENTITY_INSTANCES>; +//var entity_texture_transforms: array,MAX_ENTITY_INSTANCES>; +//my fancy idea is to create a megatexture for each model that includes all the textures each intance will need +//the texture transform then maps the texture coordinates to the location of the specific texture +//how to do no texture? +@group(1) +@binding(1) +var model_texture: texture_2d; +@group(1) +@binding(2) +var model_sampler: sampler; + +struct EntityOutputTexture { @builtin(position) position: vec4, @location(1) texture: vec2, @location(2) normal: vec3, @location(3) view: vec3, }; -const MAX_ENTITY_INSTANCES=1024; -@group(1) -@binding(0) -var r_EntityTransform: array,MAX_ENTITY_INSTANCES>; - @vertex -fn vs_entity( +fn vs_entity_texture( @builtin(instance_index) instance: u32, @location(0) pos: vec3, @location(1) texture: vec2, @location(2) normal: vec3, -) -> EntityOutput { - var position: vec4 = r_EntityTransform[instance] * vec4(pos, 1.0); - var result: EntityOutput; - result.normal = (r_EntityTransform[instance] * vec4(normal, 0.0)).xyz; - result.texture=texture; - result.view = position.xyz - r_data.cam_pos.xyz; - result.position = r_data.proj * r_data.view * position; +) -> EntityOutputTexture { + var position: vec4 = entity_transforms[instance] * vec4(pos, 1.0); + var result: EntityOutputTexture; + result.normal = (entity_transforms[instance] * vec4(normal, 0.0)).xyz; + result.texture=texture;//(entity_texture_transforms[instance] * vec3(texture, 1.0)).xy; + result.view = position.xyz - camera.cam_pos.xyz; + result.position = camera.proj * camera.view * position; return result; } -@group(0) +//group 2 is the skybox texture +@group(2) +@binding(0) +var cube_texture: texture_cube; +@group(2) @binding(1) -var r_texture: texture_cube; -@group(0) -@binding(2) -var r_sampler: sampler; +var cube_sampler: sampler; @fragment fn fs_sky(vertex: SkyOutput) -> @location(0) vec4 { - return textureSample(r_texture, r_sampler, vertex.sampledir); + return textureSample(cube_texture, model_sampler, vertex.sampledir); } @fragment -fn fs_entity(vertex: EntityOutput) -> @location(0) vec4 { +fn fs_entity_texture(vertex: EntityOutputTexture) -> @location(0) vec4 { let incident = normalize(vertex.view); let normal = normalize(vertex.normal); let d = dot(normal, incident); let reflected = incident - 2.0 * d * normal; - let dir = vec3(-1.0)+2.0*vec3(vertex.texture.x,0.0,vertex.texture.y); - let texture_color = textureSample(r_texture, r_sampler, dir).rgb; - let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb; - return vec4(mix(vec3(0.1) + 0.5 * reflected_color,texture_color,1.0-pow(1.0-abs(d),2.0)), 1.0); + let fragment_color = textureSample(model_texture, model_sampler, vertex.texture).rgb; + let reflected_color = textureSample(cube_texture, cube_sampler, reflected).rgb; + return vec4(mix(vec3(0.1) + 0.5 * reflected_color,fragment_color,1.0-pow(1.0-abs(d),2.0)), 1.0); } From 91f6a5261fd1e9cea09e5902233b21d3ed8fcdc9 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 16:58:56 -0700 Subject: [PATCH 139/482] move camera_uniforms and skybox_texture --- src/main.rs | 153 ++++++++++++++++++++++++++-------------------------- 1 file changed, 76 insertions(+), 77 deletions(-) diff --git a/src/main.rs b/src/main.rs index c4170cd..68e330c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -390,11 +390,77 @@ impl strafe_client::framework::Example for GraphicsData { hitbox_halfsize: glam::vec3(1.0,2.5,1.0), }; - let camera_uniforms = camera.to_uniform_data(physics.body.extrapolated_position(0)); - let camera_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Camera"), - contents: bytemuck::cast_slice(&camera_uniforms), - usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + let device_features = device.features(); + + let skybox_format = if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ASTC) { + log::info!("Using ASTC"); + wgpu::TextureFormat::Astc { + block: AstcBlock::B4x4, + channel: AstcChannel::UnormSrgb, + } + } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ETC2) { + log::info!("Using ETC2"); + wgpu::TextureFormat::Etc2Rgb8UnormSrgb + } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_BC) { + log::info!("Using BC"); + wgpu::TextureFormat::Bc1RgbaUnormSrgb + } else { + log::info!("Using plain"); + wgpu::TextureFormat::Bgra8UnormSrgb + }; + + let size = wgpu::Extent3d { + width: IMAGE_SIZE, + height: IMAGE_SIZE, + depth_or_array_layers: 6, + }; + + let layer_size = wgpu::Extent3d { + depth_or_array_layers: 1, + ..size + }; + let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); + + log::debug!( + "Copying {:?} skybox images of size {}, {}, 6 with {} mips to gpu", + skybox_format, + IMAGE_SIZE, + IMAGE_SIZE, + max_mips, + ); + + let bytes = match skybox_format { + wgpu::TextureFormat::Astc { + block: AstcBlock::B4x4, + channel: AstcChannel::UnormSrgb, + } => &include_bytes!("../images/astc.dds")[..], + wgpu::TextureFormat::Etc2Rgb8UnormSrgb => &include_bytes!("../images/etc2.dds")[..], + wgpu::TextureFormat::Bc1RgbaUnormSrgb => &include_bytes!("../images/bc1.dds")[..], + wgpu::TextureFormat::Bgra8UnormSrgb => &include_bytes!("../images/bgra.dds")[..], + _ => unreachable!(), + }; + + let skybox_image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); + + let skybox_texture = device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor { + size, + mip_level_count: max_mips, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: skybox_format, + usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + label: Some("Skybox Texture"), + view_formats: &[], + }, + &skybox_image.data, + ); + + let skybox_texture_view = skybox_texture.create_view(&wgpu::TextureViewDescriptor { + label: Some("Skybox Texture View"), + dimension: Some(wgpu::TextureViewDimension::Cube), + ..wgpu::TextureViewDescriptor::default() }); //drain the modeldata vec so entities can be /moved/ to models.entities @@ -504,79 +570,12 @@ impl strafe_client::framework::Example for GraphicsData { multiview: None, }); - let device_features = device.features(); - - let skybox_format = if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ASTC) { - log::info!("Using ASTC"); - wgpu::TextureFormat::Astc { - block: AstcBlock::B4x4, - channel: AstcChannel::UnormSrgb, - } - } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ETC2) { - log::info!("Using ETC2"); - wgpu::TextureFormat::Etc2Rgb8UnormSrgb - } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_BC) { - log::info!("Using BC"); - wgpu::TextureFormat::Bc1RgbaUnormSrgb - } else { - log::info!("Using plain"); - wgpu::TextureFormat::Bgra8UnormSrgb - }; - - let size = wgpu::Extent3d { - width: IMAGE_SIZE, - height: IMAGE_SIZE, - depth_or_array_layers: 6, - }; - - let layer_size = wgpu::Extent3d { - depth_or_array_layers: 1, - ..size - }; - let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); - - log::debug!( - "Copying {:?} skybox images of size {}, {}, 6 with {} mips to gpu", - skybox_format, - IMAGE_SIZE, - IMAGE_SIZE, - max_mips, - ); - - let bytes = match skybox_format { - wgpu::TextureFormat::Astc { - block: AstcBlock::B4x4, - channel: AstcChannel::UnormSrgb, - } => &include_bytes!("../images/astc.dds")[..], - wgpu::TextureFormat::Etc2Rgb8UnormSrgb => &include_bytes!("../images/etc2.dds")[..], - wgpu::TextureFormat::Bc1RgbaUnormSrgb => &include_bytes!("../images/bc1.dds")[..], - wgpu::TextureFormat::Bgra8UnormSrgb => &include_bytes!("../images/bgra.dds")[..], - _ => unreachable!(), - }; - - let skybox_image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); - - let skybox_texture = device.create_texture_with_data( - queue, - &wgpu::TextureDescriptor { - size, - mip_level_count: max_mips, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format: skybox_format, - usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, - label: Some("Skybox Texture"), - view_formats: &[], - }, - &skybox_image.data, - ); - - let skybox_texture_view = skybox_texture.create_view(&wgpu::TextureViewDescriptor { - label: Some("Skybox Texture View"), - dimension: Some(wgpu::TextureViewDimension::Cube), - ..wgpu::TextureViewDescriptor::default() + let camera_uniforms = camera.to_uniform_data(physics.body.extrapolated_position(0)); + let camera_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Camera"), + contents: bytemuck::cast_slice(&camera_uniforms), + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, }); - let camera_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { layout: &camera_bind_group_layout, entries: &[ From 21835d13f6e4affa90296b7917eb2f72c552abdd Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 17:01:57 -0700 Subject: [PATCH 140/482] load squid texture --- images/squid.dds | Bin 0 -> 1548292 bytes src/main.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 images/squid.dds diff --git a/images/squid.dds b/images/squid.dds new file mode 100644 index 0000000000000000000000000000000000000000..bbb96618e97e186472f0bdd6ff867071993edeb4 GIT binary patch literal 1548292 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

)KFg_)e=WW*(+*xVs%H%K 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ⅆ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

  • vfX4|w$|hUv=lSl;Lp(qW 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℘a%cMO9dQc;Lk?q=Tt&y#q zZHximpl=@=lY-~RdLotXhhCMBl=5XL9)b82wpcNaXYG?)DLu`_Dc+8P$$J0OoHJ%T zYfrzw*Tu;$?uv4Ol5R$RMAvC`6Zb+h2|Akux%(${qgE;@5$QhY4O3Zsm^>g>%cfntq z6tXtqtGKV2q%3oKzX#lGJ**n$4HD>Q01uJP;jFT};ntl=@dg$4`!>Y)=Jr-UX7xOA zKGStZ8xH1`s}1=h3n2d5y0CT6fA|Eie|3LBzs}Hht&~)HRLTbh{L$Y$#QhgsxS*fU zk$=*N=cRa3DaX26Tu@ zm@#Hf)Lx11ckbs=Jz(VHAm3HS@8k9Hs;sKOU-5_i!sY}0i18?xX%RaIcj^Gy@&UlX2TubX8v)7}1qSMN(cEkC)VI86zU?l88_Ij2tF`MG=|D)^8R zjb~lMc=08?F-ImeE*GTiV&jE#ws2T|e`>!M!XDW~@e&C9G6|?>jP}RR+765j<*ftW z!t$l-b|R$#oHJ%b5nDfGZm(mYrK5!rb3b;~h-Kg#a?d(ILA8-A3SRZj74}&-_#4Iz zJ|u}uruiL5`YqxBv2n@fRSpa*r&B{>2hC zCmaf!95U_XE+PWo7iu8a=X9PY7e{`A`tCYYZzGH8W+(V0EniLfyW=fpagWYuJi@%% z&*oDsm&k*ahc6x>8Dr0-@MnlcTO@wWB+ zLaf)|N7FwB`kra?u)aKrxEis<-jwPUQ2%;M9du3LoXbuzb zS7`iynYBcS|6&b%iMocw+NJj<+%weAi2OWsLFfrT=(+!Xt{m4Bbql*qa>vFnXQt2o z1^Z2?Hmp6OEI7;XeSX!LT3+p#M1f}pt8dczR$sr6>TA&ajupl-N$s&}ouR*uNC&&n za-jo!6SlwSwaJHF0!Lerfqa(Nds5>9<4iU)8G5{=MC>kBwJoeL@JSpbvdENZ@Mj17 zb)a1*#j=h$@Q+zO!huGQM$coO(Ueb-OUK&^2I{YmFOZettlq`Vn@M#xb>_W>{2NbQ zgQh{F(-`i5f_d_4%`vn;*Yi=Flf=z#y({w#_|WhzmPzS{UsaOHIrZhZzcrQ0t5M>y$0GQ&{+ z(YVX#G~Z*KfF!x}MsLOYFSN1vUYI?Tc*glG!hG1?9)tYxQ0Uv;4LOSWoTU->`S&A6 zTmE7$wZE*zM3%Ve)h4?BQT`nE^F00fk9-g*;terAaXT*;)EW2~YK?lpUKzkMfMw*2 z%K4VAm(>2F_R0oO&e=A8FOrRigsB+dC3L-A_C!+U@{qTW;u)&-I$e+1JF_=9m7gbODtW&%uHTL7H!nC388^j@LPT;__gVEB^>E%Z zdlVrQuU;lG|2}+9Oe6E1aq)iSM{iN=+xf?e-=`7J+NM2Pyw94`9WOh(Z!({!YW$yR zb$<0>?cwcPwT$Ak#Us$ax4_1qcK)R!W_MZq<^Z^(sU7KU2D~S{J7T-6JG>kGMwb7W zar)^=cDzOc&%pQHICD(S&uQ;qM%u7#>xhWx=Ht+Z|8T_pVvH~Hk6HdC#)pmXyh80e z`bYOK*h_MnFCyx|{&#rzeHwqrR?hp0wGT%kUljK@#pnm?AB4LFq`aw^>Vt7Dcrnlv zsbkD-TGTce4{M3B&`i`z#y@>*HXr$q7TgHu+F~sk^;G5q{(;Bi{PqUeoP@l+801U$ z8;-y%+^>%?<8J+U68<={K}rzsW{xbW8I*+jn2%dv)S$lFg#%xF0(`>KQV=L9x~^f) zd9`=B;`i+r9V&qz#I)?EdNw*UZ^f1J_RdD|&E`YTM!q13OE~^sJw%#UNAo=EG1;}y$H&egr22S9Mz*%zCMWf0M9w#5ELtQ#ATJ$ zf?x4_8CRed`lOvCC_e)}p{wjae|EjgOfEB8`u%9&5f|{jmcEn1KTSqtD}w(R)#3jD%i)n+^11GVLx0wMf;> z&O0GAo^2uVxDrv2Punbh;VFyEPrT7|gDKPF7pAhXj4(uKnfZ5oC?7v)P~5DTf{PUY z@PWT4C*rWdnIAS(kWu0i%O}tWm@&i1ICM-GGs^OF%RK05dD-SCYudETQ2*+yX?T7- zh=n{U@L@(7^}IO`y~f2TXHss%Ats$^t5;$?@W6P^Nor!kUl*5#{$u?RF9Ki2MI=q9 zZSZMataQgn?7YPfzrcFs#OGL=S7PxC9RJfxt!_N`+Tl(JsxZS-XT<=Yu;Lz8Vtyc= z>pUa?{o{IFecV}pEQ8#=ly;*W`Pdwuzk30v=qB4fp6w?RjSH4tYQ9LGX3MjLhb7nK`ngPW-;Hg^k(IMmKGk5!+^k zzlYwdk&V%O^M7+NzoMv~2RGDgU0m&1=+l@+Q@zmDMN@MG7X=(aVi~V?8|rrqoBAW` z&mw;)@Dt!kPyCA=i%2BmrBPIGWIku9NtVfODFgh%3eQuf3TO$)vP~kuFHCUXS=uv* zc-xgw{GlHB1M&}eG@pXv6SSVmcP5);707=>JBso(xF^M_B$b>L94zIfpkC{PEnGG~ zfYy7xO!Y(OR@JlX;lTH^TVyS3TcFQDuipjyql=$Q4<^1asttHoOpRZSUyo-G0e_=^ zBwR zplXp&5Tbkyif3e(>GcgL9zyXti~WNAR(AvM613^{ty(s>#k2;L(R>r=h02@g`j3Nv zKSA+*iYKF7b%S8S0yh7|P|suU-MK4US$yN}VT%W}o_&h4tol{`obNpN6fMWylz3}_^{IWzJ9LH)6 z`57Nfo~&i}1Ni5(e-1G*d<8#&|9^PI1tC2c;1e|dP|23_M*M9czhir5=2`ap1LrCK zy=Y?*@;7WssDC$xmpk$IWp9=d%AdgZ<(#z~HeO-)yb52yAMTIMA6b^Ww3i-q|Dx;L zO4o~LFG8~d{^T3Bp8Tb&U$gT8_y!%H!@ZKOrClld&*S8@o&8(JWrlP*C#ksZb$P026K$qdc+h@q~mew%hbsy2l=`R z4kf%kg!6FlHnaDKdu~4 zF!B2Q6SsP?yNij72`Ld*vwEI9C*CCC8lhl+Jj=((m|Wh)KJQ|EeH0A0!%cpH1MrXJ zXNYI5p1FNk-S=mA80wn{Vue0ls@MwXb7au`mhGxS_8{?r)inRayUMeQ`qTJ*s^=m9 zOYs!tBA)IBA8YVK^pCIMDR@4fA2TI)9O(V*QcL^%dU(K>(^&nGY^yAzdaEZ!WJFvD z8?Ry6G243Rc+&h7`TF&2eI?-EY(CJ2w~lXlI9R?a?4hy}^#*pmgPyA%A6pASSz0eg z-{w5$pgty0r{Q{g(+lhpURqij1AYyCUzFgRcq&gx$N+x8J*jMIq5H9cKOyl11R zpe_G2+(GoKsF82bgU>$s7nfcScmj*BIiNZ){=lcy#{(T?IR!a4a|-@B&(<4+o*L>2 zQoQmHJe^zpxBB-M6^H28ql8RF{MgkD@}+2g_lC!39^1xv#FAYv*nIQVHPSdD4U}R$ zLN3Ana4Qz~xGNGAg2SrUQNTxxIRkhk#uIvIIy+z60MTYq3>on<uBRrz|415CUE#)p##}*j)3n{&h`MiV9 z5eEK+H?(8$hx#4*dLObC-ZN~mgOGuI7Vma{O@Q`52SelcSg)FPGspKe?mtgn>g&5s zR7{Lr7JF0i51w(4mx2|KXYfzQK|Rc78$8^XD|SRHTRa|{n0 zAMo{}9|I_Vfbv!N63?Zcl75#5NqMs53uA5?6RBSBa=EpS^)G^7 z1k8XQ2+B=<=D#3yAsNWOkr?^Ac>T0@1=ZKMgZa6_B1_u1L^lWg4pwi|xYZ?dF)A(? z>iKkb{88~oMeKpGJWXKQVx(XDeLE3J>BL?R$mHj#c_*@3`Lor`a%^~t?O8rd(UShgMnCO2t^#TbA zQ{{dO`_w*Qao&dRUkv#xgZG+l27Tx7R~IZvbCv9`$rssu=g1rLQkD zxEEyao4T8Z`InuHpR>2MOFUOvI;5?z#9R61id1;Xg6^}c5 zeg?%eEM8euGvR-((a7=q-*E49e=|D8l*CI^LD=7`j9*N8_tjfw@7!6}u%4Zno4%(e z;qe}3PFbP}?q}LXhkHxj$-2m!3oA4TpngCGhmJWjqnkNhIPqDBR=!tzspImKtJj!$ z#nS1xpZ|2e?QD9|{DfJU?gKnqckAYD-JQnU(AUO(i0fNDvUw!c-0x#{K_3L;!OfE* ze^?58^e(&qP7+%FzFNInjW(PALE~EmH^F}#;In>Qz`J=9|A2T7tB>yN^PfN2{n3Dj ztaoaO*gj_xQ5l?9$&Q{^V`|}a$YU?uzdfP-W`|^Jf4#v(W{R! zJDGKn@)7b5wn1M4c!lae-u+tnIOtb!936WJ>Hc$ZD)tLU@G;uzp*LB(IQt6bdt0qW z+tF~H`8`}4xdM8NL2FBsG%79A9@YT8X}Rg0XmxuB^fq3wdNFeTHkSj3YN0ojUbP_( z{c|%460OUEKboGe-n|?BbF#==+?&wi0?(X;=H(D~}Fg!o`iD!Pt+4W_I@5 z()-C5zUPNvf8ts=T`q2i|7yWx34~g?Z*83x?kMV`g>V-^Zvv()kLQp4n9VyaBK7$l z+wzbf!Z;4&zgUa+Bfmt0@+ZiDRnAJo_~^=Y=L_b97!hyld9>b&qu6`<)dF1uF^gm4 zZJssCE7v;kevQKOL;pjiLDHLb1=oo?o*(S5FHTDzDR)$_qV~oW_;Z~xj)Z+a<%8m% z<9SCG30efmzry@x^Ld<8#m(YZ;9Jr8f%*RNW&6vb%P~644>leN>*gRbnoSJ$MaGje z%5WKhKX8|ghajGeV^$3OjW;2PCrz8G*9WBW!l+!-2Lb@5w|7ieUiwxicS%Nk9u+Dm z{;|;s`nCm5tzOqXuS4JL-jE=~Yck)wW$iuG%iSnMJ>%Nc$Np+wHN`Jze41?YE%rFS zzg3W2b}wW!iXp>ngk=nO#<&j|P80Q;|7tN7&qxB;oWBbry|h zcpiGFt$D)yadyVPzS7Cppw=GG-@k|4PVRDO$NRvu4T>#o)e`rp?))yqGrbe*`tewp zAHGuO_tEFU%8_=EzoXm6;on1Bsd_x{JiEu0XoB~UQCr!6?lAMNdkxhkTiPuYI&*7Q zlZdv)e#A?H)m(e(-w==WO`l?>OyU;k^~=h8-#1ZwLMS@~`O^+^KdJ}xR`4%M@U+qX z?Y>-l8-~DWbDo6|_~%;Z#=cgHH*owNi}SV2XWK^R3`YJAurqX{lN3*K{Rq!5x? z>vE!+C^FWGu|Dv)64x?R0AymN>!!jV;B$i)Un|pT$+n`z5tvV7xDuCw0^}dLgv7pE zsgoPoy6_XmG@`7gLu?WH7u|1BW0uB?AZyQdQbGs+z0qmY(79e@n`%bGui($Fn-{pi zQ7(Y}*>hwju4ggM;uG$tT;i_BGbVTidXa-`pEJX)S8n_obO~$vF(n41MWJ8_rmDBZM*TCn99s#`9vBmfiC)F19KJG+4 zM}7$3&Vg6S>)$9Cz2kLFodzEJN!DMZZCdZ7dZ1nj*TLk66hlArIc-0z1s-Xd zW~wx8`-Roh0Dd7tc{E;?-2>tVJq=ucYLZRTrcDfPwYm0=Ao#6g8s+$Y^|ArgMg2L{1Lfxbp(4D_!#3JhT^|`UKD0TIh9b zdBbu;yRN;e;ZDQW8sIl9p5apHRkXFqBaPx0R)b)#x7oJY!uuuh&!Z?mBkP=%Qk)76 z+7x%M6ughd91m8H|G(OL{ANM|d;aa~F4kWJU&1Q|{s3NA7B3*~t`y&pXSJm295s%p zCp_PrUT=z0|2`Y=5pPdV{q+tf*k{3CgT7_~yWR}o9S+_i90lI+_t<)`h@TH!U(dgo zJ6bG0SbLD-9W36`+E@PryIuf4q3aR!ARoZIsRQ4F#V6?g9q#bVf&DywFI#z^)w?I| zHdm;B6tgF07E0RjssGRNF;xyKSrhbCz;~eg(J~4jNxXav{ESJTe?En-H)eOKKSiVK zhI|42@AE}=Zz+Bym@v|w);lrwj4h&{r)`?gQhk5Gf70ixfFFhWBOj@FEIxw$I~4p5 zghym_|D^ZB@8KaKMA1Xa(LaoDO60CsmC&P$UZ1^xT%7)qa+@s5C)oPwmQNvvpb(57z&GqCKh!^; zfzOZU)of{0G&1m?sXxDL%+fI@Bqt<-aqhoSyknB(K>gR@=|0$R83|kaac~9*TtDE0z&G&wE)`A?9}tU4i5`C#r{<&DT7jBzOHHQuL}W83nG?pbC&l7? zS`X!uQ1^)M3co8P@hHrV@&4(8*HsTCQ6OI>gVvMHfIl4mIQ=nuJ?xJ&MWO@F@0{P^ zdPOuJCUO1!_4`qenC72ApFStiM=C^C@V2r}OOGW_JFJSG}fuj3wUT zEWW`Ewm=hRI*levGVtF@EO_jKC(rT%dL@rM(qiVC-B9Mn`Bc_ z4@=MYXhw0Kh&fG&hmBohaD;nAP4f~tg z+YYUwR{PdG%BPN^`c9#fk?=WqE%d9={vP%%%Lh4)_{>WMbmu<`+-D{}cJaTX<&HoHgd;OU`P+6s>L{_xza7pL7-Ex5+GJ)=qJXHVvx0pC+>A7GYh_MTWgT{#!|`+jw)4Yd`Tn~doaFKHCwbuFR&XS9V{ zrsF}q2II50?o9h7?OiPs{Gj!`7xx6`sqM z0kJap;|)V=7N#6mG#KTiaA1mUC%$Sz9Bc5P<8yb^TL+^Ze2iIfy7u=pfeafD;euF-x zWvQ@F*0;V7{n6)_v<4{@ixo407qR-H2Pz|embnGH!QW>2E5Q?I?VMFJdnf9vEQ`bb zaC}ej#^80qYk|j1*^T+jt?__Dmmf+0TY6iVzCh7BGFdsysf`S|aeszAs!3%3|?rmg(_4QVcR8>jt zeSGg@1E1uCI;DEU+6^9LKreO@nMZyK+yjge_lNi8*3F!w2aX&}G3aUZ{*tj^(HM)- zf_syeCY(n;S$mhBPY~=q;sWMFS_|bsE?FSx&aUJbu)R^4poCI2Ie59Oy<-0g=q@qL8zVkF6B@g3&fU2RSJgNN$-%0_#wUk#YSn$e$>YYwAHXcsb6EZNL zR?m#%Kf+-c?~k|4ijn5U)i5?)EIw4eCU;fPSQoAVAK`Ljb2?-lO7L~q`765?9&8-o z5I{m^CS1V&>Y=f_YjMD03v-@(p6U@x)Q&ZRT<|qE2bvAri}$^Yn`7)Z#F05*8NV+~ ztNVic758VOJ$&Y#%SuSm%g z0X!rBMoz&+svm{V1HaH&hxw;NQbkGIbpQ8W?g{k>_w0+Ati6o&aL7YEAB$$QJhMEK%xp*2<6ZbC z@69f8wn85u{Le~FHs+(RiQNR=zj@4OPZPG}XmuBMrd~Ux-K%Ai|C;bMTw&8dmn%D4 zPqdM3*%1xUBVLmqkl|Ufxt}QG+s}Rg{`Lc#mos|<`xviR4kq;Xs_kn6o7eR+X2Bt; zxSxQ`t#yfyb2ZF@^bpviI?Ecn8t2|(9Rc1$?YqN66IWI>R5j2x-G9Kxr}PTwZR+u$ z0AoK0$JSq*!nS^PHU5r(^o$s7{7-YFKcs&dBFy4BLUt`;|)~b zfpz!9Odl?SPs7gsgo#@<+snhnic&1eRO@o{*!V^-4oqi*@at znoh?0(nMM>$s{FG*$zDy@a4{3{}%jy`+&K(N8bMwdQ9~f_Tzr-_^EMf@KpoHPuX)C z`nhFwTFv#NgHXR?l;bqu6+AOX$8_jZOlJE31fN2XNUN{HPaWcWX~-AgQ?zJMt)ucQ zLVh|GF_*YA7iJmmQo7(py-Y9@yz`xPwb5J}3>q)k9vOd11GL5EsICf2Dcg*jYN5X%4{VD13#^w$d_wJ~fRf}Z-IWaZ7c@TY-Q-y)NEB8P#Aim2 z0^TI#nJ47z(vWh~=81^cTXC&8mItQ4BcqIK&C`+Z;YX^|I%?(2oy%2oUeJ2EJb$m^ zJT3XIrn|Bk>qT*iMoY){b;}1`Q(&(kKZ)mvc>8~z{rgz~)+4T2V0a7og{#kedFCd? z4}zr~9mvmUcN%r%HuPBR(#wEopuUUc2vIeDkE>GQdf?Za^W7gchyO;ruk)~S$Ksi0O!0Qtk1&5M;`|lYAhLQjyKsgn2k3t5QxRH67;`3;}D&11@$G$@+jR%!sAT1 zUyAqtfYDu1Yb@%^Bp=Mciy*p8TKzN!v}EuZEI`8N3$tu0}OrXQmEC_Fz=%_6k~{+&xa)q9Qa z_il0O^(dlv2F*X2@PeDjO++~a5PZR#gq35RXhmC)-zF~cQ66I&K;e9xwInWSZU@SpB6d#Ibm?GcJIEN!*hQvl) zY6iag&ghK{76<`eq5|Io`G)VM52Z@r2`k^VYvpUk1cMLVx*Xq+dPn&gueKD^iYF|d zf%ynMgUh@e9_lCP@r<1{v8V{SMML=(EB`Bh1oc_XqtTw$*VDt!f7E}ad=2Mqj@t_R z-}U479GI3-SqK%=#$cXoDJ1ZGNDA^#i0JmXyEA|^Q64T zs~cAfQWCu4;U5_4c`&GVO7}M!|7Z0j#=EoU-@bm$`o|Q{`0vjHe_-3*o`VLn{>5;c z6uO@*%jNsQW#`KG@qUP13?89&x1)(8B- zf$Mb|@RonBx0&6a4S0ymAv~W_DhT~P`kyv=ve4a1Y()n0Wo8D5L;=!(6kLzRD+U`4 zV)^a{{0606*#4l+o<}{`UUog)h5Lp7Y2atjcsIo>nmV4b2lh|O-@yK;|D*hSYJccI ze~aQD?D@YoJ>5hLk}?DQlB{`w^Gw7X)ECm@%d8%wY%rVeN&DZ~0lkR+qV2?I6oJ@Y|7As3kCdnm2_PNzf&Kt20w%DkNhrP6|3Kh zdae||@K$@aE>c5Jb+~jc%`XY4^wYi2fe(*-6D+H8i=7u+X?%f9?gHgRag!~S+J}*27#rzF#azsU;h*H>7EI(4F4%c~J_q<|w-a|Pi z91dJ^Lz|0S-@yRL3~jlLsyTuGGcZ4p54@Ixe=@Y?@a1W~iJ?vLHRNm1{128-bQ{y< zmdaB?@fMoja^~a!UWt4V+MaT?kM%#Wzq0j-{m!p-5Fv+4A*ThcmOj#GP_t}okn z#q4U>)wqj|uV8$f^PQ`m^ZEJUU)-bdk=E$wXmGk-$F}#K`OOfBA|GxL4#f#Yav}@2xif^PTGn6va+ylPCTX`Mp(Y-4J_7bj# z{+_5kvRpIn$~b!cbI5O*ux<1aY1hL`6*;3` zOO?yK=Qz)c86#Z3SbK~}{`&kD@>!zQc8O+QJPWe}O7*okdpDa50e{z%8^b9y>n0Os&N&{6d?#I1r}_!% z(JH;Jl{;a-PdS)%B>rYF^YQ`fA9It}X2sVapC*LOe~>S06}~WfIrJ$LY_7`1=Z~cv zN;%>xH(?O(O9I|eRDY{psoY~{;7@E=67|)grImx3Ccd73z~ebO{x$b6lBvI5=Hsx2 zuy)dJ;BWMFyXHn1UT!+DXyt|6cyV3&cvv5CrE#bo`i!g$N41W4Bv?QY37@Iw%O<;VD`{0!qk^UI`G*@M{n zunTqad69D@8)tN4JoWWYD4cNSo4$V=^g!-}{qaZ9B$dp-mzeEgEm@qaXaygJ#Y04a z;=rBao5q4agUA1nrq$iPXUbvsA0^u#-Nz5Dy2ZWg>PV_SKWB?}TW4muvdmD=MK|%~ z#6X@SpS;rJIctEGoXa>@YB(Qy^S2v0H*ennel?rkf8~k7WBZTqPce+IH&(>BnRYWV zpW1RUejAX%5Gj#Z8qNnO{C36B`jR30+4`%?BE_-Ot4(?g?WK~aB^$(hj0n{W#r5H@ zq$dRY%a#d&zUxBpPp&Mfp3!aEMJ9>*({O$3RsO3eADq^UJ%;(}g3Vtj6d%WYnn>qs z&h^~uxwGrW{=-*EGkaLv=Peu^_XvLKF#nX(m1l`@sn^fYh;iq0R{ zd-tNsVP8HtpQ&FTU$Xfxj;&`}(-oOBncZi4N(UjHdNiQTwnval?nd2dgg;QA3)9-R znB5_vz>CC1T8nanFsPjd|hR&Fo26P`t+P%GR=j?U&oJzp(t0)pswJB{sik z17DOKpWh1d3-WK|Ltj&`$Bp`_!lFskenK1L`K$jr|2za}DPNL~-;v(Ln=`8I9xw?_ zKF}}G*@Zi29#kix-dO4Q^Ehv8&vW)pTi3^U$Lx6XJI%Kc+FOK^9%i(!ve+K$ajJK1 zMhEy7%<$KSzK8Gg6SA`Gr<@P1}L& zl+Iyf^QwD+i?HADcme(`$Uorj6y^f2uuH#;H2qHC6=mboV4vh@GL_{%K1O7*&8m7l z4?!f<9opNqjE5_`{}XBE)h7+*M+8Sl+&_f<@=STzNp`-t5Ach&$x8a+hXY?=^|@kD zvy5Gz5Z{2kgm_072-UJS#22FI^Z9GjvrVlXt!(}+wTCCxfFFy4+RHRP^z$$4ei`-4 zs8Q5@q2JFkc|I>yd2*iM!%^l}U~hU4=zG!qp4wlVKL7XU6;riS34V{h5AvrRSUk`d zp!3I{{=U5k+Y;`4W- zzCnALF{SaOo}vJ7qtBusn}XP4ETj{u6avR z!{be4du`W>Ud*opj_7{@Vt24B=oO6fA6GtgdJu>YX{RPIQRE{ zjGoso*qe{ZcYJvXj#B{3DOdyMg% z%WrIGD2E=HV)Htq3gDxGojbMjq6RZ}n_Ql|;QEec2LhVAbfk3BlBr(M4=E~XXlU$c zWGd2%&tUy^6Ih^v@EHxM5Jw%c!FUFWpx2Vw&WsX&mSc|dMzY0tV>HZe=kZh@6!lZY z1qE6yLHq0=w4qN+`54S7|3jxS4|xIMeG1LtUkNAIdAkPX>CCu(qN2EdazD8y8}G?2 zZFOfyXXhUB1!qlPkyd_6yHAtaaHX8N<0@@i06lH!kyq=U=*Y;sQK|DVA6in8|Ma%_pi~56STgzB`blA&75#J&|xOeos(YJVx%m|mI$S=}aCJHXul?18S9kyPsRf$!JvR|hGzk%{MbfLX# zd-wL=27dY?stx|jq5_W>UWs0bWZrY1`oFYt&$Kf?KizS1hv2{tUKaQqbIMBe{R3a4 z9{7f{EL3(%7O_b%y7cwsXByqJEnrw;{ioOK$MsfNr$`E-8#f@|h2?7;t553ny-T)H zd|?Fon^L;D*{PWnQoLj8CwLx(`yw1e9Y<5VV=C@a5BtBAhl(Na57~OJC)#8wa}r0Vf?pCneH7N~X30@O z3THn9e#L+L&t#;O)$ja2JmY`xi~q$lChQEO_{Ldf>F@0QCb(QF#Cl+DBs4mWgW@B! zEd!sO9tOMw@le4e;nXmaU~`4~6BBtUAmG*}(l+HMAUYTW%6S4l&*pnv2X|7GV+%gG z4ckBJuQ##!6aT;b5nEZF;H`5WjD zpGWnqdiKzKnnUQn?p{_F`##QR?IHP@^L|QRDlZlJDLxbrahWchZj{Vv0vS8iN4w0e9IZj-ZWK{J=kGr9Z#ZO4a>-Dc@#&cHL89>5>GJ$lRNJ0JDCGsS@{e>Y3P!u_DS81sa_NIx?0!0QTL#5L zPVMlRk!JeBRIq<&c0RtZ?yaq5?;rJL>+pT#lXdZ{_*KZC`RqC3ZND!(7Mf;~~SwfM?|VFP=fc3@`|=-?IFn!_A3T z_N4$%NGZ3Y^*_#>G}7ZMz?W!zgUgvDjGol6(tt;NfVm+XylJoj4`c1u@vl*TSiD1MQB_5mAz zAntm61$sDf!Z_(&!{@hGiWHXiLUV@N3z!ckoS`0WvUb$N)5l{X#Tn}}S|VC-p5<5k zOZ2tvjoCN89catBJ2;O`@eHUv&f=?6Ra2X$%8b}Hu4iE+P+BRco~HIWJ-@g4{)-icGH|EEPz%POR zDE&Ub4h6r4>Z`JNhFpbW%CNC;e=HvI0I@zA-=z0P#wdGpo!5z0k?1x`) z)-NvGS$C6o$MydH1oO9B;EfWp9OSQ@3WUEik@K_B6Nk=a4ELnnTI9~0>v-RJtMOz7 z*)rDd6X;`D)OxmtX%O%G$^K~7x3F(}oYiMKp4~vb)hV0M-+j8UCy7Us^(XfyJwx~a z$ED|VKhydh7;oLD``ii}8gz{YzKIA}oG9i&4EP}5q+|Yn{>G}%%4v=TGw^wfzOeox zT@mz9^n8JTi#CcXa4@gDSUrs36YEwkku32r@J~)0J^I!0!BpQ<&$pP(o6Wn)(=9VR zPdU&5=ykV&k5iw9@xHfv^N$byRrN2!_*)aBK*aao8}e(G9&&8>%jXj$HbqzMK*P2MWgi97gZ20fSMeJ;J$)yBDa--fTl^E=db3i_ih&>wiW40^iq z9oYc|j?HF|n9qEVW+MM&o5rujw#Y1zkQg(glUlh)pKZQ*>{x&1_MGr{b9K5#?H%oD z?Pl-~iZiMI^o5bD(dyAR$AFIz#o9~7Tdr)mR#T4kM~`PTfRFT`VU_{UuolWD6}7ds z{a0JoQPELhXj?QvFSiN$;rKqq2l%1pr_E0bA2H=GLg@a`-f^i+yp7`le?R0J+Ro*U zg$c!#g;-DN@5?P)E!EDw$Zz}ZW#$8WtZ&_dH2X#NmQ3l-V@GZRzxvH|-(ZVqbLLGt zo6l|vebd$E@NaV3<(d=NzwEe<{P3tg@`dZ}+n-{;53)=5MhuyJWcvMsv9#V&{MECE zE8`iDm)j%IKhKPq(xm#!sF$ecAJ+A_@RrV)0RGAy+FxC;G4!a`r&b6K?Yu|#E6d3y zZ2d3bHF|y2j7edeWU4vL@Qh5=I>d`OP;kkRscHKf_V-Bwp?%7s&NebKtLGf9$BVJM zliv0U`64I3`fU~PC^NG#LGI>0!h0IE8TuB!wHfWLI&CE(T~8OVdP>l@*c#Z&#LWIf z{wKx*YQt9=+8dewyw&^*e2X1Tdl!(`Kh;;9l9!XCZ}?D{D|@LlX-8C zEV-s(Uc4_mz60X}y~{%_?UlqYYVvo-fuFZ2HL7!mhmhBf3*BbJKQ%K$g^pqknfml- zk2&y^@BlUggbdw$(98n(k>&~TipHM^8FnfV`qs4nPPLD;1X=%8H2*tX0?OA8fc9w&$n0X1~Gtp5hU2-5@3w@PC7%w^3&iu@V zqQ)}pZ_(7g`@nc*(211#^VmOGy)8GfN~|L8g{&SH>=$DbGcjv_4B$^is@phdJ~*By z?6(4mWDE`(zoYnqe1&AWSC0 zenIgV@WoqcfB&%;sC|Zn6B@t4elGV^cqlwnF~HAESDwT8E#SCvewzEsU9_XAf6Fb| zyY27Yg$oJV2fqgXtI6oiz>dklevS|VPm?<3J5`&%guU+e1L~F7<)vS3yV`aQc!$q) zbNE9CL|I{1l2MQM%n-|~@V~d3UE;pt^pV1)U2}R7zwqa!*}d{qGon|OZ=Y#(6U?}_ zoc(6q%(<8+J0OVZ_c&ME+KKnwG&4x70bjz2T)y0ne2ZZr+b<1;zua8b{-gtV+5XfN z=lhiJG2K!udDqE!o>}_SBjhtc;8PL=eF@JPw+*mIxB?5&_UO**R zIailzcI$RC-a*l~5pVxVvf1a4qi?ShkJwp9hT;A5_sU3WEzvS1Ve3A*kNhzNc+D1V z?q^)9)2N|w)Wv`^RKod-()59GvpRdzQRL!M_!QmFQTY^ zXn9+b3Yvqo9;*+{Hxc#n@;Lz6pif6c_3RBl+Ko0|W z#&h5qeitrY$T=Hub^zbdePLr`R3__iqkNAm(AO~LxJ&4K2cE&Uy*>2xGzjurR9#x# z`TDr4Cix}@Y5kMu;A{M#UYu`UZC^$43lrcOhk9&_y{_2iA|4$Nyg@#aGt>CE@zJ5k zUpZuj`whrbKwPr~=37vcOJp-?p# zjA-CBDO68JUKf}z&L#Ujfu2)z*U;lmr?*zVq{hh@NHa#6h+;JZ5 z3CJf@DDeCfTuW%%d9>4L#axwwnXf-jgI@(Rbvyr;zd^vyp!h*!Lv@2g%=Q=-&%pPs zPb(*1P)-&y^!IUooSk=<_ZaUgLwiYXW3FU|WDMe^Y`)8bE{z_)9l$#fe~5`eQPh8~ z$FfoXMm>iAH~wP4Ppsi^K;RyHgaNz;tpgFxwoHOcH0uu%TWecyTl_xSz*k*3Vk@!9 zlevNk33@!_@4q`KUSMcvYqj2b{J#c6S*hO6Gu5xDv_$84|VNH+}7XqJ2q4&3B zAAg_Z@!7`){9y@l%Gmkxp+T>N!>)yBTPQO275}7?AYrO$8ltax<(zv`JZY? zkGLnU&(I&^g!+DVJ^(MF_v5HM*@Eomd1S;(HeVs&kzd@{-3!%7sKXJ7Yhi=cBAlvKaW^Racoo~zSBO*n=$JSD$|=!u!VRf6DWa-$4($pVRSi zxJ_Tk7|PFJ@rJ=3agw_oDyo0M@-uewcg%`uvwMZlv-LkvpI*FEv1=!L9{maG@kfTR zG|!N~Vc-WD_!Yy48R_{%1Ng+5Q=B1mJ{zv*-0hOFQ*nJK8EK=}!`c+VnM3&=BVAej znC$w%^nd`4FO8p2e?Dti>b&&ybi99hyv6vWV7`7nHBmf7?yNYatZINB`3OC~Z-J3g z+Mv{x6ID9v|MO!NP_MgL2RuPR@rGslB)Le5x@^dA^$A)Ll)XwBWWY1Bl;`Mifu5)M z!~7JNl&Xe%$6!CLr26CEA$uhvgEUco2*vMKn95AgFRA>2EY!!3?2^M(DHY9~RG)+W zJuiumwZuyZdxu>QC|`~03H^g_KwVdX|Nh&au@ikGGT<8%VQ(#$0B<_1uQxmGa|;Xh z{=v_n>q$_HuPcF~1jSR}FUT#EEMzfLVvbRJ3+s>E!M7k}X940RsAoX;$Ii2-jh&pW zyb+(Rg$}FEf$Jh(oV2)yEFrbD{vPjuFfp(sLqnKzC;6z?I?imgr_pKTmoAJn(Lzt{ zH{C;BFXbaQo2$y_0iWyG+M24)Zz14YoOip4O*4 zkKcD(;HNP1tyr^pN8MF=n&*{5H5zl$>IqmJN$Rpg>Y?AZ=#L%*QL#=BqBLNhW@biPh!;2 zW2E{VuS8QXVElEe?n;?VxB>VJ8?WDUE-S9mIa|Qk=;P-T@5st7->f+{z$ekU$kxjq zuWw(^@=efR`u_IndXZlNdTlYY$U8Jr0xoQ_qFNF=5xk0X!*G z?%BxG*c~(Y?_2s#mcPkXlp5-VcC?y+7|9;S?DtOFd2o^frwB>~cL{#i*I) z-&ws;xjLdXRJHaj^aPhB!N2vpc4=peyLP+*Pk1)_o%_1^(BlZw;|(7Re7u!AN-BsH z=D%3XBqG*N3CCbx;C>D{bjE|+}CvL;zUJ_f$tODaiB9m7y5)5sIQyVarkW9XTgIE zdMZDeZ5Lmdk!^0MXVP>cQYP|_w8#6w;yEQ#3#S$?Y}#ZPzw?|OMtef~c92#2dN;#+ zmtH-qECc@bkj1Cw*sLDZFh%zT?GMEV&HK#yP|@@yv#NCC?F;Z1-t#VT!?>P=8DU|C z_j$Nrg4s8mH5}Aevikx0I`NvYR?ixePrTjXw`ueXExME((4;3j4+7v&&(qY?b%o%J<^X;hp;s2nzL9{mGaq+g=p0iQ)+)cAK(9OA@yCT#G|~r8k$j+^y3P)eyIaB&sKA&sQkw zv}As>Px)c$zepr0DTp7JmiS!X0sFu#$VI6{{`}6Ckg84aw?q+#QcCMJ%*grCFX;8X z;jb%EubZE_%F02f`wCjiBIh~{Gv=?W+;BV}3$t*?%gDzVadP{3tiNj?C)SsC^g}P= z-R9*!$hS}RdK{+qD`Wne9X+Q)C%0|R&}L~ogPE^7SE!&bXyI(J$Y~wwd)j^Xix}-$ zmZP~MVP^vg3)L>d{e#TN5t?^CVRGJl`zwAwYPvnDh2P8~_QBtJ$*{gyn0YxSC90Xv zeG~o!A5Rb)P+NkG6*A)KHo-`(?s6O0{t4NG2&bJh1Nxd=R69LbSED7I^P#&?kJTbJ zsjL-#Cu8<=@#^1!2T3z_v|rGjXZD$X-H-LmuJ~a8qU~npWXIfB2QeO|JdT+{20jMb zsat_Z5i>{GV&G4sTvI8yIxbi=YzNUd=u=~(G*XV zBYW5ZE(P$25V~JmC9JWH>6ylfL@ zuEh0IE#_CRQ?2(Qv52&pu3_^_covdGRjZCnDY~E*;rhP9^!R${(cX^@IbyEUy*_`d z!0DyQI}$(EmFjPfwlMeO<)XgPI9YTxuD4GEJzkx*k;&fPsYbpG7xh{N5f711>w1&s zvlw&i%@x7GC)Q;Co9YqM+mT}3Bdc8-+0UcCj!Rqv^k$sDQ|n+)3GLbZ79#a;-wHg) zvG$6lzMMfs^eD~*L4+wzlTp3q-&(J=7pUts)IL9l_Uf0?9ox6fC(O=t z#X&s(&xPxS%IW<($cQ^WN56%ClfSOoqt_#c3^!d$@r<*|qv=1MT<%Ls?;QFW^JDxR z#|ZO>ks7A-#i1X-cNxQruilmofx-)q||xD9>KkZ(re{mq|Vy{&qB zqF_wv>$#|3S6Nn8Licy7?>YXRMpxp!kRuZH3ol&@jz+NELbSLkO@ebJQBDH9spj=9nA*TX;RT!{Js z#ts~cXV7{pK|O)RzQw+Alz;JVB>23&0VM(W7kYj)*7L*N5#3?c5%~gsndj0))W3V+ z#$LZv9K8tl*Yx$XuTNr4p!|zKA?(W?%a>#aFBy#Zc6^|XPF~xfcyaQ$fWQcfL{RofVK_sY{p%Bh3-!qQT^g&$4lfJ#%0m{ z(?OOG>$??vEPVbB#lQ7>ILruX7P~)I44yN1uxu1baLr=l2cpp?DZ_>Poe##pJ(@Dur+2qnDv0gE3Q-fF)B*$f9d%h%dmSz z*L_9xyxIFPRzA|_vkc%h<9M?~|C)t*r?_95zfy4JtM%;nfp1W~;+xv!)_^!)DFJ^Y z75x+C%Su$LHt@%6SUkskj?0`bT`%}!z{aGT>*Iz*Y?4z-M zFOgJTVy~~#-*0W{!_qUQ;79Fp)z_z`{E|&;2a^S8V?1eo>NDs~3jPnzVEMs@HuxcI z{+{6QF0U*+pKN8HmR_G(;L67Dc3Y##Ee!+>Wv#`!Cx zSD_b$^&Q`bK2iAK0*BV&d+&-@>g$s(wEg_~^i|ZKr~AwIJmr||dD-)5J__B>pk1=v zHU|6~if^C|{f1WCCR^wyxeTG7_j~1^?o{Yh$hhh2p}6sWIeruU-L60JeXVCi* z_1NL?>|u7s`q1YangMh)W9_;B51s+N26{dcv46;`BL8jx&%nEV`&3*@h zIy;}-_5S$H_uzJdM{4 z#?-yzo2po&AR`B-(Ejx5E`foPD`R%M()=bl zH%XWzjR!uxOW&Wr6ektWcl^Br_43&K#_wNy;(*@E06!yi(purk^<=%F9SQN~O&x8| z4S2?Z6vqZ+#J@v-S-!*;)pnJlm_y@-EM6gsvx~EPWEW>>|BDx5w>lt1O7Q!LH|l08 zMar)qiyn|&di@M)U&>^IoBla({I&7b&jw6`T|~gXEG~)zgFd{ z)7fX(UUlvZYGKk2vgc=uodQUyFX}ZMoI>?BSI>}I{Y2LIQGX2eP2{2Kt;b*P>5&`w z7ap|_QkoOn6PW>i|FSykI$?qNWkY;_nsDQ!qNx>A4Sb80$&0Q=bcS}40sq?ALljxn zSOxxp9_@XTcZ`U;7 z_gQ{Nen(zMUO^o4Tf+M>p1R+TUA%r#lUPgn8MKY@?H$}b`2XSU&EuN5`u5=oi;7E| z5Kvp&`%c25p0s*vDWDB?jMKFjj+4xsnK^Uje6R0yUEdnS=Zlbk*EOB~ zYwtEQBZ>*jTtxgK6$z_$(5-H$7vs-<|8-GJ(*FAWeaP3d`j9UNWe>$S;9oGRcL#xGf%uE$OGoj5*}k^GQw|Oo z`jbCguv$I7VT{4g^}z8@Yx?hzHzRLE8u$*n!*aRAlP?q8ZlCgDKIY>OY(FCXr=RNmOP6=M z*3lVU;2Wd$dA&nF&i|xn-7CIJKzzlek;Yg2mzAa)m$x0&RU59apO$->6VHih_r1|S~W52TWMZDZ* zxPLF5e{dGq2;di^$J3?_Nz0{Yd0PqJh{f9;i>?Xc+$1c%f!_;XT8DX?dzsT~?)KE< z`TOv3ROk`@abtQWeS|UBDsr^jdP2HPW%<0&m1E7MNdH{Njx}-uFD8d!EI7mPp<&)p!|Pnx~p)m_IpJsc1or z2zuHA)*oZOc(trT4nF^A+eIvs!4E_Oyn@t+(wT>Z@Z{3tx%A>23kW{!Vl0;*zHoS$ zer=3*Gw?!FS+UK?=ejCpVj=6t#OF9j!emc%%&r|b$@_rsAPFt%yrrXkyn`;J;eBHa zgW#KmL%>G}}n@{S@UCrbc~J=8^q!@D+HDf!UYg=U^@&3?JZLOQ%7?I zydd!5WMeMxY-z^&kn*xO+N4#K42j&)1uk>ogw!6tH=)$cIvxB2_>6Qq+QDfc=j(7i z$Dar&#P6q4XzH;3okR!zjJAuBu9e-+KOv>@{V`N!34X7m(VmO8FUz(-UTQ0~O+XFn zN;Yk7Vb{mB@&}{yTAkmZ{SB@^{1)H(c|{@4XB_2hRZ@)edz0BYbr$MZP!cEb7j*R0 zU=TZWIi$HthUzGGnU&o7@foQ<)L1M75ojPPd}dZQmb&0@OV}n z#T1yt){#5Z|7Yn}m3g)sIN2 zWg!KZpMu|M%eEbm%Omjz!9y^<6`bT`s^hhe*I0an%(r9ZF73xu_&$D*_F}H5Yv~k? z7xEFT-lS~krV|561ybyg!0DR*~5aDM8JW3f{^~moLGofGs;nVx|1op@~ z_IJ~Jej7LID(+{$`A?38j%kcCiQpN!6rJygeHZw(F+ZQ~1fEgTx3y9b&J{79bDt2u zPo7X5cZ;l;A+pP$G7ej-~T#!$>V*D-0ynf>j_UC9U{Fv8Z z%hX$)TKE*tXGr#=+L3JdNg5}N|5d9yFt*ODZRVplm<16RnjDaS>i4)Pby{Z3mif?Fj*@x9f zs=be!(8@IDw=lm>qNeaRM6}g2JMza^FC=&e@QeuXGsfgkwqAnyhAR@vcHnxXkP+8;L+G;BN~)7r`g^yaRKF)VcPiSd!vy1HK5w;Twd8aJP1;yL9`5vS6g6_65PXC1H9pqt z@AiEn>V%)D@*eOERa5woOL-Z!UfX`v=hH`AzG|WP@Ti_RB72vTY`xxqv=<$wN zztQ!_t;foHe`$5AP+dH1ICKPhlcXN_cccz~Gkk71Wk_(q?2qZ-Pb@9TVB>k>CrawK zR1Iw(3dsrSC-q&4-XvBYq7tecbb`q{%`1R+EZwpul*Kz1+7yLhds2Hs7aY@3AK8QW zhbr#0e$@)LN-oYXSAyrIwkJ>JR3|x4FP0I#iQ+Y)wwG(RyuvpI#_IhjM)?y9fafoe z^e?3i{06qV2K*RyA>Nl^{sCV?oHAF>??9W4r=h7}@rwVUP4EYTFTfv^_0wT+JT_hc zd_nvw|I-$;6-dec2%hry{r_)m@;=q~Pn^Q`2fy!ot^GBU!XW2Q;_oLKQvCt%8z1On z)*_tQV6#V}68T#=> z_D|+-!iOQ}$Ebn7;P@%ZJIb$9zn&wQwwv{1?d$IDX7MeeZ^7?T@0X32koAA0 z+fkpE=xJ7tj$iV=Ap3(q1NqSOZc~=e7da62LXyS{6HG=u6tX{8kLB!mR6k+;x8CMW z=9&A!58men(eEn0oOSWN7x>VqheG&*`QX=_EIz4X7UfSRc!_-i{K@Vcy#PMfPxL0H zt31OJvJ)N&vdn%sh5av@ahH9cGv3!~;18-esX5V^f9T^bf=96Yif4MgBb^RE4D|Qw zTPJSk-O9U#`pMrCeuZvmMDGusevREOe6a0dT1VP_Zfbc%FWg&;NBv%*H`z_ z@Co=$`?1$IXBS&<^u3akR{HA&e@=G%`NK^yRZ8YZa{p)4z)VpS2mcrFAMm^w8;#bF z!~6I=?)Segxm*Hd)lc{l1P@$#C*V_df6zCv&(no~3jtC-_?x!rgipayipN3E^%23h z&ZGbTjEy>Yb2#lL1N@6TFY^NC1eD20{W;u!^tZw9QNm$RC{KUKg|r1{k9g0l#DY8(epwD*yBa1vB=iKXwOWei+#Y z8*u2$qs%Kwd=!#XkUOXu>7#AGtIJvl{+5xA(LB*+YvNBq^bB>w`OT?2Q>U`|YJ7k5 zU{R8GtZpm=f5|;KKfi%x11lfyz6d@BTQB45>JwKE91fQm{3fQHGp`kO`wtuP)54vC z)xkS|-)qo=j6Y?X6u`YL0^b7G}` z#@8_U`g$rGBG(s153X+k|6&&5U!2w_W~&!Uxm^+6MJd@OztXs&`xOeXMh1da7_gbjJraH@ak-8uTB3e*S0m z#g)6K8v5s=5)Y+Re_uW7PoZ$SF8<3g+dkWXFA%-xx#4|U;6rRYUM>Gq9xGoT`^s+> z^~Y=rWEuni}n@{^fp3X%ju_kGZ@*sDE9WGvB}m;XDysU!Hwr1@JMp zzRb#SsZ-&Yk@pStUr4Ne)Iv8I_z3HdN#ae4rWnKZ^pgi{ia%0w+;D%Ud{6W<@CzE% zC*gUJZ>s508}JoH52@y6XGie0G+eJYLQU*fhu&VzjPgBff)~hg>O!^HKYRVbhZp~1dA)ONr`gMiFNvRRKE@;IAB`Hl7{4r^;B9MdqFk0n#+! zv$v+_Cm=t|6$-`iby`Nfb8h|?oz5tfn^{z+ZKE^251F{@6!RR7xFW}_5$1s8)~|@a z5Fc|L0 z79Xj}zAA%P1Vzb!7UBF%`tN*%?R<_rLeq-xZ-04~_#=_gLcY(WWbb#d2nV7`+Y0(Ly^EIn9ScziJk=c=w(vyKd60_sRh{|hwI@4y$GZJ zd77H|X&`%O-glH{3h0@UT7?yvDq4Oz0G+W zmf`q6U7h*nVYCq&c=D^G82=fohaI6GaOVomDd_PhPVjEoM(~gbsrv8`@UN}~z(;_G zIGJy-!S;;yaz=Je?8Zhqc7{trOKVzd+yzyb#@gvN{8$rYma!pTICtYJ-0KUe!w-BF3 z4F!e?{kVRN>F$KhQmohh@(l6hdh!^DrwzZg;r{WaQnRVO6l332-Hd`Hki%0{XbAi^ zpB`@l!GXi!p}r0D6Te^kR}%yl9HDz!MGwY%r?GYe@InqR8-OCldx6!+!fLEPQh{&a zj|mM`&qP~cQh%rqhzGMSb?Hz$!QVchj$5~VOt0luj~qt){el7jxy+ntXuLl~OX`^% z@$AJDOZ!~D&;WeGm@D~ zwz;dVZBO4M`b+wwA94JB+H-vm+8S@uH##mn{*v$|AGdY3G^=U&f0B66FFW^WOB?#T z1o=XYmo+kLBgwK1_-WXzAo#0y7>5(Krh-!Fk+YR|!qoXW74GCfX1^v0@fw zO|9hb0MB`9pfXmVZF}%k-L)cF9^QnppI5MJ#f0qz%PT~ z8NvYp-VW4V_+yk}|r0=rf4^ zBuleDcmGlUMgbpujbYSdtt(;kWsKS5$j6f1s54JBwy=?i|md*4c zn_R-rXs|kJchu|Xa(aSII>9q`eDUv6IQZ27@A#t}^ZTMdH*RL*CyVjsNx(l&jrUo` zwnzC4C8PDV1#jx{g#cfDy%RRx$M_)iKcRqzKHT%~`V{g17VneoWIPc*BkHAY`tRTW z?|24_ryw3Pl8ggq%Og-=i9h=)db}aQ#?3W7dor4*K{N*ZXh#gC9A|=TL0i$kxX& z;2Eb&hGww+9pz{AZE4>^`~l$K!TOgPu0I>k0?z>6p|7{;gZL8hj-kJTT*Rjs?+*g_ zX8QS`#oHCG%Yq}n>4AS9{4_{D-$CpowzK!KC-XOXf4mnXN5*!O9kWQ!*RbTxf!@QcjV2DXy7xCNeTdne^>! zyMYwL9lObh_-7D2qy1Nnp3n1N@r)sXMcsRaz*h`@x%5O9&rrKY&~3q|10nvRzG5Q!|Fzg`sT2KPZ98ge*Fu+1B(v?$o!?}THudF_!1wZzmK=y zR4Qo`#K(o_aX-9VB@$)OND{r+bj3ByuULOc&a2w{(2gQ{BX@~(c?H%R^e)pRGXHY0 zzKI=MHkMY~5dEjlLsF~`lTj3taicsB_h+Tlfu{=69i@Gq=8*Mrgp7v>@bm`^_@d31|y*RNcD5B4(2J8`m)& z>?oC;rV8(|NuB+rxPHbQsc7T!zMX<24GvLwpN%z|=*;$aH~cuTKZi_upIfH+W1_bq ze6BfJ_LqE{e4Chh8x}wLm;DCQ=CM~?=*9Z}_~rW+XE$Ek0z4}HJo@{m?ito(JRVtZ zk@sauq5pdJd7U^my%POj^)%$7bAj_g=Jxcc^B>@T9Hi6mc4}vMKhI7281I{huATma z+lFcS^{q}O$cOqGZRLC~e8DXH$u=zteg>_NTL)W5T4|fu?%jBwx;v~tn4|hj$K)Lt zLR&{C#LJ5gXNss7vq$< z<=qck4Dl#uKwNtS9BV_p2@cIU5W4KSH}d~%yy+p*z4P)dw|7SK{ffyPG3PK}I~n|j z#82>kc+bh1_1l6zX5zQFKF-F*?qadMm|p#3>bDXzG9HDd$)1jfgD)zv=el{E&xQ1GYys-^J90KcOO z&!6d2NpV-Hb|F(>@d>Gin^C&0*r?ICANUBXk67F}{r;@|vxA8rC#la7-ICXOs;p?U z0bgj@egDh*Q=6tT)AfFvp>j`oZc=rwfqxLvo>@>4H@Muuudq94d{A~X@}YshP(6}0 z6y4~XO}C>y2=2d&*kK+Y2FV6|fq#=NNC>}I{rs5u6HM8?4!sY-Ii#NanF z;ji)MR_0yFW^D9$0OzUEnHgseHyZGdjqUy~r7xvVXxj^G_TYK4iWOwKHUbYDt+z6T zw}7*UQ*CU(Q&vi+`-?=VPe006`O-ta%8YhV^QP;Cm{Q3S{!)S8iDgz2lHWzGJ9UDAT=n)4f6P z!T)kNCk(OjW&SCM`kezjS(m4c8TRd>lZyn__Bus8>bu(C6co_6JI7VdL_UsMz*%Xo zFlQ#Uv-L?PP&NX&n??nER!P=BJ*tZu|Ly?jQ`-y4eC~PHHPhj18 z&QZ2?GD~_E97S8;U>+bZ$NF`JP1E=W9!y(MMeao-bh1D7wt&R@T%mh>-3UXwM2~?V5Qi&rJ6Hrh!1lS%-u(*kx-cLC zd(_f(<$oOf3fmnJjo<+E!3xWzM{#`vFE@kV(MSKfywi3M;^DZKmcABEJu`i7&qcJ? z=M3v|E<3w1zu)`v9}#%pSyLh>8IJe+pR@n59M^;6D3KvYq#V&DOqvsL8#d`c=oTf@BfV?Db+DliajEp7h?+vam5R>kS~{_o~m8!vLb z%z1L?L+CSq^pdvFTxgyUp=+hjinVi~ZH~(3aBVoKpS6DdM;_qgH;nKcD4tZp9K2-v z`98eQjq58hT|vL{()cv+7CTPKA*A=Tbjtf7@0H?xOGR1NAJPIZkP zn%0$!^o?l2kBOK%S*!TWxTUlY_m7!MZ-8H^ZU*PD7v9f(%;Xa@pZQ}varwN%p5Xu7 zwSM#Nebi$Rb45;~)3)@k@n#n=e@>xfl9F5;-^a|XY6E+Jgt^OfmGs1pj%#@TQ(SBF zAnS&WWW5ExB&)Z|O>cmoxZZzEC=yAfjk&q3eiqLQ2e}4~N~0oevi`6SwZCXz9@utz-OK~(exbtwu z(ZfvLlSty9;Wyyh=sO$@eN(t7+bo=ySLk$MBW^NxzQmXg zrOMts0Dnkmk6@5d&zKZ=eE1jm zwnamaoqlka5aY?cP_5Op!hhmsf!cx8JFT6oEo*LJZWh?8-@x|Y=J1j{sy8rR7o6LG ze3Xs|3phd^MZafLJ;a9|jIyA1+31ciXZPqvPLcb=gF+hj`@grJWvm;?AloUPI1uxT zed=kp9?CX{i*enzbWG}v@Mft_G2x{314)lkCwObuvq-$pPcG2wBiQ^E?jIH4A}=}C zMCv!O`J}PkF0qY-kB)eRtcR0YqAwX=qEeXg1vy9Xee+ny5%&@3Jy2hStdG}kpo^(8 zx(t37ku2YWB!>Z53nr@_ys>^eb?eq@_Wq`)mG8oMS_{LpW%tMR)84Ye?HCV7>k5m@ z=2V-|z&D5<3B@u48pJvmf>#i}PJLxw)i-8^`IG!9&A@~zfpZo*;Yhzl^w4P}r_=aRMwih4l+28ZkWuo`6 zKzkjp%z0!g@*ieTa-PHAb&Fk_3ckEwCogzLVe=gpc8hbkK%F$Tx$p zLF$`i^na(?rrI_{@DZ~8aF#Szs@~Q^j&~37-iN+2|KhYQ-R$=(y)WSF~@H=t|-cuu0 zq*iZJ#Uj3D^(0R}`0XR|G4KrtenIjLH1hp~f3dO!!HMPDQZ~NE{j(9xEY{%j>ig{d zMtuU{4S$b!**3<@wJ)xIag}Iz2%iAsZwQzi=^u^wpTslzdSEFmzvJ(C1=&A&ACLA2 z{CNHMUH%la9~yWE*=}=N#D2)}{{H*_FYW(}zk%~L#OrMT|A#ig69}FGzo5~2(|WvT zN6TGQrxvHc|AWN`PS)z{&0v3Qy^`1AMIe`7+DI>kpT}zGE8v|_PW&*)_O)z%4P%r@ zp|G9hYy2J0`7hU3?ZL*kc>b-a6NrCC+cwlHBaI38b^qamz}@4v4{86MzXAM$^*bGF zWWn;0|1Uh_zu_DBJ&R|&-VXW+J}h4Y*T=VuBA+ZWUyyh^vNtTv&00j!(36qtyKOfr z7L*K~Mm*2@J6@v1V^w1>K_BxZ=rMl3zAL(GLsxGx^e3#JhHD4iL-!>25WNYx9)3Rs zKcVl^_kbs|dJ^$(4(vx@KE99CH>sZao&Ng64};Vvajle8N+KnZ@YC2!{5;2w(fdW9 z{wrJWRgP>t{lNVxP3pbI=F2`YmRHXAsfHyx(Tg?1T@4^KAy-WUnR}c*bww7d&C>li7%@MR8sa zFyBItfbr`}DJ9Bjra{c%cyuSmwpdXz+;{x8#mRtdM zPD0%XJ#j|V^*tmW=ebD>iiem*<14Ngpv?`-sTfiBGV0Yu*N!H5V);F0+W>NXr-`7Tug$hW@)q1ok$f(^x;W-z0d#rk!)F_?)%~X0a`cU#w3$kfgaS$$~$*{|d|( zmx>ENVBg>M;Dh+~Yzdy@ zB<6`w4>hBxqZIdJQf7oCJyN@pzU>ip56AbbkYCCg=`JDljYaRe^}pC5Prtn zJoB%&m2TAmpYo5w{9tTS%HnNw{Zp3j@lVW`Z>^v5l35J?%rYI+INOT0b^6vax9uuU z;(f&3CO9ehP4Fl4dh&AnnOa3~-TLnR!_ccS&wpPGK896|eW&jb{ARmjnp>72KQj>B zUC{e)4HJH#I}81LscRT!^C<-`mlwXz`c<^NEpz6DhNdB2)zg)HC04e_2f zyfkcsFx>F_Q0EZ-e4aC(mfd6H_2r#nnJ7SDPZvV3f&P1R#o>ySp&qB6PjF60W<#Y? z(4eo+(Kn>M!ruQ#eZF6@P(EJ1<oSc&uJG{NL8E*@OxnWK_aN{m;E`PnUDCH z<(rtsNu_BE+dnY)QyM$W30x@omy-eim?4Z4#aY)ZHSj|wI9P`#IQPwjK83{}7A?!( zkbmri!f-xQlxeDmRZWq|zX$mMzdN}oKur24@NJ*^MLzJ7d)m+0_Z#Yk61+tCUCeiC z6z~DRg!LQY$U-9zMjbo`y#ibRlha`z?klD_z$aKe%5S&xR!4!+Y~UL_v!<;@*3?3J zl;1MxzVxO4V3wN6*XtinHH&ZXwsL+j@JBcY-P3MH^{hZV&t9KNdA7xLLvRB#TCXJk z(WA27*}Yrnndeyli|RwyO7EQh=ClFtP{hln@f*LYrcsZz0Q1vEzm3}!4>r5dQTpo< zs=L_spn60Fe1+w|1XTNF_>u7+$>IfyYP$;S-PTb8++P-tnf+AuR94W1dcb;pjcbns z98LKlOy{|Yw{d+!dlGcldQ{q1`VMG2a#tLc8qVMBxpkgrm~toK52azg2pM**5hZwp z)2qL$tp5n_kC7O)JV&0xjE=9AxtUYT%{r$V#_QI@!Igq;LAL=fv0CZBQk9|FjW)|) zneq|}Q!rQzIfCkUQhaSa8bIy5Aet*$ z#QEHa-ksi`hxdi0FK=7=edJqj&v^ej=37%@v0#JdPb+yV=4X_;$t@7V6b`^Pb^ut@{F!Ec3idk*kn z_wqVzpH{;hx%Bd4I_A@Cu-`QVZ&)$$(jna6+RG#Ia-Ki)hkxsQ#OJ^}gkcFUkx%CB zdHX%=Pv{U9UW@t#YxjL=YKM558!l@GVnO%q+YP)x!Q+M}Xo$X}$6 z!~JzJ4>wVHX*V&y#SDG95c> z8$8ZxkG4vhp7hJ2$G}Ihez2g9Thh$q-xoG(6&nXdfq+aX+A=x!4ER0csS+=|&vkT` zU_8;!@F{EFPEW+o0kZMNzahWu$l-VzwXL9i#?QFE0r8)C)dF2v6V@lSQ!m8e`g1LK ztNGQ5z%L?6yz6Q$cR7+9JB0OGB#CdgKHaX4_@ww-Q);}RB zDtktwSvKmsd$9P0%@Nxh)D02q56bd4++Dm};K@wzle`b$H>S;#?>N%Gh0J7YSd+ePgR_|3#0)b~cPjFM5o(7ObY zcrl_m;HCHm4Sp!_joVs<*MKftR)`E=TE;h?2Y;$oCs;jWjsIEWeLyWKVc_y=4_NS9HMXi zVz(0gHKY18Il0iojQ`bT<#=+xb-LnWcL~~Fp`;B=Q&r+Fp(my+D0xk%+nd|4q10}< z5tE)K55w~mGE&~6>TS{B{8_wWakFQ$Cp`HD*%Qo3KFaEq9|8Cjcz*vSo+tiD{8237 z(~$Mnm))|9n5bm*1pRu9Ut=j>H|tB_W8hQZ`6=p^cWtm%88HiQ6z1W0e7M;hnlU_{ z2L6$U-?z49AI;A7%VyLPZ}2a4y73inBrQ*q(e+{8*E~u8VwwXl%X69ZR92s2HJI@7 z@-66JM)3^Si*6T17X{CmI+GOy&k&xAyL7Wrdxa+a474}*Y*cTI+d|Ph;irM|;hw%d z{bu^`Zh|L3Z=t)}`a^HDCOVhk1s_hXDo>ag%s4H}ev&0l(Nwt@GTwpkV=Bdo7XhFMiT}GqS3G zRX_RtJ;YCbM}2ciMHL!+j!MK^J33O>5Ba^iQ>)wUnh~@nNY%u)2hbjt+~i%KdYL{%u;~2l^Jq^T+u&_orty3={pz3e~=fj*{9j{_e9_im@l8qY=8I2jO-Z( zzQpO7`g$CsP5d;*&eZd-Xal|he3|uM_+RuUsL$$8_!0&^3Bfax&^F}%4fw?WpLhm~ zUm$ozNrSn-4_JQv-}NZq6Z{uGiJ^@JH_I++fhxWI<}IUsjlT*~{)<`2;y&_}TKxcd6~ zSbYo8N8zCK7Jyr zpQ6oD+ncbxXYJFq-@rpnuwP&A^}ShTA~yaQ^N^dRP8j;s+^o5=8i} zy|;v3RM=6u0rwmJUaM|y>!K%iEx3LVZLVAVrDpKob}#h)X+Q2~Xn4+T75J6>?Oo%+ z53~^pjT{2-KFK<9nX{M8XK|gv!2jVVFC18n`~?KVX%)z)@RG-KR-!EoIM@W7oOz9^ zII)myFDhpFyRRoJlRrY6SA3c9UFnHTL=e`m_JNnd2E_Nr2xJ|zwK``b70?Ndh91wz zDCA4b3BMFSV7OGe65n57q&^IML`PfFmwy0WV9ts1Y$beHOXgNT_HRTvSydhaUSRq2 z$DB}dd~=Ss6a296ecv^{4(neL0643*Qs!>K;LtztJcLt1Bd)@O-Zj%3cn9j2eXP$i(%<`a`Jl9A3=qJCRQK*I1AH@hUt_GkVzjAtGtb|{2j6tn(}@fo6zHsUTf$NJ_P^Oczrc=VuK8rPlT($tzW z65s{5M*^ucrErVP-a!kCbPyM7k!L-GW?E7|lm;QMGoyfFog%$ z_ZZaX-bV( z?P&iLuD^!m$-*MTXqz~;zRMq)pL!cxAGKotK8V*9$Ct#-a03UE8I4EGI&8}mv&*xY zQ+mD26rKZbK0e6rv-x;&Zfxb_b=N+`{#pIZx=ycdUbp=KGkX2<)z>z?^cj59uw5Zf zinwjjz%$?>yQ}7AOiptSG4MU6i7m5C|1y1PI3Axjm$!yr#e0S4^bM(4JZDtDQM0GS3(biZ$RqbC`^2*Ou99&dK?^sk~a4|f1BVezkqhWOjD4Zb}F{)eJRIxOmR88EbG zy|n3+*XG`)3-o>)ymHs3?V5ucgZ{;pN|q$=V)o#Evh{tIXZu#zH~J1i|HR^VWgn)j zwvV*82fo7kvAV#1Tzpr2mpP@!%UoW@j(pt~Qg6UBgxz6Hjji3ShUX{ZmblPZX{6wdy|# zFn_)fJ{6r8#n8!}XBHmO>ZZ|?1yi{H(=gb(4Eh8K#K@yY)FHsVoXY7SbM|80T>KiiLZPYHL5zLqk^CTA#Z z58{uZ!^MY!5=@wN&o&eM0r7r#V=wS;%@1E%BHrbN?x=vGp`MOBv#AQ}SF>2f!?Mfr z9n9mtHCZC$C&N!yCMMdLBc5OM*=J<_=emWTsu-a|=Nw)egZ&BJ;&(i{JWPkhmn2|5 zHsvOSx2XDh>F}(QEioj2EMKlxWBv#JwFT=3j%Zmp@PjJG=KM79rxe1%Je8`hx=!%J zbk>h%Lgx9K?EUBfzJ>Ki%FW6gUG8xyJtJ_K%&)JDDy2QrZWY=SuV6mK`Isz_?77Ca zv7LkR;@L^<8qy|wD)2W}$yR;)je$?*ZJ#SY(x|C0j8B{R?AlwWc^k+9lk@!+OKf^p&vy4U)jI?=D*cyH64cY z#rkS+5&%egR*k91IDj^VjA(p3vtQMOaq` z!5?&%&-~}DsORd&cbn^W+=E#qo**Om2eorSeJT8#Mfx`IC2npy^o+kaPLpB2wQ=Kc za?{~Y5Nwh0*;?R3!@TVt{Pa0=@%onDk8uB}h~?iN(v;G(zw0#xK4pV=v$C>xgkJky zujL}bpYRMkR0RG<-~L{krO0)r+Hgu;+IBMbomGyfwL1BrAdJToahT+}zkHNQ@St?d z-cqbD7^i18zT|pSRMZ?@70q-d&pMCwk%$5xrFt?m=0sTZ+gjZgV-3_V7_a;jxhI^p zig!7sUVT7V7{1_xM!et6c^2F#>%P_Wq>{P2F`nk~l9qK={Q$p-Thp^J-fTE?L>bQL z&xH2EOk8g-iCFBxt7iQ@i9dpy#d43*#D-jYqHPk%$A>?(?KqMPJ_GbHM@ai(Sn0!C#LqxsoNlvMQnr9? zb94&xtp)ds2a5+uzHu1wrrW)^p$kJi@Vhg^5iQKDog?2OYaXFvhe0TKv7uw5&tB{{!>(x4Q>Sel>Iu(QU z5Wx$U8twErmW2GtYtZB4d9o2@Cl;0UkI;s;XM9xd7j3)fNwzCUzWTv~uODnL|0V(T zbXdP1empOJ%F1cgz$cW@%jr13QNJ1g7JAcwXBhk-=|#XRupSf3LS*}f|2<6bD8gqJ z$A(_Kq*EdPr}t}nJLFB_x1MV!6F*y0&qh&l;ukjF0lxz4cb(Y_&szDZq*DZ+K>kb@ zI<%u>}gRQS;eram|^!};f<9kG1!}-qB7`Ib5jGxlr zf8=@Mef!w?giI1jGwJ!tI9x9)$*jWNrEO~PL(+-82Qg6~26K|?x%FT%etjm0xMp(p7V_s@OER|+z3J}Xp>=s<_p z^Wk~7o+YCG$@05*>)7!Je1q^g_;h!(hE(ZfR`wa?TMArHZ=Gk;D=y*`3)xz z9~jy;z$~=MC4MlcP2{9}i8aAH-uVacn&;V>^31m!@O`Bd&iBIbjh-7l=Z0Cmi8J^d z-%)T=6t~kmO^d$3^&#~~AWsFq#)ic=phx}nYE8^oW+LKQ+@FSbYTl8HVkkC##{DP$ z5~LzC+s6HW#aAHu3A6(opvT9@5O257J2TH7F*mEP!0%I(&y>grDoK43!p8{kTcPJy ziH-QxGyrwtVb= z@D+#}@dy8jTJrmVfONQd>_vS8ecMI+FkLxS3IA_>e`~=#xs4Awf8w9T-^zQ&1IL`` zXNX_mIX~l9{0(xwZS3T7a(os)LVp`>eWuUnVSi+MJhaT4Zg08`{f|H4^Dhb*^%vQV zR5J0Xc@C!$RZ>1!U>LFg?8||-Y@PR+& zkEFiq>FJ~O9VW8%uoM|{YfT?c%9#XwdIjMt?C7TOG45s-rA{Y&6NdoGm-6NQB*?mD zuf*@+C!zQEgWiPrds5f!f3rVlf0Ez{1Yh{nGR<7MpgM~g2fP9A8y5#F$8er*Dl=NY zHFqTQ`M&48vjYA?7SAxIOxSuJqkIdUnE)?9Yw8+3syE5<%@pNAa00x8)uX5~E)4ly z@O#GG%DdEr>$kouE;}YWI-A~^+WtM-;ZH-lLSB3g|5KZeyO{5y#w1ML`9bmL%&yf_ z>$j17j8N=%$sg~Fy19tY!GH75%`K`;5yv`9ghC*L#Avi>#U=-Abapf&o z@4e0_&$yxOx}yU6**?ZJIkkK?^unhqdWUtrr8KqR>s3dz@IS_aQ}ht};ic<8f&Rdp z!{xY2P~VQ4?6-u~*Ybn`Y0xKAL3d=xhhcr?Sacchb9(MCpB=&aju%KApLC2Q=+}cs zu$`NxWc9o^9vYoKLGn*v(`xYj>xo8t(dKh<^m^aqxz9er{;)prs4qePwk})m$sW&& zb7(oy=RUKynNIi`6yy}0}B+*8K(1*}FyBLvdR#p?8TtmGh&?zAh5r zy}4Ew+;dUet;6~%<@aFYO<1q35*Dm_gn0iEe@-0q!gsY7>JoP>3uGd`ntM0|cyqrj z8~$jmjI|`2_)%1k_?MF&(4J?0HV?w@IZo#3o_!gN7xj#jgZIIJV;E0pPSN+N)$r?s zAK$Jy8nT``DEhbpco7G9O_Ggn7yVOYaZ?x8NB)$+f~T;i>u1i$$9UoKY&b`3+72@l zr*|H~crm4nC@+hKx%4i(^dp$BIsUwSw;SOD4ELAFsMYYpzixk@Zm0WcdffVt!N;B! zY;nSf;XJ1wS+v)Giugf$PW!m;X`f&z@QW<1uDf$1>jy&@oSSeE`?oHB)FK=f4l@O# z^)cW+q#MHh9L+~xa*1_`l{@GR@ipIp7b?D=R*p8CuZ9&#f6#@gTd^Kz@rl_TwjGgA zBMYEcVfpuEYgez8+1iQ>@%@y}_Xi>l$j&h~dVhnKvdjYNJoOauAM0nphWM;O*l+W9wC*KUozqs`act`Q( zU($!=ds2aorgj1Kx8Qb339XjbL$p_N>j&=M@$fvFne*7`8s@Yso8w$4nY*Xlvx3fwvmp z|KQ?YIo@y31CjbI9&TQOP1fpn40;e3jzsKvQ`v3M_jq|qol8x>H8Jo_g!ie3bSL~9 zM)@FR9~8fN>&-_K*?P4fVf{s2;B*`HO{P0yhKW8&S2=Ka=)>W+n3I8PNd9`AD3Mdf zYqetXpRXkTvri8HeCS7~uN?(T3t4@TG3R@>o;DMCfYmF>dtwLtvm66xqR+wjcs6cu z%?SPR><#{}0V_h*{B-m|n_>LA4ulLObSJ3{ zdXxOpZ%S{K4yp~~W2I^8xYW5n?E&7w@@p1TN>Ra>=i^@C8}8zeq_A}f0`;jW?*LD9 zudVfFulG|{&!c#ox5a&fxOf92(~s}3FQ4p^cS$N}yFZ(b;(Bn-)8{2l*FL0eFRs~x zc-%UW7bm>V?PnsArXBwVcb>Wn}($ z^DnF*c*E47nq&J=e-hO*G#cc`9saDJkNDEm(R_QtBlvC3j@dowUzpDv5_0NBz>nyD zwy78Mmv2rv;Bum`y0h^p+DU_#ORDE=G^Il=W~~KY$QJ~}RWvp0Xi`rG_ty$;=aolL zpE(cwBFtAj2U$+q0Q81oacuo$;}=ftQJD)}nKjXi|M~~vE1K{uMV|dkX;Hng3iTw- zjT{{h77f$W3qMgEBl9oOf8cy)j-7pXKY3q>&6UfwSD2YSKFzHJ&oL)>^m1ktk8};= zc{<6~$pj7X6UO@L^sKGy`he~fvv@>sd02Nb!Jn4e^)JHn**CP3UH=&HuBz&byH7@f zZ#L?$<0_C?XPF*Hy<VX!HGesY>Zy_}c~yS7H8|5oet#&(++9-!R*sagR2IkbAof2r|Ui}dlUQzN29A&zq-Gq|3S@s1LGyS`@qP7k!{U%vgp?t z60KrJ0OjDGTHVXIp8Ufb`XAK04wpIK-bowXStXqg{o7DTBVFs)#K`R5$;bX2%w3Gu znMXO%9s7r?FyD>m&fpz!J08fif5*06j9e&nuI^jf&cC_L4SomO=;6#;0~K z3H);hc#c?uL53Lgi*qLE>YT&Q@b`d!tHqt!z(0&BKJ_ubZv&nD+wbph(kdhuDMt>q z&WL6v@D_*Z6jdXxm$>j0VWu!|cKVb2hnSb)+;^0@o4>PZ5dH$;JfSuB^c-4k_I@hH zvndtCD|OaxV0=1qw&VOA+}y(DI~tM%Z{5B#HJ*$|f0mEVOnN$Z*SmP$Tt#luaOnRg zJ&lY*ds04~FY7+mEqG(%A2;C#u&8rngq=SYJxwI}_$tjR;(nNk_&t&2<6WI-NlJ&f zgUNUj`ObK}f52~!?gD;YcRg|97>uXwyyx5dxAzOC)ZHQe2?2gvx3cdS=qHAeKR2V| zC?Cp)rom4bh905drPUwiBGfbTF^#g;Y877^%f{>+Q$3efBVNY-KR1%vtgu~c%S?Eh z_>L{sYs2xi_O;L}!2gu!1EiPyFZn-+8zgwaCpdq<8@|_9-3WWaOdONG3F9U7QHat! z!7&H;h~pcWAD7SAnykkQJfc`UNa7)r7JBqEYHRQFAK`sqywPH#g#z_2p>M|c5sHjO zUUJPT!bc%(8<7MBJX_2N--Ylkyst?f+qYA(H2OpIKZ*?1o^!L>r_j5BN1**4bxYnl zuXUavchQeIqn_il1z5kmEYat?2|t728Nwo}D7Lx1hXFr>)IXUcem~TIoBsf_ z$RmCGO!zww$M?kb(6t6WLn?2l!)|fg8o}g+=IPcf-$Bo3fIsJ37_aiu*xKku)ZeLP z@dlm12@`VigUf=f+B-LaPt?tr!LAPk{PeSh-;e0-`hT3rUY~`JBMCnvyfe50`V$qM zel4;R_(w`VkNpt63E_9RzMx-Nys#L6KOt`b^-&rYF7#pXVfb~LVEpj!ZzbP-D89jkP@eAF-O z!iU8B1kYgk6mykx|FiuYByfvKJrGu(($w;>>CA|y$5j;N++U~XlwJ71w+jkTP{=`0C zxoSu9eY8jYJUv-I$wk|;(oX8?bb`aXSUkgcYcc!0(7;>C@obh0{6UGZ1D;_{^fzN? z-ujW9uYAUkdMLU_@8`}rW_s9^-fimLjQ5pIU2xs1x>eougw*Nm{gvBaioPVTq{n-V zBW>>_Ns*+8?!@?>S_!=3Xy?I!l=5VPH+B&I#rjhFp0PbHJ@oj;mwvMEg?xvKM> z%((Cx;;&)%2me0rqU(BkVcL{?2_zmB1PD@TExohAj`U9)w(4NQ!Quhhr&FGXHZNLy zF0(5&h?)HJ0JR4GSm4|GU&MxYfI$f+&1Xt+#TIvr)(BH)^`D_jRxhWw}mVou?*_hjlkq-fXQxq=i>0=!H)-FcA zj3*R2hVN+7GVk5_ayHTPQjX#x;!kdG{w?A6LN6kzRDu6_#__fX@+Ta$)x_`1(B_G) zii^QNjuvY@pf|R11Vh8R?+CL#^B>DXF+cV5?14$_px;W0>^rMdd~V!Zuj?CbWhTzG zegHgV7N`Djp9b~dn1_Pb(YE94^lT;g0G*xuS~TGgTk#GNz3kRL%HjvCSHU;6?v#1y%IN!EUAJz559v;cJgmSE**o$5&6qEYq{^zgzM>MwGPo!a z{8>q7NLTXk*TARDfAO)$_1{lj=e8sNpLbz=0>8Zf~3x3_&1_{16g0XILwheFzz=t#CO6ps(`vdy)e|joa5mb@6hG& zlGJO>$M=`NpDX=5{$Kuv_-|Iovhbwb>TUx*;sSk~1Li10K7EQ4&z-lO`_$mC;E)y` zv_`U)V(j$%?!TrzarTerUSm4;l~&<><+VJ)t7>waB@=a*)f;>|VA(0}9lTEFO4&;O&98iGKmkPhl)JR!+V=X9(xFlHdm$ z<*AALj(&BVjW;|ozKpDlI!$`bm{I=u-fs^9j-8T=+<*i1Ud)PG50U5x+`6If`7&S((71n`4z@pe)w(gX~X@GsQX!cuJZg91HQ8S2i2LXl-3mH@d0u? zomr>nKy_y|{5FB_;C*KLo#(2~|2=`LC>*g-O z;&vBOA0>riGRgamd2){R`u{0{M?Uv5^5rGbyM1Id-G$~!HF>u*Y# z(31PgPTU_BpEFCA1cxp7^*tsZey*7RLp-F?L(8h6@6qd1crpR7Z5obnBBehfa17q zl^LLQ0kS%jJsuY;B>BD14Lsi;`G@nm$sOmOd+zzXKkxVZv(ssizGmM&ZaU@{J~!N@ zEK5V5rvnGr$fwn(bT<$`%;*(P9L#^SSa^f*UHU0j1a}PhTgX@Y`qq`GY5lr4%Q3$S zQ?eSmG??Eq(uO1{cz?d^Y^pwUC6EsO`Nw&P58;lP+FGf8KyQ23@B#f7()m)`&|6ZX?iKDmm@lqi{Apb^ z-klBwf^aJ9)z;I{!|;-wYc~&~KR%|Gn@&S~8CMGRAoTkNEb)mM;G3|Nm0IoHB8tlT z`-^Ce?8uNXlN)1`NhMUjS588Fp+dEomm!_h-!~?Fi|c!%{TtQ#hI{C2T|Hq^g{vZ33@v%!JF+UFLp_H78#>(DG+ShF(!5dx0yO-sjDQpJ*#5~XUnhzE&dNJW2_yw&d z_s^7XW_w4jdH}qF;ZvD9hy{U0+9g!xQ>N`G<~Rs0S@zMdpE7u0_s4A$mE)_w0G_!q zVhiwyA>M6=6iGJfVKaP~TgyUw+}fZ4|1;rLlpY2 zIi#Lc%n&P<%XW96p`UBS_%h3+m7W5Fh7 z{yY3SkoYCY+QZ92Yxp$;&j8*aOHjlrs1AMy+Pfxm;5TU%V)c9E6D9F~n502|-uLG2D?5ok3wX(4T%RdtnfdO(ybk`<)o&NYA%D5LS?4bVenTvthl|?V+MLQ# zoPTi|sV`E$=uM!%S70GORViG275)`-ZY?0kqu@_M_#VP6o6FLdk&UE2a3Hq-me>@> zoX>>p!VIjJOtYMFecKEN>5rB<61{MGUdFvsO~LTf0KWqF#}Rby73ZvK_-To6bM8Yw zs)%6tFW`4D{_n=_P$%Z8nknEP*WmACT>Y zpL>1DjjwM!*u9(lp0szCgepUoR#LkBHB;YJX0*>F|BI$CDAaEy_|G(+rEktXHT*FQ z()Zx`_O%ai{P*N_lNmf?KIZEohoS7@Dh-M6-O%5L{ZJtGhiIup^C0mA^mmwZLHLVP z{m_d95)TNBA40zN<*+{m%Ct{H9Qk^%>!3eBgbsk6ji^^eCi$ zYtU1_r#|m|exoK>FnGq&_q;du@5S#)oA7^JKRA=m07d*Y{)Kk2bB%M2TMeD?I!F8k z?#FH9^Ilkk&$28b9PfkKoq{5RgPeoZYKw$ev}LVb`(E_~!_Q>(+i`n=k0>e_z6gKX zVJ7~}zqv{0=ZE^EBpy`_>grvf9s0 zAISKD7bYNh0pVldcrsDr!p0YkO^u^`3E&m`Auy7U;t{KJSr?din(PnfV{SUbw0+hz z(^32YejK28lhK2H9?&(?fzOWM3j`nG2^+s++PGc@AJM)U zVEjul{&(*hGoP7n@O$7tGS?30OrA53J&OOh;MqH!3q1hAgK)frm9Z$GO7tSS{xRZB zcCZ8kj8cLhf%6Ts+bJz7*bRT670me=i)*U#-#`ZX^P#G!Q*Ko`j`}#Wy&m%e z&xY$8pWE3>SLm1hM%qi4-bo{VS>>^%c^Lnu>>OnyN|aNHk4kTl=fOs;?a?TK|2@jN zf#+c{=U$Mes_8zpMnB=VPs#gknOjjsxtgvNEUv)w0X-rz=EG;{wf@tdVf|}>`qP0P z%^T@N=>Ks&pA}2?XNgpaz+;(u4{X%KDKl3dCVE7ouaODnT8**V{VV*Tujc@NdiQSk z2>uK`2DbP1NW1jHg1hJhgGJXr0Le@2gD!Q~s8OC417$`y7>eBWMTpPQtq>!m-*Y9l;d zBLR=kwa5CC7hRaM0qZLV;q6#V4Acbv&RvT&+LW%BT6J^NIEvL548L<3o5gkT%_-GT zD{J3g!}`)R8Tf{_rTkaa-zVG7D#2f% zGLx31p#OP-T`R!HctD$By^8++4__*&x`*|Xxo$n7=V~NMkbrNRbF!iGTi{80joS2j ztWV5R>W{_)dTFu|8L~uX^xQx0f3yVoMovYPrWxze|DNa}>uEbqy56}dy<6#pM~;Po zUux{iapA?d4pJ8S9aA}^K56uDW_MRFmEi2Hw+ri6Q*Lr-=W{Kc^5oR&XpQ!I)yu2R zdG}A#o1OaZ0*?^hiG2wHlZJ0^I>{txSUacU9W&nezw*1DZywgh{PN3R%zSg<_tzVM z7kl0^y3WIg=Ko>fOYn?Ai#QaRai=c6OZLTjB2gub<63iBRIAh2dTXq2d={9US=M}p zvYc2@HiK-pj%NwjY&!96Fu^;(hqY)pg#P2~IL?_#@DFo#q-}E)WpFT>lcSMs8Dcr` zSPKlPQ=8@F`lfNO9Mm=fulkrDP&i(rJ>FfYf!-Z{_HO&Xa>M(25ZE4SHc)fl7d3hS z&rsi2r>l=6hj6ljtd~R5gUgP$2e;ELPl__pUg4}**|@fQ6(za3gsk^W;~e6Wx86E7 zn(xmy$X?OEZzzA1|D3FKNf)@=xg&mK*3%Yx@s<@EJ2#Hjdl0dVPpp5wyPuZm;{Bxy z0wK8LE2BZzpcw%{i$MVXcW&lo}aw+^vbOsBz}#@^D%Eg^0EW6z&DWTIZNE{Zpl}Wc!uyd?y7IqyUT&+Bi~Bm*%R|OZ!6x`B4Lh)_3XYON%71y!gc(8;5=%_aE_zYzNoqGV6t?AMqh;q( zBtL&7DA0Fx^uz($LU%l2d~sq|VpSp)Aexkg@!Y=Vl~Sw}cQJSu+IBxB#@v@THI8mC z>w44$N+2Hi-Xbc% z@GS5HnRdKlY@ijhEHrwTAiC#-95^m5j6^%Z>#IK z0^eFf_zFhNzV~tzIfrmO62EFs+__m)Q?IJ0gIZ@iJqrJjAwis>z>rPrdEEG67s-dO z5M9~Tdym$?VHCfHykD2PrRIW<`1qOc(LjuUSHC-VyYPNWzIE_u2#I&n>l-VzRhSPZ z9>si6Q>m>~DlaJc>nsOWCnNq?^-h=Xndx!`cz`U(Jjbu zNOauw?~UzDwDautvMV0gAH%nheaA^PMu@SG4!kj=3h|L?i{%TsT_e+_;T#vi*)aBG=lxgVYR{0w=&|7XBF zgXhAwrnV=2^|7y3wwUd2BwwMqPj}z=%mn-f_g&meg7>LI)EvXB-I)J`al7Ql($A$6 zejOR_kZZ=rY3~$`;u9bF_`S?f7dO%~fuG`jP4G89=+z!HMC17;?d|YrR8U7$}iY0j`rC;QY6-Aal!$Uz zYMd{FUv3{)E+0CqJxtGEtuaHMXsw=ydBnkF75(3mf2~dhUdXdClM}z!&=QT$DWcCo zegb}4^xK0!xEw=%dWav(wlO!PSX19Dg#WBD%ggYpSMz;}_3?i3d#ne*f3h^pUr3>3 z>m2B{f>fsAJRa(GnXvA{-$SO)vNC*Nr+q-BWGJ58#`C_EFEHcDY-wf3Oyo0=&)H&L z={1x{A8sr3L;o4uSO|j5^Y!UUgCJ7R)w#~4KehcX{78$_z7%M+TY{3)4+O=YCwd1` z|K!Nk`vq!J&?i67*46Up-GL(NJGct#iSjOo|CuAjf& z97-j=P9ynq3m+dr-`wJv$al+0z0aU`3vL*v@lMc_maQlJk9nJ|E~O7%L4Gh(J{jk; zUS)rW>u()ESG-!e#t_HjFEuZ)OaGdJzJ>TR8hQ9O)~ah8=?U?2H_Qh@U$_3dLw8?N z;DeC()QFev_OM9xkOqE1;&+=DzE6_}(+GZ&ei+wZ(D|;jqOjry1^@Z8*!~wQ_|K?6 zqgsInL}s8pZ}rxy9(=%uNMQU)#!A2L*|$%6Jgd}8_k1-KZ?9iCpRQ=hxv~Y%Q@_Jb zLkB}s>WBrS|6o_~!)LLMa)7r)l6-MRPidFj-Q5Cs36J<8%o)E=$ESgQ|K=9pgN>II zrgiRv6yaxJys@Pbiip-r9sDUe{3K8PALjc6KO+92gfAul2cO_IUcl4mTzSCM-}oP% z(F(S}ugVf~{^a|wdoFcc>bOu0{mUJK--JyLnS6Q5hrRS_i%5e1co#<3AE=L3(eTeC z^*)SVIIErOQGX2lg-y8M$p6++8owb5`VzvYS=Jxg7+N2SdZ}e^roLAbe?MJ(U8bM# z9{7W_Agllxj9+TtUMvZ^H z>mIf{zPAsz59cOP3A*|yc$=c$#_qA$U&1T!e;gThQ0xG~FTnqiN&C(E!}>$&fL{>5 zQkiT2N%aYpGyF!)BNzM&@AEcMi{3xh|1fw4u9rJt-On1PP``UwI`}EFeJW{RXuth4 zg5T`H`{!34^MVK7Wf2*R@fB3>S5L{sZTx9#ba+PowQFR($REKo^jHIfWW7JyhF;5! ziP!&+e?i8pnjXP39`6a=6FQ<#A@Ml$7W?;;daJs4T`MYu02zOTzd-m6?Bvih=~a&y ze1zn?Eflk_p~Q-U?2q7I7E*z9?%cUn6z~DET{?D;UX(QIe|(53jjoNNX3-7m+bl+( zLGUnz0`uF5{>0AC4k@cIt48q+S65dZ-Ud8@#NT!VZ$U-aQM{t25elHEH(Z(D7=4K@=jR{1S^_1y#SIO9{Uv5_n7=3_+Rxg1&^*%lscc2Rww}Ju<5jD=9wA z^^oK1N$rYu!w-YtGiZO3Ds8AD`j1H~7=27-!+}EY+mZpgD!@^R=hxK1-q$xJNlmS@ zNH6*n?-xq&IA-|ZeY*5%mgNh~fAGsP4UZk74)te!qe1_(1v|4)my9|#wM~XL+Z6Se zdcem#k=BOk8|$Yc_*bL-M_SuKvYoXnfN57u?f)EYV|IW?6Ef=b_}Z+0GuxqOT%o;B zm3@*u?4)BKgx(Pg<6|H6D_c4%ScAx$&Awxz8IGO88;O z9Q8cS<+fN~C1wRGw~+eC3we9(&YY#z#4RFtM^yK%P6r9}V23Pb5Hos~SN;qBV`{>qlBZ~U4hd_7Vb)=ENi5^1kv^C*SciNKgID~3@jl}h-Y+wL znL&;BFCcsi_#e8vJU4s}Ka84sw7*@k^J2vi@=4?4`^o++Smqqh)SM0~A!}>{+O8$u zgQ?}+&D8PDUUdh+7v%EnO_L7{(;r7m<*VQ~k(C5l0rU+lqwC4=KSOrRo}USQYD~f3 zRXMm{S(y!;STWMC3npe?g1?ZutEplA77pF>L_H6F6*gzzcfe=;s1&Dy0xi~ytFNIy*aF|6)7|COwEz2!w{iX!{J{9TU3WCd_pNz= z_Cdpn4a0k?uaNcoZS<#wpgs}yDO#)-=iJ8c%d|OBhl-HDLcB%R569F8C5e_rdKCQl zT5!CzdR2D4TYI-t9Zx6qpv?|n@Iuh%{{s2sNmyTL+1Bw99eG3h=$Rs>?PwYxeh{gM zLOymz6^=LU`s$l&*5({Ud@!RJzxVEu+%70${X|Q2`KNVGjxh&oQ`NNZi@c-z@O`%J zQr~#YzyGpp?|~oOd1c*$;l0S$Dje?RU_EbL2VQ!2n}$00!!I20VU4Z1-uzq0&!sqr zyTTvnP49=svb-w_+9$ZB9Q+GmZfbdB5Ac|a|NRgJzJ-1Gg{an^u50vP+%aKjJC!-b zxu6~q?agiRnG1bjmq;l(EIQ1$|7&7#Fz^ljtWE~s`18L8Td_a87)%h0YUTKTAK71f zPqsoT)fZD2-&pv9ugiMRaWUg~uxY>FTL|A{38&~R>IF8_uetp{WB(TH-G)^`(BHJo zFSs-p`l11rv$>(foi=>>Gr>FNu^Ik28fOwXNTx`H`XnFR&MAWQ$oV zO*h%Ei=|fez5NmSGw2}vYz!W4S5;UnWUjwf7am{?NpilS+hC()mAl2 zt|C8V`rB{J^<+I;0{(%l?DLqZOU*d~zB0gW2DZoWe_^)s*99?r{)ywpG4ngo8xXyQ z#jjSak*$ueC@Y=*k{KUHfd<)`z<^Hy!{jIEEaC-E|=-w~23 zEgICS)W9276Mp$On^zn#tMzRr>s_+lsMD{awW$BjX#QO<`hqEQzQ8j`yjfW-QLubi z0>r~>5UO;)D@@xgeU zbPf2y*DR?>D(cZ2!85c&-w$ojZpb%g@B_^EOKT>-pYlF31AK)mSHFNC$-@hKLMJ=1 zs2sO7*D#(HJcaSa4bI<>;sF*j#iG;~J4Z;yWGWlNBr1p=y#w*8y56@h`S%f&%PbDrG z2_yK5_QDUB)@Ce!A%Q>W45Ihfck!|~>{aE({~h`c@FDa-En?OKe`GHr{-!Fd z1<3tDJy>RZjDH>1k)u>}5k3R%kJj_p{=~u}dC};25vfEfVS%Us`PLcee{D!tFjgz( z|Ik@B4L>>{|KZthyVF%#5dP)ezqmnzuEjY z<~ROYUHtiQNTWOYz zR9lq{e5|vhx2Lk_KK;`vf_G!PL%|&|HmGek?semOmv-cKD@nemC7g*T+17$vJ_E79 zYi=#c+JbmwvSMoQta~#l%Nwd6F~6_vvA=dPKmG@TH)P>{Shx%Daq*)4-%Za#|1bT; z;TMPfv87btNe0i*|G+7+%~_N~`NO{f+g%@Nw>QfWF5RNZeXg$^1L^y*o z-?@7q&i7SsR)ce{^-g+@+gCl{0-u54TbuKO?|b*g_R=jv;$JKq*z|VwPt$&y20jMCFJ*Q4S)bmT zQee!lZdtSk^R-l_)%lmpOXQ`fUoB$rD>mOp!pYX_p(HxJ;=6~cW_9z! zB3c4`0KcEYlPpO*a;6#ghrv&8sei64%qz?z^{mMAHU71JxIiRe>OW;+K0a~YS?UZ) zIl(Kg;d!uPxw-odp*{}qN?gD8E8ifOA8gKBV}4-pi%-&5{J3<1cmaQnl^0Wg>e)VB zzAF>wi}`Dg%X;@?UJo}?l6TXu;r!FnlN=M$n$<*~cnjwzONCneOOcYlRx+>^{q@NN zm*vd-VL9{5ywiBz?5#7cTQLLFQ$c^tg5I<+v+JcA_}7>}Md`>#uz0BobuaQY)S+Kj z)9@2{#(vJdVcJKX@wn5sS1bERd!ZuqpmZ5M4}P=Yw~jGgz>YLNA3)DL+^tuy(Jmi^ z+YL|1p`tx5&PV=g4lBy2DN0*Ku|8sd`6q*Sz|SLpG8H|>duf+O7Ovv?5q&LX5`E`5 z_?RZF^+pf8kpFOv4LX^H^RZ!>TJU!0QLD;o#kk)yd7g&5_0HST`5?mjc5=tbE`I8&Co^$<`AWAMravmo*Uvyc&Z$WF zP?#f(r{G698SU}mE2L2h#Xh?Hl^5|_IB%6|v2W6zNo4zsF&IBRk}65X<}>`H)x5>X z|6E?R@hS5@D9@Bbf1dn&E`*4^6r2y3%i9snD0Y> zLgG)^SUXgM>-idZMS3jo{vgyY|~-ZOUEY}l`m=VD~SHY%p_=Q5t6|4 z#A0~{+M;14{L+Vu_|rbJA^d(l7Mo3u$JBE~{MLCnXExJcM2~{;_aD^Pv-!v7ANX4^ z`WE|Fw7jdRZ8y=6tS9d)h2k#xK0i5;=ZNu_f8_;(U(n@`nR+;`AKY!-T^GBO-xK@= ze!;9St&~>4M;JWAR*iI-|EWf^6>QF^#pGi2A<*A zLzPn<4jnZ36a>$>zVF7q8@q4pCV0rJ*BWh;Rn4lJsG2DJKB%Elqjedwt~W}xP6ghP zM(_;N0*Catv(L|i&#{YqKW|H}UGCV%|HCr|!~^#DkmJ3Ff6Kvv8w22EJSX*6CgFVT z>YUr0Uv7R$t%AM;?H3boOuYY5y*}ExM86cNP12swK2r0IR~y#t!Txh|%XH%b{qZ%t zVvFu}t`<*xMolze@C=LF;QEV`>iFqOVLI-o=jvP?pJCD%MqiSKiYJ`d~aYuJZV;^1^qBYzt73c$DWa^}uwwnN`Q;!~sNyyw$D zcbju^my^gAl>-W?yb1-2io6=7>F{DUQg{~#lJ z3-{;BhEaS$W+xTxwkujf+5}&4OsB%FrNLG7$oV^p4?iM^(Eqj9#4>H*73BIz{Br~c zAjc!;vr*_SG#38n7JoYQ9ys5F2d*%Bm{EPtCle05VERX?)4zD$axHYfW&4~uvVzfP znPxf_xU@RAQtMiF-2k3t8g5_W-I-BMAGS-i(;z?N%`NsG{zXek)~g?49b{i{ceqEZ zxkkOM{I_}s`UC4Bmg#S5`c0`;#pnr856uPjFs{e%P)#Jy6AKl>;FtBLY{xL8M<9;f z$gc}4@`r)flkH+df=|Ei)ih&&&=Q&(R@>2`O6@TAzhVIXqg*U{C)O2D(GWhtO7>L? z?M8Z4tI1qEk9&t%S!|#49#mCk+SB>qTNrwA4x2xO-%0Vz2K0|-5;s{|0Q~%j|5VaW zt!LH83|)FjSBM9o|B#tF@Rtd4T(+dgS&Qbc)I6FokI z;cGbRQyx-jhk`#D{-4h=f4 zR*&b$z?5S&IR)|cC#=#!5BMKAP;owW8NfSOJJW>7mp7L5bXWJzprTVk;*k$yQ~a!? zt`04=VM?LNImDNpU~N=^Z`kc}f8IK5kFn0YqtrB0vqG;tM}H)1a<1gq$_?m@B&Obi zZ@fqNR?~f^h!2NJzC!y$YLL`(1)KkSZrUD)zV`k}@Wi9+^m;05 z!8WoU_3w1*_A81DqT5b=`2z8jz1U1#SomNo;*}ZX`|yv|JNez?@4$!O_5j~E6Ntr^ z?+o_Rvz`t&B42x~BYr5X!@7pakD)&jhU1kkMXWni*87cFSbzMO?_Dhn^U=QhA{_&eG>1H^{MSnYw0S#9rjc! z@+ml;b%Z!2wG!*=S1%4p_CZgtN~?HrtY8w=>r**yBId_rm%6yFLJh4y?+qtdBl{PZ zisxk-zumSu*&95!hmjfNz<;G4>^R1?(g23Xp#uX@4WyEtN^NyJ@ty;(cug zzloxSszkonwCh9Qu=aC(eRJl0B{o%(Hs)8IKF|9)!{?Z0ZYU6xAiv7LZm{u7@I(1} zti49n8|ckwFVe`$y7+?N)Y}!*pVxPW;riAO@>6WYA~BU=6)+zBX?Ca}(+&DlTJPuu zy+<0^#LapqI8Qiz^uImEy?|fFFWT3=ZB?~O=pTx({?)qYdf!dDU(`%ny{jjDWBbqp z4#%Y0MmqBp6JN|KHy<);2y0;c{PF$9FFvfwm@L+#Ep_?SIqz4xZR8zuraE->C7jCE zmu@OOKS;Ie_!&{QJKf!+{13>_GkoEFJEfkxZDp)cKDMk2v!7Hc7>!?z`bGVA1-tF| zze@%-Vtvt%^a?Y-Wri;y_}us!w~n0^5qFSJWBfNRrUoYkX9stX^(~2CmUaqN)}0Qe z6rKl?pLG|x*goFWe||K+b#-&n#ka_hg72UWu?zD&wYU}aO%`k->*oREo5pU2Zi3Nx z-5{J3DhPLg{s8%Y9N((Ve9(AM4}OuZ%>JFd;^epPw>6FOCDx>mIej)Ccr}UFar})x z={*mhWbrn8q~$AA-amnD1QO6w9<$qj*KLXaD_> zI_uO?ylM67tGf9hNQW2sssw`psx$TUNWS@Cxp3%8xe|PN5u-mr`8dfn!4Cpzq#kR* zk{i>BqLLc%W8F9)SIPH#@kl&E#*ZCG#Bnz}XUAU`m`37>{6jw%lJO2b3km~b{irY1 zUxg11Je2U|El^BVU}1WM_(zcZtsQ%*QTXJ(FY$d6AIb6zUb{b5`giev&tmvBpU-)& z<43KvTJ+^r_)CZ>I4A%g0UnZt{fidu$LHCiQNI(JRQc;3rL>j5E`S+N$PX}jW6U>9 zyf&TfVUgn4w*&cD2G7Vm7Jba=3O8pIA2TyGy~v#Z2p>Z>7}g%vE-hj34%{E_W1A0c zmVl$*!9PF>BEk{xzq|!@hNhSL@AbW(p?>FdF)P{m(hFdpV${At(u&GHdk=f0sOwr6ig;QhrGNg`gNerk*Hm2*+xw<5ox%mY53 zWqkG=+0J#hEdt-4&iZiXTqucGZ4D1CYzm@Ubb6l3#vI8NldEhhTNlq4eRAuQdmlAT zWZn;We|WBU8tYWRQqirzJMcW4zF1hZt$z4E!RrYg;+$aL?KUV*qJ6^|Jal}?hK`2r z;VK$@i2E3CY<=!sZXfFe@yC3Q-|IUh3LmVEC4`X@A}PLr6vcsG*Zy|+Ip&9} z!_k=CPUq78&zS4;9r8{$UB>1C-(&8_Uz6xbmu6>YkM@Ucfwk5~C5k8bADQny;j>!x zYNS#s2lx-#Yd<)iT(ddIjrLiv@dxymZ&z4Pgf<8By{8_H?{7`))Q2uNArSg&IUn^6V>?=`*brJlTtOrm}SajqJ z#%&JjTcaJ)d!qMtb44%z+pI;~FduwA``$hByix%=J()#dd|+VDs~&!pZhL1t#thj` z_%Fc6ECd{Wie=YaepO~I@gJ%#t60r!AGzL*2BMjwC4zZ$_R4KH6ws#*@H63;&!yPc zL)SvTxrFU$ekK9W7b_(6E7U)RoX%fP_|wZjoH~c+kDuiGvVicTE{AU=c$y_^^@9A< z4fpAPL~|nWycn>|1c?FFa`0IFJcC*;UWpE7VVA-LvyF zsPDk@<8k4?MfcMta@31qtunmk)q9VMUh~%+CEov7ZyT{>dK9%PWDWesTvgm#EN2#% ze)?DLe(0^ZsCH|`!}@vk>{;&1wX#{fNb{1F>cdoGYc1jD&oUGl22RempeI@cZ9=?o zW;nUPEuE56;6D(4g@5kS(*1Q|L-eYaLVZKvnFdJ{l@prBfUoVP5B#D#XgH{4v9AH0 zkhu%-r_8LztUs;p$2z{rVcs<0AyaJlhnV?vwXUAZ4o(!iV@=03@Czb||K#T^PrXKW z?Owtcal`&sk6X^pHF)3!{NWDjbI9zRZC$@HTWpGWp7BGNZZO68p$G7(3WJ1L%x4oh z7DjS;LpKe6#vY81?PZcaaWP9sBi<+enbS=z1fJr(D`=%fI_k@4$99T3i}0ZmThh+r zc@_A0pY-j^9HI`7$t8Hj)4hXx%ZAGuz=vn*=@LHuRNiMi#IKAVr8+OqjEooXGlK5n zd2-YjFYr5*)rI2)J;L#cze<4})`P$^2p>aq+4}O%fNNU_pCkkK|0~~xzB5DDW`J*! zb_MOCCF&(A;G?5$_~Rf0gnTu&lk=IvgMGq`sAj^iA^eN4>_to6mo@Jq{XwqJlq28> zYF0?8M1yqFhQER`Rawn>4xz_Jg6F<%d;2Tq% zH@buF(MZ}vKVk>LW-W=QSD{`j@QRS~izUgA{!-GVkJ8BY=C#khA|Fcri21(busDtP zjF&_~e?s^f8$UR!kRP};if8x$uk!A*?<4I=COAL!X7U-PR>2<>*W=$W==aGIJmDv= zvdIM>8tZGu&x6Kx!q3=Q5Ly$e3RMBmNl0=)d|9&l(Y}%~ztQj;C3+k?k(~(fB>Y{o z@9{X;v@-1M+2pAOBC4LwCY2_O4{B=utrUAr{> z^b_Q#OUt`aPrQd-zHC_@@Ub0Y0TA*+H5L0h{IW6D>;8s_5AeR#Gl;wK8OBE^mFiaT zKt+#Dh?tD|B5{~y>L7Z&fy&C*wEGi;+j@<8J!4fU*QpJKk4DEQ8xdyQHK zJaQcA4{;%N+o#qSd^7leqW^+xf;$Vy`6qynf&ROb=l2sc^t1m+ajmk=`f1tqa ze(*9V%3=|l-um|JM+6Tlm6YGl!~08;#Q4+0KOivcZjKs!|Bb}2e(7L%uJqup0OX?> zK4!3X=ibz)U6FKv+olKDen0Tx%p<5E!Q?A&e*4AnV&(AX)7fs@2%o~z-qg?jrg)GJ zdN<<*wx3soH-=Sh?xn5V)(}2Mzg3u3z`_FX`@(p0 zJ)zp4e))pLPc1&jQ&NH~NAo%V9*!Em*PvE|kIm#?Du5|(R zH~1O&{aEXx)?ZtXv*tee^gQp)m)>Y-ZZn9yilcGUn$oe~!jKdORbR7Yp^)M)K80 zHe6Tn#`GP;?*s9_j4k2%2f8;K)4)%l2hn~uIQ^O9?bI`)c!rV4T`$t0*^c3l;COaM z-i!8czp;Ik&*7<8V(@y?JJ|>xqFu|8nBN}X@)7n=?w5AQvQ(@3S-sQf5q`leL$P_u zT6XgCGgMNG9KR-9q zS-SXkqe0=KTN`g2r4bJi{>5LddeX3c|6u-dW$>nTkHn80UI|`};$O3t?A@2)QsB@PKhL`i50tR+t{?5;H zox`kWv!1GwaX&s2i5AMh_ogl;pZ+!ie7(Zdm$hdHCQ@_b_HuS$e&+F(`lQxqsGy8B z!J*CQp%>~6-Mf$b5qUTGPIT`1 z1lk||A~-+O1NK?5gK?+P-vqyqv0JFS!KgPwTi|?f{}0y29EpKL4&8$I8}aIXd2|;H zGUXKT^b}mr&<5Wzu6j$wgkMAW0Mo1=E_kp!zz+Hf#(!g?!=eL-PYFMf!Ml7+B#Tq- zrVY`4Iy_aDmbRs0N%thWm3KJP2J-=z%bUsjhD)`+RsD$ZeX8U{*)PiDN_yt;HTORS zpT~YimJ>9kc>fjd|8BgF4kz7%tru~0OOt2x>>nZgopZjP&G5N_kIW!^iJyzE6AAvM&tI@qaT?>NWx?TV*v>WO83o!lZ^HG> z0DdaVS@r7MSJ(72My^*j_D{V(7lwTyqBDS(;dtZ!(f`}>SFaf0Ba9!*^~&Ro;hG4| z==$a8(E$1ExQ{O}*8}{;(`BZP|K}S~0X~n+S$Rqm(XhOf&aypwEehkaps=gAs^>?# z!=}3%9Bl4Xp z{!YekD|+D{s9y_x>P*&QbJUNge%<`(ag9tmWbH2yEjFZ#=sSS|jdm`3n^BXM_6T)+ z+^4Z)Fu%GQ^A>S6W2jYaZC`$Y{c~5C?OyQk41K7$aK@)vt=FLE`-JD4{-D3jnD!-n z+?E#Dmr?+7 z-s%N=#MO?7*CUA@Wp9n7CPc!Mz+WPA8|FKUP-G+L_smB=J7F8%k7v4^%7_A%nrO-3 z8~0W5MPhfBAAjl^8^CnE4FfM?D#tyFs!+=b6qXICstgZMX+)Ta~bE!0a7s``?|!=%3NQZY{) zn{N6TcnDMP#%hdW_LlVWc7l&w!F(gU?CvkE&{jfUlbeL!Z}<5@vPD^}r4Re3pT+xI zCii^p(Z*>fdJEz|;@y8z7255h0=|*%HyixFR%vTkEA%20mqn8P6{$rk*Um8F51LNy zceaVbP+>BUM;$U}_!)7H(dh@u9HazKApDG-UEpVwv$6>uK>Rf9q*76&^nMXPY5dz# z_<3IDT)4pWuOsjb@HZmize2-L=y-;>y@}z!{BX;|?8Ynx&%o~upONZ$sGo=LlX|c+ z&K~j^OO5a|Z2E-Ehv8@7{Dkd3D)M3Q3|!B$Sch7NTA$m5pRr~k=Jy-i=YB7}fxj_$ zhBihWGvGSluA<8=au1`w-c5Tm?ZhR{F{nRADPOOA_JbCFeR<3B{Cf@& zyb64KS;?YOgTl`4A`0ziTd;m)hZz?w>D-O+#^4=5L-cxf_dHk76Rdjxl zERBwzx(56U{5}S?PUM9mUxGgn{=)?YOToHeeFOW``F%=RAOE?p^MH8boeZ36MW_1HC>y=@1J43Jzsxvy^Fg*@PGOko&U%Gey`Bz{AP&W1oQWF zUb=f@dgG5Y@WY#ETluVvtt_t`{y+ReRH7fQA3Ta*;C%2WXZ$?L`IGe$;b;6Go}uF_ zl6o!#-|&3u?999mfN%W&c*g(sPyAMq;Kc74K1;075>SOou`l!&I&6-xc58o{Nb9uCf6E*XenH+XoznyO9?@Wk*kbuF*dHX)yq7WOIN2>4qnl}(M+dDKytwxe&g+OOHyRy3cf zyhnZfZQBtAe$NKuh4*jNZ)rOij{cp+%Dr3OBTuKC{#kTm0_LNJ5H)|$Fqtm4iTD`j z7cj_6VmSy5>F(D*sQ!)h0?UN8)v(%%$_t!N_#UZhehupqD}+|Qk`h0U-^RY4qMGuj z30+~{_8a=&{rnr~S`Uu$Gd+TmW!(cbYi-FN+H2A;RNQ|dNSFXQtkSO0_h>|=cR zw?gZ(RK%~0QpeSv(~jX78k$k>}*;&VEn&zHQPL+}GpkzW7I9Cx{RxOY18>9c3{9jhb$Ex}JEK!PBaso+c9O(TGO?cThOFua`1_wC_=k+|;a7O9Qo9%H9R|-B zE6(v6IyAJ8%GTwdLtci4hs8$3B7S1{vgU)VK~|}tl!jkmzIW$k^$YEwmY(ptJ<(sVFI%^t zP(RU7e;zk^3Vn$v*{Lp89p6P?bn3fA@Qc!~ z4VjVahPbPT;0K2`;a3<5J>sBe7^Hw#Y(+a?60mTIXx~B{pJ^W?(*gd-`H=135Pm|x zD2)HeyXyn=D|rLEb~Dev56@)lN{x2Kd;Tl_&-|b1e~v`l1)ecBMsU*RqC+3`GR7|$ zct)@)Y&d2(X_$UI5IhEcsJs{aHfnJ55dGF=t$H@{Z+G_B(>;Io;(kw$z<3g>qU$eg zJ+TD&PbQu#%rBUIbnHFz(R}jftyU${(5gKY_{AiioWhf@R5mCZ=n;O#wrS~$f1K7l zZ4}R#{K4>v;S<4gdL$n9QweI=VMfk$hAY8OWFeYx^)7XSdi48x1;)>(yz?9+dJ7WY zZ#S27^7RJ@J}`y&FY2+`I{qB|NJ+fuDHGXp`0zg(!80u2_;;!&RZ5NcZ*1@M&2cvi zL_S;>kDG$-zLmGbg*-pEv0gcN)muTy<5Az_6lrVc{dY^TvIBafS7Fl$zO!^-OlDBr z`8cYT!P{gTQhbYJRMAD$?57PFpE6N4zm`AXUqk1fRKnj=yCW?!;75yxV@AKfkR|e$ zr}YLA{NNm(uSDY`?hjpyyl{Q1$@N9{1{Q@|S#q#mX5!n|Q8n37Ppllk7htxJf5&~r zZClz-_)kPX?%jNJKMIN^UgeMq6A{gRf%V}JZRrgb6eligGst`FxQ z@@4p>M^)h^L@z`1UAwhAWqZdrkEa3`-n+IBc#3}P!uIv?E9sH``rLYh%{fo_u>|P) zzh+X*RGtX=EDIf;#eN|uJR|Q(9Q8-}{N$dJ-YWR*X6wE`mg{PiI!*NvWqE7sQOqAJ zj9fjbdz+ze)BWDmhjn1w$&XJm_XqQ5@$tbcUB|at{V?| z%_ka7U$Te(S8qh0C1zP4eMMWo*h=#AW`=x$X%hH+JG$r1sMlx@Em*dc6C>!SXKy|{ zqK`v`rI)BDlI_IVhWbq`4wvU-`j%oZW{-uxATP|jEVCQ_ORow^eN)-Rp04ViJ<6%{ z{NRrarhrdeu(K%dOnxM7HhH=P_g~a`8}5$qV@CZ8q7U%+us+lMBF`Bp2-81`W4?=6 zw$@wdSxJ+MvHh=e$I}HaZtiq@*l;C&Z+9n5bzF^lo;ji}@MWOClV-!w{Tks{T}9ip zm0uEpig5I-(k~HjYYk2cUfcBB^wA&D7QD|i+Rcg_<;$kNCi+pd>wa^hp9=_RtZJ^J z*^g{oyfnDsF*eSu{Y&YXZ+{DCfloDP-$u1L578G~CoIJN+k5`(`BVE|OZYp4Pxjfx z1<%BNsJEe;PoNh#e&_ebKYIy3gv9eadz<~{@5jEUvKan?Y=xo3Jd*Pbhkkv7(VuLu z%_@!0c^f!_muau$`{$tqLkNX>K$SS&x}k-+3r;zPVEi)p#`c!LHm|aAY4nySR~j)M z#=h5k7EzXVhx+@*r{AJ~t~b$5w;JzukK$#yJ>flK1phQ}I+~y_9l?v8o4uPes})x%g17i!{nX*xzMzc*ePzlrVL ze?R()QzFLeYLXAx#46BN8)(-Pyp4>9cjxyvJO9Vn8T=$hPqI4gNJB!Jb}EJWoy=d` z6_P$t-{x}43j7?jznLPlE3(^d2fTyXZuEXvjl0Udo}LN+7d&qs))sLQszNQEXXg3! z(6iGk8hhRf{5Y>|SkD3vWAp|5-vhk%+#-H)y83ohn~14jd%ftVqMvU6B%xm?Gx7U& zMRw)u<`0wTpw1Z$c>l9mY*V3MiJIz|d8G4ajm(fG;6!+0ebpIMsrnW9BvY2DJMqWP zTCj)cQ`YOJo2b{n`vLx^41WxKFwWDlCl?d{QQ*t6&#VtEY&S1?GN>8x!Fq`BMPw;shxau6c={}z^E0!a zaT@Swlh#UWDf3gEap<2Z>nL7N*wb-}LzstXCw^kLE_8zTcZ~lBYZ2$6B{gxvG~se&Zd67T z<(O6a9{EjY7Y8>F|L^^&N&b=M99-`W&s);LA{BMm+;K9#uQd@*UN+g1OX_tH{Q{d> zRubJ)+e1}AkAiwA^EgpsJGLqAQRRR#g zczSz!JKB+?ZEoYmN#rzH0^f)ve28V@*qu&=SaT8n1b)BKw#ZfKIk<-czk={7iqvsZ zL$M+9_vVgQzQ%kSl)1Y#zr7lIlC;Cvo;Z-7b43!*p(X(z!T#|&byps$+Cr`;1MQs! z?gj35Qq{mqa)@6D@XOo655f-=^bJYap9M$Y!)m2EsKfpVNw_`>Kda2Sae*Ibf@jPJ zzd1YUPD&U2_rOosg!zf>>U7KHxl0ZB8IfWW%;%n=o>`u?4+uYl@Nt|Qow}X6`KYI0 zkwE-mv%4;IUB-u=V8GxR>{M0_`B2c8biIcDD%s_hOHF7E(U&|!+pZ*xR2Wy%D>HUI z0-m9+E><3pACS}Ibbg^iQFsaACs3u29YO2CBm14#6`HE+XYxMKNgS62FyyOL>ULOO$j)##G=J+VKJp^K_{?l3x9I z5otS47K;_B*UB;8RuX(;7B`M_Z)T4do%ovZKX8P86n-o{{HYV4q+!0(ljjUG@g?f{ zBHu2P4M|HDtl)`(k3^FAUnmWS8X#SP@4uA;-;H4@boz@alMI9K`-9DWjm-KV_!Z-y z!I{g^r}SB{uph4uDEdF|8MKDI1C>b^*n5Hfp_FzQam908^t&DSWZq% z{tbK!;0rRIiNB=Wqw2~izA)BW8dl56?Q_2c`5ud-7bil2v<@TaY1^d_$CnYw)L$adln61oTVV-92g-+|xt z-gNjE^@(BX;}z>kz2dR&%wo(00#ka$j@uty!t?vV_VPlfg?!q2Ztw7JJTEL`)@=6o zZ0fqz_bTuw#42716d-(RlAWX#c!uk+O^$`xDh`!vR@Kppc#-Sj-_rzNvCK>NpZo*A zaDlr!{2iO=@8ixU0^ktZh~p9!%~xpGgNq5C@|WgrL;9`+PpT?VeprI%#Zc^jHxKKp zqk-}aw4G16+nlxS-9x+hO?!vuX?weVi*4)9A)4-qNxlgF#0R6FIXBE-P_wNbsFvXQ zyEysLf_~uLiLd)MqJPG=3p!j?zG}Kczm4!QlDm?+eCnNRsY93-5p zK`%n^3S;L>?hjHP(5ffcT?svGve% z4|ngUxUAY754D&TR*N zG47GWK-|m1BHHxkr}4Po^{I3PQ9O|RaWUSvq3ZCO1y4o3Sbt1v!u43B3Qlo~S^p3| za^(ihhwgIsI_ciAz%S+!{>4{^0fz1Ww~)4SVe$#4W4sq%l!a}ja-V+Lg6;bs`Xx@1 z&X>|NpU!B({@8u&N4!U(EacamN`=`sRy-L%7PcVFrFzuxg(f^OB?*MD+`rl8&aJD4`S8e+X zk>UEbKp3`mTp%p9mFcLqGUKYP%xE1^5sctQz_NQpwtYMHAby@r@-O1z*#4Wtc)uau%fon`)HneZ$uhM`|83gth|Px< z9{PYP=vSZIit#a=+>^R#_Y`VM!V)hb@m=+G^?3(DS6QJ{CuIf4{yQqa+59c(9dBe3Fohz^j&kS*!8r)Sl z>qo$SEofhISeZ(%xvwL9^=X~Lq2%G*^CVs({EoN6EyH~uMfXzBC(QK)-r(5bbwp%A z;rG~jlufdGo9o=_QNM%vfcc?rPFK$oS#Kx&Dxw#W`~1(YKQH}xi9-H$AND)Dt#-Sr z)mkm$2{wL9)+x&O@b~jkFUI-p`Z|KlaJpsn5o~9!;x^^(x5zYrc>6K3Yo=KN9qR(Wv|%bGGJe zC3q0Yuix%l-)Z)O^8)x5%eN0OKk8S#vHGN`o+(j=`Qr#Z&k=r!wWsG{&wkHhYPE5F z+AN6R4~*&e>)cqaR8i53jwK~wJcKzVdR7DvQtP!_-s>~Kuh88^kYW9Xn*H?n ze}Tsevmzho5xnIcDv|g-YoOiB6!nd#ZVx=Q+=G1c;h?6RUhv6YTpyR6h5378aIfm? zbppEQm*Wr7e+P%JSJz&+b&R%qHJ0EPL7j!YEqK0&7bh>r{4FvV^EId^VaMzHryYLx zeZA-*HS?F_weAcPc|KelZivv+1uiTf!qM8_ttg;AfLt+TQ=yJNkeTJ1i0jX<()6~X{{NYH-1opgZ}&ci zno$ex-^j;V`CJ^v5er?Y5x&+x^+U+2)HA}bIy{J9YV!8cquKr02tIL+NoZLxbfJmP z`&XTd^}&`CW>GP_eLV117C##o?3NVM8e^cLpF{W?w@ziB$U6R1Nddpbe3Va+I!G@_ z+f=A0Vf9dg?l_5sBK$t${Veo17vzEJRYMnq3msVfjH2qem+by67km<|FKf-O?#nsP zJxE>f|Lo;S$mq}zK9E<)&{=@o225cTX6r`H)^!Fe|khu!@2W_ zPNh?HQ{C3J?YRDslJz&v-24^&VT{k6!CgW6V?+9lIM*%-%@eTQuLDxY^3H*YmyWAvvu78d_U3dEHAb-NI zBhLeRd2BwC2LFQWKav|E&c7WlZ~t96XAizVryAPKzF($?kohFH6;d3|0p3$u^>q0k z4u}V$T=F9y$LZ(?r)9hUgZS5TWtQd%{7ByVBV~#+-iM({M>K{fTIzPyuOYO7SvP1G z0?Le#a*SSn1N@)&xnJ`3o1NlPBlv_<#?6hbrDb{(Uhs}^qv-I9z!&r?;KjJV6TBqR zv5kHEC}TaW+@PsAA5%Q)Eb3#Hkop*b%?clKy{5LAxjBb@e?5m^4Caf+T(OxM$Bbj* zgLwQUj&~As#B>bwTrggycy4KE!@kM4ymqg04WOP)*-0v}d z1NtquPmkN!NNF#>H4*waW3PN0Rkq~jYT7yF1Fy9P`KBS4!`8OY8>JTiZb$>wnZ=qBYSQ zX9J%&qe>b)Jb0i5`WdT8{fP&6`2-dB8xA$!B49l5jEF_iSvwoETcCHjg!sLF&RHvZ zJ94X3I5F+FfpPGkx*sru9S`&FDa@^j{%vxz=o)7m4ZTL_Q_8>O1en)a)_o_;o^QPo z`>&S`D^{@ct;Rz6=}hp6`f|FQk#VCC|3!4N)a23gi6Fm+OGZY+%Z-IaBt2~bVLj8tPx3Vz|{0baOfKSLjf?G{ldg(rT z>~pq0K`^vtD1EqWm^~ij$77G!?_&?8n8a%{PGJ0+e;CS+5AZP#`!aHMcX%o%QYfOU za@oIM5i5J5Vc*W>{lO-=!eWNFGwKs zaUi-nb@&?U-FOshw3e2YM4O5JX|l*VMdbpT~S7o{`(-^^AH(5r0S{ zp3%f1pJIY95I)7-o9)~m#?Qs-#eoD2YNE1P1W@}SnK#w-4GO{GHGgC*6g}=$W zh<9{5^=I`tdOFR%@Y4@5KYrr;E__J6rfPgjmgD(>pH?1S8U2Q|3H}o`5HZBR;e462 zNqQ|9c*q?*X^#Q>%CWXyr}S>>T|B`x9TD!n}8h zehWP=clwh!@Wr^kUdmls@R#oS6TgQq_?v?FrIx`T_TG{wSnrBdr(5G5@93hdb2pIl z+4YMwK}=j1Jso@{?n4u=R2@^lk}0;1T7PJRwC1{}X$b z|M8KvqctcD8n%t|Lv2ZvFbeuFQx>pzg?G?KV?8AFK2YDm?5>14TjieH1aBa}N9xf) zp^(8($eQpu%y6siMC!9S$-j}h< zeqI)qtJ0!P{6OT(ECMZdDxi;Ahx^C(a`R)3>IFOyjTM(|@miM+f{MU+0;JOW?py<6#3P)&!0{_m&^< z2%pe<*B+vO_#7)cevuzlVOjpy`@q9Hg{~Z`Rzn5-HK6*}z*urhSLs^|;NSIY<1bj> zu$siws=@Dg=T673Jp6ssu5Of*wo>Jn5-rXm|109y3KL?7C`*^H=S_$&Ix>5^>w7O! zxfWY$K4O?{J=oo8ANNrjpHZ8EkA*j{Z_YqQi%Mtl3yf!OywfAG4*UwXzC@;p2igXF zuySYd9gMdK)mhcqp%@ia6OVqyKN4aYHl@~h_=>jk7XEI#pNL;!WHgc(GBL-!ExE3?}mRbSuAn)nBa_j zAi*mbK`=i!MWNq|{N8NB2TxJ_qWGozC-~dN^^klUkHfe1+GRdS#T3`1ZpHe%%{AYp z+GU9DeYX5J>}R;nRtdt2z#;nhU)cvxFMirk(Wh%;>gln+MU2~kdZ?zjp4`5MJ}UC> zH@wdb%=RZ)J=MM441LEK%=t1hZ8Ub^%c`WCESr&xTw z?7Co12>qv(+x}ULGTNLpKzaYUT`#G4J|bCJH!LxYvNStHGDsD6Yz{l4N-<%eJ(?X`=_1} z;`qZ><+csBgVZ}_@xU|W+fHVD|8U{+FQ|!GZf`HedeM8k_jm36K1vF_0`KELPCmW( z^u+I*sF;jlk}sOsZ__UxbOs;D=nv^R9H@_Hu9hNyWUM#Yba~6e6;0!4yTr95k7ypn z&)`0C9-^d1|A=pdOGNve5Z~n4EGPNv(*0G-7loL)V1Lc>9o~9rd3x!=6FDRwPU<6K zwd?!v(VF7p3lWba%g+uWpBK;SEea3gbJpt>-EQ9#m~M4wXb)V;p@GV0Ape2@L1{9SR1LZL>z zTu10~;B)d{R%~AZK04~DjeHDC1xIN)xNMkuZuBP|pSn^}Xn;R4@|~pKdao)qZQH&` z1@typd@tW@z_N1mIq2aYV)YGIyFaq*|3tNt#Pj5SBWs}_<7&et^OfX})5rGD-tDkg zLiiY@zk*H%raQTrO(XfjefVB{&8nZOh?b!~=2OClnR<1?RsJx481-c2_vG=CjO@hh zMDSUR^(yw9*_6ctfNTQLy zCfAz|KCgZ7Qs{>o^-sO+g8hoWt&vlXuh)|GYquo#h`6b7@i%j^4ZH2JHQ8T;8#2>IoW?^SB+u|eeIe-^o{Mx@3 zwTs$=drbHasx>0`$>IUhCh@>WqDi6!l6nbSZ-n;c0aW8|2S0(}Nm!4Ne}W>oqL)TI zLE06a%53do#u5A%cDyZ4T_j!W3jKQMffBrHZb(@0a^4CK`20GIKgRyKsDtW?9HQGF zuzVT3n*)VcFh8Om9bJ?J{^9Vh-jWlVar8yu#lI~vUvpd<6S|A_6jiZ}_@j>JaIH9j zoPQ~5&L5Tv=&|PpHRS@|pq~wlU2zC{6`GbG>nEMCpuS)KAB(BjzwORGdTDpjM#P(} zzKzTM?TtsO+N!{>VeeO(C2k6SXg`4UmW{89)t5KXTKbj=e{>h{&j|i8`x$&1qQ4~n zZbIaVa8yxKF$q(*VmvxubGa6yDFq(`ey3QU{cH}qUzyi`3T>ii$t1|)79alc?+YV* z1UYvaM;Ma%-)~IMThwoR&NfmQOgT>K$x8#?!^^J99727beRg*$+I;>EwV|!0l!{4G zZ{3RhQPqW7?QvZIJv+WvkN!35O3*d8FtxysSUy;YGDyj9;y2;8AczJrrH7 zn0Lt%_dg4Gfc&=p$dmImwdb*ZuzC)$T8=6Kc(ZWf^f^Qi<{jS5^Xz^v-*v$?^k2xb zgJqe=WE05w2!2WRPy<4##Exo*{t)Kxm|sM{L}#@gqt?FcX~B5?h_}bD74@~$cVc}n z+7md_T$I(oYr0)(d(q#vDeljrN6J4e&nvo~_W)eyPQ+>8AdX zCrI$&JflW_@14|@sabo<_t7z#Yf1hkKq5)tH&_i|ePsEY2QAxYv>fXz#rnn8zfO+! zjs7BICi;VKV8sjeDOMS%uWWoBzQKGkTFZ9;V81VjpIwgrSoPeua#dP^C0oCO^@HogjTJYBbQU3&7U%@}c z>(%Nvu?+)lRJzeGMa9IcoTKQO@9 z#eP<_RJ6sf^hd<+8<*qwbv%2KEbNku@D)hC#oK%j!6uJen@Bt1LlPfmZ&Y`8Ybp4H zEXR1+H=J@kQVO{e)Nkx@!Fn}KYL}+G)C0d$wtj;`0lH!h13yMzH|MRNshNI z7il83;cHBOte&U_p_x2;3;+^VLEtLkpR37H%UC&q0TfHmHnrA(xN6*yEm^F^vpD=Tbb!Rv0 ze`3sk1+*8i`WGo-tRgh2SLwm?m6^%R;Ah%Hj&A~9Va5$(^;hBN%6@P0l((Mul&7V} zv>$n<2Ol~s;_;awRW-pcbZ;SFTzz2Zz)(EP$9NCVGomr_2FVEE`U*eA^9gz#JQUm& zsUvs=>WvugHqK6AH1(SBGYFm$a?kqS^%~TlkMk`de2nDlmAcBCl??bSg~acszUNMl zOtZd%9%GCr?Kz4t&4xPoS>}u)c!V5YmRA))DZazY$KVF}BApTFj0Y z_!U3+9`U7C@Dl+)jK65Y#Ten_@z#alb1b}n zeir-p@be+~!^TlPb(zi$4?Ck3%aUq zR#VUm0Y8H2dmCaQG7k<-@D#NFBU&T6A-?4yJTjiGck!F#W2~RqWBlHhXXho!p*mQ+ z1;>j8iIX(TwZJ>^J7?lymDj>vTT~@li>J>?rUnbRBcHuVDTL2 zlPV`EH^Ogtez}5NpCHULl<(7d6#6zF6TZgMmv&KNPk|?;kV@_F_x~5ZkJ~o6Zws|M z@y*08qBkYVSGrOs@yR6=Yb)%wVU%Gl3i(ioOlPr!M#sLpV)2KjBkS zUs^vX8;sK((7=yU_YnIJ!Aia?@mbEB`?9WNQqhJ2drp%Pg+i0`r4;cz7*uAROpX4*^@O(L^U8FbMdflLp z!R9-m&m-Qe&^Ho%gy0(&$25HTXzP_WYUWE_JKBLmk=-#j(o|%BLiS6sviMDvdxrN> z`M7?Z&)&-`f%7l#4c_;xo}opgL->XA{X_64A^R2hUGw=?v7A3l{B+yIU|Htzdv(J4 zd}F?l7s}38vfm={oPpcqs3>qaLQT6qc3~RBr0Fv+WPQDBEZyaG^9au%j~Lzov=1qOU}AiNf%$!F*K)?M&IkS@Z_jA)>kBG$ngX}h?m6@xKjhZgeB4Y+%=Glk77W0&$g!>dY$La z+`i3@j}iS0@k{<4SU@M6^fMYzt9`!(eqv|%?gX!xB_i&uVJY<4z&AvXBU>5I1Rf8R z3B9AnKiYu$k@K^_AcWoz@DsuhvC0g57=(`r&k$=8_atsk+)P2AgIte4Ut;s6O=*Jg zj&SxH=x5yjt?CZ@_ba9+DJNt9Feqd{^sbp_c$*FKQR~eP@P4!Ymws=N-&XAB{@eF^ z-=n@pjK{d{E!cncpZJZr`Z%+Rw##7o7!}L_Lj<~o3to84z6iW$o>N(i_ zxsvf@BALiCYV~Dyylv4%H``X3WzzXZyeoe5ZF!tLVIKC^Y`p0F->|EVAstRM_~9fT zI8(Gu6JEWl68TWVPmmW?t5o%lj5*22llUfg>)FjR$FV$D3JK!A5@(In)^PoyB|)%s2M>0w)H|y}b8onaR&&or8mPbmN*15?_<}mb+e7aiQlz z7w`!-p5C}JX|c@lxh3LlHvWC5D!wXSyWU_r-zUQsLvGT`|I^zz*m|a|;AHDOGT%si zIJoKc*A#4>4$g5MUb4q`%r=Qzw248^*@=2a>-LlK_ ze}1!Xn0|IVA|5CEf1jSs6)&SgzAFr=uzLDr)9sHsASwe+3LEyRuc(vkB|0HS?dO#o1viukvA7GatOK3>wMSR2J zPx7RrNktRO;2{G35B}bxQ`}*G#eXNg>JVE`6l;iW&OBNWV8TaU*8f{C+l>1|d`R>( ztQ)uu!Uxm~+WuPlzVGqA&f`|vcERs=o$r@jk=QT9@pEk(JO?Q&I+5si(uQ`Xlj&)r zsL8(pzmRixI#tAVUo}t;OPZ5Xp>JNM`>tiW#u9p+n`=MB{w-G~tzFZ%iJtcA-EYZ! zc=80qo{z?a#2n_UAyK$8XcNAL{!?d9}^+nU?ZA2rsSeEoG$ zkwD3hH`Rk}S`*h7*eX~JskQ&!Z227do?S|P zTTkl+YQ)d@or*82eo!u!k$9ZUcfQ6-Q&9T^e#S<;Z1r`C;^+BK-y6~2VU+b*8>(w`(hE*~ZHXbpgW z)=J<#_&w)bYKW?Fa-;1+SwAuNAwpKd-@C<3jG7y?B9I0jf}C$g zxi3BwpVN74{g}LP|N0hT0VkJ|K4jx#?i;~1-3H4796=o3h4SL)*V*e}A=QbZYdA=oi#-*%+7yF;lt9BTw}3-+3aN(XYgKNhnl9 zucDTMo@`bU##e<})w-s}pX_H^aDV)PI9-*#1$rgM@tWB0m1F(Dr-APHh2XVvi^Gc* z8@iPY@Jcpcqu%1NIN$I2D3kt2&6#9NHa;HF7qM*?wt1DtZzlKw_-OFwlSnEj>qetq zMN^9RD;EMO8+V)pzb=^7=UK;7S!*WrxwHH-Ja0MV|3J8w2^T&$>d~lX78>8TSdZ{L z1y-SwJRn+B_dNYe@SW^=Vv%bC@Tpn;pADY{9?B89>?(j>-5Sf#A0Q~DWoO8C@o#UvYk3O)69`U#x^Tb;gpGu>CiTvKv+W>slJCpCp zwW26j?!-{S=iqTZ=I$3z+g2Z(ZH0PHoo$6xGDk@B&npZD8w!Gd)LK@4NMC%FYVQyUTE*VdgImhi!#<20eh+)P%EfOCusqUb0Ji$MF zc+qx0_}2RhC#73gg(9DIEp!DL4^(w~LFi08ub-DG%F;CoN+X%^9e&Tu%6r;|-BrNT z&XuHtkK(}<^Q4L!I{M4A%5>y+xm+vTBTDE8)}Ar8@jR6n$F%0m?sP5s%hpArEJQm! zV)rJr%{VU8jvhsPRAX#Ij!3Lj0-qh9+?32C@zgZi)sp%jX-!PwW*1!V`AscfYe$_V zc*}RVKhG?u?2sFoJ-};rFF^l9B}o!<8tO{XKLo#!JMRp?v0WY61N>q)sSomwjmXa~ z%r2#?;D?I*^J3)zWoBtp3x)5=^YG;Oa&oj?T~xXq(F2uR{NnISX>(~ei$~!3*+LJQ z=vR{VGvF6QPhsn*twe9b=;u07IFWrHp?>5Ujz>Jn*}5M0lZJW{oL}y-Nyb^vk%8}_ zB=sd{DzQFS?m>RqzEC%XVS=-xDw3*zU(B;t+M)lQQ=$r@3zRw!iUc3&KdCwtS>tTwpW5u0RP(>mw-&{_jk-@<9ljBjPe5TAv{`prA6YNn_Jf2Hb9aq}AB1KeFc^P&g-LOURGiPuFH^nK<KSIG*%35##_LgkOmDxuJTdkX_$u;Gc`{ zmt9p~zOF7)lkbWDNZHMs?D|dgb&1}G0D3MGXhN9Uz`G?2Z9Yc*lm&}_#1^l=c?|-) zbb9*+f`^oC`e~eO6!;+Ie85lc`-E}X`J-u95PYNBf4Bb_&X-OsUV-yRwM-mZsti%G z_y)e`QQ*_A{$sUp@}7S-;Qsb=M)-as*Xxq85wi*NY5eoant6Diyx}KUd0X-6F%{C; z`1>z;=lyywfbW=A?l2qsWoNM{WaG-dV^rG9RQFr>y&I9pMs2QZK?d zCnh%O$o-7X$tU$Ao}%2e%Ht2~sChfHi6049B*{6is=Gjs@!3^_{$Kg5gwsT)o0h1nla1rxM z`=GC*t+$T&jr8LBxX@duSJYzv|8m?lod2URkL%*bRRhAWrq3bo^J&h;dQobn>jF|Q zGVAKJtG2IDpNID;!85Y;o;RFjo-2{x-h2(?&*{2LWnyn9-mh_NJ#Y5r16$U6gnQ7^ z&;>+KV^Z+6yFSI<{WSEqZejmCi&`7mvZU<<@(tr#alU0qNe+ePuPw2^XZaU`o#N0n zA^X9f#qY0S6 z6Qgn{{LY0E100?!ClE! z870)Te_qD{4=C2I*Iq6zRujGj!7l`vVON#v61E+QzZdYAg%Q6!@HJS!lFM&whi$tM zkw8y_93N0EEEnNJ{8`rkpQs;Sv!G@H>g$LeDE=P#PqkR>eA(oGvP&_Ce8jXUXd=NY z0($QDXztblF9AOT*HfjttE<3A=o`t_w=lyYA?$iW_!&5UEuS75T_)sfGxfj~t{nuedJ_EF3A=kXoAUFGkdxz7`>8Cs0W_^$N zKe_(rjX(RMH1;cp;&FQkpR==y-9P31+kL_p@83Yl;n-}?I`CO<=3+jKiLto`#>QVJ zJ%sd84`%(f;-_VVe-A#Zd|`r5!nfv|{E*LEwiWY@KO`=QNj(yz#rInxvKuKGCGN$K;jRQ?;jVEqG-GYe9GZ9tB%@xswYx~8SH%E4?6XD z>JI7M%vgveZt>kR>Va-vW(!59#&Cir$_%i+EhQWG|Wp% z9SQ0s{e`~=9%~mVO|^VuiU%hN65KO3#X_&qc)cE;f&|q@=97{5270!uIL-dr)in6! zcs}q?4@yb7UIzVGWBlCE(%1<7VLnxW{3_OyUajhqcBXcX3D1;k6Agz9vMN)(2S3Ux z)u~b}HR*kL)W!GQc@bYhb-1wcc|c@B!~^~tJ{@D^k2qcxT;-MXps5hd#$SAAm&=iz zaat4pwhQ*+?07cz55reEixq+*#DBo6@H}gvrR~;k4?oJ_Cl|f2-_4WC{5*f)Q}$O_ z{|V1-$#vh{CDEq(6_0G-Q#~~Bg;#96IjMo)Z`E&AjQeBH7u&M_@#!t=Pta21_z-Z# z-Z4sP8-0F!Z*w*FuY7A~-VW$ft$uo5!9%?p)I1u27*e#Wt>qHLI}~S!RXO3CHI8nB zU+S5*M@2n*Th~ylotIy9!2HYIR9LnaeC}t0aZ(a5K8)#5b(KNi*2wSKyUI7!;U~+# zF&!&Zc=~Uw+82*Mera-a6_t2Q4sx@1!TT%=VkFqc%9~i-voXTBe={@c20JFMDT3# zy#>ckR6Snz4yhkoa1s0kRe_Q3I-<8Aju*tsWW#FU6Kwqg_fg@%#mBWe;qNb4|4`;1 zqkj?MKajsy7Zjdh@wz-?y~gm`8*92I-r!<9vwRZI@|Yt#cfZ*~_*8_SILh8^j_8<6 z4`t8tE0{6Q1P}f1ExSH4p5=mJ{(#vd%SR@D$1>EL^eS3cksRR&f@ z93QWaRSPf&gmoRVPqClKR~h*sru*jxb5eFFtM-}dK|D_#DEsNuztHb>WA_vP?7tmw z*gTADn(wh?aWZdL7u2U2IP~R%3+FC)viT=Gzc2VJ#r>*=$HFgHZ6N%dlN44Y3v8`iVp zx#G)n$@>xeC%NYX;Ug-QlEQD7?a!p^Va4KhtJjo>r;hj>ctml;mR+xX$$0it8kPwSXUp zub{|=_?0%jME*aZkoA`$dKHAfvCi^4=^EK3l`wnk?;ZGl+KhCT-%eM9&jCINe^By@ z^NP2F=ug;<1>fzJ(}Tc<;2L`Dy(P0P!56cTIW~XOTq>M2|Mv}c$gith+t~OD$4lPD z`}J9H*UmMPbjshMay;P^Qiske4~ytdUKw}%0hYsk};lrc7(xoRwGoFpLRv4NS-tC^!y*F2&3NLG8dVt*(Sx%k<%`O|5m3g7zx>$kJB_2LQp z%~8LjB=|+3EF?9$1NovF;1>qmPvL>4u&S_5f@hHaw#{GP5Z5Go0(^q4CkaaYz3O)@ z{MCqFXD9a0o{CE7iS*FBjef1m65qA2TVA)A#WQ*_KCxHU0HK5)#%}0^%GciZ$x{vG z4N(CWy9s||R@l<8M=g(_cW9w}20qS&ioBunHXTC;SQP4je>qayk&4;h{(VV9% zpN%5;g?EeiZv16jPqkz;>QxwyQ<%6_f%*ir2_IvEmrID^NJ}N~n>lDRS24fBoIMXx z<5H#*zK11eqqsG!H4Ni7wxAvH{go?^*!UqG_y>6(ay-O|vP2EFht>CB7MLFixVd&; zI`E7oI^Gzx4Jc56}*foSg^6X){%W`WKvkS&Cc8_2B{V4~%WX{|Iv{bpu}V z?~xYF-&rGg0`Q6lSRZ1f;i}W~IEP97%mb`%$HFw3Dv?x3+61rQx{I|U4g6=*@2w*I zi{iOzwHR}N8uxtFUEJ@oBN3^2H=uVmzud?-5%ZnHU+W!i3dV|HP6Z>hG8@^5ztW&3ZHP3h9U3-qp>N8(`kTXSu=s~6SZ zr2KbY6Z@k7kgt!Cf={_Cs(kKOs3#WiU6K@7kIR#vd*gj#M(~bZnBTt9&*x%%aYKd0 z1wFtgtL$EE!ug%EvTr=m_8O?MF%_5BpuT@jL33F%=KC0*1~sndGc$$z<6~{dD1}`< z@hf>h{)_lMoA+E79#njo4?L*h_xmjWiT1bHbqD)}j^-6ptrvdz!ecXj&pRrf)i0#-jd~Xopw~V}v0D#*;RfQLnmjFZ1^YgH4!;mQ zpJln?hgL5|&*>M5H_LZ0^0kY0Iczpx$fH*p@q}EzXA>TMrkyv?1qS9D2KXHO%4PVkKh33e3{M#3OIVe92f z&Trea?fi~rf@j>r_>eKddY31G`DA}U>Oe;M;VU_opQvVEw)7*%;N8siVu+{YLoM7KgdlP~R{} zHwLCGYF4W8YxP+$w~hAXe;A>#jhQK7MZ%jeH=kD!O~a%gCX zo$ryT9|2xq@>3Gt`?H%IU!)q*vlziMrUA>a9gcWI{749%;n5-Pa4C>=P`1BWEW_V_ zaAxt>D^y?q1N}~;eg<<`d2DcaQ0Oh1O@1$A@i*_Y&lma_1ix519IBQmB?pB*k+X?D z$E@)me8^tUpH3`(F<0z-M||JuK7H2d4fIImA-$o!VZFgk)S18SSwGlo;>+U8?$4<+ z3*W3ky$Sa)=U40d{C4_-_T1CJdz_kxp9%b`MlZT;L1F$}<&;}>2nVU&%j&(KARqMP z@RK|G-{AjY)W?V_h^b6&OdX_Gq8{A~dXY5=!?6Rg3ab6eTCyL@o&EHS|9+V9KK+-? zd@0rk*?CW;lP0{6&6nc&PK3T!NJCIR(c2{ZS*z=|g^?!@$f?{b1m9q4<~{njYgC^j z>ZO+L!*~kniRel0$r#3X8Gj4orDQ?;{C_;6{7iVpK_;-yNs0XCNW6U3@%9Bj%}25k z{R4T4_KNx^$xri1d_cxmjw)AQc(Lgs_UEMDgt2f5`?zVv@Cw?|?K=|RjLr}3%IP}{ zJ+=}4g5P@CS=kFeQ+&Nlym3a)hq^Cl@I`8IJptL`e6MO}=m!|%jlLJEgdZh8n*R^K zcrH3@=WAz2V}6uleJf<7)$=H=7m4pk{3j4hH{usT zjJPGSDN$*{Gv0bNI`6yGHL37(VfhwOx{$%p=b_iA+yvIo68ayVu}$$Mrg+9y8np79 zda%{RPv=q+q-Wq4m5+ECzhAG}9KTr%J{jUYf_HpTELIPz8MVnDc2yK=QB8OCI8q^cSvGob(%FY#K6)Fo!z5NNy z_Zfdm4*Mm@{AfGiMHo-E1wlu%YAafS-%KU(_lYLorirg7z6M^$;^_e@&%*Uu_yyyA zK=2IvyE4sP`E5CQpFGF&{=fd!dIMk(w%!5Pf96Rg7$i?>$#}Vn>*Z2ZKBc0%*!m8P z7ki#B&tLQv&om$HGi99`O*Uhy7g^^Zl{(~o_@@cq5-`z>v@QFXNuT8}$KM=&c0J%~ znxCHC!V*!IXs2m>_I>qq?CDWYN0I9%c>7x&4qeh7sgBf-Wnq1Q-I%-A`5@@Y8td6c zT``aPYUiozWIZ9{LGGp;)%>x3F43nX_}sd+*T!9Y``Y)^O16GOz9LNJVVKf72IJRQ zZ?ZIY%fS`D!N1got*@BEw>iwe$A67BJHEYlo%3Km0Y2!6`ZVyjeD`4uy}?|x$PTi-a4u9zxk~HXkT}CH@lykZse~W8=v?^NPP%{`W0OZ z{(j6I^VdrT)((>SOV)3lHZG@KUjAQk+JYy1;_OE3&ndVz@*$VZdtNfG^JVTy& zYTJS!KTioAb9EEp7xk^|3@bEK@J#rupnuWe(XL|#D(3Jq@IT~dn80rDa-VC&52_S= z1ZK;@jY1bIXUgb*%Cz$mBz|}O?wa&Bhfg)lQu9hJfF~I7L9=ve(e8`8|F>U|x+@f= zs}#a|_%Y{#KRY(8fqj3P_#2u#h=(+HO!M=UL8g?A@-Q>af3CAsx<9Yz2AwA$csTr< z6m#}AVmuQ35B+V=StY$uaufK5vHmQoyrhQF)oV=rt$@1;J-=%2qW%%<0q})&z3%Sr zW*-{NMtz~6Wux22{WR_;?B`fMoOxi_y*-t6_eOq?;ijg7P^{etJmUg+p9)@iCU{Et z=5)-RsfQLBn8Swc-JbbY(Ue7v+2Q|!U%{Cs+8{&xD=9MDYenK?kxN*XYMAm*Jba7j ze_xC1X@Dj@?J!|8srS<}N)TP{XClrPU1Ub*UOS(aiuc=) zFiB*$$d&$K{M(Xl#2;@2k@g~YYl?I2pfC7mQ#ebxCnrFkb(_QOX%AREj%2>Gxh-Wa z3>X8vh70|^@3>_Xsi2tMq`o0tAKy$>3bUzs&lRt*vRJN9lxfBZ1d1QYo zaYj0;j2`#ge>RVi|G-uGXpXk@(Y0P{*5n`(}=O{ct) z++vyT^l{F~h>&^&8QC5si9|@wgAC%TC2k zmpQixAA#3krA!@hka*^OXG%yn^_z?&?VXEBPhr zJ>l0%_!m=~k1qo9mnWlBlPAU$7Nm4or`^~$rdqO$w~tw|}oiT58jEHDfqz)>3YCl@f^cZ*h? zRduQKRE0Oo&uC6*+1rxRl0qqx^TD@}Z#8>i*6pE{{SV&&f4XGtt+hhF|9(<`GK!~C zvFkPX90c!>`{s{Qt?4;VRqpJ+kNv{_fwbZL$D&a5U*lhBk2V+a6#n@8jM2vWmFWqr zo)8^iH_#l1=g+a=F7eYe&}q@5pWuAonXfiK;jcZ3dKOl%G=Sq}E}I9w2-*an;Bq7q zujrmV;CDPMAIKU;*OMQD^JA$o`C~Nn!Df z(&1~}xvJPiVRp^W*Kt2Zs!)d9kEy-u|7#OI$VVgoD!?oJ3BLq*3P%mcS5uqo9Bnod)gPIplf>A4MY3wz6&X51C)C;+Bil zc=Qjs-f*#7nCw^`wZMoMU2F}PDm6G?n#G(ecs}mdn&ZqRrUm*lj#uzJ>^yHZx3(HI zm=7KI@%J7c&U2j}mTIZp<{fu%ytiwr;(GHF=xg3>Ao>!UTa|Nw=(fi^em1nH~m{RQQ zy%++9;9n3wRQZQoKl4iynQv*l-^lUXHw13jwy9$)sfTCri8o+uis$f=Z@c->i;>TF zjq!On`Sn=p`KwJN-d_>AT3WiO%@X?`wjN~+prs#kv??0)-Z($>+@*FUO4Nf*M}7$H zWtUv`r7W*l!s=(>ddEDPe1Bzg2}APN_r4;0rUdhsmKlCj;h~$gUf^$42Qfh!+iZeA zy})aM0S@36i*t)F^) z=f#1y49t4$_bZsLKB}_FnbpVWiqqxjE8thM-m)9@9I-9%d(bw3p8>s0;0@akZ>yxC zflrkInNzgd403n5Q9Q#4aV@DJio0z6|T z8*f41li&}6hd~d+!XCB|Jx{j1eaZI5mX^J2{Rxf_sXEPJkB>0o8G^+xoBm#?o7 zYJiv66Ft$ef%L}a%&>>_A74G%u>j{kz&Xo*BzQx=e>d|d=w*a=hY!cXe~2z$iV7dZ-B4C9~8h-i30vW_~TW~uPtX=&OV`5g|PAHQ=XTXC{px*QvI%}{T%D9 z?*{ve6Y4Ff5&w|((x+voZ^o6F^g{Qi9X0BOqFw|0XXgEES>e&6-9I27$mZ9l9=1qH zU(~vq)JK#2-;5xK+%K~hCSkujm*5|J>%*Dtnq=Y^#Ohbf`rGfnE6?surMv!pg89a{ z=!8{vi5}i0J|XyoIE9}gNd6+3=-m)KyN_(HTwvFG;C}>vuS45I<$Y z@G|6=-y{5O9>tY-Dt)ykeUOPLhra*C%P;8XHs6u`?Z=@m(NZ&+1^Vr}i8uJ73 zklfu&YJS~aw*-8pS^IFjcaGHq;6DTOtbjegZpD1`w1V9UW4+|T$+=)aYZy}P`3Q6j4S{#-J@1n?^J-TA#YU2vJzmz~gW z-JjHS(mcO_+_%Hh{UR%8KeMsVCG9KO!To@!@q?7_*Wb@r0RZObz)8r4C#u-Aepe3$B^n#6# zPZ*e*?%My5^WptQ{4AIVeYiec7ycN}pXFQqhl)OH_qQcYwIg1~erM`Vi`>Z%{hw2_ z1ikIJ-=fmoy0dND4EX!CqMWo9M@;t!D;7JDmDPmVDXK`--dj!^n=1Mf{&2-_Lh@n_{96Gpl5t}d>yX8t^QH{ z8D>5Fd5q(GSy*V|MzgJ`7d6%w*&9R#7j4`|6Mt&(tvCO9_2HWz$ofq12R zkKu2+jLi3`P66V5K4oi2JWu+o*zogE!O+F?SdZEGniI|m&r@|nFE^OQb8MSJu7-q& z2wuqgwMK|25Zs>VG5=Y7z%kxE_(zvh9Ma#nFuz8vw^;9SZ|h&+H?Vj`N%|G_j^^-T zs{Jy1ymO|1N~u4yoFaH6j^|2z{pG^$bAvLu%yf>X5Pf1@NJDG(2 zj4J90*h<|deXtVdSB7SOM!v;3o|f^0CR|-H%$VBHEBblz&nvEydbFz;zk;K}HqVwg z=ye+L2r4f;e`_`L6CBy~UA|Q`Pk2d!_+|tT!Fng zB~te+!7H=>@kJi;uZAg@Wn}!2@i{9}oGEz8xlP#vU&8a-Z+@eux3}9sizceS-%9em zDpgCX-a!B9KK%VY#AC_I=4Pg}j+&jJx0sLjMdmj3pSK3;O#QWxuM(+#RAD~{KVFP4 zE+;HIzAq4XbR6Lm$@#W7Y8a+Pk9s`TUnczP-mTgXH8bgzhcwvl$;(>v`$7xNvdQx$ zOh{RK4f3Ji%H>;FO|@FVq4sttNPKI? zaTldIlubvxv*8u;`#v4QjvW_I*AYHO58~l-s=so3axa9Ty@B{)e9YgQyti?8BVBWE z724J;sm&QWz1*MFOK^E2NmOBG7qvHMx*6~azO7Z9OT}3oy)*RQ=egKF@OjSs z9OnVb|KsPoz?a}BL_G%W0e;F#9pu!3*LK6x0s3um&rc2C$N2z1SS9b!QU5$!F7%ZTLTotHtK2V!+sN+=_^W+@ zcewrg|44iDu%@o{Z8%{N$Ce0+9(zth0EcQ@LR4(E?FOQVc3_HVZI6rrwYJQuLyd?) zoF@>Y)}bm0sI(5CL}9lgV}w@4fkAo{We&$GV+i}Z*9z(Tz3=aj_xi4neO+GHa__9Y z_S$Q$y`KBIpZn=DD1mQ{w}zxqwJkfh{kzvwfN%CAyMr~4&y*d`Q#9ax*iW=yAW-s| zPc78u;1de$ZS5zE-XBl(JxTvac#+MzI30`l64Ku(s;w&Bblr5O!eaYt;1x<;Y;$z; zQ}8jsx9Egk{$>O(ko*?q7V7$!L&~?OhWE(x=^m=V_09smz@iOkNnk0 z@QN!a+xQ5?0`b>Zg?785S7SewoBh)eT|dZq%)f^Ql|gk)^*zBaU{5ONhP#GKn$4Tp z5{G<}FY`+d`@3!*PWWcop8N*HPYmZ17494HKH+mDo}6xsAM*@JC;2Dbcq)tb`MS-_ z;zU}uL^dH$-X8)zE>>1^Md}0wk_x#ijolsEL z^{@u~@LTOvzlkX;w$q}1Ox3sT@w^9bMKx?Y?w@K=F< z1N;N$?W3iN^@?M#*F$N1i+!}PA-eNeC%eRW-qLJd#P^C$ExY5)B!ZuaCF|AKf#Wed zaUScDtNFF1>JPYFhQz~Qz9)q22&*j6Y1t)7^X_B4^$S`SrcyONVn?Hl^Fd7LqJkV9 z^5G;+CuKKhkJ&0!M>$g&I-S(-ByyKFT`b**_Dyd>{XS;TS6r2~7n1fi;d*;_=sRuO zl){c)NcBj%HlMjDmGY!GPs&O@Pcr+Ku0+dL80#bUmrjTLk`=T*WxyQvB5bM*oTu&Q z^V08YGdEqtd7^is^p+%-rfCW>-lQ!AKk(tDs!IkRH?m8lj|hIncbBQMwTL%b;z-Lu z*8#UYL3|$cRR~_SBs@+UF5l7){35fRv?tIzDeg>MEn601#3urso8?gSVo)aayGlws zI&?RHM|h;*dhpQ-6;+F?#^QQoS#zyDy%YHyR1V=ZzJw%P*{;?y+dUKn&p45-&eD47 zEZK?>SHj0|33b`#R)+ZI5xlVfE`+{kZBoZsL*@{}%yCQJM)n`x16vHIhM0AJcNTUnG2om6eycBz@9R#G6um44ISfgfzSU8O-WS^$klnPXFn) zoj#A@U(dSR(cp{rl-Q;&kth+LVa&I-`kLzSF6my#Gx<^cA}T;QTjKmR)!QI=27(jP z{hqtLBK&N8uegx4A@i@#(2YX<=WEb@k4*kUe$V*l%o*9v&GE?3b^dhKmZ3lc;n$P> z8o!BudU;5ZKiOXqyyQTaZ>8uuA9|(0Ll$9t_RGsd<3eRjn2`^jaCHC9ygdVZ*e0WY zcYDLuCkYKF8<{Ml|F>aO-#_|4>pQ`mze4%=FK@m+e>7n2GUmdX8!PJ2JsK_YlMC5GV3{-K_MU z5HaOTka#~NY}&;Bg#4*EpMq>o^AO|vcbQ(Es4|s}dS)sW$yY+I_mlcaef*2AGbFz% z%HzRLA~}tPw~YLa+?{DgymR4CV_$%;k+Q>>pP2<;1Nlt2b-HYwJX;jZ{`tG*O8kDE zUVvy9c^~`Jx@4jcGX3m?+Y_2BU$aNd)3$)05oy?OxQrZr?47xiWZ)S=z&3uu!K{@~ z{=})SQyr;8$>3xA&x{AYwk9*|#q8%6|HXco+85&jX9!O$t44kt;03@V*1D!!^f^6_ zC;t1ZA0xk)B-*jmb7<`_|3T@|Bl$xRW$nhSwf*P`@a;fp%%aRAhDO5gCic$qp-5e{ zR(cqC7x8~9-;tR4IlzJ^}I7dOQ{x9zpigTK6XGyGZJ13m?z1!+5oKak)RZgKw0 zRxeX7GufLTAs@SZUgBPs)=s$ZeeJvA#uR!C$ z%caG|#oDG0lfAJ}C43wRk15grzwja1PX=54I`+SBGB0X&9>RLWvsqDw&Zizn^9h=x#^7+ zz(XirV1HZGvF!GjPfh*#p7)ygn>&W~uxC;!|6=b@R%L{IE#I_XH;lS&cf@YRLW*CY zKK_ufNAyAzO7K#`M|oHE`MGaZd;Zn~)@b6ufEO#+VLW3B&=i#hdhAB~Tlt}0Quk5a z+j`hb#9mRBS!9o{c&BN}@Oa=BbX(>v%abRWu6Kam{H)Uo9w+$x)r6Hn$w$EIpX7Sz8C6@vNUlF*30?C z{taIjc*pv@0Q@7PKYsV%va;pg%LCbAdp7gJsq?2Mp5n93E;Qan|4GfbIIHwgCjUOK z*1A4&DCP;%TtoA-NFKSgh+EvOm>f~ZwSRz*`@pT$2l`|zFZ)lkeZa@X*gu};^)PoH zp3b9uj6}m#t_*w(-ybdKBR@&iUyaWjAA)}mz7fXfI;Kv9j5#mZvsWpf|A&R@IfYJL z@MnX+kMrAAhgP4~{0uzK7(cZ$G$b^_@jFLTJeNd5=LiSaYKPFA~YAfT4ugT($!RQ*!-hvtvn zEYV*;eH)v7dmWxzULpLD&1f(GHt&UXtF*&3{wzb?Lo>94Rl+Lyq_2QSa7CPPzlr%z z;2Xyig#c>xoQPkn_CNRnfOAt zP7Uj;ha+Ff$N0YTgbvKqz&C-%Q+smqFB9FCn(r}Z+W)F=zxJH#eQWW2xfN~CsJ{v8OAXpD8=O5b;)Uxyynl)Z1T}g$c<*rDZtCx>i)|M( z6`xz6y%cXS?Co3EH_0%Otmnt&7*BfnHMa<11i_cdeqv#=;_wZ%VHdIgzX9G@t-rUF z;yW2eeM+0WJiVNo_>#nT!miV~x2oxU!|(YeZYA3*kZ+#&Z}5Ao7Uz3gREa8TuVX(XxVlV#v+hDW z@E)qSbyoM2E<+crBiEDlM%k}O2V($yJ!Ad+E#~5X2o~_MzP*))_sRP?BKoH0W+CRo zSA-A2yD#e7R+~{v_DeMwU*f)~!I+MiTK3Epnm;VYd^gkH{WMG&k?k(xTyCw z;d;8eq`R%V z+_2xkLf?YKLj-7c?95)!_6AdVTSej(KJ%A*Xg5?J17ChQ>~T)rDedIF;JsjXC7o;k zgWwH(AKn4$=ZslysO4wSBUrRhIy=##n_2RY7vH_a_-?;4)DFObz4}*IcMQg}wZNY5 zE%=MM+Eg@f8tsn>s=Ym=?_wrc%y7tqKWeDHt3q3Jgh^hwC=~Y-xVwZME{A{Csw8Sab*tZw?x5O;#F@VsD? zYa<+AAufj=sMS^})uUjMfAv1wnQF=$Y~+mBkzQUIl@V zdItP);2C2lVtytkXm5eZLii$%|KgN!hUmKdIt}zbEwe~`iRU%(HSo9FNxVtuBJ}Tg zVe*#B<$cWP5!YieUY%UJ;p%s}?yBad##H_| zrfc)&Y41-X`l}=#s?x61PHVTxjnXu6)?oc8-qMj+R;Fc>9nuN@LHOW=k09Lb`E5F`ulA~>>#uO1)ff3SL)@5b z7o*-qX<|OfPXYb*X2{p;*px(?Z}Y{{%N`PQR}EtYen&L)@K5-xbWjOI1n)rmkPmT# zjoL!He&3k|!~Bb;sa{^=Ett{N{^oudp;=t@;rVRf7cH>Am7`pi%hqhe_}eb+Bk?iw zyhV#uu@_;VgAaoH6FgvXpynIl!Nt~;4`F6T^Pe!~j*|#pF(Y`Huk0%9`6W`Se>#e{ zUh(kGZ(4@vgP=aB?J64Xp#5IP^Mo&=z48ApZ`JQTT9wY@Bvqw#P1d1?L##JA6H#7a=Pn zC>|kl_doZj67fuqj|jfR_fA%qHv*p_`X}Uh-Aj)Bcr!nTT@3wA^enZ)3GX) zVIRMp@O@0}k%3%h6!a{}{ar+=%xpz1J91klY3~OP+scrS82ChDIw`wtQla-O_n7PGg8yU+iO1MGK6kt#Hr5^c@A)VzU0?cj$MvW6 zGc)eb(qVpBB}wwa@~*Wr_&z_t{2A5ueVd{d?+5-<5|832ST?>~+gpwNsFc4r*~3-x zk>nE_=t*rP{(~u}Eq?MxK0mfq(9pRA`Nu~Mce9lGQOsy(C z&OWc9`A^qE-DP(9Y(4ZHcM?3^O)o25nW_w7v+hy-4SPMKa~={Km~11SVc9$N!GgGT zhk*A}|5EtQ8FltOtM8iPpYvx9$FGz96#65mdUbU~b#fJZ&X@9?xp(qx_ z;vVoZ?8m!}-@<>*w3t;cM|`<=Tg>2DM3Ath7wyd>U=P$-x3~?2=$TdfCO(5+L||=X zT~tSuo(U3Ddp}AY`FP9Yt&dIoi79_fdZfa^I0z^n(KRzVJ{lU)Ot6t}(VMWhZy=_J8A7nD7nk&B!5K`p7T~&L7mY3>C%!d zgPeoCJ=MElMBmKaA%s50FZREQp1E{0skagt;2Ec?PhI>?S-gr_Hh01h;$u%CpUP>& z6$3ltvL@|A;H7oZcMj@G;7>B-9?X0Ns03w|&1 zGvNL^HQV#nZ7m8i*+Z^36LwzSnJ@+ZN$Q_w_AnQi&cJL2_BM&PaODCvZ?;m-G2t6t zzj&mIn}L^L|48gNf!l&ci86HUtxc$OjGVVzOO3s80%C+;`cdmrf+_D{kg(nzBcCDAbGgxOiuccmJKt; zR{+asENG}}U^D&ce9JGqtRWr+lYMX9Cw}0UCrie9MEv*4gFpIeaP*V=lm1JTN>z&q zpW5i3S5AC6Ap!b-KE$6!_#O$>``7M=WG%H9(B8ykmE@*GBQW_(@jY{#20)LLiG66r zo5!0kDV+EBeqSmrCI=}KK8VtF6X@Vow`jZo*029KdCP>im&t_H^1h{ML!7ei?j?dB zn)oi}tdQy>n8u66E74`=XkH9+7I+KZ7q~;GEqweXCVWh-c22iCgZ0U%|ElDx1GR^a z9RmL!_72A9jtSQ$JzA;X$qvUOne#lPJI|>QUtrXybe*_H-Uz=G_zYBU@}F+TMWXA!+m7x-j;a~mP68t{!{qo$P@x(swt@t(>{QTVyz8PGqTf$`imGdL; zLFKOVYxa(ClQYwd`WwNQnMZD&kwr|~C7N&8yk&MBXg?>BZ>pTTRA zoAlI@rag#%qWYnT=f{Ed@CEb(FdjSz+xIo}nOdT0yh2e?MpvvR2zs~1@laY-cI?jj z6XtZj;`){LDksg#o4ZZ+_M6R~&DqV_Z7lS2fln&m=jB**S#ci{e&213kI7NCQ45PL zda&M5z7)URx=ea4`5NP7)H509KhJxoq;mxIUt@etNmI)nPw?>}_A;5z>&)C8-R17B zG(HaB=cJ2%>N&pCg{JykuUV8tloaNf-mho8O`hPjbr0JTb^hjDd@nr$Bs zyE98d7tIym{uJLxCuqK9monHUQtEe2fzv#jQ+pY^f6n}v|PS)S|rHEc?R_F+S zl;9Dc$XAc}cEq=HnatTVKgc&ZbBpF?*iwHB!4s6W4`y_q=qVz2DdBhcC;~P%{J=HR zGFeZY0%UX2X7n<{^+V5Bx2bt^6YvmYs*UY%`P-+q;D0Yko6 zO4m2k2RyJ%1kA;RuaxGV&bI!Q=S=)lWWE0&YE4w*DNaG~DvHP0$>s6!YKrHQ_wUw> ze0ocu-!_bA1l0#s$W=iq@_Yo(@Ok7{BdL)*BIn8a6E-M32YWu4_BXz-+^b4s{(xcr zO7$$*TeAkgV8V>~jb=#gN@FXs2U&tQpgxW7qa^*chC2HGP+#K0G^g^#hHu#CHZ(rw z`1rV+`G)=m=J~6o7{5yAv^01hF^*a;QUBG6^7za}4=j4Y*P;5iMdKciGmPWL5j=>@ z-za5#fZWO70r*ip`cFBb%>J>k)w$m^{(sC3(FhBKkI^2AKQ8sz94< zuVK*bwlD;E#kvT?=+i?=>mL4AGq>?#hIh&5qgi;Lh_(Ebe*$>NJ5NJr;rlxj)FCY6 zr846euAhzdw{hrTozEfbAhtY7Mf5goA56S7#rN&;%r3_dY_Y$b>=8ayJ>iKZ_!);^ zj{~0M5;6XmMWF>V?zZYxIq>Hm=jZlKf@e(WqoglL{K#!#3!{%TFme6Lu7|jPNZh$2 zLs=Xv5fxnzhy9-FjO==Wde)Em{-qD_l<5@{t1YXhvY(cR7vuh)I2;dOs}O{;6&Vr4 zUY{>mX?szwIme8#T0e;MHbQ}$cw0&vJEl}+F&g^^(U!TIm4>(2%HqT3@UQa3E*^2$ zz;84AV$R$j!2i-Olg}RSz-OI){rbzDu$P0kS3oYNkv(np&FG`BhdEtCQ>bYQ%Ae3KsiuG%PnFT78}Wvmb0>eI>upL1;cIYw z1&`>J@`P^!&uBn>44>)?u$~^&A74$PALHpj@eU=hA*)EMNa3E8&k4Sf zGS+`3T~A9rGJ#hpy`Zm5^xlAlIZu+F@VcqGc=d?6QWN7!MEe=$ z7Z}wUs_$X4dxQs6-%&g%`%{`m~Fi_R{{H^{|ol@8UE0 zq(5!Ml7safcML+osJ*2a|K_|s8T9=EpCI?=XJ=O_w2DmxuOMZ*fBH?^0saKxUvRFp z`Osh8m+~HoFEZz?G5QBe9Tc=bVt6qznivh6Vou9Z%{)b<74{2OP07GVI7wm>GL{41 zFEbA(^&P#x@V?WFe`pxbGxWUERi}pZAHfeUGf#Pi@oA@6mVT&IF~E$p%&f!rMv^8z z&%gR9AY)TD^vGY>yj6%Y^y3fOL`@Rldq?9(#1G4lRZXj!#lW8ce*yQN;vGfq z2JQ#&!ygg73_mYpzH8WDG#}Ug4!K%Bb^25W`k&yda;tk~B~F2!&TQ6r1N23e`&4&# z^ki3LvoE4<5c^7?x9$*^@dDYi_t%p6lbWJGpTsoy)w8SbY8x=08yoYEDyGIEU)$@o z7jfSHuzAvoF!)nv+#4kMVrTY>+RVEhSY~QZCB7$0Ngves!X*Aoj&DOZe!ssfsxz!0 zJevXko$P0<2bLA=xS5>;`{VF8x1r}e-DM`7|Ka{LKKR|IQ-j|Ty)QE184lgO)ShL| zQM^MrlM~4VBC$R6GU)!h`JJ|DotAejnRV@N-NSlnb{f&e55VX1zIC64J-%<~40pTh zb{A8w6OV~R{K(*`p}X8ujy)bZqH+Q7=eD5snD(;<;jQ3~Zp3fQoH1ht9iPvP{0uL_ zV(Isu;B!4Q<_iJe#VKut`Z(|n8ox1H;v$K2)w#04!+eW*D#>>{xxN3ZocK}SCw+UF zr_cjMe1}sK_&xYzLX7x`7qpDD(odx({Db70qj>B8iD&#@%BYXVm-K(}njUB`)#pI2 z#}400-!N7PeGc$3ruoWhz8XB%&jkJ9MD#zm>XUPlGm_((Q!^)SeGA{?XXFqzv44al zE=T{}fB)|Lci+4BFSdR{a~%8)Cx=cB{WA0`;?XbX?4Aq$cy8(1t7A$>GgDJ3UU4wj zJInd3sfd4$ zxfoc)oQ2*8=Ht3#rzDFso98U}PK4j#)ZkX=o$K?X3Exo0#+Lljad`;#(o*0vTzLC0 zoxgL)UrX>1+%Kr=^ta9LmCjW<(TuS9oU$hvO&oUw^fUu6N*%komaEdbMNi zMEzuw-sY%n^O7${R7J4U5WfKXdgdijjeWQ1D)csJJc>9@roE%#FNnY3Y!E$!rL$3hJJ9&Tf~0JZ;y#V z%1UQOZj2ZD==Fz}r~ESiXQu7mTg3mHTJ56~^qZBL{PV@<&s4>pKY51utB>P+xcu7t zgYOTnh5wO0|Ehz>eXCu%Tv+*d?T>gL8x^lN6$eDlA$%C%C0tNO;JJkC74mDE+9JGfV(%)M3de1qN^_;e-X!CzVfU6j+jj4{ z0Q->eQO^dkh%)!s{466kqkycxc>iFvr;!_o)56SC`&?uqB}t z@!*udbh&zebyRiGQB(ZG+v#2f*YEV+#Piem8v7n$JyXv#ve|3Dx&?nB|Foc(|6J6= zzWJv=(JN-V?pAl_cCTYcyGr&%aLUL*if;@t|CJaFpX2!kqT8<3S9UPd?$i26zWbuI zA~oVys6Bg5S^8<&sB?BK;z0VN%&184$Moe0>q8+M)3fCzj=S`^?2}m z=zQUlE?ug-)Nri<^OxGEmObN}93MzCSx2hx!7V)Eec|@Sx{GXx|I&EW|AXGY)%MYd zT6X$@8#l2YB{n8Ji9Qkk18(``_uu08QBM-8l5WOp z==jEX6c>pb<9?K>kspQd(YPO%^!)3!U8)n?Zu8F<=&x7Y&)k*4!9t908jmrJw@@To z*u9?42i&jb-MgPDe#pGYW*F`Fbq=>JUyZsn3-J|nzHhT^U$}GRzrnW|_TTqO2NqT= z+D`CY;xCUf#9UvWw&4(2Z;5~ZGqcb&XR5dD#rixKQwX6mSnOX zk@pF{f|8rn`)ThNy2|3(7*NMeq9y=7HzhV z7c!YH^m%&6yc+X#?9)-qxdX<0DPhjp`@0V6C_aGw$e5BzB{T9@w17WA-=~9CSQW@c zcA3_LG;MinYjdd-@1ODkLLMjR_$~ZAydR3styjd(agA-wuA)o#Jt*-$u54!p;e>=SjQ``d?|W!Qwsl&v_>Ngx|z;Fdf?> z=zPHXH@?^LwIoA+j@F0k!z_N{fVBH%?7|M>EGz;E+^oBkW{NBaGMKC+)IyDXRD zB^W>EK7#ZKbrXO`8uy$07U}ofMwVqW)1W7h{yQkkmle5wB4INR(*3KGFk?-2Lw4sd zo}skrOET0pXx6b|z_WmN@MA*av%atX9_^$4xPX2?JtFj==X`+X+Y9PUebT>q;9I;u z8sEfM`A6(oy>~V6GK%NfKlHrO@KMA26mP-%41Xm_m>2k+AN!()UcdW^q;Gs0KbpP3 zjC(n8NGa2cO9k8bz6`JOKl7ot!B5~hTax$_o4{7*caUF}H-op1pKHcehpw0nzDA|t zCyiUOAciRqQ*{8p5IhRaI(oDk`4tv=5j_quva_XRWfy?oac<0A#G|~nZ5n^cY(G=> zWeqwSk|Ml7Lwa~-Zxm%p* zlO#)IyozbrrcO{Jz9+uNmNiknMT{g$CvN{mPs-5uMEu5))08WrbgWD)F>_90a#d!t654;3Y!6rxqv7QdJ%t!K2=gSfW zTk`A>;bT1f@m_;eDp0ef9x3E{!VlMIfM2BG_iHddg(44mUUCcU?KcSjWAC}mh4gvf zgq|eq??m2L-E_b1=}7fKE?ksoCK+MEmiF7xE_ ziyJm8m~!Ze;Qpg{8x$7^zhbz|mnsy9h%=U>u|FYr1+JjyQMN&D8MuIP{xro0J~Gc< zlL?7Aa-Q^$y(mcq2Ik-Ox$#Ja7yiCpoSm(0z#qXE$o;K&5{o_a+V_w$X}`TlDB_LC z)3BaW!mr>s=r3K-h*RkGC_~Rf5>wGuCEQ>7Mk&U>`N-`1^!+dPP!PNa{yZe8s?sqi z6MlrfyMuddims4NaY!L$SBZJ-M#W|c_!cPypIO;ZbF&*cB7rZxQHuWV8uj>f=!+=G^#l(){pWCe_DBnQ|2LUwPt#k|TN#w=@ICZW_^S`p zr$JBDp|@ZJ+K2c!!EJl!(`-q0{%}a?T;Wq2i})+{*Hk|AoRy*$X25$eYLIQe+wm@V zEN<76>u%@@IDGGEd|{Ad$&$*^cfMhe4>b?pgB1(?7b+Zk1*Y=)f#}+ThJaij3DnZ(5bd_AhSu}VK@ zz$sIhj(jHHARh_m(-_?lyTLaA=LsKG*)^iqs%4_afyp-Rx9*J2ThV?L`akV{9}VID zKM!5*(Bx>c316M;U-+SneE*O4mCW<|H2>KT;qql=uC37HyhQSkD6K-LhOYBJF`MkC z2p;nfzX>tvaoka2KahBpl~!P1Z+zIuwqB;~Yc%|>PdCINpPbQO?qnvyAv7cYKjN>I z<@sLqeeV05X<4?5?9cdV))~x0A3dup9lY)iy`_iZN6xKGKl4WDWnzz?Y`j&}vRA)~ z`Tb1~Kjbg@Rd-ic)Ag{6ZS)?o6Y(NGWx?%dI!n5kr_h%`IY=9+taj!W4dyQ~m$fqxmFLmauPGfxbLWfUD{?y*Vf3KqNBiI;k zQjM`^QOqm;o3C-t7+}JNh(~NheJ1?%fABN@FL=iPxE^`JiGD|>N=5ZJgeCT4UjVOJ zRp~|XY3PF(^*dnwA>;RJ_T=cE1n6Czw%u# zu7Oe{PIfpxK9?)LU#DuEz`S$m{GAWM_X}KjP*qki$UIM7O7H}k z!Z|*0^~t@|KmR$+Z-Iarok;jui!0Hy^ur(R-(kHwyL=#=ipzQvf5&5v|AgYr-N@&9 zkn)+Q_nM_R$rk$$<0;7J5zB0lah9g|k7Fke?Fo}RhYkDlm1A0E6&Z#~13OK&iNs5N z?Cmdmw5sI|@N4Uded4FMoYQ-(Z7l=+1+t&M%pKJ1zaDf5_yYB3uP0(+Ke#_(TV%WP zus+Qb*h<{PPkzA;>sKlx6_FdA3!T}ssZ_szN{{7(i4WG~vBUVEn?YFTRvDZ_>_dWo zx`u?vSFARy7XBVSiSWD4ZKd_}`Oi`RsIqg|kLL&4Ol2kRjS>Of4e&Clm4mh4$426AT ze8aeqi0ALNZiim1|EH9HO!y`feq3R~KPrcA52a~cWZ-*KyzA73lNU-Z)b0j`vBw3^%nHgH*IodjC>Ss{-foR-4nRw zCjL)wQ9@BdZXoviMtnqC#*}TT{R#1dG1R_3`eR&xpM%7b*q6Yol!aY+Tw3Fw)hzHL zVsE+3^qF<=y~l4d?Vhs=)(mkLSI3vQw7B=P32i*{V?)X}S*t&6pJM(Uca5lm-uy35 z{%CyK*o5_R{P_#yePDp+my~xRU(b!R7>_pg0{eO5@1Rd&>@Uk07r(0k`kCxm47y%f~HWQzZ&*4^rW|6_p(|Fe=v zVia-Q-}(%@RjP<{9~$0fv%tst82U`oMRQh4zU7#?6~QlHk14}735`K@ z-gRWWVSFeP4GDFr>N7i-R--+||C4u5rNRDTc)Z%@Ib^I!Don=vqV`tTD2bJ#yoxi8 z&zS26)OG6{XRt;*OX)6^Zd0i^%rA=1DL*#1l5AAK-!jbidKfpH&uREP|4&QrFVEuq z7ptk>ZtmdSlVrbO!mHd4N9ZDs&PKjgBVMSsh_v7-7_46t=z8E~DV>+Nd;dj~{rW+R z?UfN%#vCH{lUAz+%oF$awZh4vC!Yqnputb5}c393dmAst;!ey|0j)sp!}zPDe9JY(JSnTJ^4s2;*c8W&9<(U$_>i0}n^%@3N(&E<1ZruJs< zM+fJ7uRxDQ_)&j+oKC7%lp|gk`o3hnfS?Zc>#!FIo`c`7^q!Nr;+gC=`ituI&M&te z07NqI_jp9|b8?XNo3zJZ=IAbx3zOMQBfk^zM{ox~uVUCfKcSnZYsF#8XXR7w-0yrF z{7B@>S%C4b*Y_Fql?i_c>j}{dlKHHtG4bCZ8a4IyI|JijFY9-seRj`xwrGZcU!(ox z`WP-oAEUX9=QFMsYF%oFVuQlUG=5HQe5HJTVi5V;jCjYoR(b23L*{-gzDL0GxM}HT zzN-)47$p5k@Z<|?g5??6;4@=<0$=2QXm4vT;1!w^{}0hOn&~okE*+ofPtspr9qz57 zVo?*;CyJ+}^!X(FNW4`hd}hy)oN%AmOz|6GQYguwMQ1rOivTzsw%OKk(KAT<_EE{V*>7sG6R~`?tJr_LtM^wSx@w zL`XdJoL9pC3ZL?xvQ7795 zA-dh|k#h;N#mjyH5B$;rWMe(R^I`W*n<4pa2>PZLypg;&dC(7Bz2FVZPs6f;*^0mz zrsC{!+llx-^ve2o^=tLaxEFmhfq!^)&%P~{$w#mwMka5XjQ#FUU)mR1c74d)R(FRR zFdq$m*X%>A?OB)dFJ9XLAF;L(E_N?UXTKSHeAChj@_aP~Wm#muUwVLd2h`t8FFC;+%@YTcgtQYh!ke@^* z_da*F0{Fye%k8%Rz1~+VMSHpCKzxGh`Z|zo@4Ao_TYw&CR>s&r~{P zk$94jzU21u_CcM{Zl~{L?57fW_F3e9!ihV5y-<$vsiFG8!b3ZwS6n4}oEBrLJz23( zP4EopnLYQx!F;+Xt9T9J6ODi5uHCBLSF(6@J5kTe7Nvi--`0yoyvcoBe`4~%$@eBd zoJ{mRiT{6Q)|M@#KB4tUTK4mq;7`l@tiB`mXm0DdbM$^jd_&1k;_W%P=j0O-Z$kJ0 zE4yV^$?-Ryf!#0iHEW4|Ozd&@eT$kFr7n^(rRM3xJ|^+$zrLk?OSpHDuH+8vrKM|Y zNd1hJc{queP?~EtYBsiSWIT;!!WVH?SZpF?qPHMUocm1vGcQoMr}W))w68kn4y$SLAK}fsi&Rfe_~zoz3BQ5MG1}vVukaB4buTg(^yR@Ro?M(Pq6ffEU zdLSD)y;f}fM`ap#HB4eLX_nBn+R?vtOwlg`=pTR?As`a77i*uzKE)md!B zL8@oZi+7HfXT#owKbr72bGbu9QnhV7{CzavrC$9~-K~BE|Gz(txAZs^T#kIE{gj`9 z@#J71CQ?l;TE?`@Jx1brL-am%;?;twY((go70~||KMrh*f)A5Xt^S3Nd>)o8{}1b@ z)_<`9`}_}n1w5nhkLr7c_p8}|{n7m;@QI|lg!Z61-$%eNsQ$&6N&gs6*OUJP&!G8J z!Eb;b#yxT%Un<2vE)-Mlk_3$OT(4?XsZ>_Xnc4G+fAcNtMZVeByXsAPf`5Gd?CX*lnbS=6HeW6YNtWE2 zYqB?+v3M)AF$yN!Xg}}H4p9k8`1eeBMtk*@<6?j3*@%ar{_+_Xp`KAkBa2M_ce9=m z8Iwyl^_uKe*KV8cd3~xr!Y3kp<l7X9TiJ}7jfb#)7JYa28+R$+na!a4TV;@* zsSVA}20t46eO&K0%}nGpTepDNZzY(|`*o!{_YPhY>|;9Llv1@F_YJoW@ha4x<;u^V zq_yL$O!oUm%g2`aR_QBD_WMk0zd6C$DDZu0JUBOw7cntN6;x047Z(xzpWdUli}oS@ z&4_0t?hcZR=ZWVM|0|hatCx7J;a%soGN)~q{u}n^n`b7c{ZL*#Wa39Op5vL(@8NKM z1U}DMA}M!mCH4%luf#G*fJ~i6;@7D?+HO%Qy|XPB`69r_`55z=7iL~QabPn1yM+Iu z#B#mR=jf@w`QrSCh{ooe!S_B$^&R&PW@|&$ylp0bzP%_=zVG=Q{$On#AuD>Cs5QZP8F z{tfI6qL&%g7Mu|*7s^S0A$~%+mAk6ZEN@(H>W`&~ypeSOVZ<|(>qf}s5syMUhw%*V zWp&nt`YPQW*e}$dYWb(x(~Q)Xe=}Jnm1p_HB69o(@kp06Y3}e(4aQ`P6hh!XsT42tS?w(6CtLQj!+7AR(-ZSPc(A4y z@qJ{yRfg%EGX=@c;mmXY`2^n(bIBD0$A;kVH1bW}mCB@khXSj>kDz*mKiXw{@Zh^% zCE_`#e_e3Ix3QZTdTbc~kH%YyzV#k1CN3d6L= z6AzJiGvZGVs{BcNruud+xt{Q+?8BI_yp4m$i9Mcy`PA~cmltCJ{_=D`n$Kk#&w(eK z^C}(qSjSmhAE(I7JTIz(J|+0{m~XDhHkao=TK5Xq8=t>0y(_3F2>lIy2d;m!)w5?& zzhf^mwVTXm?%g0dzYnjB@qYoj*mG&l-Pc!pPpszX}F1HVOZ{_I@fQC-qP^A&sxa{uGFf5NiV zh|=#{mz(ekb$iU9+ZFSJlrMnw$qi}=+jM1^|3*ARJ?NJ2JewyrweQ}}JY@g)C_-2r zKItoB-)BvqPRH+X{E&^CblbTlEuT|772`!xmZ%cLheGsSiT-2b2al~9)Uf8u5%# z1C|3LS|?pM#W&s7MwdSA0G=_tUPKn${c3VBTN6Vqp*YevtSOv3?))Z4MT(8N>LlP!ziDaBHWj z?8TFt0Wxa<-a+{!P9d{H)N15A9e%z5m5(f0)d>ER5#PuGpCem0p2V-v?~C{u?-_3& zk71hpXnv)CwvK37-MyoR9oF~wL9P0}Zu-zjq6ZJYqB6%^VY9~L69(%CeZI89j3b%= z=;=%|?)Q|vv5GUcxwhPQn*&cH$T8;TZzi-zp|7-cXx}@KgB*ZIYRp&AZxmV87Taye&8=2x7L3 zNtmw%e&II3{zHLMz}%YgQ!3(9?sT2eMGZ2D=V-mQzy*9{{$jHq#^*XBU*&S?c<@t) z6dk^q-U@c~qVI`4J@d~+ufDE1x|6*l?e_q_A$%oDmBuX#V=YI>H-SGeO0;}-)$*)FOR-czl+g5nC!RR}OLS^1Y<$ zta<|*Tm1gB%dqd<{mUvk5&z?Kdud$({CBktLoj1FW@%#nPy2_s_3i0;dDub=MtXM6 zThOm?a2H-Zr0*PJi%Uwr0zV~T@H(R1va^t{)oUz%_zS03HWVDqXT6dR6Fm!`WNl9Q zg}x%>XIOC`_N2#Qx8;Jv)=g}M#cJeVRW|R;->Df>=qj8r>h7aD1NU9~us!8$|BZ@gTc=pu!mKkWw_a?y2*%0~@C@G-z!R;^1C05RaQ=!M^#RL} zT~+l#FC(iM}g54=CATjVu$rYz5I9iSNm7*{~OPs zXvT_uoX;eD0m7%imPN%3;~CAm7zJEr3KPDe)FFDW*(wtF1m#=&=M4n6;7_<4_ypcp z=Bx`;4<7giJwJ-)$iwH8$CCI4w5J+t@8?oa#KXYe#`EO18SxmV^cjt3NZg&UTQU## zNBsm35Gx`}&*&lvo{@s~DG#Rosy)?kDw~u^{Dh5Ql7K^dg?l_HpCLCJnl%Kk*lYD3 z#WQk;@r=EmZy523VLZcBw#cUK1-|jdL*NJIyy19|ea7pHvW<9vaJbynW%@n%4tQRI zIMMwp;x$NnR(4P5rua~q1Ld!L!c+Kd4A87#%Nzm-p5Zw)(nTI3(K90*te%0t!*>%T z`?clk*+st|s{N4g*Cc7zI@&q5n29gI__H;O+g`~X&03EpC;TG)~M0eGb#M^ zr?_6gmpRv9Yr=w;CUC-x%84OWAHLGi5rKu?#xf2*cL1poRdWJ<`|;I)6TDHfT} z@H`v(d|OQ296djk=5uthe(C9zH%<@IX)iJqfJOBp%~Y-=au4#B&Ly%g0Jsg2xmG5~xK>hJi+{(!Sb`!5*SaLOlye@o(w z6gY+KG~@Nkhq2pSJpzEY+faY*<;IYsj{V05!5^gYz*YnC*VXE*Bg`;2vbz5E>(J1ssJ zv#Vp?BKG8LxpSUN$%Gzu>YQ1J@IBpL7=*+733JAw*4hm5B!(^YU>EQ5F=K|5yi>ei zh0lcDY~8+vIo?Cu&$+j9%Nr}7Fpa;{{Hj6y!6mX1c^>!*FNnV99W$*}MR-{_#V^2@ z!1^#>0{^e6Y=>-^o@}P`?>6#{fR7Py$SJaeY;9&`QXc{@B6 zX0tz`exhH&%jW6Kv}UIG61&UuCG%0||6hKF39r~cBy|Q;|@M;}`SpgP+mMEPi9Z`Hdl^*=7EH-gE07CUnAM z!)KiGKaGEM)pR}RV$NNnct)1~ls*y%BfmoNjFVmas<%`}-VuH=_0iJZLtNv)hF5fd zyc+&#yszWxG_`N7S&zw{SJuk)LD`H7{#oMhQU0O+9c(Y;KWa7Z2S@cR8mQS3%}$R#e|0X2 ze~xSjRmi36us%f3%6lt)=0G1{xV)?`vD>f4=JK$=o%>h%#_J7rjRt0z-*F;6JY&&4 z>3@gqBjr@y2WB7f-sfTeN%JFoBv>AESltJG8zY}vVVmRHuu`vKjr&!llTao)Yc^mB zyn^oU-i-8$|3Ps=LH4u6pE~Nd8SI+0uH!86-=V+EPAzO!4|M97so3vgzS_MKbc+XM z18nQ1dZKS5h_#M)s|6}DwT9Yv>oVjOk%q`l*za0$KCv-6J33zM3;UnW&$M>YRdb;^ zk7+aVw+vkR(HZvOFAw+UT$=zJ<>jI}?6+w=g?La_cI;Z0ifsm;0_)8xnOZS8s(cju zhem&S!^6yI#WXXMeR{r6RwD@^d~Bn=sH}>kvMBB1pqY8~!|^W4DcvKx=k?^≠~j8<|?s zgV1xpr-;8(*;$=e9i_8GJfE@sH#$F{MI5x)Xo*G#nB{5u})A3X1)aT)K+Kafh8tY-bGe`EeV z5InSR0pD-iyT6XX{@S9+tcm}c_nHX>p0R=B{#*3li!U#{yuh};sw4S?bM-FmOq=ip zGc}Ip&zRU^p_exJYuRD^VdLnyF$JHupTPP_@reENi@zxUSH)Q7yiMnGw11-^)(~w# zz6<%)jfd7?|8Zf<#h-JxtppxL@q_-oTQ3UxrWP|ZUv-f9!)k-J@<{+UkqtBQtz@#P zVQ&R~v1NGvaO1^d^<#qp`LHN{pxpjM+8|oOvoOsk(Ir9p^=aT!4D(kuHl#PKPyfIh z{Prm%UTGTVpr4udKJ+QTS3o&VtLT{4p#XozsBf@vynUK=t1u7GN7s`nXFLX?1`(ef zX5=GSq`E6&72T%#mFpHqEc%RjPe}A-fS)O!uYb8Bb5aWQuQA^+pWF;fGS+2(cgBQI zeff(_mb84;1XKInE}q+6JN<$q+DrKjQ~DP+dz6NiVm?!Uc!DPJXzKRV@a}8 z1O5T#%Q`+1j_%05L-ZC&yvMp3VH5l^Bm*QKvTn0oVQV~#1_N#gI4nOz4x1jK)leA);Hmk(9JUzBOYi@xBi1GuX5M}Yqt z^KbYFQY!}wG;HR0Iv%Wo*UGDpo%dv5&y(>#L!^*)eC`kaq)R=CU-C+pmp$kdx-(}F zjv@WKuEH^c=Z^bLv*{rC!bqNcS&NP*#rP-Ja{+Pb>vcyKnvwBF%0DOy^#vO6G0z(D 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

    {0KY&60#SuK;uFmjYK?aXQ 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 D3OplP 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�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

    M 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

    okWtg4Y4H7VZVPwk#ujE_ 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 z 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%0DpDFN0RRW`P`Dr;8p? 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 k0Jzp;~!TCb|Rg@R{{j$XGmuYQTzBN|vS+k?q zHsRS#67o@(pY2P_s-?qQa(LuVYi9aiTGFzTt-fOxlAsq&Ir}u)@({XA6f3$##u&Ii z^ng2`NX(lG#wtkusZm#c0lyRQGXw{?cclAkbK`N?kJmpvyH?e=mb7afQ-bvh6`z~@ zcdv+JWMiwMVw^ul&jJzrYu9}UR_|c^J!D|V1$dA6=8&r47tF8ege5PqeL^GFtSCMS z{W&L2&+AEHJas*{WFGK)aZULof%8OHdQ?zj1pdRn*6c}3PfsR>ZbywFpDZj<)zoOf z@A6v3I6!}J*UNUS4JZmAdHUg9Uw}WT4^6U7(TfHnxw4zqH=UQP*|$uEbZn8GgF^`1zzb zR+$mcR%WVsxKDXw_t@?njHhv~)(=tNP2?_|V!0pr6W#n+JYerC(n#Lgy`{#lmV(~2 z$)OeVep~)#67hVsl>HvoOL0Ms`>J-Y!We&9-=3=u%nAx6V_V0cPRIMD5u%k$|DdTZ z)kW*DzLmo#KJI>@Gv2@I_WOBe^)hvG{xan2)$Moeg%R2dP3!Z%<=1p2Hl9qC#1|UtRw2L_1S6v!p%KK_9w&TJ59?x$V3_IeGnRXfpOo@Q$0oAc}5$ z)$;EW_YvVAKmbG*h6Rd zdpve|HQ~*yx72;!pl)uszvCqf#QDPc#65ET=QOOJSk)|Yx#&g{w>VBa33;YwzfA0V zFPglp=;G-J{a!s?y$&(AXztCWb6(+nS<5fYfp5p>ApcaHsvG)m9N#E=EP6zYII}_D z(}&76p2<&+dXaE2`N@&A3rPZ=#7^Fk?wjsA`5^UlO9Ow6wQ8N%1_96#iK?y5m1Rsm zgn|nXbJ{kq^Piv(@F!gPjS!I0K^IxRyH)CyWvkR%)MU)frNRfGe(Qn14;tc`?|-@=-q z`1$gzMR-pwJkP~(BLv^}fAtQ#`I4=hUtpFZmi$pYse$ zp^1J4J@R}giwAwf_dwKwO)0=D=j!Xg_n+PtT7#wY)bOFA44i{stgYR56Z+5okDWEJ zzj&>Oa94}?R;kGMdLHksvcwbk4|uPTqi|>seqttSsePrcttD$seD?(dZ$bx4Yfh>6 z(M=&~ET5SK(HlxFjarCDVw-M1f<77@I0u1)kQgoM`~&ErRf9|{l5;W|R55heXy8XF z%cfaYMic*DdU>o?yQgvW6Hyd@i6mAm-SZjo(3)m7IyH>1B!+*+U2cc|zDO!0k1QTh zBhGLMV~z zADLMT=?Z*>SUU`3@wql0o6Zjw?rK9)dl{z>#Q73&2e>*;MR_~@!w!(AG;i@b1pcEh z+U<-O1piz)yeAI{KF}?ZAAdr8u;vQYNQJ+Ez^=W$`z+05RZ~?Fo8fIz<5}` zq1bHqxbDhQvqoy&yE!9Qqg~YNeK+tEjxfB!dGPjK#?e{Lfj{8>CT(s1szGXoWlAylZr%~l>0>76v&7Pf9}xzGv?Y{($M(ONeae)gf0?y zhe9Rsw3>881A7MNXOR+GK93ll9u>6@`-k``0aD*!2|rEFd1Umga$8hI1*Qwcsl>VfE4n zibP|ZY2Y#ck z-olG6&oUP4lh-Cwj^R95BlZr*ebmw(rgM&AeLL|SRP-yX%<5yUoK3_ow(4@)GqRcG zBl#&kCp|U^{H%w`uwz(1lllqbj(=E15o>Sb^BC{58vW3TXI&PP5K9&0FYWbA?iBZt zyG!Cf?Rs?(`<3a`LA(V1{5ikB{uBJl#-ICCHBKO+ReHmRy~Ov(KEd95lK8)OmjJ(H zJM1n*R;9L3(8tBr|8M^w@fH^!V7$>9(PB=_3COyNj!a&#=EDY*?x`)K>;CRo0r?cc zp=5r+8HKcU^-dRRVt?Mn&M^fdpqCGKpN=SHL&qH$fUzNNoxm!X@=?l^42+)JIGQ_sk z5qSkUWHd3t2j}-a_nf;cxJOeX+eV@N;kRcBZ>ewoOCRHwkNwf5?drD3*PuK93y&;* zWNjTiQaUco-xKy*Jt3!y*B~9!(|;JsidFIq9iHGkGyKVEZW+-%PPK|!_bNHGRrh=M z_?gguUca849L4kn31`gi51D)mdaU)-Uz|E}u?I=d>BIC1*qh|=;H{@&v*%==W_W-H z63(@m)W>1qkI;v@i4fy2IXaH~71?pDFV;`4RVOXoolBl541NY4@SGYk4N6MMBcF+G z;4h|9wI(VG@8JR-j%4_|rKY?zDlRFM9_z2lY>n@soB6fUn$crp`kaM40baEQ7Ua_; z;qSF7?Dx~l&&!@^K5EIRIX#DOW%ewEg@eMikmmlqv@7UU8Wfdw84tl}LaUg?*gvm3 z$E%)dsx_o7XZGa#`#D3)&P={mMA|6^INmcP?v`zse7WR^hmo_fhY`uKe8Td5831BJY!A(3s@;e6$lhimyKS8^r$q^T?myp!9T@UpFeMk;y>QuQZ5_T*j z$qn%wIqz=m|L!k^yxKb%c+d0?A>u`nV-JV!#Ch@f;_OS-D3v<>3G`$2>Hsm?t@Q7jA$6$})F(>pv(sTczFYpwewlL)l69A2Q3@C45r z>G)Qru@cFl|GgGxM($30%LzGtgdv;Mtely-L z#EasttkY^Ae6;t$_VM)IP5;bAs4u;P*9_3F^KOnR!S^zy(l0)_tcDmJX!DHuA296} z@&|2WSi*$TJ34PwM1Rp0|U)b{pf{Ykpz! zq`gao&$~hNPDV7dpGssB`Fbm_{*+r}^4BWR$LEmuAv6T*1-t}3=&e%=(eeB^uF!9v(8 zYKQK5q0x5cItk2~f2OshWUm|KGr57V=%|vD=BGOL!TUGwM-BsY_dN_BK%W`Y{mfk) z2R;V=>+By}y?Ka_ zw@vLmn5%!QCZdP>pT{G=%=M-p!N#>D&8qr$$R`qhXilA8H=c%8K22u$BkIl7wGr&1 zV^;)~Z_sL6b3?H z_9ZcXM#o)NTthr&cm3KQYk$!6C;AU8CW2oimem>v)~ugM#|2wCpu9@ch_7L<&0W*8 z8v8eHQEyd@3i+5fSoXXerH$?IG`X~_2K5PRI#+`p1h(?9^wbmSG#=lh%yCw}1Ntu6 zOAS}HdG{TEp>6bac;UEQPmyhq9gVV%UOJ5AxCI8$i^%%lUjKOv`~Mz0%J%bzpyDd< zn^hqm^}6|OKJq0J{L|@eHIk?y-pFYA?wp^&zu$AKFHh=cX1;1BlVDG^{;%T}z3ic!JkcM@yroC)`s{VlY-JhXeDI8qr zcE#s0V{rebeW!V$y`f?F!1%)<)As>G()SQ ztzN0HR7gdid_E%{F3xxV(!Ql*=cn-pTBx@PH@dD!wGL`h?n(+H#yP!36!2z>^Ld|GJPZAqLcXq34w$43ESD zd%Y17ojwD6_MVb*VRa!7eIRn!EtKD$UHex3qjZ-}UcvdF`gT$3p#x_kNKYG8dII8g z@b>{g@5JBeVPSjqRmW`gY$k6qyx6%vX>fRwS<$!p*q^h1d->Y&!nbmVs%XW~*Qu!l z`NQ`*Lq5H4rCxnw{8K7^Xm15lw;ms4=@-&J1oFZID<$x}#k5(!#Y96w4KF9-_XXf~ zqW1zyd$`YD+7a>8Yeia4Eo>yFyKPy1DA-E~wwR;#xA)q1*JzLW+olaar1hZD5$X@g z;2)wkTtnGaUt;&VMlc=uPx?Ht>~B9zLHf6uCXUAagt6kY;-z96wGTdNYk~LxgO^7- zd`YO6W>45OL(#00mUZ}eSQ+0m9OKhSH1?Vq&}WqORS^hpXq!CnWJt^_60hGA{3CX5 zOUUPt#+fImyRvf~_{(UM9cB@&uVxT;WzRZ>Cx{3AEc)dFVo3grAGcq=X8Uc3Y&A!g z#hj!DH@`4_H@E2Nv_I>bGKKh&5EeKtNRf2TI}PsFGC zST|lb-ZmAl^RT}HgUFEvix&JrM*VsF#*dJv-t$gUFKHk#l<2!bUc0Al-8gYP==*r^ zuuD6^Z$$9l;R{WvwRg!CeBTP}T`8VWPkSESkPH5bc+&#G!-iAzwXpej@Z*IYKX%#M zJ?Tes>`dEV$3h=^a_Q-+rgP8->U8$5E=`Z(;^KV$r3GL0TMJp6-a2~!s_(?MEgl~b zke(2slRsb&ZTD*8v>Ws0n3LDJO>TJ?XZ%a~b5x=MZ^y{3LAKo1ENsNnHjn5Ay1^gORq@JPN(ZLAFF^DrmJKh@O*-&oM|a)m1^T!ycrSQPj*?xL=OeKm`j7ZVS+zWa7$&?< zFF<^z^MS1zx~dK6`ZX1aGcg`J7(di%4eWiNC!@c2ur6uAa)`$*zdt}vf?Ysk$`N91 z{tMxD4u-j0 z%{iJH?P)D(bMy8M(34f5^pJI+^(%VEqtlr`kl$tY{qlt^++W1cZD1tqxxL->RtY`` zwvvwex6nRzJ%Zm{sTMvUcgA))ngISIhP0jaZU7yXK9b$XK{OGK5EL8IQGY&W`jqz< zyPb9+w!uVS@$e_eBOkTfw5HnDO~m?R)!zT>>%GIGI@+-DvkM4_%I?xENn92XYXlZc zssk({VgX@6#Y8l)fF&A57u$;_N>xEYrKo74lm#S-CMsYYJ7ob4cACB_AW9Py6xj3K zXNhn8e&2Qd;IFyn>?t$PJoC&`?i=<6Z=I5VYHgrIJKqa%-s$UgyH<8lPT)^H3VZqV z{ND<9L=T5OX`=O?_!kPl{qu{J4Wv=)-@@HwDYB$FNt}EjUK5ccU#vHHvHaP4`7oTy zY~NmdRR(=!#NBUcm)|uTd$|J%eUf&3vnJyEQENxr)h*jiJd-5XVXv6U@^!AaO>>|X zj^5W{Z$5|r;Yn+ID{X{72;VbJztFF6TD3pT95Y0<4&xsH>A%IiqlP~Ak+5HFkNsHJ z_L(e_%(Znl1fSS%Hmj{RI=-Dp1{vG_f%(1DFIq0K#Qtt+U1kOTv5q#l7rA(^!P9%y zSYL+BXUsGg^#O|g;K>R+FG_!*a_gq8oW1bkd#sA1oCkSwlk!ZrO{WNsC8>0UH z6XOSS8U1hQ80MqL7|*?7jeMp6e{Hp5qZfAh_vN5FHgakd5CN%`Iz53f3Q(i(aBj2He%zLhs9_9GXi{P=jsHU?^ zGSgJRE9bEl+WjCVJM;7@PXDC&wbemhN z{x34pHKS;j(~`@;^AOqz-!A21T{8huadsz-#J}$#J z@n1*Kn7nD{X9MqH>GA(;ukmUo!}9cFzD9gr6Y%bbzSt&eaO1|`*zZU2EO=villf%U ziAK&Jp4cUmU5)cH#s06Am;9Zo?f3puas>9Kw(V|hD{+!lRQx~kF*cb^XX7~l6T>a?ZCEazSC@Jc)0p7( z*_sHuDULd$g=3tF$@m-I=QR=gvTN#7Q;;trZ}5u^MSQ>o$J0(9Bjk5H*#Lj_wrMiA zBC2^!YS$awg+4-X2JV_V9v!Q* z@rd8H<)x=TPmcN*2(VfIu-+bP zo@xMqQA-U@-YA1U6pCEWp>~Bo_oHmuSLionC`5#o>cDn}W{cqY8x(eSQ1w9rRehd2g^mS3eQl@D*X$V?ue-ZkEKhseb z=Ga4;u2(<6`0I2Ec{ai|IwWrW(`%5IV7a+(z9%~peD0s#03V{!;KAB_8fx^Lb-5V+ z^+$?!#qSCq_)Ft{xr}(5@v>2u^g49O*oNxkzL>vWW)h}w3mrFT;_u7B$3pEZU#ogm zWS%Oi`d9eh5j@stFyDWlQpjL$fnJaAu-xGlz2)UQWgPM`Bn_ib2))KFJjR~ zKI#LuTwP0oAzzEpZqVjesOX;9uG8S(_^nNytBO&T()lW-3H03vUQuC8#b1?VUQ84h zFVhp(mBXagPyN3@!`3$)E8>4Wc`&K#9L~kBA7gd2z-Ay# z&O=I}kGfNCrR>WU=aSeJH@JEpo*+o6mH)vWjfogP9*N50{GZfsyu(hM$4%NdHA5U~ zN$g7f-4&Q00kU&pe~`G9`eA=_-=kIoU!NuFIQ_7PkYAy?unzU{Xiu91{cGv0=KQI3 z34(>5mzL5?moAx2?kL^c1%7ztPk9*s+*H-!lr6zj9_+W`0O~n4LN6W<_!~=iWyNgN zMBGyC$!StV&mbNN3%-QEZf^gempEX2OEPDsVZE?Csw;40BKR~`dOHvHd#EBnF-7t8QgkikL$GQ1nb%v(y_s-E^oy5LEbq37`44VAr=0jlw8kr zyYzq~Bnf=r$k!5zf+M3FfM4Tz``X9YpQbJMZhK^R+KS%(-B&&Z_L!ct$W=5(B+iz9 zf0pCx%$+m97i>DfCoYmDUHvVpC!d%aWoqjUn7YF%0D!)4^OzWgT3xvXeDj&#{h^7N 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 Juu~2E{U3BdF311? literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs index 68e330c..6f80bac 100644 --- a/src/main.rs +++ b/src/main.rs @@ -390,6 +390,7 @@ impl strafe_client::framework::Example for GraphicsData { hitbox_halfsize: glam::vec3(1.0,2.5,1.0), }; + //load textures let device_features = device.features(); let skybox_format = if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ASTC) { @@ -463,6 +464,46 @@ impl strafe_client::framework::Example for GraphicsData { ..wgpu::TextureViewDescriptor::default() }); + //squid + let squid_texture_view={ + let size = wgpu::Extent3d { + width: 1076, + height: 1076, + depth_or_array_layers: 1, + }; + + let layer_size = wgpu::Extent3d { + depth_or_array_layers: 1, + ..size + }; + let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); + + let bytes = &include_bytes!("../images/squid.dds")[..]; + + let image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); + + let texture = device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor { + size, + mip_level_count: max_mips, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Bc7RgbaUnorm, + usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + label: Some("Squid Texture"), + view_formats: &[], + }, + &image.data, + ); + + texture.create_view(&wgpu::TextureViewDescriptor { + label: Some("Squid Texture View"), + dimension: Some(wgpu::TextureViewDimension::D2), + ..wgpu::TextureViewDescriptor::default() + }) + }; + //drain the modeldata vec so entities can be /moved/ to models.entities let mut models = Vec::::with_capacity(modeldatas.len()); for (i,modeldata) in modeldatas.drain(..).enumerate() { From 25e80a7c1744b7fcf600dc7b01f7b8e80cee673d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 17:01:06 -0700 Subject: [PATCH 141/482] scope skybox --- src/main.rs | 140 ++++++++++++++++++++++++++-------------------------- 1 file changed, 71 insertions(+), 69 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6f80bac..ed68cf2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -393,77 +393,79 @@ impl strafe_client::framework::Example for GraphicsData { //load textures let device_features = device.features(); - let skybox_format = if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ASTC) { - log::info!("Using ASTC"); - wgpu::TextureFormat::Astc { - block: AstcBlock::B4x4, - channel: AstcChannel::UnormSrgb, - } - } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ETC2) { - log::info!("Using ETC2"); - wgpu::TextureFormat::Etc2Rgb8UnormSrgb - } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_BC) { - log::info!("Using BC"); - wgpu::TextureFormat::Bc1RgbaUnormSrgb - } else { - log::info!("Using plain"); - wgpu::TextureFormat::Bgra8UnormSrgb + let skybox_texture_view={ + let skybox_format = if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ASTC) { + log::info!("Using ASTC"); + wgpu::TextureFormat::Astc { + block: AstcBlock::B4x4, + channel: AstcChannel::UnormSrgb, + } + } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ETC2) { + log::info!("Using ETC2"); + wgpu::TextureFormat::Etc2Rgb8UnormSrgb + } else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_BC) { + log::info!("Using BC"); + wgpu::TextureFormat::Bc1RgbaUnormSrgb + } else { + log::info!("Using plain"); + wgpu::TextureFormat::Bgra8UnormSrgb + }; + + let size = wgpu::Extent3d { + width: IMAGE_SIZE, + height: IMAGE_SIZE, + depth_or_array_layers: 6, + }; + + let layer_size = wgpu::Extent3d { + depth_or_array_layers: 1, + ..size + }; + let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); + + log::debug!( + "Copying {:?} skybox images of size {}, {}, 6 with {} mips to gpu", + skybox_format, + IMAGE_SIZE, + IMAGE_SIZE, + max_mips, + ); + + let bytes = match skybox_format { + wgpu::TextureFormat::Astc { + block: AstcBlock::B4x4, + channel: AstcChannel::UnormSrgb, + } => &include_bytes!("../images/astc.dds")[..], + wgpu::TextureFormat::Etc2Rgb8UnormSrgb => &include_bytes!("../images/etc2.dds")[..], + wgpu::TextureFormat::Bc1RgbaUnormSrgb => &include_bytes!("../images/bc1.dds")[..], + wgpu::TextureFormat::Bgra8UnormSrgb => &include_bytes!("../images/bgra.dds")[..], + _ => unreachable!(), + }; + + let skybox_image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); + + let skybox_texture = device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor { + size, + mip_level_count: max_mips, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: skybox_format, + usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + label: Some("Skybox Texture"), + view_formats: &[], + }, + &skybox_image.data, + ); + + skybox_texture.create_view(&wgpu::TextureViewDescriptor { + label: Some("Skybox Texture View"), + dimension: Some(wgpu::TextureViewDimension::Cube), + ..wgpu::TextureViewDescriptor::default() + }) }; - let size = wgpu::Extent3d { - width: IMAGE_SIZE, - height: IMAGE_SIZE, - depth_or_array_layers: 6, - }; - - let layer_size = wgpu::Extent3d { - depth_or_array_layers: 1, - ..size - }; - let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); - - log::debug!( - "Copying {:?} skybox images of size {}, {}, 6 with {} mips to gpu", - skybox_format, - IMAGE_SIZE, - IMAGE_SIZE, - max_mips, - ); - - let bytes = match skybox_format { - wgpu::TextureFormat::Astc { - block: AstcBlock::B4x4, - channel: AstcChannel::UnormSrgb, - } => &include_bytes!("../images/astc.dds")[..], - wgpu::TextureFormat::Etc2Rgb8UnormSrgb => &include_bytes!("../images/etc2.dds")[..], - wgpu::TextureFormat::Bc1RgbaUnormSrgb => &include_bytes!("../images/bc1.dds")[..], - wgpu::TextureFormat::Bgra8UnormSrgb => &include_bytes!("../images/bgra.dds")[..], - _ => unreachable!(), - }; - - let skybox_image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); - - let skybox_texture = device.create_texture_with_data( - queue, - &wgpu::TextureDescriptor { - size, - mip_level_count: max_mips, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format: skybox_format, - usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, - label: Some("Skybox Texture"), - view_formats: &[], - }, - &skybox_image.data, - ); - - let skybox_texture_view = skybox_texture.create_view(&wgpu::TextureViewDescriptor { - label: Some("Skybox Texture View"), - dimension: Some(wgpu::TextureViewDimension::Cube), - ..wgpu::TextureViewDescriptor::default() - }); - //squid let squid_texture_view={ let size = wgpu::Extent3d { From 1878528a4fa1a650b1578040a99c2351cabcc393 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 17:45:39 -0700 Subject: [PATCH 142/482] v0.4.0 instanced rendering + model textures --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a2808d2..02e9340 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1405,7 +1405,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strafe-client" -version = "0.3.0" +version = "0.4.0" dependencies = [ "async-executor", "bytemuck", diff --git a/Cargo.toml b/Cargo.toml index 7390db6..5e32c41 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strafe-client" -version = "0.3.0" +version = "0.4.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 0135b1791753284c9a8465c02ce42fe8e249459c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 22:29:33 -0700 Subject: [PATCH 143/482] make proper model data and stop passing device into add_obj --- src/main.rs | 63 +++++++++++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/src/main.rs b/src/main.rs index ed68cf2..5834da2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,11 +17,10 @@ struct Entity { index_buf: wgpu::Buffer, } -//temp? struct ModelData { transforms: Vec, - vertex_buf: wgpu::Buffer, - entities: Vec, + vertices: Vec, + entities: Vec>, } struct ModelGraphics { @@ -171,11 +170,14 @@ fn get_transform_uniform_data(transforms:&Vec) -> Vec { raw } -fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,data:obj::ObjData){ +fn generate_modeldatas(data:obj::ObjData) -> Vec{ + let mut modeldatas=Vec::new(); let mut vertices = Vec::new(); let mut vertex_index = std::collections::HashMap::::new(); for object in data.objects { - let mut entities = Vec::::new(); + vertices.clear(); + vertex_index.clear(); + let mut entities = Vec::new(); for group in object.groups { let mut indices = Vec::new(); for poly in group.polys { @@ -197,27 +199,15 @@ fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec,data:obj::ObjDat } } } - let index_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Index"), - contents: bytemuck::cast_slice(&indices), - usage: wgpu::BufferUsages::INDEX, - }); - entities.push(Entity { - index_buf, - index_count: indices.len() as u32, - }); + entities.push(indices); } - let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Vertex"), - contents: bytemuck::cast_slice(&vertices), - usage: wgpu::BufferUsages::VERTEX, - }); modeldatas.push(ModelData { transforms: vec![glam::Mat4::default()], - vertex_buf, + vertices:vertices.clone(), entities, - }) + }); } + modeldatas } impl strafe_client::framework::Example for GraphicsData { @@ -233,7 +223,6 @@ impl strafe_client::framework::Example for GraphicsData { device: &wgpu::Device, queue: &wgpu::Queue, ) -> Self { - let mut modeldatas = Vec::::new(); let ground=obj::ObjData{ position: vec![[-1.0,0.0,-1.0],[1.0,0.0,-1.0],[1.0,0.0,1.0],[-1.0,0.0,1.0]], texture: vec![[-10.0,-10.0],[10.0,-10.0],[10.0,10.0],[-10.0,10.0]], @@ -254,10 +243,11 @@ impl strafe_client::framework::Example for GraphicsData { }], material_libs: Vec::new(), }; - add_obj(device,& mut modeldatas,obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap()); - add_obj(device,& mut modeldatas,obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap()); - add_obj(device,& mut modeldatas,obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap()); - add_obj(device,& mut modeldatas,ground); + let mut modeldatas = Vec::::new(); + modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap())); + modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap())); + modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap())); + modeldatas.append(&mut generate_modeldatas(ground)); println!("models.len = {:?}", modeldatas.len()); modeldatas[0].transforms[0]=glam::Mat4::from_translation(glam::vec3(10.,0.,-10.)); modeldatas[1].transforms[0]=glam::Mat4::from_translation(glam::vec3(10.,5.,10.)); @@ -533,11 +523,26 @@ impl strafe_client::framework::Example for GraphicsData { ], label: Some(format!("ModelGraphics{}",i).as_str()), }); + let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Vertex"), + contents: bytemuck::cast_slice(&modeldata.vertices), + usage: wgpu::BufferUsages::VERTEX, + }); //all of these are being moved here models.push(ModelGraphics{ - transforms: modeldata.transforms, - vertex_buf:modeldata.vertex_buf, - entities: modeldata.entities, + transforms:modeldata.transforms, + vertex_buf, + entities: modeldata.entities.iter().map(|indices|{ + let index_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Index"), + contents: bytemuck::cast_slice(&indices), + usage: wgpu::BufferUsages::INDEX, + }); + Entity { + index_buf, + index_count: indices.len() as u32, + } + }).collect(), bind_group: model_bind_group, model_buf, }) From 1de3501e89ce85817a15693790553ed7862ae33e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 22:29:46 -0700 Subject: [PATCH 144/482] no default transform --- src/main.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5834da2..747ff7e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -202,7 +202,7 @@ fn generate_modeldatas(data:obj::ObjData) -> Vec{ entities.push(indices); } modeldatas.push(ModelData { - transforms: vec![glam::Mat4::default()], + transforms: vec![], vertices:vertices.clone(), entities, }); @@ -249,13 +249,13 @@ impl strafe_client::framework::Example for GraphicsData { modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap())); modeldatas.append(&mut generate_modeldatas(ground)); println!("models.len = {:?}", modeldatas.len()); - modeldatas[0].transforms[0]=glam::Mat4::from_translation(glam::vec3(10.,0.,-10.)); - modeldatas[1].transforms[0]=glam::Mat4::from_translation(glam::vec3(10.,5.,10.)); + modeldatas[0].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,0.,-10.))); + modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,5.,10.))); modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(20.,5.,10.))); modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,5.,20.))); modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(20.,5.,20.))); - modeldatas[2].transforms[0]=glam::Mat4::from_translation(glam::vec3(-10.,5.,10.)); - modeldatas[3].transforms[0]=glam::Mat4::from_translation(glam::vec3(0.,0.,0.))*glam::Mat4::from_scale(glam::vec3(160.0, 1.0, 160.0)); + modeldatas[2].transforms.push(glam::Mat4::from_translation(glam::vec3(-10.,5.,10.))); + modeldatas[3].transforms.push(glam::Mat4::from_translation(glam::vec3(0.,0.,0.))*glam::Mat4::from_scale(glam::vec3(160.0, 1.0, 160.0))); let camera_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: None, From ca919b92fd43284084fe2f349cd7d3275f3d94bc Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 17:45:19 -0700 Subject: [PATCH 145/482] add roblox deps --- Cargo.lock | 255 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 + 2 files changed, 258 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 02e9340..173d8be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -157,6 +157,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "bit-set" version = "0.5.3" @@ -184,12 +190,35 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +[[package]] +name = "blake3" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "199c42ab6972d92c9f8995f086273d25c42fc0f7b2a1fcefba465c1352d25ba5" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest", +] + [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "block-sys" version = "0.1.0-beta.1" @@ -302,6 +331,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + [[package]] name = "core-foundation" version = "0.9.3" @@ -360,6 +395,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "d3d12" version = "0.7.0" @@ -382,6 +427,17 @@ dependencies = [ "enum_primitive", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -555,6 +611,16 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.10" @@ -822,6 +888,26 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "lz4" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +dependencies = [ + "libc", + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -1198,6 +1284,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -1222,6 +1314,19 @@ name = "profiling" version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46b2164ebdb1dfeec5e337be164292351e11daf63a05174c6776b2f47460f0c9" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74c55e9e629af5298a40e0fa106435b2da30484c4ec76b41d19bc4d00dd8b903" +dependencies = [ + "quote", + "syn 2.0.29", +] [[package]] name = "quote" @@ -1232,6 +1337,36 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "range-alloc" version = "0.1.3" @@ -1244,6 +1379,69 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +[[package]] +name = "rbx_binary" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e50573021d04b680018955662eba7dc4aac3de92219231798f6c9b41e38ab01" +dependencies = [ + "log", + "lz4", + "profiling", + "rbx_dom_weak", + "rbx_reflection", + "rbx_reflection_database", + "thiserror", +] + +[[package]] +name = "rbx_dom_weak" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "161729449bbb0cfa657ce7bcca6a160d0af06d8b8d9efdc9abe14735dccacdb9" +dependencies = [ + "rbx_types", + "serde", +] + +[[package]] +name = "rbx_reflection" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bd48487192046fec8f805f3fa29f3d7d5beb9890b0859b1a92bd8aff580343" +dependencies = [ + "rbx_types", + "serde", + "thiserror", +] + +[[package]] +name = "rbx_reflection_database" +version = "0.2.7+roblox-588" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be6cf674182806f11ad4899dd1feafe977591f1ae035ae05a58d4b74e487276" +dependencies = [ + "lazy_static", + "rbx_reflection", + "rmp-serde", + "serde", +] + +[[package]] +name = "rbx_types" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "070106e926b8ae54c7bc443e5db4d868d7f0af51c1d7cfd7efe1364c1753d8a3" +dependencies = [ + "base64", + "bitflags 1.3.2", + "blake3", + "lazy_static", + "rand", + "serde", + "thiserror", +] + [[package]] name = "redox_syscall" version = "0.3.5" @@ -1288,6 +1486,28 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b" +[[package]] +name = "rmp" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" +dependencies = [ + "byteorder", + "num-traits 0.2.16", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1338,6 +1558,26 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "serde" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -1415,6 +1655,9 @@ dependencies = [ "log", "obj", "pollster", + "rbx_binary", + "rbx_dom_weak", + "rbx_reflection_database", "wgpu", "winit", ] @@ -1425,6 +1668,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "syn" version = "1.0.109" @@ -1524,6 +1773,12 @@ version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a464a4b34948a5f67fddd2b823c62d9d92e44be75058b99939eae6c5b6960b33" +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + [[package]] name = "unicode-ident" version = "1.0.11" diff --git a/Cargo.toml b/Cargo.toml index 5e32c41..23f172b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,9 @@ glam = "0.24.1" log = "0.4.20" obj = "0.10.2" pollster = "0.3.0" +rbx_binary = "0.7.1" +rbx_dom_weak = "2.5.0" +rbx_reflection_database = "0.2.7" wgpu = "0.17.0" winit = "0.28.6" From 953d424a57fd8a2cf836b189ad7b36f62e9c7fa9 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 5 Sep 2023 17:45:34 -0700 Subject: [PATCH 146/482] load_roblox module --- src/lib.rs | 1 + src/load_roblox.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/load_roblox.rs diff --git a/src/lib.rs b/src/lib.rs index 88b93b0..1a053b4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,3 +2,4 @@ pub mod framework; pub mod body; pub mod zeroes; pub mod instruction; +pub mod load_roblox; diff --git a/src/load_roblox.rs b/src/load_roblox.rs new file mode 100644 index 0000000..1fe10e2 --- /dev/null +++ b/src/load_roblox.rs @@ -0,0 +1,27 @@ +fn class_is_a(class: &str, superclass: &str) -> bool { + if class==superclass { + return true + } + let class_descriptor=rbx_reflection_database::get().classes.get(class); + if let Some(descriptor) = &class_descriptor { + if let Some(class_super) = &descriptor.superclass { + return class_is_a(&class_super, superclass) + } + } + return false +} +pub fn get_objects(buf_thing: R, superclass: &str) -> Result, Box> { + // Using buffered I/O is recommended with rbx_binary + let dom = rbx_binary::from_reader(buf_thing)?; + + let mut objects = std::vec::Vec::::new(); + //move matching instances into objects + let (_,mut instances) = dom.into_raw(); + for (_,instance) in instances.drain() { + if class_is_a(instance.class.as_str(), superclass) { + objects.push(instance); + } + } + + return Ok(objects) +} From ae0c9e73ee2015a025dad6c7d1427506067e440d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 22:36:30 -0700 Subject: [PATCH 147/482] make handy unit cube --- src/main.rs | 82 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 69 insertions(+), 13 deletions(-) diff --git a/src/main.rs b/src/main.rs index 747ff7e..5c02d13 100644 --- a/src/main.rs +++ b/src/main.rs @@ -132,6 +132,7 @@ pub struct GraphicsData { models: Vec, depth_view: wgpu::TextureView, staging_belt: wgpu::util::StagingBelt, + handy_unit_cube: obj::ObjData, } impl GraphicsData { @@ -223,22 +224,76 @@ impl strafe_client::framework::Example for GraphicsData { device: &wgpu::Device, queue: &wgpu::Queue, ) -> Self { - let ground=obj::ObjData{ - position: vec![[-1.0,0.0,-1.0],[1.0,0.0,-1.0],[1.0,0.0,1.0],[-1.0,0.0,1.0]], - texture: vec![[-10.0,-10.0],[10.0,-10.0],[10.0,10.0],[-10.0,10.0]], - normal: vec![[0.0,1.0,0.0]], + let unit_cube=obj::ObjData{ + position: vec![ + [-1.,-1., 1.],//left bottom back + [ 1.,-1., 1.],//right bottom back + [ 1., 1., 1.],//right top back + [-1., 1., 1.],//left top back + [-1., 1.,-1.],//left top front + [ 1., 1.,-1.],//right top front + [ 1.,-1.,-1.],//right bottom front + [-1.,-1.,-1.],//left bottom front + ], + texture: vec![[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0]], + normal: vec![ + [1.,0.,0.],//AabbFace::Right + [0.,1.,0.],//AabbFace::Top + [0.,0.,1.],//AabbFace::Back + [-1.,0.,0.],//AabbFace::Left + [0.,-1.,0.],//AabbFace::Bottom + [0.,0.,-1.],//AabbFace::Front + ], objects: vec![obj::Object{ - name: "Ground Object".to_owned(), + name: "Unit Cube".to_owned(), groups: vec![obj::Group{ - name: "Ground Group".to_owned(), + name: "Cube Vertices".to_owned(), index: 0, material: None, - polys: vec![obj::SimplePolygon(vec![ - obj::IndexTuple(0,Some(0),Some(0)), - obj::IndexTuple(1,Some(1),Some(0)), - obj::IndexTuple(2,Some(2),Some(0)), - obj::IndexTuple(3,Some(3),Some(0)), - ])] + polys: vec![ + // back (0, 0, 1) + obj::SimplePolygon(vec![ + obj::IndexTuple(0,Some(0),Some(2)), + obj::IndexTuple(1,Some(1),Some(2)), + obj::IndexTuple(2,Some(2),Some(2)), + obj::IndexTuple(3,Some(3),Some(2)), + ]), + // front (0, 0,-1) + obj::SimplePolygon(vec![ + obj::IndexTuple(4,Some(0),Some(5)), + obj::IndexTuple(5,Some(1),Some(5)), + obj::IndexTuple(6,Some(2),Some(5)), + obj::IndexTuple(7,Some(3),Some(5)), + ]), + // right (1, 0, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(6,Some(0),Some(0)), + obj::IndexTuple(5,Some(1),Some(0)), + obj::IndexTuple(2,Some(2),Some(0)), + obj::IndexTuple(1,Some(3),Some(0)), + ]), + // left (-1, 0, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(0,Some(0),Some(3)), + obj::IndexTuple(3,Some(1),Some(3)), + obj::IndexTuple(4,Some(2),Some(3)), + obj::IndexTuple(7,Some(3),Some(3)), + ]), + // top (0, 1, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(5,Some(1),Some(1)), + obj::IndexTuple(4,Some(0),Some(1)), + obj::IndexTuple(3,Some(3),Some(1)), + obj::IndexTuple(2,Some(2),Some(1)), + ]), + // bottom (0,-1, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(1,Some(1),Some(4)), + obj::IndexTuple(0,Some(0),Some(4)), + obj::IndexTuple(7,Some(3),Some(4)), + obj::IndexTuple(6,Some(2),Some(4)), + ]), + ], }] }], material_libs: Vec::new(), @@ -247,7 +302,7 @@ impl strafe_client::framework::Example for GraphicsData { modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap())); modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap())); modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap())); - modeldatas.append(&mut generate_modeldatas(ground)); + modeldatas.append(&mut generate_modeldatas(unit_cube.clone())); println!("models.len = {:?}", modeldatas.len()); modeldatas[0].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,0.,-10.))); modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,5.,10.))); @@ -652,6 +707,7 @@ impl strafe_client::framework::Example for GraphicsData { let depth_view = Self::create_depth_texture(config, device); GraphicsData { + handy_unit_cube:unit_cube, start_time: Instant::now(), camera, physics, From 73edb9ff9553777bb2896eb9f9cc84fc3ab93067 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 22:36:42 -0700 Subject: [PATCH 148/482] drag & drop to load roblox map --- src/framework.rs | 4 +- src/main.rs | 184 ++++++++++++++++++++++++++++++++--------------- 2 files changed, 130 insertions(+), 58 deletions(-) diff --git a/src/framework.rs b/src/framework.rs index c5221b0..9a24440 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -53,7 +53,7 @@ pub trait Example: 'static + Sized { device: &wgpu::Device, queue: &wgpu::Queue, ); - fn update(&mut self, event: WindowEvent); + fn update(&mut self, device: &wgpu::Device, event: WindowEvent); fn move_mouse(&mut self, delta: (f64,f64)); fn render( &mut self, @@ -346,7 +346,7 @@ fn start( println!("{:#?}", instance.generate_report()); } _ => { - example.update(event); + example.update(&device,event); } }, event::Event::DeviceEvent { diff --git a/src/main.rs b/src/main.rs index 5c02d13..5ce2954 100644 --- a/src/main.rs +++ b/src/main.rs @@ -111,6 +111,13 @@ impl Camera { raw } } +pub struct GraphicsSamplers{ + repeat: wgpu::Sampler, +} + +pub struct GraphicsBindGroupLayouts{ + model: wgpu::BindGroupLayout, +} pub struct GraphicsBindGroups { camera: wgpu::BindGroup, @@ -128,6 +135,9 @@ pub struct GraphicsData { physics: strafe_client::body::PhysicsState, pipelines: GraphicsPipelines, bind_groups: GraphicsBindGroups, + bind_group_layouts: GraphicsBindGroupLayouts, + samplers: GraphicsSamplers, + temp_squid_texture_view: wgpu::TextureView, camera_buf: wgpu::Buffer, models: Vec, depth_view: wgpu::TextureView, @@ -159,6 +169,100 @@ impl GraphicsData { depth_texture.create_view(&wgpu::TextureViewDescriptor::default()) } + + fn generate_modeldatas_roblox(&self,input:R) -> Vec{ + let mut modeldatas=generate_modeldatas(self.handy_unit_cube.clone()); + match strafe_client::load_roblox::get_objects(input, "BasePart") { + Ok(objects)=>{ + for object in objects.iter() { + if let ( + Some(rbx_dom_weak::types::Variant::CFrame(cf)), + Some(rbx_dom_weak::types::Variant::Vector3(size)), + Some(rbx_dom_weak::types::Variant::Float32(transparency)), + ) = ( + object.properties.get("CFrame"), + object.properties.get("Size"), + object.properties.get("Transparency"), + ) + { + if *transparency==1.0 { + continue; + } + modeldatas[0].transforms.push( + glam::Mat4::from_translation( + glam::Vec3::new(cf.position.x,cf.position.y,cf.position.z) + ) + * glam::Mat4::from_mat3( + glam::Mat3::from_cols( + glam::Vec3::new(cf.orientation.x.x,cf.orientation.y.x,cf.orientation.z.x), + glam::Vec3::new(cf.orientation.x.y,cf.orientation.y.y,cf.orientation.z.y), + glam::Vec3::new(cf.orientation.x.z,cf.orientation.y.z,cf.orientation.z.z), + ), + ) + * glam::Mat4::from_scale( + glam::Vec3::new(size.x,size.y,size.z)/2.0 + ) + ) + } + } + }, + Err(e) => println!("lmao err {:?}", e), + } + modeldatas + } + fn generate_model_graphics(&mut self,device:&wgpu::Device,mut modeldatas:Vec){ + //drain the modeldata vec so entities can be /moved/ to models.entities + self.models.reserve(modeldatas.len()); + for (i,modeldata) in modeldatas.drain(..).enumerate() { + let model_uniforms = get_transform_uniform_data(&modeldata.transforms); + let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some(format!("ModelGraphics{}",i).as_str()), + contents: bytemuck::cast_slice(&model_uniforms), + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + }); + let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &self.bind_group_layouts.model, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: model_buf.as_entire_binding(), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(&self.temp_squid_texture_view), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: wgpu::BindingResource::Sampler(&self.samplers.repeat), + }, + ], + label: Some(format!("ModelGraphics{}",i).as_str()), + }); + let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Vertex"), + contents: bytemuck::cast_slice(&modeldata.vertices), + usage: wgpu::BufferUsages::VERTEX, + }); + //all of these are being moved here + self.models.push(ModelGraphics{ + transforms:modeldata.transforms, + vertex_buf, + entities: modeldata.entities.iter().map(|indices|{ + let index_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Index"), + contents: bytemuck::cast_slice(&indices), + usage: wgpu::BufferUsages::INDEX, + }); + Entity { + index_buf, + index_count: indices.len() as u32, + } + }).collect(), + bind_group: model_bind_group, + model_buf, + }) + } + } } fn get_transform_uniform_data(transforms:&Vec) -> Vec { @@ -551,58 +655,6 @@ impl strafe_client::framework::Example for GraphicsData { }) }; - //drain the modeldata vec so entities can be /moved/ to models.entities - let mut models = Vec::::with_capacity(modeldatas.len()); - for (i,modeldata) in modeldatas.drain(..).enumerate() { - let model_uniforms = get_transform_uniform_data(&modeldata.transforms); - let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some(format!("ModelGraphics{}",i).as_str()), - contents: bytemuck::cast_slice(&model_uniforms), - usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, - }); - let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - layout: &model_bind_group_layout, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: model_buf.as_entire_binding(), - }, - wgpu::BindGroupEntry { - binding: 1, - resource: wgpu::BindingResource::TextureView(&squid_texture_view), - }, - wgpu::BindGroupEntry { - binding: 2, - resource: wgpu::BindingResource::Sampler(&repeat_sampler), - }, - ], - label: Some(format!("ModelGraphics{}",i).as_str()), - }); - let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Vertex"), - contents: bytemuck::cast_slice(&modeldata.vertices), - usage: wgpu::BufferUsages::VERTEX, - }); - //all of these are being moved here - models.push(ModelGraphics{ - transforms:modeldata.transforms, - vertex_buf, - entities: modeldata.entities.iter().map(|indices|{ - let index_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Index"), - contents: bytemuck::cast_slice(&indices), - usage: wgpu::BufferUsages::INDEX, - }); - Entity { - index_buf, - index_count: indices.len() as u32, - } - }).collect(), - bind_group: model_bind_group, - model_buf, - }) - } - let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { label: None, bind_group_layouts: &[ @@ -706,7 +758,7 @@ impl strafe_client::framework::Example for GraphicsData { let depth_view = Self::create_depth_texture(config, device); - GraphicsData { + let mut graphics=GraphicsData { handy_unit_cube:unit_cube, start_time: Instant::now(), camera, @@ -720,15 +772,35 @@ impl strafe_client::framework::Example for GraphicsData { skybox_texture:skybox_texture_bind_group, }, camera_buf, - models, + models: Vec::new(), depth_view, staging_belt: wgpu::util::StagingBelt::new(0x100), - } + bind_group_layouts: GraphicsBindGroupLayouts { model: model_bind_group_layout }, + samplers: GraphicsSamplers { repeat: repeat_sampler }, + temp_squid_texture_view: squid_texture_view, + }; + + graphics.generate_model_graphics(&device,modeldatas); + + return graphics; } #[allow(clippy::single_match)] - fn update(&mut self, event: winit::event::WindowEvent) { + fn update(&mut self, device: &wgpu::Device, event: winit::event::WindowEvent) { + //nothing atm match event { + winit::event::WindowEvent::DroppedFile(path) => { + println!("opening file: {:?}", &path); + //oh boy! let's load the map! + if let Ok(file)=std::fs::File::open(path){ + let input = std::io::BufReader::new(file); + let modeldatas=self.generate_modeldatas_roblox(input); + self.generate_model_graphics(device,modeldatas); + //also physics + }else{ + println!("Could not open file"); + } + }, winit::event::WindowEvent::KeyboardInput { input: winit::event::KeyboardInput { From eed932212d9e60694db85202c3f723ec59c74f62 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 20 Sep 2023 22:37:03 -0700 Subject: [PATCH 149/482] comment code that will be deleted soon and cause merge conflicts for no reason --- src/main.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main.rs b/src/main.rs index 5ce2954..dbbbb82 100644 --- a/src/main.rs +++ b/src/main.rs @@ -409,11 +409,14 @@ impl strafe_client::framework::Example for GraphicsData { modeldatas.append(&mut generate_modeldatas(unit_cube.clone())); println!("models.len = {:?}", modeldatas.len()); modeldatas[0].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,0.,-10.))); + //quad monkeys modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,5.,10.))); modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(20.,5.,10.))); modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,5.,20.))); modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(20.,5.,20.))); + //teapot modeldatas[2].transforms.push(glam::Mat4::from_translation(glam::vec3(-10.,5.,10.))); + //ground modeldatas[3].transforms.push(glam::Mat4::from_translation(glam::vec3(0.,0.,0.))*glam::Mat4::from_scale(glam::vec3(160.0, 1.0, 160.0))); let camera_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { From bc8f2bd566f84f2357767e53d56e6cd52432fe90 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 21 Sep 2023 00:01:31 -0700 Subject: [PATCH 150/482] finalize physics models --- src/body.rs | 20 ++++++++++---------- src/main.rs | 8 +++++++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/body.rs b/src/body.rs index 293a99f..64436d9 100644 --- a/src/body.rs +++ b/src/body.rs @@ -135,8 +135,8 @@ pub struct PhysicsState { pub hitbox_halfsize: glam::Vec3, pub contacts: std::collections::HashSet::, //pub intersections: Vec, + pub models: Vec, //temp - pub models_cringe_clone: Vec, pub temp_control_dir: glam::Vec3, //camera must exist in state because wormholes modify the camera, also camera punch //pub camera: Camera, @@ -264,13 +264,13 @@ impl Aabb { type TreyMeshFace = AabbFace; type TreyMesh = Aabb; -pub struct Model { +pub struct ModelPhysics { //A model is a thing that has a hitbox. can be represented by a list of TreyMesh-es //in this iteration, all it needs is extents. transform: glam::Mat4, } -impl Model { +impl ModelPhysics { pub fn new(transform:glam::Mat4) -> Self { Self{transform} } @@ -314,10 +314,10 @@ pub struct RelativeCollision { } impl RelativeCollision { - pub fn mesh(&self,models:&Vec) -> TreyMesh { + pub fn mesh(&self,models:&Vec) -> TreyMesh { return models.get(self.model as usize).unwrap().face_mesh(self.face) } - pub fn normal(&self,models:&Vec) -> glam::Vec3 { + pub fn normal(&self,models:&Vec) -> glam::Vec3 { return models.get(self.model as usize).unwrap().face_normal(self.face) } } @@ -368,7 +368,7 @@ impl PhysicsState { fn contact_constrain_velocity(&self,velocity:&mut glam::Vec3){ for contact in self.contacts.iter() { - let n=contact.normal(&self.models_cringe_clone); + let n=contact.normal(&self.models); let d=velocity.dot(n); if d<0f32{ (*velocity)-=d/n.length_squared()*n; @@ -377,7 +377,7 @@ impl PhysicsState { } fn contact_constrain_acceleration(&self,acceleration:&mut glam::Vec3){ for contact in self.contacts.iter() { - let n=contact.normal(&self.models_cringe_clone); + let n=contact.normal(&self.models); let d=acceleration.dot(n); if d<0f32{ (*acceleration)-=d/n.length_squared()*n; @@ -457,7 +457,7 @@ impl PhysicsState { let mut best_time=time_limit; let mut exit_face:Option=None; let mesh0=self.mesh(); - let mesh1=self.models_cringe_clone.get(collision_data.model as usize).unwrap().mesh(); + let mesh1=self.models.get(collision_data.model as usize).unwrap().mesh(); let (v,a)=(-self.body.velocity,self.body.acceleration); //collect x match collision_data.face { @@ -608,7 +608,7 @@ impl PhysicsState { let mut best_time=time_limit; let mut best_face:Option=None; let mesh0=self.mesh(); - let mesh1=self.models_cringe_clone.get(model_id as usize).unwrap().mesh(); + let mesh1=self.models.get(model_id as usize).unwrap().mesh(); let (p,v,a)=(self.body.position,self.body.velocity,self.body.acceleration); //collect x for t in zeroes2(mesh0.max.x-mesh1.min.x,v.x,0.5*a.x) { @@ -733,7 +733,7 @@ impl crate::instruction::InstructionEmitter for PhysicsState collector.collect(self.predict_collision_end(self.time,time_limit,collision_data)); } //check for collision start instructions (against every part in the game with no optimization!!) - for i in 0..self.models_cringe_clone.len() { + for i in 0..self.models.len() { collector.collect(self.predict_collision_start(self.time,time_limit,i as u32)); } if self.grounded { diff --git a/src/main.rs b/src/main.rs index dbbbb82..43811e1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -537,7 +537,13 @@ impl strafe_client::framework::Example for GraphicsData { temp_control_dir: glam::Vec3::ZERO, walkspeed: 18.0, contacts: std::collections::HashSet::new(), - models_cringe_clone: modeldatas.iter().map(|m|m.transforms.iter().map(|t|strafe_client::body::Model::new(*t))).flatten().collect(), + models: modeldatas.iter().map(|m| + //make aabb and run vertices to get realistic bounds + //this needs to be a function generate_model_physics + m.transforms.iter().map(|t| + strafe_client::body::ModelPhysics::new(*t) + ) + ).flatten().collect(), walk: strafe_client::body::WalkState::new(), hitbox_halfsize: glam::vec3(1.0,2.5,1.0), }; From e27ce3b507e5829d2812fa394d06d5e091a64d1f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 21 Sep 2023 11:56:03 -0700 Subject: [PATCH 151/482] dynamic image size --- src/main.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 43811e1..564f948 100644 --- a/src/main.rs +++ b/src/main.rs @@ -626,9 +626,13 @@ impl strafe_client::framework::Example for GraphicsData { //squid let squid_texture_view={ + let bytes = &include_bytes!("../images/squid.dds")[..]; + + let image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); + let size = wgpu::Extent3d { - width: 1076, - height: 1076, + width: image.get_width(), + height: image.get_height(), depth_or_array_layers: 1, }; @@ -638,10 +642,6 @@ impl strafe_client::framework::Example for GraphicsData { }; let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); - let bytes = &include_bytes!("../images/squid.dds")[..]; - - let image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); - let texture = device.create_texture_with_data( queue, &wgpu::TextureDescriptor { From 1cee3b52ac1d3e2e98c2d14f2d13709366348cfc Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 21 Sep 2023 11:55:31 -0700 Subject: [PATCH 152/482] switch entity_transforms to storage buffers to remove hardcoded part cap --- src/main.rs | 11 ++++++++--- src/shader.wgsl | 5 ++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 564f948..6dc4c84 100644 --- a/src/main.rs +++ b/src/main.rs @@ -218,7 +218,7 @@ impl GraphicsData { let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some(format!("ModelGraphics{}",i).as_str()), contents: bytemuck::cast_slice(&model_uniforms), - usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST, }); let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { layout: &self.bind_group_layouts.model, @@ -321,7 +321,12 @@ impl strafe_client::framework::Example for GraphicsData { | wgpu::Features::TEXTURE_COMPRESSION_ETC2 | wgpu::Features::TEXTURE_COMPRESSION_BC } - + fn required_features() -> wgpu::Features { + wgpu::Features::STORAGE_RESOURCE_BINDING_ARRAY + } + fn required_limits() -> wgpu::Limits { + wgpu::Limits::default() //framework.rs was using goofy limits that caused me a multi-day headache + } fn init( config: &wgpu::SurfaceConfiguration, _adapter: &wgpu::Adapter, @@ -462,7 +467,7 @@ impl strafe_client::framework::Example for GraphicsData { binding: 0, visibility: wgpu::ShaderStages::VERTEX, ty: wgpu::BindingType::Buffer { - ty: wgpu::BufferBindingType::Uniform, + ty: wgpu::BufferBindingType::Storage { read_only: true }, has_dynamic_offset: false, min_binding_size: None, }, diff --git a/src/shader.wgsl b/src/shader.wgsl index a2f1fe7..0126080 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -41,12 +41,11 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { return result; } -const MAX_ENTITY_INSTANCES=1024; //group 1 is the model @group(1) @binding(0) -var entity_transforms: array,MAX_ENTITY_INSTANCES>; -//var entity_texture_transforms: array,MAX_ENTITY_INSTANCES>; +var entity_transforms: array>; +//entity_texture_transforms: mat3x3; //my fancy idea is to create a megatexture for each model that includes all the textures each intance will need //the texture transform then maps the texture coordinates to the location of the specific texture //how to do no texture? From 42ba757ec093695d126d4fa962f82608a94b15c9 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 21 Sep 2023 13:02:01 -0700 Subject: [PATCH 153/482] plumb color everywhere --- src/main.rs | 122 +++++++++++++++++++++++++++++++----------------- src/shader.wgsl | 26 +++++++---- 2 files changed, 96 insertions(+), 52 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6dc4c84..79274dc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ struct Vertex { pos: [f32; 3], texture: [f32; 2], normal: [f32; 3], + color: [f32; 4], } struct Entity { @@ -17,14 +18,24 @@ struct Entity { index_buf: wgpu::Buffer, } +struct ModelInstance { + transform: glam::Mat4, + color: glam::Vec4, +} + struct ModelData { - transforms: Vec, + instances: Vec, vertices: Vec, entities: Vec>, } +impl ModelData { + const COLOR_FLOATS_WHITE: [f32;4] = [1.0,1.0,1.0,1.0]; + const COLOR_VEC4_WHITE: glam::Vec4 = glam::vec4(1.0,1.0,1.0,1.0); +} + struct ModelGraphics { - transforms: Vec, + instances: Vec, vertex_buf: wgpu::Buffer, entities: Vec, bind_group: wgpu::BindGroup, @@ -171,7 +182,7 @@ impl GraphicsData { } fn generate_modeldatas_roblox(&self,input:R) -> Vec{ - let mut modeldatas=generate_modeldatas(self.handy_unit_cube.clone()); + let mut modeldatas=generate_modeldatas(self.handy_unit_cube.clone(),ModelData::COLOR_FLOATS_WHITE); match strafe_client::load_roblox::get_objects(input, "BasePart") { Ok(objects)=>{ for object in objects.iter() { @@ -179,30 +190,33 @@ impl GraphicsData { Some(rbx_dom_weak::types::Variant::CFrame(cf)), Some(rbx_dom_weak::types::Variant::Vector3(size)), Some(rbx_dom_weak::types::Variant::Float32(transparency)), + Some(rbx_dom_weak::types::Variant::Color3uint8(color3)), ) = ( object.properties.get("CFrame"), object.properties.get("Size"), object.properties.get("Transparency"), + object.properties.get("Color"), ) { if *transparency==1.0 { continue; } - modeldatas[0].transforms.push( - glam::Mat4::from_translation( - glam::Vec3::new(cf.position.x,cf.position.y,cf.position.z) - ) - * glam::Mat4::from_mat3( - glam::Mat3::from_cols( - glam::Vec3::new(cf.orientation.x.x,cf.orientation.y.x,cf.orientation.z.x), - glam::Vec3::new(cf.orientation.x.y,cf.orientation.y.y,cf.orientation.z.y), - glam::Vec3::new(cf.orientation.x.z,cf.orientation.y.z,cf.orientation.z.z), + modeldatas[0].instances.push(ModelInstance { + transform:glam::Mat4::from_translation( + glam::Vec3::new(cf.position.x,cf.position.y,cf.position.z) + ) + * glam::Mat4::from_mat3( + glam::Mat3::from_cols( + glam::Vec3::new(cf.orientation.x.x,cf.orientation.y.x,cf.orientation.z.x), + glam::Vec3::new(cf.orientation.x.y,cf.orientation.y.y,cf.orientation.z.y), + glam::Vec3::new(cf.orientation.x.z,cf.orientation.y.z,cf.orientation.z.z), + ), + ) + * glam::Mat4::from_scale( + glam::Vec3::new(size.x,size.y,size.z)/2.0 ), - ) - * glam::Mat4::from_scale( - glam::Vec3::new(size.x,size.y,size.z)/2.0 - ) - ) + color: glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), + }) } } }, @@ -214,7 +228,7 @@ impl GraphicsData { //drain the modeldata vec so entities can be /moved/ to models.entities self.models.reserve(modeldatas.len()); for (i,modeldata) in modeldatas.drain(..).enumerate() { - let model_uniforms = get_transform_uniform_data(&modeldata.transforms); + let model_uniforms = get_instances_buffer_data(&modeldata.instances); let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some(format!("ModelGraphics{}",i).as_str()), contents: bytemuck::cast_slice(&model_uniforms), @@ -245,7 +259,7 @@ impl GraphicsData { }); //all of these are being moved here self.models.push(ModelGraphics{ - transforms:modeldata.transforms, + instances:modeldata.instances, vertex_buf, entities: modeldata.entities.iter().map(|indices|{ let index_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { @@ -265,17 +279,19 @@ impl GraphicsData { } } -fn get_transform_uniform_data(transforms:&Vec) -> Vec { - let mut raw = Vec::with_capacity(4*4*transforms.len()); - for (i,t) in transforms.iter().enumerate(){ - let mut v = raw.split_off(4*4*i); - raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(t)[..]); +fn get_instances_buffer_data(instances:&Vec) -> Vec { + const SIZE: usize=4*4+4;//let size=std::mem::size_of::(); + let mut raw = Vec::with_capacity(SIZE*instances.len()); + for (i,mi) in instances.iter().enumerate(){ + let mut v = raw.split_off(SIZE*i); + raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&mi.transform)[..]); + raw.extend_from_slice(AsRef::<[f32; 4]>::as_ref(&mi.color)); raw.append(&mut v); } raw } -fn generate_modeldatas(data:obj::ObjData) -> Vec{ +fn generate_modeldatas(data:obj::ObjData,color:[f32;4]) -> Vec{ let mut modeldatas=Vec::new(); let mut vertices = Vec::new(); let mut vertex_index = std::collections::HashMap::::new(); @@ -297,6 +313,7 @@ fn generate_modeldatas(data:obj::ObjData) -> Vec{ pos: data.position[vert.0], texture: data.texture[vert.1.unwrap()], normal: data.normal[vert.2.unwrap()], + color, }); vertex_index.insert(vert,i); indices.push(i); @@ -307,7 +324,7 @@ fn generate_modeldatas(data:obj::ObjData) -> Vec{ entities.push(indices); } modeldatas.push(ModelData { - transforms: vec![], + instances: Vec::new(), vertices:vertices.clone(), entities, }); @@ -408,21 +425,42 @@ impl strafe_client::framework::Example for GraphicsData { material_libs: Vec::new(), }; let mut modeldatas = Vec::::new(); - modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap())); - modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap())); - modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap())); - modeldatas.append(&mut generate_modeldatas(unit_cube.clone())); + modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); + modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); + modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); + modeldatas.append(&mut generate_modeldatas(unit_cube.clone(),ModelData::COLOR_FLOATS_WHITE)); println!("models.len = {:?}", modeldatas.len()); - modeldatas[0].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,0.,-10.))); + modeldatas[0].instances.push(ModelInstance{ + transform:glam::Mat4::from_translation(glam::vec3(10.,0.,-10.)), + color:ModelData::COLOR_VEC4_WHITE, + }); //quad monkeys - modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,5.,10.))); - modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(20.,5.,10.))); - modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(10.,5.,20.))); - modeldatas[1].transforms.push(glam::Mat4::from_translation(glam::vec3(20.,5.,20.))); + modeldatas[1].instances.push(ModelInstance{ + transform:glam::Mat4::from_translation(glam::vec3(10.,5.,10.)), + color:ModelData::COLOR_VEC4_WHITE, + }); + modeldatas[1].instances.push(ModelInstance{ + transform:glam::Mat4::from_translation(glam::vec3(20.,5.,10.)), + color:glam::vec4(1.0,0.0,0.0,1.0), + }); + modeldatas[1].instances.push(ModelInstance{ + transform:glam::Mat4::from_translation(glam::vec3(10.,5.,20.)), + color:glam::vec4(0.0,1.0,0.0,1.0), + }); + modeldatas[1].instances.push(ModelInstance{ + transform:glam::Mat4::from_translation(glam::vec3(20.,5.,20.)), + color:glam::vec4(0.0,0.0,1.0,1.0), + }); //teapot - modeldatas[2].transforms.push(glam::Mat4::from_translation(glam::vec3(-10.,5.,10.))); + modeldatas[2].instances.push(ModelInstance{ + transform:glam::Mat4::from_translation(glam::vec3(-10.,5.,10.)), + color:ModelData::COLOR_VEC4_WHITE, + }); //ground - modeldatas[3].transforms.push(glam::Mat4::from_translation(glam::vec3(0.,0.,0.))*glam::Mat4::from_scale(glam::vec3(160.0, 1.0, 160.0))); + modeldatas[3].instances.push(ModelInstance{ + transform:glam::Mat4::from_translation(glam::vec3(0.,0.,0.))*glam::Mat4::from_scale(glam::vec3(160.0, 1.0, 160.0)), + color:ModelData::COLOR_VEC4_WHITE, + }); let camera_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: None, @@ -545,8 +583,8 @@ impl strafe_client::framework::Example for GraphicsData { models: modeldatas.iter().map(|m| //make aabb and run vertices to get realistic bounds //this needs to be a function generate_model_physics - m.transforms.iter().map(|t| - strafe_client::body::ModelPhysics::new(*t) + m.instances.iter().map(|t| + strafe_client::body::ModelPhysics::new(t.transform) ) ).flatten().collect(), walk: strafe_client::body::WalkState::new(), @@ -716,7 +754,7 @@ impl strafe_client::framework::Example for GraphicsData { buffers: &[wgpu::VertexBufferLayout { array_stride: std::mem::size_of::() as wgpu::BufferAddress, step_mode: wgpu::VertexStepMode::Vertex, - attributes: &wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x2, 2 => Float32x3], + attributes: &wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x2, 2 => Float32x3, 3 => Float32x4], }], }, fragment: Some(wgpu::FragmentState { @@ -936,7 +974,7 @@ impl strafe_client::framework::Example for GraphicsData { .copy_from_slice(bytemuck::cast_slice(&camera_uniforms)); //This code only needs to run when the uniforms change for model in self.models.iter() { - let model_uniforms = get_transform_uniform_data(&model.transforms); + let model_uniforms = get_instances_buffer_data(&model.instances); self.staging_belt .write_buffer( &mut encoder, @@ -985,7 +1023,7 @@ impl strafe_client::framework::Example for GraphicsData { for entity in model.entities.iter() { rpass.set_index_buffer(entity.index_buf.slice(..), wgpu::IndexFormat::Uint16); - rpass.draw_indexed(0..entity.index_count, 0, 0..model.transforms.len() as u32); + rpass.draw_indexed(0..entity.index_count, 0, 0..model.instances.len() as u32); } } diff --git a/src/shader.wgsl b/src/shader.wgsl index 0126080..d886a73 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -41,14 +41,17 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { return result; } +struct ModelInstance{ + transform:mat4x4, + //texture_transform:mat3x3, + color:vec4, +} +//my fancy idea is to create a megatexture for each model that includes all the textures each intance will need +//the texture transform then maps the texture coordinates to the location of the specific texture //group 1 is the model @group(1) @binding(0) -var entity_transforms: array>; -//entity_texture_transforms: mat3x3; -//my fancy idea is to create a megatexture for each model that includes all the textures each intance will need -//the texture transform then maps the texture coordinates to the location of the specific texture -//how to do no texture? +var model_instances: array; @group(1) @binding(1) var model_texture: texture_2d; @@ -61,6 +64,7 @@ struct EntityOutputTexture { @location(1) texture: vec2, @location(2) normal: vec3, @location(3) view: vec3, + @location(4) color: vec4, }; @vertex fn vs_entity_texture( @@ -68,11 +72,13 @@ fn vs_entity_texture( @location(0) pos: vec3, @location(1) texture: vec2, @location(2) normal: vec3, + @location(3) color: vec4, ) -> EntityOutputTexture { - var position: vec4 = entity_transforms[instance] * vec4(pos, 1.0); + var position: vec4 = model_instances[instance].transform * vec4(pos, 1.0); var result: EntityOutputTexture; - result.normal = (entity_transforms[instance] * vec4(normal, 0.0)).xyz; - result.texture=texture;//(entity_texture_transforms[instance] * vec3(texture, 1.0)).xy; + result.normal = (model_instances[instance].transform * vec4(normal, 0.0)).xyz; + result.texture=texture;//(model_instances[instance].texture_transform * vec3(texture, 1.0)).xy; + result.color=model_instances[instance].color * color; result.view = position.xyz - camera.cam_pos.xyz; result.position = camera.proj * camera.view * position; return result; @@ -98,7 +104,7 @@ fn fs_entity_texture(vertex: EntityOutputTexture) -> @location(0) vec4 { let d = dot(normal, incident); let reflected = incident - 2.0 * d * normal; - let fragment_color = textureSample(model_texture, model_sampler, vertex.texture).rgb; + let fragment_color = textureSample(model_texture, model_sampler, vertex.texture)*vertex.color; let reflected_color = textureSample(cube_texture, cube_sampler, reflected).rgb; - return vec4(mix(vec3(0.1) + 0.5 * reflected_color,fragment_color,1.0-pow(1.0-abs(d),2.0)), 1.0); + return mix(vec4(vec3(0.1) + 0.5 * reflected_color,1.0),fragment_color,1.0-pow(1.0-abs(d),2.0)); } From 847209aac4a8ad5fb2a030d29a50ade1c1761863 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 21 Sep 2023 14:11:41 -0700 Subject: [PATCH 154/482] runtime load physics --- src/main.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main.rs b/src/main.rs index 79274dc..ef383c8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -224,6 +224,12 @@ impl GraphicsData { } modeldatas } + fn generate_model_physics(&mut self,modeldatas:&Vec){ + self.physics.models.append(&mut modeldatas.iter().map(|m| + //make aabb and run vertices to get realistic bounds + m.instances.iter().map(|t|strafe_client::body::ModelPhysics::new(t.transform)) + ).flatten().collect()); + } fn generate_model_graphics(&mut self,device:&wgpu::Device,mut modeldatas:Vec){ //drain the modeldata vec so entities can be /moved/ to models.entities self.models.reserve(modeldatas.len()); @@ -580,13 +586,7 @@ impl strafe_client::framework::Example for GraphicsData { temp_control_dir: glam::Vec3::ZERO, walkspeed: 18.0, contacts: std::collections::HashSet::new(), - models: modeldatas.iter().map(|m| - //make aabb and run vertices to get realistic bounds - //this needs to be a function generate_model_physics - m.instances.iter().map(|t| - strafe_client::body::ModelPhysics::new(t.transform) - ) - ).flatten().collect(), + models: Vec::new(), walk: strafe_client::body::WalkState::new(), hitbox_halfsize: glam::vec3(1.0,2.5,1.0), }; @@ -832,6 +832,7 @@ impl strafe_client::framework::Example for GraphicsData { temp_squid_texture_view: squid_texture_view, }; + graphics.generate_model_physics(&modeldatas); graphics.generate_model_graphics(&device,modeldatas); return graphics; @@ -847,8 +848,8 @@ impl strafe_client::framework::Example for GraphicsData { if let Ok(file)=std::fs::File::open(path){ let input = std::io::BufReader::new(file); let modeldatas=self.generate_modeldatas_roblox(input); + self.generate_model_physics(&modeldatas); self.generate_model_graphics(device,modeldatas); - //also physics }else{ println!("Could not open file"); } From 1a66dfbaf7863f15bbecb034fbc5243b6db9a1f6 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 21 Sep 2023 14:11:26 -0700 Subject: [PATCH 155/482] v0.5.0 model color + drag & drop to load maps --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 173d8be..6af09af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1645,7 +1645,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strafe-client" -version = "0.4.0" +version = "0.5.0" dependencies = [ "async-executor", "bytemuck", diff --git a/Cargo.toml b/Cargo.toml index 23f172b..c8e0776 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strafe-client" -version = "0.4.0" +version = "0.5.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From c9afa2d05948f7ac86d5d86ad68bf3b81ee39ba7 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 21 Sep 2023 15:44:53 -0700 Subject: [PATCH 156/482] only load Block shaped parts --- src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index ef383c8..51957f8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -191,14 +191,16 @@ impl GraphicsData { Some(rbx_dom_weak::types::Variant::Vector3(size)), Some(rbx_dom_weak::types::Variant::Float32(transparency)), Some(rbx_dom_weak::types::Variant::Color3uint8(color3)), + Some(rbx_dom_weak::types::Variant::Enum(shape)), ) = ( object.properties.get("CFrame"), object.properties.get("Size"), object.properties.get("Transparency"), object.properties.get("Color"), + object.properties.get("Shape"),//this will also skip unions ) { - if *transparency==1.0 { + if *transparency==1.0||shape.to_u32()!=1 { continue; } modeldatas[0].instances.push(ModelInstance { From 1c9bc347f69cb3d60eae19a553a14f2449acf1c2 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 21 Sep 2023 16:00:49 -0700 Subject: [PATCH 157/482] clear prev map --- src/main.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main.rs b/src/main.rs index 51957f8..c7ad95f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -850,6 +850,9 @@ impl strafe_client::framework::Example for GraphicsData { if let Ok(file)=std::fs::File::open(path){ let input = std::io::BufReader::new(file); let modeldatas=self.generate_modeldatas_roblox(input); + //if generate_modeldatas succeeds, clear the previous ones + self.models.clear(); + self.physics.models.clear(); self.generate_model_physics(&modeldatas); self.generate_model_graphics(device,modeldatas); }else{ From 23857d38d9c4d3b094d8c9bd356a26e3ecfb0c9a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 21 Sep 2023 20:56:24 -0700 Subject: [PATCH 158/482] no reason to double reference --- src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index c7ad95f..221e32c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -645,7 +645,7 @@ impl strafe_client::framework::Example for GraphicsData { _ => unreachable!(), }; - let skybox_image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); + let skybox_image = ddsfile::Dds::read(&mut std::io::Cursor::new(bytes)).unwrap(); let skybox_texture = device.create_texture_with_data( queue, @@ -671,9 +671,9 @@ impl strafe_client::framework::Example for GraphicsData { //squid let squid_texture_view={ - let bytes = &include_bytes!("../images/squid.dds")[..]; + let bytes = include_bytes!("../images/squid.dds"); - let image = ddsfile::Dds::read(&mut std::io::Cursor::new(&bytes)).unwrap(); + let image = ddsfile::Dds::read(&mut std::io::Cursor::new(bytes)).unwrap(); let size = wgpu::Extent3d { width: image.get_width(), From 48091fc15d7368c10a2ce5b071f80f0f27ccabe0 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 22 Sep 2023 02:24:31 -0700 Subject: [PATCH 159/482] print loaded object count for physics and graphics --- src/main.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main.rs b/src/main.rs index 221e32c..82c81ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -231,9 +231,11 @@ impl GraphicsData { //make aabb and run vertices to get realistic bounds m.instances.iter().map(|t|strafe_client::body::ModelPhysics::new(t.transform)) ).flatten().collect()); + println!("Physics Objects: {}",self.physics.models.len()); } fn generate_model_graphics(&mut self,device:&wgpu::Device,mut modeldatas:Vec){ //drain the modeldata vec so entities can be /moved/ to models.entities + let mut instance_count=0; self.models.reserve(modeldatas.len()); for (i,modeldata) in modeldatas.drain(..).enumerate() { let model_uniforms = get_instances_buffer_data(&modeldata.instances); @@ -266,6 +268,7 @@ impl GraphicsData { usage: wgpu::BufferUsages::VERTEX, }); //all of these are being moved here + instance_count+=modeldata.instances.len(); self.models.push(ModelGraphics{ instances:modeldata.instances, vertex_buf, @@ -284,6 +287,8 @@ impl GraphicsData { model_buf, }) } + println!("Graphics Objects: {}",self.models.len()); + println!("Graphics Instances: {}",instance_count); } } From 70e8f7a0ad6831a820ebad23861f447664cabd2d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 22 Sep 2023 15:19:44 -0700 Subject: [PATCH 160/482] delete stupid lib file --- src/lib.rs | 5 ----- src/main.rs | 35 ++++++++++++++++++++--------------- 2 files changed, 20 insertions(+), 20 deletions(-) delete mode 100644 src/lib.rs diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 1a053b4..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod framework; -pub mod body; -pub mod zeroes; -pub mod instruction; -pub mod load_roblox; diff --git a/src/main.rs b/src/main.rs index 82c81ff..ca8029d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,6 +12,11 @@ struct Vertex { normal: [f32; 3], color: [f32; 4], } +mod body; +mod zeroes; +mod framework; +mod instruction; +mod load_roblox; struct Entity { index_count: u32, @@ -143,7 +148,7 @@ pub struct GraphicsPipelines { pub struct GraphicsData { start_time: std::time::Instant, camera: Camera, - physics: strafe_client::body::PhysicsState, + physics: body::PhysicsState, pipelines: GraphicsPipelines, bind_groups: GraphicsBindGroups, bind_group_layouts: GraphicsBindGroupLayouts, @@ -183,7 +188,7 @@ impl GraphicsData { fn generate_modeldatas_roblox(&self,input:R) -> Vec{ let mut modeldatas=generate_modeldatas(self.handy_unit_cube.clone(),ModelData::COLOR_FLOATS_WHITE); - match strafe_client::load_roblox::get_objects(input, "BasePart") { + match load_roblox::get_objects(input, "BasePart") { Ok(objects)=>{ for object in objects.iter() { if let ( @@ -229,7 +234,7 @@ impl GraphicsData { fn generate_model_physics(&mut self,modeldatas:&Vec){ self.physics.models.append(&mut modeldatas.iter().map(|m| //make aabb and run vertices to get realistic bounds - m.instances.iter().map(|t|strafe_client::body::ModelPhysics::new(t.transform)) + m.instances.iter().map(|t|body::ModelPhysics::new(t.transform)) ).flatten().collect()); println!("Physics Objects: {}",self.physics.models.len()); } @@ -345,7 +350,7 @@ fn generate_modeldatas(data:obj::ObjData,color:[f32;4]) -> Vec{ modeldatas } -impl strafe_client::framework::Example for GraphicsData { +impl framework::Example for GraphicsData { fn optional_features() -> wgpu::Features { wgpu::Features::TEXTURE_COMPRESSION_ASTC | wgpu::Features::TEXTURE_COMPRESSION_ETC2 @@ -578,8 +583,8 @@ impl strafe_client::framework::Example for GraphicsData { yaw: 0.0, controls:0, }; - let physics = strafe_client::body::PhysicsState { - body: strafe_client::body::Body::with_pva(glam::vec3(0.0,50.0,0.0),glam::vec3(0.0,0.0,0.0),glam::vec3(0.0,-100.0,0.0)), + let physics = body::PhysicsState { + body: body::Body::with_pva(glam::vec3(0.0,50.0,0.0),glam::vec3(0.0,0.0,0.0),glam::vec3(0.0,-100.0,0.0)), time: 0, tick: 0, strafe_tick_num: 100,//100t @@ -594,7 +599,7 @@ impl strafe_client::framework::Example for GraphicsData { walkspeed: 18.0, contacts: std::collections::HashSet::new(), models: Vec::new(), - walk: strafe_client::body::WalkState::new(), + walk: body::WalkState::new(), hitbox_halfsize: glam::vec3(1.0,2.5,1.0), }; @@ -933,7 +938,7 @@ impl strafe_client::framework::Example for GraphicsData { view: &wgpu::TextureView, device: &wgpu::Device, queue: &wgpu::Queue, - _spawner: &strafe_client::framework::Spawner, + _spawner: &framework::Spawner, ) { let camera_mat=glam::Mat3::from_rotation_y(self.camera.yaw); let control_dir=camera_mat*get_control_dir(self.camera.controls&(CONTROL_MOVELEFT|CONTROL_MOVERIGHT|CONTROL_MOVEFORWARD|CONTROL_MOVEBACK)).normalize_or_zero(); @@ -946,16 +951,16 @@ impl strafe_client::framework::Example for GraphicsData { let walk_target_velocity=self.physics.walkspeed*control_dir; //autohop (already pressing spacebar; the signal to begin trying to jump is different) if self.physics.grounded&&walk_target_velocity!=self.physics.walk.target_velocity { - strafe_client::instruction::InstructionConsumer::process_instruction(&mut self.physics, strafe_client::instruction::TimedInstruction{ + instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ time, - instruction:strafe_client::body::PhysicsInstruction::SetWalkTargetVelocity(walk_target_velocity) + instruction:body::PhysicsInstruction::SetWalkTargetVelocity(walk_target_velocity) }); } if control_dir!=self.physics.temp_control_dir { - strafe_client::instruction::InstructionConsumer::process_instruction(&mut self.physics, strafe_client::instruction::TimedInstruction{ + instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ time, - instruction:strafe_client::body::PhysicsInstruction::SetControlDir(control_dir) + instruction:body::PhysicsInstruction::SetControlDir(control_dir) }); } @@ -963,9 +968,9 @@ impl strafe_client::framework::Example for GraphicsData { //autohop (already pressing spacebar; the signal to begin trying to jump is different) if self.physics.grounded&&self.physics.jump_trying { //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true - strafe_client::instruction::InstructionConsumer::process_instruction(&mut self.physics, strafe_client::instruction::TimedInstruction{ + instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ time, - instruction:strafe_client::body::PhysicsInstruction::Jump + instruction:body::PhysicsInstruction::Jump }); } @@ -1049,7 +1054,7 @@ impl strafe_client::framework::Example for GraphicsData { } fn main() { - strafe_client::framework::run::( + framework::run::( format!("Strafe Client v{}", env!("CARGO_PKG_VERSION") ).as_str() From 2e786b090f147ad62f66afe909ba1e4c4ba6f8cc Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 22 Sep 2023 15:20:41 -0700 Subject: [PATCH 161/482] no need for hardcoded image size --- src/main.rs | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/main.rs b/src/main.rs index ca8029d..088891f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,8 +2,6 @@ use bytemuck::{Pod, Zeroable}; use std::{borrow::Cow, time::Instant}; use wgpu::{util::DeviceExt, AstcBlock, AstcChannel}; -const IMAGE_SIZE: u32 = 128; - #[derive(Clone, Copy, Pod, Zeroable)] #[repr(C)] struct Vertex { @@ -624,26 +622,6 @@ impl framework::Example for GraphicsData { wgpu::TextureFormat::Bgra8UnormSrgb }; - let size = wgpu::Extent3d { - width: IMAGE_SIZE, - height: IMAGE_SIZE, - depth_or_array_layers: 6, - }; - - let layer_size = wgpu::Extent3d { - depth_or_array_layers: 1, - ..size - }; - let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); - - log::debug!( - "Copying {:?} skybox images of size {}, {}, 6 with {} mips to gpu", - skybox_format, - IMAGE_SIZE, - IMAGE_SIZE, - max_mips, - ); - let bytes = match skybox_format { wgpu::TextureFormat::Astc { block: AstcBlock::B4x4, @@ -657,6 +635,26 @@ impl framework::Example for GraphicsData { let skybox_image = ddsfile::Dds::read(&mut std::io::Cursor::new(bytes)).unwrap(); + let size = wgpu::Extent3d { + width: skybox_image.get_width(), + height: skybox_image.get_height(), + depth_or_array_layers: 6, + }; + + let layer_size = wgpu::Extent3d { + depth_or_array_layers: 1, + ..size + }; + let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); + + log::debug!( + "Copying {:?} skybox images of size {}, {}, 6 with {} mips to gpu", + skybox_format, + size.width, + size.height, + max_mips, + ); + let skybox_texture = device.create_texture_with_data( queue, &wgpu::TextureDescriptor { From eafcbae677ccc59e9fc07598c581aa4a4a45a48d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 22 Sep 2023 15:21:13 -0700 Subject: [PATCH 162/482] add model.rs --- src/main.rs | 27 ++------------------------- src/model.rs | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 25 deletions(-) create mode 100644 src/model.rs diff --git a/src/main.rs b/src/main.rs index 088891f..6d9f0fd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,9 @@ -use bytemuck::{Pod, Zeroable}; use std::{borrow::Cow, time::Instant}; use wgpu::{util::DeviceExt, AstcBlock, AstcChannel}; +use model::{Vertex,ModelData,ModelInstance}; -#[derive(Clone, Copy, Pod, Zeroable)] -#[repr(C)] -struct Vertex { - pos: [f32; 3], - texture: [f32; 2], - normal: [f32; 3], - color: [f32; 4], -} mod body; +mod model; mod zeroes; mod framework; mod instruction; @@ -21,22 +14,6 @@ struct Entity { index_buf: wgpu::Buffer, } -struct ModelInstance { - transform: glam::Mat4, - color: glam::Vec4, -} - -struct ModelData { - instances: Vec, - vertices: Vec, - entities: Vec>, -} - -impl ModelData { - const COLOR_FLOATS_WHITE: [f32;4] = [1.0,1.0,1.0,1.0]; - const COLOR_VEC4_WHITE: glam::Vec4 = glam::vec4(1.0,1.0,1.0,1.0); -} - struct ModelGraphics { instances: Vec, vertex_buf: wgpu::Buffer, diff --git a/src/model.rs b/src/model.rs new file mode 100644 index 0000000..e2ac139 --- /dev/null +++ b/src/model.rs @@ -0,0 +1,25 @@ +use bytemuck::{Pod, Zeroable}; +#[derive(Clone, Copy, Pod, Zeroable)] +#[repr(C)] +pub struct Vertex { + pub pos: [f32; 3], + pub texture: [f32; 2], + pub normal: [f32; 3], + pub color: [f32; 4], +} + +pub struct ModelInstance { + pub transform: glam::Mat4, + pub color: glam::Vec4, +} + +pub struct ModelData { + pub instances: Vec, + pub vertices: Vec, + pub entities: Vec>, +} + +impl ModelData { + pub const COLOR_FLOATS_WHITE: [f32;4] = [1.0,1.0,1.0,1.0]; + pub const COLOR_VEC4_WHITE: glam::Vec4 = glam::vec4(1.0,1.0,1.0,1.0); +} \ No newline at end of file From a803ada0e42e3d0a6cc120bd7e0b03272792e981 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 22 Sep 2023 15:21:59 -0700 Subject: [PATCH 163/482] zeroes2 inline maybe --- src/zeroes.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zeroes.rs b/src/zeroes.rs index 02fec71..f220302 100644 --- a/src/zeroes.rs +++ b/src/zeroes.rs @@ -1,4 +1,5 @@ //find roots of polynomials +#[inline] pub fn zeroes2(a0:f32,a1:f32,a2:f32) -> Vec{ if a2==0f32{ return zeroes1(a0, a1); From b513e4037d8a368d060a70ee5f5c0146f74ef485 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 25 Sep 2023 12:38:53 -0700 Subject: [PATCH 164/482] pick adapter better lole --- src/framework.rs | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/framework.rs b/src/framework.rs index 9a24440..08b7738 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -181,9 +181,35 @@ async fn setup(title: &str) -> Setup { (size, surface) }; - let adapter = wgpu::util::initialize_adapter_from_env_or_default(&instance, Some(&surface)) - .await - .expect("No suitable GPU adapters found on the system!"); + + let adapter; + + let optional_features = E::optional_features(); + let required_features = E::required_features(); + + //no helper function smh gotta write it myself + let adapters = instance.enumerate_adapters(backends); + + let mut chosen_adapter = None; + for adapter in adapters { + if !adapter.is_surface_supported(&surface) { + continue; + } + + let adapter_features = adapter.features(); + if adapter_features.contains(required_features) { + chosen_adapter = Some(adapter); + if adapter_features.contains(optional_features) { + break; + } + } + } + + if let Some(maybe_chosen_adapter) = chosen_adapter{ + adapter=maybe_chosen_adapter; + }else{ + panic!("No suitable GPU adapters found on the system!"); + } #[cfg(not(target_arch = "wasm32"))] { @@ -191,15 +217,6 @@ async fn setup(title: &str) -> Setup { println!("Using {} ({:?})", adapter_info.name, adapter_info.backend); } - let optional_features = E::optional_features(); - let required_features = E::required_features(); - let adapter_features = adapter.features(); - assert!( - adapter_features.contains(required_features), - "Adapter does not support required features for this example: {:?}", - required_features - adapter_features - ); - let required_downlevel_capabilities = E::required_downlevel_capabilities(); let downlevel_capabilities = adapter.get_downlevel_capabilities(); assert!( @@ -223,7 +240,7 @@ async fn setup(title: &str) -> Setup { .request_device( &wgpu::DeviceDescriptor { label: None, - features: (optional_features & adapter_features) | required_features, + features: (optional_features & adapter.features()) | required_features, limits: needed_limits, }, trace_dir.ok().as_ref().map(std::path::Path::new), From c868a91a06b3a6ae16d79b8ffa184f372e4682f7 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 25 Sep 2023 19:20:36 -0700 Subject: [PATCH 165/482] revert storage buffers: no igpus support --- src/main.rs | 7 ++----- src/shader.wgsl | 3 ++- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6d9f0fd..4871c2c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -222,7 +222,7 @@ impl GraphicsData { let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some(format!("ModelGraphics{}",i).as_str()), contents: bytemuck::cast_slice(&model_uniforms), - usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST, + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, }); let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { layout: &self.bind_group_layouts.model, @@ -331,9 +331,6 @@ impl framework::Example for GraphicsData { | wgpu::Features::TEXTURE_COMPRESSION_ETC2 | wgpu::Features::TEXTURE_COMPRESSION_BC } - fn required_features() -> wgpu::Features { - wgpu::Features::STORAGE_RESOURCE_BINDING_ARRAY - } fn required_limits() -> wgpu::Limits { wgpu::Limits::default() //framework.rs was using goofy limits that caused me a multi-day headache } @@ -498,7 +495,7 @@ impl framework::Example for GraphicsData { binding: 0, visibility: wgpu::ShaderStages::VERTEX, ty: wgpu::BindingType::Buffer { - ty: wgpu::BufferBindingType::Storage { read_only: true }, + ty: wgpu::BufferBindingType::Uniform, has_dynamic_offset: false, min_binding_size: None, }, diff --git a/src/shader.wgsl b/src/shader.wgsl index d886a73..e289c02 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -49,9 +49,10 @@ struct ModelInstance{ //my fancy idea is to create a megatexture for each model that includes all the textures each intance will need //the texture transform then maps the texture coordinates to the location of the specific texture //group 1 is the model +const MAX_MODEL_INSTANCES=4096; @group(1) @binding(0) -var model_instances: array; +var model_instances: array; @group(1) @binding(1) var model_texture: texture_2d; From 6da4c818268ab5dd8152a59fa245779802fdebea Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 25 Sep 2023 19:31:44 -0700 Subject: [PATCH 166/482] rank device types and ignore user preference --- src/framework.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/framework.rs b/src/framework.rs index 08b7738..b70479e 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -191,17 +191,23 @@ async fn setup(title: &str) -> Setup { let adapters = instance.enumerate_adapters(backends); let mut chosen_adapter = None; + let mut chosen_adapter_score=0; for adapter in adapters { if !adapter.is_surface_supported(&surface) { continue; } + let score=match adapter.get_info().device_type{ + wgpu::DeviceType::IntegratedGpu=>3, + wgpu::DeviceType::DiscreteGpu=>4, + wgpu::DeviceType::VirtualGpu=>2, + wgpu::DeviceType::Other|wgpu::DeviceType::Cpu=>1, + }; + let adapter_features = adapter.features(); - if adapter_features.contains(required_features) { - chosen_adapter = Some(adapter); - if adapter_features.contains(optional_features) { - break; - } + if chosen_adapter_score Date: Tue, 26 Sep 2023 14:25:44 -0700 Subject: [PATCH 167/482] file loader multiplexer, pass dom to load_roblox --- src/load_roblox.rs | 4 +--- src/main.rs | 45 ++++++++++++++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 1fe10e2..d555879 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -10,10 +10,8 @@ fn class_is_a(class: &str, superclass: &str) -> bool { } return false } -pub fn get_objects(buf_thing: R, superclass: &str) -> Result, Box> { - // Using buffered I/O is recommended with rbx_binary - let dom = rbx_binary::from_reader(buf_thing)?; +pub fn get_objects(dom:rbx_dom_weak::WeakDom, superclass: &str) -> Result, Box> { let mut objects = std::vec::Vec::::new(); //move matching instances into objects let (_,mut instances) = dom.into_raw(); diff --git a/src/main.rs b/src/main.rs index 4871c2c..1aaf2d9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -161,9 +161,9 @@ impl GraphicsData { depth_texture.create_view(&wgpu::TextureViewDescriptor::default()) } - fn generate_modeldatas_roblox(&self,input:R) -> Vec{ + fn generate_modeldatas_roblox(&self,dom:rbx_dom_weak::WeakDom) -> Vec{ let mut modeldatas=generate_modeldatas(self.handy_unit_cube.clone(),ModelData::COLOR_FLOATS_WHITE); - match load_roblox::get_objects(input, "BasePart") { + match load_roblox::get_objects(dom, "BasePart") { Ok(objects)=>{ for object in objects.iter() { if let ( @@ -830,13 +830,40 @@ impl framework::Example for GraphicsData { println!("opening file: {:?}", &path); //oh boy! let's load the map! if let Ok(file)=std::fs::File::open(path){ - let input = std::io::BufReader::new(file); - let modeldatas=self.generate_modeldatas_roblox(input); - //if generate_modeldatas succeeds, clear the previous ones - self.models.clear(); - self.physics.models.clear(); - self.generate_model_physics(&modeldatas); - self.generate_model_graphics(device,modeldatas); + let mut input = std::io::BufReader::new(file); + let mut first_8=[0u8;8]; + //.rbxm roblox binary = " Date: Tue, 26 Sep 2023 14:26:05 -0700 Subject: [PATCH 168/482] support rbxmx --- Cargo.lock | 15 +++++++++++++++ Cargo.toml | 1 + src/main.rs | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 6af09af..c8b2873 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1442,6 +1442,20 @@ dependencies = [ "thiserror", ] +[[package]] +name = "rbx_xml" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bc65b70827519fdc4ab47416d1085b912f087fadab9ed415471b6daba635574" +dependencies = [ + "base64", + "log", + "rbx_dom_weak", + "rbx_reflection", + "rbx_reflection_database", + "xml-rs", +] + [[package]] name = "redox_syscall" version = "0.3.5" @@ -1658,6 +1672,7 @@ dependencies = [ "rbx_binary", "rbx_dom_weak", "rbx_reflection_database", + "rbx_xml", "wgpu", "winit", ] diff --git a/Cargo.toml b/Cargo.toml index c8e0776..0481dcf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ pollster = "0.3.0" rbx_binary = "0.7.1" rbx_dom_weak = "2.5.0" rbx_reflection_database = "0.2.7" +rbx_xml = "0.13.1" wgpu = "0.17.0" winit = "0.28.6" diff --git a/src/main.rs b/src/main.rs index 1aaf2d9..b6ca2c9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -847,6 +847,12 @@ impl framework::Example for GraphicsData { }else{ None } + }else if &first_8==b" Date: Fri, 22 Sep 2023 15:43:59 -0700 Subject: [PATCH 169/482] keep textures out of git --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ea8c4bf..71b575d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +/textures \ No newline at end of file From ff7b12e90ec39f8ff83d7e6d038ced52c7fa26c3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 22 Sep 2023 17:48:09 -0700 Subject: [PATCH 170/482] add regex dep for load_roblox --- Cargo.lock | 9 +++++---- Cargo.toml | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c8b2873..0d124d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1467,9 +1467,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick", "memchr", @@ -1479,9 +1479,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" dependencies = [ "aho-corasick", "memchr", @@ -1673,6 +1673,7 @@ dependencies = [ "rbx_dom_weak", "rbx_reflection_database", "rbx_xml", + "regex", "wgpu", "winit", ] diff --git a/Cargo.toml b/Cargo.toml index 0481dcf..b3df40d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ rbx_binary = "0.7.1" rbx_dom_weak = "2.5.0" rbx_reflection_database = "0.2.7" rbx_xml = "0.13.1" +regex = "1.9.5" wgpu = "0.17.0" winit = "0.28.6" From 31156aadfbf8aeb67f2b619a66fe33e502f85d5e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 22 Sep 2023 19:41:27 -0700 Subject: [PATCH 171/482] load textures + spawn point --- src/body.rs | 14 +- src/framework.rs | 4 +- src/load_roblox.rs | 133 ++++++++++++++++-- src/main.rs | 344 ++++++++++++++++----------------------------- src/model.rs | 45 ++++++ src/primitives.rs | 76 ++++++++++ 6 files changed, 383 insertions(+), 233 deletions(-) create mode 100644 src/primitives.rs diff --git a/src/body.rs b/src/body.rs index 64436d9..27ff28c 100644 --- a/src/body.rs +++ b/src/body.rs @@ -16,6 +16,8 @@ pub enum PhysicsInstruction { // bool,//true = Trigger; false = teleport // bool,//true = Force // ) + //temp + SetPosition(glam::Vec3), } pub struct Body { @@ -756,6 +758,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat //selectively update body match &ins.instruction { PhysicsInstruction::SetWalkTargetVelocity(_) + |PhysicsInstruction::SetPosition(_) |PhysicsInstruction::SetControlDir(_) => self.time=ins.time,//TODO: queue instructions PhysicsInstruction::RefreshWalkTarget |PhysicsInstruction::ReachWalkTargetVelocity @@ -765,6 +768,15 @@ impl crate::instruction::InstructionConsumer for PhysicsStat |PhysicsInstruction::Jump => self.advance_time(ins.time), } match ins.instruction { + PhysicsInstruction::SetPosition(position)=>{ + //temp + self.body.position=position; + //manual clear //for c in self.contacts{process_instruction(CollisionEnd(c))} + self.contacts.clear(); + self.body.acceleration=self.gravity; + self.walk.state=WalkEnum::Reached; + self.grounded=false; + } PhysicsInstruction::CollisionStart(c) => { //check ground match &c.face { @@ -854,4 +866,4 @@ impl crate::instruction::InstructionConsumer for PhysicsStat }, } } -} \ No newline at end of file +} diff --git a/src/framework.rs b/src/framework.rs index b70479e..b471c22 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -53,7 +53,7 @@ pub trait Example: 'static + Sized { device: &wgpu::Device, queue: &wgpu::Queue, ); - fn update(&mut self, device: &wgpu::Device, event: WindowEvent); + fn update(&mut self, device: &wgpu::Device, queue: &wgpu::Queue, event: WindowEvent); fn move_mouse(&mut self, delta: (f64,f64)); fn render( &mut self, @@ -369,7 +369,7 @@ fn start( println!("{:#?}", instance.generate_report()); } _ => { - example.update(&device,event); + example.update(&device,&queue,event); } }, event::Event::DeviceEvent { diff --git a/src/load_roblox.rs b/src/load_roblox.rs index d555879..0403c07 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -1,3 +1,7 @@ +use crate::model::{ModelData,ModelInstance}; + +use crate::primitives; + fn class_is_a(class: &str, superclass: &str) -> bool { if class==superclass { return true @@ -10,16 +14,125 @@ fn class_is_a(class: &str, superclass: &str) -> bool { } return false } - -pub fn get_objects(dom:rbx_dom_weak::WeakDom, superclass: &str) -> Result, Box> { - let mut objects = std::vec::Vec::::new(); - //move matching instances into objects - let (_,mut instances) = dom.into_raw(); - for (_,instance) in instances.drain() { - if class_is_a(instance.class.as_str(), superclass) { - objects.push(instance); +fn recursive_collect_superclass(objects: &mut std::vec::Vec,dom: &rbx_dom_weak::WeakDom, instance: &rbx_dom_weak::Instance, superclass: &str){ + for &referent in instance.children() { + if let Some(c) = dom.get_by_ref(referent) { + if class_is_a(c.class.as_str(), superclass) { + objects.push(c.referent());//copy ref + } + recursive_collect_superclass(objects,dom,c,superclass); } } - - return Ok(objects) +} +fn get_texture_refs(dom:&rbx_dom_weak::WeakDom) -> Vec{ + let mut objects = std::vec::Vec::new(); + recursive_collect_superclass(&mut objects, dom, dom.root(),"Decal"); + //get ids + //clear vec + //next class + objects +} + +struct RobloxAssetId(u64); +struct RobloxAssetIdParseErr; +impl std::str::FromStr for RobloxAssetId { + type Err=RobloxAssetIdParseErr; + fn from_str(s: &str) -> Result{ + let regman=regex::Regex::new(r"(\d+)$").unwrap(); + if let Some(captures) = regman.captures(s) { + if captures.len()==2{//captures[0] is all captures concatenated, and then each individual capture + if let Ok(id) = captures[0].parse::() { + return Ok(Self(id)); + } + } + } + Err(RobloxAssetIdParseErr) + } +} +pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec,Vec,glam::Vec3), Box>{ + //ModelData includes texture dds + let mut spawn_point=glam::Vec3::ZERO; + + //TODO: generate unit Block, Wedge, etc. after based on part shape lists + let mut modeldatas=crate::model::generate_modeldatas(primitives::the_unit_cube_lol(),ModelData::COLOR_FLOATS_WHITE); + let unit_cube_modeldata=modeldatas[0].clone(); + + let mut texture_id_from_asset_id=std::collections::HashMap::::new(); + let mut asset_id_from_texture_id=Vec::new(); + + let mut object_refs = std::vec::Vec::new(); + let mut temp_objects = std::vec::Vec::new(); + recursive_collect_superclass(&mut object_refs, &dom, dom.root(),"BasePart"); + for object_ref in object_refs { + if let Some(object)=dom.get_by_ref(object_ref){ + if let ( + Some(rbx_dom_weak::types::Variant::CFrame(cf)), + Some(rbx_dom_weak::types::Variant::Vector3(size)), + Some(rbx_dom_weak::types::Variant::Float32(transparency)), + Some(rbx_dom_weak::types::Variant::Color3uint8(color3)), + Some(rbx_dom_weak::types::Variant::Enum(shape)), + ) = ( + object.properties.get("CFrame"), + object.properties.get("Size"), + object.properties.get("Transparency"), + object.properties.get("Color"), + object.properties.get("Shape"),//this will also skip unions + ) + { + let model_instance=ModelInstance { + transform:glam::Mat4::from_translation( + glam::Vec3::new(cf.position.x,cf.position.y,cf.position.z) + ) + * glam::Mat4::from_mat3( + glam::Mat3::from_cols( + glam::Vec3::new(cf.orientation.x.x,cf.orientation.y.x,cf.orientation.z.x), + glam::Vec3::new(cf.orientation.x.y,cf.orientation.y.y,cf.orientation.z.y), + glam::Vec3::new(cf.orientation.x.z,cf.orientation.y.z,cf.orientation.z.z), + ), + ) + * glam::Mat4::from_scale( + glam::Vec3::new(size.x,size.y,size.z)/2.0 + ), + color: glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), + }; + if object.name=="MapStart"{ + spawn_point=glam::Vec4Swizzles::xyz(model_instance.transform*glam::Vec3::Y.extend(1.0))+glam::vec3(0.0,2.5,0.0); + println!("Found MapStart{:?}",spawn_point); + } + if *transparency==1.0||shape.to_u32()!=1 { + continue; + } + temp_objects.clear(); + recursive_collect_superclass(&mut temp_objects, &dom, object,"Decal"); + + let mut i_can_only_load_one_texture_per_model=None; + for &decal_ref in &temp_objects{ + if let Some(decal)=dom.get_by_ref(decal_ref){ + if let Some(rbx_dom_weak::types::Variant::Content(content)) = decal.properties.get("Texture") { + if let Ok(asset_id)=content.clone().into_string().parse::(){ + if let Some(&texture_id)=texture_id_from_asset_id.get(&asset_id.0){ + i_can_only_load_one_texture_per_model=Some(texture_id); + }else{ + let texture_id=asset_id_from_texture_id.len(); + texture_id_from_asset_id.insert(asset_id.0,texture_id as u32); + asset_id_from_texture_id.push(asset_id.0); + //make new model + let mut unit_cube_texture=unit_cube_modeldata.clone(); + unit_cube_texture.texture=Some(texture_id as u32); + modeldatas.push(unit_cube_texture); + } + } + } + } + } + match i_can_only_load_one_texture_per_model{ + //push to existing texture model + Some(texture_id)=>modeldatas[(texture_id+1) as usize].instances.push(model_instance), + //push instance to big unit cube in the sky + None=>modeldatas[0].instances.push(model_instance), + } + } + } + } + Ok((modeldatas,asset_id_from_texture_id.iter().map(|t|t.to_string()).collect(),spawn_point)) } diff --git a/src/main.rs b/src/main.rs index b6ca2c9..95a5b6b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ mod body; mod model; mod zeroes; mod framework; +mod primitives; mod instruction; mod load_roblox; @@ -133,7 +134,6 @@ pub struct GraphicsData { models: Vec, depth_view: wgpu::TextureView, staging_belt: wgpu::util::StagingBelt, - handy_unit_cube: obj::ObjData, } impl GraphicsData { @@ -161,51 +161,6 @@ impl GraphicsData { depth_texture.create_view(&wgpu::TextureViewDescriptor::default()) } - fn generate_modeldatas_roblox(&self,dom:rbx_dom_weak::WeakDom) -> Vec{ - let mut modeldatas=generate_modeldatas(self.handy_unit_cube.clone(),ModelData::COLOR_FLOATS_WHITE); - match load_roblox::get_objects(dom, "BasePart") { - Ok(objects)=>{ - for object in objects.iter() { - if let ( - Some(rbx_dom_weak::types::Variant::CFrame(cf)), - Some(rbx_dom_weak::types::Variant::Vector3(size)), - Some(rbx_dom_weak::types::Variant::Float32(transparency)), - Some(rbx_dom_weak::types::Variant::Color3uint8(color3)), - Some(rbx_dom_weak::types::Variant::Enum(shape)), - ) = ( - object.properties.get("CFrame"), - object.properties.get("Size"), - object.properties.get("Transparency"), - object.properties.get("Color"), - object.properties.get("Shape"),//this will also skip unions - ) - { - if *transparency==1.0||shape.to_u32()!=1 { - continue; - } - modeldatas[0].instances.push(ModelInstance { - transform:glam::Mat4::from_translation( - glam::Vec3::new(cf.position.x,cf.position.y,cf.position.z) - ) - * glam::Mat4::from_mat3( - glam::Mat3::from_cols( - glam::Vec3::new(cf.orientation.x.x,cf.orientation.y.x,cf.orientation.z.x), - glam::Vec3::new(cf.orientation.x.y,cf.orientation.y.y,cf.orientation.z.y), - glam::Vec3::new(cf.orientation.x.z,cf.orientation.y.z,cf.orientation.z.z), - ), - ) - * glam::Mat4::from_scale( - glam::Vec3::new(size.x,size.y,size.z)/2.0 - ), - color: glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), - }) - } - } - }, - Err(e) => println!("lmao err {:?}", e), - } - modeldatas - } fn generate_model_physics(&mut self,modeldatas:&Vec){ self.physics.models.append(&mut modeldatas.iter().map(|m| //make aabb and run vertices to get realistic bounds @@ -213,59 +168,117 @@ impl GraphicsData { ).flatten().collect()); println!("Physics Objects: {}",self.physics.models.len()); } - fn generate_model_graphics(&mut self,device:&wgpu::Device,mut modeldatas:Vec){ + fn generate_model_graphics(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,mut modeldatas:Vec,textures:Vec){ + //generate texture view per texture + + //idk how to do this gooder lol + let mut double_map=std::collections::HashMap::::new(); + let mut texture_views:Vec=Vec::with_capacity(textures.len()); + for (i,t) in textures.iter().enumerate(){ + if let Ok(mut file) = std::fs::File::open(std::path::Path::new(&format!("textures/{}.dds",t))){ + let image = ddsfile::Dds::read(&mut file).unwrap(); + + let size = wgpu::Extent3d { + width: image.get_width()/4*4,//floor(w,4), should be ceil(w,4) + height: image.get_height()/4*4, + depth_or_array_layers: 1, + }; + + let layer_size = wgpu::Extent3d { + depth_or_array_layers: 1, + ..size + }; + let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); + + let texture = device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor { + size, + mip_level_count: max_mips, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Bc7RgbaUnorm, + usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + label: Some(format!("Texture{}",i).as_str()), + view_formats: &[], + }, + &image.data, + ); + + double_map.insert(i as u32, texture_views.len() as u32); + texture_views.push(texture.create_view(&wgpu::TextureViewDescriptor { + label: Some(format!("Texture{} View",i).as_str()), + dimension: Some(wgpu::TextureViewDimension::D2), + ..wgpu::TextureViewDescriptor::default() + })); + } + } //drain the modeldata vec so entities can be /moved/ to models.entities let mut instance_count=0; self.models.reserve(modeldatas.len()); for (i,modeldata) in modeldatas.drain(..).enumerate() { - let model_uniforms = get_instances_buffer_data(&modeldata.instances); - let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some(format!("ModelGraphics{}",i).as_str()), - contents: bytemuck::cast_slice(&model_uniforms), - usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, - }); - let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - layout: &self.bind_group_layouts.model, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: model_buf.as_entire_binding(), + let n_instances=modeldata.instances.len(); + if 0{ + match double_map.get(&texture_id){ + Some(&mapped_texture_id)=>&texture_views[mapped_texture_id as usize], + None=>&self.temp_squid_texture_view, + } }, - wgpu::BindGroupEntry { - binding: 1, - resource: wgpu::BindingResource::TextureView(&self.temp_squid_texture_view), - }, - wgpu::BindGroupEntry { - binding: 2, - resource: wgpu::BindingResource::Sampler(&self.samplers.repeat), - }, - ], - label: Some(format!("ModelGraphics{}",i).as_str()), - }); - let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Vertex"), - contents: bytemuck::cast_slice(&modeldata.vertices), - usage: wgpu::BufferUsages::VERTEX, - }); - //all of these are being moved here - instance_count+=modeldata.instances.len(); - self.models.push(ModelGraphics{ - instances:modeldata.instances, - vertex_buf, - entities: modeldata.entities.iter().map(|indices|{ - let index_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("Index"), - contents: bytemuck::cast_slice(&indices), - usage: wgpu::BufferUsages::INDEX, - }); - Entity { - index_buf, - index_count: indices.len() as u32, - } - }).collect(), - bind_group: model_bind_group, - model_buf, - }) + None=>&self.temp_squid_texture_view, + }; + let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &self.bind_group_layouts.model, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: model_buf.as_entire_binding(), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(texture_view), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: wgpu::BindingResource::Sampler(&self.samplers.repeat), + }, + ], + label: Some(format!("Model{} Bind Group",i).as_str()), + }); + let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Vertex"), + contents: bytemuck::cast_slice(&modeldata.vertices), + usage: wgpu::BufferUsages::VERTEX, + }); + //all of these are being moved here + instance_count+=n_instances; + self.models.push(ModelGraphics{ + instances:modeldata.instances, + vertex_buf, + entities: modeldata.entities.iter().map(|indices|{ + let index_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Index"), + contents: bytemuck::cast_slice(&indices), + usage: wgpu::BufferUsages::INDEX, + }); + Entity { + index_buf, + index_count: indices.len() as u32, + } + }).collect(), + bind_group: model_bind_group, + model_buf, + }); + }else{ + println!("WARNING: Model{} has 0 instances",i); + } } println!("Graphics Objects: {}",self.models.len()); println!("Graphics Instances: {}",instance_count); @@ -284,47 +297,6 @@ fn get_instances_buffer_data(instances:&Vec) -> Vec { raw } -fn generate_modeldatas(data:obj::ObjData,color:[f32;4]) -> Vec{ - let mut modeldatas=Vec::new(); - let mut vertices = Vec::new(); - let mut vertex_index = std::collections::HashMap::::new(); - for object in data.objects { - vertices.clear(); - vertex_index.clear(); - let mut entities = Vec::new(); - for group in object.groups { - let mut indices = Vec::new(); - for poly in group.polys { - for end_index in 2..poly.0.len() { - for &index in &[0, end_index - 1, end_index] { - let vert = poly.0[index]; - if let Some(&i)=vertex_index.get(&vert){ - indices.push(i); - }else{ - let i=vertices.len() as u16; - vertices.push(Vertex { - pos: data.position[vert.0], - texture: data.texture[vert.1.unwrap()], - normal: data.normal[vert.2.unwrap()], - color, - }); - vertex_index.insert(vert,i); - indices.push(i); - } - } - } - } - entities.push(indices); - } - modeldatas.push(ModelData { - instances: Vec::new(), - vertices:vertices.clone(), - entities, - }); - } - modeldatas -} - impl framework::Example for GraphicsData { fn optional_features() -> wgpu::Features { wgpu::Features::TEXTURE_COMPRESSION_ASTC @@ -340,85 +312,12 @@ impl framework::Example for GraphicsData { device: &wgpu::Device, queue: &wgpu::Queue, ) -> Self { - let unit_cube=obj::ObjData{ - position: vec![ - [-1.,-1., 1.],//left bottom back - [ 1.,-1., 1.],//right bottom back - [ 1., 1., 1.],//right top back - [-1., 1., 1.],//left top back - [-1., 1.,-1.],//left top front - [ 1., 1.,-1.],//right top front - [ 1.,-1.,-1.],//right bottom front - [-1.,-1.,-1.],//left bottom front - ], - texture: vec![[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0]], - normal: vec![ - [1.,0.,0.],//AabbFace::Right - [0.,1.,0.],//AabbFace::Top - [0.,0.,1.],//AabbFace::Back - [-1.,0.,0.],//AabbFace::Left - [0.,-1.,0.],//AabbFace::Bottom - [0.,0.,-1.],//AabbFace::Front - ], - objects: vec![obj::Object{ - name: "Unit Cube".to_owned(), - groups: vec![obj::Group{ - name: "Cube Vertices".to_owned(), - index: 0, - material: None, - polys: vec![ - // back (0, 0, 1) - obj::SimplePolygon(vec![ - obj::IndexTuple(0,Some(0),Some(2)), - obj::IndexTuple(1,Some(1),Some(2)), - obj::IndexTuple(2,Some(2),Some(2)), - obj::IndexTuple(3,Some(3),Some(2)), - ]), - // front (0, 0,-1) - obj::SimplePolygon(vec![ - obj::IndexTuple(4,Some(0),Some(5)), - obj::IndexTuple(5,Some(1),Some(5)), - obj::IndexTuple(6,Some(2),Some(5)), - obj::IndexTuple(7,Some(3),Some(5)), - ]), - // right (1, 0, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(6,Some(0),Some(0)), - obj::IndexTuple(5,Some(1),Some(0)), - obj::IndexTuple(2,Some(2),Some(0)), - obj::IndexTuple(1,Some(3),Some(0)), - ]), - // left (-1, 0, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(0,Some(0),Some(3)), - obj::IndexTuple(3,Some(1),Some(3)), - obj::IndexTuple(4,Some(2),Some(3)), - obj::IndexTuple(7,Some(3),Some(3)), - ]), - // top (0, 1, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(5,Some(1),Some(1)), - obj::IndexTuple(4,Some(0),Some(1)), - obj::IndexTuple(3,Some(3),Some(1)), - obj::IndexTuple(2,Some(2),Some(1)), - ]), - // bottom (0,-1, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(1,Some(1),Some(4)), - obj::IndexTuple(0,Some(0),Some(4)), - obj::IndexTuple(7,Some(3),Some(4)), - obj::IndexTuple(6,Some(2),Some(4)), - ]), - ], - }] - }], - material_libs: Vec::new(), - }; + let unit_cube=primitives::the_unit_cube_lol(); let mut modeldatas = Vec::::new(); - modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); - modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); - modeldatas.append(&mut generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); - modeldatas.append(&mut generate_modeldatas(unit_cube.clone(),ModelData::COLOR_FLOATS_WHITE)); + modeldatas.append(&mut model::generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); + modeldatas.append(&mut model::generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); + modeldatas.append(&mut model::generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); + modeldatas.append(&mut model::generate_modeldatas(unit_cube.clone(),ModelData::COLOR_FLOATS_WHITE)); println!("models.len = {:?}", modeldatas.len()); modeldatas[0].instances.push(ModelInstance{ transform:glam::Mat4::from_translation(glam::vec3(10.,0.,-10.)), @@ -795,7 +694,6 @@ impl framework::Example for GraphicsData { let depth_view = Self::create_depth_texture(config, device); let mut graphics=GraphicsData { - handy_unit_cube:unit_cube, start_time: Instant::now(), camera, physics, @@ -817,13 +715,13 @@ impl framework::Example for GraphicsData { }; graphics.generate_model_physics(&modeldatas); - graphics.generate_model_graphics(&device,modeldatas); + graphics.generate_model_graphics(&device,&queue,modeldatas,Vec::new()); return graphics; } #[allow(clippy::single_match)] - fn update(&mut self, device: &wgpu::Device, event: winit::event::WindowEvent) { + fn update(&mut self, device: &wgpu::Device, queue: &wgpu::Queue, event: winit::event::WindowEvent) { //nothing atm match event { winit::event::WindowEvent::DroppedFile(path) => { @@ -840,16 +738,16 @@ impl framework::Example for GraphicsData { //.snf = "SNBF" if let (Ok(()),Ok(()))=(std::io::Read::read_exact(&mut input, &mut first_8),std::io::Seek::rewind(&mut input)){ // - if let Some(modeldatas)={ + if let Some(Ok((modeldatas,textures,spawn_point)))={ if &first_8==b", pub vertices: Vec, pub entities: Vec>, + pub texture: Option, } impl ModelData { pub const COLOR_FLOATS_WHITE: [f32;4] = [1.0,1.0,1.0,1.0]; pub const COLOR_VEC4_WHITE: glam::Vec4 = glam::vec4(1.0,1.0,1.0,1.0); +} + +pub fn generate_modeldatas(data:obj::ObjData,color:[f32;4]) -> Vec{ + let mut modeldatas=Vec::new(); + let mut vertices = Vec::new(); + let mut vertex_index = std::collections::HashMap::::new(); + for object in data.objects { + vertices.clear(); + vertex_index.clear(); + let mut entities = Vec::new(); + for group in object.groups { + let mut indices = Vec::new(); + for poly in group.polys { + for end_index in 2..poly.0.len() { + for &index in &[0, end_index - 1, end_index] { + let vert = poly.0[index]; + if let Some(&i)=vertex_index.get(&vert){ + indices.push(i); + }else{ + let i=vertices.len() as u16; + vertices.push(Vertex { + pos: data.position[vert.0], + texture: data.texture[vert.1.unwrap()], + normal: data.normal[vert.2.unwrap()], + color, + }); + vertex_index.insert(vert,i); + indices.push(i); + } + } + } + } + entities.push(indices); + } + modeldatas.push(ModelData { + instances: Vec::new(), + vertices:vertices.clone(), + entities, + texture: None, + }); + } + modeldatas } \ No newline at end of file diff --git a/src/primitives.rs b/src/primitives.rs new file mode 100644 index 0000000..a3c86d0 --- /dev/null +++ b/src/primitives.rs @@ -0,0 +1,76 @@ +pub fn the_unit_cube_lol() -> obj::ObjData{ + obj::ObjData{ + position: vec![ + [-1.,-1., 1.],//left bottom back + [ 1.,-1., 1.],//right bottom back + [ 1., 1., 1.],//right top back + [-1., 1., 1.],//left top back + [-1., 1.,-1.],//left top front + [ 1., 1.,-1.],//right top front + [ 1.,-1.,-1.],//right bottom front + [-1.,-1.,-1.],//left bottom front + ], + texture: vec![[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0]], + normal: vec![ + [1.,0.,0.],//AabbFace::Right + [0.,1.,0.],//AabbFace::Top + [0.,0.,1.],//AabbFace::Back + [-1.,0.,0.],//AabbFace::Left + [0.,-1.,0.],//AabbFace::Bottom + [0.,0.,-1.],//AabbFace::Front + ], + objects: vec![obj::Object{ + name: "Unit Cube".to_owned(), + groups: vec![obj::Group{ + name: "Cube Vertices".to_owned(), + index: 0, + material: None, + polys: vec![ + // back (0, 0, 1) + obj::SimplePolygon(vec![ + obj::IndexTuple(0,Some(0),Some(2)), + obj::IndexTuple(1,Some(1),Some(2)), + obj::IndexTuple(2,Some(2),Some(2)), + obj::IndexTuple(3,Some(3),Some(2)), + ]), + // front (0, 0,-1) + obj::SimplePolygon(vec![ + obj::IndexTuple(4,Some(0),Some(5)), + obj::IndexTuple(5,Some(1),Some(5)), + obj::IndexTuple(6,Some(2),Some(5)), + obj::IndexTuple(7,Some(3),Some(5)), + ]), + // right (1, 0, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(6,Some(0),Some(0)), + obj::IndexTuple(5,Some(1),Some(0)), + obj::IndexTuple(2,Some(2),Some(0)), + obj::IndexTuple(1,Some(3),Some(0)), + ]), + // left (-1, 0, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(0,Some(0),Some(3)), + obj::IndexTuple(3,Some(1),Some(3)), + obj::IndexTuple(4,Some(2),Some(3)), + obj::IndexTuple(7,Some(3),Some(3)), + ]), + // top (0, 1, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(5,Some(1),Some(1)), + obj::IndexTuple(4,Some(0),Some(1)), + obj::IndexTuple(3,Some(3),Some(1)), + obj::IndexTuple(2,Some(2),Some(1)), + ]), + // bottom (0,-1, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(1,Some(1),Some(4)), + obj::IndexTuple(0,Some(0),Some(4)), + obj::IndexTuple(7,Some(3),Some(4)), + obj::IndexTuple(6,Some(2),Some(4)), + ]), + ], + }] + }], + material_libs: Vec::new(), + } +} \ No newline at end of file From 836749df47b664ff6d22610e8f0fa9235eee8f6f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 26 Sep 2023 16:56:19 -0700 Subject: [PATCH 172/482] add texture_transform, switch model_transform to Affine3A --- src/body.rs | 10 ++++---- src/load_roblox.rs | 60 +++++++++++++++++++++++++++++++++------------- src/main.rs | 40 +++++++++++++++++++++---------- src/model.rs | 4 ++-- src/shader.wgsl | 14 ++++++----- 5 files changed, 85 insertions(+), 43 deletions(-) diff --git a/src/body.rs b/src/body.rs index 27ff28c..37c9d22 100644 --- a/src/body.rs +++ b/src/body.rs @@ -269,12 +269,12 @@ type TreyMesh = Aabb; pub struct ModelPhysics { //A model is a thing that has a hitbox. can be represented by a list of TreyMesh-es //in this iteration, all it needs is extents. - transform: glam::Mat4, + model_transform: glam::Affine3A, } impl ModelPhysics { - pub fn new(transform:glam::Mat4) -> Self { - Self{transform} + pub fn new(model_transform:glam::Affine3A) -> Self { + Self{model_transform} } pub fn unit_vertices(&self) -> [glam::Vec3;8] { Aabb::unit_vertices() @@ -282,7 +282,7 @@ impl ModelPhysics { pub fn mesh(&self) -> TreyMesh { let mut aabb=Aabb::new(); for &vertex in self.unit_vertices().iter() { - aabb.grow(glam::Vec4Swizzles::xyz(self.transform*vertex.extend(1.0))); + aabb.grow(self.model_transform.transform_point3(vertex)); } return aabb; } @@ -303,7 +303,7 @@ impl ModelPhysics { return aabb; } pub fn face_normal(&self,face:TreyMeshFace) -> glam::Vec3 { - glam::Vec4Swizzles::xyz(Aabb::normal(face).extend(0.0))//this is wrong for scale + Aabb::normal(face)//this is wrong for scale } } diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 0403c07..7d2ddc9 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -79,24 +79,21 @@ pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec Result<(Vec(){ if let Some(&texture_id)=texture_id_from_asset_id.get(&asset_id.0){ i_can_only_load_one_texture_per_model=Some(texture_id); @@ -125,6 +146,11 @@ pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vecmodeldatas[(texture_id+1) as usize].instances.push(model_instance), diff --git a/src/main.rs b/src/main.rs index 95a5b6b..ee707fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -164,7 +164,7 @@ impl GraphicsData { fn generate_model_physics(&mut self,modeldatas:&Vec){ self.physics.models.append(&mut modeldatas.iter().map(|m| //make aabb and run vertices to get realistic bounds - m.instances.iter().map(|t|body::ModelPhysics::new(t.transform)) + m.instances.iter().map(|t|body::ModelPhysics::new(t.model_transform)) ).flatten().collect()); println!("Physics Objects: {}",self.physics.models.len()); } @@ -285,12 +285,19 @@ impl GraphicsData { } } -fn get_instances_buffer_data(instances:&Vec) -> Vec { - const SIZE: usize=4*4+4;//let size=std::mem::size_of::(); - let mut raw = Vec::with_capacity(SIZE*instances.len()); +const MODEL_BUFFER_SIZE:usize=4*4 + 2*2 + 2+2 + 4;//let size=std::mem::size_of::(); +fn get_instances_buffer_data(instances:&[ModelInstance]) -> Vec { + let mut raw = Vec::with_capacity(MODEL_BUFFER_SIZE*instances.len()); for (i,mi) in instances.iter().enumerate(){ - let mut v = raw.split_off(SIZE*i); - raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&mi.transform)[..]); + let mut v = raw.split_off(MODEL_BUFFER_SIZE*i); + //model_transform + raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&glam::Mat4::from(mi.model_transform))[..]); + //texture_matrix + raw.extend_from_slice(&AsRef::<[f32; 2*2]>::as_ref(&mi.texture_transform.matrix2)[..]); + //texture_offset + raw.extend_from_slice(AsRef::<[f32; 2]>::as_ref(&mi.texture_transform.translation)); + raw.extend_from_slice(&[0.0,0.0]); + //color raw.extend_from_slice(AsRef::<[f32; 4]>::as_ref(&mi.color)); raw.append(&mut v); } @@ -320,34 +327,41 @@ impl framework::Example for GraphicsData { modeldatas.append(&mut model::generate_modeldatas(unit_cube.clone(),ModelData::COLOR_FLOATS_WHITE)); println!("models.len = {:?}", modeldatas.len()); modeldatas[0].instances.push(ModelInstance{ - transform:glam::Mat4::from_translation(glam::vec3(10.,0.,-10.)), + model_transform:glam::Affine3A::from_translation(glam::vec3(10.,0.,-10.)), + texture_transform:glam::Affine2::IDENTITY, color:ModelData::COLOR_VEC4_WHITE, }); //quad monkeys modeldatas[1].instances.push(ModelInstance{ - transform:glam::Mat4::from_translation(glam::vec3(10.,5.,10.)), + model_transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)), + texture_transform:glam::Affine2::IDENTITY, color:ModelData::COLOR_VEC4_WHITE, }); modeldatas[1].instances.push(ModelInstance{ - transform:glam::Mat4::from_translation(glam::vec3(20.,5.,10.)), + model_transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,10.)), + texture_transform:glam::Affine2::IDENTITY, color:glam::vec4(1.0,0.0,0.0,1.0), }); modeldatas[1].instances.push(ModelInstance{ - transform:glam::Mat4::from_translation(glam::vec3(10.,5.,20.)), + model_transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,20.)), + texture_transform:glam::Affine2::IDENTITY, color:glam::vec4(0.0,1.0,0.0,1.0), }); modeldatas[1].instances.push(ModelInstance{ - transform:glam::Mat4::from_translation(glam::vec3(20.,5.,20.)), + model_transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,20.)), + texture_transform:glam::Affine2::IDENTITY, color:glam::vec4(0.0,0.0,1.0,1.0), }); //teapot modeldatas[2].instances.push(ModelInstance{ - transform:glam::Mat4::from_translation(glam::vec3(-10.,5.,10.)), + model_transform:glam::Affine3A::from_translation(glam::vec3(-10.,5.,10.)), + texture_transform:glam::Affine2::IDENTITY, color:ModelData::COLOR_VEC4_WHITE, }); //ground modeldatas[3].instances.push(ModelInstance{ - transform:glam::Mat4::from_translation(glam::vec3(0.,0.,0.))*glam::Mat4::from_scale(glam::vec3(160.0, 1.0, 160.0)), + model_transform:glam::Affine3A::from_translation(glam::vec3(0.,0.,0.))*glam::Affine3A::from_scale(glam::vec3(160.0, 1.0, 160.0)), + texture_transform:glam::Affine2::IDENTITY, color:ModelData::COLOR_VEC4_WHITE, }); diff --git a/src/model.rs b/src/model.rs index 99f4c0f..5fcac1d 100644 --- a/src/model.rs +++ b/src/model.rs @@ -7,10 +7,10 @@ pub struct Vertex { pub normal: [f32; 3], pub color: [f32; 4], } - #[derive(Clone)] pub struct ModelInstance { - pub transform: glam::Mat4, + pub model_transform: glam::Affine3A, + pub texture_transform: glam::Affine2, pub color: glam::Vec4, } diff --git a/src/shader.wgsl b/src/shader.wgsl index e289c02..d2a3165 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -42,8 +42,10 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { } struct ModelInstance{ - transform:mat4x4, - //texture_transform:mat3x3, + model_transform:mat4x4, + //simple to save 4 bytes, so do it. above would need to be spit out into components. + texture_matrix:mat2x2, + texture_offset:vec2, color:vec4, } //my fancy idea is to create a megatexture for each model that includes all the textures each intance will need @@ -75,11 +77,11 @@ fn vs_entity_texture( @location(2) normal: vec3, @location(3) color: vec4, ) -> EntityOutputTexture { - var position: vec4 = model_instances[instance].transform * vec4(pos, 1.0); + var position: vec4 = model_instances[instance].model_transform * vec4(pos, 1.0); var result: EntityOutputTexture; - result.normal = (model_instances[instance].transform * vec4(normal, 0.0)).xyz; - result.texture=texture;//(model_instances[instance].texture_transform * vec3(texture, 1.0)).xy; - result.color=model_instances[instance].color * color; + result.normal = (model_instances[instance].model_transform * vec4(normal, 0.0)).xyz; + result.texture = model_instances[instance].texture_matrix * texture + model_instances[instance].texture_offset; + result.color = model_instances[instance].color * color; result.view = position.xyz - camera.cam_pos.xyz; result.position = camera.proj * camera.view * position; return result; From f0b3e87abba3d83bdff3b7bb02f750b3e0b82686 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 26 Sep 2023 17:01:17 -0700 Subject: [PATCH 173/482] test teapot --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index ee707fe..b554710 100644 --- a/src/main.rs +++ b/src/main.rs @@ -355,7 +355,7 @@ impl framework::Example for GraphicsData { //teapot modeldatas[2].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(-10.,5.,10.)), - texture_transform:glam::Affine2::IDENTITY, + texture_transform:glam::Affine2::from_scale(glam::vec2(2.0,2.0)), color:ModelData::COLOR_VEC4_WHITE, }); //ground From 8fc87a59ce45ea029f9978130906646e05ae57f7 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 26 Sep 2023 17:54:52 -0700 Subject: [PATCH 174/482] chunk instances according to limits --- src/main.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index b554710..779b9f9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -215,11 +215,14 @@ impl GraphicsData { } //drain the modeldata vec so entities can be /moved/ to models.entities let mut instance_count=0; + let uniform_buffer_binding_size=::required_limits().max_uniform_buffer_binding_size as usize; + let chunk_size=uniform_buffer_binding_size/MODEL_BUFFER_SIZE_BYTES; self.models.reserve(modeldatas.len()); for (i,modeldata) in modeldatas.drain(..).enumerate() { let n_instances=modeldata.instances.len(); - if 0(); +const MODEL_BUFFER_SIZE_BYTES:usize=MODEL_BUFFER_SIZE*4; fn get_instances_buffer_data(instances:&[ModelInstance]) -> Vec { let mut raw = Vec::with_capacity(MODEL_BUFFER_SIZE*instances.len()); for (i,mi) in instances.iter().enumerate(){ From f0d9c219b6108e021570761d6e54f8aef2f796fd Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 26 Sep 2023 20:23:42 -0700 Subject: [PATCH 175/482] remove texture transform lol --- src/load_roblox.rs | 1 - src/main.rs | 14 +------------- src/model.rs | 1 - src/shader.wgsl | 5 +---- 4 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 7d2ddc9..0142f09 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -148,7 +148,6 @@ pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec(); +const MODEL_BUFFER_SIZE:usize=4*4 + 4;//let size=std::mem::size_of::(); const MODEL_BUFFER_SIZE_BYTES:usize=MODEL_BUFFER_SIZE*4; fn get_instances_buffer_data(instances:&[ModelInstance]) -> Vec { let mut raw = Vec::with_capacity(MODEL_BUFFER_SIZE*instances.len()); @@ -293,11 +293,6 @@ fn get_instances_buffer_data(instances:&[ModelInstance]) -> Vec { let mut v = raw.split_off(MODEL_BUFFER_SIZE*i); //model_transform raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&glam::Mat4::from(mi.model_transform))[..]); - //texture_matrix - raw.extend_from_slice(&AsRef::<[f32; 2*2]>::as_ref(&mi.texture_transform.matrix2)[..]); - //texture_offset - raw.extend_from_slice(AsRef::<[f32; 2]>::as_ref(&mi.texture_transform.translation)); - raw.extend_from_slice(&[0.0,0.0]); //color raw.extend_from_slice(AsRef::<[f32; 4]>::as_ref(&mi.color)); raw.append(&mut v); @@ -329,40 +324,33 @@ impl framework::Example for GraphicsData { println!("models.len = {:?}", modeldatas.len()); modeldatas[0].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(10.,0.,-10.)), - texture_transform:glam::Affine2::IDENTITY, color:ModelData::COLOR_VEC4_WHITE, }); //quad monkeys modeldatas[1].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)), - texture_transform:glam::Affine2::IDENTITY, color:ModelData::COLOR_VEC4_WHITE, }); modeldatas[1].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,10.)), - texture_transform:glam::Affine2::IDENTITY, color:glam::vec4(1.0,0.0,0.0,1.0), }); modeldatas[1].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,20.)), - texture_transform:glam::Affine2::IDENTITY, color:glam::vec4(0.0,1.0,0.0,1.0), }); modeldatas[1].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,20.)), - texture_transform:glam::Affine2::IDENTITY, color:glam::vec4(0.0,0.0,1.0,1.0), }); //teapot modeldatas[2].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(-10.,5.,10.)), - texture_transform:glam::Affine2::from_scale(glam::vec2(2.0,2.0)), color:ModelData::COLOR_VEC4_WHITE, }); //ground modeldatas[3].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(0.,0.,0.))*glam::Affine3A::from_scale(glam::vec3(160.0, 1.0, 160.0)), - texture_transform:glam::Affine2::IDENTITY, color:ModelData::COLOR_VEC4_WHITE, }); diff --git a/src/model.rs b/src/model.rs index 5fcac1d..5c8b26e 100644 --- a/src/model.rs +++ b/src/model.rs @@ -10,7 +10,6 @@ pub struct Vertex { #[derive(Clone)] pub struct ModelInstance { pub model_transform: glam::Affine3A, - pub texture_transform: glam::Affine2, pub color: glam::Vec4, } diff --git a/src/shader.wgsl b/src/shader.wgsl index d2a3165..69774fb 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -43,9 +43,6 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { struct ModelInstance{ model_transform:mat4x4, - //simple to save 4 bytes, so do it. above would need to be spit out into components. - texture_matrix:mat2x2, - texture_offset:vec2, color:vec4, } //my fancy idea is to create a megatexture for each model that includes all the textures each intance will need @@ -80,7 +77,7 @@ fn vs_entity_texture( var position: vec4 = model_instances[instance].model_transform * vec4(pos, 1.0); var result: EntityOutputTexture; result.normal = (model_instances[instance].model_transform * vec4(normal, 0.0)).xyz; - result.texture = model_instances[instance].texture_matrix * texture + model_instances[instance].texture_offset; + result.texture = texture; result.color = model_instances[instance].color * color; result.view = position.xyz - camera.cam_pos.xyz; result.position = camera.proj * camera.view * position; From b404908a55786570fcfa09eef2c70c8fa6ad757d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 26 Sep 2023 20:23:59 -0700 Subject: [PATCH 176/482] Tabs --- src/load_roblox.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 0142f09..ec04d46 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -36,17 +36,19 @@ fn get_texture_refs(dom:&rbx_dom_weak::WeakDom) -> Vec struct RobloxAssetId(u64); struct RobloxAssetIdParseErr; impl std::str::FromStr for RobloxAssetId { - type Err=RobloxAssetIdParseErr; - fn from_str(s: &str) -> Result{ - let regman=regex::Regex::new(r"(\d+)$").unwrap(); - if let Some(captures) = regman.captures(s) { - if captures.len()==2{//captures[0] is all captures concatenated, and then each individual capture - if let Ok(id) = captures[0].parse::() { - return Ok(Self(id)); - } - } - } - Err(RobloxAssetIdParseErr) + type Err=RobloxAssetIdParseErr; + fn from_str(s: &str) -> Result{ + let regman=regex::Regex::new(r"(\d+)$").unwrap(); + if let Some(captures) = regman.captures(s) { + if captures.len()==2{//captures[0] is all captures concatenated, and then each individual capture + if let Ok(id) = captures[0].parse::() { + return Ok(Self(id)); + } + } + } + Err(RobloxAssetIdParseErr) + } +} } } pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec,Vec,glam::Vec3), Box>{ From f492a0937783332fb67a545d9e268d867085e158 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 26 Sep 2023 20:25:56 -0700 Subject: [PATCH 177/482] unique model per face texture algorithm --- src/load_roblox.rs | 198 ++++++++++++++++++++++++++++++++++----------- src/primitives.rs | 111 +++++++++++++------------ 2 files changed, 212 insertions(+), 97 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index ec04d46..dce2f37 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -49,6 +49,52 @@ impl std::str::FromStr for RobloxAssetId { Err(RobloxAssetIdParseErr) } } +#[derive(Clone,Copy,PartialEq)] +struct RobloxTextureTransform{ + offset_u:f32, + offset_v:f32, + scale_u:f32, + scale_v:f32, +} +impl std::cmp::Eq for RobloxTextureTransform{}//???? +impl std::default::Default for RobloxTextureTransform{ + fn default() -> Self { + Self{offset_u:0.0,offset_v:0.0,scale_u:1.0,scale_v:1.0} + } +} +impl std::hash::Hash for RobloxTextureTransform { + fn hash(&self, state: &mut H) { + self.offset_u.to_ne_bytes().hash(state); + self.offset_v.to_ne_bytes().hash(state); + self.scale_u.to_ne_bytes().hash(state); + self.scale_v.to_ne_bytes().hash(state); + } +} +#[derive(Hash)] +struct PartFaceTextureDescription{ + texture:u32, + transform:RobloxTextureTransform, +} +type PartTextureDescription=[Option;6]; +#[derive(Hash,Eq,PartialEq)] +struct RobloxUnitCubeGenerationData{ + texture:Option, + faces:[Option;6], +} +impl std::default::Default for RobloxUnitCubeGenerationData{ + fn default() -> Self { + Self{ + texture:None, + faces:[Some(RobloxTextureTransform::default());6], + } + } +} +impl RobloxUnitCubeGenerationData{ + fn empty() -> Self { + Self{ + texture:None, + faces:[None,None,None,None,None,None], + } } } pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec,Vec,glam::Vec3), Box>{ @@ -56,14 +102,14 @@ pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec::new(); let mut asset_id_from_texture_id=Vec::new(); - let mut object_refs = std::vec::Vec::new(); - let mut temp_objects = std::vec::Vec::new(); + let mut object_refs=Vec::new(); + let mut temp_objects=Vec::new(); + let mut model_id_from_ucgd=std::collections::HashMap::::new(); recursive_collect_superclass(&mut object_refs, &dom, dom.root(),"BasePart"); for object_ref in object_refs { if let Some(object)=dom.get_by_ref(object_ref){ @@ -104,59 +150,117 @@ pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec(){ - if let Some(&texture_id)=texture_id_from_asset_id.get(&asset_id.0){ - i_can_only_load_one_texture_per_model=Some(texture_id); + let texture_id=if let Some(&texture_id)=texture_id_from_asset_id.get(&asset_id.0){ + texture_id }else{ - let texture_id=asset_id_from_texture_id.len(); - texture_id_from_asset_id.insert(asset_id.0,texture_id as u32); + let texture_id=asset_id_from_texture_id.len() as u32; + texture_id_from_asset_id.insert(asset_id.0,texture_id); asset_id_from_texture_id.push(asset_id.0); - //make new model - let mut unit_cube_texture=unit_cube_modeldata.clone(); - unit_cube_texture.texture=Some(texture_id as u32); - modeldatas.push(unit_cube_texture); + texture_id + }; + let face=normalid.to_u32(); + if face<6{ + let mut roblox_texture_transform=RobloxTextureTransform::default(); + if decal.class=="Texture"{ + //generate tranform + if let ( + Some(rbx_dom_weak::types::Variant::Float32(ox)), + Some(rbx_dom_weak::types::Variant::Float32(oy)), + Some(rbx_dom_weak::types::Variant::Float32(sx)), + Some(rbx_dom_weak::types::Variant::Float32(sy)), + ) = ( + decal.properties.get("OffsetStudsU"), + decal.properties.get("OffsetStudsV"), + decal.properties.get("StudsPerTileU"), + decal.properties.get("StudsPerTileV"), + ) + { + //pretend we don't need to know the face + roblox_texture_transform=RobloxTextureTransform{ + offset_u:*ox/size.x,offset_v:*oy/size.y, + scale_u:*sx/size.x,scale_v:*sy/size.y, + } + } + } + //I can alos put the color into here and generate the vertices with the color + part_texture_description[face as usize]=Some(PartFaceTextureDescription{ + texture:texture_id, + transform:roblox_texture_transform, + }); + }else{ + println!("goofy ahh roblox gave NormalId {}", face); } } } } } - let model_instance=ModelInstance { - model_transform, - color: glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), - }; - match i_can_only_load_one_texture_per_model{ - //push to existing texture model - Some(texture_id)=>modeldatas[(texture_id+1) as usize].instances.push(model_instance), - //push instance to big unit cube in the sky - None=>modeldatas[0].instances.push(model_instance), + let mut unit_cube_generation_data_list=Vec::new(); + let mut unit_cube_from_texture_id=std::collections::HashMap::::new(); + //use part_texture_description to extract unique texture faces + let mut add_negative_cube=false; + let mut negative_cube=RobloxUnitCubeGenerationData::empty(); + for (i,maybe_part_face) in part_texture_description.iter().enumerate(){ + if let Some(part_face)=maybe_part_face{ + let unit_cube_id=if let Some(&unit_cube_id)=unit_cube_from_texture_id.get(&part_face.texture){ + unit_cube_id + }else{ + let unit_cube_id=unit_cube_generation_data_list.len(); + unit_cube_generation_data_list.push(RobloxUnitCubeGenerationData::empty()); + unit_cube_from_texture_id.insert(part_face.texture,unit_cube_id); + unit_cube_generation_data_list[unit_cube_id].texture=Some(part_face.texture); + unit_cube_id + }; + unit_cube_generation_data_list[unit_cube_id].faces[i]=Some(part_face.transform); + }else{ + add_negative_cube=true; + negative_cube.faces[i]=Some(RobloxTextureTransform::default()); + } + } + //must add the rest of the cube to complete the faces! + if add_negative_cube{ + unit_cube_generation_data_list.push(negative_cube); + } + for roblox_unit_cube_generation_data in unit_cube_generation_data_list.drain(..){ + //make new model if unit cube has not been crated before + let model_id=if let Some(&model_id)=model_id_from_ucgd.get(&roblox_unit_cube_generation_data){ + //push to existing texture model + model_id + }else{ + let unit_cube_generation_data=roblox_unit_cube_generation_data.faces.map(|face|{ + match face{ + Some(roblox_texture_transform)=>Some( + glam::Affine2::from_translation( + glam::vec2(roblox_texture_transform.offset_u,roblox_texture_transform.offset_v) + ) + *glam::Affine2::from_scale( + glam::vec2(roblox_texture_transform.scale_u,roblox_texture_transform.scale_v) + ) + ), + None=>None, + } + }); + let mut new_modeldatas=crate::model::generate_modeldatas(primitives::generate_partial_unit_cube(unit_cube_generation_data),ModelData::COLOR_FLOATS_WHITE); + new_modeldatas[0].texture=roblox_unit_cube_generation_data.texture; + let model_id=modeldatas.len(); + modeldatas.append(&mut new_modeldatas); + model_id_from_ucgd.insert(roblox_unit_cube_generation_data,model_id); + model_id + }; + modeldatas[model_id].instances.push(ModelInstance { + model_transform, + color: glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), + }); } } } diff --git a/src/primitives.rs b/src/primitives.rs index a3c86d0..f57cb3d 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -1,4 +1,58 @@ pub fn the_unit_cube_lol() -> obj::ObjData{ + generate_partial_unit_cube([Some(glam::Affine2::IDENTITY);6]) +} +pub fn generate_partial_unit_cube(face_transforms:[Option;6])->obj::ObjData{ + let default_polys=vec![ + // right (1, 0, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(6,Some(0),Some(0)), + obj::IndexTuple(5,Some(1),Some(0)), + obj::IndexTuple(2,Some(2),Some(0)), + obj::IndexTuple(1,Some(3),Some(0)), + ]), + // top (0, 1, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(5,Some(1),Some(1)), + obj::IndexTuple(4,Some(0),Some(1)), + obj::IndexTuple(3,Some(3),Some(1)), + obj::IndexTuple(2,Some(2),Some(1)), + ]), + // back (0, 0, 1) + obj::SimplePolygon(vec![ + obj::IndexTuple(0,Some(0),Some(2)), + obj::IndexTuple(1,Some(1),Some(2)), + obj::IndexTuple(2,Some(2),Some(2)), + obj::IndexTuple(3,Some(3),Some(2)), + ]), + // left (-1, 0, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(0,Some(0),Some(3)), + obj::IndexTuple(3,Some(1),Some(3)), + obj::IndexTuple(4,Some(2),Some(3)), + obj::IndexTuple(7,Some(3),Some(3)), + ]), + // bottom (0,-1, 0) + obj::SimplePolygon(vec![ + obj::IndexTuple(1,Some(1),Some(4)), + obj::IndexTuple(0,Some(0),Some(4)), + obj::IndexTuple(7,Some(3),Some(4)), + obj::IndexTuple(6,Some(2),Some(4)), + ]), + // front (0, 0,-1) + obj::SimplePolygon(vec![ + obj::IndexTuple(4,Some(0),Some(5)), + obj::IndexTuple(5,Some(1),Some(5)), + obj::IndexTuple(6,Some(2),Some(5)), + obj::IndexTuple(7,Some(3),Some(5)), + ]), + ]; + //generate transformed vertices + let mut generated_polys=Vec::new(); + for (i,maybe_transform) in face_transforms.iter().enumerate(){ + if let Some(transform)=maybe_transform{ + generated_polys.push(default_polys[i].clone()); + } + } obj::ObjData{ position: vec![ [-1.,-1., 1.],//left bottom back @@ -12,12 +66,12 @@ pub fn the_unit_cube_lol() -> obj::ObjData{ ], texture: vec![[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0]], normal: vec![ - [1.,0.,0.],//AabbFace::Right - [0.,1.,0.],//AabbFace::Top - [0.,0.,1.],//AabbFace::Back - [-1.,0.,0.],//AabbFace::Left - [0.,-1.,0.],//AabbFace::Bottom - [0.,0.,-1.],//AabbFace::Front + [ 1., 0., 0.],//AabbFace::Right + [ 0., 1., 0.],//AabbFace::Top + [ 0., 0., 1.],//AabbFace::Back + [-1., 0., 0.],//AabbFace::Left + [ 0.,-1., 0.],//AabbFace::Bottom + [ 0., 0.,-1.],//AabbFace::Front ], objects: vec![obj::Object{ name: "Unit Cube".to_owned(), @@ -25,50 +79,7 @@ pub fn the_unit_cube_lol() -> obj::ObjData{ name: "Cube Vertices".to_owned(), index: 0, material: None, - polys: vec![ - // back (0, 0, 1) - obj::SimplePolygon(vec![ - obj::IndexTuple(0,Some(0),Some(2)), - obj::IndexTuple(1,Some(1),Some(2)), - obj::IndexTuple(2,Some(2),Some(2)), - obj::IndexTuple(3,Some(3),Some(2)), - ]), - // front (0, 0,-1) - obj::SimplePolygon(vec![ - obj::IndexTuple(4,Some(0),Some(5)), - obj::IndexTuple(5,Some(1),Some(5)), - obj::IndexTuple(6,Some(2),Some(5)), - obj::IndexTuple(7,Some(3),Some(5)), - ]), - // right (1, 0, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(6,Some(0),Some(0)), - obj::IndexTuple(5,Some(1),Some(0)), - obj::IndexTuple(2,Some(2),Some(0)), - obj::IndexTuple(1,Some(3),Some(0)), - ]), - // left (-1, 0, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(0,Some(0),Some(3)), - obj::IndexTuple(3,Some(1),Some(3)), - obj::IndexTuple(4,Some(2),Some(3)), - obj::IndexTuple(7,Some(3),Some(3)), - ]), - // top (0, 1, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(5,Some(1),Some(1)), - obj::IndexTuple(4,Some(0),Some(1)), - obj::IndexTuple(3,Some(3),Some(1)), - obj::IndexTuple(2,Some(2),Some(1)), - ]), - // bottom (0,-1, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(1,Some(1),Some(4)), - obj::IndexTuple(0,Some(0),Some(4)), - obj::IndexTuple(7,Some(3),Some(4)), - obj::IndexTuple(6,Some(2),Some(4)), - ]), - ], + polys: generated_polys, }] }], material_libs: Vec::new(), From 0913063a001bea9b0b5cf1f481ac047ddcccfbd0 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 27 Sep 2023 14:10:45 -0700 Subject: [PATCH 178/482] transform those bad boys --- src/primitives.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/primitives.rs b/src/primitives.rs index f57cb3d..b8fd1b0 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -2,7 +2,7 @@ pub fn the_unit_cube_lol() -> obj::ObjData{ generate_partial_unit_cube([Some(glam::Affine2::IDENTITY);6]) } pub fn generate_partial_unit_cube(face_transforms:[Option;6])->obj::ObjData{ - let default_polys=vec![ + let default_polys=[ // right (1, 0, 0) obj::SimplePolygon(vec![ obj::IndexTuple(6,Some(0),Some(0)), @@ -46,11 +46,29 @@ pub fn generate_partial_unit_cube(face_transforms:[Option;6])->ob obj::IndexTuple(7,Some(3),Some(5)), ]), ]; + let default_verts=[[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0]]; //generate transformed vertices + let mut generated_verts=Vec::new(); + let mut transforms=Vec::new(); let mut generated_polys=Vec::new(); for (i,maybe_transform) in face_transforms.iter().enumerate(){ if let Some(transform)=maybe_transform{ - generated_polys.push(default_polys[i].clone()); + let transform_index=if let Some(transform_index)=transforms.iter().position(|&t|t==transform){ + transform_index + }else{ + //create new transform_index + let transform_index=transforms.len(); + transforms.push(transform); + for vert in default_verts{ + generated_verts.push(*transform.transform_point2(glam::vec2(vert[0],vert[1])).as_ref()); + } + transform_index + }; + generated_polys.push(obj::SimplePolygon( + default_polys[i].0.iter().map( + |&v|obj::IndexTuple(v.0,Some(v.1.unwrap()+4*transform_index),v.2) + ).collect() + )); } } obj::ObjData{ @@ -64,7 +82,7 @@ pub fn generate_partial_unit_cube(face_transforms:[Option;6])->ob [ 1.,-1.,-1.],//right bottom front [-1.,-1.,-1.],//left bottom front ], - texture: vec![[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0]], + texture: generated_verts, normal: vec![ [ 1., 0., 0.],//AabbFace::Right [ 0., 1., 0.],//AabbFace::Top From b5c689f8ff7e90319f6e604556accd9a19b9e11c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 27 Sep 2023 15:00:53 -0700 Subject: [PATCH 179/482] implement roblox cube texture coordinates --- src/primitives.rs | 48 +++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/primitives.rs b/src/primitives.rs index b8fd1b0..146d404 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -5,30 +5,30 @@ pub fn generate_partial_unit_cube(face_transforms:[Option;6])->ob let default_polys=[ // right (1, 0, 0) obj::SimplePolygon(vec![ - obj::IndexTuple(6,Some(0),Some(0)), + obj::IndexTuple(6,Some(2),Some(0)), obj::IndexTuple(5,Some(1),Some(0)), - obj::IndexTuple(2,Some(2),Some(0)), + obj::IndexTuple(2,Some(0),Some(0)), obj::IndexTuple(1,Some(3),Some(0)), ]), // top (0, 1, 0) obj::SimplePolygon(vec![ - obj::IndexTuple(5,Some(1),Some(1)), - obj::IndexTuple(4,Some(0),Some(1)), - obj::IndexTuple(3,Some(3),Some(1)), - obj::IndexTuple(2,Some(2),Some(1)), + obj::IndexTuple(5,Some(3),Some(1)), + obj::IndexTuple(4,Some(2),Some(1)), + obj::IndexTuple(3,Some(1),Some(1)), + obj::IndexTuple(2,Some(0),Some(1)), ]), // back (0, 0, 1) obj::SimplePolygon(vec![ - obj::IndexTuple(0,Some(0),Some(2)), - obj::IndexTuple(1,Some(1),Some(2)), - obj::IndexTuple(2,Some(2),Some(2)), - obj::IndexTuple(3,Some(3),Some(2)), + obj::IndexTuple(0,Some(3),Some(2)), + obj::IndexTuple(1,Some(2),Some(2)), + obj::IndexTuple(2,Some(1),Some(2)), + obj::IndexTuple(3,Some(0),Some(2)), ]), // left (-1, 0, 0) obj::SimplePolygon(vec![ - obj::IndexTuple(0,Some(0),Some(3)), + obj::IndexTuple(0,Some(2),Some(3)), obj::IndexTuple(3,Some(1),Some(3)), - obj::IndexTuple(4,Some(2),Some(3)), + obj::IndexTuple(4,Some(0),Some(3)), obj::IndexTuple(7,Some(3),Some(3)), ]), // bottom (0,-1, 0) @@ -40,10 +40,10 @@ pub fn generate_partial_unit_cube(face_transforms:[Option;6])->ob ]), // front (0, 0,-1) obj::SimplePolygon(vec![ - obj::IndexTuple(4,Some(0),Some(5)), - obj::IndexTuple(5,Some(1),Some(5)), - obj::IndexTuple(6,Some(2),Some(5)), - obj::IndexTuple(7,Some(3),Some(5)), + obj::IndexTuple(4,Some(1),Some(5)), + obj::IndexTuple(5,Some(0),Some(5)), + obj::IndexTuple(6,Some(3),Some(5)), + obj::IndexTuple(7,Some(2),Some(5)), ]), ]; let default_verts=[[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0]]; @@ -73,14 +73,14 @@ pub fn generate_partial_unit_cube(face_transforms:[Option;6])->ob } obj::ObjData{ position: vec![ - [-1.,-1., 1.],//left bottom back - [ 1.,-1., 1.],//right bottom back - [ 1., 1., 1.],//right top back - [-1., 1., 1.],//left top back - [-1., 1.,-1.],//left top front - [ 1., 1.,-1.],//right top front - [ 1.,-1.,-1.],//right bottom front - [-1.,-1.,-1.],//left bottom front + [-1.,-1., 1.],//0 left bottom back + [ 1.,-1., 1.],//1 right bottom back + [ 1., 1., 1.],//2 right top back + [-1., 1., 1.],//3 left top back + [-1., 1.,-1.],//4 left top front + [ 1., 1.,-1.],//5 right top front + [ 1.,-1.,-1.],//6 right bottom front + [-1.,-1.,-1.],//7 left bottom front ], texture: generated_verts, normal: vec![ From e685ef73884108face0120c6e371a2d80677e99a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 27 Sep 2023 15:01:18 -0700 Subject: [PATCH 180/482] implement roblox Texture class texture coordinate transformation --- src/load_roblox.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index dce2f37..c2064eb 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -186,11 +186,19 @@ pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec(size.z,size.y),//right + 1=>(size.x,size.z),//top + 2=>(size.x,size.y),//back + 3=>(size.z,size.y),//left + 4=>(size.x,size.z),//bottom + 5=>(size.x,size.y),//front + _=>(1.,1.), + }; roblox_texture_transform=RobloxTextureTransform{ - offset_u:*ox/size.x,offset_v:*oy/size.y, - scale_u:*sx/size.x,scale_v:*sy/size.y, - } + offset_u:*ox/(*sx),offset_v:*oy/(*sy), + scale_u:size_u/(*sx),scale_v:size_v/(*sy), + }; } } //I can alos put the color into here and generate the vertices with the color From da3d0ca2546ccf3994f4148187239ff73271fe04 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 19 Sep 2023 17:53:29 -0700 Subject: [PATCH 181/482] redo input --- src/body.rs | 350 ++++++++++++++++++++++++++++++++++------------- src/framework.rs | 13 +- src/main.rs | 273 +++++++++++++----------------------- 3 files changed, 356 insertions(+), 280 deletions(-) diff --git a/src/body.rs b/src/body.rs index 37c9d22..e0e7b40 100644 --- a/src/body.rs +++ b/src/body.rs @@ -4,11 +4,7 @@ use crate::{instruction::{InstructionEmitter, InstructionConsumer, TimedInstruct pub enum PhysicsInstruction { CollisionStart(RelativeCollision), CollisionEnd(RelativeCollision), - SetControlDir(glam::Vec3), StrafeTick, - Jump, - SetWalkTargetVelocity(glam::Vec3), - RefreshWalkTarget, ReachWalkTargetVelocity, // Water, // Spawn( @@ -16,8 +12,23 @@ pub enum PhysicsInstruction { // bool,//true = Trigger; false = teleport // bool,//true = Force // ) + //InputInstructions conditionally activate RefreshWalkTarget (by doing what SetWalkTargetVelocity used to do and then flagging it) + Input(InputInstruction), //temp - SetPosition(glam::Vec3), + SetSpawnPosition(glam::Vec3), +} +#[derive(Debug)] +pub enum InputInstruction { + MoveMouse(glam::IVec2), + MoveForward(bool), + MoveLeft(bool), + MoveBack(bool), + MoveRight(bool), + MoveUp(bool), + MoveDown(bool), + Jump(bool), + Zoom(bool), + Reset, } pub struct Body { @@ -53,34 +64,35 @@ pub enum MoveRestriction { Ladder,//multiple ladders how } -enum MouseInterpolation { - First,//just checks the last value - Lerp,//lerps between -} - +/* enum InputInstruction { - MoveMouse(glam::IVec2), - Jump(bool), } - struct InputState { - controls: u32, - mouse_interpolation: MouseInterpolation, - time: TIME, } - impl InputState { pub fn get_control(&self,control:u32) -> bool { self.controls&control!=0 } - pub fn process_instruction(&mut self,ins:InputInstruction){ - match ins { - InputInstruction::MoveMouse(m) => todo!("set mouse_interpolation"), - InputInstruction::Jump(b) => todo!("how does info about style modifiers get here"), - } +} +impl crate::instruction::InstructionEmitter for InputState{ + fn next_instruction(&self, time_limit:crate::body::TIME) -> Option> { + //this is polled by PhysicsState for actions like Jump + //no, it has to be the other way around. physics is run up until the jump instruction, and then the jump instruction is pushed. + self.queue.get(0) } } +impl crate::instruction::InstructionConsumer for InputState{ + fn process_instruction(&mut self,ins:TimedInstruction){ + //add to queue + self.queue.push(ins); + } +} +*/ +enum MouseInterpolation { + First,//just checks the last value + Lerp,//lerps between +} pub struct MouseInterpolationState { interpolation: MouseInterpolation, time0: TIME, @@ -90,11 +102,20 @@ pub struct MouseInterpolationState { } impl MouseInterpolationState { - pub fn move_mouse(&mut self,time:TIME,pos:glam::IVec2){ + pub fn new() -> Self { + Self { + interpolation:MouseInterpolation::First, + time0:0, + time1:1,//ONE NANOSECOND!!!! avoid divide by zero + mouse0:glam::IVec2::ZERO, + mouse1:glam::IVec2::ZERO, + } + } + pub fn move_mouse(&mut self,time:TIME,delta:glam::IVec2){ self.time0=self.time1; self.mouse0=self.mouse1; self.time1=time; - self.mouse1=pos; + self.mouse1=self.mouse1+delta; } pub fn interpolated_position(&self,time:TIME) -> glam::IVec2 { match self.interpolation { @@ -115,7 +136,6 @@ impl MouseInterpolationState { pub enum WalkEnum{ Reached, Transient, - Invalid, } pub struct WalkState { pub target_velocity: glam::Vec3, @@ -127,22 +147,120 @@ impl WalkState { Self{ target_velocity:glam::Vec3::ZERO, target_time:0, - state:WalkEnum::Invalid, + state:WalkEnum::Reached, } } } +// Note: we use the Y=up coordinate space in this example. +pub struct Camera { + offset: glam::Vec3, + angles: glam::DVec2,//YAW AND THEN PITCH + //punch: glam::Vec3, + //punch_velocity: glam::Vec3, + fov: glam::Vec2,//slope + sensitivity: glam::DVec2, + time: TIME, +} + +#[inline] +fn mat3_from_rotation_y_f64(angle: f64) -> glam::Mat3 { + let (sina, cosa) = angle.sin_cos(); + glam::Mat3::from_cols( + glam::Vec3::new(cosa as f32, 0.0, -sina as f32), + glam::Vec3::Y, + glam::Vec3::new(sina as f32, 0.0, cosa as f32), + ) +} +#[inline] +fn perspective_rh(fov_x_slope: f32, fov_y_slope: f32, z_near: f32, z_far: f32) -> glam::Mat4 { + //glam_assert!(z_near > 0.0 && z_far > 0.0); + let r = z_far / (z_near - z_far); + glam::Mat4::from_cols( + glam::Vec4::new(1.0/fov_x_slope, 0.0, 0.0, 0.0), + glam::Vec4::new(0.0, 1.0/fov_y_slope, 0.0, 0.0), + glam::Vec4::new(0.0, 0.0, r, -1.0), + glam::Vec4::new(0.0, 0.0, r * z_near, 0.0), + ) +} +impl Camera { + pub fn from_offset(offset:glam::Vec3,aspect:f32) -> Self { + Self{ + offset, + angles: glam::DVec2::ZERO, + fov: glam::vec2(aspect,1.0), + sensitivity: glam::dvec2(1.0/2048.0,1.0/2048.0), + time: 0, + } + } + fn simulate_move_angles(&self, delta: glam::IVec2) -> glam::DVec2 { + let mut a=self.angles-self.sensitivity*delta.as_dvec2(); + a.y=a.y.clamp(-std::f64::consts::PI, std::f64::consts::PI); + return a + } + fn simulate_move_rotation_y(&self, delta_x: i32) -> glam::Mat3 { + mat3_from_rotation_y_f64(self.angles.x-self.sensitivity.x*(delta_x as f64)) + } + pub fn proj(&self)->glam::Mat4{ + perspective_rh(self.fov.x, self.fov.y, 0.5, 1000.0) + } + pub fn view(&self,pos:glam::Vec3)->glam::Mat4{ + //f32 good enough for view matrix + glam::Mat4::from_translation(pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.angles.x as f32, self.angles.y as f32, 0f32) + } + pub fn set_fov_aspect(&mut self,fov:f32,aspect:f32){ + self.fov.x=fov*aspect; + self.fov.y=fov; + } +} + +const CONTROL_MOVEFORWARD:u32 = 0b00000001; +const CONTROL_MOVEBACK:u32 = 0b00000010; +const CONTROL_MOVERIGHT:u32 = 0b00000100; +const CONTROL_MOVELEFT:u32 = 0b00001000; +const CONTROL_MOVEUP:u32 = 0b00010000; +const CONTROL_MOVEDOWN:u32 = 0b00100000; +const CONTROL_JUMP:u32 = 0b01000000; +const CONTROL_ZOOM:u32 = 0b10000000; + +const FORWARD_DIR:glam::Vec3 = glam::Vec3::new(0.0,0.0,-1.0); +const RIGHT_DIR:glam::Vec3 = glam::Vec3::new(1.0,0.0,0.0); +const UP_DIR:glam::Vec3 = glam::Vec3::new(0.0,1.0,0.0); + +fn get_control_dir(controls: u32) -> glam::Vec3{ + //don't get fancy just do it + let mut control_dir:glam::Vec3 = glam::Vec3::new(0.0,0.0,0.0); + if controls & CONTROL_MOVEFORWARD == CONTROL_MOVEFORWARD { + control_dir+=FORWARD_DIR; + } + if controls & CONTROL_MOVEBACK == CONTROL_MOVEBACK { + control_dir+=-FORWARD_DIR; + } + if controls & CONTROL_MOVELEFT == CONTROL_MOVELEFT { + control_dir+=-RIGHT_DIR; + } + if controls & CONTROL_MOVERIGHT == CONTROL_MOVERIGHT { + control_dir+=RIGHT_DIR; + } + if controls & CONTROL_MOVEUP == CONTROL_MOVEUP { + control_dir+=UP_DIR; + } + if controls & CONTROL_MOVEDOWN == CONTROL_MOVEDOWN { + control_dir+=-UP_DIR; + } + return control_dir +} + pub struct PhysicsState { pub body: Body, pub hitbox_halfsize: glam::Vec3, pub contacts: std::collections::HashSet::, //pub intersections: Vec, pub models: Vec, - //temp - pub temp_control_dir: glam::Vec3, //camera must exist in state because wormholes modify the camera, also camera punch - //pub camera: Camera, - //pub mouse_interpolation: MouseInterpolationState, + pub camera: Camera, + pub mouse_interpolation: MouseInterpolationState, + pub controls: u32, pub time: TIME, pub strafe_tick_num: TIME, pub strafe_tick_den: TIME, @@ -154,7 +272,7 @@ pub struct PhysicsState { pub walk_accel: f32, pub gravity: glam::Vec3, pub grounded: bool, - pub jump_trying: bool, + pub spawn_point: glam::Vec3, } #[derive(Debug,Clone,Copy,Hash,Eq,PartialEq)] @@ -355,8 +473,6 @@ impl PhysicsState { pub fn run(&mut self, time_limit:TIME){ //prepare is ommitted - everything is done via instructions. while let Some(instruction) = self.next_instruction(time_limit) {//collect - //advance - //self.advance_time(instruction.time); //process self.process_instruction(instruction); //write hash lol @@ -368,6 +484,16 @@ impl PhysicsState { self.time=time; } + fn set_control(&mut self,control:u32,state:bool){ + self.controls=if state{self.controls|control}else{self.controls&!control}; + } + fn jump(&mut self){ + self.grounded=false;//do I need this? + let mut v=self.body.velocity+glam::Vec3::new(0.0,0.715588/2.0*100.0,0.0); + self.contact_constrain_velocity(&mut v); + self.body.velocity=v; + } + fn contact_constrain_velocity(&self,velocity:&mut glam::Vec3){ for contact in self.contacts.iter() { let n=contact.normal(&self.models); @@ -386,7 +512,6 @@ impl PhysicsState { } } } - fn next_strafe_instruction(&self) -> Option> { return Some(TimedInstruction{ time:(self.time*self.strafe_tick_num/self.strafe_tick_den+1)*self.strafe_tick_den/self.strafe_tick_num, @@ -426,6 +551,31 @@ impl PhysicsState { // }); // } + fn refresh_walk_target(&mut self){ + //calculate acceleration yada yada + if self.grounded{ + let mut v=self.walk.target_velocity; + self.contact_constrain_velocity(&mut v); + let mut target_diff=v-self.body.velocity; + target_diff.y=0f32; + if target_diff==glam::Vec3::ZERO{ + let mut a=glam::Vec3::ZERO; + self.contact_constrain_acceleration(&mut a); + self.body.acceleration=a; + self.walk.state=WalkEnum::Reached; + }else{ + let accel=self.walk_accel.min(self.gravity.length()*self.friction); + let time_delta=target_diff.length()/accel; + let mut a=target_diff/time_delta; + self.contact_constrain_acceleration(&mut a); + self.body.acceleration=a; + self.walk.target_time=self.body.time+((time_delta as f64)*1_000_000_000f64) as TIME; + self.walk.state=WalkEnum::Transient; + } + }else{ + self.walk.state=WalkEnum::Reached;//there is no walk target while not grounded + } + } fn next_walk_instruction(&self) -> Option> { //check if you have a valid walk state and create an instruction if self.grounded{ @@ -434,10 +584,6 @@ impl PhysicsState { time:self.walk.target_time, instruction:PhysicsInstruction::ReachWalkTargetVelocity }), - WalkEnum::Invalid=>Some(TimedInstruction{ - time:self.time, - instruction:PhysicsInstruction::RefreshWalkTarget, - }), WalkEnum::Reached=>None, } }else{ @@ -753,29 +899,22 @@ impl crate::instruction::InstructionConsumer for PhysicsStat fn process_instruction(&mut self, ins:TimedInstruction) { match &ins.instruction { PhysicsInstruction::StrafeTick => (), + PhysicsInstruction::Input(InputInstruction::MoveMouse(_)) => (), _=>println!("{:?}",ins), } //selectively update body match &ins.instruction { - PhysicsInstruction::SetWalkTargetVelocity(_) - |PhysicsInstruction::SetPosition(_) - |PhysicsInstruction::SetControlDir(_) => self.time=ins.time,//TODO: queue instructions - PhysicsInstruction::RefreshWalkTarget + PhysicsInstruction::Input(InputInstruction::MoveMouse(_)) => (),//dodge time for mouse movement + PhysicsInstruction::Input(_) + |PhysicsInstruction::SetSpawnPosition(_) |PhysicsInstruction::ReachWalkTargetVelocity |PhysicsInstruction::CollisionStart(_) |PhysicsInstruction::CollisionEnd(_) - |PhysicsInstruction::StrafeTick - |PhysicsInstruction::Jump => self.advance_time(ins.time), + |PhysicsInstruction::StrafeTick => self.advance_time(ins.time), } match ins.instruction { - PhysicsInstruction::SetPosition(position)=>{ - //temp - self.body.position=position; - //manual clear //for c in self.contacts{process_instruction(CollisionEnd(c))} - self.contacts.clear(); - self.body.acceleration=self.gravity; - self.walk.state=WalkEnum::Reached; - self.grounded=false; + PhysicsInstruction::SetSpawnPosition(position)=>{ + self.spawn_point=position; } PhysicsInstruction::CollisionStart(c) => { //check ground @@ -791,14 +930,16 @@ impl crate::instruction::InstructionConsumer for PhysicsStat let mut v=self.body.velocity; self.contact_constrain_velocity(&mut v); self.body.velocity=v; - self.walk.state=WalkEnum::Invalid; + if self.grounded&&self.controls&CONTROL_JUMP!=0{ + self.jump(); + } + self.refresh_walk_target(); }, PhysicsInstruction::CollisionEnd(c) => { self.contacts.remove(&c);//remove contact before calling contact_constrain_acceleration let mut a=self.gravity; self.contact_constrain_acceleration(&mut a); self.body.acceleration=a; - self.walk.state=WalkEnum::Invalid; //check ground match &c.face { AabbFace::Top => { @@ -806,27 +947,18 @@ impl crate::instruction::InstructionConsumer for PhysicsStat }, _ => (), } - }, - PhysicsInstruction::SetControlDir(control_dir)=>{ - self.temp_control_dir=control_dir; - self.walk.state=WalkEnum::Invalid; + self.refresh_walk_target(); }, PhysicsInstruction::StrafeTick => { - //let control_dir=self.get_control_dir();//this should respect your mouse interpolation settings - let d=self.body.velocity.dot(self.temp_control_dir); + let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); + let control_dir=camera_mat*get_control_dir(self.controls); + let d=self.body.velocity.dot(control_dir); if d { - self.grounded=false;//do I need this? - let mut v=self.body.velocity+glam::Vec3::new(0.0,0.715588/2.0*100.0,0.0); - self.contact_constrain_velocity(&mut v); - self.body.velocity=v; - self.walk.state=WalkEnum::Invalid; - }, PhysicsInstruction::ReachWalkTargetVelocity => { //precisely set velocity let mut a=glam::Vec3::ZERO; @@ -837,32 +969,66 @@ impl crate::instruction::InstructionConsumer for PhysicsStat self.body.velocity=v; self.walk.state=WalkEnum::Reached; }, - PhysicsInstruction::RefreshWalkTarget => { - //calculate acceleration yada yada - if self.grounded{ - let mut v=self.walk.target_velocity; - self.contact_constrain_velocity(&mut v); - let mut target_diff=v-self.body.velocity; - target_diff.y=0f32; - if target_diff==glam::Vec3::ZERO{ - let mut a=glam::Vec3::ZERO; - self.contact_constrain_acceleration(&mut a); - self.body.acceleration=a; + PhysicsInstruction::Input(input_instruction) => { + let mut refresh_walk_target=false; + match input_instruction{ + InputInstruction::MoveMouse(m) => { + self.camera.angles=self.camera.simulate_move_angles(self.mouse_interpolation.mouse1-self.mouse_interpolation.mouse0); + self.mouse_interpolation.move_mouse(self.time,m); + refresh_walk_target=true; + }, + InputInstruction::MoveForward(s) => { + self.set_control(CONTROL_MOVEFORWARD,s); + refresh_walk_target=true; + }, + InputInstruction::MoveLeft(s) => { + self.set_control(CONTROL_MOVELEFT,s); + refresh_walk_target=true; + }, + InputInstruction::MoveBack(s) => { + self.set_control(CONTROL_MOVEBACK,s); + refresh_walk_target=true; + }, + InputInstruction::MoveRight(s) => { + self.set_control(CONTROL_MOVERIGHT,s); + refresh_walk_target=true; + }, + InputInstruction::MoveUp(s) => { + self.set_control(CONTROL_MOVEUP,s); + refresh_walk_target=true; + }, + InputInstruction::MoveDown(s) => { + self.set_control(CONTROL_MOVEDOWN,s); + refresh_walk_target=true; + }, + InputInstruction::Jump(s) => { + self.set_control(CONTROL_JUMP,s); + refresh_walk_target=true; + if self.grounded{ + self.jump(); + } + }, + InputInstruction::Zoom(s) => { + self.set_control(CONTROL_ZOOM,s); + }, + InputInstruction::Reset => { + //temp + self.body.position=self.spawn_point; + //manual clear //for c in self.contacts{process_instruction(CollisionEnd(c))} + self.contacts.clear(); + self.body.acceleration=self.gravity; self.walk.state=WalkEnum::Reached; - }else{ - let accel=self.walk_accel.min(self.gravity.length()*self.friction); - let time_delta=target_diff.length()/accel; - let mut a=target_diff/time_delta; - self.contact_constrain_acceleration(&mut a); - self.body.acceleration=a; - self.walk.target_time=self.body.time+((time_delta as f64)*1_000_000_000f64) as TIME; - self.walk.state=WalkEnum::Transient; - } + self.grounded=false; + }, + } + //calculate control dir + let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); + let control_dir=camera_mat*get_control_dir(self.controls); + //calculate walk target velocity + if refresh_walk_target{ + self.walk.target_velocity=self.walkspeed*control_dir; + self.refresh_walk_target(); } - }, - PhysicsInstruction::SetWalkTargetVelocity(v) => { - self.walk.target_velocity=v; - self.walk.state=WalkEnum::Invalid; }, } } diff --git a/src/framework.rs b/src/framework.rs index b471c22..03f1448 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -1,12 +1,10 @@ use std::future::Future; #[cfg(target_arch = "wasm32")] use std::str::FromStr; -#[cfg(not(target_arch = "wasm32"))] -use std::time::Instant; #[cfg(target_arch = "wasm32")] use web_sys::{ImageBitmapRenderingContext, OffscreenCanvas}; use winit::{ - event::{self, WindowEvent}, + event::{self, WindowEvent, DeviceEvent}, event_loop::{ControlFlow, EventLoop}, }; @@ -54,7 +52,7 @@ pub trait Example: 'static + Sized { queue: &wgpu::Queue, ); fn update(&mut self, device: &wgpu::Device, queue: &wgpu::Queue, event: WindowEvent); - fn move_mouse(&mut self, delta: (f64,f64)); + fn device_event(&mut self, event: DeviceEvent); fn render( &mut self, view: &wgpu::TextureView, @@ -373,13 +371,10 @@ fn start( } }, event::Event::DeviceEvent { - event: - winit::event::DeviceEvent::MouseMotion { - delta, - }, + event, .. } => { - example.move_mouse(delta); + example.device_event(event); }, event::Event::RedrawRequested(_) => { diff --git a/src/main.rs b/src/main.rs index 0c4ccda..ec2df75 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,8 @@ use std::{borrow::Cow, time::Instant}; use wgpu::{util::DeviceExt, AstcBlock, AstcChannel}; use model::{Vertex,ModelData,ModelInstance}; +use body::{InputInstruction, PhysicsInstruction}; +use instruction::{TimedInstruction, InstructionConsumer}; mod body; mod model; @@ -23,86 +25,6 @@ struct ModelGraphics { model_buf: wgpu::Buffer, } -// Note: we use the Y=up coordinate space in this example. -struct Camera { - screen_size: (u32, u32), - offset: glam::Vec3, - fov: f32, - yaw: f32, - pitch: f32, - controls: u32, -} - -const CONTROL_MOVEFORWARD:u32 = 0b00000001; -const CONTROL_MOVEBACK:u32 = 0b00000010; -const CONTROL_MOVERIGHT:u32 = 0b00000100; -const CONTROL_MOVELEFT:u32 = 0b00001000; -const CONTROL_MOVEUP:u32 = 0b00010000; -const CONTROL_MOVEDOWN:u32 = 0b00100000; -const CONTROL_JUMP:u32 = 0b01000000; -const CONTROL_ZOOM:u32 = 0b10000000; - -const FORWARD_DIR:glam::Vec3 = glam::Vec3::new(0.0,0.0,-1.0); -const RIGHT_DIR:glam::Vec3 = glam::Vec3::new(1.0,0.0,0.0); -const UP_DIR:glam::Vec3 = glam::Vec3::new(0.0,1.0,0.0); - -fn get_control_dir(controls: u32) -> glam::Vec3{ - //don't get fancy just do it - let mut control_dir:glam::Vec3 = glam::Vec3::new(0.0,0.0,0.0); - if controls & CONTROL_MOVEFORWARD == CONTROL_MOVEFORWARD { - control_dir+=FORWARD_DIR; - } - if controls & CONTROL_MOVEBACK == CONTROL_MOVEBACK { - control_dir+=-FORWARD_DIR; - } - if controls & CONTROL_MOVELEFT == CONTROL_MOVELEFT { - control_dir+=-RIGHT_DIR; - } - if controls & CONTROL_MOVERIGHT == CONTROL_MOVERIGHT { - control_dir+=RIGHT_DIR; - } - if controls & CONTROL_MOVEUP == CONTROL_MOVEUP { - control_dir+=UP_DIR; - } - if controls & CONTROL_MOVEDOWN == CONTROL_MOVEDOWN { - control_dir+=-UP_DIR; - } - return control_dir -} - - #[inline] - fn perspective_rh(fov_y_slope: f32, aspect_ratio: f32, z_near: f32, z_far: f32) -> glam::Mat4 { - //glam_assert!(z_near > 0.0 && z_far > 0.0); - let r = z_far / (z_near - z_far); - glam::Mat4::from_cols( - glam::Vec4::new(1.0/(fov_y_slope * aspect_ratio), 0.0, 0.0, 0.0), - glam::Vec4::new(0.0, 1.0/fov_y_slope, 0.0, 0.0), - glam::Vec4::new(0.0, 0.0, r, -1.0), - glam::Vec4::new(0.0, 0.0, r * z_near, 0.0), - ) - } - -impl Camera { - fn to_uniform_data(&self, pos: glam::Vec3) -> [f32; 16 * 3 + 4] { - let aspect = self.screen_size.0 as f32 / self.screen_size.1 as f32; - let fov = if self.controls&CONTROL_ZOOM==0 { - self.fov - }else{ - self.fov/5.0 - }; - let proj = perspective_rh(fov, aspect, 0.5, 1000.0); - let proj_inv = proj.inverse(); - let view = glam::Mat4::from_translation(pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.yaw, self.pitch, 0f32); - let view_inv = view.inverse(); - - let mut raw = [0f32; 16 * 3 + 4]; - raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); - raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); - raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view_inv)[..]); - raw[48..52].copy_from_slice(AsRef::<[f32; 4]>::as_ref(&view.col(3))); - raw - } -} pub struct GraphicsSamplers{ repeat: wgpu::Sampler, } @@ -123,7 +45,7 @@ pub struct GraphicsPipelines { pub struct GraphicsData { start_time: std::time::Instant, - camera: Camera, + screen_size: (u32, u32), physics: body::PhysicsState, pipelines: GraphicsPipelines, bind_groups: GraphicsBindGroups, @@ -300,6 +222,20 @@ fn get_instances_buffer_data(instances:&[ModelInstance]) -> Vec { raw } +fn to_uniform_data(camera: &body::Camera, pos: glam::Vec3) -> [f32; 16 * 3 + 4] { + let proj=camera.proj(); + let proj_inv = proj.inverse(); + let view=camera.view(pos); + let view_inv = view.inverse(); + + let mut raw = [0f32; 16 * 3 + 4]; + raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); + raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); + raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view_inv)[..]); + raw[48..52].copy_from_slice(AsRef::<[f32; 4]>::as_ref(&view.col(3))); + raw +} + impl framework::Example for GraphicsData { fn optional_features() -> wgpu::Features { wgpu::Features::TEXTURE_COMPRESSION_ASTC @@ -449,15 +385,8 @@ impl framework::Example for GraphicsData { source: wgpu::ShaderSource::Wgsl(Cow::Borrowed(include_str!("shader.wgsl"))), }); - let camera = Camera { - screen_size: (config.width, config.height), - offset: glam::Vec3::new(0.0,4.5-2.5,0.0), - fov: 1.0, //fov_slope = tan(fov_y/2) - pitch: 0.0, - yaw: 0.0, - controls:0, - }; let physics = body::PhysicsState { + spawn_point:glam::vec3(0.0,50.0,0.0), body: body::Body::with_pva(glam::vec3(0.0,50.0,0.0),glam::vec3(0.0,0.0,0.0),glam::vec3(0.0,-100.0,0.0)), time: 0, tick: 0, @@ -468,13 +397,14 @@ impl framework::Example for GraphicsData { walk_accel: 90.0, mv: 2.7, grounded: false, - jump_trying: false, - temp_control_dir: glam::Vec3::ZERO, walkspeed: 18.0, contacts: std::collections::HashSet::new(), - models: Vec::new(), - walk: body::WalkState::new(), - hitbox_halfsize: glam::vec3(1.0,2.5,1.0), + models: Vec::new(), + walk: body::WalkState::new(), + hitbox_halfsize: glam::vec3(1.0,2.5,1.0), + camera: body::Camera::from_offset(glam::vec3(0.0,4.5-2.5,0.0),(config.width as f32)/(config.height as f32)), + mouse_interpolation: body::MouseInterpolationState::new(), + controls: 0, }; //load textures @@ -663,7 +593,7 @@ impl framework::Example for GraphicsData { multiview: None, }); - let camera_uniforms = camera.to_uniform_data(physics.body.extrapolated_position(0)); + let camera_uniforms = to_uniform_data(&physics.camera,physics.body.extrapolated_position(0)); let camera_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Camera"), contents: bytemuck::cast_slice(&camera_uniforms), @@ -698,7 +628,7 @@ impl framework::Example for GraphicsData { let mut graphics=GraphicsData { start_time: Instant::now(), - camera, + screen_size: (config.width,config.height), physics, pipelines:GraphicsPipelines{ skybox:sky_pipeline, @@ -769,8 +699,12 @@ impl framework::Example for GraphicsData { let time=self.physics.time; instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ time, - instruction: body::PhysicsInstruction::SetPosition(spawn_point), - }) + instruction: body::PhysicsInstruction::SetSpawnPosition(spawn_point), + }); + instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ + time, + instruction: body::PhysicsInstruction::Input(body::InputInstruction::Reset), + }); }else{ println!("No modeldatas were generated"); } @@ -781,58 +715,68 @@ impl framework::Example for GraphicsData { println!("Could not open file"); } }, - winit::event::WindowEvent::KeyboardInput { - input: - winit::event::KeyboardInput { - state, - virtual_keycode: Some(keycode), - .. - }, - .. - } => { - match (state,keycode) { - (k,winit::event::VirtualKeyCode::W) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEFORWARD, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEFORWARD, - } - (k,winit::event::VirtualKeyCode::A) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVELEFT, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVELEFT, - } - (k,winit::event::VirtualKeyCode::S) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEBACK, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEBACK, - } - (k,winit::event::VirtualKeyCode::D) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVERIGHT, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVERIGHT, - } - (k,winit::event::VirtualKeyCode::E) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEUP, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEUP, - } - (k,winit::event::VirtualKeyCode::Q) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_MOVEDOWN, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_MOVEDOWN, - } - (k,winit::event::VirtualKeyCode::Space) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_JUMP, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_JUMP, - } - (k,winit::event::VirtualKeyCode::Z) => match k { - winit::event::ElementState::Pressed => self.camera.controls|=CONTROL_ZOOM, - winit::event::ElementState::Released => self.camera.controls&=!CONTROL_ZOOM, - } - _ => (), - } - } - _ => {} + _=>(), } } - fn move_mouse(&mut self, delta: (f64,f64)) { - self.camera.pitch=(self.camera.pitch as f64+delta.1/-2048.) as f32; - self.camera.yaw=(self.camera.yaw as f64+delta.0/-2048.) as f32; + fn device_event(&mut self, event: winit::event::DeviceEvent) { + //there's no way this is the best way get a timestamp. + let time=self.start_time.elapsed().as_nanos() as i64; + match event { + winit::event::DeviceEvent::Key(winit::event::KeyboardInput { + state, + scancode: keycode, + .. + }) => { + let s=match state { + winit::event::ElementState::Pressed => true, + winit::event::ElementState::Released => false, + }; + if let Some(input_instruction)=match keycode { + 17 => Some(InputInstruction::MoveForward(s)),//W + 30 => Some(InputInstruction::MoveLeft(s)),//A + 31 => Some(InputInstruction::MoveBack(s)),//S + 32 => Some(InputInstruction::MoveRight(s)),//D + 18 => Some(InputInstruction::MoveUp(s)),//E + 16 => Some(InputInstruction::MoveDown(s)),//Q + 57 => Some(InputInstruction::Jump(s)),//Space + 44 => Some(InputInstruction::Zoom(s)),//Z + 19 => if s{Some(InputInstruction::Reset)}else{None},//R + _ => None, + } + { + self.physics.run(time); + self.physics.process_instruction(TimedInstruction{ + time, + instruction:PhysicsInstruction::Input(input_instruction), + }) + } + }, + winit::event::DeviceEvent::MouseMotion { + delta,//these (f64,f64) are integers on my machine + } => { + //do not step the physics because the mouse polling rate is higher than the physics can run. + //essentially the previous input will be overwritten until a true step runs + //which is fine because they run all the time. + self.physics.process_instruction(TimedInstruction{ + time, + instruction:PhysicsInstruction::Input(InputInstruction::MoveMouse(glam::ivec2(delta.0 as i32,delta.1 as i32))), + }) + }, + winit::event::DeviceEvent::MouseWheel { + delta, + } => { + println!("mousewheel{:?}",delta); + if true{//self.physics.use_scroll + self.physics.run(time); + self.physics.process_instruction(TimedInstruction{ + time, + instruction:PhysicsInstruction::Input(InputInstruction::Jump(true)),//activates the immediate jump path, but the style modifier prevents controls&CONTROL_JUMP bit from being set to auto jump + }) + } + } + _=>(), + } } fn resize( @@ -842,7 +786,8 @@ impl framework::Example for GraphicsData { _queue: &wgpu::Queue, ) { self.depth_view = Self::create_depth_texture(config, device); - self.camera.screen_size = (config.width, config.height); + self.screen_size = (config.width, config.height); + self.physics.camera.set_fov_aspect(1.0,(config.width as f32)/(config.height as f32)); } fn render( @@ -852,45 +797,15 @@ impl framework::Example for GraphicsData { queue: &wgpu::Queue, _spawner: &framework::Spawner, ) { - let camera_mat=glam::Mat3::from_rotation_y(self.camera.yaw); - let control_dir=camera_mat*get_control_dir(self.camera.controls&(CONTROL_MOVELEFT|CONTROL_MOVERIGHT|CONTROL_MOVEFORWARD|CONTROL_MOVEBACK)).normalize_or_zero(); - let time=self.start_time.elapsed().as_nanos() as i64; self.physics.run(time); - //ALL OF THIS IS TOTALLY WRONG!!! - let walk_target_velocity=self.physics.walkspeed*control_dir; - //autohop (already pressing spacebar; the signal to begin trying to jump is different) - if self.physics.grounded&&walk_target_velocity!=self.physics.walk.target_velocity { - instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ - time, - instruction:body::PhysicsInstruction::SetWalkTargetVelocity(walk_target_velocity) - }); - } - - if control_dir!=self.physics.temp_control_dir { - instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ - time, - instruction:body::PhysicsInstruction::SetControlDir(control_dir) - }); - } - - self.physics.jump_trying=self.camera.controls&CONTROL_JUMP!=0; - //autohop (already pressing spacebar; the signal to begin trying to jump is different) - if self.physics.grounded&&self.physics.jump_trying { - //scroll will be implemented with InputInstruction::Jump(true) but it blocks setting self.jump_trying=true - instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ - time, - instruction:body::PhysicsInstruction::Jump - }); - } - let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); // update rotation - let camera_uniforms = self.camera.to_uniform_data(self.physics.body.extrapolated_position(time)); + let camera_uniforms = to_uniform_data(&self.physics.camera,self.physics.body.extrapolated_position(time)); self.staging_belt .write_buffer( &mut encoder, From 0d6e989812eeb75f3636b810bc22b2dd77600bf0 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 27 Sep 2023 15:54:27 -0700 Subject: [PATCH 182/482] change vulkan report to scroll lock key --- src/framework.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/framework.rs b/src/framework.rs index 03f1448..5ce606b 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -358,7 +358,7 @@ fn start( WindowEvent::KeyboardInput { input: event::KeyboardInput { - virtual_keycode: Some(event::VirtualKeyCode::R), + virtual_keycode: Some(event::VirtualKeyCode::Scroll), state: event::ElementState::Pressed, .. }, From a06a28c595eee4e6e84a76b081d0a97df5b88ffc Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 27 Sep 2023 17:00:08 -0700 Subject: [PATCH 183/482] pls sens --- src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/body.rs b/src/body.rs index e0e7b40..10f1def 100644 --- a/src/body.rs +++ b/src/body.rs @@ -189,7 +189,7 @@ impl Camera { offset, angles: glam::DVec2::ZERO, fov: glam::vec2(aspect,1.0), - sensitivity: glam::dvec2(1.0/2048.0,1.0/2048.0), + sensitivity: glam::dvec2(1.0/4096.0,1.0/4096.0), time: 0, } } From aa3e717f3667426c581069d62967531fac8101d3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 27 Sep 2023 17:51:55 -0700 Subject: [PATCH 184/482] v0.6.0 textures + redo input + reset button --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0d124d1..2a8ec82 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1659,7 +1659,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strafe-client" -version = "0.5.0" +version = "0.6.0" dependencies = [ "async-executor", "bytemuck", diff --git a/Cargo.toml b/Cargo.toml index b3df40d..460328e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strafe-client" -version = "0.5.0" +version = "0.6.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 1b29db0dafc40613cb54e9a13544f6deec633928 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 10:58:51 -0700 Subject: [PATCH 185/482] BC is required rn --- src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index ec2df75..8f3dd68 100644 --- a/src/main.rs +++ b/src/main.rs @@ -240,7 +240,9 @@ impl framework::Example for GraphicsData { fn optional_features() -> wgpu::Features { wgpu::Features::TEXTURE_COMPRESSION_ASTC | wgpu::Features::TEXTURE_COMPRESSION_ETC2 - | wgpu::Features::TEXTURE_COMPRESSION_BC + } + fn required_features() -> wgpu::Features { + wgpu::Features::TEXTURE_COMPRESSION_BC } fn required_limits() -> wgpu::Limits { wgpu::Limits::default() //framework.rs was using goofy limits that caused me a multi-day headache From c65354c23f49949ad13757716211d1e6b04536c1 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 16:12:03 -0700 Subject: [PATCH 186/482] proper instance id labels --- src/main.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 8f3dd68..337a4aa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -140,13 +140,13 @@ impl GraphicsData { let uniform_buffer_binding_size=::required_limits().max_uniform_buffer_binding_size as usize; let chunk_size=uniform_buffer_binding_size/MODEL_BUFFER_SIZE_BYTES; self.models.reserve(modeldatas.len()); - for (i,modeldata) in modeldatas.drain(..).enumerate() { + for modeldata in modeldatas.drain(..) { let n_instances=modeldata.instances.len(); - instance_count+=n_instances; for instances_chunk in modeldata.instances.rchunks(chunk_size){ + instance_count+=1; let model_uniforms = get_instances_buffer_data(instances_chunk); let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some(format!("Model{} Buf",i).as_str()), + label: Some(format!("Model{} Buf",instance_count).as_str()), contents: bytemuck::cast_slice(&model_uniforms), usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, }); @@ -175,7 +175,7 @@ impl GraphicsData { resource: wgpu::BindingResource::Sampler(&self.samplers.repeat), }, ], - label: Some(format!("Model{} Bind Group",i).as_str()), + label: Some(format!("Model{} Bind Group",instance_count).as_str()), }); let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Vertex"), From 099865c6829f568df854707cb2f27d55263b09c4 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 18:28:10 -0700 Subject: [PATCH 187/482] sky should not be using model_sampler --- src/main.rs | 18 +++++++++++++----- src/shader.wgsl | 12 ++++++------ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index 337a4aa..4c85b37 100644 --- a/src/main.rs +++ b/src/main.rs @@ -525,11 +525,19 @@ impl framework::Example for GraphicsData { }) }; - let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + let model_pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { label: None, bind_group_layouts: &[ &camera_bind_group_layout, + &skybox_texture_bind_group_layout, &model_bind_group_layout, + ], + push_constant_ranges: &[], + }); + let sky_pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: None, + bind_group_layouts: &[ + &camera_bind_group_layout, &skybox_texture_bind_group_layout, ], push_constant_ranges: &[], @@ -538,7 +546,7 @@ impl framework::Example for GraphicsData { // Create the render pipelines let sky_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Sky Pipeline"), - layout: Some(&pipeline_layout), + layout: Some(&sky_pipeline_layout), vertex: wgpu::VertexState { module: &shader, entry_point: "vs_sky", @@ -565,7 +573,7 @@ impl framework::Example for GraphicsData { }); let model_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Model Pipeline"), - layout: Some(&pipeline_layout), + layout: Some(&model_pipeline_layout), vertex: wgpu::VertexState { module: &shader, entry_point: "vs_entity_texture", @@ -859,11 +867,11 @@ impl framework::Example for GraphicsData { }); rpass.set_bind_group(0, &self.bind_groups.camera, &[]); - rpass.set_bind_group(2, &self.bind_groups.skybox_texture, &[]); + rpass.set_bind_group(1, &self.bind_groups.skybox_texture, &[]); rpass.set_pipeline(&self.pipelines.model); for model in self.models.iter() { - rpass.set_bind_group(1, &model.bind_group, &[]); + rpass.set_bind_group(2, &model.bind_group, &[]); rpass.set_vertex_buffer(0, model.vertex_buf.slice(..)); for entity in model.entities.iter() { diff --git a/src/shader.wgsl b/src/shader.wgsl index 69774fb..7e8c5ca 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -49,13 +49,13 @@ struct ModelInstance{ //the texture transform then maps the texture coordinates to the location of the specific texture //group 1 is the model const MAX_MODEL_INSTANCES=4096; -@group(1) +@group(2) @binding(0) var model_instances: array; -@group(1) +@group(2) @binding(1) var model_texture: texture_2d; -@group(1) +@group(2) @binding(2) var model_sampler: sampler; @@ -85,16 +85,16 @@ fn vs_entity_texture( } //group 2 is the skybox texture -@group(2) +@group(1) @binding(0) var cube_texture: texture_cube; -@group(2) +@group(1) @binding(1) var cube_sampler: sampler; @fragment fn fs_sky(vertex: SkyOutput) -> @location(0) vec4 { - return textureSample(cube_texture, model_sampler, vertex.sampledir); + return textureSample(cube_texture, cube_sampler, vertex.sampledir); } @fragment From 37e9299f7df62b1e04e3c03962f2b74605bb0b41 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 18:44:18 -0700 Subject: [PATCH 188/482] count properly --- src/main.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4c85b37..b1dc9de 100644 --- a/src/main.rs +++ b/src/main.rs @@ -136,17 +136,18 @@ impl GraphicsData { } } //drain the modeldata vec so entities can be /moved/ to models.entities + let mut model_count=0; let mut instance_count=0; let uniform_buffer_binding_size=::required_limits().max_uniform_buffer_binding_size as usize; let chunk_size=uniform_buffer_binding_size/MODEL_BUFFER_SIZE_BYTES; self.models.reserve(modeldatas.len()); for modeldata in modeldatas.drain(..) { - let n_instances=modeldata.instances.len(); + instance_count+=model.instances.len(); for instances_chunk in modeldata.instances.rchunks(chunk_size){ - instance_count+=1; + model_count+=1; let model_uniforms = get_instances_buffer_data(instances_chunk); let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some(format!("Model{} Buf",instance_count).as_str()), + label: Some(format!("Model{} Buf",model_count).as_str()), contents: bytemuck::cast_slice(&model_uniforms), usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, }); @@ -175,7 +176,7 @@ impl GraphicsData { resource: wgpu::BindingResource::Sampler(&self.samplers.repeat), }, ], - label: Some(format!("Model{} Bind Group",instance_count).as_str()), + label: Some(format!("Model{} Bind Group",model_count).as_str()), }); let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Vertex"), From 60be7f14e562d3eaf72fbcc134e3a15a59ed758e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 27 Sep 2023 17:03:08 -0700 Subject: [PATCH 189/482] temp disable part color --- src/load_roblox.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index c2064eb..8247a06 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -267,7 +267,7 @@ pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec Date: Wed, 27 Sep 2023 17:02:56 -0700 Subject: [PATCH 190/482] color vertices for decals --- src/load_roblox.rs | 58 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 8247a06..7b57801 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -70,25 +70,57 @@ impl std::hash::Hash for RobloxTextureTransform { self.scale_v.to_ne_bytes().hash(state); } } -#[derive(Hash)] +#[derive(Clone,Copy,PartialEq)] +struct RobloxColorAndTextureTransform{ + transform:RobloxTextureTransform, + color:glam::Vec4, +} +impl std::cmp::Eq for RobloxColorAndTextureTransform{}//???? +impl std::default::Default for RobloxColorAndTextureTransform{ + fn default() -> Self { + Self{ + transform:RobloxTextureTransform::default(), + color:glam::Vec4::ONE, + } + } +} +impl std::hash::Hash for RobloxColorAndTextureTransform { + fn hash(&self, state: &mut H) { + self.transform.hash(state); + for &el in self.color.as_ref().iter() { + el.to_ne_bytes().hash(state); + } + } +} struct PartFaceTextureDescription{ texture:u32, + color:glam::Vec4, transform:RobloxTextureTransform, } type PartTextureDescription=[Option;6]; -#[derive(Hash,Eq,PartialEq)] +#[derive(PartialEq)] struct RobloxUnitCubeGenerationData{ texture:Option, - faces:[Option;6], + faces:[Option;6], } +impl std::cmp::Eq for RobloxUnitCubeGenerationData{}//???? impl std::default::Default for RobloxUnitCubeGenerationData{ fn default() -> Self { Self{ texture:None, - faces:[Some(RobloxTextureTransform::default());6], + faces:[Some(RobloxColorAndTextureTransform::default());6], } } } +impl std::hash::Hash for RobloxUnitCubeGenerationData { + fn hash(&self, state: &mut H) { + self.texture.hash(state); + for &el in self.color.as_ref().iter() { + el.to_ne_bytes().hash(state); + } + self.faces.hash(state); + } +} impl RobloxUnitCubeGenerationData{ fn empty() -> Self { Self{ @@ -156,9 +188,13 @@ pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec(){ let texture_id=if let Some(&texture_id)=texture_id_from_asset_id.get(&asset_id.0){ @@ -172,6 +208,7 @@ pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec Result<(Vec Result<(Vec::new(); + let mut unit_cube_from_face_description=std::collections::HashMap::::new(); //use part_texture_description to extract unique texture faces let mut add_negative_cube=false; let mut negative_cube=RobloxUnitCubeGenerationData::empty(); for (i,maybe_part_face) in part_texture_description.iter().enumerate(){ if let Some(part_face)=maybe_part_face{ - let unit_cube_id=if let Some(&unit_cube_id)=unit_cube_from_texture_id.get(&part_face.texture){ + let unit_cube_id=if let Some(&unit_cube_id)=unit_cube_from_face_description.get(&part_face.texture){ unit_cube_id }else{ let unit_cube_id=unit_cube_generation_data_list.len(); unit_cube_generation_data_list.push(RobloxUnitCubeGenerationData::empty()); - unit_cube_from_texture_id.insert(part_face.texture,unit_cube_id); + unit_cube_from_face_description.insert(texture_with_color,unit_cube_id); unit_cube_generation_data_list[unit_cube_id].texture=Some(part_face.texture); unit_cube_id }; - unit_cube_generation_data_list[unit_cube_id].faces[i]=Some(part_face.transform); + unit_cube_generation_data_list[unit_cube_id].faces[i]=Some(part_face.transform_color); }else{ add_negative_cube=true; negative_cube.faces[i]=Some(RobloxTextureTransform::default()); @@ -258,7 +296,7 @@ pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(VecNone, } }); - let mut new_modeldatas=crate::model::generate_modeldatas(primitives::generate_partial_unit_cube(unit_cube_generation_data),ModelData::COLOR_FLOATS_WHITE); + let mut new_modeldatas=crate::model::generate_modeldatas(primitives::generate_partial_unit_cube(unit_cube_generation_data),*roblox_unit_cube_generation_data.color.as_ref()); new_modeldatas[0].texture=roblox_unit_cube_generation_data.texture; let model_id=modeldatas.len(); modeldatas.append(&mut new_modeldatas); From 5b770fc8a9e2786b949f41de0a6371ba5939c026 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 27 Sep 2023 17:24:25 -0700 Subject: [PATCH 191/482] refactor model gen --- src/load_roblox.rs | 13 +-- src/main.rs | 15 ++-- src/model.rs | 122 +++++++++++++++------------- src/primitives.rs | 197 +++++++++++++++++++++++++++------------------ 4 files changed, 201 insertions(+), 146 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 7b57801..c0f0a80 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -1,4 +1,4 @@ -use crate::model::{ModelData,ModelInstance}; +use crate::model::{IndexedModelInstances,ModelInstance}; use crate::primitives; @@ -105,12 +105,12 @@ struct RobloxUnitCubeGenerationData{ } impl std::cmp::Eq for RobloxUnitCubeGenerationData{}//???? impl std::default::Default for RobloxUnitCubeGenerationData{ - fn default() -> Self { - Self{ + fn default() -> Self { + Self{ texture:None, faces:[Some(RobloxColorAndTextureTransform::default());6], } - } + } } impl std::hash::Hash for RobloxUnitCubeGenerationData { fn hash(&self, state: &mut H) { @@ -129,12 +129,13 @@ impl RobloxUnitCubeGenerationData{ } } } -pub fn generate_modeldatas_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Vec,Vec,glam::Vec3), Box>{ +pub fn generate_indexed_model_instances_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(IndexedModelInstances,Vec,glam::Vec3), Box>{ //ModelData includes texture dds let mut spawn_point=glam::Vec3::ZERO; //TODO: generate unit Block, Wedge, etc. after based on part shape lists - let mut modeldatas=Vec::new(); + let mut indexed_models=Vec::new(); + let mut model_instances=Vec::new(); let mut texture_id_from_asset_id=std::collections::HashMap::::new(); let mut asset_id_from_texture_id=Vec::new(); diff --git a/src/main.rs b/src/main.rs index b1dc9de..206e104 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,8 +17,12 @@ struct Entity { index_buf: wgpu::Buffer, } +struct ModelGraphicsInstance { + model_transform: glam::Affine3A, + color: glam::Vec4, +} struct ModelGraphics { - instances: Vec, + instances: Vec, vertex_buf: wgpu::Buffer, entities: Vec, bind_group: wgpu::BindGroup, @@ -90,13 +94,13 @@ impl GraphicsData { ).flatten().collect()); println!("Physics Objects: {}",self.physics.models.len()); } - fn generate_model_graphics(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,mut modeldatas:Vec,textures:Vec){ + fn generate_model_graphics(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,mut indexed_models:model::IndexedModelInstances){ //generate texture view per texture //idk how to do this gooder lol let mut double_map=std::collections::HashMap::::new(); - let mut texture_views:Vec=Vec::with_capacity(textures.len()); - for (i,t) in textures.iter().enumerate(){ + let mut texture_views:Vec=Vec::with_capacity(indexed_models.textures.len()); + for (i,t) in indexed_models.textures.iter().enumerate(){ if let Ok(mut file) = std::fs::File::open(std::path::Path::new(&format!("textures/{}.dds",t))){ let image = ddsfile::Dds::read(&mut file).unwrap(); @@ -254,12 +258,11 @@ impl framework::Example for GraphicsData { device: &wgpu::Device, queue: &wgpu::Queue, ) -> Self { - let unit_cube=primitives::the_unit_cube_lol(); let mut modeldatas = Vec::::new(); modeldatas.append(&mut model::generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); modeldatas.append(&mut model::generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); modeldatas.append(&mut model::generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); - modeldatas.append(&mut model::generate_modeldatas(unit_cube.clone(),ModelData::COLOR_FLOATS_WHITE)); + modeldatas.push(primitives::the_unit_cube_lol()); println!("models.len = {:?}", modeldatas.len()); modeldatas[0].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(10.,0.,-10.)), diff --git a/src/model.rs b/src/model.rs index 5c8b26e..2132072 100644 --- a/src/model.rs +++ b/src/model.rs @@ -7,63 +7,77 @@ pub struct Vertex { pub normal: [f32; 3], pub color: [f32; 4], } +#[derive(Hash)] +pub struct IndexedVertex{ + pub pos:u32, + pub texture:u32, + pub normal:u32, + pub color:u32, +} +pub struct IndexedPolygon{ + pub vertices:Vec, +} +pub struct IndexedGroup{ + pub texture:Option,//RenderPattern? material/texture/shader/flat color + pub polys:Vec, +} +pub struct IndexedModel{ + pub unique_pos:Vec<[f32; 3]>, + pub unique_texture:Vec<[f32; 2]>, + pub unique_normal:Vec<[f32; 3]>, + pub unique_color:Vec<[f32; 4]>, + pub unique_vertices:Vec, + pub groups: Vec, +} #[derive(Clone)] -pub struct ModelInstance { - pub model_transform: glam::Affine3A, - pub color: glam::Vec4, +pub struct ModelInstance{ + pub model:u32, + pub model_transform:glam::Affine3A, + pub color:glam::Vec4, +} +pub struct IndexedModelInstances{ + pub textures:Vec,//RenderPattern + pub models:Vec, + pub instances:Vec, + //object_index for spawns, triggers etc? } -#[derive(Clone)] -pub struct ModelData { - pub instances: Vec, - pub vertices: Vec, - pub entities: Vec>, - pub texture: Option, -} - -impl ModelData { - pub const COLOR_FLOATS_WHITE: [f32;4] = [1.0,1.0,1.0,1.0]; - pub const COLOR_VEC4_WHITE: glam::Vec4 = glam::vec4(1.0,1.0,1.0,1.0); -} - -pub fn generate_modeldatas(data:obj::ObjData,color:[f32;4]) -> Vec{ - let mut modeldatas=Vec::new(); - let mut vertices = Vec::new(); - let mut vertex_index = std::collections::HashMap::::new(); - for object in data.objects { - vertices.clear(); - vertex_index.clear(); - let mut entities = Vec::new(); - for group in object.groups { - let mut indices = Vec::new(); - for poly in group.polys { - for end_index in 2..poly.0.len() { - for &index in &[0, end_index - 1, end_index] { - let vert = poly.0[index]; - if let Some(&i)=vertex_index.get(&vert){ - indices.push(i); - }else{ - let i=vertices.len() as u16; - vertices.push(Vertex { - pos: data.position[vert.0], - texture: data.texture[vert.1.unwrap()], - normal: data.normal[vert.2.unwrap()], - color, - }); - vertex_index.insert(vert,i); - indices.push(i); - } +pub fn generate_indexed_model_from_obj(data:obj::ObjData,color:[f32;4]) -> Vec{ + let mut unique_vertex_index = std::collections::HashMap::::new(); + return data.objects.iter().map(|object|{ + unique_vertex_index.clear(); + let mut unique_vertices = Vec::new(); + let groups = object.groups.iter().map(|group|{ + IndexedGroup{ + texture:None, + polys:group.polys.iter().map(|poly|{ + IndexedPolygon{ + vertices:poly.0.iter().map(|&tup|{ + if let Some(&i)=unique_vertex_index.get(&tup){ + i + }else{ + let i=unique_vertices.len() as u32; + unique_vertices.push(IndexedVertex{ + pos: tup.0 as u32, + texture: tup.1.unwrap() as u32, + normal: tup.2.unwrap() as u32, + color: 0, + }); + unique_vertex_index.insert(tup,i); + i + } + }).collect() } - } + }).collect() } - entities.push(indices); + }).collect(); + IndexedModel{ + unique_pos: data.position.clone(), + unique_texture: data.texture.clone(), + unique_normal: data.normal.clone(), + unique_color: vec![color], + unique_vertices, + groups, } - modeldatas.push(ModelData { - instances: Vec::new(), - vertices:vertices.clone(), - entities, - texture: None, - }); - } - modeldatas -} \ No newline at end of file + }).collect() +} diff --git a/src/primitives.rs b/src/primitives.rs index 146d404..3411390 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -1,53 +1,88 @@ -pub fn the_unit_cube_lol() -> obj::ObjData{ - generate_partial_unit_cube([Some(glam::Affine2::IDENTITY);6]) +const CUBE_DEFAULT_TEXTURE_COORDS:[[f32;2];4]=[[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0]]; +const CUBE_DEFAULT_VERTICES:[[f32;3];8]=[ + [-1.,-1., 1.],//0 left bottom back + [ 1.,-1., 1.],//1 right bottom back + [ 1., 1., 1.],//2 right top back + [-1., 1., 1.],//3 left top back + [-1., 1.,-1.],//4 left top front + [ 1., 1.,-1.],//5 right top front + [ 1.,-1.,-1.],//6 right bottom front + [-1.,-1.,-1.],//7 left bottom front +]; +const CUBE_DEFAULT_NORMALS:[[f32;3];6]=[ + [ 1., 0., 0.],//AabbFace::Right + [ 0., 1., 0.],//AabbFace::Top + [ 0., 0., 1.],//AabbFace::Back + [-1., 0., 0.],//AabbFace::Left + [ 0.,-1., 0.],//AabbFace::Bottom + [ 0., 0.,-1.],//AabbFace::Front +]; +const CUBE_DEFAULT_POLYS:[[[u32;3];4];6]=[ + // right (1, 0, 0) + [ + [6,2,0],//[vert,tex,norm] + [5,1,0], + [2,0,0], + [1,3,0], + ], + // top (0, 1, 0) + [ + [5,3,1], + [4,2,1], + [3,1,1], + [2,0,1], + ], + // back (0, 0, 1) + [ + [0,3,2], + [1,2,2], + [2,1,2], + [3,0,2], + ], + // left (-1, 0, 0) + [ + [0,2,3], + [3,1,3], + [4,0,3], + [7,3,3], + ], + // bottom (0,-1, 0) + [ + [1,1,4], + [0,0,4], + [7,3,4], + [6,2,4], + ], + // front (0, 0,-1) + [ + [4,1,5], + [5,0,5], + [6,3,5], + [7,2,5], + ], +]; +pub fn the_unit_cube_lol() -> crate::model::ModelData{ + generate_partial_unit_cube([Some(FaceDescription::default());6],None) } -pub fn generate_partial_unit_cube(face_transforms:[Option;6])->obj::ObjData{ - let default_polys=[ - // right (1, 0, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(6,Some(2),Some(0)), - obj::IndexTuple(5,Some(1),Some(0)), - obj::IndexTuple(2,Some(0),Some(0)), - obj::IndexTuple(1,Some(3),Some(0)), - ]), - // top (0, 1, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(5,Some(3),Some(1)), - obj::IndexTuple(4,Some(2),Some(1)), - obj::IndexTuple(3,Some(1),Some(1)), - obj::IndexTuple(2,Some(0),Some(1)), - ]), - // back (0, 0, 1) - obj::SimplePolygon(vec![ - obj::IndexTuple(0,Some(3),Some(2)), - obj::IndexTuple(1,Some(2),Some(2)), - obj::IndexTuple(2,Some(1),Some(2)), - obj::IndexTuple(3,Some(0),Some(2)), - ]), - // left (-1, 0, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(0,Some(2),Some(3)), - obj::IndexTuple(3,Some(1),Some(3)), - obj::IndexTuple(4,Some(0),Some(3)), - obj::IndexTuple(7,Some(3),Some(3)), - ]), - // bottom (0,-1, 0) - obj::SimplePolygon(vec![ - obj::IndexTuple(1,Some(1),Some(4)), - obj::IndexTuple(0,Some(0),Some(4)), - obj::IndexTuple(7,Some(3),Some(4)), - obj::IndexTuple(6,Some(2),Some(4)), - ]), - // front (0, 0,-1) - obj::SimplePolygon(vec![ - obj::IndexTuple(4,Some(1),Some(5)), - obj::IndexTuple(5,Some(0),Some(5)), - obj::IndexTuple(6,Some(3),Some(5)), - obj::IndexTuple(7,Some(2),Some(5)), - ]), - ]; - let default_verts=[[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0]]; - //generate transformed vertices + +pub struct FaceDescription{ + transform:glam::Affine2, + color:glam::Vec4, +} +impl std::default::Default for FaceDescription{ + fn default() -> Self { + Self{ + transform:glam::Affine2::IDENTITY, + color:glam::Vec4::ONE, + } + } +} +impl FaceDescription{ + pub fn new(transform:glam::Affine2,color:glam::Vec4)->Self{ + Self{transform,color} + } +} +pub fn generate_partial_unit_cube(face_transforms:[Option;6],texture:Option) -> crate::model::ModelData{ //generate transformed vertices let mut generated_verts=Vec::new(); let mut transforms=Vec::new(); let mut generated_polys=Vec::new(); @@ -71,35 +106,37 @@ pub fn generate_partial_unit_cube(face_transforms:[Option;6])->ob )); } } - obj::ObjData{ - position: vec![ - [-1.,-1., 1.],//0 left bottom back - [ 1.,-1., 1.],//1 right bottom back - [ 1., 1., 1.],//2 right top back - [-1., 1., 1.],//3 left top back - [-1., 1.,-1.],//4 left top front - [ 1., 1.,-1.],//5 right top front - [ 1.,-1.,-1.],//6 right bottom front - [-1.,-1.,-1.],//7 left bottom front - ], - texture: generated_verts, - normal: vec![ - [ 1., 0., 0.],//AabbFace::Right - [ 0., 1., 0.],//AabbFace::Top - [ 0., 0., 1.],//AabbFace::Back - [-1., 0., 0.],//AabbFace::Left - [ 0.,-1., 0.],//AabbFace::Bottom - [ 0., 0.,-1.],//AabbFace::Front - ], - objects: vec![obj::Object{ - name: "Unit Cube".to_owned(), - groups: vec![obj::Group{ - name: "Cube Vertices".to_owned(), - index: 0, - material: None, - polys: generated_polys, - }] - }], - material_libs: Vec::new(), + let mut vertices = Vec::new(); + let mut vertex_index = std::collections::HashMap::::new(); + let mut entities = Vec::new(); + for group in object.groups { + let mut indices = Vec::new(); + for poly in group.polys { + for end_index in 2..poly.0.len() { + for &index in &[0, end_index - 1, end_index] { + let vert = poly.0[index]; + if let Some(&i)=vertex_index.get(&vert){ + indices.push(i); + }else{ + let i=vertices.len() as u16; + vertices.push(Vertex { + pos: data.position[vert.0], + texture: data.texture[vert.1.unwrap()], + normal: data.normal[vert.2.unwrap()], + color, + }); + vertex_index.insert(vert,i); + indices.push(i); + } + } + } + } + entities.push(indices); } -} \ No newline at end of file + ModelData { + instances: Vec::new(), + vertices, + entities, + texture, + } +} From ba21ce262a5a8135fe56b3b05fcf3b1f24efa3b9 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 15:43:45 -0700 Subject: [PATCH 192/482] load_roblox generates IndexedModelInstances --- src/load_roblox.rs | 172 ++++++++++++++++----------------------------- 1 file changed, 59 insertions(+), 113 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index c0f0a80..8d63e2d 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -70,79 +70,41 @@ impl std::hash::Hash for RobloxTextureTransform { self.scale_v.to_ne_bytes().hash(state); } } -#[derive(Clone,Copy,PartialEq)] -struct RobloxColorAndTextureTransform{ - transform:RobloxTextureTransform, +#[derive(Clone,PartialEq)] +struct RobloxFaceTextureDescription{ + texture:u32, color:glam::Vec4, + transform:RobloxTextureTransform, } -impl std::cmp::Eq for RobloxColorAndTextureTransform{}//???? -impl std::default::Default for RobloxColorAndTextureTransform{ - fn default() -> Self { - Self{ - transform:RobloxTextureTransform::default(), - color:glam::Vec4::ONE, - } - } -} -impl std::hash::Hash for RobloxColorAndTextureTransform { +impl std::cmp::Eq for RobloxFaceTextureDescription{}//???? +impl std::hash::Hash for RobloxFaceTextureDescription { fn hash(&self, state: &mut H) { + self.texture.hash(state); self.transform.hash(state); for &el in self.color.as_ref().iter() { el.to_ne_bytes().hash(state); } } } -struct PartFaceTextureDescription{ - texture:u32, - color:glam::Vec4, - transform:RobloxTextureTransform, +type RobloxPartDescription=[Option;6]; +//type RobloxWedgeDescription=[Option;5]; +#[derive(Clone,Eq,Hash,PartialEq)] +enum RobloxBasePartDescription{ + Part(RobloxPartDescription), + //Wedge(RobloxWedgeDescription), } -type PartTextureDescription=[Option;6]; -#[derive(PartialEq)] -struct RobloxUnitCubeGenerationData{ - texture:Option, - faces:[Option;6], -} -impl std::cmp::Eq for RobloxUnitCubeGenerationData{}//???? -impl std::default::Default for RobloxUnitCubeGenerationData{ - fn default() -> Self { - Self{ - texture:None, - faces:[Some(RobloxColorAndTextureTransform::default());6], - } - } -} -impl std::hash::Hash for RobloxUnitCubeGenerationData { - fn hash(&self, state: &mut H) { - self.texture.hash(state); - for &el in self.color.as_ref().iter() { - el.to_ne_bytes().hash(state); - } - self.faces.hash(state); - } -} -impl RobloxUnitCubeGenerationData{ - fn empty() -> Self { - Self{ - texture:None, - faces:[None,None,None,None,None,None], - } - } -} -pub fn generate_indexed_model_instances_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(IndexedModelInstances,Vec,glam::Vec3), Box>{ - //ModelData includes texture dds +pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(IndexedModelInstances,glam::Vec3), Box>{ + //IndexedModelInstances includes textures let mut spawn_point=glam::Vec3::ZERO; - //TODO: generate unit Block, Wedge, etc. after based on part shape lists let mut indexed_models=Vec::new(); - let mut model_instances=Vec::new(); + let mut model_id_from_description=std::collections::HashMap::::new(); let mut texture_id_from_asset_id=std::collections::HashMap::::new(); let mut asset_id_from_texture_id=Vec::new(); let mut object_refs=Vec::new(); let mut temp_objects=Vec::new(); - let mut model_id_from_ucgd=std::collections::HashMap::::new(); recursive_collect_superclass(&mut object_refs, &dom, dom.root(),"BasePart"); for object_ref in object_refs { if let Some(object)=dom.get_by_ref(object_ref){ @@ -183,7 +145,7 @@ pub fn generate_indexed_model_instances_roblox(dom:rbx_dom_weak::WeakDom) -> Res temp_objects.clear(); recursive_collect_superclass(&mut temp_objects, &dom, object,"Decal"); - let mut part_texture_description:PartTextureDescription=[None,None,None,None,None,None]; + let mut part_texture_description:RobloxPartDescription=[None,None,None,None,None,None]; for &decal_ref in &temp_objects{ if let Some(decal)=dom.get_by_ref(decal_ref){ if let ( @@ -240,7 +202,7 @@ pub fn generate_indexed_model_instances_roblox(dom:rbx_dom_weak::WeakDom) -> Res roblox_texture_color=glam::vec4(decal_color3.r,decal_color3.g,decal_color3.b,1.0-*decal_transparency); } } - part_texture_description[face as usize]=Some(PartFaceTextureDescription{ + part_texture_description[face as usize]=Some(RobloxFaceTextureDescription{ texture:texture_id, color:roblox_texture_color, transform:roblox_texture_transform, @@ -252,65 +214,49 @@ pub fn generate_indexed_model_instances_roblox(dom:rbx_dom_weak::WeakDom) -> Res } } } - let mut unit_cube_generation_data_list=Vec::new(); - let mut unit_cube_from_face_description=std::collections::HashMap::::new(); - //use part_texture_description to extract unique texture faces - let mut add_negative_cube=false; - let mut negative_cube=RobloxUnitCubeGenerationData::empty(); - for (i,maybe_part_face) in part_texture_description.iter().enumerate(){ - if let Some(part_face)=maybe_part_face{ - let unit_cube_id=if let Some(&unit_cube_id)=unit_cube_from_face_description.get(&part_face.texture){ - unit_cube_id - }else{ - let unit_cube_id=unit_cube_generation_data_list.len(); - unit_cube_generation_data_list.push(RobloxUnitCubeGenerationData::empty()); - unit_cube_from_face_description.insert(texture_with_color,unit_cube_id); - unit_cube_generation_data_list[unit_cube_id].texture=Some(part_face.texture); - unit_cube_id - }; - unit_cube_generation_data_list[unit_cube_id].faces[i]=Some(part_face.transform_color); - }else{ - add_negative_cube=true; - negative_cube.faces[i]=Some(RobloxTextureTransform::default()); + //TODO: generate unit Block, Wedge, etc. based on part shape lists + let basepart_texture_description=RobloxBasePartDescription::Part(part_texture_description); + //make new model if unit cube has not been crated before + let model_id=if let Some(&model_id)=model_id_from_description.get(&basepart_texture_description){ + //push to existing texture model + model_id + }else{ + let model_id=indexed_models.len(); + model_id_from_description.insert(basepart_texture_description.clone(),model_id);//borrow checker going crazy + match basepart_texture_description{ + RobloxBasePartDescription::Part(part_texture_description)=>{ + let unit_cube_faces=part_texture_description.map(|face|{ + match face{ + Some(roblox_texture_transform)=>Some( + primitives::FaceDescription{ + texture:Some(roblox_texture_transform.texture), + transform:glam::Affine2::from_translation( + glam::vec2(roblox_texture_transform.transform.offset_u,roblox_texture_transform.transform.offset_v) + ) + *glam::Affine2::from_scale( + glam::vec2(roblox_texture_transform.transform.scale_u,roblox_texture_transform.transform.scale_v) + ), + color:roblox_texture_transform.color, + } + ), + None=>Some(primitives::FaceDescription::default()), + } + }); + let indexed_model=primitives::generate_partial_unit_cube(unit_cube_faces); + indexed_models.push(indexed_model); + model_id + }, } - } - //must add the rest of the cube to complete the faces! - if add_negative_cube{ - unit_cube_generation_data_list.push(negative_cube); - } - for roblox_unit_cube_generation_data in unit_cube_generation_data_list.drain(..){ - //make new model if unit cube has not been crated before - let model_id=if let Some(&model_id)=model_id_from_ucgd.get(&roblox_unit_cube_generation_data){ - //push to existing texture model - model_id - }else{ - let unit_cube_generation_data=roblox_unit_cube_generation_data.faces.map(|face|{ - match face{ - Some(roblox_texture_transform)=>Some( - glam::Affine2::from_translation( - glam::vec2(roblox_texture_transform.offset_u,roblox_texture_transform.offset_v) - ) - *glam::Affine2::from_scale( - glam::vec2(roblox_texture_transform.scale_u,roblox_texture_transform.scale_v) - ) - ), - None=>None, - } - }); - let mut new_modeldatas=crate::model::generate_modeldatas(primitives::generate_partial_unit_cube(unit_cube_generation_data),*roblox_unit_cube_generation_data.color.as_ref()); - new_modeldatas[0].texture=roblox_unit_cube_generation_data.texture; - let model_id=modeldatas.len(); - modeldatas.append(&mut new_modeldatas); - model_id_from_ucgd.insert(roblox_unit_cube_generation_data,model_id); - model_id - }; - modeldatas[model_id].instances.push(ModelInstance { - model_transform, - color: glam::Vec4::ONE,//glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), - }); - } + }; + indexed_models[model_id].instances.push(ModelInstance { + model_transform, + color: glam::Vec4::ONE,//glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), + }); } } } - Ok((modeldatas,asset_id_from_texture_id.iter().map(|t|t.to_string()).collect(),spawn_point)) + Ok((IndexedModelInstances{ + textures:asset_id_from_texture_id.iter().map(|t|t.to_string()).collect(), + models:indexed_models, + },spawn_point)) } From 665a83d1742844170f0c810c6bd296d4933da357 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 15:43:10 -0700 Subject: [PATCH 193/482] primitives generates IndexedModel --- src/model.rs | 12 ++-- src/primitives.rs | 136 ++++++++++++++++++++++++++++------------------ 2 files changed, 88 insertions(+), 60 deletions(-) diff --git a/src/model.rs b/src/model.rs index 2132072..6736326 100644 --- a/src/model.rs +++ b/src/model.rs @@ -3,14 +3,14 @@ use bytemuck::{Pod, Zeroable}; #[repr(C)] pub struct Vertex { pub pos: [f32; 3], - pub texture: [f32; 2], + pub tex: [f32; 2], pub normal: [f32; 3], pub color: [f32; 4], } -#[derive(Hash)] +#[derive(Hash,PartialEq,Eq)] pub struct IndexedVertex{ pub pos:u32, - pub texture:u32, + pub tex:u32, pub normal:u32, pub color:u32, } @@ -23,7 +23,7 @@ pub struct IndexedGroup{ } pub struct IndexedModel{ pub unique_pos:Vec<[f32; 3]>, - pub unique_texture:Vec<[f32; 2]>, + pub unique_tex:Vec<[f32; 2]>, pub unique_normal:Vec<[f32; 3]>, pub unique_color:Vec<[f32; 4]>, pub unique_vertices:Vec, @@ -59,7 +59,7 @@ pub fn generate_indexed_model_from_obj(data:obj::ObjData,color:[f32;4]) -> Vec Vec crate::model::ModelData{ - generate_partial_unit_cube([Some(FaceDescription::default());6],None) +pub fn the_unit_cube_lol() -> crate::model::IndexedModel{ + generate_partial_unit_cube([Some(FaceDescription::default());6]) } +#[derive(Copy,Clone)] pub struct FaceDescription{ - transform:glam::Affine2, - color:glam::Vec4, + pub texture:Option, + pub transform:glam::Affine2, + pub color:glam::Vec4, } impl std::default::Default for FaceDescription{ fn default() -> Self { Self{ + texture:None, transform:glam::Affine2::IDENTITY, color:glam::Vec4::ONE, } } } impl FaceDescription{ - pub fn new(transform:glam::Affine2,color:glam::Vec4)->Self{ - Self{transform,color} + pub fn new(texture:u32,transform:glam::Affine2,color:glam::Vec4)->Self{ + Self{texture:Some(texture),transform,color} + } + pub fn from_texture(texture:u32)->Self{ + Self{ + texture:Some(texture), + transform:glam::Affine2::IDENTITY, + color:glam::Vec4::ONE, + } } } -pub fn generate_partial_unit_cube(face_transforms:[Option;6],texture:Option) -> crate::model::ModelData{ //generate transformed vertices - let mut generated_verts=Vec::new(); +//TODO: it's probably better to use a shared vertex buffer between all primitives and use indexed rendering instead of generating a unique vertex buffer for each primitive. +pub fn generate_partial_unit_cube(face_descriptions:[Option;6]) -> crate::model::IndexedModel{ + let mut generated_pos=Vec::<[f32;3]>::new(); + let mut generated_tex=Vec::new(); + let mut generated_normal=Vec::new(); + let mut generated_color=Vec::new(); + let mut generated_vertices=Vec::new(); + let mut groups=Vec::new(); let mut transforms=Vec::new(); - let mut generated_polys=Vec::new(); - for (i,maybe_transform) in face_transforms.iter().enumerate(){ - if let Some(transform)=maybe_transform{ - let transform_index=if let Some(transform_index)=transforms.iter().position(|&t|t==transform){ + //note that on a cube every vertex is guaranteed to be unique, so there's no need to hash them against existing vertices. + for (i,maybe_face_description) in face_descriptions.iter().enumerate(){ + if let Some(face_description)=maybe_face_description{ + //assume that scanning short lists is faster than hashing. + let transform_index=if let Some(transform_index)=transforms.iter().position(|&transform|transform==face_description.transform){ transform_index }else{ //create new transform_index let transform_index=transforms.len(); - transforms.push(transform); - for vert in default_verts{ - generated_verts.push(*transform.transform_point2(glam::vec2(vert[0],vert[1])).as_ref()); + transforms.push(face_description.transform); + for tex in CUBE_DEFAULT_TEXTURE_COORDS{ + generated_tex.push(*face_description.transform.transform_point2(glam::Vec2::from_array(tex)).as_ref()); } transform_index - }; - generated_polys.push(obj::SimplePolygon( - default_polys[i].0.iter().map( - |&v|obj::IndexTuple(v.0,Some(v.1.unwrap()+4*transform_index),v.2) - ).collect() - )); + } as u32; + let color_index=if let Some(color_index)=generated_color.iter().position(|color|color==face_description.color.as_ref()){ + color_index + }else{ + //create new color_index + let color_index=generated_color.len(); + generated_color.push(*face_description.color.as_ref()); + color_index + } as u32; + //always push normal + let normal_index=generated_normal.len() as u32; + generated_normal.push(CUBE_DEFAULT_NORMALS[i]); + //push vertices as they are needed + groups.push(IndexedGroup{ + texture:face_description.texture, + polys:vec![IndexedPolygon{ + vertices:CUBE_DEFAULT_POLYS[i].map(|tup|{ + let pos=CUBE_DEFAULT_VERTICES[tup[0] as usize]; + let pos_index=if let Some(pos_index)=generated_pos.iter().position(|&p|p==pos){ + pos_index + }else{ + //create new pos_index + let pos_index=generated_pos.len(); + generated_pos.push(pos); + pos_index + } as u32; + //always push vertex + let vertex=IndexedVertex{ + pos:pos_index, + tex:tup[1]+4*transform_index, + normal:normal_index, + color:color_index, + }; + let vert_index=generated_vertices.len(); + generated_vertices.push(vertex); + vert_index as u32 + }).to_vec(), + }], + }); } } - let mut vertices = Vec::new(); - let mut vertex_index = std::collections::HashMap::::new(); - let mut entities = Vec::new(); - for group in object.groups { - let mut indices = Vec::new(); - for poly in group.polys { - for end_index in 2..poly.0.len() { - for &index in &[0, end_index - 1, end_index] { - let vert = poly.0[index]; - if let Some(&i)=vertex_index.get(&vert){ - indices.push(i); - }else{ - let i=vertices.len() as u16; - vertices.push(Vertex { - pos: data.position[vert.0], - texture: data.texture[vert.1.unwrap()], - normal: data.normal[vert.2.unwrap()], - color, - }); - vertex_index.insert(vert,i); - indices.push(i); - } - } - } - } - entities.push(indices); - } - ModelData { - instances: Vec::new(), - vertices, - entities, - texture, + IndexedModel{ + unique_pos:generated_pos, + unique_tex:generated_tex, + unique_normal:generated_normal, + unique_color:generated_color, + unique_vertices:generated_vertices, + groups, + instances:Vec::new(), } } From ed712933e552ded8b65d1a72314b6d78be2dcf8e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 19:10:22 -0700 Subject: [PATCH 194/482] split models into unique texture groups and deindex --- src/main.rs | 146 +++++++++++++++++++++++++++++++++++++-------------- src/model.rs | 27 ++++++++-- 2 files changed, 131 insertions(+), 42 deletions(-) diff --git a/src/main.rs b/src/main.rs index 206e104..6fb60d4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use std::{borrow::Cow, time::Instant}; use wgpu::{util::DeviceExt, AstcBlock, AstcChannel}; -use model::{Vertex,ModelData,ModelInstance}; +use model::{Vertex,ModelInstance}; use body::{InputInstruction, PhysicsInstruction}; use instruction::{TimedInstruction, InstructionConsumer}; @@ -17,12 +17,8 @@ struct Entity { index_buf: wgpu::Buffer, } -struct ModelGraphicsInstance { - model_transform: glam::Affine3A, - color: glam::Vec4, -} struct ModelGraphics { - instances: Vec, + instances: Vec, vertex_buf: wgpu::Buffer, entities: Vec, bind_group: wgpu::BindGroup, @@ -139,15 +135,85 @@ impl GraphicsData { })); } } + //split groups with different textures into separate models + //the models received here are supposed to be tightly packed, i.e. no code needs to check if two models are using the same groups. + let mut unique_texture_models=Vec::with_capacity(indexed_models.models.len()); + for mut model in indexed_models.models.drain(..){ + //check each group, if it's using a new texture then make a new clone of the model + let id=unique_texture_models.len(); + let mut unique_textures=Vec::new(); + for group in model.groups.drain(..){ + //ignore zero coppy optimization for now + let texture_index=if let Some(texture_index)=unique_textures.iter().position(|&texture|texture==group.texture){ + texture_index + }else{ + //create new texture_index + let texture_index=unique_textures.len(); + unique_textures.push(group.texture); + unique_texture_models.push(model::IndexedModelSingleTexture{ + unique_pos:model.unique_pos.clone(), + unique_tex:model.unique_tex.clone(), + unique_normal:model.unique_normal.clone(), + unique_color:model.unique_color.clone(), + unique_vertices:model.unique_vertices.clone(), + texture:group.texture, + groups:Vec::new(), + instances:model.instances.clone(), + }); + texture_index + }; + unique_texture_models[id+texture_index].groups.push(model::IndexedGroupFixedTexture{ + polys:group.polys, + }); + } + } + //de-index models + let mut models=Vec::with_capacity(unique_texture_models.len()); + for model in unique_texture_models.drain(..){ + let mut vertices = Vec::new(); + let mut index_from_vertex = std::collections::HashMap::new();//:: + let mut entities = Vec::new(); + for group in model.groups { + let mut indices = Vec::new(); + for poly in group.polys { + for end_index in 2..poly.vertices.len() { + for &index in &[0, end_index - 1, end_index] { + let vertex_index = poly.vertices[index]; + if let Some(&i)=index_from_vertex.get(&vertex_index){ + indices.push(i); + }else{ + let i=vertices.len() as u16; + let vertex=&model.unique_vertices[vertex_index as usize]; + vertices.push(Vertex { + pos: model.unique_pos[vertex.pos as usize], + tex: model.unique_tex[vertex.tex as usize], + normal: model.unique_normal[vertex.normal as usize], + color:model.unique_color[vertex.color as usize], + }); + index_from_vertex.insert(vertex_index,i); + indices.push(i); + } + } + } + } + entities.push(indices); + } + models.push(model::ModelSingleTexture{ + instances:model.instances, + vertices, + entities, + texture:model.texture, + }); + } //drain the modeldata vec so entities can be /moved/ to models.entities let mut model_count=0; let mut instance_count=0; let uniform_buffer_binding_size=::required_limits().max_uniform_buffer_binding_size as usize; let chunk_size=uniform_buffer_binding_size/MODEL_BUFFER_SIZE_BYTES; - self.models.reserve(modeldatas.len()); - for modeldata in modeldatas.drain(..) { + self.models.reserve(models.len()); + for model in models.drain(..) { instance_count+=model.instances.len(); - for instances_chunk in modeldata.instances.rchunks(chunk_size){ + for instances_chunk in model.instances.rchunks(chunk_size){ model_count+=1; let model_uniforms = get_instances_buffer_data(instances_chunk); let model_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { @@ -155,7 +221,7 @@ impl GraphicsData { contents: bytemuck::cast_slice(&model_uniforms), usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, }); - let texture_view=match modeldata.texture{ + let texture_view=match model.texture{ Some(texture_id)=>{ match double_map.get(&texture_id){ Some(&mapped_texture_id)=>&texture_views[mapped_texture_id as usize], @@ -184,14 +250,14 @@ impl GraphicsData { }); let vertex_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Vertex"), - contents: bytemuck::cast_slice(&modeldata.vertices), + contents: bytemuck::cast_slice(&model.vertices), usage: wgpu::BufferUsages::VERTEX, }); //all of these are being moved here self.models.push(ModelGraphics{ instances:instances_chunk.to_vec(), vertex_buf, - entities: modeldata.entities.iter().map(|indices|{ + entities: model.entities.iter().map(|indices|{ let index_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Index"), contents: bytemuck::cast_slice(&indices), @@ -258,42 +324,42 @@ impl framework::Example for GraphicsData { device: &wgpu::Device, queue: &wgpu::Queue, ) -> Self { - let mut modeldatas = Vec::::new(); - modeldatas.append(&mut model::generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); - modeldatas.append(&mut model::generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); - modeldatas.append(&mut model::generate_modeldatas(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap(),ModelData::COLOR_FLOATS_WHITE)); - modeldatas.push(primitives::the_unit_cube_lol()); - println!("models.len = {:?}", modeldatas.len()); - modeldatas[0].instances.push(ModelInstance{ + let mut indexed_models = Vec::new(); + indexed_models.append(&mut model::generate_indexed_model_list_from_obj(obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap(),*glam::Vec4::ONE.as_ref())); + indexed_models.append(&mut model::generate_indexed_model_list_from_obj(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap(),*glam::Vec4::ONE.as_ref())); + indexed_models.append(&mut model::generate_indexed_model_list_from_obj(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap(),*glam::Vec4::ONE.as_ref())); + indexed_models.push(primitives::the_unit_cube_lol()); + println!("models.len = {:?}", indexed_models.len()); + indexed_models[0].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(10.,0.,-10.)), - color:ModelData::COLOR_VEC4_WHITE, + color:glam::Vec4::ONE, }); //quad monkeys - modeldatas[1].instances.push(ModelInstance{ + indexed_models[1].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)), - color:ModelData::COLOR_VEC4_WHITE, + color:glam::Vec4::ONE, }); - modeldatas[1].instances.push(ModelInstance{ + indexed_models[1].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,10.)), color:glam::vec4(1.0,0.0,0.0,1.0), }); - modeldatas[1].instances.push(ModelInstance{ + indexed_models[1].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,20.)), color:glam::vec4(0.0,1.0,0.0,1.0), }); - modeldatas[1].instances.push(ModelInstance{ + indexed_models[1].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,20.)), color:glam::vec4(0.0,0.0,1.0,1.0), }); //teapot - modeldatas[2].instances.push(ModelInstance{ + indexed_models[2].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(-10.,5.,10.)), - color:ModelData::COLOR_VEC4_WHITE, + color:glam::Vec4::ONE, }); //ground - modeldatas[3].instances.push(ModelInstance{ + indexed_models[3].instances.push(ModelInstance{ model_transform:glam::Affine3A::from_translation(glam::vec3(0.,0.,0.))*glam::Affine3A::from_scale(glam::vec3(160.0, 1.0, 160.0)), - color:ModelData::COLOR_VEC4_WHITE, + color:glam::Vec4::ONE, }); let camera_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { @@ -661,8 +727,12 @@ impl framework::Example for GraphicsData { temp_squid_texture_view: squid_texture_view, }; - graphics.generate_model_physics(&modeldatas); - graphics.generate_model_graphics(&device,&queue,modeldatas,Vec::new()); + let indexed_model_instances=model::IndexedModelInstances{ + textures:Vec::new(), + models:indexed_models, + }; + graphics.generate_model_physics(&indexed_model_instances); + graphics.generate_model_graphics(&device,&queue,indexed_model_instances); return graphics; } @@ -685,30 +755,30 @@ impl framework::Example for GraphicsData { //.snf = "SNBF" if let (Ok(()),Ok(()))=(std::io::Read::read_exact(&mut input, &mut first_8),std::io::Seek::rewind(&mut input)){ // - if let Some(Ok((modeldatas,textures,spawn_point)))={ + if let Some(Ok((indexed_model_instances,spawn_point)))={ if &first_8==b", pub unique_vertices:Vec, pub groups: Vec, + pub instances:Vec, +} +pub struct IndexedGroupFixedTexture{ + pub polys:Vec, +} +pub struct IndexedModelSingleTexture{ + pub unique_pos:Vec<[f32; 3]>, + pub unique_tex:Vec<[f32; 2]>, + pub unique_normal:Vec<[f32; 3]>, + pub unique_color:Vec<[f32; 4]>, + pub unique_vertices:Vec, + pub texture:Option,//RenderPattern? material/texture/shader/flat color + pub groups: Vec, + pub instances:Vec, +} +pub struct ModelSingleTexture{ + pub instances: Vec, + pub vertices: Vec, + pub entities: Vec>, + pub texture: Option, } #[derive(Clone)] pub struct ModelInstance{ - pub model:u32, pub model_transform:glam::Affine3A, pub color:glam::Vec4, } pub struct IndexedModelInstances{ pub textures:Vec,//RenderPattern pub models:Vec, - pub instances:Vec, //object_index for spawns, triggers etc? } -pub fn generate_indexed_model_from_obj(data:obj::ObjData,color:[f32;4]) -> Vec{ +pub fn generate_indexed_model_list_from_obj(data:obj::ObjData,color:[f32;4]) -> Vec{ let mut unique_vertex_index = std::collections::HashMap::::new(); return data.objects.iter().map(|object|{ unique_vertex_index.clear(); @@ -78,6 +96,7 @@ pub fn generate_indexed_model_from_obj(data:obj::ObjData,color:[f32;4]) -> Vec Date: Thu, 28 Sep 2023 16:15:12 -0700 Subject: [PATCH 195/482] calculate vertex extents for accurate mesh aabb hitboxes --- src/body.rs | 26 ++++++++++++++------------ src/main.rs | 10 ++++++---- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/body.rs b/src/body.rs index 10f1def..3ec10d3 100644 --- a/src/body.rs +++ b/src/body.rs @@ -284,7 +284,7 @@ pub enum AabbFace{ Bottom, Front, } - +#[derive(Clone)] pub struct Aabb { min: glam::Vec3, max: glam::Vec3, @@ -387,28 +387,30 @@ type TreyMesh = Aabb; pub struct ModelPhysics { //A model is a thing that has a hitbox. can be represented by a list of TreyMesh-es //in this iteration, all it needs is extents. - model_transform: glam::Affine3A, + mesh: TreyMesh, } impl ModelPhysics { - pub fn new(model_transform:glam::Affine3A) -> Self { - Self{model_transform} + pub fn from_model(model:&crate::model::IndexedModel,model_transform:glam::Affine3A) -> Self { + let mut aabb=Aabb::new(); + for indexed_vertex in &model.unique_vertices { + aabb.grow(model_transform.transform_point3(glam::Vec3::from_array(model.unique_pos[indexed_vertex.pos as usize]))); + } + Self{ + mesh:aabb, + } } pub fn unit_vertices(&self) -> [glam::Vec3;8] { Aabb::unit_vertices() } - pub fn mesh(&self) -> TreyMesh { - let mut aabb=Aabb::new(); - for &vertex in self.unit_vertices().iter() { - aabb.grow(self.model_transform.transform_point3(vertex)); - } - return aabb; + pub fn mesh(&self) -> &TreyMesh { + return &self.mesh; } pub fn unit_face_vertices(&self,face:TreyMeshFace) -> [glam::Vec3;4] { Aabb::unit_face_vertices(face) } pub fn face_mesh(&self,face:TreyMeshFace) -> TreyMesh { - let mut aabb=self.mesh(); + let mut aabb=self.mesh.clone(); //in this implementation face = worldspace aabb face match face { AabbFace::Right => aabb.min.x=aabb.max.x, @@ -435,7 +437,7 @@ pub struct RelativeCollision { impl RelativeCollision { pub fn mesh(&self,models:&Vec) -> TreyMesh { - return models.get(self.model as usize).unwrap().face_mesh(self.face) + return models.get(self.model as usize).unwrap().face_mesh(self.face).clone() } pub fn normal(&self,models:&Vec) -> glam::Vec3 { return models.get(self.model as usize).unwrap().face_normal(self.face) diff --git a/src/main.rs b/src/main.rs index 6fb60d4..46648c5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -83,11 +83,13 @@ impl GraphicsData { depth_texture.create_view(&wgpu::TextureViewDescriptor::default()) } - fn generate_model_physics(&mut self,modeldatas:&Vec){ - self.physics.models.append(&mut modeldatas.iter().map(|m| + fn generate_model_physics(&mut self,indexed_models:&model::IndexedModelInstances){ + for model in &indexed_models.models{ //make aabb and run vertices to get realistic bounds - m.instances.iter().map(|t|body::ModelPhysics::new(t.model_transform)) - ).flatten().collect()); + for model_instance in &model.instances{ + self.physics.models.push(body::ModelPhysics::from_model(&model,model_instance.model_transform)); + } + } println!("Physics Objects: {}",self.physics.models.len()); } fn generate_model_graphics(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,mut indexed_models:model::IndexedModelInstances){ From 575d3432760ed0f5d12275aea559ee22099f45fc Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 19:58:54 -0700 Subject: [PATCH 196/482] relax the wetness --- src/shader.wgsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shader.wgsl b/src/shader.wgsl index 7e8c5ca..1025a46 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -106,5 +106,5 @@ fn fs_entity_texture(vertex: EntityOutputTexture) -> @location(0) vec4 { let fragment_color = textureSample(model_texture, model_sampler, vertex.texture)*vertex.color; let reflected_color = textureSample(cube_texture, cube_sampler, reflected).rgb; - return mix(vec4(vec3(0.1) + 0.5 * reflected_color,1.0),fragment_color,1.0-pow(1.0-abs(d),2.0)); + return mix(vec4(vec3(0.05) + 0.2 * reflected_color,1.0),fragment_color,1.0-pow(1.0-abs(d),2.0)); } From a618f305e11d91f4c9b9bd011373a2d6b8aae495 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 20:01:08 -0700 Subject: [PATCH 197/482] idea for roblox primitives optimization --- src/primitives.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/primitives.rs b/src/primitives.rs index d09f7dc..790117d 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -95,6 +95,7 @@ impl FaceDescription{ } } //TODO: it's probably better to use a shared vertex buffer between all primitives and use indexed rendering instead of generating a unique vertex buffer for each primitive. +//implementation: put all roblox primitives into one model.groups pub fn generate_partial_unit_cube(face_descriptions:[Option;6]) -> crate::model::IndexedModel{ let mut generated_pos=Vec::<[f32;3]>::new(); let mut generated_tex=Vec::new(); From f36b681614cfeea990e37a48ed21f159a714fbac Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 20:21:10 -0700 Subject: [PATCH 198/482] clip camera correctly lol --- src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/body.rs b/src/body.rs index 3ec10d3..0dd795d 100644 --- a/src/body.rs +++ b/src/body.rs @@ -195,7 +195,7 @@ impl Camera { } fn simulate_move_angles(&self, delta: glam::IVec2) -> glam::DVec2 { let mut a=self.angles-self.sensitivity*delta.as_dvec2(); - a.y=a.y.clamp(-std::f64::consts::PI, std::f64::consts::PI); + a.y=a.y.clamp(-std::f64::consts::FRAC_PI_2, std::f64::consts::FRAC_PI_2); return a } fn simulate_move_rotation_y(&self, delta_x: i32) -> glam::Mat3 { From d4835187a83480ac10da34379aded435126cfad4 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 20:40:49 -0700 Subject: [PATCH 199/482] print more graphics info --- src/main.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.rs b/src/main.rs index 46648c5..dd37c8e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -137,6 +137,7 @@ impl GraphicsData { })); } } + let indexed_models_len=indexed_models.models.len(); //split groups with different textures into separate models //the models received here are supposed to be tightly packed, i.e. no code needs to check if two models are using the same groups. let mut unique_texture_models=Vec::with_capacity(indexed_models.models.len()); @@ -275,6 +276,9 @@ impl GraphicsData { }); } } + println!("Texture References={}",indexed_models.textures.len()); + println!("Textures Loaded={}",texture_views.len()); + println!("Indexed Models={}",indexed_models_len); println!("Graphics Objects: {}",self.models.len()); println!("Graphics Instances: {}",instance_count); } From 402def667f425acef1fa4c9a871a662672e90f9d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 28 Sep 2023 20:37:29 -0700 Subject: [PATCH 200/482] v0.6.1 refactor roblox_load model splitting into graphics loading --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2a8ec82..2b60e7a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1659,7 +1659,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strafe-client" -version = "0.6.0" +version = "0.6.1" dependencies = [ "async-executor", "bytemuck", diff --git a/Cargo.toml b/Cargo.toml index 460328e..68c59c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strafe-client" -version = "0.6.0" +version = "0.6.1" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 7e3bfeb59ebc1f8833613c359b925475395a1f8b Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 29 Sep 2023 01:58:44 -0700 Subject: [PATCH 201/482] default texture alpha is zero to reveal model_color --- src/primitives.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/primitives.rs b/src/primitives.rs index 790117d..b9af225 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -78,7 +78,7 @@ impl std::default::Default for FaceDescription{ Self{ texture:None, transform:glam::Affine2::IDENTITY, - color:glam::Vec4::ONE, + color:glam::vec4(1.0,1.0,1.0,0.0),//zero alpha to hide the default texture } } } From 2df76f020b52adc6b55631cfc225df8e4ec212af Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 29 Sep 2023 01:58:41 -0700 Subject: [PATCH 202/482] blend with texture alpha --- src/shader.wgsl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/shader.wgsl b/src/shader.wgsl index 1025a46..9de865c 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -65,6 +65,7 @@ struct EntityOutputTexture { @location(2) normal: vec3, @location(3) view: vec3, @location(4) color: vec4, + @location(5) @interpolate(flat) model_color: vec4, }; @vertex fn vs_entity_texture( @@ -78,7 +79,8 @@ fn vs_entity_texture( var result: EntityOutputTexture; result.normal = (model_instances[instance].model_transform * vec4(normal, 0.0)).xyz; result.texture = texture; - result.color = model_instances[instance].color * color; + result.color = color; + result.model_color = model_instances[instance].color; result.view = position.xyz - camera.cam_pos.xyz; result.position = camera.proj * camera.view * position; return result; @@ -106,5 +108,5 @@ fn fs_entity_texture(vertex: EntityOutputTexture) -> @location(0) vec4 { let fragment_color = textureSample(model_texture, model_sampler, vertex.texture)*vertex.color; let reflected_color = textureSample(cube_texture, cube_sampler, reflected).rgb; - return mix(vec4(vec3(0.05) + 0.2 * reflected_color,1.0),fragment_color,1.0-pow(1.0-abs(d),2.0)); + return mix(vec4(vec3(0.05) + 0.2 * reflected_color,1.0),mix(vertex.model_color,vec4(fragment_color.rgb,1.0),fragment_color.a),1.0-pow(1.0-abs(d),2.0)); } From c85a84a52e2a12249e9d28ec3f99f3a0c1891054 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 29 Sep 2023 01:58:31 -0700 Subject: [PATCH 203/482] enable model color --- src/load_roblox.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 8d63e2d..7ade02f 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -250,7 +250,7 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde }; indexed_models[model_id].instances.push(ModelInstance { model_transform, - color: glam::Vec4::ONE,//glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), + color:glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), }); } } From ccc94839e597e539bfc4db66b55dc588538a7a79 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 29 Sep 2023 02:38:56 -0700 Subject: [PATCH 204/482] v0.6.2 blend model color with texture alpha --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2b60e7a..363f887 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1659,7 +1659,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strafe-client" -version = "0.6.1" +version = "0.6.2" dependencies = [ "async-executor", "bytemuck", diff --git a/Cargo.toml b/Cargo.toml index 68c59c5..35478a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strafe-client" -version = "0.6.1" +version = "0.6.2" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 9ce9eb50bef2ab4665e30831d691407f2a2a8d19 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 29 Sep 2023 13:26:31 -0700 Subject: [PATCH 205/482] fix washed out textures --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index dd37c8e..baa8b01 100644 --- a/src/main.rs +++ b/src/main.rs @@ -121,7 +121,7 @@ impl GraphicsData { mip_level_count: max_mips, sample_count: 1, dimension: wgpu::TextureDimension::D2, - format: wgpu::TextureFormat::Bc7RgbaUnorm, + format: wgpu::TextureFormat::Bc7RgbaUnormSrgb, usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, label: Some(format!("Texture{}",i).as_str()), view_formats: &[], From 4ee29911a3c1787636014fc1728cd784c6591e92 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 29 Sep 2023 18:05:36 -0700 Subject: [PATCH 206/482] read and use dds format --- src/main.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index baa8b01..73c60c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -102,9 +102,22 @@ impl GraphicsData { if let Ok(mut file) = std::fs::File::open(std::path::Path::new(&format!("textures/{}.dds",t))){ let image = ddsfile::Dds::read(&mut file).unwrap(); + let (mut width,mut height)=(image.get_width(),image.get_height()); + + let format=match image.header10.unwrap().dxgi_format{ + ddsfile::DxgiFormat::R8G8B8A8_UNorm_sRGB => wgpu::TextureFormat::Rgba8UnormSrgb, + ddsfile::DxgiFormat::BC7_UNorm_sRGB => { + //floor(w,4), should be ceil(w,4) + width=width/4*4; + height=height/4*4; + wgpu::TextureFormat::Bc7RgbaUnormSrgb + }, + other=>panic!("unsupported format {:?}",other), + }; + let size = wgpu::Extent3d { - width: image.get_width()/4*4,//floor(w,4), should be ceil(w,4) - height: image.get_height()/4*4, + width, + height, depth_or_array_layers: 1, }; @@ -121,7 +134,7 @@ impl GraphicsData { mip_level_count: max_mips, sample_count: 1, dimension: wgpu::TextureDimension::D2, - format: wgpu::TextureFormat::Bc7RgbaUnormSrgb, + format, usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, label: Some(format!("Texture{}",i).as_str()), view_formats: &[], From 977c8e565cc31f9208e011ddcc1b6c45625599cc Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 29 Sep 2023 22:48:48 -0700 Subject: [PATCH 207/482] need lower sens man --- src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/body.rs b/src/body.rs index 0dd795d..a70d37b 100644 --- a/src/body.rs +++ b/src/body.rs @@ -189,7 +189,7 @@ impl Camera { offset, angles: glam::DVec2::ZERO, fov: glam::vec2(aspect,1.0), - sensitivity: glam::dvec2(1.0/4096.0,1.0/4096.0), + sensitivity: glam::dvec2(1.0/6144.0,1.0/6144.0), time: 0, } } From b3f780204680bc1786db34c3d80c74c88fd86311 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 30 Sep 2023 00:13:26 -0700 Subject: [PATCH 208/482] Idle instruction: important concept for marking the end of instruction streams, including real time networking --- src/body.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/body.rs b/src/body.rs index a70d37b..005d3a7 100644 --- a/src/body.rs +++ b/src/body.rs @@ -29,6 +29,10 @@ pub enum InputInstruction { Jump(bool), Zoom(bool), Reset, + Idle, + //Idle: there were no input events, but the simulation is safe to advance to this timestep + //for interpolation / networking / playback reasons, most playback heads will always want + //to be 1 instruction ahead to generate the next state for interpolation. } pub struct Body { @@ -1022,6 +1026,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat self.walk.state=WalkEnum::Reached; self.grounded=false; }, + InputInstruction::Idle => (),//literally idle! } //calculate control dir let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); From d7010956b36ffc4dd25c96077b06848daa742cc6 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 30 Sep 2023 02:53:25 -0700 Subject: [PATCH 209/482] match match lole I disliked how if Some else None repeated twice looked, but I'm not sure if this is better --- src/main.rs | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/main.rs b/src/main.rs index 73c60c3..8b229b1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -775,22 +775,24 @@ impl framework::Example for GraphicsData { if let (Ok(()),Ok(()))=(std::io::Read::read_exact(&mut input, &mut first_8),std::io::Seek::rewind(&mut input)){ // if let Some(Ok((indexed_model_instances,spawn_point)))={ - if &first_8==b"{ + match match &first_8[4..8]{ + b"lox!"=>rbx_binary::from_reader(input).map_err(|e|format!("{:?}",e)), + b"lox "=>rbx_xml::from_reader(input,rbx_xml::DecodeOptions::default()).map_err(|e|format!("{:?}",e)), + other=>Err(format!("Unknown Roblox file type {:?}",other)), + }{ + Ok(dom)=>Some(load_roblox::generate_indexed_models_roblox(dom)), + Err(e)=>{ + println!("Error loading roblox file:{:?}",e); + None + }, + } + }, + //b"VBSP"=>load_valve::generate_indexed_models_valve(input), + //b"SNFM"=>sniffer::generate_indexed_models(input), + //b"SNFB"=>sniffer::load_bot(input), + _=>None, } }{ //if generate_indexed_models succeeds, clear the previous ones From 602816a61871542b5463112a85cc386bd669c07d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 30 Sep 2023 02:55:30 -0700 Subject: [PATCH 210/482] typo --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 8b229b1..acec91e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -814,7 +814,7 @@ impl framework::Example for GraphicsData { println!("No modeldatas were generated"); } }else{ - println!("Failed ro read first 8 bytes and seek back to beginning of file."); + println!("Failed to read first 8 bytes and seek back to beginning of file."); } }else{ println!("Could not open file"); From 5cd40afa568e36b6f79d8c6ec8e52b998d4d5dd3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 30 Sep 2023 13:00:01 -0700 Subject: [PATCH 211/482] create ModelGraphicsInstance and include inverse transpose matrix for normals --- src/load_roblox.rs | 2 +- src/main.rs | 40 +++++++++++++++++++++++++--------------- src/model.rs | 11 ++++++++--- src/shader.wgsl | 7 ++++--- 4 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 7ade02f..fdde353 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -249,7 +249,7 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde } }; indexed_models[model_id].instances.push(ModelInstance { - model_transform, + transform:model_transform, color:glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), }); } diff --git a/src/main.rs b/src/main.rs index acec91e..ffee735 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use std::{borrow::Cow, time::Instant}; use wgpu::{util::DeviceExt, AstcBlock, AstcChannel}; -use model::{Vertex,ModelInstance}; +use model::{Vertex,ModelInstance,ModelGraphicsInstance}; use body::{InputInstruction, PhysicsInstruction}; use instruction::{TimedInstruction, InstructionConsumer}; @@ -18,7 +18,7 @@ struct Entity { } struct ModelGraphics { - instances: Vec, + instances: Vec, vertex_buf: wgpu::Buffer, entities: Vec, bind_group: wgpu::BindGroup, @@ -87,7 +87,7 @@ impl GraphicsData { for model in &indexed_models.models{ //make aabb and run vertices to get realistic bounds for model_instance in &model.instances{ - self.physics.models.push(body::ModelPhysics::from_model(&model,model_instance.model_transform)); + self.physics.models.push(body::ModelPhysics::from_model(&model,model_instance.transform)); } } println!("Physics Objects: {}",self.physics.models.len()); @@ -155,6 +155,14 @@ impl GraphicsData { //the models received here are supposed to be tightly packed, i.e. no code needs to check if two models are using the same groups. let mut unique_texture_models=Vec::with_capacity(indexed_models.models.len()); for mut model in indexed_models.models.drain(..){ + //convert ModelInstance into ModelGraphicsInstance + let instances:Vec=model.instances.iter().map(|instance|{ + ModelGraphicsInstance{ + transform: glam::Mat4::from(instance.transform), + normal_transform: glam::Mat4::from(instance.transform.inverse()).transpose(), + color: instance.color, + } + }).collect(); //check each group, if it's using a new texture then make a new clone of the model let id=unique_texture_models.len(); let mut unique_textures=Vec::new(); @@ -174,7 +182,7 @@ impl GraphicsData { unique_vertices:model.unique_vertices.clone(), texture:group.texture, groups:Vec::new(), - instances:model.instances.clone(), + instances:instances.clone(), }); texture_index }; @@ -297,14 +305,16 @@ impl GraphicsData { } } -const MODEL_BUFFER_SIZE:usize=4*4 + 4;//let size=std::mem::size_of::(); +const MODEL_BUFFER_SIZE:usize=4*4 + 4*4 + 4;//let size=std::mem::size_of::(); const MODEL_BUFFER_SIZE_BYTES:usize=MODEL_BUFFER_SIZE*4; -fn get_instances_buffer_data(instances:&[ModelInstance]) -> Vec { +fn get_instances_buffer_data(instances:&[ModelGraphicsInstance]) -> Vec { let mut raw = Vec::with_capacity(MODEL_BUFFER_SIZE*instances.len()); for (i,mi) in instances.iter().enumerate(){ let mut v = raw.split_off(MODEL_BUFFER_SIZE*i); - //model_transform - raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&glam::Mat4::from(mi.model_transform))[..]); + //model transform + raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&mi.transform)[..]); + //normal transform + raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&mi.normal_transform)[..]); //color raw.extend_from_slice(AsRef::<[f32; 4]>::as_ref(&mi.color)); raw.append(&mut v); @@ -350,34 +360,34 @@ impl framework::Example for GraphicsData { indexed_models.push(primitives::the_unit_cube_lol()); println!("models.len = {:?}", indexed_models.len()); indexed_models[0].instances.push(ModelInstance{ - model_transform:glam::Affine3A::from_translation(glam::vec3(10.,0.,-10.)), + transform:glam::Affine3A::from_translation(glam::vec3(10.,0.,-10.)), color:glam::Vec4::ONE, }); //quad monkeys indexed_models[1].instances.push(ModelInstance{ - model_transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)), + transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)), color:glam::Vec4::ONE, }); indexed_models[1].instances.push(ModelInstance{ - model_transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,10.)), + transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,10.)), color:glam::vec4(1.0,0.0,0.0,1.0), }); indexed_models[1].instances.push(ModelInstance{ - model_transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,20.)), + transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,20.)), color:glam::vec4(0.0,1.0,0.0,1.0), }); indexed_models[1].instances.push(ModelInstance{ - model_transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,20.)), + transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,20.)), color:glam::vec4(0.0,0.0,1.0,1.0), }); //teapot indexed_models[2].instances.push(ModelInstance{ - model_transform:glam::Affine3A::from_translation(glam::vec3(-10.,5.,10.)), + transform:glam::Affine3A::from_translation(glam::vec3(-10.,5.,10.)), color:glam::Vec4::ONE, }); //ground indexed_models[3].instances.push(ModelInstance{ - model_transform:glam::Affine3A::from_translation(glam::vec3(0.,0.,0.))*glam::Affine3A::from_scale(glam::vec3(160.0, 1.0, 160.0)), + transform:glam::Affine3A::from_translation(glam::vec3(0.,0.,0.))*glam::Affine3A::from_scale(glam::vec3(160.0, 1.0, 160.0)), color:glam::Vec4::ONE, }); diff --git a/src/model.rs b/src/model.rs index 2123e61..79bd70e 100644 --- a/src/model.rs +++ b/src/model.rs @@ -41,17 +41,22 @@ pub struct IndexedModelSingleTexture{ pub unique_vertices:Vec, pub texture:Option,//RenderPattern? material/texture/shader/flat color pub groups: Vec, - pub instances:Vec, + pub instances:Vec, } pub struct ModelSingleTexture{ - pub instances: Vec, + pub instances: Vec, pub vertices: Vec, pub entities: Vec>, pub texture: Option, } #[derive(Clone)] +pub struct ModelGraphicsInstance{ + pub transform:glam::Mat4, + pub normal_transform:glam::Mat4, + pub color:glam::Vec4, +} pub struct ModelInstance{ - pub model_transform:glam::Affine3A, + pub transform:glam::Affine3A, pub color:glam::Vec4, } pub struct IndexedModelInstances{ diff --git a/src/shader.wgsl b/src/shader.wgsl index 9de865c..5e2a7e1 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -42,7 +42,8 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { } struct ModelInstance{ - model_transform:mat4x4, + transform:mat4x4, + normal_transform:mat4x4, color:vec4, } //my fancy idea is to create a megatexture for each model that includes all the textures each intance will need @@ -75,9 +76,9 @@ fn vs_entity_texture( @location(2) normal: vec3, @location(3) color: vec4, ) -> EntityOutputTexture { - var position: vec4 = model_instances[instance].model_transform * vec4(pos, 1.0); + var position: vec4 = model_instances[instance].transform * vec4(pos, 1.0); var result: EntityOutputTexture; - result.normal = (model_instances[instance].model_transform * vec4(normal, 0.0)).xyz; + result.normal = (model_instances[instance].normal_transform * vec4(normal, 1.0)).xyz; result.texture = texture; result.color = color; result.model_color = model_instances[instance].color; From 92bbbce1c3e713f3a12d895d6f4e30411149c2ce Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 30 Sep 2023 16:18:23 -0700 Subject: [PATCH 212/482] umm wend --- src/load_roblox.rs | 174 +++++++++++++---- src/main.rs | 9 +- src/primitives.rs | 461 ++++++++++++++++++++++++++++++++++++++------- 3 files changed, 542 insertions(+), 102 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index fdde353..b74df97 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -86,12 +86,30 @@ impl std::hash::Hash for RobloxFaceTextureDescription { } } } +impl RobloxFaceTextureDescription{ + fn to_face_description(&self)->primitives::FaceDescription{ + primitives::FaceDescription{ + texture:Some(self.texture), + transform:glam::Affine2::from_translation( + glam::vec2(self.transform.offset_u,self.transform.offset_v) + ) + *glam::Affine2::from_scale( + glam::vec2(self.transform.scale_u,self.transform.scale_v) + ), + color:self.color, + } + } +} type RobloxPartDescription=[Option;6]; -//type RobloxWedgeDescription=[Option;5]; +type RobloxWedgeDescription=[Option;5]; +type RobloxCornerWedgeDescription=[Option;4]; #[derive(Clone,Eq,Hash,PartialEq)] enum RobloxBasePartDescription{ + Sphere, Part(RobloxPartDescription), - //Wedge(RobloxWedgeDescription), + Cylinder, + Wedge(RobloxWedgeDescription), + CornerWedge(RobloxCornerWedgeDescription), } pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(IndexedModelInstances,glam::Vec3), Box>{ //IndexedModelInstances includes textures @@ -139,13 +157,55 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde spawn_point=model_transform.transform_point3(glam::Vec3::Y)+glam::vec3(0.0,2.5,0.0); println!("Found MapStart{:?}",spawn_point); } - if *transparency==1.0||shape.to_u32()!=1 { + if *transparency==1.0 { continue; } + + let shape=match shape.to_u32(){ + 0=>primitives::Primitives::Sphere, + 1=>primitives::Primitives::Cube, + 2=>primitives::Primitives::Cylinder, + 3=>primitives::Primitives::Wedge, + 4=>primitives::Primitives::CornerWedge, + _=>panic!("funky roblox PartType={}",shape.to_u32()), + }; + + //TODO: also detect "CylinderMesh" etc here + let mut face_map=std::collections::HashMap::new(); + match shape{ + primitives::Primitives::Cube => { + face_map.insert(0,0);//Right + face_map.insert(1,1);//Top + face_map.insert(2,2);//Back + face_map.insert(3,3);//Left + face_map.insert(4,4);//Bottom + face_map.insert(5,5);//Front + }, + primitives::Primitives::Wedge => { + face_map.insert(0,0);//Right + face_map.insert(1,1);//Top -> TopFront (some surf maps put surf textures on the Top face) + face_map.insert(2,1);//Front -> TopFront + face_map.insert(3,2);//Back + face_map.insert(4,3);//Left + face_map.insert(5,4);//Bottom + }, + primitives::Primitives::CornerWedge => { + //Right -> None + face_map.insert(1,0);//Top + //Back -> None + face_map.insert(3,1);//Right + face_map.insert(4,2);//Bottom + face_map.insert(5,3);//Front + }, + //do not support textured spheres/cylinders imported from roblox + //this can be added later, there are some maps that use it + primitives::Primitives::Sphere + |primitives::Primitives::Cylinder => (), + } + //use the biggest one and cut it down later... + let mut part_texture_description:RobloxPartDescription=[None,None,None,None,None,None]; temp_objects.clear(); recursive_collect_superclass(&mut temp_objects, &dom, object,"Decal"); - - let mut part_texture_description:RobloxPartDescription=[None,None,None,None,None,None]; for &decal_ref in &temp_objects{ if let Some(decal)=dom.get_by_ref(decal_ref){ if let ( @@ -168,8 +228,8 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde asset_id_from_texture_id.push(asset_id.0); texture_id }; - let face=normalid.to_u32(); - if face<6{ + let normal_id=normalid.to_u32(); + if let Some(&face)=face_map.get(&normal_id){ let mut roblox_texture_transform=RobloxTextureTransform::default(); let mut roblox_texture_color=glam::Vec4::ONE; if decal.class=="Texture"{ @@ -186,7 +246,7 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde decal.properties.get("StudsPerTileV"), ) { - let (size_u,size_v)=match face{ + let (size_u,size_v)=match normal_id{ 0=>(size.z,size.y),//right 1=>(size.x,size.z),//top 2=>(size.x,size.y),//back @@ -202,20 +262,28 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde roblox_texture_color=glam::vec4(decal_color3.r,decal_color3.g,decal_color3.b,1.0-*decal_transparency); } } - part_texture_description[face as usize]=Some(RobloxFaceTextureDescription{ + part_texture_description[face]=Some(RobloxFaceTextureDescription{ texture:texture_id, color:roblox_texture_color, transform:roblox_texture_transform, }); }else{ - println!("goofy ahh roblox gave NormalId {}", face); + println!("NormalId={} unsupported for shape={:?}",normal_id,shape); } } } } } - //TODO: generate unit Block, Wedge, etc. based on part shape lists - let basepart_texture_description=RobloxBasePartDescription::Part(part_texture_description); + //obscure rust syntax "slice pattern" + let [f0,f1,f2,f3,f4,f5]=part_texture_description; + let basepart_texture_description=match shape{ + primitives::Primitives::Sphere=>RobloxBasePartDescription::Sphere, + primitives::Primitives::Cube=>RobloxBasePartDescription::Part([f0,f1,f2,f3,f4,f5]), + primitives::Primitives::Cylinder=>RobloxBasePartDescription::Cylinder, + //HAHAHA + primitives::Primitives::Wedge=>RobloxBasePartDescription::Wedge([f0,f1,f2,f3,f4]), + primitives::Primitives::CornerWedge=>RobloxBasePartDescription::CornerWedge([f0,f1,f2,f3]), + }; //make new model if unit cube has not been crated before let model_id=if let Some(&model_id)=model_id_from_description.get(&basepart_texture_description){ //push to existing texture model @@ -223,30 +291,68 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde }else{ let model_id=indexed_models.len(); model_id_from_description.insert(basepart_texture_description.clone(),model_id);//borrow checker going crazy - match basepart_texture_description{ + indexed_models.push(match basepart_texture_description{ + RobloxBasePartDescription::Sphere=>primitives::unit_sphere(), RobloxBasePartDescription::Part(part_texture_description)=>{ - let unit_cube_faces=part_texture_description.map(|face|{ - match face{ - Some(roblox_texture_transform)=>Some( - primitives::FaceDescription{ - texture:Some(roblox_texture_transform.texture), - transform:glam::Affine2::from_translation( - glam::vec2(roblox_texture_transform.transform.offset_u,roblox_texture_transform.transform.offset_v) - ) - *glam::Affine2::from_scale( - glam::vec2(roblox_texture_transform.transform.scale_u,roblox_texture_transform.transform.scale_v) - ), - color:roblox_texture_transform.color, - } - ), - None=>Some(primitives::FaceDescription::default()), - } - }); - let indexed_model=primitives::generate_partial_unit_cube(unit_cube_faces); - indexed_models.push(indexed_model); - model_id + let mut cube_face_description=primitives::CubeFaceDescription::new(); + for (face_id,roblox_face_description) in part_texture_description.iter().enumerate(){ + cube_face_description.insert( + match face_id{ + 0=>primitives::CubeFace::Right, + 1=>primitives::CubeFace::Top, + 2=>primitives::CubeFace::Back, + 3=>primitives::CubeFace::Left, + 4=>primitives::CubeFace::Bottom, + 5=>primitives::CubeFace::Front, + _=>panic!("unreachable"), + }, + match roblox_face_description{ + Some(roblox_texture_transform)=>roblox_texture_transform.to_face_description(), + None=>primitives::FaceDescription::default(), + }); + } + primitives::generate_partial_unit_cube(cube_face_description) }, - } + RobloxBasePartDescription::Cylinder=>primitives::unit_cylinder(), + RobloxBasePartDescription::Wedge(wedge_texture_description)=>{ + let mut wedge_face_description=primitives::WedgeFaceDescription::new(); + for (face_id,roblox_face_description) in wedge_texture_description.iter().enumerate(){ + wedge_face_description.insert( + match face_id{ + 0=>primitives::WedgeFace::Right, + 1=>primitives::WedgeFace::TopFront, + 2=>primitives::WedgeFace::Back, + 3=>primitives::WedgeFace::Left, + 4=>primitives::WedgeFace::Bottom, + _=>panic!("unreachable"), + }, + match roblox_face_description{ + Some(roblox_texture_transform)=>roblox_texture_transform.to_face_description(), + None=>primitives::FaceDescription::default(), + }); + } + primitives::generate_partial_unit_wedge(wedge_face_description) + }, + RobloxBasePartDescription::CornerWedge(cornerwedge_texture_description)=>{ + let mut cornerwedge_face_description=primitives::CornerWedgeFaceDescription::new(); + for (face_id,roblox_face_description) in cornerwedge_texture_description.iter().enumerate(){ + cornerwedge_face_description.insert( + match face_id{ + 0=>primitives::CornerWedgeFace::Top, + 1=>primitives::CornerWedgeFace::Right, + 2=>primitives::CornerWedgeFace::Bottom, + 3=>primitives::CornerWedgeFace::Front, + _=>panic!("unreachable"), + }, + match roblox_face_description{ + Some(roblox_texture_transform)=>roblox_texture_transform.to_face_description(), + None=>primitives::FaceDescription::default(), + }); + } + primitives::generate_partial_unit_cornerwedge(cornerwedge_face_description) + }, + }); + model_id }; indexed_models[model_id].instances.push(ModelInstance { transform:model_transform, diff --git a/src/main.rs b/src/main.rs index ffee735..89052be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -197,6 +197,7 @@ impl GraphicsData { let mut vertices = Vec::new(); let mut index_from_vertex = std::collections::HashMap::new();//:: let mut entities = Vec::new(); + //TODO: combine groups using the same render pattern for group in model.groups { let mut indices = Vec::new(); for poly in group.polys { @@ -355,9 +356,9 @@ impl framework::Example for GraphicsData { ) -> Self { let mut indexed_models = Vec::new(); indexed_models.append(&mut model::generate_indexed_model_list_from_obj(obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap(),*glam::Vec4::ONE.as_ref())); - indexed_models.append(&mut model::generate_indexed_model_list_from_obj(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap(),*glam::Vec4::ONE.as_ref())); - indexed_models.append(&mut model::generate_indexed_model_list_from_obj(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap(),*glam::Vec4::ONE.as_ref())); - indexed_models.push(primitives::the_unit_cube_lol()); + indexed_models.push(primitives::unit_sphere()); + indexed_models.push(primitives::unit_cylinder()); + indexed_models.push(primitives::unit_cube()); println!("models.len = {:?}", indexed_models.len()); indexed_models[0].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(10.,0.,-10.)), @@ -382,7 +383,7 @@ impl framework::Example for GraphicsData { }); //teapot indexed_models[2].instances.push(ModelInstance{ - transform:glam::Affine3A::from_translation(glam::vec3(-10.,5.,10.)), + transform:glam::Affine3A::from_scale_rotation_translation(glam::vec3(0.5, 1.0, 0.2),glam::quat(-0.22248298016985793,-0.839457167990537,-0.05603504040830783,-0.49261857546227916),glam::vec3(-10.,7.,10.)), color:glam::Vec4::ONE, }); //ground diff --git a/src/primitives.rs b/src/primitives.rs index b9af225..53be8cb 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -1,5 +1,22 @@ use crate::model::{IndexedModel, IndexedPolygon, IndexedGroup, IndexedVertex}; +#[derive(Debug)] +pub enum Primitives{ + Sphere, + Cube, + Cylinder, + Wedge, + CornerWedge, +} +#[derive(Hash,PartialEq,Eq)] +pub enum CubeFace{ + Right, + Top, + Back, + Left, + Bottom, + Front, +} const CUBE_DEFAULT_TEXTURE_COORDS:[[f32;2];4]=[[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0]]; const CUBE_DEFAULT_VERTICES:[[f32;3];8]=[ [-1.,-1., 1.],//0 left bottom back @@ -12,12 +29,12 @@ const CUBE_DEFAULT_VERTICES:[[f32;3];8]=[ [-1.,-1.,-1.],//7 left bottom front ]; const CUBE_DEFAULT_NORMALS:[[f32;3];6]=[ - [ 1., 0., 0.],//AabbFace::Right - [ 0., 1., 0.],//AabbFace::Top - [ 0., 0., 1.],//AabbFace::Back - [-1., 0., 0.],//AabbFace::Left - [ 0.,-1., 0.],//AabbFace::Bottom - [ 0., 0.,-1.],//AabbFace::Front + [ 1., 0., 0.],//CubeFace::Right + [ 0., 1., 0.],//CubeFace::Top + [ 0., 0., 1.],//CubeFace::Back + [-1., 0., 0.],//CubeFace::Left + [ 0.,-1., 0.],//CubeFace::Bottom + [ 0., 0.,-1.],//CubeFace::Front ]; const CUBE_DEFAULT_POLYS:[[[u32;3];4];6]=[ // right (1, 0, 0) @@ -63,8 +80,93 @@ const CUBE_DEFAULT_POLYS:[[[u32;3];4];6]=[ [7,2,5], ], ]; -pub fn the_unit_cube_lol() -> crate::model::IndexedModel{ - generate_partial_unit_cube([Some(FaceDescription::default());6]) + +#[derive(Hash,PartialEq,Eq)] +pub enum WedgeFace{ + Right, + TopFront, + Back, + Left, + Bottom, +} +const WEDGE_DEFAULT_NORMALS:[[f32;3];5]=[ + [ 1., 0., 0.],//Wedge::Right + [ 0., 1.,-1.],//Wedge::TopFront + [ 0., 0., 1.],//Wedge::Back + [-1., 0., 0.],//Wedge::Left + [ 0.,-1., 0.],//Wedge::Bottom +]; +/* +local cornerWedgeVerticies = { + Vector3.new(-1/2,-1/2,-1/2),7 + Vector3.new(-1/2,-1/2, 1/2),0 + Vector3.new( 1/2,-1/2,-1/2),6 + Vector3.new( 1/2,-1/2, 1/2),1 + Vector3.new( 1/2, 1/2,-1/2),5 +} +*/ +#[derive(Hash,PartialEq,Eq)] +pub enum CornerWedgeFace{ + Top, + Right, + Bottom, + Front, +} +const CORNERWEDGE_DEFAULT_NORMALS:[[f32;3];5]=[ + [ 1., 0., 0.],//Wedge::Right + [ 0., 1., 1.],//Wedge::BackTop + [-1., 1., 0.],//Wedge::LeftTop + [ 0.,-1., 0.],//Wedge::Bottom + [ 0., 0.,-1.],//Wedge::Front +]; +//HashMap fits this use case perfectly but feels like using a sledgehammer to drive a nail +pub fn unit_sphere()->crate::model::IndexedModel{ + let mut indexed_model=crate::model::generate_indexed_model_list_from_obj(obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap(),*glam::Vec4::ONE.as_ref()).remove(0); + for pos in indexed_model.unique_pos.iter_mut(){ + pos[0]=pos[0]*0.5; + pos[1]=pos[1]*0.5; + pos[2]=pos[2]*0.5; + } + indexed_model +} +pub type CubeFaceDescription=std::collections::HashMap::; +pub fn unit_cube()->crate::model::IndexedModel{ + let mut t=CubeFaceDescription::new(); + t.insert(CubeFace::Right,FaceDescription::default()); + t.insert(CubeFace::Top,FaceDescription::default()); + t.insert(CubeFace::Back,FaceDescription::default()); + t.insert(CubeFace::Left,FaceDescription::default()); + t.insert(CubeFace::Bottom,FaceDescription::default()); + t.insert(CubeFace::Front,FaceDescription::default()); + generate_partial_unit_cube(t) +} +pub fn unit_cylinder()->crate::model::IndexedModel{ + let mut indexed_model=crate::model::generate_indexed_model_list_from_obj(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap(),*glam::Vec4::ONE.as_ref()).remove(0); + for pos in indexed_model.unique_pos.iter_mut(){ + pos[0]=pos[0]*0.1; + pos[1]=pos[1]*0.1; + pos[2]=pos[2]*0.1; + } + indexed_model +} +pub type WedgeFaceDescription=std::collections::HashMap::; +pub fn unit_wedge()->crate::model::IndexedModel{ + let mut t=WedgeFaceDescription::new(); + t.insert(WedgeFace::Right,FaceDescription::default()); + t.insert(WedgeFace::TopFront,FaceDescription::default()); + t.insert(WedgeFace::Back,FaceDescription::default()); + t.insert(WedgeFace::Left,FaceDescription::default()); + t.insert(WedgeFace::Bottom,FaceDescription::default()); + generate_partial_unit_wedge(t) +} +pub type CornerWedgeFaceDescription=std::collections::HashMap::; +pub fn unit_cornerwedge()->crate::model::IndexedModel{ + let mut t=CornerWedgeFaceDescription::new(); + t.insert(CornerWedgeFace::Right,FaceDescription::default()); + t.insert(CornerWedgeFace::Top,FaceDescription::default()); + t.insert(CornerWedgeFace::Bottom,FaceDescription::default()); + t.insert(CornerWedgeFace::Front,FaceDescription::default()); + generate_partial_unit_cornerwedge(t) } #[derive(Copy,Clone)] @@ -74,7 +176,7 @@ pub struct FaceDescription{ pub color:glam::Vec4, } impl std::default::Default for FaceDescription{ - fn default() -> Self { + fn default()->Self { Self{ texture:None, transform:glam::Affine2::IDENTITY, @@ -95,8 +197,8 @@ impl FaceDescription{ } } //TODO: it's probably better to use a shared vertex buffer between all primitives and use indexed rendering instead of generating a unique vertex buffer for each primitive. -//implementation: put all roblox primitives into one model.groups -pub fn generate_partial_unit_cube(face_descriptions:[Option;6]) -> crate::model::IndexedModel{ +//implementation: put all roblox primitives into one model.groups <- this won't work but I forget why +pub fn generate_partial_unit_cube(face_descriptions:CubeFaceDescription)->crate::model::IndexedModel{ let mut generated_pos=Vec::<[f32;3]>::new(); let mut generated_tex=Vec::new(); let mut generated_normal=Vec::new(); @@ -105,59 +207,290 @@ pub fn generate_partial_unit_cube(face_descriptions:[Option;6]) let mut groups=Vec::new(); let mut transforms=Vec::new(); //note that on a cube every vertex is guaranteed to be unique, so there's no need to hash them against existing vertices. - for (i,maybe_face_description) in face_descriptions.iter().enumerate(){ - if let Some(face_description)=maybe_face_description{ - //assume that scanning short lists is faster than hashing. - let transform_index=if let Some(transform_index)=transforms.iter().position(|&transform|transform==face_description.transform){ - transform_index - }else{ - //create new transform_index - let transform_index=transforms.len(); - transforms.push(face_description.transform); - for tex in CUBE_DEFAULT_TEXTURE_COORDS{ - generated_tex.push(*face_description.transform.transform_point2(glam::Vec2::from_array(tex)).as_ref()); - } - transform_index - } as u32; - let color_index=if let Some(color_index)=generated_color.iter().position(|color|color==face_description.color.as_ref()){ - color_index - }else{ - //create new color_index - let color_index=generated_color.len(); - generated_color.push(*face_description.color.as_ref()); - color_index - } as u32; - //always push normal - let normal_index=generated_normal.len() as u32; - generated_normal.push(CUBE_DEFAULT_NORMALS[i]); - //push vertices as they are needed - groups.push(IndexedGroup{ - texture:face_description.texture, - polys:vec![IndexedPolygon{ - vertices:CUBE_DEFAULT_POLYS[i].map(|tup|{ - let pos=CUBE_DEFAULT_VERTICES[tup[0] as usize]; - let pos_index=if let Some(pos_index)=generated_pos.iter().position(|&p|p==pos){ - pos_index - }else{ - //create new pos_index - let pos_index=generated_pos.len(); - generated_pos.push(pos); - pos_index - } as u32; - //always push vertex - let vertex=IndexedVertex{ - pos:pos_index, - tex:tup[1]+4*transform_index, - normal:normal_index, - color:color_index, - }; - let vert_index=generated_vertices.len(); - generated_vertices.push(vertex); - vert_index as u32 - }).to_vec(), - }], - }); - } + for (face,face_description) in face_descriptions.iter(){ + //assume that scanning short lists is faster than hashing. + let transform_index=if let Some(transform_index)=transforms.iter().position(|&transform|transform==face_description.transform){ + transform_index + }else{ + //create new transform_index + let transform_index=transforms.len(); + transforms.push(face_description.transform); + for tex in CUBE_DEFAULT_TEXTURE_COORDS{ + generated_tex.push(*face_description.transform.transform_point2(glam::Vec2::from_array(tex)).as_ref()); + } + transform_index + } as u32; + let color_index=if let Some(color_index)=generated_color.iter().position(|color|color==face_description.color.as_ref()){ + color_index + }else{ + //create new color_index + let color_index=generated_color.len(); + generated_color.push(*face_description.color.as_ref()); + color_index + } as u32; + let face_id=match face{ + CubeFace::Right => 0, + CubeFace::Top => 1, + CubeFace::Back => 2, + CubeFace::Left => 3, + CubeFace::Bottom => 4, + CubeFace::Front => 5, + }; + //always push normal + let normal_index=generated_normal.len() as u32; + generated_normal.push(CUBE_DEFAULT_NORMALS[face_id]); + //push vertices as they are needed + groups.push(IndexedGroup{ + texture:face_description.texture, + polys:vec![IndexedPolygon{ + vertices:CUBE_DEFAULT_POLYS[face_id].map(|tup|{ + let pos=CUBE_DEFAULT_VERTICES[tup[0] as usize]; + let pos_index=if let Some(pos_index)=generated_pos.iter().position(|&p|p==pos){ + pos_index + }else{ + //create new pos_index + let pos_index=generated_pos.len(); + generated_pos.push(pos); + pos_index + } as u32; + //always push vertex + let vertex=IndexedVertex{ + pos:pos_index, + tex:tup[1]+4*transform_index, + normal:normal_index, + color:color_index, + }; + let vert_index=generated_vertices.len(); + generated_vertices.push(vertex); + vert_index as u32 + }).to_vec(), + }], + }); + } + IndexedModel{ + unique_pos:generated_pos, + unique_tex:generated_tex, + unique_normal:generated_normal, + unique_color:generated_color, + unique_vertices:generated_vertices, + groups, + instances:Vec::new(), + } +} +//don't think too hard about the copy paste because this is all going into the map tool eventually... +pub fn generate_partial_unit_wedge(face_descriptions:WedgeFaceDescription)->crate::model::IndexedModel{ + let wedge_default_polys=vec![ + // right (1, 0, 0) + vec![ + [6,2,0],//[vertex,tex,norm] + [2,0,0], + [1,3,0], + ], + // FrontTop (0, 1, -1) + vec![ + [3,1,1], + [2,0,1], + [6,3,1], + [7,2,1], + ], + // back (0, 0, 1) + vec![ + [0,3,2], + [1,2,2], + [2,1,2], + [3,0,2], + ], + // left (-1, 0, 0) + vec![ + [0,2,3], + [3,1,3], + [7,3,3], + ], + // bottom (0,-1, 0) + vec![ + [1,1,4], + [0,0,4], + [7,3,4], + [6,2,4], + ], + ]; + let mut generated_pos=Vec::<[f32;3]>::new(); + let mut generated_tex=Vec::new(); + let mut generated_normal=Vec::new(); + let mut generated_color=Vec::new(); + let mut generated_vertices=Vec::new(); + let mut groups=Vec::new(); + let mut transforms=Vec::new(); + //note that on a cube every vertex is guaranteed to be unique, so there's no need to hash them against existing vertices. + for (face,face_description) in face_descriptions.iter(){ + //assume that scanning short lists is faster than hashing. + let transform_index=if let Some(transform_index)=transforms.iter().position(|&transform|transform==face_description.transform){ + transform_index + }else{ + //create new transform_index + let transform_index=transforms.len(); + transforms.push(face_description.transform); + for tex in CUBE_DEFAULT_TEXTURE_COORDS{ + generated_tex.push(*face_description.transform.transform_point2(glam::Vec2::from_array(tex)).as_ref()); + } + transform_index + } as u32; + let color_index=if let Some(color_index)=generated_color.iter().position(|color|color==face_description.color.as_ref()){ + color_index + }else{ + //create new color_index + let color_index=generated_color.len(); + generated_color.push(*face_description.color.as_ref()); + color_index + } as u32; + let face_id=match face{ + WedgeFace::Right => 0, + WedgeFace::TopFront => 1, + WedgeFace::Back => 2, + WedgeFace::Left => 3, + WedgeFace::Bottom => 4, + }; + //always push normal + let normal_index=generated_normal.len() as u32; + generated_normal.push(WEDGE_DEFAULT_NORMALS[face_id]); + //push vertices as they are needed + groups.push(IndexedGroup{ + texture:face_description.texture, + polys:vec![IndexedPolygon{ + vertices:wedge_default_polys[face_id].iter().map(|tup|{ + let pos=CUBE_DEFAULT_VERTICES[tup[0] as usize]; + let pos_index=if let Some(pos_index)=generated_pos.iter().position(|&p|p==pos){ + pos_index + }else{ + //create new pos_index + let pos_index=generated_pos.len(); + generated_pos.push(pos); + pos_index + } as u32; + //always push vertex + let vertex=IndexedVertex{ + pos:pos_index, + tex:tup[1]+4*transform_index, + normal:normal_index, + color:color_index, + }; + let vert_index=generated_vertices.len(); + generated_vertices.push(vertex); + vert_index as u32 + }).collect(), + }], + }); + } + IndexedModel{ + unique_pos:generated_pos, + unique_tex:generated_tex, + unique_normal:generated_normal, + unique_color:generated_color, + unique_vertices:generated_vertices, + groups, + instances:Vec::new(), + } +} + +pub fn generate_partial_unit_cornerwedge(face_descriptions:CornerWedgeFaceDescription)->crate::model::IndexedModel{ + let cornerwedge_default_polys=vec![ + // right (1, 0, 0) + vec![ + [6,2,0],//[vertex,tex,norm] + [5,1,0], + [1,3,0], + ], + // BackTop (0, 1, 1) + vec![ + [5,3,1], + [0,1,1], + [1,0,1], + ], + // LeftTop (-1, 1, 0) + vec![ + [5,3,2], + [7,2,2], + [0,1,2], + ], + // bottom (0,-1, 0) + vec![ + [1,1,3], + [0,0,3], + [7,3,3], + [6,2,3], + ], + // front (0, 0,-1) + vec![ + [5,0,4], + [6,3,4], + [7,2,4], + ], + ]; + let mut generated_pos=Vec::<[f32;3]>::new(); + let mut generated_tex=Vec::new(); + let mut generated_normal=Vec::new(); + let mut generated_color=Vec::new(); + let mut generated_vertices=Vec::new(); + let mut groups=Vec::new(); + let mut transforms=Vec::new(); + //note that on a cube every vertex is guaranteed to be unique, so there's no need to hash them against existing vertices. + for (face,face_description) in face_descriptions.iter(){ + //assume that scanning short lists is faster than hashing. + let transform_index=if let Some(transform_index)=transforms.iter().position(|&transform|transform==face_description.transform){ + transform_index + }else{ + //create new transform_index + let transform_index=transforms.len(); + transforms.push(face_description.transform); + for tex in CUBE_DEFAULT_TEXTURE_COORDS{ + generated_tex.push(*face_description.transform.transform_point2(glam::Vec2::from_array(tex)).as_ref()); + } + transform_index + } as u32; + let color_index=if let Some(color_index)=generated_color.iter().position(|color|color==face_description.color.as_ref()){ + color_index + }else{ + //create new color_index + let color_index=generated_color.len(); + generated_color.push(*face_description.color.as_ref()); + color_index + } as u32; + let face_id=match face{ + CornerWedgeFace::Right => 0, + CornerWedgeFace::Top => 1, + CornerWedgeFace::Bottom => 2, + CornerWedgeFace::Front => 3, + }; + //always push normal + let normal_index=generated_normal.len() as u32; + generated_normal.push(CORNERWEDGE_DEFAULT_NORMALS[face_id]); + //push vertices as they are needed + groups.push(IndexedGroup{ + texture:face_description.texture, + polys:vec![IndexedPolygon{ + vertices:cornerwedge_default_polys[face_id].iter().map(|tup|{ + let pos=CUBE_DEFAULT_VERTICES[tup[0] as usize]; + let pos_index=if let Some(pos_index)=generated_pos.iter().position(|&p|p==pos){ + pos_index + }else{ + //create new pos_index + let pos_index=generated_pos.len(); + generated_pos.push(pos); + pos_index + } as u32; + //always push vertex + let vertex=IndexedVertex{ + pos:pos_index, + tex:tup[1]+4*transform_index, + normal:normal_index, + color:color_index, + }; + let vert_index=generated_vertices.len(); + generated_vertices.push(vertex); + vert_index as u32 + }).collect(), + }], + }); } IndexedModel{ unique_pos:generated_pos, From d86aed5ae12e68de929a2531e50b9b8623da3330 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 30 Sep 2023 17:59:40 -0700 Subject: [PATCH 213/482] teapot transform --- src/primitives.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/primitives.rs b/src/primitives.rs index 53be8cb..bdda6cb 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -140,12 +140,11 @@ pub fn unit_cube()->crate::model::IndexedModel{ t.insert(CubeFace::Front,FaceDescription::default()); generate_partial_unit_cube(t) } +const TEAPOT_TRANSFORM:glam::Mat3=glam::mat3(glam::vec3(0.0,0.1,0.0),glam::vec3(-0.1,0.0,0.0),glam::vec3(0.0,0.0,0.1)); pub fn unit_cylinder()->crate::model::IndexedModel{ let mut indexed_model=crate::model::generate_indexed_model_list_from_obj(obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap(),*glam::Vec4::ONE.as_ref()).remove(0); for pos in indexed_model.unique_pos.iter_mut(){ - pos[0]=pos[0]*0.1; - pos[1]=pos[1]*0.1; - pos[2]=pos[2]*0.1; + [pos[0],pos[1],pos[2]]=*(TEAPOT_TRANSFORM*glam::Vec3::from_array(*pos)).as_ref(); } indexed_model } From 215ac47fcbc0e00e17dbe1c519c8726cca043cec Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 30 Sep 2023 18:21:42 -0700 Subject: [PATCH 214/482] since when to most maps use non-Parts, guess I have to support it anyways --- src/load_roblox.rs | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index b74df97..89d56c6 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -131,13 +131,11 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde Some(rbx_dom_weak::types::Variant::Vector3(size)), Some(rbx_dom_weak::types::Variant::Float32(transparency)), Some(rbx_dom_weak::types::Variant::Color3uint8(color3)), - Some(rbx_dom_weak::types::Variant::Enum(shape)), ) = ( object.properties.get("CFrame"), object.properties.get("Size"), object.properties.get("Transparency"), object.properties.get("Color"), - object.properties.get("Shape"),//this will also skip unions ) { let model_transform=glam::Affine3A::from_translation( @@ -161,13 +159,31 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde continue; } - let shape=match shape.to_u32(){ - 0=>primitives::Primitives::Sphere, - 1=>primitives::Primitives::Cube, - 2=>primitives::Primitives::Cylinder, - 3=>primitives::Primitives::Wedge, - 4=>primitives::Primitives::CornerWedge, - _=>panic!("funky roblox PartType={}",shape.to_u32()), + let shape=match &object.class[..]{ + "Part"=>{ + if let Some(rbx_dom_weak::types::Variant::Enum(shape))=object.properties.get("Shape"){ + match shape.to_u32(){ + 0=>primitives::Primitives::Sphere, + 1=>primitives::Primitives::Cube, + 2=>primitives::Primitives::Cylinder, + 3=>primitives::Primitives::Wedge, + 4=>primitives::Primitives::CornerWedge, + _=>{ + println!("Funky roblox PartType={}; defaulting to cube",shape.to_u32()); + primitives::Primitives::Cube + }, + } + }else{ + println!("Part has no Shape! defaulting to cube"); + primitives::Primitives::Cube + } + }, + "WedgePart"=>primitives::Primitives::Wedge, + "CornerWedgePart"=>primitives::Primitives::CornerWedge, + _=>{ + println!("Unsupported BasePart ClassName={}; defaulting to cube",object.class); + primitives::Primitives::Cube + } }; //TODO: also detect "CylinderMesh" etc here From 923889d956eaea8af0326ddb9a054ec5b3ba2f52 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 30 Sep 2023 18:25:42 -0700 Subject: [PATCH 215/482] v0.7.0 loading Wedges & CornerWedges + fixed textures + support scaled normals --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 363f887..d964dc8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1659,7 +1659,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strafe-client" -version = "0.6.2" +version = "0.7.0" dependencies = [ "async-executor", "bytemuck", diff --git a/Cargo.toml b/Cargo.toml index 35478a3..961c5f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strafe-client" -version = "0.6.2" +version = "0.7.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From c7538869b4c50f515bd74861738927b3353f7468 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 30 Sep 2023 18:50:32 -0700 Subject: [PATCH 216/482] increase far clipping plane --- src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/body.rs b/src/body.rs index 005d3a7..99c1ef9 100644 --- a/src/body.rs +++ b/src/body.rs @@ -206,7 +206,7 @@ impl Camera { mat3_from_rotation_y_f64(self.angles.x-self.sensitivity.x*(delta_x as f64)) } pub fn proj(&self)->glam::Mat4{ - perspective_rh(self.fov.x, self.fov.y, 0.5, 1000.0) + perspective_rh(self.fov.x, self.fov.y, 0.5, 2000.0) } pub fn view(&self,pos:glam::Vec3)->glam::Mat4{ //f32 good enough for view matrix From fddd4576bd74b70795e73f9bacba4e323a6e460c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 1 Oct 2023 14:56:02 -0700 Subject: [PATCH 217/482] multi threaded image load --- src/main.rs | 102 +++++++++++++++++++++++++++------------------------- 1 file changed, 54 insertions(+), 48 deletions(-) diff --git a/src/main.rs b/src/main.rs index 89052be..692cf4f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -97,59 +97,65 @@ impl GraphicsData { //idk how to do this gooder lol let mut double_map=std::collections::HashMap::::new(); - let mut texture_views:Vec=Vec::with_capacity(indexed_models.textures.len()); + let mut texture_loading_threads=Vec::new(); for (i,t) in indexed_models.textures.iter().enumerate(){ if let Ok(mut file) = std::fs::File::open(std::path::Path::new(&format!("textures/{}.dds",t))){ - let image = ddsfile::Dds::read(&mut file).unwrap(); - - let (mut width,mut height)=(image.get_width(),image.get_height()); - - let format=match image.header10.unwrap().dxgi_format{ - ddsfile::DxgiFormat::R8G8B8A8_UNorm_sRGB => wgpu::TextureFormat::Rgba8UnormSrgb, - ddsfile::DxgiFormat::BC7_UNorm_sRGB => { - //floor(w,4), should be ceil(w,4) - width=width/4*4; - height=height/4*4; - wgpu::TextureFormat::Bc7RgbaUnormSrgb - }, - other=>panic!("unsupported format {:?}",other), - }; - - let size = wgpu::Extent3d { - width, - height, - depth_or_array_layers: 1, - }; - - let layer_size = wgpu::Extent3d { - depth_or_array_layers: 1, - ..size - }; - let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); - - let texture = device.create_texture_with_data( - queue, - &wgpu::TextureDescriptor { - size, - mip_level_count: max_mips, - sample_count: 1, - dimension: wgpu::TextureDimension::D2, - format, - usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, - label: Some(format!("Texture{}",i).as_str()), - view_formats: &[], - }, - &image.data, - ); - - double_map.insert(i as u32, texture_views.len() as u32); - texture_views.push(texture.create_view(&wgpu::TextureViewDescriptor { - label: Some(format!("Texture{} View",i).as_str()), - dimension: Some(wgpu::TextureViewDimension::D2), - ..wgpu::TextureViewDescriptor::default() + double_map.insert(i as u32, texture_loading_threads.len() as u32); + texture_loading_threads.push(std::thread::spawn(move ||{ + (i,ddsfile::Dds::read(&mut file).unwrap()) })); } } + + let texture_views:Vec=texture_loading_threads.into_iter().map(|t|{ + let (i,image)=t.join().unwrap(); + + let (mut width,mut height)=(image.get_width(),image.get_height()); + + let format=match image.header10.unwrap().dxgi_format{ + ddsfile::DxgiFormat::R8G8B8A8_UNorm_sRGB => wgpu::TextureFormat::Rgba8UnormSrgb, + ddsfile::DxgiFormat::BC7_UNorm_sRGB => { + //floor(w,4), should be ceil(w,4) + width=width/4*4; + height=height/4*4; + wgpu::TextureFormat::Bc7RgbaUnormSrgb + }, + other=>panic!("unsupported format {:?}",other), + }; + + let size = wgpu::Extent3d { + width, + height, + depth_or_array_layers: 1, + }; + + let layer_size = wgpu::Extent3d { + depth_or_array_layers: 1, + ..size + }; + let max_mips = layer_size.max_mips(wgpu::TextureDimension::D2); + + let texture = device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor { + size, + mip_level_count: max_mips, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format, + usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, + label: Some(format!("Texture{}",i).as_str()), + view_formats: &[], + }, + &image.data, + ); + texture.create_view(&wgpu::TextureViewDescriptor { + label: Some(format!("Texture{} View",i).as_str()), + dimension: Some(wgpu::TextureViewDimension::D2), + ..wgpu::TextureViewDescriptor::default() + }) + }).collect(); + let indexed_models_len=indexed_models.models.len(); //split groups with different textures into separate models //the models received here are supposed to be tightly packed, i.e. no code needs to check if two models are using the same groups. From d8c6444af39885dc6b4c98b6ed08171d6e15f66b Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 1 Oct 2023 15:17:10 -0700 Subject: [PATCH 218/482] consume textures + label textures with texture_id + don't pass id through thread --- src/main.rs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main.rs b/src/main.rs index 692cf4f..71e1d33 100644 --- a/src/main.rs +++ b/src/main.rs @@ -98,17 +98,18 @@ impl GraphicsData { //idk how to do this gooder lol let mut double_map=std::collections::HashMap::::new(); let mut texture_loading_threads=Vec::new(); - for (i,t) in indexed_models.textures.iter().enumerate(){ - if let Ok(mut file) = std::fs::File::open(std::path::Path::new(&format!("textures/{}.dds",t))){ + let num_textures=indexed_models.textures.len(); + for (i,texture_id) in indexed_models.textures.into_iter().enumerate(){ + if let Ok(mut file) = std::fs::File::open(std::path::Path::new(&format!("textures/{}.dds",texture_id))){ double_map.insert(i as u32, texture_loading_threads.len() as u32); - texture_loading_threads.push(std::thread::spawn(move ||{ - (i,ddsfile::Dds::read(&mut file).unwrap()) - })); + texture_loading_threads.push((texture_id,std::thread::spawn(move ||{ + ddsfile::Dds::read(&mut file).unwrap() + }))); } } - let texture_views:Vec=texture_loading_threads.into_iter().map(|t|{ - let (i,image)=t.join().unwrap(); + let texture_views:Vec=texture_loading_threads.into_iter().map(|(texture_id,thread)|{ + let image=thread.join().unwrap(); let (mut width,mut height)=(image.get_width(),image.get_height()); @@ -144,13 +145,13 @@ impl GraphicsData { dimension: wgpu::TextureDimension::D2, format, usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, - label: Some(format!("Texture{}",i).as_str()), + label: Some(format!("Texture{}",texture_id).as_str()), view_formats: &[], }, &image.data, ); texture.create_view(&wgpu::TextureViewDescriptor { - label: Some(format!("Texture{} View",i).as_str()), + label: Some(format!("Texture{} View",texture_id).as_str()), dimension: Some(wgpu::TextureViewDimension::D2), ..wgpu::TextureViewDescriptor::default() }) @@ -304,7 +305,7 @@ impl GraphicsData { }); } } - println!("Texture References={}",indexed_models.textures.len()); + println!("Texture References={}",num_textures); println!("Textures Loaded={}",texture_views.len()); println!("Indexed Models={}",indexed_models_len); println!("Graphics Objects: {}",self.models.len()); From 355d391ea5bdfb7dede8a89494b0275dae57d11a Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 1 Oct 2023 15:21:19 -0700 Subject: [PATCH 219/482] wee opti --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 71e1d33..42993c1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -157,10 +157,10 @@ impl GraphicsData { }) }).collect(); - let indexed_models_len=indexed_models.models.len(); //split groups with different textures into separate models //the models received here are supposed to be tightly packed, i.e. no code needs to check if two models are using the same groups. - let mut unique_texture_models=Vec::with_capacity(indexed_models.models.len()); + let indexed_models_len=indexed_models.models.len(); + let mut unique_texture_models=Vec::with_capacity(indexed_models_len); for mut model in indexed_models.models.drain(..){ //convert ModelInstance into ModelGraphicsInstance let instances:Vec=model.instances.iter().map(|instance|{ From 95d16271de06a5c728d4346da8ec3067af3ba25b Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 1 Oct 2023 15:54:10 -0700 Subject: [PATCH 220/482] add cursor grab --- src/framework.rs | 4 ++-- src/main.rs | 26 ++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/framework.rs b/src/framework.rs index 5ce606b..5256e73 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -51,7 +51,7 @@ pub trait Example: 'static + Sized { device: &wgpu::Device, queue: &wgpu::Queue, ); - fn update(&mut self, device: &wgpu::Device, queue: &wgpu::Queue, event: WindowEvent); + fn update(&mut self, window: &winit::window::Window, device: &wgpu::Device, queue: &wgpu::Queue, event: WindowEvent); fn device_event(&mut self, event: DeviceEvent); fn render( &mut self, @@ -367,7 +367,7 @@ fn start( println!("{:#?}", instance.generate_report()); } _ => { - example.update(&device,&queue,event); + example.update(&window,&device,&queue,event); } }, event::Event::DeviceEvent { diff --git a/src/main.rs b/src/main.rs index 42993c1..2c59750 100644 --- a/src/main.rs +++ b/src/main.rs @@ -775,8 +775,7 @@ impl framework::Example for GraphicsData { } #[allow(clippy::single_match)] - fn update(&mut self, device: &wgpu::Device, queue: &wgpu::Queue, event: winit::event::WindowEvent) { - //nothing atm + fn update(&mut self, window: &winit::window::Window, device: &wgpu::Device, queue: &wgpu::Queue, event: winit::event::WindowEvent) { match event { winit::event::WindowEvent::DroppedFile(path) => { println!("opening file: {:?}", &path); @@ -838,6 +837,29 @@ impl framework::Example for GraphicsData { println!("Could not open file"); } }, + winit::event::WindowEvent::KeyboardInput { + input:winit::event::KeyboardInput{state, virtual_keycode,..}, + .. + }=>{ + let s=match state { + winit::event::ElementState::Pressed => true, + winit::event::ElementState::Released => false, + }; + match virtual_keycode{ + Some(winit::event::VirtualKeyCode::Tab)=>{ + if s{ + if let Ok(())=window.set_cursor_grab(winit::window::CursorGrabMode::None){ + window.set_cursor_visible(true); + } + }else{ + if let Ok(())=window.set_cursor_grab(winit::window::CursorGrabMode::Locked){ + window.set_cursor_visible(false); + } + } + }, + _=>(), + } + }, _=>(), } } From 514c45fc21717ba540fc0e8e080f5cc4ca5194bc Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 1 Oct 2023 15:54:24 -0700 Subject: [PATCH 221/482] disable annoying scroll --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 2c59750..4d8416e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -912,7 +912,7 @@ impl framework::Example for GraphicsData { delta, } => { println!("mousewheel{:?}",delta); - if true{//self.physics.use_scroll + if false{//self.physics.style.use_scroll{ self.physics.run(time); self.physics.process_instruction(TimedInstruction{ time, From bf4560193dea1463efedcd5495bbed4c26fff0bc Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 1 Oct 2023 17:18:29 -0700 Subject: [PATCH 222/482] make load_file function --- src/framework.rs | 1 + src/main.rs | 122 ++++++++++++++++++++++++----------------------- 2 files changed, 63 insertions(+), 60 deletions(-) diff --git a/src/framework.rs b/src/framework.rs index 5256e73..c5527e4 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -53,6 +53,7 @@ pub trait Example: 'static + Sized { ); fn update(&mut self, window: &winit::window::Window, device: &wgpu::Device, queue: &wgpu::Queue, event: WindowEvent); fn device_event(&mut self, event: DeviceEvent); + fn load_file(&mut self, path:std::path::PathBuf, device: &wgpu::Device, queue: &wgpu::Queue); fn render( &mut self, view: &wgpu::TextureView, diff --git a/src/main.rs b/src/main.rs index 4d8416e..e523f4d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -774,69 +774,71 @@ impl framework::Example for GraphicsData { return graphics; } + fn load_file(&mut self,path: std::path::PathBuf, device: &wgpu::Device, queue: &wgpu::Queue){ + println!("Loading file: {:?}", &path); + //oh boy! let's load the map! + if let Ok(file)=std::fs::File::open(path){ + let mut input = std::io::BufReader::new(file); + let mut first_8=[0u8;8]; + //.rbxm roblox binary = "{ + match match &first_8[4..8]{ + b"lox!"=>rbx_binary::from_reader(input).map_err(|e|format!("{:?}",e)), + b"lox "=>rbx_xml::from_reader(input,rbx_xml::DecodeOptions::default()).map_err(|e|format!("{:?}",e)), + other=>Err(format!("Unknown Roblox file type {:?}",other)), + }{ + Ok(dom)=>Some(load_roblox::generate_indexed_models_roblox(dom)), + Err(e)=>{ + println!("Error loading roblox file:{:?}",e); + None + }, + } + }, + //b"VBSP"=>load_valve::generate_indexed_models_valve(input), + //b"SNFM"=>sniffer::generate_indexed_models(input), + //b"SNFB"=>sniffer::load_bot(input), + _=>None, + } + }{ + //if generate_indexed_models succeeds, clear the previous ones + self.models.clear(); + self.physics.models.clear(); + self.generate_model_physics(&indexed_model_instances); + self.generate_model_graphics(device,queue,indexed_model_instances); + //manual reset + let time=self.physics.time; + instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ + time, + instruction: body::PhysicsInstruction::SetSpawnPosition(spawn_point), + }); + instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ + time, + instruction: body::PhysicsInstruction::Input(body::InputInstruction::Reset), + }); + }else{ + println!("No modeldatas were generated"); + } + }else{ + println!("Failed to read first 8 bytes and seek back to beginning of file."); + } + }else{ + println!("Could not open file"); + } + } + #[allow(clippy::single_match)] fn update(&mut self, window: &winit::window::Window, device: &wgpu::Device, queue: &wgpu::Queue, event: winit::event::WindowEvent) { match event { - winit::event::WindowEvent::DroppedFile(path) => { - println!("opening file: {:?}", &path); - //oh boy! let's load the map! - if let Ok(file)=std::fs::File::open(path){ - let mut input = std::io::BufReader::new(file); - let mut first_8=[0u8;8]; - //.rbxm roblox binary = "{ - match match &first_8[4..8]{ - b"lox!"=>rbx_binary::from_reader(input).map_err(|e|format!("{:?}",e)), - b"lox "=>rbx_xml::from_reader(input,rbx_xml::DecodeOptions::default()).map_err(|e|format!("{:?}",e)), - other=>Err(format!("Unknown Roblox file type {:?}",other)), - }{ - Ok(dom)=>Some(load_roblox::generate_indexed_models_roblox(dom)), - Err(e)=>{ - println!("Error loading roblox file:{:?}",e); - None - }, - } - }, - //b"VBSP"=>load_valve::generate_indexed_models_valve(input), - //b"SNFM"=>sniffer::generate_indexed_models(input), - //b"SNFB"=>sniffer::load_bot(input), - _=>None, - } - }{ - //if generate_indexed_models succeeds, clear the previous ones - self.models.clear(); - self.physics.models.clear(); - self.generate_model_physics(&indexed_model_instances); - self.generate_model_graphics(device,queue,indexed_model_instances); - //manual reset - let time=self.physics.time; - instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ - time, - instruction: body::PhysicsInstruction::SetSpawnPosition(spawn_point), - }); - instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ - time, - instruction: body::PhysicsInstruction::Input(body::InputInstruction::Reset), - }); - }else{ - println!("No modeldatas were generated"); - } - }else{ - println!("Failed to read first 8 bytes and seek back to beginning of file."); - } - }else{ - println!("Could not open file"); - } - }, + winit::event::WindowEvent::DroppedFile(path) => self.load_file(path,device,queue), winit::event::WindowEvent::KeyboardInput { input:winit::event::KeyboardInput{state, virtual_keycode,..}, .. From af750151f7643d62d74d5b1b1513ee799a468853 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 1 Oct 2023 17:18:50 -0700 Subject: [PATCH 223/482] allow loading map from cli --- src/main.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main.rs b/src/main.rs index e523f4d..1012213 100644 --- a/src/main.rs +++ b/src/main.rs @@ -771,6 +771,11 @@ impl framework::Example for GraphicsData { graphics.generate_model_physics(&indexed_model_instances); graphics.generate_model_graphics(&device,&queue,indexed_model_instances); + let args:Vec=std::env::args().collect(); + if args.len()==2{ + graphics.load_file(std::path::PathBuf::from(&args[1]), device, queue); + } + return graphics; } From 02a509868aaa3c383fc3ac8b3701b2cb8e60a141 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 1 Oct 2023 19:25:16 -0700 Subject: [PATCH 224/482] some bullshit to reduce line count --- src/body.rs | 52 +++++++++++++++++++--------------------------------- src/main.rs | 10 ++-------- 2 files changed, 21 insertions(+), 41 deletions(-) diff --git a/src/body.rs b/src/body.rs index 99c1ef9..4febf2b 100644 --- a/src/body.rs +++ b/src/body.rs @@ -976,64 +976,50 @@ impl crate::instruction::InstructionConsumer for PhysicsStat self.walk.state=WalkEnum::Reached; }, PhysicsInstruction::Input(input_instruction) => { - let mut refresh_walk_target=false; + let mut refresh_walk_target=true; + let mut refresh_walk_target_velocity=true; match input_instruction{ InputInstruction::MoveMouse(m) => { self.camera.angles=self.camera.simulate_move_angles(self.mouse_interpolation.mouse1-self.mouse_interpolation.mouse0); self.mouse_interpolation.move_mouse(self.time,m); - refresh_walk_target=true; - }, - InputInstruction::MoveForward(s) => { - self.set_control(CONTROL_MOVEFORWARD,s); - refresh_walk_target=true; - }, - InputInstruction::MoveLeft(s) => { - self.set_control(CONTROL_MOVELEFT,s); - refresh_walk_target=true; - }, - InputInstruction::MoveBack(s) => { - self.set_control(CONTROL_MOVEBACK,s); - refresh_walk_target=true; - }, - InputInstruction::MoveRight(s) => { - self.set_control(CONTROL_MOVERIGHT,s); - refresh_walk_target=true; - }, - InputInstruction::MoveUp(s) => { - self.set_control(CONTROL_MOVEUP,s); - refresh_walk_target=true; - }, - InputInstruction::MoveDown(s) => { - self.set_control(CONTROL_MOVEDOWN,s); - refresh_walk_target=true; }, + InputInstruction::MoveForward(s) => self.set_control(CONTROL_MOVEFORWARD,s), + InputInstruction::MoveLeft(s) => self.set_control(CONTROL_MOVELEFT,s), + InputInstruction::MoveBack(s) => self.set_control(CONTROL_MOVEBACK,s), + InputInstruction::MoveRight(s) => self.set_control(CONTROL_MOVERIGHT,s), + InputInstruction::MoveUp(s) => self.set_control(CONTROL_MOVEUP,s), + InputInstruction::MoveDown(s) => self.set_control(CONTROL_MOVEDOWN,s), InputInstruction::Jump(s) => { self.set_control(CONTROL_JUMP,s); - refresh_walk_target=true; if self.grounded{ self.jump(); } + refresh_walk_target_velocity=false; }, InputInstruction::Zoom(s) => { self.set_control(CONTROL_ZOOM,s); + refresh_walk_target=false; }, InputInstruction::Reset => { //temp self.body.position=self.spawn_point; + self.body.velocity=glam::Vec3::ZERO; //manual clear //for c in self.contacts{process_instruction(CollisionEnd(c))} self.contacts.clear(); self.body.acceleration=self.gravity; self.walk.state=WalkEnum::Reached; self.grounded=false; + refresh_walk_target=false; }, - InputInstruction::Idle => (),//literally idle! + InputInstruction::Idle => {refresh_walk_target=false;},//literally idle! } - //calculate control dir - let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); - let control_dir=camera_mat*get_control_dir(self.controls); - //calculate walk target velocity if refresh_walk_target{ - self.walk.target_velocity=self.walkspeed*control_dir; + //calculate walk target velocity + if refresh_walk_target_velocity{ + let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); + let control_dir=camera_mat*get_control_dir(self.controls); + self.walk.target_velocity=self.walkspeed*control_dir; + } self.refresh_walk_target(); } }, diff --git a/src/main.rs b/src/main.rs index 1012213..e574f71 100644 --- a/src/main.rs +++ b/src/main.rs @@ -854,14 +854,8 @@ impl framework::Example for GraphicsData { }; match virtual_keycode{ Some(winit::event::VirtualKeyCode::Tab)=>{ - if s{ - if let Ok(())=window.set_cursor_grab(winit::window::CursorGrabMode::None){ - window.set_cursor_visible(true); - } - }else{ - if let Ok(())=window.set_cursor_grab(winit::window::CursorGrabMode::Locked){ - window.set_cursor_visible(false); - } + if let Ok(())=window.set_cursor_grab(if s{winit::window::CursorGrabMode::None}else{winit::window::CursorGrabMode::Locked}){ + window.set_cursor_visible(s); } }, _=>(), From 6c2eb5ff295ecbd4ae3f57b6a5e4ed286f0592a9 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 1 Oct 2023 19:29:29 -0700 Subject: [PATCH 225/482] this needs timers --- src/main.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.rs b/src/main.rs index e574f71..6c78fb6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -861,6 +861,10 @@ impl framework::Example for GraphicsData { _=>(), } }, + winit::event::WindowEvent::Focused(state)=>{ + //pause unpause + //recalculate pressed keys on focus + } _=>(), } } From d3e4918d3e1a8a1d20012d9399360e3cbe5444c7 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 2 Oct 2023 01:57:15 -0700 Subject: [PATCH 226/482] into_iter is probably better than drain --- src/main.rs | 6 +++--- src/primitives.rs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6c78fb6..d8eeb9f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -161,7 +161,7 @@ impl GraphicsData { //the models received here are supposed to be tightly packed, i.e. no code needs to check if two models are using the same groups. let indexed_models_len=indexed_models.models.len(); let mut unique_texture_models=Vec::with_capacity(indexed_models_len); - for mut model in indexed_models.models.drain(..){ + for mut model in indexed_models.models.into_iter(){ //convert ModelInstance into ModelGraphicsInstance let instances:Vec=model.instances.iter().map(|instance|{ ModelGraphicsInstance{ @@ -200,7 +200,7 @@ impl GraphicsData { } //de-index models let mut models=Vec::with_capacity(unique_texture_models.len()); - for model in unique_texture_models.drain(..){ + for model in unique_texture_models.into_iter(){ let mut vertices = Vec::new(); let mut index_from_vertex = std::collections::HashMap::new();//:: let mut entities = Vec::new(); @@ -243,7 +243,7 @@ impl GraphicsData { let uniform_buffer_binding_size=::required_limits().max_uniform_buffer_binding_size as usize; let chunk_size=uniform_buffer_binding_size/MODEL_BUFFER_SIZE_BYTES; self.models.reserve(models.len()); - for model in models.drain(..) { + for model in models.into_iter() { instance_count+=model.instances.len(); for instances_chunk in model.instances.rchunks(chunk_size){ model_count+=1; diff --git a/src/primitives.rs b/src/primitives.rs index bdda6cb..6f0e607 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -206,7 +206,7 @@ pub fn generate_partial_unit_cube(face_descriptions:CubeFaceDescription)->crate: let mut groups=Vec::new(); let mut transforms=Vec::new(); //note that on a cube every vertex is guaranteed to be unique, so there's no need to hash them against existing vertices. - for (face,face_description) in face_descriptions.iter(){ + for (face,face_description) in face_descriptions.into_iter(){ //assume that scanning short lists is faster than hashing. let transform_index=if let Some(transform_index)=transforms.iter().position(|&transform|transform==face_description.transform){ transform_index @@ -321,7 +321,7 @@ pub fn generate_partial_unit_wedge(face_descriptions:WedgeFaceDescription)->crat let mut groups=Vec::new(); let mut transforms=Vec::new(); //note that on a cube every vertex is guaranteed to be unique, so there's no need to hash them against existing vertices. - for (face,face_description) in face_descriptions.iter(){ + for (face,face_description) in face_descriptions.into_iter(){ //assume that scanning short lists is faster than hashing. let transform_index=if let Some(transform_index)=transforms.iter().position(|&transform|transform==face_description.transform){ transform_index @@ -433,7 +433,7 @@ pub fn generate_partial_unit_cornerwedge(face_descriptions:CornerWedgeFaceDescri let mut groups=Vec::new(); let mut transforms=Vec::new(); //note that on a cube every vertex is guaranteed to be unique, so there's no need to hash them against existing vertices. - for (face,face_description) in face_descriptions.iter(){ + for (face,face_description) in face_descriptions.into_iter(){ //assume that scanning short lists is faster than hashing. let transform_index=if let Some(transform_index)=transforms.iter().position(|&transform|transform==face_description.transform){ transform_index From 6ff2620bbcd6ed4481e7a9ed75d9eeb4853b3ff3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 2 Oct 2023 01:57:56 -0700 Subject: [PATCH 227/482] this code is unnecessary, delete it --- src/load_roblox.rs | 45 +++++++-------------------------------------- 1 file changed, 7 insertions(+), 38 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 89d56c6..7c7f18b 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -159,6 +159,7 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde continue; } + //TODO: also detect "CylinderMesh" etc here let shape=match &object.class[..]{ "Part"=>{ if let Some(rbx_dom_weak::types::Variant::Enum(shape))=object.properties.get("Shape"){ @@ -186,38 +187,6 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde } }; - //TODO: also detect "CylinderMesh" etc here - let mut face_map=std::collections::HashMap::new(); - match shape{ - primitives::Primitives::Cube => { - face_map.insert(0,0);//Right - face_map.insert(1,1);//Top - face_map.insert(2,2);//Back - face_map.insert(3,3);//Left - face_map.insert(4,4);//Bottom - face_map.insert(5,5);//Front - }, - primitives::Primitives::Wedge => { - face_map.insert(0,0);//Right - face_map.insert(1,1);//Top -> TopFront (some surf maps put surf textures on the Top face) - face_map.insert(2,1);//Front -> TopFront - face_map.insert(3,2);//Back - face_map.insert(4,3);//Left - face_map.insert(5,4);//Bottom - }, - primitives::Primitives::CornerWedge => { - //Right -> None - face_map.insert(1,0);//Top - //Back -> None - face_map.insert(3,1);//Right - face_map.insert(4,2);//Bottom - face_map.insert(5,3);//Front - }, - //do not support textured spheres/cylinders imported from roblox - //this can be added later, there are some maps that use it - primitives::Primitives::Sphere - |primitives::Primitives::Cylinder => (), - } //use the biggest one and cut it down later... let mut part_texture_description:RobloxPartDescription=[None,None,None,None,None,None]; temp_objects.clear(); @@ -245,7 +214,7 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde texture_id }; let normal_id=normalid.to_u32(); - if let Some(&face)=face_map.get(&normal_id){ + if normal_id<6{ let mut roblox_texture_transform=RobloxTextureTransform::default(); let mut roblox_texture_color=glam::Vec4::ONE; if decal.class=="Texture"{ @@ -269,7 +238,7 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde 3=>(size.z,size.y),//left 4=>(size.x,size.z),//bottom 5=>(size.x,size.y),//front - _=>(1.,1.), + _=>panic!("unreachable"), }; roblox_texture_transform=RobloxTextureTransform{ offset_u:*ox/(*sx),offset_v:*oy/(*sy), @@ -278,7 +247,7 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde roblox_texture_color=glam::vec4(decal_color3.r,decal_color3.g,decal_color3.b,1.0-*decal_transparency); } } - part_texture_description[face]=Some(RobloxFaceTextureDescription{ + part_texture_description[normal_id as usize]=Some(RobloxFaceTextureDescription{ texture:texture_id, color:roblox_texture_color, transform:roblox_texture_transform, @@ -296,9 +265,9 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde primitives::Primitives::Sphere=>RobloxBasePartDescription::Sphere, primitives::Primitives::Cube=>RobloxBasePartDescription::Part([f0,f1,f2,f3,f4,f5]), primitives::Primitives::Cylinder=>RobloxBasePartDescription::Cylinder, - //HAHAHA - primitives::Primitives::Wedge=>RobloxBasePartDescription::Wedge([f0,f1,f2,f3,f4]), - primitives::Primitives::CornerWedge=>RobloxBasePartDescription::CornerWedge([f0,f1,f2,f3]), + //use front face texture first and use top face texture as a fallback + primitives::Primitives::Wedge=>RobloxBasePartDescription::Wedge([f0,if f2.is_some(){f2}else{f1},f3,f4,f5]), + primitives::Primitives::CornerWedge=>RobloxBasePartDescription::CornerWedge([f1,f3,f4,f5]), }; //make new model if unit cube has not been crated before let model_id=if let Some(&model_id)=model_id_from_description.get(&basepart_texture_description){ From 616b09a8574ad1960595c6f983b8104b2b33b058 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 2 Oct 2023 01:58:30 -0700 Subject: [PATCH 228/482] panic when roblox data is invalid --- src/load_roblox.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 7c7f18b..0410553 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -169,14 +169,10 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde 2=>primitives::Primitives::Cylinder, 3=>primitives::Primitives::Wedge, 4=>primitives::Primitives::CornerWedge, - _=>{ - println!("Funky roblox PartType={}; defaulting to cube",shape.to_u32()); - primitives::Primitives::Cube - }, + _=>panic!("Funky roblox PartType={};",shape.to_u32()), } }else{ - println!("Part has no Shape! defaulting to cube"); - primitives::Primitives::Cube + panic!("Part has no Shape!"); } }, "WedgePart"=>primitives::Primitives::Wedge, From 58541716198d51a8126e3221d7c2b0d8150efe49 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 2 Oct 2023 01:58:35 -0700 Subject: [PATCH 229/482] typo --- src/load_roblox.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 0410553..4fba760 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -265,7 +265,7 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde primitives::Primitives::Wedge=>RobloxBasePartDescription::Wedge([f0,if f2.is_some(){f2}else{f1},f3,f4,f5]), primitives::Primitives::CornerWedge=>RobloxBasePartDescription::CornerWedge([f1,f3,f4,f5]), }; - //make new model if unit cube has not been crated before + //make new model if unit cube has not been created before let model_id=if let Some(&model_id)=model_id_from_description.get(&basepart_texture_description){ //push to existing texture model model_id From c47020c1494f3510c4fe4adddbb7c9ede69f16a3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 2 Oct 2023 02:40:36 -0700 Subject: [PATCH 230/482] implement mouse lock with tab and manual mouse lock fallback --- src/framework.rs | 4 +-- src/main.rs | 70 +++++++++++++++++++++++++++++++++++------------- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/src/framework.rs b/src/framework.rs index c5527e4..f7acef1 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -52,7 +52,7 @@ pub trait Example: 'static + Sized { queue: &wgpu::Queue, ); fn update(&mut self, window: &winit::window::Window, device: &wgpu::Device, queue: &wgpu::Queue, event: WindowEvent); - fn device_event(&mut self, event: DeviceEvent); + fn device_event(&mut self, window: &winit::window::Window, event: DeviceEvent); fn load_file(&mut self, path:std::path::PathBuf, device: &wgpu::Device, queue: &wgpu::Queue); fn render( &mut self, @@ -375,7 +375,7 @@ fn start( event, .. } => { - example.device_event(event); + example.device_event(&window,event); }, event::Event::RedrawRequested(_) => { diff --git a/src/main.rs b/src/main.rs index d8eeb9f..be358a0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -46,6 +46,7 @@ pub struct GraphicsPipelines { pub struct GraphicsData { start_time: std::time::Instant, screen_size: (u32, u32), + manual_mouse_lock:bool, physics: body::PhysicsState, pipelines: GraphicsPipelines, bind_groups: GraphicsBindGroups, @@ -744,6 +745,7 @@ impl framework::Example for GraphicsData { let depth_view = Self::create_depth_texture(config, device); let mut graphics=GraphicsData { + manual_mouse_lock:false, start_time: Instant::now(), screen_size: (config.width,config.height), physics, @@ -844,23 +846,6 @@ impl framework::Example for GraphicsData { fn update(&mut self, window: &winit::window::Window, device: &wgpu::Device, queue: &wgpu::Queue, event: winit::event::WindowEvent) { match event { winit::event::WindowEvent::DroppedFile(path) => self.load_file(path,device,queue), - winit::event::WindowEvent::KeyboardInput { - input:winit::event::KeyboardInput{state, virtual_keycode,..}, - .. - }=>{ - let s=match state { - winit::event::ElementState::Pressed => true, - winit::event::ElementState::Released => false, - }; - match virtual_keycode{ - Some(winit::event::VirtualKeyCode::Tab)=>{ - if let Ok(())=window.set_cursor_grab(if s{winit::window::CursorGrabMode::None}else{winit::window::CursorGrabMode::Locked}){ - window.set_cursor_visible(s); - } - }, - _=>(), - } - }, winit::event::WindowEvent::Focused(state)=>{ //pause unpause //recalculate pressed keys on focus @@ -869,7 +854,7 @@ impl framework::Example for GraphicsData { } } - fn device_event(&mut self, event: winit::event::DeviceEvent) { + fn device_event(&mut self, window: &winit::window::Window, event: winit::event::DeviceEvent) { //there's no way this is the best way get a timestamp. let time=self.start_time.elapsed().as_nanos() as i64; match event { @@ -892,7 +877,48 @@ impl framework::Example for GraphicsData { 57 => Some(InputInstruction::Jump(s)),//Space 44 => Some(InputInstruction::Zoom(s)),//Z 19 => if s{Some(InputInstruction::Reset)}else{None},//R - _ => None, + 1 => { + if s{ + self.manual_mouse_lock=false; + match window.set_cursor_grab(winit::window::CursorGrabMode::None){ + Ok(())=>(), + Err(e)=>println!("Could not release cursor: {:?}",e), + } + window.set_cursor_visible(true); + } + None + }, + 15=>{//Tab + if s{ + self.manual_mouse_lock=false; + match window.set_cursor_position(winit::dpi::PhysicalPosition::new(self.screen_size.0 as f32/2.0, self.screen_size.1 as f32/2.0)){ + Ok(())=>(), + Err(e)=>println!("Could not set cursor position: {:?}",e), + } + match window.set_cursor_grab(winit::window::CursorGrabMode::None){ + Ok(())=>(), + Err(e)=>println!("Could not release cursor: {:?}",e), + } + }else{ + //if cursor is outside window don't lock but apparently there's no get pos function + //let pos=window.get_cursor_pos(); + match window.set_cursor_grab(winit::window::CursorGrabMode::Locked){ + Ok(())=>(), + Err(_)=>{ + match window.set_cursor_grab(winit::window::CursorGrabMode::Confined){ + Ok(())=>(), + Err(e)=>{ + self.manual_mouse_lock=true; + println!("Could not confine cursor: {:?}",e) + }, + } + } + } + } + window.set_cursor_visible(s); + None + }, + _ => {println!("scancode {}",keycode);None}, } { self.physics.run(time); @@ -905,6 +931,12 @@ impl framework::Example for GraphicsData { winit::event::DeviceEvent::MouseMotion { delta,//these (f64,f64) are integers on my machine } => { + if self.manual_mouse_lock{ + match window.set_cursor_position(winit::dpi::PhysicalPosition::new(self.screen_size.0 as f32/2.0, self.screen_size.1 as f32/2.0)){ + Ok(())=>(), + Err(e)=>println!("Could not set cursor position: {:?}",e), + } + } //do not step the physics because the mouse polling rate is higher than the physics can run. //essentially the previous input will be overwritten until a true step runs //which is fine because they run all the time. From 79262ce3b4b6fa5469283e671d623497a51575ef Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 2 Oct 2023 03:03:07 -0700 Subject: [PATCH 231/482] styling --- src/main.rs | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main.rs b/src/main.rs index be358a0..5508939 100644 --- a/src/main.rs +++ b/src/main.rs @@ -868,16 +868,16 @@ impl framework::Example for GraphicsData { winit::event::ElementState::Released => false, }; if let Some(input_instruction)=match keycode { - 17 => Some(InputInstruction::MoveForward(s)),//W - 30 => Some(InputInstruction::MoveLeft(s)),//A - 31 => Some(InputInstruction::MoveBack(s)),//S - 32 => Some(InputInstruction::MoveRight(s)),//D - 18 => Some(InputInstruction::MoveUp(s)),//E - 16 => Some(InputInstruction::MoveDown(s)),//Q - 57 => Some(InputInstruction::Jump(s)),//Space - 44 => Some(InputInstruction::Zoom(s)),//Z - 19 => if s{Some(InputInstruction::Reset)}else{None},//R - 1 => { + 17=>Some(InputInstruction::MoveForward(s)),//W + 30=>Some(InputInstruction::MoveLeft(s)),//A + 31=>Some(InputInstruction::MoveBack(s)),//S + 32=>Some(InputInstruction::MoveRight(s)),//D + 18=>Some(InputInstruction::MoveUp(s)),//E + 16=>Some(InputInstruction::MoveDown(s)),//Q + 57=>Some(InputInstruction::Jump(s)),//Space + 44=>Some(InputInstruction::Zoom(s)),//Z + 19=>if s{Some(InputInstruction::Reset)}else{None},//R + 01=>{//Esc if s{ self.manual_mouse_lock=false; match window.set_cursor_grab(winit::window::CursorGrabMode::None){ @@ -919,8 +919,7 @@ impl framework::Example for GraphicsData { None }, _ => {println!("scancode {}",keycode);None}, - } - { + }{ self.physics.run(time); self.physics.process_instruction(TimedInstruction{ time, @@ -948,7 +947,7 @@ impl framework::Example for GraphicsData { winit::event::DeviceEvent::MouseWheel { delta, } => { - println!("mousewheel{:?}",delta); + println!("mousewheel {:?}",delta); if false{//self.physics.style.use_scroll{ self.physics.run(time); self.physics.process_instruction(TimedInstruction{ From d16404167b7d4bd7b03bb25ad5119cf2fdffaec5 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 2 Oct 2023 15:27:41 -0700 Subject: [PATCH 232/482] tweak map loading --- src/load_roblox.rs | 11 +++++------ src/main.rs | 17 +++++++++++------ src/model.rs | 1 + 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 4fba760..880f1c2 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -1,5 +1,3 @@ -use crate::model::{IndexedModelInstances,ModelInstance}; - use crate::primitives; fn class_is_a(class: &str, superclass: &str) -> bool { @@ -111,7 +109,7 @@ enum RobloxBasePartDescription{ Wedge(RobloxWedgeDescription), CornerWedge(RobloxCornerWedgeDescription), } -pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(IndexedModelInstances,glam::Vec3), Box>{ +pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::IndexedModelInstances{ //IndexedModelInstances includes textures let mut spawn_point=glam::Vec3::ZERO; @@ -335,15 +333,16 @@ pub fn generate_indexed_models_roblox(dom:rbx_dom_weak::WeakDom) -> Result<(Inde }); model_id }; - indexed_models[model_id].instances.push(ModelInstance { + indexed_models[model_id].instances.push(crate::model::ModelInstance { transform:model_transform, color:glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), }); } } } - Ok((IndexedModelInstances{ + crate::model::IndexedModelInstances{ textures:asset_id_from_texture_id.iter().map(|t|t.to_string()).collect(), models:indexed_models, - },spawn_point)) + spawn_point, + } } diff --git a/src/main.rs b/src/main.rs index 5508939..b780f80 100644 --- a/src/main.rs +++ b/src/main.rs @@ -769,6 +769,7 @@ impl framework::Example for GraphicsData { let indexed_model_instances=model::IndexedModelInstances{ textures:Vec::new(), models:indexed_models, + spawn_point:glam::Vec3::Y*50.0, }; graphics.generate_model_physics(&indexed_model_instances); graphics.generate_model_graphics(&device,&queue,indexed_model_instances); @@ -795,7 +796,7 @@ impl framework::Example for GraphicsData { //.snf = "SNBF" if let (Ok(()),Ok(()))=(std::io::Read::read_exact(&mut input, &mut first_8),std::io::Seek::rewind(&mut input)){ // - if let Some(Ok((indexed_model_instances,spawn_point)))={ + if let Some(indexed_model_instances)={ match &first_8[0..4]{ b"{ match match &first_8[4..8]{ @@ -803,19 +804,23 @@ impl framework::Example for GraphicsData { b"lox "=>rbx_xml::from_reader(input,rbx_xml::DecodeOptions::default()).map_err(|e|format!("{:?}",e)), other=>Err(format!("Unknown Roblox file type {:?}",other)), }{ - Ok(dom)=>Some(load_roblox::generate_indexed_models_roblox(dom)), + Ok(dom)=>Some(load_roblox::generate_indexed_models(dom)), Err(e)=>{ println!("Error loading roblox file:{:?}",e); None }, } }, - //b"VBSP"=>load_valve::generate_indexed_models_valve(input), - //b"SNFM"=>sniffer::generate_indexed_models(input), - //b"SNFB"=>sniffer::load_bot(input), - _=>None, + //b"VBSP"=>Some(load_bsp::generate_indexed_models(input)), + //b"SNFM"=>Some(sniffer::generate_indexed_models(input)), + //b"SNFB"=>Some(sniffer::load_bot(input)), + other=>{ + println!("loser file {:?}",other); + None + }, } }{ + let spawn_point=indexed_model_instances.spawn_point; //if generate_indexed_models succeeds, clear the previous ones self.models.clear(); self.physics.models.clear(); diff --git a/src/model.rs b/src/model.rs index 79bd70e..8dea948 100644 --- a/src/model.rs +++ b/src/model.rs @@ -63,6 +63,7 @@ pub struct IndexedModelInstances{ pub textures:Vec,//RenderPattern pub models:Vec, //object_index for spawns, triggers etc? + pub spawn_point:glam::Vec3, } pub fn generate_indexed_model_list_from_obj(data:obj::ObjData,color:[f32;4]) -> Vec{ From 58be446297a0cfcbce18b953e53de5258aa74015 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 2 Oct 2023 22:45:48 -0700 Subject: [PATCH 233/482] reminder --- src/body.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/body.rs b/src/body.rs index 4febf2b..496beb7 100644 --- a/src/body.rs +++ b/src/body.rs @@ -97,6 +97,8 @@ enum MouseInterpolation { First,//just checks the last value Lerp,//lerps between } + +//hey dumbass just use a delta pub struct MouseInterpolationState { interpolation: MouseInterpolation, time0: TIME, From 9e9550885fe666c95dda05fdd47ef8d5d23ddc0c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 16:28:35 -0700 Subject: [PATCH 234/482] replace regex with lazy-regex macros --- Cargo.lock | 25 ++++++++++++++++++++++++- Cargo.toml | 2 +- src/load_roblox.rs | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d964dc8..2a3a157 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -834,6 +834,29 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "lazy-regex" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e723bd417b2df60a0f6a2b6825f297ea04b245d4ba52b5a22cb679bdf58b05fa" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0a1d9139f0ee2e862e08a9c5d0ba0470f2aa21cd1e1aa1b1562f83116c725f" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.29", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1666,6 +1689,7 @@ dependencies = [ "ddsfile", "env_logger", "glam", + "lazy-regex", "log", "obj", "pollster", @@ -1673,7 +1697,6 @@ dependencies = [ "rbx_dom_weak", "rbx_reflection_database", "rbx_xml", - "regex", "wgpu", "winit", ] diff --git a/Cargo.toml b/Cargo.toml index 961c5f9..5138640 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ bytemuck = { version = "1.13.1", features = ["derive"] } ddsfile = "0.5.1" env_logger = "0.10.0" glam = "0.24.1" +lazy-regex = "3.0.2" log = "0.4.20" obj = "0.10.2" pollster = "0.3.0" @@ -18,7 +19,6 @@ rbx_binary = "0.7.1" rbx_dom_weak = "2.5.0" rbx_reflection_database = "0.2.7" rbx_xml = "0.13.1" -regex = "1.9.5" wgpu = "0.17.0" winit = "0.28.6" diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 880f1c2..0972fab 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -36,7 +36,7 @@ struct RobloxAssetIdParseErr; impl std::str::FromStr for RobloxAssetId { type Err=RobloxAssetIdParseErr; fn from_str(s: &str) -> Result{ - let regman=regex::Regex::new(r"(\d+)$").unwrap(); + let regman=lazy_regex::regex!(r"(\d+)$"); if let Some(captures) = regman.captures(s) { if captures.len()==2{//captures[0] is all captures concatenated, and then each individual capture if let Ok(id) = captures[0].parse::() { From de0eb0790a922b099c845bcf8b06878c0dc04fc9 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 16:29:30 -0700 Subject: [PATCH 235/482] fixups --- src/load_roblox.rs | 2 +- src/main.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 0972fab..80698cb 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -150,7 +150,7 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index glam::Vec3::new(size.x,size.y,size.z)/2.0 ); if object.name=="MapStart"{ - spawn_point=model_transform.transform_point3(glam::Vec3::Y)+glam::vec3(0.0,2.5,0.0); + spawn_point=model_transform.transform_point3(-glam::Vec3::Y)+glam::vec3(0.0,2.5+0.1,0.0); println!("Found MapStart{:?}",spawn_point); } if *transparency==1.0 { diff --git a/src/main.rs b/src/main.rs index b780f80..72b8db7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -93,7 +93,7 @@ impl GraphicsData { } println!("Physics Objects: {}",self.physics.models.len()); } - fn generate_model_graphics(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,mut indexed_models:model::IndexedModelInstances){ + fn generate_model_graphics(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,indexed_models:model::IndexedModelInstances){ //generate texture view per texture //idk how to do this gooder lol @@ -174,7 +174,7 @@ impl GraphicsData { //check each group, if it's using a new texture then make a new clone of the model let id=unique_texture_models.len(); let mut unique_textures=Vec::new(); - for group in model.groups.drain(..){ + for group in model.groups.into_iter(){ //ignore zero coppy optimization for now let texture_index=if let Some(texture_index)=unique_textures.iter().position(|&texture|texture==group.texture){ texture_index @@ -238,7 +238,7 @@ impl GraphicsData { texture:model.texture, }); } - //drain the modeldata vec so entities can be /moved/ to models.entities + //.into_iter() the modeldata vec so entities can be /moved/ to models.entities let mut model_count=0; let mut instance_count=0; let uniform_buffer_binding_size=::required_limits().max_uniform_buffer_binding_size as usize; From bb8c53aee217629111d2abbb2be0e1a9c574378c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 16:32:50 -0700 Subject: [PATCH 236/482] check transparency when generating models --- src/load_roblox.rs | 3 --- src/main.rs | 14 +++++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 80698cb..efd490a 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -153,9 +153,6 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index spawn_point=model_transform.transform_point3(-glam::Vec3::Y)+glam::vec3(0.0,2.5+0.1,0.0); println!("Found MapStart{:?}",spawn_point); } - if *transparency==1.0 { - continue; - } //TODO: also detect "CylinderMesh" etc here let shape=match &object.class[..]{ diff --git a/src/main.rs b/src/main.rs index 72b8db7..3ebc278 100644 --- a/src/main.rs +++ b/src/main.rs @@ -164,11 +164,15 @@ impl GraphicsData { let mut unique_texture_models=Vec::with_capacity(indexed_models_len); for mut model in indexed_models.models.into_iter(){ //convert ModelInstance into ModelGraphicsInstance - let instances:Vec=model.instances.iter().map(|instance|{ - ModelGraphicsInstance{ - transform: glam::Mat4::from(instance.transform), - normal_transform: glam::Mat4::from(instance.transform.inverse()).transpose(), - color: instance.color, + let instances:Vec=model.instances.into_iter().filter_map(|instance|{ + if instance.color.w==0.0{ + None + }else{ + Some(ModelGraphicsInstance{ + transform: glam::Mat4::from(instance.transform), + normal_transform: glam::Mat4::from(instance.transform.inverse()).transpose(), + color: instance.color, + }) } }).collect(); //check each group, if it's using a new texture then make a new clone of the model From 734ce661f23faf75204bd684b9a6fb4b95586e37 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 2 Oct 2023 22:45:20 -0700 Subject: [PATCH 237/482] game mechanics enums --- src/body.rs | 110 ++++++++++++++++++++++++++++++++++++++------------- src/main.rs | 12 ++---- src/model.rs | 105 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+), 37 deletions(-) diff --git a/src/body.rs b/src/body.rs index 496beb7..d5d4e9c 100644 --- a/src/body.rs +++ b/src/body.rs @@ -257,28 +257,70 @@ fn get_control_dir(controls: u32) -> glam::Vec3{ return control_dir } -pub struct PhysicsState { - pub body: Body, - pub hitbox_halfsize: glam::Vec3, - pub contacts: std::collections::HashSet::, +pub struct GameMechanicsState{ + pub spawn_id:u32, + //jump_counts:HashMap, +} +impl std::default::Default for GameMechanicsState{ + fn default() -> Self { + Self{ + spawn_id:0, + } + } +} + +pub struct WorldState{} + +pub struct StyleModifiers{ + pub controls_mask:u32,//controls which are unable to be activated + pub controls_held:u32,//controls which must be active to be able to strafe + pub mv:f32, + pub walkspeed:f32, + pub friction:f32, + pub walk_accel:f32, + pub gravity:glam::Vec3, + pub strafe_tick_num:TIME, + pub strafe_tick_den:TIME, + pub hitbox_halfsize:glam::Vec3, +} +impl std::default::Default for StyleModifiers{ + fn default() -> Self { + Self{ + controls_mask: !0&!(CONTROL_MOVEUP|CONTROL_MOVEDOWN), + controls_held: 0, + strafe_tick_num: 100,//100t + strafe_tick_den: 1_000_000_000, + gravity: glam::vec3(0.0,-100.0,0.0), + friction: 1.2, + walk_accel: 90.0, + mv: 2.7, + walkspeed: 18.0, + hitbox_halfsize: glam::vec3(1.0,2.5,1.0), + } + } +} + +pub struct PhysicsState{ + pub time:TIME, + pub body:Body, + pub world:WorldState,//currently there is only one state the world can be in + pub game:GameMechanicsState, + pub style:StyleModifiers, + pub contacts:std::collections::HashSet::, //pub intersections: Vec, - pub models: Vec, //camera must exist in state because wormholes modify the camera, also camera punch - pub camera: Camera, - pub mouse_interpolation: MouseInterpolationState, - pub controls: u32, - pub time: TIME, - pub strafe_tick_num: TIME, - pub strafe_tick_den: TIME, - pub tick: u32, - pub mv: f32, - pub walk: WalkState, - pub walkspeed: f32, - pub friction: f32, - pub walk_accel: f32, - pub gravity: glam::Vec3, - pub grounded: bool, - pub spawn_point: glam::Vec3, + pub camera:Camera, + pub mouse_interpolation:MouseInterpolationState, + pub controls:u32, + pub walk:WalkState, + pub grounded:bool, + //all models + pub models:Vec, + + pub stages:Vec, + //the spawn point is where you spawn when you load into the map. + //This is not the same as Reset which teleports you to Spawn0 + pub spawn_point:glam::Vec3, } #[derive(Debug,Clone,Copy,Hash,Eq,PartialEq)] @@ -390,10 +432,22 @@ impl Aabb { type TreyMeshFace = AabbFace; type TreyMesh = Aabb; +enum PhysicsCollisionAttributes{ + Contact{//track whether you are contacting the object + contacting:crate::model::ContactingAttributes, + general:crate::model::GameMechanicAttributes, + }, + Intersect{//track whether you are intersecting the object + intersecting:crate::model::IntersectingAttributes, + general:crate::model::GameMechanicAttributes, + }, +} + pub struct ModelPhysics { //A model is a thing that has a hitbox. can be represented by a list of TreyMesh-es //in this iteration, all it needs is extents. mesh: TreyMesh, + attributes:PhysicsCollisionAttributes, } impl ModelPhysics { @@ -522,7 +576,7 @@ impl PhysicsState { } fn next_strafe_instruction(&self) -> Option> { return Some(TimedInstruction{ - time:(self.time*self.strafe_tick_num/self.strafe_tick_den+1)*self.strafe_tick_den/self.strafe_tick_num, + time:(self.time*self.style.strafe_tick_num/self.style.strafe_tick_den+1)*self.style.strafe_tick_den/self.style.strafe_tick_num, //only poll the physics if there is a before and after mouse event instruction:PhysicsInstruction::StrafeTick }); @@ -572,7 +626,7 @@ impl PhysicsState { self.body.acceleration=a; self.walk.state=WalkEnum::Reached; }else{ - let accel=self.walk_accel.min(self.gravity.length()*self.friction); + let accel=self.style.walk_accel.min(self.style.gravity.length()*self.style.friction); let time_delta=target_diff.length()/accel; let mut a=target_diff/time_delta; self.contact_constrain_acceleration(&mut a); @@ -601,7 +655,7 @@ impl PhysicsState { fn mesh(&self) -> TreyMesh { let mut aabb=Aabb::new(); for vertex in Aabb::unit_vertices(){ - aabb.grow(self.body.position+self.hitbox_halfsize*vertex); + aabb.grow(self.body.position+self.style.hitbox_halfsize*vertex); } aabb } @@ -945,7 +999,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat }, PhysicsInstruction::CollisionEnd(c) => { self.contacts.remove(&c);//remove contact before calling contact_constrain_acceleration - let mut a=self.gravity; + let mut a=self.style.gravity; self.contact_constrain_acceleration(&mut a); self.body.acceleration=a; //check ground @@ -961,8 +1015,8 @@ impl crate::instruction::InstructionConsumer for PhysicsStat let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); let control_dir=camera_mat*get_control_dir(self.controls); let d=self.body.velocity.dot(control_dir); - if d for PhysicsStat self.body.velocity=glam::Vec3::ZERO; //manual clear //for c in self.contacts{process_instruction(CollisionEnd(c))} self.contacts.clear(); - self.body.acceleration=self.gravity; + self.body.acceleration=self.style.gravity; self.walk.state=WalkEnum::Reached; self.grounded=false; refresh_walk_target=false; @@ -1020,7 +1074,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat if refresh_walk_target_velocity{ let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); let control_dir=camera_mat*get_control_dir(self.controls); - self.walk.target_velocity=self.walkspeed*control_dir; + self.walk.target_velocity=self.style.walkspeed*control_dir; } self.refresh_walk_target(); } diff --git a/src/main.rs b/src/main.rs index 3ebc278..3d8152a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -503,22 +503,16 @@ impl framework::Example for GraphicsData { spawn_point:glam::vec3(0.0,50.0,0.0), body: body::Body::with_pva(glam::vec3(0.0,50.0,0.0),glam::vec3(0.0,0.0,0.0),glam::vec3(0.0,-100.0,0.0)), time: 0, - tick: 0, - strafe_tick_num: 100,//100t - strafe_tick_den: 1_000_000_000, - gravity: glam::vec3(0.0,-100.0,0.0), - friction: 1.2, - walk_accel: 90.0, - mv: 2.7, + style:body::StyleModifiers::default(), grounded: false, - walkspeed: 18.0, contacts: std::collections::HashSet::new(), models: Vec::new(), walk: body::WalkState::new(), - hitbox_halfsize: glam::vec3(1.0,2.5,1.0), camera: body::Camera::from_offset(glam::vec3(0.0,4.5-2.5,0.0),(config.width as f32)/(config.height as f32)), mouse_interpolation: body::MouseInterpolationState::new(), controls: 0, + world:body::WorldState{}, + game:body::GameMechanicsState::default(), }; //load textures diff --git a/src/model.rs b/src/model.rs index 8dea948..2475587 100644 --- a/src/model.rs +++ b/src/model.rs @@ -65,6 +65,111 @@ pub struct IndexedModelInstances{ //object_index for spawns, triggers etc? pub spawn_point:glam::Vec3, } +//stage description referencing flattened ids is spooky, but the map loading is meant to be deterministic. +pub struct StageDescription{ + pub start:u32,//start=model_id + pub spawns:Vec,//spawns[spawn_id]=model_id + pub ordered_checkpoints:Vec,//ordered_checkpoints[checkpoint_id]=model_id + pub unordered_checkpoints:Vec,//unordered_checkpoints[checkpoint_id]=model_id +} + +//you have this effect while in contact +#[derive(Clone)] +pub struct ContactingSurf{} +#[derive(Clone)] +pub struct ContactingLadder{ + pub sticky:bool +} +//you have this effect while intersecting +#[derive(Clone)] +pub struct IntersectingWater{ + pub viscosity:i64, + pub density:i64, + pub current:glam::Vec3, +} +#[derive(Clone)] +pub struct IntersectingAccelerator{ + pub acceleration:glam::Vec3 +} +//All models can be given these attributes +#[derive(Clone)] +pub struct GameMechanicJumpLimit{ + pub count:u32, +} +#[derive(Clone)] +pub struct GameMechanicBooster{ + pub velocity:glam::Vec3, +} +#[derive(Clone)] +pub enum ZoneBehaviour{ + //Start is indexed + //Checkpoints are indexed + Finish, + Anitcheat, +} +#[derive(Clone)] +pub struct GameMechanicZone{ + pub mode_id:u32, + pub behaviour:ZoneBehaviour, +} +// enum TrapCondition{ +// FasterThan(i64), +// SlowerThan(i64), +// InRange(i64,i64), +// OutsideRange(i64,i64), +// } +#[derive(Clone)] +pub enum StageElementBehaviour{ + //Spawn,//The behaviour of stepping on a spawn setting the spawnid + SpawnAt, + Trigger, + Teleport, + Platform, + //Speedtrap(TrapCondition),//Acts as a trigger with a speed condition +} +#[derive(Clone)] +pub struct GameMechanicStageElement{ + pub mode_id:u32, + pub stage_id:u32,//which spawn to send to + pub force:bool,//allow setting to lower spawn id i.e. 7->3 + pub behaviour:StageElementBehaviour +} +#[derive(Clone)] +pub struct GameMechanicWormhole{//(position,angles)*=origin.transform.inverse()*destination.transform + pub model_id:u32, +} +#[derive(Default,Clone)] +pub struct GameMechanicAttributes{ + pub jump_limit:Option, + pub booster:Option, + pub zone:Option, + pub stage_element:Option, + pub wormhole:Option,//stage_element and wormhole are in conflict +} +#[derive(Default,Clone)] +pub struct ContactingAttributes{ + pub elasticity:Option,//[1/2^32,1] 0=None (elasticity+1)/2^32 + //friction? + pub surf:Option, + pub ladder:Option, +} +#[derive(Default,Clone)] +pub struct IntersectingAttributes{ + pub water:Option, + pub accelerator:Option, +} +//Spawn(u32) NO! spawns are indexed in the map header instead of marked with attibutes +pub enum CollisionAttributes{ + Decoration,//visual only + Contact{//track whether you are contacting the object + contacting:ContactingAttributes, + general:GameMechanicAttributes, + }, + Intersect{//track whether you are intersecting the object + intersecting:IntersectingAttributes, + general:GameMechanicAttributes, + }, +} pub fn generate_indexed_model_list_from_obj(data:obj::ObjData,color:[f32;4]) -> Vec{ let mut unique_vertex_index = std::collections::HashMap::::new(); From f72acaf2d4d6d68de385be34e4004ca1d3230918 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 16:34:54 -0700 Subject: [PATCH 238/482] implement attributes + stages --- src/body.rs | 12 +++++++-- src/load_roblox.rs | 66 ++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 19 ++++++++++++- src/model.rs | 15 +++++++++-- 4 files changed, 107 insertions(+), 5 deletions(-) diff --git a/src/body.rs b/src/body.rs index d5d4e9c..bc0bda0 100644 --- a/src/body.rs +++ b/src/body.rs @@ -451,13 +451,21 @@ pub struct ModelPhysics { } impl ModelPhysics { - pub fn from_model(model:&crate::model::IndexedModel,model_transform:glam::Affine3A) -> Self { + fn from_model_transform_attributes(model:&crate::model::IndexedModel,transform:&glam::Affine3A,attributes:PhysicsCollisionAttributes)->Self{ let mut aabb=Aabb::new(); for indexed_vertex in &model.unique_vertices { - aabb.grow(model_transform.transform_point3(glam::Vec3::from_array(model.unique_pos[indexed_vertex.pos as usize]))); + aabb.grow(transform.transform_point3(glam::Vec3::from_array(model.unique_pos[indexed_vertex.pos as usize]))); } Self{ mesh:aabb, + attributes, + } + } + pub fn from_model(model:&crate::model::IndexedModel,instance:&crate::model::ModelInstance) -> Option { + match &instance.attributes{ + crate::model::CollisionAttributes::Decoration=>None, + crate::model::CollisionAttributes::Contact{contacting,general}=>Some(ModelPhysics::from_model_transform_attributes(model,&instance.transform,PhysicsCollisionAttributes::Contact{contacting:contacting.clone(),general:general.clone()})), + crate::model::CollisionAttributes::Intersect{intersecting,general}=>None,//Some(ModelPhysics::from_model_transform_attributes(model,&instance.transform,PhysicsCollisionAttributes::Intersecting{intersecting,general})), } } pub fn unit_vertices(&self) -> [glam::Vec3;8] { diff --git a/src/load_roblox.rs b/src/load_roblox.rs index efd490a..a1f5cd0 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -30,6 +30,64 @@ fn get_texture_refs(dom:&rbx_dom_weak::WeakDom) -> Vec //next class objects } +fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3)->crate::model::CollisionAttributes{ + let mut general=crate::model::GameMechanicAttributes::default(); + let mut intersecting=crate::model::IntersectingAttributes::default(); + let mut contacting=crate::model::ContactingAttributes::default(); + match name{ + // "Water"=>intersecting.water=Some(crate::model::IntersectingWater::default()), + // "Accelerator"=>(), + // "MapFinish"=>(), + // "MapAnticheat"=>(), + "Platform"=>general.stage_element=Some(crate::model::GameMechanicStageElement{ + mode_id:0, + stage_id:0, + force:false, + behaviour:crate::model::StageElementBehaviour::Platform, + }), + other=>{ + let regman=lazy_regex::regex!(r"^(Force)?(SpawnAt|Trigger|Teleport|Platform)(\d+)$"); + if let Some(captures) = regman.captures(other) { + general.stage_element=Some(crate::model::GameMechanicStageElement{ + mode_id:0, + stage_id:captures[3].parse::().unwrap(), + force:match captures.get(1){ + Some(m)=>m.as_str()=="Force", + None=>false, + }, + behaviour:match &captures[2]{ + "SpawnAt"=>crate::model::StageElementBehaviour::SpawnAt, + "Trigger"=>crate::model::StageElementBehaviour::Trigger, + "Teleport"=>crate::model::StageElementBehaviour::Teleport, + "Platform"=>crate::model::StageElementBehaviour::Platform, + _=>panic!("regex[2] messed up bad"), + } + }) + + } + } + } + //need some way to skip this + if velocity!=glam::Vec3::ZERO{ + general.booster=Some(crate::model::GameMechanicBooster{velocity}); + } + match can_collide{ + true=>{ + match name{ + //"Bounce"=>(), + "Surf"=>contacting.surf=Some(crate::model::ContactingSurf{}), + "Ladder"=>contacting.ladder=Some(crate::model::ContactingLadder{sticky:true}), + other=>{ + //REGEX!!!! + //Jump# + //WormholeIn# + } + } + return crate::model::CollisionAttributes::Contact{contacting,general}; + }, + false=>return crate::model::CollisionAttributes::Decoration, + } +} struct RobloxAssetId(u64); struct RobloxAssetIdParseErr; @@ -113,6 +171,8 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index //IndexedModelInstances includes textures let mut spawn_point=glam::Vec3::ZERO; + let mut stages=Vec::new(); + let mut indexed_models=Vec::new(); let mut model_id_from_description=std::collections::HashMap::::new(); @@ -127,13 +187,17 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index if let ( Some(rbx_dom_weak::types::Variant::CFrame(cf)), Some(rbx_dom_weak::types::Variant::Vector3(size)), + Some(rbx_dom_weak::types::Variant::Vector3(velocity)), Some(rbx_dom_weak::types::Variant::Float32(transparency)), Some(rbx_dom_weak::types::Variant::Color3uint8(color3)), + Some(rbx_dom_weak::types::Variant::Bool(can_collide)), ) = ( object.properties.get("CFrame"), object.properties.get("Size"), + object.properties.get("Velocity"), object.properties.get("Transparency"), object.properties.get("Color"), + object.properties.get("CanCollide"), ) { let model_transform=glam::Affine3A::from_translation( @@ -333,6 +397,7 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index indexed_models[model_id].instances.push(crate::model::ModelInstance { transform:model_transform, color:glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), + attributes:get_attributes(&object.name,*can_collide,glam::vec3(velocity.x,velocity.y,velocity.z)), }); } } @@ -341,5 +406,6 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index textures:asset_id_from_texture_id.iter().map(|t|t.to_string()).collect(), models:indexed_models, spawn_point, + stages, } } diff --git a/src/main.rs b/src/main.rs index 3d8152a..9d330df 100644 --- a/src/main.rs +++ b/src/main.rs @@ -88,7 +88,9 @@ impl GraphicsData { for model in &indexed_models.models{ //make aabb and run vertices to get realistic bounds for model_instance in &model.instances{ - self.physics.models.push(body::ModelPhysics::from_model(&model,model_instance.transform)); + if let Some(model_physics)=body::ModelPhysics::from_model(model,model_instance){ + self.physics.models.push(model_physics); + } } } println!("Physics Objects: {}",self.physics.models.len()); @@ -375,33 +377,46 @@ impl framework::Example for GraphicsData { indexed_models[0].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(10.,0.,-10.)), color:glam::Vec4::ONE, + attributes:model::CollisionAttributes::contact(), }); //quad monkeys indexed_models[1].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)), color:glam::Vec4::ONE, + attributes:model::CollisionAttributes::contact(), }); indexed_models[1].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,10.)), color:glam::vec4(1.0,0.0,0.0,1.0), + attributes:model::CollisionAttributes::contact(), }); indexed_models[1].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,20.)), color:glam::vec4(0.0,1.0,0.0,1.0), + attributes:model::CollisionAttributes::contact(), }); indexed_models[1].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,20.)), color:glam::vec4(0.0,0.0,1.0,1.0), + attributes:model::CollisionAttributes::contact(), + }); + //decorative monkey + indexed_models[1].instances.push(ModelInstance{ + transform:glam::Affine3A::from_translation(glam::vec3(15.,10.,15.)), + color:glam::vec4(0.5,0.5,0.5,0.5), + attributes:model::CollisionAttributes::Decoration, }); //teapot indexed_models[2].instances.push(ModelInstance{ transform:glam::Affine3A::from_scale_rotation_translation(glam::vec3(0.5, 1.0, 0.2),glam::quat(-0.22248298016985793,-0.839457167990537,-0.05603504040830783,-0.49261857546227916),glam::vec3(-10.,7.,10.)), color:glam::Vec4::ONE, + attributes:model::CollisionAttributes::contact(), }); //ground indexed_models[3].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(0.,0.,0.))*glam::Affine3A::from_scale(glam::vec3(160.0, 1.0, 160.0)), color:glam::Vec4::ONE, + attributes:model::CollisionAttributes::contact(), }); let camera_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { @@ -513,6 +528,7 @@ impl framework::Example for GraphicsData { controls: 0, world:body::WorldState{}, game:body::GameMechanicsState::default(), + stages:Vec::new(), }; //load textures @@ -768,6 +784,7 @@ impl framework::Example for GraphicsData { textures:Vec::new(), models:indexed_models, spawn_point:glam::Vec3::Y*50.0, + stages:Vec::new(), }; graphics.generate_model_physics(&indexed_model_instances); graphics.generate_model_graphics(&device,&queue,indexed_model_instances); diff --git a/src/model.rs b/src/model.rs index 2475587..159c66d 100644 --- a/src/model.rs +++ b/src/model.rs @@ -56,13 +56,16 @@ pub struct ModelGraphicsInstance{ pub color:glam::Vec4, } pub struct ModelInstance{ + //pub id:u64,//this does not actually help with map fixes resimulating bots, they must always be resimulated pub transform:glam::Affine3A, - pub color:glam::Vec4, + pub color:glam::Vec4,//transparency is in here + pub attributes:CollisionAttributes, } pub struct IndexedModelInstances{ pub textures:Vec,//RenderPattern pub models:Vec, - //object_index for spawns, triggers etc? + //may make this into an object later. + pub stages:Vec, pub spawn_point:glam::Vec3, } //stage description referencing flattened ids is spooky, but the map loading is meant to be deterministic. @@ -170,6 +173,14 @@ pub enum CollisionAttributes{ general:GameMechanicAttributes, }, } +impl CollisionAttributes{ + pub fn contact() -> Self { + Self::Contact{ + contacting:ContactingAttributes::default(), + general:GameMechanicAttributes::default() + } + } +} pub fn generate_indexed_model_list_from_obj(data:obj::ObjData,color:[f32;4]) -> Vec{ let mut unique_vertex_index = std::collections::HashMap::::new(); From 5914db35993a663cb7361be0245b098517a55f30 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 16:52:45 -0700 Subject: [PATCH 239/482] put control stuff in StyleModifiers --- src/body.rs | 109 +++++++++++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 49 deletions(-) diff --git a/src/body.rs b/src/body.rs index bc0bda0..89101df 100644 --- a/src/body.rs +++ b/src/body.rs @@ -220,43 +220,6 @@ impl Camera { } } -const CONTROL_MOVEFORWARD:u32 = 0b00000001; -const CONTROL_MOVEBACK:u32 = 0b00000010; -const CONTROL_MOVERIGHT:u32 = 0b00000100; -const CONTROL_MOVELEFT:u32 = 0b00001000; -const CONTROL_MOVEUP:u32 = 0b00010000; -const CONTROL_MOVEDOWN:u32 = 0b00100000; -const CONTROL_JUMP:u32 = 0b01000000; -const CONTROL_ZOOM:u32 = 0b10000000; - -const FORWARD_DIR:glam::Vec3 = glam::Vec3::new(0.0,0.0,-1.0); -const RIGHT_DIR:glam::Vec3 = glam::Vec3::new(1.0,0.0,0.0); -const UP_DIR:glam::Vec3 = glam::Vec3::new(0.0,1.0,0.0); - -fn get_control_dir(controls: u32) -> glam::Vec3{ - //don't get fancy just do it - let mut control_dir:glam::Vec3 = glam::Vec3::new(0.0,0.0,0.0); - if controls & CONTROL_MOVEFORWARD == CONTROL_MOVEFORWARD { - control_dir+=FORWARD_DIR; - } - if controls & CONTROL_MOVEBACK == CONTROL_MOVEBACK { - control_dir+=-FORWARD_DIR; - } - if controls & CONTROL_MOVELEFT == CONTROL_MOVELEFT { - control_dir+=-RIGHT_DIR; - } - if controls & CONTROL_MOVERIGHT == CONTROL_MOVERIGHT { - control_dir+=RIGHT_DIR; - } - if controls & CONTROL_MOVEUP == CONTROL_MOVEUP { - control_dir+=UP_DIR; - } - if controls & CONTROL_MOVEDOWN == CONTROL_MOVEDOWN { - control_dir+=-UP_DIR; - } - return control_dir -} - pub struct GameMechanicsState{ pub spawn_id:u32, //jump_counts:HashMap, @@ -286,7 +249,7 @@ pub struct StyleModifiers{ impl std::default::Default for StyleModifiers{ fn default() -> Self { Self{ - controls_mask: !0&!(CONTROL_MOVEUP|CONTROL_MOVEDOWN), + controls_mask: !0&!(Self::CONTROL_MOVEUP|Self::CONTROL_MOVEDOWN), controls_held: 0, strafe_tick_num: 100,//100t strafe_tick_den: 1_000_000_000, @@ -299,6 +262,54 @@ impl std::default::Default for StyleModifiers{ } } } +impl StyleModifiers{ + const CONTROL_MOVEFORWARD:u32 = 0b00000001; + const CONTROL_MOVEBACK:u32 = 0b00000010; + const CONTROL_MOVERIGHT:u32 = 0b00000100; + const CONTROL_MOVELEFT:u32 = 0b00001000; + const CONTROL_MOVEUP:u32 = 0b00010000; + const CONTROL_MOVEDOWN:u32 = 0b00100000; + const CONTROL_JUMP:u32 = 0b01000000; + const CONTROL_ZOOM:u32 = 0b10000000; + + const FORWARD_DIR:glam::Vec3 = glam::Vec3::NEG_Z; + const RIGHT_DIR:glam::Vec3 = glam::Vec3::X; + const UP_DIR:glam::Vec3 = glam::Vec3::Y; + + fn get_control(&self,control:u32,controls:u32)->bool{ + controls&self.controls_mask&control!=0 + } + + fn get_control_dir(&self,controls:u32)->glam::Vec3{ + //don't get fancy just do it + let mut control_dir:glam::Vec3 = glam::Vec3::ZERO; + //Disallow strafing if held controls are not held + if controls&self.controls_held!=self.controls_held{ + return control_dir; + } + //Apply mask after held check so you can require non-allowed keys to be held for some reason + let controls=controls&self.controls_mask; + if controls & Self::CONTROL_MOVEFORWARD == Self::CONTROL_MOVEFORWARD { + control_dir+=Self::FORWARD_DIR; + } + if controls & Self::CONTROL_MOVEBACK == Self::CONTROL_MOVEBACK { + control_dir+=-Self::FORWARD_DIR; + } + if controls & Self::CONTROL_MOVELEFT == Self::CONTROL_MOVELEFT { + control_dir+=-Self::RIGHT_DIR; + } + if controls & Self::CONTROL_MOVERIGHT == Self::CONTROL_MOVERIGHT { + control_dir+=Self::RIGHT_DIR; + } + if controls & Self::CONTROL_MOVEUP == Self::CONTROL_MOVEUP { + control_dir+=Self::UP_DIR; + } + if controls & Self::CONTROL_MOVEDOWN == Self::CONTROL_MOVEDOWN { + control_dir+=-Self::UP_DIR; + } + return control_dir + } +} pub struct PhysicsState{ pub time:TIME, @@ -1000,7 +1011,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat let mut v=self.body.velocity; self.contact_constrain_velocity(&mut v); self.body.velocity=v; - if self.grounded&&self.controls&CONTROL_JUMP!=0{ + if self.grounded&&self.style.get_control(StyleModifiers::CONTROL_JUMP,self.controls){ self.jump(); } self.refresh_walk_target(); @@ -1021,7 +1032,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat }, PhysicsInstruction::StrafeTick => { let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); - let control_dir=camera_mat*get_control_dir(self.controls); + let control_dir=camera_mat*self.style.get_control_dir(self.controls); let d=self.body.velocity.dot(control_dir); if d for PhysicsStat self.camera.angles=self.camera.simulate_move_angles(self.mouse_interpolation.mouse1-self.mouse_interpolation.mouse0); self.mouse_interpolation.move_mouse(self.time,m); }, - InputInstruction::MoveForward(s) => self.set_control(CONTROL_MOVEFORWARD,s), - InputInstruction::MoveLeft(s) => self.set_control(CONTROL_MOVELEFT,s), - InputInstruction::MoveBack(s) => self.set_control(CONTROL_MOVEBACK,s), - InputInstruction::MoveRight(s) => self.set_control(CONTROL_MOVERIGHT,s), - InputInstruction::MoveUp(s) => self.set_control(CONTROL_MOVEUP,s), - InputInstruction::MoveDown(s) => self.set_control(CONTROL_MOVEDOWN,s), + InputInstruction::MoveForward(s) => self.set_control(StyleModifiers::CONTROL_MOVEFORWARD,s), + InputInstruction::MoveLeft(s) => self.set_control(StyleModifiers::CONTROL_MOVELEFT,s), + InputInstruction::MoveBack(s) => self.set_control(StyleModifiers::CONTROL_MOVEBACK,s), + InputInstruction::MoveRight(s) => self.set_control(StyleModifiers::CONTROL_MOVERIGHT,s), + InputInstruction::MoveUp(s) => self.set_control(StyleModifiers::CONTROL_MOVEUP,s), + InputInstruction::MoveDown(s) => self.set_control(StyleModifiers::CONTROL_MOVEDOWN,s), InputInstruction::Jump(s) => { - self.set_control(CONTROL_JUMP,s); + self.set_control(StyleModifiers::CONTROL_JUMP,s); if self.grounded{ self.jump(); } refresh_walk_target_velocity=false; }, InputInstruction::Zoom(s) => { - self.set_control(CONTROL_ZOOM,s); + self.set_control(StyleModifiers::CONTROL_ZOOM,s); refresh_walk_target=false; }, InputInstruction::Reset => { @@ -1081,7 +1092,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat //calculate walk target velocity if refresh_walk_target_velocity{ let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); - let control_dir=camera_mat*get_control_dir(self.controls); + let control_dir=camera_mat*self.style.get_control_dir(self.controls); self.walk.target_velocity=self.style.walkspeed*control_dir; } self.refresh_walk_target(); From ed96572a24b1c9e5f33a28d9a1b68f55bd466de8 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 17:20:35 -0700 Subject: [PATCH 240/482] RelativeCollision.model helper --- src/body.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/body.rs b/src/body.rs index 89101df..4c90806 100644 --- a/src/body.rs +++ b/src/body.rs @@ -515,11 +515,14 @@ pub struct RelativeCollision { } impl RelativeCollision { + pub fn model<'a>(&self,models:&'a Vec)->Option<&'a ModelPhysics>{ + models.get(self.model as usize) + } pub fn mesh(&self,models:&Vec) -> TreyMesh { - return models.get(self.model as usize).unwrap().face_mesh(self.face).clone() + return self.model(models).unwrap().face_mesh(self.face).clone() } pub fn normal(&self,models:&Vec) -> glam::Vec3 { - return models.get(self.model as usize).unwrap().face_normal(self.face) + return self.model(models).unwrap().face_normal(self.face) } } From bfd6f4493f41176b8b42887a069058d648f5ce45 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 17:20:52 -0700 Subject: [PATCH 241/482] I was just stupid the whole time --- src/load_roblox.rs | 24 +++++++++++++++++++++--- src/primitives.rs | 10 +++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index a1f5cd0..e3dd5fb 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -315,14 +315,32 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index } } //obscure rust syntax "slice pattern" - let [f0,f1,f2,f3,f4,f5]=part_texture_description; + let [ + f0,//Cube::Right + f1,//Cube::Top + f2,//Cube::Back + f3,//Cube::Left + f4,//Cube::Bottom + f5,//Cube::Front + ]=part_texture_description; let basepart_texture_description=match shape{ primitives::Primitives::Sphere=>RobloxBasePartDescription::Sphere, primitives::Primitives::Cube=>RobloxBasePartDescription::Part([f0,f1,f2,f3,f4,f5]), primitives::Primitives::Cylinder=>RobloxBasePartDescription::Cylinder, //use front face texture first and use top face texture as a fallback - primitives::Primitives::Wedge=>RobloxBasePartDescription::Wedge([f0,if f2.is_some(){f2}else{f1},f3,f4,f5]), - primitives::Primitives::CornerWedge=>RobloxBasePartDescription::CornerWedge([f1,f3,f4,f5]), + primitives::Primitives::Wedge=>RobloxBasePartDescription::Wedge([ + f0,//Wedge::Right + if f5.is_some(){f5}else{f1},//Wedge::TopFront + f2,//Wedge::Back + f3,//Wedge::Left + f4,//Wedge::Bottom + ]), + primitives::Primitives::CornerWedge=>RobloxBasePartDescription::CornerWedge([ + f0,//CornerWedge::Right + f1,//CornerWedge::Top + f4,//CornerWedge::Bottom + f5,//CornerWedge::Front + ]), }; //make new model if unit cube has not been created before let model_id=if let Some(&model_id)=model_id_from_description.get(&basepart_texture_description){ diff --git a/src/primitives.rs b/src/primitives.rs index 6f0e607..fd290ff 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -113,11 +113,11 @@ pub enum CornerWedgeFace{ Front, } const CORNERWEDGE_DEFAULT_NORMALS:[[f32;3];5]=[ - [ 1., 0., 0.],//Wedge::Right - [ 0., 1., 1.],//Wedge::BackTop - [-1., 1., 0.],//Wedge::LeftTop - [ 0.,-1., 0.],//Wedge::Bottom - [ 0., 0.,-1.],//Wedge::Front + [ 1., 0., 0.],//CornerWedge::Right + [ 0., 1., 1.],//CornerWedge::BackTop + [-1., 1., 0.],//CornerWedge::LeftTop + [ 0.,-1., 0.],//CornerWedge::Bottom + [ 0., 0.,-1.],//CornerWedge::Front ]; //HashMap fits this use case perfectly but feels like using a sledgehammer to drive a nail pub fn unit_sphere()->crate::model::IndexedModel{ From 696f383aee7e502363a838b9954c401a9c21b917 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 17:31:30 -0700 Subject: [PATCH 242/482] enable cheats --- src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/body.rs b/src/body.rs index 4c90806..d67b197 100644 --- a/src/body.rs +++ b/src/body.rs @@ -249,7 +249,7 @@ pub struct StyleModifiers{ impl std::default::Default for StyleModifiers{ fn default() -> Self { Self{ - controls_mask: !0&!(Self::CONTROL_MOVEUP|Self::CONTROL_MOVEDOWN), + controls_mask: !0,//&!(Self::CONTROL_MOVEUP|Self::CONTROL_MOVEDOWN), controls_held: 0, strafe_tick_num: 100,//100t strafe_tick_den: 1_000_000_000, From 7a8de938afdb18a51c08de0896a7ce3f539f40e5 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 19:42:07 -0700 Subject: [PATCH 243/482] rename stages to modes --- src/body.rs | 2 +- src/load_roblox.rs | 4 +--- src/main.rs | 4 ++-- src/model.rs | 4 ++-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/body.rs b/src/body.rs index d67b197..0874546 100644 --- a/src/body.rs +++ b/src/body.rs @@ -328,7 +328,7 @@ pub struct PhysicsState{ //all models pub models:Vec, - pub stages:Vec, + pub modes:Vec, //the spawn point is where you spawn when you load into the map. //This is not the same as Reset which teleports you to Spawn0 pub spawn_point:glam::Vec3, diff --git a/src/load_roblox.rs b/src/load_roblox.rs index e3dd5fb..0f3159b 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -171,8 +171,6 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index //IndexedModelInstances includes textures let mut spawn_point=glam::Vec3::ZERO; - let mut stages=Vec::new(); - let mut indexed_models=Vec::new(); let mut model_id_from_description=std::collections::HashMap::::new(); @@ -424,6 +422,6 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index textures:asset_id_from_texture_id.iter().map(|t|t.to_string()).collect(), models:indexed_models, spawn_point, - stages, + modes:Vec::new(), } } diff --git a/src/main.rs b/src/main.rs index 9d330df..cbecae1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -528,7 +528,7 @@ impl framework::Example for GraphicsData { controls: 0, world:body::WorldState{}, game:body::GameMechanicsState::default(), - stages:Vec::new(), + modes:Vec::new(), }; //load textures @@ -784,7 +784,7 @@ impl framework::Example for GraphicsData { textures:Vec::new(), models:indexed_models, spawn_point:glam::Vec3::Y*50.0, - stages:Vec::new(), + modes:Vec::new(), }; graphics.generate_model_physics(&indexed_model_instances); graphics.generate_model_graphics(&device,&queue,indexed_model_instances); diff --git a/src/model.rs b/src/model.rs index 159c66d..820cac4 100644 --- a/src/model.rs +++ b/src/model.rs @@ -65,11 +65,11 @@ pub struct IndexedModelInstances{ pub textures:Vec,//RenderPattern pub models:Vec, //may make this into an object later. - pub stages:Vec, + pub modes:Vec, pub spawn_point:glam::Vec3, } //stage description referencing flattened ids is spooky, but the map loading is meant to be deterministic. -pub struct StageDescription{ +pub struct ModeDescription{ pub start:u32,//start=model_id pub spawns:Vec,//spawns[spawn_id]=model_id pub ordered_checkpoints:Vec,//ordered_checkpoints[checkpoint_id]=model_id From 50e9152ee257ac311b56e3618c039cdc10416dfa Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 19:43:41 -0700 Subject: [PATCH 244/482] separate graphics state from global state --- src/body.rs | 4 +++ src/main.rs | 98 ++++++++++++++++++++++++++++++----------------------- 2 files changed, 60 insertions(+), 42 deletions(-) diff --git a/src/body.rs b/src/body.rs index 0874546..8a8915b 100644 --- a/src/body.rs +++ b/src/body.rs @@ -553,6 +553,10 @@ impl Body { } impl PhysicsState { + pub fn clear(&mut self){ + self.models.clear(); + self.modes.clear(); + } //tickless gaming pub fn run(&mut self, time_limit:TIME){ //prepare is ommitted - everything is done via instructions. diff --git a/src/main.rs b/src/main.rs index cbecae1..498c013 100644 --- a/src/main.rs +++ b/src/main.rs @@ -38,16 +38,13 @@ pub struct GraphicsBindGroups { skybox_texture: wgpu::BindGroup, } -pub struct GraphicsPipelines { +pub struct GraphicsPipelines{ skybox: wgpu::RenderPipeline, model: wgpu::RenderPipeline, } -pub struct GraphicsData { - start_time: std::time::Instant, +pub struct GraphicsState{ screen_size: (u32, u32), - manual_mouse_lock:bool, - physics: body::PhysicsState, pipelines: GraphicsPipelines, bind_groups: GraphicsBindGroups, bind_group_layouts: GraphicsBindGroupLayouts, @@ -59,7 +56,20 @@ pub struct GraphicsData { staging_belt: wgpu::util::StagingBelt, } -impl GraphicsData { +impl GraphicsState{ + pub fn clear(&mut self){ + self.models.clear(); + } +} + +pub struct GlobalState{ + start_time: std::time::Instant, + manual_mouse_lock:bool, + graphics:GraphicsState, + physics:body::PhysicsState, +} + +impl GlobalState{ const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth24Plus; fn create_depth_texture( @@ -247,9 +257,9 @@ impl GraphicsData { //.into_iter() the modeldata vec so entities can be /moved/ to models.entities let mut model_count=0; let mut instance_count=0; - let uniform_buffer_binding_size=::required_limits().max_uniform_buffer_binding_size as usize; + let uniform_buffer_binding_size=::required_limits().max_uniform_buffer_binding_size as usize; let chunk_size=uniform_buffer_binding_size/MODEL_BUFFER_SIZE_BYTES; - self.models.reserve(models.len()); + self.graphics.models.reserve(models.len()); for model in models.into_iter() { instance_count+=model.instances.len(); for instances_chunk in model.instances.rchunks(chunk_size){ @@ -264,13 +274,13 @@ impl GraphicsData { Some(texture_id)=>{ match double_map.get(&texture_id){ Some(&mapped_texture_id)=>&texture_views[mapped_texture_id as usize], - None=>&self.temp_squid_texture_view, + None=>&self.graphics.temp_squid_texture_view, } }, - None=>&self.temp_squid_texture_view, + None=>&self.graphics.temp_squid_texture_view, }; let model_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { - layout: &self.bind_group_layouts.model, + layout: &self.graphics.bind_group_layouts.model, entries: &[ wgpu::BindGroupEntry { binding: 0, @@ -282,7 +292,7 @@ impl GraphicsData { }, wgpu::BindGroupEntry { binding: 2, - resource: wgpu::BindingResource::Sampler(&self.samplers.repeat), + resource: wgpu::BindingResource::Sampler(&self.graphics.samplers.repeat), }, ], label: Some(format!("Model{} Bind Group",model_count).as_str()), @@ -293,7 +303,7 @@ impl GraphicsData { usage: wgpu::BufferUsages::VERTEX, }); //all of these are being moved here - self.models.push(ModelGraphics{ + self.graphics.models.push(ModelGraphics{ instances:instances_chunk.to_vec(), vertex_buf, entities: model.entities.iter().map(|indices|{ @@ -315,7 +325,7 @@ impl GraphicsData { println!("Texture References={}",num_textures); println!("Textures Loaded={}",texture_views.len()); println!("Indexed Models={}",indexed_models_len); - println!("Graphics Objects: {}",self.models.len()); + println!("Graphics Objects: {}",self.graphics.models.len()); println!("Graphics Instances: {}",instance_count); } } @@ -351,7 +361,7 @@ fn to_uniform_data(camera: &body::Camera, pos: glam::Vec3) -> [f32; 16 * 3 + 4] raw } -impl framework::Example for GraphicsData { +impl framework::Example for GlobalState { fn optional_features() -> wgpu::Features { wgpu::Features::TEXTURE_COMPRESSION_ASTC | wgpu::Features::TEXTURE_COMPRESSION_ETC2 @@ -758,11 +768,8 @@ impl framework::Example for GraphicsData { let depth_view = Self::create_depth_texture(config, device); - let mut graphics=GraphicsData { - manual_mouse_lock:false, - start_time: Instant::now(), + let graphics=GraphicsState { screen_size: (config.width,config.height), - physics, pipelines:GraphicsPipelines{ skybox:sky_pipeline, model:model_pipeline @@ -780,21 +787,28 @@ impl framework::Example for GraphicsData { temp_squid_texture_view: squid_texture_view, }; + let mut state=GlobalState{ + start_time:Instant::now(), + manual_mouse_lock:false, + graphics, + physics, + }; + let indexed_model_instances=model::IndexedModelInstances{ textures:Vec::new(), models:indexed_models, spawn_point:glam::Vec3::Y*50.0, modes:Vec::new(), }; - graphics.generate_model_physics(&indexed_model_instances); - graphics.generate_model_graphics(&device,&queue,indexed_model_instances); + state.generate_model_physics(&indexed_model_instances); + state.generate_model_graphics(&device,&queue,indexed_model_instances); let args:Vec=std::env::args().collect(); if args.len()==2{ - graphics.load_file(std::path::PathBuf::from(&args[1]), device, queue); + state.load_file(std::path::PathBuf::from(&args[1]), device, queue); } - return graphics; + return state; } fn load_file(&mut self,path: std::path::PathBuf, device: &wgpu::Device, queue: &wgpu::Queue){ @@ -837,8 +851,8 @@ impl framework::Example for GraphicsData { }{ let spawn_point=indexed_model_instances.spawn_point; //if generate_indexed_models succeeds, clear the previous ones - self.models.clear(); - self.physics.models.clear(); + self.physics.clear(); + self.graphics.clear(); self.generate_model_physics(&indexed_model_instances); self.generate_model_graphics(device,queue,indexed_model_instances); //manual reset @@ -911,7 +925,7 @@ impl framework::Example for GraphicsData { 15=>{//Tab if s{ self.manual_mouse_lock=false; - match window.set_cursor_position(winit::dpi::PhysicalPosition::new(self.screen_size.0 as f32/2.0, self.screen_size.1 as f32/2.0)){ + match window.set_cursor_position(winit::dpi::PhysicalPosition::new(self.graphics.screen_size.0 as f32/2.0, self.graphics.screen_size.1 as f32/2.0)){ Ok(())=>(), Err(e)=>println!("Could not set cursor position: {:?}",e), } @@ -951,7 +965,7 @@ impl framework::Example for GraphicsData { delta,//these (f64,f64) are integers on my machine } => { if self.manual_mouse_lock{ - match window.set_cursor_position(winit::dpi::PhysicalPosition::new(self.screen_size.0 as f32/2.0, self.screen_size.1 as f32/2.0)){ + match window.set_cursor_position(winit::dpi::PhysicalPosition::new(self.graphics.screen_size.0 as f32/2.0, self.graphics.screen_size.1 as f32/2.0)){ Ok(())=>(), Err(e)=>println!("Could not set cursor position: {:?}",e), } @@ -986,8 +1000,8 @@ impl framework::Example for GraphicsData { device: &wgpu::Device, _queue: &wgpu::Queue, ) { - self.depth_view = Self::create_depth_texture(config, device); - self.screen_size = (config.width, config.height); + self.graphics.depth_view = Self::create_depth_texture(config, device); + self.graphics.screen_size = (config.width, config.height); self.physics.camera.set_fov_aspect(1.0,(config.width as f32)/(config.height as f32)); } @@ -1007,19 +1021,19 @@ impl framework::Example for GraphicsData { // update rotation let camera_uniforms = to_uniform_data(&self.physics.camera,self.physics.body.extrapolated_position(time)); - self.staging_belt + self.graphics.staging_belt .write_buffer( &mut encoder, - &self.camera_buf, + &self.graphics.camera_buf, 0, wgpu::BufferSize::new((camera_uniforms.len() * 4) as wgpu::BufferAddress).unwrap(), device, ) .copy_from_slice(bytemuck::cast_slice(&camera_uniforms)); //This code only needs to run when the uniforms change - for model in self.models.iter() { + for model in self.graphics.models.iter() { let model_uniforms = get_instances_buffer_data(&model.instances); - self.staging_belt + self.graphics.staging_belt .write_buffer( &mut encoder, &model.model_buf,//description of where data will be written when command is executed @@ -1029,7 +1043,7 @@ impl framework::Example for GraphicsData { ) .copy_from_slice(bytemuck::cast_slice(&model_uniforms)); } - self.staging_belt.finish(); + self.graphics.staging_belt.finish(); { let mut rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { @@ -1048,7 +1062,7 @@ impl framework::Example for GraphicsData { }, })], depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment { - view: &self.depth_view, + view: &self.graphics.depth_view, depth_ops: Some(wgpu::Operations { load: wgpu::LoadOp::Clear(1.0), store: false, @@ -1057,11 +1071,11 @@ impl framework::Example for GraphicsData { }), }); - rpass.set_bind_group(0, &self.bind_groups.camera, &[]); - rpass.set_bind_group(1, &self.bind_groups.skybox_texture, &[]); + rpass.set_bind_group(0, &self.graphics.bind_groups.camera, &[]); + rpass.set_bind_group(1, &self.graphics.bind_groups.skybox_texture, &[]); - rpass.set_pipeline(&self.pipelines.model); - for model in self.models.iter() { + rpass.set_pipeline(&self.graphics.pipelines.model); + for model in self.graphics.models.iter() { rpass.set_bind_group(2, &model.bind_group, &[]); rpass.set_vertex_buffer(0, model.vertex_buf.slice(..)); @@ -1071,18 +1085,18 @@ impl framework::Example for GraphicsData { } } - rpass.set_pipeline(&self.pipelines.skybox); + rpass.set_pipeline(&self.graphics.pipelines.skybox); rpass.draw(0..3, 0..1); } queue.submit(std::iter::once(encoder.finish())); - self.staging_belt.recall(); + self.graphics.staging_belt.recall(); } } fn main() { - framework::run::( + framework::run::( format!("Strafe Client v{}", env!("CARGO_PKG_VERSION") ).as_str() From b102319b331252fed59e08034df8f54e8848d263 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 19:45:01 -0700 Subject: [PATCH 245/482] implement Default for CollisionAttributes --- src/main.rs | 19 ++++++++----------- src/model.rs | 4 ++-- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main.rs b/src/main.rs index 498c013..4a219e6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -386,47 +386,44 @@ impl framework::Example for GlobalState { println!("models.len = {:?}", indexed_models.len()); indexed_models[0].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(10.,0.,-10.)), - color:glam::Vec4::ONE, - attributes:model::CollisionAttributes::contact(), + ..Default::default() }); //quad monkeys indexed_models[1].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,10.)), - color:glam::Vec4::ONE, - attributes:model::CollisionAttributes::contact(), + ..Default::default() }); indexed_models[1].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,10.)), color:glam::vec4(1.0,0.0,0.0,1.0), - attributes:model::CollisionAttributes::contact(), + ..Default::default() }); indexed_models[1].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(10.,5.,20.)), color:glam::vec4(0.0,1.0,0.0,1.0), - attributes:model::CollisionAttributes::contact(), + ..Default::default() }); indexed_models[1].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(20.,5.,20.)), color:glam::vec4(0.0,0.0,1.0,1.0), - attributes:model::CollisionAttributes::contact(), + ..Default::default() }); //decorative monkey indexed_models[1].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(15.,10.,15.)), color:glam::vec4(0.5,0.5,0.5,0.5), attributes:model::CollisionAttributes::Decoration, + ..Default::default() }); //teapot indexed_models[2].instances.push(ModelInstance{ transform:glam::Affine3A::from_scale_rotation_translation(glam::vec3(0.5, 1.0, 0.2),glam::quat(-0.22248298016985793,-0.839457167990537,-0.05603504040830783,-0.49261857546227916),glam::vec3(-10.,7.,10.)), - color:glam::Vec4::ONE, - attributes:model::CollisionAttributes::contact(), + ..Default::default() }); //ground indexed_models[3].instances.push(ModelInstance{ transform:glam::Affine3A::from_translation(glam::vec3(0.,0.,0.))*glam::Affine3A::from_scale(glam::vec3(160.0, 1.0, 160.0)), - color:glam::Vec4::ONE, - attributes:model::CollisionAttributes::contact(), + ..Default::default() }); let camera_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { diff --git a/src/model.rs b/src/model.rs index 820cac4..96df6ac 100644 --- a/src/model.rs +++ b/src/model.rs @@ -173,8 +173,8 @@ pub enum CollisionAttributes{ general:GameMechanicAttributes, }, } -impl CollisionAttributes{ - pub fn contact() -> Self { +impl std::default::Default for CollisionAttributes{ + fn default() -> Self { Self::Contact{ contacting:ContactingAttributes::default(), general:GameMechanicAttributes::default() From c8ec1f05d1bf4e391e0afe12d8a8593168cfed84 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 19:45:50 -0700 Subject: [PATCH 246/482] implement more attributes --- src/load_roblox.rs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 0f3159b..afa30c6 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -35,10 +35,10 @@ fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3)->crate::model: let mut intersecting=crate::model::IntersectingAttributes::default(); let mut contacting=crate::model::ContactingAttributes::default(); match name{ - // "Water"=>intersecting.water=Some(crate::model::IntersectingWater::default()), - // "Accelerator"=>(), - // "MapFinish"=>(), - // "MapAnticheat"=>(), + //"Water"=>intersecting.water=Some(crate::model::IntersectingWater{density:1.0,drag:1.0}), + "Accelerator"=>intersecting.accelerator=Some(crate::model::IntersectingAccelerator{acceleration:velocity}), + "MapFinish"=>general.zone=Some(crate::model::GameMechanicZone{mode_id:0,behaviour:crate::model::ZoneBehaviour::Finish}), + "MapAnticheat"=>general.zone=Some(crate::model::GameMechanicZone{mode_id:0,behaviour:crate::model::ZoneBehaviour::Anitcheat}), "Platform"=>general.stage_element=Some(crate::model::GameMechanicStageElement{ mode_id:0, stage_id:0, @@ -46,8 +46,8 @@ fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3)->crate::model: behaviour:crate::model::StageElementBehaviour::Platform, }), other=>{ - let regman=lazy_regex::regex!(r"^(Force)?(SpawnAt|Trigger|Teleport|Platform)(\d+)$"); - if let Some(captures) = regman.captures(other) { + if let Some(captures)=lazy_regex::regex!(r"^(Force)?(SpawnAt|Trigger|Teleport|Platform)(\d+)$") + .captures(other){ general.stage_element=Some(crate::model::GameMechanicStageElement{ mode_id:0, stage_id:captures[3].parse::().unwrap(), @@ -60,10 +60,16 @@ fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3)->crate::model: "Trigger"=>crate::model::StageElementBehaviour::Trigger, "Teleport"=>crate::model::StageElementBehaviour::Teleport, "Platform"=>crate::model::StageElementBehaviour::Platform, - _=>panic!("regex[2] messed up bad"), + _=>panic!("regex1[2] messed up bad"), } }) - + }else if let Some(captures)=lazy_regex::regex!(r"^Bonus(Finish|Anticheat)(\d+)$") + .captures(other){ + match &captures[1]{ + "Finish"=>general.zone=Some(crate::model::GameMechanicZone{mode_id:captures[2].parse::().unwrap(),behaviour:crate::model::ZoneBehaviour::Finish}), + "Anticheat"=>general.zone=Some(crate::model::GameMechanicZone{mode_id:captures[2].parse::().unwrap(),behaviour:crate::model::ZoneBehaviour::Anitcheat}), + _=>panic!("regex2[1] messed up bad"), + } } } } From f2c71caae39fc8c95a05bfc225b9709b133a98e2 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 3 Oct 2023 19:46:54 -0700 Subject: [PATCH 247/482] TEMP(for a long time): implement indexing attributes this is not very make invalid states unrepresentable of you --- src/load_roblox.rs | 28 +++++++++++++++++++++--- src/main.rs | 54 ++++++++++++++++++++++++++++++++++++++++++++++ src/model.rs | 27 +++++++++++++++++++++++ 3 files changed, 106 insertions(+), 3 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index afa30c6..bb10df4 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -217,9 +217,30 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index * glam::Affine3A::from_scale( glam::Vec3::new(size.x,size.y,size.z)/2.0 ); - if object.name=="MapStart"{ - spawn_point=model_transform.transform_point3(-glam::Vec3::Y)+glam::vec3(0.0,2.5+0.1,0.0); - println!("Found MapStart{:?}",spawn_point); + + //push TempIndexedAttributes + let mut temp_indexing_attributes=Vec::new(); + if let Some(attr)=match &object.name[..]{ + "MapStart"=>{ + spawn_point=model_transform.transform_point3(glam::Vec3::ZERO)+glam::vec3(0.0,2.5,0.0); + Some(crate::model::TempIndexedAttributes::Start{mode_id:0}) + }, + "UnorderedCheckpoint"=>Some(crate::model::TempIndexedAttributes::UnorderedCheckpoint{mode_id:0}), + other=>{ + let regman=lazy_regex::regex!(r"^(BonusStart|Spawn|OrderedCheckpoint)(\d+)$"); + if let Some(captures) = regman.captures(other) { + match &captures[1]{ + "BonusStart"=>Some(crate::model::TempIndexedAttributes::Start{mode_id:captures[2].parse::().unwrap()}), + "Spawn"=>Some(crate::model::TempIndexedAttributes::Spawn{mode_id:0,stage_id:captures[2].parse::().unwrap()}), + "OrderedCheckpoint"=>Some(crate::model::TempIndexedAttributes::OrderedCheckpoint{mode_id:0,checkpoint_id:captures[2].parse::().unwrap()}), + _=>None, + } + }else{ + None + } + } + }{ + temp_indexing_attributes.push(attr); } //TODO: also detect "CylinderMesh" etc here @@ -420,6 +441,7 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index transform:model_transform, color:glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), attributes:get_attributes(&object.name,*can_collide,glam::vec3(velocity.x,velocity.y,velocity.z)), + temp_indexing:temp_indexing_attributes, }); } } diff --git a/src/main.rs b/src/main.rs index 4a219e6..8e14f2a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -95,14 +95,68 @@ impl GlobalState{ } fn generate_model_physics(&mut self,indexed_models:&model::IndexedModelInstances){ + let mut starts=Vec::new(); + let mut spawns=Vec::new(); + let mut ordered_checkpoints=Vec::new(); + let mut unordered_checkpoints=Vec::new(); for model in &indexed_models.models{ //make aabb and run vertices to get realistic bounds for model_instance in &model.instances{ if let Some(model_physics)=body::ModelPhysics::from_model(model,model_instance){ + let model_id=self.physics.models.len() as u32; + //snoop it before it gets stolen + for attr in model_instance.temp_indexing.iter(){ + match attr{ + model::TempIndexedAttributes::Start{mode_id}=>starts.push((*mode_id,model_id)), + model::TempIndexedAttributes::Spawn{mode_id,stage_id}=>spawns.push((*mode_id,model_id,*stage_id)), + model::TempIndexedAttributes::OrderedCheckpoint{mode_id,checkpoint_id}=>ordered_checkpoints.push((*mode_id,model_id,*checkpoint_id)), + model::TempIndexedAttributes::UnorderedCheckpoint{mode_id}=>unordered_checkpoints.push((*mode_id,model_id)), + } + } + //steal it self.physics.models.push(model_physics); } } } + //I don't wanna write structs for temporary structures + //this code builds ModeDescriptions from the unsorted lists at the top of the function + starts.sort_by_key(|tup|tup.0); + let mut eshmep=std::collections::HashMap::new(); + let mut modedatas:Vec<(u32,Vec<(u32,u32)>,Vec<(u32,u32)>,Vec)>=starts.into_iter().enumerate().map(|(i,tup)|{ + eshmep.insert(tup.0,i); + (tup.1,Vec::new(),Vec::new(),Vec::new()) + }).collect(); + for tup in spawns{ + if let Some(mode_id)=eshmep.get(&tup.0){ + if let Some(modedata)=modedatas.get_mut(*mode_id){ + modedata.1.push((tup.2,tup.1)); + } + } + } + for tup in ordered_checkpoints{ + if let Some(mode_id)=eshmep.get(&tup.0){ + if let Some(modedata)=modedatas.get_mut(*mode_id){ + modedata.2.push((tup.2,tup.1)); + } + } + } + for tup in unordered_checkpoints{ + if let Some(mode_id)=eshmep.get(&tup.0){ + if let Some(modedata)=modedatas.get_mut(*mode_id){ + modedata.3.push(tup.1); + } + } + } + self.physics.modes.append(&mut modedatas.into_iter().map(|mut tup|{ + tup.1.sort_by_key(|tup|tup.0); + tup.2.sort_by_key(|tup|tup.0); + model::ModeDescription{ + start:tup.0, + spawns:tup.1.into_iter().map(|tup|tup.1).collect(), + ordered_checkpoints:tup.2.into_iter().map(|tup|tup.1).collect(), + unordered_checkpoints:tup.3, + } + }).collect()); println!("Physics Objects: {}",self.physics.models.len()); } fn generate_model_graphics(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,indexed_models:model::IndexedModelInstances){ diff --git a/src/model.rs b/src/model.rs index 96df6ac..0386abf 100644 --- a/src/model.rs +++ b/src/model.rs @@ -60,6 +60,17 @@ pub struct ModelInstance{ pub transform:glam::Affine3A, pub color:glam::Vec4,//transparency is in here pub attributes:CollisionAttributes, + pub temp_indexing:Vec, +} +impl std::default::Default for ModelInstance{ + fn default() -> Self { + Self{ + color:glam::Vec4::ONE, + transform:Default::default(), + attributes:Default::default(), + temp_indexing:Default::default(), + } + } } pub struct IndexedModelInstances{ pub textures:Vec,//RenderPattern @@ -75,6 +86,22 @@ pub struct ModeDescription{ pub ordered_checkpoints:Vec,//ordered_checkpoints[checkpoint_id]=model_id pub unordered_checkpoints:Vec,//unordered_checkpoints[checkpoint_id]=model_id } +pub enum TempIndexedAttributes{ + Start{ + mode_id:u32, + }, + Spawn{ + mode_id:u32, + stage_id:u32, + }, + OrderedCheckpoint{ + mode_id:u32, + checkpoint_id:u32, + }, + UnorderedCheckpoint{ + mode_id:u32, + }, +} //you have this effect while in contact #[derive(Clone)] From 66fa8fd637d572af3b6b221e1c3a2c20b80349ad Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 14:01:06 -0700 Subject: [PATCH 248/482] tabs --- src/body.rs | 72 ++++++++++++++++++++++++++--------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/body.rs b/src/body.rs index 8a8915b..193ae76 100644 --- a/src/body.rs +++ b/src/body.rs @@ -45,20 +45,20 @@ trait MyHash{ fn hash(&self) -> u64; } impl MyHash for Body { - fn hash(&self) -> u64 { + fn hash(&self) -> u64 { let mut hasher=std::collections::hash_map::DefaultHasher::new(); - for &el in self.position.as_ref().iter() { - std::hash::Hasher::write(&mut hasher, el.to_ne_bytes().as_slice()); - } - for &el in self.velocity.as_ref().iter() { - std::hash::Hasher::write(&mut hasher, el.to_ne_bytes().as_slice()); - } - for &el in self.acceleration.as_ref().iter() { - std::hash::Hasher::write(&mut hasher, el.to_ne_bytes().as_slice()); - } - std::hash::Hasher::write(&mut hasher, self.time.to_ne_bytes().as_slice()); + for &el in self.position.as_ref().iter() { + std::hash::Hasher::write(&mut hasher, el.to_ne_bytes().as_slice()); + } + for &el in self.velocity.as_ref().iter() { + std::hash::Hasher::write(&mut hasher, el.to_ne_bytes().as_slice()); + } + for &el in self.acceleration.as_ref().iter() { + std::hash::Hasher::write(&mut hasher, el.to_ne_bytes().as_slice()); + } + std::hash::Hasher::write(&mut hasher, self.time.to_ne_bytes().as_slice()); return std::hash::Hasher::finish(&hasher);//hash check to see if walk target is valid - } + } } pub enum MoveRestriction { @@ -80,9 +80,9 @@ impl InputState { } impl crate::instruction::InstructionEmitter for InputState{ fn next_instruction(&self, time_limit:crate::body::TIME) -> Option> { - //this is polled by PhysicsState for actions like Jump - //no, it has to be the other way around. physics is run up until the jump instruction, and then the jump instruction is pushed. - self.queue.get(0) + //this is polled by PhysicsState for actions like Jump + //no, it has to be the other way around. physics is run up until the jump instruction, and then the jump instruction is pushed. + self.queue.get(0) } } impl crate::instruction::InstructionConsumer for InputState{ @@ -171,12 +171,12 @@ pub struct Camera { #[inline] fn mat3_from_rotation_y_f64(angle: f64) -> glam::Mat3 { - let (sina, cosa) = angle.sin_cos(); - glam::Mat3::from_cols( - glam::Vec3::new(cosa as f32, 0.0, -sina as f32), - glam::Vec3::Y, - glam::Vec3::new(sina as f32, 0.0, cosa as f32), - ) + let (sina, cosa) = angle.sin_cos(); + glam::Mat3::from_cols( + glam::Vec3::new(cosa as f32, 0.0, -sina as f32), + glam::Vec3::Y, + glam::Vec3::new(sina as f32, 0.0, cosa as f32), + ) } #[inline] fn perspective_rh(fov_x_slope: f32, fov_y_slope: f32, z_near: f32, z_far: f32) -> glam::Mat4 { @@ -192,11 +192,11 @@ fn perspective_rh(fov_x_slope: f32, fov_y_slope: f32, z_near: f32, z_far: f32) - impl Camera { pub fn from_offset(offset:glam::Vec3,aspect:f32) -> Self { Self{ - offset, - angles: glam::DVec2::ZERO, - fov: glam::vec2(aspect,1.0), - sensitivity: glam::dvec2(1.0/6144.0,1.0/6144.0), - time: 0, + offset, + angles: glam::DVec2::ZERO, + fov: glam::vec2(aspect,1.0), + sensitivity: glam::dvec2(1.0/6144.0,1.0/6144.0), + time: 0, } } fn simulate_move_angles(&self, delta: glam::IVec2) -> glam::DVec2 { @@ -986,19 +986,19 @@ impl crate::instruction::InstructionEmitter for PhysicsState impl crate::instruction::InstructionConsumer for PhysicsState { fn process_instruction(&mut self, ins:TimedInstruction) { match &ins.instruction { - PhysicsInstruction::StrafeTick => (), - PhysicsInstruction::Input(InputInstruction::MoveMouse(_)) => (), - _=>println!("{:?}",ins), + PhysicsInstruction::StrafeTick => (), + PhysicsInstruction::Input(InputInstruction::MoveMouse(_)) => (), + _=>println!("{:?}",ins), } //selectively update body match &ins.instruction { - PhysicsInstruction::Input(InputInstruction::MoveMouse(_)) => (),//dodge time for mouse movement - PhysicsInstruction::Input(_) - |PhysicsInstruction::SetSpawnPosition(_) - |PhysicsInstruction::ReachWalkTargetVelocity - |PhysicsInstruction::CollisionStart(_) - |PhysicsInstruction::CollisionEnd(_) - |PhysicsInstruction::StrafeTick => self.advance_time(ins.time), + PhysicsInstruction::Input(InputInstruction::MoveMouse(_)) => (),//dodge time for mouse movement + PhysicsInstruction::Input(_) + |PhysicsInstruction::SetSpawnPosition(_) + |PhysicsInstruction::ReachWalkTargetVelocity + |PhysicsInstruction::CollisionStart(_) + |PhysicsInstruction::CollisionEnd(_) + |PhysicsInstruction::StrafeTick => self.advance_time(ins.time), } match ins.instruction { PhysicsInstruction::SetSpawnPosition(position)=>{ From 30cbbbca1b8d9178212abb1565be3c37c07845af Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 14:05:53 -0700 Subject: [PATCH 249/482] fix MapStart indexing bug --- src/body.rs | 4 ++-- src/load_roblox.rs | 22 ++++++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/body.rs b/src/body.rs index 193ae76..403f52e 100644 --- a/src/body.rs +++ b/src/body.rs @@ -474,9 +474,9 @@ impl ModelPhysics { } pub fn from_model(model:&crate::model::IndexedModel,instance:&crate::model::ModelInstance) -> Option { match &instance.attributes{ - crate::model::CollisionAttributes::Decoration=>None, crate::model::CollisionAttributes::Contact{contacting,general}=>Some(ModelPhysics::from_model_transform_attributes(model,&instance.transform,PhysicsCollisionAttributes::Contact{contacting:contacting.clone(),general:general.clone()})), - crate::model::CollisionAttributes::Intersect{intersecting,general}=>None,//Some(ModelPhysics::from_model_transform_attributes(model,&instance.transform,PhysicsCollisionAttributes::Intersecting{intersecting,general})), + crate::model::CollisionAttributes::Intersect{intersecting,general}=>Some(ModelPhysics::from_model_transform_attributes(model,&instance.transform,PhysicsCollisionAttributes::Intersect{intersecting:intersecting.clone(),general:general.clone()})), + crate::model::CollisionAttributes::Decoration=>None, } } pub fn unit_vertices(&self) -> [glam::Vec3;8] { diff --git a/src/load_roblox.rs b/src/load_roblox.rs index bb10df4..2e7beb6 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -30,7 +30,7 @@ fn get_texture_refs(dom:&rbx_dom_weak::WeakDom) -> Vec //next class objects } -fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3)->crate::model::CollisionAttributes{ +fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3,force_intersecting:bool)->crate::model::CollisionAttributes{ let mut general=crate::model::GameMechanicAttributes::default(); let mut intersecting=crate::model::IntersectingAttributes::default(); let mut contacting=crate::model::ContactingAttributes::default(); @@ -89,9 +89,21 @@ fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3)->crate::model: //WormholeIn# } } - return crate::model::CollisionAttributes::Contact{contacting,general}; + crate::model::CollisionAttributes::Contact{contacting,general} + }, + false=>if force_intersecting + ||general.jump_limit.is_some() + ||general.booster.is_some() + ||general.zone.is_some() + ||general.stage_element.is_some() + ||general.wormhole.is_some() + ||intersecting.water.is_some() + ||intersecting.accelerator.is_some() + { + crate::model::CollisionAttributes::Intersect{intersecting,general} + }else{ + crate::model::CollisionAttributes::Decoration }, - false=>return crate::model::CollisionAttributes::Decoration, } } @@ -219,6 +231,7 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index ); //push TempIndexedAttributes + let mut force_intersecting=false; let mut temp_indexing_attributes=Vec::new(); if let Some(attr)=match &object.name[..]{ "MapStart"=>{ @@ -240,6 +253,7 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index } } }{ + force_intersecting=true; temp_indexing_attributes.push(attr); } @@ -440,7 +454,7 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index indexed_models[model_id].instances.push(crate::model::ModelInstance { transform:model_transform, color:glam::vec4(color3.r as f32/255f32, color3.g as f32/255f32, color3.b as f32/255f32, 1.0-*transparency), - attributes:get_attributes(&object.name,*can_collide,glam::vec3(velocity.x,velocity.y,velocity.z)), + attributes:get_attributes(&object.name,*can_collide,glam::vec3(velocity.x,velocity.y,velocity.z),force_intersecting), temp_indexing:temp_indexing_attributes, }); } From 0ac49308a0438e2bc602abb5f87b013e8bbd807e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 14:07:20 -0700 Subject: [PATCH 250/482] Spawn & ForceSpawn attributes --- src/load_roblox.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 2e7beb6..b4dff5e 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -46,7 +46,7 @@ fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3,force_intersect behaviour:crate::model::StageElementBehaviour::Platform, }), other=>{ - if let Some(captures)=lazy_regex::regex!(r"^(Force)?(SpawnAt|Trigger|Teleport|Platform)(\d+)$") + if let Some(captures)=lazy_regex::regex!(r"^(Force)?(Spawn|SpawnAt|Trigger|Teleport|Platform)(\d+)$") .captures(other){ general.stage_element=Some(crate::model::GameMechanicStageElement{ mode_id:0, @@ -56,7 +56,7 @@ fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3,force_intersect None=>false, }, behaviour:match &captures[2]{ - "SpawnAt"=>crate::model::StageElementBehaviour::SpawnAt, + "Spawn"|"SpawnAt"=>crate::model::StageElementBehaviour::SpawnAt, "Trigger"=>crate::model::StageElementBehaviour::Trigger, "Teleport"=>crate::model::StageElementBehaviour::Teleport, "Platform"=>crate::model::StageElementBehaviour::Platform, @@ -240,11 +240,11 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index }, "UnorderedCheckpoint"=>Some(crate::model::TempIndexedAttributes::UnorderedCheckpoint{mode_id:0}), other=>{ - let regman=lazy_regex::regex!(r"^(BonusStart|Spawn|OrderedCheckpoint)(\d+)$"); + let regman=lazy_regex::regex!(r"^(BonusStart|Spawn|ForceSpawn|OrderedCheckpoint)(\d+)$"); if let Some(captures) = regman.captures(other) { match &captures[1]{ "BonusStart"=>Some(crate::model::TempIndexedAttributes::Start{mode_id:captures[2].parse::().unwrap()}), - "Spawn"=>Some(crate::model::TempIndexedAttributes::Spawn{mode_id:0,stage_id:captures[2].parse::().unwrap()}), + "Spawn"|"ForceSpawn"=>Some(crate::model::TempIndexedAttributes::Spawn{mode_id:0,stage_id:captures[2].parse::().unwrap()}), "OrderedCheckpoint"=>Some(crate::model::TempIndexedAttributes::OrderedCheckpoint{mode_id:0,checkpoint_id:captures[2].parse::().unwrap()}), _=>None, } From f30f246e5f820ed8cddc57c150e9f4fb6f99f4b7 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 14:07:57 -0700 Subject: [PATCH 251/482] sens TOO DAMN HIGH --- src/body.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/body.rs b/src/body.rs index 403f52e..c60be98 100644 --- a/src/body.rs +++ b/src/body.rs @@ -195,7 +195,7 @@ impl Camera { offset, angles: glam::DVec2::ZERO, fov: glam::vec2(aspect,1.0), - sensitivity: glam::dvec2(1.0/6144.0,1.0/6144.0), + sensitivity: glam::dvec2(1.0/16384.0,1.0/16384.0), time: 0, } } From fb2e2afeb930e3e76bfe0ab73470918cc708bb79 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 14:13:25 -0700 Subject: [PATCH 252/482] hashmap map ids into internal structure ids --- src/body.rs | 8 ++++++++ src/main.rs | 13 +++++++++++-- src/model.rs | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/body.rs b/src/body.rs index c60be98..c05480e 100644 --- a/src/body.rs +++ b/src/body.rs @@ -329,6 +329,7 @@ pub struct PhysicsState{ pub models:Vec, pub modes:Vec, + pub mode_from_mode_id:std::collections::HashMap::, //the spawn point is where you spawn when you load into the map. //This is not the same as Reset which teleports you to Spawn0 pub spawn_point:glam::Vec3, @@ -557,6 +558,13 @@ impl PhysicsState { self.models.clear(); self.modes.clear(); } + pub fn get_mode(&self,mode_id:u32)->Option<&crate::model::ModeDescription>{ + if let Some(&mode)=self.mode_from_mode_id.get(&mode_id){ + self.modes.get(mode) + }else{ + None + } + } //tickless gaming pub fn run(&mut self, time_limit:TIME){ //prepare is ommitted - everything is done via instructions. diff --git a/src/main.rs b/src/main.rs index 8e14f2a..a231736 100644 --- a/src/main.rs +++ b/src/main.rs @@ -147,14 +147,22 @@ impl GlobalState{ } } } + let num_modes=self.physics.modes.len(); + for (mode_id,mode) in eshmep{ + self.physics.mode_from_mode_id.insert(mode_id,num_modes+mode); + } self.physics.modes.append(&mut modedatas.into_iter().map(|mut tup|{ tup.1.sort_by_key(|tup|tup.0); tup.2.sort_by_key(|tup|tup.0); + let mut eshmep1=std::collections::HashMap::new(); + let mut eshmep2=std::collections::HashMap::new(); model::ModeDescription{ start:tup.0, - spawns:tup.1.into_iter().map(|tup|tup.1).collect(), - ordered_checkpoints:tup.2.into_iter().map(|tup|tup.1).collect(), + spawns:tup.1.into_iter().enumerate().map(|(i,tup)|{eshmep1.insert(tup.0,i);tup.1}).collect(), + ordered_checkpoints:tup.2.into_iter().enumerate().map(|(i,tup)|{eshmep2.insert(tup.0,i);tup.1}).collect(), unordered_checkpoints:tup.3, + spawn_from_stage_id:eshmep1, + ordered_checkpoint_from_checkpoint_id:eshmep2, } }).collect()); println!("Physics Objects: {}",self.physics.models.len()); @@ -590,6 +598,7 @@ impl framework::Example for GlobalState { world:body::WorldState{}, game:body::GameMechanicsState::default(), modes:Vec::new(), + mode_from_mode_id:std::collections::HashMap::new(), }; //load textures diff --git a/src/model.rs b/src/model.rs index 0386abf..6434734 100644 --- a/src/model.rs +++ b/src/model.rs @@ -85,6 +85,24 @@ pub struct ModeDescription{ pub spawns:Vec,//spawns[spawn_id]=model_id pub ordered_checkpoints:Vec,//ordered_checkpoints[checkpoint_id]=model_id pub unordered_checkpoints:Vec,//unordered_checkpoints[checkpoint_id]=model_id + pub spawn_from_stage_id:std::collections::HashMap::, + pub ordered_checkpoint_from_checkpoint_id:std::collections::HashMap::, +} +impl ModeDescription{ + pub fn get_spawn_model_id(&self,stage_id:u32)->Option<&u32>{ + if let Some(&spawn)=self.spawn_from_stage_id.get(&stage_id){ + self.spawns.get(spawn) + }else{ + None + } + } + pub fn get_ordered_checkpoint_model_id(&self,checkpoint_id:u32)->Option<&u32>{ + if let Some(&checkpoint)=self.ordered_checkpoint_from_checkpoint_id.get(&checkpoint_id){ + self.ordered_checkpoints.get(checkpoint) + }else{ + None + } + } } pub enum TempIndexedAttributes{ Start{ From b8f13539db98805fa98a8f1ce2f8ebb722bacd2c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 14:15:04 -0700 Subject: [PATCH 253/482] runtime attributes + implement model intersection (but not collision end) --- src/body.rs | 135 ++++++++++++++++++++++++++++++++++++++-------------- src/main.rs | 3 +- 2 files changed, 102 insertions(+), 36 deletions(-) diff --git a/src/body.rs b/src/body.rs index c05480e..71f089f 100644 --- a/src/body.rs +++ b/src/body.rs @@ -221,13 +221,13 @@ impl Camera { } pub struct GameMechanicsState{ - pub spawn_id:u32, + pub stage_id:u32, //jump_counts:HashMap, } impl std::default::Default for GameMechanicsState{ fn default() -> Self { Self{ - spawn_id:0, + stage_id:0, } } } @@ -317,7 +317,8 @@ pub struct PhysicsState{ pub world:WorldState,//currently there is only one state the world can be in pub game:GameMechanicsState, pub style:StyleModifiers, - pub contacts:std::collections::HashSet::, + pub contacts:std::collections::HashMap::, + pub intersects:std::collections::HashMap::, //pub intersections: Vec, //camera must exist in state because wormholes modify the camera, also camera punch pub camera:Camera, @@ -459,6 +460,7 @@ pub struct ModelPhysics { //A model is a thing that has a hitbox. can be represented by a list of TreyMesh-es //in this iteration, all it needs is extents. mesh: TreyMesh, + transform:glam::Affine3A, attributes:PhysicsCollisionAttributes, } @@ -471,6 +473,7 @@ impl ModelPhysics { Self{ mesh:aabb, attributes, + transform:transform.clone(), } } pub fn from_model(model:&crate::model::IndexedModel,instance:&crate::model::ModelInstance) -> Option { @@ -557,6 +560,8 @@ impl PhysicsState { pub fn clear(&mut self){ self.models.clear(); self.modes.clear(); + self.contacts.clear(); + self.intersects.clear(); } pub fn get_mode(&self,mode_id:u32)->Option<&crate::model::ModeDescription>{ if let Some(&mode)=self.mode_from_mode_id.get(&mode_id){ @@ -591,7 +596,7 @@ impl PhysicsState { } fn contact_constrain_velocity(&self,velocity:&mut glam::Vec3){ - for contact in self.contacts.iter() { + for (_,contact) in &self.contacts { let n=contact.normal(&self.models); let d=velocity.dot(n); if d<0f32{ @@ -600,7 +605,7 @@ impl PhysicsState { } } fn contact_constrain_acceleration(&self,acceleration:&mut glam::Vec3){ - for contact in self.contacts.iter() { + for (_,contact) in &self.contacts { let n=contact.normal(&self.models); let d=acceleration.dot(n); if d<0f32{ @@ -973,12 +978,19 @@ impl crate::instruction::InstructionEmitter for PhysicsState //JUST POLLING!!! NO MUTATION let mut collector = crate::instruction::InstructionCollector::new(time_limit); //check for collision stop instructions with curent contacts - for collision_data in self.contacts.iter() { + for (_,collision_data) in &self.contacts { collector.collect(self.predict_collision_end(self.time,time_limit,collision_data)); } + // for collision_data in &self.intersects{ + // collector.collect(self.predict_collision_end2(self.time,time_limit,collision_data)); + // } //check for collision start instructions (against every part in the game with no optimization!!) for i in 0..self.models.len() { - collector.collect(self.predict_collision_start(self.time,time_limit,i as u32)); + let i=i as u32; + if self.contacts.contains_key(&i)||self.intersects.contains_key(&i){ + continue; + } + collector.collect(self.predict_collision_start(self.time,time_limit,i)); } if self.grounded { //walk maintenance @@ -1013,37 +1025,90 @@ impl crate::instruction::InstructionConsumer for PhysicsStat self.spawn_point=position; } PhysicsInstruction::CollisionStart(c) => { - //check ground - match &c.face { - AabbFace::Top => { - //ground - self.grounded=true; - }, - _ => (), - } - self.contacts.insert(c); - //flatten v - let mut v=self.body.velocity; - self.contact_constrain_velocity(&mut v); - self.body.velocity=v; - if self.grounded&&self.style.get_control(StyleModifiers::CONTROL_JUMP,self.controls){ - self.jump(); + let model=c.model(&self.models).unwrap(); + match &model.attributes{ + PhysicsCollisionAttributes::Contact{contacting,general}=>{ + match &contacting.surf{ + Some(surf)=>println!("I'm surfing!"), + None=>match &c.face { + AabbFace::Top => { + //ground + self.grounded=true; + }, + _ => (), + }, + } + match &general.booster{ + Some(booster)=>self.body.velocity+=booster.velocity, + None=>(), + } + match &general.stage_element{ + Some(stage_element)=>{ + if stage_element.force||self.game.stage_id(), + crate::model::StageElementBehaviour::Trigger + |crate::model::StageElementBehaviour::Teleport=>{ + //TODO make good + if let Some(mode)=self.get_mode(stage_element.mode_id){ + if let Some(&spawn)=mode.get_spawn_model_id(self.game.stage_id){ + if let Some(model)=self.models.get(spawn as usize){ + self.body.position=model.transform.transform_point3(glam::Vec3::Y)+glam::Vec3::Y*(self.style.hitbox_halfsize.y+0.1); + //manual clear //for c in self.contacts{process_instruction(CollisionEnd(c))} + self.contacts.clear(); + self.intersects.clear(); + self.body.acceleration=self.style.gravity; + self.walk.state=WalkEnum::Reached; + self.grounded=false; + }else{println!("bad1");} + }else{println!("bad2");} + }else{println!("bad3");} + }, + crate::model::StageElementBehaviour::Platform=>(), + } + }, + None=>(), + } + //check ground + self.contacts.insert(c.model,c); + //flatten v + let mut v=self.body.velocity; + self.contact_constrain_velocity(&mut v); + self.body.velocity=v; + if self.grounded&&self.style.get_control(StyleModifiers::CONTROL_JUMP,self.controls){ + self.jump(); + } + self.refresh_walk_target(); + }, + PhysicsCollisionAttributes::Intersect{intersecting,general}=>{ + //I think that setting the velocity to 0 was preventing surface contacts from entering an infinite loop + self.intersects.insert(c.model,c); + }, } - self.refresh_walk_target(); }, PhysicsInstruction::CollisionEnd(c) => { - self.contacts.remove(&c);//remove contact before calling contact_constrain_acceleration - let mut a=self.style.gravity; - self.contact_constrain_acceleration(&mut a); - self.body.acceleration=a; - //check ground - match &c.face { - AabbFace::Top => { - self.grounded=false; - }, - _ => (), - } - self.refresh_walk_target(); + let model=c.model(&self.models).unwrap(); + match &model.attributes{ + PhysicsCollisionAttributes::Contact{contacting,general}=>{ + self.contacts.remove(&c.model);//remove contact before calling contact_constrain_acceleration + let mut a=self.style.gravity; + self.contact_constrain_acceleration(&mut a); + self.body.acceleration=a; + //check ground + match &c.face { + AabbFace::Top => { + self.grounded=false; + }, + _ => (), + } + self.refresh_walk_target(); + }, + PhysicsCollisionAttributes::Intersect{intersecting,general}=>{ + self.intersects.remove(&c.model); + }, + } }, PhysicsInstruction::StrafeTick => { let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); diff --git a/src/main.rs b/src/main.rs index a231736..2cb478a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -589,7 +589,8 @@ impl framework::Example for GlobalState { time: 0, style:body::StyleModifiers::default(), grounded: false, - contacts: std::collections::HashSet::new(), + contacts: std::collections::HashMap::new(), + intersects: std::collections::HashMap::new(), models: Vec::new(), walk: body::WalkState::new(), camera: body::Camera::from_offset(glam::vec3(0.0,4.5-2.5,0.0),(config.width as f32)/(config.height as f32)), From 55eebba1c5de823aedb7a84df591bb5c0024aa1d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 14:15:53 -0700 Subject: [PATCH 254/482] fiddle with rustings --- src/main.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 2cb478a..c9461fd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -104,8 +104,8 @@ impl GlobalState{ for model_instance in &model.instances{ if let Some(model_physics)=body::ModelPhysics::from_model(model,model_instance){ let model_id=self.physics.models.len() as u32; - //snoop it before it gets stolen - for attr in model_instance.temp_indexing.iter(){ + self.physics.models.push(model_physics); + for attr in &model_instance.temp_indexing{ match attr{ model::TempIndexedAttributes::Start{mode_id}=>starts.push((*mode_id,model_id)), model::TempIndexedAttributes::Spawn{mode_id,stage_id}=>spawns.push((*mode_id,model_id,*stage_id)), @@ -113,8 +113,6 @@ impl GlobalState{ model::TempIndexedAttributes::UnorderedCheckpoint{mode_id}=>unordered_checkpoints.push((*mode_id,model_id)), } } - //steal it - self.physics.models.push(model_physics); } } } @@ -236,7 +234,7 @@ impl GlobalState{ //the models received here are supposed to be tightly packed, i.e. no code needs to check if two models are using the same groups. let indexed_models_len=indexed_models.models.len(); let mut unique_texture_models=Vec::with_capacity(indexed_models_len); - for mut model in indexed_models.models.into_iter(){ + for model in indexed_models.models.into_iter(){ //convert ModelInstance into ModelGraphicsInstance let instances:Vec=model.instances.into_iter().filter_map(|instance|{ if instance.color.w==0.0{ From 4943bc6a7ff838e087f28dc387cb6d8463eeae58 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 14:16:04 -0700 Subject: [PATCH 255/482] edit normal mapping comments --- src/load_roblox.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index b4dff5e..3df6e01 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -368,17 +368,17 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index primitives::Primitives::Cylinder=>RobloxBasePartDescription::Cylinder, //use front face texture first and use top face texture as a fallback primitives::Primitives::Wedge=>RobloxBasePartDescription::Wedge([ - f0,//Wedge::Right - if f5.is_some(){f5}else{f1},//Wedge::TopFront - f2,//Wedge::Back - f3,//Wedge::Left - f4,//Wedge::Bottom + f0,//Cube::Right->Wedge::Right + if f5.is_some(){f5}else{f1},//Cube::Front|Cube::Top->Wedge::TopFront + f2,//Cube::Back->Wedge::Back + f3,//Cube::Left->Wedge::Left + f4,//Cube::Bottom->Wedge::Bottom ]), primitives::Primitives::CornerWedge=>RobloxBasePartDescription::CornerWedge([ - f0,//CornerWedge::Right - f1,//CornerWedge::Top - f4,//CornerWedge::Bottom - f5,//CornerWedge::Front + f0,//Cube::Right->CornerWedge::Right + f1,//Cube::Top->CornerWedge::Top + f4,//Cube::Bottom->CornerWedge::Bottom + f5,//Cube::Front->CornerWedge::Front ]), }; //make new model if unit cube has not been created before From 7c8bc8d647b0e56a238781617b680999d374699f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 14:16:11 -0700 Subject: [PATCH 256/482] reset stage id on map change --- src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.rs b/src/main.rs index c9461fd..0fab7fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -912,6 +912,7 @@ impl framework::Example for GlobalState { //if generate_indexed_models succeeds, clear the previous ones self.physics.clear(); self.graphics.clear(); + self.physics.game.stage_id=0; self.generate_model_physics(&indexed_model_instances); self.generate_model_graphics(device,queue,indexed_model_instances); //manual reset From f2dfb438d00a1e3655c354bb3c5e1c7f1949c041 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 02:04:01 -0700 Subject: [PATCH 257/482] add parking_lot dep --- Cargo.lock | 1 + Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 2a3a157..0ff767f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1692,6 +1692,7 @@ dependencies = [ "lazy-regex", "log", "obj", + "parking_lot", "pollster", "rbx_binary", "rbx_dom_weak", diff --git a/Cargo.toml b/Cargo.toml index 5138640..fa60e97 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ glam = "0.24.1" lazy-regex = "3.0.2" log = "0.4.20" obj = "0.10.2" +parking_lot = "0.12.1" pollster = "0.3.0" rbx_binary = "0.7.1" rbx_dom_weak = "2.5.0" From bd6cd5eacc7ad61b78513bacd088c4fc1c9d0377 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 01:30:33 -0700 Subject: [PATCH 258/482] worker module --- src/body.rs | 2 +- src/main.rs | 1 + src/worker.rs | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/worker.rs diff --git a/src/body.rs b/src/body.rs index 71f089f..6e4727c 100644 --- a/src/body.rs +++ b/src/body.rs @@ -34,7 +34,7 @@ pub enum InputInstruction { //for interpolation / networking / playback reasons, most playback heads will always want //to be 1 instruction ahead to generate the next state for interpolation. } - +#[derive(Clone,Debug)] pub struct Body { position: glam::Vec3,//I64 where 2^32 = 1 u velocity: glam::Vec3,//I64 where 2^32 = 1 u/s diff --git a/src/main.rs b/src/main.rs index 0fab7fe..053279d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ mod framework; mod primitives; mod instruction; mod load_roblox; +mod worker; struct Entity { index_count: u32, diff --git a/src/worker.rs b/src/worker.rs new file mode 100644 index 0000000..2e457cf --- /dev/null +++ b/src/worker.rs @@ -0,0 +1,84 @@ +use std::thread; +use std::sync::{mpsc,Arc}; +use parking_lot::Mutex; + +//The goal here is to have a worker thread that parks itself when it runs out of work. +//The worker thread publishes the result of its work back to the worker object for every item in the work queue. +//The physics (target use case) knows when it has not changed the body, so not updating the value is also an option. + +struct Worker { + sender: mpsc::Sender, + value:Arc>, +} + +impl Worker { + fn newValue+Send+'static>(value:Value,f:F) -> Self { + let (sender, receiver) = mpsc::channel::(); + let ret=Self { + sender, + value:Arc::new(Mutex::new(value)), + }; + let value=ret.value.clone(); + thread::spawn(move || { + loop { + match receiver.recv() { + Ok(task) => { + println!("Worker got a task"); + // Process the task + let v=f(task);//make sure function is evaluated before lock is acquired + *value.lock()=v; + } + Err(_) => { + println!("Worker stopping.",); + break; + } + } + } + }); + ret + } + + fn send(&self,task:Task)->Result<(), mpsc::SendError>{ + self.sender.send(task) + } + + fn grab_clone(&self)->Value{ + self.value.lock().clone() + } +} + +#[test]//How to run this test with printing: cargo test --release -- --nocapture +fn test_worker() { + println!("hiiiii"); + // Create the worker thread + let worker = Worker::new(crate::body::Body::with_pva(glam::Vec3::ZERO,glam::Vec3::ZERO,glam::Vec3::ZERO), + |_|crate::body::Body::with_pva(glam::Vec3::ONE,glam::Vec3::ONE,glam::Vec3::ONE) + ); + + // Send tasks to the worker + for i in 0..5 { + let task = crate::instruction::TimedInstruction{ + time:0, + instruction:crate::body::PhysicsInstruction::StrafeTick, + }; + worker.send(task).unwrap(); + } + + // Optional: Signal the worker to stop (in a real-world scenario) + // sender.send("STOP".to_string()).unwrap(); + + // Sleep to allow the worker thread to finish processing + thread::sleep(std::time::Duration::from_secs(2)); + + // Send a new task + let task = crate::instruction::TimedInstruction{ + time:0, + instruction:crate::body::PhysicsInstruction::StrafeTick, + }; + worker.send(task).unwrap(); + + println!("value={:?}",worker.grab_clone()); + + // wait long enough to see print from final task + thread::sleep(std::time::Duration::from_secs(1)); +} From f2e4286a084574508c1da6abee610e3719c17f0c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 15:34:52 -0700 Subject: [PATCH 259/482] spawn_point is part of building --- src/body.rs | 6 ------ src/main.rs | 5 +---- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/body.rs b/src/body.rs index 6e4727c..1ca27e9 100644 --- a/src/body.rs +++ b/src/body.rs @@ -14,8 +14,6 @@ pub enum PhysicsInstruction { // ) //InputInstructions conditionally activate RefreshWalkTarget (by doing what SetWalkTargetVelocity used to do and then flagging it) Input(InputInstruction), - //temp - SetSpawnPosition(glam::Vec3), } #[derive(Debug)] pub enum InputInstruction { @@ -1014,16 +1012,12 @@ impl crate::instruction::InstructionConsumer for PhysicsStat match &ins.instruction { PhysicsInstruction::Input(InputInstruction::MoveMouse(_)) => (),//dodge time for mouse movement PhysicsInstruction::Input(_) - |PhysicsInstruction::SetSpawnPosition(_) |PhysicsInstruction::ReachWalkTargetVelocity |PhysicsInstruction::CollisionStart(_) |PhysicsInstruction::CollisionEnd(_) |PhysicsInstruction::StrafeTick => self.advance_time(ins.time), } match ins.instruction { - PhysicsInstruction::SetSpawnPosition(position)=>{ - self.spawn_point=position; - } PhysicsInstruction::CollisionStart(c) => { let model=c.model(&self.models).unwrap(); match &model.attributes{ diff --git a/src/main.rs b/src/main.rs index 053279d..c69e46d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -914,14 +914,11 @@ impl framework::Example for GlobalState { self.physics.clear(); self.graphics.clear(); self.physics.game.stage_id=0; + self.physics.spawn_point=spawn_point; self.generate_model_physics(&indexed_model_instances); self.generate_model_graphics(device,queue,indexed_model_instances); //manual reset let time=self.physics.time; - instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ - time, - instruction: body::PhysicsInstruction::SetSpawnPosition(spawn_point), - }); instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ time, instruction: body::PhysicsInstruction::Input(body::InputInstruction::Reset), From 12a4bf79485bc64700c8d6e299a0e4072e27334e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 15:58:02 -0700 Subject: [PATCH 260/482] rename body to physics --- src/instruction.rs | 8 ++++---- src/main.rs | 30 +++++++++++++++--------------- src/{body.rs => physics.rs} | 0 src/worker.rs | 8 ++++---- 4 files changed, 23 insertions(+), 23 deletions(-) rename src/{body.rs => physics.rs} (100%) diff --git a/src/instruction.rs b/src/instruction.rs index ece33d3..3508b93 100644 --- a/src/instruction.rs +++ b/src/instruction.rs @@ -1,11 +1,11 @@ #[derive(Debug)] pub struct TimedInstruction { - pub time: crate::body::TIME, + pub time: crate::physics::TIME, pub instruction: I, } pub trait InstructionEmitter { - fn next_instruction(&self, time_limit:crate::body::TIME) -> Option>; + fn next_instruction(&self, time_limit:crate::physics::TIME) -> Option>; } pub trait InstructionConsumer { fn process_instruction(&mut self, instruction:TimedInstruction); @@ -13,11 +13,11 @@ pub trait InstructionConsumer { //PROPER PRIVATE FIELDS!!! pub struct InstructionCollector { - time: crate::body::TIME, + time: crate::physics::TIME, instruction: Option, } impl InstructionCollector { - pub fn new(time:crate::body::TIME) -> Self { + pub fn new(time:crate::physics::TIME) -> Self { Self{ time, instruction:None diff --git a/src/main.rs b/src/main.rs index c69e46d..53c14e2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,17 @@ use std::{borrow::Cow, time::Instant}; use wgpu::{util::DeviceExt, AstcBlock, AstcChannel}; use model::{Vertex,ModelInstance,ModelGraphicsInstance}; -use body::{InputInstruction, PhysicsInstruction}; +use physics::{InputInstruction, PhysicsInstruction}; use instruction::{TimedInstruction, InstructionConsumer}; -mod body; mod model; mod zeroes; +mod worker; +mod physics; mod framework; mod primitives; mod instruction; mod load_roblox; -mod worker; struct Entity { index_count: u32, @@ -67,7 +67,7 @@ pub struct GlobalState{ start_time: std::time::Instant, manual_mouse_lock:bool, graphics:GraphicsState, - physics:body::PhysicsState, + physics:physics::PhysicsState, } impl GlobalState{ @@ -103,7 +103,7 @@ impl GlobalState{ for model in &indexed_models.models{ //make aabb and run vertices to get realistic bounds for model_instance in &model.instances{ - if let Some(model_physics)=body::ModelPhysics::from_model(model,model_instance){ + if let Some(model_physics)=physics::ModelPhysics::from_model(model,model_instance){ let model_id=self.physics.models.len() as u32; self.physics.models.push(model_physics); for attr in &model_instance.temp_indexing{ @@ -408,7 +408,7 @@ fn get_instances_buffer_data(instances:&[ModelGraphicsInstance]) -> Vec { raw } -fn to_uniform_data(camera: &body::Camera, pos: glam::Vec3) -> [f32; 16 * 3 + 4] { +fn to_uniform_data(camera: &physics::Camera, pos: glam::Vec3) -> [f32; 16 * 3 + 4] { let proj=camera.proj(); let proj_inv = proj.inverse(); let view=camera.view(pos); @@ -582,21 +582,21 @@ impl framework::Example for GlobalState { source: wgpu::ShaderSource::Wgsl(Cow::Borrowed(include_str!("shader.wgsl"))), }); - let physics = body::PhysicsState { + let physics = physics::PhysicsState { spawn_point:glam::vec3(0.0,50.0,0.0), - body: body::Body::with_pva(glam::vec3(0.0,50.0,0.0),glam::vec3(0.0,0.0,0.0),glam::vec3(0.0,-100.0,0.0)), + body: physics::Body::with_pva(glam::vec3(0.0,50.0,0.0),glam::vec3(0.0,0.0,0.0),glam::vec3(0.0,-100.0,0.0)), time: 0, - style:body::StyleModifiers::default(), + style:physics::StyleModifiers::default(), grounded: false, contacts: std::collections::HashMap::new(), intersects: std::collections::HashMap::new(), models: Vec::new(), - walk: body::WalkState::new(), - camera: body::Camera::from_offset(glam::vec3(0.0,4.5-2.5,0.0),(config.width as f32)/(config.height as f32)), - mouse_interpolation: body::MouseInterpolationState::new(), + walk: physics::WalkState::new(), + camera: physics::Camera::from_offset(glam::vec3(0.0,4.5-2.5,0.0),(config.width as f32)/(config.height as f32)), + mouse_interpolation: physics::MouseInterpolationState::new(), controls: 0, - world:body::WorldState{}, - game:body::GameMechanicsState::default(), + world:physics::WorldState{}, + game:physics::GameMechanicsState::default(), modes:Vec::new(), mode_from_mode_id:std::collections::HashMap::new(), }; @@ -921,7 +921,7 @@ impl framework::Example for GlobalState { let time=self.physics.time; instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ time, - instruction: body::PhysicsInstruction::Input(body::InputInstruction::Reset), + instruction: PhysicsInstruction::Input(InputInstruction::Reset), }); }else{ println!("No modeldatas were generated"); diff --git a/src/body.rs b/src/physics.rs similarity index 100% rename from src/body.rs rename to src/physics.rs diff --git a/src/worker.rs b/src/worker.rs index 2e457cf..a28b77b 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -51,15 +51,15 @@ impl Worker { fn test_worker() { println!("hiiiii"); // Create the worker thread - let worker = Worker::new(crate::body::Body::with_pva(glam::Vec3::ZERO,glam::Vec3::ZERO,glam::Vec3::ZERO), - |_|crate::body::Body::with_pva(glam::Vec3::ONE,glam::Vec3::ONE,glam::Vec3::ONE) + let worker = Worker::new(crate::physics::Body::with_pva(glam::Vec3::ZERO,glam::Vec3::ZERO,glam::Vec3::ZERO), + |_|crate::physics::Body::with_pva(glam::Vec3::ONE,glam::Vec3::ONE,glam::Vec3::ONE) ); // Send tasks to the worker for i in 0..5 { let task = crate::instruction::TimedInstruction{ time:0, - instruction:crate::body::PhysicsInstruction::StrafeTick, + instruction:crate::physics::PhysicsInstruction::StrafeTick, }; worker.send(task).unwrap(); } @@ -73,7 +73,7 @@ fn test_worker() { // Send a new task let task = crate::instruction::TimedInstruction{ time:0, - instruction:crate::body::PhysicsInstruction::StrafeTick, + instruction:crate::physics::PhysicsInstruction::StrafeTick, }; worker.send(task).unwrap(); From 1cb0d6e58601bb6cad5a9178ce942f027734e92c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 22:20:10 -0700 Subject: [PATCH 261/482] bro it takes 4 seconds to build now --- Cargo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fa60e97..6bf20b5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ rbx_xml = "0.13.1" wgpu = "0.17.0" winit = "0.28.6" -[profile.release] -lto = true -strip = true -codegen-units = 1 +#[profile.release] +#lto = true +#strip = true +#codegen-units = 1 From 8cf66f344619eccd01625506dba86214e122bb3e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 23:51:39 -0700 Subject: [PATCH 262/482] print less --- src/physics.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/physics.rs b/src/physics.rs index 1ca27e9..e3ee7b0 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -1006,7 +1006,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat match &ins.instruction { PhysicsInstruction::StrafeTick => (), PhysicsInstruction::Input(InputInstruction::MoveMouse(_)) => (), - _=>println!("{:?}",ins), + _=>println!("{}|{:?}",ins.time,ins.instruction), } //selectively update body match &ins.instruction { From 6a9af0441fc5930b88cf34f4ca8a52fe62878ac3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 20:04:04 -0700 Subject: [PATCH 263/482] move physics to its own thread --- src/main.rs | 256 +++++++++++++++------------------ src/physics.rs | 382 ++++++++++++++++++++++++++++++++++++------------- src/worker.rs | 10 +- 3 files changed, 397 insertions(+), 251 deletions(-) diff --git a/src/main.rs b/src/main.rs index 53c14e2..cfed437 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,14 +44,65 @@ pub struct GraphicsPipelines{ model: wgpu::RenderPipeline, } +pub struct GraphicsCamera{ + screen_size: glam::UVec2, + fov: glam::Vec2,//slope + //camera angles and such are extrapolated and passed in every time +} + +#[inline] +fn perspective_rh(fov_x_slope: f32, fov_y_slope: f32, z_near: f32, z_far: f32) -> glam::Mat4 { + //glam_assert!(z_near > 0.0 && z_far > 0.0); + let r = z_far / (z_near - z_far); + glam::Mat4::from_cols( + glam::Vec4::new(1.0/fov_x_slope, 0.0, 0.0, 0.0), + glam::Vec4::new(0.0, 1.0/fov_y_slope, 0.0, 0.0), + glam::Vec4::new(0.0, 0.0, r, -1.0), + glam::Vec4::new(0.0, 0.0, r * z_near, 0.0), + ) +} +impl GraphicsCamera{ + pub fn new(screen_size:glam::UVec2,fov_y:f32)->Self{ + Self{ + screen_size, + fov: glam::vec2(fov_y*(screen_size.x as f32)/(screen_size.y as f32),fov_y), + } + } + pub fn proj(&self)->glam::Mat4{ + perspective_rh(self.fov.x, self.fov.y, 0.5, 2000.0) + } + pub fn view(&self,pos:glam::Vec3,angles:glam::Vec2)->glam::Mat4{ + //f32 good enough for view matrix + glam::Mat4::from_translation(pos) * glam::Mat4::from_euler(glam::EulerRot::YXZ, angles.x, angles.y, 0f32) + } + pub fn set_screen_size(&mut self,screen_size:glam::UVec2){ + self.screen_size=screen_size; + self.fov.x=self.fov.y*(screen_size.x as f32)/(screen_size.y as f32); + } + + pub fn to_uniform_data(&self,(pos,angles): (glam::Vec3,glam::Vec2)) -> [f32; 16 * 3 + 4] { + let proj=self.proj(); + let proj_inv = proj.inverse(); + let view=self.view(pos,angles); + let view_inv = view.inverse(); + + let mut raw = [0f32; 16 * 3 + 4]; + raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); + raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); + raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view_inv)[..]); + raw[48..52].copy_from_slice(AsRef::<[f32; 4]>::as_ref(&view.col(3))); + raw + } +} + pub struct GraphicsState{ - screen_size: (u32, u32), pipelines: GraphicsPipelines, bind_groups: GraphicsBindGroups, bind_group_layouts: GraphicsBindGroupLayouts, samplers: GraphicsSamplers, - temp_squid_texture_view: wgpu::TextureView, + camera:GraphicsCamera, camera_buf: wgpu::Buffer, + temp_squid_texture_view: wgpu::TextureView, models: Vec, depth_view: wgpu::TextureView, staging_belt: wgpu::util::StagingBelt, @@ -66,8 +117,9 @@ impl GraphicsState{ pub struct GlobalState{ start_time: std::time::Instant, manual_mouse_lock:bool, + mouse:physics::MouseState, graphics:GraphicsState, - physics:physics::PhysicsState, + physics_thread:worker::Worker,physics::PhysicsOutputState>, } impl GlobalState{ @@ -95,77 +147,6 @@ impl GlobalState{ depth_texture.create_view(&wgpu::TextureViewDescriptor::default()) } - fn generate_model_physics(&mut self,indexed_models:&model::IndexedModelInstances){ - let mut starts=Vec::new(); - let mut spawns=Vec::new(); - let mut ordered_checkpoints=Vec::new(); - let mut unordered_checkpoints=Vec::new(); - for model in &indexed_models.models{ - //make aabb and run vertices to get realistic bounds - for model_instance in &model.instances{ - if let Some(model_physics)=physics::ModelPhysics::from_model(model,model_instance){ - let model_id=self.physics.models.len() as u32; - self.physics.models.push(model_physics); - for attr in &model_instance.temp_indexing{ - match attr{ - model::TempIndexedAttributes::Start{mode_id}=>starts.push((*mode_id,model_id)), - model::TempIndexedAttributes::Spawn{mode_id,stage_id}=>spawns.push((*mode_id,model_id,*stage_id)), - model::TempIndexedAttributes::OrderedCheckpoint{mode_id,checkpoint_id}=>ordered_checkpoints.push((*mode_id,model_id,*checkpoint_id)), - model::TempIndexedAttributes::UnorderedCheckpoint{mode_id}=>unordered_checkpoints.push((*mode_id,model_id)), - } - } - } - } - } - //I don't wanna write structs for temporary structures - //this code builds ModeDescriptions from the unsorted lists at the top of the function - starts.sort_by_key(|tup|tup.0); - let mut eshmep=std::collections::HashMap::new(); - let mut modedatas:Vec<(u32,Vec<(u32,u32)>,Vec<(u32,u32)>,Vec)>=starts.into_iter().enumerate().map(|(i,tup)|{ - eshmep.insert(tup.0,i); - (tup.1,Vec::new(),Vec::new(),Vec::new()) - }).collect(); - for tup in spawns{ - if let Some(mode_id)=eshmep.get(&tup.0){ - if let Some(modedata)=modedatas.get_mut(*mode_id){ - modedata.1.push((tup.2,tup.1)); - } - } - } - for tup in ordered_checkpoints{ - if let Some(mode_id)=eshmep.get(&tup.0){ - if let Some(modedata)=modedatas.get_mut(*mode_id){ - modedata.2.push((tup.2,tup.1)); - } - } - } - for tup in unordered_checkpoints{ - if let Some(mode_id)=eshmep.get(&tup.0){ - if let Some(modedata)=modedatas.get_mut(*mode_id){ - modedata.3.push(tup.1); - } - } - } - let num_modes=self.physics.modes.len(); - for (mode_id,mode) in eshmep{ - self.physics.mode_from_mode_id.insert(mode_id,num_modes+mode); - } - self.physics.modes.append(&mut modedatas.into_iter().map(|mut tup|{ - tup.1.sort_by_key(|tup|tup.0); - tup.2.sort_by_key(|tup|tup.0); - let mut eshmep1=std::collections::HashMap::new(); - let mut eshmep2=std::collections::HashMap::new(); - model::ModeDescription{ - start:tup.0, - spawns:tup.1.into_iter().enumerate().map(|(i,tup)|{eshmep1.insert(tup.0,i);tup.1}).collect(), - ordered_checkpoints:tup.2.into_iter().enumerate().map(|(i,tup)|{eshmep2.insert(tup.0,i);tup.1}).collect(), - unordered_checkpoints:tup.3, - spawn_from_stage_id:eshmep1, - ordered_checkpoint_from_checkpoint_id:eshmep2, - } - }).collect()); - println!("Physics Objects: {}",self.physics.models.len()); - } fn generate_model_graphics(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,indexed_models:model::IndexedModelInstances){ //generate texture view per texture @@ -408,20 +389,6 @@ fn get_instances_buffer_data(instances:&[ModelGraphicsInstance]) -> Vec { raw } -fn to_uniform_data(camera: &physics::Camera, pos: glam::Vec3) -> [f32; 16 * 3 + 4] { - let proj=camera.proj(); - let proj_inv = proj.inverse(); - let view=camera.view(pos); - let view_inv = view.inverse(); - - let mut raw = [0f32; 16 * 3 + 4]; - raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); - raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); - raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view_inv)[..]); - raw[48..52].copy_from_slice(AsRef::<[f32; 4]>::as_ref(&view.col(3))); - raw -} - impl framework::Example for GlobalState { fn optional_features() -> wgpu::Features { wgpu::Features::TEXTURE_COMPRESSION_ASTC @@ -582,25 +549,6 @@ impl framework::Example for GlobalState { source: wgpu::ShaderSource::Wgsl(Cow::Borrowed(include_str!("shader.wgsl"))), }); - let physics = physics::PhysicsState { - spawn_point:glam::vec3(0.0,50.0,0.0), - body: physics::Body::with_pva(glam::vec3(0.0,50.0,0.0),glam::vec3(0.0,0.0,0.0),glam::vec3(0.0,-100.0,0.0)), - time: 0, - style:physics::StyleModifiers::default(), - grounded: false, - contacts: std::collections::HashMap::new(), - intersects: std::collections::HashMap::new(), - models: Vec::new(), - walk: physics::WalkState::new(), - camera: physics::Camera::from_offset(glam::vec3(0.0,4.5-2.5,0.0),(config.width as f32)/(config.height as f32)), - mouse_interpolation: physics::MouseInterpolationState::new(), - controls: 0, - world:physics::WorldState{}, - game:physics::GameMechanicsState::default(), - modes:Vec::new(), - mode_from_mode_id:std::collections::HashMap::new(), - }; - //load textures let device_features = device.features(); @@ -795,7 +743,10 @@ impl framework::Example for GlobalState { multiview: None, }); - let camera_uniforms = to_uniform_data(&physics.camera,physics.body.extrapolated_position(0)); + let mut physics = physics::PhysicsState::default(); + + let camera=GraphicsCamera::new(glam::uvec2(config.width,config.height), 1.0); + let camera_uniforms = camera.to_uniform_data(physics.output().adjust_mouse(&physics.next_mouse)); let camera_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Camera"), contents: bytemuck::cast_slice(&camera_uniforms), @@ -811,6 +762,7 @@ impl framework::Example for GlobalState { ], label: Some("Camera"), }); + let skybox_texture_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { layout: &skybox_texture_bind_group_layout, entries: &[ @@ -829,7 +781,6 @@ impl framework::Example for GlobalState { let depth_view = Self::create_depth_texture(config, device); let graphics=GraphicsState { - screen_size: (config.width,config.height), pipelines:GraphicsPipelines{ skybox:sky_pipeline, model:model_pipeline @@ -838,6 +789,7 @@ impl framework::Example for GlobalState { camera:camera_bind_group, skybox_texture:skybox_texture_bind_group, }, + camera, camera_buf, models: Vec::new(), depth_view, @@ -847,20 +799,30 @@ impl framework::Example for GlobalState { temp_squid_texture_view: squid_texture_view, }; - let mut state=GlobalState{ - start_time:Instant::now(), - manual_mouse_lock:false, - graphics, - physics, - }; - let indexed_model_instances=model::IndexedModelInstances{ textures:Vec::new(), models:indexed_models, spawn_point:glam::Vec3::Y*50.0, modes:Vec::new(), }; - state.generate_model_physics(&indexed_model_instances); + + //how to multithread + + //1. build + physics.generate_models(&indexed_model_instances); + + //2. move + let physics_thread=physics.into_worker(); + + //3. forget + + let mut state=GlobalState{ + start_time:Instant::now(), + manual_mouse_lock:false, + mouse:physics::MouseState::default(), + graphics, + physics_thread, + }; state.generate_model_graphics(&device,&queue,indexed_model_instances); let args:Vec=std::env::args().collect(); @@ -911,18 +873,20 @@ impl framework::Example for GlobalState { }{ let spawn_point=indexed_model_instances.spawn_point; //if generate_indexed_models succeeds, clear the previous ones - self.physics.clear(); self.graphics.clear(); - self.physics.game.stage_id=0; - self.physics.spawn_point=spawn_point; - self.generate_model_physics(&indexed_model_instances); + + let mut physics=physics::PhysicsState::default(); + physics.game.stage_id=0; + physics.spawn_point=spawn_point; + physics.process_instruction(instruction::TimedInstruction{ + time:physics.time, + instruction: PhysicsInstruction::Input(physics::PhysicsInputInstruction::Reset), + }); + physics.generate_models(&indexed_model_instances); + self.physics_thread=physics.into_worker(); + self.generate_model_graphics(device,queue,indexed_model_instances); //manual reset - let time=self.physics.time; - instruction::InstructionConsumer::process_instruction(&mut self.physics, instruction::TimedInstruction{ - time, - instruction: PhysicsInstruction::Input(InputInstruction::Reset), - }); }else{ println!("No modeldatas were generated"); } @@ -983,7 +947,7 @@ impl framework::Example for GlobalState { 15=>{//Tab if s{ self.manual_mouse_lock=false; - match window.set_cursor_position(winit::dpi::PhysicalPosition::new(self.graphics.screen_size.0 as f32/2.0, self.graphics.screen_size.1 as f32/2.0)){ + match window.set_cursor_position(winit::dpi::PhysicalPosition::new(self.graphics.camera.screen_size.x as f32/2.0, self.graphics.camera.screen_size.y as f32/2.0)){ Ok(())=>(), Err(e)=>println!("Could not set cursor position: {:?}",e), } @@ -1012,18 +976,17 @@ impl framework::Example for GlobalState { }, _ => {println!("scancode {}",keycode);None}, }{ - self.physics.run(time); - self.physics.process_instruction(TimedInstruction{ + self.physics_thread.send(TimedInstruction{ time, - instruction:PhysicsInstruction::Input(input_instruction), - }) + instruction:input_instruction, + }).unwrap(); } }, winit::event::DeviceEvent::MouseMotion { delta,//these (f64,f64) are integers on my machine } => { if self.manual_mouse_lock{ - match window.set_cursor_position(winit::dpi::PhysicalPosition::new(self.graphics.screen_size.0 as f32/2.0, self.graphics.screen_size.1 as f32/2.0)){ + match window.set_cursor_position(winit::dpi::PhysicalPosition::new(self.graphics.camera.screen_size.x as f32/2.0, self.graphics.camera.screen_size.y as f32/2.0)){ Ok(())=>(), Err(e)=>println!("Could not set cursor position: {:?}",e), } @@ -1031,21 +994,22 @@ impl framework::Example for GlobalState { //do not step the physics because the mouse polling rate is higher than the physics can run. //essentially the previous input will be overwritten until a true step runs //which is fine because they run all the time. - self.physics.process_instruction(TimedInstruction{ + let delta=glam::ivec2(delta.0 as i32,delta.1 as i32); + self.mouse.pos+=delta; + self.physics_thread.send(TimedInstruction{ time, - instruction:PhysicsInstruction::Input(InputInstruction::MoveMouse(glam::ivec2(delta.0 as i32,delta.1 as i32))), - }) + instruction:InputInstruction::MoveMouse(self.mouse.pos), + }).unwrap(); }, winit::event::DeviceEvent::MouseWheel { delta, } => { println!("mousewheel {:?}",delta); if false{//self.physics.style.use_scroll{ - self.physics.run(time); - self.physics.process_instruction(TimedInstruction{ + self.physics_thread.send(TimedInstruction{ time, - instruction:PhysicsInstruction::Input(InputInstruction::Jump(true)),//activates the immediate jump path, but the style modifier prevents controls&CONTROL_JUMP bit from being set to auto jump - }) + instruction:InputInstruction::Jump(true),//activates the immediate jump path, but the style modifier prevents controls&CONTROL_JUMP bit from being set to auto jump + }).unwrap(); } } _=>(), @@ -1059,8 +1023,7 @@ impl framework::Example for GlobalState { _queue: &wgpu::Queue, ) { self.graphics.depth_view = Self::create_depth_texture(config, device); - self.graphics.screen_size = (config.width, config.height); - self.physics.camera.set_fov_aspect(1.0,(config.width as f32)/(config.height as f32)); + self.graphics.camera.set_screen_size(glam::uvec2(config.width, config.height)); } fn render( @@ -1070,15 +1033,20 @@ impl framework::Example for GlobalState { queue: &wgpu::Queue, _spawner: &framework::Spawner, ) { + //ideally this would be scheduled to execute and finish right before the render. let time=self.start_time.elapsed().as_nanos() as i64; - - self.physics.run(time); + self.physics_thread.send(TimedInstruction{ + time, + instruction:InputInstruction::Idle, + }).unwrap(); + //update time lol + self.mouse.time=time; let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); // update rotation - let camera_uniforms = to_uniform_data(&self.physics.camera,self.physics.body.extrapolated_position(time)); + let camera_uniforms = self.graphics.camera.to_uniform_data(self.physics_thread.grab_clone().adjust_mouse(&self.mouse)); self.graphics.staging_belt .write_buffer( &mut encoder, diff --git a/src/physics.rs b/src/physics.rs index e3ee7b0..7d7bcae 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -13,7 +13,22 @@ pub enum PhysicsInstruction { // bool,//true = Force // ) //InputInstructions conditionally activate RefreshWalkTarget (by doing what SetWalkTargetVelocity used to do and then flagging it) - Input(InputInstruction), + Input(PhysicsInputInstruction), +} +#[derive(Debug)] +pub enum PhysicsInputInstruction { + ReplaceMouse(MouseState,MouseState), + SetNextMouse(MouseState), + SetMoveForward(bool), + SetMoveLeft(bool), + SetMoveBack(bool), + SetMoveRight(bool), + SetMoveUp(bool), + SetMoveDown(bool), + SetJump(bool), + SetZoom(bool), + Reset, + Idle, } #[derive(Debug)] pub enum InputInstruction { @@ -32,7 +47,7 @@ pub enum InputInstruction { //for interpolation / networking / playback reasons, most playback heads will always want //to be 1 instruction ahead to generate the next state for interpolation. } -#[derive(Clone,Debug)] +#[derive(Clone)] pub struct Body { position: glam::Vec3,//I64 where 2^32 = 1 u velocity: glam::Vec3,//I64 where 2^32 = 1 u/s @@ -91,49 +106,29 @@ impl crate::instruction::InstructionConsumer for InputState{ } */ -enum MouseInterpolation { - First,//just checks the last value - Lerp,//lerps between -} - //hey dumbass just use a delta -pub struct MouseInterpolationState { - interpolation: MouseInterpolation, - time0: TIME, - time1: TIME, - mouse0: glam::IVec2, - mouse1: glam::IVec2, +#[derive(Clone,Debug)] +pub struct MouseState { + pub pos: glam::IVec2, + pub time: TIME, } - -impl MouseInterpolationState { - pub fn new() -> Self { +impl Default for MouseState{ + fn default() -> Self { Self { - interpolation:MouseInterpolation::First, - time0:0, - time1:1,//ONE NANOSECOND!!!! avoid divide by zero - mouse0:glam::IVec2::ZERO, - mouse1:glam::IVec2::ZERO, + time:0, + pos:glam::IVec2::ZERO, } } - pub fn move_mouse(&mut self,time:TIME,delta:glam::IVec2){ - self.time0=self.time1; - self.mouse0=self.mouse1; - self.time1=time; - self.mouse1=self.mouse1+delta; - } - pub fn interpolated_position(&self,time:TIME) -> glam::IVec2 { - match self.interpolation { - MouseInterpolation::First => self.mouse0, - MouseInterpolation::Lerp => { - let m0=self.mouse0.as_i64vec2(); - let m1=self.mouse1.as_i64vec2(); - //these are deltas - let t1t=(self.time1-time) as i64; - let tt0=(time-self.time0) as i64; - let dt=(self.time1-self.time0) as i64; - ((m0*t1t+m1*tt0)/dt).as_ivec2() - } - } +} +impl MouseState { + pub fn lerp(&self,target:&MouseState,time:TIME)->glam::IVec2 { + let m0=self.pos.as_i64vec2(); + let m1=target.pos.as_i64vec2(); + //these are deltas + let t1t=(target.time-time) as i64; + let tt0=(time-self.time) as i64; + let dt=(target.time-self.time) as i64; + ((m0*t1t+m1*tt0)/dt).as_ivec2() } } @@ -156,15 +151,14 @@ impl WalkState { } } -// Note: we use the Y=up coordinate space in this example. -pub struct Camera { +#[derive(Clone)] +pub struct PhysicsCamera { offset: glam::Vec3, angles: glam::DVec2,//YAW AND THEN PITCH //punch: glam::Vec3, //punch_velocity: glam::Vec3, - fov: glam::Vec2,//slope sensitivity: glam::DVec2, - time: TIME, + mouse:MouseState, } #[inline] @@ -176,45 +170,22 @@ fn mat3_from_rotation_y_f64(angle: f64) -> glam::Mat3 { glam::Vec3::new(sina as f32, 0.0, cosa as f32), ) } -#[inline] -fn perspective_rh(fov_x_slope: f32, fov_y_slope: f32, z_near: f32, z_far: f32) -> glam::Mat4 { - //glam_assert!(z_near > 0.0 && z_far > 0.0); - let r = z_far / (z_near - z_far); - glam::Mat4::from_cols( - glam::Vec4::new(1.0/fov_x_slope, 0.0, 0.0, 0.0), - glam::Vec4::new(0.0, 1.0/fov_y_slope, 0.0, 0.0), - glam::Vec4::new(0.0, 0.0, r, -1.0), - glam::Vec4::new(0.0, 0.0, r * z_near, 0.0), - ) -} -impl Camera { - pub fn from_offset(offset:glam::Vec3,aspect:f32) -> Self { +impl PhysicsCamera { + pub fn from_offset(offset:glam::Vec3) -> Self { Self{ offset, angles: glam::DVec2::ZERO, - fov: glam::vec2(aspect,1.0), sensitivity: glam::dvec2(1.0/16384.0,1.0/16384.0), - time: 0, + mouse:MouseState{pos:glam::IVec2::ZERO,time:-1},//escape initialization hell divide by zero } } - fn simulate_move_angles(&self, delta: glam::IVec2) -> glam::DVec2 { - let mut a=self.angles-self.sensitivity*delta.as_dvec2(); + pub fn simulate_move_angles(&self, mouse_pos: glam::IVec2) -> glam::DVec2 { + let mut a=self.angles-self.sensitivity*(mouse_pos-self.mouse.pos).as_dvec2(); a.y=a.y.clamp(-std::f64::consts::FRAC_PI_2, std::f64::consts::FRAC_PI_2); return a } - fn simulate_move_rotation_y(&self, delta_x: i32) -> glam::Mat3 { - mat3_from_rotation_y_f64(self.angles.x-self.sensitivity.x*(delta_x as f64)) - } - pub fn proj(&self)->glam::Mat4{ - perspective_rh(self.fov.x, self.fov.y, 0.5, 2000.0) - } - pub fn view(&self,pos:glam::Vec3)->glam::Mat4{ - //f32 good enough for view matrix - glam::Mat4::from_translation(pos+self.offset) * glam::Mat4::from_euler(glam::EulerRot::YXZ, self.angles.x as f32, self.angles.y as f32, 0f32) - } - pub fn set_fov_aspect(&mut self,fov:f32,aspect:f32){ - self.fov.x=fov*aspect; - self.fov.y=fov; + fn simulate_move_rotation_y(&self, mouse_pos_x: i32) -> glam::Mat3 { + mat3_from_rotation_y_f64(self.angles.x-self.sensitivity.x*((mouse_pos_x-self.mouse.pos.x) as f64)) } } @@ -275,7 +246,7 @@ impl StyleModifiers{ const UP_DIR:glam::Vec3 = glam::Vec3::Y; fn get_control(&self,control:u32,controls:u32)->bool{ - controls&self.controls_mask&control!=0 + controls&self.controls_mask&control==control } fn get_control_dir(&self,controls:u32)->glam::Vec3{ @@ -319,8 +290,8 @@ pub struct PhysicsState{ pub intersects:std::collections::HashMap::, //pub intersections: Vec, //camera must exist in state because wormholes modify the camera, also camera punch - pub camera:Camera, - pub mouse_interpolation:MouseInterpolationState, + pub camera:PhysicsCamera, + pub next_mouse:MouseState,//Where is the mouse headed next pub controls:u32, pub walk:WalkState, pub grounded:bool, @@ -333,6 +304,16 @@ pub struct PhysicsState{ //This is not the same as Reset which teleports you to Spawn0 pub spawn_point:glam::Vec3, } +#[derive(Clone)] +pub struct PhysicsOutputState{ + camera:PhysicsCamera, + body:Body, +} +impl PhysicsOutputState{ + pub fn adjust_mouse(&self,mouse:&MouseState)->(glam::Vec3,glam::Vec2){ + (self.body.extrapolated_position(mouse.time)+self.camera.offset,self.camera.simulate_move_angles(mouse.pos).as_vec2()) + } +} #[derive(Debug,Clone,Copy,Hash,Eq,PartialEq)] pub enum AabbFace{ @@ -554,6 +535,29 @@ impl Body { } } +impl Default for PhysicsState{ + fn default() -> Self { + Self{ + spawn_point:glam::vec3(0.0,50.0,0.0), + body: Body::with_pva(glam::vec3(0.0,50.0,0.0),glam::vec3(0.0,0.0,0.0),glam::vec3(0.0,-100.0,0.0)), + time: 0, + style:StyleModifiers::default(), + grounded: false, + contacts: std::collections::HashMap::new(), + intersects: std::collections::HashMap::new(), + models: Vec::new(), + walk: WalkState::new(), + camera: PhysicsCamera::from_offset(glam::vec3(0.0,4.5-2.5,0.0)), + next_mouse: MouseState::default(), + controls: 0, + world:WorldState{}, + game:GameMechanicsState::default(), + modes:Vec::new(), + mode_from_mode_id:std::collections::HashMap::new(), + } + } +} + impl PhysicsState { pub fn clear(&mut self){ self.models.clear(); @@ -561,6 +565,173 @@ impl PhysicsState { self.contacts.clear(); self.intersects.clear(); } + + pub fn into_worker(mut self)->crate::worker::Worker,PhysicsOutputState>{ + let mut mouse_blocking=true; + let mut last_mouse_time=self.next_mouse.time; + let mut timeline=std::collections::VecDeque::new(); + crate::worker::Worker::new(self.output(),move |ins:TimedInstruction|{ + if if let Some(phys_input)=match ins.instruction{ + InputInstruction::MoveMouse(m)=>{ + if mouse_blocking{ + //tell the game state which is living in the past about its future + timeline.push_front(TimedInstruction{ + time:last_mouse_time, + instruction:PhysicsInputInstruction::SetNextMouse(MouseState{time:ins.time,pos:m}), + }); + }else{ + //mouse has just started moving again after being still for longer than 10ms. + //replace the entire mouse interpolation state to avoid an intermediate state with identical m0.t m1.t timestamps which will divide by zero + timeline.push_front(TimedInstruction{ + time:last_mouse_time, + instruction:PhysicsInputInstruction::ReplaceMouse( + MouseState{time:last_mouse_time,pos:self.next_mouse.pos}, + MouseState{time:ins.time,pos:m} + ), + }); + //delay physics execution until we have an interpolation target + mouse_blocking=true; + } + last_mouse_time=ins.time; + None + }, + InputInstruction::MoveForward(s)=>Some(PhysicsInputInstruction::SetMoveForward(s)), + InputInstruction::MoveLeft(s)=>Some(PhysicsInputInstruction::SetMoveLeft(s)), + InputInstruction::MoveBack(s)=>Some(PhysicsInputInstruction::SetMoveBack(s)), + InputInstruction::MoveRight(s)=>Some(PhysicsInputInstruction::SetMoveRight(s)), + InputInstruction::MoveUp(s)=>Some(PhysicsInputInstruction::SetMoveUp(s)), + InputInstruction::MoveDown(s)=>Some(PhysicsInputInstruction::SetMoveDown(s)), + InputInstruction::Jump(s)=>Some(PhysicsInputInstruction::SetJump(s)), + InputInstruction::Zoom(s)=>Some(PhysicsInputInstruction::SetZoom(s)), + InputInstruction::Reset=>Some(PhysicsInputInstruction::Reset), + InputInstruction::Idle=>Some(PhysicsInputInstruction::Idle), + }{ + //non-mouse event + timeline.push_back(TimedInstruction{ + time:ins.time, + instruction:phys_input, + }); + + if mouse_blocking{ + //assume the mouse has stopped moving after 10ms. + //shitty mice are 125Hz which is 8ms so this should cover that. + //setting this to 100us still doesn't print even though it's 10x lower than the polling rate, + //so mouse events are probably not handled separately from drawing and fire right before it :( + if 10_000_000PhysicsOutputState{ + PhysicsOutputState{ + body:self.body.clone(), + camera:self.camera.clone(), + } + } + + pub fn generate_models(&mut self,indexed_models:&crate::model::IndexedModelInstances){ + let mut starts=Vec::new(); + let mut spawns=Vec::new(); + let mut ordered_checkpoints=Vec::new(); + let mut unordered_checkpoints=Vec::new(); + for model in &indexed_models.models{ + //make aabb and run vertices to get realistic bounds + for model_instance in &model.instances{ + if let Some(model_physics)=ModelPhysics::from_model(model,model_instance){ + let model_id=self.models.len() as u32; + self.models.push(model_physics); + for attr in &model_instance.temp_indexing{ + match attr{ + crate::model::TempIndexedAttributes::Start{mode_id}=>starts.push((*mode_id,model_id)), + crate::model::TempIndexedAttributes::Spawn{mode_id,stage_id}=>spawns.push((*mode_id,model_id,*stage_id)), + crate::model::TempIndexedAttributes::OrderedCheckpoint{mode_id,checkpoint_id}=>ordered_checkpoints.push((*mode_id,model_id,*checkpoint_id)), + crate::model::TempIndexedAttributes::UnorderedCheckpoint{mode_id}=>unordered_checkpoints.push((*mode_id,model_id)), + } + } + } + } + } + //I don't wanna write structs for temporary structures + //this code builds ModeDescriptions from the unsorted lists at the top of the function + starts.sort_by_key(|tup|tup.0); + let mut eshmep=std::collections::HashMap::new(); + let mut modedatas:Vec<(u32,Vec<(u32,u32)>,Vec<(u32,u32)>,Vec)>=starts.into_iter().enumerate().map(|(i,tup)|{ + eshmep.insert(tup.0,i); + (tup.1,Vec::new(),Vec::new(),Vec::new()) + }).collect(); + for tup in spawns{ + if let Some(mode_id)=eshmep.get(&tup.0){ + if let Some(modedata)=modedatas.get_mut(*mode_id){ + modedata.1.push((tup.2,tup.1)); + } + } + } + for tup in ordered_checkpoints{ + if let Some(mode_id)=eshmep.get(&tup.0){ + if let Some(modedata)=modedatas.get_mut(*mode_id){ + modedata.2.push((tup.2,tup.1)); + } + } + } + for tup in unordered_checkpoints{ + if let Some(mode_id)=eshmep.get(&tup.0){ + if let Some(modedata)=modedatas.get_mut(*mode_id){ + modedata.3.push(tup.1); + } + } + } + let num_modes=self.modes.len(); + for (mode_id,mode) in eshmep{ + self.mode_from_mode_id.insert(mode_id,num_modes+mode); + } + self.modes.append(&mut modedatas.into_iter().map(|mut tup|{ + tup.1.sort_by_key(|tup|tup.0); + tup.2.sort_by_key(|tup|tup.0); + let mut eshmep1=std::collections::HashMap::new(); + let mut eshmep2=std::collections::HashMap::new(); + crate::model::ModeDescription{ + start:tup.0, + spawns:tup.1.into_iter().enumerate().map(|(i,tup)|{eshmep1.insert(tup.0,i);tup.1}).collect(), + ordered_checkpoints:tup.2.into_iter().enumerate().map(|(i,tup)|{eshmep2.insert(tup.0,i);tup.1}).collect(), + unordered_checkpoints:tup.3, + spawn_from_stage_id:eshmep1, + ordered_checkpoint_from_checkpoint_id:eshmep2, + } + }).collect()); + println!("Physics Objects: {}",self.models.len()); + } + pub fn get_mode(&self,mode_id:u32)->Option<&crate::model::ModeDescription>{ if let Some(&mode)=self.mode_from_mode_id.get(&mode_id){ self.modes.get(mode) @@ -1004,13 +1175,15 @@ impl crate::instruction::InstructionEmitter for PhysicsState impl crate::instruction::InstructionConsumer for PhysicsState { fn process_instruction(&mut self, ins:TimedInstruction) { match &ins.instruction { - PhysicsInstruction::StrafeTick => (), - PhysicsInstruction::Input(InputInstruction::MoveMouse(_)) => (), + PhysicsInstruction::Input(PhysicsInputInstruction::Idle) + |PhysicsInstruction::Input(PhysicsInputInstruction::SetNextMouse(_)) + |PhysicsInstruction::Input(PhysicsInputInstruction::ReplaceMouse(_,_)) + |PhysicsInstruction::StrafeTick => (), _=>println!("{}|{:?}",ins.time,ins.instruction), } //selectively update body match &ins.instruction { - PhysicsInstruction::Input(InputInstruction::MoveMouse(_)) => (),//dodge time for mouse movement + //PhysicsInstruction::Input(InputInstruction::MoveMouse(_)) => (),//dodge time for mouse movement PhysicsInstruction::Input(_) |PhysicsInstruction::ReachWalkTargetVelocity |PhysicsInstruction::CollisionStart(_) @@ -1032,10 +1205,8 @@ impl crate::instruction::InstructionConsumer for PhysicsStat _ => (), }, } - match &general.booster{ - Some(booster)=>self.body.velocity+=booster.velocity, - None=>(), - } + //check ground + self.contacts.insert(c.model,c); match &general.stage_element{ Some(stage_element)=>{ if stage_element.force||self.game.stage_id for PhysicsStat }, None=>(), } - //check ground - self.contacts.insert(c.model,c); //flatten v let mut v=self.body.velocity; self.contact_constrain_velocity(&mut v); + match &general.booster{ + Some(booster)=>{ + v+=booster.velocity; + self.contact_constrain_velocity(&mut v); + }, + None=>(), + } self.body.velocity=v; if self.grounded&&self.style.get_control(StyleModifiers::CONTROL_JUMP,self.controls){ self.jump(); @@ -1105,7 +1281,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat } }, PhysicsInstruction::StrafeTick => { - let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); + let camera_mat=self.camera.simulate_move_rotation_y(self.camera.mouse.lerp(&self.next_mouse,self.time).x); let control_dir=camera_mat*self.style.get_control_dir(self.controls); let d=self.body.velocity.dot(control_dir); if d for PhysicsStat let mut refresh_walk_target=true; let mut refresh_walk_target_velocity=true; match input_instruction{ - InputInstruction::MoveMouse(m) => { - self.camera.angles=self.camera.simulate_move_angles(self.mouse_interpolation.mouse1-self.mouse_interpolation.mouse0); - self.mouse_interpolation.move_mouse(self.time,m); + PhysicsInputInstruction::SetNextMouse(m) => { + self.camera.angles=self.camera.simulate_move_angles(self.next_mouse.pos); + (self.camera.mouse,self.next_mouse)=(self.next_mouse.clone(),m); }, - InputInstruction::MoveForward(s) => self.set_control(StyleModifiers::CONTROL_MOVEFORWARD,s), - InputInstruction::MoveLeft(s) => self.set_control(StyleModifiers::CONTROL_MOVELEFT,s), - InputInstruction::MoveBack(s) => self.set_control(StyleModifiers::CONTROL_MOVEBACK,s), - InputInstruction::MoveRight(s) => self.set_control(StyleModifiers::CONTROL_MOVERIGHT,s), - InputInstruction::MoveUp(s) => self.set_control(StyleModifiers::CONTROL_MOVEUP,s), - InputInstruction::MoveDown(s) => self.set_control(StyleModifiers::CONTROL_MOVEDOWN,s), - InputInstruction::Jump(s) => { + PhysicsInputInstruction::ReplaceMouse(m0,m1) => { + self.camera.angles=self.camera.simulate_move_angles(m0.pos); + (self.camera.mouse,self.next_mouse)=(m0,m1); + }, + PhysicsInputInstruction::SetMoveForward(s) => self.set_control(StyleModifiers::CONTROL_MOVEFORWARD,s), + PhysicsInputInstruction::SetMoveLeft(s) => self.set_control(StyleModifiers::CONTROL_MOVELEFT,s), + PhysicsInputInstruction::SetMoveBack(s) => self.set_control(StyleModifiers::CONTROL_MOVEBACK,s), + PhysicsInputInstruction::SetMoveRight(s) => self.set_control(StyleModifiers::CONTROL_MOVERIGHT,s), + PhysicsInputInstruction::SetMoveUp(s) => self.set_control(StyleModifiers::CONTROL_MOVEUP,s), + PhysicsInputInstruction::SetMoveDown(s) => self.set_control(StyleModifiers::CONTROL_MOVEDOWN,s), + PhysicsInputInstruction::SetJump(s) => { self.set_control(StyleModifiers::CONTROL_JUMP,s); if self.grounded{ self.jump(); } refresh_walk_target_velocity=false; }, - InputInstruction::Zoom(s) => { + PhysicsInputInstruction::SetZoom(s) => { self.set_control(StyleModifiers::CONTROL_ZOOM,s); refresh_walk_target=false; }, - InputInstruction::Reset => { + PhysicsInputInstruction::Reset => { //temp self.body.position=self.spawn_point; self.body.velocity=glam::Vec3::ZERO; @@ -1160,12 +1340,12 @@ impl crate::instruction::InstructionConsumer for PhysicsStat self.grounded=false; refresh_walk_target=false; }, - InputInstruction::Idle => {refresh_walk_target=false;},//literally idle! + PhysicsInputInstruction::Idle => {refresh_walk_target=false;},//literally idle! } if refresh_walk_target{ //calculate walk target velocity if refresh_walk_target_velocity{ - let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x); + let camera_mat=self.camera.simulate_move_rotation_y(self.camera.mouse.lerp(&self.next_mouse,self.time).x); let control_dir=camera_mat*self.style.get_control_dir(self.controls); self.walk.target_velocity=self.style.walkspeed*control_dir; } diff --git a/src/worker.rs b/src/worker.rs index a28b77b..52e0348 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -6,13 +6,13 @@ use parking_lot::Mutex; //The worker thread publishes the result of its work back to the worker object for every item in the work queue. //The physics (target use case) knows when it has not changed the body, so not updating the value is also an option. -struct Worker { +pub struct Worker { sender: mpsc::Sender, value:Arc>, } impl Worker { - fn newValue+Send+'static>(value:Value,f:F) -> Self { + pub fn newValue+Send+'static>(value:Value,mut f:F) -> Self { let (sender, receiver) = mpsc::channel::(); let ret=Self { sender, @@ -23,8 +23,6 @@ impl Worker { loop { match receiver.recv() { Ok(task) => { - println!("Worker got a task"); - // Process the task let v=f(task);//make sure function is evaluated before lock is acquired *value.lock()=v; } @@ -38,11 +36,11 @@ impl Worker { ret } - fn send(&self,task:Task)->Result<(), mpsc::SendError>{ + pub fn send(&self,task:Task)->Result<(), mpsc::SendError>{ self.sender.send(task) } - fn grab_clone(&self)->Value{ + pub fn grab_clone(&self)->Value{ self.value.lock().clone() } } From aedef03e7c003a56b5c28c6f46605ee508edbc25 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 4 Oct 2023 22:21:05 -0700 Subject: [PATCH 264/482] this adds lag and is unnecessary --- src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.rs b/src/main.rs index cfed437..cb79127 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1057,6 +1057,7 @@ impl framework::Example for GlobalState { ) .copy_from_slice(bytemuck::cast_slice(&camera_uniforms)); //This code only needs to run when the uniforms change + /* for model in self.graphics.models.iter() { let model_uniforms = get_instances_buffer_data(&model.instances); self.graphics.staging_belt @@ -1069,6 +1070,7 @@ impl framework::Example for GlobalState { ) .copy_from_slice(bytemuck::cast_slice(&model_uniforms)); } + */ self.graphics.staging_belt.finish(); { From 9fa4ea6716f177484b0d7c18caa9992f2d9d2209 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 5 Oct 2023 19:45:15 -0700 Subject: [PATCH 265/482] create CompatWorker and move physics back into main thread so it feels good to play eventually I will work on thread stuff again and make threads for everything and workarounds to latency issues --- src/main.rs | 2 +- src/physics.rs | 6 +++--- src/worker.rs | 25 +++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index cb79127..a356c3c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -119,7 +119,7 @@ pub struct GlobalState{ manual_mouse_lock:bool, mouse:physics::MouseState, graphics:GraphicsState, - physics_thread:worker::Worker,physics::PhysicsOutputState>, + physics_thread:worker::CompatWorker,physics::PhysicsOutputState,Box)->physics::PhysicsOutputState>>, } impl GlobalState{ diff --git a/src/physics.rs b/src/physics.rs index 7d7bcae..44da8dc 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -566,11 +566,11 @@ impl PhysicsState { self.intersects.clear(); } - pub fn into_worker(mut self)->crate::worker::Worker,PhysicsOutputState>{ + pub fn into_worker(mut self)->crate::worker::CompatWorker,PhysicsOutputState,Box)->PhysicsOutputState>>{ let mut mouse_blocking=true; let mut last_mouse_time=self.next_mouse.time; let mut timeline=std::collections::VecDeque::new(); - crate::worker::Worker::new(self.output(),move |ins:TimedInstruction|{ + crate::worker::CompatWorker::new(self.output(),Box::new(move |ins:TimedInstruction|{ if if let Some(phys_input)=match ins.instruction{ InputInstruction::MoveMouse(m)=>{ if mouse_blocking{ @@ -650,7 +650,7 @@ impl PhysicsState { } } self.output() - }) + })) } pub fn output(&self)->PhysicsOutputState{ diff --git a/src/worker.rs b/src/worker.rs index 52e0348..bdeb957 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -45,6 +45,31 @@ impl Worker { } } +pub struct CompatWorker{ + data:std::marker::PhantomData, + f:F, + value:Value, +} + +implValue> CompatWorker { + pub fn new(value:Value,f:F) -> Self { + Self { + f, + value, + data:std::marker::PhantomData, + } + } + + pub fn send(&mut self,task:Task)->Result<(),()>{ + self.value=(self.f)(task); + Ok(()) + } + + pub fn grab_clone(&self)->Value{ + self.value.clone() + } +} + #[test]//How to run this test with printing: cargo test --release -- --nocapture fn test_worker() { println!("hiiiii"); From 4e90da22288716f0b6bdc12abed8659620a365af Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 5 Oct 2023 19:45:22 -0700 Subject: [PATCH 266/482] weird empty comment --- src/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index a356c3c..63ddc3e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -846,7 +846,6 @@ impl framework::Example for GlobalState { //.snf = "SNMF" //.snf = "SNBF" if let (Ok(()),Ok(()))=(std::io::Read::read_exact(&mut input, &mut first_8),std::io::Seek::rewind(&mut input)){ - // if let Some(indexed_model_instances)={ match &first_8[0..4]{ b"{ From e78cabf0f59368f75f79d51426b4e582fcf89e95 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 5 Oct 2023 20:32:02 -0700 Subject: [PATCH 267/482] move aabb into its own module --- src/aabb.rs | 63 ++++++++++++++++++++ src/main.rs | 1 + src/physics.rs | 158 +++++++------------------------------------------ 3 files changed, 84 insertions(+), 138 deletions(-) create mode 100644 src/aabb.rs diff --git a/src/aabb.rs b/src/aabb.rs new file mode 100644 index 0000000..194ba83 --- /dev/null +++ b/src/aabb.rs @@ -0,0 +1,63 @@ +#[derive(Debug,Clone,Copy,Hash,Eq,PartialEq)] +pub enum AabbFace{ + Right,//+X + Top, + Back, + Left, + Bottom, + Front, +} +#[derive(Clone)] +pub struct Aabb { + pub min: glam::Vec3, + pub max: glam::Vec3, +} + +impl Aabb { + const VERTEX_DATA: [glam::Vec3; 8] = [ + glam::vec3(1., -1., -1.), + glam::vec3(1., 1., -1.), + glam::vec3(1., 1., 1.), + glam::vec3(1., -1., 1.), + glam::vec3(-1., -1., 1.), + glam::vec3(-1., 1., 1.), + glam::vec3(-1., 1., -1.), + glam::vec3(-1., -1., -1.), + ]; + + pub fn new() -> Self { + Self {min: glam::Vec3::INFINITY,max: glam::Vec3::NEG_INFINITY} + } + + pub fn grow(&mut self, point:glam::Vec3){ + self.min=self.min.min(point); + self.max=self.max.max(point); + } + + pub fn normal(face:AabbFace) -> glam::Vec3 { + match face { + AabbFace::Right => glam::vec3(1.,0.,0.), + AabbFace::Top => glam::vec3(0.,1.,0.), + AabbFace::Back => glam::vec3(0.,0.,1.), + AabbFace::Left => glam::vec3(-1.,0.,0.), + AabbFace::Bottom => glam::vec3(0.,-1.,0.), + AabbFace::Front => glam::vec3(0.,0.,-1.), + } + } + pub fn unit_vertices() -> [glam::Vec3;8] { + return Self::VERTEX_DATA; + } + pub fn face(&self,face:AabbFace) -> Aabb { + let mut aabb=self.clone(); + //in this implementation face = worldspace aabb face + match face { + AabbFace::Right => aabb.min.x=aabb.max.x, + AabbFace::Top => aabb.min.y=aabb.max.y, + AabbFace::Back => aabb.min.z=aabb.max.z, + AabbFace::Left => aabb.max.x=aabb.min.x, + AabbFace::Bottom => aabb.max.y=aabb.min.y, + AabbFace::Front => aabb.max.z=aabb.min.z, + } + return aabb; + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 63ddc3e..3263905 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,7 @@ use model::{Vertex,ModelInstance,ModelGraphicsInstance}; use physics::{InputInstruction, PhysicsInstruction}; use instruction::{TimedInstruction, InstructionConsumer}; +mod aabb; mod model; mod zeroes; mod worker; diff --git a/src/physics.rs b/src/physics.rs index 44da8dc..76ff92d 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -315,114 +315,9 @@ impl PhysicsOutputState{ } } -#[derive(Debug,Clone,Copy,Hash,Eq,PartialEq)] -pub enum AabbFace{ - Right,//+X - Top, - Back, - Left, - Bottom, - Front, -} -#[derive(Clone)] -pub struct Aabb { - min: glam::Vec3, - max: glam::Vec3, -} - -impl Aabb { - // const FACE_DATA: [[f32; 3]; 6] = [ - // [0.0f32, 0., 1.], - // [0.0f32, 0., -1.], - // [1.0f32, 0., 0.], - // [-1.0f32, 0., 0.], - // [0.0f32, 1., 0.], - // [0.0f32, -1., 0.], - // ]; - const VERTEX_DATA: [glam::Vec3; 8] = [ - glam::vec3(1., -1., -1.), - glam::vec3(1., 1., -1.), - glam::vec3(1., 1., 1.), - glam::vec3(1., -1., 1.), - glam::vec3(-1., -1., 1.), - glam::vec3(-1., 1., 1.), - glam::vec3(-1., 1., -1.), - glam::vec3(-1., -1., -1.), - ]; - const VERTEX_DATA_RIGHT: [glam::Vec3; 4] = [ - glam::vec3(1., -1., -1.), - glam::vec3(1., 1., -1.), - glam::vec3(1., 1., 1.), - glam::vec3(1., -1., 1.), - ]; - const VERTEX_DATA_TOP: [glam::Vec3; 4] = [ - glam::vec3(1., 1., -1.), - glam::vec3(-1., 1., -1.), - glam::vec3(-1., 1., 1.), - glam::vec3(1., 1., 1.), - ]; - const VERTEX_DATA_BACK: [glam::Vec3; 4] = [ - glam::vec3(-1., -1., 1.), - glam::vec3(1., -1., 1.), - glam::vec3(1., 1., 1.), - glam::vec3(-1., 1., 1.), - ]; - const VERTEX_DATA_LEFT: [glam::Vec3; 4] = [ - glam::vec3(-1., -1., 1.), - glam::vec3(-1., 1., 1.), - glam::vec3(-1., 1., -1.), - glam::vec3(-1., -1., -1.), - ]; - const VERTEX_DATA_BOTTOM: [glam::Vec3; 4] = [ - glam::vec3(1., -1., 1.), - glam::vec3(-1., -1., 1.), - glam::vec3(-1., -1., -1.), - glam::vec3(1., -1., -1.), - ]; - const VERTEX_DATA_FRONT: [glam::Vec3; 4] = [ - glam::vec3(-1., 1., -1.), - glam::vec3(1., 1., -1.), - glam::vec3(1., -1., -1.), - glam::vec3(-1., -1., -1.), - ]; - - pub fn new() -> Self { - Self {min: glam::Vec3::INFINITY,max: glam::Vec3::NEG_INFINITY} - } - - pub fn grow(&mut self, point:glam::Vec3){ - self.min=self.min.min(point); - self.max=self.max.max(point); - } - - pub fn normal(face:AabbFace) -> glam::Vec3 { - match face { - AabbFace::Right => glam::vec3(1.,0.,0.), - AabbFace::Top => glam::vec3(0.,1.,0.), - AabbFace::Back => glam::vec3(0.,0.,1.), - AabbFace::Left => glam::vec3(-1.,0.,0.), - AabbFace::Bottom => glam::vec3(0.,-1.,0.), - AabbFace::Front => glam::vec3(0.,0.,-1.), - } - } - pub fn unit_vertices() -> [glam::Vec3;8] { - return Self::VERTEX_DATA; - } - pub fn unit_face_vertices(face:AabbFace) -> [glam::Vec3;4] { - match face { - AabbFace::Right => Self::VERTEX_DATA_RIGHT, - AabbFace::Top => Self::VERTEX_DATA_TOP, - AabbFace::Back => Self::VERTEX_DATA_BACK, - AabbFace::Left => Self::VERTEX_DATA_LEFT, - AabbFace::Bottom => Self::VERTEX_DATA_BOTTOM, - AabbFace::Front => Self::VERTEX_DATA_FRONT, - } - } -} - //pretend to be using what we want to eventually do -type TreyMeshFace = AabbFace; -type TreyMesh = Aabb; +type TreyMeshFace = crate::aabb::AabbFace; +type TreyMesh = crate::aabb::Aabb; enum PhysicsCollisionAttributes{ Contact{//track whether you are contacting the object @@ -445,7 +340,7 @@ pub struct ModelPhysics { impl ModelPhysics { fn from_model_transform_attributes(model:&crate::model::IndexedModel,transform:&glam::Affine3A,attributes:PhysicsCollisionAttributes)->Self{ - let mut aabb=Aabb::new(); + let mut aabb=TreyMesh::new(); for indexed_vertex in &model.unique_vertices { aabb.grow(transform.transform_point3(glam::Vec3::from_array(model.unique_pos[indexed_vertex.pos as usize]))); } @@ -463,29 +358,16 @@ impl ModelPhysics { } } pub fn unit_vertices(&self) -> [glam::Vec3;8] { - Aabb::unit_vertices() + TreyMesh::unit_vertices() } pub fn mesh(&self) -> &TreyMesh { return &self.mesh; } - pub fn unit_face_vertices(&self,face:TreyMeshFace) -> [glam::Vec3;4] { - Aabb::unit_face_vertices(face) - } - pub fn face_mesh(&self,face:TreyMeshFace) -> TreyMesh { - let mut aabb=self.mesh.clone(); - //in this implementation face = worldspace aabb face - match face { - AabbFace::Right => aabb.min.x=aabb.max.x, - AabbFace::Top => aabb.min.y=aabb.max.y, - AabbFace::Back => aabb.min.z=aabb.max.z, - AabbFace::Left => aabb.max.x=aabb.min.x, - AabbFace::Bottom => aabb.max.y=aabb.min.y, - AabbFace::Front => aabb.max.z=aabb.min.z, - } - return aabb; + pub fn face_mesh(&self,face:TreyMeshFace)->TreyMesh{ + self.mesh.face(face) } pub fn face_normal(&self,face:TreyMeshFace) -> glam::Vec3 { - Aabb::normal(face)//this is wrong for scale + TreyMesh::normal(face)//this is wrong for scale } } @@ -861,8 +743,8 @@ impl PhysicsState { } } fn mesh(&self) -> TreyMesh { - let mut aabb=Aabb::new(); - for vertex in Aabb::unit_vertices(){ + let mut aabb=TreyMesh::new(); + for vertex in TreyMesh::unit_vertices(){ aabb.grow(self.body.position+self.style.hitbox_halfsize*vertex); } aabb @@ -879,7 +761,7 @@ impl PhysicsState { let (v,a)=(-self.body.velocity,self.body.acceleration); //collect x match collision_data.face { - AabbFace::Top|AabbFace::Back|AabbFace::Bottom|AabbFace::Front=>{ + TreyMeshFace::Top|TreyMeshFace::Back|TreyMeshFace::Bottom|TreyMeshFace::Front=>{ for t in zeroes2(mesh0.max.x-mesh1.min.x,v.x,0.5*a.x) { //negative t = back in time //must be moving towards surface to collide @@ -907,14 +789,14 @@ impl PhysicsState { } } }, - AabbFace::Left=>{ + TreyMeshFace::Left=>{ //generate event if v.x<0||a.x<0 if -v.x<0f32{ best_time=time; exit_face=Some(TreyMeshFace::Left); } }, - AabbFace::Right=>{ + TreyMeshFace::Right=>{ //generate event if 0{ + TreyMeshFace::Left|TreyMeshFace::Back|TreyMeshFace::Right|TreyMeshFace::Front=>{ for t in zeroes2(mesh0.max.y-mesh1.min.y,v.y,0.5*a.y) { //negative t = back in time //must be moving towards surface to collide @@ -952,14 +834,14 @@ impl PhysicsState { } } }, - AabbFace::Bottom=>{ + TreyMeshFace::Bottom=>{ //generate event if v.y<0||a.y<0 if -v.y<0f32{ best_time=time; exit_face=Some(TreyMeshFace::Bottom); } }, - AabbFace::Top=>{ + TreyMeshFace::Top=>{ //generate event if 0{ + TreyMeshFace::Left|TreyMeshFace::Bottom|TreyMeshFace::Right|TreyMeshFace::Top=>{ for t in zeroes2(mesh0.max.z-mesh1.min.z,v.z,0.5*a.z) { //negative t = back in time //must be moving towards surface to collide @@ -997,14 +879,14 @@ impl PhysicsState { } } }, - AabbFace::Front=>{ + TreyMeshFace::Front=>{ //generate event if v.z<0||a.z<0 if -v.z<0f32{ best_time=time; exit_face=Some(TreyMeshFace::Front); } }, - AabbFace::Back=>{ + TreyMeshFace::Back=>{ //generate event if 0 for PhysicsStat match &contacting.surf{ Some(surf)=>println!("I'm surfing!"), None=>match &c.face { - AabbFace::Top => { + TreyMeshFace::Top => { //ground self.grounded=true; }, @@ -1268,7 +1150,7 @@ impl crate::instruction::InstructionConsumer for PhysicsStat self.body.acceleration=a; //check ground match &c.face { - AabbFace::Top => { + TreyMeshFace::Top => { self.grounded=false; }, _ => (), From 5d1e38c36c843699974bd32d65c7e52f85e2f455 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 5 Oct 2023 20:32:19 -0700 Subject: [PATCH 268/482] wip: move collision code somewhere --- src/physics.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/physics.rs b/src/physics.rs index 76ff92d..45bc4f7 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -904,18 +904,18 @@ impl PhysicsState { None } fn predict_collision_start(&self,time:TIME,time_limit:TIME,model_id:u32) -> Option> { + let mesh0=self.mesh(); + let mesh1=self.models.get(model_id as usize).unwrap().mesh(); + let (p,v,a,time)=(self.body.position,self.body.velocity,self.body.acceleration,self.body.time); //find best t let mut best_time=time_limit; let mut best_face:Option=None; - let mesh0=self.mesh(); - let mesh1=self.models.get(model_id as usize).unwrap().mesh(); - let (p,v,a)=(self.body.position,self.body.velocity,self.body.acceleration); //collect x for t in zeroes2(mesh0.max.x-mesh1.min.x,v.x,0.5*a.x) { //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface - let t_time=self.body.time+((t as f64)*1_000_000_000f64) as TIME; + let t_time=time+((t as f64)*1_000_000_000f64) as TIME; if time<=t_time&&t_time Date: Thu, 5 Oct 2023 20:32:25 -0700 Subject: [PATCH 269/482] bvh --- src/aabb.rs | 17 +++++++++- src/bvh.rs | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 1 + 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 src/bvh.rs diff --git a/src/aabb.rs b/src/aabb.rs index 194ba83..ef728e9 100644 --- a/src/aabb.rs +++ b/src/aabb.rs @@ -33,7 +33,10 @@ impl Aabb { self.min=self.min.min(point); self.max=self.max.max(point); } - + pub fn join(&mut self, aabb:&Aabb){ + self.min=self.min.min(aabb.min); + self.max=self.max.max(aabb.max); + } pub fn normal(face:AabbFace) -> glam::Vec3 { match face { AabbFace::Right => glam::vec3(1.,0.,0.), @@ -60,4 +63,16 @@ impl Aabb { } return aabb; } + pub fn center(&self)->glam::Vec3{ + return (self.min+self.max)/2.0 + } + //probably use floats for area & volume because we don't care about precision + pub fn area_weight(&self)->f32{ + let d=self.max-self.min; + d.x*d.y+d.y*d.z+d.z*d.x + } + pub fn volume(&self)->f32{ + let d=self.max-self.min; + d.x*d.y*d.z + } } \ No newline at end of file diff --git a/src/bvh.rs b/src/bvh.rs new file mode 100644 index 0000000..62eadc9 --- /dev/null +++ b/src/bvh.rs @@ -0,0 +1,94 @@ +use crate::aabb::Aabb; + +//da algaritum +//lista boxens +//sort by {minx,maxx,miny,maxy,minz,maxz} (6 lists) +//find the sets that minimizes the sum of surface areas +//splitting is done when the minimum split sum of surface areas is larger than the node's own surface area + +//start with bisection into octrees because a bad bvh is still 1000x better than no bvh +//sort the centerpoints on each axis (3 lists) +//bv is put into octant based on whether it is upper or lower in each list + +pub struct BvhNode{ + children:Vec, + models:Vec, + aabb:Aabb, +} + +pub fn generate_bvh(boxen:Vec)->BvhNode{ + generate_bvh_node(boxen.into_iter().enumerate().collect()) +} + +fn generate_bvh_node(boxen:Vec<(usize,Aabb)>)->BvhNode{ + let n=boxen.len(); + if n<20{ + let mut aabb=Aabb::new(); + let models=boxen.into_iter().map(|b|{aabb.join(&b.1);b.0 as u32}).collect(); + BvhNode{ + children:Vec::new(), + models, + aabb, + } + }else{ + let mut octant=std::collections::HashMap::with_capacity(n);//this ids which octant the boxen is put in + let mut sort_x=Vec::with_capacity(n); + let mut sort_y=Vec::with_capacity(n); + let mut sort_z=Vec::with_capacity(n); + for (i,aabb) in boxen.iter(){ + let center=aabb.center(); + octant.insert(*i,0); + sort_x.push((*i,center.x)); + sort_y.push((*i,center.y)); + sort_z.push((*i,center.z)); + } + sort_x.sort_by(|tup0,tup1|tup0.1.partial_cmp(&tup1.1).unwrap()); + sort_y.sort_by(|tup0,tup1|tup0.1.partial_cmp(&tup1.1).unwrap()); + sort_z.sort_by(|tup0,tup1|tup0.1.partial_cmp(&tup1.1).unwrap()); + let h=n/2; + let median_x=sort_x[h].1; + let median_y=sort_y[h].1; + let median_z=sort_z[h].1; + for (i,c) in sort_x{ + if median_x Date: Thu, 5 Oct 2023 22:50:16 -0700 Subject: [PATCH 270/482] the tools to get the job done --- src/aabb.rs | 13 +++++++++++++ src/bvh.rs | 15 ++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/aabb.rs b/src/aabb.rs index ef728e9..c027d93 100644 --- a/src/aabb.rs +++ b/src/aabb.rs @@ -13,6 +13,12 @@ pub struct Aabb { pub max: glam::Vec3, } +impl Default for Aabb { + fn default() -> Self { + Aabb::new() + } +} + impl Aabb { const VERTEX_DATA: [glam::Vec3; 8] = [ glam::vec3(1., -1., -1.), @@ -37,6 +43,13 @@ impl Aabb { self.min=self.min.min(aabb.min); self.max=self.max.max(aabb.max); } + pub fn inflate(&mut self, hs:glam::Vec3){ + self.min-=hs; + self.max+=hs; + } + pub fn intersects(&self,aabb:&Aabb)->bool{ + (self.min.cmplt(aabb.max)&aabb.min.cmplt(self.max)).all() + } pub fn normal(face:AabbFace) -> glam::Vec3 { match face { AabbFace::Right => glam::vec3(1.,0.,0.), diff --git a/src/bvh.rs b/src/bvh.rs index 62eadc9..b79ecc0 100644 --- a/src/bvh.rs +++ b/src/bvh.rs @@ -9,13 +9,26 @@ use crate::aabb::Aabb; //start with bisection into octrees because a bad bvh is still 1000x better than no bvh //sort the centerpoints on each axis (3 lists) //bv is put into octant based on whether it is upper or lower in each list - +#[derive(Default)] pub struct BvhNode{ children:Vec, models:Vec, aabb:Aabb, } +impl BvhNode{ + pub fn the_tester(&self,aabb:&Aabb,f:&mut F){ + for &model in &self.models{ + f(model); + } + for child in &self.children{ + if aabb.intersects(&child.aabb){ + child.the_tester(aabb,f); + } + } + } +} + pub fn generate_bvh(boxen:Vec)->BvhNode{ generate_bvh_node(boxen.into_iter().enumerate().collect()) } From fc91d644e65d63e683171378588174deb9bff799 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Thu, 5 Oct 2023 23:52:04 -0700 Subject: [PATCH 271/482] use bvh --- src/physics.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/physics.rs b/src/physics.rs index 45bc4f7..7081072 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -297,6 +297,7 @@ pub struct PhysicsState{ pub grounded:bool, //all models pub models:Vec, + pub bvh:crate::bvh::BvhNode, pub modes:Vec, pub mode_from_mode_id:std::collections::HashMap::, @@ -428,6 +429,7 @@ impl Default for PhysicsState{ contacts: std::collections::HashMap::new(), intersects: std::collections::HashMap::new(), models: Vec::new(), + bvh:crate::bvh::BvhNode::default(), walk: WalkState::new(), camera: PhysicsCamera::from_offset(glam::vec3(0.0,4.5-2.5,0.0)), next_mouse: MouseState::default(), @@ -564,6 +566,7 @@ impl PhysicsState { } } } + self.bvh=crate::bvh::generate_bvh(self.models.iter().map(|m|m.mesh().clone()).collect()); //I don't wanna write structs for temporary structures //this code builds ModeDescriptions from the unsorted lists at the top of the function starts.sort_by_key(|tup|tup.0); @@ -1036,13 +1039,15 @@ impl crate::instruction::InstructionEmitter for PhysicsState // collector.collect(self.predict_collision_end2(self.time,time_limit,collision_data)); // } //check for collision start instructions (against every part in the game with no optimization!!) - for i in 0..self.models.len() { - let i=i as u32; - if self.contacts.contains_key(&i)||self.intersects.contains_key(&i){ - continue; + let mut aabb=crate::aabb::Aabb::new(); + aabb.grow(self.body.extrapolated_position(self.time)); + aabb.grow(self.body.extrapolated_position(time_limit)); + aabb.inflate(self.style.hitbox_halfsize); + self.bvh.the_tester(&aabb,&mut |id|{ + if !(self.contacts.contains_key(&id)||self.intersects.contains_key(&id)){ + collector.collect(self.predict_collision_start(self.time,time_limit,id)); } - collector.collect(self.predict_collision_start(self.time,time_limit,i)); - } + }); if self.grounded { //walk maintenance collector.collect(self.next_walk_instruction()); From bde24d35a2a37c6d0ee70988fd613a188f55c587 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 6 Oct 2023 00:34:26 -0700 Subject: [PATCH 272/482] v0.8.0 attributes + bvh --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0ff767f..fc01525 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1682,7 +1682,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strafe-client" -version = "0.7.0" +version = "0.8.0" dependencies = [ "async-executor", "bytemuck", diff --git a/Cargo.toml b/Cargo.toml index 6bf20b5..c2cf853 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strafe-client" -version = "0.7.0" +version = "0.8.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 436706bc4dd105778c3d47ee1f5e78d3a0fb3a94 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 6 Oct 2023 13:57:39 -0700 Subject: [PATCH 273/482] save 4 bytes per model + include camera matrix --- src/main.rs | 25 +++++++++++++++---------- src/model.rs | 2 +- src/shader.wgsl | 13 ++++++------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3b5c70e..0b81b78 100644 --- a/src/main.rs +++ b/src/main.rs @@ -73,7 +73,7 @@ impl GraphicsCamera{ pub fn proj(&self)->glam::Mat4{ perspective_rh(self.fov.x, self.fov.y, 0.5, 2000.0) } - pub fn view(&self,pos:glam::Vec3,angles:glam::Vec2)->glam::Mat4{ + pub fn world(&self,pos:glam::Vec3,angles:glam::Vec2)->glam::Mat4{ //f32 good enough for view matrix glam::Mat4::from_translation(pos) * glam::Mat4::from_euler(glam::EulerRot::YXZ, angles.x, angles.y, 0f32) } @@ -82,17 +82,17 @@ impl GraphicsCamera{ self.fov.x=self.fov.y*(screen_size.x as f32)/(screen_size.y as f32); } - pub fn to_uniform_data(&self,(pos,angles): (glam::Vec3,glam::Vec2)) -> [f32; 16 * 3 + 4] { + pub fn to_uniform_data(&self,(pos,angles): (glam::Vec3,glam::Vec2)) -> [f32; 16 * 4] { let proj=self.proj(); let proj_inv = proj.inverse(); - let view=self.view(pos,angles); - let view_inv = view.inverse(); + let view_inv=self.world(pos,angles); + let view=view_inv.inverse(); - let mut raw = [0f32; 16 * 3 + 4]; + let mut raw = [0f32; 16 * 4]; raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); - raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view_inv)[..]); - raw[48..52].copy_from_slice(AsRef::<[f32; 4]>::as_ref(&view.col(3))); + raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view)[..]); + raw[48..64].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view_inv)[..]); raw } } @@ -226,7 +226,7 @@ impl GlobalState{ }else{ Some(ModelGraphicsInstance{ transform: glam::Mat4::from(instance.transform), - normal_transform: glam::Mat4::from(instance.transform.inverse()).transpose(), + normal_transform: glam::Mat3::from(instance.transform.matrix3.inverse().transpose()), color: instance.color, }) } @@ -374,7 +374,7 @@ impl GlobalState{ } } -const MODEL_BUFFER_SIZE:usize=4*4 + 4*4 + 4;//let size=std::mem::size_of::(); +const MODEL_BUFFER_SIZE:usize=4*4 + 12 + 4;//let size=std::mem::size_of::(); const MODEL_BUFFER_SIZE_BYTES:usize=MODEL_BUFFER_SIZE*4; fn get_instances_buffer_data(instances:&[ModelGraphicsInstance]) -> Vec { let mut raw = Vec::with_capacity(MODEL_BUFFER_SIZE*instances.len()); @@ -383,7 +383,12 @@ fn get_instances_buffer_data(instances:&[ModelGraphicsInstance]) -> Vec { //model transform raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&mi.transform)[..]); //normal transform - raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&mi.normal_transform)[..]); + raw.extend_from_slice(AsRef::<[f32; 3]>::as_ref(&mi.normal_transform.x_axis)); + raw.extend_from_slice(&[0.0]); + raw.extend_from_slice(AsRef::<[f32; 3]>::as_ref(&mi.normal_transform.y_axis)); + raw.extend_from_slice(&[0.0]); + raw.extend_from_slice(AsRef::<[f32; 3]>::as_ref(&mi.normal_transform.z_axis)); + raw.extend_from_slice(&[0.0]); //color raw.extend_from_slice(AsRef::<[f32; 4]>::as_ref(&mi.color)); raw.append(&mut v); diff --git a/src/model.rs b/src/model.rs index 6434734..3040a61 100644 --- a/src/model.rs +++ b/src/model.rs @@ -52,7 +52,7 @@ pub struct ModelSingleTexture{ #[derive(Clone)] pub struct ModelGraphicsInstance{ pub transform:glam::Mat4, - pub normal_transform:glam::Mat4, + pub normal_transform:glam::Mat3, pub color:glam::Vec4, } pub struct ModelInstance{ diff --git a/src/shader.wgsl b/src/shader.wgsl index 5e2a7e1..f993df4 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -5,8 +5,8 @@ struct Camera { proj_inv: mat4x4, // from world to camera view: mat4x4, - // camera position - cam_pos: vec4, + // from camera to world + view_inv: mat4x4, }; //group 0 is the camera @@ -31,8 +31,7 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { 1.0 ); - // transposition = inversion for this orthonormal matrix - let inv_model_view = transpose(mat3x3(camera.view[0].xyz, camera.view[1].xyz, camera.view[2].xyz)); + let inv_model_view = mat3x3(camera.view_inv[0].xyz, camera.view_inv[1].xyz, camera.view_inv[2].xyz); let unprojected = camera.proj_inv * pos; var result: SkyOutput; @@ -43,7 +42,7 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { struct ModelInstance{ transform:mat4x4, - normal_transform:mat4x4, + normal_transform:mat3x3, color:vec4, } //my fancy idea is to create a megatexture for each model that includes all the textures each intance will need @@ -78,11 +77,11 @@ fn vs_entity_texture( ) -> EntityOutputTexture { var position: vec4 = model_instances[instance].transform * vec4(pos, 1.0); var result: EntityOutputTexture; - result.normal = (model_instances[instance].normal_transform * vec4(normal, 1.0)).xyz; + result.normal = model_instances[instance].normal_transform * normal; result.texture = texture; result.color = color; result.model_color = model_instances[instance].color; - result.view = position.xyz - camera.cam_pos.xyz; + result.view = position.xyz - camera.view_inv[3].xyz;//col(3) result.position = camera.proj * camera.view * position; return result; } From 5b935c32fe508c20de1902acc36f471efcd312e3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 6 Oct 2023 14:28:29 -0700 Subject: [PATCH 274/482] p --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 0b81b78..c669bf6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -235,7 +235,7 @@ impl GlobalState{ let id=unique_texture_models.len(); let mut unique_textures=Vec::new(); for group in model.groups.into_iter(){ - //ignore zero coppy optimization for now + //ignore zero copy optimization for now let texture_index=if let Some(texture_index)=unique_textures.iter().position(|&texture|texture==group.texture){ texture_index }else{ From 4adce7acd3b731b6279bb8d5bb9cb5356c190080 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 6 Oct 2023 15:45:22 -0700 Subject: [PATCH 275/482] fix cancollide false triggers + losing speed from hitting teleports why can't I make this into a function --- src/load_roblox.rs | 14 ++++---- src/physics.rs | 87 ++++++++++++++++++++++++++++++---------------- 2 files changed, 66 insertions(+), 35 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index 3df6e01..dbec8ed 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -34,11 +34,12 @@ fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3,force_intersect let mut general=crate::model::GameMechanicAttributes::default(); let mut intersecting=crate::model::IntersectingAttributes::default(); let mut contacting=crate::model::ContactingAttributes::default(); + let mut force_can_collide=can_collide; match name{ //"Water"=>intersecting.water=Some(crate::model::IntersectingWater{density:1.0,drag:1.0}), - "Accelerator"=>intersecting.accelerator=Some(crate::model::IntersectingAccelerator{acceleration:velocity}), - "MapFinish"=>general.zone=Some(crate::model::GameMechanicZone{mode_id:0,behaviour:crate::model::ZoneBehaviour::Finish}), - "MapAnticheat"=>general.zone=Some(crate::model::GameMechanicZone{mode_id:0,behaviour:crate::model::ZoneBehaviour::Anitcheat}), + "Accelerator"=>{force_can_collide=false;intersecting.accelerator=Some(crate::model::IntersectingAccelerator{acceleration:velocity})}, + "MapFinish"=>{force_can_collide=false;general.zone=Some(crate::model::GameMechanicZone{mode_id:0,behaviour:crate::model::ZoneBehaviour::Finish})}, + "MapAnticheat"=>{force_can_collide=false;general.zone=Some(crate::model::GameMechanicZone{mode_id:0,behaviour:crate::model::ZoneBehaviour::Anitcheat})}, "Platform"=>general.stage_element=Some(crate::model::GameMechanicStageElement{ mode_id:0, stage_id:0, @@ -57,14 +58,15 @@ fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3,force_intersect }, behaviour:match &captures[2]{ "Spawn"|"SpawnAt"=>crate::model::StageElementBehaviour::SpawnAt, - "Trigger"=>crate::model::StageElementBehaviour::Trigger, - "Teleport"=>crate::model::StageElementBehaviour::Teleport, + "Trigger"=>{force_can_collide=false;crate::model::StageElementBehaviour::Trigger}, + "Teleport"=>{force_can_collide=false;crate::model::StageElementBehaviour::Teleport}, "Platform"=>crate::model::StageElementBehaviour::Platform, _=>panic!("regex1[2] messed up bad"), } }) }else if let Some(captures)=lazy_regex::regex!(r"^Bonus(Finish|Anticheat)(\d+)$") .captures(other){ + force_can_collide=false; match &captures[1]{ "Finish"=>general.zone=Some(crate::model::GameMechanicZone{mode_id:captures[2].parse::().unwrap(),behaviour:crate::model::ZoneBehaviour::Finish}), "Anticheat"=>general.zone=Some(crate::model::GameMechanicZone{mode_id:captures[2].parse::().unwrap(),behaviour:crate::model::ZoneBehaviour::Anitcheat}), @@ -77,7 +79,7 @@ fn get_attributes(name:&str,can_collide:bool,velocity:glam::Vec3,force_intersect if velocity!=glam::Vec3::ZERO{ general.booster=Some(crate::model::GameMechanicBooster{velocity}); } - match can_collide{ + match force_can_collide{ true=>{ match name{ //"Bounce"=>(), diff --git a/src/physics.rs b/src/physics.rs index 7081072..d3c0b72 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -1094,35 +1094,35 @@ impl crate::instruction::InstructionConsumer for PhysicsStat } //check ground self.contacts.insert(c.model,c); - match &general.stage_element{ - Some(stage_element)=>{ - if stage_element.force||self.game.stage_id(), - crate::model::StageElementBehaviour::Trigger - |crate::model::StageElementBehaviour::Teleport=>{ - //TODO make good - if let Some(mode)=self.get_mode(stage_element.mode_id){ - if let Some(&spawn)=mode.get_spawn_model_id(self.game.stage_id){ - if let Some(model)=self.models.get(spawn as usize){ - self.body.position=model.transform.transform_point3(glam::Vec3::Y)+glam::Vec3::Y*(self.style.hitbox_halfsize.y+0.1); - //manual clear //for c in self.contacts{process_instruction(CollisionEnd(c))} - self.contacts.clear(); - self.intersects.clear(); - self.body.acceleration=self.style.gravity; - self.walk.state=WalkEnum::Reached; - self.grounded=false; - }else{println!("bad1");} - }else{println!("bad2");} - }else{println!("bad3");} - }, - crate::model::StageElementBehaviour::Platform=>(), - } - }, - None=>(), - } + match &general.stage_element{ + Some(stage_element)=>{ + if stage_element.force||self.game.stage_id(), + crate::model::StageElementBehaviour::Trigger + |crate::model::StageElementBehaviour::Teleport=>{ + //TODO make good + if let Some(mode)=self.get_mode(stage_element.mode_id){ + if let Some(&spawn)=mode.get_spawn_model_id(self.game.stage_id){ + if let Some(model)=self.models.get(spawn as usize){ + self.body.position=model.transform.transform_point3(glam::Vec3::Y)+glam::Vec3::Y*(self.style.hitbox_halfsize.y+0.1); + //manual clear //for c in self.contacts{process_instruction(CollisionEnd(c))} + self.contacts.clear(); + self.intersects.clear(); + self.body.acceleration=self.style.gravity; + self.walk.state=WalkEnum::Reached; + self.grounded=false; + }else{println!("bad1");} + }else{println!("bad2");} + }else{println!("bad3");} + }, + crate::model::StageElementBehaviour::Platform=>(), + } + }, + None=>(), + } //flatten v let mut v=self.body.velocity; self.contact_constrain_velocity(&mut v); @@ -1142,6 +1142,35 @@ impl crate::instruction::InstructionConsumer for PhysicsStat PhysicsCollisionAttributes::Intersect{intersecting,general}=>{ //I think that setting the velocity to 0 was preventing surface contacts from entering an infinite loop self.intersects.insert(c.model,c); + match &general.stage_element{ + Some(stage_element)=>{ + if stage_element.force||self.game.stage_id(), + crate::model::StageElementBehaviour::Trigger + |crate::model::StageElementBehaviour::Teleport=>{ + //TODO make good + if let Some(mode)=self.get_mode(stage_element.mode_id){ + if let Some(&spawn)=mode.get_spawn_model_id(self.game.stage_id){ + if let Some(model)=self.models.get(spawn as usize){ + self.body.position=model.transform.transform_point3(glam::Vec3::Y)+glam::Vec3::Y*(self.style.hitbox_halfsize.y+0.1); + //manual clear //for c in self.contacts{process_instruction(CollisionEnd(c))} + self.contacts.clear(); + self.intersects.clear(); + self.body.acceleration=self.style.gravity; + self.walk.state=WalkEnum::Reached; + self.grounded=false; + }else{println!("bad1");} + }else{println!("bad2");} + }else{println!("bad3");} + }, + crate::model::StageElementBehaviour::Platform=>(), + } + }, + None=>(), + } }, } }, From 944393dabec6f08287765d43fa6904724d93767c Mon Sep 17 00:00:00 2001 From: Quaternions Date: Fri, 6 Oct 2023 15:45:49 -0700 Subject: [PATCH 276/482] free performance --- src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index c669bf6..e5c3b57 100644 --- a/src/main.rs +++ b/src/main.rs @@ -265,9 +265,9 @@ impl GlobalState{ let mut vertices = Vec::new(); let mut index_from_vertex = std::collections::HashMap::new();//:: let mut entities = Vec::new(); - //TODO: combine groups using the same render pattern - for group in model.groups { + //this mut be combined in a more complex way if the models use different render patterns per group let mut indices = Vec::new(); + for group in model.groups { for poly in group.polys { for end_index in 2..poly.vertices.len() { for &index in &[0, end_index - 1, end_index] { @@ -289,8 +289,8 @@ impl GlobalState{ } } } - entities.push(indices); } + entities.push(indices); models.push(model::ModelSingleTexture{ instances:model.instances, vertices, From e398da3aa61ec6a369518e958c50619583344c4f Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 7 Oct 2023 01:54:52 -0700 Subject: [PATCH 277/482] there was never a normal vector problem --- src/shader.wgsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shader.wgsl b/src/shader.wgsl index f993df4..5addba9 100644 --- a/src/shader.wgsl +++ b/src/shader.wgsl @@ -108,5 +108,5 @@ fn fs_entity_texture(vertex: EntityOutputTexture) -> @location(0) vec4 { let fragment_color = textureSample(model_texture, model_sampler, vertex.texture)*vertex.color; let reflected_color = textureSample(cube_texture, cube_sampler, reflected).rgb; - return mix(vec4(vec3(0.05) + 0.2 * reflected_color,1.0),mix(vertex.model_color,vec4(fragment_color.rgb,1.0),fragment_color.a),1.0-pow(1.0-abs(d),2.0)); + return mix(vec4(vec3(0.05) + 0.2 * reflected_color,1.0),mix(vertex.model_color,vec4(fragment_color.rgb,1.0),fragment_color.a),0.5+0.5*abs(d)); } From 684dbda73a0f774bae0df9f502620ffe9ba84950 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 7 Oct 2023 14:12:39 -0700 Subject: [PATCH 278/482] use rust --- src/load_roblox.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index dbec8ed..a24a59e 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -311,9 +311,7 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index }; let normal_id=normalid.to_u32(); if normal_id<6{ - let mut roblox_texture_transform=RobloxTextureTransform::default(); - let mut roblox_texture_color=glam::Vec4::ONE; - if decal.class=="Texture"{ + let (roblox_texture_color,roblox_texture_transform)=if decal.class=="Texture"{ //generate tranform if let ( Some(rbx_dom_weak::types::Variant::Float32(ox)), @@ -336,13 +334,19 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index 5=>(size.x,size.y),//front _=>panic!("unreachable"), }; - roblox_texture_transform=RobloxTextureTransform{ - offset_u:*ox/(*sx),offset_v:*oy/(*sy), - scale_u:size_u/(*sx),scale_v:size_v/(*sy), - }; - roblox_texture_color=glam::vec4(decal_color3.r,decal_color3.g,decal_color3.b,1.0-*decal_transparency); + ( + glam::vec4(decal_color3.r,decal_color3.g,decal_color3.b,1.0-*decal_transparency), + RobloxTextureTransform{ + offset_u:*ox/(*sx),offset_v:*oy/(*sy), + scale_u:size_u/(*sx),scale_v:size_v/(*sy), + } + ) + }else{ + (glam::Vec4::ONE,RobloxTextureTransform::default()) } - } + }else{ + (glam::Vec4::ONE,RobloxTextureTransform::default()) + }; part_texture_description[normal_id as usize]=Some(RobloxFaceTextureDescription{ texture:texture_id, color:roblox_texture_color, From 82d71df94e41e0fbda91502d3749ca2e9c1c703d Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sat, 7 Oct 2023 21:46:40 -0700 Subject: [PATCH 279/482] texture fallbacks for corner wedge --- src/load_roblox.rs | 15 +++++++++------ src/primitives.rs | 13 ++++++++----- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/load_roblox.rs b/src/load_roblox.rs index a24a59e..1bb0149 100644 --- a/src/load_roblox.rs +++ b/src/load_roblox.rs @@ -178,7 +178,7 @@ impl RobloxFaceTextureDescription{ } type RobloxPartDescription=[Option;6]; type RobloxWedgeDescription=[Option;5]; -type RobloxCornerWedgeDescription=[Option;4]; +type RobloxCornerWedgeDescription=[Option;5]; #[derive(Clone,Eq,Hash,PartialEq)] enum RobloxBasePartDescription{ Sphere, @@ -380,9 +380,11 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index f3,//Cube::Left->Wedge::Left f4,//Cube::Bottom->Wedge::Bottom ]), + //TODO: fix Left+Back texture coordinates to match roblox when not overwridden by Top primitives::Primitives::CornerWedge=>RobloxBasePartDescription::CornerWedge([ f0,//Cube::Right->CornerWedge::Right - f1,//Cube::Top->CornerWedge::Top + if f2.is_some(){f2}else{f1.clone()},//Cube::Back|Cube::Top->CornerWedge::TopBack + if f3.is_some(){f3}else{f1},//Cube::Left|Cube::Top->CornerWedge::TopLeft f4,//Cube::Bottom->CornerWedge::Bottom f5,//Cube::Front->CornerWedge::Front ]), @@ -441,10 +443,11 @@ pub fn generate_indexed_models(dom:rbx_dom_weak::WeakDom) -> crate::model::Index for (face_id,roblox_face_description) in cornerwedge_texture_description.iter().enumerate(){ cornerwedge_face_description.insert( match face_id{ - 0=>primitives::CornerWedgeFace::Top, - 1=>primitives::CornerWedgeFace::Right, - 2=>primitives::CornerWedgeFace::Bottom, - 3=>primitives::CornerWedgeFace::Front, + 0=>primitives::CornerWedgeFace::Right, + 1=>primitives::CornerWedgeFace::TopBack, + 2=>primitives::CornerWedgeFace::TopLeft, + 3=>primitives::CornerWedgeFace::Bottom, + 4=>primitives::CornerWedgeFace::Front, _=>panic!("unreachable"), }, match roblox_face_description{ diff --git a/src/primitives.rs b/src/primitives.rs index fd290ff..1ca3571 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -107,8 +107,9 @@ local cornerWedgeVerticies = { */ #[derive(Hash,PartialEq,Eq)] pub enum CornerWedgeFace{ - Top, Right, + TopBack, + TopLeft, Bottom, Front, } @@ -162,7 +163,8 @@ pub type CornerWedgeFaceDescription=std::collections::HashMap::crate::model::IndexedModel{ let mut t=CornerWedgeFaceDescription::new(); t.insert(CornerWedgeFace::Right,FaceDescription::default()); - t.insert(CornerWedgeFace::Top,FaceDescription::default()); + t.insert(CornerWedgeFace::TopBack,FaceDescription::default()); + t.insert(CornerWedgeFace::TopLeft,FaceDescription::default()); t.insert(CornerWedgeFace::Bottom,FaceDescription::default()); t.insert(CornerWedgeFace::Front,FaceDescription::default()); generate_partial_unit_cornerwedge(t) @@ -456,9 +458,10 @@ pub fn generate_partial_unit_cornerwedge(face_descriptions:CornerWedgeFaceDescri } as u32; let face_id=match face{ CornerWedgeFace::Right => 0, - CornerWedgeFace::Top => 1, - CornerWedgeFace::Bottom => 2, - CornerWedgeFace::Front => 3, + CornerWedgeFace::TopBack => 1, + CornerWedgeFace::TopLeft => 2, + CornerWedgeFace::Bottom => 3, + CornerWedgeFace::Front => 4, }; //always push normal let normal_index=generated_normal.len() as u32; From f3dd43b171fa61a9e8239b7a6fef1b4a641addc5 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 9 Oct 2023 16:31:28 -0700 Subject: [PATCH 280/482] add configparser dep --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + 2 files changed, 8 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index fc01525..c6348cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -331,6 +331,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "configparser" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5458d9d1a587efaf5091602c59d299696a3877a439c8f6d461a2d3cce11df87a" + [[package]] name = "constant_time_eq" version = "0.3.0" @@ -1686,6 +1692,7 @@ version = "0.8.0" dependencies = [ "async-executor", "bytemuck", + "configparser", "ddsfile", "env_logger", "glam", diff --git a/Cargo.toml b/Cargo.toml index c2cf853..00031aa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" [dependencies] async-executor = "1.5.1" bytemuck = { version = "1.13.1", features = ["derive"] } +configparser = "3.0.2" ddsfile = "0.5.1" env_logger = "0.10.0" glam = "0.24.1" From dd13a066d09a1ddb8a6a5c52e9e318da04e61e89 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 9 Oct 2023 17:09:24 -0700 Subject: [PATCH 281/482] settings module --- src/main.rs | 1 + src/settings.rs | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 src/settings.rs diff --git a/src/main.rs b/src/main.rs index e5c3b57..4823996 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ mod model; mod zeroes; mod worker; mod physics; +mod settings; mod framework; mod primitives; mod instruction; diff --git a/src/settings.rs b/src/settings.rs new file mode 100644 index 0000000..dca1763 --- /dev/null +++ b/src/settings.rs @@ -0,0 +1,101 @@ +struct Ratio{ + ratio:f64, +} +enum DerivedFov{ + FromScreenAspect, + FromAspect(Ratio), +} +enum Fov{ + Exactly{x:f64,y:f64}, + DeriveX{x:DerivedFov,y:f64}, + DeriveY{x:f64,y:DerivedFov}, +} +impl Default for Fov{ + fn default() -> Self { + Fov::DeriveX{x:DerivedFov::FromScreenAspect,y:1.0} + } +} + +enum Sensitivity{ + Exactly{x:f64,y:f64}, + DeriveX{x:Ratio,y:f64}, + DeriveY{x:f64,y:Ratio}, +} +impl Default for Sensitivity{ + fn default() -> Self { + Sensitivity::DeriveY{x:0.001,y:Ratio{ratio:1.0}} + } +} + +#[derive(Default)] +pub struct UserSettings{ + fov:Fov, + sensitivity:Sensitivity, +} + +/* +//sensitivity is raw input dots (i.e. dpi = dots per inch) to radians conversion factor +sensitivity_x=0.001 +sensitivity_y_from_x_ratio=1 +Sensitivity::DeriveY{x:0.0.001,y:DerivedSensitivity{ratio:1.0}} +*/ + +pub fn read_user_settings()->UserSettings{ + let mut cfg=configparser::ini::Ini::new(); + if let Ok(_)=cfg.load("settings.conf"){ + let (cfg_fov_x,cfg_fov_y)=(cfg.getfloat("camera","fov_x"),cfg.getfloat("camera","fov_y")); + let fov=match(cfg_fov_x,cfg_fov_y){ + (Ok(Some(fov_x)),Ok(Some(fov_y)))=>Fov::Exactly { + x:fov_x, + y:fov_y + }, + (Ok(Some(fov_x)),Ok(None))=>Fov::DeriveY{ + x:fov_x, + y:if let Ok(Some(fov_y_from_x_ratio))=cfg.getfloat("camera","fov_y_from_x_ratio"){ + DerivedFov::FromAspect(Ratio{ratio:fov_y_from_x_ratio}) + }else{ + DerivedFov::FromScreenAspect + } + }, + (Ok(None),Ok(Some(fov_y)))=>Fov::DeriveX{ + x:if let Ok(Some(fov_x_from_y_ratio))=cfg.getfloat("camera","fov_x_from_y_ratio"){ + DerivedFov::FromAspect(Ratio{ratio:fov_x_from_y_ratio}) + }else{ + DerivedFov::FromScreenAspect + }, + y:fov_y, + }, + _=>{ + Fov::default() + }, + }; + let (cfg_sensitivity_x,cfg_sensitivity_y)=(cfg.getfloat("camera","sensitivity_x"),cfg.getfloat("camera","sensitivity_y")); + let sensitivity=match(cfg_sensitivity_x,cfg_sensitivity_y){ + (Ok(Some(sensitivity_x)),Ok(Some(sensitivity_y)))=>Sensitivity::Exactly { + x:sensitivity_x, + y:sensitivity_y + }, + (Ok(Some(sensitivity_x)),Ok(None))=>Sensitivity::DeriveY{ + x:sensitivity_x, + y:Ratio{ + ratio:if let Ok(Some(sensitivity_y_from_x_ratio))=cfg.getfloat("camera","sensitivity_y_from_x_ratio"){sensitivity_y_from_x_ratio}else{1.0} + } + }, + (Ok(None),Ok(Some(sensitivity_y)))=>Sensitivity::DeriveX{ + x:Ratio{ + ratio:if let Ok(Some(sensitivity_x_from_y_ratio))=cfg.getfloat("camera","sensitivity_x_from_y_ratio"){sensitivity_x_from_y_ratio}else{1.0} + }, + y:sensitivity_y, + }, + _=>{ + Sensitivity::default() + }, + }; + UserSettings{ + fov, + sensitivity, + } + }else{ + UserSettings::default() + } +} \ No newline at end of file From 3552491a9af364b8ec47cbe432a1c29da5f6e949 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 9 Oct 2023 18:29:25 -0700 Subject: [PATCH 282/482] calculators --- src/settings.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/settings.rs b/src/settings.rs index dca1763..2e27e87 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -32,6 +32,28 @@ pub struct UserSettings{ fov:Fov, sensitivity:Sensitivity, } +impl UserSettings{ + pub fn calculate_fov(&self,zoom:f64,screen_size:&glam::UVec2)->glam::DVec2{ + zoom*match &self.fov{ + &Fov::Exactly{x,y}=>glam::dvec2(x,y), + Fov::DeriveX{x,y}=>match x{ + DerivedFov::FromScreenAspect=>glam::dvec2(y*(screen_size.x as f64/screen_size.y as f64),*y), + DerivedFov::FromAspect(ratio)=>glam::dvec2(y*ratio.ratio,*y), + }, + Fov::DeriveY{x,y}=>match y{ + DerivedFov::FromScreenAspect=>glam::dvec2(*x,x*(screen_size.y as f64/screen_size.x as f64)), + DerivedFov::FromAspect(ratio)=>glam::dvec2(*x,x*ratio.ratio), + }, + } + } + pub fn calculate_sensitivity(&self)->glam::DVec2{ + match &self.sensitivity{ + &Sensitivity::Exactly{x,y}=>glam::dvec2(x,y), + Sensitivity::DeriveX{x,y}=>glam::dvec2(y*x.ratio,*y), + Sensitivity::DeriveY{x,y}=>glam::dvec2(*x,x*y.ratio), + } + } +} /* //sensitivity is raw input dots (i.e. dpi = dots per inch) to radians conversion factor From 9dec53d764c767a54b43cef2ff595510e779fe7e Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 9 Oct 2023 19:44:49 -0700 Subject: [PATCH 283/482] implement config --- src/main.rs | 30 +++++++++++++++++++++--------- src/physics.rs | 6 +++++- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main.rs b/src/main.rs index 4823996..45511b7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -65,10 +65,10 @@ fn perspective_rh(fov_x_slope: f32, fov_y_slope: f32, z_near: f32, z_far: f32) - ) } impl GraphicsCamera{ - pub fn new(screen_size:glam::UVec2,fov_y:f32)->Self{ + pub fn new(screen_size:glam::UVec2,fov:glam::Vec2)->Self{ Self{ screen_size, - fov: glam::vec2(fov_y*(screen_size.x as f32)/(screen_size.y as f32),fov_y), + fov, } } pub fn proj(&self)->glam::Mat4{ @@ -78,10 +78,6 @@ impl GraphicsCamera{ //f32 good enough for view matrix glam::Mat4::from_translation(pos) * glam::Mat4::from_euler(glam::EulerRot::YXZ, angles.x, angles.y, 0f32) } - pub fn set_screen_size(&mut self,screen_size:glam::UVec2){ - self.screen_size=screen_size; - self.fov.x=self.fov.y*(screen_size.x as f32)/(screen_size.y as f32); - } pub fn to_uniform_data(&self,(pos,angles): (glam::Vec3,glam::Vec2)) -> [f32; 16 * 4] { let proj=self.proj(); @@ -115,12 +111,16 @@ impl GraphicsState{ pub fn clear(&mut self){ self.models.clear(); } + pub fn load_user_settings(&mut self,user_settings:&settings::UserSettings){ + self.camera.fov=user_settings.calculate_fov(1.0,&self.camera.screen_size).as_vec2(); + } } pub struct GlobalState{ start_time: std::time::Instant, manual_mouse_lock:bool, mouse:physics::MouseState, + user_settings:settings::UserSettings, graphics:GraphicsState, physics_thread:worker::CompatWorker,physics::PhysicsOutputState,Box)->physics::PhysicsOutputState>>, } @@ -414,6 +414,8 @@ impl framework::Example for GlobalState { device: &wgpu::Device, queue: &wgpu::Queue, ) -> Self { + //wee + let user_settings=settings::read_user_settings(); let mut indexed_models = Vec::new(); indexed_models.append(&mut model::generate_indexed_model_list_from_obj(obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap(),*glam::Vec4::ONE.as_ref())); indexed_models.push(primitives::unit_sphere()); @@ -753,7 +755,11 @@ impl framework::Example for GlobalState { let mut physics = physics::PhysicsState::default(); - let camera=GraphicsCamera::new(glam::uvec2(config.width,config.height), 1.0); + physics.load_user_settings(&user_settings); + + let screen_size=glam::uvec2(config.width,config.height); + + let camera=GraphicsCamera::new(screen_size,user_settings.calculate_fov(1.0,&screen_size).as_vec2()); let camera_uniforms = camera.to_uniform_data(physics.output().adjust_mouse(&physics.next_mouse)); let camera_buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Camera"), @@ -788,7 +794,7 @@ impl framework::Example for GlobalState { let depth_view = Self::create_depth_texture(config, device); - let graphics=GraphicsState { + let mut graphics=GraphicsState { pipelines:GraphicsPipelines{ skybox:sky_pipeline, model:model_pipeline @@ -807,6 +813,8 @@ impl framework::Example for GlobalState { temp_squid_texture_view: squid_texture_view, }; + graphics.load_user_settings(&user_settings); + let indexed_model_instances=model::IndexedModelInstances{ textures:Vec::new(), models:indexed_models, @@ -828,6 +836,7 @@ impl framework::Example for GlobalState { start_time:Instant::now(), manual_mouse_lock:false, mouse:physics::MouseState::default(), + user_settings, graphics, physics_thread, }; @@ -889,9 +898,11 @@ impl framework::Example for GlobalState { time:physics.time, instruction: PhysicsInstruction::Input(physics::PhysicsInputInstruction::Reset), }); + physics.load_user_settings(&self.user_settings); physics.generate_models(&indexed_model_instances); self.physics_thread=physics.into_worker(); + //graphics.load_user_settings(&self.user_settings); self.generate_model_graphics(device,queue,indexed_model_instances); //manual reset }else{ @@ -1030,7 +1041,8 @@ impl framework::Example for GlobalState { _queue: &wgpu::Queue, ) { self.graphics.depth_view = Self::create_depth_texture(config, device); - self.graphics.camera.set_screen_size(glam::uvec2(config.width, config.height)); + self.graphics.camera.screen_size=glam::uvec2(config.width, config.height); + self.graphics.load_user_settings(&self.user_settings); } fn render( diff --git a/src/physics.rs b/src/physics.rs index d3c0b72..5696188 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -175,7 +175,7 @@ impl PhysicsCamera { Self{ offset, angles: glam::DVec2::ZERO, - sensitivity: glam::dvec2(1.0/16384.0,1.0/16384.0), + sensitivity: glam::dvec2(1.0/1024.0,1.0/1024.0), mouse:MouseState{pos:glam::IVec2::ZERO,time:-1},//escape initialization hell divide by zero } } @@ -617,6 +617,10 @@ impl PhysicsState { println!("Physics Objects: {}",self.models.len()); } + pub fn load_user_settings(&mut self,user_settings:&crate::settings::UserSettings){ + self.camera.sensitivity=user_settings.calculate_sensitivity(); + } + pub fn get_mode(&self,mode_id:u32)->Option<&crate::model::ModeDescription>{ if let Some(&mode)=self.mode_from_mode_id.get(&mode_id){ self.modes.get(mode) From 95fb316a2396ef765c69043513c2a81932f6b5c3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 9 Oct 2023 20:38:03 -0700 Subject: [PATCH 284/482] add fullscreen hotkey --- src/main.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main.rs b/src/main.rs index 45511b7..6cff11a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -951,6 +951,16 @@ impl framework::Example for GlobalState { 57=>Some(InputInstruction::Jump(s)),//Space 44=>Some(InputInstruction::Zoom(s)),//Z 19=>if s{Some(InputInstruction::Reset)}else{None},//R + 87=>{//F11 + if s{ + if window.fullscreen().is_some(){ + window.set_fullscreen(None); + }else{ + window.set_fullscreen(Some(winit::window::Fullscreen::Borderless(None))); + } + } + None + }, 01=>{//Esc if s{ self.manual_mouse_lock=false; From bdc0dd1b3b3408e0c937f2acca1e85ec3bcea04b Mon Sep 17 00:00:00 2001 From: Quaternions Date: Sun, 1 Oct 2023 15:54:50 -0700 Subject: [PATCH 285/482] move keyboard input to WindowEvent to fix Wayland --- src/main.rs | 106 ++++++++++++++++++++++++++-------------------------- 1 file changed, 54 insertions(+), 52 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6cff11a..2d39d3e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -918,61 +918,23 @@ impl framework::Example for GlobalState { #[allow(clippy::single_match)] fn update(&mut self, window: &winit::window::Window, device: &wgpu::Device, queue: &wgpu::Queue, event: winit::event::WindowEvent) { + let time=self.start_time.elapsed().as_nanos() as i64; match event { winit::event::WindowEvent::DroppedFile(path) => self.load_file(path,device,queue), winit::event::WindowEvent::Focused(state)=>{ //pause unpause //recalculate pressed keys on focus - } - _=>(), - } - } - - fn device_event(&mut self, window: &winit::window::Window, event: winit::event::DeviceEvent) { - //there's no way this is the best way get a timestamp. - let time=self.start_time.elapsed().as_nanos() as i64; - match event { - winit::event::DeviceEvent::Key(winit::event::KeyboardInput { - state, - scancode: keycode, + }, + winit::event::WindowEvent::KeyboardInput { + input:winit::event::KeyboardInput{state, virtual_keycode,..}, .. - }) => { + }=>{ let s=match state { winit::event::ElementState::Pressed => true, winit::event::ElementState::Released => false, }; - if let Some(input_instruction)=match keycode { - 17=>Some(InputInstruction::MoveForward(s)),//W - 30=>Some(InputInstruction::MoveLeft(s)),//A - 31=>Some(InputInstruction::MoveBack(s)),//S - 32=>Some(InputInstruction::MoveRight(s)),//D - 18=>Some(InputInstruction::MoveUp(s)),//E - 16=>Some(InputInstruction::MoveDown(s)),//Q - 57=>Some(InputInstruction::Jump(s)),//Space - 44=>Some(InputInstruction::Zoom(s)),//Z - 19=>if s{Some(InputInstruction::Reset)}else{None},//R - 87=>{//F11 - if s{ - if window.fullscreen().is_some(){ - window.set_fullscreen(None); - }else{ - window.set_fullscreen(Some(winit::window::Fullscreen::Borderless(None))); - } - } - None - }, - 01=>{//Esc - if s{ - self.manual_mouse_lock=false; - match window.set_cursor_grab(winit::window::CursorGrabMode::None){ - Ok(())=>(), - Err(e)=>println!("Could not release cursor: {:?}",e), - } - window.set_cursor_visible(true); - } - None - }, - 15=>{//Tab + match virtual_keycode{ + Some(winit::event::VirtualKeyCode::Tab)=>{ if s{ self.manual_mouse_lock=false; match window.set_cursor_position(winit::dpi::PhysicalPosition::new(self.graphics.camera.screen_size.x as f32/2.0, self.graphics.camera.screen_size.y as f32/2.0)){ @@ -1000,16 +962,56 @@ impl framework::Example for GlobalState { } } window.set_cursor_visible(s); - None }, - _ => {println!("scancode {}",keycode);None}, - }{ - self.physics_thread.send(TimedInstruction{ - time, - instruction:input_instruction, - }).unwrap(); + Some(winit::event::VirtualKeyCode::F11)=>{ + if s{ + if window.fullscreen().is_some(){ + window.set_fullscreen(None); + }else{ + window.set_fullscreen(Some(winit::window::Fullscreen::Borderless(None))); + } + } + }, + Some(winit::event::VirtualKeyCode::Escape)=>{ + if s{ + self.manual_mouse_lock=false; + match window.set_cursor_grab(winit::window::CursorGrabMode::None){ + Ok(())=>(), + Err(e)=>println!("Could not release cursor: {:?}",e), + } + window.set_cursor_visible(true); + } + }, + Some(keycode)=>{ + if let Some(input_instruction)=match keycode { + winit::event::VirtualKeyCode::W => Some(InputInstruction::MoveForward(s)), + winit::event::VirtualKeyCode::A => Some(InputInstruction::MoveLeft(s)), + winit::event::VirtualKeyCode::S => Some(InputInstruction::MoveBack(s)), + winit::event::VirtualKeyCode::D => Some(InputInstruction::MoveRight(s)), + winit::event::VirtualKeyCode::E => Some(InputInstruction::MoveUp(s)), + winit::event::VirtualKeyCode::Q => Some(InputInstruction::MoveDown(s)), + winit::event::VirtualKeyCode::Space => Some(InputInstruction::Jump(s)), + winit::event::VirtualKeyCode::Z => Some(InputInstruction::Zoom(s)), + winit::event::VirtualKeyCode::R => if s{Some(InputInstruction::Reset)}else{None}, + _ => None, + }{ + self.physics_thread.send(TimedInstruction{ + time, + instruction:input_instruction, + }).unwrap(); + } + }, + _=>(), } }, + _=>(), + } + } + + fn device_event(&mut self, window: &winit::window::Window, event: winit::event::DeviceEvent) { + //there's no way this is the best way get a timestamp. + let time=self.start_time.elapsed().as_nanos() as i64; + match event { winit::event::DeviceEvent::MouseMotion { delta,//these (f64,f64) are integers on my machine } => { From e2af6fc4ed1f68ae3d29917fbb3c1a9e024fbbcf Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Oct 2023 15:33:32 -0700 Subject: [PATCH 286/482] sort enums like normalid --- src/physics.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/physics.rs b/src/physics.rs index 5696188..77ce97e 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -19,12 +19,12 @@ pub enum PhysicsInstruction { pub enum PhysicsInputInstruction { ReplaceMouse(MouseState,MouseState), SetNextMouse(MouseState), - SetMoveForward(bool), - SetMoveLeft(bool), - SetMoveBack(bool), SetMoveRight(bool), SetMoveUp(bool), + SetMoveBack(bool), + SetMoveLeft(bool), SetMoveDown(bool), + SetMoveForward(bool), SetJump(bool), SetZoom(bool), Reset, @@ -33,12 +33,12 @@ pub enum PhysicsInputInstruction { #[derive(Debug)] pub enum InputInstruction { MoveMouse(glam::IVec2), - MoveForward(bool), - MoveLeft(bool), - MoveBack(bool), MoveRight(bool), MoveUp(bool), + MoveBack(bool), + MoveLeft(bool), MoveDown(bool), + MoveForward(bool), Jump(bool), Zoom(bool), Reset, From dd0ac7cc7ea0034297be10ceff115b4d98d3c419 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Tue, 10 Oct 2023 16:05:47 -0700 Subject: [PATCH 287/482] overshadowed value by mistake --- src/physics.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/physics.rs b/src/physics.rs index 77ce97e..0e3ff53 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -913,7 +913,7 @@ impl PhysicsState { fn predict_collision_start(&self,time:TIME,time_limit:TIME,model_id:u32) -> Option> { let mesh0=self.mesh(); let mesh1=self.models.get(model_id as usize).unwrap().mesh(); - let (p,v,a,time)=(self.body.position,self.body.velocity,self.body.acceleration,self.body.time); + let (p,v,a,body_time)=(self.body.position,self.body.velocity,self.body.acceleration,self.body.time); //find best t let mut best_time=time_limit; let mut best_face:Option=None; @@ -922,7 +922,7 @@ impl PhysicsState { //must collide now or in the future //must beat the current soonest collision time //must be moving towards surface - let t_time=time+((t as f64)*1_000_000_000f64) as TIME; + let t_time=body_time+((t as f64)*1_000_000_000f64) as TIME; if time<=t_time&&t_time Date: Tue, 10 Oct 2023 16:30:00 -0700 Subject: [PATCH 288/482] silence lint --- src/worker.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/worker.rs b/src/worker.rs index bdeb957..f1d3196 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -79,7 +79,7 @@ fn test_worker() { ); // Send tasks to the worker - for i in 0..5 { + for _ in 0..5 { let task = crate::instruction::TimedInstruction{ time:0, instruction:crate::physics::PhysicsInstruction::StrafeTick, From 0d6741a81c14b21dc322b2d899bd1a45cf6e02d3 Mon Sep 17 00:00:00 2001 From: Quaternions Date: Wed, 27 Sep 2023 02:12:20 -0700 Subject: [PATCH 289/482] integer physics --- src/aabb.rs | 104 +++-- src/bvh.rs | 10 +- src/instruction.rs | 36 +- src/integer.rs | 914 ++++++++++++++++++++++++++++++++++++++++++ src/load_roblox.rs | 38 +- src/main.rs | 68 ++-- src/model.rs | 71 +--- src/model_graphics.rs | 35 ++ src/model_physics.rs | 1 + src/physics.rs | 399 +++++++++--------- src/primitives.rs | 110 ++--- src/settings.rs | 77 ++-- src/worker.rs | 8 +- src/zeroes.rs | 28 +- 14 files changed, 1419 insertions(+), 480 deletions(-) create mode 100644 src/integer.rs create mode 100644 src/model_graphics.rs create mode 100644 src/model_physics.rs diff --git a/src/aabb.rs b/src/aabb.rs index c027d93..14e7844 100644 --- a/src/aabb.rs +++ b/src/aabb.rs @@ -1,3 +1,5 @@ +use crate::integer::Planar64Vec3; + #[derive(Debug,Clone,Copy,Hash,Eq,PartialEq)] pub enum AabbFace{ Right,//+X @@ -8,84 +10,80 @@ pub enum AabbFace{ Front, } #[derive(Clone)] -pub struct Aabb { - pub min: glam::Vec3, - pub max: glam::Vec3, +pub struct Aabb{ + pub min:Planar64Vec3, + pub max:Planar64Vec3, } impl Default for Aabb { - fn default() -> Self { - Aabb::new() + fn default()->Self { + Self{min:Planar64Vec3::MAX,max:Planar64Vec3::MIN} } } -impl Aabb { - const VERTEX_DATA: [glam::Vec3; 8] = [ - glam::vec3(1., -1., -1.), - glam::vec3(1., 1., -1.), - glam::vec3(1., 1., 1.), - glam::vec3(1., -1., 1.), - glam::vec3(-1., -1., 1.), - glam::vec3(-1., 1., 1.), - glam::vec3(-1., 1., -1.), - glam::vec3(-1., -1., -1.), +impl Aabb{ + const VERTEX_DATA:[Planar64Vec3;8]=[ + Planar64Vec3::int( 1,-1,-1), + Planar64Vec3::int( 1, 1,-1), + Planar64Vec3::int( 1, 1, 1), + Planar64Vec3::int( 1,-1, 1), + Planar64Vec3::int(-1,-1, 1), + Planar64Vec3::int(-1, 1, 1), + Planar64Vec3::int(-1, 1,-1), + Planar64Vec3::int(-1,-1,-1), ]; - pub fn new() -> Self { - Self {min: glam::Vec3::INFINITY,max: glam::Vec3::NEG_INFINITY} - } - - pub fn grow(&mut self, point:glam::Vec3){ + pub fn grow(&mut self,point:Planar64Vec3){ self.min=self.min.min(point); self.max=self.max.max(point); } - pub fn join(&mut self, aabb:&Aabb){ + pub fn join(&mut self,aabb:&Aabb){ self.min=self.min.min(aabb.min); self.max=self.max.max(aabb.max); } - pub fn inflate(&mut self, hs:glam::Vec3){ + pub fn inflate(&mut self,hs:Planar64Vec3){ self.min-=hs; self.max+=hs; } pub fn intersects(&self,aabb:&Aabb)->bool{ (self.min.cmplt(aabb.max)&aabb.min.cmplt(self.max)).all() } - pub fn normal(face:AabbFace) -> glam::Vec3 { + pub fn normal(face:AabbFace)->Planar64Vec3{ match face { - AabbFace::Right => glam::vec3(1.,0.,0.), - AabbFace::Top => glam::vec3(0.,1.,0.), - AabbFace::Back => glam::vec3(0.,0.,1.), - AabbFace::Left => glam::vec3(-1.,0.,0.), - AabbFace::Bottom => glam::vec3(0.,-1.,0.), - AabbFace::Front => glam::vec3(0.,0.,-1.), + AabbFace::Right=>Planar64Vec3::int(1,0,0), + AabbFace::Top=>Planar64Vec3::int(0,1,0), + AabbFace::Back=>Planar64Vec3::int(0,0,1), + AabbFace::Left=>Planar64Vec3::int(-1,0,0), + AabbFace::Bottom=>Planar64Vec3::int(0,-1,0), + AabbFace::Front=>Planar64Vec3::int(0,0,-1), } } - pub fn unit_vertices() -> [glam::Vec3;8] { + pub fn unit_vertices()->[Planar64Vec3;8] { return Self::VERTEX_DATA; } - pub fn face(&self,face:AabbFace) -> Aabb { - let mut aabb=self.clone(); - //in this implementation face = worldspace aabb face - match face { - AabbFace::Right => aabb.min.x=aabb.max.x, - AabbFace::Top => aabb.min.y=aabb.max.y, - AabbFace::Back => aabb.min.z=aabb.max.z, - AabbFace::Left => aabb.max.x=aabb.min.x, - AabbFace::Bottom => aabb.max.y=aabb.min.y, - AabbFace::Front => aabb.max.z=aabb.min.z, - } - return aabb; - } - pub fn center(&self)->glam::Vec3{ - return (self.min+self.max)/2.0 + // pub fn face(&self,face:AabbFace)->Aabb { + // let mut aabb=self.clone(); + // //in this implementation face = worldspace aabb face + // match face { + // AabbFace::Right => aabb.min.x=aabb.max.x, + // AabbFace::Top => aabb.min.y=aabb.max.y, + // AabbFace::Back => aabb.min.z=aabb.max.z, + // AabbFace::Left => aabb.max.x=aabb.min.x, + // AabbFace::Bottom => aabb.max.y=aabb.min.y, + // AabbFace::Front => aabb.max.z=aabb.min.z, + // } + // return aabb; + // } + pub fn center(&self)->Planar64Vec3{ + return self.min.midpoint(self.max) } //probably use floats for area & volume because we don't care about precision - pub fn area_weight(&self)->f32{ - let d=self.max-self.min; - d.x*d.y+d.y*d.z+d.z*d.x - } - pub fn volume(&self)->f32{ - let d=self.max-self.min; - d.x*d.y*d.z - } + // pub fn area_weight(&self)->f32{ + // let d=self.max-self.min; + // d.x*d.y+d.y*d.z+d.z*d.x + // } + // pub fn volume(&self)->f32{ + // let d=self.max-self.min; + // d.x*d.y*d.z + // } } \ No newline at end of file diff --git a/src/bvh.rs b/src/bvh.rs index b79ecc0..4196bd7 100644 --- a/src/bvh.rs +++ b/src/bvh.rs @@ -36,7 +36,7 @@ pub fn generate_bvh(boxen:Vec)->BvhNode{ fn generate_bvh_node(boxen:Vec<(usize,Aabb)>)->BvhNode{ let n=boxen.len(); if n<20{ - let mut aabb=Aabb::new(); + let mut aabb=Aabb::default(); let models=boxen.into_iter().map(|b|{aabb.join(&b.1);b.0 as u32}).collect(); BvhNode{ children:Vec::new(), @@ -51,9 +51,9 @@ fn generate_bvh_node(boxen:Vec<(usize,Aabb)>)->BvhNode{ for (i,aabb) in boxen.iter(){ let center=aabb.center(); octant.insert(*i,0); - sort_x.push((*i,center.x)); - sort_y.push((*i,center.y)); - sort_z.push((*i,center.z)); + sort_x.push((*i,center.x())); + sort_y.push((*i,center.y())); + sort_z.push((*i,center.z())); } sort_x.sort_by(|tup0,tup1|tup0.1.partial_cmp(&tup1.1).unwrap()); sort_y.sort_by(|tup0,tup1|tup0.1.partial_cmp(&tup1.1).unwrap()); @@ -92,7 +92,7 @@ fn generate_bvh_node(boxen:Vec<(usize,Aabb)>)->BvhNode{ }; list_list[list_id].push((i,aabb)); } - let mut aabb=Aabb::new(); + let mut aabb=Aabb::default(); let children=list_list.into_iter().map(|b|{ let node=generate_bvh_node(b); aabb.join(&node.aabb); diff --git a/src/instruction.rs b/src/instruction.rs index 3508b93..f8880cb 100644 --- a/src/instruction.rs +++ b/src/instruction.rs @@ -1,23 +1,25 @@ +use crate::integer::Time; + #[derive(Debug)] -pub struct TimedInstruction { - pub time: crate::physics::TIME, - pub instruction: I, +pub struct TimedInstruction{ + pub time:Time, + pub instruction:I, } -pub trait InstructionEmitter { - fn next_instruction(&self, time_limit:crate::physics::TIME) -> Option>; +pub trait InstructionEmitter{ + fn next_instruction(&self,time_limit:Time)->Option>; } -pub trait InstructionConsumer { +pub trait InstructionConsumer{ fn process_instruction(&mut self, instruction:TimedInstruction); } //PROPER PRIVATE FIELDS!!! -pub struct InstructionCollector { - time: crate::physics::TIME, - instruction: Option, +pub struct InstructionCollector{ + time:Time, + instruction:Option, } -impl InstructionCollector { - pub fn new(time:crate::physics::TIME) -> Self { +impl InstructionCollector{ + pub fn new(time:Time)->Self{ Self{ time, instruction:None @@ -25,24 +27,24 @@ impl InstructionCollector { } pub fn collect(&mut self,instruction:Option>){ - match instruction { - Some(unwrap_instruction) => { + match instruction{ + Some(unwrap_instruction)=>{ if unwrap_instruction.time (), + None=>(), } } - pub fn instruction(self) -> Option> { + pub fn instruction(self)->Option>{ //STEAL INSTRUCTION AND DESTROY INSTRUCTIONCOLLECTOR - match self.instruction { + match self.instruction{ Some(instruction)=>Some(TimedInstruction{ time:self.time, instruction }), - None => None, + None=>None, } } } \ No newline at end of file diff --git a/src/integer.rs b/src/integer.rs new file mode 100644 index 0000000..bd43b63 --- /dev/null +++ b/src/integer.rs @@ -0,0 +1,914 @@ +//integer units +#[derive(Clone,Copy,Hash,PartialEq,PartialOrd,Debug)] +pub struct Time(i64); +impl Time{ + pub const ZERO:Self=Self(0); + pub const ONE_SECOND:Self=Self(1_000_000_000); + pub const ONE_MILLISECOND:Self=Self(1_000_000); + pub const ONE_MICROSECOND:Self=Self(1_000); + pub const ONE_NANOSECOND:Self=Self(1); + #[inline] + pub fn from_secs(num:i64)->Self{ + Self(Self::ONE_SECOND.0*num) + } + #[inline] + pub fn from_millis(num:i64)->Self{ + Self(Self::ONE_MILLISECOND.0*num) + } + #[inline] + pub fn from_micros(num:i64)->Self{ + Self(Self::ONE_MICROSECOND.0*num) + } + #[inline] + pub fn from_nanos(num:i64)->Self{ + Self(Self::ONE_NANOSECOND.0*num) + } + //should I have checked subtraction? force all time variables to be positive? + #[inline] + pub fn nanos(&self)->i64{ + self.0 + } +} +impl From for Time{ + #[inline] + fn from(value:Planar64)->Self{ + Time((((value.0 as i128)*1_000_000_000)>>32) as i64) + } +} +impl std::fmt::Display for Time{ + #[inline] + fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ + write!(f,"{}s+{:09}ns",self.0/Self::ONE_SECOND.0,self.0%Self::ONE_SECOND.0) + } +} +impl std::ops::Neg for Time{ + type Output=Time; + #[inline] + fn neg(self)->Self::Output { + Time(-self.0) + } +} +impl std::ops::Add

    _v!g+TbQ|Taw0B zo=Ccj^?tVgr1n?sF7Tn0FOz_0M0Nq)z=s`%dV7p#P)m@`ztV3%>k!53<=Is-`jO3P zr&##2(sQr-Q)v1&)|2*^|@s0DfbK`3oh{ZSpoMemtK1H0Xr{{=TF2I&uvu2 zsg%b2`42ABT#BaMEHm=CrE!vY@R{^{JpuNA*mv)w-G_H+S*pJgfcxc@X|Atg459o9 z%J*KOU9H`aGFTxgb8M&j6Vv?PzNO*v!Za9m9DCatXA4=4rFds%tXJusE{T&pb9}|?bt3*)`u;yd{s4GLGJXEt zU8g!^T6D1Umhf!wmCoo7aPRQr2ghr6pY}RGt83RouY(^i?&VDz{{HJ3pX;1b zXLZRcz}O$e8%&f;y^e)m37&sW)48%-8D&ez8^iT?u3}0pDn3icc=GigUfE0?$%tBm z`GxAMa^{f^E3;BMawtD!1CBp5ddlW2C9TjK3@8O&rHS3JNwaZVbfU3dNU(yWgqG$4 zA2W=XJ`f9YPj4JDgGc33S9y-8uYACeuCDcfIsh5f_xd- z<#L{GHw{=(jAb_7XM4UolI|rg%yj;{PBT|BD$^*at**u%vA+<;$BmOOukCphqNrZu3nFr}2B9p{vxQ zp5OV=eX8%|5Jm1LHz6Kru;TepjB`qMRRQ=Eb?{roczI;c%%+TU_RXIqNx(DxUmr^g zx}z#J;+cWf%c_=X;J??SZ+Tr;ROPA`FvjQEUmn<1e6?&Q`#Nb1^@C3A6#C0tg*KcCyiGWU*|V0=t) zKYlA%DlqDK^g3AyjPgN$5}il=T7ZWzsdKwhb!(2T8sy4*?xlRd5;#{pAUTyJ^WvGS%6;&e@pSz`P>5%eg6fm zR}f%=cVKdCNpx<6#XRVHc6;1osQ=4S)#oN5;Ll5~q@zSR4kY~&kMCFuJw<0+^{0C9 zT+PW2={>uo93|y*(D_Rc#keWTqsocu0v%t@yGWu|sJ${+N7q4=Keqm(xG&;H?ER9Q z{5^}}Qy$OAGp7cpPIB|x->5&0;Ek}(sRQ*uYbqXm4}OAOr=$tn>)4S8KPtld;#Bhr zy)27qBrCfom9N3|v{(4v`6xYK;YyB6stwVK(uFRp`&#`Q%(otHF5xZ*yxQ50 ze61GGtI~9(YsC!xB9g!Mi(1Tgz0Ids!_T>f9b5H%TQK5XKi829FW+w_|IDsvMSMPp zIh9?~(#WwcntTpz|GULH01z!K*R|wh;3t&75U}sEj^zd|9k39;hu*^)Wmy5M`C0R2 zB(9Gq6M&&?6)%u zEqv(xsT$R_plc1=xnE=JhVkAXQ+lU1?>alWvVR@+|B_+$TmL1gs7{3*0~51bBvDH@h)%?&rXdJUgWsqA83ES#+a>9YN=_FjYYn z@W2Ig#~j1=g)UpNnzd+u9zE|_Z{Sy8e`zWH5X}mEgOBo)T;ME>QFM@K%j08u0k04; zB3WQ+HzC=-E&_fbiuAa9Nr(EPheI>$*8o2%ZLF=l5B(xh9PghXj|sWEzY_D=_Shjb z-{}$e>On;<+KFNAly6}Heu(ON^L2`6(0KTG_K7taYl^c8+BBa3IEq2Vh-Cyj!4NMe zx^Ende0@B74|oQSH|?(f-Pr6jPGVaeLF+?G9zGmO-*=L|i2pHB=bXys@kCl5&&S({ zw&5QqXM6Y!)Nc+IB=9#ue2x9(6RSdAPJ!Z>Hd9gc_Csa@Ut+q%Ya76p}|RzkLS+^-kR?Cmsl6?qWT$u zLLsl8LC25hOGL^e<#}%4PZ-+j0cy7bHMdr>_nu!p9q+T5nG|nAe9pHmO-y(_BZ+mN zW$nOYIIz+A{O(L;M#uo%U}4u5G+~wL9$}9go(gte$!bqyB_K z;j7r`OTdqye2Edu7A;>?ya@UVJpKUv9g(Q?Gu#gbd_uD@9a2*#xGB*pHRLAt)~!g z+!(*J9rH~p1yH2@#JISo{p(VD6p9Nv^ zeOH<}_S4j?zfJIc=g@um&6sbjgMCk6o)d}or8INkZw7cwKLMm)AVqfXKJbi>|Ax~i z@F1^Bs3EPH%9cnocK4_CdYrc46k@)9o_V{!!21DOLoM3Cm8|&2EGPypVyI;~m zo^E>nuMF{vWNO&eY<&%zWHuD%!+9%bcy2Q(vmj-Oc~kJbFE*VPIRE0(a`L0APjrv!gWjG><8w1+qRAviQkL$%4)Ijk(7@mMc+GJn^)J;# zUh!DH=g0Ryv9$hVGVHMh@n$s^trn;^=|}5LoOK(udkQWm8vREG%^et&GM|HA0Q5Dm z{p&`HxL%v)3E7_g9W6{rS#2}J8T<=AAG}DQ5_^p!wZ?jup(hln0hxX|Ec|6_&_6-N zit6rK)Pv94!~3!PTI#-m?1VSPkD!;fo)&cD$qPZ&cU zs4_R>ezNyBaULo@YRyjA;ueMTHwpF%y{amlMz*~f5QBJDJZ;auu8}%xw(NDU3l(~9 z#s~RDyI?CP!oDJdy74|{W}2+GKI%Yj>|iM$)VsqOYz-!cI4<7OM+rXymAm3wEBL<# z2j;GgMn0FBCO^Fu`dYz(>5-wh-@(t!&Ido_ggkfQJn$RL9`}qL%zY8+7 z#R5C4t@B!I*cboC2Kv$GO(0vPsy$8q5{;vNCINEgzI9cF90~S!jP%9&<*DMa=S9VS zBKyhqAo}ay;n(4ZIiIb(5lium=$44?xn2HUY_Cx!-%o*mL6?80M}t#68UDD5#xs$q z&QImiI2L;3G(Md~!b1;cH5Q^?o!2L*9Q&y7Lakq+(GNqMq3TpzG~Z?P3%Jrcw~CZF z6(iq2=tuzcg6=wRc9w6HV}HD!L%4qAopB*PBIMI~KhdR~Gnu?Jh;03>7F^^~TRw&dFjjy!G&+~1MhRA!7>RpN+yn-`lEst47 z_yGU#Uw390o^O##aLMNN0Lm9QgZ;HEd9pNUp-^q~OYPMl>hS4Y)L^V%`FyTzkj(}0 zdlvi=)N63%ooshpY3w%O6%#4{!MxM7Dj?f0o=uIKxDxks?{_vIeCiV#jr-f!y6gJh zg1ucv{}uCg^E{mJ;@j-E3D9SxdaW9!$w`a#kQ>FzD1P-E@qJupd?)lt zd4DFGJHDam?jMG+nTF$Koyn+J|9J8VGIaT&Yooy5H%T+U>)1i{4|u*%lx}Ww@czxK zh@+CnGom}AD`M}(-Xp^@$84I3=ktm1jik+~jTD_)2EI7gcbVBqtH;v!?0|=RFRX$e zYvx5=Q;oisqzVT&;raT85y@9vu4p9=!nz9Zr36B$C*FWsV((}92>7R%`cWLz9b{kM z4ewxpZ!q#HQ}Uos;aF!G1pL7Y>Y0m73LQw=?YvdydM>QfqnwocHIQ)&{-FAMaUJ2x zQC6tG_|(*!#q;S@l-*1#1X%Ok$EcnK^d5ww$e<3^W1pV|&0l+ZX5@9F{`2Y6IMoVT zAMza8V9XCo#P?h9{PuO0#wItz|KY1WSMTF~vfG@|gz2ai{zcU9RnjPR{A4<&pF2? zAs>wSQC7Zs#B%h9D|t|Gs33*?DysB8jwf&q+n?Wp@i`TEmGXf^0_Bv_QnbI?!|RVY zn1oLSe_v0|TAgXZ^WY{>dsm&(*Ro3^tIZLgnmXBt){et?=J@db6=5C1D1p>UM3^W4 zm?K^@XGROQyTVVFX^l4fN3Zc}7eWoykztocukU552Y&A>IPD1km&HrZbYp!qL**1^ z7dXcS@4vou{MMU}va=O_N&Q)9TVp423XIub)Xl1t!#B)E{_UfvkJ9_+e@R~cb!7v15 z(LQtSe8IofnH*U)^Lou>@X0F`oubQvFtW0Gd)^x8dk;7_`tgSLqrf{RW#IdEsa}__ zlyujyd1E)w_!#QHc>bGf*^aeelwm$ve<`G6Zo%AZME!*}CxPOnR*^D+oeBA_fU`xs z?{Rsv?w!{Wiw}*JFF@v}A`s!4%@I`=t=qJ4hW_@fi0P`qQ7{EthrY zs(-6JS4-SKpIrz%C$@iD|D=z$d_-IuKid>Q>w^s+;``li^!cHF<@7^zSNnfF2l0;n z5B)=YB+J}B+ko{}$=!RrUjWK!vNZO$Fy_W2SzUWbS1CUV0IEr|Qr$rN8Q-*lqz?;X*T*((S2HF#bg99B4| z2y;TnYP7LG%aE{)=ULEWS^3%bg%}U3Uqx54OFPR*M?Sy(^UkSvriMBSNYtUR`>=h6 zxoYZ~@}qUE{FlXBa6HqXk)Z|CYiE&5*RLH-0DhYgn(a{`=_L87HB|34synC&E2!rz zvES7@9{D4gsoZL_-3JsTzF5#s@eHb8)&aijU9t%40q~`yfngPTLMHqk1AG){X<$;N z7J8(^&YuQ;D2z!)3+tENy^H$A;d*2iU)5gIUnhGN9Wq zs#5TCN<-UeJj8&mmFQM`h%E`F`B={1JaBZtq2}vkqW6$j7;h)jz2j%^I-&($!SffU zAQqmD5BLoODSiMwgS~JBeFZ$B7x)#(Cxx1(Eo$nAI%XcfFg^CpkY5L%f#MI5!@t0TfZ@zIOUIMq zF=>sIj`h)t;PE9?3=UcXM@wh5Amh# z70oM~!7wQ`;uYd&^3Cyb;1#Hcp?r;uuapLT@1FiTpu2PdX2dg48_&-dJ$M60aDVP? zXfWze06)+|!4dct#V-&K3H+EnD3#yC_A=CutWd+>(*lyiWw;=+WB|ZD&(v~b=AaeviVtkLjh8l1m@IGUE|B<~ZB!y8BU*H?Kzq+`B zl0neSVedk31J57zvju{M{wa7qhpXvI)3X)}OnUrRIEO}Aqbyt2$QHeFqw(_~=V@CG z7NEWb-+zVQ_kP8s0>Xg(kfEMM+-cjnwyQ9Y;ulr8zo8$(|FPg};Q7{UfOae`$YSw* z>Zc<1ALzgHH|{dUGfHti%^zD8!T&CmEk3cYxIgBT55hc8b-;Xf!htw7=AEFXUv(Gt zPdGNxySDQs)(alYW@n0beD-qwzu-?EFL~P9aGzVt#xGdWZv)P6uJDHJ<*GLJCwayO z{9Yu=$nMZKfKT(A(ou`}KyZ3GDk`zw+IjoyKe0W;TXkq&*$h(Vu>a*`;J@BN(JFDR z4|!1J^BDJ2W@ny$MThVoBFyO3Pt9qjbO&THVUi~DN6b7^ysvh4dMYGdVVSH&(d&sA zpW(usdD^wv)5y+aZNJwbzBElcc$>@6veQCRDsX>!n~b-bW4Cl9TdDlk61ee&+TUvD zCJIN9V{s)5f#*NeztF$dH|p6$yLly}fNxL8{kCq{2Y3jj^?HZ>|6X;oyZnAiwq(x) zKdN7HYKje?uVjnip9}m-YguQ468#?~wiEbzr=0WA5*`ms^rrkb%|a1<{!|~}=NkXW z3jF&v=~LleI860rGTg`MxqRK;rr-+loG>jfCW7xPc*p!Mh!)IcM=bfeAM}xiy9{v| z?)-xU`K;zM7_ZsiDo=$KLQ%l+-5AQpuxpY$XI`1?B|}h;5`g*ox!;wDl)SZ6UxVs< zUifn3tc~&hmngp*`l6iR^0+GnDc9q%o%)$@U&jrJ4{i_U$UOKLOvUynX1U)UlPByD zK7X!RDoC&{w5XkqdKR7^a`ebPwHqqFdiWTevK3y&r#->9!0~2N{SOa~*P4^rz&Cz8 z3;vW{j5Jod->Z{kz&{239f z;BO)Mi6MKA)$f`LKA6=4lXa#!)}-Ii>3hfFd<6?++g)?i?DnwwlgKA7o)_jG=(?+$ z2yfS)@}zo7D)0O?`W)6jXvo%?dX2JEatAX?FzdPTh2R+cNt_+vceT@+ykti)h(AUM zwyA31Pe)QujC+Cj0&31-RKJXz3?7w87qjH6w znU-Y4)%}6C2_v^UwYs&2)WwHC?1y+vCKJqat-Z>IZ}X`@JT+J$kd3q}JjkZ~)K>AM zo;#ZFp|lc|C9-o|?ws6)VQt+rH|FBZ)a zBEBC(*W;#1BV)6s>U~KT_yynNepu-p+v`c6Ha`Az0X`y{Zgp5(Xe0T<;P3J1(eUB) z{buB6pUiA*HDXGq$MS8!2G%<*|o^F&HO1@XmzdnTTZhe zKeB3>HUjzm$9(+e9Pd)u$#vF}!G?N_S(VcBR=*)1G7o%#30QwPxGK%}$ln|J1^!o* zDV4LhUwZf!+}`f2=B(2P%#GWf_qYTMb^686h$r;EVfLr}JK3K`zDRGygt(pY+vXYh z664n~QA8c3HsTH9&GOCe@rhk5_#DYN-`@4{+Jb{u;fKomDRVY?;VISYxuvY*d+NWe z85-vuy4dch3EObK>NcK_)!kvwY&P4@H6H(W?vJuRPT%^`$WNIaP~ca+0`&r~qGqkc z^&OF6UhLSFUSi}|1h1KUxv?$tY&J=qGI0s| z2Q{9egv?XfMtmn}x?hSA6lvq}9kM;MgUdFR8u>G;`W)+1)UR=}aeVv!WB#YfZh0h| zZqVb1{(1MJJxi0ngJ0(9G|cauMdyH$!B@kP|K{`EznwmJHhM<91DkP?_v?|@`_~6F zz%Qp^%kVW*;g8y8_^_5G9({mUh~5jSUdTK4SgY-SL%^>HamjS4Cmqo1e6t&EX=K>S zt0^^S$csN5DF4Y)$OH*bg71IWUm1yfrKTV&v2srLM`U(P7@ZHu-QbG7x;)fRp8bdN z3tay{uHHMYsq6nAPZ;8Os|iDFwKfUhwgOSWQG0-(qOE1cMYSNytt@e%0TB%D1qf>0 zjG$5{AdYLRBD-!Gkq!k}p)OWP@_U{O>F4qLa_b+b_vVgs&pqe7p6B^|zPdykkW!CB zj{g=k6yM*0>f#pQn-|H0Km3p%75xQAz>kaQV%#cY27wRHb@9r$0mTUO#lrNZ@aOY< zl-~k;<2A|gR%+1S4YT99CS+lJTit_S2m=F)@>^PwpUC?b#lu32Q;SOga4_kI3ijgr z3!OzIp@pIF8|lf%JKbQTrD7NQqjw(B*T-W1;4C^4)u4cX^N-Uneo5CGf~~UWYc`X5 zKI^~hks6;y^F5OE_t{CPZzKL>Y4FYh4HM$=(?yX^=fs_Fwlf9!HA8IKvQXsZx;*$! z0SVzppZ^B)6|PTk{w}Pa1Vv?U+lKsCUH(;`QJ!vOo#0{z;w}CWyTY)ht6C;zfWP6d zTG^LKu*vb{d?vpo`&0bFQ+-aA$6V+=N0 zmv5=q#Eg8hB?1ml0KRgBNo4IRv~d#OCskF(mNJ5-B&O>$p@ zS>UgP0?X*ZGrp{y4?M#YUKXC6%PL94mVt=pbtc(XC6byATExfSyhPdg2sr`;Vgy0_ zUyt!vc06K}U=!ANHxJWk5nuA-y^m(ysz&^r_WA|t!_3TnK6&k_W1^N`qI!&q{m<9< zyW7qZgtkxLcU=p7d8?Y859R$d?=C%`*)(xM)ZGFmx2G&Ze3C=`FFUpjD#ZD}s}Ij0 z5gZBdfu$55@XwDqcJ4&m2{QHgH!smY*a>oHD|c&@C51W@`0o%5QP4 z@@g^fGRmNM2*p><|9oKE`slC)Ok4L7`uzMv!BI{gzm3_TT$8gwCv%f*a479pJAicE zr2G@v_mUNp%Pd>_GLB1@7KY*Zjz2tJ`qRlFWaF_xFHxVL2frDVVkNa_rVbn2jFx zt6Q0}H}4F=5Bfe{dqOjIj|C&IuYZoc*wzdNfWi_Qm_ zVjEUJu-ZI$O52nhQy6z+Hs1gGaL9vQ-M3kNNi*s5=i&yo(G^)2O6DE123Q`X%DLz2)3h*`RS-(W^87SUjB6bXK zQmtJ}`3Kpq9q}DA@G^e*k|7co^x+>+7kz zrb(0@zgV26NYhQ#eW}MgjKx!&T2fn1==V?UoZ6WsJ*&{;7s6%1>FJ8}OZxIa!PxXm zjVc8xvSR&L+zmEamyW7%*W(%7^_=yT(S+kEKSQ?(bIJ8l_oG?-0%giaf{u&r<#)t^v2&ZEHRolo9^ zJeseR`hQHkn9hC=|1Z7){!b6yfozU+Lp=URE{?Yn3RylCQ_RgcGeW0ZHf;OALxcSW z5ntb8(BE|TwD($`wEV7Ru8F?uDgd9L%fHLBkvt+XbK)e4(2uE!+V+tso_Tt1=ts;? zj`cn7E5u;sI?lfE%8GQe## z@Fp2Ih7%*Fdb<80qib-zN$-RY?T&DkksmltiEFX`ruJ;GeJMCkm{Vj7^t;o3cMMo; zb<&s+%hNMrbh5J6bJ{Qs#+SFr*~xgmSsV$^m$#0O_3s)Q5BNB(UmdoMM6-GnJa2Q~ z)qTb|j9j4CcdU6l(;u5q@VF=cNs07l){lW1#pY+#P1c3!f_1?KOh!+BlJCr-HfN~A ztI3!rrO#c^em6$$^0?@~UypB??ckr|ed1jsqrBMlcpKATZW>p{N4^Wnx6tAHwf#9@ zT@doItfu}Q+q65iJ|!fNd3SYs`BJ>!w}J;=(gz|Y1Njy)zUHsGR`Bbc;9!ygdi?MbP=ViZzvE1u`D!-5%O~lTg?$?>OK?+U@XHlqShK|yOd=iqm0y2*UM;XZRF#>S63TPs^DwHER1xgVL|*4Y|ieFS`5 zp3wE7hPZuTjLgyA;Wy?pNn6g$8g$w4S&yHXz3JUujC?kq>cOpDIb7fsD;d7w;nBcL zzBf?bs=ZZGL*^SES%`RQH1|Rp?9Ft{>HEnYD9QC4URbEUZ??H zVtnMF1@H{3PF_9y8_zN;?7zP_5`1lmmt>LK&r-n;>ABPPYIQQ-#caL|z20E&3&^ZE zyExDbP(70FbVWq@)Z)d(`m#m4@xzr#TY?DqIor^F)%`Q)Ov&$8NvtOgTZ^)1cTh_~ z>Frd#e`u_H2iT(ffXDUlIiR%ngCT<{gz)#TLcBlE5`Mr*L&FWXs zp6w=k$RcYO+=kwTEcPiA5_a zQhWItI_?3B7gL`e{TDy7Y~w+Jh17IGGDia1cj?3@%-Vb-kY|h)Q02w z>b>Z%;yUa)Vn4^eB@LgdPt4HiHop+p3C{}O5Jh@PtPAjoIzhc{hjRzhXAjHIuzX|i zhWiHb^Xb8shGVE-C20T}{fb$N{LR1%t>&Aql zp};?4&90igaOq^c&KL;rz4=ug)<(8mUqa#{|1f6PJ9+kY>E|`f!eR(Mf<9{XPSAdWG>HQCGqo^MMH$0-KUPsowpZ-~d{v={UKFv6Z^oeuhQMNPB z@KwTZh^af2y>}|cGtuagKW$1&C2!4#Q9jQ)H~Azt1MnT*I_#$T228m^zGn*Zef%?Y zSV$Vq#}(Skk$-|L8#?Z1TE_ajLV-9!)Kg~t_fcjfP zJ+Q4K?ZkqULiIDJG%t1PR@GhN>=-(T>PH^fHXZ_k!MuCn`wPa~+{9lb`%NWWX3VFi z^LW43D>v7xkkJ$P1;smMz82CTsXV@e1Op#fjPX7>I3#6S_i*$NEWTsJw{|Hi1)uO8 z{3_622$O@UAGMB2f0CUvLnni~q`XR5H39f-0m`}`jZ%zC4ayCW&#Q^z9rIjYeyM{m zB@_7h%V3;;@n?%e#@mtFrd3?_8U5dn2D@jr9)rI_>xzMf$F#D*E`ERk-;7UoBrlt{ z9`TRBoqxinb`g;uKD!rwP|dA}nmwAG)g;|qy~YdiK;i)?3fCnv_4|+Q0iVOQjlP9*f#~)%O|0A0$o##B9ab<-TbF{bp!1&SInK+%%Yx+j z4!Vo+z?nlNgfiaqw+yO4c@$@g!6L(@hJrAst(S1VlIP$=(0F!J6{|PNzMHgBDm9WY z4!752pndE5cJ{gGaAE;zJFzAO=f9V8`Ip=ixyM;N1M5q@ct$&sPm6_K=s!Gz={`Ql z67!9>y1#UP0MlUdeFstg$)?6h^>&4J8I1kw0?V`5qUab{a}>o*Ia->ONz zS)EmzMmnam{EIfF^tr`Vi+Iwm*_(^{)buS}9w8T}Fpl7hp#F*UeCeCg)>Qa)u>1{9 zu2_+I>E-@j{6fdO>XMK;yK4wD`NWcwIG*!X^5Q~jMI!t(SpA8xEubr?F{F{XF?}sP z-@UtUx3&M+{v*@ASX++z8vJNa>4kE{XAYXZIh)ZQwElPeFZw5vjUz`Cjp)HMY?1Mq z`5hGTYv}*p3h35G_J&9)o^i0{pe7a@`N8Jh)j2v@+r_I}?pYqNV2TSv&H-<6_6mrP zYzMwpxIFjxcIacUtf*6I%gMoemHce1*C1hl&^xRP{u!M^!!f_$@*|U}f8{_yQQrWR z`B6J-upYz={4cx~Pg5*hNz_T$u;m~@V;TyY~iGl9~@w^Ref98{t z*-mu6ZOXOg&oWqN&dd!O+Ku+O#6aFREjTBb84%PHzm}aY3oVW+C36tZlrC2f_z3mK(1m+@v-kk~6sUeC?#c}|zY6k4 z9-#V*xUu4%^&ma}fjB$U;}MTLQNBf-__0$gHX5H&{9#Qa)?-Hok7Q=su>1u>UNBeA zEgnK18L@cCZKeMUegHo}VA0R61NcYIm1{TX`TmRlJr_w+m!vMz;}<*sH)BTc^;o@# zC11=hFe@5yCQkshUVe2pZ)G4;UNRebV#XBm27Xj~hp~o*A!6uFqKXtG>Jof$hQ8j~sdvv>!*Pm*_@j_wWxeJ|UZ?QYql~_<^3yR4CZ~ z(oD{Kg#N7}d-pE3{&v0@bsxVsv*X(pINjb&e_x9B2|tP|QJ3fgxoqGJlk?Mi|5&xs-LkxRwLGgoF;15Gt zJ`mgf@ck6^;1dhPhGMZ4^X*>#1vkPZVsq3b;AcI08duDnB;67Ti=QmR_p){S*09ZC zQN8*YnQ!Cb#>I-o#`^2U>0)(q`F^<`zxep|`>*L2KoWcL3|hdS;Lx0ZDV~v?CG6qv zd~f)Q<{#OagK90BaG}7y3(XEbgLwS_}TxNfo=8ey+*1EVd$%-km;e%&s#V z!Z6P=u{(NGt8D>)!ywrOd=D=4l)Bf@>n2RFF-Ci}ff*0aD@IM?zlpR!nQLbkDObQh zYES==h&kv_vu?K3YF}qF&l^VHM}O+CFwKSQ3wQ?F3udq9PNfA_q5oq2MG@cMck6U66PWk#H%!L+u>PIM2W!jb zqlp>Ieh*CFkqfC_#jSJX4XXf-EBWE<#^Q(Ik8}uc@Z&iC1Peh7=Erw5=UTQmdsH*z z*`IDcxPB+^1sFPElG(>wEvq=|v^;oqFhldZ;{2@+?G{lR zf^#vS?=HjsX$_OL9BicSBhCK`KT>g#G&e2(S^UQ`b}+wg?7ZZ7m6_#?RA#9KS60+&0RlMLzV8~9#By2y^efK65;bkN%A zYVZ#}TX{_8O$Oh0i2o4a4PS7kaQ0fat|XkZ9G9cuTXYD5M5f1$i798rulDf&=iZvF zx{dMD%rEPYc@&Sf;_sTTz0Ewg>f+~6{KE?T2JLI|Dn3p0lD1b4X7s>2Du3@k7W+}= zivvqF%;LW`3wKif1YZ=q0sQ2lg2q3VqRipjC*^}r`Nf|r@*Kd|aP`S70HK>1L^d#! zQ4Tnor8-{gPGWsdQ~bk{D{}S9fFI%gjrW$GLVJyftSYAY5&xdjZ(=(9REhyU=#Wp~ zQrh%d1|~e7o)1KW*;i$iag?s7 zmL1c*#(d$yruT!eerLg1DSll5{?tRKP7?wA)L9qh)kF!{Ql3*7zJt?)4yhHv}d|!S4gc+3Nz&!o^i8P}Mwro*;p~o|%Qn7fGmCl&S4FBJa zc{*9A~W~+8+n9{JKL65&=+&!#|Q~Fi0ejuoi_pP7req8ZsB$Lsj ze_1zVgXOtzAAiTJxN@s(2J)dq&X;>B{k5c54`Y&GmJqk==`OuKXv{f5A^A=4H~2oj z(5LA(91FX(zIFXwdcO1ceSZ&&(4C$gZp0e;8$9odcajdn`$n;N-_%c07S!#TNdm3H z$np=_C#GUO*f6(`+Ope{j5Xgw`2jZDO=GRD*nDE@-%RzS>y-_3MSEEnc{t%Q^@HTq z_43cp@Eiv?)BFuy4IT}imEP67e*A+k5$}d&c30m{1HZ7XXv8+G7a$=={Lv;IIW?qsFs#?j6dQ1P@W;41ZiX2C6c!XOb;;}| z9}Q>F{1o7i3j-3Gv?NS)XY>GC7P%h13H`?Uzi$sUq5SjSe3-5GPVfxr{@!xV|5I+g zcaiR=y(i?hI_8`0w>c*4@zh~nN5WmTPQz&bYb`pK2>c_Adr5%(c7^^`DVj1Z;aXfq zer=hdC+{%tA^7os-&iyPl?i!TK=p8Qt>rdX z#=RKCggj^UU&6D3HbI`J1GDOBsS?M3)nVMe;8n?O=DcI|h6H>MJT5O#{t5kARCNOC z3w(MuBO8;RQk{VPcH*#wS-V?rk&GUHPcA=rgQB2R%VgZhPDcInk^LlXlUB=|pI@*I z^>5Cz;ydww$M!nl{dxFo3@IqMOU}<{@uMv5`fe~RZ!qHrPH29O__2c*FK~0V zVV+*!Fh3O6zdpb4Vs&i|S&rwy{ryWj{9C6bYYR7E{m75AEMa%U9Wv#34}W3@hoTYpnU3hC6>Cx7QqNTB zB8wBursE?hzruf+-?C+APSugFfkEOz!k~ z)Za5w5emnI;vC}i(+tZ0Xu5f}%lotUXC}Aj{OY{Vc@~#3AK!GG)th*}^myR)`~2UT z4Y!w2JflKZxJ4eh!jGA{>zgOwb6Rx>+wqOp9S9u!m5Rkzm_g0>k9^y$bpYSs_tMLy zms@^qVe$)9bxVN!<5aZfH*AY{&d&OoPd5^9nQObIqCz+;6BduCzEryMT%M zc3&alA(LREje&P}+$EoHEus78b{ckAv^%|IwoIk|88UadOO{`CTsLueeK7;=?e@0o z(XpF7LKp|l)*Q5V=LQe8mwICnb930&t&34#C4Nm|-O!5x@1gk0;92e_(I(qW==(tZ z=_Yq zMTXo!k1k^Fm-Q#`U;}5n+~k&O= z@iqXzMfMkQY8L#HVjP?k;8z2Etw^y6>nY6S_ep`+4?h*;Ga5-^8vYFj{#&5&OyPN% z3d!TYmscj>euX22zNROUFQR@Y;ze29{2dE#uBhEb25UBXiXoLFZ3WD)Q@4J z;*yr-AJF}HAEz&!Qk(+Af#L}@XurFic00vWJxMd$HxkHGijd)-1U)lt3(%TJKmEwnW><}5X)`jlq$55qitud55x ztlok8Elk6;riu4E>ErvH?9;LAd?yj{2hKlD?8_b@IF!ipJ9O&oGwgoK@4)rq#CF&o ze@pL|mZJ*9*sk8ypKn0lzGLa}`ZDT2hAsEC;L_zb=$q$fO2crKy!#quGH z?z8@!dOwWTR=s~^@BP9X728Ms{hd8^>J)o_6fXfjGwN(_KF`@b*GGIr`I7m1{9uA2 z7~7>rT#w~x}@)XR)|rf(0PV|Ig|z<NcV!e;p#SgHlOSH9r_h&=swAlrC`x+q z1DPq-oPx(brD&Tj$c+0SMur;F|{CE8ai(qnMUV%@nw8r=p_Ni9;6!V48B9W`<=E;nGW{%nl{&Q+!Brd^W<_t}T zO$PKP3*D5rFkhK{^n5+aW?al)z>jBkZhTNd_uC&SX$DNr_~hm7)MC8u&0o!!RpN>{3swb@Kz{16G^<8MvP1d{lpU8FGH;U}~gzKdOaY8CXZ{o*apAs&CM zs)n0EMKjsW`eVrat8cu@tEz4hn9X7Fh>X}+_It@(<6Oc?5O^KHeDQ<9dI>LxOD_I1oxeaU8^#;M`-#8blsTU?7k-;q zFA`2#Y_;Et379lD0ps(ULWh@@?~IW@F}(ZveB6)5Rzq6+H1H2y_!HJg(0`p~`)}w^ zsJ??6V`iJkzXScq;o%P#@38lvk5|Be5ZV|{Dii;|53gK3}lU~rDQ2av|)a~+W z?C^BxC-W+8vZJ$=-^KcwpLjvk$IK#QqqVXnlQ6&vG5=?Z{icEc4E_Wd8JPc*4+q>PQG5vH zz#0}aR(Dhp z^UoA^eRQwJK7;Ec@?q@7Dw|orC;3qu%kVvtPX{l#IRgJP2%emssCms?57)YR)9+Uz zPTW{q%6wXVXKo4nP&uV3F!l?hrxP53(w+9~?=0BSxF#nj(4aWE2S-Gq-q3dWB@@KI5SR2;8 z{o$NRq!IKcrMG8558LRkIahvdT`xaDb|C*sNkhIaxHq1bjd@|PLlWGwhT;wT(7tV+ z1$V71zKHxf?E1V8T_yaO?nLR!^@fn&g>%Hc@wqIrOYli_WK@J+PvO~Z`_BBTV;uD> z+=lj@sDmFGRx}Ymvv^GFH*Y8Y^K%k#%!7L#*rWfE+8uSNo}`AJf%TvGfwMjMk6#WP z)8i3K)WJ6vx>|s~)8i)*px#iFvT0L@{&_e-HY-*)mACemb#|Sie5=WQ4fKAV21mrw zEt6&DxL+2Jh}#pOSRTBZL*x02bI`tL9f>ZS*Zd6wyoTm;+-p7GDAD?kF%xuTTEbG4 z-{Wb#!<#aj@^rB{oFwNS%b9~$ahuDyYS((yhH9$ zj`U_yJ$_-(#{VdOF1@a=Z)>&iI{ZCs^!gmTbnoDsD+|`?@uRMx&xc;`bA2ddb8Q^u z?;q8LmAXU$t9^T9F2x@PcUg29RGL-l{Yf?JUaU(VpZoDgXUJXfY}V^cyh?#C;oxLRAPWZv73m^=V@kDGx+AO%11O2X2qzSK{L&$stM zJaffGJ9;qi0jz#TA`u~(AUyGh0q_HRpS)@<_!_59ZR!BOLEu_kgW(tXR$`N#XgLtQ zPb=^ zSpvMp@L%c=f&LAMg%8e~@TaifI}OGg1sg92`uyeG@8AC`Gu(r}8g*0u5I9y$!umq& z+8#em9vqA(A^+mNtWyT)UqiS7oJqnT1%#Vx+Xr~BvwFSe3_Pbuv-s9+^f$p>0iCBc z2b4^Dcy;_ts;}W6JaS9|J;~!~Cq(dj2)S3{*}%C*>ef~7=#TNjCE;e1wn4@GeBFHr z_(Oa1!zw*Gofnez^*@N#fj`4B;F#JY-^OJTi|3f3clS- zy5A;zVMXELSma8}hA* z7m1NkwVa&$#PT<6UWp<_qOZBkiXMNLdrlFl3%atanbCF>uK?dPc+xFbbpXlyci8za zftOkwc5nDn)1QoroJ;vri$(>F+F~NJBsSX>$j<>jn+Lm*M^m57fS;wO#)I9Mjavpe z0?!D_4$ShriSgEH%OD-bXMPgzx_!QV1L>?%X)z!A&TFA`vsnd)ajG8Fitlx6ThN~Y z{)fkqPtj{qHeh@?FG}AWeAfzklk(U2e)3wwZ#m?e_)&a=;tifR$h$cC4R>-A{*~yD z44u7vvZcC_g0QK|OIW`(C=#wbW%b#-4l&Tb%Ee7`mU{xQDO^4Z*jO9|69eJT7hWG{86nmr!z9}K^T>AX6Nx3lX|pCjsV|7)@WI{l0Mvlxf&2^py0A0>R3s3_e9 z5;c5A4%&nN4Zn_aT?t*i_>yeQpVog`{|&$E4eEh8INt1&#r>h5hJIokre3;(?}aPk zxeC(3$B2wOk%{N`fL_TD8)M+^F~A7(lZUpC{F_i8-}g`d*r*e0FV5YCOq2}j}AmT;uHn)>sc znx7V&fck7{(kf~a(}>Ex>?_Pqkbg-e#dDBfuar&3`kjM;#BAe&)^g_GaofZt@Hc7a zdz(Tr%edT#T?;;wCC8V0$3o|e2_=8WY>dyySH<0KC}2DSH+^`5{?VR`_)=yCeadXC zC(3Mu)&^43OOD`YP`(B9W1B>GqEyG>pTO!(=-jw8x+0q5A5=fmO7$O6CMGOCf%ac5 zRa(#u@c`v#$nvJWnfB+jYtu0Qr+%cej~(wj-ow*@>i?VZdm@oYQXwhs#TR5bU5**z zD7)}pd_&h?^pmvwCl&SMr0e@KPpP-`Kj{vO~56kj-;e*^xb-Ad>!SiQ%ldaS>{ba{q&yoZ0#VG+-+Z|nIRXChcW zlO8`9JocM!==TZ!0n48NoA4_Cs@+vRAHwmlM~bvi+KG6dJ-^Jla8&d6s_&WNxDGY? z6KRH^NK|FjMdN>p59IE?y8H69$HVkx%RI9@{#E{C((9k$-Ymh-OI5&w*!y#Yn`m5V zTq*8{ksm?MS-vS?tgg3(|`nd!rtYm zUzUI22z|(OZ2xzBfp0+p#zVXh%6BpIwBTEKE|Kc_BhE_9h9n%3UcXThUC3?}&!G5* zqZ3YuKYjcj3hxWZO`-$``>}ooj$?g(V*AfWJ^00hbgSi_-DWy6hxPZAwW8&Vt`@L7~S7fNsEDBg&)~&wyWuT#oB`#FYuys6R?sT9wkd=YV8TmkakDfQ?7h;#3k%k}yiU0+T=GU!0R zBYJ#en;3quCh$+|)t`hmt#7i$KmG5`G9M0x@cX{J>ty#9TITUZE=SeOuK^WZ z!`S^o*L37tYBf071-yjAvkEMre6!`JFaB+Y`1?qDO^XimgCG4L6%WCB6UL3A~Ul;T6!N>@d`SJ02HA>(W?hh<4pnjd-JZje7 zQdW@xL47H|$Jjqe(Qu)x6#gx?G=FV-#GP!w*6)!=KIZlO>pOHWY&DFF~<0rtqIdOHwl!?=tIY;K1AE+<;d$Z z6K3iCLPKA#uQ^=rT2J{Bbp3eAi^&hgrSRVvbCtzA_$|(9$%{G{k*p`(%6U57&(=0x z2FW5d8S|0)dCCkv2VIXovh)B6`n2j7)Q5AIu-L5FtO)rc7VWtXLXU4XtA9Ii`0t-u z*!2u@ba|DiA9>f4ztz7YJSTn4X2eGA1 z`Qw_*l?hH=LxE>RQ#>Q!u6>&GNZT>+?_l%4PBw^?R&UltG4)~W?}abDQ=;-Kl}ykz zR{w9ov-Y(9ZPG`^=0!pBHmrvv^(9L=CvBLP4=onJ$EF!9w>iGN^*Fh5ZSDM3z*8d} z4OUs--Nbz44PIkO{aN@zaHhrN)y7#Vr@>z_P=W0TzJ+vC@B-wCGekZ%*vsk2kWCH? zu-`5MA~6~tSm!VPIUV&Ah~R+oCsu4)eOH0;KUKT8Y-Qporse4mR3Ed*FmTe&tXmr9 zlD*aq@6U|uy5T1H&7}E|<}2U{{>91Nilz%U$@!~u>H7NI2!2xVyD}|P=l#l+DRLJc z1%gg0rVN;DE{P~>ro%jakZNnKlntq0oD^g8@x3=XL^`f zER-|G(0}hacl(g`0P?>lnceUM5~w@dg7v>4(o zC%ri&$k+|~6E;52-kiDUf@Qf06Vmg13*0x1N;8K4Mo5pJ4EPUVkSZ;}XJFgwZ@qYeY|L+>zd0W` ze>1DZnz!Jmtx=oT89s1(sMmYk>a$_i_Tq4LuRaENpiknig*nUFe5Et7ercT7S3V%m zSkKS!_OwV^RGIV~?c@7PcwesW&M6U{k_ggpc=#RQJC~ZzG?V6tLOq_LwX7bc*`h4a z;|b7_Ry?Yxs_4C6ol%`AUGhTmN`E|e=KYH=YO9ob{KmLbT9hikwL;H7Iq`$G-<_Ll zpONej?0UIp?T(ZAYg(fjMUURiz0)<%Me1e%e~!7(`{*t&e7doEW33!`8S5vopmuVq zWs1oGeVO0Bsk)%L@;2$^ci71TF2?Qh?*skQfPHwLuiD2w_kD8WI`m7d|Kz=2&iq1- zi_%Eu^`^b3A228LZBy-18Abf6O_-lMcal!hK{^<>ftP7~FX#}|(~bPqIz;URJVR~U zWY=V0O@98@hVnCP+C?uz+atS}zt*vMhVfg&w}yue*OQ+go{s@uKw|~g&!DK1P&`A} zY1?R<$#Y{qExR}r`~@!GIU&6n`i_R!-A8GBCES^X5fFaBe`WPWS(uy;{GH+tu}6;5 z^A%(8d=32JevloPrmtl)V!m#yGy&i1{#S1o-v3)$=(#sT=$e#^wL7;t=}No$!QEV7+5i{_u)q z%r8?^+SGgwkF-=yuf^}zS!-1{t2uVe$MKiO{f_)YDYoh4hD!%A^^5Eayyeu%-+%u6 zUH2eH8I@Tci}*)zKdpUb=VIoy!|)ii!}4fnVa+IUt&2EXxnhx+uWgkOmc zdOOr7^5?>zRSJC|>i@oturJE+cXp$Qw!q|n%Xpk_ouR^qjR(lA0K&CKK5sP)i#YH< zal0C0JV~dMs|E2KA)deWpIh%tX*}=1-D6X`l6-u!*Txa^FYS(ESE;W72}1tWT@-J& zvR^dmWC*eTJT@5L<2a{XeY^T9hmh0Kl@92ix$X9qk!eRaGfnS*dOH^U-KuN4>he2j zOjg{0#3A5&b_pMHkMP1tpXz%fb|60Lc2?UpS~ZfXH!sZ$0l%!otHwj?p`!W&;1@b! zQv~GKsVz)o_maYG7=N^$C(o}*8pq`2-)WnJ{@XWcN&4NLO0xOOyINXS3o6ZX$Hfx| zB^%EN6bm{yZ3Z;n9z^*9i@NOIa2Wn&W>Sy;CFUk@+ZSj^7vgbzzX3DDX9gDfceDHf zlx7G7D|cka)av;g zLl4Y6nEdd57ij~&fcZky1(#-lhSSJQuKAY6_x+BH-mzwiGUv%a#Z143HQ*gTUp|Y};Eck2o!7%8*I3lk}H#Vpl9y5~zy!Sv$oeqBQ>j>xNsd?aga=mN| zl305cL}LF}E()7FUHBdYBe!e=zrwDA_-9nNr`om>`eTpttp0wlCZf^<4v@@%KBJ$Z zKhPF9>nuA&#Y_p}X|$i<;($l~ulzeGoI&k1VLYc!o@+TCYL~$-(@e#XI!t;SBg6RKH*r%y08=^ABe63fxa9 z{1ODBi2vg6429228h_LHnB{XMB_$z#v_L$<>KnMkNU}LXwOL@%oBu=ItGDXiAKI9q zqIV2Fg;NdMpB1~lkN&et{6 zL*5|YZ4Vw&5mgkWnpHkZ?;mPt~J>yL$=y{Cd1YY!)|EjQlCRdXxaq1*{%L zk53HVwTsoO=R8>NLR;7>hxMErpq?@XGbnjD)*-?uCu0_!U;ZC~2& zB)h=Z!1wW3`G@j}@;UH?9=sz8$z5}Gxw`-G0l)(kVW9CV#V5R^((~sPpY?c$ZZKV- zz@Hw^$j*#m*Yovwi})${4qyNgcL}RMslfe5W25^izr<_c#4-bWgM31*D?vm;(@K67|+4)dX`4;exujnpKO%)t2nn?8!h6AKh+FqC<96uj^eD&5r!XUvirbslqWGwhMopzC2 zA%{;~gDlK(K6k^7^UJ_kCvkyq&1ipVZzW2c*?NH~`l~K%1g^)2C+zEh9;KxRR4$bAH80`so#pR}73w|xwQGou3 z^~Z4UmfSBb?e0eZ#2#<*XwT}RM=kIRwr2CYN-L!5$OV(74DhmBxSsd*_*Z$=dC>1z z52gGJF2|F5@Ttsh_8ICkrV{;Y z;1TLKDO=O#UbOhosu;4$`zx&%#?!7tRXZ|wra&LV;w6@L^2vAQ`}4?Xte?-r`6QoO zB2pxQr0)9eeHc$Jsl6wA8-+|}R8Pt*us+~xSm0iJTUp9X6l*5{4?#BM4OK0*D&`xp zik5}q45-0@M_xEQP>b{N&)-D)GF1!WLAE}m#@b7|OWI3J{o(PH|H8H1>Ui7tHvAqA z4KK&{v#nVYCAQ)j{vRH6YRv2EYd=7bGo2nEI``MzssdF3llgS|LmVH{5S$z$jDMJM-t*`}J3XGBZ=iv~A?lx8F+qMA%3l$h1}YTV^k$OPqwo2Wp9*&m_}yi} zp9JT(o0VGzP@)3y?D#uqA1l=Ub^dL3&zY51FSN|l$@+aTdu;ZH^#SI1%)&nrUmVcJ z==?Mu&7|*pWJqSvP9}8q47JbXDL2cTv}RD0low4pKDX4fZV>Nir&vJct18AYimiS zq(iSCxtH_%9>ws4zAV0i>uoLA7%VehXH4;sbiALqq4$T=_oK%%`mLX}K4<-<^~{Q^ z-49UTKfX=ufcg=BhM!kaKTl`1bDoQ}$h^0{WS*%(M~|o6ozK9pBN^YrxGNKGtVx)d zpx4WM;c6COcG>*BUa!IBZE!vwD09~16(_Sq^_))zA9~NPTkE#Q=I0@6kl(q--$KZl zEUNZZkI~n+Qq(5u5LF5E_qR67t<${Is8jDB!u{Rx?CRjPw#ZMz`oos2J+jtyA;*WY zhJOnEJ{p8YilTyIQg5*b{=d2fYUd)}e7*tG_=MH(_@~Bg&R&_b0(jUh+FzAjym}|L zVtu(Df3nzMT{%+|tYP!npg#K{JD5q-w#|aF49oH7;ZN1S{{Y(m3x3FKA9n&}Zm)m( z=;zgRK0UKJ5F7k3^mqoa47$Oe$=_gM4?lzQ(TV>bBR>+9n|MvUN?rpwWjitsei>$$ zCw-hHpS6Sd+s)sN<3pUpH-%cRhWu%hdd+)$b^57t2xCeX)9^c+IsY%PsH2upk6W8O4t#7W>?qznYKE>)^&hVd( z{51MLdFpZh>@}_KcK?=db@LkLk$s}@=79di z`DS&ACasvPFx_+B9{q<}`?~dl0)8A~br8O9&je4TTh52x^X&aQuNTX(I5Gs3Hi9**cSN88QufV zJ7E`-ZkfGd8~kaEew(>HDlCemPil%pd*-I6Dee|jl#q9ao04$-o@|NL1x$Se>yL5U z_^rWb&RaeS4PMd@{0R$N(=gKq_MK$G?{2mfFVVehZ7FZPO&-lT#TgAh$oTN8M=ixV z!Y?@>u%`G$T2@(&PQ(0Bd|))ne2xWwk|1-zMoI9V(?8u85v{5I!1AkCX9LJV~jbAFh3w#W7#Rb+m z3&@%$tKXu2SHL^NwiAB18CSL>q5h`*JOBBv)aVrEbVQdM`m2MQGuj8*>n&u=@@czP zqP<+>JfInQ7^6*ggZ!XhY&U(tJ;d>6q8G`6fv5WyPtNFfc;a^A@a3Hs=#R{V$7Yqe z-*qREH9y=1{@>Z>cSCPeLm~2Guz1DIeh-JYPki+~nY4B5$qm30%VS>$bW2|`&`X@e z_c`#5$?ts+e{q1&CU4!hVRMe6DLyezW3W49a1o)why^}Vr$A~=p}TQ zTequ1n|t$r=+0{HmEKbvP>|g2HMy8CI=8t#n4hvCh2$L@@e=0`MW%5<3Q58K2~=Ov zZ<1u^?1GJI?hh+6!9qUo#@m!@PL#dq+$GLOh}X+^c2 zwM?F`md+m{o9j!9nj0?Z`7_Sf{EH&gk=0Dsrx~BS(7t21r}_WbBVYS=`9^#Xms@{p zeN+3nmejaCvfF_E(bg$oReD)B8O+)6#{{ixed8f*U8_2W#8`OF175~CXIpuwrCv+k zyhuyf2fq&0tJQa>Y_=hp>xL^u=nq1wPIT8czGedUk2^6Edc*H8kCFJ8_>;PSS6#>W zZsKa>x+_atM$RAHePRaMPeM$B{2chO=e$bd(SMu8^6$rXz>i|&lLESbUHhbeM5heS zkX}D=VTb6vaEILv(sZu$@lxt-bd@MK*?f6=c zXRLueMX>C0i5?G_V!I&f!M1n5=;L|AUBx~6k6wIYLLCT|qOr^Ld;_bw?d|OOd-JEl ztDi>T$S2yP?{GKTBY{N(hvuK9`9cjj=H_fXuP<{kqh;g!l3(9JKe1q34OV(~Z4;QJ~W&wEzF|Q@How8?6)0Ty(h@2K;BH zyczAIerT+Noy68vk1v#XM)t&?y?l*Gs;(%Et_L53)r+{RB-m)a(jGj=EQzm_R^s~l z`!_P`x&L0hOwOODy6F7?KVb15@K1wRu7rO@Qom5DFUlTw@lG$E!SX*QW{v6b$4CU; zg!@zCCz=jYuTAG#2=o zdrvtObmJ)GEJ6Iq;sr&~>kGpRqv}aN#P8_eWQO6KT*sy@`r{Gbg5a@DuQy@+MycUw z?|!yC0~u9-7tr`x7WY23BUUbF@su~{ADz#Ub8LPV(|)#@(EH>l#*Sn0pWf>^!agHv zW63Rw*U{f=hO`a&%lt2M0l(*XOV2T^Unf2P8}OO_RQ;))CTaGX7}h#6b1FHN@aJHk--aXN zY&Cj4OJJJF@=J7`Sr_R2qW!Xb0>^9Os~liz$d5w(OJut>UKzGhjtAMj>dTUAXlbxxZI@JXchfw?h_p`=86d9a(TSxX7bu^)D z2X?q(WyJ+%ml1nEyj6k_0cMm;;@eU5dEZ%H=ASlw3_l#aKlCRqZ)UwoRW;y!yfvZa z^Dp3kf7(Q$*@fTZdPzlxipUPKgK-C5fimR_ z*6XB=w}fb!N#- ztT!8qB|*nt=}4kgUJ3eN>Nfyi{4GpBN#AEU-hYbUlp||XhvI$rEyZ|$dd{giL^4Xk zUJv){cvajj?ht<@C4D+d=Ar#G2%hr}!(Rg{o|hA7ehs@R0PDfDyzZPg(V^RojXbVe4mGT@yEPoGIQt7oqO;5+;h&GuHR4S z8rWf4Z52&MKImVGcsHscu+_Plo6i{d8^PBd)ZC|nbn;5d;s?We2K9Vav$lrVvg^}| z8MLgYg(sQS3zpG*CvWHfi|zjR;J=T#f$>)%-)7tRHNIC{Pc|OhwJ$MeXLf|jh+mw| zKDnsWv=e$5Jzr$Mvbyp`)wyS6lzx5pZ0_##5ox^;zXBh@^L-^5#vdT*M~ERmZS92j z6HX4f+M7w!^BIOoHzu4O-|!hjk9$D>`Z#4qiW%}Jr@r&1ek7LSeUh_LXOBTYL-`-N zpn%QtpEIkPnZ~f}8<_vOPftGBbhc(ASq(o^yx*ZBJMmbtmmRUy@2~O`?-X|ibTM|9 z=T-u5*#Y_@@Orrce^7XPnc-`D`2+YB?C!H%VvL&vk#TcwViC|hR$Er}DXS-K5a`Q~` zg!9(?wBb6{i;nr8?eFP&Jg#Rim8|sKQ_@A!$4$9`{gC{i`~qP7B*SY%CBA28JGeEL z`gM}5s9}G7t<}lZe$Av*n8uif#*UR?J-^GolmFPFn92I>R6XV!zL_c4USBJ!Aglk| zpE3#jCcc$r!0@wT#FI`mp3Hric#a)U?lrReGe%4G;~DaaQvLhjSbk$zWyzO}A>SjH zaD)dqRhi%~3_XMQ3I17udr>s_Tzb3#{ubr3a(~uelg8`e^`RZk53OWIzCgI#I#hhi z^tsW0fm^aAt!+!?sE>RI@E@bpwe>=`v?0q7-{u1QWb0=Q@_i!SI#-!k2|zQ`@OuTf z7iVq2+JLr?@qSx;8{8ke4Dq{e!=8Zn-LKDq@9wyP;&EI{j%DEFi{BajHRqJdY8;w` zoy^EfZCIaDcph`#<8yZ4deBPLx~To& z7Xp7%^e;s{`8~(4y2TTN-^bb!ehH$h!dE1qdMoAY2*bv0j@evgO#&WHK7{r&>cz+f z**2QK2ES6B$WP|7*1Bkr@i^zDuscI}D#2LaW|f>u*|xM9hUe3nHd%C9bWKxJJj=UrvvQzj*)mU%mgTxQ~%9V(AWmKURSJN*>vm@9HKtT6a6NI%|yh zSY)eD>ye!ElZ<>HL4wyb^-|3o_zBg~=bztZ-6$)O-C>eLsD4PdsFYJ6EtNJgYxLJU zyCgorvCOQCNn!Ol3dLsmqMZjKa;aYGpbO$ZjuUsQ^%+~THnlL^1@WaZ-@&v||Mmf1 z0j+Me;1c&J?2K&i5)UE6+*dHLxCsTbzg z9Ind(>d*N?DHmg(+ac}>P{;HT51V5?xZe9IH<$go?c6Ey_>bg5;2k|*zW?IyFa8+D z3=oI7;doMRY))+MksQWj;Cr(rI$h$k^Up4}|Ju%oLtCbyJ?u4$8}ekM`XKq|QnwfI zWkHnx(}Etgib)A+-H!2WaFQ;l=*q?`;J;9Qi%#AU*6kQ<0{zq5T3X+Y>m*Xsxu;A? z;{!Io&_L0gk%dKw?`_{!P`?NGqt9^pnY55s&~xE>Yj;O<`rPHOB&~m*x`+4sZQ%68 z@WzBrvWnTa7W{(eoqHAJnGc`r)Pv`s9Gi3H@S!s@E|0GVv0Gi2h?TSI#+!^=IdnU`?{NM8`~D z^D75@3g>1&tp39f`j2&yGl5qm!9VP>D&;jf(bty<5zm2MyVYcelniPigs;VXAtO`X zOd1)l7BayK@596E$kzDnax$>hjSSN&CURmX6ijYA!&sI5I>8S9mumMe`%=kW;`u^A z`8j)ayR^4&y#189J)VPnQ3~+$cqiowC9(@CECTZ$)O{qzX` zt$PRQ{GIg!9ow;>El`!;Kt8BhJizh3gCKtm^q2)ppWQ|KiTx~eWZdbLBAPGs75a;T z3%Q#|BqZpN59L$pztJygVB*%4qH^X6@CuaQvW}y6u8ORJKgWPZ%#XGOoZyu#>{>=T zmY=CYc}(8$?~9ZCqRIB(t44qi;S9BxUu#q?6Ly`&SA5k$Eh}sMYsh2`>+f+vySa7H zRkM6jFl8$INOhm>lEuXA>YNY%(Qk8#;h&eG*5^+wnDRB%rwoVMUi5d=f6R4{v(^pJ z<9qOS4*$*M9a+6|EdxK*bE@0zkK0??nPP_^s;3I+;me?~;xLnMSHk~AF^UTp?9=d< zx>5SwQsh^&6j*SbxVhG3+oYxJ(`|O$- z|I3p0Iq*MW#KGmno|d20#HOP)=LFiDc+Z}C=);+S@pX5PQatr)ovyw;i&ziJ zqW(1B35%RmH?TfrJ%0V6EohHoh7iiSNT0_z-K`{8j!cKPC7QY`h#56B%_s=0W}c_zb2-K7$+0N0OVBWxyx&dW{v! z7O=+|LwxU?M$(Y+q~(9*L)A@CeV-?lskMHK&dI3>z1h(9ju;^!IxFg6U6` zvNjeUXv6!LO2L+>kEy44z&rFGRW#VcAH@&o@yGR)Zx9n{^!JQ}|0f(k+mMe{U%n_y zpgS?8lwU#lEl~%s;Rm?h1bV%c7MkBx3_c9-C*VB~?%#jF&i_zf6tCF$N{lTa6?n>o zcliC_D9flw=|M{}Tkn^unB6i@H9$3h;wSX{3!_p;jS!Fc8+g!!{@5S+&>CBPBd&jh z;zemmN#|*Ouy_Ufhbq7m_}fPFp;A18>WgG|WOsx|XS~Tr|CQ$9nBW2%zOnt5A+-;&o{iZEtnGP^QB<^=IxeQth}qd%O1!1Ra6WGfQEn%atGJDqr0W_ zD;M1};uXOiK^-(73B5n?5e1PE*^8DJEyANSS%1?-?$wX<^`XBX*Op^TB{4=kV|k}X zr#m(yp5X*6!?WJ4(3n5gsZFW`9Z1T|(BIz@ZF8X7TTS^Rlphk_xUDgi=KGroegU56 zx%u-SpZ^#*fGGu@g7PkP_wpL}cv&?quM+1wsSBakDuCaIzJ9;=nd4vB3O#loQ;Hub zoB|>yJULwp|C1Ny^!)t%)gQ)Rk_Iuea2)%6teR&xPj8;h?A7BLDXK(Oh!UP}eO|J7 zM2GY(-JFD$efbn0G9NjT%_qc^y)dWv(c0-UYs4GC@AT(aOzE65!C{O8DbttN^1k3c z=sN$Zhllz#`*$yhW!b|2sZuv}g6ji%k8zg0`GH3%-Wt9`0|SA6k)6d83lz8#$OC8t~K_G6H^rcwdLz zRwpfbKk6yfhdf$H?ZB@P3+-vmbXIEw@*PfW=W7L;;cgYteIMtXL{5TY{4&|6%=`{j4>^WwdpO@#jjJzv57+lE>2_oA011$q@6 z|EjCkCnP49?rZf-I9mzdq<-4Q>MX|SHj`lWEK18pg0 ziuk!donLWz#3}#YGZkq$HtZSpXK`1LIK5W2jbz0fcnZHQ>K(v+#jR$d+kNMDYIUaX zdG9S>TD~Bwswe%3=ZjjBxc;xxZ_YBwQr4fqw`%3Rn5w-+%!s$Oanp6WL!AAb8$F)C~{-cLn&_AlP=wSVAO0%o;Ta{=F* z%`4#V0XZWKd<#W`xNBg&&FR6$eO&`}{14XAc=-(Ga~7Qklrb}J#t8pNo3Jbe% zQ}=oYPqBko2z+tF8GKI#D~^3Hoo3={#4|V@yt`IW)18fY#*y}**Zv8zE5K)1{>WGM zP61owr^AiUAEvaWh`cTMD=goM`<(NKi;GNb)N8mSI}=p|2!Rj9#%`@T`^R3reot<%Z30bSp-@8&1 z(!4t(e+^^s2U)d_WQxkicQgJAM$_{2*)`pB|H6i!8TfTj{NPwKX zDzg4!?Sp#wlVo3?g!4Ph3Knh-7{}NgAG#au;e10w0C!PKBR!r+uUFk?;{y+{?WW*4xcr4toFjyPz~O-O3w1YTvFQn)v{#YiQtri}jg zIuT#$?2;O-Vb%tXx&9^ebj7lV&hI53h%h3Y<{PE@eP4}l8*^*3GtIxs<{$0ZsU@SW z>aGKC@hb`L4)4we|K?I5y`Qhk?d+rr=fGb-UK@w!8T&p!6WIwr$aMp*UHTJvQ7k`^ z`+)b3EZpU2hxO;1y1%jd+*!$d()XeSc!Nj&G4++6GA;2O&EgsEWzprS%F@@2S4G4G z;2TlbDirx!^XCh5s?SGAG`b4W{{HOu6_@2B5o(bSHtA{MFS@IwI?HXsFs<(N$ZHd? z?N=XQ7GxZu*Z1n8=!|nW6YI~V_*2kVl8u~9{vM`EcTw>|r?`3{Q5C6m(=azzFy`1F z&GF{t*fcC9#Oqg@@5W2bPvJQ8_@q5~Ti0wnkHAteOK{eTynHl?=A-H7zBu}N7Wj2z zgNN0lKG$}8g~}|&JmyEg>?eJ(9;uDeAOma-G5NyRJY9$Q+^t3UgqzI#^z*Z+(4XXK zV_!$KxR)`P3&+BrQxV=RPqjF2@(1(2_S<}1f1_)FYt@j3K8$?nGj@C+QpsA8LPCDp za^n&DyI+bHWXM*EC1k?V%17vrkCkU;7VW#Yg#A6ngH`!Hn@jH2=}6}mEgesmi`T9S zeQd90^0%ny`oZny4kGp<%5v);hlI`DQlmK^44VkP`*q3>F3QR$>R$ZR_~ zf8h-9J7dJVO+vo2Cr%T0yh8mrx`f)k`25XK>c?6XOxF{_o$gI+SPXoJ#e-J7vwbte zXN#C|)bm?>v)!_zE<8TV!$f`X+9b6yv4_^TNYWuA4N;&KcXnl zl%Hyz^e`QhRCInODmj+WS=HIjT$-|6j`}@t?qptu=IS#t#kHOK`-+O~pSY`|pie74 zLi4E&{a_Z&n=Up*`(w-&>lB0dTsO`oNhdih_wN;re8fGE+qIS8V{gb+nt~r}pSCJ< zf5PDe;xlOWbj&}@Q-(K2x4hJnz!wKcQa%)i>ui4|QcX5-4@q!8fix_G`uUK*BGv)F zRIvH#RhS=*CEruL$c~GA_3MzI`kS0D#)oQ92}7~K6ga!AjIqJdNcGO0lonrpg-5+8J>>rUMo*L zMZN%oUc?sySNx9R8BJKvr|TiKe_->U0$+$am%;jZ8sq({DQ#1f%G+&5eaA?#cw6w? zM1@hGq395oh_D&)4S9G;xaLe7;t4&zU?UzO&P;7VepJ0)W137HDzAV2%!nUEW!CBS z6qb7>PY^HZy1UhEJZ$iz7(QAbKN|52l=uIGXJB8S@791nluWrjB?_Ane~}j07uY|s zFQD~7`3z2l(n45js*Tr!xG??yKL2Q>OQripJZ087IclgS)5tF|=Vj~pD>1-F(BB}w ze!Hi$4tf{h7x+G$O-&Ks&%N_;AIm!cgk~D?352rJsF>T(_XFS90sjuKRLr|DR*VFtkl)vJ--RmPhMEMy>nTb2u{(c|$ z8F=1rZiz7;qx=dR*8kHoJs_rZU-@BUJ{XZ$=;!CB@-yy_4WQXlQ*$W4g_iF@4b0aQ z>JyCdcnN&~{Ly%w=f$yPA z{$d*<>;AwK%qc#xYIi^>HP#T()xq-2S4s3Hw;a1NDSwLpFrWN7$e`s++-b#?*ZRn@d)o)uP{!a zSs=>S`2gdC<+$@{=U>RuP@iwoit+vSGBst}>r7KN9#^PfUjjY}tq+P1z@Nnna$n>_ z*Vo7RBx%yp%*<|MeOufVP=E*dU-bCHeu1ZeA~4`nuzU+eowQE!?9MarGpJrialP=j z!YkN>$M>@MX~$cGKQ8c*hbW(DfpCHFq_~L~_PxjKu?weu&wGJi;C+QDgOyOI$tiwP zfqjLo+&1v*KwDC7#_mf~+~H?`UPI=ZPN4b^UbLvx9WxTLuXKd}Je=RMt2?3XXGq2#@E*GE&d!BYjc#0d^qmYkycsfWM%;ilJR$X^W=G_rRZ&=7&`%cJGs(u{vWatW0P53>D>|W*62qnY7{qyrX{Bd|FFAy0C=gZvlknW3*Fb&oT|qB2>Dal{zZ?kC^iQ8XZqEX z*9Ja_LJ@CsRa7HVvv>&bl(WrYdCn!m<0KvU4c<@2mb5L&^Ah{Acm>8u-}K0RkG_5M z2?M>(4YUXQ$I`g(Br7-{k6)0)@E=*8H}2cljo&@VcLJZWJI?A=UaA_Ea`~7N@JCob zR(rLewpYbC>SsdvD~jmyo#mP7l|H0Vk8cf)^{QUljQDtd#!uVueVf3*P5(UW4^-U6 z{Np_btJ7GYcI_AJdQFS?Vd9-pM?VQ9>*rpp0H5;{NpJf;&R^Nn_1Hsb|0d%(0T$jr zeI--|bPSEt>Snkm>G6MkzEYiIwf%ehxAt$TKLy1LzKA!wD|;_XHu_O48JMv|b3=2@ znBVnYZpF`AS1lC@t86Dwe+(0@Gt2Lw@id*^Z0QNh50N@r8vH4B&TCh$$(&wfB{c9s z3S)%5+5Tz`_zK`(d@uW+eDC+YpAp~CsdM%CiXPw4wfArN8hoL7M!!sRiFt@gh_uz< zH>!9(_4(8gbCrn!?@$bqSQ74CR}J_*b55YWe(N6~kIX#RK=BtEe>thPf)anJpV4pg z(<3W9bm6u2%&WI-{*koq`lt2v(DNJpIs?|Fj`&;rH>=mc`|lGvL$<>-X9l79YEi#~ zv3^|Sq}$5=9_&4MyfI`bmbdo%ja zl&W);m#ePi81M|mx!H-bx#Aq2kq?ui5|?m-Ie{cqk1q_|FD|gDUED+K2l-re`BOb6 z3#B|U^ggWq$hqctVg2>j&%g&@@rln~SX~NmJ;5PqdcBTGwX`dKd)y+_56d^1){^`> z?KSo1(CeF;dqoez1T%mHTw?RFcIY(fs@qjJfuB9`M*GXn^k}B@JEqZs@_`hh8sSym zuOnQTe-;e=0rfGaxYxshFKym4qi1bM{1JFYhonRJieF8X!=orZpgsGj;nwRTwPbG2 zU+~j_Rn9Ia5lr#O^1H<`IPP<`PNk)OI|nw2OrS3a?-uOh*ux*f?pZR|4_njwWDGsION!BGI znhR8s0gp^7{i**R&N=`H5DyvM2EMk!QbFk=f&i zA6kR;e{4y*6dlv_wwCgXK0RmtysqW3imcY-88<5>C9eBj_mi~awWl%ukYxUoomY4E zFqvgrGk2nYxXrB=yb^UV_Y$3FqCWoV{bES-5cLoeyDoMn@CM&zpB8N0!mNdVpCcOG zoU*bqwtWn0C1eQvP!f5Gyg!Ah{zp!^BQ=Uu*^c(@ar?2#ga(`GftUJJjC-*p`~KGP;mY zi{URI_`vZ+iYy)zaps&koLfh8*6}WkXkW)LL4VMEIIdm%WRANDpZt1P$z2WqQvN{x zYzz29{kUM;ON_@WHv88s=rlb}#-yn){($z=MFo{}7sDz1r-ZNur6ntpiiA z_RuKg!!;KS5=`Q6vLNHT?|ndf$eNnG-fb_DGxDFGeOQX|=8=2Tw9ZAHxeHWd3wEysL`Rur5pLHC)R3T(edK)w6d^!d6i7)wdH9)0#8|=;B=wa zVN*i&E!Yp)8~ihAmGrRs3G6%XmaJOr^=!IPzru}>?TRTq06z(DHlBAZ36qyhYc_#j z=GQcTth3xjo|>RRe%77$3V6sbc9;Kzs3WwD$pqhChv@F~KaA{2*4F6S zbmV4CAobt1;aKo30--N-ek%Di8~LGIkG;-+_OyY#j-5jNTAbT%-_ZP0c#`-ZFJC?n z^Fz07m)0|D-!Pl{ZtTYQW-AuEa}&8Am~$)F((4DcUeUJddfLhDUV+fpDL%2E7M1{q zV-jum2WJfOuX3c)j0~*D-?4qp8Hf5iGTeT#MXn>`ve1XVkDq%yYJlkZk+!O98Vm42 z_mKDnCsw48m6x7wM0+`?alI-|GIb}Z(3hco*3aKn6+PH_AoG$_==LT06ZmJ4W=S)N zjQQ)>Ong6TNw*LiIU?(Q2kkwiJg6?P#iyC<^B?j8r0X2#9`CTw`)?+l=dpYXV|l*G+%^9HK5tT@9?vme&*?TBU&FssufOs13JYTE&*uy$e#lIV*W;bz8Ly^ zH2>_L#LVIB`{=u?(_|Cy*YQ`!w+_-wWGG&u!1s^!|84Ns0Di&hQC^z=Eq5q^KV@&| zWAOdih{PUZ4^cIt`C;V1C*qyTq-7HA|B1i#`C7r}r|bI)eL7z79rW?MlQe2VR7@1& z^O^i~#2em`kz86{gT6vBnKQ-25t{)&fd2(ePy#=Wy)wPN1G_3!qsqv)fc_+qbB=Qk z{u@q8w6CRI!H@~=M0?cZ9j!~xnLRgigI|jQ|1iVi>ng8e!@h3DI9F5UHsCqH2M~|z z;*UIH`~g7W)kN5R@MQJSisfiQtK` z{O!=v1k-#16o0_=Cz?z$IW$29{SKZ7`^dKwEH6>E36I9GdJP77PG1ec8Ccw|5 zH{yNt2jGVi4*pP|)E`rk)f3mVBrYMAy&t~!xV9s0UZq|!WUsXy@Ct=x>&4b9hYLRX zk=90gVOt)}mKWoh1-KC%UunKFmfu1Ny`%ExF#Mj)e@c(jKYWjrAELOVyNETU_f-t= z2dWP#4pxf47HFIPer&;b$LD)s4D2MIzJE0J1L6~l>4I$>1)q4h$FDkr_fzLqBkYuPkr#Uk zCl3eS_4@W}M)j+fxp#Xo&BvnY`)E%5mfdT~{8df=;C{ZppGStirz+C#W#et^i^BXT zB~OxV6Aqm7MxFw`q{D;vZ29-wq|@JX-wAfw`%7ia0FK?>0IlwK?XfoZ8vYf+Z1A1? z2J@wN-1A&F3qEOib?v_s7_Y^qqR;vB`S9}`orC%^6@*Mr2yfrcq&!fk;C`0X(&(wJ zxzMX1KEU{3CbZ%8d6_U0`i{xqV<=`F*gN5{#XJtyFIhcG)Uv1vyQaOr$N0k!5%t;c z-MHk1dzStVy#~wY@M-YNS{bu<50iehj?RAtYWp&om+Nq>_pYb>c#~9<^pjLyF`CO^<4x#8==BuSbu%(2#ZC-lZ1nNZ>3~&NJ>bD-$PcTq z>~?y(MZSF>)nDAj^902wBs@cg8^rH(sh(x{J6WiFhTN9HajHMzwuLC=%My^E)9V1$ z=QMx!;kzr7eLjP~2&*Sq)N0w?yX&)NT#xm;XfZ2ZT)gb%G9!NBd0(%mGvF^eC%Gg) zu=TfAmhXZ1(ZhEwjA59Qg%leiDUXm*|Q| z=Yl5qiLidB?Y4zB3hpKj#bfTGemLhnqdWIKJq3OY&1a!lq;pjFeL3t2@C_FKIAI?9 zL#*P`c8207c)lQ=xWX*oBo6u(w)}l}P225L;g9$mcnPhal5uV0+MJZc*6{$%cPpCc zJ}YnHhl$L~x2*reZCyoAZg=iA(iFn}UQq(WALX_ZvS!n@I|K0k-f{ooC-QePpZomu z2jZ=Qs-*VV9`O529WCY|zw5pBWtwjB~;FBF&T@ z5+CFcy+5PQ=3nu7>HUQljrlAF7I?G;wudN*VLhHJvD}%urez=a4%AOY7kk0&v~Z-* z&KTc^%jJRdLgxii{l^(R->I&Zk9?7;m*y9_J{{keHmt3+wK9REStw6W#rqMv1o$C> zVf6l+il;>n8tykdXfWtUbiob5_2KG-4r6@&@@q!F>G2O8uUhcI5}VP_;(*4#&ZpGB zlxhC04tfy91#Md4>eZ{wjC_Xn_Wa5N0S9?3UW4Na)1oa-@y;TjNeGLltbOegAoLf? zSpEp`t(8~fuI3fi7JiJ^ABR4bKb5yIuk?I=g?ekgliX4Y{szlW>BE`HnM>vo;UBA6 zzDZVwp6_ZbpPk0^!^T~Q{lOn$@uI6Y#H5j~lg9E2--`oHBs@1`eci0`%k)d%nQq*VPT#jrxk0n;BR-_l zviZzVpEN&rV`2SRzt>uK^4?i@ zQ~%dI#A_4nw>T)RHRFtUj@&ZeN#~>+Z1l^RFO$hl<$YBKKMlqDLyjBF{CoKs{ZQ>& z9bZOIE3~2OdvR!=w!B4V9&6n;GOI2R-7yb%(HqaifBY}4WJb>&lXV9D=R5vGL6YDo zvwO6?>_5uwUkbiCN95vO8mVUHS$Pbrqy6ows}=R|r#@umH|)7q zVa4BSdC#`Wn;h6L;$i($w?5U@Ud$IT6?0iX4)YHC3{Sa-BRMt0>^|ac_x!6pJzDKE z=8)2voQ};Cta74~{82(6!%)M-7KNmu2U|C&qls&Q+w+^@j5`WB!~K$gLC- zE)PfhWAV8Qy-WLd_wOD>{6o~+QNQ2f+YvQ!n@IEg?8{iEH3{UNw(jnQ`J*!ey= zvEPmIHQKY}gPjCUu8da(`+K)0-)8rG_jty`%zh^HDvrPx?DP0XnZ4Ve5Be452Nw|z zAxY%ht5eTler&_DA7_8X={?!zxG4|*Oq};(-w8r*G2vYg9IOQ127Kf62;`e%Jf54{ zVLh^2n8)!m5fYW{u%}zV=iys%CUOs3GVMnWwDG`i=yq-9rt;j0EY$rI9{8|pCvejIGRlga)TyErNK zon!*|7U-Xgdg5zWCPWl6;}M_ZdeZXrsKbIP0XnGIHgM9Gd@hbg1|d z=@dR@#%r(V?gKy1>$-Ij?=YA8k2WG6b!{Ed@|k*x+Musc^mFriNjEaSXJhVWlsArh zh5LxxK_<69Q)l9P6$$+KN0EOt>#v_XF@7D<-f6FCZ*5>I7KQ9U{2Z&jrF+r-p`EOZCsybZVxCQZ(_qk{g0*Z$7Z+5 z3Cl-oI+1VYnF{s0{AEDOLaDzg3HkDR{0WTL%^|AzoYyOeM%*AYLH|_jT;tc8q-7#g z8LkX?t99^jPrk()5*aV)6^QvrvU^SP>lPjP*Ymta0P;F(2J2%p*0v-ORye zw;|AHiTqZjW&Zy9HTkntvY}XH3#6J{5j0{FXnTLz0enZ}daF?>aba%$^l{kl&~x8uO|5pLTqznb$p! zyb{k@G8K3{6^cW>d8qY@^pm+)88_Y7jBU8?enaT9=?|h5)?hnh#ukTFd3d)#|`VS}NluBh=W!pzQ!S&m{2|nDfZ{c|h245Q#=!3=`n^TZH!<)#s=lAk@;^`?EIwm-8+s0aD8}++ z0l%Tw|A=R>_{eR<`}+JNHeO;_P%i$6_k8+$L4iI#hacw_%nu7K!T69){)lHFHm4a% zjr%r@!IU2{#>f}3j1m;U&a{w$o`m{!>Y#lH(m>x}^s{)vuHV}egC1n;t4vi+&j0bd zh{Sq+RDFz5Ptp+cctYfa`^c}V*OP2~^`qa9;&mfPZ?l;%aDB5*)6R5FwuU}0#Xk<; zfQL1GUIU&Hro3B;>aGNy!RA|Wl?RsxR|Quwz%%*-&xqBU(SASrrQm#uPux=K<9T6hZ)2A(0>bJSg8mwL`VT zcz)RPU=}bk)|WI*nii5N?`HdlVCwHXC}6t(e1DYBj^YjA>xhLv3o~(jJ6d1f$Y$Pi zT6Y%LWBod3y^y_-$%u^dZBABG{p_ASYwxIuE z`D2QXDH*Mt|+w?bq%5RC1N{zq{uW=Fb-!0+nv{ zZnaEh=;Iy#AwKWsHw#NSCrJAA zD<}kC*E!TxzN`A^JEq^A8NZ0}zQlY_m(1XHa^G)e<_+Y7`@p+w5^3d5IIidYFn|7* zyM(vRBzGX;$Zsyh_!+Gs&3w#PNc*wZjw>*q&>U%tZ27VAi02R9%`7{P!{fN|#!`Pj z>Zj4#YtM-C3276UG!GV!NYkANm-2=SnElPsJ zus#m_VG8xP%o@CX#&&sh5bzFGAM;J1ZJ<{^^v+n%rFs}a6Br7+rS^2aoZ=T3pq2Oy z_#ooB#Tzc5KD)ZQXnUaX_zgUdqC|Xa%r#|y8m|@4!+Jv3j1E~Ues5SGjx2J6nryd* z;Q8Q3sp$8_tROob{<3z!Bk+6Gx|Ve<)8HRs$R9EyY5 zojUq_XV!bXX4R$9d$@@RDq0ws3yqgbl#c4)4o;$Byr-gAZW6p6XK{@-K0YG0!>Wb_29% zUy+(XwNE$W^6;V!!SB0CH!?OflPoE_ehYV@f`qFHdxiH_Kc@bRRd@7yPO@6BcZZ$? z>9nyv6Ogy{1lq?y7jd3NH@};-{#RE&9eknm1?jO_c?~q)PsRK897ye`PA`FfDf>K@ zu%~kOx(Izeix23|cF8-u-i!Y*=J%ME;ZotEl4y+jh>YCS3+Fd58w_}c?s4IhLiK*# zWaIDAf0-rNblEZ)s2}iuDs$7aPn?kX81N11uY5-sDw7%c9{ohQKd}7|@RSoM-$Bjp za=+ap#3Up3!1b@8U(-00@sdq~Ns8Xj!u_dRt4p_a7irS_xegT!6|Asqa5P?DL^v*- zVBrhn{;WH)J2OJ(653wD_t0^K91l*4xSOoDngaYrv2QU|;H+TvH#FY+lw)Edl@_)d z@rm4?_@@cuH*%O)dcD}nO}=NBJnK^rKE%)+Xs_S54F2%>UwzLR?x#r4PR^DoIW5M0 zn++oZ#*FwHdIG&aY1!Oeb9Z$*zcb<+H=Obo1uqX=VZ46Z%nviwLv-fG`rV_BQb$4W zVSJuxa^W3en@gk7Pn7E+_6qmBzKF#eT;O-;=;XC1!5sd=z@M=1s0^+Osf@1_&Ryd) z4DIoDnR^)feFM))L3?#7k(9_WfnZXBzoI^t2o`Wce|J-p)yQ{??@c|rc+6rOJ9pCf zmi2dViju;u>tKxWeib^eHZxE7K_ow5{T)`s56&C&tD=~U{;hxBAf003JI8-)Zd(0H z5}e}$5&v9LomU;v9?>#0-@1#%q#yVT>;toH}m!kK= z_bx9P%YP`JL~%>UXxVLkby6|(i6}eNCn*2OP<0&YZ&g>|)1V693iwIa0dLZcCN?h9 zk`vlUif1e01KlTgdwp1QH>Q;8NiN|0y)((o{-%dag?|KeuE+ZTKXMM+{=qLwMf;T6 z+eZZ#olUozB(v#JnIXyAyv}}?#kqkYaL9qc9zFPj0rIz<}186$OpS|%V=9gX+-`0$%e%$(oWGp~YKztLF7KfbNrUcHP*=l#y2? zPLF4JrF%SauW_$o24x3Qy@_;1$Mp>DWdTfe+| zIrAu!ND!~tU-5b6bLCPYGceOfg7ahRgyBMKA&(i@CKrgmiRXLHH$0YDi)rDw8SGc}BA>%Oe;OG0b@Gr9AjO1>zV1jK9Qhf#d zj!O7(+)(CbGsA=5tjTW!?Ppn>9mq_H`ZQ=b@H+k+!48X}@!&&jr1@yR=dGJ|J^Vv1 zd9VJqY75qQzEtQXeXF3}W`nX6Y1y_$seriCYG)b&>PC*z-8NZSqmfz(Ry8UHH|^I?*Tj`zcPwz4he zIp$<@&%vU7h(8)doh!lYA=g%ZDl*4+m|}m$r6yF(+*)woj6km7#*O9N;=Cinhm?Pf z>-~G+O>KwefpNOE8MqPfQ=vd`BD)u1G8(QPtc*$iLCYd9>&UF7RwM$z5Zj z)s5lL7Hqey8o_M-;!t}I_;#E@KugziNyq1^SE#?{Gokg80PtZtCOvz$4(m}1Y|>@j zsT%NM#+GcxeCF=-N3M@J?--{q&pgKaG7nl+ldmnyVH7VnEy4RVaTg>zKiR1vLeWnV z=s(V>p6E2~+B0Nl2hFdf;~wQd3GR6WJ?3YH@bgr>JpF9l*%50^NS4Jmx*lO)a-y{! z{TEp^c>Rve$gh^}Tz=#pQ^n-?P5A@(1#hPy&mA72%;97U$_HcGyBq2*JlV%o%yQ%4 z`>?NxYpFp(IL5PF0zQ+%`DA>})7P(6j9nao8`|sI%%pW`}4&wWN zyX4=&v4dmXnE==IL6cbjBk=3s4@G*P_Xa-$ct$7Ph#T@FV7}?z>Qn36>f1`nWkar^ zJ^rHJS?gBo_JrwU!{#4|>fFU{(1)}5g|~;7*vkg|nAy|Vc;5B6bC+|1^Kqt}v zROeu)A3Vn@@RfdMOU*L9T0UNX0M?%6a^M>V{2?i+osF-J_zFTdH`+gc z+~+#8{+&iVy@WJhj;$!)81JV9 zB#wABLN$VcA1LJ?RH1LA8}d!CejK{YtQIyt->2t;d?U6M%WZccpNal>);T>MO!Xer zzrquLYP}`I$p+_;|14^iIWHOG?k3(Twi3ptff#~%p zSsCd~?EF1OAMfk=1H*_9+`8(45RP;1%$v@EVBm@nd;SOJ#R<{jdD8 z1ExyTJ81vFXK=soN~9&!kA?LUg}w&um(R8z17D=VomrUTwREWwf4Bv91j~oemyiA4 z{ttcwLYv$icm(n#>+uY86RF9uiJk|I&%=2^9Y{?RK3-37a~R$J@AC-z2KF`97kxT3 zfgMb5vk4E;AMWe)iguJbf{!tr`cojkLg2LH^5!$texjDqCWBqLFaD0^pP(De`NO0SpIf+qp0AK z0(^z#qYV7p;=aXs3ppu6zE<>aTe^cXoa3F7$!wbf>i3z|9#2{Ja&3d$9C-~Z$ z>3h5!y-di7$Ud!KqCZSet*BG#l*}Blt+yC>ywC6IR-H1Nn7%Z#!uUKhUvk%@DNV!7 zE*^ZG_MZWvyPy27y&)U~`~uHAd{(O-&#ib-Qi%B?omToA>h-L_nI3EY<2_G@do~shlXn*u?r} zW4`jnBygZ)F_&aV_V04h>U#6-utHO0#f&)Now^hAb#VZ{%tkXCe0B8&ypPXNTgji7 z{>U_Xu=vDhd}~q3tgauae`qo0x9%KAFRx~=Mq(Gj=2LOFQvQ3@y7tA4&1K5x(DmyY z)LdAhErS09d;Yha%?nGmYEEH2SOfjD4){#j=9Yj9h)-F+(4KE1dKWM4+(+Xxif8=P zEs#lN8#g1Lf_Ez3=O=tCB1=KOu@uC+_};uN7V*}Z95TgvDto_Y*OLo>ZHUk@uYgCO zJuHt~TxR-yJp3*6c*NP$UZ*AXk{-s+i}mZ6Rqmp3DTgbPofq|=P|S_VjH&xx_bH1n zp#G(^l}UGU9$Na6u!E|_9kW90X9GGY~abgpO}}f zi9bm)Ek04X;FTSAkDSJ;yEDl2KI4*utL_`-J= zoaywzfbG~~#F;3xm z7WpXjc*)M9=<6|04n`Y(ub5@w;^o#Bp)=N}`*$8Iyo#1I80rgnub|sTy-;n`yTmRz zz9soo@mZrD=R)f5o@$d1W=8&q*&VZ6qwcIIW&&6|LN}4K*m2V;_;mrFpne$k98bya z=+=*Xjgfx5JG@u$Q?<3Mqj<;2;E_j{<=rSG@MqYK_wA{*&$N(&?+1Pd^d!2!mc888 zy5ZhB;e5LZQ_$W_tSt0?Uu#%@58bR8F7nVe@Eg-C+Q8q@#cn@(_EkfZjEF?~pY#zR)syL}Omur99*#iZtY-WLkhHVtm`2@0Ne=_dj}& zkA(H_h|;h}yG7T*J9Sto8n)-0sD?Omut9>i@h?kAmLvjp&U4=7Xfp z=Op|XbxHN`bAV$iF+bt(1LBux_>K5dO-7~z<>x5oL$7C1!|h;@KLva*Mf1LvgRhsW z`jW=W>VxS293M(*93Fe9nbr|?R~J(M6Yw7%@r#+6Gu*fnP~X9Qg9l(Ev9l?jp>Tag z9VQ^ZCb_o4@^GszH92PEHh0GLS>ICx7FPc=$8EEgU`0+K{PThXdwAzjpl} z-H|qvXlC<-A5>^Rvn-Zc{ygrDBlBVCmyPStpXiSF*w;JPP`$?^;EQYh#s0FNNgeW? z9Hjh;!5pc~>qwI2;+5_ z`dm+GeR&;|5uAk%>D-n+0Qw}guu1q>c!fAy{%Z>V4M7Lz zD3@SWw$N1J{0;RNwGk}kp0#4ef0@&miSd(fZJh=EJmdK6LPIL>evV95Sb_bZBF)*~ zG2eL--&0XlKY$e7Dp~`)hVLL;=~0%}!;Ct=R0w~HBW+Kh_R!@rE<+-FK_A17a;`bn z^F&1&JN9kf0scwO(^Ex@PdPH{qzA6!d4n{&G8aiFaLLN>mW9Aa%=~1jd!D9i$fY|y z5?i!i7r}AdN3)YRz+zE`H9>zS6W|9;ZqV~6j@B-P`pZ*8Q89BUC${LZ~Jo5e3a^S2I2eG31Hf%}B?`%$E2wj`(VWX!`gEWgS1g8&<+gZb3Nd1i04?`C0> zq*L;kF}+L%PQiL&7oXjj4VI^>(LRb*?sfLHqAn)Yv+y9^N0p#ruKHBxSB&kd+Heox zS0Cuc|3D&U#;(MA3&l6Fy<(1}48Df>Vtmieo*>%al*@)({t?gL71SEtcDGeX_3VhJ zF1=wQ*m$ZO>z_DI^%=Hu@!w>het#%dR|ZZR_|kwk=(r}K(kt>SI}CUP{Q5X@bBagI zG@Dt6`aaVW-(~aIB98JuG{8GV3BrVR5&==_aAdc0?)+d~g8_r(uV}24WmDBP74>9Eb*g+jEk&i{se@IKrWcyPio}h@A$H&iT zwr1e(LGcJnfThX_xIXX^%9mKA_H<{T$ADMdo??$JYKrjaUe+HYcYoH`?ECC9jm@{} z?OuR4Nc9^Z^OI0V2Iw2~ct#b_j9Xyz3y+nu`jgvb`uh6#{0XsigI>c>9>h=X)yS7> zs2@v2^9f5%pC-MbFG6|04dCn+q}x9+;uqlWfZyW8`dQNTc#40$y;KOl3Ozq#534qb z`sfFd)zZT1zgheO{UyzRBF=2dG@kDSGYP6tVP@+22XZ;pd$j(KpCLy=U^rY+{DR&u z6Xp-OKV$vd5bwudKe@Ml;xjYjaR*CBX*b4e<9=04NsLaRoI>~S;P*Fl+cW_hzyJA1 zDE0mk%uIdx_s2wI^s9~mAL;)Q_TFJpTzwnxEJZ|3vJ0Z-F?qAQQfx`URWUK;0IL*@ zQd~=n5m47|DC!yuD^kQ3ML;C>2DpIO8;WD1g1U+gMPwy0D%B-M>9F(NXLiRY@B4k% z^)Z)!j59lPX68)!-RCa6KBdy2!?gUr?Hv&}f?8e({vrMvZ$p&fpy6M78sIr!F?{>* zJsos4@G5iF_A2-vJf9)Xl20e#4>GGPE8Ifw*1wq>N)Z)C@b~EL(Qm@3f_Cs@cs>f} z(^IKjytaj-^A&i%`1DlZ3mW&6qyOJ$fY&#Nbm#d@z!!LbR2Ml2Ncbc6Hr3RB!)`H? zS3milKJSKSSxKE4a>M8BU*q6s*pPl$X(bX7yIF2K zar`22;&#r+y<&@$y;IS@+&l_0I78(vvhKOvK^%`FZQI$p+?z&eN;h|UykqQRyYct$ zI@|siu>QbVE^{?MdHhZ`*zkENL5BjbxIYlTW$m(i&BXiji{lQzL1W!W?vzf#=ZN-I z{=%tJ zVP1=;jo`H676$rT;h~s_n z%^%-Zjl0=RI&-74>XNbR&{KOu=b#_p z_vg_jKkT4#_JQ7ECHNBDv0v|ge=4A50Pq1`Pm*JmYh7YnY0b_t`;ne&-+B)0@qVm& z!b+Nd>N6r_=#9}0N_H;%Ie`z@-&LQ#sYf278}ApYb(HjWJnY$V%i`Ce?cLt5^USKp zTIf+eqI{13oSyrncA=>Y>(aPkH}>CWLV!p+v}82+Ae7&twf6S+-8p)5KT-{S4Azg# z+PiA+dl6r<^m^d@I7PX6=PFCwq<5+&uRMkE?VuntK1`Q~<9WD2mZXA$6Zi?ge)l0R z!Kwt{bMP~z%YBmK{g6Mpk#$q?exn<@uJhl%eQql|sA%lHdEies%it~`E+r!WV^$b1 zwr#X|-t&q}3Y(R?W5apeZ=wOB!OXV|al6mgOXF<<+_E&wW7yem_&kD7)r-_dwQ&*j z6n%FG0gRIk8Iy`G+-pMvp!OPt`r1u8Ea8IQ2!HmsJRg9GPf9Y}!uO@y(7~A#p%;OB zSl?dA|A1cwZSMdpXDeT;l~xwM2RBfpS+e$edWXRO@Du;6+^NaWA_MQ&qd#gFWh8#F z-5!3Au8lN*mGfWcr<(5dBO~}#yx;tvnt;a|+CO=H3;6g?;|;Sahy@S1RB~>|&C$75 zY<85M)_->U`z3AFHhwGM8#1|i;;))L%ii%TI#rEUQC5M%@x^u|)Fsxy58TrJ$iWd~ zBVrBs6D_>KB9bzwPzF0Cbk^A#8&h85a*&(*FLK?)(ZH9M|*Vh zk|hPh;IBdbJUNLE6DO_N-U>Wq&^Da^E=ltgkPzEI_C;#nMYw*G>OJZm3=Z%!IXFLZ zAn=8b(7M2KI3gt21&L4(2Pvf!oDTMGWY-4_|#!JmkzU){OY1pfD}`7*1qCT+WaDkyl2jBLIeW(|K0 zkvkLTQ3gMV|D3oo1KZnYD9fu@pFf9$AMJ9VpgqH~CL0!*RuK8CZO?#b^nUG#$@(?; z83LX``58ts{?viIcX&puiOj#Ba|p+~H|OZhe~cL4tor9B#dF4ItkO)g)-v$FXs3LK zufygfZYqOcwK?xs>lh@Hk1F$P5$?A^38yx^xc$P&^KoeX`ci&H8V~){+-P3EBsw$f z$**lX@Zaw9ekPyjd+VJluC8UX9CiXv(>egnaNeg(CKc@VGK${-y9lg@pG5qr*PmiM zI|TZ7FX};2J0utVnR9IMs0nQgYGq%9JXwYIdACZkkk7c7txBbMhBmo1_|eePA@|w& z-7Xye1^f)uGPI&0;|@Ad|C7HrzTWt3<6j%uz<^}RznIVh$5Kp0W#(r@)$mYrz! z$I$L~gJV)uJ=+U>4B!#G-WOkJ(!7cLLZLT#=l_?h;^+VR^Upu|_oIMkP<=2aV&Q9m z-&h-3&b(wDyU0eMUbAhIr^ppj1@U*kV_iY{mZC_JJNOmf6n%bqq>1Yz`9iYLD&LjW zHh*v%{+&6UGiphZER|h&sr}4L=wVHvkG&E?6s+m)<|`k-AG}E%<>2ljCZZL0x@_n9 z8_X(4s&_c+4nIq7ZHHH}IGTY!W&Ouva^T-`&@p&~$7W~NszprmWCk+F4Fs%zl0OCqHWw$H-)hy&r=wyKvtI0{n4xXE|p=Gl}L(RV zB6G~+H5W}w&&}B85rRB9{{3X|Q%{hGqDZS6`UA!H>{=9U?qwl0Z0=Y?-8B=ZY>`Jh z$dH%9^a`TqyRT@9PZ|`EFexTR`t#7iVU2VXB$n?sJew^OPj+^H$#{IF+xF3D;P^a{8X(+uv zKFI6G`wvKUrK>~XFB3B5?i9Y>+_s+bHE5n4WjtwEr@4Vt-{sjXYli=FDM|h-&=2~P zkk+79QsY%aMgh;Dc*HwAZG3<2->KC&E0Mt-b(i>h-m)Bi4W73> zSHh3dxqm(Ghm_Xj*4M4C_pkzf@lyR#{Y?E1zic5*7xG%+XX!`JANcY-|DynI1E;vwOXP+*FGO1pI^0*c zJ?Z+?@4`p6X(Ru8r*4s5QUB!ESn%|9Ge=NCVf9ElS|C4TA&*#@#%a5D+4HiF)K@u0aOTy$bs&}FO7&FS^k{)il zm?Y>~4h^K~rnKIj#p5O4LLcH$aN?4%e(y4M*(Sq6!#jNmL;i;z|2sSa%~b$V5$4yz zJA?kwdY|Tlu1zYvSY{|Q@P485fPWypg-(Kh=q2t%yGOgC0C)ngzxYt{kz`}iM&L6% zz5zZ4z%>o{CKkSfsFtZ^Uf8~1*IwcAiTI9$ip1?18Sj=ew#Fafi?YSCeNI%x(CH6eZ-RRJO;8YzF9~{*5S7Z8zup#nBVSiut}E984>I#J zO7t|Zx2T9sGPj@dFTlV+-Uq*b@Nt>n8H$&61-^j#QQHucr6MbDXbOWXl#76xIpzBBp4WvB3DR`L)Xm3Mk(Rcn0d-?%l_X;qULQ zUH?u8|G?+<;z+*zN$^Xh=RYp4Yy|X5EaoYng8E^of~FxK)_i_?c{sl4r-^o>?V&1lMUqrq;h^EjU(&C(-F@eHKv)ARe{eD3*NUHuVh3j8~8K70Zv1o8KuV>kEhI3FSY z=DcTOZ`<_>+T-$2-IURq*2?1<0XRQz9gmA+nP7HpmFr@>4<$_wkCf>X6UoGbQyk$Z z)UiWZZ$w|E3I-wJpf+X%~dz~d&c_sYZv*<%ic)5at3y+he%_0aAh^>?Fu_EX%Q z);HUYld0aF>QO|@a?O$QBR|veTUzgGImu#)7xX)GQuzAbEBc1MzO&^bJKO9(@w4>> zO{9q-xCtBwC&u#A>^=mKFB)7uIByvAIV|tAN8=JC@ei${fDEVuTU5i zNPEI~FY0lMxAS(yqAg$3+kvHg3zQ(FeQs;fs!Vlo02Hl%}920BF?^ty;uwQnff0KXHn z9%fjl!XP!kPal4YdEcPE&h%~)HOVuD{SRnj4mpI%gN6G4*rij`Pk*U)68IP3Z>hWN z?sA({2Up~w|2jTm?lW&iSIDfi6*1`F%iyK7rgHUdi+`t<`>JZ-W4p6XZ0(zms2*zX zjpOy_jW=n2Ymd`7zg^cT4~~AI7W6IJ>~8ggZ)36?k5+a~`cnE#`i#_Ut)Sy~6Ele8rcCU{QiDAGpvegp2?gcxrc_M|5?v<&^oMiWa;|o z4}D)dN$A98eaxMNSN zD-9P*3fTQeyWIQ=_s`4V?3uc(Us>tvQPF;M|87@)eyAxU2fD7kOZDn;l2f9G9<6N2 zZ&6~@@5hYC;n#Ylgq2KuP&xtizHy6jOT)efQWLx*;WO}2>XYkJJHSVO5z<|a<4wo% z)pe`uDgTA?TQuLE*mGjf(LHRIV~(Yvt&S?PCGy$9p|z8@H5 z_A7e{eGk@u{PBq1Nh8)N*i7IVxW8u&2_JI$X43}XA^KgoKH5i$N7DO>`>cz1-7*L2 z-v>5Edte=_ObPmUFy41K+tM0o4H*=jdlmP~w3-oBeM-BPl9$0btG)z(!TOB#AMZ!J z5B*);66`OdEv_}J6?~ZaH*$3AF}~XU^dMNZN+MN2h+VGmdMB-ozsTuNU8ob(M zsp4SbKQYu6_!Im;QyDLjnAOhRb8ag56=GM>e5*^Y>_3_Gm;vE3J% zA9CRH^gHbtzNsJk)ptMT{7(G?#PB2VaUhp}-qHnr8NJ26qMc3+{w$OJ2hFblzELEO z7P+&H8>jUx4#nzWx&LNIY}VlQuBO^=s}@_3Y1UuR+m ze&3$Bo8wmN&i z+6Q(IEIg+_hw%bl-}=fJQOjicW=ZePp0W|+1D|_d`iB4By;HsYhl{vBl@BKH-@6zu z$i(&(O^VZBo?ctZW-rY>y&QUm&hWA!2_kQ@$hEU(BAySez%Nq7;cRTpA67}g4`fcv z0A{*~*zXGuM1SaVu%I4aDU~dAmaytapeZ=sbi;^2_$Pddp)O-Ls2 zs-WWQokof`xb;~PgZ*(w8otkU-C)huz8;CBSx&ZX=A82j+QzWz4{t8oith<8S;)*{ z=nIDSH+g{o{Drq7UUn+5m7V(gq`kmLR(C!!wF40%c1gS+h9t@>J-R%-o$VgL>q%s5 z7Z+TwzX|_~dG1p5@3@MzirS~h+tA(T@eJ_A&EGer0fhGd*3GHwQZtkp(j2ESif=r+ zUs}qaFBR|%;ES?{NKbn%s$%Z|&w$^IS1SRYfq$b?-T%$cAbBTN(DA5aoku(OcI*XS z`k*`k_kVqUoL*k;UPSsUSJ1p|#}{~iHA$Pv>SFhi&fuHEO-I@+Yhky#^iIY3iR+97 zo_x@R`dnN_zsG{^TJQ*rzlKx)PL<@`=!;`mn!kwmtISHeTxSLTtR-LZ`hwp;_lN#8 zwJVPojJbL9GJiaDymu-57Ii^7Bn)r@KG8tSWn?VU`i0^VG;fhk7QG4QsFYlhyp_Ba z{4g#VPZS=lJ5xaM2IPNeFZMcp`WR|7jNkJ3NFU|c_>$tysHe>PbA;aSN^yJ#RtKHl&1^C-pNu7tXCQy(AfMlAPm~9bWEpkB{9$k@YL9?VQEbiEi&{4r)S(6M z^cc{S+_t%`B*iwoU!-a>KBz#!c*o~h$?sn;{JsR(3;%nXhl2h|@eRk{Jru+b`UBJt z_mSRm7yqQmc6@!ClbyYne_vVV<5rvRPht51;eG{PL4UtC36uUN$M;v%8-E(Bja`jQ z5}|komMfZOG|ehMTy9y;`D5h42A&Ws_FsYaL_qIRwaB=LU%rUbj&?-z2m36A7K|k1zfa!|I7d5|IT+c<0T@(5NQHX< zxkd4K2VGvEDo{;VO@)4i#~ZYf*%6pxv)Sut54JbeDGj|>)hOT>%|37Z-#R`RPxDSZ^X5YYBG_2G_;nv5Ej@>TGB6fs*fw$pl@=C|PdPwl4b z_Dk2NU0HvZmM3`s{ZOqs6_y#4Np2i$K7jd=k{?vJ!1$2%x?VCn58tl?AM)=@a`Sof z2`rCP7F~aJ3;ve@FM6Lu|M7`a&CI^hvWtvytG@Xq_>t8fr^OgAW8Y)?Bx5{1yECfR zt4w@|uvgr_-;VF!H&*UF8D9x;XLbh;GI1Y?`R|he@;N-TIljAnRImuAm4(m#dwhnS?8GHjJ% z6(i)O`fT>v=%tq+zXW+E`2EK-`po$9^ukVdwi$02qVPD7+s54>+2-$;pA8Xo+68}7 z-tXh<)=?T?v9FZ$kLL3)yM(ATTQZK(d=#D^68ZDuj3pUUp{ED`0qu2w|DEKG;vw>6 zDZYX6+(6a-$*+C@p26p%Sg*F}$v=yI_HXOaF}UI# zKVvk;FPG@I=dx}~csK1ksJjC}xqwKlpzUUr#xK~a2yeDrRGi>Qx-O2h*cs31s z{Tx$#M-UwR`T7X_gR2?8Ww06H+ep>@x-{(1GZy@GFwQXkOYsct$YiHR&DAXM-QV!} z9XqCEOv!NCC1Eq)bf^3c@U2Dyz&=6T%=sSBm$jd`bmo$@WOg5#zj{emki*}<7Ca=) zxVXygx3N)_f3OY5v(PFe#63d_KUwqk9X|}paC-bDJju!6!;s-d$z6I zHg9Hcf&cLI>Dq>2=dIuQUmhRuXi%%R{Sw_iyo&lg#wt;j_Un~O0iSSI1~}(BAF&ej zAX@tj`>bxwJ%C5_MfE$DMfm?FC(JK*OQzY*tj zm-Jm3mAwT#WWYZI|JL282(aKuTu^;@MbR$P5%$H2zKOU#F2$~8<6H8}1^rLt8H@%M zFm+_MW5=!l__tO4fiw^JU4gHIdRaTQR;5#QL;jcRTguo`vHm&L{Op)q1xn zt_+PFCI;W5JM{z2=~3L{2`2Iq_y(RoqE@C6CxtVZ%kbdC7U7E!;> z|HQg_jkVHRvHPwziQhAE<3s_Xg`&+4Z0Hu(I`Ace$^y&R)FH3t5BK3Yn4jj9Jz4iF z^x`uPPdtZurQDSAvs{6Cb&JCq>p67%^R(%PNpB+0?{v8dyd*3)_Tn0v7aV;#A3eG4puPQd$eHVx;rGuuP!!fL&$$&2Xjz;lrI5ndC~5n-f$8Ib=lCq?}fU%$0}OULRC7XBGTYSNwnfBHn_Nsjmb zM7`zflV|qh>z%{rnH&SxdQRP(I{0T$Jc8#3V*pSg%>`crexc28?wj>YSf5}yug69O z1NykjoYxpMJp_&ubr%hm&}^h<)?%rryvc z*d4SD8x+1Lf&HSvw4n}oL^IF}se~b-@;|!l#QT$(VwLC8@I6bmOS{a$aCtlYH-a6+ z>`*s@1odsdkbaUWbo^uVugR`p8jrWi^=;V6J!Rv2dcm(lEAp}y`-yg?^X%{$c@&QjG26}aC;!?>{TL*& zr1Sjp{NHyhgI>aG+fC2`j2v-%wwT5J5}5T0zeat%<`Lgs)JI;TtI{^I?%Y3%a6InC zr|aus%Sx&q6=ZIOUd2$d;}=(7D`LD~(TM)%wRYLs&Dqdr<@EgM8s3Lt*H1n^V|W66 z;ZWZHdRG1H8#DFcH>7v7mn{H3fqIRv_oVmC{KiLP?(*Mz#0~FzJnz>+;al9%(m>{> z^1uIH6|72{T2}~t3gvTX-CoLHgw}=EvF7)YcCOXgq_bxetJy5*QDVSf`6|ue-70;- z=F2wG^KpUtyHkAC>W;e&13V^7`bg4b^?*&8eCV?@;1!RHUbPu(p0W+E$J%-VZ}o6r zoLv6E#4hmos&pXmAmx&zC#VxhZP3_Tp8-!SYioP8%xJ^*)95CyM?Ic-pyT?j3-d_S z!S4o)#P=T~_8xNjgo%8<=7%!uKdd$jYB^jV+c{g{e*wR8@ikd3@TB)|5QWmVE@(iYeTKTyd6 z=&vM?WXP`xYG+Hp2S@!K+p)isPUME!FJM8n`%C*wg_;zb$Eyc;JA3Ig9#%^3$omp_1lP+1vJi9tC}uMi%}b$+r>~^~hgX--TJu)FNP&z22{- zZXWudl9>>^F7rp!D?B~{J@4tT0_Y3O^IY8Pq?V)>4*4EtenzA*BBm+6CT9&HcZ`pF-6Wtw50i%zl_SzQts*5`K|bj_*4 z8cz-JGxH&ys7m23JGqqND_3y8EogJS=6X%tM7IY#1Ka2S%=`z;Z_h~0NUb6N^8a9% zEM!X3?f)-)!-A(+@=B1;tF|uNv=9Mqzz+#b4(03;ZS4m_!dZi7m$V(B8PS zv1emZF%tjh&AfjK6JT>hcSQZa@QCNb7YTTSr2NBQ?Q8rGLyz)z7Wfp_U2`w+^(FKw z6z}+W(aU)gYbSzlWuE^cZm5^1m)48NYtjDCt29|FLFuCU7>ZYv^w8KvA;g>n;QC?t z&yO^~mdJmT7by!&p+Qy*ab<1G_wC36(9i`Fb05Q6a+ znX6=~2>z6Z&OFK7jrU={QT^r*-7}21DLSs=eg3`eY1`8)UKUdP;%WfiH*#<1Z9Cvs zRRuq|ak#$qfm!OLfohr$OY0rc6=_pqV)h(D^&G+AXY`&p_t%0amF!{YD^O2$f7z|+ zgR7rhh5lp#uV*>!eIq)bCh5l+P#i>Lhxmn7Ja<_dhZ#WSZ^JS7UqB-*oD^35SEuuWld%PSU(s@Cl9? zK_4l!6t9T{c<|NOh_Hih~-JbH5f zI{*DWd&1z;xZaM)H;}aSyv*t%dtCev@Th+rwmP`W<;3;!_w@VqS5sVlP&qlr#toHF z|1;#H)wq|*idffEW`7mrr++RFkdv%8b*MkN1%Urw+P}27;2GSy=EZ0FoRBDl`~=BT zk2A_Tbvv!MX+4^kJtuocG5klf!DmPR(xy+UQZ>t)QLpm&$D8R%Nyj$7-b}L0`JRzl z_g(H8;tV0r)3M#D)#XK(G~fX||Dz%Afli}wi-KO{qfC5%I!PSD`bZW@1pbA;Qf?)8 zRvQF9gQy5@pz^Vd!1wsj+gTNUA&?XB0)~;x^}708%RC4CT&Z`Cv9jP3TJH|8miXf0 zVqyDUbL7hSIS+pk_!tfzii48hZQcm@#;@16X6*gpkLi}>oSpk=0ITGHD^{=}#UbAGKvn8vNedEB=Rno?7%ipB)?Ydg|+`|FC9%67Ksp zd9AEgS}PoXp9e$V`n++!OJ11$N_|>Lb)@m+J3Y@DJnoVtoBIg-6h($R+-=+q0v@tX zx4$I(7Gn_jEW0wc)m+QCW-s6y-2;ED)xA(5zr)Or`CL5L;jsVVeAMT9>L((3E`95L z#pyTrMbs_9@p>Lty!MRs{GBX(|2_Q;;K_}SCmgpru3;aCr%y)xrZc6OqB=u6Sl`bj zR38#;3hN{t(sp+57S}g^CT@LQ9F~T*k^K?9c8oA-r*z5u{(4DA3A-<7blhYU_o^__ zPpJf6yKjg(?g!|%;K$KVA(pZIl6xKa3jUw@$%W~;=W^I*fn8Dv>c1pXtSnY0v0)yr zE3p0E)sDv;lO5C8eg2vIXuZMbc}SbsYgI=@z&m2kEo9oxUz|D0}0m}15=_BWj1 z*qW_WU!vX68DAg$Bw0PJ{?zlg|)VmS^WS$;oF|~?DlqD&Hg7n>z5_S z!zwvwh^h}QC$ol)RO5XzP!b?oWu4!XxD3sih5b*eQk1%%a!(04gzNnyXuWB7Y_w#(Q{`MXab+m=2c6R{JH&V~61H>Q=f{!9YAtqz zqT$kH_N(*xg(=`8c}j;k$|^^&U;R^gr7zwu&7x?DTqa`4k9Uv{3qHmat6jqzmb1(R zu`R~4eOj4RD|c6hJsbBwVS|vjBXJe2a4hj;moAJ60iR<@8{A_g_@40l-rILC-UrP0 zLvQ6Y7+K}SSl}a^gGdFx2jmyWo97w$Kj`(qH?B-N#_K=C$_Y1L!H2=F<=8hX(SIbW zr42^Z(__DQvn>_;Mu)_tSGT}V@Ok(*_#~Vg)GjfOdmKnySp@aJ0Q%MD(F%Xar4!y) zPX|BcOmg{euO1>rB&5e}ys!ScS$Dgm;pr{X-)S%%zest!HGRnTw;R~%p@S*EbVp~( z8})JdNp|jH9*>w?8+0L9PF@EaELHzTqf9glnfAo{o zo<%*2l*v>dcN+cO!*iKu(umbxkpYYO<*@yWkBJ*eD1J-7f4=J)@PXg>pYlmo(+a8| zmHj0>>O)3}$=|;3wE-`cw1}@tQshyr*WuOFul2*XUDouGj&ooa#*cmNZQ?$b2FMpW zXsyW1?dunZh*`JCp4%`epPY(2Iaa0=_{Cwr> zZ?OFt!Npk}$WQ&@*|j7m6L+|?ys~1$91$74@u(HXw;UNa$yA9}LW<_l{>6pWZK+$+ zp4P!S)JdTa(MFy>P;r{O#<4x;OVR(47xtlSm3)<)O%0It$Nk}m_YXY4TckOuB(y*B ziw9c9&z;Q6J?h*Gs2+ixV8%Dr@oUGnQ2z|d&%k)e73L+zzwSJ9_X8g5Q4V+UI`?*R z_4FSf1J4L*59mvr zdgI(v@bhaO$Y;}=t}j=~6Oa4`K|KZ|}n zDOh@d?=M|n^oD;R2Y>s;W6u~mq$%e7Q<$Tj9Aj@9yx%FmcLHLRB;O!69eC48QW_2tWz{P!91MB7mh^$u0tRkzG4BkTH={e}Lm zVwPC1vcC9E|B?0VFTOp3{)00eG4mU)gU=Cz@vL1bhLp!|46L9xQHKM;g;8F}#+L+sqICQB!6u*+%|m&ci1&?ZjVjm${AtVlRK#b>p3Q+aNH-UMPW=-$gTKdL|6&VY zgWtPe^G;7f!4PER2>3^SR(?KzJQn<;2-pdR1A(9Pvf8Egu(4vjfoWh zRYmLFKf5tUi1804T~6y=f188d#@PheQ2qkN`^ky; z(xGvN$Y(&-hWen6%z}-kGa17fcQqN^w#*&_E9`%?WUxp4T=p4 zVYwFdw;j{tU4Ds{F@g>9Uq8^G$AKAv86g=0{^7h7_(xOt4Zc0VBmH_NDT|Y!uNUwP zJq$u68~c#!@cYE^x;%1@xA9iWsXpfdj>jR=H{D>U?0narma@)v&@A}&;CzT+pMyM- zcYdNV5rA(PO$6OP#TOi3ODMm$MbN)&)W_-9=vM_{V{#`<`a(^3R}r54wDsG1#b{sCJQz zAYHGzQT#~sP*OIdLtTva@Ymy~hl3stI_-KK_(<0WXz!GIwjNhc&)S>)Lp}{1jkFfc zBeKq><##NPF)AaJC#{vzBx1S@4|f+>A!ea zL0SQOy~~^jz}FP*?wR75l5n!+MRoa0lUCd$+6sI#n2^!?W_-jUA7!57Cg)3jWVPen zQQ(_;v@$0}K_W3}D7yIN4&e28VYpF$$Nobu+zNnxXI*Aq(Gk)>4xQxlSlz_^WQz3F zCiq+M{0one5XD@@W-;$4iub>^LSt0DvPRxP6pw%G$xqGgm*tp3^FT7u|8K9%ybx6a zeZZl&^O29n?cS~0Zd)t@ANm2Gf8o~>Qlr1i!H5swDVsEc5VF&zk!GP~` ztwwdmqnc?Z2N(18)~f3X|6}ClPP9cAc&kqUg46GpK9_K842km=d za}KVk>eE7Wj#U4lU7=rmJEAb+5}B>qcpC4c4K~HS+6HzG1iyplU+B0c29+vU!$RKy z{sng_r!t3IQP~}Ski4IW$h&J|#`dTF?7TN0VSAjuQ(Zi9<`{Q2(~P%78fTRFE*-42 z;2)eUSUDkM$EB%k_3@5do_nE=?}~P(K9f zZ!twO+3AUGyPfp*i!&oPVLWwAo)!PTczJ?f9#$sF?4{l(qIdz-qqx9cC*x=2v08rr z`qGn&hKuKZ7VwP_PEvpZI6>eWa6hL{(hM7>`fuK;(x!OqZ9f5j@Ver?SnjR#7RK{| zFTn7M`YZ5y7A}EH)T^`SBnfzcx~*TS?UvzD0$wmgJ!4x+2DeA}{kBegA0#Wj5bzF> zRDLbI{`PHQe-(?=-whlnbrtvspEmb=Y4gitx=XS#3U-c2VjL9b!K100$i+SA+N zzh%xV(SEtjw#GKQON+&if*Tp)7&6&u^W=B<$J<_^%9)FoTYj&VUh#e~r>vyRg2!mB zTdi8HY8(>SL-5nY^CdZdYfS3GB~t`E=_kpGp|^)Od_gRH7~tuioMV9_&IixeSt#;Q zFqzC{p?zM!r{G^vBFxXqooTqn-RQKOKds+hzx^AX^W_#iLo4nWbz@Tc&l>74dJ6Zm z=uP08kTmO~tc$rn++B3XaNMx<37aMO*E+~Q^8Vb5;u+vqz@JaiEIFW9%+8!JXesKK zX>~3&wl%#@3;p4f`ybx<_|BeE?600auRJVoQ0>V&*juS;Z4Xu}%#sha&o``_z! z@3TjX9<#3Z>k__1z0o7GN95p0=w}+I#$fyNyV@q%RyjRj2gOxnccK2v(RD%P?$=52 zqCc&m7l9w{Rc60cB>8iTtF=G;Am9}st?vC$>K#6|DFXHE;X8Nu?-5y$YqZkDm9|B- zIaEn>Y*>)%1_J!haNiL0BB+`T$2{7uuo4_T~z_kKpy&UnAia+ zykAE2&B&Wu>yta+7cwRW*MF9JraE=kof6XRToUm5q?i2_-H%M&^L zg3ae^`iluykB>S&hT{&QmpQX=pcjd?JOM*JxoV=cS$#7;10TLKtd>-}Ut_P&<;S0gwhe8=a=3!l>?Nq*K4ttI=h|%UC(V1v^C@z& z2l9MswpR|J_{Fgm7*N8Wpf}0yZ{h0>?iCvdJ_onL?9b1t<`c@_px2X5)Nf-o_#1-X zhJa^WmH)<1q}O~tFJ(um>T#)|v=e$2o)5CjxVUg}K|}#@TF>JrhhE8Ro$2^?&usS* z@E4fdDo=CpkvXvIkSBrb|A}bB@WOQsh3xwAtaTacxfUjv5lbX&GOD)Xt_(}ayF*rgNO6c->-;dHq1}fq>%mTthI@|XbP$oA7X-7CU1*1 zi~fB|Jj6w`*@hh+`XlwL7)#L)y1m6!i-LcmdJqT69B1Gw?n^%V4EhuQG-nR9+Z>u)JLWY}{DF>#_!1u^%0)i{ zA7jMIJbYi}{xY0@zg33}K8@uKpH;noBxYO;)*oDm=RrfvnH73iM3TeEL&tK%PbcUQ zC<8qwkB3|;C>UATx1q1Fy-SA1X1+a#LwG!1wc^}V<9l`QvGarL_5T50^TuJngvg|9 zW+*>CaDhvG71uVjAKv5?{Y_fSh#jb8YzzIU`w5y zt8u?wZm6m>RdTntRG$)Nj;C>MLyL1rdfp3Ha1@ZZfJYNIb_bKvf#&m`4IVX_fiT$!cd!393y#Pi77sv=q-1 z|K~HCG`8#HWF~vw?=zD&?A2=1R_-`Q$ece9KwlNxv87{Q=P~4IBfkXS!&^HeDk3Yk z){`;t%LAT2yF3_dj^MMTo3i>ZZ0|#_74khcE3AnB3pa{KID~&c3#PsE=sd00zGxkK zPMIn}z6tmb*q(~nA5aTR4Di3*sNQ7uF@-6EOX=kEQPBTgoHa_rcTZNa>y<5a=#Qgn zeI~h$IoX}8vmHU#m&K1>t6N_Jeg(#Fv0S8N9^W%mz;Dy0ny)9B8S-e2qKM%4bl#S+ zvN>#1gW*VQ5A(B{qt9c&xh@@Lczx9Q7ElA2|fR{eInkoFBnYvq%$F z6!l-egqt1-9FQo!(|5ovf!AA@`5%>?j|`7CReUYr752WG#i&R%0v{y5@SAV=_ooGK zc~SdJEe)3gZ*u1Gkg52-%y2S%D3$mJmNmj(y1J%@zke{Yv0FX1u~>O>jccDOnl#CT4$8kSC_% zpYVI|1E5~{FaIM;XKLr$WB0uIcU<33<^9!px;!00y?zsTl%qqd_$} zXmY7E+4t`(jAuvR_2>CwbU9zo^Zb#olLY(&ZO0U+mnI`$!(c+dTRXo$K~G}czyCn~ z`~m-<{RezXV>t54rD8L_kv~>7iEkh96*HfLqVYW6gU3G(So|2a#0&NE)8Px9{kKZD zfNz5RmE?Sy%WogY!{ZyEFTIb6$4_oSpEoFn=TGzbCBRqW7)HcD5ADtPg-E5+W$H3< zetEtFP9J)^;v1vD$7rA2IK5?a>}GyBzE{8xaAP%Bc)o@i--z2(=2zy2<+PsGiohow zXEV-5x)uJJ*neG(xjzVa#?&%Znkp?JjhOe(+4)4T)!aOB(=xBM4xGsRpvn!j@IAnX zqH3{-Djx4Z|2Jthy}`iX@fuoxzr$qS+jl3cHjxsl>Y&Kl)^nlabMtT%yrd4 z;i2mWJc7rcqCGWhKSKUF*5}Xv)EhxpCtaPCKrqkaA?V%a`_0^cW)-Ll)SUVW&#%Ds ztL$bKZ|)!F{+Dsd|CsLt-w7lD*9YfwAM$~hX6cSleh0-fFut8Y&mfy*Ucc|%X@<$u zCQp+(+VlA?AweN4==G)Br~aYV%tXF_(e~WL^Of>vo@ssqU(BW}uAkQPgd)YW*|V7i zUPX_8Qfo+~B-Y7;;xClXl990mgf2P!f^2zw#j#QHOmbI}%&xDpyMlT^)#g>^aYmNF zjt{HOSkLQiPl=-#Z$b_R4(c#zzmSZ!n&$}rFVaW$Z7!!x>vXRX9})+Ve|{-kfPA?b z=cH*a!9NWlVW*b=i05Zs{n8r);y(#zYwp#*!22fpcHE_33vs{BiRS&myVuxPeNpXM zO_1+;3(M_8dxgdf&-Ep0a~|s!ZNXRPcAhIBFW=6m`6eEnfv*zQZy0K+@3mV#3F~3g z+oqQV&(OwRT5~&2w?sqc-Me6*-?Pn*r-v`m%wjEgMp%7xZPGd2d6G4Z*RR%fy=J?{ zAb76?xh3$=TtL5%eAEZlKiqu!Cuv~K_Kmn+fN!k%{(!vChZAwVA1a$>H))Cl{=~_K zWIf3uX###xYB*Woy+um%YI*#_=d$w3%!f1EEqo1bx*|jqm=kh~t%AQO_7{9gm40u> zN$5*X@cta6erE9u^^7?J{^8UrIVaigaFD!oj{sxY3;Y0Pqa7=6!zTfEmL-B0NS9HP(+Dn*~0_rk?Y>7Li4Son@|n*4d=moOgOU>YX2` z!ZXD7s_kDGALjY)F5XI6fxKM?e1Z4lnA)N`>y+e_1bqVU*EVYL;w%j?ap~=<-Zbwb z=kR%R{yFfGyZ}!7UibpFUcXZh{D{v(J^$oXXF_}I6Pgc9$KP(~gMVTATd8RMP5l`L zZJBcKTw_M5z?T^C((1wJc;!LqcP}3e+Jy6!ZOIQ-oAoFzzgtxgsevON_{fFWo>!6d z2GJ9}z)$cj^=J$#byo@X|Gp#pk6g*W+92Q|N-O2S{bSi9g8xL1CcEdpvA&Vya7vHD zakyWim!zj>JboCTW zf=f-DfCq?{sLnmv(Ow|E-GA~}T>nA+WitN#lV!#i0B1-_dg(@3&WDz9S9m_ww(b$y zi|_3&)bN#<{Z+ZyT$c{JR(r~);q@OU@B|O4^eCWw8{kt~mzUw$tMd|cz(aU`$m|xN zM~V^dbbA!P8Z}n4)2Of43-c~pl|`BwXVhCA7=)3z6c0Rv>%seXf#1vD zPv}qi!BPM4&p+zVi~A|4Fyy`a!|o5W=u@;V59UPFF3nrTzA)dt;Yq`ZGI>sL&e9?0`( z^*94WAet?;i$xxTcBIHp^n*Ock)3dp$1f^75-_c)5d1SDS46CU0QVi9Va@dC>p9YE z1I=&HwsVdA#5$SrjArf)KmGsV8PeQd`yzmMOcngo;K#8V^RT)=p9hfkKs8}<0A7vs-)!e3MD#4PVwIgdU6 zJSNu1#3i=7Cy0milaSaClfjQbJ?#ny4{j%W+5S(fEhg=xR-~^mz&r9T=N1F+``T*b zaAPiKWFxN`?BOTszzlVmH>$xv8tlG%wg~mNgkhXT;E&{oOndbi{G3%*V!6CzJ;@(5 zt?r148=8vzk1InO+49wHN#H|mL0Ft z$mU$mIr_fEPo|EP6R#2}{7bYlrDTFE&8L+ue!M?175D_>Ae*@KiHW_!y&nHJ<|W>< zGC_DD(6MX(6p4U}u~&5vL72KO^ihrt&4_Y+3-HPx5NP!LbLs=(e1Cj6PfYWHXnrTHh{;3q`YSX`G&Bza`V@ESAL9eBPp{S#j-;)nc!t)adI+W& zHKgeM)xhJlPQ*IY`giL_c0%LHPr)zyv*B4ob3+^ayd0mT;d+lL^1jUc$*|<`*ouN1 zcz#TfEEXLQy&)g(J$rT-@@X5cG(4&-uOv2etcT+H_Xqcyd&@O7kne2y@xkPd)EkGd zFMq_T ztoiTtRPZG*9}*ZCNc#ttkEhEw53>02t)E#<@rK@xzFF`;Y-4XYSJ&bDDz95nmvVJw zI_Vzn_vTC7Pw;E@I4R{&ohF>@wDpSZy%sSfz8qmNkTDckHUO)>93XP@5L zy#ICXW!RtZn|AYf>UCaEqP6hlCDN26etG`>{k%Se1epChDIc7`9|-;y5yg#oeh(UG z=8vs2FE6V9y&j$n^&|=Y9Lw=N-xl4L-L@K0H4|#z^U( zT&VxA;`##-fWIU73HW{AQm0ah%1I?GU!tLI74^Umlzcv_o4)IBpUFQ1pTUf8;M3Fa zwc+cph5apbRfoT%{_z(4L=-9ymG77D7x)t2o)_{-&HD>6s0{d zfd63sG5CH?Qc%N^B%%E-YW2L#BdFIccmbbp3yBEyBGt71=k*p8-?6*G*K=zvd=i0A zabVv*Ge6&gXKaq6?1V}_ABEQQQw>1|Dna4%LhyX~oQ{T9A2uy@AO;XquN;Uc`CI2r}br;;DP z?s%yC2+kqax1;!f3qzn^J!TNSU-{#~@i{d)J?ynjy^YwTUPnFe zVJI~K4%LCr!e6gFP{%wnto~WRBbJ1(oDDsQ6^_3d_!swa%E*wBif`ZXQ@|I+2Qj`+ zlA-^g_{2Snzn6pk-)l>8f9vkut*ALbY#=ITnV_YnV zJ4@?7;5QU+Itz?OjQj0NqKy)yZs>Z`CQ*G={~;ydS4B09aUr<&0c@m`+_&eZEBx!#$%goCMl8n zt(%8D&UPvM!k8h1m50s4_>5CfPw^L$JcOgty|%)#B$YZJdAPCfr%?Ruk!kgw77Rr}tjhvSlke3eBRv5nDP zTf3lF&emJ<=KbV{&6e^@@@Lcen~$q&yz5iOf0&MVNHW>!%=Fe3jNh;j?`HxR7ag}J zPSE3UR>^X0f46-Oz6#@;te(3^^r*LC5At6a|H8(tkLPIR*D5|Ep5YT3t4&s$Hf+`* zpM~)~NLFOl<)K~gQv9X{*PrMfrHyHhGeDp7TdFU1bbjizr@fzzWOxy-Kj7E?k3W9= zVKo2r?n=scaZa?j=un6F`E*;HpXUEk{}_)hyUX&3jdINYKL0i!>sj`- zwe0&?p3eMG&W$wtb){qeHxKtO=PX^du8(;Wo}n4>)Tz^|jeE|o+Bf>{U%=m9ihcwi z(ue>4_yU?wU1q#sIM5tg&0Af1{{9z;7kjXl*6G^7XUTPixS!?Sj$Mx3(oW*6T(lka z8P@J}$f%_4dJ^Z)-MbGnh1IgVaeNemG18RMu?C4JaI}_RHdxpLrn2$(9!MM zj%hu;kzYXb_l>oYEs?V#-&aUyKVy84QT-;pV&jSPg;9IaUc0rjL()XwO88b z4y_$3@CzOp=U=w>wRI5q4)4mR$~O$`v=Q)x-T}dDcWGNQSp1Irao#G!77agF7S9=5 z^(n|_fj{^&vwu#KPo?`q_Z~bCmVXpeJ%3HME^8SZUzJ&e+^V{{T z!CYETj^X+b^Km~fvi?5Ywy^VU%HK%Bc(TY>Icd3kFZ=;*nO>%He!?ccJgi2j?8m`sXntLR&t)s=PBN@s9yQh?=PQv zGVJ9jx3AlwyA3|G3BS=CaZQ@nw5IEg zUu*w_wMn{FJ#)TKEbiz*8*`=zXCvw%+k z|Mpc5H4dTqB*34*ze`penR;v(S!&{ol-mFE;k^$lKZJiG%O9F_<@}Yvm9JM~J@49C z@VCl_{WCbu)=MPxpAi-oGO1Sp{8&uSOZrs$i~G$GM?RJDhm3<`mGgFvGfw1}+Uh8t zG1Ow5-RY(JRb(aNZ}8ikU)r9s4YVcvl(6Uh`x}j;xepP4BR_A7*p2F8D7!ryq(#zH z;1_FiqQS2inB{V7!i$N>9~r-U0rU$c3ni-t&b9!4(TnmkhRGbU+6zAGV ziJvJxcp9B*IcCb?Rfs<#+%EeyEa@P}Q=V0F2BTM{XM;~C{1mOn z?YD-04ZM>JsRAB3eQ;tn<`eTRm6oe*=h*V;IeC=da;|K?daQh$h<_Tn488mXRm>R`u_Bi-bgu!t>QEJ?(eJuM&8P8PA$1Szx!%?)o_DhfAN|BwtUS zyYb3c6PG_o?%~blCB8>LudTuQQ=JK4vgTwl?rq#FvND|cExh}SN7z@g??q$< zKk*RqLsZ>SN_v4_21BsR{lH0X3_vJ=q2S*KFyB$ zCB+Uo(j1aDw+s9Xqt{F66B#zX;r7PE;D5mHAcxz^Z6V%ge5l{KApVO|V|Jrfrz8J_#dq<^ zaf$m&<|YgLi!riI$R@$_H0PW2>+NpJ=QEeD|CrI6_4j$;XGp0YhnCHMiBLAl+iNLa zLj52_avM&q{)6L{CjAXRWoD-8HRey|e3;LliVH)FBGqKxE<*JTqFTJtrG6HP{9O2F z0>AmhZ2@~67Y{{KlMh^YCeHp$N(=7D)#@1>* zIr4|cA(Sm*GMjE2T8#Xb-+r}%AGnPx7slNXzvipP?@0Ov_=Wy{c~iMQpNC%gMLch} zgC8CIwBbk-{NUMmW{0`G@8|o!B*+J$<5{8ZW^-wCGxDd*<8h(%ncuD0TZHl}=$7E=qi;3oX`%dPq z5Yv1t@C7(^WMl&^10OU-ZBVE;ZdiAg*w0}3SZ(q=`QhaFWZr%Sq4_2L2YuUo+mvnO zZh?3Kj+ZC7B}s}zuSwC^fOlu2|6GvVleUT5iOcJ%Sj-PDdt^C(Kk%p(NzEz!2G3(< z`=r;3ViL=bn7ZofTFgIANiJZ9+)j8Gw;5uL4}rGvqWj`@Ui_@rSp5EcOM#(C|3J_8 zvu644-WCg-zjfa;f$TP|kB)M5ww$~Sel62kS##pp$)iV?ACrME!T9nHzes$Cz%F@fhDnhhS;Cr!Kgg z+_IeT7~|CpSLNF6W$8wu7(OT%^&8>t!l~3nwCwT)=JVtIIjKqoJ(ylQdPS}=8dX9RN%50m6yNaf^h)gM|2h^)tX1&l(Z`ztQj5@`-$p9j!0DpBT}WpIQGi;~QaI1PoPA_WaD0sR^a<8Jb|(MV_}_kGdKsvX$q!{S z{CGTc&2ge7?gJf8Nx+0N_6g_Qzxnm^2V0{DPR zdtd8jYXNW2*r+Wcr*bAd0q=)Hc%(YAD6;6yehOCLkMu_UaDIVL@xRNAZvs50HS44a zKk9A9KZ=H_;izIm@f6BWaFVH1x=r9CQ$7LO&vd@UvC{qEs{mgdGs+ZiGyDbpy=-vN zJ3xFi0-t3}%$eKlc_Dv=>Z|V2ZqM7Dhw-cA3FBAImP}X7QfRy>e*x#$ERI^-y%>t2 z(63;4%>EkkU_USr;r_-TyNhlNf580-ery6BLh&0cKjHm=U&%c@53ctF+8_RlA8g45 z-DC^nSK$6Fxo#8Rj`A&7+0?(Ne#RYq|3pu?Iz_tTIKLx>`P1&MR^~cywcYv#@3744 zmp3slkMG0yZ^l0NtS?$ePxyfze*yJdtzC90H}5?BjnRIzzo$o>^UaLOl*X3~$Uy&| zGh+sOKcE+~RM0QoKlI9Zv8jAvu5!i!(1V1=j{?Pa#fnQ4Dbku)}YHHN5S2jX9Z)SleVKeeq>P`9;lGMqswrAu*Z{qGE>W3MB zCE#>wUPnISQHEc5)+y=~MWht?2;-wV?2zv8%b43v(g!j=$3$zTa$e)|Zkpdg@dA<8 zq`6rOY8Oh&GuCZF`>#AbdyU_V=eI5czhfr#hYdPceXHhHPdS0UI^}cN^~fI%x?%S-86LH%4E43lkW_l4 zBR>}TF^|xGe;T3YugCWW_yy%})c)GZ_-T}%LHV>{u&c&j9q^oo`Dowakty|UVNXsNk+-Pz5OZHJJRjaN2h+4$h#akoH!o(@*SZauJ^gS#A)23H5k86mWMtH ztnsZf=jUq-ebNU9FBL<-T>cRJ2+h?`sz)51ycm8r4FAxG+P$tU-LYrBz~A^R%0peK zd~7YmXO{39zmkV|%GngJIXv55d3bqEKYsa-*9t!ZKANNq**ULuftf!5e@dAW5!fiQ z{J^#RkHBZ?{p{b@HfH9N6?eLCWBpm0eAR}22VoWl5&effPf@p(u6J7RG>U&vzCq%#gt7vC0sJmsF}$m5U(7-WIVZ*Oj9(+)Cz$|9 z+YR^y(=&y?W2G`_nTqlqX#a{ZM$}AAemjys{iCiB@%qwINUS8v|s9(%vn%wHc;?((RY zknga{KGnLdS7R^WWo*33(xtYBmj+}?Z>J9)oeDo~Z*#tY2~W{@K8tRO&fB_@e*!%Z zyua37{*#jzbS)xI^LJCcc1KO{MT0R|7lC{U$+M7C2$bmvH}n^e5YH0B4?7TktF8uP^67-q@TPz!X+c2$LCdk;Zk2F}eP3kHt!ciA zbMVaIvNQT@f->cAfM54q^2+TV`D@PjQ_JY}mUISSRS!w_seJzC=bfoVEhJrDT@DTtlFJR)I0J#g!Xg@QL3)4Y+VI>llE^7w^h0=Se3F* z_`RRRO`c}o*^Bwj(B}vKsaGb^LqGHy{CPC;dbdKmM9X+SW!#Ll7>|j;*WmXs_!b$F zmX$mkd#>c@!$VAK4LRHJ_*+c|01j|O&6*o^NDh00L>RTIr_x+ zTR+}DfyR?VP~V}FT;;mXiYn+Iu>CPTcK#FmFDgmGNKYDnzArhVD$i`aP43%xQoqd2 zU9!237Qj1Z_G5U@FwuJFN6TAvq_j8FA8~H97kOCLE+?guzb)$xns2%s{IJF>B25Kv zL$AbWFJ3=Ze+2QEv-M8#AmC9B63G<1+B5tU?-Bn-{OPTfh-4P~mhmpBAAX2@#jI|) zyZAc>k)Kz&QooX6+()AKxcA{dTN&4D6UN&L0(Huh2L5mVmbZ}464`yc`F!)u7XI0t zuA}%~&5xa@bl&>4pD>=)tWH}Us1@HZkG~qC=oP#|TV6^s=6+1)4|m{wh#7Q@FrIp! zjx1GFxpf2IVEDxV50B(zLo4)fO?dN{<6M?4$p>CNoQ+4CFXbxB)CoVVCdI6Tjw{PEd2IGI?M)BJZv_Q0lNw1^LTBKx|-B{wTHJ` z$^1zil&ZDayY##GxuaZZ|B1aGntA+i!Vx}cg_z=F-}nDzbS4-Ely5=He}4MMrx6|z z9^h-R{e9{XKj{1GkzXPWgzy0d_8c_uh2zD8;Md|%@7mzo8Q8^V{j>2N<_jxJW19E3{9qudFEYQO z{I8Pm=4~AnJ!I*Ui90_4o^zACFMdth31<@se^#moS_g-dcHZY{+u^T}Z_=~BXTM>; zf$Hhg`EMV)v6g3xHk3;3`>^%sTO}_TKbr4dIIIBUdtmL4*MsweSA(xX<1b^Bf%b`O7{04{$c(qld$^drI=C-K11(j z)Mw7jTUNKMW`KWh;$!Tvu;@kSt8emA&b2cBuAmn=VC!)f-}BR;*NF3L>ZqTrnj_FZ zc!K$#T`csv+I`#q>vuw!pN-T``*$7U*L@B#ruBVuzKUIr}T3UO@FP<~U8Y-DEpw;Q!n& z(b`Rrn(>ZFzR{-jF#+$Oqc@8eO?XGspMRSA|4v*F?WF$-nlb7j)a;shkbq%ba3wj#58&qyXPTue> zC_4stx>t0Xw$XT*?ms>K$@C|E zQ>LTL{66baZ{dEXdRPkljsH9!+(rpz6mP-x zHFn5mPwq(W5b%Z%RBG_8%i%9=!e_>#Z9s{o{0D{)zz+mjxcI$*SK#y<{@#=UJ~#mn z5zgmSy5#lA*Gp~^Z{VAF|22AbU1*)!lpllVwf+nUF&m{Ww0;!tI0J8!Q`FytwjYik z0RLuse!8Ewmo3~;(ERU^9VzVn9ogahN^;qj`X90O-clc3T%ZLXnerEK{&Gsb!1@Sn z56X{lQ@g5NFRxolrUFl(^(jr)o$4OmDc~z~eR44tAX$B|-y=t!Ga*Ob&YRmqBUcaJ z_)hs?;rtr)Xs}Vrir(-oe3VR|SJ40TkmLGAx@O>0zaGrTd`20iVe?gO0lU7PuhM?E z_PSOoDH%ZhU0a*X{jHA^tA9U!!P5m7hyTd;eo{y4e@>Py(~r~xzkq%z;^%W!-KOj9 z!u?}Dc^+?f9t?KL&ZktbLo=N7;x3Hp_y%}M-3^T2hh`@z6a;$d<}&q*f@Cc8iwo)~ zo^i3~eAoHB{a1*0;ou9ijm8Z<5moXii9cVKQhy5Hk6DQ;tjc<|&LF-&YtLgovcB8> zve-`|CM12!#v$N4ik-O6MfiS4U)=K5I?VTb+=`GwB<9a%^!z&=-y5lg*n{$~QwKL^ zA21q+aPvf2md0toGZ=r^PNc93ih@7ah~KZ#@7K|Q?E!}az7LSzUb=wtJx9H7=I;UD zV0?j76B_ZxX9Itr`Vtzazb%eCom6EA`6Aa^m3bBi2KwaU8d=&lJ@y~eZbGAIi?>Ab_RVc11I*D12 z!!3BSa>KZD^QeE@5!7!^)`k1*`#l`_`rtdS@9<3^o}4HASy;UK_ul7wpYF*Ap7V0| zF?=7O9A4_aT{f3wzWA8tvjo(~mX=;K9w9204+FmV(rwvT{|BDY|303Fcii0bihGk@ zlaQB-DBk06#UVHP^oetnUjjW*qlMR`CEAQz&6MAA8{g0G-zk}CSW`BWUw)@Q#Zw&8 zy$HWDTlzT0qr-SyqiT&|M_8*CB{#j4z{F*P~dLp@Bvcbo)& z!rvmnp%U|p=X;MSEYTmvJB}4^gKEYH+@AV>Vg7X~u<0V!fOs1&2>ytgb=`X7qg^vZ zAb0QYSB&+ZSE7@)J_B9JsA<BcbzwY!-0I*HHe>- zUCwpAo(;?4GyGWpSk}3E+$Wd!?|85;i9+o^x%NFuU z91bY`4$H2O6ZY@5KID?U6Zzt)7iMh7^?X!;hqmdGjNlKm_}N*e46&{s)FtpMLXwwH zIp+Sgl+;Hsy|`PSCp!E1C=XHpXuQ@@_!#PTJ(6fnj3;7=+FDu2gUAy*5 z%a^UAd<@Ipwzjl?fr6&Aj^$RBZf9(LdkMv43J!Fff%g z{`l~o7uLsWe|WUDCMr)j-yOe!?0f<~vFO+NFV?puKcM%s9qk!X9)11NzTDlEPqG*D zNrzH#m8jdIS!my@<4#Su*Z0M{6yKro^m=vV=Kf|MK(reE&&vZUzF3XpYcWkZBIDBOz@DKL9rHSL$ZuGxy$(#8*LtgiK zG9hQ;CHN0e|09jGhpSdsLyy?Z=dgtsH>MNq0$-yb+i#WBUFHtH2+L=h=m$I}-tqze zl<^gel1`^!we0j@zUkZ-7w#L3;@7qp9K)P^`S%`cGZ1e)r2Hg9KsRswgO6n}_|;f% zg#+gj-eEx9UlZVe(&*OJEA~JBBv3Lh!UuYM%K4)sc0oo3e1?lECnxA@)v6*=y%^v;KwAxnRoH z)m!&@33!Az+}Nz7G7kAV?0Hzn%X5;O%HbzrTJJu(Z`-nvULn2A_=mCgOQ(jp&Ed$W z@@IZBt`9vQDr$puWSA)*sMEgF{*`^IJ>t)y$MC)nHp(B2JE%NJGS82`{U4)d<%_v@ z#_o5FChw8uz(|0B(( z(HtHUzrv?fYTz^dj!-;uhU?OCS7-Lj=3AexYWUP(T-xPcFS#j7AvV*bqOriA(!@c- zf)@Mp<$br%_2c{=st~=!0RBZNEx#vGNM_mXTPolg|ekT)vS0F!+E{Ms= zyi75}7Y@cHhc-a3a^NU31o7eODmm1PAz4iebnvh^F{Ux>1{{wbo7}gZjD= zoKF&!RIS&S>ZDl*PDD%Lw|UBn6Utnu>2 z-qFB|;P;@KoVl|#pYPN6R}tQapbiVMqeyAT-}}X?H=eJBq^89HKNCLik0JFa>uU{r zjk8+&@(bFM)~?5STI(J)-`3wIO~4aq|E*5E)pSdL4gINK8oqxMUMQwJf2AX z&?G4#84qe2kCDcBmj9WYr%Ij@Jb>^S;9KJNZq_~vqFa8T{_qd!dWfja>E)D^(+Byd z35+ior1dFrXqa0s;LVd-?5g@+7!^+%4m>PGe=Gd{{PzKe-BhH`{#&}f(fawNVJd5x zNWeoT-q;lXef(!}gyP4jpWQ3_{r1Xad#PVN)8{Bx&aY+dH(c4D;w!P8TkGQ+a!UBo z@iS{a!20|1ar?))O_mYW&nuPzA9_?%P;;Us&cN@OdVVxz~&rhcHUgVdU@QVnKP@6w&q-UUqLHm=^*R-B~Z={s! z#oYMz=Wj87YI)^!#@G1dhHFuHk?RfV$a&G!|L0s*%qiACmCFL?`{a=BbJ?fDx0Bzy zmFe9|sy!c`DEs9cKfS_jZ8X!%(Er|w@hcN}2EIQ(BircyqsuztGH3?nvxuHMoOf_@ zm+&rRQ5^7OAD~?a4Df5=i~m>zeuo3xQT)0RT6nQ_dk)(7c*{wBrSXB0>_WVO`JPnf zuPn)H(3717jQ>1o+q7+BGUt_RnysGKLyp?>((+bL`h^qIhm%wq5^qZkRg8t(DQeGel zg8r|=@_q_`qsDq{FZpP9_}$lKew;87{MFp0YY)q6Ey%3ad0*~=|Doj~%h^_Q29na$ z*FpHb{HC{0S%K2kZF+*#M=al(I>ztUVtW5n?|_zXm6VwH6#~BS0O&&U+rPchx5(U` z&Bhn={`jNFE=rc{7x0croYIp$f8@K+e3d?RibjRns!rfrSVnJ&{h#~K=@oTT>#Pu; znD7%#n}>%yLT*RQzn{aUQ^m*4Wcs!t;9F>%qy4t#=GHe6;3F?_erFmynN0sj#2X!xtd)my{gEF;6D|7^xPc0vu9*A?qXA5;F#7R9!0if!6AdKzp!Tvvwp z+niq_w~KMR;dX4Fnq)#P!hy#=WYo2g&pc52LVICBTW2!t(KVa z2$qkc3s(zxL~GVagQ{B3unOh3h_O~ zPyQ1&IE>;8Z_3ZrZRKs6Hp&Ody$ycP@4x@U`Xeph!}lh;vy;7_xE{k}tdQ>qi*#CF zlr{d`JiN_~(5p3-1Lu{Vfjnp#kK<{6g@Z-<2C5fI`6D!*&ie5S4XqE&@1glNmiT|6 zel(xQqsJ{b7MpNB$-Kfdg=aENd=Q*ZEDD}-;c!9&?t`o4L(4 zYEDh-OP}{*-_L#7^ET^~4tb#Hh^&r$K=GQpxW4EQGkzlQNjg=Xx^7)J=?i=o=UZ8C zgKcRi>Qi|O^RH3vyWR6F_F7Opg6duLJ7eNw2xZGmGe2XeW$_(+&w6^LxCFZd_riE% z(xXML6#WC9O7RN~^MAsa$nX%1zmtQvHY@bo^hBG|mV^3j?vCsZ!#|2g0AJSpx%Urk zv?~|Q_jO|DU#(iIRv+wF$4_@+c$Zb^$OGR!IMU5i`~vk~tyGze^2oZ;7jl~ z4AoOS8D&jO@&4ld9sAq)KB;wC*uTiG{A1&LUGI@TX@id-o*4SnC1R|XOv;O6i*u%6 zKbJiD(RYS?-mb7NED7JIb}mNjDM5b9X-e2$>K>Yp9A$BWqW0Q!}5kztn7#W8{m-SUlh{8*M&3x zm2d2>+8YNM|4q_O`W1tp%U{iVwcr&$;tum?jaU@7>A2?PH^5hP_?~J+ZQ??QD9K!6 z=66IJ_qV3%GxS0}OiVlMvbJdzd_DYE@Vp&P$_i4OOUplc9`C~V zsG7n4^OVWez!L?3*Ox)TuRlrpkk4Sh*NBvU+WfOMXNielqLI9oqy{Nt$Ma@?mgBph zE$kW9Jp=jh-GzwH>b{VVA82PGCUx@B6rb5~M_ajPh}Mpb$mza^_V`An3RxLg3;o52 z?n0D33L^}UTO&T;gAevQ_#N^`Mecs`qVdoZsOUO&4Dr8@>Yz?<+($wcde5cQ-%aA? zkPy+uk0SZ)gA7L3O9|agbo}8O`JwQavzBt<;zGA}-ump4Bg28ujKA#Nyvn$T?-daA z2l&o6um9M3;8Ey9zCdZac@^}eT7NPAU^s3d!Gjj9*?{?F(Ac>v=YBnxEd3|z=tr2p zj)|KQJ$=h`A)bn^SyHJ8R@9lxn&JG^@Ew!(62xCDzM9+}t#A0Lq)f=q(Ab}z-+8#R z33vwc=ZJ3&YE|hnza!@L`7aGqx_YTRl*HxkD5^(V_;nTBPHWE!<-i`Vhrw|06Y@1& zBO*LJ>hhW>UpWcy$I5P1vMR{MhvFABANsA%kb=om3Y~c9Ss-3E#^(pu{MnQFcYkWTj(D;8BHl-7mw!{#=TTG-mFZK+C0kZ$yzUS1uU{~|k)h>Lx>x1!-$^&cr=r*5XX0G3R=_LVDts#B z2jvy$&;7IUJ`T8SBmdNOqAQ;+@1KUU2KXpdOoCoXcPioox6403!16NuhM1nJ#;Rvp zX{I)Fn%RHE_~!=&8;YP`Ec||&_iV*%;;j(;Zp)R*C^lYGzZJCK;Mc2PU)SziCjHgq z&pXL}&>;3b10F*0w=sWBjhh@kIb4Xh9lD*8MudDGBH$BJnGEE{!e->>97!FI`J!{` z=grf5todgqKj1uLPFHnqbuOQ7$Mhk>LP6NwAl*RqFKN7N)xu?P3Mtl889&Hq^N;nm zJyXt3;X{%ZtwH~pbVl}IV4Hm#(Vx=&(ANOHN0e z48Dfu1JOc@qn72?{9mDK<0HWjvD|36*Sgl5Aphj>#|8)%CAXzP!o~ z$0Bp8euF-nH}z*tKWn8=Hs&+Jeye(`XR^CazYBb*3$+JoeDh?`UwKwBF%f!P>xYQh z^IB?Z-}P`0ESjn7E8rV`&wXE==uGW|AJU?|=rqaI|QU z7W2`senmbF^a6noU6jP|%hny&xGH@(lBpmlh}Oh@%5v9L`x&J#2}$Xq9N6C0{cA2W~X-K z*SqcR$hE5RS`}}Pd=ZqZp(gE1=TB#pTc{oe)+>Ejf44X3gI0h)&|!S}JqB zuu6VQz*8vyLz(LPR0=&(>YrkKVg4S1F9JOeqqi6QL}u$|0^eZyCx2$1&QzpWrSSJM zso$&y`S1E?#ga1KK8yL!zA(14jkmwW%H9f{!Z^n`2Y3hjz34Ib*!8hokM(ue;oxtK zyW#$9>{{t~GH@5=uV_vi0@ED=rG9+E2;T)Xe&)6>tEqyY-`x?uKDb}WHkERt%k{%# z;8f2AcpuhxIV6eJS{&rXr$h_Te}6Kj8WOUT-XgIZe(eQ)2!|ryrUZR)D|s$|s~7kf zaXoR(@zvi|1OH-vX?~Ud)#{?7(90OUfcmRiM*Fh)DBobx>l*X;V0Ve31mEX-i>Myg z^Xuo&C{%Oj(f&%ui!CiNu@^04EP3$XX#R*phGpjPo*6v?9xZz6bk8NnC7vvgVELwj zGXwG+I%G*?ol9=2){b1uH^}=lzZCAfz+;m)mXOo-@8J8b(R7C!T-!+{zidgC z7V&zVA=(f?{gh(s;>5t4&UX7%kxJJ}BJS%;(B2W50i^*=(M^1Osg&|FE0bRNv)X=DKz4eZFTp{%p1?jjqU&dn4KLwG*^^DvJhRla9I@ zP4zWmq$jdi|MuVRL$Bu=NiLDfz)n&$;0Ma@v6hMgBqt@W$agmq&0Bl;+tAa;{5IWqqctu+6zjv*?RgkqM)-M$9L=rG2j7|T$1fg=?aIX)fcfxX z8h>@5@6(NxJg&Hd{-L&7YjfYG!b*yKlOh^VWzL<+?!S*U^K-C6x_92bt}a0j^m3Q~ zMY+<>pFl5z#t)*WTrpQHfgeHP!CT;$*61%Zg*UifCNpO5*mKON$*J|pl`P?;e91p) zYyZOhqUVrKJ2k|TU#M8vZw&MbN^?pZbUpC@NbU7SIOfMq+q%`_9v@S=Me7#hM)3fKN32$@Q8g~nyHI@&ns0*fE1I2O$PcM`SN@4z z4fQ)=$Grta41 z!G|g~`N!DblffZIn~U{zv)(54ztU|Yz0tntZvtLT^B-uu4Lu3AK~JOY2FkmQ5~HMc zpYea^NBqzAce%gZpEt+r8cbi*!~O;R22=jSxy-wFX?s#Uf#P+;Cf&M2-$(lUyXa5e z5^qU|H}ucU_`+bNo$|^e%qyw?3F2qyJFcY1(|i}Y{=Rro-jD40nDGFSLMk(Z@ zAiqh(-gnx6F#i6rCe()GR4S<$`2@Ird7F`~$4jB_a2e-od-380JAa&Z0QG;VxMN6-<lXd zb}rjB>8hxc>R0HHzme>n;Ejxq6LdetD?ZsjDCux;?G^L=YoO1e^nJDHmCzpHZDDPi zu=m0kUV!u2K7a2y#b5Yhv){`R{>UHy3bNp*fuDuzA0BaN#J%LiWEyYN=ZSnkPG_Zy zq-BbC*x-9Ae>~wa@DAn|gYP-yI*OoQQqsBu?O`)`zFD6Y{1ViU;$1O-b8N9vskt2rdWXZP6`!U)^3TS+--@gHhmHuzVIj zdtdv7_KTIgH_I>4Wc6KWz0f*)p@3(EWrt#`%O)iS6?yo*r-CR#i$aT}153`SQ_ke9vZkOtysRwT4_a36-rINV9)#;fxgPW^iRmI`eW%VaK!3a{0DdB=22xox zsA>=J!ZwMQ1Ua*W%nG%9Xn-HwYKvNr)+2VYM;34=Yqcjlia9X_@T*O!PS>y*gHeG2_ZJil+WQ9HC2KkY<(!Q%4~ zuIY2DHkH;&XANJs3H{qrbRvM&ANr&BFrV=4@O=;r4KI>6RAmOF@y~!S;QZhpc9iSN%V~ZJ)ek+DWq#j>C%jXJ{gzMd8+26< z@%)rNLUxfNUr1pK%H+(8Lm*(Hz1OLNX;x0d(*=3;X^S80zH^6W0 z)x6dk#GfqRMN_xFp2?{uQNV|2lQ;3)y*ICz!%a`Kk&(8w`ePegP%N;mb>4+|8~;5 zfrAA8L{Oloh<$$qK83G>@i_%N;OPgAAJmOL+4l_|pjTicPt5p%@zM3)um6}ImS@H@ zG+S$9Yh&|){{#P^`8p>uPiCLovu(QccAdxQv-n>5D_^nqMOaUKAW8O3PEIr*Z?ukw z+G`>Q{|^&h^04*}=E(bNg!?N}%Ofl?<|1BT_uHyhH%8Ve{s5l9@B!!MVPNnz>wq6H zy-vIRl0?Zp-v_k)j$!=q%cN>Zo#zC<*BiwPzhU)3yZ}CnW`{QVTkQg^wa~uTyVP9~ zT^??{z_;=93YR^xcqQNso6|N(D8GL{DA#Nijb2uWET#8SieiZYZ@^%@^_*!w=?r(8Esm$xp=^6t$r8r3QSH@O& zH3W9Y^^lwJKY;(X=oEKT+TaQOACFO+F@8iW`)=t%$2lT?_?=rvF@8%Xi!%?^=xceG zgsw!i_tNU1YPVdsT(H0i1E%Ycu8k9S(XRUgpemCc*;du#(Gfk%^!HOS{O z>F*wt^>{rZKe6}{?^n`izkTxCCvM{fJi`fID1J2uYK7GQ_>LG@4I_j|F>Hw^l1Sxdk8C7kM2J6sfnOFW5ZbDZThd{6cd4;Uq# z1O8v^wclnNjC~|SBr|RIIf9RtmHMes^VgB*n#UUh;D0pt);G9+_xpkOG2fH(suXszWM%B{ZO1Q0`nzo>FoE2PbcSj|WsUcUKVl z`}vYx3#vY;+QZM?$@nB2YtVw-J`Z`j;!yBc;IAQzQCjy$JN?v;D;Te{w0o{ zBfMGtss1L$Pw;E~l1oa;p#RD6f&9End7KLTUf>B7FIfG|1^M`yD|qDpfzN5g`;z8X zdg?X-{#=Ir8xxiH`gDAW_h;OyONcKd4z3OX-vK{pF!{q@UteL3=bX8=#-T_#TJb)^)5?PqP3X@&)yq=V$)1xZqgBIXWKG`NmuAz1o*8n>L*C1q<=L z3RA6BWlwIk2S0Q)9sd_Cv6n2CEV9G(-vOUPv#1MrXp$^}tn|8O)(7qK!A4@!LaCl@ zV0Qp5b&&z^Bf;~CZVG@qXl#D@D9H+=MP9o6%sd<(VB zMjG*O6tAH9CqJ+?A)XSr!zebOVKR$KJg{MFVKJB zuW0kl)NC8*@l$+2v)W;qLx$Z8@C%#{J;r==e!cB8s{l(|-a4dLWVlf?&fi+RVO;AO zQgU+Gjq&KO4SGY%VYvlgsCed&`bg3xh1#lGJ=Pm-u7w+op;f6JmmjJt$Sx~}U&wNN zFJH`S$V2?W{5gX#e`NC~@Ea%|k%`e(2~r&J1D1cHzART;sv~})@ei%9x0Z}01>2h8 z?>OwqX2c_VF6GDU4$LEFy^IlFPT}fw@b|qZRlY!drdlaPs!45Ar3uC2cC_EH%rlIi zEEV)LL|im$FU0fBIG^2731$@VBQWC|(EolWdnN;)#Dr(GGPNP-j|g~)i^@g+f&K#l z-^j|i%JhAOvau%BzjTH_Af7p=o9@TnCv*Hd+jFYox!S1y-}nZL_rXt?#%)tvxb@_gfM?A2H{kEKBFgl9%zh^_mnAD2pRxQ2njaDMhec>#WEj!&)A;;!X3CkA=_w<5E$|qWKX0Df z?APp5Ol(Z?=Fns%=8KXCLj1qEZE%W!YevJDE-oo-P;AaZ`&JDl^=>2Q< z*TmIu+qi8M9{?VqN&V>LM}K{kA*cSs6wf$(>>#$}V+_AQ{PfwbzNYvZ=hxx)`GYQf zty&2_l-9D6*6-WK9U0rT4=v3392)6s>3ye@)4gc>(Dn}d)KzU6WOrls`t#kM=M+neNn$f%2cJb^66I;pJDjWs2QewHN^My{2o9na*(l2 zv?hL+N0q!Lsph_s#`m;-4hJl5%1V4nq>|!t%C{IWa^y$sebqi;e6Uelo!KVf2O^rU z63X#B#cR+W`xWu(JJ^`MD7~Im&hnK6d}qw45sXj8@C~#N@@opMQ>}f7)`Wj3m1)Y1 zt6vy^U$Fa|r0~Xkw_72#1>S`Ao$qg2ANl{nGtgd)UkU{nAzuaj9c&S00-lk6>cpR{ zKT~`H?LpfMTRqwN`0_1`kFRZhwmLD;(e}Uk8LAmctGo}s!7r#j5&onHip$lQ4~!aa z(n|myT}SbZuqWh+w16o1;%#-OFhBLkv2z>x+u~PzpPQF+@O=@*z}=)s(oS|SUm65_ z+-dLn2%Pr8`PW*OW7TP1CBd|l!n3Bma)J@4M0sjA*lOEpL z`jC7cJwBt4!I;`3EfI%t5)wVt)%G~%JH%Er-l}{mA%lGeK|ejS#}oN1$X6M2vd8r^ ze7~TEzF{ErH$&|njl+7)(h_m7NPOLexa4-FeTRHR?$D6tJ%&dl^-^BiR?L4uIPe~K zeF5@WborP+h>|2XBRf3q@+!9@g~v9A>dzeOqTVkY#>M@6u9Y zFW-<^)59!N zt*vE*?{#7&@=rx#v6p*Nnt_n%TTfDaHERD{%q* zSPt-6d-^{C9_HrnJZXgc76WU} z8X>;&IPdWSenDNrdfVv@DH~F%!dobxfwsSMf-HPJ_>GtkGdyCFB64)(%(l@KFQD_$ z!4f-(U5xy`z^|~BNaPdTz77(~Hf}+7#e=%vq4)sBr$q7N;;($((}y5lr2LTErBhVM zrEwC3i!=R zy%;``YB0Wd;eU~hkEY{|lLjgVZh2?R90C8J`DUS^p=w$`@JlrFclZ}Y)%(23A3u2H z#*w1(y6;KmkGk8R!Vk4-a@D{Ji#7tj#9rV@wLOW+;p#AFfgkdve8aeF!;CgUdwgQ2 zveVk_8T1Cfkl6bw6F+}I>g-s&D$mJ5LJi_e%J0DYW5f01HgX%)(%CMR)UVgLVPgdQ z-a?;*uFpkTA9Sp9EOKUg9=PAcBL|wpOT56JVf-6SzgG+HEWNm{f_Iubl;#ihe0sA_ z;)LKV9(*s=3cSw`WL3(RWjzA^aeCv$pTZ3R$j@T=5XMj9y>og!v3iF4V|#^5k zcW>D(=&`hJF8gY+T*J|Lgyt{3`)c0nrJd5wW}0)BC!{tv3(&xtL#;he^TpVI1Tsl|GAr(2ZR0sOTmj=Afs zG2S^$bIf0l{3h9rbRX!^*h(z?#^qi$kcWX&IFyg~6dJn94Xa71$C7!WM#MM!TMG1* zdU7`W$Zfn2`yWMgt2);f^D5}mpscY@cFr32Xd|inJ&*ED7IV8TbuzsTNx##TivC>( ztrWTeAEf>yM$s^06aGQ?8i9||OD%Ve*jTq2_z%PL0%}O5w4Qqg{Q}xvn&R$)ZqMhE zmx4ZMQ0UzMu>PlFdMBEn^-G$UW$2)P%-$zWNV2p<_H6V`fe$0%Y(oEq{)n>a`c{f* ziUba>oVH(_{Q&iOF8k5ZZLEx>^DC%-XNF;Gw{I8pg}HmbT2F)DRyV^(Z}K0!IMagu z`fc^(22s2HQ!*?fYY)mT@FyF!du2cPxenco@zw$Q9JZ%KOZYQ=zrDH@{DC&8jroeC z1a=EnSTBBC>>>VwgWk#SRt^&of6ua5X!)(xIV(QCpD*>741)WwU!#8~^e}v|K5k5H z48<0ZM)?qQ{kaeP;!=7&nT~uAwm$Cf>uZXaO!x!VTR=9}##92|V0eIuAAvado(aET z^B4GM)BF*7zSe&g{i~?|&He(O0X?oKR!N zM`>y>uV2l}WO#+fN@t~CrQgfnH|3vrTY+C#Tn79@8Ay+hQ8+U^mEsvRe}(cv)cK+L zB+*>PTK-0C1ofqQrjshd4u(aB4J3)$P~8n?-f)6=58_$pOSN7%ZtK^444};E!reOj0lbBlQ9W%bh#CJY5tw&>g%f^0tFWYe0 z&yg>IPq6%x&u&<~lsvX8Aj4j*Oj|?s4rK>K7c5@$!=t{qiSZ&PFIT(Ucb~7+f5iGD zm@jF3?~G*qd3nOeH@^a(Pp>Ph(}iy$@He5~@3%M$&MSp9lI0PUFKLwQm$e=2$um;? zmwq3XP6+%YaJO3?TaQs;J*djJQFZ#zE~Y1n_s>u56LnABp$7l*on!d@%KDH>|9amB z(rBSO{x6dsx+~3JvQCfYz;6Nnr_;5=t&t39B$SU6&>ar`Zdf;O#xr7SeyjPdy0Kb1 zGAWwscg~r#GKbaQtassUrQ>vDCdc>~z&GH3$Q0%NU--rU-Y?C%$NX3a^u5aB3;ynM zrqAKgKCa&Ffm<#an8EU^98+D>ysju3_*N&-Nv^6Rs2Qia*{DHflUO!@5%p zg{^#R_^MYJuL3)xbPtX+Zz5^-qv-mTL-chT6j^B?A4%ftMh=^LK-Dr9>CO~Br1 zTA#KHv=7`fp=JW_{iKcN_unXcqOafFG!uLa#)l7rpLKpxR}#ZNfQMLeR#vn<1v~`n z(G2fkdKxWsJ+rSV9-3~&{8mLN!@Sh<)!zwzukvos2T-_>@Y7BBf=EWj&acR(dZfKy z0xwyl#-sb>rgE~7Cd_FTi z(E>P8zec}CC_6(PL#3BJ6Y@>$P*+oYZPx#+l-nU^gW?N}-w~q9UPJQ(gtGGz03N_7 z1w6!=;UUeLr`5VreBaz*Z4Sx@(2`@1ppIR`9ZqEtwU%=1Mgxp;6 zOm$Ow6Zsj#U!pzF=l#GoXv8=T@DqaKS38bp_=Pj&C+ne)YyLewAJwlE_$XmuqtO0J`5!dj!N%fW z*=)SR@hsk@zo+^e;8)P~e;U720d0mq;CPsyn8qJ-{>9)*Rr~f_m5NMzTtxAZuuUmb z!)+|Ag!+&4vxt(F$wni-XL_7+Wzx~a+6SKtd=z8YZ*TYyG#|#cO+vTlq{NZwndUcb zZ<0N;IKbKm_37p6A=g9jfyez*Jfq=*h7a_!_0xHr|1QR(Dc?`}zVlq?Ifmb$edZK+ zMbi5Pzk%iB*h#icGrkAC``#wJf$}jX$`^re0X-6YzxqUfyG=*+G^kz%&Oaje^W5us z`MLD^bU*dSkz%9x5#?)mFY}QF_xT%b$Vz{onixoL|U?{lD;zou+&gXRR#5qTQmH)gSG@zOirm z?BkmWkNlcETu;*_?~-4Zw^9BZ#b>;oBCXWRAFLMm8Dr({N^ys6O} zPViHDTy$d|;zyZm$&w^l17Ccjh~gJ>tqYempV6Noy<^+5&>rPi4|GI!kVuT@MYpEo zd%9xMcW#%#XXsP3e~$$ZJ78NCiSP(5qk2fkg=jbuoA#fQ5L z#-rWJwF;-n7KB^LPeQzF!>zE(UtqjVNNT8GF8HfCoYYPXe-#zkt#tuDC(2*es>l5A z?>}pX52O5osj{=npx4w|-}3K$z)u`R+&B^V9q9{3Ur(a?Nm)B<49URz+h?3hqj-f@ ztAB*`#uVgRU_bm6ZO^WQzuc3xUE8-~e300Rv`gVenxOo zzk}QHdv{va8~BjRUB^%!Czr}XwgX?NYwMT37w?ZBDY}F>pJYt<7<>xN%p#8bFmXn{Bcfp77{l21nf@8QHUzqMD8FFQi|F`fU2Bezw-j~;s7{M;dLfv?&O zPV!GRD+pKr>qN{a@pG?9+b?w!(y;#;^wu0Ams}}o=>dM&koE=YyG7Ua==S>E^U3~# zO7tJ2Lsab58a?o${!CxX=;*H1UdwAWQoZmj?6-CcOHV$6e8%0#SDgZUx^iBjWvpl% zc}uixC*lSF4!25&o6zfn$!j?9E9-ykezQ70IFui#9F!Jf)U>odZ7t9r2Y&NUb?T=^ zWBT>T??aEd9^;?h>4*5)Xz%8i7=HOumk@96knF77S-Iyq_!|8-WB-vi$>EJsd=5!UlVoR;hgD3{XtCF2)w?4I8+ ztmN|&0T1zrnIPY@r)GkHZ;bKsb}ExKZ{p2($3|-mK#A%Onx8@OE8oKhk5+$QtD)&dr{L~EATZe ztxey1@JZgu#`!p_KHM>@hS}0zGnk*?|Do*7PXAf(wz4rP(>v^89$WFl4W9a<>-_YE;eY5MwiA!Fw;2)-I z^RB*GfsMyYE~{JQU4ktF#^=CzvTQK2Lsl9FJ(3x3**i1s>!OFnS4jIW_iuUO{(Bti zCzftV=JAZRjzKO^g!IBsWM&fZ5VwXvWBOn|&A-b0^fJ224Q;m#2YI}RhC^i@8VS$m zs8Mgmdca9V@0MsZ?i{^XB1v{XBjV@PMTHD!)|Vd6^%_ zuqV?q*Qu6*Utr<$3`rW=H>H0y_sHD85(l=Lwwi77`lI%`)-Qp_KSb67 z!sb)Jb18qw<%SH|Gm(ENw|M3*e4iFHxHm{&2MX3b$aqUy$NfCGNAkM@~C`#tlJ!(t&70Ks)lQ_)KJc4V4jYp%qTKTxLZi$Xevu$!*o}kwgWzj0d}3_a zzT&+XGCHLv&3b@Boz6Ueb4X?QL?zrs=^wH9gO0@d`bVOVL?{z_KAzvf@8|i+|C9gm z(w`Lb9c*gkt6=e_Bv72Vzjwb$T6p&ei+4}GV0wBEdKVfW$M2jv!=#v};Pom`x?;Lw z}eTY(2H z8uT|EI@2|hD{uViztR!UH%1$ZpEf?_T>rX1fbmS27IxwIePb7Cef9?M3XOB6Q+ar| z=S}!izgdFu9P{7E*VF=AE&};N@Ew&Di;Dw|#U|)G8NXtUN|mX)>DW$?51Z;eYxJ8p z&-L9hh07^U&0L4|?!@)83a$HxfZxdY9uosSoIVz4q}1>8bTs&pb+RY&TuC@L>8~kI zFdn8oOuL_1rOxA8W9Qz)^^%(mdcB(%zoJ^A)v*d0 z@~@ixoyQAP6jg=y`r$9LnEH7*g?K4GReb5mS@>^`GbA&1$Sa`lk{c+#cvZk*G7r5$ z?(@Z&IKOj-Yk_OW5)-%L(d6t&z=wKWdl{aQbTdFO6#cDN+UwNj)JQ(jF~8SXLsUmp zdsH9zGjQ0*J?6WoC%@fs8hS49d#tY6 zzaWjjCTX$$^0Vm?_!oT-2{&Gtj(kpT?V%m}`i~8eUDiE?sP846as7J-PIO|u&QZS+ z{1+|MHQ2~7=tEErzq>;9@KEz1@G)q#1@tFe3i#XD z|MtZp7l#OL0v~uhp6>T>cRu!B+M#TenLZ_1tM@a`TQ!=lAJX_hD3Xg>KWY^b3m&1N z-h$=El}dobQtdei){nw|N}bFF_H zdyKAkQ~isr)LHtW^m7@D&k*kjGXzkk;wUaGlsf4(^$HRBVGm>!w+C%AvSk1oH-ejJa0 zQflw-+R*vm;&}@`QdnT&yH!}vc!ckpOHdFJd;~4z@r!qvI%SHC#~U6)Kc{-4f`6#_ zcx6-I_p%@tnRL`Jx1n8FzpZ|5_D7Ixk8B;F^=oIwqtdi?t*Gz92@{Xf_XBzf*9zPZ z@G5h>XYucl7s=HzYIQe%ea)2HxO@Up!h3P?P{7v-=t4mZ*!b-xE zq`Q;ZdVZm9&^-UJh5rKfXKzUFo(h+E8qey{zw9gGDquOu^9hjeNT3SZk+_Sk-y{Bi zYxwZtw0#&K1pQ&PXPHlzHT>6Uyo~!f-0OSCBXnvgAFm6+S8bn-_}s#;5Vio&hDMED z56AzPSi?5p6K4Fc>}=T|W#IQ{&G^T%(_y+WRoF`2Ps7m-{2Ac+FY~=T`}05i6P$0g z{EWvL_;>PrgXG~Sr~LQ(b&*Yy32bd`DIP-coR{B2`uzC4 z#xx;6fxW?}7JQ4q3o%U@hP**;!H($%&H|sv4Zo1lk=aB(-7#(x%ECNFUTkw#GuJR@ z^eVLPvetmsfG2^yT-NX*2cBcSA(P~jil{y=ef-Ve-)8Yp$?QaWkzXF+X z`Fv9s`6KsRcQu_a3Wdt4;Cn|FUY=Y=%K|twK5QocUj5FSwe)ye#`z*Y{;yZ6QD*z` z{fOK-IO576_({0B*MkAhHFe8~!=cVX35xMOduNagm-(o5F z9BxOtTu0FJIW0}Bx^E(re!b7VHfWN@<~5wx;I8@a)6;T7RukkSPr3AR^#>S#LoZzDy#KUwkQ2M~cHsSR z%1JObb|F5R{iyufCs?obQ(G%Uc0$hovExO&PmaO=oPX%^Z?eJH9JwCjfoS_&vmRjf z4Tgs~gsxB=)72Jk5jQ-yj>VK;@4$AVLtNU=?&Ad zL1;#Z1fdX6kgRN!#i5q<|3DgR=g)i9sB()`hJbu za95qIQr1RVgP0!0Rj!_X#p9s|;wgq-2$5eq_VkIRY z?(EJj173mgI{YCSRP-$z;LksJsi-NsDWHk!Ll$RXd_MW$0UN(8{t_#sNq&7Rd$#lK z;n}5VS7QTS!2Bm8dXW7$H$0!>Cp3Pw*(y7xYrgw{zdw0XTvO4^+J9ia&-fW`N~t{C z`Kb%|8|UZj#Qf*|jT_nZEb%eC!b-ufiQ?nwnZcq&a?a%r@~txdj_|qDQH6MxkXvTX z?|Zax??8NKMibA!2(XZEy>sXOV|;I;2J#GLO=WsAA>FtW{aa#;H(oJb>gV&}iUjF( ztiQBKra;f3k<1FrUiNL<1Mq2>U*Xc5sy^xuYQZy1N>h;0wNhTm`;XWbdB}HoB&_H0 zi1_~Na7(MG;q_Q1?Y+wokUY$ghZcN1Uyw_tNYcIDG6T_|#?tmXCdM-IWHE5|j zC$JY&|BJVf594#I-6BF9oQ8a6(j;|)z0oIaAg!63;2)@&D4cJ0Ux+0zv2_>_# zQj7C3z@%qE`Kk*FcNf`g* zWxl-s{rmrizrpKKTx8>alwpIu#g)dZLPa&!CxM^9f5Xhjh*o0)q^5ijsz3SKI(K~T zSGkv&z6ST3Toq*Y%XcVe_>N~{*!gg*caS|IG3B#J8{}jJ;P_i9-rY$uyE{$3tA}fRM*P;I&)t{>=xL8m|TAsZD{+a3ZKi>NzrDtc4be=hX z_{{a@{0R)tKzr4qhfXtP1MdfZiuX@&(`$9uS79gV_(b^;BR&m25MT;u;tWBzDBt7N z?lCQ^DlV1*f1N|~o5ekhdk}v=y_w{i%QH_{A0PT;b}yN9j`?f9DjPRewJY~2Sy|iP zjPp&C+l5#c5BZDwXFS0DeXQ`6e`TlfCM)mIeCwKJDNE*G)OM9|1!jChF7j3%H^g>v z1;AVI`#-J8L?7g&&_6WChi^K6ic2<-Rxo{6!N`7H}!@%92Y& zXS2EBBQrmPGBP-yn*l?CXNcSEdY!OwpD?|NCJMPgw)ICFrIYIj9nh1IIBR+xHpOmjvHm(jPVuF+f}#Ca**NI^PU!j55Rz5Z9xpdf*>ob3#@g z)E?bWwk`|!+nqtvq%c`Lxf$5a`S?DY><_c&52G-vz;olbx{Ay@#pLvOJ4Snutz_v#1w;6G~Cb2#0X z9TdP*5%ENKExmrPvhmZ#&!0=v5kDjTpX2ZE&Az{8Ji=suReY7=nVcp6DowtMKkzfm z_=N`1BwkO%CuTj#qQD$o#^AI;QaN_QBlI7Mc(k}|m2nk+yx*^iM~ZBcjrf7BN86iJ z1F)lLruYNRKU-ZnVg$SXP_y17J~h599yyD_KNw@!i1i`KOsp5fpQ6ITpQxn)xZI8B zV|ca;TIh!O&yng|f*Y}3*&ImE&-fe1k4>7y`Wufol*#I3#ZGm|7sB`yCZo}uAJUSK z75&SMH&}lEuFUd#-fu(yqv1zdKbHHcZ>IVUi5rhM)O5)VvLC1XNbBbj?%$&uf{qw@ z5wC|44H;s-AD({!a}VGlPk;xpYF zc+?a6|0U|B8+rc3(`tXSe!#-7C@qt>kaL1_(%tZzKs-Cgzmn;_Eck~;J617Pa8A$) ze4_gr`tvYiMXbIT{3NyTDSYPyv-44Z4$7xsdWtuJeI+se*=iQ!XhK1uNs_B_@ETl;CcpT_f( zCrvW%*P8VqvlL#6J70G`p!^Yfd?=D5$EweFSo9+r;RQjPRog2+virsLBK`>fBlJb6 zIX?-?9^jVBu>oIU&lBGh7w0GTWBL|)K3_rpZ16jfuf)uEh&vyDKH+>4_)3qPc>>E=v z*`91$^cwIs;e6)<^B->DD&UVZ8{>s&g=ELr!(%Bv!T2S3Sw6x>{GdNUefA#y>+oOm z{_^MjGbmn6|Hx4De&{d$Rg_tDfN0InbLqf}CNUgJfR|GJk0wi>rr)E_e3}2`-7vM4 z-c~=C8#cDJ3Gw^}bkGGY)@}596fc09w85=bT+8DZ^m;VGEAH?A!Gr$Kvi6ag|3Mdn zp>P2|gZZbPDXcZmFM;Rcd8vN~{<=Pric^>$NJpE=MBjgk_tN@6eq9V;k+%Q641*Pn zr`8R$ymb8UlwZU5KqwNhjjO!Q{5U*X!0-m+iKM_UgYJiVPShf5A@Ij2 zLj8wkN9#lM3kFDKZdO_!{OdB@a=jYDddbIgB8=#t0T-g0;td)7l#h{i0p;A-jvqR2 zbyEICeDR=ZN5i&;2@PZSa1E=cueu68Zd_=5_=63Hxkmpd+aH5J5NsFgRubGx>T(^9 zJ5apDD?hd|bAa2ktVDwOMwBjHU(yNx={Yu~;V6q^l(}X1ffrQzMkJs;mi2+%VI>oC zd%UwdX#aEdl{7CJJWYNMUojkb!pdH8uvjR!CtD}}@@S7qGhX=3^sbBGM{q3xOTovs z7tC_LxE=Y|$*dzYfrnTL({3Sf03iyO@`?hn)A0rOmUyXe7Pf5-AL9p4&ld zUq$`gEckyj{*O?QKonYq9{SAIYP=udgA2-R!B5|A)5Gx4K=IFXla8)_O7&mHUNfJW zOMT4zXGfyHc5Q(^$K_tIddKXI=gRX_TK<6l^hXMP6$mA<#eR#+JdsD+=&e2A)9u3%ote{0csPU%LV12eoMfuMZI@ zNV?*au21OsXgnHj3@r;S8C}BrWn9%)tv)kUHxBsDeVPw5F26@N@P6SC9v>*WqFvK8 z^U@5iMNZ>yP58agzTCdM&GdOn5D%=SlOtq=r0eB0pAgpH3fT8M!pxU;G%jd5w{XW8 z{{A0#soFuvRPlThn?#$$<(a^@E&Q0ji&u$PxizbJe2DVlVhrWTZ(;UFz+yy$Jl;)i z!KX~=r@lM={my9UJIwh%6JJRfdF-`4uW;d`CaX|?i#wb>J@xFR%e`p@O)eQZ}EgN5y(`T3NuF_W%_+`@kMx)n>lRO)t z@27a13Tr)93fcRDj|9?r<9p^D0^T(tfaM>6zbo^T8St1tZJJ~){9VlW#eto5JNF(6 z%;x*sVvpD_V!nv}g7>q?JAURhHva_PMEx{Qq^>KPJ{>O~}#m!Bg zo4iA0&Er8Hh9G^AA!rcCGkgzb=x@th#7>-x86O&<60~7OPz!v6wbv}`ZPxo-`rqUG zgOdTPTV672u0^~f$K7PwoxT4++QU7!NzU3i)E`9B4!4DleaPn++Ru$1G%5St8tife z(PZnpN3Hv*KZ)?1B-BO9txkERHWTBmleN>|;I~0qLYlrt`+O*$?);g9Mk%d%oH-&9 z^TEnz9kjo5k25BNZ)6JZ4Ct4Z1CKp*;$p+!1~qHJ4;RD1gH%rBD1XLjnSIFkVCdsU zl}A!M;2%PN`%Pm{Pa`1}gvS3)xpJ_t0$WL7gmet}3T~3XX{CpHpOW-EyBR2dX|>V* zv`ft_GOCc_4Lc2Ch9%g@|Aj~JdKIR=mej&OBY^5nmg#@QhWsO^%>EcJ*Uy1h(0H^Q z?(<0Kr>FP@Eqh#(%RlhY%cUnrAEo(EM93*YpP!a#{2M%fKJz1!PH~8%ev%K}gF?*l zZwmFpFo~Bsl{l3Ib#wcmj1r(eVqJ3r>%)xXW{9iJ4D?s2AV9EB@Pa58Js+0?{Zm){ z?SYe~17!8HCYpaMs(j{kneYhjAC<%Ts^lc&lm9zZIl0|Lo(ZuGWNJaJ^2; z^nPtKCO*!-abXtad)>hMJ4`TNkmvj4FqxP>ymIG$^INw9KIS&z~7Lnf27b zTW*36wJKj(C~6f|0Pkb()hHIXW%MNv=m`{j2lQY z9yOhP$PLY5@!UUero4#QCUoWCmrwDF#W7POZT9#+;wPFkT^4kx%7%dd!Q$cW zf0S-g$9TxGzo!GoYt%AX^!P2~89svZza`(XT%X;4kgGJ~DIS8Nm`JR5aFu5K!$r0+ z8WegRnGO5`zi;Y%+<8Oql1=ZAUOyGfwOXxdH|~e=O+4<(GbNeuA06g0f%;WI&o(1& z#?=qN-{^UU_WD%{$V*^j!dNjMd>uJH~GEL$i@#s>kst_HUErwXu^2BfqIR|XMEU9^QTli zM?Rc_tFz4KPhozdsc~`U@rTDhj+pfW{Q2Qe#P}0rn3)fvk*Q^y$KM{$<0Yy27X60h z_wie|nfV9)3g+*bp1lv-Z>T@`U7-GUk3zHc3e1!QYemXU-|`o5SwkPsI2IeoJE`(mnnf&gTOiyU!))lI)5-#XBhe;EHIl ztBd+`lrz4^8QuIK^Zl9e1Wk)t9lgn_lOt^6NZeGJ;hCyF3;uxh;GVa7-ZH(#`2Zim{weWrrx_ zC(l!KbM*cZZ(JJ4yb#;?A3P;(h3AE|>=)ha{!t%mq(hE;6{b5zcz#N+XK(hoY=0jA znHN03`V+5DNv^5b5$~r(`#^sXg!@}6KOuW8?Ir%X>LPo@Q%l`*!z&Z}xgC>ygR%bV znH6>+{XX;uqY9^YpuWZ8brHJknldi1!{!<4d$!d#3vO+MA7pLPtlGCtrk(xaje!+z z<=otaC*ioi1D)|0jkX#%@DnH=6s!zf6u8Lq3(oI4!*@m&*|LrD6)3)e_#f;X_|*bm zpykP`6{=nn`0^CbK>gSw|988teI<^kej%ofx~O*d7Dzy2$-{-pplY?n{@qQLGSr7#@cs~p1~2r$?yt& zFD*q5{|XlWy}N3I*&mud51pTB*Yk{3T)(d8 zZWG`WG=GWkSKD6&_{aI5sK18i$r*lZ$asNFK&nuGC^sGYr8%)Ru~nLuawZwy+j-U1 zm8?Hjo+vH)2>4aKXSY`$^oPUz%>EeVo{fR+VSOa9!>1bfMN~(0f4m{xK*U7&pNIdk~Uy^R~KvcM;){3$+n*{e{>y{6jDFGmt^MEZ4&~&$Ox*4Y0EHj zd!G~=fv0=!kG_`yy$ZKuY)cI01AzrG)wza>K~j~#_#z$xtQ{u1cPQ!YLkZ66IG#y*G9ZUEBJ{|ggQOd$j;C>`PQ6TvT_ykbnorE5O{N$ZI z0`UO68WlgRe|nMo))5lR~!O`K@jP{kT+3W{=M>#F;cRt@J22 z50LVR6W6g`DiM?w0zWX3A%5qsXVdteuAc&rNYb9u*|s&s0iP3%67`dTGg zrW&|nddQW-4+Uj;ah9>L|1|uTa@cs1xWD0mR(r{Xt1{!2BT4f0YCZIL7Ca-xpw(-& z)(YaE<9H75m)C%#ar)imFUW8grsrDIs={VfADK*lvx6ab zuBwmDUo*eJc$bv1eBaI^yZQCu6|LGQh9vmQTl_P`4WT!6x?4Iv-iBRgjGFpGwYW3B zhgjhqvGj866@EQ_G1eO#GXB1o$1^n0T7qGzmVVsoLHP}5PR=#Y_bu^!1hmp_si8X& ze>1-U4|(vk8@9dhD=^PzXUZ2yvTYuMKW*{L#9Hb2=qWP({)G9Gs{C6zJ&#uiD+E1) z3TZwu>q$(WG?&PhmQO7CRy1p-t0Wu6y9Lybj{0E)q-1oZUD@;H%i|5d-EO&ko8k!+ z4>5JG>YiLWUOk@VNtiz3A0iKVX_>kV{sqi0#NXP_T2J}$h*yize!lf2YlH0}U(Uj> zsOeW%Z9Fl>ljolxpEcNOE!5A0#=jlborqVHBlO{LlD}pYb zdLR16M9=+axBsz==cCx=lERYH#xqpkl7r_F=%rm1UHUE_ACgRSle?wHT>+lM_#1Pq zeSDlNT>5xEhiBQ+vI}K3)jWP6iJMiC*i+ZfjRRhW_tn8^%(lt0ok~LWNx(-&w7Eq4 zh4~SB{#-n-M6SK7>X{x#>-$^UpRG?WuhE(Gl)p~%H3STL>O9rXYUJNxdZs^`lbTDK zN}BlobYn{Nlpi-k-_PS0;>J&v4h~}8zr;gQCYHMu&E)wRG(Oq;Y0u|~w;29V)pO(i z{EUfVTt4D0v_JSmEn~~oI=;Q^bHqoLIcJdncfvxJ4|rnSQ1(5s=(UuCYrEEV1sz2H zW#^L!<-(*f6>oA_AE)t}o7S$tuFBOwTw>qYg8umToJl30LlJ7hGc;}@*Wvs0Ki;PJ z6!in%HmKOYP^twU=zfy6*Q#KZf^3~e*I|p$Nc3TILmInkZ>V?z#rB0u3(OE zmsQOu!c7l-4g9pM!N3l?n}Th`5OWd!Nv1QMneAcu(pZvf=6}2{a1gvF+XesWBI8ax zuke}pj`$q>Dc1a81k>LA1=qm2qM)SuGT@fjGbI^2UFn2Jv zNm{{4S_5c)3F#B}C&)P1O=@!OCSZL!%NW%g*&k-$J{}ez7z6&`fS1v;U)sS*%y`Cv zw&1qF%D@Wv88CbU{x)z^Mm}|mKE$I){)}!szv9M}-`@Fc%8ygH`Kc^l#1Wl&lfFGa zj;_y(1Y3`=_Tcdgy$4(Wq4)>YlK{%N7GDv6jbxhrK(K z6Nyc`^x-^{CTj4PuKLcZPEJ+y2KC2uSA}O}^kv?Mp70IY-(A9dlQ#5K!Y_8zl+(2T z11tZm?rlf6C zI8gxnZkRvz3WpFuy3LcnQM{Sr9T~ReTYfwZd<=XF;1L=dS>s1dhYG&|e!=uBl2DoA z+#%x?lCRu+8T@@;z1kF!~_MN=-5%Sw#*?Q7*oj8c%oz!p3PcTd1E0`yscm~bi zuGti0_Wz;R!+2z4lo@5!7{4w4L8Ydmvh!vCC}Mai#+Nmv>r1D<81kHqySteBMNGTl zc9XOP^pPn^2P=JmXHYDom-KRqM1cVPDY!kb%?%s;Kv{drTLWJg(0n#RT$NaJ z)|>yZh*9o*|aMO>yz)5+3dDjAjEi6Me#*9_z@|eBqotU+1$$aalJIVV%OH7KEheM zz5mmoX1J$SwB0$U7sS_JGIj;IVnyXEZXHB?-`epN zoo`MOY*c(=O=csWg`YrjSFpkLuIpXk2~2-N>q7@aL&Ot||8dDwVv~-)hz!c#bbm-p~&BE*pB$5hu-hk@{Ra{+X_e};^~dxmwXt% z6Miyd5dX91@wYx<-Tq0}X|i206#56#+s9ON{t7;dnQzgAcRdgrkB7)VaQnb*j9h~F ziSaEK8yynGfnqV`%Tql`@Yi3n`99SHoPUh3Bo=9(2D*r~ixgAK)zv-=U0q zIbtZ}Lt*-k;A(Sz(U*9|X^a1X<#-Quj44L#@$&eZO3V5${0J!jLjyN(=nrRJ?aA)%vmAh%i#}8Gd=p{&30gg;iRFGI&jWju zJ%K&EzQqM{1l$`v*32H z|D_*f^8RaBZ_|3S^C3Qh-_k1!hAz;O6s9lIcy@+8P<86=Nk=B1p?HWW;8QamVZkdT z3Qt97ffMq(GW-Jg!(MT$TC<7rKWKgnb+9GhTm{1~H0L|cl@SF*q82>CKRf%-Va4Is zdB2K@Rh2aT{zj^pz=bp}E$REw&erbFkufMAI)O*f_UZkGthbF4WmX9ru)$@L!Bi?_X`GN9$ z4d6-TG3cYD0{4&iTe*qn9&5z+Xq%wO^$GBiU&c=>n~3jKrh7SM9FoAC zCv#>~K3Z5~Oh?85Nj=e>wg~ybyP`Xfca{#IK3Kk$$7Lm}I$i_bT?zdIzITgzlsVE^ z=?!jpZgL^!qrzyn47c;){oL&F5u4CIMRwk*b=mb#xnaH$@pzs|;uTYM@VO?#A|ei8 zza#h=8??}q%zmQ2<^z8V@$&fxQlM9s+aKJ<@Ab#eqYQnpR;#}c{>RR1`6Cu!{w3U>T@8Z?l+V+$5HB$J;wEnA z@A;Ai(0hnew9U7`->~eLh_(A+-}#j6!1=)+7m9U-@Z-EiUb)^t%bq1wou;P`ZgCax zOTqWqt)(nGbA_t_cx!hd+CRK8ydU}Mipgy23fez~u1jKZ#rqua2#V(lV}0{rX9PS5 z-*5Cc=Nn^hgmf-!<5JB1bMYI+GxYE2-y>DPahK3GTtX!D~sN97{fD65=XIGgN>`i`Uu)r)FZmkI2i zYNz~a@Fh&~A3#tD!XzK>2Oo0CMh1{<_*F1}%Edj}g^L}aPqE-JAJ&e(YnL0RgFgYo z55i5+SMa&;1zs|Tu1B8zs_3h8sYzPOr>60v=hCIB>=eT{{QY}K;wAAjX6&GNPR=Ko zPnW5>1ay5<1w07twMZGLRySTSS@a;LnZfQ^0R#J9mJb|SJ8hV3qTr?e1sUI1|FG!6 zo!TR-j+~6#i2JAhp(bQ!ubcM#!yX#1(C1wQdBLK-zx7%8Cis48f!;$_41Nv8Cl2pV z*zc9))yCr+n>NI3h&r_AAuT82_lLTyng!4$>h$AGn`P2s#PB3De%)F*CeH&h}i}_xGt^ zuqe~>hxpq!YH0rfU&A!XKEtI{Z7So-In5^?-fX_VhT;M6Yth*Ex-~{+?|q#!<2f1| z@I`$TyR2T~Js#ES4tf7kreL;m>po+VV!gw-$kNw@tCo7--;ajikjpJe6|rLtgr z-y&Lnw12tu`Du47g}nMUCuj+LPb*1P%)RhF^2)>|6we6ha5uVjxVCfl)r9gZlKVodpvY|H{WQ*4{5)Uc z84S&!c!oK@3C*{94D)H|P2wUEe=a~mJv#sRk6wi0t?;+Y+|K+BJb*W{pCaWo4-3kI2LepNCO$vOt<@R3_vp56r{ftN4_|%sUP)@@ z(?W`O+{OKLK2>#%tsTDy`BK)err*0`zf5BFhw+p0orWzLm9SKQ^C^#S6qrsltHxfi z2R_R5EPp@iRT5qJOAY5zyebp(&AqzJ4Gr)0jG=fk&2KU@IC%MXVSQT+ZFpB%BZV*m{GE;IjhHxC%VO6Ice_ zq$Bi81a|$V<42FO^=fY9@Idq*^#4%9wvKH^qFl-JAMjiGm2O-*+86x`{6WemC?@|K z&tUuw? zcc~Q#!Ot-%GQ3Iy+LrWjK5kO#k0BBWiCvoA3(n#E*wJh8Ju*Fi+V`Ndnd|&BwGPi4 zcRy#at*gJ2gqEzBz7g^1`u!`N`=6=DoJ<33CJ!0#5q#(VZVxav2H~dj4UEisGSUop$CH(w{CE8w(2ES`< za&d-He3lH$Vf=n~akku~hkmu<1Y7@gdOi8mwW&|)K%mQVSW@2=Uud)pFdy5 z!QZa~{Yxm5sY=SWH6gxfp?HRyz*Roebyq9m=~k+T86jUF|H5^1FgI*0^{3PvY0kZu z+kO&y9dkUt7;6E0p;)1K2i^a<@}zQz;G~krGbld;l8G54MbtpAXZoysfigH+Mk?@o z)VIs|ZB5@dH(lb7Pu9X-5u4P)$B56UYi93*1<#NKDxa6p{G|9j<*!H}-)+urM*L_! zl=3kg-h?-QD7=R+Rx=X*7BoqC;m%O)Og*zk|38b!7un;VkA^at{Fp$D`^E&L%^ zysydY%d64_>R7&4s%Q8axwz6R)1i+7eu47h0Htz1Opv8KKf^u5ynY9Kg~l799ZRaE z`=y!edg#wcUVe0uZqXTDzry@!VL;E{U%-vT3hj>89Xy^9UBB;P*2Ao3qP@oA7aM_( zpyQJ=AL3_zAC0?^TAhP{Hhwdd`9&d;1f`P8|I(=s{r_%S>Lkvn|DVcVPwcpU2$=Cjd@g&`;#IwPxmzy&@LjDWJ*V4esaQG>Zw8Htvv0lHoIlZ~K z^FkNN(v3?+eCt#!&yZK(c!$|Hj{$F#)=OK1=z6~-Lizi9m|r&rwuSb^^l`VwcBi3z zwj!E2Hh6rHzTY&y(nOTomaFw@>0T|vA0&1Q&3<=&Cs=#VY?#)dZPqrw#3Ra)5Wse` zE$|mJe`CE?z8f3(5-k+ZNQKs;byw@I|KJ(x&F8By;~$e{E;6NZA@i%C$J2a2(1+|G zmg~tIwDfXXoS(&qnwfwb@rU|m*TedwKh0kTyyHw3@C4|;w$k_Y<^55y$}3&3V7z3< zYm(J*8VHUNzrVyYVq0Qg>PKvHRXW{0-2=}5I^+M-u@+6J{%`n25%4KDQhA->8}Sto zdsW26Azo$gi~n`{f++OduNtDLVXeX-!nKW1vW0M!+4%oHXZA4 zEz)AU4!y~NQ!^P7L6e>4O(hBk#6xqZor&-~$!ah^JeLjQRC(UX|@@M~(1Hl%gt z4M@e?YkV&uf7VYSYS!N>5||%Dx@oU|+rhodNy_y+n!idM;*}h8A=ALk20j7(lG9R@ zf5^o73VarKQGH18vMgPbiQBz>94m`4f7Ze8ZqN21tC-$tovQjI{3C7+bEJAGM`6U+ zlfDmDa{kH5g_Dpk$!ddS=eRR?e@@hw&8B#TN!|9P1XVgR#Cq z`IOWzW|V#I_Iq6q;a|JGMve9e4*v2>_C2!bkqSoZM&BF#z>iBY>+`%Z?1{^hOk6zfOzkK$0KdMuAt`R`(E$fwTuam#YU z=tlV(EZ-E(pYiLKU$;mzs%rAkzBL`cGdzUMc~V~X4(LoBft8;5(nRjHBgsqN88jsf zgqri8aL>M*rNH;S$F5FLB;3ojxnG2yKqKym?aZnvOyQQLbtIyFyn7P#)fcNTviKY0 zg>O>$<9JkM|Mp6Yzr(-=h5-f1VLPL));E z=TDfvj`>vJCJ^&}h2wS0TiN&5;xFnFwsKt8Y4~?r{5EPRUju)Z^<|TXD0muHNFI>! zWR)8J`Az3clhYo{z9otMW-2_u}RL z19UQxoxS%ZK5&zlWO);9jhMSkAYuOa8n1yN`b5^&J1Q{moWyd)t@y1MwCJJz4+6eE$@#C)^s4 z7+-NsPw{|L&^LVC>UU@160H>N%kYHI-A7jEuFRj!S@;)2yA_6IUCX+tzr!IPd{3;s z=I+w((vt{wf2IxHiaf`L+}COim0kL$ynd(1h{;sw zDi!du`@qXgXW#v4#2%YS8}J|Aggyvc+vi0 z`(|$2iTtGI_*>%y?}oAEF6BJ`;lG^5+po6&r#;_aG$OTpvuLx3Q-QC6-+$dZx_f=Z zx(Jewd`LKd@Pg>gH^1usf{)k!D|vBY;y|Lw;t!yiNURfve7b%H&);yN>LT@RHSY(5_}Q#4LVEyD(JbEQvd^m4 zrWX7khL1SC5L_383A`xZh31QDIoN%&FIzW+%QNdmoV>i2F3Ajo->n&cNIjHL7}~M5 zfYv9if73sneHqX!Zze0EFJAfx&u3iLrm6zp1Naifi(&)eMtY~|A%FhYw%U9*>-ntb zW(G=j`IS@2x%-h`_gi-bI`)3?t=Q zfz?vPdonwxQFhQfjd<)TMZD+K=+&Fhe|nHh^;;sqdbX$06WKOh!I!UMct(6*T;I0# zfJ*Q)SlOH}Sg!z|g865#^$H|}|4*6GrR9vTVK=C$ZO+J!(+6s~x>TkIaFTf`6si-A zoWp9Czf%OaCv8%dfiK&koKj#Klor-637~uq-JL;Je-5izz6^<*VwP4r*hT8|m(ctw zU*B6>8PgtMB*?c(^)jwE1KXAufH~is{u9f$*&=NVFk=0E>eS}9fycYuTWi=qP&o+y zi*D+lRa-r=fR3MZJf-={MFN|@voiE{o3Xz>`0a`8djow(Gv+I{wT|^G2EG~Ka_`Kf z_`>U93*>D!z2kU1;Z>&%vWJc)M-Jo7W%Qp7x>&>$kGAl7lDLz0T7gjLMEyFc9>lZD zOYd90aRc^KJVaA@CjFp`%mscn=KLq?4=WBS4tZt)kC;pGh-%Zmhq8-Sl`KCx`uiDC zsY~~J-Lq*vCHnqHeH(cwV0FL>GO6}{Grs2|`^NN5xVP{J67hT!^%vc3hbLr zdMe-q>KLk6bSL2@>Db0_L6v?|_k zbFkG!a-OfGe(AOel6=WM_kL1%#L$ZGzfG8ZIy|NOxZ%=_{I>^9_infE9Gv@fI1yF+ zIpR~QA34!=uM7Fr_SjSu;rkQSpWlD6<5H(I(|Kp&bm?5A?9-<;8%Wd6NaZ)1Fc$)jBg#T`yTc8rhlE_(W$ePjLi zjRju7^cS_tI_2lsuwH5Q@6hX&dK_MNiw%4Swtv`lMFrvu z1LCQ7DSiPwHIVin9#4P)?NRoATlgC9PW{N8J)h-#mHMs7O-d>dA2WOde0Qb~d0Ec4 z;1`ztws>}SJ{~U-3eEl+7QA8iYwx_n_FKy1rTL7X#`qI>ez$AU>YJMlh<|}^ti$)G zF0c-_3qDDTYsJ8zsnor8fZabmKguKR@7($C=Sx15n85B|Yi>`+21x_fsN!+{p?~3g zHw@n!zK6hFYBw~1@^2n~8pY~^RCqK0Q<{xl_fGpH>7JXrDL+1btIn*4fjmB z));?(;32O!;q#$TegXBjOvdz-#hbtvpcgUKnBi(Q#YZTfAiO5J20Xcl#}C#Dq6Lw* zEnE09Mz4{l?= z$m>aF)=uknc;NuPk{Qo%%9PUWrgWq^UO)5xBps_y>hFQ~W!}_tQ)!u$AFrqJ^&7}1 zRQyKoTm1ded|Ut=y;vi);@ zE@JPibg$X3A$XpPc|046^<9kr_Q%1ud?D^8LzC49hM+$*c(w)hh4pc}JLVg4{=mkl zj&1!31H^H4Qatz=-Ab)e9y}e3Ai5z3>fpzoAE78M-76Sh1NHY$n5*uVuNn=!f$2SFzQ2X( zJ@7s<{>@8$AdiPIH4D|VnETTP$5_Xyn_@Mj;u_;yM4_*Ay(V~#(BskHW=@}`lHZj- z1Af8!*W2JDfzR>;`x*XW-zNSY{J=ECtKAguS~lnVIpX#MSyblRVMY5*-0M9U!eaib4vV1qRXnr8tCE`X28j5iPc`O8q5CuL zmvo&UB%{|PmEro{))_0hFSqUFvR2;x9{E%bH!dv=Erp*}uy$FslgYHAJ*W*Fp81|Ur4;udjfh?w;7a{9IGebz zbI5=4Z<{?6q;sWYa^n5Ajf19%;tArpg55&!lRI{zzs!?Olg$*oCE#*u89)4CXKiPc zd>Zv*VEP76wL-0qJsr#Cn(+z`pnsAgaS@LQa&Az#A~1caq9vGDU1TuJ=kV`gd!W|F?=? z!8f$v3Bwea@F)a#I7|FopgD0eR_Dp|DKuUU&0nIk>$3wN1NjJ1P978gp%yD9G#;n? z5bCW}ZUEk%hx$i-$DWBk6J6%DfwSNnQy)uP+MywG={{3dS5^V| zCHE=6!uZPL&wk&W2D}J*9rSm94#Fhit0_~G|X!FbnolXFEKwAP2f+;x@q$5 zTM^$g{mN^P)xDPi15i8ze07ay7wPg!O7H@of$?!>sYzB?cBF}Kzv_w#KQ{ha_&{r# zW;Dzw8WYE@DC)n3`}y4H(Cczjl}YQ5`iIEXa&>7b^c@yF&&)s9B7cvZ`RR^4@d(-W zy5J{cexFiiC@yY|6~t1!h_+91bM2MqpEtb0Jx-sKg!$B0f(2_MsDFZm4-}zDksPxA zR>Jc`X7=0mzh~Ic|MGn-gWeO8Ec9>2Pr9XN;di@hsu5vVAJ6u5p|>|1R_j z>jqQ1c6IW88(G;!8|o+bj*#jj9N$EH*ViuapzTZJU#d6zqEFqv%&_Ds*YWD-kJ<+{ zjxS`^079 zo|O8LQh!xp{<8hL0}rc7Yn?F%&p++4>rISbp2YRej^`iYe1H17t+3wiNaW5RQ@`me z12G-0<#y>@vX859>Y&C=<|^}ao+l%-{URxz0lyEUYdh&6f$h})LX*-NelMso0Qdv) zp(1{qC)jMQpAGzP%4kpOU%~4IP!6T>XZ%)ykhV9uyGly^3Y^r@$bvfl$m{c5Q8qcbCud!%hJW>< z$VgXL@GI@6DwC=j2Fd5ip^=D}Q}4yzbLzG0;e3W25dyE7V_#BLXrg1a6HH<#@MjXwr zPVu#$C;mGAr_sU4Uo~|u<$t{8>Fc?{)ATnIG4-?4xc=b{YxTjqi}rjDD$CLAK~)C!=*7 z_*pdH$}=ygZBF0IO2D_ce+&I(^j7Pu0gofQ>3B~0B%xKu^f~vtACd`ES$_7ne~bQ= zGjJ^=?+$yP++Gyi%`Z85o=lw1?tfODqRy?sZGilLjJ*k1Q`a6nnh+3&4he|b>D~}P zwAz*s1*_in0Fj|;WeRAmw;+g9ZDlfbs8N}sNF5Lmt<|bbL9vz!XjG0x8KbmSnbF>> z1(|Cd7?bnXK8IuP`@ipd?~$+H=WdddbI#sp@BLf9wbpN@vZds8>~~nctnUzAo&oVGoX3jFb4t`^mp01a7;eDyhHecI!g&rF*`T7>zl*X;VCwy z5|SSz@uEY7py;yxb3O8j?0$cPF)TeSEGz>1`F2tt0rdlAX}Y_>JI4M}f&Fpu+jr{N z`Diz%CrJ{;;q{G()K?+=hEJZUR5yZF1<|`Xydkz5;!os5I6Qt9-?F8(b&%~MMOZK!Cv2The{Zp8jn%l9NyzP5NCKY=ZQjkfa6c}b@g$6=KTAFE*3YXjK@Rz z@^_CV_wR4MgoO3;;q@QOB`V2M)n^IdTTFR~@fKIIQ(K}RV9580-v{_hoL_B~9l;wk z$1Vh2^zZP!KzniirnvvlY#vJ2^j_Hgav`n&H}Bby2As=nY@mCs;9l}fAD&5cF8y;@I-e&h7 z1i!$1A#1WV+72P>LHsbVzb|uhb0fXZ@*mJ%vM_+fLwLM`-S5p;%*XHj51xVi8INZa z3W^n%6_gXEfo_;2w3o&YmoU%=rR*#B>sy1sl;d1x)s3mpdD@ZNMz??dnn zGTzrlghzZ4!s{ysaQ(uy_)2+-5RI{#J5AVe|He^#|UkX8jk9U>!z3HyCeg@a5&^tB(L;) zLa+iLHkkbtveh>p3-OyP7SS zwfif~PnHjhNxWn!Q^+=}ZV`S;1MZJTNTud|l~j;~&$IFWhS14jYW>Aw;2E_CvixZRfc!g zU_OesB>o3e(v@|dIi9FDg!_Sf>+%voLRe=U>L+veSMX4P`ntf!tG!keJyF2OP z2faU;)tf|jg?2_Z`8LsqlRZg2))`|qk2P%T-7GynWy4h984vz*jm6KX;AusKpWz4W z0;_E!^usKk!M3~nx+p_<#ZmOn0pM#`+KXJ;ol-3a2s4X7(Gna+Sf|)>NPaL+pS0B#e$2J%v*365j_2wt>@ja3&(mV_BfAgR zM|Dsi0YAX_uDDfkCL-R`7yKC3pVcQKV{Yg4KgLnxx$(U^QI;!vD0oWYebmoIecDH# z6nrvXK>1u}{aRlY5I0S=CGZFqe=5|6K0iO4HH`I)^P|OFOkOuL5f)>$rx0HBfsvJcHm7K$Ls= z<3(pgW>kOyNC7V)i?^ zeIK-!(Igl{yPO)NMO0SN(RA!zUXwUV-V@IgP}#rf)7QN z9=<|_bNSuR^b4BZx}aC*^Tk*09=pAHe=y-2koYXDA+$&l20u9BXYeuhH4w#4SzPC_Qd?(uEfi$m&G&idA)w;FnN*lgTDpzdA=v`5=ck!j8h*i zj}bX#V+|RhsHp2I3Fk7x?`H z7cc0KAN_hcfBi{X=-=-*GejSA7Uz?)G*KJ>&5or!ezDu2j5jx!ck}+LIXg%FUcnC{ zpTF_$&okBVG~>rpq@|N!)_i(9@i!##oKL&??;k(>xD)Xc8IPI`77^wt5h+B^!H&-x zy=j@Ts%27wuMoeI&jMx#n5EhM@dA%p*SW4YqF^QK&w>74Y<|?YbOGZ{{5GxvAL&AU zz`EADVOc`T2ji651ij8S(0adk5yU35A_?Ye- zaXnK?uP$Qa;ou=^l@tO3>dQZ8KJ5h_@XYFz!cApHm*1AY46Oex!TZ7u!sFIdMG{;8 zRW;<+=#(K%q*Jp)h#$ccp^tF6@c1nH?rzrK^Z4vfEtXkaF^7JH)dR#jM!EiMsoo@= zF=gjQ_&x5^z0Jm_RB#HZN1>6ga!ZeG0$(xnU8gC)Lxf^0i852;>s~ zfZ{{L^om)&(?ft?D4e0^sUD%EcYpBPhJ1m0SZ-x6_=czMJU*bs{!Ox4-P(%!+!5J| z0q`-lc1Cq=gyxj8w2@lCzge_jSSYEJqdxV(mh?Rg^LXEr?R{G>?WWfHe@pa%%;s!Q zcMrfvz?X>M%lqw$K}CbOf$%8^p3$+j_^S(Bf7nVrvYuIvHmRTS^Y(_XsYiNSP3V6kGf~SNIhIAax?Ac4@-JVJGCc#d$w#g z=z&*pe2`n>cWdW;U`-7(mj0s)$5i|UwiugQ=V^9T6(B9>^r9jf)A4CPoMi^!`5fH zL-guR>$l^2Q(6z#>i(sBiJBqWdtwa1GeU6Jos3*LlD19{u*8Gj2@9{=Pb}aaB{SkvcuOYx_a0r`nxKC)fP-HZ|kKHb{XNXB6zTWZnsGz^_Rvwmj?{eV^%*6L;cpsp3^-Iy-g;{0DcATpEyvOChmuR zWqg_CZ5-c9sGOB{soq2{4)Hc)z*i9{m3ey1$0^iOGZFOqf?2Z&o=63dHbRF3qKO z$FuR;mD1<>T_wBpWWSGm64Q?Q3R?^@7(~ zy$Rljo<}xQ_KJ+hGYJ2B8~y|TL;Sz>OR--c)nAlti-xD~-)+LS2mVivkK>W=6F&Rj z_(tIL4ZoFa_#3}?bKZeBE^heW&#Mhl-H5kX{3B&JKp&v@8{qjE!t3DUT^G=lb`+0b z6vK*sYvgM=K8Tw^V4&~<9>Ugx33%rBjNOk`aef@jSNN^)!yW*iXYrAn-G=V+-i_V7 zp5#M?rQ!p-ZFYQ{*q3c0=TpV$PsS;|l)5dw1;8^{|Il+2IKI1d)PLjEGeMuR>oxch zBbeXqWRCuyUfA13{5#qaf1c9)#MWCQdJuv~2tx#?1*a(ik7vAbUiD0M;lg^#+k7n1 zhcv?<8!2)L!57H)Cs+mEWaDSx8^lj_)tHqLNO)W&cnrZy`ntIMExu3mCYnTW1zGbhYm+}h3PyZsH%vh zLU#VJ4G7OgzJ2@}^(iyVFEWo+oARoGclfN1#{K}+A5@3+-KZz&!}?W9gesLjpZFp8 ztd9E&^O-ORehGc3mz=bk)LU^x{gflY_m9xptc)_OuM&y9WUcjaPoCef0p7+jo`=M5V--Kmd+7QD>J@Q%qL*)V-}*G`(*oRY7Qg*w zc2Y@fCn{Kvwx+Ifso8@P*e2W`oyl{L?TFd!mz|IZ%X6r)Q`*b_e8ze_Gywjjd&{BAx z@G)k~mnpto{Y?akhYK;DG$ZPf*9IhRBt9qcc1lacVS)Q}N9Y4tya-C5M@|`nIC}gV z_I`%JFB=*2N=j1WSpz*$47@W!N1!*UOLp0c^I1LYRxT+IE0>;Y*gJ;sGXerQ{cgQ? z-9gL;9&q0#HPfZX_s(dKBj;aL#g6xy@cLALhS_M0Y$Y$sCn4w5yO?j};yBwZ)F7&I zR7XF@dY9l{9E1HC{c&f+geLfrHl?;^_mr6Ez?z_Zj5q(`(7{N&=t(K*M=`(1-JNF3 zE`$wJnVsc7<41qbKEO29uFpFi7+1I>G0!jK5e3sueUA7 zc#Q6e964yrVx(f9KEj_!I=Lv8oG~zq zuORnxT$BLrHwC)=371!M^%~Q?zj0Xc8}Ouh(jRt+=OikH3U~*LHwhnZR^L+gdI9fm zNB=N!t;xs|V*LgGf%K=tF56wI3#weCM63|+S{<6G|<9!zUtwFz4qu}uZ zS8J`J5(FLI?^BiH-{3G{`xmtkexW%3wV9z8sVcV-;9>pbeExY`cYBL58uuUL0q^^q z7CfZjfy9m}f&vV|?D4)Y& z>Pq-^XBSYT{sFG?IdZMynwID#2tOgVJEkf|9iv1%%jT1bUQ_E=s^X7#b4>1-0rPD0 z7x+l)&MSqecgDwKlZUN~tu@i}UL5aMhL0iB0KW?kp9tIQ6ep1j#XSDe(HH-XeS~>9 zMfeIh|7fFMu{=O1=i}K}QyS{0WcKpkhkyNE$zHjEk7u)>u0PqiGW$jTo#a1&(7rhT z1gNQ>N#JL}UC)PwTZ>CenK$^~4?VYXPlPx0oWKJJ-{8FtuL|WMuNV3GvU5?}lv|Yc z{P&~vu1{Pe<#HPF0Q4(NR&O@CzqgYdFUu42ajc>udL-6BBYr0Qj5x*4xL+IMwCwls zJYl(p0oh*YAvk}H+pnd)=C@1&zf9bJe1Gepsy!f9q@e#uW$Tq}H3k&VcGAen{Upa< zASL_3f-Ss$#QHqc&!_>z^DAaFTHKF57JH0td%8Rw^Wo>>JeQ$motZp7;jECzk7eF( z<@p&OMBAkahNaCs{vn$FD?5LY`$5KogPD3!MQ{5p_WaQHv-m-DTQpn1-~Uy({!WtL z!FVEk3|y~59`}AFk8hm%K0lvbzk%E9w5u`*nEn{WBf4A!BZ-zs2v(Aon+H?)U443VI6o{;|exR9&&vgU1ux zP;Pxwg|3rt`*At}|Qj=V(VvGu0{1V)-!9Zus*R;MbDL!q3fWZK$<}kAAlc{6^slVW~sca@z4i*D>7h z$wF7R-O6*e)S5b?kI=Y{!0ofdwutHw)$Bli9q9hZ#-5Em)Qz*gqRV7IBQaa)_~1Bo zee4e6r*XC?w8p7;dKjISy^+*MnQP`{y~W{pFgWM^N8) zTG4OUc3{1%)EQfD8ZOi84;2bGqkdOfXmj)k@Q}P;QiW^rdHCf7R)J3&cEfrA@oY#} z=y23<^axeS=}W*D=<*%*9icyeI-?HPE4vui`jhFjiQru~G2VrTq=z!wdp8sRU4kcA z45$)|f-d@!=kX@)SLX3etrqv482H1m^+tvjib=x?J@{s`=3mA7ap8j>=lwY2$9H*u zi-oq+W$gMfsvo)Bv#BenZSEiRwA60GKia+^WAaVQT1$EjS12Yq zc&wp?Cgw!XHPdb8AwySqQ-q&kTTJ%T=r2jKnAA6MI~3F@fWI=rnI9Qg7HyZW|s*#!G4$i(d%bWicKV z;9n<+e-Qz1uo4KRf}N;WlkonIG5fLpb{;ZT_4eGO`wq-EzK!@y9iq#=H++t23p)DE zc03Pa=eWq>8>MtU-SYcCu>SiAPCIqPjZiO1)4Ux_%rEzb?=e^UKBwsNYqwEf*|y%d z^PsVUp%1J&O#ClS=)S*{*P=60DgUi#`Um18v2%D#@`dA6d8~z_iTHI|$pVrv-WE)< zVV=RCOW>?nU4s1Pg2@Z|ap45NAdc&_#gv48BlZuYZR&b)Ogl>5ON6uR3~(%?ME!xU zn()5Z*=&ys{M9`k-+B2e@DgW%#7=m8D!pf=`sXp|55aQbRU6ZCT6-huHu~=!v(0wS!_{f80`WdupVb<Gb`&%q~t#w)B zG2juSejal8odN$C#V^2bP^pIXdj5T=Ratxl^%wtdcnXhS>^8q1AFsULjW+vxZo1RD zPB8fJeHIUKg*T&~DMY@F^CKnx9mJ1=|Guyi*vBIJ71TFzs(glc^shjUFI4f+v1JRx zd^}OD{C0C`Cj3EId<1+1)Jsi)o`3ZCm83ePJdWpUc&Pr#;u*k0#uERGVt5N8pQ1;6 z#_}bAJ()aRz7Le|DJ+Z@gH&IMOw&9*V~={!ct3lE*V%@HYs) z0lcH4jKmw7Lhx0K^r&w=s&_$uuzDBP9~Arf3cFM6e9Y=qaQ>**%D(vDd!cUu{$arJ zUb9smf}-yT!9&nyN}JV3v8Dn)f_?|Pur137~V#1%1$i=grk^(S)0Izu${Uw$G4=P4I;OvaT zslc;k9;(bd)ce?-m2nDfpM2J|K^q0PQcR9!Ob_ZnOrkcJw+!*u<6&t%;H09(oW zln1Sybp4vTBY&X(Q9p;g=q1@{1kZvW_mJNZ^eW@Cb53DAd?@vDU#hMdq4um%C*$`d zVe<5qq<(A4_+X+ZktYV^CN^I*(g$lI%5Z$Agn)}Bh8l*lF$5h2p5c}jkbAf*bA)aj z-~JoM-)jPU+l2J;Vfygy@@nWyzGr^yE9q_S#rl{){8}Ud@`SKPtpDGHw|U@t{Vv6~ z7!8Zv00RKX7 zW-qhvZ#~fdgORMCHLnjkSd`N8(U0`l1eRa3T#`JeG?^j%hDg~EQ9co zCfa6N^;is>gO9=f-sA_93qL6QqL7+k&(?1W9S*M!-yE|Vcm~nyY5Y`y+OxW=I+9Ny z=krg$$>-mA2L622Ll!Two}!(S0>=cRCnf%}xBL6++3{EXw;n|S0vpB?i^uiBJ3-xU z`8)hISU#P@UlGp%&uHiu{-J{3iGL`y2mB4(?^;WPYt8%`SL&lb`pYnXiTkB#f=GcM zebZv;o+1)oh;NAF#49O*!+~`Mlje<$?>l`iJT9W%`A_#0FO%j&$wyWj%=TH+_M2G0 z^nW>fOTH9-X+~%Nr9bA5d`h>2cAQ{2yMIi?{j%;@Q`LILxEK6>Ha~8AGG|lomU~-x z{r|G2T8t-#Lpi(|2yEbfX`<0`SV&=!~E`TcwUgNC;4zcbwFmC5&lJv9KU0^ zgTGeN;P66!QlA1d4n+##)3f}K-FC=i@a$WAw0U82Rlr+bFy}lLo#(;&HX> zR_N1QT?rq&0OQT4_xkmRhU<&yQT>9tn4odM<5uH(alfJ7fr4kL1JAF}s8QX-vfYc1 z|6Nr9C5VWc**5O?Jk>IlNnjAM@hSQ*cy`&Rzkj!XJ2gF;jjuP@1UXDipY)uKXYsze z+F7lRI37fCdo2~9)2&x|AYHH<917?wpZG_6FdReqp=#%RvNUmQ%3n9OyAYQ54KLwPvHCSRmz+) z->CeZ_nQ!Ux~I5bjXy>^fNy~Nx8iQlqbZN(3?LplO#BBYSUI!v3y*)S&OX&!xPGG} z@Fxy0y9yd$9LggWOy1%TNM&bIFl6t=$ZsLh-{FxhNAoX-T zM#4rmwQOplvp76T=p+vZ%4;doT0Lo_!F_?3HNW(bC)`o zbVWM^)sv=%c_p_scO*{5uP88 zKQtJTyHv4MPUY4u{0{Tsm347LZfVkZs`o!5zXN|r8gZ+X#0ljT^^Qpr-hSi85!&;}e$)eDCJDTRU)$GuQQD;asF$M2H%ha` z{(BwhAP4zU;0cSZHcvcj+4nlt6#cs!_!B~jJn)qMX)pcH*!@0VVZB@xf2pPg`#Xo{ z=f4MD5i*$GlGg(NxUQH}1h0^$`CeQJzYFP|N1hKl;Fod2pYyAl9+UbQ-zEF$qFzz?fo>P3s;QTo>!*7J@iGHbfCBy7)Inc5L zpCI!a@q>B!`P2cQk+nnMGqCu@f#bfxzKE2;U+cb$`NNKJ8wssR&zCM)`xWuexWCbl z`hB_$B{k(W zW?b1D^xGCo&7R$n!$}VEXM5^840VVs*48TSGaz7>afw{~G+0 z&)}SqDb(oqSDz|Bb!%3yInlQed}>_7tP-sk<4xsp{uj2p1##ah?zs?r`3A=4Jd^64 zS%K&bc|ObW`BbLx_@EyAB+TEaU&LJ7{$%@&;8+2fFUa|v8wsvgq&n5pS)4v`%5{gI z9UjbnLZ3Oa=(Y~{!cIw{bElGBi#Q#`=0d;-ZR~z7wtVU7J4AtSpUOWEk#C3 z^>PUOIT??LggyFv57`Q&lJoYDDJOHyU!{0HgtqqCdg!H` zGo}yt#~b41!UBuFx%A@D`t!F;n)l6?nQ6?vbD_tzWx!8f^B(Yye+xkq1^$qM z_|s0v`AN{=S3JP{@b%tu@_LEnj|gAG;lC@hvr&_X?7wb*0lf$N2R}{JE671S#^V+I z`>xQ-vh|ICkC6HfaauT1YWE?3$@41`^^>sT!QX=A2Q1m>m7{A1KJ7EAXMvh!`^?^% zeEU71|52cjAl_&7A!PpP;#{DHi|0o1gjI+hSN5(% zJyEWH3hI-x`Fz5MAo`eMJ;aKIsFyny*N1j2Av;#cDtP?B+E1eLd&}=Fs*2-FjD!5R z6E}qCZ@hQR4j-;z`!8Ahk4oL*3f+FL}HG^@XrwX}9FttiPfF z>+h(4g-B4x;WIq`5v?e5Mn!L)&!KiLn_qUh>@qdVr%0NE`kE=p7*AY$%lS2`xBU;E zK}KjCt4G23?apjFbRbhm>W8rSM_5EeQABM-4e$!WAJ@DFIs2lCOfC2nwIn}3d4h`L zZ;CdLKi&Ep6+O0G4gXI@ znl1<50{Fb4DoBC&67G(uE`7*Ir**j$;{5!2u|D5AXrd>tt2>GK(gW+C)1ccBWu>*r zA4GgR425HdyovfI&(p4##G4BO4_~Y@Q6J}fS~n5AA~5%GGx!&QU7ioX_mEenbyXXI zU)Y=pO0EJwa%WKDVIAr}sP;z0;rOpbdZw+dyV65X+RMhX*5PjPtxS^(osm50DCUnb zF^W?jcN03PNspfC@cVA4{qFY&tb--1%HQxuzN*O&Y6RC+- zUjJVcGgT05pTDN>4E>Q;(kYA|OM$0V@`BpU^ms=WZ=#0WI}{bF3i_L>sRUn2GDdZU zHu*ME^}Ah;V*jy3_=)w`*2fi8aPrhtjEC_F4oP8cVMXu*tt0hKNG&nj2HOhi*X-D` z*_dxe;P+Sp|3`zj7vcLz{FRBDsxFSuizfuz;ru+(V=m@&SDWbDH9-WwaLY++X~euh z)$7>)wGa!OrK!lzW#nZ4i2fFdZNtMGON{iy?7O;`@jN)YZ%Vv)$w>bek?;WiERrzy z#Mr955!&~9TL7LPx18we>>ltJ_i+6$&B!t|-|uCBALI~x$Z?}+zu5!o54u9xo{#5s z!-)Hcd-aZ7=|s+NCLrKzZoboU`JXPgG z<~yS2AbiA7eTY6}eG&K^;9H=7tx<2sXV3@raXI`#9`BUo)b4wTuCT8^h5laFKkI@d z)Y^j{cbcnD6Jw6*eO?t*WjM>f37ZtTC$YH>da3b!tFitqRE^eK_JN)Q$DiScfHJ|Z z0eHdWJ7_C*?u6k5{A~B2-WWNbwve`i7mxNx4?_Qh?^~LWXYn(Zzk}bOZuYj>M}h)# z;1B%-ue7hL=e!S28Cl@w;#PyQT`@oBqt>;q>yaV?? zx+1b7w&Di-X>YW%{->;32KvQ4H(0)qV})J3C_xlRPiV_2oP_wNA8s14(s25v6G`4K zCPr&qIpWp{z7YN7gbMkb0HbtJ+$OwEcl~IvSOUJ!aOjYKxl0;#TG5q&{yb`oHz_;E zJft0;G?VkJBYG!mSm1A`|>jR9Jc7c~<(nJx@f8VLwq0{Bw ztdxHID0n{Nvr{|H{G07hp3e~JdS3mc7*k`!zmGox?Qy^p{L>e zF=a+sz0C#3SoZgDedYoSfwyvd@eBTjA?;RoZ=Z=jA2PpHzz^(2n=Jp1-7`nyd1h>f zvI7XZlJ}FaLjR!L2=pl|-$LW0a8ms4+O8fwKgOHbWhl*iS%1@GWdC*MQ+7X)!^OL# z-V_)Uz)!gN@wL;s9K)8{Gst(ce1zjBuuIdPBsVHP$JU5I?i;k1J9<4=4)Arl2PweD!gi z=AFuF9sD&|{DJ9P7yWkh7{yfh7qayoj}FQnC~l~#q_vK77M;a>C$!-91CFz17U28E zdIi=Oi30t}>4$bu@pwH#|FCWKeD!wqHk|+Hc#Kv5jP0x1!28?wb#<`*wlCgq|G8N0 zSm8*nmpm^^q8tx8J~VsCAAf!#24L8|kWu_ZV>e`5C#kc_CVr_`@jPwFCVFFxR}N2M zb{pcMCo=5C@mPJzhAz*dz+Gk`Jl;@$rNJ0ylxSaEpTL~cTf#4rT(1Wu;PjuP*H@}2 zc4}9sUD2NeZ`26Fq;UtUF7)xo!+tzY9yg_d$7|lJaIBCSq6~OmSo|WTI#HLX)xN-A zl6x-XYZuIuQteL({-FtO7iUSrt=;HHleT>q#V~o_gbm5c#qsp#C(it020r45ZN2!Q zKu!t%JYhb9`X+;dR1qpu(glKJe?kvnA#sp=Vs*}e%3U`6%@NcmaB*?XUEJ{*9e#4R z(|G7}dqR66O*>8W^*Mf%pl3n7>S5Gx>ZFSPd`H=b^{!tY?j9JhfKF=M@k%_SnIYU} zeb3u;j81w~mGg84(R`5Vwf$;0Lh@1uZs5In=R zP*I|IBzXdSfz_*YU@cZ&7hfmikvv}?wu^qBaAL*@Jg@VBFENr9=OJ08cO}6y37(+) z@WKR@g-}4}E8cpJ@hgNo&zcT>H$9cZ3ta~k1FB~O!}OX$R?i|FG#ixF`!`ZJ9;ugN z+a-mcYq(MROZ%K{SReZGJJ+-81N?4?{>Abx^fk?*L3-7l8Q|Axb{f-+y54R)9}0pu zGER*l9SJ2ROELZkeyMT%UG&)VsrEVjxw5-t67)V7;EypBGD43@IUx)Iz7TD8$n37w zb1LJpFe)DX;~cO`XXr9fnW;|hhfT~R;cUr~Ambi7_)Ee2i?H7lD6NuhpqB_vV(|)r zTo7t|BYv0;3==q^Kb>L|F6DMtL$7VM!yNoa#Pd$#RHp%I&-({H*o*yAV_J7pujwA` zY_<3;1>&nzw}ym~OZVuLuGK-`Kpz_=$y(V3KFAk#$2va7{A4Q*lNR|6QE&aO{queJ zgBt6AMl$y)N-O^<1p07)X?AGW1>kvOUEYjhG~Y9gOzY)aN2q=FB@b{v{gOg;c{-+m zTKGqC7usJBM;K%oPzWTSa;$k5_{V@CTw?1iq~pYY7_WeTJYbbNQ94^l^<95ucmnVg z%0~K$S*Z;@=Bt>`z|X+`boRY(!Ox&=o=o}=#-qeqxYWMyEJd9;`O-36uQTL9vU6V4 zjtvLxL$Ti)6uMgpJ$S>^Ga~%zMWJ z-)JEGj6W9L*#^C-7xr8IL@%;x-O4R1bs;*6wDG=A2lWssPNh`5`_){;%kRy&$;RJ2 zKA`DVbe9>rw@LSN?+5#-*mxWK3>I%dc1)tEG#LKYpZw!uN=r}_!Bu?0&M6 z<44&0t9CBcju8F>%Lj4kP{47#7kX-359Vv(N$JUVI}2Xm6|YWs=RNj$^hSLb+|LCu z?$_NP%3|n>|K_lKFBMn4NBAPa0i*oOaq!bX|HY~+wm~zF_>jYA(lYmF zmS=npM`1SeQLpVXtl`|6>uhE6rP#Snag_-8ma zOevYB)h3X7s<$ye*d|7_HuOFMAAyVaYsP&$t`{#B@4)9%9(kf7sM#YPzv#2Hgd>LK z|L8{mW`JVB;~Dk0N9$2Q-$L@`b4{IjSvFZ&?D6q@RVd4-VqhYyz68hjR-*oAZwKnl zB0rD!3BIMa+-fErq@O#&>q(ZV zqFMf$bbkfw*ST-cZ%X!lSejQhV?I9G6`NyzL)lJOCQjD>1M_JNmF`~!{YLWIHvcxn zkLmswW4dxoR6w%lFycX5(tD~o^hk)B+PykB6?mvT2S@Kr8=>}9djgnc{F)-W;=2(qr|)qg^-P4; zo0r{N0e)8c^ztK!=Y%%|!%n@89=MtpNdH}H#$ znzl16M24>GL13!c46=EB6jr1!Cbu+NO z_;p5g#t%ckF#dWy(JvjSK446(POrlA#`1N7QQKsx>Kov7|L=Il-}nax12je8XR!Ps zPQRvBQ{EUq7#~TX;}eDyRmt^tGGbdu=49Y^uzG_&^B5(0k>g=JGvhXzQ|k5{9oof+ z|4^TmdZc_5|BxCRpF#51wv$y6v4ilFsLt;H(G2Zuzsj&q;7zYgm?XMI{3IgbW&(fJ z;PsyQ=%3BHjP9_OP$M0f?|JG9{G7(rY;FA(`28epL^Ap(Wh5ZiIl(rZ3Mfz4+cKJ~ zrkHB~BxyKh@KOh$|0Pkg6OL3O9@;m~%NoZI9a`BL--Y@j0qZ>pev#B1-xG2vtdkB} z7?g_NTR(N}>dfStTB?3+-9fx>-6jbYxC?A4@r_32p0f{{xD0YEVuU`pMJvq(9<}*~Y4S zUH6FogYXel%hEENjQ1EGAJ{M{B4UrWw3Tnim8>a&{Y^9UAS^x#?NL<3YUAfvZ%F@X z4lKL9?5@Qz3+O-C`9juX+ap=!w~EIz>YJvqenjA3uzDn+AVko%rtKT(M_9k&^vu-n zzqpE4jVYPayoUOSt^dmiRf5bM2<)g)zZD_Gdqm=i z>tXp7uWkg}jI9sE`D;`$dq-*wwUzX4^8ps0*rtpjdO9BeNYafjV%M8J96tkk(5Qkf zh{vn0kK%*s?XJ;^Xu9e&%YVAxTHmU!SJ(fac!o5656h36Y-PsnXD75-Uj6{}1BR&q zd5KdJJw1oLzjcEA^OYgyvTQwlzuyDTjxRGF=89Rbirpr=u6%p z`s24k=lXu?uJNGS|EeK;3XA@j!B!*FO0}g9r(r&bi#VV1 z!bfa9O~mKwSPs9!ewp|UFs@bVjBW$+JC8U%{)V7c83FaqgYYM0^%Sn6SPR4azJK%e zOU~t&a(-8%{s1XW+NLR$<8%3V)3sYsMwU$J;&!$^gNNG!*6)ho9mJ2~6F*ECS80yk_f&b9-?6vOl0_VC#!mCaTgC zs`hsyo?<^QiWK?27Vu%f==n3No0K`5JfR0_cV_FCSZox;`l|PrlJh6^TCC-AMRd#) zJ@6-@htWh&j+v~V!n^^!$z##q8pUr6h`#iLKxTSqdJBy!SK3SdYzuW0sr>nRhZ2jK% zmDcgXBJm?~KZt*#MxCB{`t0}6dvN@r4cf#ti7tCZ)M$Ub)AmJML3Y7Pg5Qwyw=O}w zxx_V-czk20c87uLrr;0aIIs}Ui$`D(H-7o^Q!Y~8LVeoN>(RJWM0aDw6an92{Vm3v z8nbgx1hbFF9~{iKd2LfWMv?nZ`~^&*y^r7-hY($C2-^34+-k03a9P_ePH4`FShN z=Gm&}tA?pH&)E1=IUwC->n;@2pC9VJi}&aKdPH<(60?P#xno-;@QqxfU!(XC{6Oh_ z8%e!Z+kQc$x%h1X^)&SBDVD$=#4fgbXZ3BN{&3qo1$f6!(++q>q26)4>e^e#Py0cu zLG&l|S^rP(z6<Mx>E@s zhnR!^FA!S`mJ$3!yI3srHffd*NMZ!GVgcotXznC5F=GXLY1+TaJIN*($E`zwJ$raj!l(E0B;gsM!;zTr)ciUvU&HCf5x z8I=We!7u0jQ%X%b9P^Le4D-F|gz0;{=)5Px;3sHKweGkdqVr9lfoBkYMe0Zf&$Wg;6FWYxVtffF6eYIJY5RbF6!_^?%-;dYKd#s{ zW7jm)Z)N>J`}dakObnkCM)W8IFR^|qX|h(>$ocv|ez9rBi>N0_@I>MVnzAqMzWjbD z!}FoyPM%?(Uz+%B;P+lDQ(mty5Iz=%$4yh(hi~fKR1N%soUcYCn>N+3?v|F$1)hP= zkGo@k$LFV-Lv#fELUH`irk%!9t=X;As9t8Vvu7Z73x1^%|VfVOjGUb>^>at?2)ruQuf@xMPlbCp*{gFf(aAC!DN?IXBc8g{*)sIGek`?aT0)2|*1s65w1_77q1E<#60@fk5t`0Y9WH@@H{WL)36q3;n}`6gdbIW>UdQY0=7IN=6-_oQa=j zk*OPHG${JfpQ+)%8~w#ueoe@KYQ0qEUyypO^}Q{ZZyupvj%WFz8;w8RyR3&FafN+* zA^JP4B=O?qWaFpQM`amAZz6#lj`3lp)7}f(Nq*4bxp*L=VO9jn7%xLsG4_%LW>lZ_%OUtv6otjBgK!Y z=$*`9JNB!_5aXeqVgr@v@XQY9cb>UsYV5t&%HkQoYj%Ga|B2E%S|WWFet50m=P$U+ z@>{{Ltta@+DvR>BZ=7i_0KUNLPaJm1{BITa_Wq4O-19_%lrM-MB8l&Vt8O>5`2ugQ ze&zB<&@b<_-ud_Er@kN6?D7SL;}JYWC`em|3O3LabH^8A^4$_s0RMmJSNeo__yjTYz#osFxRT8xd7gRwN*M$t;A{MicR-GS9RSVqGh$@*QLQ=mUf>rb zSn?Wq6ZhlQ!x)$E+11pr>*+WSU)lGlqB6Py$3uL42lxc`C;e(X&(c(m{~$6iVC#+0 zKENCBeysuEwwJ4j0^ad(JI1FhR()g3FzN+z`VMQG3(FIhmo6uG19=}{LxL3?Rp~KV zu6K6fc~-8C=*rL6@p#5URq!+R{*L-zWcB_Rirws9;txUU%g&fT{{yoA@_HAMKpf5eOcUg!nfO&+F*%S-;I$ZR@XG)gxc5>}Pi z1pkS;buN0um(YsT`wfQ~X`6MP(RknWx$RF@HzaKo@C;Jl!L5<%@P)?^^^!%g!Ug_G zeQn1dEk8Vt-ZL(E9{3Y(IsTQ=oe3lK!D`Pk+<(8OUENu|4ZYOeJyVH)LU4!wPm()+ z7w9yfx;+<>zqm&Y15XuFhq_eBcwT(3_+E}`xiEr!eG!>gEu`Xbc||nh--;VLA;zC` zKtxhrjgd+n^T$aWT%SY{sLg9JQK?g(>CmY`5WW9vImHhqx#y3XmHNLwrK7nQM|#V_0j;SiNc>8On4psm1lu&h#YS`ts+%?&z*{yIA1mn)7JIMd?JpaoRtfz{L>$JOB0aP`Y#`z;e$OQt*ONb{B6u)( z5cmoBG}la;e@TyI-tWQlShwC2Z6+X5f3$RI=@dHHr|2N&3!xhrlojxcy_0Q`FG2ny z)-NZf3HaH^*;!qvk0K1S%U;!V*hqhKqb>~lBfrM1?#3P?LnmKn{Vb{`RxPaAdhb3p zfqkAdehG(;R(22fQ9kkP^P~uKiOARAF9pAV@CP(L_WIQh}I-zR(#VTDLXka&VRGc)+@#yZPZr>UaGN@ z%uzJ09Z04|{V!Z4af(9BPqdc9+pHzAYT}2*w*!WYhxMgQDe9jPyhY<90bqN)|2U6d zbm^~dC-c43dfcBx?{@p~*K9t3$3qC7x3L}iJA&U~KK#U16{}JW5kC;l4;0^Bp*p^d z;5TG`>Qm6T4F{ z|DHbWT@!PUIc9ienEU;$ty`~5;p-(>h6JA8R0Vv^@vr=2bAh*;sU182ZPZY!IX}dz zMT@R4>Q=&$p5p^Zo-2x!5yh^Q!y&f*r$d-ZwcG9-`0Sitz}h3BM?(ts7l41w)~k3q zeoVR&_04#Hg5#_6);7LA^g8?;7Lxov>c^RXH}SYR;ZsB3f&RM=e}bobdHsY4>l?fN zBi|uB3j-40q++PwmvjeQWW}}-Jj)&5sXZF{3m(sS`T3-wPnvbj;77cXi2JvyDZDAW zwZTa6nJlz7Z;LU+V1?!J3~RCs_1LeFN8X{EE71>d?d{;2Ugwoj3FJdr^zrwot1M%}d1i zKX2MU5>~T2kHk*|e?q;Kj9X5}H$tDn>Vu3E>y^(likta*zPC%CYm8qqU-J0UhZWn% zb`9|j$4{8v;n+Ss1AZa!zW~0$Si`F{PFsoo;LfirZ!nKNKaMZJI1IQCxId)I`TjqE ziYEtd9k@!4e*x#yXMmrZI$DAIGlS%d9TH@a^g5_`Jx63a*-wHWIC}h3x=T8CeR{#K zP-90~0e%ICAC$Rq`yKxLlAx{7!q0;LeZQW-u2o%!dwG1vx?fl?O0|xJeus^xuGMa= z_RVunM}Mtb?%$GMVvG+r}&Sp6&dgYCab_0~;_f!Ra+@rRf!CTr;X?|J;fqTl(3bF^~+kB6N) z8**k+^%O0|=}{Q##$PkdW=#gqfEMNPp7PX0hi}d%5Cl z>{e+m-F}C|qn<13Z7mMhrYX!_(|?J?l6XQQEdZFUwni7m?(d$Y5m9* z`t;qo|AxN{{7WNUqy={Ld(mfK{t)~tcQ4V`Yx-`|8@m_V6`GhegOYHe#9Ba)8Tet+ z4#ekzJq|s|;9q)1N-d@U?-$5~Upe%xqb$e#AXFlrT`2(Ki+uB`GCQJQ_*iuFXkRb( zS8XC2N@!vx3YRTFMAwHh7PFV4EpS&R>h-2x`p(ZRp7G1^KaO`CHy)=af3?ap0r_>{ z8T;{~bWdss-(f*S$hsere>q33c{-2a4d*iB8+WyyFw(?76ZgAn{SROK@SX21dM(Fa zuuHR#RbqojJ5FTz7H@@mhJUhV=ZC;6Um~9uN;A}*+q$>$dJ}~?!egJU^yccNpJKneaG{EeZydn~!FUHBO3(6bNBu_cFemTFGEqk0 zAME@l5sK}^heG<{=fSoQTrIj>qpeNk`A_fsJmcrBcp@lA4lfg(6#gds%j_@eiwP^b z3a~$xn?(r=ZTqQXpAIPGY$;Wt?AN2eece~9Xy{wP zZ_spn7ygOV-_D=@=tc#}AAeS?*ep=seoS~Ux!D=^Cxf=B61hN3Q48*Lt%cvX^ecy! zWSk$p@Xpf%&_fN0!|bdMyHL87$A+vK=5=BIS`)@U-S_i%L;qwLGoT&dbKIxT+tm)? ze&G3W&%A_qW24#ep~+}R1y<>C#k3);_~dxhvzd2q@^=%1L{y5hJ|E{33BFR6@lp@? z*zEr1!z-?v=e+Nudd<}kY2ku%W0uznn`!Jzz%uHdZn zAcxiuW`|3%rGKs9ykU%&~VNVPQq zQCs_7lQ5~ZEf4{%9WD?V)V4qfXsxYG!MTh^u{9zB0h|#K=YcUeyh;@`Dz_CGBeYc+ zMf$2T6JBc-8A85&Ziwx_YklimANO^+&b!IY9nLxT{Pu6}{loE|iVIVj^?&lXA4&Z3 z#C_2BfG@%DL2Q0RhLhx{72tp1`E1>K@TgCled9RaME6`1NH6x$rn{K@e6mH`zuF$4UetJ-#Iqk-VE$B`W%OKIDG+RkKIH)L6a4;N zSGFFXnWWE$qW(sFQ*%o*gMVOtWs8)`2Y1N$1s;O&dc(@uN@|-l(Gc$vKX*mbf+p-| z&fmLQR1E>bA>b>_^}3%F>BJc;hLGP6zx5H;Q;#{%d0qT2I(1FM=g)yJ3(`7?yK|mL zW4v?t$=MH(V5OEl?npqJ%~62PihSv0>&`U1|Je?*taAjvdL?x5Eanf_sj~p}k7Zs@I@+s!`L0$!Qg-WDe zvFkj7`80ME`k5;G5_)f~jm5(;dG=^RZ&0&OK0TwzHvPY2&<_O~ZE(L3KsBZXB%r@q z{NO8Dm4W-$sATvRu8*kBU41zhr~oCyw^_Q`I5br0I6~h`bv}ysIhW-Zpi&Lh(T7q! z2>*g@RJcU*h2{i(FO6yQbKOf53Nw2t)VE2%=RdPPV)QL*O(>mJ z7xLblv9V#NR_D%tTd(KJN}ZSh{DPO^S{c$EI!sN=zfbrV+!(h!aToX}^|`sdzPR3` zkkUkg&()bUM&o($k#ETEyMuaN<&DJ{Uk(+H)mQuAr;!5v2=1T5^00IH?aeyk?@H>! zSS`|i$;1Oh&x7yFO|o2?7xpf~^Jd;RHiA0%Pk$q0+StEM9jA_!MFNj5*XuhXC>hl# zx<@IX@4)dbOUjqB9ZdaI3up22XJwaX z!jE>w_oTn_1Q|}xh2>P5y8?c@y02}_1)QCJLv)Q`P3uRPe;v`|C1u%Eja32kn7Yp; z=EliZ1AE|qGUGbFZ^~*@wP_v0a6CKGW^-y%we8LI@XKNL3q)QX57+B%P~Lc-;(E+X zb}4qL6YxIKw~g%=Mjv-NF2R1Lznii20KB0MKPr|CIea<=_z13d0_*xx(DyVi`5B&l zpK3nU)EV%Mr@neWW5f4J{b=}Q;(me;g5RIuw=STjuI3!iQm@ysDjLs^jpG{_4~)T( zfv*8C7G|Ssz?Z`Bn;K)ls7h3Hb;Tgj!vzkxH*#~~5BeJ27~z5WZkXz}Z?wNcQBw~r z17DW=oOO#8$)@OD^^`sh)`x!6UFY(!ezo!MO~n1Q=$5pkUE6q#>bj&N{*kT~AswNQ zr5*H>14s8bqko0)f>|A`ThwFm& z20u%FB`-fBDk{p*p2~`o)m(sI*f_r6EVPfd@3ikke9Y)ketk{DY%lQ)Y0$`b@NgpW zz!j_?DNU3zCN4kD5WiWJ!eGL(%+gRF_Tpt17bboi$0uBeSud;`psEwz~=}$&soDxVucvuUEfi01}lAv7$K5U9t{H!n>KXAxrPwsp|AAp`jIOPiNAG03(rjpV7Fl~mP`%NXepTv)(M3um7hWH0~9}-&N|Bdq< zs+XzN%QV1S#`z0a|Kbc1nrMT62C+}W-%CH0RlfiF`Cs?{Ww@X9E|s!A8RA34gM{zy zP2>IP)wc}!WyXKS>QB)hoL*}A2r3!#I;d;{+Xf504w@-tf zU~nn=>$WX%+nM!k7x*4H-+4U0Gr^s!QE&5b?cP+KZp%^EAs!fH)E^1&aN!@YVuWA8 z$w9qVRvyjv8Iw=vSaK}6A3IX?FZL5qA3{9L--X-5qTZv9zjy_B1LCPPr}k9pe|6u! zIS4*lEMH*D-e*Huzi5%-_{MH)tm@Y4?$A%1k8a-%{(;uP-`f1hMEb&|^RK$&{ls5x zd}D>Kj&gHVHThqUr_zn0-tQA&msfhOy zqW4djug5>uECzldI>?$Z4Q(z9j(6?rD3RwWa{k6U*sCp9zvV+&Y>63zf5xG)15oUN zFHi(L1M8Fjmi=(^%=sVA)8H==JR@q@HOAFVMCuDO`l-mY18JG6L%rZbFnW)5ql+Jy zNNq)Ayb`~S@8u;Yhs%b`NPi~$2a9xJy6rCk2TA`Tcmt5j^ARnZ+o(eQ_rv-Gqei2G zQS=uEA3S&DkG3CmKQj0l`TmTjYbr)<)wZPFd(Ho734(W}T??AiqVG5r+$L5aR)W94lRWq1=kny!Xb$- z<V-E=%!veycd3WrV6Mf?P>MIO?kyoG3%y*4`zCSblKb*lcbgakL_clwq zKB3N^nbIu4`YIO{O1p!HX*!=W+At>n7t5T-a%DZG-R}BKn1}Zp+nn#7RIR0qoA#sr z4xW!=WY%@G|IGvU^V)A@yFyE}ZucG@%Dx+hYR00#^_vyTALz zZo2R1547(h{u;gdAa1#rF@0wFaKH)Z%PV(|7TmeMlCr0d&jx-0eMm+y$tO)?dG2@> zdZRHEbQpksWJmb^MQ`GKf_aC6n@}&uLt!x=>$TI`#xX3{2k838mFc+OK|P7R1$|fh z=<3i)67Nf;4nkpe`Y>I+tMM%EpQ(>9Bc=Nq>REsfx=E+=t2k6$QhRlTtiK2!Jup_B z;ny57ihNH#sc#aIA7naf|@)1?fujeeSX_2Q<9?83}_7bYKQ8G z>WD(YcB)Drzkm45R~w?0j?h?t5&gpe$aMKKO7u@W0_#b}U*qVCj1>n@M4f=2-#{hS zvw>oXA2a_<(&HI7CSL)f@t?_9f9drpIiklDHX8mK1Rt@$YU+30@49~;|1Unr!_qzJ z3sQLIdj7%WNs}1A$^VOIs4M@!@C*Zf;SKpoIW%8}wyRnsT83>L&ycV8U?s73f$s%> z27>RfjRZ!OsF+0|K5E7J-c`i!iEoQUQ9>8PzkM@%ARyllUaxYAT~or@_x4>vd0-r-?$e+l%NyNZVD! z5=DEe(hT^8%OmJ(G@6eLexLbyXY_s@`;spvBc3ApEX%aTXPvKb4%lSRLPEG@_f=*R*tb_jm>SvAw^vxRo9HFK! zVe;`7Zu|ttE23e_GCv^Q4D0m_*ZkmS=;x;9NhiMxy@j@TtYM(Jj9OL|AnpPFkmp(n zMZqZjQ;)|Z#M42&QGFSGC0e>cX`2pwWXb4awbf>J4ArnSU_E{>K@IiHgIi_rf9yCi zg!nX+C|?eNkX8L%J)TeQ&jP5kx55VvAeBVik4>3P8^=t5%m-y6OA+yor`(vTq zCELs6nS#v^3NiLG@gnh4xT5O4`SSaS@30)jc)rD4&xA9AJV6x89{sJ7^apkW3!Cv3 z>J_Oe@%xkvyESnybE2uqOP;R-zIAMLSBqb%eG)ZuO~Ws*jhd;PUWD;w z%(WJ!tU)_-eLyAP(%TB05t!7t>ls^F&YThlJklJy>he`8_6bx2rHwU1Xc zea~~?5f?AqZzJzx;s;9b3#-!jo>FaT8=bW~AmR3yJW!QTmY|9+<$V{pXW}-kuD5U; zkDQTaOFnOwC(5HPP_yX(?}~%K->eStnpXD&^-;eh+7SO%hbq@5IL@N}O-_TDJWsfH z?;1@+eWx5!&s67XqLi|DtUlT+hm0TaC!M(AVO_&`ALid$Le^s(^T0L0x4bak+%TWB zt*w%`691t@X1qa7XthR)_iYONGSHuv3Raq*vmTg9@QhoyzZV@K@cZCr_$^K>D1iU-8Pno_<9WI9 z5+hr3v~&_X|A;x>hi6RE@J5sBamQqXE3x2`#_BJZ=95~u`onGqR^xGSRAG_GP zaEMfbSR(s5u5aWRTzkTv3K7d#$#P(Ys(gT5<(kTl23Sas3P*3HX9b z^dkFhR0_ri>EGL-7kLEH7uFldC+OV&bRFV954wVSVn3B&KE7C_WcY%(p9~+Z19%`o zjLG|x`2QI6h2VEE{G_|h%|lH8`HP>SCKV~@>YPq;Kda|eEQ26Z#5B;=6!V}0R3^`PCGB~@a9Y1jVO2Pl}_2zHj?qgH#&$vn8 z)85gMc#P_yY%`bc#rc0I2sBDH!v4-nwa1~Kn04RgYPRY|36*z=)O*#r((rQxCPQ1t z%t}K43sN7@T&eHANavZWbFqJ$b(Tr@oPq7UWu1(F;b+CK=-(f<`uZJ_jgtF;mjlHH z{6dWCtG>;sznZW2*Ot)6bs++{5;}Y#G7)}$;)Mz%f8bYj_1+@v`x5&%jCa5MSpB$ zH7=HU#gOwO@!H)L2P|Re;Y;W0<9nCqi6c5K)^Fqb1y>E#BSQTpCZ5IkgWsrjT3ck6 z0q=0R)S{2?^!N%0#->2~SrG>O#aHR0RQ9}r`j+5t;QR@GWiMp?$FTn+tQ};+?GYqi zhhK;;5^x&fCm7nSZWa;<-oK9XP2?tSZq_yPdgc;+JmPWrN1euTGCc_s#5!Tn?W zHCK{gJcHXzjmN{YEJ?j%9qPg8^$;ZA1q4B8xL@9nMUOq98Kk7}%Rqll)C8xArB0}K ztLOK`3VuX|lI_s@=)aGAGTFe_7_XO#{2Xo(iMRFspLn;B^_U@Emw$u7!tgT;{E({* zKZNJAX2BOYf5Uh)^f&FyikV5%7qBVlT?igE`QU_ul4{wgfq!yx9{91JK0ZP9{_&s< z^H1!x$d;Jl&7+3?$(ERjKNc>;{h7Ud8R9c5zLOKPUVKIV z#{l8Wz%RKt_x+p9=g09XxeH#WAM~jW$E#g(T0ed|%^5w2Y+qron&3x6S8a!o$05 zwC&SYjCY+2>czspN=S|SX~eJF@xk*Csy?Q2{1R=gb-oW~kX3dQk6Tbqszf)FfEBN`h_s^{YpJTNV%Z~6l zSoeAV_5r_a)cy+MEf)P=@V~f=a6Fb3JJo3*jn;g2{!J^4M|YOMhI`SL%5_fLyc2wR zUYg}Vnx>Asv45@FkM=Hu~Z_t9q|sJPg|3=H9ltPjlEJ;s^Tp=C5VX>IduT{ehtm5l<5= z0}KafHpB~mJ;AspVva&PqcDB{P z9Q3y>gij%cKOxiKfd4Z5jy0?`EJb23WoNnJ0`7-*XsGD>iBBg1Ut#L2`pPA;74|Dx z2EInh@$YZ!?_J%?`$c~~x*kXL0wEZs5ru zT*33d(R-=)%E~J%>2UDdaQzPF?9ctsSJOwYv3N5N?NyS13CB#^Oz8^_+CFovKSG_- zZTH*#L0hpt=Yij|8r4{D>zZ^ltI>WU^cw7RPKAAU&?qI%iu-ai;^*!b-RSwk<@A8# zdF}gne!w%X_Crr{!TdPkBbw%3(`t0^hX{Qhw<%61Un*pWIOZn5psWtJNRQzCaVTSS zM2F`cQK)^t2>e?k5avVR*J;1wTiz_J-(&omO0@kt%5;aA^RF@88HC&e-###-sKWm( z{Q&3V=a!lGpc#DF0{;yX9qQebKwknrd41Sn!XLH@rToQ-`D66timY2`+i;Bdjx3!W z{OM<)9-I7ixF>urgnyqRXGS^JAM7A*NQm@g3f})rzHg5r>0e*Zx-kp*MG09C6piML z=I4X&X}Xxi3pzeE-%T2-SqpwgCt1%&Yu#GlP%;X>YbWAiIosG-5_0|ab;>MQPq*YzRx92Ya=R?kkxgUUsb!&EBRHR+&B;k^TJTq2F=+xH z1o29cqDBLKJMvTIxc?g;tQq50aVronRJI0#59EE<`zP;+7!p4aJVl1wOGIxp>bE{( z@EGn|(blZvLnr^j5B|MyR(myjF7mMzv|V={Lq7u<-do;3M*l9ny-`($$Ec!1uuCNxjb* zl`|s$iDytLomjDidwKw1Ykd`V*q>AoXySaq2i6PhWo} zTKE+8AfJ->i};mPqxwR*`mq|nKiG=r3qKF_58p&GdK+>)!XHL?Qs(*zf2Hy6T?UUN zdXuJSf8hs)dMOu`7smZSO&R>;Vu2pdAoW^^f9Z_73z`-nzyrR(;0Yt81*gb*nD?3< z-#EL|$A`>cyw?;A-T{57zQ2Osa0}1FUF0hAj5(?WzlGsD&k#Bb7bI=aw{bl);Qzjn zTecbdna{&+NN6Em_?)y!K0R!@mZK0Ds9|6LV4c~C-ouNZi3Ar zRY{|$2hn*D@daP(mK9r*KT5sYJ$_k*4E{n6<{_fo&BN5x9uKP;_)+8sSMTZt9(%8c=vCyAwTbmrb$#$dsA2N; z?;Wx_6p){bLUUe}>Sz=-*g>a@{4# zg_vK>ypoT;fi_Dh%07(wrP?$3DDEE{^`^74bq^`;yl|BO`9q@s>r{`j1#~6i%>dwG z#&N=L=kJ?OokJuH+V$j^J!g|7kn4!Af}tZ*8u)y zx~o>9?%REx2A;7E`)!W!Dg}*HCpCS}m7VZE@$K<#i5iO;rMdZ%RtNOYA)k>5;*WmE zq;fs3FL^Y$#x0D)rmB-<7%y_*<^GI5sTzK^MtJ@X?qP?OZDa5^4QKpC(O(W<1746e z+jD&f8GrtZl}FIumU!8vVZ7L&p6}5u1Lw&7Dn@@Icn|z=(TX+nKx0N^V1Y z!C&KZef-7f(STkCcr+$ThjakJ&rQ1Sv(*83I1_Br}-ySsin6}iGQpmJKW}a>M*|l$n!4dFD_TWUTy?^b}H~S z^xyV=MVqLJ7eU^KWWBJtQTSuDTJ|UK4F=Dc_4^g58FkPzR@axH|1SOc=O$+TIF4r! zy$IQ;>ccu>)kP3rZx(Wvp!W6^#|pI ze3ruyuaWaTE1f#e{jlE__dClf!zJV^H_G% zei-7V^Wes;R&b;SzW>T0VKXN=L*j= z_e09~JLp!bBq}lS55@f_d=T#>>s=-}wtpf&%;;I_HCdWyjs2J*e(xefa;yBMkc?Mkaz}gT6%UyW$IGy)&*yDJm@N z);~YJKPd1b@`ac9O5}yd7jm%Cc)mp6Vs&4z6Bws}#Dh1`-v>^hT94$U9nl+IcEj~8 zj+ybt>%YBD^!_AY?!r0BDPxtf4gRY2z0U^8?-|ZtkLM&P4Eiflzs~)8=$#528T}Gl zEDTew(|rK^jHx#=Bf$a#zDa1ncZff2T~ys)cm%l0!h~B@H1H?*wdmGs!;sHJyfv=Z z3PP+&RbwmA>thz@N44Y-efBtB@^bzCnQhb34EW!ykG{){M~r8}$J**Cl3A}Oz4%8%E+&*6Dx-1_E!vB=aUT1s<3q6yct&e3?$?3&`{y5zd9|AE z{Dt9nvE7BHGSAkPwB7frcSYdG|4(lQNt{Z}*V>)xLIXln_ z@3;SPKYa&&9BU7=-E7!pUUXhb?cTkFUms|7am$@HIxkDLeJ5!Ptx}*%pd2r1EgHvk zs|KZwqFwA@YUj_VOjw9VId+_7Y`Hn*=@J|eqtj)L9boh(biwy;lm23M4|r2|Y&V5^ zM0flUAC5(8R$uhFi2A9cXv^Q;AzfYJ@f+$P>G6Q2g^LT%D+hYOe_-?+E_fFZh7nEl z9XKB8%lO+v+c|x41@DWniNR|VZzkNNF@DK-oIPSaGUw_iR~bDN)_d$=LB29h8AtqR zh#rNllHP;^H}p>PneRWFlw`}>$=XR{d=WgtbLixulYf2&e^UHD-hbjz2X_lsp*zMm z!_RO4yW99D^OSUl zUSH+1z#&118d6lg^KMfAh8x1oaBqS?%lTVh{Okz6OAt4m*Wfxt(dTxcelPeK#uWP? z>ly9UVkAF|``4P@)-(WqamT{RvP|G1Mq91VZyC5w=gg>;?!@~(B&1pi#R>J^rHz(& zzI!~}jm`Oy!}K4C|MpuyCZA@`76@YVw3PkojWZ{sKROaV2kMi&_3QFUuVMYwT&>lN z;rlGb|K10_X2s{Y*=IzczpnZHDEwXcd53y?z&D`PvuEta^J^WbRojMHaA}Umi^3~d zUkOl=urhRrP8D@-0ew_NFBtPOy;y<6grtJ>a>-$1WtI)P&yOap`DSIpO^=MMxknkaNzT&0Kd|s8q;0ad2 z3aKJVmqb9x?dG zz6nK6DiVL2>HRDYc$#|N*{WFve4!I~hAs$RprNRN3VfmS5w6e0UYPJ`@1u_henIe+ z1JxPojJ13ttk0Nyf5P(k<;%HcT=IE_?*M)+EZCRPUV40@b9?W06*huTkocY9`yoa* z96uS}lU;ig7C_H2kcD^ve%|jg?-O!-e4gYVnD-AC^;WRofM@)LSLpE$L%UvYuR-D| zef<+I04)3&{4hRd@)yDq;0JpA0$v-0VfYeX0RN%9uAI?_JizmEfxZiyj(1Rx9~7OA zXV!x>;ZNZCg-KB#1_fh*cj)WKibSXKdw{Q1gD-*mXKEjq)p?@s1o#qD311@r?0Ei% z+<#o(lMAGpI`k-$aKF%=ihRs#*m#_O;5DePLhy`RKe)2V{rM+9!+>vyeYp%i&pV*U zGtQnG=Vv6B+dbHh{+uK&@OVD)xj{d|mLb871Q5}S5We@U%M#zR+Ok>(k3jpXDstqg z_GB}K_>#njq`rhIO$EIR^4*xfs*Piaq|=42()%&G9*NNazthm3yO?-%<8%I{;48sW ze4fd_!Y{RkRcssqd?8=81nZ+bd$1S%I;koTyM#9oujlzy`E|n&=Z<&7`z^?Cmj<`Q z^k$6G=Dmw+5$`+rCn!rF)avMrf&fzQV_&aZ33nGOiteDN_a>(q@wa(}wYV)?$J` zXs9K#0~3Jvu=$8bN&Knq@mShG@F4hKwAPH#KD8dif09e8&8iWP`t^DkV?Uddq)@96 z&+SihHhxI(p(8GMfA6L^Pcj~1eQ%H;*771oC__^S32aDCIbozwEaRiCG76Y`IuKk@Cu18;28Y@wHicb+lQ>CS1RYh1JJW9eTiEQ?=9 zyvANvv-sx{@< zM9}Lz(c>AY^~sGFm1BLw_!&K6)Lg%5fM5LI`a!@mvatRr`$ehmPiD9E{3$ZH{$u|L z>zzi%Pb4F{adUGC^l=lrih;-Qy6r0+^ZatDS5FQ4_>JjeMuK`M)X$;ljvenG8j~CS zX>?#3XCaH~`|*SSBEEQs^*(!}(Mbz>{qGx|ysMM9*Wa%@@G#;5o%ajF*Wfq%OC&bn zvyaz5;Wvn`Ud`^_Nbm)cFLn_~tg?*G=&`&D=BlMjG@! zd3t`k_;ufG$?=Rf#B+MRNd`CDvQ3ixQor!vi*}}ejr()TWn=|W@-p6gPbPrFl=>S| z&yeIFKYoAt=j8K-`1#^%1wG^OrM{jh>g%fC)V)cEeZPqCOD1-32SbalZ9_hi_<8D# zGXhHT<1TJs@Csbd+kS$btlxNyp9kSDOyVyV92Sju8SsURiLXs();Ht)hxdgmEmW4; z4-I(0_w7;bvF*NE1K!bjv!wTC@8n*?_k~61vE+Qm^(*zC-1jGK1D@fsKp`v>wvqa= zjGo11M4>I!CbSyxi})ow&YyaC2KdPQWr)Y+vjkBq4#*F#9RIxh{Sl|jmiH~68SsqR z!BT17C%>8)@E`tg!Kiw8cLhDCxbHUbkf3azW^T7oYv6a>)W|fZC5t-A^Ca=^1R4a2 zD6IGNc!zv-`)aN9!MZBuco+|+9pNQeSF^IIZhbrx-GlR;neYUsoykHd%i z4WG|1y6_S6`7XVFgw%7zhI+30c)w7S(Hdzhv{& z@tNZjftWr!f6*q~FYZ-eb!dNP+e`eS@0-5LN`c+q#=`+_a|Y@izr=ThsBo;HyY%`k z$*_AjH_sy0;D^C&S^Z!~8~kC%@9z)lDpddLt25|@5{i^PO#cek^I>lHMQH?mc9jOc zMp}Pjn_{_Q0zIx5Gq$$~$yU{=NW4n;G+8H$7daVOu?+F6Yx|D92bLx*0DoyD1MzwB zTfY0a^~GP&`M+<=#r$*9t9jMXznkBr?K0P&z0#|2{EF4Zl;<-%oQAo6^t* z{%oRNuc@avZe~B`LEk&f4&kx|M%0ek2Xas^VmkC9H@0H_XC?nfY!7}O@a!#4@TZ~6 z?cFf{1-@W$<{NETO!0PXA<7&TYRI(^~kq|Y7falF4`Ve?kobmKq=TG!fguiin`w~x6o*hNQ-{U6c z%Ph0XFK&O4F@^WDo}Y2{^bbGi=U2U+#qz%3vU#FSDf$yr@4I*2!3iihDZuqG{xg$& z{1Y2m8v23fF#MvgXB55O_IkS+-5>Fc5sJw>HJ*D?B&jDVWyb*h%8r=Xd_1oah(8{xR#0?u#3E~w?_lx$Hluzi1>zfp{^H=6 zm)VE$T{CIgJkEj@Wx)*0}(xo#XkZaV)3rIu!T zrveXYIosc;86Keae`ekT{*eVcW=*MjWPsi`us?DQ>NBzft#7Q=9ivmH95~EFev2DE zzi9cuHp)D2#^H~~2p(~|<*LPw(u(w)V@B|;J zQq-tghyFr^CY>Ecf1Q-b@H2$D;?&lnkv8BR#9u>q@#c~1*Hi){I>oq@_!)dP=p;1u zVezO6>%rnEtjC5A7Zx2kznu7wk(&_49B!<#u!l}HKHQ7^fpL_DZ)#xKa^At@eIy_A@ugq%{_pS~Ao(G7 z$O7ZN_PxeTe2L?|KJD1;wrt%BO0kQ<#J4UoxE%QDe*R#k_+a8W|Dry|h zFncblNL4D=P@d%s9v3c^O4n!Zc|qF5uW@C9Gr9m6Er~dTG*lzPnsh z?v^7s$K!bIOU8VcuyZbxPv-6SWZHJ$eDf`{UPF9J;#IR4(->jCtcN$%jPWlR^#6wO zFW^nB-V~k-{Y~Lneg3H0b}-c(crNkN1V4h_*E3-<;_IN1NaUB}N9pNHJyhUJWcQy2 z!w&lEhLnJ`|3XhU;y>ir!D*lmTWD^P4bhv(fR9A>2DQ@D;dg-X zb$&3k+PxC~@#(3~q~3)YD|~b9HQ)pOMb5>DPhFFeda`=2_0#v4dPL*?IP4NvU9P%1 zLeJO`upXaRm0e!2Gup3-3fK@3jpK!|L@~0g8@-fdnUv@YW^rV}MM?G7=xOIXz~?}| zUm;arZ`07?a~`+wc^g*t7Wi8r-aHpT{3NHb72$Wz;r;tdkq4<~!FH5olMFR=sECO_ zeXo}4`gHKu&eZ!eY_!!}&}^tPrDha8KZx&h{XMcI-I5VHv-|#$ZumW4aj0;B9|(0I zHTzRzu#n|xwAJLiCA}nv!Q0v|{^xvSTWS}TvWwYo;ovB8 zKa6@b)w}YG-$#F;;EJ%6UmEpo_POGoM19(EnXISwO}K8?{yFe+v2=n8 z_{Q6;}Z%qX_GZGHvVwpKALIx-rcI{XzboK*rzd z0zbDIyPcz$3}Gh?evDz$D40~-&Aw2zk942^+srk1J)&9NRHdKo7K#q zZg-jVts?vj$>OW(o-x|E%4BpSd0$E-%y@CD{Bttizt}IigB2)kRQczu?RY zmB1D&i1yi3+J8DE*GN4x7xvrc+NG42O@}+i$DST(cR&~FwWWa%xC#6_UBaE!M^|4Z z_yy57Cd4bS?c;)*ZYo20ltC$9Eto$1jfie`5AQeV`jcS)uP{C@-xT_10Dc| zb~18vY zH;NNXO`;`LuaD`DXrudrTYRc1mXm`A_`9ydyiV3_Ryy5he&d;kPUoX_=$_W;RY5)R zYyEZ!*1y{5rl`osyNGYqB))qqdaI;t;fZj>KTLgB;ZXL~?CiFqi0=rVA@@anoVMfH z*;wB)^+p_`jdG2i80A8*&+s=?H{w-0Z|qDn#B;IaeUF+IsL!|Z1nw8#-*<`cmq8m1 z`E6lnNO(zj+4`69p6?3oao;ve8tZq0pDYr~0yW?0PLlOJX`i&t%9d$xyu$P;H_?_i zZp&H~{Z)hkUts^rDlRU5w2gi;?%(-h*Km@y>Lvcbs`BaLb@8g`d`ETeM>_ejh0hme znRu{Y`j1ZYb!FbqYtu(bJ&c8aPQ2&YoZVvJJNWd9`@+UDG~i>8;(o~kF7qx&t$em> z98Zw*{oJCEP^&ZG6Psm1m17%EJKomW+_yh* z$d*KG?;OV~+)mtCJw{y!!dUDF3Qdgj9mj>5v$BOpMO68g5mQ;_#@{}cfvmf_w%hv z?{c!C9>WJG@cwZbvKSI$GvF1`wZ)optk1~vApL#vP@qZ$y^aAtI4><=-(laGWbgx7 zQQ%kV+QjLi*6R5k$F&Dht>b{sa6J~5zEJ1*zVzEn*r!mW#iwy!UY|^DS7)c0XSkox z2g@j;X96FG=s9czd3l<5HJixuBKVtdb7*#Eef~w#9|(URe!NHsLf;Z@!T4jyTyD8M z!hZ(6i3{=H2BFt5-roDs?l(cDppqWv+Xx$RcCEgxf4hHe_bxO(q{1B;K2uh`o79MF z#6`}E+z;Zh{z3RYs!2~Lq}wFg(4qcsC*gjw%iUju4oiDzWz+|E9O0*6 z&)>m~=C%A$dP#0&I@&XMYt{gd*HNiSf#<+)-J=y`vV1uXl+TkcvR<7nNHMc(S9$ln_e#VJw*0*do!Qq2kIPe=G6go8)lsybyRonMqRcqV@0ou2iM^<=_YQTV3;n?u^-Zbfcr86~ zwV0kXru%iE>tWk@)L+<BZiMzS)E8h5kf0pt(aYNy}HGf9P(s z9o_0A;Lv`#O@u$d%?N32)d0`9^O(t(adstRy;VC(r6y(-eT4JR^1JHa>pwz$5^5Ls zBhJ5p+kx#ll|1Fv>#AC*TK##2mhN?#~+(ZN5B?-SgBwGC_TR>z0mX3Geo0w1y<_x}Q+RtJP-EyqI;Gsw=VA8wH`@?G&6A!rDT98m*T3^b<7r5X2Yr!{pJ*Wqm3_OE;Uz)hScu#Q| z^vn$Z!@bgV&>b5!j$dS`_t)*;v>*N-dOSnkyfr(^<%k(wsmDWR2%W-?r?fZoxQcq> z{~5S)98U+nQH$fR?+welc4pmg$lo&h6x7$7_#f4ORFs*%?GPP<5vG>?6TdL**ZZ~0 zkbf;_&aV}<67Jq8R{b51fB^EFf8raAf9DfseK?PKAK~{2{{jA>$bhN)C@($U;36z0 zD?kTByJV5YA|bYyZI!T?OX`u2*FQl$IE_&KftrHegy>0BvoFp3(75)4+Xvp!81m5&vciuk>e45h~fSi{5gyjk4KsL z!c1T9RW1PkP=@!F!Jo8e9m5CV9jLrW>YFS*J)XaV9z%uxu~O2;{E>K)w8d9#o(EwA zzQx3QX8rEfhnnGM4ZMQz#|t&o<6ljFHK9C189&;$Hit)ViTu`+x8JNj9LKk?x7X`c zyrG}R{Oj$e^o*6?m*aUd{EVa7nazHKMp<;##KD~yUm?f``gT*@^we5QWAHP;haB-G z`j6#B9x5EqwL7ZSp~n6i)v(rM8{#YB3r-gY4hYmQxk3HQ5ZzaDC-q9JMwe2^9&;xI6RdaO3Ri1!H}Gom#T z{EReb67L1&MJR9SPPfzdmNIz68)23So=wU=dipu%G#sCwE6$GrKag%*?@aRRE-K+R z$cb5W;09-cUs(9^FH04@I=U%sVj9LP8~op`)rDi!ilXPJm#VW6azn$e){N3K*H@7G zoP3s*&6>^d_iSFrv@O|g(^8~(AHI(ItN1({_~vF0Z9ly{t>XyphcS!I7m3=hA^x05 z{6uH4=DQuv#`}9lTE{`O*=}y3iTTi`3!?`=9YEQ{o$7a1)UNs_VNsg`CH*ievVq|A=`%Ua~;gNp6rV-)$weM z!{=3Feph)h99Qa>yv29XKNqpr&Oh$azLuJ?rs2%9G2I93H5SL5ZZ4;qQl}^2d49-R z%Z{6XeE!Vcwh8Dzk=X~cGYj(`P&1c#5Iih=v-Cx9MNj~pweEQw_Oowup0Kb&r2T6x zqtRcuPdVj|_d@z8%Vo9%FEJK}6&B#3&;c8WzbN#Y{;`FHIt|@e%hW@;XqPtW#6nF! zJrnh3p@%xzd$`&wN#H|er9LP6C%&7#n41Z|x~#QVE|LCX&ku3Who5MGBI6Pp_aoLV zGqyTwg!Z+SJY5L9D9^PdxH%E}uw4})e&{cK2@i7Gu4w5hJ)R+c;@f?Bw6vaDTAob& zTTW`TYGl^lCY0&q3ejHh9sjUC?co?`M87vtJ_169CD)d{-l*P={!Th|1navdt$i%& zQL<myiMCz@Q4S2@XQj8x=6%7CGFFfN{IB5K;;aTYYGp5ds zi(}@m8hwAi&A7=#so~G1*P9S`KAA9@ssY}C@q+peopwr|68urdPlzwzp+YY2N1jE> zJ{kH?ts*s5KOZKVevkRwZdhDklq5)^mYOyd&(-PtyX-4@8Ss;t%4*u;Hzq%`dDpLQnPu}q5j%z_BwB6HM zhM#VIa1IO@>!>vrL@%#1EftnZR5vvY|9lD7H?~qi2NW3;_!T5y9nFp8MoVIP4E_Md zMpNc9=i900yT_tF^`XkjJ}OV24?emtY>iNi`6f4gBoW7t9+VH(yFn(Luh%zhGtDqN z@YQ}fZ&~=@tm9ZOnZ13V!QTz>pN7am)+rG$Gx~t|&!`QQEzii1kN$3Dg45l}_rE0g z0`w?4u`;$Kb~v}i5dTN^M5rU+KW^YVI6_~M*ml`~H^?Ulj0CJ5tX~Xxhl@}ud|x=# z9{F^J4|2Bsbo=S^(K18*(^#`+vshE)j|=?N=kdN``*X56L)6H4TRtb-?(kb#QxXlo zcem`9vR{saZ$bPUasSskhdQgBHOBkXzg*VKWQQJT+?v1Y`pG%ZVCG_~jUsZ1Yf~(-h&jcQzKYw1L;P&z^)Th_C5ff2K_7gl~W8OOHCg}wM6^?p2INw==?v1h6nvxB8!fDMZO^h-|My+wYPM+5% z0V1ienllW3#Dg2SAFDb7zF!&fnJ=9avuHcMFKps92|JxC4R}cL7}-k3fM+mzl4S5z z0O5mQq{k=1G{G9Fa_*Uz*IUYc!M)7AY|vZDs-vrAL%`qd^!^s!EE5qHydvnm7{15( zuWL4`m(@%m+&7{pVx19^9HPuiOs434=$S{rvPBr{Cy)gX(l7c!`|dEx0TQ z6NJ%WdVYrYv}M!UCGD0p>K~E&^|guAu5gy}ExPyI?z`|$w@BceW!-~6hQ$t>1+R|j zP7PcdXl!q3r+3)8Mo+`~t~;_PVI+N&sx#?y$MppD?CeeNg`cAL?Z#p$>I08lLbZ(3 z&@Urjf%%Y4vuL9qd6+N5n0l68ju6bqzSW}Li1mz|&q-OVK2~>v@|w_jbRFK;ERP8{ z)@jRVFVDbpQJ7CgsLgyUp%vw8QaFO^w>8S%(qA_QzT)Fj67TT^vcT&{HSM&|?JklJ zw%}RvR=BqJ(Vun(?usMp4dvF>v7~1Dz^`6EuLFN##JAEu&moUuo%zZ8@R)q=>JNB( zjRvMu^p({fyLIx1y0c?JeY_TWeR|(B{9g93-w?l>T}nNPo=nDzaM*ZgLf51Y;z!$n z>+?o6`e+ragy4Zpeb!>J;_Aw0ZxQ^9@F%v$M8@REx@0uQ2f;sFs)SX*ztP_<7(GcW zxN*O|+c}ri2O|4d0?WI<>dBYn`-E>HNBKYi$bH}sG4pq9-N6%X9|(-d{Ja6{kCIE% zULo@{jro)L{anAe)8~Ji4;u7OBSMrjAD7GdMh_tWKqRflqO2?EA51-RJf9lmiRYK@)3_5WRC;pP;s;?^f3$Syn)YzCexP~@ zYx5S=mopb_o#jr}0|NKWSF!%{d3<=*Qi6xY6c$~B-_~wXK`-fFUDaA;zY^=+n!SNo zUp2FvOZx6Vh{BqUzHm7WX2fU z4p~<<_?Mot?Rhx5x-^=1+AT`B3 z{Ms1&!i|qiXkS>BM(@r^egwUYIColxb@J3C+RLVr!~^Cd)~#{KC&GWDg!F$q)@F~x zg6C=ytPWTnXk6?rCu$|I;ojH#KeGB@Nsr9^b zOn*YYljL{ylfkR#m zeG7hn!WJX1v@M$Lz%!Wh!FZ{R%9r&aUSaeyTV*-2+x0)7zFoPgdNanSgM-7u=&v(h z;u#n`F_ren*W!FP;r)^Ey00XoIh%%FgW<#AUDbjJoWw^Y|Me8!qhup`jlbu+kk8fg zF9<-1gw8+rlj|?Q^L<=a1kWZs3D_ zw$xjX58(HR9)`>};CpZ>;59_w@)g{-R`{)wkmC`*j7I3I6OaOg9*N)|@&noF*bcW* zxL>z${xA6*pCGN@i2tyEBQ;}P0Ld3~ ziQ221+ez?@TXTrNwJ$c{A8De_ZRCA69NZIBLtTNME35V+oWCnix6u^&bKBMgXaJ<+zE3AiJzE+PX2!yeluRa){ zvbvree1`LPbeAL*)Q(XB1(s)_UxB}(1oc&Q)cxeeMab{N-#~==<*4VG?8MYpWx0zK zDPtPyp2xFGWIyq{NC7`X5`O<0m$W6KLf{v)W%A`q7cuRmWM=$~^D%I?qE1=QLyS+op9Qr{sG!k$svuJYtpgw;_tt?KZflV-$-DLm@%#J!KJWW_{@NaL#(nnQ&wAFgR*EJ; zv$KksV8Gkn6EUvSs#}<@G6K@v5ZMzhV6yrali%{$2K>zblbn3tWe!Pg8uEw=h=8E4HxN|JiB^d_E|IB>5aQ~}WW6qg< zFakV8*bz38t^@%wH=<%Iu@-m+>yPf5v>~bV`;q$p7d+#C%~wXhlc0M; ztllT|KUqD{_+Rd^@i*`aR*wdHGTqVL(6^kBXXx*!$KuEHI=P>U|nThB>{eEF})n|WFYiG`3bx* zhLEgAa-GpQPi!17b6SV=I!Uj$raagwKd(3xV zPP#mfe&9SyVu`H!|g zYL9z@Z}N8IXN{k=zio_{tMy9FUgi4KKjJ+gFE1|o9?vUacxOxGk%(-%pPt`qRiq~C zP6PZSgINDsb7JRNS=m-I)>hbrhi4;Q)NRCnENSa7D2;v1B| zpf~GxNOo9bM`Y=&-h!pbJaARkX)QB`S42dJBi4$)6&U0B^}Uc^T6@j`{0H`WPppz< zN!kQMMtu`|6Ccs{KE=v6*CPrQ$z*l1F@B2vUDzLQfJUlue~-i0CSQZEE4*7Uhx)_l zZ|GP(R(gEee^zy*4Tq{oHj{_vf$!sNa@7|dmc#EG&p$=%BRjgKZyWA+licds{^lH`Ul3dQI9UqN-w$b_q)#RJf4=4v4*~XswZl3+w``$FckiiK`cKgt|#|# zL67Q9Jyj6cy!|VNRuD%6evr8G!k3q3HBMt*q%Yco>sgs3&59`8&_VrwDc`49oBt%X zW}}L+H@yF-J+i~frimSRp6vPFi(Uvr&SGC9{t;3MGKU_O)<8$KbLRWm>rhMIF9jCvSwv}r>WNnmpDva zd>r%J*NY`|{HO6S{l5L$JS#o7h$Q5B@S+_utRHi%8|*uikbn1j`}dj9L%7Iqu<7s^ zW(aZKjQo4`KWhJ8Z&^QqlouR&^&#-u#|OH9)G|6|Ut~iJzMrsRf3R!A9uvRBww$%l zf7kBn0mFBMq@dmu>(h-ZHhg*D?+5-)7Ur>fZb@Z=^ZZ>(KE`LNH>j|W6iOtKlG~&v z(W3kt)Dsr(QAWDC2!Ow{`UAc)FY8TnE8$O`XwV1a>(zSoq+N{CzO4x7v*66&98(_c zpzR#okFSL1yg3{Ejbv}i4_3$rd1)bO`s3tnv&NfPFOXr+(!kh=U}i#SCeKr+->Xd= zjYbBIa4tA~4t@uJkb99E$`z7xt6M}R&`S_m+sxs7#bH+cQAF{vTjTDH`(xZ)3;5x_ z^%UoOxAMcv%DT!r(h>cn1d2oilKBj_lIjts<`!e?=lk=cjpgc{At|X{YZ!W)#l&# zYq35u=X3cS8~-8ZQb#>qpP)X5=Na6rW5iX(uh=#itgiYx=9Q*zbQSK82ZpLuu{)W4 z;4AG3y zyM|kA%~&RsQvBg~%O+GHJLiLs!TQA}YDr6^7W#W8-g_2R%6-RGudH)vb*lz&0v|D_&VV^a(D&Bl0KkQM72%OBb(Jc#-f#2@0a zpV)jg;(fM01@R7FHRbW!%z|6&`8L)C76eLN%-Q2%eIkIo<2u29neadoi*Hzbbgq*f zpP<)4uaEnj^W5yY#EguyW4~{|1{0a&3F09fpW++E(3$|79Qc3%X>X}shfd91z% z`n!#bOOQB2JV5n7?xW4+*okHcmzae@8Sg7P+s@6@x^9kgBq`hd9K zYJkyn`@iuDBVIt)Ptf~}|3BKOz67663I0R0UJ(Izgv--jf574;_#St4B{XktnwUlJ zpW+!)Ucp^9QwF>R`WLvLqx&wcY)NgIh?WsyMCwHAis@`?pNdbp&xgjI>6KGqw!=M z^4r+({QOuvW2u){EgOG~;TgiRAoZm7#CFCap`irh|N7UH)%^2eeDnu4-)B2>x{e($ zs&ZIr)*%tZ!HF*V~?$%}ieFL;W(jgD%gVF3-+og7)k= zYJ=+^2{-(GvP@3(Ek6X`|JbH_HAD3dQBT4TLO%J*=}~54&9ZrqkbjN~D%^wkmH1Ee zq57Y;39*G&nxU8ZaH7xA>(H~vj=hpqd$kw&ZC3vxy!v9(%O@kPq%qZP-4(>QxhA=y zTv0jGkoxR=e8)S;H}8|Y4#N915*#}(T=6cGqSpB1Y20vGuJ)2IW{y@(pOW66?`E)|{Xp5fmzgRuZ;#ozz+3y|tLA3uw z)Mn!yRl{!+d@X!0#n!{_!^zs~6#t_AspDL*%Bd523e>L`*DJWkzbC%m(qi;C`MA(f zpGm6Vze2~4Ln3U#hXnBz_+tvkTpQ@4ZX9C##`qc4{@okUL!qzC@@-6~-+fH4M|cqR zOz01b76py*=MDJA{=G>HY(+Vpg!*;hd2-`LnVwY=)FX`_*sa5QqRIa;)pTX<&2)Q( z`ig+Eu;%Elm{H-(W&7OVCt|xWj;)Vkq(weOi1+97Q)QaR`W9l1`XaPfnk28jw!D4| zu~sfC((3eEh65TrN=Yg4zkPWk=DSk;!S2vz{~BhIuROv5<2U$#q6&Tj^L^oMPw1g| zb$WCJw8JklAk`lJzzW$&*f889I!M+!ha&W^JAL`rB2@5;4FNv`^&*xgD@5A{$|_07 zhqOLLKjqh;!j^h{JvqG2f%eyvtvRiij=DOLso(=aAJm>BvD>q`rJh;tcRTta>P681 zBdfEt{2cG4m_7gz-`?+=AHbC ziRgbquQ=ru4e}d{y7D_4U+GlpTM>yPVtq)%P>0ea`B$?)b0#N#GinRZPw9wwoX66-Tw6 znKmBKQ<2zT5}<#~FxhOcPHw%wmBSWFl{^B7=c~}nw(%M@S9$*4@Ml> z{Weiq&__LMQa}7I+B{Lhm2Uj~%-{Caj6mG~bVDWq_o8+?h`5*9^WCLH3UQe%CubI$# z!hfmXiGE~+^}GDP>rLL^8Qswu7x^YRL-}v`-s0fbC4>YG{7mXu{c+W=2EWYYToy01 zhgS6u-!1tLdZ7PHZ-e3+^nJ{K>3-RL(>&}CrL(ID*Y5Gi^KC;XIaoA|QmT;>7Yn2Or?4KqlxrDIPc*+= zv7>xD=v%0tF!1Y9-o<*@w2=^!v@1tolQJ{2v$(9X3urIP2cW6z`z*5^3;b$v*hk0OR$(?Y}zs>K82k zpVf<;6b?O?5G~cOFz^corI*x~)YPw(y`TPZ3Dd);M@ruC15~p7@Xp?IMn1sC-q_yU zb3ZO&#_AiEX8L4WUGW?tj{R)?&5v&Xb^m?*J@{p^c!px-k6)O+4DV1Z>bK7` zPnV=KhIm@Rz2)Y3EWhrI@%*!bTp#+kY`QMgteWzE9`ebeocnCNf_Mk_r?BErU67zD zhaQBny&$1piSN5G@Cnt!TrUeeGh1Uu<7LWcQ7jdvn{@u=&yVmvSbxyJo9y$xex;|I z058ZyfBUZ6s~Y-Id1OY~lM1}A?9mvNG%CZyh)20biG!BAeB)%)gP2$8ecQFte2CFTcp+nc|~;*9#ok}-bKQHur(EjA|a;yj8sg$;)ehh7a+5$Fq0JR?q%bGD$k>BJj+ z!7pn|n0iyT5x-a|kBgHBDT45Qu>6+KO?=E`vej?!KzvV!9RjCwjNg+0dO}&7zz2oD z2E`w^2b^M7#3|$q>a8fA#vL?aOm>cgo-EtHP#-7n-P)__WgPC0WZ?T4(Lco2kNO!a zww?w4gX1}coadzAk1p!Z!{zfO8m~G5^RjYb_y*5VDyJ%)2j`&OK_k&Ke^WTK1 zO5hprbCE{1MCtbxZ_CBEC%=|a{srZ0D7M#Z-)iCOYs4%1rW7P?gg-c~FR8=$HA^J5 z@BXLepT_nBVWnV$-u_zzo-C0Gu*!BMDn9+wgUIF}wH$bh5oQ`3C|89rrtqBJv zz;DS#L%$y`PY^Ko(kHK(7Z29`fca1=5pA^k$?Fw~%IeBIq}Q(rlD~{Vn2g#^bV< zS}n84o7Jnx((gu1@GkguM3oldc|>-RAAL9`grr23=Ai$b?TqXcMe;p`Q!KxAKaPCQ zh3#?d__k2imWJaM#Z9W=3=4Ca^m&Rbf_wDeS-Y0b}%tG(V zRP4_g+0&HQ9IIt&5=u*OzKm=WsLzoHBt@2W6zdtAHd09%of^qIW+8sNQQy~huy<$6 zhFT_F5Mv5{M*EH26#=f`7p`#r<75Kr*~10918*N3VV=#5<^3J`veKaH@W&fQn7cdv z?E@aEX(%U+^T=kH>{zJi0{&yc=ZEs{^Zq2?3O`$shV^V=ji&pl_9^q$FXq3#K)fSP zQa<@XUrffCODUh#JD3N@$Vz-)cT6j`=oKl$wvl3PhzZ%S^XH*j==E_`Zat}ecbGpW z+!&dU?^P(`ETHk@J=OR6SlZvuKJThrcK>@Z)>RtKXgx#u3(<&AUq?`X z!!)wcjP>vIejsV!l+G>{rWyF)`@f$&nTzqR9{SUJIaKiv9romH`)mi+~v? zVfkQb`d{?wmeyv}v#|Jym;YwAeuUyP6u+Q)(1ZI2_tSWs;tenAeyh7#ck}-j&%l&H z@eCF}D8<|%z(yz@f$_B8&C|^#5BlHL&~L-_PS_AD&pn%a4)Oh%p2q{0F9rSr+ivJ@ zVEvGZr5(!`xu~ap-L2q$@j^EN!|Hlc#3Gjb>#_~79 zdczNg?g`xke5j!a^NZUnam+%G`f}tKlS(}C{(s|CaMC#$Oo~O@ZhRk`hJj{OA|8IH z*1HSw-cc>SjwYvS=xMsC5%1mTN$d&l@vmmAS8v)jq|?hr0;-)dZDQev;xp?v9sCx+ zH@}Mdw|6>yrq$tlPK>N7>;^t*RqJyL{0fhPILJ_-9)7aMhx(^F7bIM{JX+mL8d&~? zp1VhITikWIn>6la{U+Q6N}rZ3t)DZEhI*3LZ!%f6H=J5b%0)j*mo@ zjqA1a3)$95{Uc{;$Kkse3by@vZrmDPP%ukbh zIHY(B^5Mlao^c<2w1kcq;D53Fh>Gr>r@eK(;4>kgi}A(!Pm##i+RlplizH!uSsG;U zd&Bq1^3_k8QepCq$DElbh;01jb_ImLB((|+RB`CR~{43fPI7{PDQ9mR+nA}IN zXV%IuzheL1a6Y}eV2(g3*ehT#zOeCdyZ~wex1iUN+raWMN(3eR5`F~YITn8r&$w&g zFIFdHQM}x-U-(M+!2Tk!Y=4=8_%mW8obuV4>SltVddV zAL&Y3!qm|7Wc@^J@}gBzWYCz5g>I-1QFwHaA=LZ!kcUd2l78?ZkRJ+YaxNnQdoo`E zAAq08Wni1&#~$#zscRT5sReRB)=K*LnQC18j= zTIWXVMZ&5>)v-mnJ;LI~z0}_|<~s$OUtp&0b)$R?r_27>Lc5?3YN!th43xtksGFHG z<1+M6z(;b9k0{L?C22DIG<(F4!Jc~}tITpUwYU%mS@A`GrP|s}aVs(2aXD7p%^{ed%e}nCxIag(9Y1>& z@IQ%{y)DfbaYP~|bkIq>U7{Gr!}```Q&yLr-12@n5B=MU=aQJztR7_&^7|K|9Z*=> z(tBNZmh8J(`PhNxms})!Y8tf6;@=7$w#ym`3Z%)#-jI=-nAsf@clgNJ^yps(Sy+Me!=Qxa5tP%LGoI~piSo| zir;tF_0}=ThVPqO&LJH9L;q*}S&Oe4^dm{lGuBVnT_#pJ>zvw|szk?Yxc-%{QPS`- z|3NZdnRIP8?VnaJqJ~d5GXmKbORQ(?#gL|s4;*Cpp_>o8QUAHnro8S>9T_i_2>+_n zCur3@J=boSlbwki%k8v292p4y2>~Gw{{1%iuMtqUm)Kc(f8Tv!y~E(5<2nRXU55PQ7@pBrKYBv*&+V>4 zO#$nlGOHwb8QZ^B8S?A)l@Kg*L_PT!pI*R^7wnn*XtMG6V(|at;pdL{jg9Yi*kSSi zJT{$?{ZVxM6X3T?U%t~Z?ea9>18jZ5>2tB2mTi`8#&}f!Wz3dYca^qJ`e^9zUXv#=%S1cT87~m1K-v0c$ z3;PC-KRV9X#m=I5!>s=C4`-I|%V*Y~&-wOF z=v{2YyXx!GyQ4eMKTv-|@w9oIMDfEp_rEm$KCd@i1wl6%8S5`msCJTd$~ukj!~0LD zRiHwQ=G*D>6qHIzqlRQ1M!rk&XmpK@Cbq`df9gL%g5L2a>In>Zm}|dFnm7jYwW9$q ziy0}A$B1Kqml)dfM^K*@BZx8L7a98SX1jFjXeP=~uVo8y#@&h1Mx*{mSWTFwP*VlJ zR>SY7@zqj&sy@|Nztnf?)G79R0^f+%vj{x+l7opEL(tD)@wq7t@FN=F50Jc=kwm=D zubRXI0<@W#cb`0Y2ly#Z>|}e$_7$<+xp0Ar4tiZDbr19}^@P~o<-@PSxx(XiV0+9E zQ}eQ1{W;Z#KCdm;Jp`VSS3u)O^AeK^=LXpjnHbeT`4KTS3Bwt~dF`~mgw8K3A7cA8 z^*ovQg6ab*5G{8Wb{4|#;eYT9KpK2ux?#TZB3i?Gf2UY_Pi^8LCxx`?LR+FDmn3lc=*pv&?zPza^2O0q-x))R+@=KK_VPkgJupxfZnea!ot zE9ytTvA5@Pop^sTe-G{9&4S)V3^G~Z7ZAqm;1|#vd0S}ZX_F3pJ5Kw5N*3Vv88MHW zdQo3;Aga;}$B(#L(DNAUIA(EFX*}9tSLC&-KImah^e#=qcoUSrJ73nBKg?JH&%pHy z;`sr}hf2IJ;2CJIm&td_ACFumma>8(%ttdkB$AA{jv9rQ@Ux+1zFJISN3b}7Kep!M~1Bf2$9M_Q3j1^a_;%+8rN zU*UO8OtXLK+Hd_UlQ`9z@+<5)GC_^s@b{>nmH+aCPXD#3(&6zJL+i=XTcub3g6BCP zbg|<4Sdj|f2hCq%y=9YP`gG0HpNaQ-!KL7@N=JCNxw}mX^Xeo0XguCG>P@Yk=JA;L zz(4O?K|C2WC2*qCd?8bt>)8AW`k$?}*fQvYK$2X};tdMf7SHV-J0!wGe)R=d@4gyp zdd02>v3_Y@i|bRJnyIopXF`$EJzrjeDbBgdLG&k zZC4<)s$%nnwb2h*zBBNb%3JvT@$8$LuxO`^j1qbp`2ItN0$&KzIYDIMo++pYQLGyF zY_zF_zTw_Z*NKStH;n{#LZh;Yd6=@S7V*w;UD{~O>3}QDqhz-<#G^-tJ+Iho5(P59 zu63jNbS`K0o@>om9|=;~e78+hRK}H>-ccrltq)O%2jfOY^m;A)FvrDL>p)C)nJwQ0 zKadrvk9OntQ@CQQ;HW#jOjFA3-PdV+XcL^NY9ysp@RJ~i@-pwwp!yZjh@btNP+wEI z4$m_icu({w{AH7Y7omS|9*%qzh7IqJ)hBx6pJU}$PxVBKhYk8E)PI7u6`#yB;Ad3^ zyi1VCPkprS(IloC{3ne6{2;-KkRLLR8u1PrQLN~kY^}|aqjw{hvdVp%)v+_h2%TWJRd= zIX4=2#U+vB$-F(ocO{NLgR@F-)Te$cscU;3XoB%)*rQX@1UKBoyw%|U*aUg(3Az#kzu){zrsyBeSrN^dJy*4i#+=nl^D4;be5`9pA#YWz zYNq)UPf6tJJx?(oCniz*4S{~N^zI2b^6p*+;}OPVML>psMn-lA^e+wg6wvAqrdso@Np%8?cSN{toRYZm(ha5xZSZ$2 z;3px;OaWe+=UBc2{Y`u5Xr!$@mwYa1G>yRg=WNG2vl;xAeUhq)X!~XGJYm9ugU+Ip^;sh~^&8dEsVt+ozIkK!7^)!;zrr>v+7@xR2saifl z0&Z4WPD6Z@DH$m|T04wuk-&>nAOE#_t3kS3*)MSp0Dc-<7{byhY5^uy}`J zz1w6lB@mFBG5iA0pUw!3F;yYSUay?&t`2)>E&qgX$8v}65j;>^zrZ$f-v8R|1tgnHT1YHfF)uAXoX zGd{;qpUdL~I$us3WxUI7-u@BCSLU^7`+)yA2|u5X1yh|ar+Zf?Dg-&-^US)z2mXV5 z9(-vh@^!&K|JaRsco%EY46L^qhm2YIn4f~YJtNmdeH$e7FDTuXhkWL%krsA+o2*qcF`jCcn&PzUg3Gw=1FO5&2^(+=d)jaG4O|8vi>Owt5N=+?+*fBH^lFHix_UM z>1}JozXtpvPQ5|1v-c5cG!K;cgSLhuHPvip=HOZZT@n9sWBcM{aE{f_Os0Q zjC_ZGnaU?!T|3gs-Vd(V=CQDBPg(EJ#BhGppPi~v)u@Jz{+E+Hyd-I}UQJ-^4dbmSV`TItYOT}~e|C1jtIM=(QbBWP^!`;b+9nX#NtCcE1mG{-~S7UgLV!erM z+!}{o)DN)nFYu^PNp4Fa&BxRD6Ky-u^KYRq`QLJh!vk8cqp+_em0MN7UvYhuFHru` zZy(+KNck3vPvH9Ii!E}Tx=+^_{ZgId{96O{va|R-TfgBP;S?dhEu;N|Rk+o-f8bT|4|IKIe4p>}t-U}Asb^#?-$Jo`i~rm`d#mc1vFGDw^1ay_ zJE6pgcfdbL6AgzSV}INSyF^Jo=QY|ael>r?Tz@z!%Z+%6Z2|m-G^5~48SsnLkzIq* z^OFL`_&$1W0w=+&s;b*~e9D*BY)5{suFd^Ze9s{P0sicIvdx8kU)(lf+p@|{1N+4f6cGqbvnHQz=(MUK@is~6mU=A9pB5At;SpY-Lu59?lDXE?sU#C(eR zt015{9Q;Y5iF!Q?;`{>ZHJ9hSpuF{F)4=qD?LS?ACeC}8PxNs z!)g9SJYO*X13pQPV(TRr5BUs8GVLU!7JN|PW9B|iUQ+Ltxx$P^#c}|1ApvLE{Ht*C zViwQ8(5(SuMtkvfrbADe(W@fvygkjn(WLVZn1iWO6yU@3&ijHZXKVy z65}mT!11*zwkK^3U6+5rcxrlmwf+w9f|sQuKOCWaUT+iC8t6-bAMyS7i1$T2{wh28 zFXy^$+Z2uGC$)xxHuNN(PgZZ*gZWbe{$dpP!IAFGoACGU;4jHmf#;g*-bLGvR=n6v z)lap|%g5>yHCTUmMHXJxUU@=FZv7k<1bke?_Y&rZ50ei$XWRb*d^|6qyIGIlGm?#; zH0l&nY~}GLn+7>IrfDzgh@>>QPpenV}3Nk?^&-n=bw_S)C z%XyG|u5|kZ{XIYz+8fpzrYFa@#U0;>dDQyQ+VXR^>dBEHlcEQR7i`@5pYrGP7@LXd z<6WsAPw=4KL$h+`-VI&|bpInpgzdbSoN{s_dH%>VtWO7c1H1}u4%u0A^49y{zyD_P z`?#Ox`ZF7=m(Y6Lw|VB=_qYlHF!u@FLp4a{MlxZQ=5;oq?yB47pk0zF3eaG?-LbTKFO@rrzPym1V z7pMp7D!Raq7s&?w1djwS<&vr;&=Whi++K4m*rph(Q^Nx>>C^2>QEvV(DkmuHZ9MehB*e zj5fPANn30O@l9a)E)mUPjbSZe;LjWQ4suNl@DZ#Z$Jz>bqio-mQp$i(&9TZ`w+vpRo~&$Lv5nC=HYb z4*DlDZeNmPmn)X10Mk1 zSuGxp>1Hz4`J|$~Cct`X&ZVjmLhD25e8S;7`#et`CYg(utwX%XiwIVN5Al>NPkDLh zKbQ}Md}(muZ7uVtsv@Ny{5JTVZn}C^OCI?4r%*i#o~=0P@Du1u_)bcNegFsh71^gz z-;ut`JPmCw&wF;Zvaf|?7F3)vM;rdB;7{BkQ`+;6^iaKpWv;3%eb>lxzkF7|ljCli z8dA4~X;{npciM8Kf}p%howiy;B=!D-TJgYLv-bGdT_M zGXIiuRd~}L=oduoX-2+14C7_^Nc0F}>D@r_jIbvMdk*&erenZAr+D<5N8wEYO&*=h zf`kS&+Eia=5F4I%G0lHd1pu~x9#XRWoOdlPSwCXnPb|NqV5Wxk?;#VOvwV%~YT0Ge z64Q9}KX(47dKZ=W0Py{?`D3FV3;HXYzo7aqUnVLO|IhaF#C_<$hV=p$Uag)Q5%^T# zW8i(kkJy90f1y=%eHN}Sey8b7dVK_V?Ja!Y3nY?_i~n5uC-@~(C_d6}8fhEh6~6#_ zEiC^+7)*}&KMh4Z27DaP<6GGh=N+bBbE)1JeIAwDVs2zBn&HozFIQu{-ZtWzX&cEA zGH<`Eu*LqbOj6u5srs`_;2!T<=tF$QU1NLPr#^+rnEsmTUqUa#?x;^|Dp{8N=oI)u zi08SkR`BpZO`z%PJj=r{Bx>hilctC%eK;ox}pTmPIF zId$D+=yN_w!SmuqaxXb|Zq$;r0`nsDSC7PiD-oSBUCcWL86)8126RSiGkXrJ$XmXv za{i`QxbY*T`KSAI%)|vDIpcsAIS0!QtI)qS?LMg{G=2$|W~;zwc)P_+JJfOQ*vF+Q;Qvh|O}mz|rPMuh1peH0HjRqpIWNM2%kN2V71kdKx0_?CMOe7XsV20jpSaZ2e8@F9_3!+fz@9b74|&epQ|Gqe*E zUhgm8o3CLO=7!WR1YYr)lPiqpcoOpi8Qyp%d3+ zCi@(1^Ep{^^_^iIQ|$FItzU^BaT?+c2?t5yi~f0-Z{#%_nm2TBgdT08#Tm3G#V*Sz zQneP5i52Yk)Te&-^E35N+kj`Vd}cqDL?!7Yox({5{!y`Nwn0xOIp3W=59rx?MqEkM zlbZHb*U+E2HlDJ}XPWxRyUgK}->~?rGe39NFnODEc(n`0!}#6JO*$>~-|vTdOMrK9 zxjar7u8%a{{Ri~kc@g2&)mqe_wKR@@_Y~@hdOG`BuHQ)^|GjYMGvGTmUSU_RKEZf; zCjb56XpBz-{EH^hd=J8$CZ-p$KIKe;qwBXO3^U2&oeg-N+JG*n4q+wv@M3ol*8g3I zSAM+mQy%Gf)m#yX@m?F*(gK8;X}eIHhwn4*>dxWak9RjR20n&jZ}HBQ&@%~-86*CH z_m@x(e(D%sPoH9X|8 zss}|Wo7s8=idXy=^e`xp)hDHV62&YM5`63k_;~pxBUC@cYfv({Z2)-t7@na|xTPuG zHZY%zMd@wipkGS~Gj?DJyvE#?Kd1}!SBZ#BlV)0|z!>XlmPIT-Ms z0oNStW7PuLu~oWj#^Ze~-zwTF z+U{t)K7}~j^#}VtS7UsBLoFW>$i<~X|5a02J&O^25uFbhW4`|&zkkxf_fTJidKMqd zZ^L23kp(gzy#HymzJ%ZI)sfwWe9M|cXDU9ydVawArKD7nM55B?QU8pvuAMczRr!a> zn7@p#)@*pyh? zZNGM(bdyl%p`JGIWo(9p?Xue`HMk#EFEjqSC=eDCBIENv|8t_UOxd{7h(}GiFF^T8 zi`a-)-2devoBucBJ#t$8+l~Ab^5>NA5MS@1^pJQ^{t}Bn*qcb~aiNWh0S<Zj3{J&?Q ze(mkRNinvUJco$6#r=^5(8uW7J({Phf}UYT1L9YGM2$=%8}%3>6B60^{qGxXH?GdF z9wEu#`(eGn{exp?B9e=kh0hCW5$_&6cj@fq)XZe2I+v}_<8mxGa(SB^@s(kGl}IEz ze0NBQUmiRDKGgoIZ*2KhOMrje!uvna)ZWzC(%1t0gVlpeRwh&>RB@^p+Q#@$%sFRv z&TI!qIC;^2njeg}T;9a?-$fObYCMm(Iqn{-3yusi3-cJ_sDGg_n8!u^ z#fC-j51quZ=WI1;g<)#V&UsZjh0_4XnZx08$j3YP2?aXERPJ`W-ZPlbFYNx;ih000 zICfT>eXw3FsXP~+hV=vwD_AS&Yrm?mi-f*{gNVZunP~ShF~9#U3iFqphz~u6N-gvI z>UX>f@b|#e`7ULn#3kp4fTiGP@i;c(MEH?zBu^L2$9`v*%(8Ca6@S~AJ^drBXGR+I zT0Qijcjj;K!u9fnJWtQkM>>W(L!?=b`SVKplP=&J6u+R)V`+X!^Um&rqtN3jO~ZH@ z(UhrsjCqx*l2lUug$Jqy&lG3|glQA@yJNjnUw!`}8$XQU7uoth^^)|15>kWw7V63T ziX=snu0>r~A5OXD2E4!3-cyrW8qqNKR|frcJ@A3n+`5fN$TFtw zLx52GwV;DpHBbwpAIi&m7A_G`zAB*<9jgeHz^lIi=CP8?tVPd zhV_}hDQ_z8D?X8v4~7(Y9;je)s-pa!i_X0oy&`1TCY;N&<^a$5XbA7m#NRyN>qyiS z_)PD&T?;-(=2uNi8%)xerRIa3E_(frWws_>_WgC_SDVeh|Ekk_4~7mO?70Lzm}%+I z8&d>m!*qvqIePNi?yF(oDbB-ABV>ehL7ybg6yM)3x?glT+EZFQZ>kTfSXWSXE$oJW zJ@5e*&-g0i{ombx;qL;Uw7wGYS;McKlkED>&rl!YTE(kc)+y~oyiiH&!Qv{TX}-Rj zK+k~YOXXs@yL@|FrBR>4nRpu2*!bUXcC1;Jv{z33TWLNE^?0HpRlSC7uf_UUXyU0#!TbWg1=XwMMn~7E zU=T%*5Bx&0QhH9R`r-?7v|0RxD|Cv8b!VvF1dB&}ERs7?0D<@!@_AhHR^?*NVh#8V z^(-E9^(tGRf%u>0N33*}xpfOx@agu@h);Yx^OHI3{EhRo z`WLi#MNl%$h#x3ewuGjVC=K^V<3AuE@;Cd@V)JWbezNNw*2>PQdR5FAUg91DcClth z8?J}Ni{gd@D+4Q?3aEYt^gZ<(JLR1gZSr%J-_d~n5E2yR$Bv(4dZHB1z`si4@eKF| z6ih4=lX520@lRIoxQtXsCaLN1M3QA!uc2KN<(p%P^>VsPepFNDD6?qBYs)(P zKfG82h9gEu`Yg8`#E;NBxEeo#`t6W)ZnR#++%?4YsQ838)0i?Y4e{SH^NhJ!S36pn z6{jz&&^C2hhJyCTeaz&7ODe>d&XIvxdurg<5Fksuk9;;i!X-bk3H}|tsLXkuSYHPx zp1#u34F9F_%$4l?BVP@JBk;|<^XH)r{>19uYw+iSUnltLdRxA7)f1|pc-Ob$egOET z+%1#ttm!+(Sgo3r^B(2@xms$9y1^L}i^u{r;r(hd23%FJiqiH#I_!=D>?QQ>>SrO9QJSI-##qD`|+we0xxx zroP-#rX>q=8-PbE5?gj_FSRtc5R4yme*fc1`IE|H@?*k7$!vW|v8qr*`wQ^RK8ha% z`BfYIU%;=RdKNWrRm_R=jx)#i$MSi+S1*eEe)itk#^VVRWgPO|#8!h?P+o>5!v$M#>6!ses( ze&eg&(!8~IFN5>b@$2uZ{B!xe`Mt~p=q;da5hRtDHb2%<{H+%Ee=qkzuEVb%c`^&U zS-!?WUE~&@V2KOX8!VnS*YxYCUfZAlh580ok9u0bqyV+L4D(w>QZ0R-!-6VKE+>xo zt#YURzqmX0ia626libbAX#R}i9a~+`;(Ze9+b<3Qzxv!{i`|)!))b~;^~>G=0sq3p zN3d;n{Q~&$u=OcRv46XyZUy{u+5Y*R>9rNwquLY91MqjyA7^kBnT^pF~EM?wNxrw0(-3xftrL=4ZTzHVBJd-d~cI@%OvWWUM&$MK5WAIfB&fb^Nf{2+sI#ba<6#1V$ALe3i(EOdkS3(G*tk6K8q_G+6 zH$|H~d!$Mha&Z&J6P|6Xa-_D8`QB{qh!y%H$ByR`;PsmDek@~_(f93~7xTDE zM<(oyDzw+>cQ#+u_4GacCt>>i|FIMEGmjS@SOq_Y35V}L&BgUJSM~PvV!Yo_((_pe z@H?I`D6;T~mg$YYKFJr?HyB4f+L9%DQl)Y916-1@N97(WFLOY^>v@};9*8~#v48a))OF{D(BGnm-0uvVxfxSk6u|#E|2uAWt0Glr5B!syWQfBrVqOS}@$`(@9!)Hlm7-LdTlF{Jp`yqa>_M-K@M$#_B=VzjSyR{?eiI&Gqsp@!`Y8hJmr64p8qY7-#Sd66-B0-qEI-2@Uc=j|U#g=)UjzQA zbClwJVq^Wr#~&55^$y1S^^zngF`dE>)=*EP9+3`+E(l$iF}yE8=ieQN0yHE3ls0-? zb4PPL+sKcJf_Kka)j8-f8v5_MqZ6vP$d9=i`6m{y%^ykQ;z9`gMri%ix8`!kyf5+; zq`>N0-alx4vOvte2>+%r{)dOi$L@?>y##z2ww}gbMEyc4dxcA0Hq6_H_13HwEjxaL zKSKF1h?j%-74Tn>_0OaDpmSSL!2oB=iJYb(4 zp~K9(N#owa-=AzLx$~&Lv5rj4E6DN0?>UL07L(TTz=PXLFn%tw{z9T(sGY+2p^fpW zbfjd&eLy`x@!zCNIxK+hHq!np6j;_%{=~Z}ZtVO*^FMU`u*JRFT_diPQ#^y_Pa3Y@ z*Q0!GAM}-3Kfkl8eAOvzMm&RCZkE9If2xmx-&g9D`n`q9cIbsx()yRY?(pt#74%IO zB~})pe|-Bg>s-?oK9{8CW*x=&Hq%~c&q;~VGJDGla?nt{!4>Szimh=^%lFD zkev(9=N_Q=#x`rsR^Syo%bmpUgTKJB<*%L%e>KjJgufZ{KVM|EYFXdox%SV>hwM)da&Z46WTyf;-QNq0VF@6r-H=pO}l9@M3c2@0ruo~|(JhH61M~nJuUmr6%|Dk#W zb`BbHH?oZKIr)KssBlF+_}+3>@4{bGcBiFI`xNm3>-Ua)>Dr9eA^77(wdLUV6Lv~+ zKN(p&LMDJOgZ5|qIYIlqkNcA3NVdM@)@b?Ys2+HCbpl=gDW-+l)8Q?Tu}qXx{;AWj zKwEY?;{h2UBM0v#j6V0Uu$_uRd2yuG^7nhqfHNFMHl{s~h4}cQV0;)Oy2+R0e$zwexk`YLGGZfxGr%zU{oWq7RpI@}wV@+WRJqM0f5t2w)$6l#9-X{AP8hlJ@B>`| z=I1}T#Dw!1hul*C_A#!1zR6KH-5Kg99P-;oO?W>xR{RxqSii=1l$87x-;YEn@{}UK zaeI;V6RdXyd}MH?-FmWnC~!aK`AI@iLQoU@5?cN_^e*t8dp%7(JrrM>6MAD1{2S*o zXxl#y9cAjvL#pB5GvCD5FoUDYv5Z5VDNstsi}n|MN+?5 zy`agXNeO*pg7}5p{4~F=8)GuIthqm8#$#y`N5*8o8-@EhW;<9aJ3g|huQGU3f zjNiNm90sayLH$HVPLI{=Lcf$AuWwuFj*=Z4wn3kRyiD!5o)iihm z0fta~hF)K{L?c0sGXpr23zy0*3xf}*HxLO^Woy-fm$L+@80D7M;mGl@7< z86sNSTLla_waQ>bt*A@^oBtlHDH}@RKk_(>gt;Njhe+n+ zJJG;zgc7NDcAQ?v*sUr69|L?dDe7h5{vJ#!+YG*g9TNJKzKA#PFMg2#yugOzfPx}d zz`tKLRqF(OFcfIXuEzQ~uXw_|3AjHCU#F5d*z>8a6T;E9;fD%#&chEeKAIOVO2*xBMPS-N5g* z$cbybW;BquTP}|JABuORF1oAg?qc?8@<)9PyqK$8)RhN(dT(;lDBwLpF6|%m$AaYB z<3FeCeNb|C75w+RD;_Pydf-r%)PAK4^-1QK*7uXW_Xi#uQD0&<;uDyEABY!8@?mO^D@bI)7Axy}s;WR(x6Ydh5HI7GoNl5xwT5n|K@aL1; zHWkM)*(K9xJy!0CsGI`T=}inheh&NB(`C=R??zWsy^KewXVN@n(j<00$WguAbj}d( z{Ycb;3bnCJM*7q+)K?vu?0CudDfpLmYiPYy=rycJs%Zj$NLI??B@Thg%T0RBrvp2u zCE&O?NZzIfFOWR`U>fvAjq}3Bit|$SSC}PhhC`1dUYx**As2m7|71#8F7Ds6-?K6h z3K(Qjq3j;sx18qXr$wnEdFBME=P;;`x7Ldo>d9 z`RM-SA^k?)twTH<^NW5z`qG8Rdy4iHF{#)uFduG3++3qsqg_L+^XYyOUpzK)&Z_yU zUBJ6oeJY^i6)^1W_^=JJ#IF(monFh2wIuMA;1 z5~&4;DfqGUiWTBbm6!CLI^8qqnLhk00Nc|(QN2uGY=9nFPX?~{%d>|~eN8z}nd;kC zRDaVe#_w;%pOPLj=Z@c1;F06Fv!-o0pfr#wO$g<0aMycfWmf}#diz-9PdhN)9Ilrr z^VlFWhA4|ZhMr16Vh7D9Cfoizwsx^G-WIMVf5)6i%-M&r7wGF^3dQxo-P?_z!VMfXyB=kTG!sNeaesotl}B*-I8 zqVeY2IL;+rF&he1cS+%^xz~ZOc=Xu3;w10`n68dB17+ZAycS$Q{(m6D{Ob=M_{9I< zPvU;b-DAOUH=Y}-G{z?z0y;#GIhjnvLG^*%u=gzvST@-YOk$ifYG^$7Nq?H`$bOM^EQe%4e={1fBfL~%$Hwwl0p`rh(Evj-0DAW{BZ;R zJga{g9G88#;Rf{FT1@zW{Vmih)J{kJ1!q=oW5z`5kJuEZ@Z2ADZgXu<>fF-{5nypEv$(5~^+X3VO}?5XEaw zp1xTZy~V75A?0P+{o!%mgDDuoTM#ah()>NM{zk>PN@dN#4(LC!_yzY>(8E|oRxEiQ zG-^X2^w9bi_s!^itJQq}R#LF*T6is@&s#lao~HGN{7v~dL-@sdt95Ukus&w}Upxc0 z81fy=Z5od$v`|T?9^gEDpT`;f7V96@IS;i>^>fVq`=zV^)}HE3zJhSEa&fxy#((jm zEZ{{C_x&{Fe;eZmqTzo6j~Vj!>tIaL{8=-eaqFRswFk|3g7Bf>p`FYw%iO=WxBQ6e z4yf;ddJYA6zclaPeE;U#H{Tz^C*p1N0nPMdo)1R`at8M6_YW{FCcTp%cW$o*1HICW zAKWl{C}1&3&3J{s>ev~Ihnepu!INvs2Oh$kgbji$yDU2aGlXY&+>+ju0x@BR@D@#X zR$bO11@JKwUg8u8_DtZ8|KeQ%OJwYRH-vAc=%u~XJ~WS?hl@gyezoJOd49|h~c{?I}z8O<5ZK|Pik$yhIZA4q-^|0;UTtZtuK1Ak5! z$cf^g7riF${;W{`gXWjq?|#|c-%Yl)9*Y)%pU|I8MC1MOY}?;?s;f)~ zyr3l={;A*r|FN)TY6~;!1zS%~{Dic7J&9=&Wu@&&q4Rt42P|GK$}-^@1HJwItUu(R z#KtpHQc^0lgRs}rU=Lt@Z9Bu64F#fY)W4$kNZa+}S6*EIMUD7Ai)Z9dK7o(O0>@c< zqVBVl>8&3_pKgf%x#E$WehOGT1J8S_^5)=8_|(YX)KI*|L#hl?ACNyHV@@e({G{n@ z{@mc<-u8_4H>>;DPgXg(Ik+5H-pA|`N8Wpl_e)dchgj3DY1L8MCuHCrOzVF z$!3oeNttxV1>++IGt+lW@jC|+8O#OCvkIZ{_6T~YG z#-z?|oy!LI>6!6kGH$NHcuS`Ww+L_8GViqq{%1PoN3Y-%Clq|qF(ZEWKLmc$-@^S4 z(bHl`<+~^C`;cE@2yGV~;JcBsG~<8=+h3enHi)-vsDGa#Rla2$fsA)_IGHlOYY#?_ z%h&1fzl}`Cczrf)bDL=R)<{Y|(VxYC0~*wwO@y?lFT;bS_8e`eK#doWw-o+> zhT;vbe(TbsYs+h?9wgOw;BhQizB&B!dU`&)|6&g#z#HiKbU)kbyww?a25T=$i^i&o z`m1R@jPAlN%3rTB{r(Uiqg#8TbX}>J3ct_#*FsNM?+5cU{HdOV=EeW!yH~P&6UBGF z?0OD7faQnOA=cL793>%UJfodP?~du-;49^><*q%hf8qXEJSM&+y8Qh0^Vg|APxV4` zjG0i+1RgWQ|Im17r0U@v!}p$=8QIOU?Vpv+Z>(5r<}a+@vM$;MAK1ety^R1A%=$wR zKt}S|`qJ;z2ej`sW;HRx6WQnY?vEMl!N>glc+_7p=~tNW3>M$0)z+H%9A{6O>J^IK zR(4Z8l%PI6B9P$I1HYjCd)l(#`OnXfwG$=uNU;|nI!H%GHt93?D?A?`)fLqL zv@h+E2T}{jNP1%M&tM-j?6t( ziS-L@TeML>)K|GtcZ~_2yu`L0{*xqBo&&xC$+TWMS_gbrESIO|;C&f7?!lGIi;FS; zWv26K{lsDw?#IsBe>CogYvbc{Fty_uc~muf5c7q*(EVg~p8hWLaE|i9E8xi-c~NY; z3<|>4DHmQr&yuqy=uFx(HR?}fUjY9??45k&vaaSS^I%ovgFZui&_H*S?#xb0CaZX& zBluI6$RAN$t}&9};&C6;viI*(k_&%OST$m1EyYJD{sw>02JL%TFZjVeX*uv0_N7jD ze?-rhL7o+O!&}yi-EqIbZx&ree~I4P|6$|>)Ynu6v+)&Xccm5mK3A~F7ya49j8XQ? zMSnV3$Y+)28c~l#*+c7n+Hqy>C8^k7=BM;*evRMf20Nxj0$;y-r#@pi-G8P6U%`5^ zQ`1BFH8xxychq0)X3{l1=ijCHkuTK?ttHiWdTvdo?M2dDCB|=w|0OAlkRMZt_{1E1U*PDrQr3J`w9oo1t+$zQVvgx~M&#F1 zeMV=luXLl_fcoq>pY9JqZqkH<{f%sV1N*m=yI1(!JI#9dn=N#GcM>a|l?vozSK|G| zaesFo_nC<|)Wjd_4cglyceL`9auxDnSiP0ArGf14@sqAbbWrxu)VZwQEaLAheo>;! zHzW*7E9rVhukV>nvdM#W51>cO#%taa&-&@kprRl6$k_<2kL4#vviJy@bBe`lWYF(u zSkkZr`z33?q#xcsE_A$n5wX5a?VI?OWszmqI$o-ok=Xz6y!&*LdeLp@d(KHoq4mT= z+T1k!49;?9-o&0L%4tAss5sYD+W>xycg@+ zq!*4qI{hfw4}LJ4?{R9as-St3ae(3zbiGrwM7PA~2n?1jN`s3-1)6=E6U-o{4Cj}12wfR~G@jAL6E`4=l z01;O^GS{*Q`7QCnzXdbnFyDQ@aM^DLdT{5|(N?q4JJu+*)StbE_bcw_EiIsDx4=Idych_)gO|WVx}=hxPxbUII9&Hx z;kzT5!pl>R9>M$069)yBZSQBwe!0F3_D=3#Sc5An5D-r4F$?IOasT8l8zyq%lW%|f zfGaf^hl}3fe-rzLWlX5W5SWI(Xk8b(|8%O zZ(}bSMe~b1KEV5wAo8qX_fuz6JYKO`vH6mE@P^qR9Enncl|EV@bNu}u>TzmiqjDGG z&1`(R&g#YJSD*HLP3sxbe223oc*iOJJEZpzPsO|OXXax#J(pB~p^*(dV-)JG8iNLC zHq=t3+27?^j%D>mMYR(b&$~$ND{FTXUNVHIR0=CmG3}Pw|E2oefLOr)Fva(&FD*?F z-Xw40{iv@;`2fyC^)i~M8lf=3{CrijE9Ohhuv5`#(zcl z%{n@v+5XM-!3O}GqcmSn=qf zUL$Fdv~YeEeQv@xf&x4}S${FY#6MU*Jam-BC<`?c0lWa;_b(*KmLkuIvy{z8$ZszI z8wq@*0@SO;dJ+V5C*aa{H7PXJ`w$A=V?S^DUrT!*`LeYw_Eevt@XQ&LzdF=TNmC85 z{TpGzGw%Om`#8Zgfvb7EBX%Y4YFynk-i#+D;MW96f+VIjdh~US-`OXdo}5o7=Q=idW*F-Cn)o79wl7XfS6)khgMWx6Vq~y9 zgkA=#SLz?0Y@5tGB4mn8`7X|VAKd;rHa_qT-UI&Ol7O$W%=sfB%?q0sHn}vI@iY5+ zVNY0nc%iwzPXe$w*Gus4hVZj;0l<_Q>ha)fs3~7#{f$>gU&r@+W9DO2S^es)@KeM< zUy_|~4*h~2ENE2kcNE1hq^>SfWozmIvLb6rGWK`R$AOQNo))4$)V9(~!;$Y+=GhQB zn4u@+#k$E4uzz{NpS;cQVf?Ks=7KMKTz^~NYG^l*yA_%Q%%8BQQQAkk0r$j+>9@zYQA z{T3aV!^VHls#;k-39hH1_KaAx&bdPKGxRM?`6a%VKXT-vRWHqL&kCZQ6J8q$d_z-$ z^F4Z%t?8}lMT~Va%g^vV5PBf=4*c!WcNFSb&^t|*#s*&G|4HU27XC0C>t%w)!`S}E zU1Zq32M-Y+7zRByZgAiLu{`K=1MzSkUjjS;di7Qx#r7b+&K1O@bn4(=`ftjj`VK-4 ztZlTJg#L^|8b62L*Rxfy-#J;)yKmySz=kV#H0~sxm49XUQ$00Ntc_&19TV`&h+m&T zf0G-+EA?wGAq$=>f5ZC97m5yK>S0gT-P-sU+W+9><^aCKep3-i+gy$k);_M!f4*_R z3wToC!7JT&VQ*?H*nD;A3S+YY00&c@kV5UHVSU-{xmSu;F?XInO2_`^ne3gcD%I`6 zB24uzj2#`fbjrs8S&YU}L&x*zK-~RE*Xbw7+~?)@(cX7C@AA>hN3%&)B3n_O!d^LeJTDG{!xcT2QxC9 z%}0*6Q3#9e>(?^X;n|e0;kwT)!M*W7A2Y_HsM;F!c6%M8d<8NKvTc^-gXQSY{0X8h z!N@j3(h){jB&RHeK4QgLsQq+Y}1p+ z8$u6FgnqeXf@G=9Q66)s#^#(mwci8+XF)ul89V&uvc)u?XJOmIDi;k?;}<4HKKj0h zKUUw&`$b21t9>r`LyxeR>*>G^ab&trY^D5@`4**-#%Gv6-&=f3@fr^D<*(9smz2}o zyA*A{cX)9l=HEu%TL&@WxUL%xHZ{SY_%L$SUTf%+c2okr($$h$tqXT1_`~5r2QN1o zo0x^CT?A-P;Y3Q0$m>#>&nGQ>_bJ}@9>GJ&DfdK1YrXMD_>1#x7TbJj@wEk`3}^Kg zt?FZ|l#OYy*Jrcw*HN4;|7PD;=o`>@?CO>4W7++^>ZFG9znvhyx4#MeO|&t-@t%&T z=eM@;x@hkRmVaAcW6D=B;|CF{W$p4S@+-g(SbJ_kRW_C2K)qEHUVwU^N+8I+IG@#b z>w2qoR2k(T4z-tG=crv;w<(#~IF9iiAF|$Fp^$8${xxl{m6xqnuU0Rk*Q5M}D*G6F zMfR3KGUB$qb`yOcgX}85Y40}Q&uQ>Qzo+__L-*rfm1&F_tQ#a%@c(hWIE9ab6#BGK z|DIkyb+dA#c6RLus_&tVLOdJwhm=muPVD{RIMqkoV%2E{{>Ed92L!|h=A%Mw3*$Fb zf0jd9p6g;PndET$iVd)5lNS~*tX}cNte1i3NB-kX;eYWAnoWXyk|93Flt5JL3Y@sZ ze7;m!2|;A-Oh#$aJ3Z=`<5x9FH;LjeL-{I{Um-A`?*VHDn#t46$8ivU0yX-}>M8Cg zNcPiL5C3u4&a4MY@h0eNDUgrS+kyV{uduA}si>$hpHKOZf`EXBsPExd@dws3L7YQ# zTK-*Tf3*kNMvj*#JE*2v&+NCJUeN`A26}W?i@Tdip!M`p=r=5N9qzIwA9^T(?H;8s z4Dm}Hz-aS5yOG#bdz^Y{k+l%wiAWIV!Tq>iKC7fTi=T`JjKA}R_BIH=Ye-@g9u9(Fzl zS516?MAwXlB~9g&*|^;ExdBBTr(0`+qkC>asGzr zrp8)B9V1-XOZ7Lx`U3~tk~veE0F__jF9zdm2Oo=~NW)>WccoPf-k$~DzPudD_xKOm z@CQE$<8$Pwf57n5*!I6<7M#Vr8&esf|KpRFaXx>m)9%P`%9wzWk7@pk*e5xzTKlw% z5sa+NL;GJAr;}0M=^C@YwIvVn@-@S+r!NWN@W{fp7OJ=4!BMShr03VQ*5AKI^A~bL zv`}CryNfi9u!n^0DG_SILDexV9-}h=B@cx~ZEt`SQ zU^nztn2~ohG+)Vq<1S5!K>WJuc0JXb6mlKiHY%F$GO55< zyy*8Oj>6qQ85{+RMtMddesLs^2}|GK{y7q|LHAX=5}d4+b>26o_KT==K+r z(VuyP32glo=HZmFw=n*v2NOF2D_zQ&?771?LRH z-w2qsqUK+~2fTt}4EX+?Dh5cR}8+IwX5qi1vc`4~=FIQ!1AL|fL8{yP*66@!Z zY?0@}q&r6NVOYE&=c$V;U!cE1tWnQ{?mr@}%vigBkW?dI5&I9Fjrw1PL8|<0S+;eTUTWYs3)t0S|SRcQ>81zC-kEem}f&2GR zX#Et>m?o4zg5zt)rpvD?2h<{4Q@s%0&;|Xu^`&DItfz{}_){XP=A7eI%{2a3}81H6{c6+wOOvVBYp0Io3nI zz{|6|Oiu*M79ac=e2dCVeWOv=OgNdp`+~1)!{@pP@-y|!k0HNOzJ+V~sZKWDHE~?$ znOp==o(&!@aSq{;)55MXK}O@kqDQ)?-H0bIjCf4vo8s&1)9CzV;6Ih&d3^`^jdG<| zA~P}QDb=e#ul=hwBS#8<|H1e(=r5s6AYHuV(EISus2(Tu>!mLDGk*&vEwA#0Dwx<7Zm`WXD-M^k%7y!ht@=C||xGQ4l6YxZ_6 z>^fpCKfypachY#sr03Y|`%;9{_5!E@5o0tE;;x7wKd=BsBCcPi{zeD*2 z0fK#Y4NJ`aDv!fi$nIA|_=@qy`Ww=6k8@`Hz#iBEt%zXGXK*Tz6rjR|&ddjhvx?b- z^Z;5vgUzQ1cr1IktK)j3*&j##!a2dkfL`c3@gVcU7nx6b7|H7$V z(k_QhMuzYMsdTwCVeI{Jz4r5>R*1=>2Yi3txq+gyUvSe()Cuv z<08>M8Iji@$)?QgTbyScw$579s1FD8D&6dBlgfs38Y`4ns6-%NNp z;aBrJJ0I7+r?rw7wA1r#sDf#t{ETK`8z+2iN~?n{u1dh3cEI z`77nuwqM(x9+qy#XX>JLicYLyW`4xi65UkYr-o0>c$sgukH)Lbr^-CuLF(=5?dj*B z=W3b{ak}g(lt`5@sK;^y?`vvZveGfxVj0@(??v#HytHwpk?0Rrf8&P7`5Dpb_0VfE z@qIin|CIkokp8!g;8=omx|wg`5$%14`?s`>yfEpLaHS%rZA&tClb1i`WlcjoUm$lc znA7tu6S?k#Yww~y?xG;MSEGxbIq^F8-y4j^FJ!^V`x=hv$+s)-T4ckX5!(`qjeISe`?nEGUF9* z`&jvG+4(`I$hM|df$xWiP4%}#W5Msh{4|zKWb5P^dqJKfFllEtK(IF}sh~pMyOh$Pl-N=`-udjwNB) zz#oJ`qO8F7i_lBkq=cM7d_ZNj9=~d2+-(->My1caStUk&S=U4N8qhi8mi=qQ;MzvVso>MxkEqAU~1M z=kQ75yP4%IUg9L!Y1_SoNw;v`0ekNgn{?i@kN)1uC{tdp#{TrNLxgWW7-K|vyKFQ1 zpS#>wrE5ZdtiO{c9sR-Eky~}Q5&RKkGaA_N$^zfdl&UrWUplXbUwgdi0|4Oy-6A=0{=3xoZ?Yj&Mb0e+4VAF zZtr*84++Bp#y^qOJGq^r@zczUvIHK*&ZqTHPdq)*9^KB=oGPSxm>&u~#Br+f4z`W) z3@R@l-}DvgwfIl4+KKCPJe&Ph&czey^V9x_&kj0BstN3yaJGKRX;kPrsSicG#&kda z7W=ABbrrUds^mh%3*)_e#TWS*{7`0oQco)4rW*z&sMgB~B_l8YY8e2&$Dn7M;1oB2 z`MzZ3_RkT21|LLF?^s3_eG|1F_(gzDJRp8({|os_8G4KujMusobn6F6f=f5pMe97VqM{RnifiN$5rDzZ1xO=A@ z>@qNX&cX1qlVsxU%9(D#@zVf{ve~+o#yt4*EdI1dxm#I#mAT5$cqPU^K1QJ^p3`PU_0(uQODL2g zollASAmA57VZ8YgH|2EWPRg&K^*2<;mYL^!k{uBYoxp zabLF%{0$awFdnU_^HvCbm?1o)tG3{b=WMRTjDIXITUJ&!s%$mxhs`HRfi_RlZns;fTTgP`wOi`D*#K)lF+@y^Zp_=>Muo=h*!VdKxr- zII7yYJ*7RV)tql49D8fet#4nCCLfC+hkoYiGvTX5j=Iw%cuM3|;2;0C(D@m+pq_id6NKYk zw4PhUtUVidD@lg+>I9MLjC z{v$2`ui$!dyg1Q8JtSySZwcB?7KIi%N!uYN1IID`!z59PoFzG0BD9`<3fCX3d%Z*v zBoN|w>v=rCbNFz1Q2wP3k~OLKJkF2*GS+W}b=fzJ?WET8z#mq01}ONxE(*q`+A0z6 zPxRF6oTo-@6SH4sPuo`f$b>u{^d;_BJ0~{aenj#D@UaYxu*2gJ@E{>ykx|+Oz38A4 z=S=j^N4(U<#=7oCaxcw(3(gmMR2Rtz{8PdX8;sUsMb(wTloaNkQn5PA5bw;(DTZo*f$UdC zY)0G3LKQ~?xWpzkB>^L6f%>*xSL>dVeaeXREZnc;Amnb4&k{HyQoRrLUifhvw58yO z>}}0%#P$6xaznJL?pm^^valnc;vtGf>Jo#FsjbwEDg)nyBVW{%2R!7hs(J_DCqk}# z5zGIXuPmQYYXJTs_q_@{g^VdG4|_)2s9&3d_Rd00^h@*)N9F^5$z7toqsaqb#g03R z@=vak(S@2ktk3XYCAkXlTSld5(j~O*>Y$+bNIK4+0Q`dEE6te&zL0f+hVm%{{9tKL z3had{#8cc5ueR`pevGb!NzE@m|1t0tZjggA;$MW`dPZ;3` z6KXJjvY-aNO~1`R>Zi=wd>P|ey+d2s41NXbl_1~4$nl0g>H)7-CVSP`1k4AnSS$;x zEYK5sznA;D6kl+QjlEnn$OsCOZq0|ioE&;NsRMc`Zx`HIiv3g|Jy6_;_m0fZe-wuM z;|ZY81I8dTI*H9s5{iMQqF@Cx>h{YptY;Q{h4Pvf^RcGlHQMn!*NB59HFuH!HOx5% z>!FaVK)4Nh8>tigc5cA_?dp@2J@6FyOerZBcHsNVQwBQ?*YcQoErq4~jm9H!27~sh z4fut_;v8U4K@VLZae%+LyJF)g@Ew;V^Mm=WN2fAY%8&OP1$}+IGY>SNUgS{z$}o-v z$CZf6!~De~c3N6n&n*ZU27n=DeGt%qo@-81irTKiT!a+Qc8(F54zctU6fB zR6}ng6nITkbfM~r>ItbvehT_ab}(u2<6TX=n33QkVg0SE(`>1jmjk`A=Pgt}pX=rp z5e$Vo)C2arivC9}y0F0Vj84M;vGV4AI{yW(;>^%K!siqpoCSUNq>RP}9r9Jl7{N~D zH&5c)@Hq?Nb&+v5lP_UB0|S6=p#IBym#5p8fxlGU@vOVFHji`#jTsBPf*-T|Nlh2V zw~ei58NaZ+sma)k_pM0E)&m*;+}Cy(e;A*}vnfB|