diff --git a/.cargo/config.toml b/.cargo/config.toml
new file mode 100644
index 0000000..4b9a056
--- /dev/null
+++ b/.cargo/config.toml
@@ -0,0 +1,5 @@
+[target.'cfg(unix)']
+runner = "sudo -E"
+
+[build]
+rustflags = ["-C", "target-cpu=native"]
\ No newline at end of file
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..da75d43
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,2861 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "abi_stable"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7725ddc1a1204829816071550fdffafe7e66498e7a99e5f703da71801101ccb9"
+dependencies = [
+ "abi_stable_derive",
+ "abi_stable_shared",
+ "core_extensions",
+ "crossbeam-channel",
+ "generational-arena",
+ "libloading",
+ "lock_api",
+ "parking_lot 0.11.2",
+ "paste",
+ "repr_offset",
+ "rustc_version 0.4.0",
+ "serde",
+ "serde_derive",
+ "serde_json",
+]
+
+[[package]]
+name = "abi_stable_derive"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b9810ef8debee5544010d92dac0b88b32853cd5bd5ca3298243c99e931da0f0"
+dependencies = [
+ "abi_stable_shared",
+ "as_derive_utils",
+ "core_extensions",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "rustc_version 0.2.3",
+ "syn 1.0.109",
+ "typed-arena",
+]
+
+[[package]]
+name = "abi_stable_shared"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ece9da89066e018d908b48755e17cdd08a46ce222f84b1f226e837f836f84a5f"
+dependencies = [
+ "core_extensions",
+]
+
+[[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"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "ahash"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "version_check",
+ "zerocopy",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anstream"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
+
+[[package]]
+name = "as_derive_utils"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a26fa495cefb8c86d9ce183b3f39ad11678e54fb3c20e6b7dbd87770811d9b"
+dependencies = [
+ "core_extensions",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "async-trait"
+version = "0.1.74"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
+dependencies = [
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "axum"
+version = "0.6.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
+dependencies = [
+ "async-trait",
+ "axum-core",
+ "base64",
+ "bitflags 1.3.2",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "itoa",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustversion",
+ "serde",
+ "serde_json",
+ "serde_path_to_error",
+ "serde_urlencoded",
+ "sha1",
+ "sync_wrapper",
+ "tokio",
+ "tokio-tungstenite",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "mime",
+ "rustversion",
+ "tower-layer",
+ "tower-service",
+]
+
+[[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 = "base64"
+version = "0.21.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9"
+
+[[package]]
+name = "bit_field"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
+
+[[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.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
+
+[[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 = "bumpalo"
+version = "3.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "bytes"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+
+[[package]]
+name = "cc"
+version = "1.0.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "cglue"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0618788ed53d08a2c1f64a69255b65de151a7f39beaf897296ef7ca0d89c2f20"
+dependencies = [
+ "abi_stable",
+ "cglue-macro",
+ "no-std-compat",
+ "rustc_version 0.4.0",
+ "serde",
+ "tarc",
+]
+
+[[package]]
+name = "cglue-gen"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09113ac46fb70539ed96b74af4382516fc25bfc463164eeb0ca036b9f77371d8"
+dependencies = [
+ "itertools",
+ "lazy_static",
+ "proc-macro-crate 2.0.0",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "cglue-macro"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf28b8c74a050973c9972edfad2f32f404bc1ff6725e37d003e7d55504dec1cf"
+dependencies = [
+ "cglue-gen",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "chrono"
+version = "0.4.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-targets",
+]
+
+[[package]]
+name = "clap"
+version = "4.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
+dependencies = [
+ "heck 0.4.1",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
+
+[[package]]
+name = "coarsetime"
+version = "0.1.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a73ef0d00d14301df35d0f13f5ea32344de6b00837485c358458f1e7f2d27db4"
+dependencies = [
+ "libc",
+ "once_cell",
+ "wasi",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "colorchoice"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+
+[[package]]
+name = "colored"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6"
+dependencies = [
+ "is-terminal",
+ "lazy_static",
+ "windows-sys 0.48.0",
+]
+
+[[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_extensions"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92c71dc07c9721607e7a16108336048ee978c3a8b129294534272e8bac96c0ee"
+dependencies = [
+ "core_extensions_proc_macros",
+]
+
+[[package]]
+name = "core_extensions_proc_macros"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69f3b219d28b6e3b4ac87bc1fc522e0803ab22e055da177bff0068c4150c61a6"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+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 = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "darling"
+version = "0.13.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.13.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "strsim",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.13.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
+dependencies = [
+ "darling_core",
+ "quote 1.0.33",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "data-encoding"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
+
+[[package]]
+name = "dataview"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47a802a2cad0ff4dfc4f3110da174b7a6928c315cae523e88638cfb72941b4d5"
+
+[[package]]
+name = "dataview"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50eb3a329e19d78c3a3dfa4ec5a51ecb84fa3a20c06edad04be25356018218f9"
+dependencies = [
+ "derive_pod",
+]
+
+[[package]]
+name = "deranged"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3"
+dependencies = [
+ "powerfmt",
+]
+
+[[package]]
+name = "derive_pod"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2ea6706d74fca54e15f1d40b5cf7fe7f764aaec61352a9fcec58fe27e042fc8"
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "dirs"
+version = "4.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
+[[package]]
+name = "either"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "enum-primitive-derive"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c375b9c5eadb68d0a6efee2999fef292f45854c3444c86f09d8ab086ba942b0e"
+dependencies = [
+ "num-traits",
+ "quote 1.0.33",
+ "syn 1.0.109",
+]
+
+[[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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860"
+dependencies = [
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+
+[[package]]
+name = "field_types"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "152ff4498a8c01b91737676420a1cd84e92724cb610320fdebee6838e4651c9a"
+dependencies = [
+ "heck 0.3.3",
+ "quote 0.6.13",
+ "syn 0.15.44",
+]
+
+[[package]]
+name = "fixed-slice-vec"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bb23c599a9ff5b981529099902fe5de8d55ecc8c1f451542da17b8d2d65326e"
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[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 = "form_urlencoded"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"
+
+[[package]]
+name = "futures-io"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb"
+dependencies = [
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817"
+
+[[package]]
+name = "futures-task"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"
+
+[[package]]
+name = "futures-util"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"
+dependencies = [
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "generational-arena"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877e94aff08e743b651baaea359664321055749b398adff8740a7399af7796e7"
+dependencies = [
+ "cfg-if",
+]
+
+[[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"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "gimli"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
+
+[[package]]
+name = "goblin"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143"
+dependencies = [
+ "log",
+ "plain",
+ "scroll",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap 1.9.3",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hashbrown"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
+dependencies = [
+ "ahash",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.14.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156"
+
+[[package]]
+name = "heck"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
+
+[[package]]
+name = "http"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-range-header"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f"
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+
+[[package]]
+name = "humantime"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+
+[[package]]
+name = "hyper"
+version = "0.14.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2 0.4.10",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+dependencies = [
+ "bytes",
+ "hyper",
+ "native-tls",
+ "tokio",
+ "tokio-native-tls",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.58"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[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.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.14.2",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
+
+[[package]]
+name = "is-terminal"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
+dependencies = [
+ "hermit-abi",
+ "rustix 0.38.21",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+
+[[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.149"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
+
+[[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 = "linux-raw-sys"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f"
+
+[[package]]
+name = "local-ip-address"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "66357e687a569abca487dc399a9c9ac19beb3f13991ed49f00c144e02cbd42ab"
+dependencies = [
+ "libc",
+ "neli",
+ "thiserror",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "lock_api"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+
+[[package]]
+name = "matchit"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+
+[[package]]
+name = "memchr"
+version = "2.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
+
+[[package]]
+name = "memflow"
+version = "0.2.0-beta10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7f18ed9240420aadc21d8ba082e4a27c526fd3155a829b4de94013eb7855766"
+dependencies = [
+ "abi_stable",
+ "bitflags 1.3.2",
+ "bumpalo",
+ "cglue",
+ "coarsetime",
+ "dataview 1.0.1",
+ "dirs",
+ "fixed-slice-vec",
+ "goblin",
+ "hashbrown 0.13.2",
+ "itertools",
+ "libloading",
+ "log",
+ "memflow-derive",
+ "memmap",
+ "no-std-compat",
+ "once_cell",
+ "pelite",
+ "rangemap",
+ "serde",
+ "smallvec",
+ "toml",
+ "x86_64",
+]
+
+[[package]]
+name = "memflow-derive"
+version = "0.2.0-beta3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee50e66f855a8a9c93b7c107fab899b25952ba8c7f0e97602a662a99c84fbef7"
+dependencies = [
+ "darling",
+ "proc-macro-crate 1.3.1",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "memmap"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "mime_guess"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
+dependencies = [
+ "mime",
+ "unicase",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0"
+dependencies = [
+ "libc",
+ "wasi",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "native-tls"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
+[[package]]
+name = "neli"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1100229e06604150b3becd61a4965d5c70f3be1759544ea7274166f4be41ef43"
+dependencies = [
+ "byteorder",
+ "libc",
+ "log",
+ "neli-proc-macros",
+]
+
+[[package]]
+name = "neli-proc-macros"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c168194d373b1e134786274020dae7fc5513d565ea2ebb9bc9ff17ffb69106d4"
+dependencies = [
+ "either",
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "serde",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "no-std-compat"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c"
+
+[[package]]
+name = "ntapi"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "num_threads"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "object"
+version = "0.32.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "openssl"
+version = "0.10.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c"
+dependencies = [
+ "bitflags 2.4.1",
+ "cfg-if",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
+dependencies = [
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core 0.8.6",
+]
+
+[[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 0.9.9",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
+dependencies = [
+ "cfg-if",
+ "instant",
+ "libc",
+ "redox_syscall 0.2.16",
+ "smallvec",
+ "winapi",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall 0.4.1",
+ "smallvec",
+ "windows-targets",
+]
+
+[[package]]
+name = "paste"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+
+[[package]]
+name = "pelite"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c270b1a0c279bbcb4cff3d2294121731c48ee68f0435d26cf71018a853cb890"
+dependencies = [
+ "dataview 0.1.2",
+ "no-std-compat",
+ "pelite-macros",
+]
+
+[[package]]
+name = "pelite-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a7cf3f8ecebb0f4895f4892a8be0a0dc81b498f9d56735cb769dc31bf00815b"
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+
+[[package]]
+name = "pin-project"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
+dependencies = [
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+
+[[package]]
+name = "plain"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
+
+[[package]]
+name = "powerfmt"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+
+[[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"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
+dependencies = [
+ "once_cell",
+ "toml_edit 0.19.15",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8"
+dependencies = [
+ "toml_edit 0.20.7",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "0.4.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
+dependencies = [
+ "proc-macro2 0.4.30",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+dependencies = [
+ "proc-macro2 1.0.69",
+]
+
+[[package]]
+name = "radarflow-cs2"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "axum",
+ "chrono",
+ "clap",
+ "dataview 1.0.1",
+ "enum-primitive-derive",
+ "env_logger",
+ "field_types",
+ "futures-util",
+ "local-ip-address",
+ "log",
+ "memflow",
+ "num-traits",
+ "reqwest",
+ "serde",
+ "serde_json",
+ "simple_logger",
+ "tokio",
+ "tokio-timerfd",
+ "toml",
+ "tower",
+ "tower-http",
+ "vergen",
+]
+
+[[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 = "rangemap"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "977b1e897f9d764566891689e642653e5ed90c6895106acd005eb4c1d0203991"
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
+dependencies = [
+ "getrandom",
+ "redox_syscall 0.2.16",
+ "thiserror",
+]
+
+[[package]]
+name = "regex"
+version = "1.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+
+[[package]]
+name = "repr_offset"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb1070755bd29dffc19d0971cab794e607839ba2ef4b69a9e6fbc8733c1b72ea"
+dependencies = [
+ "tstr",
+]
+
+[[package]]
+name = "reqwest"
+version = "0.11.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b"
+dependencies = [
+ "base64",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-tls",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "native-tls",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "system-configuration",
+ "tokio",
+ "tokio-native-tls",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "winreg",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver 0.9.0",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver 1.0.20",
+]
+
+[[package]]
+name = "rustix"
+version = "0.37.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2"
+dependencies = [
+ "bitflags 1.3.2",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys 0.3.8",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "rustix"
+version = "0.38.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3"
+dependencies = [
+ "bitflags 2.4.1",
+ "errno",
+ "libc",
+ "linux-raw-sys 0.4.10",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
+
+[[package]]
+name = "ryu"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+
+[[package]]
+name = "schannel"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "scroll"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da"
+dependencies = [
+ "scroll_derive",
+]
+
+[[package]]
+name = "scroll_derive"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae"
+dependencies = [
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "security-framework"
+version = "2.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090"
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "serde"
+version = "1.0.190"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.190"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3"
+dependencies = [
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.107"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_path_to_error"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335"
+dependencies = [
+ "itoa",
+ "serde",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "simple_logger"
+version = "4.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2230cd5c29b815c9b699fb610b49a5ed65588f3509d9f0108be3a885da629333"
+dependencies = [
+ "colored",
+ "log",
+ "time",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
+
+[[package]]
+name = "socket2"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "socket2"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
+dependencies = [
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "syn"
+version = "0.15.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
+dependencies = [
+ "proc-macro2 0.4.30",
+ "quote 0.6.13",
+ "unicode-xid",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
+dependencies = [
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sync_wrapper"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+
+[[package]]
+name = "sysinfo"
+version = "0.29.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a18d114d420ada3a891e6bc8e96a2023402203296a47cdd65083377dad18ba5"
+dependencies = [
+ "cfg-if",
+ "core-foundation-sys",
+ "libc",
+ "ntapi",
+ "once_cell",
+ "winapi",
+]
+
+[[package]]
+name = "system-configuration"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "system-configuration-sys",
+]
+
+[[package]]
+name = "system-configuration-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "tarc"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87f125b47a83cc4bfe253c9a5b7b991a47c315002232f715b4af9248c05f91a2"
+
+[[package]]
+name = "tempfile"
+version = "3.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "redox_syscall 0.4.1",
+ "rustix 0.38.21",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
+dependencies = [
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "time"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5"
+dependencies = [
+ "deranged",
+ "itoa",
+ "libc",
+ "num_threads",
+ "powerfmt",
+ "serde",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
+
+[[package]]
+name = "time-macros"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20"
+dependencies = [
+ "time-core",
+]
+
+[[package]]
+name = "timerfd"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d3fd47d83ad0b5c7be2e8db0b9d712901ef6ce5afbcc6f676761004f5104ea2"
+dependencies = [
+ "rustix 0.37.27",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tokio"
+version = "1.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653"
+dependencies = [
+ "backtrace",
+ "bytes",
+ "libc",
+ "mio",
+ "num_cpus",
+ "parking_lot 0.12.1",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2 0.5.5",
+ "tokio-macros",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
+dependencies = [
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-timerfd"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87eecdae9a9b793843b1df7a64bc136f203443c1ca9889b3c4a39590afa51094"
+dependencies = [
+ "futures-core",
+ "libc",
+ "slab",
+ "timerfd",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-tungstenite"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c"
+dependencies = [
+ "futures-util",
+ "log",
+ "tokio",
+ "tungstenite",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "toml"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257"
+dependencies = [
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit 0.19.15",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.19.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+dependencies = [
+ "indexmap 2.0.2",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.20.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
+dependencies = [
+ "indexmap 2.0.2",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "tower"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project",
+ "pin-project-lite",
+ "tokio",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-http"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"
+dependencies = [
+ "bitflags 2.4.1",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-range-header",
+ "httpdate",
+ "mime",
+ "mime_guess",
+ "percent-encoding",
+ "pin-project-lite",
+ "tokio",
+ "tokio-util",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+dependencies = [
+ "log",
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
+[[package]]
+name = "tstr"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cca3264971090dec0feef3b455a3c178f02762f7550cf4592991ac64b3be2d7e"
+dependencies = [
+ "tstr_proc_macros",
+]
+
+[[package]]
+name = "tstr_proc_macros"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e78122066b0cb818b8afd08f7ed22f7fdbc3e90815035726f0840d0d26c0747a"
+
+[[package]]
+name = "tungstenite"
+version = "0.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9"
+dependencies = [
+ "byteorder",
+ "bytes",
+ "data-encoding",
+ "http",
+ "httparse",
+ "log",
+ "rand",
+ "sha1",
+ "thiserror",
+ "url",
+ "utf-8",
+]
+
+[[package]]
+name = "typed-arena"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
+
+[[package]]
+name = "typenum"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+
+[[package]]
+name = "unicase"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+
+[[package]]
+name = "unicode-xid"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
+
+[[package]]
+name = "url"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "vergen"
+version = "8.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85e7dc29b3c54a2ea67ef4f953d5ec0c4085035c0ae2d325be1c0d2144bd9f16"
+dependencies = [
+ "anyhow",
+ "rustc_version 0.4.0",
+ "rustversion",
+ "sysinfo",
+ "time",
+]
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "volatile"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "442887c63f2c839b346c192d047a7c87e73d0689c9157b00b53dcc27dd5ea793"
+
+[[package]]
+name = "want"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+dependencies = [
+ "try-lock",
+]
+
+[[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 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+ "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"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+dependencies = [
+ "quote 1.0.33",
+ "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 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+ "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 = "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"
+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-util"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
+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-core"
+version = "0.51.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+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-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "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]]
+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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "winnow"
+version = "0.5.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.50.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
+dependencies = [
+ "cfg-if",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "x86_64"
+version = "0.14.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b835097a84e4457323331ec5d6eb23d096066cbfb215d54096dcb4b2e85f500"
+dependencies = [
+ "bit_field",
+ "bitflags 2.4.1",
+ "rustversion",
+ "volatile",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd66a62464e3ffd4e37bd09950c2b9dd6c4f8767380fabba0d523f9a775bc85a"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "255c4596d41e6916ced49cfafea18727b24d67878fa180ddfd69b9df34fd1726"
+dependencies = [
+ "proc-macro2 1.0.69",
+ "quote 1.0.33",
+ "syn 2.0.38",
+]
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..46232ab
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,46 @@
+[package]
+name = "radarflow-cs2"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+# dma and memory
+memflow = "=0.2.0-beta10"
+dataview = "1.0.1"
+
+# logging 
+log = "0.4.19"
+env_logger = "0.10.0"
+
+# error handling
+anyhow = "1.0.72"
+
+# tokio
+tokio = { version = "1.29.1", features = ["full"] }
+field_types = "1.1.0"
+futures-util = "0.3.28"
+
+# serde
+serde = { version = "1.0.181", features = ["derive"] }
+serde_json = "1.0.104"
+toml = "0.7.6"
+
+# networking
+axum = { version = "0.6.20", features = ["ws"] }
+tower-http = { version = "0.4.3", features = ["fs"] }
+tower = "0.4.13"
+tokio-timerfd = "0.2.0"
+
+# other
+local-ip-address = "0.5.4"
+enum-primitive-derive = "0.2.2"
+num-traits = "0.2.16"
+clap = { version = "4.3.19", features = ["derive", "string"] }
+simple_logger = "4.2.0"
+chrono = "0.4.26"
+
+[build-dependencies]
+reqwest = { version = "0.11.18", features = ["blocking"] }
+vergen = { version = "8.0.0", features = ["build", "cargo", "git", "gitcl", "rustc", "si"] }
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8349d77
--- /dev/null
+++ b/README.md
@@ -0,0 +1,22 @@
+# radarflow
+A Web radar for CS:GO using [memflow](https://github.com/memflow/memflow)
+
+## How can I run this?
+First, you need to set up a virtual machine on linux using qemu.  
+As of now, memflow's pcileech connector is not supported.
+
+How to set up a VM on linux is way out of scope for this. You can find plenty of information online on how to do it.
+
+After you have set up your VM, you can clone this repository on your host:  
+`git clone https://github.com/superyu1337/radarflow.git`
+
+Now you can run radarflow:  
+`cargo run --release`
+
+For an overview of CLI commands, run this:  
+`cargo run --release -- --help`
+
+## Detection Status
+VAC: ✅ (Undetected)  
+FaceIt: ❓ (Unknown, could work with proper spoofing)  
+ESEA: ❓ (Unknown, could work with proper spoofing)  
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..76c84d8
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,42 @@
+use std::error::Error;
+use vergen::EmitBuilder;
+
+fn download(url: &str, to: &str) -> Result<(), Box<dyn Error>> {
+    let content = reqwest::blocking::get(url)
+        .unwrap_or_else(|_| panic!("Downloading \"{to}\""))
+        .text()
+        .expect("Convert response to text");
+
+    std::fs::write(to, content)
+    .expect("Write offsets to file");
+
+    Ok(())
+}
+
+fn main() -> Result<(), Box<dyn Error>> {
+
+    download(
+        "https://raw.githubusercontent.com/a2x/cs2-dumper/main/generated/client.dll.rs",
+        "./src/sdk/cs2dumper/client.rs"
+    ).expect("Failed to download build file");
+
+    download(
+        "https://raw.githubusercontent.com/a2x/cs2-dumper/main/generated/offsets.rs",
+        "./src/sdk/cs2dumper/offsets.rs"
+    ).expect("Failed to download build file");
+
+    download(
+        "https://raw.githubusercontent.com/a2x/cs2-dumper/main/generated/engine2.dll.rs",
+        "./src/sdk/cs2dumper/engine2.rs"
+    ).expect("Failed to download build file");
+
+    EmitBuilder::builder()
+        .git_sha(true)
+        .git_commit_date()
+        .cargo_debug()
+        .cargo_target_triple()
+        .rustc_semver()
+        .rustc_llvm_version()
+        .emit()?;
+    Ok(())
+}
\ No newline at end of file
diff --git a/src/cli.rs b/src/cli.rs
new file mode 100644
index 0000000..aff9fcb
--- /dev/null
+++ b/src/cli.rs
@@ -0,0 +1,93 @@
+use std::path::PathBuf;
+
+use clap::Parser;
+use memflow::prelude::Inventory;
+
+use crate::structs::{Connector, Loglevel};
+
+const PORT_RANGE: std::ops::RangeInclusive<usize> = 8000..=65535;
+const POLL_RANGE: std::ops::RangeInclusive<usize> = 1..=1000;
+
+#[derive(Parser)]
+#[command(author, version = version(), about, long_about = None)]
+pub struct Cli {
+    /// Connector to use for DMA
+    #[clap(value_enum, short, long, ignore_case = true, default_value_t = Connector::Qemu)]
+    pub connector: Connector,
+
+    /// Pcileech device name
+    #[clap(long, default_value_t = String::from("FPGA"))]
+    pub pcileech_device: String,
+
+    /// Port to run Webserver on
+    #[arg(short, long, default_value_t = 8000, value_parser = port_in_range)]
+    pub port: u16,
+
+    /// Path to serve on webserver
+    #[arg(short, long, default_value = "./web", value_parser = valid_path)]
+    pub web_path: PathBuf,
+
+    /// How often per second the DMA thread should poll for data
+    #[arg(short = 'r', long, default_value_t = 60, value_parser = poll_in_range)]
+    pub poll_rate: u16,
+
+    /// Loglevel verbosity
+    #[arg(value_enum, long, short,  ignore_case = true, default_value_t = Loglevel::Warn)]
+    pub loglevel: Loglevel,
+}
+
+fn version() -> String {
+    let pkg_ver = env!("CARGO_PKG_VERSION");
+    let git_hash = option_env!("VERGEN_GIT_SHA").unwrap_or("unknown");
+    let commit_date = option_env!("VERGEN_GIT_COMMIT_DATE").unwrap_or("unknown");
+    let avail_cons = {
+        let inventory = Inventory::scan();
+        inventory.available_connectors().join(", ")
+    };
+
+    format!(" {pkg_ver} (rev {git_hash})\nCommit Date: {commit_date}\nAvailable Connectors: {avail_cons}")
+}
+
+fn port_in_range(s: &str) -> Result<u16, String> {
+    let port: usize = s
+        .parse()
+        .map_err(|_| format!("`{s}` isn't a port number"))?;
+    if PORT_RANGE.contains(&port) {
+        Ok(port as u16)
+    } else {
+        Err(format!(
+            "port not in range {}-{}",
+            PORT_RANGE.start(),
+            PORT_RANGE.end()
+        ))
+    }
+}
+
+fn valid_path(s: &str) -> Result<PathBuf, String> {
+    let path = PathBuf::from(s);
+
+    if !path.exists() {
+        return Err("Path does not exist".to_string())
+    }
+
+    if !path.is_dir() {
+        return Err("Path is not a directory".to_string())
+    }
+
+    Ok(path)
+}
+
+fn poll_in_range(s: &str) -> Result<u16, String> {
+    let port: usize = s
+        .parse()
+        .map_err(|_| format!("`{s}` isn't a valid number"))?;
+    if POLL_RANGE.contains(&port) {
+        Ok(port as u16)
+    } else {
+        Err(format!(
+            "not in range {}-{}",
+            POLL_RANGE.start(),
+            POLL_RANGE.end()
+        ))
+    }
+}
\ No newline at end of file
diff --git a/src/dma/mod.rs b/src/dma/mod.rs
new file mode 100644
index 0000000..607fe84
--- /dev/null
+++ b/src/dma/mod.rs
@@ -0,0 +1,268 @@
+use ::std::sync::Arc;
+
+use memflow::prelude::v1::*;
+use tokio::{sync::RwLock, time::{Duration, Instant}};
+
+use crate::{structs::{Connector, communication::{RadarData, PlayerType, EntityData, PlayerData}}, sdk::{self, cs2dumper, structs::{CPlayerPawn, CCSPlayerController}}};
+
+pub struct CheatCtx {
+    pub process: IntoProcessInstanceArcBox<'static>,
+    pub client_module: ModuleInfo,
+    pub engine_module: ModuleInfo,
+}
+
+impl CheatCtx {
+    pub fn setup(connector: Connector, pcileech_device: String) -> anyhow::Result<CheatCtx> {
+        let inventory = Inventory::scan();
+
+        let os = { 
+            if connector == Connector::Pcileech {
+                let args = Args::new()
+                    .insert("device", &pcileech_device);
+
+                let connector_args = ConnectorArgs::new(None, args, None);                
+
+                inventory.builder()
+                    .connector(&connector.to_string())
+                    .args(connector_args)
+                    .os("win32")
+                    .build()?
+            } else {
+                inventory.builder()
+                .connector(&connector.to_string())
+                .os("win32")
+                .build()?
+            }
+        };
+
+        let mut process = os.into_process_by_name("cs2.exe")?;
+
+        let client_module = process.module_by_name("client.dll")?;
+
+        let engine_module = process.module_by_name("engine2.dll")?;
+
+        let ctx = Self {
+            process,
+            client_module,
+            engine_module,
+        };
+
+        Ok(ctx)
+    }
+}
+
+const SECOND_AS_NANO: u64 = 1000*1000*1000;
+static ONCE: std::sync::Once = std::sync::Once::new();
+
+pub async fn run(connector: Connector, pcileech_device: String, poll_rate: u16, data_lock: Arc<RwLock<RadarData>>) -> anyhow::Result<()> {
+    let mut ctx = CheatCtx::setup(connector, pcileech_device)?;
+
+    // Avoid printing warnings and other stuff before the initial prints are complete
+    tokio::time::sleep(Duration::from_millis(500)).await;
+
+    // For poll rate timing
+    let should_time = poll_rate != 0;
+
+    let target_interval = Duration::from_nanos(SECOND_AS_NANO / poll_rate as u64);
+    let mut last_iteration_time = Instant::now();
+    let mut missmatch_count = 0;
+
+    loop {
+        if ctx.process.state().is_dead() {
+            println!("is dead");
+            break;
+        }
+
+        if sdk::is_ingame(&mut ctx)? {
+            let globals = sdk::get_globals(&mut ctx)?;
+            let entity_list = sdk::get_entity_list(&mut ctx)?;
+            let map_name = sdk::map_name(globals, &mut ctx)?;
+
+            let local = sdk::get_local(&mut ctx)?;
+
+            let local_pawn_ptr: u32 = ctx.process.read(local.ptr() + cs2dumper::client::CCSPlayerController::m_hPlayerPawn)?; 
+            
+            if let Some(local_pawn) = CPlayerPawn::from_uhandle(local_pawn_ptr, entity_list, &mut ctx) {
+                let local_yaw = local_pawn.angles(&mut ctx)?.y;
+                let local_pos = local_pawn.pos(&mut ctx)?;
+                let mut player_data = Vec::with_capacity(64);
+    
+                if local_pawn.is_alive(&mut ctx)? {
+                    player_data.push(
+                        EntityData::Player(
+                            PlayerData::new(
+                                local_pos, 
+                                local_yaw,
+                                PlayerType::Local,
+                                false
+                            )
+                        )
+                    );
+                }
+
+                let max_clients = sdk::max_clients(globals, &mut ctx)?;
+
+                for idx in 1..max_clients {
+                    let list_entry = ctx.process.read_addr64(entity_list + ((8 * (idx & 0x7FFF)) >> 9) + 16)?;
+                    if list_entry.is_null() && !list_entry.is_valid() {
+                        continue;
+                    }
+    
+                    let player_ptr = ctx.process.read_addr64(list_entry + 120 * (idx & 0x1FF))?;
+                    if player_ptr.is_null() && !player_ptr.is_valid() {
+                        continue;
+                    }
+    
+                    let pawn_uhandle = ctx.process.read(player_ptr + cs2dumper::client::CCSPlayerController::m_hPlayerPawn)?;
+    
+                    if let (Some(pawn), player) = (CPlayerPawn::from_uhandle(pawn_uhandle, entity_list, &mut ctx), CCSPlayerController::new(player_ptr)) {
+                        if player.entity_identity(&mut ctx)?.designer_name(&mut ctx)? == "cs_player_controller" && pawn.is_alive(&mut ctx)? {
+                            let pos = pawn.pos(&mut ctx)?;
+                            let angles = pawn.angles(&mut ctx)?;
+                
+                            let player_type = {
+                                match player.get_player_type(&mut ctx, &local)? {
+                                    Some(t) => {
+                                        if t == PlayerType::Spectator { continue } else { t }
+                                    },
+                                    None => { continue },
+                                }
+                            };
+            
+                            player_data.push(
+                                EntityData::Player(
+                                    PlayerData::new(
+                                        pos, 
+                                        angles.y,
+                                        player_type,
+                                        false
+                                    )
+                                )
+                            );
+                        }
+                    }
+                }
+    
+                let mut data = data_lock.write().await;
+                *data = RadarData::new(true, map_name, player_data, local_yaw)
+            }
+
+
+
+
+            //let local_pawn = sdk::get_local_pawn(&mut ctx)?;
+            //let local_pawn = CPlayerPawn::new(local_cs_player_pawn);
+
+
+
+
+
+            /*
+
+            let mut next_ent = {
+                let mut iter_ent = local.to_base();
+                while iter_ent.entity_identity(&mut ctx)?.prev_by_class(&mut ctx).is_ok() {
+                    iter_ent = iter_ent.entity_identity(&mut ctx)?.prev_by_class(&mut ctx)?;
+                }
+    
+                iter_ent
+            };
+
+            let mut count = 0;
+            let mut pawn_count = 0;
+
+            println!("prev by class ok? {}", next_ent.entity_identity(&mut ctx)?.prev_by_class(&mut ctx).is_ok());
+
+            while next_ent.entity_identity(&mut ctx)?.next_by_class(&mut ctx).is_ok() {
+                count += 1;
+                let pawn = next_ent.to_controller().pawn(entity_list, &mut ctx)?;
+
+                if let Some(p) = pawn {
+                    pawn_count += 1;
+                    if !p.is_alive(&mut ctx)? {
+                        next_ent = next_ent.entity_identity(&mut ctx).unwrap().next_by_class(&mut ctx).unwrap();
+                        continue
+                    }
+    
+                    let pos = p.pos(&mut ctx)?;
+                    let angles = p.angles(&mut ctx)?;
+        
+                    let player_type = {
+                        match next_ent.to_controller().get_player_type(&mut ctx, &local)? {
+                            Some(t) => {
+                                if t == PlayerType::Spectator {
+                                    next_ent = next_ent.entity_identity(&mut ctx).unwrap().next_by_class(&mut ctx).unwrap();
+                                    continue
+                                } else { t }
+                            },
+                            None => {
+                                next_ent = next_ent.entity_identity(&mut ctx).unwrap().next_by_class(&mut ctx).unwrap();
+                                continue 
+                            },
+                        }
+                    };
+    
+                    player_data.push(
+                        EntityData::Player(
+                            PlayerData::new(
+                                pos, 
+                                angles.y,
+                                player_type,
+                                false
+                            )
+                        )
+                    );
+                }
+                //let pawn = next_ent.to_controller().pawn2(entity_list, &mut ctx)?;
+
+                next_ent = next_ent.entity_identity(&mut ctx)?.next_by_class(&mut ctx)?;
+            }
+
+            println!("next by class ok? {}", next_ent.entity_identity(&mut ctx)?.next_by_class(&mut ctx).is_ok());
+
+            */
+
+        } else {
+            let mut data = data_lock.write().await;
+            *data = RadarData::empty();
+        }
+
+        if should_time {
+            let elapsed = last_iteration_time.elapsed();
+    
+            let remaining = match target_interval.checked_sub(elapsed) {
+                Some(t) => t,
+                None => {
+                    if missmatch_count >= 25 {
+                        ONCE.call_once(|| {
+                            log::warn!("Remaining time till target interval was negative more than 25 times");
+                            log::warn!("You should decrease your poll rate.");
+                            log::warn!("elapsed: {}ns", elapsed.as_nanos());
+                            log::warn!("target: {}ns", target_interval.as_nanos());
+                        });
+                    } else {
+                        missmatch_count += 1;
+                    }
+                    Duration::from_nanos(0)
+                },
+            };
+    
+            #[cfg(target_os = "linux")]
+            tokio_timerfd::sleep(remaining).await?;
+    
+            #[cfg(not(target_os = "linux"))]
+            tokio::time::sleep(remaining).await;
+    
+            log::trace!("polling at {:.2}Hz", SECOND_AS_NANO as f64 / last_iteration_time.elapsed().as_nanos() as f64);
+            log::trace!("elapsed: {}", elapsed.as_nanos());
+            log::trace!("target: {}", target_interval.as_nanos());
+            log::trace!("missmatch count: {}", missmatch_count);
+    
+            last_iteration_time = Instant::now();
+        }
+    }
+
+    println!("DMA loop exited for some reason");
+
+    Ok(())
+}
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..ca51150
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,62 @@
+use ::std::sync::Arc;
+use clap::Parser;
+
+use cli::Cli;
+use structs::communication::RadarData;
+use tokio::sync::RwLock;
+
+mod dma;
+mod sdk;
+mod structs;
+mod cli;
+mod webserver;
+
+#[tokio::main]
+async fn main() -> anyhow::Result<()> {
+    let cli = Cli::parse();
+
+    if std::env::var("RADARFLOW_LOG").is_err() {
+        std::env::set_var("RADARFLOW_LOG", "warn")
+    }
+
+    simple_logger::SimpleLogger::new()
+        .with_level(cli.loglevel.into())
+        .init()
+        .expect("Initializing logger");
+
+    let rwlock = Arc::new(
+        RwLock::new(
+            RadarData::empty()
+        )
+    );
+
+    let rwlock_clone = rwlock.clone();
+    let dma_handle = tokio::spawn(async move {
+        if let Err(err) = dma::run(cli.connector, cli.pcileech_device, cli.poll_rate, rwlock_clone).await {
+            log::error!("Error in dma thread: {}", err.to_string());
+        }
+
+    });
+
+    tokio::spawn(async move {
+        let future = webserver::run(cli.web_path, cli.port, rwlock);
+
+        if let Ok(my_local_ip) = local_ip_address::local_ip() {
+            let address = format!("http://{}:{}", my_local_ip, cli.port);
+            println!("Launched webserver at {}", address);
+        } else {
+            let address = format!("http://0.0.0.0:{}", cli.port);
+            println!("launched webserver at! {}", address);
+        }
+
+        if let Err(err) = future.await {
+            log::error!("Error in websocket server: {}", err.to_string());
+        }
+    });
+
+    if let Err(err) = dma_handle.await {
+        log::error!("Error when waiting for dma thread: {}", err.to_string());
+    }
+
+    Ok(())
+}
diff --git a/src/sdk/cs2dumper/client.rs b/src/sdk/cs2dumper/client.rs
new file mode 100644
index 0000000..8c086a4
--- /dev/null
+++ b/src/sdk/cs2dumper/client.rs
@@ -0,0 +1,4138 @@
+/*
+ * Created using https://github.com/a2x/cs2-dumper
+ * Fri, 27 Oct 2023 01:03:23 +0000
+ */
+
+#![allow(non_snake_case, non_upper_case_globals)]
+
+pub mod ActiveModelConfig_t {
+    pub const m_Handle: usize = 0x28; // ModelConfigHandle_t
+    pub const m_Name: usize = 0x30; // CUtlSymbolLarge
+    pub const m_AssociatedEntities: usize = 0x38; // C_NetworkUtlVectorBase<CHandle<C_BaseModelEntity>>
+    pub const m_AssociatedEntityNames: usize = 0x50; // C_NetworkUtlVectorBase<CUtlSymbolLarge>
+}
+
+pub mod CAnimGraphNetworkedVariables {
+    pub const m_PredNetBoolVariables: usize = 0x8; // C_NetworkUtlVectorBase<uint32_t>
+    pub const m_PredNetByteVariables: usize = 0x20; // C_NetworkUtlVectorBase<uint8_t>
+    pub const m_PredNetUInt16Variables: usize = 0x38; // C_NetworkUtlVectorBase<uint16_t>
+    pub const m_PredNetIntVariables: usize = 0x50; // C_NetworkUtlVectorBase<int32_t>
+    pub const m_PredNetUInt32Variables: usize = 0x68; // C_NetworkUtlVectorBase<uint32_t>
+    pub const m_PredNetUInt64Variables: usize = 0x80; // C_NetworkUtlVectorBase<uint64_t>
+    pub const m_PredNetFloatVariables: usize = 0x98; // C_NetworkUtlVectorBase<float>
+    pub const m_PredNetVectorVariables: usize = 0xB0; // C_NetworkUtlVectorBase<Vector>
+    pub const m_PredNetQuaternionVariables: usize = 0xC8; // C_NetworkUtlVectorBase<Quaternion>
+    pub const m_OwnerOnlyPredNetBoolVariables: usize = 0xE0; // C_NetworkUtlVectorBase<uint32_t>
+    pub const m_OwnerOnlyPredNetByteVariables: usize = 0xF8; // C_NetworkUtlVectorBase<uint8_t>
+    pub const m_OwnerOnlyPredNetUInt16Variables: usize = 0x110; // C_NetworkUtlVectorBase<uint16_t>
+    pub const m_OwnerOnlyPredNetIntVariables: usize = 0x128; // C_NetworkUtlVectorBase<int32_t>
+    pub const m_OwnerOnlyPredNetUInt32Variables: usize = 0x140; // C_NetworkUtlVectorBase<uint32_t>
+    pub const m_OwnerOnlyPredNetUInt64Variables: usize = 0x158; // C_NetworkUtlVectorBase<uint64_t>
+    pub const m_OwnerOnlyPredNetFloatVariables: usize = 0x170; // C_NetworkUtlVectorBase<float>
+    pub const m_OwnerOnlyPredNetVectorVariables: usize = 0x188; // C_NetworkUtlVectorBase<Vector>
+    pub const m_OwnerOnlyPredNetQuaternionVariables: usize = 0x1A0; // C_NetworkUtlVectorBase<Quaternion>
+    pub const m_nBoolVariablesCount: usize = 0x1B8; // int32_t
+    pub const m_nOwnerOnlyBoolVariablesCount: usize = 0x1BC; // int32_t
+    pub const m_nRandomSeedOffset: usize = 0x1C0; // int32_t
+    pub const m_flLastTeleportTime: usize = 0x1C4; // float
+}
+
+pub mod CAttributeList {
+    pub const m_Attributes: usize = 0x8; // C_UtlVectorEmbeddedNetworkVar<CEconItemAttribute>
+    pub const m_pManager: usize = 0x58; // CAttributeManager*
+}
+
+pub mod CAttributeManager {
+    pub const m_Providers: usize = 0x8; // CUtlVector<CHandle<C_BaseEntity>>
+    pub const m_iReapplyProvisionParity: usize = 0x20; // int32_t
+    pub const m_hOuter: usize = 0x24; // CHandle<C_BaseEntity>
+    pub const m_bPreventLoopback: usize = 0x28; // bool
+    pub const m_ProviderType: usize = 0x2C; // attributeprovidertypes_t
+    pub const m_CachedResults: usize = 0x30; // CUtlVector<CAttributeManager::cached_attribute_float_t>
+}
+
+pub mod CAttributeManager_cached_attribute_float_t {
+    pub const flIn: usize = 0x0; // float
+    pub const iAttribHook: usize = 0x8; // CUtlSymbolLarge
+    pub const flOut: usize = 0x10; // float
+}
+
+pub mod CBaseAnimGraph { // C_BaseModelEntity
+    pub const m_bInitiallyPopulateInterpHistory: usize = 0xCC0; // bool
+    pub const m_bShouldAnimateDuringGameplayPause: usize = 0xCC1; // bool
+    pub const m_bSuppressAnimEventSounds: usize = 0xCC3; // bool
+    pub const m_bAnimGraphUpdateEnabled: usize = 0xCD0; // bool
+    pub const m_flMaxSlopeDistance: usize = 0xCD4; // float
+    pub const m_vLastSlopeCheckPos: usize = 0xCD8; // Vector
+    pub const m_vecForce: usize = 0xCE8; // Vector
+    pub const m_nForceBone: usize = 0xCF4; // int32_t
+    pub const m_pClientsideRagdoll: usize = 0xCF8; // CBaseAnimGraph*
+    pub const m_bBuiltRagdoll: usize = 0xD00; // bool
+    pub const m_pRagdollPose: usize = 0xD18; // PhysicsRagdollPose_t*
+    pub const m_bClientRagdoll: usize = 0xD20; // bool
+    pub const m_bHasAnimatedMaterialAttributes: usize = 0xD30; // bool
+}
+
+pub mod CBaseAnimGraphController { // CSkeletonAnimationController
+    pub const m_baseLayer: usize = 0x18; // CNetworkedSequenceOperation
+    pub const m_animGraphNetworkedVars: usize = 0x40; // CAnimGraphNetworkedVariables
+    pub const m_bSequenceFinished: usize = 0x1320; // bool
+    pub const m_flLastEventCycle: usize = 0x1324; // float
+    pub const m_flLastEventAnimTime: usize = 0x1328; // float
+    pub const m_flPlaybackRate: usize = 0x132C; // CNetworkedQuantizedFloat
+    pub const m_flPrevAnimTime: usize = 0x1334; // float
+    pub const m_bClientSideAnimation: usize = 0x1338; // bool
+    pub const m_bNetworkedAnimationInputsChanged: usize = 0x1339; // bool
+    pub const m_nPrevNewSequenceParity: usize = 0x133A; // uint8_t
+    pub const m_nPrevResetEventsParity: usize = 0x133B; // uint8_t
+    pub const m_nNewSequenceParity: usize = 0x133C; // int32_t
+    pub const m_nResetEventsParity: usize = 0x1340; // int32_t
+    pub const m_nAnimLoopMode: usize = 0x1344; // AnimLoopMode_t
+    pub const m_hAnimationUpdate: usize = 0x13E4; // AnimationUpdateListHandle_t
+    pub const m_hLastAnimEventSequence: usize = 0x13E8; // HSequence
+}
+
+pub mod CBasePlayerController { // C_BaseEntity
+    pub const m_nFinalPredictedTick: usize = 0x548; // int32_t
+    pub const m_CommandContext: usize = 0x550; // C_CommandContext
+    pub const m_nInButtonsWhichAreToggles: usize = 0x5D0; // uint64_t
+    pub const m_nTickBase: usize = 0x5D8; // uint32_t
+    pub const m_hPawn: usize = 0x5DC; // CHandle<C_BasePlayerPawn>
+    pub const m_hPredictedPawn: usize = 0x5E0; // CHandle<C_BasePlayerPawn>
+    pub const m_nSplitScreenSlot: usize = 0x5E4; // CSplitScreenSlot
+    pub const m_hSplitOwner: usize = 0x5E8; // CHandle<CBasePlayerController>
+    pub const m_hSplitScreenPlayers: usize = 0x5F0; // CUtlVector<CHandle<CBasePlayerController>>
+    pub const m_bIsHLTV: usize = 0x608; // bool
+    pub const m_iConnected: usize = 0x60C; // PlayerConnectedState
+    pub const m_iszPlayerName: usize = 0x610; // char[128]
+    pub const m_steamID: usize = 0x698; // uint64_t
+    pub const m_bIsLocalPlayerController: usize = 0x6A0; // bool
+    pub const m_iDesiredFOV: usize = 0x6A4; // uint32_t
+}
+
+pub mod CBasePlayerVData { // CEntitySubclassVDataBase
+    pub const m_sModelName: usize = 0x28; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeCModel>>
+    pub const m_flHeadDamageMultiplier: usize = 0x108; // CSkillFloat
+    pub const m_flChestDamageMultiplier: usize = 0x118; // CSkillFloat
+    pub const m_flStomachDamageMultiplier: usize = 0x128; // CSkillFloat
+    pub const m_flArmDamageMultiplier: usize = 0x138; // CSkillFloat
+    pub const m_flLegDamageMultiplier: usize = 0x148; // CSkillFloat
+    pub const m_flHoldBreathTime: usize = 0x158; // float
+    pub const m_flDrowningDamageInterval: usize = 0x15C; // float
+    pub const m_nDrowningDamageInitial: usize = 0x160; // int32_t
+    pub const m_nDrowningDamageMax: usize = 0x164; // int32_t
+    pub const m_nWaterSpeed: usize = 0x168; // int32_t
+    pub const m_flUseRange: usize = 0x16C; // float
+    pub const m_flUseAngleTolerance: usize = 0x170; // float
+    pub const m_flCrouchTime: usize = 0x174; // float
+}
+
+pub mod CBasePlayerWeaponVData { // CEntitySubclassVDataBase
+    pub const m_szWorldModel: usize = 0x28; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeCModel>>
+    pub const m_bBuiltRightHanded: usize = 0x108; // bool
+    pub const m_bAllowFlipping: usize = 0x109; // bool
+    pub const m_bIsFullAuto: usize = 0x10A; // bool
+    pub const m_nNumBullets: usize = 0x10C; // int32_t
+    pub const m_sMuzzleAttachment: usize = 0x110; // CUtlString
+    pub const m_szMuzzleFlashParticle: usize = 0x118; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>>
+    pub const m_iFlags: usize = 0x1F8; // ItemFlagTypes_t
+    pub const m_nPrimaryAmmoType: usize = 0x1F9; // AmmoIndex_t
+    pub const m_nSecondaryAmmoType: usize = 0x1FA; // AmmoIndex_t
+    pub const m_iMaxClip1: usize = 0x1FC; // int32_t
+    pub const m_iMaxClip2: usize = 0x200; // int32_t
+    pub const m_iDefaultClip1: usize = 0x204; // int32_t
+    pub const m_iDefaultClip2: usize = 0x208; // int32_t
+    pub const m_iWeight: usize = 0x20C; // int32_t
+    pub const m_bAutoSwitchTo: usize = 0x210; // bool
+    pub const m_bAutoSwitchFrom: usize = 0x211; // bool
+    pub const m_iRumbleEffect: usize = 0x214; // RumbleEffect_t
+    pub const m_aShootSounds: usize = 0x218; // CUtlMap<WeaponSound_t,CSoundEventName>
+    pub const m_iSlot: usize = 0x238; // int32_t
+    pub const m_iPosition: usize = 0x23C; // int32_t
+}
+
+pub mod CBaseProp { // CBaseAnimGraph
+    pub const m_bModelOverrodeBlockLOS: usize = 0xE80; // bool
+    pub const m_iShapeType: usize = 0xE84; // int32_t
+    pub const m_bConformToCollisionBounds: usize = 0xE88; // bool
+    pub const m_mPreferredCatchTransform: usize = 0xE8C; // matrix3x4_t
+}
+
+pub mod CBodyComponent { // CEntityComponent
+    pub const m_pSceneNode: usize = 0x8; // CGameSceneNode*
+    pub const __m_pChainEntity: usize = 0x20; // CNetworkVarChainer
+}
+
+pub mod CBodyComponentBaseAnimGraph { // CBodyComponentSkeletonInstance
+    pub const m_animationController: usize = 0x470; // CBaseAnimGraphController
+    pub const __m_pChainEntity: usize = 0x18B0; // CNetworkVarChainer
+}
+
+pub mod CBodyComponentBaseModelEntity { // CBodyComponentSkeletonInstance
+    pub const __m_pChainEntity: usize = 0x470; // CNetworkVarChainer
+}
+
+pub mod CBodyComponentPoint { // CBodyComponent
+    pub const m_sceneNode: usize = 0x50; // CGameSceneNode
+    pub const __m_pChainEntity: usize = 0x1A0; // CNetworkVarChainer
+}
+
+pub mod CBodyComponentSkeletonInstance { // CBodyComponent
+    pub const m_skeletonInstance: usize = 0x50; // CSkeletonInstance
+    pub const __m_pChainEntity: usize = 0x440; // CNetworkVarChainer
+}
+
+pub mod CBombTarget { // C_BaseTrigger
+    pub const m_bBombPlantedHere: usize = 0xCC8; // bool
+}
+
+pub mod CBreachCharge { // C_CSWeaponBase
+}
+
+pub mod CBreachChargeProjectile { // C_BaseGrenade
+}
+
+pub mod CBumpMine { // C_CSWeaponBase
+}
+
+pub mod CBumpMineProjectile { // C_BaseGrenade
+}
+
+pub mod CBuoyancyHelper {
+    pub const m_flFluidDensity: usize = 0x18; // float
+}
+
+pub mod CCSGO_WingmanIntroCharacterPosition { // C_CSGO_TeamIntroCharacterPosition
+}
+
+pub mod CCSGO_WingmanIntroCounterTerroristPosition { // CCSGO_WingmanIntroCharacterPosition
+}
+
+pub mod CCSGO_WingmanIntroTerroristPosition { // CCSGO_WingmanIntroCharacterPosition
+}
+
+pub mod CCSGameModeRules {
+    pub const __m_pChainEntity: usize = 0x8; // CNetworkVarChainer
+}
+
+pub mod CCSGameModeRules_Deathmatch { // CCSGameModeRules
+    pub const m_bFirstThink: usize = 0x30; // bool
+    pub const m_bFirstThinkAfterConnected: usize = 0x31; // bool
+    pub const m_flDMBonusStartTime: usize = 0x34; // GameTime_t
+    pub const m_flDMBonusTimeLength: usize = 0x38; // float
+    pub const m_nDMBonusWeaponLoadoutSlot: usize = 0x3C; // int16_t
+}
+
+pub mod CCSGameModeRules_Noop { // CCSGameModeRules
+}
+
+pub mod CCSGameModeRules_Scripted { // CCSGameModeRules
+}
+
+pub mod CCSGameModeScript { // CBasePulseGraphInstance
+}
+
+pub mod CCSObserver_CameraServices { // CCSPlayerBase_CameraServices
+}
+
+pub mod CCSObserver_MovementServices { // CPlayer_MovementServices
+}
+
+pub mod CCSObserver_ObserverServices { // CPlayer_ObserverServices
+    pub const m_hLastObserverTarget: usize = 0x58; // CEntityHandle
+    pub const m_vecObserverInterpolateOffset: usize = 0x5C; // Vector
+    pub const m_vecObserverInterpStartPos: usize = 0x68; // Vector
+    pub const m_flObsInterp_PathLength: usize = 0x74; // float
+    pub const m_qObsInterp_OrientationStart: usize = 0x80; // Quaternion
+    pub const m_qObsInterp_OrientationTravelDir: usize = 0x90; // Quaternion
+    pub const m_obsInterpState: usize = 0xA0; // ObserverInterpState_t
+    pub const m_bObserverInterpolationNeedsDeferredSetup: usize = 0xA4; // bool
+}
+
+pub mod CCSObserver_UseServices { // CPlayer_UseServices
+}
+
+pub mod CCSObserver_ViewModelServices { // CPlayer_ViewModelServices
+}
+
+pub mod CCSPlayerBase_CameraServices { // CPlayer_CameraServices
+    pub const m_iFOV: usize = 0x210; // uint32_t
+    pub const m_iFOVStart: usize = 0x214; // uint32_t
+    pub const m_flFOVTime: usize = 0x218; // GameTime_t
+    pub const m_flFOVRate: usize = 0x21C; // float
+    pub const m_hZoomOwner: usize = 0x220; // CHandle<C_BaseEntity>
+    pub const m_flLastShotFOV: usize = 0x224; // float
+}
+
+pub mod CCSPlayerController { // CBasePlayerController
+    pub const m_pInGameMoneyServices: usize = 0x6D0; // CCSPlayerController_InGameMoneyServices*
+    pub const m_pInventoryServices: usize = 0x6D8; // CCSPlayerController_InventoryServices*
+    pub const m_pActionTrackingServices: usize = 0x6E0; // CCSPlayerController_ActionTrackingServices*
+    pub const m_pDamageServices: usize = 0x6E8; // CCSPlayerController_DamageServices*
+    pub const m_iPing: usize = 0x6F0; // uint32_t
+    pub const m_bHasCommunicationAbuseMute: usize = 0x6F4; // bool
+    pub const m_szCrosshairCodes: usize = 0x6F8; // CUtlSymbolLarge
+    pub const m_iPendingTeamNum: usize = 0x700; // uint8_t
+    pub const m_flForceTeamTime: usize = 0x704; // GameTime_t
+    pub const m_iCompTeammateColor: usize = 0x708; // int32_t
+    pub const m_bEverPlayedOnTeam: usize = 0x70C; // bool
+    pub const m_flPreviousForceJoinTeamTime: usize = 0x710; // GameTime_t
+    pub const m_szClan: usize = 0x718; // CUtlSymbolLarge
+    pub const m_sSanitizedPlayerName: usize = 0x720; // CUtlString
+    pub const m_iCoachingTeam: usize = 0x728; // int32_t
+    pub const m_nPlayerDominated: usize = 0x730; // uint64_t
+    pub const m_nPlayerDominatingMe: usize = 0x738; // uint64_t
+    pub const m_iCompetitiveRanking: usize = 0x740; // int32_t
+    pub const m_iCompetitiveWins: usize = 0x744; // int32_t
+    pub const m_iCompetitiveRankType: usize = 0x748; // int8_t
+    pub const m_iCompetitiveRankingPredicted_Win: usize = 0x74C; // int32_t
+    pub const m_iCompetitiveRankingPredicted_Loss: usize = 0x750; // int32_t
+    pub const m_iCompetitiveRankingPredicted_Tie: usize = 0x754; // int32_t
+    pub const m_nEndMatchNextMapVote: usize = 0x758; // int32_t
+    pub const m_unActiveQuestId: usize = 0x75C; // uint16_t
+    pub const m_nQuestProgressReason: usize = 0x760; // QuestProgress::Reason
+    pub const m_unPlayerTvControlFlags: usize = 0x764; // uint32_t
+    pub const m_iDraftIndex: usize = 0x790; // int32_t
+    pub const m_msQueuedModeDisconnectionTimestamp: usize = 0x794; // uint32_t
+    pub const m_uiAbandonRecordedReason: usize = 0x798; // uint32_t
+    pub const m_bEverFullyConnected: usize = 0x79C; // bool
+    pub const m_bAbandonAllowsSurrender: usize = 0x79D; // bool
+    pub const m_bAbandonOffersInstantSurrender: usize = 0x79E; // bool
+    pub const m_bDisconnection1MinWarningPrinted: usize = 0x79F; // bool
+    pub const m_bScoreReported: usize = 0x7A0; // bool
+    pub const m_nDisconnectionTick: usize = 0x7A4; // int32_t
+    pub const m_bControllingBot: usize = 0x7B0; // bool
+    pub const m_bHasControlledBotThisRound: usize = 0x7B1; // bool
+    pub const m_bHasBeenControlledByPlayerThisRound: usize = 0x7B2; // bool
+    pub const m_nBotsControlledThisRound: usize = 0x7B4; // int32_t
+    pub const m_bCanControlObservedBot: usize = 0x7B8; // bool
+    pub const m_hPlayerPawn: usize = 0x7BC; // CHandle<C_CSPlayerPawn>
+    pub const m_hObserverPawn: usize = 0x7C0; // CHandle<C_CSObserverPawn>
+    pub const m_bPawnIsAlive: usize = 0x7C4; // bool
+    pub const m_iPawnHealth: usize = 0x7C8; // uint32_t
+    pub const m_iPawnArmor: usize = 0x7CC; // int32_t
+    pub const m_bPawnHasDefuser: usize = 0x7D0; // bool
+    pub const m_bPawnHasHelmet: usize = 0x7D1; // bool
+    pub const m_nPawnCharacterDefIndex: usize = 0x7D2; // uint16_t
+    pub const m_iPawnLifetimeStart: usize = 0x7D4; // int32_t
+    pub const m_iPawnLifetimeEnd: usize = 0x7D8; // int32_t
+    pub const m_iPawnBotDifficulty: usize = 0x7DC; // int32_t
+    pub const m_hOriginalControllerOfCurrentPawn: usize = 0x7E0; // CHandle<CCSPlayerController>
+    pub const m_iScore: usize = 0x7E4; // int32_t
+    pub const m_vecKills: usize = 0x7E8; // C_NetworkUtlVectorBase<EKillTypes_t>
+    pub const m_iMVPs: usize = 0x800; // int32_t
+    pub const m_bIsPlayerNameDirty: usize = 0x804; // bool
+}
+
+pub mod CCSPlayerController_ActionTrackingServices { // CPlayerControllerComponent
+    pub const m_perRoundStats: usize = 0x40; // C_UtlVectorEmbeddedNetworkVar<CSPerRoundStats_t>
+    pub const m_matchStats: usize = 0x90; // CSMatchStats_t
+    pub const m_iNumRoundKills: usize = 0x108; // int32_t
+    pub const m_iNumRoundKillsHeadshots: usize = 0x10C; // int32_t
+    pub const m_unTotalRoundDamageDealt: usize = 0x110; // uint32_t
+}
+
+pub mod CCSPlayerController_DamageServices { // CPlayerControllerComponent
+    pub const m_nSendUpdate: usize = 0x40; // int32_t
+    pub const m_DamageList: usize = 0x48; // C_UtlVectorEmbeddedNetworkVar<CDamageRecord>
+}
+
+pub mod CCSPlayerController_InGameMoneyServices { // CPlayerControllerComponent
+    pub const m_iAccount: usize = 0x40; // int32_t
+    pub const m_iStartAccount: usize = 0x44; // int32_t
+    pub const m_iTotalCashSpent: usize = 0x48; // int32_t
+    pub const m_iCashSpentThisRound: usize = 0x4C; // int32_t
+    pub const m_nPreviousAccount: usize = 0x50; // int32_t
+}
+
+pub mod CCSPlayerController_InventoryServices { // CPlayerControllerComponent
+    pub const m_unMusicID: usize = 0x40; // uint16_t
+    pub const m_rank: usize = 0x44; // MedalRank_t[6]
+    pub const m_nPersonaDataPublicLevel: usize = 0x5C; // int32_t
+    pub const m_nPersonaDataPublicCommendsLeader: usize = 0x60; // int32_t
+    pub const m_nPersonaDataPublicCommendsTeacher: usize = 0x64; // int32_t
+    pub const m_nPersonaDataPublicCommendsFriendly: usize = 0x68; // int32_t
+    pub const m_vecServerAuthoritativeWeaponSlots: usize = 0x70; // C_UtlVectorEmbeddedNetworkVar<ServerAuthoritativeWeaponSlot_t>
+}
+
+pub mod CCSPlayer_ActionTrackingServices { // CPlayerPawnComponent
+    pub const m_hLastWeaponBeforeC4AutoSwitch: usize = 0x40; // CHandle<C_BasePlayerWeapon>
+    pub const m_bIsRescuing: usize = 0x44; // bool
+    pub const m_weaponPurchasesThisMatch: usize = 0x48; // WeaponPurchaseTracker_t
+    pub const m_weaponPurchasesThisRound: usize = 0xA0; // WeaponPurchaseTracker_t
+}
+
+pub mod CCSPlayer_BulletServices { // CPlayerPawnComponent
+    pub const m_totalHitsOnServer: usize = 0x40; // int32_t
+}
+
+pub mod CCSPlayer_BuyServices { // CPlayerPawnComponent
+    pub const m_vecSellbackPurchaseEntries: usize = 0x40; // C_UtlVectorEmbeddedNetworkVar<SellbackPurchaseEntry_t>
+}
+
+pub mod CCSPlayer_CameraServices { // CCSPlayerBase_CameraServices
+    pub const m_flDeathCamTilt: usize = 0x228; // float
+}
+
+pub mod CCSPlayer_GlowServices { // CPlayerPawnComponent
+}
+
+pub mod CCSPlayer_HostageServices { // CPlayerPawnComponent
+    pub const m_hCarriedHostage: usize = 0x40; // CHandle<C_BaseEntity>
+    pub const m_hCarriedHostageProp: usize = 0x44; // CHandle<C_BaseEntity>
+}
+
+pub mod CCSPlayer_ItemServices { // CPlayer_ItemServices
+    pub const m_bHasDefuser: usize = 0x40; // bool
+    pub const m_bHasHelmet: usize = 0x41; // bool
+    pub const m_bHasHeavyArmor: usize = 0x42; // bool
+}
+
+pub mod CCSPlayer_MovementServices { // CPlayer_MovementServices_Humanoid
+    pub const m_flMaxFallVelocity: usize = 0x210; // float
+    pub const m_vecLadderNormal: usize = 0x214; // Vector
+    pub const m_nLadderSurfacePropIndex: usize = 0x220; // int32_t
+    pub const m_flDuckAmount: usize = 0x224; // float
+    pub const m_flDuckSpeed: usize = 0x228; // float
+    pub const m_bDuckOverride: usize = 0x22C; // bool
+    pub const m_bDesiresDuck: usize = 0x22D; // bool
+    pub const m_flDuckOffset: usize = 0x230; // float
+    pub const m_nDuckTimeMsecs: usize = 0x234; // uint32_t
+    pub const m_nDuckJumpTimeMsecs: usize = 0x238; // uint32_t
+    pub const m_nJumpTimeMsecs: usize = 0x23C; // uint32_t
+    pub const m_flLastDuckTime: usize = 0x240; // float
+    pub const m_vecLastPositionAtFullCrouchSpeed: usize = 0x250; // Vector2D
+    pub const m_duckUntilOnGround: usize = 0x258; // bool
+    pub const m_bHasWalkMovedSinceLastJump: usize = 0x259; // bool
+    pub const m_bInStuckTest: usize = 0x25A; // bool
+    pub const m_flStuckCheckTime: usize = 0x268; // float[64][2]
+    pub const m_nTraceCount: usize = 0x468; // int32_t
+    pub const m_StuckLast: usize = 0x46C; // int32_t
+    pub const m_bSpeedCropped: usize = 0x470; // bool
+    pub const m_nOldWaterLevel: usize = 0x474; // int32_t
+    pub const m_flWaterEntryTime: usize = 0x478; // float
+    pub const m_vecForward: usize = 0x47C; // Vector
+    pub const m_vecLeft: usize = 0x488; // Vector
+    pub const m_vecUp: usize = 0x494; // Vector
+    pub const m_vecPreviouslyPredictedOrigin: usize = 0x4A0; // Vector
+    pub const m_bOldJumpPressed: usize = 0x4AC; // bool
+    pub const m_flJumpPressedTime: usize = 0x4B0; // float
+    pub const m_flJumpUntil: usize = 0x4B4; // float
+    pub const m_flJumpVel: usize = 0x4B8; // float
+    pub const m_fStashGrenadeParameterWhen: usize = 0x4BC; // GameTime_t
+    pub const m_nButtonDownMaskPrev: usize = 0x4C0; // uint64_t
+    pub const m_flOffsetTickCompleteTime: usize = 0x4C8; // float
+    pub const m_flOffsetTickStashedSpeed: usize = 0x4CC; // float
+    pub const m_flStamina: usize = 0x4D0; // float
+    pub const m_bUpdatePredictedOriginAfterDataUpdate: usize = 0x4D4; // bool
+}
+
+pub mod CCSPlayer_PingServices { // CPlayerPawnComponent
+    pub const m_hPlayerPing: usize = 0x40; // CHandle<C_BaseEntity>
+}
+
+pub mod CCSPlayer_UseServices { // CPlayer_UseServices
+}
+
+pub mod CCSPlayer_ViewModelServices { // CPlayer_ViewModelServices
+    pub const m_hViewModel: usize = 0x40; // CHandle<C_BaseViewModel>[3]
+}
+
+pub mod CCSPlayer_WaterServices { // CPlayer_WaterServices
+    pub const m_flWaterJumpTime: usize = 0x40; // float
+    pub const m_vecWaterJumpVel: usize = 0x44; // Vector
+    pub const m_flSwimSoundTime: usize = 0x50; // float
+}
+
+pub mod CCSPlayer_WeaponServices { // CPlayer_WeaponServices
+    pub const m_flNextAttack: usize = 0xA8; // GameTime_t
+    pub const m_bIsLookingAtWeapon: usize = 0xAC; // bool
+    pub const m_bIsHoldingLookAtWeapon: usize = 0xAD; // bool
+}
+
+pub mod CCSWeaponBaseVData { // CBasePlayerWeaponVData
+    pub const m_WeaponType: usize = 0x240; // CSWeaponType
+    pub const m_WeaponCategory: usize = 0x244; // CSWeaponCategory
+    pub const m_szViewModel: usize = 0x248; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeCModel>>
+    pub const m_szPlayerModel: usize = 0x328; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeCModel>>
+    pub const m_szWorldDroppedModel: usize = 0x408; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeCModel>>
+    pub const m_szAimsightLensMaskModel: usize = 0x4E8; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeCModel>>
+    pub const m_szMagazineModel: usize = 0x5C8; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeCModel>>
+    pub const m_szHeatEffect: usize = 0x6A8; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>>
+    pub const m_szEjectBrassEffect: usize = 0x788; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>>
+    pub const m_szMuzzleFlashParticleAlt: usize = 0x868; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>>
+    pub const m_szMuzzleFlashThirdPersonParticle: usize = 0x948; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>>
+    pub const m_szMuzzleFlashThirdPersonParticleAlt: usize = 0xA28; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>>
+    pub const m_szTracerParticle: usize = 0xB08; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>>
+    pub const m_GearSlot: usize = 0xBE8; // gear_slot_t
+    pub const m_GearSlotPosition: usize = 0xBEC; // int32_t
+    pub const m_DefaultLoadoutSlot: usize = 0xBF0; // loadout_slot_t
+    pub const m_sWrongTeamMsg: usize = 0xBF8; // CUtlString
+    pub const m_nPrice: usize = 0xC00; // int32_t
+    pub const m_nKillAward: usize = 0xC04; // int32_t
+    pub const m_nPrimaryReserveAmmoMax: usize = 0xC08; // int32_t
+    pub const m_nSecondaryReserveAmmoMax: usize = 0xC0C; // int32_t
+    pub const m_bMeleeWeapon: usize = 0xC10; // bool
+    pub const m_bHasBurstMode: usize = 0xC11; // bool
+    pub const m_bIsRevolver: usize = 0xC12; // bool
+    pub const m_bCannotShootUnderwater: usize = 0xC13; // bool
+    pub const m_szName: usize = 0xC18; // CUtlString
+    pub const m_szAnimExtension: usize = 0xC20; // CUtlString
+    pub const m_eSilencerType: usize = 0xC28; // CSWeaponSilencerType
+    pub const m_nCrosshairMinDistance: usize = 0xC2C; // int32_t
+    pub const m_nCrosshairDeltaDistance: usize = 0xC30; // int32_t
+    pub const m_flCycleTime: usize = 0xC34; // CFiringModeFloat
+    pub const m_flMaxSpeed: usize = 0xC3C; // CFiringModeFloat
+    pub const m_flSpread: usize = 0xC44; // CFiringModeFloat
+    pub const m_flInaccuracyCrouch: usize = 0xC4C; // CFiringModeFloat
+    pub const m_flInaccuracyStand: usize = 0xC54; // CFiringModeFloat
+    pub const m_flInaccuracyJump: usize = 0xC5C; // CFiringModeFloat
+    pub const m_flInaccuracyLand: usize = 0xC64; // CFiringModeFloat
+    pub const m_flInaccuracyLadder: usize = 0xC6C; // CFiringModeFloat
+    pub const m_flInaccuracyFire: usize = 0xC74; // CFiringModeFloat
+    pub const m_flInaccuracyMove: usize = 0xC7C; // CFiringModeFloat
+    pub const m_flRecoilAngle: usize = 0xC84; // CFiringModeFloat
+    pub const m_flRecoilAngleVariance: usize = 0xC8C; // CFiringModeFloat
+    pub const m_flRecoilMagnitude: usize = 0xC94; // CFiringModeFloat
+    pub const m_flRecoilMagnitudeVariance: usize = 0xC9C; // CFiringModeFloat
+    pub const m_nTracerFrequency: usize = 0xCA4; // CFiringModeInt
+    pub const m_flInaccuracyJumpInitial: usize = 0xCAC; // float
+    pub const m_flInaccuracyJumpApex: usize = 0xCB0; // float
+    pub const m_flInaccuracyReload: usize = 0xCB4; // float
+    pub const m_nRecoilSeed: usize = 0xCB8; // int32_t
+    pub const m_nSpreadSeed: usize = 0xCBC; // int32_t
+    pub const m_flTimeToIdleAfterFire: usize = 0xCC0; // float
+    pub const m_flIdleInterval: usize = 0xCC4; // float
+    pub const m_flAttackMovespeedFactor: usize = 0xCC8; // float
+    pub const m_flHeatPerShot: usize = 0xCCC; // float
+    pub const m_flInaccuracyPitchShift: usize = 0xCD0; // float
+    pub const m_flInaccuracyAltSoundThreshold: usize = 0xCD4; // float
+    pub const m_flBotAudibleRange: usize = 0xCD8; // float
+    pub const m_szUseRadioSubtitle: usize = 0xCE0; // CUtlString
+    pub const m_bUnzoomsAfterShot: usize = 0xCE8; // bool
+    pub const m_bHideViewModelWhenZoomed: usize = 0xCE9; // bool
+    pub const m_nZoomLevels: usize = 0xCEC; // int32_t
+    pub const m_nZoomFOV1: usize = 0xCF0; // int32_t
+    pub const m_nZoomFOV2: usize = 0xCF4; // int32_t
+    pub const m_flZoomTime0: usize = 0xCF8; // float
+    pub const m_flZoomTime1: usize = 0xCFC; // float
+    pub const m_flZoomTime2: usize = 0xD00; // float
+    pub const m_flIronSightPullUpSpeed: usize = 0xD04; // float
+    pub const m_flIronSightPutDownSpeed: usize = 0xD08; // float
+    pub const m_flIronSightFOV: usize = 0xD0C; // float
+    pub const m_flIronSightPivotForward: usize = 0xD10; // float
+    pub const m_flIronSightLooseness: usize = 0xD14; // float
+    pub const m_angPivotAngle: usize = 0xD18; // QAngle
+    pub const m_vecIronSightEyePos: usize = 0xD24; // Vector
+    pub const m_nDamage: usize = 0xD30; // int32_t
+    pub const m_flHeadshotMultiplier: usize = 0xD34; // float
+    pub const m_flArmorRatio: usize = 0xD38; // float
+    pub const m_flPenetration: usize = 0xD3C; // float
+    pub const m_flRange: usize = 0xD40; // float
+    pub const m_flRangeModifier: usize = 0xD44; // float
+    pub const m_flFlinchVelocityModifierLarge: usize = 0xD48; // float
+    pub const m_flFlinchVelocityModifierSmall: usize = 0xD4C; // float
+    pub const m_flRecoveryTimeCrouch: usize = 0xD50; // float
+    pub const m_flRecoveryTimeStand: usize = 0xD54; // float
+    pub const m_flRecoveryTimeCrouchFinal: usize = 0xD58; // float
+    pub const m_flRecoveryTimeStandFinal: usize = 0xD5C; // float
+    pub const m_nRecoveryTransitionStartBullet: usize = 0xD60; // int32_t
+    pub const m_nRecoveryTransitionEndBullet: usize = 0xD64; // int32_t
+    pub const m_flThrowVelocity: usize = 0xD68; // float
+    pub const m_vSmokeColor: usize = 0xD6C; // Vector
+    pub const m_szAnimClass: usize = 0xD78; // CUtlString
+}
+
+pub mod CClientAlphaProperty { // IClientAlphaProperty
+    pub const m_nRenderFX: usize = 0x10; // uint8_t
+    pub const m_nRenderMode: usize = 0x11; // uint8_t
+    pub const m_bAlphaOverride: usize = 0x0; // bitfield:1
+    pub const m_bShadowAlphaOverride: usize = 0x0; // bitfield:1
+    pub const m_nReserved: usize = 0x0; // bitfield:6
+    pub const m_nAlpha: usize = 0x13; // uint8_t
+    pub const m_nDesyncOffset: usize = 0x14; // uint16_t
+    pub const m_nReserved2: usize = 0x16; // uint16_t
+    pub const m_nDistFadeStart: usize = 0x18; // uint16_t
+    pub const m_nDistFadeEnd: usize = 0x1A; // uint16_t
+    pub const m_flFadeScale: usize = 0x1C; // float
+    pub const m_flRenderFxStartTime: usize = 0x20; // GameTime_t
+    pub const m_flRenderFxDuration: usize = 0x24; // float
+}
+
+pub mod CCollisionProperty {
+    pub const m_collisionAttribute: usize = 0x10; // VPhysicsCollisionAttribute_t
+    pub const m_vecMins: usize = 0x40; // Vector
+    pub const m_vecMaxs: usize = 0x4C; // Vector
+    pub const m_usSolidFlags: usize = 0x5A; // uint8_t
+    pub const m_nSolidType: usize = 0x5B; // SolidType_t
+    pub const m_triggerBloat: usize = 0x5C; // uint8_t
+    pub const m_nSurroundType: usize = 0x5D; // SurroundingBoundsType_t
+    pub const m_CollisionGroup: usize = 0x5E; // uint8_t
+    pub const m_nEnablePhysics: usize = 0x5F; // uint8_t
+    pub const m_flBoundingRadius: usize = 0x60; // float
+    pub const m_vecSpecifiedSurroundingMins: usize = 0x64; // Vector
+    pub const m_vecSpecifiedSurroundingMaxs: usize = 0x70; // Vector
+    pub const m_vecSurroundingMaxs: usize = 0x7C; // Vector
+    pub const m_vecSurroundingMins: usize = 0x88; // Vector
+    pub const m_vCapsuleCenter1: usize = 0x94; // Vector
+    pub const m_vCapsuleCenter2: usize = 0xA0; // Vector
+    pub const m_flCapsuleRadius: usize = 0xAC; // float
+}
+
+pub mod CComicBook {
+    pub const m_CoverImage: usize = 0x8; // CPanoramaImageName
+    pub const m_XmlFile: usize = 0x18; // CUtlString
+}
+
+pub mod CCompositeMaterialEditorDoc {
+    pub const m_nVersion: usize = 0x8; // int32_t
+    pub const m_Points: usize = 0x10; // CUtlVector<CompositeMaterialEditorPoint_t>
+    pub const m_KVthumbnail: usize = 0x28; // KeyValues3
+}
+
+pub mod CDamageRecord {
+    pub const m_PlayerDamager: usize = 0x28; // CHandle<C_CSPlayerPawnBase>
+    pub const m_PlayerRecipient: usize = 0x2C; // CHandle<C_CSPlayerPawnBase>
+    pub const m_hPlayerControllerDamager: usize = 0x30; // CHandle<CCSPlayerController>
+    pub const m_hPlayerControllerRecipient: usize = 0x34; // CHandle<CCSPlayerController>
+    pub const m_szPlayerDamagerName: usize = 0x38; // CUtlString
+    pub const m_szPlayerRecipientName: usize = 0x40; // CUtlString
+    pub const m_DamagerXuid: usize = 0x48; // uint64_t
+    pub const m_RecipientXuid: usize = 0x50; // uint64_t
+    pub const m_iDamage: usize = 0x58; // int32_t
+    pub const m_iActualHealthRemoved: usize = 0x5C; // int32_t
+    pub const m_iNumHits: usize = 0x60; // int32_t
+    pub const m_iLastBulletUpdate: usize = 0x64; // int32_t
+    pub const m_bIsOtherEnemy: usize = 0x68; // bool
+    pub const m_killType: usize = 0x69; // EKillTypes_t
+}
+
+pub mod CDecalInfo {
+    pub const m_flAnimationScale: usize = 0x0; // float
+    pub const m_flAnimationLifeSpan: usize = 0x4; // float
+    pub const m_flPlaceTime: usize = 0x8; // float
+    pub const m_flFadeStartTime: usize = 0xC; // float
+    pub const m_flFadeDuration: usize = 0x10; // float
+    pub const m_nVBSlot: usize = 0x14; // int32_t
+    pub const m_nBoneIndex: usize = 0x18; // int32_t
+    pub const m_pNext: usize = 0x28; // CDecalInfo*
+    pub const m_pPrev: usize = 0x30; // CDecalInfo*
+    pub const m_nDecalMaterialIndex: usize = 0x90; // int32_t
+}
+
+pub mod CEconItemAttribute {
+    pub const m_iAttributeDefinitionIndex: usize = 0x30; // uint16_t
+    pub const m_flValue: usize = 0x34; // float
+    pub const m_flInitialValue: usize = 0x38; // float
+    pub const m_nRefundableCurrency: usize = 0x3C; // int32_t
+    pub const m_bSetBonus: usize = 0x40; // bool
+}
+
+pub mod CEffectData {
+    pub const m_vOrigin: usize = 0x8; // Vector
+    pub const m_vStart: usize = 0x14; // Vector
+    pub const m_vNormal: usize = 0x20; // Vector
+    pub const m_vAngles: usize = 0x2C; // QAngle
+    pub const m_hEntity: usize = 0x38; // CEntityHandle
+    pub const m_hOtherEntity: usize = 0x3C; // CEntityHandle
+    pub const m_flScale: usize = 0x40; // float
+    pub const m_flMagnitude: usize = 0x44; // float
+    pub const m_flRadius: usize = 0x48; // float
+    pub const m_nSurfaceProp: usize = 0x4C; // CUtlStringToken
+    pub const m_nEffectIndex: usize = 0x50; // CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>
+    pub const m_nDamageType: usize = 0x58; // uint32_t
+    pub const m_nPenetrate: usize = 0x5C; // uint8_t
+    pub const m_nMaterial: usize = 0x5E; // uint16_t
+    pub const m_nHitBox: usize = 0x60; // uint16_t
+    pub const m_nColor: usize = 0x62; // uint8_t
+    pub const m_fFlags: usize = 0x63; // uint8_t
+    pub const m_nAttachmentIndex: usize = 0x64; // AttachmentHandle_t
+    pub const m_nAttachmentName: usize = 0x68; // CUtlStringToken
+    pub const m_iEffectName: usize = 0x6C; // uint16_t
+    pub const m_nExplosionType: usize = 0x6E; // uint8_t
+}
+
+pub mod CEntityComponent {
+}
+
+pub mod CEntityIdentity {
+    pub const m_nameStringableIndex: usize = 0x14; // int32_t
+    pub const m_name: usize = 0x18; // CUtlSymbolLarge
+    pub const m_designerName: usize = 0x20; // CUtlSymbolLarge
+    pub const m_flags: usize = 0x30; // uint32_t
+    pub const m_worldGroupId: usize = 0x38; // WorldGroupId_t
+    pub const m_fDataObjectTypes: usize = 0x3C; // uint32_t
+    pub const m_PathIndex: usize = 0x40; // ChangeAccessorFieldPathIndex_t
+    pub const m_pPrev: usize = 0x58; // CEntityIdentity*
+    pub const m_pNext: usize = 0x60; // CEntityIdentity*
+    pub const m_pPrevByClass: usize = 0x68; // CEntityIdentity*
+    pub const m_pNextByClass: usize = 0x70; // CEntityIdentity*
+}
+
+pub mod CEntityInstance {
+    pub const m_iszPrivateVScripts: usize = 0x8; // CUtlSymbolLarge
+    pub const m_pEntity: usize = 0x10; // CEntityIdentity*
+    pub const m_CScriptComponent: usize = 0x28; // CScriptComponent*
+}
+
+pub mod CFireOverlay { // CGlowOverlay
+    pub const m_pOwner: usize = 0xD0; // C_FireSmoke*
+    pub const m_vBaseColors: usize = 0xD8; // Vector[4]
+    pub const m_flScale: usize = 0x108; // float
+    pub const m_nGUID: usize = 0x10C; // int32_t
+}
+
+pub mod CFlashlightEffect {
+    pub const m_bIsOn: usize = 0x10; // bool
+    pub const m_bMuzzleFlashEnabled: usize = 0x20; // bool
+    pub const m_flMuzzleFlashBrightness: usize = 0x24; // float
+    pub const m_quatMuzzleFlashOrientation: usize = 0x30; // Quaternion
+    pub const m_vecMuzzleFlashOrigin: usize = 0x40; // Vector
+    pub const m_flFov: usize = 0x4C; // float
+    pub const m_flFarZ: usize = 0x50; // float
+    pub const m_flLinearAtten: usize = 0x54; // float
+    pub const m_bCastsShadows: usize = 0x58; // bool
+    pub const m_flCurrentPullBackDist: usize = 0x5C; // float
+    pub const m_FlashlightTexture: usize = 0x60; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_MuzzleFlashTexture: usize = 0x68; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_textureName: usize = 0x70; // char[64]
+}
+
+pub mod CFuncWater { // C_BaseModelEntity
+    pub const m_BuoyancyHelper: usize = 0xCC0; // CBuoyancyHelper
+}
+
+pub mod CGameSceneNode {
+    pub const m_nodeToWorld: usize = 0x10; // CTransform
+    pub const m_pOwner: usize = 0x30; // CEntityInstance*
+    pub const m_pParent: usize = 0x38; // CGameSceneNode*
+    pub const m_pChild: usize = 0x40; // CGameSceneNode*
+    pub const m_pNextSibling: usize = 0x48; // CGameSceneNode*
+    pub const m_hParent: usize = 0x70; // CGameSceneNodeHandle
+    pub const m_vecOrigin: usize = 0x80; // CNetworkOriginCellCoordQuantizedVector
+    pub const m_angRotation: usize = 0xB8; // QAngle
+    pub const m_flScale: usize = 0xC4; // float
+    pub const m_vecAbsOrigin: usize = 0xC8; // Vector
+    pub const m_angAbsRotation: usize = 0xD4; // QAngle
+    pub const m_flAbsScale: usize = 0xE0; // float
+    pub const m_nParentAttachmentOrBone: usize = 0xE4; // int16_t
+    pub const m_bDebugAbsOriginChanges: usize = 0xE6; // bool
+    pub const m_bDormant: usize = 0xE7; // bool
+    pub const m_bForceParentToBeNetworked: usize = 0xE8; // bool
+    pub const m_bDirtyHierarchy: usize = 0x0; // bitfield:1
+    pub const m_bDirtyBoneMergeInfo: usize = 0x0; // bitfield:1
+    pub const m_bNetworkedPositionChanged: usize = 0x0; // bitfield:1
+    pub const m_bNetworkedAnglesChanged: usize = 0x0; // bitfield:1
+    pub const m_bNetworkedScaleChanged: usize = 0x0; // bitfield:1
+    pub const m_bWillBeCallingPostDataUpdate: usize = 0x0; // bitfield:1
+    pub const m_bNotifyBoneTransformsChanged: usize = 0x0; // bitfield:1
+    pub const m_bBoneMergeFlex: usize = 0x0; // bitfield:1
+    pub const m_nLatchAbsOrigin: usize = 0x0; // bitfield:2
+    pub const m_bDirtyBoneMergeBoneToRoot: usize = 0x0; // bitfield:1
+    pub const m_nHierarchicalDepth: usize = 0xEB; // uint8_t
+    pub const m_nHierarchyType: usize = 0xEC; // uint8_t
+    pub const m_nDoNotSetAnimTimeInInvalidatePhysicsCount: usize = 0xED; // uint8_t
+    pub const m_name: usize = 0xF0; // CUtlStringToken
+    pub const m_hierarchyAttachName: usize = 0x130; // CUtlStringToken
+    pub const m_flZOffset: usize = 0x134; // float
+    pub const m_vRenderOrigin: usize = 0x138; // Vector
+}
+
+pub mod CGameSceneNodeHandle {
+    pub const m_hOwner: usize = 0x8; // CEntityHandle
+    pub const m_name: usize = 0xC; // CUtlStringToken
+}
+
+pub mod CGlobalLightBase {
+    pub const m_bSpotLight: usize = 0x10; // bool
+    pub const m_SpotLightOrigin: usize = 0x14; // Vector
+    pub const m_SpotLightAngles: usize = 0x20; // QAngle
+    pub const m_ShadowDirection: usize = 0x2C; // Vector
+    pub const m_AmbientDirection: usize = 0x38; // Vector
+    pub const m_SpecularDirection: usize = 0x44; // Vector
+    pub const m_InspectorSpecularDirection: usize = 0x50; // Vector
+    pub const m_flSpecularPower: usize = 0x5C; // float
+    pub const m_flSpecularIndependence: usize = 0x60; // float
+    pub const m_SpecularColor: usize = 0x64; // Color
+    pub const m_bStartDisabled: usize = 0x68; // bool
+    pub const m_bEnabled: usize = 0x69; // bool
+    pub const m_LightColor: usize = 0x6A; // Color
+    pub const m_AmbientColor1: usize = 0x6E; // Color
+    pub const m_AmbientColor2: usize = 0x72; // Color
+    pub const m_AmbientColor3: usize = 0x76; // Color
+    pub const m_flSunDistance: usize = 0x7C; // float
+    pub const m_flFOV: usize = 0x80; // float
+    pub const m_flNearZ: usize = 0x84; // float
+    pub const m_flFarZ: usize = 0x88; // float
+    pub const m_bEnableShadows: usize = 0x8C; // bool
+    pub const m_bOldEnableShadows: usize = 0x8D; // bool
+    pub const m_bBackgroundClearNotRequired: usize = 0x8E; // bool
+    pub const m_flCloudScale: usize = 0x90; // float
+    pub const m_flCloud1Speed: usize = 0x94; // float
+    pub const m_flCloud1Direction: usize = 0x98; // float
+    pub const m_flCloud2Speed: usize = 0x9C; // float
+    pub const m_flCloud2Direction: usize = 0xA0; // float
+    pub const m_flAmbientScale1: usize = 0xB0; // float
+    pub const m_flAmbientScale2: usize = 0xB4; // float
+    pub const m_flGroundScale: usize = 0xB8; // float
+    pub const m_flLightScale: usize = 0xBC; // float
+    pub const m_flFoWDarkness: usize = 0xC0; // float
+    pub const m_bEnableSeparateSkyboxFog: usize = 0xC4; // bool
+    pub const m_vFowColor: usize = 0xC8; // Vector
+    pub const m_ViewOrigin: usize = 0xD4; // Vector
+    pub const m_ViewAngles: usize = 0xE0; // QAngle
+    pub const m_flViewFoV: usize = 0xEC; // float
+    pub const m_WorldPoints: usize = 0xF0; // Vector[8]
+    pub const m_vFogOffsetLayer0: usize = 0x4A8; // Vector2D
+    pub const m_vFogOffsetLayer1: usize = 0x4B0; // Vector2D
+    pub const m_hEnvWind: usize = 0x4B8; // CHandle<C_BaseEntity>
+    pub const m_hEnvSky: usize = 0x4BC; // CHandle<C_BaseEntity>
+}
+
+pub mod CGlowOverlay {
+    pub const m_vPos: usize = 0x8; // Vector
+    pub const m_bDirectional: usize = 0x14; // bool
+    pub const m_vDirection: usize = 0x18; // Vector
+    pub const m_bInSky: usize = 0x24; // bool
+    pub const m_skyObstructionScale: usize = 0x28; // float
+    pub const m_Sprites: usize = 0x30; // CGlowSprite[4]
+    pub const m_nSprites: usize = 0xB0; // int32_t
+    pub const m_flProxyRadius: usize = 0xB4; // float
+    pub const m_flHDRColorScale: usize = 0xB8; // float
+    pub const m_flGlowObstructionScale: usize = 0xBC; // float
+    pub const m_bCacheGlowObstruction: usize = 0xC0; // bool
+    pub const m_bCacheSkyObstruction: usize = 0xC1; // bool
+    pub const m_bActivated: usize = 0xC2; // int16_t
+    pub const m_ListIndex: usize = 0xC4; // uint16_t
+    pub const m_queryHandle: usize = 0xC8; // int32_t
+}
+
+pub mod CGlowProperty {
+    pub const m_fGlowColor: usize = 0x8; // Vector
+    pub const m_iGlowType: usize = 0x30; // int32_t
+    pub const m_iGlowTeam: usize = 0x34; // int32_t
+    pub const m_nGlowRange: usize = 0x38; // int32_t
+    pub const m_nGlowRangeMin: usize = 0x3C; // int32_t
+    pub const m_glowColorOverride: usize = 0x40; // Color
+    pub const m_bFlashing: usize = 0x44; // bool
+    pub const m_flGlowTime: usize = 0x48; // float
+    pub const m_flGlowStartTime: usize = 0x4C; // float
+    pub const m_bEligibleForScreenHighlight: usize = 0x50; // bool
+    pub const m_bGlowing: usize = 0x51; // bool
+}
+
+pub mod CGlowSprite {
+    pub const m_vColor: usize = 0x0; // Vector
+    pub const m_flHorzSize: usize = 0xC; // float
+    pub const m_flVertSize: usize = 0x10; // float
+    pub const m_hMaterial: usize = 0x18; // CStrongHandle<InfoForResourceTypeIMaterial2>
+}
+
+pub mod CGrenadeTracer { // C_BaseModelEntity
+    pub const m_flTracerDuration: usize = 0xCE0; // float
+    pub const m_nType: usize = 0xCE4; // GrenadeType_t
+}
+
+pub mod CHitboxComponent { // CEntityComponent
+    pub const m_bvDisabledHitGroups: usize = 0x24; // uint32_t[1]
+}
+
+pub mod CHostageRescueZone { // CHostageRescueZoneShim
+}
+
+pub mod CHostageRescueZoneShim { // C_BaseTrigger
+}
+
+pub mod CInfoDynamicShadowHint { // C_PointEntity
+    pub const m_bDisabled: usize = 0x540; // bool
+    pub const m_flRange: usize = 0x544; // float
+    pub const m_nImportance: usize = 0x548; // int32_t
+    pub const m_nLightChoice: usize = 0x54C; // int32_t
+    pub const m_hLight: usize = 0x550; // CHandle<C_BaseEntity>
+}
+
+pub mod CInfoDynamicShadowHintBox { // CInfoDynamicShadowHint
+    pub const m_vBoxMins: usize = 0x558; // Vector
+    pub const m_vBoxMaxs: usize = 0x564; // Vector
+}
+
+pub mod CInfoOffscreenPanoramaTexture { // C_PointEntity
+    pub const m_bDisabled: usize = 0x540; // bool
+    pub const m_nResolutionX: usize = 0x544; // int32_t
+    pub const m_nResolutionY: usize = 0x548; // int32_t
+    pub const m_szLayoutFileName: usize = 0x550; // CUtlSymbolLarge
+    pub const m_RenderAttrName: usize = 0x558; // CUtlSymbolLarge
+    pub const m_TargetEntities: usize = 0x560; // C_NetworkUtlVectorBase<CHandle<C_BaseModelEntity>>
+    pub const m_nTargetChangeCount: usize = 0x578; // int32_t
+    pub const m_vecCSSClasses: usize = 0x580; // C_NetworkUtlVectorBase<CUtlSymbolLarge>
+    pub const m_bCheckCSSClasses: usize = 0x6F8; // bool
+}
+
+pub mod CInfoParticleTarget { // C_PointEntity
+}
+
+pub mod CInfoTarget { // C_PointEntity
+}
+
+pub mod CInfoWorldLayer { // C_BaseEntity
+    pub const m_pOutputOnEntitiesSpawned: usize = 0x540; // CEntityIOOutput
+    pub const m_worldName: usize = 0x568; // CUtlSymbolLarge
+    pub const m_layerName: usize = 0x570; // CUtlSymbolLarge
+    pub const m_bWorldLayerVisible: usize = 0x578; // bool
+    pub const m_bEntitiesSpawned: usize = 0x579; // bool
+    pub const m_bCreateAsChildSpawnGroup: usize = 0x57A; // bool
+    pub const m_hLayerSpawnGroup: usize = 0x57C; // uint32_t
+    pub const m_bWorldLayerActuallyVisible: usize = 0x580; // bool
+}
+
+pub mod CInterpolatedValue {
+    pub const m_flStartTime: usize = 0x0; // float
+    pub const m_flEndTime: usize = 0x4; // float
+    pub const m_flStartValue: usize = 0x8; // float
+    pub const m_flEndValue: usize = 0xC; // float
+    pub const m_nInterpType: usize = 0x10; // int32_t
+}
+
+pub mod CLightComponent { // CEntityComponent
+    pub const __m_pChainEntity: usize = 0x48; // CNetworkVarChainer
+    pub const m_Color: usize = 0x85; // Color
+    pub const m_SecondaryColor: usize = 0x89; // Color
+    pub const m_flBrightness: usize = 0x90; // float
+    pub const m_flBrightnessScale: usize = 0x94; // float
+    pub const m_flBrightnessMult: usize = 0x98; // float
+    pub const m_flRange: usize = 0x9C; // float
+    pub const m_flFalloff: usize = 0xA0; // float
+    pub const m_flAttenuation0: usize = 0xA4; // float
+    pub const m_flAttenuation1: usize = 0xA8; // float
+    pub const m_flAttenuation2: usize = 0xAC; // float
+    pub const m_flTheta: usize = 0xB0; // float
+    pub const m_flPhi: usize = 0xB4; // float
+    pub const m_hLightCookie: usize = 0xB8; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_nCascades: usize = 0xC0; // int32_t
+    pub const m_nCastShadows: usize = 0xC4; // int32_t
+    pub const m_nShadowWidth: usize = 0xC8; // int32_t
+    pub const m_nShadowHeight: usize = 0xCC; // int32_t
+    pub const m_bRenderDiffuse: usize = 0xD0; // bool
+    pub const m_nRenderSpecular: usize = 0xD4; // int32_t
+    pub const m_bRenderTransmissive: usize = 0xD8; // bool
+    pub const m_flOrthoLightWidth: usize = 0xDC; // float
+    pub const m_flOrthoLightHeight: usize = 0xE0; // float
+    pub const m_nStyle: usize = 0xE4; // int32_t
+    pub const m_Pattern: usize = 0xE8; // CUtlString
+    pub const m_nCascadeRenderStaticObjects: usize = 0xF0; // int32_t
+    pub const m_flShadowCascadeCrossFade: usize = 0xF4; // float
+    pub const m_flShadowCascadeDistanceFade: usize = 0xF8; // float
+    pub const m_flShadowCascadeDistance0: usize = 0xFC; // float
+    pub const m_flShadowCascadeDistance1: usize = 0x100; // float
+    pub const m_flShadowCascadeDistance2: usize = 0x104; // float
+    pub const m_flShadowCascadeDistance3: usize = 0x108; // float
+    pub const m_nShadowCascadeResolution0: usize = 0x10C; // int32_t
+    pub const m_nShadowCascadeResolution1: usize = 0x110; // int32_t
+    pub const m_nShadowCascadeResolution2: usize = 0x114; // int32_t
+    pub const m_nShadowCascadeResolution3: usize = 0x118; // int32_t
+    pub const m_bUsesBakedShadowing: usize = 0x11C; // bool
+    pub const m_nShadowPriority: usize = 0x120; // int32_t
+    pub const m_nBakedShadowIndex: usize = 0x124; // int32_t
+    pub const m_bRenderToCubemaps: usize = 0x128; // bool
+    pub const m_LightGroups: usize = 0x130; // CUtlSymbolLarge
+    pub const m_nDirectLight: usize = 0x138; // int32_t
+    pub const m_nIndirectLight: usize = 0x13C; // int32_t
+    pub const m_flFadeMinDist: usize = 0x140; // float
+    pub const m_flFadeMaxDist: usize = 0x144; // float
+    pub const m_flShadowFadeMinDist: usize = 0x148; // float
+    pub const m_flShadowFadeMaxDist: usize = 0x14C; // float
+    pub const m_bEnabled: usize = 0x150; // bool
+    pub const m_bFlicker: usize = 0x151; // bool
+    pub const m_bPrecomputedFieldsValid: usize = 0x152; // bool
+    pub const m_vPrecomputedBoundsMins: usize = 0x154; // Vector
+    pub const m_vPrecomputedBoundsMaxs: usize = 0x160; // Vector
+    pub const m_vPrecomputedOBBOrigin: usize = 0x16C; // Vector
+    pub const m_vPrecomputedOBBAngles: usize = 0x178; // QAngle
+    pub const m_vPrecomputedOBBExtent: usize = 0x184; // Vector
+    pub const m_flPrecomputedMaxRange: usize = 0x190; // float
+    pub const m_nFogLightingMode: usize = 0x194; // int32_t
+    pub const m_flFogContributionStength: usize = 0x198; // float
+    pub const m_flNearClipPlane: usize = 0x19C; // float
+    pub const m_SkyColor: usize = 0x1A0; // Color
+    pub const m_flSkyIntensity: usize = 0x1A4; // float
+    pub const m_SkyAmbientBounce: usize = 0x1A8; // Color
+    pub const m_bUseSecondaryColor: usize = 0x1AC; // bool
+    pub const m_bMixedShadows: usize = 0x1AD; // bool
+    pub const m_flLightStyleStartTime: usize = 0x1B0; // GameTime_t
+    pub const m_flCapsuleLength: usize = 0x1B4; // float
+    pub const m_flMinRoughness: usize = 0x1B8; // float
+}
+
+pub mod CLogicRelay { // CLogicalEntity
+    pub const m_OnTrigger: usize = 0x540; // CEntityIOOutput
+    pub const m_OnSpawn: usize = 0x568; // CEntityIOOutput
+    pub const m_bDisabled: usize = 0x590; // bool
+    pub const m_bWaitForRefire: usize = 0x591; // bool
+    pub const m_bTriggerOnce: usize = 0x592; // bool
+    pub const m_bFastRetrigger: usize = 0x593; // bool
+    pub const m_bPassthoughCaller: usize = 0x594; // bool
+}
+
+pub mod CLogicalEntity { // C_BaseEntity
+}
+
+pub mod CModelState {
+    pub const m_hModel: usize = 0xA0; // CStrongHandle<InfoForResourceTypeCModel>
+    pub const m_ModelName: usize = 0xA8; // CUtlSymbolLarge
+    pub const m_bClientClothCreationSuppressed: usize = 0xE8; // bool
+    pub const m_MeshGroupMask: usize = 0x180; // uint64_t
+    pub const m_nIdealMotionType: usize = 0x222; // int8_t
+    pub const m_nForceLOD: usize = 0x223; // int8_t
+    pub const m_nClothUpdateFlags: usize = 0x224; // int8_t
+}
+
+pub mod CNetworkedSequenceOperation {
+    pub const m_hSequence: usize = 0x8; // HSequence
+    pub const m_flPrevCycle: usize = 0xC; // float
+    pub const m_flCycle: usize = 0x10; // float
+    pub const m_flWeight: usize = 0x14; // CNetworkedQuantizedFloat
+    pub const m_bSequenceChangeNetworked: usize = 0x1C; // bool
+    pub const m_bDiscontinuity: usize = 0x1D; // bool
+    pub const m_flPrevCycleFromDiscontinuity: usize = 0x20; // float
+    pub const m_flPrevCycleForAnimEventDetection: usize = 0x24; // float
+}
+
+pub mod CPlayerSprayDecalRenderHelper {
+}
+
+pub mod CPlayer_AutoaimServices { // CPlayerPawnComponent
+}
+
+pub mod CPlayer_CameraServices { // CPlayerPawnComponent
+    pub const m_vecCsViewPunchAngle: usize = 0x40; // QAngle
+    pub const m_nCsViewPunchAngleTick: usize = 0x4C; // GameTick_t
+    pub const m_flCsViewPunchAngleTickRatio: usize = 0x50; // float
+    pub const m_PlayerFog: usize = 0x58; // C_fogplayerparams_t
+    pub const m_hColorCorrectionCtrl: usize = 0x98; // CHandle<C_ColorCorrection>
+    pub const m_hViewEntity: usize = 0x9C; // CHandle<C_BaseEntity>
+    pub const m_hTonemapController: usize = 0xA0; // CHandle<C_TonemapController2>
+    pub const m_audio: usize = 0xA8; // audioparams_t
+    pub const m_PostProcessingVolumes: usize = 0x120; // C_NetworkUtlVectorBase<CHandle<C_PostProcessingVolume>>
+    pub const m_flOldPlayerZ: usize = 0x138; // float
+    pub const m_flOldPlayerViewOffsetZ: usize = 0x13C; // float
+    pub const m_CurrentFog: usize = 0x140; // fogparams_t
+    pub const m_hOldFogController: usize = 0x1A8; // CHandle<C_FogController>
+    pub const m_bOverrideFogColor: usize = 0x1AC; // bool[5]
+    pub const m_OverrideFogColor: usize = 0x1B1; // Color[5]
+    pub const m_bOverrideFogStartEnd: usize = 0x1C5; // bool[5]
+    pub const m_fOverrideFogStart: usize = 0x1CC; // float[5]
+    pub const m_fOverrideFogEnd: usize = 0x1E0; // float[5]
+    pub const m_hActivePostProcessingVolume: usize = 0x1F4; // CHandle<C_PostProcessingVolume>
+    pub const m_angDemoViewAngles: usize = 0x1F8; // QAngle
+}
+
+pub mod CPlayer_FlashlightServices { // CPlayerPawnComponent
+}
+
+pub mod CPlayer_ItemServices { // CPlayerPawnComponent
+}
+
+pub mod CPlayer_MovementServices { // CPlayerPawnComponent
+    pub const m_nImpulse: usize = 0x40; // int32_t
+    pub const m_nButtons: usize = 0x48; // CInButtonState
+    pub const m_nQueuedButtonDownMask: usize = 0x68; // uint64_t
+    pub const m_nQueuedButtonChangeMask: usize = 0x70; // uint64_t
+    pub const m_nButtonDoublePressed: usize = 0x78; // uint64_t
+    pub const m_pButtonPressedCmdNumber: usize = 0x80; // uint32_t[64]
+    pub const m_nLastCommandNumberProcessed: usize = 0x180; // uint32_t
+    pub const m_nToggleButtonDownMask: usize = 0x188; // uint64_t
+    pub const m_flMaxspeed: usize = 0x190; // float
+    pub const m_arrForceSubtickMoveWhen: usize = 0x194; // float[4]
+    pub const m_flForwardMove: usize = 0x1A4; // float
+    pub const m_flLeftMove: usize = 0x1A8; // float
+    pub const m_flUpMove: usize = 0x1AC; // float
+    pub const m_vecLastMovementImpulses: usize = 0x1B0; // Vector
+    pub const m_vecOldViewAngles: usize = 0x1BC; // QAngle
+}
+
+pub mod CPlayer_MovementServices_Humanoid { // CPlayer_MovementServices
+    pub const m_flStepSoundTime: usize = 0x1D0; // float
+    pub const m_flFallVelocity: usize = 0x1D4; // float
+    pub const m_bInCrouch: usize = 0x1D8; // bool
+    pub const m_nCrouchState: usize = 0x1DC; // uint32_t
+    pub const m_flCrouchTransitionStartTime: usize = 0x1E0; // GameTime_t
+    pub const m_bDucked: usize = 0x1E4; // bool
+    pub const m_bDucking: usize = 0x1E5; // bool
+    pub const m_bInDuckJump: usize = 0x1E6; // bool
+    pub const m_groundNormal: usize = 0x1E8; // Vector
+    pub const m_flSurfaceFriction: usize = 0x1F4; // float
+    pub const m_surfaceProps: usize = 0x1F8; // CUtlStringToken
+    pub const m_nStepside: usize = 0x208; // int32_t
+}
+
+pub mod CPlayer_ObserverServices { // CPlayerPawnComponent
+    pub const m_iObserverMode: usize = 0x40; // uint8_t
+    pub const m_hObserverTarget: usize = 0x44; // CHandle<C_BaseEntity>
+    pub const m_iObserverLastMode: usize = 0x48; // ObserverMode_t
+    pub const m_bForcedObserverMode: usize = 0x4C; // bool
+    pub const m_flObserverChaseDistance: usize = 0x50; // float
+    pub const m_flObserverChaseDistanceCalcTime: usize = 0x54; // GameTime_t
+}
+
+pub mod CPlayer_UseServices { // CPlayerPawnComponent
+}
+
+pub mod CPlayer_ViewModelServices { // CPlayerPawnComponent
+}
+
+pub mod CPlayer_WaterServices { // CPlayerPawnComponent
+}
+
+pub mod CPlayer_WeaponServices { // CPlayerPawnComponent
+    pub const m_bAllowSwitchToNoWeapon: usize = 0x40; // bool
+    pub const m_hMyWeapons: usize = 0x48; // C_NetworkUtlVectorBase<CHandle<C_BasePlayerWeapon>>
+    pub const m_hActiveWeapon: usize = 0x60; // CHandle<C_BasePlayerWeapon>
+    pub const m_hLastWeapon: usize = 0x64; // CHandle<C_BasePlayerWeapon>
+    pub const m_iAmmo: usize = 0x68; // uint16_t[32]
+}
+
+pub mod CPointOffScreenIndicatorUi { // C_PointClientUIWorldPanel
+    pub const m_bBeenEnabled: usize = 0xF20; // bool
+    pub const m_bHide: usize = 0xF21; // bool
+    pub const m_flSeenTargetTime: usize = 0xF24; // float
+    pub const m_pTargetPanel: usize = 0xF28; // C_PointClientUIWorldPanel*
+}
+
+pub mod CPointTemplate { // CLogicalEntity
+    pub const m_iszWorldName: usize = 0x540; // CUtlSymbolLarge
+    pub const m_iszSource2EntityLumpName: usize = 0x548; // CUtlSymbolLarge
+    pub const m_iszEntityFilterName: usize = 0x550; // CUtlSymbolLarge
+    pub const m_flTimeoutInterval: usize = 0x558; // float
+    pub const m_bAsynchronouslySpawnEntities: usize = 0x55C; // bool
+    pub const m_pOutputOnSpawned: usize = 0x560; // CEntityIOOutput
+    pub const m_clientOnlyEntityBehavior: usize = 0x588; // PointTemplateClientOnlyEntityBehavior_t
+    pub const m_ownerSpawnGroupType: usize = 0x58C; // PointTemplateOwnerSpawnGroupType_t
+    pub const m_createdSpawnGroupHandles: usize = 0x590; // CUtlVector<uint32_t>
+    pub const m_SpawnedEntityHandles: usize = 0x5A8; // CUtlVector<CEntityHandle>
+    pub const m_ScriptSpawnCallback: usize = 0x5C0; // HSCRIPT
+    pub const m_ScriptCallbackScope: usize = 0x5C8; // HSCRIPT
+}
+
+pub mod CPrecipitationVData { // CEntitySubclassVDataBase
+    pub const m_szParticlePrecipitationEffect: usize = 0x28; // CResourceNameTyped<CWeakHandle<InfoForResourceTypeIParticleSystemDefinition>>
+    pub const m_flInnerDistance: usize = 0x108; // float
+    pub const m_nAttachType: usize = 0x10C; // ParticleAttachment_t
+    pub const m_bBatchSameVolumeType: usize = 0x110; // bool
+    pub const m_nRTEnvCP: usize = 0x114; // int32_t
+    pub const m_nRTEnvCPComponent: usize = 0x118; // int32_t
+    pub const m_szModifier: usize = 0x120; // CUtlString
+}
+
+pub mod CProjectedTextureBase {
+    pub const m_hTargetEntity: usize = 0xC; // CHandle<C_BaseEntity>
+    pub const m_bState: usize = 0x10; // bool
+    pub const m_bAlwaysUpdate: usize = 0x11; // bool
+    pub const m_flLightFOV: usize = 0x14; // float
+    pub const m_bEnableShadows: usize = 0x18; // bool
+    pub const m_bSimpleProjection: usize = 0x19; // bool
+    pub const m_bLightOnlyTarget: usize = 0x1A; // bool
+    pub const m_bLightWorld: usize = 0x1B; // bool
+    pub const m_bCameraSpace: usize = 0x1C; // bool
+    pub const m_flBrightnessScale: usize = 0x20; // float
+    pub const m_LightColor: usize = 0x24; // Color
+    pub const m_flIntensity: usize = 0x28; // float
+    pub const m_flLinearAttenuation: usize = 0x2C; // float
+    pub const m_flQuadraticAttenuation: usize = 0x30; // float
+    pub const m_bVolumetric: usize = 0x34; // bool
+    pub const m_flVolumetricIntensity: usize = 0x38; // float
+    pub const m_flNoiseStrength: usize = 0x3C; // float
+    pub const m_flFlashlightTime: usize = 0x40; // float
+    pub const m_nNumPlanes: usize = 0x44; // uint32_t
+    pub const m_flPlaneOffset: usize = 0x48; // float
+    pub const m_flColorTransitionTime: usize = 0x4C; // float
+    pub const m_flAmbient: usize = 0x50; // float
+    pub const m_SpotlightTextureName: usize = 0x54; // char[512]
+    pub const m_nSpotlightTextureFrame: usize = 0x254; // int32_t
+    pub const m_nShadowQuality: usize = 0x258; // uint32_t
+    pub const m_flNearZ: usize = 0x25C; // float
+    pub const m_flFarZ: usize = 0x260; // float
+    pub const m_flProjectionSize: usize = 0x264; // float
+    pub const m_flRotation: usize = 0x268; // float
+    pub const m_bFlipHorizontal: usize = 0x26C; // bool
+}
+
+pub mod CRenderComponent { // CEntityComponent
+    pub const __m_pChainEntity: usize = 0x10; // CNetworkVarChainer
+    pub const m_bIsRenderingWithViewModels: usize = 0x50; // bool
+    pub const m_nSplitscreenFlags: usize = 0x54; // uint32_t
+    pub const m_bEnableRendering: usize = 0x60; // bool
+    pub const m_bInterpolationReadyToDraw: usize = 0xB0; // bool
+}
+
+pub mod CSMatchStats_t { // CSPerRoundStats_t
+    pub const m_iEnemy5Ks: usize = 0x68; // int32_t
+    pub const m_iEnemy4Ks: usize = 0x6C; // int32_t
+    pub const m_iEnemy3Ks: usize = 0x70; // int32_t
+}
+
+pub mod CSPerRoundStats_t {
+    pub const m_iKills: usize = 0x30; // int32_t
+    pub const m_iDeaths: usize = 0x34; // int32_t
+    pub const m_iAssists: usize = 0x38; // int32_t
+    pub const m_iDamage: usize = 0x3C; // int32_t
+    pub const m_iEquipmentValue: usize = 0x40; // int32_t
+    pub const m_iMoneySaved: usize = 0x44; // int32_t
+    pub const m_iKillReward: usize = 0x48; // int32_t
+    pub const m_iLiveTime: usize = 0x4C; // int32_t
+    pub const m_iHeadShotKills: usize = 0x50; // int32_t
+    pub const m_iObjective: usize = 0x54; // int32_t
+    pub const m_iCashEarned: usize = 0x58; // int32_t
+    pub const m_iUtilityDamage: usize = 0x5C; // int32_t
+    pub const m_iEnemiesFlashed: usize = 0x60; // int32_t
+}
+
+pub mod CScriptComponent { // CEntityComponent
+    pub const m_scriptClassName: usize = 0x30; // CUtlSymbolLarge
+}
+
+pub mod CServerOnlyModelEntity { // C_BaseModelEntity
+}
+
+pub mod CSkeletonInstance { // CGameSceneNode
+    pub const m_modelState: usize = 0x160; // CModelState
+    pub const m_bIsAnimationEnabled: usize = 0x390; // bool
+    pub const m_bUseParentRenderBounds: usize = 0x391; // bool
+    pub const m_bDisableSolidCollisionsForHierarchy: usize = 0x392; // bool
+    pub const m_bDirtyMotionType: usize = 0x0; // bitfield:1
+    pub const m_bIsGeneratingLatchedParentSpaceState: usize = 0x0; // bitfield:1
+    pub const m_materialGroup: usize = 0x394; // CUtlStringToken
+    pub const m_nHitboxSet: usize = 0x398; // uint8_t
+}
+
+pub mod CSkyboxReference { // C_BaseEntity
+    pub const m_worldGroupId: usize = 0x540; // WorldGroupId_t
+    pub const m_hSkyCamera: usize = 0x544; // CHandle<C_SkyCamera>
+}
+
+pub mod CTablet { // C_CSWeaponBase
+}
+
+pub mod CTimeline { // IntervalTimer
+    pub const m_flValues: usize = 0x10; // float[64]
+    pub const m_nValueCounts: usize = 0x110; // int32_t[64]
+    pub const m_nBucketCount: usize = 0x210; // int32_t
+    pub const m_flInterval: usize = 0x214; // float
+    pub const m_flFinalValue: usize = 0x218; // float
+    pub const m_nCompressionType: usize = 0x21C; // TimelineCompression_t
+    pub const m_bStopped: usize = 0x220; // bool
+}
+
+pub mod CTripWireFire { // C_BaseCSGrenade
+}
+
+pub mod CTripWireFireProjectile { // C_BaseGrenade
+}
+
+pub mod CWaterSplasher { // C_BaseModelEntity
+}
+
+pub mod CWeaponZoneRepulsor { // C_CSWeaponBaseGun
+}
+
+pub mod C_AK47 { // C_CSWeaponBaseGun
+}
+
+pub mod C_AttributeContainer { // CAttributeManager
+    pub const m_Item: usize = 0x50; // C_EconItemView
+    pub const m_iExternalItemProviderRegisteredToken: usize = 0x498; // int32_t
+    pub const m_ullRegisteredAsItemID: usize = 0x4A0; // uint64_t
+}
+
+pub mod C_BarnLight { // C_BaseModelEntity
+    pub const m_bEnabled: usize = 0xCC0; // bool
+    pub const m_nColorMode: usize = 0xCC4; // int32_t
+    pub const m_Color: usize = 0xCC8; // Color
+    pub const m_flColorTemperature: usize = 0xCCC; // float
+    pub const m_flBrightness: usize = 0xCD0; // float
+    pub const m_flBrightnessScale: usize = 0xCD4; // float
+    pub const m_nDirectLight: usize = 0xCD8; // int32_t
+    pub const m_nBakedShadowIndex: usize = 0xCDC; // int32_t
+    pub const m_nLuminaireShape: usize = 0xCE0; // int32_t
+    pub const m_flLuminaireSize: usize = 0xCE4; // float
+    pub const m_flLuminaireAnisotropy: usize = 0xCE8; // float
+    pub const m_LightStyleString: usize = 0xCF0; // CUtlString
+    pub const m_flLightStyleStartTime: usize = 0xCF8; // GameTime_t
+    pub const m_QueuedLightStyleStrings: usize = 0xD00; // C_NetworkUtlVectorBase<CUtlString>
+    pub const m_LightStyleEvents: usize = 0xD18; // C_NetworkUtlVectorBase<CUtlString>
+    pub const m_LightStyleTargets: usize = 0xD30; // C_NetworkUtlVectorBase<CHandle<C_BaseModelEntity>>
+    pub const m_StyleEvent: usize = 0xD48; // CEntityIOOutput[4]
+    pub const m_hLightCookie: usize = 0xDE8; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_flShape: usize = 0xDF0; // float
+    pub const m_flSoftX: usize = 0xDF4; // float
+    pub const m_flSoftY: usize = 0xDF8; // float
+    pub const m_flSkirt: usize = 0xDFC; // float
+    pub const m_flSkirtNear: usize = 0xE00; // float
+    pub const m_vSizeParams: usize = 0xE04; // Vector
+    pub const m_flRange: usize = 0xE10; // float
+    pub const m_vShear: usize = 0xE14; // Vector
+    pub const m_nBakeSpecularToCubemaps: usize = 0xE20; // int32_t
+    pub const m_vBakeSpecularToCubemapsSize: usize = 0xE24; // Vector
+    pub const m_nCastShadows: usize = 0xE30; // int32_t
+    pub const m_nShadowMapSize: usize = 0xE34; // int32_t
+    pub const m_nShadowPriority: usize = 0xE38; // int32_t
+    pub const m_bContactShadow: usize = 0xE3C; // bool
+    pub const m_nBounceLight: usize = 0xE40; // int32_t
+    pub const m_flBounceScale: usize = 0xE44; // float
+    pub const m_flMinRoughness: usize = 0xE48; // float
+    pub const m_vAlternateColor: usize = 0xE4C; // Vector
+    pub const m_fAlternateColorBrightness: usize = 0xE58; // float
+    pub const m_nFog: usize = 0xE5C; // int32_t
+    pub const m_flFogStrength: usize = 0xE60; // float
+    pub const m_nFogShadows: usize = 0xE64; // int32_t
+    pub const m_flFogScale: usize = 0xE68; // float
+    pub const m_flFadeSizeStart: usize = 0xE6C; // float
+    pub const m_flFadeSizeEnd: usize = 0xE70; // float
+    pub const m_flShadowFadeSizeStart: usize = 0xE74; // float
+    pub const m_flShadowFadeSizeEnd: usize = 0xE78; // float
+    pub const m_bPrecomputedFieldsValid: usize = 0xE7C; // bool
+    pub const m_vPrecomputedBoundsMins: usize = 0xE80; // Vector
+    pub const m_vPrecomputedBoundsMaxs: usize = 0xE8C; // Vector
+    pub const m_vPrecomputedOBBOrigin: usize = 0xE98; // Vector
+    pub const m_vPrecomputedOBBAngles: usize = 0xEA4; // QAngle
+    pub const m_vPrecomputedOBBExtent: usize = 0xEB0; // Vector
+}
+
+pub mod C_BaseButton { // C_BaseToggle
+    pub const m_glowEntity: usize = 0xCC0; // CHandle<C_BaseModelEntity>
+    pub const m_usable: usize = 0xCC4; // bool
+    pub const m_szDisplayText: usize = 0xCC8; // CUtlSymbolLarge
+}
+
+pub mod C_BaseCSGrenade { // C_CSWeaponBase
+    pub const m_bClientPredictDelete: usize = 0x1940; // bool
+    pub const m_bRedraw: usize = 0x1968; // bool
+    pub const m_bIsHeldByPlayer: usize = 0x1969; // bool
+    pub const m_bPinPulled: usize = 0x196A; // bool
+    pub const m_bJumpThrow: usize = 0x196B; // bool
+    pub const m_eThrowStatus: usize = 0x196C; // EGrenadeThrowState
+    pub const m_fThrowTime: usize = 0x1970; // GameTime_t
+    pub const m_flThrowStrength: usize = 0x1974; // float
+    pub const m_flThrowStrengthApproach: usize = 0x1978; // float
+    pub const m_fDropTime: usize = 0x197C; // GameTime_t
+}
+
+pub mod C_BaseCSGrenadeProjectile { // C_BaseGrenade
+    pub const m_vInitialVelocity: usize = 0x1068; // Vector
+    pub const m_nBounces: usize = 0x1074; // int32_t
+    pub const m_nExplodeEffectIndex: usize = 0x1078; // CStrongHandle<InfoForResourceTypeIParticleSystemDefinition>
+    pub const m_nExplodeEffectTickBegin: usize = 0x1080; // int32_t
+    pub const m_vecExplodeEffectOrigin: usize = 0x1084; // Vector
+    pub const m_flSpawnTime: usize = 0x1090; // GameTime_t
+    pub const vecLastTrailLinePos: usize = 0x1094; // Vector
+    pub const flNextTrailLineTime: usize = 0x10A0; // GameTime_t
+    pub const m_bExplodeEffectBegan: usize = 0x10A4; // bool
+    pub const m_bCanCreateGrenadeTrail: usize = 0x10A5; // bool
+    pub const m_nSnapshotTrajectoryEffectIndex: usize = 0x10A8; // ParticleIndex_t
+    pub const m_hSnapshotTrajectoryParticleSnapshot: usize = 0x10B0; // CStrongHandle<InfoForResourceTypeIParticleSnapshot>
+    pub const m_arrTrajectoryTrailPoints: usize = 0x10B8; // CUtlVector<Vector>
+    pub const m_arrTrajectoryTrailPointCreationTimes: usize = 0x10D0; // CUtlVector<float>
+    pub const m_flTrajectoryTrailEffectCreationTime: usize = 0x10E8; // float
+}
+
+pub mod C_BaseClientUIEntity { // C_BaseModelEntity
+    pub const m_bEnabled: usize = 0xCC8; // bool
+    pub const m_DialogXMLName: usize = 0xCD0; // CUtlSymbolLarge
+    pub const m_PanelClassName: usize = 0xCD8; // CUtlSymbolLarge
+    pub const m_PanelID: usize = 0xCE0; // CUtlSymbolLarge
+}
+
+pub mod C_BaseCombatCharacter { // C_BaseFlex
+    pub const m_hMyWearables: usize = 0x1018; // C_NetworkUtlVectorBase<CHandle<C_EconWearable>>
+    pub const m_bloodColor: usize = 0x1030; // int32_t
+    pub const m_leftFootAttachment: usize = 0x1034; // AttachmentHandle_t
+    pub const m_rightFootAttachment: usize = 0x1035; // AttachmentHandle_t
+    pub const m_nWaterWakeMode: usize = 0x1038; // C_BaseCombatCharacter::WaterWakeMode_t
+    pub const m_flWaterWorldZ: usize = 0x103C; // float
+    pub const m_flWaterNextTraceTime: usize = 0x1040; // float
+    pub const m_flFieldOfView: usize = 0x1044; // float
+}
+
+pub mod C_BaseDoor { // C_BaseToggle
+    pub const m_bIsUsable: usize = 0xCC0; // bool
+}
+
+pub mod C_BaseEntity { // CEntityInstance
+    pub const m_CBodyComponent: usize = 0x30; // CBodyComponent*
+    pub const m_NetworkTransmitComponent: usize = 0x38; // CNetworkTransmitComponent
+    pub const m_nLastThinkTick: usize = 0x308; // GameTick_t
+    pub const m_pGameSceneNode: usize = 0x310; // CGameSceneNode*
+    pub const m_pRenderComponent: usize = 0x318; // CRenderComponent*
+    pub const m_pCollision: usize = 0x320; // CCollisionProperty*
+    pub const m_iMaxHealth: usize = 0x328; // int32_t
+    pub const m_iHealth: usize = 0x32C; // int32_t
+    pub const m_lifeState: usize = 0x330; // uint8_t
+    pub const m_bTakesDamage: usize = 0x331; // bool
+    pub const m_nTakeDamageFlags: usize = 0x334; // TakeDamageFlags_t
+    pub const m_ubInterpolationFrame: usize = 0x338; // uint8_t
+    pub const m_hSceneObjectController: usize = 0x33C; // CHandle<C_BaseEntity>
+    pub const m_nNoInterpolationTick: usize = 0x340; // int32_t
+    pub const m_nVisibilityNoInterpolationTick: usize = 0x344; // int32_t
+    pub const m_flProxyRandomValue: usize = 0x348; // float
+    pub const m_iEFlags: usize = 0x34C; // int32_t
+    pub const m_nWaterType: usize = 0x350; // uint8_t
+    pub const m_bInterpolateEvenWithNoModel: usize = 0x351; // bool
+    pub const m_bPredictionEligible: usize = 0x352; // bool
+    pub const m_bApplyLayerMatchIDToModel: usize = 0x353; // bool
+    pub const m_tokLayerMatchID: usize = 0x354; // CUtlStringToken
+    pub const m_nSubclassID: usize = 0x358; // CUtlStringToken
+    pub const m_nSimulationTick: usize = 0x368; // int32_t
+    pub const m_iCurrentThinkContext: usize = 0x36C; // int32_t
+    pub const m_aThinkFunctions: usize = 0x370; // CUtlVector<thinkfunc_t>
+    pub const m_flAnimTime: usize = 0x388; // float
+    pub const m_flSimulationTime: usize = 0x38C; // float
+    pub const m_nSceneObjectOverrideFlags: usize = 0x390; // uint8_t
+    pub const m_bHasSuccessfullyInterpolated: usize = 0x391; // bool
+    pub const m_bHasAddedVarsToInterpolation: usize = 0x392; // bool
+    pub const m_bRenderEvenWhenNotSuccessfullyInterpolated: usize = 0x393; // bool
+    pub const m_nInterpolationLatchDirtyFlags: usize = 0x394; // int32_t[2]
+    pub const m_ListEntry: usize = 0x39C; // uint16_t[11]
+    pub const m_flCreateTime: usize = 0x3B4; // GameTime_t
+    pub const m_flSpeed: usize = 0x3B8; // float
+    pub const m_EntClientFlags: usize = 0x3BC; // uint16_t
+    pub const m_bClientSideRagdoll: usize = 0x3BE; // bool
+    pub const m_iTeamNum: usize = 0x3BF; // uint8_t
+    pub const m_spawnflags: usize = 0x3C0; // uint32_t
+    pub const m_nNextThinkTick: usize = 0x3C4; // GameTick_t
+    pub const m_fFlags: usize = 0x3C8; // uint32_t
+    pub const m_vecAbsVelocity: usize = 0x3CC; // Vector
+    pub const m_vecVelocity: usize = 0x3D8; // CNetworkVelocityVector
+    pub const m_vecBaseVelocity: usize = 0x408; // Vector
+    pub const m_hEffectEntity: usize = 0x414; // CHandle<C_BaseEntity>
+    pub const m_hOwnerEntity: usize = 0x418; // CHandle<C_BaseEntity>
+    pub const m_MoveCollide: usize = 0x41C; // MoveCollide_t
+    pub const m_MoveType: usize = 0x41D; // MoveType_t
+    pub const m_flWaterLevel: usize = 0x420; // float
+    pub const m_fEffects: usize = 0x424; // uint32_t
+    pub const m_hGroundEntity: usize = 0x428; // CHandle<C_BaseEntity>
+    pub const m_flFriction: usize = 0x42C; // float
+    pub const m_flElasticity: usize = 0x430; // float
+    pub const m_flGravityScale: usize = 0x434; // float
+    pub const m_flTimeScale: usize = 0x438; // float
+    pub const m_bSimulatedEveryTick: usize = 0x43C; // bool
+    pub const m_bAnimatedEveryTick: usize = 0x43D; // bool
+    pub const m_flNavIgnoreUntilTime: usize = 0x440; // GameTime_t
+    pub const m_hThink: usize = 0x444; // uint16_t
+    pub const m_fBBoxVisFlags: usize = 0x450; // uint8_t
+    pub const m_bPredictable: usize = 0x451; // bool
+    pub const m_bRenderWithViewModels: usize = 0x452; // bool
+    pub const m_nSplitUserPlayerPredictionSlot: usize = 0x454; // CSplitScreenSlot
+    pub const m_nFirstPredictableCommand: usize = 0x458; // int32_t
+    pub const m_nLastPredictableCommand: usize = 0x45C; // int32_t
+    pub const m_hOldMoveParent: usize = 0x460; // CHandle<C_BaseEntity>
+    pub const m_Particles: usize = 0x468; // CParticleProperty
+    pub const m_vecPredictedScriptFloats: usize = 0x490; // CUtlVector<float>
+    pub const m_vecPredictedScriptFloatIDs: usize = 0x4A8; // CUtlVector<int32_t>
+    pub const m_nNextScriptVarRecordID: usize = 0x4D8; // int32_t
+    pub const m_vecAngVelocity: usize = 0x4E8; // QAngle
+    pub const m_DataChangeEventRef: usize = 0x4F4; // int32_t
+    pub const m_dependencies: usize = 0x4F8; // CUtlVector<CEntityHandle>
+    pub const m_nCreationTick: usize = 0x510; // int32_t
+    pub const m_bAnimTimeChanged: usize = 0x529; // bool
+    pub const m_bSimulationTimeChanged: usize = 0x52A; // bool
+    pub const m_sUniqueHammerID: usize = 0x538; // CUtlString
+}
+
+pub mod C_BaseFire { // C_BaseEntity
+    pub const m_flScale: usize = 0x540; // float
+    pub const m_flStartScale: usize = 0x544; // float
+    pub const m_flScaleTime: usize = 0x548; // float
+    pub const m_nFlags: usize = 0x54C; // uint32_t
+}
+
+pub mod C_BaseFlex { // CBaseAnimGraph
+    pub const m_flexWeight: usize = 0xE90; // C_NetworkUtlVectorBase<float>
+    pub const m_vLookTargetPosition: usize = 0xEA8; // Vector
+    pub const m_blinktoggle: usize = 0xEC0; // bool
+    pub const m_nLastFlexUpdateFrameCount: usize = 0xF20; // int32_t
+    pub const m_CachedViewTarget: usize = 0xF24; // Vector
+    pub const m_nNextSceneEventId: usize = 0xF30; // uint32_t
+    pub const m_iBlink: usize = 0xF34; // int32_t
+    pub const m_blinktime: usize = 0xF38; // float
+    pub const m_prevblinktoggle: usize = 0xF3C; // bool
+    pub const m_iJawOpen: usize = 0xF40; // int32_t
+    pub const m_flJawOpenAmount: usize = 0xF44; // float
+    pub const m_flBlinkAmount: usize = 0xF48; // float
+    pub const m_iMouthAttachment: usize = 0xF4C; // AttachmentHandle_t
+    pub const m_iEyeAttachment: usize = 0xF4D; // AttachmentHandle_t
+    pub const m_bResetFlexWeightsOnModelChange: usize = 0xF4E; // bool
+    pub const m_nEyeOcclusionRendererBone: usize = 0xF68; // int32_t
+    pub const m_mEyeOcclusionRendererCameraToBoneTransform: usize = 0xF6C; // matrix3x4_t
+    pub const m_vEyeOcclusionRendererHalfExtent: usize = 0xF9C; // Vector
+    pub const m_PhonemeClasses: usize = 0xFB8; // C_BaseFlex::Emphasized_Phoneme[3]
+}
+
+pub mod C_BaseFlex_Emphasized_Phoneme {
+    pub const m_sClassName: usize = 0x0; // CUtlString
+    pub const m_flAmount: usize = 0x18; // float
+    pub const m_bRequired: usize = 0x1C; // bool
+    pub const m_bBasechecked: usize = 0x1D; // bool
+    pub const m_bValid: usize = 0x1E; // bool
+}
+
+pub mod C_BaseGrenade { // C_BaseFlex
+    pub const m_bHasWarnedAI: usize = 0x1018; // bool
+    pub const m_bIsSmokeGrenade: usize = 0x1019; // bool
+    pub const m_bIsLive: usize = 0x101A; // bool
+    pub const m_DmgRadius: usize = 0x101C; // float
+    pub const m_flDetonateTime: usize = 0x1020; // GameTime_t
+    pub const m_flWarnAITime: usize = 0x1024; // float
+    pub const m_flDamage: usize = 0x1028; // float
+    pub const m_iszBounceSound: usize = 0x1030; // CUtlSymbolLarge
+    pub const m_ExplosionSound: usize = 0x1038; // CUtlString
+    pub const m_hThrower: usize = 0x1044; // CHandle<C_CSPlayerPawn>
+    pub const m_flNextAttack: usize = 0x105C; // GameTime_t
+    pub const m_hOriginalThrower: usize = 0x1060; // CHandle<C_CSPlayerPawn>
+}
+
+pub mod C_BaseModelEntity { // C_BaseEntity
+    pub const m_CRenderComponent: usize = 0xA10; // CRenderComponent*
+    pub const m_CHitboxComponent: usize = 0xA18; // CHitboxComponent
+    pub const m_bInitModelEffects: usize = 0xA60; // bool
+    pub const m_bIsStaticProp: usize = 0xA61; // bool
+    pub const m_nLastAddDecal: usize = 0xA64; // int32_t
+    pub const m_nDecalsAdded: usize = 0xA68; // int32_t
+    pub const m_iOldHealth: usize = 0xA6C; // int32_t
+    pub const m_nRenderMode: usize = 0xA70; // RenderMode_t
+    pub const m_nRenderFX: usize = 0xA71; // RenderFx_t
+    pub const m_bAllowFadeInView: usize = 0xA72; // bool
+    pub const m_clrRender: usize = 0xA73; // Color
+    pub const m_vecRenderAttributes: usize = 0xA78; // C_UtlVectorEmbeddedNetworkVar<EntityRenderAttribute_t>
+    pub const m_LightGroup: usize = 0xAE0; // CUtlStringToken
+    pub const m_bRenderToCubemaps: usize = 0xAE4; // bool
+    pub const m_Collision: usize = 0xAE8; // CCollisionProperty
+    pub const m_Glow: usize = 0xB98; // CGlowProperty
+    pub const m_flGlowBackfaceMult: usize = 0xBF0; // float
+    pub const m_fadeMinDist: usize = 0xBF4; // float
+    pub const m_fadeMaxDist: usize = 0xBF8; // float
+    pub const m_flFadeScale: usize = 0xBFC; // float
+    pub const m_flShadowStrength: usize = 0xC00; // float
+    pub const m_nObjectCulling: usize = 0xC04; // uint8_t
+    pub const m_nAddDecal: usize = 0xC08; // int32_t
+    pub const m_vDecalPosition: usize = 0xC0C; // Vector
+    pub const m_vDecalForwardAxis: usize = 0xC18; // Vector
+    pub const m_flDecalHealBloodRate: usize = 0xC24; // float
+    pub const m_flDecalHealHeightRate: usize = 0xC28; // float
+    pub const m_ConfigEntitiesToPropagateMaterialDecalsTo: usize = 0xC30; // C_NetworkUtlVectorBase<CHandle<C_BaseModelEntity>>
+    pub const m_vecViewOffset: usize = 0xC48; // CNetworkViewOffsetVector
+    pub const m_pClientAlphaProperty: usize = 0xC78; // CClientAlphaProperty*
+    pub const m_ClientOverrideTint: usize = 0xC80; // Color
+    pub const m_bUseClientOverrideTint: usize = 0xC84; // bool
+}
+
+pub mod C_BasePlayerPawn { // C_BaseCombatCharacter
+    pub const m_pWeaponServices: usize = 0x10A8; // CPlayer_WeaponServices*
+    pub const m_pItemServices: usize = 0x10B0; // CPlayer_ItemServices*
+    pub const m_pAutoaimServices: usize = 0x10B8; // CPlayer_AutoaimServices*
+    pub const m_pObserverServices: usize = 0x10C0; // CPlayer_ObserverServices*
+    pub const m_pWaterServices: usize = 0x10C8; // CPlayer_WaterServices*
+    pub const m_pUseServices: usize = 0x10D0; // CPlayer_UseServices*
+    pub const m_pFlashlightServices: usize = 0x10D8; // CPlayer_FlashlightServices*
+    pub const m_pCameraServices: usize = 0x10E0; // CPlayer_CameraServices*
+    pub const m_pMovementServices: usize = 0x10E8; // CPlayer_MovementServices*
+    pub const m_ServerViewAngleChanges: usize = 0x10F8; // C_UtlVectorEmbeddedNetworkVar<ViewAngleServerChange_t>
+    pub const m_nHighestConsumedServerViewAngleChangeIndex: usize = 0x1148; // uint32_t
+    pub const v_angle: usize = 0x114C; // QAngle
+    pub const v_anglePrevious: usize = 0x1158; // QAngle
+    pub const m_iHideHUD: usize = 0x1164; // uint32_t
+    pub const m_skybox3d: usize = 0x1168; // sky3dparams_t
+    pub const m_flDeathTime: usize = 0x11F8; // GameTime_t
+    pub const m_vecPredictionError: usize = 0x11FC; // Vector
+    pub const m_flPredictionErrorTime: usize = 0x1208; // GameTime_t
+    pub const m_flFOVSensitivityAdjust: usize = 0x120C; // float
+    pub const m_flMouseSensitivity: usize = 0x1210; // float
+    pub const m_vOldOrigin: usize = 0x1214; // Vector
+    pub const m_flOldSimulationTime: usize = 0x1220; // float
+    pub const m_nLastExecutedCommandNumber: usize = 0x1224; // int32_t
+    pub const m_nLastExecutedCommandTick: usize = 0x1228; // int32_t
+    pub const m_hController: usize = 0x122C; // CHandle<CBasePlayerController>
+    pub const m_bIsSwappingToPredictableController: usize = 0x1230; // bool
+}
+
+pub mod C_BasePlayerWeapon { // C_EconEntity
+    pub const m_nNextPrimaryAttackTick: usize = 0x1560; // GameTick_t
+    pub const m_flNextPrimaryAttackTickRatio: usize = 0x1564; // float
+    pub const m_nNextSecondaryAttackTick: usize = 0x1568; // GameTick_t
+    pub const m_flNextSecondaryAttackTickRatio: usize = 0x156C; // float
+    pub const m_iClip1: usize = 0x1570; // int32_t
+    pub const m_iClip2: usize = 0x1574; // int32_t
+    pub const m_pReserveAmmo: usize = 0x1578; // int32_t[2]
+}
+
+pub mod C_BasePropDoor { // C_DynamicProp
+    pub const m_eDoorState: usize = 0x10F8; // DoorState_t
+    pub const m_modelChanged: usize = 0x10FC; // bool
+    pub const m_bLocked: usize = 0x10FD; // bool
+    pub const m_closedPosition: usize = 0x1100; // Vector
+    pub const m_closedAngles: usize = 0x110C; // QAngle
+    pub const m_hMaster: usize = 0x1118; // CHandle<C_BasePropDoor>
+    pub const m_vWhereToSetLightingOrigin: usize = 0x111C; // Vector
+}
+
+pub mod C_BaseToggle { // C_BaseModelEntity
+}
+
+pub mod C_BaseTrigger { // C_BaseToggle
+    pub const m_bDisabled: usize = 0xCC0; // bool
+    pub const m_bClientSidePredicted: usize = 0xCC1; // bool
+}
+
+pub mod C_BaseViewModel { // CBaseAnimGraph
+    pub const m_vecLastFacing: usize = 0xE88; // Vector
+    pub const m_nViewModelIndex: usize = 0xE94; // uint32_t
+    pub const m_nAnimationParity: usize = 0xE98; // uint32_t
+    pub const m_flAnimationStartTime: usize = 0xE9C; // float
+    pub const m_hWeapon: usize = 0xEA0; // CHandle<C_BasePlayerWeapon>
+    pub const m_sVMName: usize = 0xEA8; // CUtlSymbolLarge
+    pub const m_sAnimationPrefix: usize = 0xEB0; // CUtlSymbolLarge
+    pub const m_hWeaponModel: usize = 0xEB8; // CHandle<C_ViewmodelWeapon>
+    pub const m_iCameraAttachment: usize = 0xEBC; // AttachmentHandle_t
+    pub const m_vecLastCameraAngles: usize = 0xEC0; // QAngle
+    pub const m_previousElapsedDuration: usize = 0xECC; // float
+    pub const m_previousCycle: usize = 0xED0; // float
+    pub const m_nOldAnimationParity: usize = 0xED4; // int32_t
+    pub const m_hOldLayerSequence: usize = 0xED8; // HSequence
+    pub const m_oldLayer: usize = 0xEDC; // int32_t
+    pub const m_oldLayerStartTime: usize = 0xEE0; // float
+    pub const m_hControlPanel: usize = 0xEE4; // CHandle<C_BaseEntity>
+}
+
+pub mod C_Beam { // C_BaseModelEntity
+    pub const m_flFrameRate: usize = 0xCC0; // float
+    pub const m_flHDRColorScale: usize = 0xCC4; // float
+    pub const m_flFireTime: usize = 0xCC8; // GameTime_t
+    pub const m_flDamage: usize = 0xCCC; // float
+    pub const m_nNumBeamEnts: usize = 0xCD0; // uint8_t
+    pub const m_queryHandleHalo: usize = 0xCD4; // int32_t
+    pub const m_hBaseMaterial: usize = 0xCF8; // CStrongHandle<InfoForResourceTypeIMaterial2>
+    pub const m_nHaloIndex: usize = 0xD00; // CStrongHandle<InfoForResourceTypeIMaterial2>
+    pub const m_nBeamType: usize = 0xD08; // BeamType_t
+    pub const m_nBeamFlags: usize = 0xD0C; // uint32_t
+    pub const m_hAttachEntity: usize = 0xD10; // CHandle<C_BaseEntity>[10]
+    pub const m_nAttachIndex: usize = 0xD38; // AttachmentHandle_t[10]
+    pub const m_fWidth: usize = 0xD44; // float
+    pub const m_fEndWidth: usize = 0xD48; // float
+    pub const m_fFadeLength: usize = 0xD4C; // float
+    pub const m_fHaloScale: usize = 0xD50; // float
+    pub const m_fAmplitude: usize = 0xD54; // float
+    pub const m_fStartFrame: usize = 0xD58; // float
+    pub const m_fSpeed: usize = 0xD5C; // float
+    pub const m_flFrame: usize = 0xD60; // float
+    pub const m_nClipStyle: usize = 0xD64; // BeamClipStyle_t
+    pub const m_bTurnedOff: usize = 0xD68; // bool
+    pub const m_vecEndPos: usize = 0xD6C; // Vector
+    pub const m_hEndEntity: usize = 0xD78; // CHandle<C_BaseEntity>
+}
+
+pub mod C_Breakable { // C_BaseModelEntity
+}
+
+pub mod C_BreakableProp { // CBaseProp
+    pub const m_OnBreak: usize = 0xEC8; // CEntityIOOutput
+    pub const m_OnHealthChanged: usize = 0xEF0; // CEntityOutputTemplate<float>
+    pub const m_OnTakeDamage: usize = 0xF18; // CEntityIOOutput
+    pub const m_impactEnergyScale: usize = 0xF40; // float
+    pub const m_iMinHealthDmg: usize = 0xF44; // int32_t
+    pub const m_flPressureDelay: usize = 0xF48; // float
+    pub const m_hBreaker: usize = 0xF4C; // CHandle<C_BaseEntity>
+    pub const m_PerformanceMode: usize = 0xF50; // PerformanceMode_t
+    pub const m_flDmgModBullet: usize = 0xF54; // float
+    pub const m_flDmgModClub: usize = 0xF58; // float
+    pub const m_flDmgModExplosive: usize = 0xF5C; // float
+    pub const m_flDmgModFire: usize = 0xF60; // float
+    pub const m_iszPhysicsDamageTableName: usize = 0xF68; // CUtlSymbolLarge
+    pub const m_iszBasePropData: usize = 0xF70; // CUtlSymbolLarge
+    pub const m_iInteractions: usize = 0xF78; // int32_t
+    pub const m_flPreventDamageBeforeTime: usize = 0xF7C; // GameTime_t
+    pub const m_bHasBreakPiecesOrCommands: usize = 0xF80; // bool
+    pub const m_explodeDamage: usize = 0xF84; // float
+    pub const m_explodeRadius: usize = 0xF88; // float
+    pub const m_explosionDelay: usize = 0xF90; // float
+    pub const m_explosionBuildupSound: usize = 0xF98; // CUtlSymbolLarge
+    pub const m_explosionCustomEffect: usize = 0xFA0; // CUtlSymbolLarge
+    pub const m_explosionCustomSound: usize = 0xFA8; // CUtlSymbolLarge
+    pub const m_explosionModifier: usize = 0xFB0; // CUtlSymbolLarge
+    pub const m_hPhysicsAttacker: usize = 0xFB8; // CHandle<C_BasePlayerPawn>
+    pub const m_flLastPhysicsInfluenceTime: usize = 0xFBC; // GameTime_t
+    pub const m_flDefaultFadeScale: usize = 0xFC0; // float
+    pub const m_hLastAttacker: usize = 0xFC4; // CHandle<C_BaseEntity>
+    pub const m_hFlareEnt: usize = 0xFC8; // CHandle<C_BaseEntity>
+    pub const m_noGhostCollision: usize = 0xFCC; // bool
+}
+
+pub mod C_BulletHitModel { // CBaseAnimGraph
+    pub const m_matLocal: usize = 0xE80; // matrix3x4_t
+    pub const m_iBoneIndex: usize = 0xEB0; // int32_t
+    pub const m_hPlayerParent: usize = 0xEB4; // CHandle<C_BaseEntity>
+    pub const m_bIsHit: usize = 0xEB8; // bool
+    pub const m_flTimeCreated: usize = 0xEBC; // float
+    pub const m_vecStartPos: usize = 0xEC0; // Vector
+}
+
+pub mod C_C4 { // C_CSWeaponBase
+    pub const m_szScreenText: usize = 0x1940; // char[32]
+    pub const m_bombdroppedlightParticleIndex: usize = 0x1960; // ParticleIndex_t
+    pub const m_bStartedArming: usize = 0x1964; // bool
+    pub const m_fArmedTime: usize = 0x1968; // GameTime_t
+    pub const m_bBombPlacedAnimation: usize = 0x196C; // bool
+    pub const m_bIsPlantingViaUse: usize = 0x196D; // bool
+    pub const m_entitySpottedState: usize = 0x1970; // EntitySpottedState_t
+    pub const m_nSpotRules: usize = 0x1988; // int32_t
+    pub const m_bPlayedArmingBeeps: usize = 0x198C; // bool[7]
+    pub const m_bBombPlanted: usize = 0x1993; // bool
+    pub const m_bDroppedFromDeath: usize = 0x1994; // bool
+}
+
+pub mod C_CSGOViewModel { // C_PredictedViewModel
+    pub const m_bShouldIgnoreOffsetAndAccuracy: usize = 0xF10; // bool
+    pub const m_nWeaponParity: usize = 0xF14; // uint32_t
+    pub const m_nOldWeaponParity: usize = 0xF18; // uint32_t
+    pub const m_nLastKnownAssociatedWeaponEntIndex: usize = 0xF1C; // CEntityIndex
+    pub const m_bNeedToQueueHighResComposite: usize = 0xF20; // bool
+    pub const m_vLoweredWeaponOffset: usize = 0xF64; // QAngle
+}
+
+pub mod C_CSGO_CounterTerroristTeamIntroCamera { // C_CSGO_TeamPreviewCamera
+}
+
+pub mod C_CSGO_CounterTerroristWingmanIntroCamera { // C_CSGO_TeamPreviewCamera
+}
+
+pub mod C_CSGO_EndOfMatchCamera { // C_CSGO_TeamPreviewCamera
+}
+
+pub mod C_CSGO_EndOfMatchCharacterPosition { // C_CSGO_TeamPreviewCharacterPosition
+}
+
+pub mod C_CSGO_EndOfMatchLineupEnd { // C_CSGO_EndOfMatchLineupEndpoint
+}
+
+pub mod C_CSGO_EndOfMatchLineupEndpoint { // C_BaseEntity
+}
+
+pub mod C_CSGO_EndOfMatchLineupStart { // C_CSGO_EndOfMatchLineupEndpoint
+}
+
+pub mod C_CSGO_MapPreviewCameraPath { // C_BaseEntity
+    pub const m_flZFar: usize = 0x540; // float
+    pub const m_flZNear: usize = 0x544; // float
+    pub const m_bLoop: usize = 0x548; // bool
+    pub const m_bVerticalFOV: usize = 0x549; // bool
+    pub const m_bConstantSpeed: usize = 0x54A; // bool
+    pub const m_flDuration: usize = 0x54C; // float
+    pub const m_flPathLength: usize = 0x590; // float
+    pub const m_flPathDuration: usize = 0x594; // float
+}
+
+pub mod C_CSGO_MapPreviewCameraPathNode { // C_BaseEntity
+    pub const m_szParentPathUniqueID: usize = 0x540; // CUtlSymbolLarge
+    pub const m_nPathIndex: usize = 0x548; // int32_t
+    pub const m_vInTangentLocal: usize = 0x54C; // Vector
+    pub const m_vOutTangentLocal: usize = 0x558; // Vector
+    pub const m_flFOV: usize = 0x564; // float
+    pub const m_flSpeed: usize = 0x568; // float
+    pub const m_flEaseIn: usize = 0x56C; // float
+    pub const m_flEaseOut: usize = 0x570; // float
+    pub const m_vInTangentWorld: usize = 0x574; // Vector
+    pub const m_vOutTangentWorld: usize = 0x580; // Vector
+}
+
+pub mod C_CSGO_PreviewModel { // C_BaseFlex
+    pub const m_animgraph: usize = 0x1018; // CUtlString
+    pub const m_animgraphCharacterModeString: usize = 0x1020; // CUtlString
+    pub const m_defaultAnim: usize = 0x1028; // CUtlString
+    pub const m_nDefaultAnimLoopMode: usize = 0x1030; // AnimLoopMode_t
+    pub const m_flInitialModelScale: usize = 0x1034; // float
+}
+
+pub mod C_CSGO_PreviewModelAlias_csgo_item_previewmodel { // C_CSGO_PreviewModel
+}
+
+pub mod C_CSGO_PreviewPlayer { // C_CSPlayerPawn
+    pub const m_animgraph: usize = 0x22C0; // CUtlString
+    pub const m_animgraphCharacterModeString: usize = 0x22C8; // CUtlString
+    pub const m_flInitialModelScale: usize = 0x22D0; // float
+}
+
+pub mod C_CSGO_PreviewPlayerAlias_csgo_player_previewmodel { // C_CSGO_PreviewPlayer
+}
+
+pub mod C_CSGO_TeamIntroCharacterPosition { // C_CSGO_TeamPreviewCharacterPosition
+}
+
+pub mod C_CSGO_TeamIntroCounterTerroristPosition { // C_CSGO_TeamIntroCharacterPosition
+}
+
+pub mod C_CSGO_TeamIntroTerroristPosition { // C_CSGO_TeamIntroCharacterPosition
+}
+
+pub mod C_CSGO_TeamPreviewCamera { // C_CSGO_MapPreviewCameraPath
+    pub const m_nVariant: usize = 0x5A0; // int32_t
+    pub const m_bDofEnabled: usize = 0x5A4; // bool
+    pub const m_flDofNearBlurry: usize = 0x5A8; // float
+    pub const m_flDofNearCrisp: usize = 0x5AC; // float
+    pub const m_flDofFarCrisp: usize = 0x5B0; // float
+    pub const m_flDofFarBlurry: usize = 0x5B4; // float
+    pub const m_flDofTiltToGround: usize = 0x5B8; // float
+}
+
+pub mod C_CSGO_TeamPreviewCharacterPosition { // C_BaseEntity
+    pub const m_nVariant: usize = 0x540; // int32_t
+    pub const m_nRandom: usize = 0x544; // int32_t
+    pub const m_nOrdinal: usize = 0x548; // int32_t
+    pub const m_sWeaponName: usize = 0x550; // CUtlString
+    pub const m_xuid: usize = 0x558; // uint64_t
+    pub const m_agentItem: usize = 0x560; // C_EconItemView
+    pub const m_glovesItem: usize = 0x9A8; // C_EconItemView
+    pub const m_weaponItem: usize = 0xDF0; // C_EconItemView
+}
+
+pub mod C_CSGO_TeamPreviewModel { // C_CSGO_PreviewPlayer
+}
+
+pub mod C_CSGO_TeamSelectCamera { // C_CSGO_TeamPreviewCamera
+}
+
+pub mod C_CSGO_TeamSelectCharacterPosition { // C_CSGO_TeamPreviewCharacterPosition
+}
+
+pub mod C_CSGO_TeamSelectCounterTerroristPosition { // C_CSGO_TeamSelectCharacterPosition
+}
+
+pub mod C_CSGO_TeamSelectTerroristPosition { // C_CSGO_TeamSelectCharacterPosition
+}
+
+pub mod C_CSGO_TerroristTeamIntroCamera { // C_CSGO_TeamPreviewCamera
+}
+
+pub mod C_CSGO_TerroristWingmanIntroCamera { // C_CSGO_TeamPreviewCamera
+}
+
+pub mod C_CSGameRules { // C_TeamplayRules
+    pub const __m_pChainEntity: usize = 0x8; // CNetworkVarChainer
+    pub const m_bFreezePeriod: usize = 0x30; // bool
+    pub const m_bWarmupPeriod: usize = 0x31; // bool
+    pub const m_fWarmupPeriodEnd: usize = 0x34; // GameTime_t
+    pub const m_fWarmupPeriodStart: usize = 0x38; // GameTime_t
+    pub const m_nTotalPausedTicks: usize = 0x3C; // int32_t
+    pub const m_nPauseStartTick: usize = 0x40; // int32_t
+    pub const m_bServerPaused: usize = 0x44; // bool
+    pub const m_bGamePaused: usize = 0x45; // bool
+    pub const m_bTerroristTimeOutActive: usize = 0x46; // bool
+    pub const m_bCTTimeOutActive: usize = 0x47; // bool
+    pub const m_flTerroristTimeOutRemaining: usize = 0x48; // float
+    pub const m_flCTTimeOutRemaining: usize = 0x4C; // float
+    pub const m_nTerroristTimeOuts: usize = 0x50; // int32_t
+    pub const m_nCTTimeOuts: usize = 0x54; // int32_t
+    pub const m_bTechnicalTimeOut: usize = 0x58; // bool
+    pub const m_bMatchWaitingForResume: usize = 0x59; // bool
+    pub const m_iRoundTime: usize = 0x5C; // int32_t
+    pub const m_fMatchStartTime: usize = 0x60; // float
+    pub const m_fRoundStartTime: usize = 0x64; // GameTime_t
+    pub const m_flRestartRoundTime: usize = 0x68; // GameTime_t
+    pub const m_bGameRestart: usize = 0x6C; // bool
+    pub const m_flGameStartTime: usize = 0x70; // float
+    pub const m_timeUntilNextPhaseStarts: usize = 0x74; // float
+    pub const m_gamePhase: usize = 0x78; // int32_t
+    pub const m_totalRoundsPlayed: usize = 0x7C; // int32_t
+    pub const m_nRoundsPlayedThisPhase: usize = 0x80; // int32_t
+    pub const m_nOvertimePlaying: usize = 0x84; // int32_t
+    pub const m_iHostagesRemaining: usize = 0x88; // int32_t
+    pub const m_bAnyHostageReached: usize = 0x8C; // bool
+    pub const m_bMapHasBombTarget: usize = 0x8D; // bool
+    pub const m_bMapHasRescueZone: usize = 0x8E; // bool
+    pub const m_bMapHasBuyZone: usize = 0x8F; // bool
+    pub const m_bIsQueuedMatchmaking: usize = 0x90; // bool
+    pub const m_nQueuedMatchmakingMode: usize = 0x94; // int32_t
+    pub const m_bIsValveDS: usize = 0x98; // bool
+    pub const m_bLogoMap: usize = 0x99; // bool
+    pub const m_bPlayAllStepSoundsOnServer: usize = 0x9A; // bool
+    pub const m_iSpectatorSlotCount: usize = 0x9C; // int32_t
+    pub const m_MatchDevice: usize = 0xA0; // int32_t
+    pub const m_bHasMatchStarted: usize = 0xA4; // bool
+    pub const m_nNextMapInMapgroup: usize = 0xA8; // int32_t
+    pub const m_szTournamentEventName: usize = 0xAC; // char[512]
+    pub const m_szTournamentEventStage: usize = 0x2AC; // char[512]
+    pub const m_szMatchStatTxt: usize = 0x4AC; // char[512]
+    pub const m_szTournamentPredictionsTxt: usize = 0x6AC; // char[512]
+    pub const m_nTournamentPredictionsPct: usize = 0x8AC; // int32_t
+    pub const m_flCMMItemDropRevealStartTime: usize = 0x8B0; // GameTime_t
+    pub const m_flCMMItemDropRevealEndTime: usize = 0x8B4; // GameTime_t
+    pub const m_bIsDroppingItems: usize = 0x8B8; // bool
+    pub const m_bIsQuestEligible: usize = 0x8B9; // bool
+    pub const m_bIsHltvActive: usize = 0x8BA; // bool
+    pub const m_nGuardianModeWaveNumber: usize = 0x8BC; // int32_t
+    pub const m_nGuardianModeSpecialKillsRemaining: usize = 0x8C0; // int32_t
+    pub const m_nGuardianModeSpecialWeaponNeeded: usize = 0x8C4; // int32_t
+    pub const m_nGuardianGrenadesToGiveBots: usize = 0x8C8; // int32_t
+    pub const m_nNumHeaviesToSpawn: usize = 0x8CC; // int32_t
+    pub const m_numGlobalGiftsGiven: usize = 0x8D0; // uint32_t
+    pub const m_numGlobalGifters: usize = 0x8D4; // uint32_t
+    pub const m_numGlobalGiftsPeriodSeconds: usize = 0x8D8; // uint32_t
+    pub const m_arrFeaturedGiftersAccounts: usize = 0x8DC; // uint32_t[4]
+    pub const m_arrFeaturedGiftersGifts: usize = 0x8EC; // uint32_t[4]
+    pub const m_arrProhibitedItemIndices: usize = 0x8FC; // uint16_t[100]
+    pub const m_arrTournamentActiveCasterAccounts: usize = 0x9C4; // uint32_t[4]
+    pub const m_numBestOfMaps: usize = 0x9D4; // int32_t
+    pub const m_nHalloweenMaskListSeed: usize = 0x9D8; // int32_t
+    pub const m_bBombDropped: usize = 0x9DC; // bool
+    pub const m_bBombPlanted: usize = 0x9DD; // bool
+    pub const m_iRoundWinStatus: usize = 0x9E0; // int32_t
+    pub const m_eRoundWinReason: usize = 0x9E4; // int32_t
+    pub const m_bTCantBuy: usize = 0x9E8; // bool
+    pub const m_bCTCantBuy: usize = 0x9E9; // bool
+    pub const m_flGuardianBuyUntilTime: usize = 0x9EC; // GameTime_t
+    pub const m_iMatchStats_RoundResults: usize = 0x9F0; // int32_t[30]
+    pub const m_iMatchStats_PlayersAlive_CT: usize = 0xA68; // int32_t[30]
+    pub const m_iMatchStats_PlayersAlive_T: usize = 0xAE0; // int32_t[30]
+    pub const m_TeamRespawnWaveTimes: usize = 0xB58; // float[32]
+    pub const m_flNextRespawnWave: usize = 0xBD8; // GameTime_t[32]
+    pub const m_nServerQuestID: usize = 0xC58; // int32_t
+    pub const m_vMinimapMins: usize = 0xC5C; // Vector
+    pub const m_vMinimapMaxs: usize = 0xC68; // Vector
+    pub const m_MinimapVerticalSectionHeights: usize = 0xC74; // float[8]
+    pub const m_bDontIncrementCoopWave: usize = 0xC94; // bool
+    pub const m_bSpawnedTerrorHuntHeavy: usize = 0xC95; // bool
+    pub const m_nEndMatchMapGroupVoteTypes: usize = 0xC98; // int32_t[10]
+    pub const m_nEndMatchMapGroupVoteOptions: usize = 0xCC0; // int32_t[10]
+    pub const m_nEndMatchMapVoteWinner: usize = 0xCE8; // int32_t
+    pub const m_iNumConsecutiveCTLoses: usize = 0xCEC; // int32_t
+    pub const m_iNumConsecutiveTerroristLoses: usize = 0xCF0; // int32_t
+    pub const m_bMarkClientStopRecordAtRoundEnd: usize = 0xD10; // bool
+    pub const m_bMatchAbortedDueToPlayerBan: usize = 0xD68; // bool
+    pub const m_bHasTriggeredRoundStartMusic: usize = 0xD69; // bool
+    pub const m_bHasTriggeredCoopSpawnReset: usize = 0xD6A; // bool
+    pub const m_bSwitchingTeamsAtRoundReset: usize = 0xD6B; // bool
+    pub const m_pGameModeRules: usize = 0xD88; // CCSGameModeRules*
+    pub const m_RetakeRules: usize = 0xD90; // C_RetakeGameRules
+    pub const m_nMatchEndCount: usize = 0xEA8; // uint8_t
+    pub const m_nTTeamIntroVariant: usize = 0xEAC; // int32_t
+    pub const m_nCTTeamIntroVariant: usize = 0xEB0; // int32_t
+    pub const m_bTeamIntroPeriod: usize = 0xEB4; // bool
+    pub const m_flLastPerfSampleTime: usize = 0x4EC0; // double
+}
+
+pub mod C_CSGameRulesProxy { // C_GameRulesProxy
+    pub const m_pGameRules: usize = 0x540; // C_CSGameRules*
+}
+
+pub mod C_CSMinimapBoundary { // C_BaseEntity
+}
+
+pub mod C_CSObserverPawn { // C_CSPlayerPawnBase
+    pub const m_hDetectParentChange: usize = 0x1698; // CEntityHandle
+}
+
+pub mod C_CSPlayerPawn { // C_CSPlayerPawnBase
+    pub const m_pBulletServices: usize = 0x1698; // CCSPlayer_BulletServices*
+    pub const m_pHostageServices: usize = 0x16A0; // CCSPlayer_HostageServices*
+    pub const m_pBuyServices: usize = 0x16A8; // CCSPlayer_BuyServices*
+    pub const m_pGlowServices: usize = 0x16B0; // CCSPlayer_GlowServices*
+    pub const m_pActionTrackingServices: usize = 0x16B8; // CCSPlayer_ActionTrackingServices*
+    pub const m_flHealthShotBoostExpirationTime: usize = 0x16C0; // GameTime_t
+    pub const m_flLastFiredWeaponTime: usize = 0x16C4; // GameTime_t
+    pub const m_bHasFemaleVoice: usize = 0x16C8; // bool
+    pub const m_flLandseconds: usize = 0x16CC; // float
+    pub const m_flOldFallVelocity: usize = 0x16D0; // float
+    pub const m_szLastPlaceName: usize = 0x16D4; // char[18]
+    pub const m_bPrevDefuser: usize = 0x16E6; // bool
+    pub const m_bPrevHelmet: usize = 0x16E7; // bool
+    pub const m_nPrevArmorVal: usize = 0x16E8; // int32_t
+    pub const m_nPrevGrenadeAmmoCount: usize = 0x16EC; // int32_t
+    pub const m_unPreviousWeaponHash: usize = 0x16F0; // uint32_t
+    pub const m_unWeaponHash: usize = 0x16F4; // uint32_t
+    pub const m_bInBuyZone: usize = 0x16F8; // bool
+    pub const m_bPreviouslyInBuyZone: usize = 0x16F9; // bool
+    pub const m_aimPunchAngle: usize = 0x16FC; // QAngle
+    pub const m_aimPunchAngleVel: usize = 0x1708; // QAngle
+    pub const m_aimPunchTickBase: usize = 0x1714; // int32_t
+    pub const m_aimPunchTickFraction: usize = 0x1718; // float
+    pub const m_aimPunchCache: usize = 0x1720; // CUtlVector<QAngle>
+    pub const m_bInLanding: usize = 0x1740; // bool
+    pub const m_flLandingTime: usize = 0x1744; // float
+    pub const m_bInHostageRescueZone: usize = 0x1748; // bool
+    pub const m_bInBombZone: usize = 0x1749; // bool
+    pub const m_bIsBuyMenuOpen: usize = 0x174A; // bool
+    pub const m_flTimeOfLastInjury: usize = 0x174C; // GameTime_t
+    pub const m_flNextSprayDecalTime: usize = 0x1750; // GameTime_t
+    pub const m_iRetakesOffering: usize = 0x1868; // int32_t
+    pub const m_iRetakesOfferingCard: usize = 0x186C; // int32_t
+    pub const m_bRetakesHasDefuseKit: usize = 0x1870; // bool
+    pub const m_bRetakesMVPLastRound: usize = 0x1871; // bool
+    pub const m_iRetakesMVPBoostItem: usize = 0x1874; // int32_t
+    pub const m_RetakesMVPBoostExtraUtility: usize = 0x1878; // loadout_slot_t
+    pub const m_bNeedToReApplyGloves: usize = 0x1898; // bool
+    pub const m_EconGloves: usize = 0x18A0; // C_EconItemView
+    pub const m_bMustSyncRagdollState: usize = 0x1CE8; // bool
+    pub const m_nRagdollDamageBone: usize = 0x1CEC; // int32_t
+    pub const m_vRagdollDamageForce: usize = 0x1CF0; // Vector
+    pub const m_vRagdollDamagePosition: usize = 0x1CFC; // Vector
+    pub const m_szRagdollDamageWeaponName: usize = 0x1D08; // char[64]
+    pub const m_bRagdollDamageHeadshot: usize = 0x1D48; // bool
+    pub const m_bLastHeadBoneTransformIsValid: usize = 0x2288; // bool
+    pub const m_lastLandTime: usize = 0x228C; // GameTime_t
+    pub const m_bOnGroundLastTick: usize = 0x2290; // bool
+    pub const m_qDeathEyeAngles: usize = 0x22AC; // QAngle
+    pub const m_bSkipOneHeadConstraintUpdate: usize = 0x22B8; // bool
+}
+
+pub mod C_CSPlayerPawnBase { // C_BasePlayerPawn
+    pub const m_pPingServices: usize = 0x1250; // CCSPlayer_PingServices*
+    pub const m_pViewModelServices: usize = 0x1258; // CPlayer_ViewModelServices*
+    pub const m_fRenderingClipPlane: usize = 0x1260; // float[4]
+    pub const m_nLastClipPlaneSetupFrame: usize = 0x1270; // int32_t
+    pub const m_vecLastClipCameraPos: usize = 0x1274; // Vector
+    pub const m_vecLastClipCameraForward: usize = 0x1280; // Vector
+    pub const m_bClipHitStaticWorld: usize = 0x128C; // bool
+    pub const m_bCachedPlaneIsValid: usize = 0x128D; // bool
+    pub const m_pClippingWeapon: usize = 0x1290; // C_CSWeaponBase*
+    pub const m_previousPlayerState: usize = 0x1298; // CSPlayerState
+    pub const m_flLastCollisionCeiling: usize = 0x129C; // float
+    pub const m_flLastCollisionCeilingChangeTime: usize = 0x12A0; // float
+    pub const m_grenadeParameterStashTime: usize = 0x12C0; // GameTime_t
+    pub const m_bGrenadeParametersStashed: usize = 0x12C4; // bool
+    pub const m_angStashedShootAngles: usize = 0x12C8; // QAngle
+    pub const m_vecStashedGrenadeThrowPosition: usize = 0x12D4; // Vector
+    pub const m_vecStashedVelocity: usize = 0x12E0; // Vector
+    pub const m_angShootAngleHistory: usize = 0x12EC; // QAngle[2]
+    pub const m_vecThrowPositionHistory: usize = 0x1304; // Vector[2]
+    pub const m_vecVelocityHistory: usize = 0x131C; // Vector[2]
+    pub const m_thirdPersonHeading: usize = 0x1338; // QAngle
+    pub const m_flSlopeDropOffset: usize = 0x1350; // float
+    pub const m_flSlopeDropHeight: usize = 0x1360; // float
+    pub const m_vHeadConstraintOffset: usize = 0x1370; // Vector
+    pub const m_bIsScoped: usize = 0x1388; // bool
+    pub const m_bIsWalking: usize = 0x1389; // bool
+    pub const m_bResumeZoom: usize = 0x138A; // bool
+    pub const m_iPlayerState: usize = 0x138C; // CSPlayerState
+    pub const m_bIsDefusing: usize = 0x1390; // bool
+    pub const m_bIsGrabbingHostage: usize = 0x1391; // bool
+    pub const m_iBlockingUseActionInProgress: usize = 0x1394; // CSPlayerBlockingUseAction_t
+    pub const m_bIsRescuing: usize = 0x1398; // bool
+    pub const m_fImmuneToGunGameDamageTime: usize = 0x139C; // GameTime_t
+    pub const m_fImmuneToGunGameDamageTimeLast: usize = 0x13A0; // GameTime_t
+    pub const m_bGunGameImmunity: usize = 0x13A4; // bool
+    pub const m_bHasMovedSinceSpawn: usize = 0x13A5; // bool
+    pub const m_fMolotovUseTime: usize = 0x13A8; // float
+    pub const m_fMolotovDamageTime: usize = 0x13AC; // float
+    pub const m_nWhichBombZone: usize = 0x13B0; // int32_t
+    pub const m_bInNoDefuseArea: usize = 0x13B4; // bool
+    pub const m_iThrowGrenadeCounter: usize = 0x13B8; // int32_t
+    pub const m_bWaitForNoAttack: usize = 0x13BC; // bool
+    pub const m_flGuardianTooFarDistFrac: usize = 0x13C0; // float
+    pub const m_flDetectedByEnemySensorTime: usize = 0x13C4; // GameTime_t
+    pub const m_flNextGuardianTooFarWarning: usize = 0x13C8; // float
+    pub const m_bSuppressGuardianTooFarWarningAudio: usize = 0x13CC; // bool
+    pub const m_bKilledByTaser: usize = 0x13CD; // bool
+    pub const m_iMoveState: usize = 0x13D0; // int32_t
+    pub const m_bCanMoveDuringFreezePeriod: usize = 0x13D4; // bool
+    pub const m_flLowerBodyYawTarget: usize = 0x13D8; // float
+    pub const m_bStrafing: usize = 0x13DC; // bool
+    pub const m_flLastSpawnTimeIndex: usize = 0x13E0; // GameTime_t
+    pub const m_flEmitSoundTime: usize = 0x13E4; // GameTime_t
+    pub const m_iAddonBits: usize = 0x13E8; // int32_t
+    pub const m_iPrimaryAddon: usize = 0x13EC; // int32_t
+    pub const m_iSecondaryAddon: usize = 0x13F0; // int32_t
+    pub const m_iProgressBarDuration: usize = 0x13F4; // int32_t
+    pub const m_flProgressBarStartTime: usize = 0x13F8; // float
+    pub const m_iDirection: usize = 0x13FC; // int32_t
+    pub const m_iShotsFired: usize = 0x1400; // int32_t
+    pub const m_bNightVisionOn: usize = 0x1404; // bool
+    pub const m_bHasNightVision: usize = 0x1405; // bool
+    pub const m_flVelocityModifier: usize = 0x1408; // float
+    pub const m_flHitHeading: usize = 0x140C; // float
+    pub const m_nHitBodyPart: usize = 0x1410; // int32_t
+    pub const m_iStartAccount: usize = 0x1414; // int32_t
+    pub const m_vecIntroStartEyePosition: usize = 0x1418; // Vector
+    pub const m_vecIntroStartPlayerForward: usize = 0x1424; // Vector
+    pub const m_flClientDeathTime: usize = 0x1430; // GameTime_t
+    pub const m_flNightVisionAlpha: usize = 0x1434; // float
+    pub const m_bScreenTearFrameCaptured: usize = 0x1438; // bool
+    pub const m_flFlashBangTime: usize = 0x143C; // float
+    pub const m_flFlashScreenshotAlpha: usize = 0x1440; // float
+    pub const m_flFlashOverlayAlpha: usize = 0x1444; // float
+    pub const m_bFlashBuildUp: usize = 0x1448; // bool
+    pub const m_bFlashDspHasBeenCleared: usize = 0x1449; // bool
+    pub const m_bFlashScreenshotHasBeenGrabbed: usize = 0x144A; // bool
+    pub const m_flFlashMaxAlpha: usize = 0x144C; // float
+    pub const m_flFlashDuration: usize = 0x1450; // float
+    pub const m_lastStandingPos: usize = 0x1454; // Vector
+    pub const m_vecLastMuzzleFlashPos: usize = 0x1460; // Vector
+    pub const m_angLastMuzzleFlashAngle: usize = 0x146C; // QAngle
+    pub const m_hMuzzleFlashShape: usize = 0x1478; // CHandle<C_BaseEntity>
+    pub const m_iHealthBarRenderMaskIndex: usize = 0x147C; // int32_t
+    pub const m_flHealthFadeValue: usize = 0x1480; // float
+    pub const m_flHealthFadeAlpha: usize = 0x1484; // float
+    pub const m_nMyCollisionGroup: usize = 0x1488; // int32_t
+    pub const m_ignoreLadderJumpTime: usize = 0x148C; // float
+    pub const m_ladderSurpressionTimer: usize = 0x1490; // CountdownTimer
+    pub const m_lastLadderNormal: usize = 0x14A8; // Vector
+    pub const m_lastLadderPos: usize = 0x14B4; // Vector
+    pub const m_flDeathCCWeight: usize = 0x14C8; // float
+    pub const m_bOldIsScoped: usize = 0x14CC; // bool
+    pub const m_flPrevRoundEndTime: usize = 0x14D0; // float
+    pub const m_flPrevMatchEndTime: usize = 0x14D4; // float
+    pub const m_unCurrentEquipmentValue: usize = 0x14D8; // uint16_t
+    pub const m_unRoundStartEquipmentValue: usize = 0x14DA; // uint16_t
+    pub const m_unFreezetimeEndEquipmentValue: usize = 0x14DC; // uint16_t
+    pub const m_vecThirdPersonViewPositionOverride: usize = 0x14E0; // Vector
+    pub const m_nHeavyAssaultSuitCooldownRemaining: usize = 0x14EC; // int32_t
+    pub const m_ArmorValue: usize = 0x14F0; // int32_t
+    pub const m_angEyeAngles: usize = 0x14F8; // QAngle
+    pub const m_fNextThinkPushAway: usize = 0x1510; // float
+    pub const m_bShouldAutobuyDMWeapons: usize = 0x1514; // bool
+    pub const m_bShouldAutobuyNow: usize = 0x1515; // bool
+    pub const m_bHud_MiniScoreHidden: usize = 0x1516; // bool
+    pub const m_bHud_RadarHidden: usize = 0x1517; // bool
+    pub const m_nLastKillerIndex: usize = 0x1518; // CEntityIndex
+    pub const m_nLastConcurrentKilled: usize = 0x151C; // int32_t
+    pub const m_nDeathCamMusic: usize = 0x1520; // int32_t
+    pub const m_iIDEntIndex: usize = 0x1524; // CEntityIndex
+    pub const m_delayTargetIDTimer: usize = 0x1528; // CountdownTimer
+    pub const m_iTargetedWeaponEntIndex: usize = 0x1540; // CEntityIndex
+    pub const m_iOldIDEntIndex: usize = 0x1544; // CEntityIndex
+    pub const m_holdTargetIDTimer: usize = 0x1548; // CountdownTimer
+    pub const m_flCurrentMusicStartTime: usize = 0x1564; // float
+    pub const m_flMusicRoundStartTime: usize = 0x1568; // float
+    pub const m_bDeferStartMusicOnWarmup: usize = 0x156C; // bool
+    pub const m_cycleLatch: usize = 0x1570; // int32_t
+    pub const m_serverIntendedCycle: usize = 0x1574; // float
+    pub const m_vecPlayerPatchEconIndices: usize = 0x1578; // uint32_t[5]
+    pub const m_bHideTargetID: usize = 0x1594; // bool
+    pub const m_nextTaserShakeTime: usize = 0x1598; // float
+    pub const m_firstTaserShakeTime: usize = 0x159C; // float
+    pub const m_flLastSmokeOverlayAlpha: usize = 0x15A0; // float
+    pub const m_vLastSmokeOverlayColor: usize = 0x15A4; // Vector
+    pub const m_nPlayerSmokedFx: usize = 0x15B0; // ParticleIndex_t
+    pub const m_flNextMagDropTime: usize = 0x15B4; // float
+    pub const m_nLastMagDropAttachmentIndex: usize = 0x15B8; // int32_t
+    pub const m_vecBulletHitModels: usize = 0x15C0; // CUtlVector<C_BulletHitModel*>
+    pub const m_vecPickupModelSlerpers: usize = 0x15D8; // CUtlVector<C_PickUpModelSlerper*>
+    pub const m_vecLastAliveLocalVelocity: usize = 0x15F0; // Vector
+    pub const m_entitySpottedState: usize = 0x1618; // EntitySpottedState_t
+    pub const m_nSurvivalTeamNumber: usize = 0x1630; // int32_t
+    pub const m_bGuardianShouldSprayCustomXMark: usize = 0x1634; // bool
+    pub const m_bHasDeathInfo: usize = 0x1635; // bool
+    pub const m_flDeathInfoTime: usize = 0x1638; // float
+    pub const m_vecDeathInfoOrigin: usize = 0x163C; // Vector
+    pub const m_bKilledByHeadshot: usize = 0x1648; // bool
+    pub const m_hOriginalController: usize = 0x164C; // CHandle<CCSPlayerController>
+}
+
+pub mod C_CSPlayerResource { // C_BaseEntity
+    pub const m_bHostageAlive: usize = 0x540; // bool[12]
+    pub const m_isHostageFollowingSomeone: usize = 0x54C; // bool[12]
+    pub const m_iHostageEntityIDs: usize = 0x558; // CEntityIndex[12]
+    pub const m_bombsiteCenterA: usize = 0x588; // Vector
+    pub const m_bombsiteCenterB: usize = 0x594; // Vector
+    pub const m_hostageRescueX: usize = 0x5A0; // int32_t[4]
+    pub const m_hostageRescueY: usize = 0x5B0; // int32_t[4]
+    pub const m_hostageRescueZ: usize = 0x5C0; // int32_t[4]
+    pub const m_bEndMatchNextMapAllVoted: usize = 0x5D0; // bool
+    pub const m_foundGoalPositions: usize = 0x5D1; // bool
+}
+
+pub mod C_CSTeam { // C_Team
+    pub const m_szTeamMatchStat: usize = 0x5F8; // char[512]
+    pub const m_numMapVictories: usize = 0x7F8; // int32_t
+    pub const m_bSurrendered: usize = 0x7FC; // bool
+    pub const m_scoreFirstHalf: usize = 0x800; // int32_t
+    pub const m_scoreSecondHalf: usize = 0x804; // int32_t
+    pub const m_scoreOvertime: usize = 0x808; // int32_t
+    pub const m_szClanTeamname: usize = 0x80C; // char[129]
+    pub const m_iClanID: usize = 0x890; // uint32_t
+    pub const m_szTeamFlagImage: usize = 0x894; // char[8]
+    pub const m_szTeamLogoImage: usize = 0x89C; // char[8]
+}
+
+pub mod C_CSWeaponBase { // C_BasePlayerWeapon
+    pub const m_flFireSequenceStartTime: usize = 0x15D0; // float
+    pub const m_nFireSequenceStartTimeChange: usize = 0x15D4; // int32_t
+    pub const m_nFireSequenceStartTimeAck: usize = 0x15D8; // int32_t
+    pub const m_bPlayerFireEventIsPrimary: usize = 0x15DC; // bool
+    pub const m_seqIdle: usize = 0x15E0; // HSequence
+    pub const m_seqFirePrimary: usize = 0x15E4; // HSequence
+    pub const m_seqFireSecondary: usize = 0x15E8; // HSequence
+    pub const m_ClientPreviousWeaponState: usize = 0x1600; // CSWeaponState_t
+    pub const m_iState: usize = 0x1604; // CSWeaponState_t
+    pub const m_flCrosshairDistance: usize = 0x1608; // float
+    pub const m_iAmmoLastCheck: usize = 0x160C; // int32_t
+    pub const m_iAlpha: usize = 0x1610; // int32_t
+    pub const m_iScopeTextureID: usize = 0x1614; // int32_t
+    pub const m_iCrosshairTextureID: usize = 0x1618; // int32_t
+    pub const m_flGunAccuracyPosition: usize = 0x161C; // float
+    pub const m_nViewModelIndex: usize = 0x1620; // uint32_t
+    pub const m_bReloadsWithClips: usize = 0x1624; // bool
+    pub const m_flTimeWeaponIdle: usize = 0x1628; // GameTime_t
+    pub const m_bFireOnEmpty: usize = 0x162C; // bool
+    pub const m_OnPlayerPickup: usize = 0x1630; // CEntityIOOutput
+    pub const m_weaponMode: usize = 0x1658; // CSWeaponMode
+    pub const m_flTurningInaccuracyDelta: usize = 0x165C; // float
+    pub const m_vecTurningInaccuracyEyeDirLast: usize = 0x1660; // Vector
+    pub const m_flTurningInaccuracy: usize = 0x166C; // float
+    pub const m_fAccuracyPenalty: usize = 0x1670; // float
+    pub const m_flLastAccuracyUpdateTime: usize = 0x1674; // GameTime_t
+    pub const m_fAccuracySmoothedForZoom: usize = 0x1678; // float
+    pub const m_fScopeZoomEndTime: usize = 0x167C; // GameTime_t
+    pub const m_iRecoilIndex: usize = 0x1680; // int32_t
+    pub const m_flRecoilIndex: usize = 0x1684; // float
+    pub const m_bBurstMode: usize = 0x1688; // bool
+    pub const m_flPostponeFireReadyTime: usize = 0x168C; // GameTime_t
+    pub const m_bInReload: usize = 0x1690; // bool
+    pub const m_bReloadVisuallyComplete: usize = 0x1691; // bool
+    pub const m_flDroppedAtTime: usize = 0x1694; // GameTime_t
+    pub const m_bIsHauledBack: usize = 0x1698; // bool
+    pub const m_bSilencerOn: usize = 0x1699; // bool
+    pub const m_flTimeSilencerSwitchComplete: usize = 0x169C; // GameTime_t
+    pub const m_iOriginalTeamNumber: usize = 0x16A0; // int32_t
+    pub const m_flNextAttackRenderTimeOffset: usize = 0x16A4; // float
+    pub const m_bVisualsDataSet: usize = 0x1728; // bool
+    pub const m_bOldFirstPersonSpectatedState: usize = 0x1729; // bool
+    pub const m_hOurPing: usize = 0x172C; // CHandle<C_BaseEntity>
+    pub const m_nOurPingIndex: usize = 0x1730; // CEntityIndex
+    pub const m_vecOurPingPos: usize = 0x1734; // Vector
+    pub const m_bGlowForPing: usize = 0x1740; // bool
+    pub const m_bUIWeapon: usize = 0x1741; // bool
+    pub const m_hPrevOwner: usize = 0x1750; // CHandle<C_CSPlayerPawn>
+    pub const m_nDropTick: usize = 0x1754; // GameTick_t
+    pub const m_donated: usize = 0x1774; // bool
+    pub const m_fLastShotTime: usize = 0x1778; // GameTime_t
+    pub const m_bWasOwnedByCT: usize = 0x177C; // bool
+    pub const m_bWasOwnedByTerrorist: usize = 0x177D; // bool
+    pub const m_gunHeat: usize = 0x1780; // float
+    pub const m_smokeAttachments: usize = 0x1784; // uint32_t
+    pub const m_lastSmokeTime: usize = 0x1788; // GameTime_t
+    pub const m_flLastClientFireBulletTime: usize = 0x178C; // float
+    pub const m_IronSightController: usize = 0x1840; // C_IronSightController
+    pub const m_iIronSightMode: usize = 0x18F0; // int32_t
+    pub const m_flLastLOSTraceFailureTime: usize = 0x1900; // GameTime_t
+    pub const m_iNumEmptyAttacks: usize = 0x1904; // int32_t
+}
+
+pub mod C_CSWeaponBaseGun { // C_CSWeaponBase
+    pub const m_zoomLevel: usize = 0x1940; // int32_t
+    pub const m_iBurstShotsRemaining: usize = 0x1944; // int32_t
+    pub const m_iSilencerBodygroup: usize = 0x1948; // int32_t
+    pub const m_silencedModelIndex: usize = 0x1958; // int32_t
+    pub const m_inPrecache: usize = 0x195C; // bool
+    pub const m_bNeedsBoltAction: usize = 0x195D; // bool
+}
+
+pub mod C_Chicken { // C_DynamicProp
+    pub const m_hHolidayHatAddon: usize = 0x10F0; // CHandle<CBaseAnimGraph>
+    pub const m_jumpedThisFrame: usize = 0x10F4; // bool
+    pub const m_leader: usize = 0x10F8; // CHandle<C_CSPlayerPawnBase>
+    pub const m_AttributeManager: usize = 0x1100; // C_AttributeContainer
+    pub const m_OriginalOwnerXuidLow: usize = 0x15A8; // uint32_t
+    pub const m_OriginalOwnerXuidHigh: usize = 0x15AC; // uint32_t
+    pub const m_bAttributesInitialized: usize = 0x15B0; // bool
+    pub const m_hWaterWakeParticles: usize = 0x15B4; // ParticleIndex_t
+}
+
+pub mod C_ClientRagdoll { // CBaseAnimGraph
+    pub const m_bFadeOut: usize = 0xE80; // bool
+    pub const m_bImportant: usize = 0xE81; // bool
+    pub const m_flEffectTime: usize = 0xE84; // GameTime_t
+    pub const m_gibDespawnTime: usize = 0xE88; // GameTime_t
+    pub const m_iCurrentFriction: usize = 0xE8C; // int32_t
+    pub const m_iMinFriction: usize = 0xE90; // int32_t
+    pub const m_iMaxFriction: usize = 0xE94; // int32_t
+    pub const m_iFrictionAnimState: usize = 0xE98; // int32_t
+    pub const m_bReleaseRagdoll: usize = 0xE9C; // bool
+    pub const m_iEyeAttachment: usize = 0xE9D; // AttachmentHandle_t
+    pub const m_bFadingOut: usize = 0xE9E; // bool
+    pub const m_flScaleEnd: usize = 0xEA0; // float[10]
+    pub const m_flScaleTimeStart: usize = 0xEC8; // GameTime_t[10]
+    pub const m_flScaleTimeEnd: usize = 0xEF0; // GameTime_t[10]
+}
+
+pub mod C_ColorCorrection { // C_BaseEntity
+    pub const m_vecOrigin: usize = 0x540; // Vector
+    pub const m_MinFalloff: usize = 0x54C; // float
+    pub const m_MaxFalloff: usize = 0x550; // float
+    pub const m_flFadeInDuration: usize = 0x554; // float
+    pub const m_flFadeOutDuration: usize = 0x558; // float
+    pub const m_flMaxWeight: usize = 0x55C; // float
+    pub const m_flCurWeight: usize = 0x560; // float
+    pub const m_netlookupFilename: usize = 0x564; // char[512]
+    pub const m_bEnabled: usize = 0x764; // bool
+    pub const m_bMaster: usize = 0x765; // bool
+    pub const m_bClientSide: usize = 0x766; // bool
+    pub const m_bExclusive: usize = 0x767; // bool
+    pub const m_bEnabledOnClient: usize = 0x768; // bool[1]
+    pub const m_flCurWeightOnClient: usize = 0x76C; // float[1]
+    pub const m_bFadingIn: usize = 0x770; // bool[1]
+    pub const m_flFadeStartWeight: usize = 0x774; // float[1]
+    pub const m_flFadeStartTime: usize = 0x778; // float[1]
+    pub const m_flFadeDuration: usize = 0x77C; // float[1]
+}
+
+pub mod C_ColorCorrectionVolume { // C_BaseTrigger
+    pub const m_LastEnterWeight: usize = 0xCC8; // float
+    pub const m_LastEnterTime: usize = 0xCCC; // float
+    pub const m_LastExitWeight: usize = 0xCD0; // float
+    pub const m_LastExitTime: usize = 0xCD4; // float
+    pub const m_bEnabled: usize = 0xCD8; // bool
+    pub const m_MaxWeight: usize = 0xCDC; // float
+    pub const m_FadeDuration: usize = 0xCE0; // float
+    pub const m_Weight: usize = 0xCE4; // float
+    pub const m_lookupFilename: usize = 0xCE8; // char[512]
+}
+
+pub mod C_CommandContext {
+    pub const needsprocessing: usize = 0x0; // bool
+    pub const command_number: usize = 0x78; // int32_t
+}
+
+pub mod C_CsmFovOverride { // C_BaseEntity
+    pub const m_cameraName: usize = 0x540; // CUtlString
+    pub const m_flCsmFovOverrideValue: usize = 0x548; // float
+}
+
+pub mod C_DEagle { // C_CSWeaponBaseGun
+}
+
+pub mod C_DecoyGrenade { // C_BaseCSGrenade
+}
+
+pub mod C_DecoyProjectile { // C_BaseCSGrenadeProjectile
+    pub const m_flTimeParticleEffectSpawn: usize = 0x1110; // GameTime_t
+}
+
+pub mod C_DynamicLight { // C_BaseModelEntity
+    pub const m_Flags: usize = 0xCC0; // uint8_t
+    pub const m_LightStyle: usize = 0xCC1; // uint8_t
+    pub const m_Radius: usize = 0xCC4; // float
+    pub const m_Exponent: usize = 0xCC8; // int32_t
+    pub const m_InnerAngle: usize = 0xCCC; // float
+    pub const m_OuterAngle: usize = 0xCD0; // float
+    pub const m_SpotRadius: usize = 0xCD4; // float
+}
+
+pub mod C_DynamicProp { // C_BreakableProp
+    pub const m_bUseHitboxesForRenderBox: usize = 0xFD0; // bool
+    pub const m_bUseAnimGraph: usize = 0xFD1; // bool
+    pub const m_pOutputAnimBegun: usize = 0xFD8; // CEntityIOOutput
+    pub const m_pOutputAnimOver: usize = 0x1000; // CEntityIOOutput
+    pub const m_pOutputAnimLoopCycleOver: usize = 0x1028; // CEntityIOOutput
+    pub const m_OnAnimReachedStart: usize = 0x1050; // CEntityIOOutput
+    pub const m_OnAnimReachedEnd: usize = 0x1078; // CEntityIOOutput
+    pub const m_iszDefaultAnim: usize = 0x10A0; // CUtlSymbolLarge
+    pub const m_nDefaultAnimLoopMode: usize = 0x10A8; // AnimLoopMode_t
+    pub const m_bAnimateOnServer: usize = 0x10AC; // bool
+    pub const m_bRandomizeCycle: usize = 0x10AD; // bool
+    pub const m_bStartDisabled: usize = 0x10AE; // bool
+    pub const m_bScriptedMovement: usize = 0x10AF; // bool
+    pub const m_bFiredStartEndOutput: usize = 0x10B0; // bool
+    pub const m_bForceNpcExclude: usize = 0x10B1; // bool
+    pub const m_bCreateNonSolid: usize = 0x10B2; // bool
+    pub const m_bIsOverrideProp: usize = 0x10B3; // bool
+    pub const m_iInitialGlowState: usize = 0x10B4; // int32_t
+    pub const m_nGlowRange: usize = 0x10B8; // int32_t
+    pub const m_nGlowRangeMin: usize = 0x10BC; // int32_t
+    pub const m_glowColor: usize = 0x10C0; // Color
+    pub const m_nGlowTeam: usize = 0x10C4; // int32_t
+    pub const m_iCachedFrameCount: usize = 0x10C8; // int32_t
+    pub const m_vecCachedRenderMins: usize = 0x10CC; // Vector
+    pub const m_vecCachedRenderMaxs: usize = 0x10D8; // Vector
+}
+
+pub mod C_DynamicPropAlias_cable_dynamic { // C_DynamicProp
+}
+
+pub mod C_DynamicPropAlias_dynamic_prop { // C_DynamicProp
+}
+
+pub mod C_DynamicPropAlias_prop_dynamic_override { // C_DynamicProp
+}
+
+pub mod C_EconEntity { // C_BaseFlex
+    pub const m_flFlexDelayTime: usize = 0x1028; // float
+    pub const m_flFlexDelayedWeight: usize = 0x1030; // float*
+    pub const m_bAttributesInitialized: usize = 0x1038; // bool
+    pub const m_AttributeManager: usize = 0x1040; // C_AttributeContainer
+    pub const m_OriginalOwnerXuidLow: usize = 0x14E8; // uint32_t
+    pub const m_OriginalOwnerXuidHigh: usize = 0x14EC; // uint32_t
+    pub const m_nFallbackPaintKit: usize = 0x14F0; // int32_t
+    pub const m_nFallbackSeed: usize = 0x14F4; // int32_t
+    pub const m_flFallbackWear: usize = 0x14F8; // float
+    pub const m_nFallbackStatTrak: usize = 0x14FC; // int32_t
+    pub const m_bClientside: usize = 0x1500; // bool
+    pub const m_bParticleSystemsCreated: usize = 0x1501; // bool
+    pub const m_vecAttachedParticles: usize = 0x1508; // CUtlVector<int32_t>
+    pub const m_hViewmodelAttachment: usize = 0x1520; // CHandle<CBaseAnimGraph>
+    pub const m_iOldTeam: usize = 0x1524; // int32_t
+    pub const m_bAttachmentDirty: usize = 0x1528; // bool
+    pub const m_nUnloadedModelIndex: usize = 0x152C; // int32_t
+    pub const m_iNumOwnerValidationRetries: usize = 0x1530; // int32_t
+    pub const m_hOldProvidee: usize = 0x1540; // CHandle<C_BaseEntity>
+    pub const m_vecAttachedModels: usize = 0x1548; // CUtlVector<C_EconEntity::AttachedModelData_t>
+}
+
+pub mod C_EconEntity_AttachedModelData_t {
+    pub const m_iModelDisplayFlags: usize = 0x0; // int32_t
+}
+
+pub mod C_EconItemView { // IEconItemInterface
+    pub const m_bInventoryImageRgbaRequested: usize = 0x60; // bool
+    pub const m_bInventoryImageTriedCache: usize = 0x61; // bool
+    pub const m_nInventoryImageRgbaWidth: usize = 0x80; // int32_t
+    pub const m_nInventoryImageRgbaHeight: usize = 0x84; // int32_t
+    pub const m_szCurrentLoadCachedFileName: usize = 0x88; // char[260]
+    pub const m_bRestoreCustomMaterialAfterPrecache: usize = 0x1B8; // bool
+    pub const m_iItemDefinitionIndex: usize = 0x1BA; // uint16_t
+    pub const m_iEntityQuality: usize = 0x1BC; // int32_t
+    pub const m_iEntityLevel: usize = 0x1C0; // uint32_t
+    pub const m_iItemID: usize = 0x1C8; // uint64_t
+    pub const m_iItemIDHigh: usize = 0x1D0; // uint32_t
+    pub const m_iItemIDLow: usize = 0x1D4; // uint32_t
+    pub const m_iAccountID: usize = 0x1D8; // uint32_t
+    pub const m_iInventoryPosition: usize = 0x1DC; // uint32_t
+    pub const m_bInitialized: usize = 0x1E8; // bool
+    pub const m_bIsStoreItem: usize = 0x1E9; // bool
+    pub const m_bIsTradeItem: usize = 0x1EA; // bool
+    pub const m_iEntityQuantity: usize = 0x1EC; // int32_t
+    pub const m_iRarityOverride: usize = 0x1F0; // int32_t
+    pub const m_iQualityOverride: usize = 0x1F4; // int32_t
+    pub const m_unClientFlags: usize = 0x1F8; // uint8_t
+    pub const m_unOverrideStyle: usize = 0x1F9; // uint8_t
+    pub const m_AttributeList: usize = 0x210; // CAttributeList
+    pub const m_NetworkedDynamicAttributes: usize = 0x270; // CAttributeList
+    pub const m_szCustomName: usize = 0x2D0; // char[161]
+    pub const m_szCustomNameOverride: usize = 0x371; // char[161]
+    pub const m_bInitializedTags: usize = 0x440; // bool
+}
+
+pub mod C_EconWearable { // C_EconEntity
+    pub const m_nForceSkin: usize = 0x1560; // int32_t
+    pub const m_bAlwaysAllow: usize = 0x1564; // bool
+}
+
+pub mod C_EntityDissolve { // C_BaseModelEntity
+    pub const m_flStartTime: usize = 0xCC8; // GameTime_t
+    pub const m_flFadeInStart: usize = 0xCCC; // float
+    pub const m_flFadeInLength: usize = 0xCD0; // float
+    pub const m_flFadeOutModelStart: usize = 0xCD4; // float
+    pub const m_flFadeOutModelLength: usize = 0xCD8; // float
+    pub const m_flFadeOutStart: usize = 0xCDC; // float
+    pub const m_flFadeOutLength: usize = 0xCE0; // float
+    pub const m_flNextSparkTime: usize = 0xCE4; // GameTime_t
+    pub const m_nDissolveType: usize = 0xCE8; // EntityDisolveType_t
+    pub const m_vDissolverOrigin: usize = 0xCEC; // Vector
+    pub const m_nMagnitude: usize = 0xCF8; // uint32_t
+    pub const m_bCoreExplode: usize = 0xCFC; // bool
+    pub const m_bLinkedToServerEnt: usize = 0xCFD; // bool
+}
+
+pub mod C_EntityFlame { // C_BaseEntity
+    pub const m_hEntAttached: usize = 0x540; // CHandle<C_BaseEntity>
+    pub const m_hOldAttached: usize = 0x568; // CHandle<C_BaseEntity>
+    pub const m_bCheapEffect: usize = 0x56C; // bool
+}
+
+pub mod C_EnvCombinedLightProbeVolume { // C_BaseEntity
+    pub const m_Color: usize = 0x15A8; // Color
+    pub const m_flBrightness: usize = 0x15AC; // float
+    pub const m_hCubemapTexture: usize = 0x15B0; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_bCustomCubemapTexture: usize = 0x15B8; // bool
+    pub const m_hLightProbeTexture: usize = 0x15C0; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_hLightProbeDirectLightIndicesTexture: usize = 0x15C8; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_hLightProbeDirectLightScalarsTexture: usize = 0x15D0; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_hLightProbeDirectLightShadowsTexture: usize = 0x15D8; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_vBoxMins: usize = 0x15E0; // Vector
+    pub const m_vBoxMaxs: usize = 0x15EC; // Vector
+    pub const m_LightGroups: usize = 0x15F8; // CUtlSymbolLarge
+    pub const m_bMoveable: usize = 0x1600; // bool
+    pub const m_nHandshake: usize = 0x1604; // int32_t
+    pub const m_nEnvCubeMapArrayIndex: usize = 0x1608; // int32_t
+    pub const m_nPriority: usize = 0x160C; // int32_t
+    pub const m_bStartDisabled: usize = 0x1610; // bool
+    pub const m_flEdgeFadeDist: usize = 0x1614; // float
+    pub const m_vEdgeFadeDists: usize = 0x1618; // Vector
+    pub const m_nLightProbeSizeX: usize = 0x1624; // int32_t
+    pub const m_nLightProbeSizeY: usize = 0x1628; // int32_t
+    pub const m_nLightProbeSizeZ: usize = 0x162C; // int32_t
+    pub const m_nLightProbeAtlasX: usize = 0x1630; // int32_t
+    pub const m_nLightProbeAtlasY: usize = 0x1634; // int32_t
+    pub const m_nLightProbeAtlasZ: usize = 0x1638; // int32_t
+    pub const m_bEnabled: usize = 0x1651; // bool
+}
+
+pub mod C_EnvCubemap { // C_BaseEntity
+    pub const m_hCubemapTexture: usize = 0x5C8; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_bCustomCubemapTexture: usize = 0x5D0; // bool
+    pub const m_flInfluenceRadius: usize = 0x5D4; // float
+    pub const m_vBoxProjectMins: usize = 0x5D8; // Vector
+    pub const m_vBoxProjectMaxs: usize = 0x5E4; // Vector
+    pub const m_LightGroups: usize = 0x5F0; // CUtlSymbolLarge
+    pub const m_bMoveable: usize = 0x5F8; // bool
+    pub const m_nHandshake: usize = 0x5FC; // int32_t
+    pub const m_nEnvCubeMapArrayIndex: usize = 0x600; // int32_t
+    pub const m_nPriority: usize = 0x604; // int32_t
+    pub const m_flEdgeFadeDist: usize = 0x608; // float
+    pub const m_vEdgeFadeDists: usize = 0x60C; // Vector
+    pub const m_flDiffuseScale: usize = 0x618; // float
+    pub const m_bStartDisabled: usize = 0x61C; // bool
+    pub const m_bDefaultEnvMap: usize = 0x61D; // bool
+    pub const m_bDefaultSpecEnvMap: usize = 0x61E; // bool
+    pub const m_bIndoorCubeMap: usize = 0x61F; // bool
+    pub const m_bCopyDiffuseFromDefaultCubemap: usize = 0x620; // bool
+    pub const m_bEnabled: usize = 0x630; // bool
+}
+
+pub mod C_EnvCubemapBox { // C_EnvCubemap
+}
+
+pub mod C_EnvCubemapFog { // C_BaseEntity
+    pub const m_flEndDistance: usize = 0x540; // float
+    pub const m_flStartDistance: usize = 0x544; // float
+    pub const m_flFogFalloffExponent: usize = 0x548; // float
+    pub const m_bHeightFogEnabled: usize = 0x54C; // bool
+    pub const m_flFogHeightWidth: usize = 0x550; // float
+    pub const m_flFogHeightEnd: usize = 0x554; // float
+    pub const m_flFogHeightStart: usize = 0x558; // float
+    pub const m_flFogHeightExponent: usize = 0x55C; // float
+    pub const m_flLODBias: usize = 0x560; // float
+    pub const m_bActive: usize = 0x564; // bool
+    pub const m_bStartDisabled: usize = 0x565; // bool
+    pub const m_flFogMaxOpacity: usize = 0x568; // float
+    pub const m_nCubemapSourceType: usize = 0x56C; // int32_t
+    pub const m_hSkyMaterial: usize = 0x570; // CStrongHandle<InfoForResourceTypeIMaterial2>
+    pub const m_iszSkyEntity: usize = 0x578; // CUtlSymbolLarge
+    pub const m_hFogCubemapTexture: usize = 0x580; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_bHasHeightFogEnd: usize = 0x588; // bool
+    pub const m_bFirstTime: usize = 0x589; // bool
+}
+
+pub mod C_EnvDecal { // C_BaseModelEntity
+    pub const m_hDecalMaterial: usize = 0xCC0; // CStrongHandle<InfoForResourceTypeIMaterial2>
+    pub const m_flWidth: usize = 0xCC8; // float
+    pub const m_flHeight: usize = 0xCCC; // float
+    pub const m_flDepth: usize = 0xCD0; // float
+    pub const m_nRenderOrder: usize = 0xCD4; // uint32_t
+    pub const m_bProjectOnWorld: usize = 0xCD8; // bool
+    pub const m_bProjectOnCharacters: usize = 0xCD9; // bool
+    pub const m_bProjectOnWater: usize = 0xCDA; // bool
+    pub const m_flDepthSortBias: usize = 0xCDC; // float
+}
+
+pub mod C_EnvDetailController { // C_BaseEntity
+    pub const m_flFadeStartDist: usize = 0x540; // float
+    pub const m_flFadeEndDist: usize = 0x544; // float
+}
+
+pub mod C_EnvLightProbeVolume { // C_BaseEntity
+    pub const m_hLightProbeTexture: usize = 0x1520; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_hLightProbeDirectLightIndicesTexture: usize = 0x1528; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_hLightProbeDirectLightScalarsTexture: usize = 0x1530; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_hLightProbeDirectLightShadowsTexture: usize = 0x1538; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_vBoxMins: usize = 0x1540; // Vector
+    pub const m_vBoxMaxs: usize = 0x154C; // Vector
+    pub const m_LightGroups: usize = 0x1558; // CUtlSymbolLarge
+    pub const m_bMoveable: usize = 0x1560; // bool
+    pub const m_nHandshake: usize = 0x1564; // int32_t
+    pub const m_nPriority: usize = 0x1568; // int32_t
+    pub const m_bStartDisabled: usize = 0x156C; // bool
+    pub const m_nLightProbeSizeX: usize = 0x1570; // int32_t
+    pub const m_nLightProbeSizeY: usize = 0x1574; // int32_t
+    pub const m_nLightProbeSizeZ: usize = 0x1578; // int32_t
+    pub const m_nLightProbeAtlasX: usize = 0x157C; // int32_t
+    pub const m_nLightProbeAtlasY: usize = 0x1580; // int32_t
+    pub const m_nLightProbeAtlasZ: usize = 0x1584; // int32_t
+    pub const m_bEnabled: usize = 0x1591; // bool
+}
+
+pub mod C_EnvParticleGlow { // C_ParticleSystem
+    pub const m_flAlphaScale: usize = 0x1270; // float
+    pub const m_flRadiusScale: usize = 0x1274; // float
+    pub const m_flSelfIllumScale: usize = 0x1278; // float
+    pub const m_ColorTint: usize = 0x127C; // Color
+    pub const m_hTextureOverride: usize = 0x1280; // CStrongHandle<InfoForResourceTypeCTextureBase>
+}
+
+pub mod C_EnvProjectedTexture { // C_ModelPointEntity
+}
+
+pub mod C_EnvScreenOverlay { // C_PointEntity
+    pub const m_iszOverlayNames: usize = 0x540; // CUtlSymbolLarge[10]
+    pub const m_flOverlayTimes: usize = 0x590; // float[10]
+    pub const m_flStartTime: usize = 0x5B8; // GameTime_t
+    pub const m_iDesiredOverlay: usize = 0x5BC; // int32_t
+    pub const m_bIsActive: usize = 0x5C0; // bool
+    pub const m_bWasActive: usize = 0x5C1; // bool
+    pub const m_iCachedDesiredOverlay: usize = 0x5C4; // int32_t
+    pub const m_iCurrentOverlay: usize = 0x5C8; // int32_t
+    pub const m_flCurrentOverlayTime: usize = 0x5CC; // GameTime_t
+}
+
+pub mod C_EnvSky { // C_BaseModelEntity
+    pub const m_hSkyMaterial: usize = 0xCC0; // CStrongHandle<InfoForResourceTypeIMaterial2>
+    pub const m_hSkyMaterialLightingOnly: usize = 0xCC8; // CStrongHandle<InfoForResourceTypeIMaterial2>
+    pub const m_bStartDisabled: usize = 0xCD0; // bool
+    pub const m_vTintColor: usize = 0xCD1; // Color
+    pub const m_vTintColorLightingOnly: usize = 0xCD5; // Color
+    pub const m_flBrightnessScale: usize = 0xCDC; // float
+    pub const m_nFogType: usize = 0xCE0; // int32_t
+    pub const m_flFogMinStart: usize = 0xCE4; // float
+    pub const m_flFogMinEnd: usize = 0xCE8; // float
+    pub const m_flFogMaxStart: usize = 0xCEC; // float
+    pub const m_flFogMaxEnd: usize = 0xCF0; // float
+    pub const m_bEnabled: usize = 0xCF4; // bool
+}
+
+pub mod C_EnvVolumetricFogController { // C_BaseEntity
+    pub const m_flScattering: usize = 0x540; // float
+    pub const m_flAnisotropy: usize = 0x544; // float
+    pub const m_flFadeSpeed: usize = 0x548; // float
+    pub const m_flDrawDistance: usize = 0x54C; // float
+    pub const m_flFadeInStart: usize = 0x550; // float
+    pub const m_flFadeInEnd: usize = 0x554; // float
+    pub const m_flIndirectStrength: usize = 0x558; // float
+    pub const m_nIndirectTextureDimX: usize = 0x55C; // int32_t
+    pub const m_nIndirectTextureDimY: usize = 0x560; // int32_t
+    pub const m_nIndirectTextureDimZ: usize = 0x564; // int32_t
+    pub const m_vBoxMins: usize = 0x568; // Vector
+    pub const m_vBoxMaxs: usize = 0x574; // Vector
+    pub const m_bActive: usize = 0x580; // bool
+    pub const m_flStartAnisoTime: usize = 0x584; // GameTime_t
+    pub const m_flStartScatterTime: usize = 0x588; // GameTime_t
+    pub const m_flStartDrawDistanceTime: usize = 0x58C; // GameTime_t
+    pub const m_flStartAnisotropy: usize = 0x590; // float
+    pub const m_flStartScattering: usize = 0x594; // float
+    pub const m_flStartDrawDistance: usize = 0x598; // float
+    pub const m_flDefaultAnisotropy: usize = 0x59C; // float
+    pub const m_flDefaultScattering: usize = 0x5A0; // float
+    pub const m_flDefaultDrawDistance: usize = 0x5A4; // float
+    pub const m_bStartDisabled: usize = 0x5A8; // bool
+    pub const m_bEnableIndirect: usize = 0x5A9; // bool
+    pub const m_bIsMaster: usize = 0x5AA; // bool
+    pub const m_hFogIndirectTexture: usize = 0x5B0; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_nForceRefreshCount: usize = 0x5B8; // int32_t
+    pub const m_bFirstTime: usize = 0x5BC; // bool
+}
+
+pub mod C_EnvVolumetricFogVolume { // C_BaseEntity
+    pub const m_bActive: usize = 0x540; // bool
+    pub const m_vBoxMins: usize = 0x544; // Vector
+    pub const m_vBoxMaxs: usize = 0x550; // Vector
+    pub const m_bStartDisabled: usize = 0x55C; // bool
+    pub const m_flStrength: usize = 0x560; // float
+    pub const m_nFalloffShape: usize = 0x564; // int32_t
+    pub const m_flFalloffExponent: usize = 0x568; // float
+}
+
+pub mod C_EnvWind { // C_BaseEntity
+    pub const m_EnvWindShared: usize = 0x540; // C_EnvWindShared
+}
+
+pub mod C_EnvWindClientside { // C_BaseEntity
+    pub const m_EnvWindShared: usize = 0x540; // C_EnvWindShared
+}
+
+pub mod C_EnvWindShared {
+    pub const m_flStartTime: usize = 0x8; // GameTime_t
+    pub const m_iWindSeed: usize = 0xC; // uint32_t
+    pub const m_iMinWind: usize = 0x10; // uint16_t
+    pub const m_iMaxWind: usize = 0x12; // uint16_t
+    pub const m_windRadius: usize = 0x14; // int32_t
+    pub const m_iMinGust: usize = 0x18; // uint16_t
+    pub const m_iMaxGust: usize = 0x1A; // uint16_t
+    pub const m_flMinGustDelay: usize = 0x1C; // float
+    pub const m_flMaxGustDelay: usize = 0x20; // float
+    pub const m_flGustDuration: usize = 0x24; // float
+    pub const m_iGustDirChange: usize = 0x28; // uint16_t
+    pub const m_location: usize = 0x2C; // Vector
+    pub const m_iszGustSound: usize = 0x38; // int32_t
+    pub const m_iWindDir: usize = 0x3C; // int32_t
+    pub const m_flWindSpeed: usize = 0x40; // float
+    pub const m_currentWindVector: usize = 0x44; // Vector
+    pub const m_CurrentSwayVector: usize = 0x50; // Vector
+    pub const m_PrevSwayVector: usize = 0x5C; // Vector
+    pub const m_iInitialWindDir: usize = 0x68; // uint16_t
+    pub const m_flInitialWindSpeed: usize = 0x6C; // float
+    pub const m_flVariationTime: usize = 0x70; // GameTime_t
+    pub const m_flSwayTime: usize = 0x74; // GameTime_t
+    pub const m_flSimTime: usize = 0x78; // GameTime_t
+    pub const m_flSwitchTime: usize = 0x7C; // GameTime_t
+    pub const m_flAveWindSpeed: usize = 0x80; // float
+    pub const m_bGusting: usize = 0x84; // bool
+    pub const m_flWindAngleVariation: usize = 0x88; // float
+    pub const m_flWindSpeedVariation: usize = 0x8C; // float
+    pub const m_iEntIndex: usize = 0x90; // CEntityIndex
+}
+
+pub mod C_EnvWindShared_WindAveEvent_t {
+    pub const m_flStartWindSpeed: usize = 0x0; // float
+    pub const m_flAveWindSpeed: usize = 0x4; // float
+}
+
+pub mod C_EnvWindShared_WindVariationEvent_t {
+    pub const m_flWindAngleVariation: usize = 0x0; // float
+    pub const m_flWindSpeedVariation: usize = 0x4; // float
+}
+
+pub mod C_FireCrackerBlast { // C_Inferno
+}
+
+pub mod C_FireFromAboveSprite { // C_Sprite
+}
+
+pub mod C_FireSmoke { // C_BaseFire
+    pub const m_nFlameModelIndex: usize = 0x550; // int32_t
+    pub const m_nFlameFromAboveModelIndex: usize = 0x554; // int32_t
+    pub const m_flScaleRegister: usize = 0x558; // float
+    pub const m_flScaleStart: usize = 0x55C; // float
+    pub const m_flScaleEnd: usize = 0x560; // float
+    pub const m_flScaleTimeStart: usize = 0x564; // GameTime_t
+    pub const m_flScaleTimeEnd: usize = 0x568; // GameTime_t
+    pub const m_flChildFlameSpread: usize = 0x56C; // float
+    pub const m_flClipPerc: usize = 0x580; // float
+    pub const m_bClipTested: usize = 0x584; // bool
+    pub const m_bFadingOut: usize = 0x585; // bool
+    pub const m_tParticleSpawn: usize = 0x588; // TimedEvent
+    pub const m_pFireOverlay: usize = 0x590; // CFireOverlay*
+}
+
+pub mod C_FireSprite { // C_Sprite
+    pub const m_vecMoveDir: usize = 0xDF0; // Vector
+    pub const m_bFadeFromAbove: usize = 0xDFC; // bool
+}
+
+pub mod C_Fish { // CBaseAnimGraph
+    pub const m_pos: usize = 0xE80; // Vector
+    pub const m_vel: usize = 0xE8C; // Vector
+    pub const m_angles: usize = 0xE98; // QAngle
+    pub const m_localLifeState: usize = 0xEA4; // int32_t
+    pub const m_deathDepth: usize = 0xEA8; // float
+    pub const m_deathAngle: usize = 0xEAC; // float
+    pub const m_buoyancy: usize = 0xEB0; // float
+    pub const m_wiggleTimer: usize = 0xEB8; // CountdownTimer
+    pub const m_wigglePhase: usize = 0xED0; // float
+    pub const m_wiggleRate: usize = 0xED4; // float
+    pub const m_actualPos: usize = 0xED8; // Vector
+    pub const m_actualAngles: usize = 0xEE4; // QAngle
+    pub const m_poolOrigin: usize = 0xEF0; // Vector
+    pub const m_waterLevel: usize = 0xEFC; // float
+    pub const m_gotUpdate: usize = 0xF00; // bool
+    pub const m_x: usize = 0xF04; // float
+    pub const m_y: usize = 0xF08; // float
+    pub const m_z: usize = 0xF0C; // float
+    pub const m_angle: usize = 0xF10; // float
+    pub const m_errorHistory: usize = 0xF14; // float[20]
+    pub const m_errorHistoryIndex: usize = 0xF64; // int32_t
+    pub const m_errorHistoryCount: usize = 0xF68; // int32_t
+    pub const m_averageError: usize = 0xF6C; // float
+}
+
+pub mod C_Fists { // C_CSWeaponBase
+    pub const m_bPlayingUninterruptableAct: usize = 0x1940; // bool
+    pub const m_nUninterruptableActivity: usize = 0x1944; // PlayerAnimEvent_t
+}
+
+pub mod C_Flashbang { // C_BaseCSGrenade
+}
+
+pub mod C_FlashbangProjectile { // C_BaseCSGrenadeProjectile
+}
+
+pub mod C_FogController { // C_BaseEntity
+    pub const m_fog: usize = 0x540; // fogparams_t
+    pub const m_bUseAngles: usize = 0x5A8; // bool
+    pub const m_iChangedVariables: usize = 0x5AC; // int32_t
+}
+
+pub mod C_FootstepControl { // C_BaseTrigger
+    pub const m_source: usize = 0xCC8; // CUtlSymbolLarge
+    pub const m_destination: usize = 0xCD0; // CUtlSymbolLarge
+}
+
+pub mod C_FuncBrush { // C_BaseModelEntity
+}
+
+pub mod C_FuncConveyor { // C_BaseModelEntity
+    pub const m_vecMoveDirEntitySpace: usize = 0xCC8; // Vector
+    pub const m_flTargetSpeed: usize = 0xCD4; // float
+    pub const m_nTransitionStartTick: usize = 0xCD8; // GameTick_t
+    pub const m_nTransitionDurationTicks: usize = 0xCDC; // int32_t
+    pub const m_flTransitionStartSpeed: usize = 0xCE0; // float
+    pub const m_hConveyorModels: usize = 0xCE8; // C_NetworkUtlVectorBase<CHandle<C_BaseEntity>>
+    pub const m_flCurrentConveyorOffset: usize = 0xD00; // float
+    pub const m_flCurrentConveyorSpeed: usize = 0xD04; // float
+}
+
+pub mod C_FuncElectrifiedVolume { // C_FuncBrush
+    pub const m_nAmbientEffect: usize = 0xCC0; // ParticleIndex_t
+    pub const m_EffectName: usize = 0xCC8; // CUtlSymbolLarge
+    pub const m_bState: usize = 0xCD0; // bool
+}
+
+pub mod C_FuncLadder { // C_BaseModelEntity
+    pub const m_vecLadderDir: usize = 0xCC0; // Vector
+    pub const m_Dismounts: usize = 0xCD0; // CUtlVector<CHandle<C_InfoLadderDismount>>
+    pub const m_vecLocalTop: usize = 0xCE8; // Vector
+    pub const m_vecPlayerMountPositionTop: usize = 0xCF4; // Vector
+    pub const m_vecPlayerMountPositionBottom: usize = 0xD00; // Vector
+    pub const m_flAutoRideSpeed: usize = 0xD0C; // float
+    pub const m_bDisabled: usize = 0xD10; // bool
+    pub const m_bFakeLadder: usize = 0xD11; // bool
+    pub const m_bHasSlack: usize = 0xD12; // bool
+}
+
+pub mod C_FuncMonitor { // C_FuncBrush
+    pub const m_targetCamera: usize = 0xCC0; // CUtlString
+    pub const m_nResolutionEnum: usize = 0xCC8; // int32_t
+    pub const m_bRenderShadows: usize = 0xCCC; // bool
+    pub const m_bUseUniqueColorTarget: usize = 0xCCD; // bool
+    pub const m_brushModelName: usize = 0xCD0; // CUtlString
+    pub const m_hTargetCamera: usize = 0xCD8; // CHandle<C_BaseEntity>
+    pub const m_bEnabled: usize = 0xCDC; // bool
+    pub const m_bDraw3DSkybox: usize = 0xCDD; // bool
+}
+
+pub mod C_FuncMoveLinear { // C_BaseToggle
+}
+
+pub mod C_FuncRotating { // C_BaseModelEntity
+}
+
+pub mod C_FuncTrackTrain { // C_BaseModelEntity
+    pub const m_nLongAxis: usize = 0xCC0; // int32_t
+    pub const m_flRadius: usize = 0xCC4; // float
+    pub const m_flLineLength: usize = 0xCC8; // float
+}
+
+pub mod C_GameRules {
+}
+
+pub mod C_GameRulesProxy { // C_BaseEntity
+}
+
+pub mod C_GlobalLight { // C_BaseEntity
+    pub const m_WindClothForceHandle: usize = 0xA00; // uint16_t
+}
+
+pub mod C_GradientFog { // C_BaseEntity
+    pub const m_hGradientFogTexture: usize = 0x540; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_flFogStartDistance: usize = 0x548; // float
+    pub const m_flFogEndDistance: usize = 0x54C; // float
+    pub const m_bHeightFogEnabled: usize = 0x550; // bool
+    pub const m_flFogStartHeight: usize = 0x554; // float
+    pub const m_flFogEndHeight: usize = 0x558; // float
+    pub const m_flFarZ: usize = 0x55C; // float
+    pub const m_flFogMaxOpacity: usize = 0x560; // float
+    pub const m_flFogFalloffExponent: usize = 0x564; // float
+    pub const m_flFogVerticalExponent: usize = 0x568; // float
+    pub const m_fogColor: usize = 0x56C; // Color
+    pub const m_flFogStrength: usize = 0x570; // float
+    pub const m_flFadeTime: usize = 0x574; // float
+    pub const m_bStartDisabled: usize = 0x578; // bool
+    pub const m_bIsEnabled: usize = 0x579; // bool
+    pub const m_bGradientFogNeedsTextures: usize = 0x57A; // bool
+}
+
+pub mod C_HEGrenade { // C_BaseCSGrenade
+}
+
+pub mod C_HEGrenadeProjectile { // C_BaseCSGrenadeProjectile
+}
+
+pub mod C_HandleTest { // C_BaseEntity
+    pub const m_Handle: usize = 0x540; // CHandle<C_BaseEntity>
+    pub const m_bSendHandle: usize = 0x544; // bool
+}
+
+pub mod C_Hostage { // C_BaseCombatCharacter
+    pub const m_entitySpottedState: usize = 0x10A8; // EntitySpottedState_t
+    pub const m_leader: usize = 0x10C0; // CHandle<C_BaseEntity>
+    pub const m_reuseTimer: usize = 0x10C8; // CountdownTimer
+    pub const m_vel: usize = 0x10E0; // Vector
+    pub const m_isRescued: usize = 0x10EC; // bool
+    pub const m_jumpedThisFrame: usize = 0x10ED; // bool
+    pub const m_nHostageState: usize = 0x10F0; // int32_t
+    pub const m_bHandsHaveBeenCut: usize = 0x10F4; // bool
+    pub const m_hHostageGrabber: usize = 0x10F8; // CHandle<C_CSPlayerPawn>
+    pub const m_fLastGrabTime: usize = 0x10FC; // GameTime_t
+    pub const m_vecGrabbedPos: usize = 0x1100; // Vector
+    pub const m_flRescueStartTime: usize = 0x110C; // GameTime_t
+    pub const m_flGrabSuccessTime: usize = 0x1110; // GameTime_t
+    pub const m_flDropStartTime: usize = 0x1114; // GameTime_t
+    pub const m_flDeadOrRescuedTime: usize = 0x1118; // GameTime_t
+    pub const m_blinkTimer: usize = 0x1120; // CountdownTimer
+    pub const m_lookAt: usize = 0x1138; // Vector
+    pub const m_lookAroundTimer: usize = 0x1148; // CountdownTimer
+    pub const m_isInit: usize = 0x1160; // bool
+    pub const m_eyeAttachment: usize = 0x1161; // AttachmentHandle_t
+    pub const m_chestAttachment: usize = 0x1162; // AttachmentHandle_t
+    pub const m_pPredictionOwner: usize = 0x1168; // CBasePlayerController*
+    pub const m_fNewestAlphaThinkTime: usize = 0x1170; // GameTime_t
+}
+
+pub mod C_HostageCarriableProp { // CBaseAnimGraph
+}
+
+pub mod C_IncendiaryGrenade { // C_MolotovGrenade
+}
+
+pub mod C_Inferno { // C_BaseModelEntity
+    pub const m_nfxFireDamageEffect: usize = 0xD00; // ParticleIndex_t
+    pub const m_firePositions: usize = 0xD04; // Vector[64]
+    pub const m_fireParentPositions: usize = 0x1004; // Vector[64]
+    pub const m_bFireIsBurning: usize = 0x1304; // bool[64]
+    pub const m_BurnNormal: usize = 0x1344; // Vector[64]
+    pub const m_fireCount: usize = 0x1644; // int32_t
+    pub const m_nInfernoType: usize = 0x1648; // int32_t
+    pub const m_nFireLifetime: usize = 0x164C; // float
+    pub const m_bInPostEffectTime: usize = 0x1650; // bool
+    pub const m_lastFireCount: usize = 0x1654; // int32_t
+    pub const m_nFireEffectTickBegin: usize = 0x1658; // int32_t
+    pub const m_drawableCount: usize = 0x8260; // int32_t
+    pub const m_blosCheck: usize = 0x8264; // bool
+    pub const m_nlosperiod: usize = 0x8268; // int32_t
+    pub const m_maxFireHalfWidth: usize = 0x826C; // float
+    pub const m_maxFireHeight: usize = 0x8270; // float
+    pub const m_minBounds: usize = 0x8274; // Vector
+    pub const m_maxBounds: usize = 0x8280; // Vector
+    pub const m_flLastGrassBurnThink: usize = 0x828C; // float
+}
+
+pub mod C_InfoInstructorHintHostageRescueZone { // C_PointEntity
+}
+
+pub mod C_InfoLadderDismount { // C_BaseEntity
+}
+
+pub mod C_InfoVisibilityBox { // C_BaseEntity
+    pub const m_nMode: usize = 0x544; // int32_t
+    pub const m_vBoxSize: usize = 0x548; // Vector
+    pub const m_bEnabled: usize = 0x554; // bool
+}
+
+pub mod C_IronSightController {
+    pub const m_bIronSightAvailable: usize = 0x10; // bool
+    pub const m_flIronSightAmount: usize = 0x14; // float
+    pub const m_flIronSightAmountGained: usize = 0x18; // float
+    pub const m_flIronSightAmountBiased: usize = 0x1C; // float
+    pub const m_flIronSightAmount_Interpolated: usize = 0x20; // float
+    pub const m_flIronSightAmountGained_Interpolated: usize = 0x24; // float
+    pub const m_flIronSightAmountBiased_Interpolated: usize = 0x28; // float
+    pub const m_flInterpolationLastUpdated: usize = 0x2C; // float
+    pub const m_angDeltaAverage: usize = 0x30; // QAngle[8]
+    pub const m_angViewLast: usize = 0x90; // QAngle
+    pub const m_vecDotCoords: usize = 0x9C; // Vector2D
+    pub const m_flDotBlur: usize = 0xA4; // float
+    pub const m_flSpeedRatio: usize = 0xA8; // float
+}
+
+pub mod C_Item { // C_EconEntity
+    pub const m_bShouldGlow: usize = 0x1560; // bool
+    pub const m_pReticleHintTextName: usize = 0x1561; // char[256]
+}
+
+pub mod C_ItemDogtags { // C_Item
+    pub const m_OwningPlayer: usize = 0x1668; // CHandle<C_CSPlayerPawn>
+    pub const m_KillingPlayer: usize = 0x166C; // CHandle<C_CSPlayerPawn>
+}
+
+pub mod C_Item_Healthshot { // C_WeaponBaseItem
+}
+
+pub mod C_Knife { // C_CSWeaponBase
+}
+
+pub mod C_LightDirectionalEntity { // C_LightEntity
+}
+
+pub mod C_LightEntity { // C_BaseModelEntity
+    pub const m_CLightComponent: usize = 0xCC0; // CLightComponent*
+}
+
+pub mod C_LightEnvironmentEntity { // C_LightDirectionalEntity
+}
+
+pub mod C_LightGlow { // C_BaseModelEntity
+    pub const m_nHorizontalSize: usize = 0xCC0; // uint32_t
+    pub const m_nVerticalSize: usize = 0xCC4; // uint32_t
+    pub const m_nMinDist: usize = 0xCC8; // uint32_t
+    pub const m_nMaxDist: usize = 0xCCC; // uint32_t
+    pub const m_nOuterMaxDist: usize = 0xCD0; // uint32_t
+    pub const m_flGlowProxySize: usize = 0xCD4; // float
+    pub const m_flHDRColorScale: usize = 0xCD8; // float
+    pub const m_Glow: usize = 0xCE0; // C_LightGlowOverlay
+}
+
+pub mod C_LightGlowOverlay { // CGlowOverlay
+    pub const m_vecOrigin: usize = 0xD0; // Vector
+    pub const m_vecDirection: usize = 0xDC; // Vector
+    pub const m_nMinDist: usize = 0xE8; // int32_t
+    pub const m_nMaxDist: usize = 0xEC; // int32_t
+    pub const m_nOuterMaxDist: usize = 0xF0; // int32_t
+    pub const m_bOneSided: usize = 0xF4; // bool
+    pub const m_bModulateByDot: usize = 0xF5; // bool
+}
+
+pub mod C_LightOrthoEntity { // C_LightEntity
+}
+
+pub mod C_LightSpotEntity { // C_LightEntity
+}
+
+pub mod C_LocalTempEntity { // CBaseAnimGraph
+    pub const flags: usize = 0xE98; // int32_t
+    pub const die: usize = 0xE9C; // GameTime_t
+    pub const m_flFrameMax: usize = 0xEA0; // float
+    pub const x: usize = 0xEA4; // float
+    pub const y: usize = 0xEA8; // float
+    pub const fadeSpeed: usize = 0xEAC; // float
+    pub const bounceFactor: usize = 0xEB0; // float
+    pub const hitSound: usize = 0xEB4; // int32_t
+    pub const priority: usize = 0xEB8; // int32_t
+    pub const tentOffset: usize = 0xEBC; // Vector
+    pub const m_vecTempEntAngVelocity: usize = 0xEC8; // QAngle
+    pub const tempent_renderamt: usize = 0xED4; // int32_t
+    pub const m_vecNormal: usize = 0xED8; // Vector
+    pub const m_flSpriteScale: usize = 0xEE4; // float
+    pub const m_nFlickerFrame: usize = 0xEE8; // int32_t
+    pub const m_flFrameRate: usize = 0xEEC; // float
+    pub const m_flFrame: usize = 0xEF0; // float
+    pub const m_pszImpactEffect: usize = 0xEF8; // char*
+    pub const m_pszParticleEffect: usize = 0xF00; // char*
+    pub const m_bParticleCollision: usize = 0xF08; // bool
+    pub const m_iLastCollisionFrame: usize = 0xF0C; // int32_t
+    pub const m_vLastCollisionOrigin: usize = 0xF10; // Vector
+    pub const m_vecTempEntVelocity: usize = 0xF1C; // Vector
+    pub const m_vecPrevAbsOrigin: usize = 0xF28; // Vector
+    pub const m_vecTempEntAcceleration: usize = 0xF34; // Vector
+}
+
+pub mod C_MapPreviewParticleSystem { // C_ParticleSystem
+}
+
+pub mod C_MapVetoPickController { // C_BaseEntity
+    pub const m_nDraftType: usize = 0x550; // int32_t
+    pub const m_nTeamWinningCoinToss: usize = 0x554; // int32_t
+    pub const m_nTeamWithFirstChoice: usize = 0x558; // int32_t[64]
+    pub const m_nVoteMapIdsList: usize = 0x658; // int32_t[7]
+    pub const m_nAccountIDs: usize = 0x674; // int32_t[64]
+    pub const m_nMapId0: usize = 0x774; // int32_t[64]
+    pub const m_nMapId1: usize = 0x874; // int32_t[64]
+    pub const m_nMapId2: usize = 0x974; // int32_t[64]
+    pub const m_nMapId3: usize = 0xA74; // int32_t[64]
+    pub const m_nMapId4: usize = 0xB74; // int32_t[64]
+    pub const m_nMapId5: usize = 0xC74; // int32_t[64]
+    pub const m_nStartingSide0: usize = 0xD74; // int32_t[64]
+    pub const m_nCurrentPhase: usize = 0xE74; // int32_t
+    pub const m_nPhaseStartTick: usize = 0xE78; // int32_t
+    pub const m_nPhaseDurationTicks: usize = 0xE7C; // int32_t
+    pub const m_nPostDataUpdateTick: usize = 0xE80; // int32_t
+    pub const m_bDisabledHud: usize = 0xE84; // bool
+}
+
+pub mod C_Melee { // C_CSWeaponBase
+    pub const m_flThrowAt: usize = 0x1940; // GameTime_t
+}
+
+pub mod C_ModelPointEntity { // C_BaseModelEntity
+}
+
+pub mod C_MolotovGrenade { // C_BaseCSGrenade
+}
+
+pub mod C_MolotovProjectile { // C_BaseCSGrenadeProjectile
+    pub const m_bIsIncGrenade: usize = 0x10F0; // bool
+}
+
+pub mod C_Multimeter { // CBaseAnimGraph
+    pub const m_hTargetC4: usize = 0xE88; // CHandle<C_PlantedC4>
+}
+
+pub mod C_MultiplayRules { // C_GameRules
+}
+
+pub mod C_NetTestBaseCombatCharacter { // C_BaseCombatCharacter
+}
+
+pub mod C_OmniLight { // C_BarnLight
+    pub const m_flInnerAngle: usize = 0xF08; // float
+    pub const m_flOuterAngle: usize = 0xF0C; // float
+    pub const m_bShowLight: usize = 0xF10; // bool
+}
+
+pub mod C_ParticleSystem { // C_BaseModelEntity
+    pub const m_szSnapshotFileName: usize = 0xCC0; // char[512]
+    pub const m_bActive: usize = 0xEC0; // bool
+    pub const m_bFrozen: usize = 0xEC1; // bool
+    pub const m_flFreezeTransitionDuration: usize = 0xEC4; // float
+    pub const m_nStopType: usize = 0xEC8; // int32_t
+    pub const m_bAnimateDuringGameplayPause: usize = 0xECC; // bool
+    pub const m_iEffectIndex: usize = 0xED0; // CStrongHandle<InfoForResourceTypeIParticleSystemDefinition>
+    pub const m_flStartTime: usize = 0xED8; // GameTime_t
+    pub const m_flPreSimTime: usize = 0xEDC; // float
+    pub const m_vServerControlPoints: usize = 0xEE0; // Vector[4]
+    pub const m_iServerControlPointAssignments: usize = 0xF10; // uint8_t[4]
+    pub const m_hControlPointEnts: usize = 0xF14; // CHandle<C_BaseEntity>[64]
+    pub const m_bNoSave: usize = 0x1014; // bool
+    pub const m_bNoFreeze: usize = 0x1015; // bool
+    pub const m_bNoRamp: usize = 0x1016; // bool
+    pub const m_bStartActive: usize = 0x1017; // bool
+    pub const m_iszEffectName: usize = 0x1018; // CUtlSymbolLarge
+    pub const m_iszControlPointNames: usize = 0x1020; // CUtlSymbolLarge[64]
+    pub const m_nDataCP: usize = 0x1220; // int32_t
+    pub const m_vecDataCPValue: usize = 0x1224; // Vector
+    pub const m_nTintCP: usize = 0x1230; // int32_t
+    pub const m_clrTint: usize = 0x1234; // Color
+    pub const m_bOldActive: usize = 0x1258; // bool
+    pub const m_bOldFrozen: usize = 0x1259; // bool
+}
+
+pub mod C_PathParticleRope { // C_BaseEntity
+    pub const m_bStartActive: usize = 0x540; // bool
+    pub const m_flMaxSimulationTime: usize = 0x544; // float
+    pub const m_iszEffectName: usize = 0x548; // CUtlSymbolLarge
+    pub const m_PathNodes_Name: usize = 0x550; // CUtlVector<CUtlSymbolLarge>
+    pub const m_flParticleSpacing: usize = 0x568; // float
+    pub const m_flSlack: usize = 0x56C; // float
+    pub const m_flRadius: usize = 0x570; // float
+    pub const m_ColorTint: usize = 0x574; // Color
+    pub const m_nEffectState: usize = 0x578; // int32_t
+    pub const m_iEffectIndex: usize = 0x580; // CStrongHandle<InfoForResourceTypeIParticleSystemDefinition>
+    pub const m_PathNodes_Position: usize = 0x588; // C_NetworkUtlVectorBase<Vector>
+    pub const m_PathNodes_TangentIn: usize = 0x5A0; // C_NetworkUtlVectorBase<Vector>
+    pub const m_PathNodes_TangentOut: usize = 0x5B8; // C_NetworkUtlVectorBase<Vector>
+    pub const m_PathNodes_Color: usize = 0x5D0; // C_NetworkUtlVectorBase<Vector>
+    pub const m_PathNodes_PinEnabled: usize = 0x5E8; // C_NetworkUtlVectorBase<bool>
+    pub const m_PathNodes_RadiusScale: usize = 0x600; // C_NetworkUtlVectorBase<float>
+}
+
+pub mod C_PathParticleRopeAlias_path_particle_rope_clientside { // C_PathParticleRope
+}
+
+pub mod C_PhysBox { // C_Breakable
+}
+
+pub mod C_PhysMagnet { // CBaseAnimGraph
+    pub const m_aAttachedObjectsFromServer: usize = 0xE80; // CUtlVector<int32_t>
+    pub const m_aAttachedObjects: usize = 0xE98; // CUtlVector<CHandle<C_BaseEntity>>
+}
+
+pub mod C_PhysPropClientside { // C_BreakableProp
+    pub const m_flTouchDelta: usize = 0xFD0; // GameTime_t
+    pub const m_fDeathTime: usize = 0xFD4; // GameTime_t
+    pub const m_impactEnergyScale: usize = 0xFD8; // float
+    pub const m_inertiaScale: usize = 0xFDC; // float
+    pub const m_flDmgModBullet: usize = 0xFE0; // float
+    pub const m_flDmgModClub: usize = 0xFE4; // float
+    pub const m_flDmgModExplosive: usize = 0xFE8; // float
+    pub const m_flDmgModFire: usize = 0xFEC; // float
+    pub const m_iszPhysicsDamageTableName: usize = 0xFF0; // CUtlSymbolLarge
+    pub const m_iszBasePropData: usize = 0xFF8; // CUtlSymbolLarge
+    pub const m_iInteractions: usize = 0x1000; // int32_t
+    pub const m_bHasBreakPiecesOrCommands: usize = 0x1004; // bool
+    pub const m_vecDamagePosition: usize = 0x1008; // Vector
+    pub const m_vecDamageDirection: usize = 0x1014; // Vector
+    pub const m_nDamageType: usize = 0x1020; // int32_t
+}
+
+pub mod C_PhysicsProp { // C_BreakableProp
+    pub const m_bAwake: usize = 0xFD0; // bool
+}
+
+pub mod C_PhysicsPropMultiplayer { // C_PhysicsProp
+}
+
+pub mod C_PickUpModelSlerper { // CBaseAnimGraph
+    pub const m_hPlayerParent: usize = 0xE80; // CHandle<C_BaseEntity>
+    pub const m_hItem: usize = 0xE84; // CHandle<C_BaseEntity>
+    pub const m_flTimePickedUp: usize = 0xE88; // float
+    pub const m_angOriginal: usize = 0xE8C; // QAngle
+    pub const m_vecPosOriginal: usize = 0xE98; // Vector
+    pub const m_angRandom: usize = 0xEA8; // QAngle
+}
+
+pub mod C_PlantedC4 { // CBaseAnimGraph
+    pub const m_bBombTicking: usize = 0xE80; // bool
+    pub const m_nBombSite: usize = 0xE84; // int32_t
+    pub const m_nSourceSoundscapeHash: usize = 0xE88; // int32_t
+    pub const m_entitySpottedState: usize = 0xE90; // EntitySpottedState_t
+    pub const m_flNextGlow: usize = 0xEA8; // GameTime_t
+    pub const m_flNextBeep: usize = 0xEAC; // GameTime_t
+    pub const m_flC4Blow: usize = 0xEB0; // GameTime_t
+    pub const m_bCannotBeDefused: usize = 0xEB4; // bool
+    pub const m_bHasExploded: usize = 0xEB5; // bool
+    pub const m_flTimerLength: usize = 0xEB8; // float
+    pub const m_bBeingDefused: usize = 0xEBC; // bool
+    pub const m_bTriggerWarning: usize = 0xEC0; // float
+    pub const m_bExplodeWarning: usize = 0xEC4; // float
+    pub const m_bC4Activated: usize = 0xEC8; // bool
+    pub const m_bTenSecWarning: usize = 0xEC9; // bool
+    pub const m_flDefuseLength: usize = 0xECC; // float
+    pub const m_flDefuseCountDown: usize = 0xED0; // GameTime_t
+    pub const m_bBombDefused: usize = 0xED4; // bool
+    pub const m_hBombDefuser: usize = 0xED8; // CHandle<C_CSPlayerPawn>
+    pub const m_hControlPanel: usize = 0xEDC; // CHandle<C_BaseEntity>
+    pub const m_hDefuserMultimeter: usize = 0xEE0; // CHandle<C_Multimeter>
+    pub const m_flNextRadarFlashTime: usize = 0xEE4; // GameTime_t
+    pub const m_bRadarFlash: usize = 0xEE8; // bool
+    pub const m_pBombDefuser: usize = 0xEEC; // CHandle<C_CSPlayerPawn>
+    pub const m_fLastDefuseTime: usize = 0xEF0; // GameTime_t
+    pub const m_pPredictionOwner: usize = 0xEF8; // CBasePlayerController*
+}
+
+pub mod C_PlayerPing { // C_BaseEntity
+    pub const m_hPlayer: usize = 0x570; // CHandle<C_CSPlayerPawn>
+    pub const m_hPingedEntity: usize = 0x574; // CHandle<C_BaseEntity>
+    pub const m_iType: usize = 0x578; // int32_t
+    pub const m_bUrgent: usize = 0x57C; // bool
+    pub const m_szPlaceName: usize = 0x57D; // char[18]
+}
+
+pub mod C_PlayerSprayDecal { // C_ModelPointEntity
+    pub const m_nUniqueID: usize = 0xCC0; // int32_t
+    pub const m_unAccountID: usize = 0xCC4; // uint32_t
+    pub const m_unTraceID: usize = 0xCC8; // uint32_t
+    pub const m_rtGcTime: usize = 0xCCC; // uint32_t
+    pub const m_vecEndPos: usize = 0xCD0; // Vector
+    pub const m_vecStart: usize = 0xCDC; // Vector
+    pub const m_vecLeft: usize = 0xCE8; // Vector
+    pub const m_vecNormal: usize = 0xCF4; // Vector
+    pub const m_nPlayer: usize = 0xD00; // int32_t
+    pub const m_nEntity: usize = 0xD04; // int32_t
+    pub const m_nHitbox: usize = 0xD08; // int32_t
+    pub const m_flCreationTime: usize = 0xD0C; // float
+    pub const m_nTintID: usize = 0xD10; // int32_t
+    pub const m_nVersion: usize = 0xD14; // uint8_t
+    pub const m_ubSignature: usize = 0xD15; // uint8_t[128]
+    pub const m_SprayRenderHelper: usize = 0xDA0; // CPlayerSprayDecalRenderHelper
+}
+
+pub mod C_PlayerVisibility { // C_BaseEntity
+    pub const m_flVisibilityStrength: usize = 0x540; // float
+    pub const m_flFogDistanceMultiplier: usize = 0x544; // float
+    pub const m_flFogMaxDensityMultiplier: usize = 0x548; // float
+    pub const m_flFadeTime: usize = 0x54C; // float
+    pub const m_bStartDisabled: usize = 0x550; // bool
+    pub const m_bIsEnabled: usize = 0x551; // bool
+}
+
+pub mod C_PointCamera { // C_BaseEntity
+    pub const m_FOV: usize = 0x540; // float
+    pub const m_Resolution: usize = 0x544; // float
+    pub const m_bFogEnable: usize = 0x548; // bool
+    pub const m_FogColor: usize = 0x549; // Color
+    pub const m_flFogStart: usize = 0x550; // float
+    pub const m_flFogEnd: usize = 0x554; // float
+    pub const m_flFogMaxDensity: usize = 0x558; // float
+    pub const m_bActive: usize = 0x55C; // bool
+    pub const m_bUseScreenAspectRatio: usize = 0x55D; // bool
+    pub const m_flAspectRatio: usize = 0x560; // float
+    pub const m_bNoSky: usize = 0x564; // bool
+    pub const m_fBrightness: usize = 0x568; // float
+    pub const m_flZFar: usize = 0x56C; // float
+    pub const m_flZNear: usize = 0x570; // float
+    pub const m_bCanHLTVUse: usize = 0x574; // bool
+    pub const m_bDofEnabled: usize = 0x575; // bool
+    pub const m_flDofNearBlurry: usize = 0x578; // float
+    pub const m_flDofNearCrisp: usize = 0x57C; // float
+    pub const m_flDofFarCrisp: usize = 0x580; // float
+    pub const m_flDofFarBlurry: usize = 0x584; // float
+    pub const m_flDofTiltToGround: usize = 0x588; // float
+    pub const m_TargetFOV: usize = 0x58C; // float
+    pub const m_DegreesPerSecond: usize = 0x590; // float
+    pub const m_bIsOn: usize = 0x594; // bool
+    pub const m_pNext: usize = 0x598; // C_PointCamera*
+}
+
+pub mod C_PointCameraVFOV { // C_PointCamera
+    pub const m_flVerticalFOV: usize = 0x5A0; // float
+}
+
+pub mod C_PointClientUIDialog { // C_BaseClientUIEntity
+    pub const m_hActivator: usize = 0xCF0; // CHandle<C_BaseEntity>
+    pub const m_bStartEnabled: usize = 0xCF4; // bool
+}
+
+pub mod C_PointClientUIHUD { // C_BaseClientUIEntity
+    pub const m_bCheckCSSClasses: usize = 0xCF8; // bool
+    pub const m_bIgnoreInput: usize = 0xE80; // bool
+    pub const m_flWidth: usize = 0xE84; // float
+    pub const m_flHeight: usize = 0xE88; // float
+    pub const m_flDPI: usize = 0xE8C; // float
+    pub const m_flInteractDistance: usize = 0xE90; // float
+    pub const m_flDepthOffset: usize = 0xE94; // float
+    pub const m_unOwnerContext: usize = 0xE98; // uint32_t
+    pub const m_unHorizontalAlign: usize = 0xE9C; // uint32_t
+    pub const m_unVerticalAlign: usize = 0xEA0; // uint32_t
+    pub const m_unOrientation: usize = 0xEA4; // uint32_t
+    pub const m_bAllowInteractionFromAllSceneWorlds: usize = 0xEA8; // bool
+    pub const m_vecCSSClasses: usize = 0xEB0; // C_NetworkUtlVectorBase<CUtlSymbolLarge>
+}
+
+pub mod C_PointClientUIWorldPanel { // C_BaseClientUIEntity
+    pub const m_bForceRecreateNextUpdate: usize = 0xCF8; // bool
+    pub const m_bMoveViewToPlayerNextThink: usize = 0xCF9; // bool
+    pub const m_bCheckCSSClasses: usize = 0xCFA; // bool
+    pub const m_anchorDeltaTransform: usize = 0xD00; // CTransform
+    pub const m_pOffScreenIndicator: usize = 0xEA0; // CPointOffScreenIndicatorUi*
+    pub const m_bIgnoreInput: usize = 0xEC8; // bool
+    pub const m_bLit: usize = 0xEC9; // bool
+    pub const m_bFollowPlayerAcrossTeleport: usize = 0xECA; // bool
+    pub const m_flWidth: usize = 0xECC; // float
+    pub const m_flHeight: usize = 0xED0; // float
+    pub const m_flDPI: usize = 0xED4; // float
+    pub const m_flInteractDistance: usize = 0xED8; // float
+    pub const m_flDepthOffset: usize = 0xEDC; // float
+    pub const m_unOwnerContext: usize = 0xEE0; // uint32_t
+    pub const m_unHorizontalAlign: usize = 0xEE4; // uint32_t
+    pub const m_unVerticalAlign: usize = 0xEE8; // uint32_t
+    pub const m_unOrientation: usize = 0xEEC; // uint32_t
+    pub const m_bAllowInteractionFromAllSceneWorlds: usize = 0xEF0; // bool
+    pub const m_vecCSSClasses: usize = 0xEF8; // C_NetworkUtlVectorBase<CUtlSymbolLarge>
+    pub const m_bOpaque: usize = 0xF10; // bool
+    pub const m_bNoDepth: usize = 0xF11; // bool
+    pub const m_bRenderBackface: usize = 0xF12; // bool
+    pub const m_bUseOffScreenIndicator: usize = 0xF13; // bool
+    pub const m_bExcludeFromSaveGames: usize = 0xF14; // bool
+    pub const m_bGrabbable: usize = 0xF15; // bool
+    pub const m_bOnlyRenderToTexture: usize = 0xF16; // bool
+    pub const m_bDisableMipGen: usize = 0xF17; // bool
+    pub const m_nExplicitImageLayout: usize = 0xF18; // int32_t
+}
+
+pub mod C_PointClientUIWorldTextPanel { // C_PointClientUIWorldPanel
+    pub const m_messageText: usize = 0xF20; // char[512]
+}
+
+pub mod C_PointCommentaryNode { // CBaseAnimGraph
+    pub const m_bActive: usize = 0xE88; // bool
+    pub const m_bWasActive: usize = 0xE89; // bool
+    pub const m_flEndTime: usize = 0xE8C; // GameTime_t
+    pub const m_flStartTime: usize = 0xE90; // GameTime_t
+    pub const m_flStartTimeInCommentary: usize = 0xE94; // float
+    pub const m_iszCommentaryFile: usize = 0xE98; // CUtlSymbolLarge
+    pub const m_iszTitle: usize = 0xEA0; // CUtlSymbolLarge
+    pub const m_iszSpeakers: usize = 0xEA8; // CUtlSymbolLarge
+    pub const m_iNodeNumber: usize = 0xEB0; // int32_t
+    pub const m_iNodeNumberMax: usize = 0xEB4; // int32_t
+    pub const m_bListenedTo: usize = 0xEB8; // bool
+    pub const m_hViewPosition: usize = 0xEC8; // CHandle<C_BaseEntity>
+    pub const m_bRestartAfterRestore: usize = 0xECC; // bool
+}
+
+pub mod C_PointEntity { // C_BaseEntity
+}
+
+pub mod C_PointValueRemapper { // C_BaseEntity
+    pub const m_bDisabled: usize = 0x540; // bool
+    pub const m_bDisabledOld: usize = 0x541; // bool
+    pub const m_bUpdateOnClient: usize = 0x542; // bool
+    pub const m_nInputType: usize = 0x544; // ValueRemapperInputType_t
+    pub const m_hRemapLineStart: usize = 0x548; // CHandle<C_BaseEntity>
+    pub const m_hRemapLineEnd: usize = 0x54C; // CHandle<C_BaseEntity>
+    pub const m_flMaximumChangePerSecond: usize = 0x550; // float
+    pub const m_flDisengageDistance: usize = 0x554; // float
+    pub const m_flEngageDistance: usize = 0x558; // float
+    pub const m_bRequiresUseKey: usize = 0x55C; // bool
+    pub const m_nOutputType: usize = 0x560; // ValueRemapperOutputType_t
+    pub const m_hOutputEntities: usize = 0x568; // C_NetworkUtlVectorBase<CHandle<C_BaseEntity>>
+    pub const m_nHapticsType: usize = 0x580; // ValueRemapperHapticsType_t
+    pub const m_nMomentumType: usize = 0x584; // ValueRemapperMomentumType_t
+    pub const m_flMomentumModifier: usize = 0x588; // float
+    pub const m_flSnapValue: usize = 0x58C; // float
+    pub const m_flCurrentMomentum: usize = 0x590; // float
+    pub const m_nRatchetType: usize = 0x594; // ValueRemapperRatchetType_t
+    pub const m_flRatchetOffset: usize = 0x598; // float
+    pub const m_flInputOffset: usize = 0x59C; // float
+    pub const m_bEngaged: usize = 0x5A0; // bool
+    pub const m_bFirstUpdate: usize = 0x5A1; // bool
+    pub const m_flPreviousValue: usize = 0x5A4; // float
+    pub const m_flPreviousUpdateTickTime: usize = 0x5A8; // GameTime_t
+    pub const m_vecPreviousTestPoint: usize = 0x5AC; // Vector
+}
+
+pub mod C_PointWorldText { // C_ModelPointEntity
+    pub const m_bForceRecreateNextUpdate: usize = 0xCC8; // bool
+    pub const m_messageText: usize = 0xCD8; // char[512]
+    pub const m_FontName: usize = 0xED8; // char[64]
+    pub const m_bEnabled: usize = 0xF18; // bool
+    pub const m_bFullbright: usize = 0xF19; // bool
+    pub const m_flWorldUnitsPerPx: usize = 0xF1C; // float
+    pub const m_flFontSize: usize = 0xF20; // float
+    pub const m_flDepthOffset: usize = 0xF24; // float
+    pub const m_Color: usize = 0xF28; // Color
+    pub const m_nJustifyHorizontal: usize = 0xF2C; // PointWorldTextJustifyHorizontal_t
+    pub const m_nJustifyVertical: usize = 0xF30; // PointWorldTextJustifyVertical_t
+    pub const m_nReorientMode: usize = 0xF34; // PointWorldTextReorientMode_t
+}
+
+pub mod C_PostProcessingVolume { // C_BaseTrigger
+    pub const m_hPostSettings: usize = 0xCD8; // CStrongHandle<InfoForResourceTypeCPostProcessingResource>
+    pub const m_flFadeDuration: usize = 0xCE0; // float
+    pub const m_flMinLogExposure: usize = 0xCE4; // float
+    pub const m_flMaxLogExposure: usize = 0xCE8; // float
+    pub const m_flMinExposure: usize = 0xCEC; // float
+    pub const m_flMaxExposure: usize = 0xCF0; // float
+    pub const m_flExposureCompensation: usize = 0xCF4; // float
+    pub const m_flExposureFadeSpeedUp: usize = 0xCF8; // float
+    pub const m_flExposureFadeSpeedDown: usize = 0xCFC; // float
+    pub const m_flTonemapEVSmoothingRange: usize = 0xD00; // float
+    pub const m_bMaster: usize = 0xD04; // bool
+    pub const m_bExposureControl: usize = 0xD05; // bool
+    pub const m_flRate: usize = 0xD08; // float
+    pub const m_flTonemapPercentTarget: usize = 0xD0C; // float
+    pub const m_flTonemapPercentBrightPixels: usize = 0xD10; // float
+    pub const m_flTonemapMinAvgLum: usize = 0xD14; // float
+}
+
+pub mod C_Precipitation { // C_BaseTrigger
+    pub const m_flDensity: usize = 0xCC8; // float
+    pub const m_flParticleInnerDist: usize = 0xCD8; // float
+    pub const m_pParticleDef: usize = 0xCE0; // char*
+    pub const m_tParticlePrecipTraceTimer: usize = 0xD08; // TimedEvent[1]
+    pub const m_bActiveParticlePrecipEmitter: usize = 0xD10; // bool[1]
+    pub const m_bParticlePrecipInitialized: usize = 0xD11; // bool
+    pub const m_bHasSimulatedSinceLastSceneObjectUpdate: usize = 0xD12; // bool
+    pub const m_nAvailableSheetSequencesMaxIndex: usize = 0xD14; // int32_t
+}
+
+pub mod C_PrecipitationBlocker { // C_BaseModelEntity
+}
+
+pub mod C_PredictedViewModel { // C_BaseViewModel
+    pub const m_LagAnglesHistory: usize = 0xEE8; // QAngle
+    pub const m_vPredictedOffset: usize = 0xF00; // Vector
+}
+
+pub mod C_RagdollManager { // C_BaseEntity
+    pub const m_iCurrentMaxRagdollCount: usize = 0x540; // int8_t
+}
+
+pub mod C_RagdollProp { // CBaseAnimGraph
+    pub const m_ragPos: usize = 0xE88; // C_NetworkUtlVectorBase<Vector>
+    pub const m_ragAngles: usize = 0xEA0; // C_NetworkUtlVectorBase<QAngle>
+    pub const m_flBlendWeight: usize = 0xEB8; // float
+    pub const m_hRagdollSource: usize = 0xEBC; // CHandle<C_BaseEntity>
+    pub const m_iEyeAttachment: usize = 0xEC0; // AttachmentHandle_t
+    pub const m_flBlendWeightCurrent: usize = 0xEC4; // float
+    pub const m_parentPhysicsBoneIndices: usize = 0xEC8; // CUtlVector<int32_t>
+    pub const m_worldSpaceBoneComputationOrder: usize = 0xEE0; // CUtlVector<int32_t>
+}
+
+pub mod C_RagdollPropAttached { // C_RagdollProp
+    pub const m_boneIndexAttached: usize = 0xEF8; // uint32_t
+    pub const m_ragdollAttachedObjectIndex: usize = 0xEFC; // uint32_t
+    pub const m_attachmentPointBoneSpace: usize = 0xF00; // Vector
+    pub const m_attachmentPointRagdollSpace: usize = 0xF0C; // Vector
+    pub const m_vecOffset: usize = 0xF18; // Vector
+    pub const m_parentTime: usize = 0xF24; // float
+    pub const m_bHasParent: usize = 0xF28; // bool
+}
+
+pub mod C_RectLight { // C_BarnLight
+    pub const m_bShowLight: usize = 0xF08; // bool
+}
+
+pub mod C_RetakeGameRules {
+    pub const m_nMatchSeed: usize = 0xF8; // int32_t
+    pub const m_bBlockersPresent: usize = 0xFC; // bool
+    pub const m_bRoundInProgress: usize = 0xFD; // bool
+    pub const m_iFirstSecondHalfRound: usize = 0x100; // int32_t
+    pub const m_iBombSite: usize = 0x104; // int32_t
+}
+
+pub mod C_RopeKeyframe { // C_BaseModelEntity
+    pub const m_LinksTouchingSomething: usize = 0xCC8; // CBitVec<10>
+    pub const m_nLinksTouchingSomething: usize = 0xCCC; // int32_t
+    pub const m_bApplyWind: usize = 0xCD0; // bool
+    pub const m_fPrevLockedPoints: usize = 0xCD4; // int32_t
+    pub const m_iForcePointMoveCounter: usize = 0xCD8; // int32_t
+    pub const m_bPrevEndPointPos: usize = 0xCDC; // bool[2]
+    pub const m_vPrevEndPointPos: usize = 0xCE0; // Vector[2]
+    pub const m_flCurScroll: usize = 0xCF8; // float
+    pub const m_flScrollSpeed: usize = 0xCFC; // float
+    pub const m_RopeFlags: usize = 0xD00; // uint16_t
+    pub const m_iRopeMaterialModelIndex: usize = 0xD08; // CStrongHandle<InfoForResourceTypeIMaterial2>
+    pub const m_LightValues: usize = 0xF80; // Vector[10]
+    pub const m_nSegments: usize = 0xFF8; // uint8_t
+    pub const m_hStartPoint: usize = 0xFFC; // CHandle<C_BaseEntity>
+    pub const m_hEndPoint: usize = 0x1000; // CHandle<C_BaseEntity>
+    pub const m_iStartAttachment: usize = 0x1004; // AttachmentHandle_t
+    pub const m_iEndAttachment: usize = 0x1005; // AttachmentHandle_t
+    pub const m_Subdiv: usize = 0x1006; // uint8_t
+    pub const m_RopeLength: usize = 0x1008; // int16_t
+    pub const m_Slack: usize = 0x100A; // int16_t
+    pub const m_TextureScale: usize = 0x100C; // float
+    pub const m_fLockedPoints: usize = 0x1010; // uint8_t
+    pub const m_nChangeCount: usize = 0x1011; // uint8_t
+    pub const m_Width: usize = 0x1014; // float
+    pub const m_PhysicsDelegate: usize = 0x1018; // C_RopeKeyframe::CPhysicsDelegate
+    pub const m_hMaterial: usize = 0x1028; // CStrongHandle<InfoForResourceTypeIMaterial2>
+    pub const m_TextureHeight: usize = 0x1030; // int32_t
+    pub const m_vecImpulse: usize = 0x1034; // Vector
+    pub const m_vecPreviousImpulse: usize = 0x1040; // Vector
+    pub const m_flCurrentGustTimer: usize = 0x104C; // float
+    pub const m_flCurrentGustLifetime: usize = 0x1050; // float
+    pub const m_flTimeToNextGust: usize = 0x1054; // float
+    pub const m_vWindDir: usize = 0x1058; // Vector
+    pub const m_vColorMod: usize = 0x1064; // Vector
+    pub const m_vCachedEndPointAttachmentPos: usize = 0x1070; // Vector[2]
+    pub const m_vCachedEndPointAttachmentAngle: usize = 0x1088; // QAngle[2]
+    pub const m_bConstrainBetweenEndpoints: usize = 0x10A0; // bool
+    pub const m_bEndPointAttachmentPositionsDirty: usize = 0x0; // bitfield:1
+    pub const m_bEndPointAttachmentAnglesDirty: usize = 0x0; // bitfield:1
+    pub const m_bNewDataThisFrame: usize = 0x0; // bitfield:1
+    pub const m_bPhysicsInitted: usize = 0x0; // bitfield:1
+}
+
+pub mod C_RopeKeyframe_CPhysicsDelegate {
+    pub const m_pKeyframe: usize = 0x8; // C_RopeKeyframe*
+}
+
+pub mod C_SceneEntity { // C_PointEntity
+    pub const m_bIsPlayingBack: usize = 0x548; // bool
+    pub const m_bPaused: usize = 0x549; // bool
+    pub const m_bMultiplayer: usize = 0x54A; // bool
+    pub const m_bAutogenerated: usize = 0x54B; // bool
+    pub const m_flForceClientTime: usize = 0x54C; // float
+    pub const m_nSceneStringIndex: usize = 0x550; // uint16_t
+    pub const m_bClientOnly: usize = 0x552; // bool
+    pub const m_hOwner: usize = 0x554; // CHandle<C_BaseFlex>
+    pub const m_hActorList: usize = 0x558; // C_NetworkUtlVectorBase<CHandle<C_BaseFlex>>
+    pub const m_bWasPlaying: usize = 0x570; // bool
+    pub const m_QueuedEvents: usize = 0x580; // CUtlVector<C_SceneEntity::QueuedEvents_t>
+    pub const m_flCurrentTime: usize = 0x598; // float
+}
+
+pub mod C_SceneEntity_QueuedEvents_t {
+    pub const starttime: usize = 0x0; // float
+}
+
+pub mod C_SensorGrenade { // C_BaseCSGrenade
+}
+
+pub mod C_SensorGrenadeProjectile { // C_BaseCSGrenadeProjectile
+}
+
+pub mod C_ShatterGlassShardPhysics { // C_PhysicsProp
+    pub const m_ShardDesc: usize = 0xFE0; // shard_model_desc_t
+}
+
+pub mod C_SingleplayRules { // C_GameRules
+}
+
+pub mod C_SkyCamera { // C_BaseEntity
+    pub const m_skyboxData: usize = 0x540; // sky3dparams_t
+    pub const m_skyboxSlotToken: usize = 0x5D0; // CUtlStringToken
+    pub const m_bUseAngles: usize = 0x5D4; // bool
+    pub const m_pNext: usize = 0x5D8; // C_SkyCamera*
+}
+
+pub mod C_SmokeGrenade { // C_BaseCSGrenade
+}
+
+pub mod C_SmokeGrenadeProjectile { // C_BaseCSGrenadeProjectile
+    pub const m_nSmokeEffectTickBegin: usize = 0x10F8; // int32_t
+    pub const m_bDidSmokeEffect: usize = 0x10FC; // bool
+    pub const m_nRandomSeed: usize = 0x1100; // int32_t
+    pub const m_vSmokeColor: usize = 0x1104; // Vector
+    pub const m_vSmokeDetonationPos: usize = 0x1110; // Vector
+    pub const m_VoxelFrameData: usize = 0x1120; // CUtlVector<uint8_t>
+    pub const m_bSmokeVolumeDataReceived: usize = 0x1138; // bool
+    pub const m_bSmokeEffectSpawned: usize = 0x1139; // bool
+}
+
+pub mod C_SoundAreaEntityBase { // C_BaseEntity
+    pub const m_bDisabled: usize = 0x540; // bool
+    pub const m_bWasEnabled: usize = 0x548; // bool
+    pub const m_iszSoundAreaType: usize = 0x550; // CUtlSymbolLarge
+    pub const m_vPos: usize = 0x558; // Vector
+}
+
+pub mod C_SoundAreaEntityOrientedBox { // C_SoundAreaEntityBase
+    pub const m_vMin: usize = 0x568; // Vector
+    pub const m_vMax: usize = 0x574; // Vector
+}
+
+pub mod C_SoundAreaEntitySphere { // C_SoundAreaEntityBase
+    pub const m_flRadius: usize = 0x568; // float
+}
+
+pub mod C_SoundOpvarSetAABBEntity { // C_SoundOpvarSetPointEntity
+}
+
+pub mod C_SoundOpvarSetOBBEntity { // C_SoundOpvarSetAABBEntity
+}
+
+pub mod C_SoundOpvarSetOBBWindEntity { // C_SoundOpvarSetPointBase
+}
+
+pub mod C_SoundOpvarSetPathCornerEntity { // C_SoundOpvarSetPointEntity
+}
+
+pub mod C_SoundOpvarSetPointBase { // C_BaseEntity
+    pub const m_iszStackName: usize = 0x540; // CUtlSymbolLarge
+    pub const m_iszOperatorName: usize = 0x548; // CUtlSymbolLarge
+    pub const m_iszOpvarName: usize = 0x550; // CUtlSymbolLarge
+    pub const m_iOpvarIndex: usize = 0x558; // int32_t
+    pub const m_bUseAutoCompare: usize = 0x55C; // bool
+}
+
+pub mod C_SoundOpvarSetPointEntity { // C_SoundOpvarSetPointBase
+}
+
+pub mod C_SpotlightEnd { // C_BaseModelEntity
+    pub const m_flLightScale: usize = 0xCC0; // float
+    pub const m_Radius: usize = 0xCC4; // float
+}
+
+pub mod C_Sprite { // C_BaseModelEntity
+    pub const m_hSpriteMaterial: usize = 0xCD8; // CStrongHandle<InfoForResourceTypeIMaterial2>
+    pub const m_hAttachedToEntity: usize = 0xCE0; // CHandle<C_BaseEntity>
+    pub const m_nAttachment: usize = 0xCE4; // AttachmentHandle_t
+    pub const m_flSpriteFramerate: usize = 0xCE8; // float
+    pub const m_flFrame: usize = 0xCEC; // float
+    pub const m_flDieTime: usize = 0xCF0; // GameTime_t
+    pub const m_nBrightness: usize = 0xD00; // uint32_t
+    pub const m_flBrightnessDuration: usize = 0xD04; // float
+    pub const m_flSpriteScale: usize = 0xD08; // float
+    pub const m_flScaleDuration: usize = 0xD0C; // float
+    pub const m_bWorldSpaceScale: usize = 0xD10; // bool
+    pub const m_flGlowProxySize: usize = 0xD14; // float
+    pub const m_flHDRColorScale: usize = 0xD18; // float
+    pub const m_flLastTime: usize = 0xD1C; // GameTime_t
+    pub const m_flMaxFrame: usize = 0xD20; // float
+    pub const m_flStartScale: usize = 0xD24; // float
+    pub const m_flDestScale: usize = 0xD28; // float
+    pub const m_flScaleTimeStart: usize = 0xD2C; // GameTime_t
+    pub const m_nStartBrightness: usize = 0xD30; // int32_t
+    pub const m_nDestBrightness: usize = 0xD34; // int32_t
+    pub const m_flBrightnessTimeStart: usize = 0xD38; // GameTime_t
+    pub const m_hOldSpriteMaterial: usize = 0xD40; // CWeakHandle<InfoForResourceTypeIMaterial2>
+    pub const m_nSpriteWidth: usize = 0xDE8; // int32_t
+    pub const m_nSpriteHeight: usize = 0xDEC; // int32_t
+}
+
+pub mod C_SpriteOriented { // C_Sprite
+}
+
+pub mod C_Sun { // C_BaseModelEntity
+    pub const m_fxSSSunFlareEffectIndex: usize = 0xCC0; // ParticleIndex_t
+    pub const m_fxSunFlareEffectIndex: usize = 0xCC4; // ParticleIndex_t
+    pub const m_fdistNormalize: usize = 0xCC8; // float
+    pub const m_vSunPos: usize = 0xCCC; // Vector
+    pub const m_vDirection: usize = 0xCD8; // Vector
+    pub const m_iszEffectName: usize = 0xCE8; // CUtlSymbolLarge
+    pub const m_iszSSEffectName: usize = 0xCF0; // CUtlSymbolLarge
+    pub const m_clrOverlay: usize = 0xCF8; // Color
+    pub const m_bOn: usize = 0xCFC; // bool
+    pub const m_bmaxColor: usize = 0xCFD; // bool
+    pub const m_flSize: usize = 0xD00; // float
+    pub const m_flHazeScale: usize = 0xD04; // float
+    pub const m_flRotation: usize = 0xD08; // float
+    pub const m_flHDRColorScale: usize = 0xD0C; // float
+    pub const m_flAlphaHaze: usize = 0xD10; // float
+    pub const m_flAlphaScale: usize = 0xD14; // float
+    pub const m_flAlphaHdr: usize = 0xD18; // float
+    pub const m_flFarZScale: usize = 0xD1C; // float
+}
+
+pub mod C_SunGlowOverlay { // CGlowOverlay
+    pub const m_bModulateByDot: usize = 0xD0; // bool
+}
+
+pub mod C_Team { // C_BaseEntity
+    pub const m_aPlayerControllers: usize = 0x540; // C_NetworkUtlVectorBase<CHandle<CBasePlayerController>>
+    pub const m_aPlayers: usize = 0x558; // C_NetworkUtlVectorBase<CHandle<C_BasePlayerPawn>>
+    pub const m_iScore: usize = 0x570; // int32_t
+    pub const m_szTeamname: usize = 0x574; // char[129]
+}
+
+pub mod C_TeamRoundTimer { // C_BaseEntity
+    pub const m_bTimerPaused: usize = 0x540; // bool
+    pub const m_flTimeRemaining: usize = 0x544; // float
+    pub const m_flTimerEndTime: usize = 0x548; // GameTime_t
+    pub const m_bIsDisabled: usize = 0x54C; // bool
+    pub const m_bShowInHUD: usize = 0x54D; // bool
+    pub const m_nTimerLength: usize = 0x550; // int32_t
+    pub const m_nTimerInitialLength: usize = 0x554; // int32_t
+    pub const m_nTimerMaxLength: usize = 0x558; // int32_t
+    pub const m_bAutoCountdown: usize = 0x55C; // bool
+    pub const m_nSetupTimeLength: usize = 0x560; // int32_t
+    pub const m_nState: usize = 0x564; // int32_t
+    pub const m_bStartPaused: usize = 0x568; // bool
+    pub const m_bInCaptureWatchState: usize = 0x569; // bool
+    pub const m_flTotalTime: usize = 0x56C; // float
+    pub const m_bStopWatchTimer: usize = 0x570; // bool
+    pub const m_bFireFinished: usize = 0x571; // bool
+    pub const m_bFire5MinRemain: usize = 0x572; // bool
+    pub const m_bFire4MinRemain: usize = 0x573; // bool
+    pub const m_bFire3MinRemain: usize = 0x574; // bool
+    pub const m_bFire2MinRemain: usize = 0x575; // bool
+    pub const m_bFire1MinRemain: usize = 0x576; // bool
+    pub const m_bFire30SecRemain: usize = 0x577; // bool
+    pub const m_bFire10SecRemain: usize = 0x578; // bool
+    pub const m_bFire5SecRemain: usize = 0x579; // bool
+    pub const m_bFire4SecRemain: usize = 0x57A; // bool
+    pub const m_bFire3SecRemain: usize = 0x57B; // bool
+    pub const m_bFire2SecRemain: usize = 0x57C; // bool
+    pub const m_bFire1SecRemain: usize = 0x57D; // bool
+    pub const m_nOldTimerLength: usize = 0x580; // int32_t
+    pub const m_nOldTimerState: usize = 0x584; // int32_t
+}
+
+pub mod C_TeamplayRules { // C_MultiplayRules
+}
+
+pub mod C_TextureBasedAnimatable { // C_BaseModelEntity
+    pub const m_bLoop: usize = 0xCC0; // bool
+    pub const m_flFPS: usize = 0xCC4; // float
+    pub const m_hPositionKeys: usize = 0xCC8; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_hRotationKeys: usize = 0xCD0; // CStrongHandle<InfoForResourceTypeCTextureBase>
+    pub const m_vAnimationBoundsMin: usize = 0xCD8; // Vector
+    pub const m_vAnimationBoundsMax: usize = 0xCE4; // Vector
+    pub const m_flStartTime: usize = 0xCF0; // float
+    pub const m_flStartFrame: usize = 0xCF4; // float
+}
+
+pub mod C_TintController { // C_BaseEntity
+}
+
+pub mod C_TonemapController2 { // C_BaseEntity
+    pub const m_flAutoExposureMin: usize = 0x540; // float
+    pub const m_flAutoExposureMax: usize = 0x544; // float
+    pub const m_flTonemapPercentTarget: usize = 0x548; // float
+    pub const m_flTonemapPercentBrightPixels: usize = 0x54C; // float
+    pub const m_flTonemapMinAvgLum: usize = 0x550; // float
+    pub const m_flExposureAdaptationSpeedUp: usize = 0x554; // float
+    pub const m_flExposureAdaptationSpeedDown: usize = 0x558; // float
+    pub const m_flTonemapEVSmoothingRange: usize = 0x55C; // float
+}
+
+pub mod C_TonemapController2Alias_env_tonemap_controller2 { // C_TonemapController2
+}
+
+pub mod C_TriggerBuoyancy { // C_BaseTrigger
+    pub const m_BuoyancyHelper: usize = 0xCC8; // CBuoyancyHelper
+    pub const m_flFluidDensity: usize = 0xCE8; // float
+}
+
+pub mod C_TriggerLerpObject { // C_BaseTrigger
+}
+
+pub mod C_TriggerMultiple { // C_BaseTrigger
+}
+
+pub mod C_TriggerVolume { // C_BaseModelEntity
+}
+
+pub mod C_ViewmodelAttachmentModel { // CBaseAnimGraph
+}
+
+pub mod C_ViewmodelWeapon { // CBaseAnimGraph
+    pub const m_worldModel: usize = 0xE80; // char*
+}
+
+pub mod C_VoteController { // C_BaseEntity
+    pub const m_iActiveIssueIndex: usize = 0x550; // int32_t
+    pub const m_iOnlyTeamToVote: usize = 0x554; // int32_t
+    pub const m_nVoteOptionCount: usize = 0x558; // int32_t[5]
+    pub const m_nPotentialVotes: usize = 0x56C; // int32_t
+    pub const m_bVotesDirty: usize = 0x570; // bool
+    pub const m_bTypeDirty: usize = 0x571; // bool
+    pub const m_bIsYesNoVote: usize = 0x572; // bool
+}
+
+pub mod C_WaterBullet { // CBaseAnimGraph
+}
+
+pub mod C_WeaponAWP { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponAug { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponBaseItem { // C_CSWeaponBase
+    pub const m_SequenceCompleteTimer: usize = 0x1940; // CountdownTimer
+    pub const m_bRedraw: usize = 0x1958; // bool
+}
+
+pub mod C_WeaponBizon { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponElite { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponFamas { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponFiveSeven { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponG3SG1 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponGalilAR { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponGlock { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponHKP2000 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponM249 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponM4A1 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponMAC10 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponMP7 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponMP9 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponMag7 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponNOVA { // C_CSWeaponBase
+}
+
+pub mod C_WeaponNegev { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponP250 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponP90 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponSCAR20 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponSG556 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponSSG08 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponSawedoff { // C_CSWeaponBase
+}
+
+pub mod C_WeaponShield { // C_CSWeaponBaseGun
+    pub const m_flDisplayHealth: usize = 0x1960; // float
+}
+
+pub mod C_WeaponTaser { // C_CSWeaponBaseGun
+    pub const m_fFireTime: usize = 0x1960; // GameTime_t
+}
+
+pub mod C_WeaponTec9 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponUMP45 { // C_CSWeaponBaseGun
+}
+
+pub mod C_WeaponXM1014 { // C_CSWeaponBase
+}
+
+pub mod C_World { // C_BaseModelEntity
+}
+
+pub mod C_WorldModelGloves { // CBaseAnimGraph
+}
+
+pub mod C_WorldModelNametag { // CBaseAnimGraph
+}
+
+pub mod C_WorldModelStattrak { // CBaseAnimGraph
+}
+
+pub mod C_fogplayerparams_t {
+    pub const m_hCtrl: usize = 0x8; // CHandle<C_FogController>
+    pub const m_flTransitionTime: usize = 0xC; // float
+    pub const m_OldColor: usize = 0x10; // Color
+    pub const m_flOldStart: usize = 0x14; // float
+    pub const m_flOldEnd: usize = 0x18; // float
+    pub const m_flOldMaxDensity: usize = 0x1C; // float
+    pub const m_flOldHDRColorScale: usize = 0x20; // float
+    pub const m_flOldFarZ: usize = 0x24; // float
+    pub const m_NewColor: usize = 0x28; // Color
+    pub const m_flNewStart: usize = 0x2C; // float
+    pub const m_flNewEnd: usize = 0x30; // float
+    pub const m_flNewMaxDensity: usize = 0x34; // float
+    pub const m_flNewHDRColorScale: usize = 0x38; // float
+    pub const m_flNewFarZ: usize = 0x3C; // float
+}
+
+pub mod CompMatMutatorCondition_t {
+    pub const m_nMutatorCondition: usize = 0x0; // CompMatPropertyMutatorConditionType_t
+    pub const m_strMutatorConditionContainerName: usize = 0x8; // CUtlString
+    pub const m_strMutatorConditionContainerVarName: usize = 0x10; // CUtlString
+    pub const m_strMutatorConditionContainerVarValue: usize = 0x18; // CUtlString
+    pub const m_bPassWhenTrue: usize = 0x20; // bool
+}
+
+pub mod CompMatPropertyMutator_t {
+    pub const m_bEnabled: usize = 0x0; // bool
+    pub const m_nMutatorCommandType: usize = 0x4; // CompMatPropertyMutatorType_t
+    pub const m_strInitWith_Container: usize = 0x8; // CUtlString
+    pub const m_strCopyProperty_InputContainerSrc: usize = 0x10; // CUtlString
+    pub const m_strCopyProperty_InputContainerProperty: usize = 0x18; // CUtlString
+    pub const m_strCopyProperty_TargetProperty: usize = 0x20; // CUtlString
+    pub const m_strRandomRollInputVars_SeedInputVar: usize = 0x28; // CUtlString
+    pub const m_vecRandomRollInputVars_InputVarsToRoll: usize = 0x30; // CUtlVector<CUtlString>
+    pub const m_strCopyMatchingKeys_InputContainerSrc: usize = 0x48; // CUtlString
+    pub const m_strCopyKeysWithSuffix_InputContainerSrc: usize = 0x50; // CUtlString
+    pub const m_strCopyKeysWithSuffix_FindSuffix: usize = 0x58; // CUtlString
+    pub const m_strCopyKeysWithSuffix_ReplaceSuffix: usize = 0x60; // CUtlString
+    pub const m_nSetValue_Value: usize = 0x68; // CompositeMaterialInputLooseVariable_t
+    pub const m_strGenerateTexture_TargetParam: usize = 0x2D8; // CUtlString
+    pub const m_strGenerateTexture_InitialContainer: usize = 0x2E0; // CUtlString
+    pub const m_nResolution: usize = 0x2E8; // int32_t
+    pub const m_bIsScratchTarget: usize = 0x2EC; // bool
+    pub const m_bSplatDebugInfo: usize = 0x2ED; // bool
+    pub const m_bCaptureInRenderDoc: usize = 0x2EE; // bool
+    pub const m_vecTexGenInstructions: usize = 0x2F0; // CUtlVector<CompMatPropertyMutator_t>
+    pub const m_vecConditionalMutators: usize = 0x308; // CUtlVector<CompMatPropertyMutator_t>
+    pub const m_strPopInputQueue_Container: usize = 0x320; // CUtlString
+    pub const m_strDrawText_InputContainerSrc: usize = 0x328; // CUtlString
+    pub const m_strDrawText_InputContainerProperty: usize = 0x330; // CUtlString
+    pub const m_vecDrawText_Position: usize = 0x338; // Vector2D
+    pub const m_colDrawText_Color: usize = 0x340; // Color
+    pub const m_strDrawText_Font: usize = 0x348; // CUtlString
+    pub const m_vecConditions: usize = 0x350; // CUtlVector<CompMatMutatorCondition_t>
+}
+
+pub mod CompositeMaterialAssemblyProcedure_t {
+    pub const m_vecCompMatIncludes: usize = 0x0; // CUtlVector<CResourceName>
+    pub const m_vecMatchFilters: usize = 0x18; // CUtlVector<CompositeMaterialMatchFilter_t>
+    pub const m_vecCompositeInputContainers: usize = 0x30; // CUtlVector<CompositeMaterialInputContainer_t>
+    pub const m_vecPropertyMutators: usize = 0x48; // CUtlVector<CompMatPropertyMutator_t>
+}
+
+pub mod CompositeMaterialEditorPoint_t {
+    pub const m_ModelName: usize = 0x0; // CResourceName
+    pub const m_nSequenceIndex: usize = 0xE0; // int32_t
+    pub const m_flCycle: usize = 0xE4; // float
+    pub const m_KVModelStateChoices: usize = 0xE8; // KeyValues3
+    pub const m_bEnableChildModel: usize = 0xF8; // bool
+    pub const m_ChildModelName: usize = 0x100; // CResourceName
+    pub const m_vecCompositeMaterialAssemblyProcedures: usize = 0x1E0; // CUtlVector<CompositeMaterialAssemblyProcedure_t>
+    pub const m_vecCompositeMaterials: usize = 0x1F8; // CUtlVector<CompositeMaterial_t>
+}
+
+pub mod CompositeMaterialInputContainer_t {
+    pub const m_bEnabled: usize = 0x0; // bool
+    pub const m_nCompositeMaterialInputContainerSourceType: usize = 0x4; // CompositeMaterialInputContainerSourceType_t
+    pub const m_strSpecificContainerMaterial: usize = 0x8; // CResourceName
+    pub const m_strAttrName: usize = 0xE8; // CUtlString
+    pub const m_strAlias: usize = 0xF0; // CUtlString
+    pub const m_vecLooseVariables: usize = 0xF8; // CUtlVector<CompositeMaterialInputLooseVariable_t>
+    pub const m_strAttrNameForVar: usize = 0x110; // CUtlString
+    pub const m_bExposeExternally: usize = 0x118; // bool
+}
+
+pub mod CompositeMaterialInputLooseVariable_t {
+    pub const m_strName: usize = 0x0; // CUtlString
+    pub const m_bExposeExternally: usize = 0x8; // bool
+    pub const m_strExposedFriendlyName: usize = 0x10; // CUtlString
+    pub const m_strExposedFriendlyGroupName: usize = 0x18; // CUtlString
+    pub const m_bExposedVariableIsFixedRange: usize = 0x20; // bool
+    pub const m_strExposedVisibleWhenTrue: usize = 0x28; // CUtlString
+    pub const m_strExposedHiddenWhenTrue: usize = 0x30; // CUtlString
+    pub const m_nVariableType: usize = 0x38; // CompositeMaterialInputLooseVariableType_t
+    pub const m_bValueBoolean: usize = 0x3C; // bool
+    pub const m_nValueIntX: usize = 0x40; // int32_t
+    pub const m_nValueIntY: usize = 0x44; // int32_t
+    pub const m_nValueIntZ: usize = 0x48; // int32_t
+    pub const m_nValueIntW: usize = 0x4C; // int32_t
+    pub const m_bHasFloatBounds: usize = 0x50; // bool
+    pub const m_flValueFloatX: usize = 0x54; // float
+    pub const m_flValueFloatX_Min: usize = 0x58; // float
+    pub const m_flValueFloatX_Max: usize = 0x5C; // float
+    pub const m_flValueFloatY: usize = 0x60; // float
+    pub const m_flValueFloatY_Min: usize = 0x64; // float
+    pub const m_flValueFloatY_Max: usize = 0x68; // float
+    pub const m_flValueFloatZ: usize = 0x6C; // float
+    pub const m_flValueFloatZ_Min: usize = 0x70; // float
+    pub const m_flValueFloatZ_Max: usize = 0x74; // float
+    pub const m_flValueFloatW: usize = 0x78; // float
+    pub const m_flValueFloatW_Min: usize = 0x7C; // float
+    pub const m_flValueFloatW_Max: usize = 0x80; // float
+    pub const m_cValueColor4: usize = 0x84; // Color
+    pub const m_nValueSystemVar: usize = 0x88; // CompositeMaterialVarSystemVar_t
+    pub const m_strResourceMaterial: usize = 0x90; // CResourceName
+    pub const m_strTextureContentAssetPath: usize = 0x170; // CUtlString
+    pub const m_strTextureRuntimeResourcePath: usize = 0x178; // CResourceName
+    pub const m_strTextureCompilationVtexTemplate: usize = 0x258; // CUtlString
+    pub const m_nTextureType: usize = 0x260; // CompositeMaterialInputTextureType_t
+    pub const m_strString: usize = 0x268; // CUtlString
+}
+
+pub mod CompositeMaterialMatchFilter_t {
+    pub const m_nCompositeMaterialMatchFilterType: usize = 0x0; // CompositeMaterialMatchFilterType_t
+    pub const m_strMatchFilter: usize = 0x8; // CUtlString
+    pub const m_strMatchValue: usize = 0x10; // CUtlString
+    pub const m_bPassWhenTrue: usize = 0x18; // bool
+}
+
+pub mod CompositeMaterial_t {
+    pub const m_TargetKVs: usize = 0x8; // KeyValues3
+    pub const m_PreGenerationKVs: usize = 0x18; // KeyValues3
+    pub const m_FinalKVs: usize = 0x28; // KeyValues3
+    pub const m_vecGeneratedTextures: usize = 0x40; // CUtlVector<GeneratedTextureHandle_t>
+}
+
+pub mod CountdownTimer {
+    pub const m_duration: usize = 0x8; // float
+    pub const m_timestamp: usize = 0xC; // GameTime_t
+    pub const m_timescale: usize = 0x10; // float
+    pub const m_nWorldGroupId: usize = 0x14; // WorldGroupId_t
+}
+
+pub mod EngineCountdownTimer {
+    pub const m_duration: usize = 0x8; // float
+    pub const m_timestamp: usize = 0xC; // float
+    pub const m_timescale: usize = 0x10; // float
+}
+
+pub mod EntityRenderAttribute_t {
+    pub const m_ID: usize = 0x30; // CUtlStringToken
+    pub const m_Values: usize = 0x34; // Vector4D
+}
+
+pub mod EntitySpottedState_t {
+    pub const m_bSpotted: usize = 0x8; // bool
+    pub const m_bSpottedByMask: usize = 0xC; // uint32_t[2]
+}
+
+pub mod GeneratedTextureHandle_t {
+    pub const m_strBitmapName: usize = 0x0; // CUtlString
+}
+
+pub mod IClientAlphaProperty {
+}
+
+pub mod IntervalTimer {
+    pub const m_timestamp: usize = 0x8; // GameTime_t
+    pub const m_nWorldGroupId: usize = 0xC; // WorldGroupId_t
+}
+
+pub mod PhysicsRagdollPose_t {
+    pub const __m_pChainEntity: usize = 0x8; // CNetworkVarChainer
+    pub const m_Transforms: usize = 0x30; // C_NetworkUtlVectorBase<CTransform>
+    pub const m_hOwner: usize = 0x48; // CHandle<C_BaseEntity>
+    pub const m_bDirty: usize = 0x68; // bool
+}
+
+pub mod SellbackPurchaseEntry_t {
+    pub const m_unDefIdx: usize = 0x30; // uint16_t
+    pub const m_nCost: usize = 0x34; // int32_t
+    pub const m_nPrevArmor: usize = 0x38; // int32_t
+    pub const m_bPrevHelmet: usize = 0x3C; // bool
+    pub const m_hItem: usize = 0x40; // CEntityHandle
+}
+
+pub mod ServerAuthoritativeWeaponSlot_t {
+    pub const unClass: usize = 0x28; // uint16_t
+    pub const unSlot: usize = 0x2A; // uint16_t
+    pub const unItemDefIdx: usize = 0x2C; // uint16_t
+}
+
+pub mod TimedEvent {
+    pub const m_TimeBetweenEvents: usize = 0x0; // float
+    pub const m_fNextEvent: usize = 0x4; // float
+}
+
+pub mod VPhysicsCollisionAttribute_t {
+    pub const m_nInteractsAs: usize = 0x8; // uint64_t
+    pub const m_nInteractsWith: usize = 0x10; // uint64_t
+    pub const m_nInteractsExclude: usize = 0x18; // uint64_t
+    pub const m_nEntityId: usize = 0x20; // uint32_t
+    pub const m_nOwnerId: usize = 0x24; // uint32_t
+    pub const m_nHierarchyId: usize = 0x28; // uint16_t
+    pub const m_nCollisionGroup: usize = 0x2A; // uint8_t
+    pub const m_nCollisionFunctionMask: usize = 0x2B; // uint8_t
+}
+
+pub mod ViewAngleServerChange_t {
+    pub const nType: usize = 0x30; // FixAngleSet_t
+    pub const qAngle: usize = 0x34; // QAngle
+    pub const nIndex: usize = 0x40; // uint32_t
+}
+
+pub mod WeaponPurchaseCount_t {
+    pub const m_nItemDefIndex: usize = 0x30; // uint16_t
+    pub const m_nCount: usize = 0x32; // uint16_t
+}
+
+pub mod WeaponPurchaseTracker_t {
+    pub const m_weaponPurchases: usize = 0x8; // C_UtlVectorEmbeddedNetworkVar<WeaponPurchaseCount_t>
+}
+
+pub mod audioparams_t {
+    pub const localSound: usize = 0x8; // Vector[8]
+    pub const soundscapeIndex: usize = 0x68; // int32_t
+    pub const localBits: usize = 0x6C; // uint8_t
+    pub const soundscapeEntityListIndex: usize = 0x70; // int32_t
+    pub const soundEventHash: usize = 0x74; // uint32_t
+}
+
+pub mod fogparams_t {
+    pub const dirPrimary: usize = 0x8; // Vector
+    pub const colorPrimary: usize = 0x14; // Color
+    pub const colorSecondary: usize = 0x18; // Color
+    pub const colorPrimaryLerpTo: usize = 0x1C; // Color
+    pub const colorSecondaryLerpTo: usize = 0x20; // Color
+    pub const start: usize = 0x24; // float
+    pub const end: usize = 0x28; // float
+    pub const farz: usize = 0x2C; // float
+    pub const maxdensity: usize = 0x30; // float
+    pub const exponent: usize = 0x34; // float
+    pub const HDRColorScale: usize = 0x38; // float
+    pub const skyboxFogFactor: usize = 0x3C; // float
+    pub const skyboxFogFactorLerpTo: usize = 0x40; // float
+    pub const startLerpTo: usize = 0x44; // float
+    pub const endLerpTo: usize = 0x48; // float
+    pub const maxdensityLerpTo: usize = 0x4C; // float
+    pub const lerptime: usize = 0x50; // GameTime_t
+    pub const duration: usize = 0x54; // float
+    pub const blendtobackground: usize = 0x58; // float
+    pub const scattering: usize = 0x5C; // float
+    pub const locallightscale: usize = 0x60; // float
+    pub const enable: usize = 0x64; // bool
+    pub const blend: usize = 0x65; // bool
+    pub const m_bNoReflectionFog: usize = 0x66; // bool
+    pub const m_bPadding: usize = 0x67; // bool
+}
+
+pub mod shard_model_desc_t {
+    pub const m_nModelID: usize = 0x8; // int32_t
+    pub const m_hMaterial: usize = 0x10; // CStrongHandle<InfoForResourceTypeIMaterial2>
+    pub const m_solid: usize = 0x18; // ShardSolid_t
+    pub const m_ShatterPanelMode: usize = 0x19; // ShatterPanelMode
+    pub const m_vecPanelSize: usize = 0x1C; // Vector2D
+    pub const m_vecStressPositionA: usize = 0x24; // Vector2D
+    pub const m_vecStressPositionB: usize = 0x2C; // Vector2D
+    pub const m_vecPanelVertices: usize = 0x38; // C_NetworkUtlVectorBase<Vector2D>
+    pub const m_flGlassHalfThickness: usize = 0x50; // float
+    pub const m_bHasParent: usize = 0x54; // bool
+    pub const m_bParentFrozen: usize = 0x55; // bool
+    pub const m_SurfacePropStringToken: usize = 0x58; // CUtlStringToken
+    pub const m_LightGroup: usize = 0x5C; // CUtlStringToken
+}
+
+pub mod sky3dparams_t {
+    pub const scale: usize = 0x8; // int16_t
+    pub const origin: usize = 0xC; // Vector
+    pub const bClip3DSkyBoxNearToWorldFar: usize = 0x18; // bool
+    pub const flClip3DSkyBoxNearToWorldFarOffset: usize = 0x1C; // float
+    pub const fog: usize = 0x20; // fogparams_t
+    pub const m_nWorldGroupID: usize = 0x88; // WorldGroupId_t
+}
\ No newline at end of file
diff --git a/src/sdk/cs2dumper/engine2.rs b/src/sdk/cs2dumper/engine2.rs
new file mode 100644
index 0000000..75c2e20
--- /dev/null
+++ b/src/sdk/cs2dumper/engine2.rs
@@ -0,0 +1,242 @@
+/*
+ * Created using https://github.com/a2x/cs2-dumper
+ * Fri, 27 Oct 2023 01:03:22 +0000
+ */
+
+#![allow(non_snake_case, non_upper_case_globals)]
+
+pub mod CEmptyEntityInstance {
+}
+
+pub mod CEntityComponent {
+}
+
+pub mod CEntityComponentHelper {
+    pub const m_flags: usize = 0x8; // uint32_t
+    pub const m_pInfo: usize = 0x10; // EntComponentInfo_t*
+    pub const m_nPriority: usize = 0x18; // int32_t
+    pub const m_pNext: usize = 0x20; // CEntityComponentHelper*
+}
+
+pub mod CEntityIOOutput {
+    pub const m_Value: usize = 0x18; // CVariantBase<CVariantDefaultAllocator>
+}
+
+pub mod CEntityIdentity {
+    pub const m_nameStringableIndex: usize = 0x14; // int32_t
+    pub const m_name: usize = 0x18; // CUtlSymbolLarge
+    pub const m_designerName: usize = 0x20; // CUtlSymbolLarge
+    pub const m_flags: usize = 0x30; // uint32_t
+    pub const m_worldGroupId: usize = 0x38; // WorldGroupId_t
+    pub const m_fDataObjectTypes: usize = 0x3C; // uint32_t
+    pub const m_PathIndex: usize = 0x40; // ChangeAccessorFieldPathIndex_t
+    pub const m_pPrev: usize = 0x58; // CEntityIdentity*
+    pub const m_pNext: usize = 0x60; // CEntityIdentity*
+    pub const m_pPrevByClass: usize = 0x68; // CEntityIdentity*
+    pub const m_pNextByClass: usize = 0x70; // CEntityIdentity*
+}
+
+pub mod CEntityInstance {
+    pub const m_iszPrivateVScripts: usize = 0x8; // CUtlSymbolLarge
+    pub const m_pEntity: usize = 0x10; // CEntityIdentity*
+    pub const m_CScriptComponent: usize = 0x28; // CScriptComponent*
+}
+
+pub mod CNetworkVarChainer {
+    pub const m_PathIndex: usize = 0x20; // ChangeAccessorFieldPathIndex_t
+}
+
+pub mod CScriptComponent { // CEntityComponent
+    pub const m_scriptClassName: usize = 0x30; // CUtlSymbolLarge
+}
+
+pub mod CVariantDefaultAllocator {
+}
+
+pub mod EngineLoopState_t {
+    pub const m_nPlatWindowWidth: usize = 0x18; // int32_t
+    pub const m_nPlatWindowHeight: usize = 0x1C; // int32_t
+    pub const m_nRenderWidth: usize = 0x20; // int32_t
+    pub const m_nRenderHeight: usize = 0x24; // int32_t
+}
+
+pub mod EntComponentInfo_t {
+    pub const m_pName: usize = 0x0; // char*
+    pub const m_pCPPClassname: usize = 0x8; // char*
+    pub const m_pNetworkDataReferencedDescription: usize = 0x10; // char*
+    pub const m_pNetworkDataReferencedPtrPropDescription: usize = 0x18; // char*
+    pub const m_nRuntimeIndex: usize = 0x20; // int32_t
+    pub const m_nFlags: usize = 0x24; // uint32_t
+    pub const m_pBaseClassComponentHelper: usize = 0x60; // CEntityComponentHelper*
+}
+
+pub mod EntInput_t {
+}
+
+pub mod EntOutput_t {
+}
+
+pub mod EventAdvanceTick_t { // EventSimulate_t
+    pub const m_nCurrentTick: usize = 0x30; // int32_t
+    pub const m_nCurrentTickThisFrame: usize = 0x34; // int32_t
+    pub const m_nTotalTicksThisFrame: usize = 0x38; // int32_t
+    pub const m_nTotalTicks: usize = 0x3C; // int32_t
+}
+
+pub mod EventAppShutdown_t {
+    pub const m_nDummy0: usize = 0x0; // int32_t
+}
+
+pub mod EventClientAdvanceTick_t { // EventAdvanceTick_t
+}
+
+pub mod EventClientFrameSimulate_t {
+    pub const m_LoopState: usize = 0x0; // EngineLoopState_t
+    pub const m_flRealTime: usize = 0x28; // float
+    pub const m_flFrameTime: usize = 0x2C; // float
+}
+
+pub mod EventClientOutput_t {
+    pub const m_LoopState: usize = 0x0; // EngineLoopState_t
+    pub const m_flRenderTime: usize = 0x28; // float
+    pub const m_flRealTime: usize = 0x2C; // float
+    pub const m_flRenderFrameTimeUnbounded: usize = 0x30; // float
+    pub const m_bRenderOnly: usize = 0x34; // bool
+}
+
+pub mod EventClientPauseSimulate_t { // EventSimulate_t
+}
+
+pub mod EventClientPollInput_t {
+    pub const m_LoopState: usize = 0x0; // EngineLoopState_t
+    pub const m_flRealTime: usize = 0x28; // float
+}
+
+pub mod EventClientPollNetworking_t {
+    pub const m_nTickCount: usize = 0x0; // int32_t
+}
+
+pub mod EventClientPostAdvanceTick_t { // EventPostAdvanceTick_t
+}
+
+pub mod EventClientPostOutput_t {
+    pub const m_LoopState: usize = 0x0; // EngineLoopState_t
+    pub const m_flRenderTime: usize = 0x28; // double
+    pub const m_flRenderFrameTime: usize = 0x30; // float
+    pub const m_flRenderFrameTimeUnbounded: usize = 0x34; // float
+    pub const m_bRenderOnly: usize = 0x38; // bool
+}
+
+pub mod EventClientPostSimulate_t { // EventSimulate_t
+}
+
+pub mod EventClientPreOutput_t {
+    pub const m_LoopState: usize = 0x0; // EngineLoopState_t
+    pub const m_flRenderTime: usize = 0x28; // double
+    pub const m_flRenderFrameTime: usize = 0x30; // double
+    pub const m_flRenderFrameTimeUnbounded: usize = 0x38; // double
+    pub const m_flRealTime: usize = 0x40; // float
+    pub const m_bRenderOnly: usize = 0x44; // bool
+}
+
+pub mod EventClientPreSimulate_t { // EventSimulate_t
+}
+
+pub mod EventClientPredictionPostNetupdate_t {
+}
+
+pub mod EventClientProcessGameInput_t {
+    pub const m_LoopState: usize = 0x0; // EngineLoopState_t
+    pub const m_flRealTime: usize = 0x28; // float
+    pub const m_flFrameTime: usize = 0x2C; // float
+}
+
+pub mod EventClientProcessInput_t {
+    pub const m_LoopState: usize = 0x0; // EngineLoopState_t
+    pub const m_flRealTime: usize = 0x28; // float
+}
+
+pub mod EventClientProcessNetworking_t {
+}
+
+pub mod EventClientSceneSystemThreadStateChange_t {
+    pub const m_bThreadsActive: usize = 0x0; // bool
+}
+
+pub mod EventClientSendInput_t {
+    pub const m_bFinalClientCommandTick: usize = 0x0; // bool
+    pub const m_nAdditionalClientCommandsToCreate: usize = 0x4; // int32_t
+}
+
+pub mod EventClientSimulate_t { // EventSimulate_t
+}
+
+pub mod EventFrameBoundary_t {
+    pub const m_flFrameTime: usize = 0x0; // float
+}
+
+pub mod EventModInitialized_t {
+}
+
+pub mod EventPostAdvanceTick_t { // EventSimulate_t
+    pub const m_nCurrentTick: usize = 0x30; // int32_t
+    pub const m_nCurrentTickThisFrame: usize = 0x34; // int32_t
+    pub const m_nTotalTicksThisFrame: usize = 0x38; // int32_t
+    pub const m_nTotalTicks: usize = 0x3C; // int32_t
+}
+
+pub mod EventPostDataUpdate_t {
+    pub const m_nCount: usize = 0x0; // int32_t
+}
+
+pub mod EventPreDataUpdate_t {
+    pub const m_nCount: usize = 0x0; // int32_t
+}
+
+pub mod EventProfileStorageAvailable_t {
+    pub const m_nSplitScreenSlot: usize = 0x0; // CSplitScreenSlot
+}
+
+pub mod EventServerAdvanceTick_t { // EventAdvanceTick_t
+}
+
+pub mod EventServerPollNetworking_t { // EventSimulate_t
+}
+
+pub mod EventServerPostAdvanceTick_t { // EventPostAdvanceTick_t
+}
+
+pub mod EventServerPostSimulate_t { // EventSimulate_t
+}
+
+pub mod EventServerProcessNetworking_t { // EventSimulate_t
+}
+
+pub mod EventServerSimulate_t { // EventSimulate_t
+}
+
+pub mod EventSetTime_t {
+    pub const m_LoopState: usize = 0x0; // EngineLoopState_t
+    pub const m_nClientOutputFrames: usize = 0x28; // int32_t
+    pub const m_flRealTime: usize = 0x30; // double
+    pub const m_flRenderTime: usize = 0x38; // double
+    pub const m_flRenderFrameTime: usize = 0x40; // double
+    pub const m_flRenderFrameTimeUnbounded: usize = 0x48; // double
+    pub const m_flRenderFrameTimeUnscaled: usize = 0x50; // double
+    pub const m_flTickRemainder: usize = 0x58; // double
+}
+
+pub mod EventSimpleLoopFrameUpdate_t {
+    pub const m_LoopState: usize = 0x0; // EngineLoopState_t
+    pub const m_flRealTime: usize = 0x28; // float
+    pub const m_flFrameTime: usize = 0x2C; // float
+}
+
+pub mod EventSimulate_t {
+    pub const m_LoopState: usize = 0x0; // EngineLoopState_t
+    pub const m_bFirstTick: usize = 0x28; // bool
+    pub const m_bLastTick: usize = 0x29; // bool
+}
+
+pub mod EventSplitScreenStateChanged_t {
+}
\ No newline at end of file
diff --git a/src/sdk/cs2dumper/mod.rs b/src/sdk/cs2dumper/mod.rs
new file mode 100644
index 0000000..dc63cf0
--- /dev/null
+++ b/src/sdk/cs2dumper/mod.rs
@@ -0,0 +1,4 @@
+#![allow(dead_code)]
+pub mod client;
+pub mod engine2;
+pub mod offsets;
diff --git a/src/sdk/cs2dumper/offsets.rs b/src/sdk/cs2dumper/offsets.rs
new file mode 100644
index 0000000..f996e07
--- /dev/null
+++ b/src/sdk/cs2dumper/offsets.rs
@@ -0,0 +1,46 @@
+/*
+ * Created using https://github.com/a2x/cs2-dumper
+ * Mon, 30 Oct 2023 00:17:09 +0000
+ */
+
+#![allow(non_snake_case, non_upper_case_globals)]
+
+pub mod client_dll { // client.dll
+    pub const dwBaseEntityModel_setModel: usize = 0x57EA50;
+    pub const dwEntityList: usize = 0x17995C0;
+    pub const dwForceAttack: usize = 0x169EE60;
+    pub const dwForceAttack2: usize = 0x169EEF0;
+    pub const dwForceBackward: usize = 0x169F130;
+    pub const dwForceCrouch: usize = 0x169F400;
+    pub const dwForceForward: usize = 0x169F0A0;
+    pub const dwForceJump: usize = 0x169F370;
+    pub const dwForceLeft: usize = 0x169F1C0;
+    pub const dwForceRight: usize = 0x169F250;
+    pub const dwGameEntitySystem: usize = 0x1952588;
+    pub const dwGameEntitySystem_getBaseEntity: usize = 0x602050;
+    pub const dwGameEntitySystem_getHighestEntityIndex: usize = 0x5F3D40;
+    pub const dwGameRules: usize = 0x17F5488;
+    pub const dwGlobalVars: usize = 0x169AFE0;
+    pub const dwGlowManager: usize = 0x17F4C10;
+    pub const dwInterfaceLinkList: usize = 0x1980298;
+    pub const dwLocalPlayerController: usize = 0x17E8158;
+    pub const dwLocalPlayerPawn: usize = 0x1886C48;
+    pub const dwPlantedC4: usize = 0x188BFE0;
+    pub const dwViewAngles: usize = 0x18E6770;
+    pub const dwViewMatrix: usize = 0x1887730;
+    pub const dwViewRender: usize = 0x1888128;
+}
+
+pub mod engine2_dll { // engine2.dll
+    pub const dwBuildNumber: usize = 0x488514;
+    pub const dwNetworkGameClient: usize = 0x487AB0;
+    pub const dwNetworkGameClient_getLocalPlayer: usize = 0xF0;
+    pub const dwNetworkGameClient_maxClients: usize = 0x250;
+    pub const dwNetworkGameClient_signOnState: usize = 0x240;
+    pub const dwWindowHeight: usize = 0x5396DC;
+    pub const dwWindowWidth: usize = 0x5396D8;
+}
+
+pub mod inputsystem_dll { // inputsystem.dll
+    pub const dwInputSystem: usize = 0x35770;
+}
\ No newline at end of file
diff --git a/src/sdk/mod.rs b/src/sdk/mod.rs
new file mode 100644
index 0000000..564b429
--- /dev/null
+++ b/src/sdk/mod.rs
@@ -0,0 +1,43 @@
+pub mod structs;
+pub mod cs2dumper;
+use crate::dma::CheatCtx;
+
+use memflow::prelude::v1::*;
+use anyhow::Result;
+
+use self::structs::{CCSPlayerController, CPlayerPawn};
+
+pub fn get_local(ctx: &mut CheatCtx) -> Result<CCSPlayerController> {
+    let ptr = ctx.process.read_addr64(ctx.client_module.base + cs2dumper::offsets::client_dll::dwLocalPlayerController)?;
+    Ok(CCSPlayerController::new(ptr))
+}
+
+pub fn get_local_pawn(ctx: &mut CheatCtx) -> Result<CPlayerPawn> {
+    let ptr = ctx.process.read_addr64(ctx.client_module.base + cs2dumper::offsets::client_dll::dwLocalPlayerPawn)?;
+    Ok(CPlayerPawn::new(ptr))
+}
+
+pub fn get_entity_list(ctx: &mut CheatCtx) -> Result<Address> {
+    let ptr = ctx.process.read_addr64(ctx.client_module.base + cs2dumper::offsets::client_dll::dwEntityList)?;
+    Ok(ptr)
+}
+
+pub fn get_globals(ctx: &mut CheatCtx) -> Result<Address> {
+    let ptr = ctx.process.read_addr64(ctx.client_module.base + cs2dumper::offsets::client_dll::dwGlobalVars)?;
+    Ok(ptr)
+}
+
+pub fn map_name(global_vars: Address, ctx: &mut CheatCtx) -> Result<String> {
+    let ptr = ctx.process.read_addr64(global_vars + 0x188)?;
+    Ok(ctx.process.read_char_string_n(ptr, 32)?)
+}
+
+pub fn max_clients(global_vars: Address, ctx: &mut CheatCtx) -> Result<i32> {
+    Ok(ctx.process.read(global_vars + 0x10)?)
+}
+
+pub fn is_ingame(ctx: &mut CheatCtx) -> Result<bool> {
+    let ptr = ctx.process.read_addr64(ctx.engine_module.base + cs2dumper::offsets::engine2_dll::dwNetworkGameClient)?;
+    let signonstate: u64 = ctx.process.read(ptr + cs2dumper::offsets::engine2_dll::dwNetworkGameClient_signOnState)?;
+    Ok(signonstate == 6)
+}
\ No newline at end of file
diff --git a/src/sdk/structs/entity.rs b/src/sdk/structs/entity.rs
new file mode 100644
index 0000000..c634753
--- /dev/null
+++ b/src/sdk/structs/entity.rs
@@ -0,0 +1,206 @@
+use crate::{dma::CheatCtx, sdk::cs2dumper, structs::{Vec3, communication::PlayerType}};
+use enum_primitive_derive::Primitive;
+use memflow::{prelude::MemoryView, types::Address};
+use anyhow::{Result, anyhow};
+use num_traits::FromPrimitive;
+
+#[repr(i32)]
+#[derive(Debug, Eq, PartialEq, Primitive)]
+pub enum TeamID {
+    Spectator = 1,
+    T = 2,
+    CT = 3
+}
+
+pub struct CEntityIdentity(Address);
+
+impl CEntityIdentity {
+    pub fn prev_by_class(&self, ctx: &mut CheatCtx) -> Result<CBaseEntity> {
+        let prev1 = ctx.process.read_addr64(self.0 + cs2dumper::client::CEntityIdentity::m_pPrevByClass)?;
+        let prev = ctx.process.read_addr64(prev1)?;
+ 
+        if prev.is_null() || !prev.is_valid() {
+            Err(anyhow!("Invalid or Null"))
+        } else {
+            Ok(CBaseEntity(prev))
+        }
+    }
+
+    pub fn next_by_class(&self, ctx: &mut CheatCtx) -> Result<CBaseEntity> {
+        let next1 = ctx.process.read_addr64(self.0 + cs2dumper::client::CEntityIdentity::m_pNextByClass)?;
+        let next = ctx.process.read_addr64(next1)?;
+                
+        if next.is_null() || !next.is_valid() {
+            Err(anyhow!("Invalid or Null"))
+        } else {
+            Ok(CBaseEntity(next))
+        }
+    }
+
+    pub fn designer_name(&self, ctx: &mut CheatCtx) -> Result<String> {
+        let ptr = ctx.process.read_addr64(self.0 + cs2dumper::client::CEntityIdentity::m_designerName)?;
+        Ok(ctx.process.read_char_string_n(ptr, 32)?)
+    }
+}
+
+pub struct CBaseEntity(Address);
+
+impl CBaseEntity {
+    pub fn new(ptr: Address) -> CBaseEntity {
+        CBaseEntity(ptr)
+    }
+
+    pub fn ptr(&self) -> Address {
+        self.0
+    }
+
+    pub fn to_controller(&self) -> CCSPlayerController {
+        CCSPlayerController(self.0)
+    }
+
+    pub fn get_from_list(ctx: &mut CheatCtx, entity_list: Address, idx: usize) -> Result<CBaseEntity> {
+        let list_entry = ctx.process.read_addr64(entity_list + ((( idx & 0x7FFF ) >> 9 ) * 0x8)).unwrap();
+
+        if list_entry.is_null() || !list_entry.is_valid() {
+            Err(anyhow!("Invalid or Null"))
+        } else {
+            let ptr = ctx.process.read_addr64(list_entry + 120 * (idx & 0x1FF)).unwrap();
+            Ok(CBaseEntity(ptr))
+        }
+    }
+
+    pub fn entity_identity(&self, ctx: &mut CheatCtx) -> Result<CEntityIdentity> {
+        let ptr = ctx.process.read_addr64(self.0 + cs2dumper::client::CEntityInstance::m_pEntity)?;
+        Ok(CEntityIdentity(ptr))
+    }
+}
+
+pub struct CPlayerPawn(Address);
+
+impl CPlayerPawn {
+    pub fn new(ptr: Address) -> CPlayerPawn {
+        CPlayerPawn(ptr)
+    }
+    
+    pub fn from_uhandle(uhandle: u32, entity_list: Address, ctx: &mut CheatCtx) -> Option<CPlayerPawn> {
+        let list_entry = ctx.process.read_addr64(entity_list + 0x8 * ((uhandle & 0x7FFF) >> 9) + 16).unwrap();
+        
+        if list_entry.is_null() || !list_entry.is_valid() {
+            None
+        } else {
+            let ptr = ctx.process.read_addr64(list_entry + 120 * (uhandle & 0x1FF)).unwrap();
+            Some(CPlayerPawn(ptr))
+        }
+    }
+
+    /*
+        DWORD64 entityPawnBase = Memory::Read<unsigned __int64>(EntitiesList + ((hEntity & 0x7FFF)  * ENTITY_SPACING));
+        auto pawn = read<C_CSPlayerPawnBase*>(entityPawnBase + 0x78 * (hEntity & 0x1FF));
+    */
+
+    pub fn from_uhandle2(uhandle: u32, entity_list: Address, ctx: &mut CheatCtx) -> Option<CPlayerPawn> {
+        let ent_pawn_base = ctx.process.read_addr64(entity_list + (uhandle & 0x7FFF) * 0x10).unwrap();
+        
+        if ent_pawn_base.is_null() || !ent_pawn_base.is_valid() {
+            None
+        } else {
+            let ptr = ctx.process.read_addr64(ent_pawn_base + 0x78 * (uhandle & 0x1FF)).unwrap();
+            Some(CPlayerPawn(ptr))
+        }
+    }
+
+    pub fn ptr(&self) -> Address {
+        self.0
+    }
+
+    pub fn pos(&self, ctx: &mut CheatCtx) -> Result<Vec3> {
+        Ok(ctx.process.read(self.0 + cs2dumper::client::C_BasePlayerPawn::m_vOldOrigin)?)
+    }
+
+    pub fn angles(&self, ctx: &mut CheatCtx) -> Result<Vec3> {
+        Ok(ctx.process.read(self.0 + cs2dumper::client::C_CSPlayerPawnBase::m_angEyeAngles)?)
+    }
+
+    pub fn health(&self, ctx: &mut CheatCtx) -> Result<u32> {
+        Ok(ctx.process.read(self.0 + cs2dumper::client::C_BaseEntity::m_iHealth)?)
+    }
+
+    /// Same as ::get_health > 0
+    pub fn is_alive(&self, ctx: &mut CheatCtx) -> Result<bool> {
+        Ok(self.health(ctx)? > 0)
+    }
+
+}
+
+pub struct CCSPlayerController(Address);
+
+impl CCSPlayerController {
+    pub fn ptr(&self) -> Address {
+        self.0
+    }
+
+    pub fn new(ptr: Address) -> CCSPlayerController {
+        CCSPlayerController(ptr)
+    }
+
+    pub fn get_team(&self, ctx: &mut CheatCtx) -> Result<Option<TeamID>> {
+        let team: i32 = ctx.process.read(self.0 + cs2dumper::client::C_BaseEntity::m_iTeamNum)?;
+        Ok(TeamID::from_i32(team))
+    }
+
+    pub fn get_player_type(&self, ctx: &mut CheatCtx, local: &CCSPlayerController) -> Result<Option<PlayerType>> {
+        if self.0 == local.0 {
+            return Ok(Some(PlayerType::Local))
+        }
+
+        let team = {
+            match self.get_team(ctx)? {
+                Some(t) => t,
+                None => { return Ok(None) },
+            }
+        };
+        
+        let local_team = {
+            match local.get_team(ctx)? {
+                Some(t) => t,
+                None => { return Ok(None) },
+            }
+        };
+
+        let player_type = {
+            if team == TeamID::Spectator { 
+                PlayerType::Spectator 
+            } else if team != local_team {
+                PlayerType::Enemy
+            } else {
+                PlayerType::Team
+            }
+        };
+
+        Ok(Some(player_type))
+    }
+
+    pub fn pawn(&self, entity_list: Address, ctx: &mut CheatCtx) -> Result<Option<CPlayerPawn>> {
+        let uhandle = ctx.process.read(self.0 + cs2dumper::client::CCSPlayerController::m_hPlayerPawn)?;
+        Ok(CPlayerPawn::from_uhandle(uhandle, entity_list, ctx))
+    }
+
+    pub fn pawn2(&self, entity_list: Address, ctx: &mut CheatCtx) -> Result<Option<CPlayerPawn>> {
+        let uhandle = ctx.process.read(self.0 + cs2dumper::client::CBasePlayerController::m_hPawn)?;
+        Ok(CPlayerPawn::from_uhandle2(uhandle, entity_list, ctx))
+    }
+
+    pub fn player_name(&self, ctx: &mut CheatCtx) -> Result<String> {
+        let ptr = ctx.process.read_addr64(self.0 + cs2dumper::client::CCSPlayerController::m_sSanitizedPlayerName)?;
+        Ok(ctx.process.read_char_string_n(ptr, 32)?)
+    }
+
+    pub fn entity_identity(&self, ctx: &mut CheatCtx) -> Result<CEntityIdentity> {
+        let ptr = ctx.process.read_addr64(self.0 + cs2dumper::client::CEntityInstance::m_pEntity)?;
+        Ok(CEntityIdentity(ptr))
+    }
+
+    pub fn to_base(&self) -> CBaseEntity {
+        CBaseEntity(self.0)
+    }
+}
\ No newline at end of file
diff --git a/src/sdk/structs/mod.rs b/src/sdk/structs/mod.rs
new file mode 100644
index 0000000..4f2b2b6
--- /dev/null
+++ b/src/sdk/structs/mod.rs
@@ -0,0 +1,2 @@
+mod entity;
+pub use entity::*;
\ No newline at end of file
diff --git a/src/structs/comms.rs b/src/structs/comms.rs
new file mode 100644
index 0000000..496eb08
--- /dev/null
+++ b/src/structs/comms.rs
@@ -0,0 +1,79 @@
+use serde::{Serialize, Deserialize};
+
+use super::Vec3;
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct PlayerData {
+    pos: Vec3,
+    yaw: f32,
+    #[serde(rename = "playerType")]
+    player_type: PlayerType,
+
+    #[serde(rename = "hasBomb")]
+    has_bomb: bool
+}
+
+impl PlayerData {
+    pub fn new(pos: Vec3, yaw: f32, player_type: PlayerType, has_bomb: bool) -> PlayerData {
+        PlayerData { pos, yaw, player_type, has_bomb }
+    }
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct BombData {
+    pos: Vec3,
+    #[serde(rename = "isPlanted")]
+    is_planted: bool
+}
+
+impl BombData {
+    pub fn new(pos: Vec3, is_planted: bool) -> BombData {
+        BombData { pos, is_planted }
+    }
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub enum EntityData {
+    Player(PlayerData),
+    Bomb(BombData)
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
+pub enum PlayerType {
+    #[default]
+    Unknown,
+    Spectator,
+    Local,
+    Enemy,
+    Team
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct RadarData {
+    ingame: bool,
+
+    #[serde(rename = "mapName")]
+    map_name: String,
+
+    #[serde(rename(serialize = "entityData"))]
+    player_data: Vec<EntityData>,
+
+    #[serde(rename(serialize = "localYaw"))]
+    local_yaw: f32,
+}
+
+impl RadarData {
+    pub fn new(ingame: bool, map_name: String, player_data: Vec<EntityData>, local_yaw: f32) -> RadarData {
+        RadarData { ingame, map_name, player_data, local_yaw }
+    }
+
+    /// Returns empty RadarData, it's also the same data that gets sent to clients when not ingame
+    pub fn empty() -> RadarData {
+        RadarData { 
+            ingame: false,
+            map_name: String::new(),
+            player_data: Vec::new(),
+            local_yaw: 0.0,
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/structs/mod.rs b/src/structs/mod.rs
new file mode 100644
index 0000000..f67efb9
--- /dev/null
+++ b/src/structs/mod.rs
@@ -0,0 +1,50 @@
+pub mod comms;
+
+use clap::ValueEnum;
+pub use comms as communication;
+
+mod vec3;
+pub use vec3::Vec3;
+
+
+
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Default)]
+pub enum Connector {
+    #[default]
+    Qemu,
+    Kvm,
+    Pcileech
+}
+
+impl ToString for Connector {
+    fn to_string(&self) -> String {
+        match self {
+            Connector::Qemu => String::from("qemu"),
+            Connector::Kvm => String::from("kvm"),
+            Connector::Pcileech => String::from("pcileech"),
+        }
+    }
+}
+
+/// Wrapper because log::LevelFilter doesn't implement ValueEnum
+#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Default)]
+pub enum Loglevel {
+    Error,
+    #[default]
+    Warn,
+    Info,
+    Debug,
+    Trace,
+}
+
+impl From<Loglevel> for log::LevelFilter {
+    fn from(val: Loglevel) -> Self {
+        match val {
+            Loglevel::Error => log::LevelFilter::Error,
+            Loglevel::Warn => log::LevelFilter::Warn,
+            Loglevel::Info => log::LevelFilter::Info,
+            Loglevel::Debug => log::LevelFilter::Debug,
+            Loglevel::Trace => log::LevelFilter::Trace,
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/structs/vec3.rs b/src/structs/vec3.rs
new file mode 100644
index 0000000..8b8cc8d
--- /dev/null
+++ b/src/structs/vec3.rs
@@ -0,0 +1,11 @@
+use serde::Serialize;
+
+#[derive(Debug, Clone, Copy, Serialize, serde::Deserialize)]
+#[repr(C)]
+pub struct Vec3 {
+    pub x: f32, 
+    pub y: f32,
+    pub z: f32
+}
+
+unsafe impl dataview::Pod for Vec3 {}
\ No newline at end of file
diff --git a/src/webserver.rs b/src/webserver.rs
new file mode 100644
index 0000000..ebf134e
--- /dev/null
+++ b/src/webserver.rs
@@ -0,0 +1,66 @@
+use std::{sync::Arc, path::PathBuf};
+
+use axum::{
+    extract::{ws::{WebSocketUpgrade, WebSocket, Message}, State},
+    response::Response,
+    routing::get,
+    Router,
+};
+
+use tokio::sync::RwLock;
+use tower_http::services::ServeDir;
+
+use crate::structs::communication::RadarData;
+
+#[derive(Clone)]
+struct AppState {
+    data_lock: Arc<RwLock<RadarData>>
+}
+
+async fn ws_handler(ws: WebSocketUpgrade, State(state): State<AppState>) -> Response {
+    ws.on_upgrade(|socket| handle_socket(socket, state))
+}
+
+async fn handle_socket(mut socket: WebSocket, state: AppState) {
+    while let Some(msg) = socket.recv().await {
+        if let Ok(msg) = msg {
+            if msg == Message::Text("requestInfo".to_string()) {
+                let data = state.data_lock.read().await;
+
+                let str = {
+                    match serde_json::to_string(&*data) {
+                        Ok(json) => json,
+                        Err(e) => {
+                            log::error!("Could not serialize data into json: {}", e.to_string());
+                            log::error!("Sending \"error\" instead");
+                            "error".to_string()
+                        },
+                    }
+                };
+
+                if socket.send(Message::Text(str)).await.is_err() {
+                    // client disconnected
+                    return;
+                }
+            }
+        } else {
+            // client disconnected
+            return;
+        }
+    }
+}
+
+pub async fn run(path: PathBuf, port: u16, data_lock: Arc<RwLock<RadarData>>) -> anyhow::Result<()> {
+    let app = Router::new()
+        .nest_service("/", ServeDir::new(path))
+        .route("/ws", get(ws_handler))
+        .with_state(AppState { data_lock });
+
+    let address = format!("0.0.0.0:{}", port);
+
+    axum::Server::bind(&address.parse()?)
+        .serve(app.into_make_service())
+        .await?;
+
+    Ok(())
+}
\ No newline at end of file
diff --git a/web/assets/image/cs_italy_radar_psd.png b/web/assets/image/cs_italy_radar_psd.png
new file mode 100644
index 0000000..df5151a
Binary files /dev/null and b/web/assets/image/cs_italy_radar_psd.png differ
diff --git a/web/assets/image/cs_office_radar_psd.png b/web/assets/image/cs_office_radar_psd.png
new file mode 100644
index 0000000..33214e6
Binary files /dev/null and b/web/assets/image/cs_office_radar_psd.png differ
diff --git a/web/assets/image/de_ancient_radar_psd.png b/web/assets/image/de_ancient_radar_psd.png
new file mode 100644
index 0000000..f50347d
Binary files /dev/null and b/web/assets/image/de_ancient_radar_psd.png differ
diff --git a/web/assets/image/de_anubis_radar_psd.png b/web/assets/image/de_anubis_radar_psd.png
new file mode 100644
index 0000000..1528ee3
Binary files /dev/null and b/web/assets/image/de_anubis_radar_psd.png differ
diff --git a/web/assets/image/de_dust2_radar_psd.png b/web/assets/image/de_dust2_radar_psd.png
new file mode 100644
index 0000000..9cea0ae
Binary files /dev/null and b/web/assets/image/de_dust2_radar_psd.png differ
diff --git a/web/assets/image/de_inferno_radar_psd.png b/web/assets/image/de_inferno_radar_psd.png
new file mode 100644
index 0000000..6696710
Binary files /dev/null and b/web/assets/image/de_inferno_radar_psd.png differ
diff --git a/web/assets/image/de_mirage_radar_psd.png b/web/assets/image/de_mirage_radar_psd.png
new file mode 100644
index 0000000..5964578
Binary files /dev/null and b/web/assets/image/de_mirage_radar_psd.png differ
diff --git a/web/assets/image/de_nuke_radar_psd.png b/web/assets/image/de_nuke_radar_psd.png
new file mode 100644
index 0000000..b6479e2
Binary files /dev/null and b/web/assets/image/de_nuke_radar_psd.png differ
diff --git a/web/assets/image/de_overpass_radar_psd.png b/web/assets/image/de_overpass_radar_psd.png
new file mode 100644
index 0000000..78ec8c7
Binary files /dev/null and b/web/assets/image/de_overpass_radar_psd.png differ
diff --git a/web/assets/image/de_vertigo_radar_psd.png b/web/assets/image/de_vertigo_radar_psd.png
new file mode 100644
index 0000000..e1559f6
Binary files /dev/null and b/web/assets/image/de_vertigo_radar_psd.png differ
diff --git a/web/assets/json/cs_italy.json b/web/assets/json/cs_italy.json
new file mode 100644
index 0000000..e1a2626
--- /dev/null
+++ b/web/assets/json/cs_italy.json
@@ -0,0 +1,7 @@
+{
+  "pos_x": -2647.0,
+  "pos_y": 2592.0,
+  "scale": 4.6,
+  "rotate": 1,
+  "zoom": 1.5
+}
\ No newline at end of file
diff --git a/web/assets/json/cs_office.json b/web/assets/json/cs_office.json
new file mode 100644
index 0000000..9813ace
--- /dev/null
+++ b/web/assets/json/cs_office.json
@@ -0,0 +1,7 @@
+{
+  "pos_x": -1838.0,
+  "pos_y": 1858.0,
+  "scale": 4.1,
+  "rotate": 0,
+  "zoom": 0.0
+}
\ No newline at end of file
diff --git a/web/assets/json/de_ancient.json b/web/assets/json/de_ancient.json
new file mode 100644
index 0000000..ee07098
--- /dev/null
+++ b/web/assets/json/de_ancient.json
@@ -0,0 +1,7 @@
+{
+  "pos_x": -2953.0,
+  "pos_y": 2164.0,
+  "scale": 5.0,
+  "rotate": 0,
+  "zoom": 0.0
+}
\ No newline at end of file
diff --git a/web/assets/json/de_anubis.json b/web/assets/json/de_anubis.json
new file mode 100644
index 0000000..5ac6180
--- /dev/null
+++ b/web/assets/json/de_anubis.json
@@ -0,0 +1,7 @@
+{
+  "pos_x": -2796.0,
+  "pos_y": 3328.0,
+  "scale": 5.22,
+  "rotate": 0,
+  "zoom": 0.0
+}
\ No newline at end of file
diff --git a/web/assets/json/de_dust2.json b/web/assets/json/de_dust2.json
new file mode 100644
index 0000000..c1d112f
--- /dev/null
+++ b/web/assets/json/de_dust2.json
@@ -0,0 +1,7 @@
+{
+  "pos_x": -2476.0,
+  "pos_y": 3239.0,
+  "scale": 4.400000095367432,
+  "rotate": 1,
+  "zoom": 1.100000023841858
+}
\ No newline at end of file
diff --git a/web/assets/json/de_inferno.json b/web/assets/json/de_inferno.json
new file mode 100644
index 0000000..b735f3c
--- /dev/null
+++ b/web/assets/json/de_inferno.json
@@ -0,0 +1,7 @@
+{
+  "pos_x": -2087.0,
+  "pos_y": 3870.0,
+  "scale": 4.9,
+  "rotate": 0,
+  "zoom": 0.0
+}
\ No newline at end of file
diff --git a/web/assets/json/de_mirage.json b/web/assets/json/de_mirage.json
new file mode 100644
index 0000000..34e44da
--- /dev/null
+++ b/web/assets/json/de_mirage.json
@@ -0,0 +1,7 @@
+{
+  "pos_x": -3230.0,
+  "pos_y": 1713.0,
+  "scale": 5.0,
+  "rotate": 0,
+  "zoom": 0.0
+}
\ No newline at end of file
diff --git a/web/assets/json/de_nuke.json b/web/assets/json/de_nuke.json
new file mode 100644
index 0000000..f432c77
--- /dev/null
+++ b/web/assets/json/de_nuke.json
@@ -0,0 +1,7 @@
+{
+  "pos_x": -3453.0,
+  "pos_y": 2887.0,
+  "scale": 7.0,
+  "rotate": 0,
+  "zoom": 0.0
+}
\ No newline at end of file
diff --git a/web/assets/json/de_overpass.json b/web/assets/json/de_overpass.json
new file mode 100644
index 0000000..f5a8de9
--- /dev/null
+++ b/web/assets/json/de_overpass.json
@@ -0,0 +1,7 @@
+{
+  "pos_x": -4831.0,
+  "pos_y": 1781.0,
+  "scale": 5.2,
+  "rotate": 0,
+  "zoom": 0.0
+}
\ No newline at end of file
diff --git a/web/assets/json/de_vertigo.json b/web/assets/json/de_vertigo.json
new file mode 100644
index 0000000..9b7c042
--- /dev/null
+++ b/web/assets/json/de_vertigo.json
@@ -0,0 +1,7 @@
+{
+  "pos_x": -3168.0,
+  "pos_y": 1762.0,
+  "scale": 4.0,
+  "rotate": 0,
+  "zoom": 0.0
+}
\ No newline at end of file
diff --git a/web/cs2/map images/cs_italy_radar_psd.png b/web/cs2/map images/cs_italy_radar_psd.png
new file mode 100644
index 0000000..df5151a
Binary files /dev/null and b/web/cs2/map images/cs_italy_radar_psd.png differ
diff --git a/web/cs2/map images/cs_office_radar_psd.png b/web/cs2/map images/cs_office_radar_psd.png
new file mode 100644
index 0000000..33214e6
Binary files /dev/null and b/web/cs2/map images/cs_office_radar_psd.png differ
diff --git a/web/cs2/map images/de_ancient_radar_psd.png b/web/cs2/map images/de_ancient_radar_psd.png
new file mode 100644
index 0000000..f50347d
Binary files /dev/null and b/web/cs2/map images/de_ancient_radar_psd.png differ
diff --git a/web/cs2/map images/de_anubis_radar_psd.png b/web/cs2/map images/de_anubis_radar_psd.png
new file mode 100644
index 0000000..1528ee3
Binary files /dev/null and b/web/cs2/map images/de_anubis_radar_psd.png differ
diff --git a/web/cs2/map images/de_dust2_radar_psd.png b/web/cs2/map images/de_dust2_radar_psd.png
new file mode 100644
index 0000000..9cea0ae
Binary files /dev/null and b/web/cs2/map images/de_dust2_radar_psd.png differ
diff --git a/web/cs2/map images/de_inferno_radar_psd.png b/web/cs2/map images/de_inferno_radar_psd.png
new file mode 100644
index 0000000..6696710
Binary files /dev/null and b/web/cs2/map images/de_inferno_radar_psd.png differ
diff --git a/web/cs2/map images/de_mirage_radar_psd.png b/web/cs2/map images/de_mirage_radar_psd.png
new file mode 100644
index 0000000..5964578
Binary files /dev/null and b/web/cs2/map images/de_mirage_radar_psd.png differ
diff --git a/web/cs2/map images/de_nuke_radar_psd.png b/web/cs2/map images/de_nuke_radar_psd.png
new file mode 100644
index 0000000..b6479e2
Binary files /dev/null and b/web/cs2/map images/de_nuke_radar_psd.png differ
diff --git a/web/cs2/map images/de_overpass_radar_psd.png b/web/cs2/map images/de_overpass_radar_psd.png
new file mode 100644
index 0000000..78ec8c7
Binary files /dev/null and b/web/cs2/map images/de_overpass_radar_psd.png differ
diff --git a/web/cs2/map images/de_vertigo_radar_psd.png b/web/cs2/map images/de_vertigo_radar_psd.png
new file mode 100644
index 0000000..e1559f6
Binary files /dev/null and b/web/cs2/map images/de_vertigo_radar_psd.png differ
diff --git a/web/cs2/map images/default_png.png b/web/cs2/map images/default_png.png
new file mode 100644
index 0000000..3e99566
Binary files /dev/null and b/web/cs2/map images/default_png.png differ
diff --git a/web/cs2/positions/cs_italy.txt b/web/cs2/positions/cs_italy.txt
new file mode 100644
index 0000000..181c0af
--- /dev/null
+++ b/web/cs2/positions/cs_italy.txt
@@ -0,0 +1,31 @@
+// HLTV overview description file for cs_italy.bsp
+
+"cs_italy"
+{
+	"material"	"overviews/cs_italy"	// texture file
+	"pos_x"		"-2647"	// upper left world coordinate
+	"pos_y"		"2592"
+	"scale"		"4.6" 
+	"rotate"	"1"
+	"zoom"		"1.5"
+
+		// loading screen icons and positions
+	"CTSpawn_x"	"0.41"
+	"CTSpawn_y"	"0.91"
+	"TSpawn_x"	"0.6"
+	"TSpawn_y"	"0.1"
+
+	"Hostage1_x"	"0.43"
+	"Hostage1_y"	"0.29"
+	"Hostage2_x"	"0.48"
+	"Hostage2_y"	"0.24"
+	"Hostage3_x"	"0.64"
+	"Hostage3_y"	"0.03"
+	"Hostage4_x"	"0.72"
+	"Hostage4_y"	"0.05"
+//	"Hostage5_x"	"0.8"
+//	"Hostage5_y"	"0.3"
+//	"Hostage6_x"	"0.6"
+//	"Hostage6_y"	"0.9"
+}
+
diff --git a/web/cs2/positions/cs_office.txt b/web/cs2/positions/cs_office.txt
new file mode 100644
index 0000000..7ad08c5
--- /dev/null
+++ b/web/cs2/positions/cs_office.txt
@@ -0,0 +1,29 @@
+// HLTV overview description file for cs_office.bsp
+
+"cs_office"
+{
+	"material"	"overviews/cs_office"	// texture file
+	"pos_x"		"-1838"	// upper left world coordinate
+	"pos_y"		"1858"
+	"scale"		"4.1" 
+
+	// loading screen icons and positions
+	"CTSpawn_x"	"0.16"
+	"CTSpawn_y"	"0.89"
+	"TSpawn_x"	"0.78"
+	"TSpawn_y"	"0.30"
+
+	"Hostage1_x"	"0.84"
+	"Hostage1_y"	"0.27"
+	"Hostage2_x"	"0.84"
+	"Hostage2_y"	"0.48"
+	"Hostage3_x"	"0.91"
+	"Hostage3_y"	"0.48"
+	"Hostage4_x"	"0.77"
+	"Hostage4_y"	"0.48"
+	"Hostage5_x"	"0.77"
+	"Hostage5_y"	"0.55"
+//	"Hostage6_x"	"0.6"
+//	"Hostage6_y"	"0.9"
+}
+
diff --git a/web/cs2/positions/de_ancient.txt b/web/cs2/positions/de_ancient.txt
new file mode 100644
index 0000000..7dd61b5
--- /dev/null
+++ b/web/cs2/positions/de_ancient.txt
@@ -0,0 +1,23 @@
+// HLTV overview description file for de_ancient.bsp
+
+"de_ancient"
+{
+	"material"	"overviews/de_ancient"	// texture file
+	"pos_x"		"-2953"	// upper left world coordinate
+	"pos_y"		"2164"
+	"scale"		"5"
+	"rotate"	"0"
+	"zoom"		"0"
+
+			// loading screen icons and positions
+	"CTSpawn_x"	"0.51"
+	"CTSpawn_y"	"0.17"
+	"TSpawn_x"	"0.485"
+	"TSpawn_y"	"0.87"
+
+	"bombA_x"	"0.31"
+	"bombA_y"	"0.25"
+	"bombB_x"	"0.80"
+	"bombB_y"	"0.40"
+}
+
diff --git a/web/cs2/positions/de_anubis.txt b/web/cs2/positions/de_anubis.txt
new file mode 100644
index 0000000..354ddcc
--- /dev/null
+++ b/web/cs2/positions/de_anubis.txt
@@ -0,0 +1,12 @@
+// TAVR - AUTO RADAR. v 2.5.0a
+"de_anubis"
+{
+	"CTSpawn_x" "0.610000"
+	"CTSpawn_y" "0.220000"
+	"TSpawn_x" "0.580000"
+	"TSpawn_y" "0.930000"
+	"material" "overviews/de_anubis"
+	"pos_x" "-2796.000000"
+	"pos_y" "3328.000000"
+	"scale" "5.220000"
+}
diff --git a/web/cs2/positions/de_dust2.txt b/web/cs2/positions/de_dust2.txt
new file mode 100644
index 0000000..8279cb5
--- /dev/null
+++ b/web/cs2/positions/de_dust2.txt
@@ -0,0 +1,27 @@
+// HLTV overview description file for de_dust2_v2.bsp
+
+"de_dust2"
+{
+	"material"	"overviews/de_dust2_v2"	// texture file
+	"pos_x"		"-2476"	// upper left world coordinate
+	"pos_y"		"3239"
+	"scale"		"4.4" 
+	"rotate"	"1"
+	"zoom"		"1.1"
+	
+	"inset_left"		"0.0"
+	"inset_top"			"0.0"
+	"inset_right"		"0.0"
+	"inset_bottom"		"0.0"
+
+	// loading screen icons and positions
+	"CTSpawn_x"	"0.62"
+	"CTSpawn_y"	"0.21"
+	"TSpawn_x"	"0.39"
+	"TSpawn_y"	"0.91"
+
+	"bombA_x"	"0.80"
+	"bombA_y"	"0.16"
+	"bombB_x"	"0.21"
+	"bombB_y"	"0.12"
+}
diff --git a/web/cs2/positions/de_inferno.txt b/web/cs2/positions/de_inferno.txt
new file mode 100644
index 0000000..3edd3d6
--- /dev/null
+++ b/web/cs2/positions/de_inferno.txt
@@ -0,0 +1,20 @@
+// HLTV overview description file for de_inferno.bsp
+
+"de_inferno"
+{
+	"material"	"overviews/de_inferno"	// texture file
+	"pos_x"		"-2087"	// upper left world coordinate
+	"pos_y"		"3870"
+	"scale"		"4.9" 
+
+	// loading screen icons and positions
+	"CTSpawn_x"	"0.9"
+	"CTSpawn_y"	"0.35"
+	"TSpawn_x"	"0.1"
+	"TSpawn_y"	"0.67"
+
+	"bombA_x"	"0.81"
+	"bombA_y"	"0.69"
+	"bombB_x"	"0.49"
+	"bombB_y"	"0.22"
+}
diff --git a/web/cs2/positions/de_mirage.txt b/web/cs2/positions/de_mirage.txt
new file mode 100644
index 0000000..d503439
--- /dev/null
+++ b/web/cs2/positions/de_mirage.txt
@@ -0,0 +1,25 @@
+"de_mirage"
+{
+	"material"	"overviews/de_mirage"	// texture file
+	"pos_x"		"-3230"	// X coordinate,
+	"pos_y"		"1713"	// Y coordinate,
+	"scale"		"5.00" 	// and used scale used when taking the screenshot
+	"rotate"	"0"	// map was rotated by 90 degress in image editor
+	"zoom"		"0"	// optimal zoom factor if map is shown in full size
+
+	// loading screen icons and positions
+	"CTSpawn_x"	"0.28"
+	"CTSpawn_y"	"0.70"
+	"TSpawn_x"	"0.87"
+	"TSpawn_y"	"0.36"
+
+	"bombA_x"	"0.54"
+	"bombA_y"	"0.76"
+	"bombB_x"	"0.23"
+	"bombB_y"	"0.28"
+	
+	"inset_left"		"0.135"
+	"inset_top"			"0.08"
+	"inset_right"		"0.105"
+	"inset_bottom"		"0.08"
+}
\ No newline at end of file
diff --git a/web/cs2/positions/de_nuke.txt b/web/cs2/positions/de_nuke.txt
new file mode 100644
index 0000000..c00ecc9
--- /dev/null
+++ b/web/cs2/positions/de_nuke.txt
@@ -0,0 +1,41 @@
+// HLTV overview description file for de_nuke.bsp
+
+"de_nuke"
+{
+	"material"	"overviews/de_nuke"	// texture file
+	"pos_x"		"-3453"	// upper left world coordinate
+	"pos_y"		"2887"
+	"scale"		"7" 
+
+	"verticalsections"
+	{
+		"default" // use the primary radar image
+		{
+			"AltitudeMax" "10000"
+			"AltitudeMin" "-495"
+		}
+		"lower" // i.e. de_nuke_lower_radar.dds
+		{
+			"AltitudeMax" "-495"
+			"AltitudeMin" "-10000"
+		}
+	}
+	
+	// loading screen icons and positions
+	"CTSpawn_x"	"0.82"
+	"CTSpawn_y"	"0.45"
+	"TSpawn_x"	"0.19"
+	"TSpawn_y"	"0.54"
+
+	"bombA_x"	"0.58"
+	"bombA_y"	"0.48"
+	"bombB_x"	"0.58"
+	"bombB_y"	"0.58"
+
+	"inset_left"		"0.33"
+	"inset_top"			"0.2"
+	"inset_right"		"0.2"
+	"inset_bottom"		"0.2"
+	
+}
+
diff --git a/web/cs2/positions/de_overpass.txt b/web/cs2/positions/de_overpass.txt
new file mode 100644
index 0000000..3b169b1
--- /dev/null
+++ b/web/cs2/positions/de_overpass.txt
@@ -0,0 +1,22 @@
+// HLTV overview description file for de_overpass.bsp
+
+"de_overpass"
+{
+	"material"	"overviews/de_overpass"	// texture file
+	"pos_x"		"-4831"	// upper left world coordinate
+	"pos_y"		"1781"
+	"scale"		"5.2"
+	"rotate"	"0"
+	"zoom"		"0"
+
+		// loading screen icons and positions
+	"CTSpawn_x"	"0.49"
+	"CTSpawn_y"	"0.2"
+	"TSpawn_x"	"0.66"
+	"TSpawn_y"	"0.93"
+
+	"bombA_x"	"0.55"
+	"bombA_y"	"0.23"
+	"bombB_x"	"0.7"
+	"bombB_y"	"0.31"
+}
\ No newline at end of file
diff --git a/web/cs2/positions/de_vertigo.txt b/web/cs2/positions/de_vertigo.txt
new file mode 100644
index 0000000..901d298
--- /dev/null
+++ b/web/cs2/positions/de_vertigo.txt
@@ -0,0 +1,40 @@
+// HLTV overview description file for de_vertigo.bsp
+
+"de_vertigo"
+{
+	"material"	"overviews/de_vertigo_radar"	// texture file
+	"pos_x"		"-3168"	// upper left world coordinate
+	"pos_y"		"1762"
+	"scale"		"4.0" 
+
+	"verticalsections"
+	{
+		"default" // use the primary radar image
+		{
+			"AltitudeMax" "20000"
+			"AltitudeMin" "11700"
+		}
+		"lower" // i.e. de_nuke_lower_radar.dds
+		{
+			"AltitudeMax" "11700"
+			"AltitudeMin" "-10000"
+		}
+	}
+
+	// loading screen icons and positions
+	"CTSpawn_x"	"0.54"
+	"CTSpawn_y"	"0.25"
+	"TSpawn_x"	"0.20"
+	"TSpawn_y"	"0.75"
+
+	"bombA_x"	"0.705"
+	"bombA_y"	"0.585"
+	"bombB_x"	"0.222"
+	"bombB_y"	"0.223"
+	
+	"inset_left"		"0.1"
+	"inset_top"			"0.1"
+	"inset_right"		"0.2"
+	"inset_bottom"		"0.15"
+	
+}
diff --git a/web/cs2/positions/workshop_preview.txt b/web/cs2/positions/workshop_preview.txt
new file mode 100644
index 0000000..3e0cd2b
--- /dev/null
+++ b/web/cs2/positions/workshop_preview.txt
@@ -0,0 +1,7 @@
+"workshop_preview"
+{
+	"autogenerated_tga"		"1"
+	"pos_x"		"-2071"
+	"pos_y"		"711"
+	"scale"		"1.699219"
+}
diff --git a/web/index.html b/web/index.html
new file mode 100644
index 0000000..bb82358
--- /dev/null
+++ b/web/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>radarflow</title>
+    <link rel="stylesheet" href="styles.css">
+</head>
+<body>
+    <canvas id="canvas"></canvas>
+    <script src="script.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/web/script.js b/web/script.js
new file mode 100644
index 0000000..74c6078
--- /dev/null
+++ b/web/script.js
@@ -0,0 +1,416 @@
+// Colors
+const localColor = "#109856"
+const teamColor = "#68a3e5"
+const enemyColor = "#ec040b"
+const bombColor = "#eda338"
+const textColor = "#d1d1d1"
+
+// Should zoom or not
+shouldZoom = true
+
+// Common
+canvas = null
+ctx = null
+
+// radarflow specific
+image = null
+map = null
+mapName = null
+loaded = false
+entityData = null
+update = false
+
+/// Radarflow zoom in
+zoomSet = false
+safetyBound = 50
+boundingRect = null
+
+// networking
+websocket = null
+if (location.protocol == 'https:') {
+    websocketAddr = `wss://${window.location.host}/ws`
+} else {
+    websocketAddr = `ws://${window.location.host}/ws`
+}
+
+// Util functions
+const clamp = (num, min, max) => Math.min(Math.max(num, min), max);
+const degreesToRadians = (degrees) => degrees * (Math.PI/180);
+function makeBoundingRect(x1, y1, x2, y2, aspectRatio) {
+    const topLeftX = x1;
+    const topLeftY = y1;
+    const bottomRightX = x2;
+    const bottomRightY = y2;
+
+    const width = bottomRightX - topLeftX;
+    const height = bottomRightY - topLeftY;
+
+    let newWidth, newHeight;
+    if (width / height > aspectRatio) {
+        // Wider rectangle
+        newHeight = width / aspectRatio;
+        newWidth = width;
+    } else {
+        // Taller rectangle
+        newWidth = height * aspectRatio;
+        newHeight = height;
+    }
+
+    const centerX = (topLeftX + bottomRightX) / 2;
+    const centerY = (topLeftY + bottomRightY) / 2;
+
+    const rectMinX = centerX - newWidth / 2;
+    const rectMaxX = centerX + newWidth / 2;
+    const rectMinY = centerY - newHeight / 2;
+    const rectMaxY = centerY + newHeight / 2;
+
+    const boundingRectangle = {
+        x: rectMinX,
+        y: rectMinY,
+        width: rectMaxX - rectMinX,
+        height: rectMaxY - rectMinY,
+    }
+
+    const boundingRectangle2 = {
+        x: 0,
+        y: 0,
+        width: image.width / 1.2,
+        height: image.width / 1.2,
+    }
+
+    return boundingRectangle;
+}
+
+function boundingCoordinates(coordinates, boundingRect) {
+    const xScale = boundingRect.width / image.width;
+    const yScale = boundingRect.height / image.height;
+
+    const newX = (coordinates.x - boundingRect.x) / xScale;
+    const newY = (coordinates.y - boundingRect.y) / yScale;
+
+    return {x: newX, y: newY};
+}
+
+function boundingScale(value, boundingRect) {
+    const scale = image.width / boundingRect.width;
+    return value * scale
+}
+
+function mapCoordinates(coordinates) {
+    let offset_x = coordinates.x - map.pos_x;
+    let offset_y = coordinates.y - map.pos_y;
+
+    offset_x /= map.scale;
+    offset_y /= -map.scale;
+
+    return {x: offset_x, y: offset_y}
+}
+
+function render() {
+    if (update) {
+        fillCanvas()
+        if (loaded) {
+            update = false
+
+            // Iterate through the array and update the min/max values
+            if (entityData != null && map != null && image != null && shouldZoom) {
+
+                let minX = Infinity
+                let minY = Infinity
+                let maxX = -Infinity
+                let maxY = -Infinity
+
+                entityData.forEach((data) => {
+                    let mapCords = null
+
+                    if (data.Bomb !== undefined) {
+                        mapCords = mapCoordinates(data.Bomb.pos)
+                    } else {
+                        mapCords = mapCoordinates(data.Player.pos)
+                    }
+    
+                    minX = Math.min(minX, mapCords.x);
+                    minY = Math.min(minY, mapCords.y);
+                    maxX = Math.max(maxX, mapCords.x);
+                    maxY = Math.max(maxY, mapCords.y);
+                });
+
+
+                boundingRect = makeBoundingRect(minX-safetyBound, minY-safetyBound, maxX+safetyBound, maxY+safetyBound, image.width/image.height)
+
+                zoomSet = true
+            } else if (zoomSet) {
+                zoomSet = false
+            }
+
+            drawImage()
+
+            if (entityData != null) {
+                entityData.forEach((data) => {
+                    if (data.Bomb !== undefined) {
+                        drawBomb(data.Bomb.pos, data.Bomb.isPlanted)
+                    } else {
+                        let fillStyle = localColor
+
+                        switch (data.Player.playerType) {
+                            case "Team":
+                                fillStyle = teamColor
+                                break;
+
+                            case "Enemy":
+                                fillStyle = enemyColor
+                                break;
+                        }
+
+                        drawEntity(
+                            data.Player.pos,
+                            fillStyle, 
+                            data.Player.isDormant,
+                            data.Player.hasBomb,
+                            data.Player.yaw
+                        )
+                    }
+                });
+            }
+        } else {
+            if (websocket != null) {
+                ctx.font = "100px Arial";
+                ctx.textAlign = "center"
+                ctx.textBaseline = "middle"
+                ctx.fillStyle = textColor
+                ctx.fillText("Not on a server", 1024/2, 1024/2); 
+            } else {
+                ctx.font = "100px Arial";
+                ctx.textAlign = "center"
+                ctx.fillStyle = textColor
+                ctx.fillText("Disconnected", 1024/2, 1024/2); 
+            }
+        }
+    }
+
+    if (websocket != null) {
+        websocket.send("requestInfo");
+    }
+}
+
+function fillCanvas() {
+    ctx.fillStyle = "#0f0f0f";
+    ctx.fillRect(0, 0, canvas.width, canvas.height);
+}
+
+function drawImage() {
+    if (image == null || canvas == null)
+        return
+
+    if (zoomSet != false && boundingRect.x != null) {
+        ctx.drawImage(image, boundingRect.x, boundingRect.y, boundingRect.width, boundingRect.height, 0, 0, canvas.width, canvas.height)
+    } else {
+        ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height)
+    }
+}
+
+function drawBomb(pos, planted) {
+    if (map == null)
+        return
+
+    if (zoomSet) {
+        pos = boundingCoordinates(mapCoordinates(pos), boundingRect)
+        size = boundingScale(5, boundingRect);
+    } else {
+        pos = mapCoordinates(pos)
+        size = 5
+    }
+
+    ctx.beginPath();
+    ctx.arc(pos.x, pos.y, size, 0, 2 * Math.PI);
+    ctx.fillStyle = bombColor;
+    ctx.fill();
+    ctx.closePath();
+
+    if (planted && ((new Date().getTime() / 1000) % 1) > 0.5) {
+        ctx.strokeStyle = enemyColor
+        ctx.lineWidth = 1;
+        ctx.stroke()
+    }
+}
+
+function drawEntity(pos, fillStyle, dormant, hasBomb, yaw) {
+    if (map == null)
+        return
+
+    if (zoomSet) {
+        pos = boundingCoordinates(mapCoordinates(pos), boundingRect)
+        circleRadius = boundingScale(7, boundingRect);
+        distance = circleRadius + boundingScale(2, boundingRect);
+        radius = distance + boundingScale(2, boundingRect)
+        arrowWidth = 35
+    } else {
+        pos = mapCoordinates(pos)
+        circleRadius = 7
+        distance = circleRadius + 2
+        radius = distance + 5;
+        arrowWidth = 35;
+    }
+
+    if (dormant) {
+        ctx.font = "20px Arial";
+        ctx.textAlign = "center"
+        ctx.fillStyle = fillStyle
+        ctx.fillText("?", pos.x, pos.y); 
+    } else {
+
+        // Draw circle
+        ctx.beginPath();
+        ctx.arc(pos.x, pos.y, circleRadius, 0, 2 * Math.PI);
+        ctx.fillStyle = fillStyle;
+        ctx.fill();
+
+        if (hasBomb) {
+            ctx.beginPath();
+            ctx.arc(pos.x, pos.y, circleRadius / 2, 0, 2 * Math.PI);
+            ctx.fillStyle = "#dbb81d";
+            ctx.fill();
+        }
+
+
+        ctx.closePath();
+
+        // Calculate arrowhead points
+
+
+        const arrowHeadX = pos.x + radius * Math.cos(yaw * (Math.PI / 180))
+        const arrowHeadY = pos.y - radius * Math.sin(yaw * (Math.PI / 180))
+
+        const arrowCornerX1 = pos.x + distance * Math.cos((yaw - arrowWidth) * (Math.PI / 180))
+        const arrowCornerY1 = pos.y - distance * Math.sin((yaw - arrowWidth) * (Math.PI / 180))
+
+        const arrowCornerX2 = pos.x + distance * Math.cos((yaw + arrowWidth) * (Math.PI / 180))
+        const arrowCornerY2 = pos.y - distance * Math.sin((yaw + arrowWidth) * (Math.PI / 180))
+
+
+        const cicleYaw = 90-yaw
+        const startAngle = degreesToRadians(cicleYaw-arrowWidth)-Math.PI/2
+        const endAngle = degreesToRadians(cicleYaw+arrowWidth)-Math.PI/2
+
+        // Draw arrow
+
+        /// Backside of the arrow
+        ctx.beginPath();
+        ctx.arc(pos.x, pos.y, distance, startAngle, endAngle)
+
+        /// Draw from corners to arrowhead
+        ctx.lineTo(arrowCornerX1, arrowCornerY1);
+        ctx.lineTo(arrowHeadX, arrowHeadY);
+        ctx.lineTo(arrowCornerX2, arrowCornerY2);
+        ctx.closePath()
+
+        ctx.fillStyle = 'white'
+        ctx.fill();
+    }
+}
+
+function loadMap(mapName) {
+    console.log(`[radarflow] loading map ${mapName}`)
+    loaded = true;
+    const map_img = new Image();
+    map_img.src = `assets/image/${mapName}_radar_psd.png`;
+
+    fetch(`assets/json/${mapName}.json`)
+        .then(response => response.json())
+        .then(data => {
+            map = data;
+        })
+        .catch(error => {
+            console.error('Error loading JSON file:', error);
+        });
+
+    map_img.onload = () => {
+        image = map_img;
+        update = true;
+    };
+}
+
+function unloadMap() {
+    console.log("[radarflow] unloading map")
+    ctx.clearRect(0, 0, canvas.width, canvas.height)
+    map = null
+    mapName = null
+    loaded = false,
+    update = true
+    requestAnimationFrame(render);
+}
+
+function connect() {
+    if (websocket == null) {
+        let socket = new WebSocket(websocketAddr)
+
+        socket.onopen = () => {
+            console.log("[radarflow] Connection established")
+            websocket.send("requestInfo");
+        };
+        
+        socket.onmessage = (event) => {
+            if (event.data == "error") {
+                console.log("[radarflow] Server had an unknown error")
+            } else {
+                let data = JSON.parse(event.data);
+
+                if (data.ingame == false) {
+                    mapName = null
+                    entityData = null
+
+                    if (loaded)
+                        unloadMap()
+                } else {
+                    if (!loaded) {
+                        mapName = data.mapName
+                        entityData = data.entityData
+                        loadMap(mapName)
+                    } else {
+                        entityData = data.entityData
+                    }
+                }
+
+                update = true
+                requestAnimationFrame(render);
+            }
+        };
+        
+        socket.onclose = (event) => {
+            if (event.wasClean) {
+                console.log("[radarflow] connection closed");
+            } else {
+                console.log("[radarflow] connection died");
+            }
+
+            playerData = null
+            websocket = null
+            unloadMap()
+
+            setTimeout(function() {
+                connect();
+            }, 1000);
+        };
+    
+        socket.onerror = (error) => {
+            console.log(`[radarflow] websocket error: ${error}`);
+        };
+
+        websocket = socket;
+    } else {
+        setTimeout(() => {
+            connect();
+        }, 1000);
+    }
+}
+
+addEventListener("DOMContentLoaded", (e) => {
+    canvas = document.getElementById('canvas');
+    canvas.width = 1024;
+    canvas.height = 1024;
+    canvasAspectRatio = canvas.width / canvas.height
+    ctx = canvas.getContext('2d');
+
+    console.log(`[radarflow] connecting to ${websocketAddr}`)
+    connect()
+});
diff --git a/web/styles.css b/web/styles.css
new file mode 100644
index 0000000..8695ad3
--- /dev/null
+++ b/web/styles.css
@@ -0,0 +1,17 @@
+body {
+    margin: 0;
+    overflow: hidden;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    height: 100vh;
+    background-color: #000000; /* Change the background color as needed */
+}
+
+canvas {
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+    display: block;
+    object-fit: contain;
+}
\ No newline at end of file