commit 75ed7336e46ec2ca86b35babb529bb8bb289ffd4 Author: Djkato Date: Thu Sep 8 20:33:18 2022 +0200 first commit diff --git a/.drp_config b/.drp_config new file mode 100644 index 0000000..e727b95 --- /dev/null +++ b/.drp_config @@ -0,0 +1,11 @@ +SHOULD_EXCLUDE_BE_ANONYMOUS:{ +n +} + +PORTFOLIO_LINK:{ +HAHA NOT REAL LINK +} + +EXCLUDE_CHARACTERS_LIST:{ +no_drp +} \ No newline at end of file diff --git a/.github/workflows/github-buid.yml b/.github/workflows/github-buid.yml new file mode 100644 index 0000000..51e280c --- /dev/null +++ b/.github/workflows/github-buid.yml @@ -0,0 +1,64 @@ +on: [push, pull_request] + +name: Continuous integration + +jobs: + check: + name: Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + - uses: actions-rs/cargo@v1 + with: + command: check + + test: + name: Test Suite + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + - uses: actions-rs/cargo@v1 + with: + command: test + + fmt: + name: Rustfmt + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + - run: rustup component add rustfmt + - uses: actions-rs/cargo@v1 + with: + command: fmt + args: --all -- --check + + clippy: + name: Clippy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + - run: rustup component add clippy + - uses: actions-rs/cargo@v1 + with: + command: clippy + args: -- -D warnings \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c41cc9e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..19f076b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "discord.enabled": false, + "rust-analyzer.files.excludeDirs": [".drp_config"] +} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..8aa0e86 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1018 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "DRP_Creative" +version = "0.1.1" +dependencies = [ + "discord-rich-presence", + "regex", + "tray-item", + "windows", + "windres", +] + +[[package]] +name = "aho-corasick" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9a8f622bcf6ff3df478e9deba3e03e4e04b300f8e6a139e192c05fa3490afc7" + +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "cairo-rs" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +dependencies = [ + "bitflags", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "cfg-expr" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cocoa" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +dependencies = [ + "bitflags", + "block", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "concat-string" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7439becb5fafc780b6f4de382b1a7a3e70234afe783854a4702ee8adbb838609" + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags", + "core-foundation", + "foreign-types", + "libc", +] + +[[package]] +name = "discord-rich-presence" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2674059dce979a6b73b3675cc4993c0530c69edbddc5ac14e7f550b415bab021" +dependencies = [ + "serde", + "serde_derive", + "serde_json", + "uuid", +] + +[[package]] +name = "field-offset" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-winsdk" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8cbf17b871570c1f8612b763bac3e86290602bcf5dc3c5ce657e0e1e9071d9e" +dependencies = [ + "serde", + "serde_derive", + "winreg", +] + +[[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 = "futures-channel" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" + +[[package]] +name = "futures-executor" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" + +[[package]] +name = "futures-task" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" + +[[package]] +name = "futures-util" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gdk" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +dependencies = [ + "bitflags", + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gio" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +dependencies = [ + "bitflags", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a68131a662b04931e71891fb14aaf65ee4b44d08e8abc10f49e77418c86c64" +dependencies = [ + "anyhow", + "heck", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "glib-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "gobject-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +dependencies = [ + "atk", + "bitflags", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24f518afe90c23fba585b2d7697856f9e6a7bbc62f65588035e66f6afb01a2e9" +dependencies = [ + "anyhow", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + +[[package]] +name = "itoa" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" + +[[package]] +name = "libappindicator" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2d3cb96d092b4824cb306c9e544c856a4cb6210c1081945187f7f1924b47e8" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b3b6681973cea8cc3bce7391e6d7d5502720b80a581c9a95c9cbaf592826aa" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" + +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "once_cell" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0" + +[[package]] +name = "padlock" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c10569378a1dacd9f30dbe7ae49e054d2c45dc2f8ee49899903e09c3924e8b6f" + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +dependencies = [ + "bitflags", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "pest" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0560d531d1febc25a3c9398a62a71256c0178f2e3443baedd9ad4bb8c9deb4" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[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.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "proc-macro-crate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" +dependencies = [ + "once_cell", + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" + +[[package]] +name = "serde_derive" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "slab" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" + +[[package]] +name = "syn" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-deps" +version = "6.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a45a1c4c9015217e12347f2a411b57ce2c4fc543913b14b6fe40483328e709" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "thiserror" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1b05ca9d106ba7d2e31a9dab4a64e7be2cce415321966ea3132c49a656e252" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8f2591983642de85c921015f3f070c665a197ed69e417af436115e3a1407487" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "tray-item" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76863575f7842ed64fda361f417a787efa82811b4617267709066969cd4ccf3b" +dependencies = [ + "cocoa", + "core-graphics", + "gtk", + "libappindicator", + "libc", + "objc", + "objc-foundation", + "objc_id", + "padlock", + "winapi", +] + +[[package]] +name = "ucd-trie" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" + +[[package]] +name = "unicode-ident" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "version-compare" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + +[[package]] +name = "windres" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82115619221b2b66001a39088b8059d171b1f9005a00d6a10c6e8a71a30a4cdc" +dependencies = [ + "concat-string", + "find-winsdk", +] + +[[package]] +name = "winreg" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a27a759395c1195c4cc5cda607ef6f8f6498f64e78f7900f5de0a127a424704a" +dependencies = [ + "serde", + "winapi", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..829f752 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "DRP_Creative" +version = "0.1.1" +edition = "2021" +author = "https://djkato.net" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +discord-rich-presence = "0.2.2" +regex = "1.6.0" +tray-item = "0.7.0" +[dependencies.windows] +version = "0.39.0" +features = [ + "Data_Xml_Dom", + "Win32_Foundation", + "Win32_Security", + "Win32_System_Threading", + "Win32_UI_WindowsAndMessaging", +] +[build-dependencies] +windres = "*" \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9d78bc5 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# Discord Rich Presence for Creative Apps +### Show your friends what you're working on, be it in Adobe Suite, Autodesk Suite, Cinema 4D or many more! +This app runs in the background and looks for processes, then parses the windows title and turns it into a project name to display with Discords Rich Presence. + + +##how to install: +1. Grab the latest version from the [Releases](https://github.com) page, then make a folder in `C:/Program Files/` and call it whatever, for example `DRP Creative`. +2. Put and extract the downloaded zip inside. +3. Do `[WindowsButton] + R`, type `Shell:StartUp`, hit enter. A folder will open. +4. Put the shortcut file of `DRC Creative.vbs` from the extracted zip inside this folder(Now the app will start on pc start) +5. If you want to run it now, double click the shortcut +6. Enjoy! + +##How to use: + +When it's running, you'll notice a new icon appear on your Taskbar. If you want to exclude the **currently open project** from showing up, click on the icon and click on `Don't show current project`. +![text](https://i.imgur.com/nADffGB.png) +If you want to revert these settings, you can go to the folder you put the exe in (example was `C:/Program Files/DRP Creative`) + +###Currently supported programs: +**Full support:** +- Cinema 4D +- Adobe After Effects +- Autodesk Maya + +**Partial support:** *(meaning it shows up on Discord, but doesn't display the project name)* +- Davinci Resolve +- Illustrator +- Photoshop +- Isotropix Clarisse +- Marvelous Designer +- Calvary +- Ableton +- FL Studio +- Autodesk 3Ds Max +- Adobe Premiere Pro diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..ca3e909 --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +use windres::Build; + +fn main() { + Build::new().compile("./icon/tray-icon.rc").unwrap(); +} diff --git a/icon/icon.ai b/icon/icon.ai new file mode 100644 index 0000000..9ab6e2c --- /dev/null +++ b/icon/icon.ai @@ -0,0 +1,335 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[18 0 R 19 0 R 20 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + Adobe Illustrator 26.0 (Windows) + 2022-09-08T15:39:44+02:00 + 2022-09-08T15:39:46+02:00 + 2022-09-08T15:39:46+02:00 + + + + 256 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FVK4u7W2XlPKsY7cjQn5DvlWXPDGLmQGUYSlyCUXPm6wjqIEec+P2F+87/hmozdu4o/SDL7 B+Pg5cNFI89krn83ai9REkcQ7bcj952/DNZl7dzS+kCP2/j5ORHRQHPdAy63q0v2rpx/qnh/xGmY U+0dRLnM/Db7m8aeA6IV7m4f7crt82J/XmNLNM8yT8WwQA6KeVsnYqqJc3CfYldfkxH6ssjmmORI +LEwB6IqLW9Wi+zdOf8AWPP/AIlXMmHaOojymfjv97WdPA9EdB5u1FKCVI5R324n7xt+GZuLt3NH 6gJfZ+Pk0S0UDy2TS283WElBOjwHx+2v3jf8M2eHt3FL6gY/aPx8HHnopDlum9vd2tyvKCVZB34m pHzHbNvizwyC4EFxJQlHmFXLWLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVQWoaxY2I /fSVk7RLux+jt9OYWq1+LAPUd+4c27FglPkxu+81X09VtwLePxG7n6T/AAzndT23lntD0D7XYY9H Ec90mkkkkcvIxdz1ZiST9JzTSmZGybLlgAcluBLsVdirsVWmWIdXUfMjI8QWnCWI9HU/IjHiC0uy SuxV2KuxVdHJJG4eNijjoykgj6RhjMxNg0UEA805sfNV9BRbgC4j8Ts4+kdfpzc6btvLDafrH2uJ k0cTy2ZJp+sWN8P3MlJO8TbMPo7/AEZ0Wl1+LOPSd+483X5cEoc0bma0uxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxVZPPDBE0szhI16scryZYwjxSNBlGJkaDFtU81TS1isqxR9DKftn5fy5zGt7blL04 vSO/r+x2OHRgby3SBmZmLMSWO5J3JzQkkmy5wDWKWmdEUs7BVHUk0GAkDmqDfVYKlYFadx2QbfST lB1A/h9TLg71hm1WXoscC+55t+G2N5T3RX0hr6ncv/e3ch8QlEH4Y+DI85H7l4x0DX6LtDu4aQ/5 TH+GP5aHXdfEK4aZY/76H3n+uH8vDuR4hcdMsf8AfQ+8/wBcfy8O5fEK39F2g+wGT/VY/wAcH5aH TZPiFv6ncp/c3cg8A9HH44+DIcpH714x1DYm1WLqsc6+x4N+O2N5R3SX0lemqwVCzq0Dns42+gjE agfxeleDuRiujqGRgynoQajLwQeTFvCrasysGUkMNwRsRiCQbCCE/wBL81TRUivayx9BKPtj5/zZ vtF23KPpy+od/X9rg5tGDvHZlME8M8SywuHjbowzp8eWM48UTYddKJiaK/LGLsVdirsVdirsVdir sVdirsVdiqD1PVbbT4ecpq7f3cQ+0x/p75h6zWwwRuXPoO9tw4TM7MK1HVLq/l5zN8I+xGPsrnG6 vW5M8rkdu7oHcYsMYCghMxG1a7oilnYKo6k7DASBuVQLahNOStlHVehnfZfoHU5j+LKX0D4s+EDm 0unq7c7qRp38Dso+SjCMAO8jxI4+5FKqqOKgKo6AbDLwAOTBvFDsVdirsVdirsVdirsVaZVYcWAZ T1B3GJAPNKFbT1RudrI0D+A3U/NTlBwAbxPCz4+9tdQmgIW9jovQTpuv0jqMHiyj9Y+KeEHkjkdH UMjBlPQjcZkAg7hguwqi9O1S6sJecLfCftxn7LZl6TW5MEridu7oWrLhjMUWa6ZqttqEPOI0df7y I/aU/wBPfOy0ethnjcefUdzp82EwO6MzManYq7FXYq7FXYq7FXYq7FUv1jWIdOhBI5zv/dx/xPtm v1+vjp498jyDfgwHIfJhFzdT3UzTTsXkbqT+oe2cVmzSySMpGyXcQgIigpZWzQ13fRwERqDJO32Y l6/T4DKcmUR25lkI2hltJZ2Et63MjdYR9hf65AYjI3P5dFM65IsAAUAoB0GZDBvFDsVdirsVdirs VdirsVdirsVdirsVaIBFCKg9RilCNaSwMZbJuBO7Qn7Df0zHOIxNw+XRmJ3zRNpfRzkxsDHOv2om 6/R4jJ48oltyKmNInLmKrbXU9rMs0DFJF6EfqPtlmHNLHISiaIYTgJCizfR9Yh1GEkDhOn95H/Ee 2droNfHUR7pDmHT58BxnyTDNg0OxV2KuxV2KuxV2KoPVdTh0+2Mr/E52ij7s39PHMPW6yOCHEefQ d7bhwmZpgl1czXU7TzNykc1J/gPbOGzZpZJGUjZLuoQERQUsrZoK6vXMhtrWjT/tv+yg9/fMfJlJ PDHn9zIR6l1taRwAmpeVt3kbqTk8eIR97GUrV8sYuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xVQubSOcA1KSr9iReoyvJiEveyjKnWt64kFtdUWf9h/2XHt75DHlIPDLn97Ix6hG5kMVW1uZrWdZ 4W4yIag/wPtlmHNLHISiaIYTgJCizvStTh1C2EqfC42lj7q39PDO50WsjnhxDn1Hc6XNhMDSMzMa nYq7FXYq7FVk88UELzStxjQVY5XlyRhEylyDKMTI0GA6pqMt/dNM+y9I0/lXOF1urlnyGR5dPIO7 w4hCNBCZiNqCvbqQv9Vtj+/YfG/ZF8fnmPlyEnhjz+5lEdSut7eOCPgnzZj1J8TlmPGIigxlK1XJ sXYqh7nULK1/v5lQ/wAtat9w3yMpgc0gEpXN5pgLcLWB5nOy12qfYCpOVnN0Atnwd6tDa+eNQ3t7 E26HozqI9v8Anqf1DL4aXUT5Rr7PvYHJjHMt6l5O82W+nTX1zdh/RXm0EbuWoDuaABfhG+WZezM0 YGZPLoxjqIE0ERpF+L2ySU/3i/DKP8of165j45cQZyFFG5Ni7FXYq7FUDrF+LKyeQH963wRD/KPf 6MhklwhlEWVDTfJvmyfTob62u1T1l5rBJI4bifsmlGXcb5k4uzM0oCQI36MJaiANFqa188afvcWJ uEHVkUSbf88j+sZVPS6iHON/b9zIZMZ5FRh80wBuF1A8LjZqb0PuDQjKBm6EUz4O5NLbULK6/uJl c/y1o33HfLIzB5MCCERkkOxVSuLeOePg/wA1YdQfEZDJjEhRZRlS2yupA/1W5P79R8D9nXx+eV4s hB4Zc/vZSHUI3Mhii9L1GWwulmTdekifzLmXotXLBkEhy6+Yas2ITjRZ9BPFPCk0Tco3FVOd1iyR nESjyLpJRMTRX5YxdirsVdirE/NWqerN9SiP7uI1lI7v4f7HOU7b1vFLwo8o8/f+x2ejw0OI9WP5 oXPQ19dmCMLGOU8h4xL7+PyGU5cnCNuZZRFqdpbCCM1PKVzykfxOHFj4R5sZStXyxiluqa5b2LCP iZZyKhBsBXpU5XPIIs4xtZaaR5x1ujJH9RtG/wB2PWMEe3V2+jbL8Oiz5enDHz2/awllhHzZBpn5 ZaTBR9Qle8k6lR+7jr9B5H/gs2mHsXHHeZ4j8g489XI8tmUWOlabYrxs7aOAdyigE/M9Tm0x4IQ+ kAONKZPMorLWLmVWUqwBUihB3BBxIV5dceVvM+n6teQ6RbNJaO9YpDx48Tuoq5G61oc5XL2dmjkI gLj0dlHPAxFndVXyv5+l+2yRV23eMU/4AHCOzdSe4fEI/MY1QeSPOzmjX0Se/quP+Ipkh2TqD1Hz /Yj8zDucfJHnZDRb6Jvf1XP/ABJMT2TqB1Hz/Yv5mHcpt5X8/wAX2GSWnYPGa/8ABgZE9m6kdx+I T+YxqVt5V8zahq9pFq9s0dojVlkBXjxG7CqEirUpgxdnZpZAMgqPVMs8BE8J3eoqqqoVQAoFABsA BnVAOtdiqFvtK02+XjeW0c47F1BI+R6jKsmCE/qALKMyORYvqf5ZaTPV9Plezk6hT+8jr9J5D/gs 1ebsXHLeB4T8w5MNXIc92P3ekecdEqzx/XrRf92JWQAe/R1+nbNXm0WfF04o+W/7XIjlhLyX6Xrd vfsY+JinAqUO4PyOUQyCTOUaTLLGChd2wnjFDxlQ8o38DleXHxDzZRlSpY3ZnjKyDjPGeMq+/j8j gxZOIb8wykKROXMWQeVdU9Kb6lKf3cprET2fw/2Wb7sTW8MvClyly9/7XA1mGxxDoyzOrdY7FXYq gtY1AWNjJN/uw/DEPFj0+7rmFr9UMGIy68h727Bi45UwFmZmLMasTUk9yc4Mkk2XdgLHdURnY0VR Un2GAmhZSl9orTyteyihfaFT+yn9uY+IGR4z8Pcyma2RmZDWh768js7V536KPhXxY9BglKhaQLV/ y+0B7maTX79eTuxForDavRpKe32VzY9kaS/3svh+tp1WWvSGfZ0DguxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxVgH5g6C9tNH5gsF4shAuwo2r0V6e/2Wzn+19JR8WPx/W52ly36So2N5HeWqTp0 YfEvgw6jNdGVi24ikRhQg7tWglW9iFSm0yj9pP7Mx8oMTxj4+5sgb2TBHV0V1NVYVB9jmQDYsMV6 sysGU0YGoI7EYQSDYQQz7R9QF9Yxzf7sHwyjwYdfv653mg1Qz4hLryPvdJnxcEqRuZrS7FWHear7 174W6n93bih93O5+7pnIdt6njy8A5Q+922jx1G+9JM0rmJfqDGeaOyU/CfjnI/lHQfScxsvqkIfN nHYWiQAAANgOgzIa28UJI9tL5g8wQ6VCSLeIkzuOwX7bfR9ke+RxYTnyiA5dWUpcEbeq28ENvBHB CoSKJQkaDoFUUAzsIxEQAOQdWTZtfkkOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVZcQQ3EE kEyh4pVKSIehVhQjIyiJAg8ikGjbylbeXy/5gm0qck28prA57g/Yb6fsn3zj8uE4MpgeXR2kZccb TzJMWiAQQdweoxShtPYwTSWTH4R8cBP8p6j6DmPi9MjD5NktxaYZksE78q33oXxt2P7u4FB7ONx9 /TN12JqeDLwHlP73D1mO433Mxzr3UqV3cLbWss7dI1LU8SOg+nKs+UY4GZ6BlCPFIB51JI8kjSOa u5LMfEk1OeeTkZEk8y78ChSx2VEZ2NFUEk+wyJNC0pfp6s6yXT/bnao9lGyjKMAsGR/iZT7kXl7W gtYvvqdi8oP7xvgi/wBY/wBOuQySoMoiynv5daH9S0k38y/6TfUcE9REPsj/AGX2vuze9kabgx8Z +qX3OHqslyruZbm2cZ2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KsS/MXQ/ruki+hX/S bGrkjqYj9sf7H7X35qe19Nx4+Mc4/c5OlyVKu9ItHvheWKSE/vF+CX/WHf6euaLHKw5khRRuTYoT UFZFjuk+3A1T7qdmGUZxQEh/C2Q7kwRldFdTVWAIPscvBsWxXxyPHIsiGjoQynwINRkoSMSCOYQR Yp6LaXC3NrFOvSRQ1PAnqPoz0PBlGSAmOodBOPDIhKPN1z6dgkAO877/AOqm5/Gmajt3Nw4hH+cf sH4Dl6KFyvuYfnJO1QWqufQWBTR52CD5dScx9QduH+cyh3qyqFUKuyqKAewy8ChTBvFCSPatrnma 20ta/V4jWcjso+KQ/d8I98GLF42YQ6dWUpcESXq6qqKFUBVUUVRsABnYAU6pvCrsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVaZVdSrAMrCjKdwQcBFq8oW1bQ/M9zpjV+rymsBPcH4oz9x4 /POPzYvBzGHTo7WMuOIKd4WLTKGUq26sKEexxIsUlR0pz6DQMavAxQ/LqDlGnO3D/NZz70bmQxZh 5RufUsHgJ3gfb/VfcfjXOt7CzcWIx/mn7D+C6rWwqV96V+bp+eopEDtFGNvdtz+FM1nbuXizCP8A NH3/AIDkaKNQvvSPNK5qXzH1dVUfswRk/wCyfb9WY53y/wBUMuUUVl7WpXdwtvbSzt0jUtTxPYYJ GhaQET+WOmN6F3q8wrLcMYo2P8oPJz9Lfqzadi4NjkPXZx9XPcRZzm9cN2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KsG/M/TW9C01aEUlt29KRh14seSH/AGLfrzRdtYfSMg6bfj8d XM0k9zFC2dwtzaxTr0kUGnge4+g5q4mxbkEUrYUIWE+lqrD9meMH/ZJt+rKBtl/rBs5xTDMhinnl GfhqLxE7Sxnb3XcfhXN12Fl4cxj/ADh934Lha2NwvuQOty+rq103g5X/AID4f4Zhdoz4tRM+dfLZ v04qAQOYTcl1n8dzdzeMnAH2QUzHw7ykfP7mU+QCLy9rSTzTcFbSK2Tdp36DuF7feRlOY7U2QD0v RNOXTtItLIdYYwHp3c7ufpYnOv02Hw8cY9wdXklxSJRuXsHYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYqgtb05dR0i7sj1mjISvZxuh+hgMo1OHxMco94Z45cMgXmfla4ZraW2fZoWq AeoDdvvBzkMJ2p2kwnmXNaEvPgubSbwk4E+zimUZtpRPn97ZDkQmOZDFHaJL6WrWreLhf+D+H+OZ vZ0+HUQPnXz2adQLgULcvzuJX/mdj95rmNmlcye8lsgKAU8rZJbpe9oH/nZm/GmY+m+i+9lk5ozL 2tKbWD9JedrK2O8duVd/D92PVP37DDpcfiaiI7v0bpyHhxkvU8691bsVdirsVdiqTeZ/M9poVoHc erdS1Fvbg05U6knsozC1utjgjZ3keQbcOEzPkwOW/wDOOsn15bxrSBt0jjZolp2oq7n/AGRzncmq z5dzKh5bOeMcI9Fqf4v04+taahJNx3MRdnB/2D1U5GGfPDeMj+PekxhLmGY+UvOUWs1tLpRBqUYN YxUK4HUrXoR3XN9oO0Rm9Mtp/e4WfBwbjkybNm47sVdirsVYz5t85RaMBaWqCfUpACsZqVQHoWp1 J7Lms1/aIw+mO8/ucjBg49zyYfIPN+on1rvUZIeW4iDsgH+wSijNDPNnnvKR/Huc0RhHkG477zjo 59aK8a7gXd43ZpRTvVX3H+xOSx6rPi3ErHnug44S6M78seZ7TXbQug9K6ip69uTUivRge6nOi0Wt jnjY2kOYcDNhMD5J1ma1OxV2KuxV2KvK7uD9G+d7y3ApHcMzp4UkHqinyO2chqsfh6iQ7/07u0xn ixgpvgQg9U2tC/8AIyt+NMo1P0X3NmPmmWZDFUtn4XET/wArqfuNcswyqYPcQxmLBU8rZLZTSJz4 KT+GRlyUIHTB/oMXyP6zlWn+gJyc0VlzBQ/LiH6zrup6gdwi8FP/ABleo/BMzexoXklLuH3/ANjX qzUQHomdG4DsVdirsVdiryeWc695our2U87a3bjCp3HFSRGPpoWzjtRl8bMZHkOTtYR4IAJ3hYux VIdcjksLy21e0+CaOQciO7DcE/OlDlUiYSE48wzG4ovVbG6S7soLqP7E8ayKPZwD/HOyxzE4iQ6h 1UhRpWyaHYqo3l1HaWk91J/dwRtI3yQEn9WQyTEImR6BMRZp5VoaS6he3Or3Z5zSOeJPZjuSPkKA ZxsZGcjOXMu1IoUE+y1g7FUkjnOg+Z7W+h+C2nbjMo2HFiBIPxDfPBgy+DmEhy6spx44EPWM7F1T sVdirsVdirzr8yIvq2u6bqA2Drxb/nk9T+D5zfbUKyRl3j7v7XP0huJCIzDbELqY/wBBl+Q/WMp1 H0Fnj5o6I1iQ+Kg/hlseSCuySuxVbKKxOPFSPwyMuShA6Yf9Bi+R/Wcq0/0BOTmqXcnpWk0vdEZh 9AJy2RoMQj/ystwmjXU9N5bgr9CItPxY5t+xIVjJ75ONrD6gGaZunEdirsVdiq2QMY3CbMQeJ96b YDyUPJPKVBHcr0cMtR9BzicHV282QZe1uxVKvMzKNKYHqzqF+da/qyrN9LOHNnnlNXXy1pofr6CE V8CKj8M6rQgjDC+512b6ym2ZbU7FUp82K7eWtSCdfQcn5AVP4Zia8HwJ13NuH6wwPyyVOlKB1DsG +da/qzlcP0uxnzTXLWDsVY/5toUtUAq7M3EfcMoz9GyD1uMMI1DGrAAMfE0zthydQV2FXYq7FXYq wv8ANO356Naz94p+P0OjV/FRml7bheMHuLl6M+ohAWcnq2cEn88asfpAzURNhySp6maWMvyH6xlW o+gssfNHRCkSDwUD8MtjyQV2SVUuU4XEqfyuw+40yzNGpkdxLGBsBTytklul7WgQ9Y2ZfxrmPpvo ruZZOa3W34aVcnxWn/BED+OWZPpLGPNlH5excPKtq3eRpXP/ACMZf+Nc6HsmNaced/e4OpPrLI82 TQ7FXYq7FXYq8r1q1fy75olZlIsL0l427AMakf7BvwzktbhOHMf5st/x7nZ4p8cPMJsrK6hlIZTu CNwRkEt4oSG6SXXtYt9JszyjDVlkG4A/ab5KMhDGc2QQizMuCNl6xDDHDCkMY4xxqERfBVFAM7KM QBQ5B1JNr8KuxVZPDHPDJDIOUcqlHHirChyMoiQIPIpBp5ParJoWsXOk3h4xl6xSHYH+Vvkwzjp4 zhyGEnag8cbCfZNg0zqilnIVVFSx2AGKUq0O1fzD5pikVSbCxIkdj0IU1A/2bfhk9DhObMP5sd0Z pcEPMvU8611jsVdirsVdirG/zDi5+Vbpv99tE3/JRV/42zW9rRvAfKvvcjTH1hjGhvz0q2PgtP8A gSR/DOex/SHNlzXapvaFP9+Mq/jXK9T9Fd7LHzTLMhiqWyc7iJP5nUfeaZZhjcwO8hjM0Citbi9L VrpfFy3/AAfxfxzJ7Rhw6iY87+e7XpzcAgcwm5LrP4Lm7i8JOYHs4rmPh2lIef3sp8gUP5jNNImH iUH/AAwOTzfSiHNm3ktOHlfTxWv7sn/gmJ/jnT9nCsEfc67P9ZTrM1qdirsVdirsVQOs6LYavZta 3icl6o42dG/mU5RqNNDNHhkzx5DE2GBz+SPNmmuV0uZbu3J+FeSqfpWT4R9Bzn8nZWaB9HqH473O jqYHnssj8peeNQIju2W0gP2izpuPlFyJ+RyMOzNRPaXpH47knUYxy3Zr5c8r6foVuVgrJcSAetcs Pib2Hgvtm90eihgG256lwsuYzO6cZmNTsVdirsVSfzH5X0/XbcLP+7uIwfRuVHxL7H+ZfbMPWaKG cb7HoW3FmMDswqTyl5308mO0ZbuAfZKumw+UvEj6M0U+zNRD6fUPx3uaNRjPPZfB5I826k6rqcy2 tuD8S8lY09lj+E/Sclj7KzzPr9I/HciWpgOW7PNG0Ww0izW1s04r1dzu7t/MxzoNPpoYY8MXByZD I2Udl7B2KuxV2KuxVJfOic/K+oCtKRg/8CwP8Mwu0ReCXubcH1hhPlwk6RCPAuB/wROcxh+l2M+a IvPjubSHxk5keyCuQzbyiPP7kw5EpjmQxR2iRerq1qvg4b/gPi/hmb2dDi1EB538t2nUGoFHeboO GopKBtLGN/ddj+FMze3cXDmEv5w+78Bo0UrhXckeaVzUvmHpaqp/ZnjI/wBkm/6sxztl/rBlzihf Mn/HJl+af8SGTzfSiHNnPk//AJRjTv8AjEP1nOo7P/uI+512f6ynGZjU7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUn84f8oxqP8AxiP6xmH2h/cS9zbg+sMG8t/8cmL5v/xI 5y+H6XYz5oqEerqrN+zBGB/sn3/VkBvl/qhPKKYZkMU88owc9ReUjaKM7+7bD8K5uuwsXFmMv5o+ /wDBcLWyqFd6aebrb1LBJwN4H3/1X2P40zZ9u4eLEJfzT9h/AcfRTqVd7D85J2qC1VD6CzqKvAwc fLoRmPqBtxfzWUO5BeYCr6NK6mo+Bh8iw/rkshuFojzZt5Jfn5W087bIV2/yXYfwzp+zTeCPudfq PrKd5nNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSTzs/DytqB23QLv/ AJTqP45hdpGsEvc3af6wwny+QmjROxoPjY+wDH+mcvjNQt2EuaN0lD6DTsPjnYufl0AyOnG3F3pn zpG5kMWYeUbb07B5yN532/1U2H41zrewsPDiMv5x+wfguq1s7lXcm93brc2ssDdJFK18Ceh+jNvn xDJAwPUOJCXDIF51JG8cjRuKOhKsPAg0OeeTiYkg8w78Gxax1V0ZGFVYEEexyJFikpJNFLJpl3Y0 LTQiigdWFeS5i474TDqGcudpz5A80adFYQ6Ldt9XuYmcRGTZX5uW417NVuhze9la6AgMUtiHD1OE 3xBnWb1w3Yq7FXYqgNcg1afTpI9KnS3u26SOCdu4B/ZPvQ/xzH1MckoEYzUmeMxB9XJgMXmzzh5d mFtq0JuIgaD161I/yJhXl9Nc0I12o054cgsef6/7XNOHHPeLJdM/MXy9eUWd2spT1EoqtfZ1qPvp myw9r4Z8/SfNx56WY5bsjt7q1uYxJbTJNGejxsGH3iubKE4yFxNhoII5quSQ7FXYq7FXYq7FVK4u rW2jMlzMkMY6vIwUfeaZGc4xFyNBIBPJjmp/mL5es6rA7Xso6CIUWvu7UH3VzW5u18MOXqPk3w0s zz2Y1L5s84eYpjbaTCbeImh9CtQP8uY04/RTNaddqNQeHGKHl+v+xyBhxw3kz7Q4NWg06OPVJ0uL tftSICNuwYn7R96D+Ob/AE0ckYAZDcnCyGJPp5I/L2DsVdirsVYL5/8ANGnSWE2i2rfWLmVkErR7 qnBw3Gvdqr0GaLtXWwMDijuS5mmwm+IpNDFLHplpYkFZptmB6qteTZosl8Ih1LmR52naKqIqKKKo AA9hmUBQpgvjjeSRY0FXchVHiSaDJQiZEAcygmhb0W0t1trWKBekaha+JHU/TnoeDEMcBAdA6Ccu KRKrlrFh3mqx9C+Fwo/d3AqfZxsfv65yHbem4MvGOU/vdto8lxruSTNK5iX6gpgmjvVHwj4JwP5T 0P0HMbL6ZCfzZx3FKGpaNaX68/sTEfDKvf8A1h3yyeMSYiRDtK82a75edbbUUN5p4+FHrVlH+Q5/ 4i34Zl6btLJh9M/VFqyYIz3GxZ9pGvaXq8Pq2M4kIFXiO0i/6ynf+GdDp9Vjyi4n9bgzxyjzTDMh g7FXYqp3Ftb3MTQ3ESTRN9qORQyn6DkZwEhRFhIJHJ5b550bRbLVLez0qNlupRymiDFkXkaJStSC d+/TOW7UwYscxGHPq7LTzlIWVEeWZoSJLS8eKUDcio39mUg5iDEY7xNFs475hFRX3nyz2hvjOo/n ZZK/TKK5kR1ephylf2/e1nHjPREp5287QiklnFN4kxsT/wAk2GXjtbUDmAfh+1gdNA9VUfmL5iX+ 80pfaiyr+uuWDtnL1iPtR+Uj3uP5i+Ym/u9KX3qsrfqpie2cvSI+1fyke9Sfzt52mFI7OKHwIjYH /koxys9rag8gB8P2pGmgOqGlvvPl5tNfGBT/ACMsdPpiFcolq9TPnKvs+5mMeMdEKfLM0xMl3ePL KRsTU7+7MScxziMt5Gy2cdcgreRdG0W+1O4tNUjZ7qIcoYi3FG4mj1AoSRt36Zl9l6fFkmYz59Gr UTlEWHqVvbW9tEsNvEkMS/ZjjUKo+gZ1MICIoCg64knmqZJDsVdiqA1fXdL0mH1b6cRkiqRDd2/1 V65j6jVY8QuRZwxylyYBqvm3XfMLva6ahs7A7O9aMw/y3H/EV/HOe1PaWTN6YemLnY8EYbncu03R bSwXmf3k1Pilbt/q+GYkMYi2mRKvp6meaS9YfCfggB/lHU/ScrxeqRn8mUthSYZksE78q2Bnvjcs P3duKj3c7D7uubrsTTceXjPKH3uHrMlRrvZjnXupdiqC1jTxfWMkP+7B8UR8GHT7+mYWv0oz4jHr zHvbsGXglbAWVlYqwowNCD2IzgyCDRd2CsdFdGRhVWFCPY4CLFFKX2jNBK1lKalN4WP7Sf2Zj4iY ngPw9zKYvdFSRpIhSRQ6NsVIqDmQQwSa48vPFMLnS5mtp13UBiKH/JYbjKvDMTcTRZcV7FMtN/MH V9OdbfXLYzoNhOgCyU/4g/4ZscHa84bZBfn1/a0T0oO8WaaT5j0bVVH1O5V5CKmFvhkH+xO/3Zu8 Gsx5fpPw6uJPFKPMJlmS1oLWdVttK06a+uD8MQ+FO7MfsqPmcp1GeOKBkejPHAyNB5no0dxf30+s 3nxSzMTH4VOxI9gPhGcjGRnIzlzLsyABQTzLGDsVdirsVdirsVdirsVSPWY7iwvoNas/hlhYGTwq NgT7EfCcrMjjkJx5hmAJDhL03R9Vt9V06G+tz8Eo+Je6sNmU/I512nzjLASHV1k4GJoozLmCW6r5 j0bSlP126RJAKiFfikP+wG+Y2fV48X1H9bZDFKXIMM1H8wtX1Bzb6HbGFOhncBpPn/In01zSZ+2J z2xivPr+py4aUDeSWW/l55Zjc6pM1zOxqwLE1P8AlMdzmu8MyNyNlv4q2CcxxpGgSNQiLsFAoBlo DFC3bNPKtlEaF95mH7Kf25j5jxHgHx9zOArdMERURUUUVRQD2GZAFCgxXqrMwVRViaADuThAJNBB LPtH09bGxjh/3YfilPix6/d0zvdBpRgxCPXmfe6TPl45WjczGl2KuxVifmrS/Sm+uxD93KaSgdn8 f9lnKdt6Lhl4seUufv8A2uz0eaxwnox/NC56GvrQzxhozxnjPKJvfw+RynLj4htzDKJpTtLkTxmo 4yoeMieBw4snEPNjKNK+WMVskUcqFJEDoeqsKj8cSLSlF15YtHPO1dreQGoputf1j78pOEdNmQmq 22tedtIoBJ9et1/Zk/e7fPaT8cysWu1GLrxDz3/awlhhLyQ+qa1qXmq9gt5Y/q1tbjlLGpJHLuxq BuegHbIarWT1JAIoBOPEMYTqKNIo1jjHFEACgdgMAFKuxQ7FXYq7FXYq7FXYq7FVssaSxtHIOSOC GB7g4kWlJdL1rUvKt7PbxRfWre4FYo2JALDowoDuOhHfDpdZPTEgCwVyYhkCIuda87avUGT6jbt+ zH+62+e8n45PLrtRl68I8tv2ojhhHzUrXyxaI3qXTtcSHc12Wp/E/fmKMI67szNN44o4kCRoEQdF UUH4ZcBTFdihQu7kQRig5SueMaeJyvLk4R5soxtUsbQwRlpDynkPKV/fw+QwYsfCN+Z5pkbROXIZ B5V0v1Zvrso/dxGkQPd/H/Y5vuxNFxS8WXKPL3/scDWZqHCOrLM6t1jsVdirsVWTwRTwvDKvKNxR hleXHGcTGXIsoyMTYYDqmnS2F00L7r1jf+Zc4XW6SWDIYnl08w7vDlE42EJmI2oK9tZA/wBath+/ UfGnZ18PnmPlxkHijz+9lE9Cut7iOePmnyZT1B8DlmPIJCwxlGlXJsXYq7FXUFa98UuxQ7FXYq7F XYq7FXYq7FXYq7FXUFa98UuxQ7FXYqpXFxHBHzf5Ko6k+AyGTIIiyyjG1tlayF/rVyP37D4E7Ivh 88rxYyTxS5/cykegRuZDFF6Xp0t/dLCmy9ZH/lXMvRaSWfIIjl18g1ZsohGyz6CCKCFIYl4xxjio 9hnd4scYREY8g6SUjI2V+TYuxV2KuxV2KoPVdMh1C2MT/C43ik7q39PHMPW6OOeHCefQ9zbhzGBt gl1bTWs7QTLxkQ0I/iPbOGzYZY5GMhRDuoTEhYUsrZoK6snEhubWiz/tp+y49/fMfJiIPFHn97IS 6F1tdxzgihSVftxt1GTx5RL3sZRpXyxi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVC5u44A BQvK32I16nK8mUR97KMbda2TmT6zdUaf9hP2UHt75DHiJPFLn9zIy6BG5kMVW1tprqdYIV5SOaAf xPtlmHDLJIRiLJYTmIiyzvStMh0+2ESfE53lk7s39PDO50Wjjghwjn1Pe6XNmMzaMzManYq7FXYq 7FXYq7FUv1jR4dRhAJ4Tp/dyfwPtmv1+gjqI90hyLfgznGfJhFzaz2szQzqUkXqD+se2cVmwyxyM ZCiHcQmJCwpZWzQ13YxzkSKTHOv2ZV6/T4jKcmIS35FkJUhlu5YGEV6vAnZZh9hv6ZAZTE1P59FM L5IsEEVBqD0OZDBvFDsVdirsVdirsVdirsVdirsVdirsVaJAFSaAdTilCNdyzsYrJeZGzTH7C/1z HOUyNQ+fRmIVzRNpYxwEyMTJO32pW6/R4DJ48QjvzKmVonLmKrbWs91MsMCl5G6AfrPtlmHDLJIR iLJYTmIiyzfR9Hh06EgHnO/95J/Ae2droNBHTx75HmXT585yHyTDNg0OxV2KuxV2KuxV2KuxV2Ko PU9KttQh4Sijr/dyj7Sn+ntmHrNFDPGpc+h7m3DmMDswrUdLurCXhMvwn7Eg+y2cbq9FkwSqQ27+ hdxizRmLCEzEbVrojqVdQynqDuMBAOxVAtp80BLWUlF6mB91+g9RmP4Uo/Qfgz4gebQ1AIwS6jaB /E7qfkwwjOBtIcKODuRSsrDkpDKehG4y8EHkwbxQ7FXYq7FXYq7FXYq7FWmZVHJiFUdSdhiSBzSh TqAdilrG07+I2UfNjlBzg7RHEz4O9tdPmnIa9kqvUQJsv0nqcHhSl9Z+CeIDkjkREUKihVHQDYZk AAbBguwqi9O0u6v5eEK/CPtyH7K5l6TRZM8qiNu/oGrLmjAWWa6ZpVtp8PCIVdv7yU/aY/09s7LR 6KGCNR59T3unzZjM7ozMxqdirsVdirsVdirsVdirsVdirsVWTwQzxNFMgeNuqnK8mKM48MhYZRkY mwxbVPKs0VZbKssfUxH7Y+X82cxrexJR9WL1Du6/tdjh1gO0tkgZWVirAhhsQdiM0JBBoucC1ilp kR1KuoZT1BFRgIB5qg30mCpaBmgfxQ7fSDlB04/h2ZcZ6rDDqsX2WjnX3HBvw2xrKO6S+ktfXLlP 760kHiUo4/DHxpDnE/evAOha/SloPtlo/wDWU/wx/Mw67L4ZXDU7E/7tH3H+mH8xDvR4ZcdTsf8A fo+4/wBMfzEO9fDK39KWh+wWf/VU/wAcH5mHTdPhlv65cv8A3NpIfAvRB+OPjSPKJ+5eAdS2IdVl 6tHAvsObfjtjWU90V9IXppUFQ07NO47udvoAxGnH8XqXj7kYqIihUUKo6ACgy8ADkxbwq2qszBVB LHYAbk4gEmgglP8AS/Ks0tJb2sUfURD7Z+f8ub7RdiSl6svpHd1/Y4ObWAbR3ZTBBDBEsUKBI16K M6fHijCPDEUHXSkZGyvyxi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUFqGj2N8P30dJO0q7MPp7/ AE5harQYs49Q37xzbsWeUOTG77yrfQVa3IuI/AbOPoPX6M53U9iZYbw9Y+12GPWRPPZJpI5I3KSK UcdVYEEfQc00oGJoii5YIPJbgS7FXYq7FVpijPVFPzAyPCFtwijHRFHyAx4QtrskrsVdirsVXRxy SOEjUu56KoJJ+gYYwMjQFlBIHNObHyrfT0a4It4/A7ufoHT6c3Om7Eyz3n6B9riZNZEct2Safo9j Yr+5jrJ3lbdj9Pb6M6PS6DFgHpG/eebr8ueU+aNzMaXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYqpXFpa3K8Z4lkHbkKkfI9sqy4IZBUwCyjOUeRSi58o2ElTA7wHw+2v3Hf8c1GbsLFL6S Y/aPx8XLhrZDnulc/lHUUqYnjlHbfifuO345rMvYWaP0kS+z8fNyI62B57IGXRNWi+1auf8AVHP/ AIjXMKfZ2ojzgfhv9zeNRA9UK9tcJ9uJ1+akfrzGlhmOYI+DYJg9VPK2TsVVEtrh/sRO3yUn9WWR wzPIE/BiZgdUVFomrS/ZtXH+sOH/ABKmZMOztRLlA/Hb72s6iA6o6DyjqL0MrxxDvvyP3Db8czcX YWaX1ER+38fNolrYDlumlt5RsI6Gd3nPh9hfuG/45s8PYWKP1Ey+wfj4uPPWyPLZN7e0tbZeMESx jvxFCfme+bfFghjFQADiSnKXMquWsXYq7FXYq7FXYq7FXYq7FXYq/wD/2Q== + + + + 1 + False + False + + 127.139999 + 127.140000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + application/pdf + + + icon + + + Document + AIRobin + xmp.did:dbd43066-6861-b249-a0b3-55c3a07cb872 + uuid:f5f74141-96b1-4b03-b2b9-af0003c8bd17 + xmp.did:dbd43066-6861-b249-a0b3-55c3a07cb872 + proof:pdf + + + + + saved + xmp.iid:dbd43066-6861-b249-a0b3-55c3a07cb872 + 2022-09-07T15:03:02+02:00 + Adobe Illustrator 26.0 (Windows) + / + + + + Adobe PDF library 16.03 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 5 0 obj <>/Resources<>/Properties<>>>/Thumb 24 0 R/TrimBox[0.0 0.0 127.14 127.14]/Type/Page>> endobj 22 0 obj <>stream +HlK7 E絊@LAЈA;9=7~/~8j? y/>>}Dexzhu]IqofWl\iWXSqk.q*fejk.l[ftm[ϛ'9OM:p)􉸲-yu-+Bp%[}3%\RY{ߺ!Z-J\xawc ZEA7.u:Y[-Z0.;~>G+' |uIGULKRs%yd2S*Rjo2Jm򋍮B2=4 `<EJ_EX:ЩҬ8={2of9uqrԦ\Q%BmvJZ% DDxA0XȑnLB#RRhtY:,tyV$u9g'i<7.ˌ,M%ػ2h~ 3KR|Z-i:HؔY:nmn^mJ6ĭ mu:l]J6i +@(Fp)Èbc*k=עK- +X[GuT9nqqiT&R;Y] +,Z+KeOKg +4& U2jU<-qZ>stream +8;UT4b7260$q&Y7M.)QGG6,V'?Di@3:[?(md3HIu&cg*?;:c8tFRRKfS;h[d)L&^@ +H!Rd3BUkTIfk-M@NJG_B1a26X2Z%>l6&CRI?Jq:[8*]lq:(08f!9Rpu-i~> +endstream endobj 25 0 obj [/Indexed/DeviceRGB 255 26 0 R] endobj 26 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 31 0 obj [/View/Design] endobj 32 0 obj <>>> endobj 29 0 obj [/View/Design] endobj 30 0 obj <>>> endobj 27 0 obj [/View/Design] endobj 28 0 obj <>>> endobj 23 0 obj <> endobj 7 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 24.0 +%%AI8_CreatorVersion: 26.0.1 +%%For: (djkato) () +%%Title: (icon.ai) +%%CreationDate: 9/8/2022 3:39 PM +%%Canvassize: 16383 +%%BoundingBox: 0 -16 128 112 +%%HiResBoundingBox: 0.000450852372524 -15.3897739634631 127.139999389648 111.749774573814 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 14.0 +%AI12_BuildNumber: 731 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Registration]) +%AI3_Cropmarks: 0 -15.3899996948239 127.139999389648 111.750000305175 +%AI3_TemplateBox: 64.5 47.8600006103516 64.5 47.8600006103516 +%AI3_TileBox: -242.430000305176 -347.819999694824 369.569999694824 444.180000305176 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI24_LargeCanvasScale: 1 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 3 +%AI17_Begin_Content_if_version_gt:24 4 +%AI10_OpenToVie: -72.9310344827591 140.601379920697 7.25 0 8183.65517241379 8190.41379310345 1887 1314 18 0 0 46 121 0 0 0 1 1 0 1 1 0 1 +%AI17_Alternate_Content +%AI9_OpenToView: -72.9310344827591 140.601379920697 7.25 1887 1314 18 0 0 46 121 0 0 0 1 1 0 1 1 0 1 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 772 +%AI17_Begin_Content_if_version_gt:24 4 +%AI17_Alternate_Content +%AI17_End_Versioned_Content +%%PageOrigin:-895 -492.639999389648 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 16 0 obj <>stream +%AI24_ZStandard_Data(/XE3 -DĔٰGh&AmH0 RnqIоk:  +9swuA݂2 Hxt IT,䄬nX0|* +wV[0ĭ(iCnФ[YQNQ +xՉ:&'dj䄿JH"JIY=^5Y'GiAIn=QM]*EB%|,əҫ25"6Z(ly[0$Ff7Dӣ&PR f~Si&z(uL@_F2 !IR'}lI-ǒ8s;#h3ReUa$:90`Z +%y_ }$_+Dx݋tE"Iqn8 " A"M# dNɺ=)E8rēv#H3(uB$)8: +@ӆDEʰD jDO +c(58DξHif+mZ\6\ Fmv־u39Z$EL‘5m"Emsi5&UU#k0@Hz5mԤu dFHi#MfsapZ+EX؉ Դ#@I_%-|hV|Qic($}v8ųER@Z4W84X%)4}XiiI[IsQ c6*]",)ch-BFm UZ`[&H[$x _Y-V- Ф6ڋ#,Fm\ԴBI( v3i-p Yʲ6|!m";y0 +CZj1YFEm\$i}/1);dǽWIBQGK섴9̰&@9r S#xkRihrehm\'ϛi" ݙ hKT6i3YrV*:q˯րa%gV f“)z+dtێ~YWu-Xy W^[ٽ߷6i50xД+'xL1O"]8ID&BCr\r_\/;4Nl)sQ~[k4K2dO4Zȹ',662STo7& P'if$iyf)~FQTd`u 9d?s lq*e i-.s\岥]W_5y[;YB1E2MU1匱`"s$9QY2j~h0V >E:g iJp–8ʐv3Պ,5dg )XgspbjD׵֪9ݘiZȐzk5k9nJf#KIHb,4=D*gـLŌy0DYhX,eت^4ai;ZI~Bae[0f. ipŁ@78,I1Es k7?;;9um+k3ZP-9r&6Fnn,!D k~% /L-~.# R2 O,݂aD^5"/_9[ +s!4!U}R%/: 7a$! L /PT; e_^@,ƒ /"[Gx sD4Rԏ݂ADoe"(zŅPІ,$ih&i<pvAx \hLDaE2HDqv"Ӓ A/2/g(X(6!a'K RmG"b;ғ#}$LθTfDRj*ُr$(VWje@[QUR ZY_F3# .PipfQz(!`x(Dh0u('@4X^i)Ґie+YIet Fyj)3}5ǁ5u2+*jʁUʁUʁ5dM`T~T QUR#X-|ɊX`|0XP": Jr +۠9@! +̶T)UJ%< +VXHkV4'L[0*O433dL"-KfA%І +śD$yZ T+.'U-2@&B`C0 PX`l"$܍ DM +sϒ>po!SwP.!oyAaFE +Yهb3t ;#B$pVD!ifb /rr,K݂Q)k@0p# x"/䘩6vrcnl(fJ6r^"W*+ + V;l,nDZ> A@*-/(0|8t)ˁUX|܁=-!>}!yR`$0Y$Fuȫr&2D (G3M0r`/ "E2`w`#l4BhH>jˌdˀcM+ WF/ G,RmlGVQ>R VBUұef5 +z0f+Pa$E&B=^UVAPLvSx(Mz53K$|yT./^@u4!9*MpL>3czj$N]u ˺ -$fa}bWl}V/VJDWUCZ`C,UDx_U݇7A:P| + +Ț &WYWo JŒN(W`P8 W%^"8贠`xT"IHV֏Fc]b1N݂AX+ $82 @3 _ +$ǹО(Pq$|Dm'j L#ʛ* t-Pq  >SGplzsPywQ9 j*1#%lDʙ[^B>TPdL1Lzb CFA>_˹m/D41[ɂNBx@A?^uI +,*B%(a#Wm"yg!_O9xxՊw_lBom Siy  &A|"8 +ZF`qb}/"ݺypF0WI3Qi4Lŋ`ZdtceIۺx!_%Uųu  e! +ɾ L|c[0f - IC+ ǂ`4j`0<8YKV ^\J"b9k8RG gR FƔe`t Fɂ)@ +u u F`4!L#8t 첚S6c+f$f#}^M{-$ma @Dg[0LȦ2p86v6bdL#o.S;]Dž9iv@i(clI+crnH07O|L&h>MER- ù +%30 ; t FH 2 % Y~x HhYQzl L„idSQ$Es=L瓰dIXm< '4N- lA<:CII8B[^lHf%X"c}꙰PnDMrPzFPŖ5neCA#s=)@ [0=ZlXg[0:RsWeT LLӭ 0 +I `rD;,Afr-rd_` +29N`D(49w>f8HD4 N` fTS(LAOx '#2@He”Y+Zɚɏ$}.^R +4(XJ#(< +Sq}Pq|p rؖg+ +\39WiDXKTpWv ]dPS:PS5xU2jM\|ƈ #\Q Gua @L., @[x\4c FDdeR'Wל^n3\c;|[t/\_`x1֍ox/5mr]תsVs_n޸^Lu~:}u[wz~7ViΖk?בּoջ_zo[j/}i-/8~cޫǝ[|m^k:kv˷v㻩_[1ousy>wy^u-׿km\m3+YR9k[9/_5K1tm3kjfk/ks1^ƿm篙_{]Sw_{ι[uZk{ys7cnrz}noݯ[9}^c{[kK99϶j՜xssgzv̹ﯵ;oiܮX[+ݖӶ֚9ǘLV?j?ns+͖۶ߺ/sx[Zs]Sk9]s_s1͹V[Nssb1q6{oZ;_3]n\ӊ9{?ߌΫfr_Or]o1l) hc}l}W[ߛ{}[N/kui~_vL_s?V_nʿ^\uޘ]a]oUc^}9}c{m}}qۋyYӋ7f|-Zkklg~ͼgK-箭k^͖_Sfl_{w3{ZoϹ-Z}n⚷7ʹ{~kwҼ{m3zg9ׯMvo1sZgL/v7c5S9]=w9ζkVӾ9[s>}Uw?r\z_\iWmmg?&Pq5혻VnۯUo+{~}[f~_9=?oߕo׸w)μjyr)-[-Ϻۜmtcݗb;X~q=ͭqb1W_QÛ߻xN7ZW^cio]?uKmƜ[OmqƏugi͜oxu)ǜΚs}7kg1gn릙s{bzk5w}5n {n+mS~{[4okmƶΗڿ+ν1՘?:wlsi͵7kyv߯5ט`Ը׹?m{9s}^0` nm=sm3}8|W-Ŝ֝8^[-Řc]1_kuJ5n9}c_g,Ϛg^yyӛ3vw}) sqŘsZ-g7Ǹjlm֛r^y97ӷk<_xo}yZus\Jr˼VuLXc+S\y[mT?V^Ns/Ym;X{Sf}/^j]{_o^lx[kϜju}^oνޝs9wwNr\۽|չ{s߿g{~q6c7Tc׫+9ͷ{5WozZݱ[Ϲ7תto8w{sn罫]i߿36w{{s۹r׬mqU޹y{[~skY_yߚuW}e7uu[LnZ[|?sVoz+yc7߹Vw]_oyS W9=5[9}i\ڿr^+k9]ӝ q:gZsU~u7sXۜնrcx|ܾ\wl-͜V뽳S9[-1tw9tsjn۪寧y^L7k/[if<[95/Ӌ[-Ŝەۯת?S[oow12mϽ\v`p8W{ִr[LtsVwϙoWms]1{?󝯥rfl-uj+r_08Zsj\;Ŗ{׽Moob?ϵsn)Nk+N+}~}K+b~{ގ8õm sX$92fi $鴧K8.PBJ02"ñ@,H + (*sV P6Rp !W$22.kq6yZ.|i;J"2OץJ1MPxvcEM\V2!DkUyG2>4vqP!I%`?M#_c& 5`҄Ό)5+A*#k6`IkKk$>ŭ |$oB& jSo-2"!2nNn䁥ã)DF7h~_!(f֮ƾ0E'O2JXsRX +Mzǀ`ylLOtqc~b{dږx{1HHm؎72#J2u` P;ayPPu)HpG>˗%x(@Gz`ӈ;J-e\ ,b +(Ӧ0d +R>AK [/LԀYY*\a+@Ƅ8hFƥgQFĨLi̩X?!'v¢| +:[uD .2zBySKQf6PnX7v֨ؠwN@r^daQg>+Y3gOG;c)zDY( | kQd}4 +&*pN80E+2#^cc6 k"qٝN#C5BLoġIItX&DLL/< 9}ݵw +I-pw1X qfZFU H8*SFM%o裱 P" `)?71NtX.peh"! LA}, f!bڭtJNt{9T2ܹ]ɃTUt[S 4`bF_2UvN= +wZKZ☷lYEYL]{^Jt̤vFl4RB5<7HלZZ^x +1AuZ7̾~iށ?[^v3֫oߌT=$:xcCv{t GtqwI~RC p(IO\з|usO6$m|'8ԈTĂ`xpO7"F^Mʧ彊|S)8Q|ZWč+|%3i-\kx2k㘶msB8 e*E !Q=Ĺ9Q?D +1 P S!/z!ɟIH8'B<.3!_^0ޤlV"|͉qק2 jh&_mm1ZK)x^hQZmXs \ne<XN$[ ^,'5Q1r|+]<ӗ^ 7qOޏk%N>RHwj{|_B6waemViCW=#DuZZa$bQ_ 8bFFQu07YB /zB1\w OkTK?d\l̽] KPuR  ۚ6.t +-M2r>lhC9rpbbQf:GL#UoE[E+Эtq PbY> #[q4s"!MA4v06fc8:ːIph)C/ W-QY`SK2BX&BcG"&_q%,zhт88ı;_#u /\-U` -H9 +7WڶcP^z , f+Z%_pO#IKTH!Z`)Y4Y3}Ce`[<QȾJQj>G|>LZ-o`@_U6 _ڤz2+M2PY/@h8#At DpnR]rrPjSzfS]\Ѥ2򽠁$DKz"Glj<BIy{(DuvN1~U'[?-8ԉP} +|XKF&8t:H{]0p3pnRbH"\@*Y|el fDB\*NMhBͨSArE{}/}ŁАUDz1+1bQWLazlp;3JGem,xF XN7X٦ǰyġGg!Ylɿ,Xqq}޶AXh~6RZ/>@uP`\q!ҁnǙ^A lD6=\=W#DLR z}1*cx:NeB~ sy 8,,"%6B)AaupQ^40}ӴЪJ!0'zղg"LG`ppvټ- 6.+Bp!zZޚq!(!_`xBBQt ̗!TqO iR vRxP0M0¥pl UMaՅ%rEZo]TO`#Ch7A#Iw쮛Xppkڃx:dW6hT.(< Mz]0AqBj[2Pp<FW6hdP܋tCN=_KE~=  l`$uo?-I/ꚣUbj&60wƔitW8 5XVj +Fv#5TyA3Ř53cn. 2 +쫌h+{q 9XNށ@٩@"r%k bnj(o6 /sfƍ:nA% ܝCT0A͞*Rt+j4kTXjL xA;~m5* $h|6Ԓ# -[Ncl}Yp:^\i DJu>Qt=3T";"~m`\b#uU$O!#&}wb/u8at+?1IbDX衑U"3c 4w0#ۓ"臽˛~5fUۡ읻tBtqBQң*آI!͠xr3]-Hs>C+Obŷ~y풀=rq@ d/2;*==Su&^5)4,1lJ8@MH|\BTy;Mћȱ .XOܢ(L 611X# [a=BO/ #L\~ư,L\_g>sf¿GO98C?I}GEЄ4Ul1Upä5Sy2ؑe`AQϖ[6ؘXbYq+8*]'J[*| +&V6ɜJ}$$Gami|(gn<k裲ClҎ4Z:AoĦ}rT}ArܤMD3 u-(?1_)ФjK q'S0GGC>g!AWĖ cAo o8jJ4ZKnQY*Pصyc}{vBk3tc JU721Dž$4*YT0OC"o f@C9VīK4T|D̬w6@` "jsB!sZ`JHf*,[hʦ*3d$3 +0'E-3% OSy#eɝsxfٰb85mTkbw4 ) hh.Y#`ifcv&k!Ym}i9[=ÄHu<ӊ:`sz<&t{8M>O$s KrPlFZz  /ǍO ȼ%x|ʴsA+,t3ӻ&UJ3kvElKtc]p*ESGH̶1rh9 FbG%UEks,R 8 ,N]8\&t+&U5TkhQs֏&E:7PR2m옔Vd"Tq:[IQj؏;?Ie+\1L5I<:IeTp2뱩VRZX| ^k~N;sTVVhDR7!/4A t J і>Dq5C03$/I WJ|ʯ٦~i3'v^ͪ +2Ə꥘ȶ Ys!Fe곥Y-,KUɰ(VCb?CEH3ZтM&q Tş[T;_eJ +L=RjE 1iYQtBVsR ƚ-Pi7Ey_eP.# <vyK][qlNU2Z.fEJ?)8nUܐ۞tݚ+o; +B\V0Xpw;\ c.OG^'tGa(S7b ClR!_.ԳnسnlO9֨w#5nDZ.!j~™ʨ$w3/y |h8{ LiבfpB{)r)t#%fj|^l0ZAbg0B v8_{PJV<$J#EX*Fbo\?ټX%ANDoCCB |(ℷ? QLDe,E!Q"S󷱶1F"C,#Dɹ`maI [ ,dh1ZRXBDЊ-{18$K!GP%!#$D=7!r.YJ7b2-ZOQ:Īv; 1փfBs[>X/,|"sp=ѰmE? y +3A8IB%f')J(ZSJŨ&l =9;NWaZ19mZfz}0VJbwBF |m(aoB vdY=bB-/ښ\4K(8eno_+Y#'fmI)O¨“Tj浸0ʪ*pm*,9/ 9/q B֧`F42iJ { ͆$`l$)>ڞ]7Y&X^ 4,8 +):(*hԞ:`@!5fNk9?7-C*`pij!-yZU)<$'2k8jF@<ք\pBxf?t7645  s LJ ߗmjla(jD竟akR` +Fzk8<3a% 8RS=+)jpA'v57AN9RgpOQÍTG>XCH\|F%ϣBdOa;`t9/ jcxE4вN\wH*b[]kMьP`Pt9FߥRwp{Fhm_-C?e@q%J4@D,퐔 ` }ɭwY6d&ot`S03ZD&G0`R%CN0(Z3RYU-cP7p&+{uY#>ZIދGx3'Śy^i-I jG^J)q)#` o65g&U]I-^py"r͛|jCKBy`odCK$f-@b|M9Z%l0dʣH9]T'WVs?Z= +=2˛JL2IenyO..O[Qwy~J(egEg; '>gQE < *>0?yQRh2LKцCZHxjQ|~2 O5;~ ʦӳb\K,C.6Cd%L$ϩlM:qYf[\ u3Pa'+^j8]QKe|B;*lƀMarH Q +r2 6038RSd[WgUM.S]<:4q_[g@ӱ'+pb0I74,%%)2R +h5PNĐ0aKrq;`oXu|fW8v>cLzXKMh&aP'֫ .YqåbIɘFޤoX5φ/ mPs)Aȩ*|]ߩ]a<*m]lhɖ9A|9EQS͇I>%i ^DPĉ7J2з8 (ې_KΥ֦M(P Q5-/1'2NUԬ뾎55UtɈ2C(I &c7j4vZQVW8rZu.FGx9d~28.HX%Х04O}G[|l_5R䴙$@\RyI*Ig4ЩE;׽/NUC]M4/_v!.-cɞ[ZknEoMۙIG V%9nc(*I\;I})|%TǎX]:Qʒ@Oƒv,5KjBH,)8ZD%W'jJo{7F;GtxR[yɒFJkܣI$RpG~霥 +gltrSͮw:7 ydr[EWyrk׷9Gk|׮ԟ!W<-ח677umOKm#ֶc$>8c^ȇ >D19•B +~% @t!T 'Z2p?+-<:8zkA 5˥_6FVڷ..:Ro2%ə6Z ×avրJc@|Kh;dy;mX4J E$E b[p6Oea֑62_*f+Ȋ4NT!Eg%uo:ڐܥ3%o QV_jUFdS! \n;>ORFJ#f<>T4GAK{?}5^̖ej^x{b`-l|8큪2[18YQdV4[NEv7;3.ڴ7=:jAeC&)(b,'i*rNV|3aW'iLgh5g5w7I#Sl 3#O`=9N+ yk%=k"oKF0Ow`l˖}*j_ dR$,gX Kȭ.n6(bBbؾ\u C< FNAUFIs̘d> 0Au7ڄf3i!j?{"_w_hVo*s?Ꝿ?uyuQ)\Sdp?5ُ_]. ܐP +.X+g>\3-n`$3yr>F)uYӋM0nTJ4Uhn'@EDE{PqN8[}2*:~pKqYrg^ѺՀ9(Tyܢh,-u5 +Jq%Y:fwCl䑑6R;b |ưPo6GiJ.)75RKQygN-؈| pP+0> 8V`x +{Q]~*7{GUz$] +s2akt Oxl" +-#v7xLGnR66~4|iICZMbɴl:Ǐ :$m]~x&O#7ƖPO!jVgʵ#'YmWj8"#L8̏6>5-ZA2jD;ph[SD5(r|ī쭂GVǨpAUf1:sٝp5XU6imͲ$TZL:mД 1<S.²49Sr\Hzh6.UZ_?E~e18s^8QHw>kdǺ~D-cT4^_DnH^7"?땍xϋbD +kb\"O XA[ +p$"5l\tЌ3ǬLN!]J˱g8xsӞ6RMLt7N.e#lHy@ENTگLۂ.)T>=iم$~|6V">|= Ӟt*HO" YFYgewA:"pRQ 8guDkdډYqeՊrڏҍH_:wu!* RA6 [ǬfNhWH-%*f`n+YA5_Ƴ 2,v3 +lً !SY `'H +D5sOcn &Z#18or{MG]1+[VSQLoCn>Z]Gŝ v~k%S?P۸3|N^ +祰9X~#vZC@Wjȥ"L&H$tk.F M))9[K ;!Q}Z|>}7C@Y: +D9gAn߽yY;|!o1%KJ'Oe.;rKA.|By/WFJ7Y\%)San׸2 +q\a^\鯝o&\L+Yn%@JP +FY_Q<c/{+243:\,OF $u,rl̂WS o`R@h\ds0Gx6Gː?:d`L-`lػç `޷IkD]ϽT@C&F Oƌ>rhZWȗf% +CD.y/xi| ;e.-LDw(_FU@ibTOI臭;`ql[ӏc^FݢD&|ȶ*'{z.e/U>Nŕ#rJUE&E4IWGhasǀXV- `ld-qzkWڊ%ihl+KT_wb\WaX)V,ÅeZ Lm[H+XwKͺ"C*٢RƠ ~}j>BL T+ YV^w6ȅl0y;T|>[D׻0*h{Ya@l(9yN orǦA,F~\0D"egx-hFpہ=O闑JϑZ%uP$ ^xvFsȢ#YUAqZDE3S2Vܠ 8UX"=;ʄfҡ(9jr"-]g#nGgЀΣt Ky{w sxjYUXzXepl_p,+pԏ-q}ˆ15ϸ$ݑsY-#]H $lF_`/w׿jGK xb 3#ߤ,-53W)gaB'-)10Ah .Ncf7U[LeR D^\E[b&=ZHs ^JWxR7J)r&o*l" Hf: P@ w<,DG=xF>=1`131.t f ×$UQU?PXv!ڷ YB] r̕ +@ݜ;Z&ih FK U_T[MG>tTfrȠq 1m'(-ͱ${.S/hB@ +Pf|Cl ]LpSRDSs͒/g[j`PŸbT/v$ M*')0mOW^B.*ȩ͆3@Ǚ7 +Tt{_Wp%Oǟ +r:b.!R^joA1 ÿ7ix"R@!mǮk}X9@׻;Ң!ee62$A.q4}ip0fL=v7qȔ!~#1E+D$BПnE͢Y3Ѐ3\ 6\ @} K %W( |Jng!*Sե]@f]b&KcٴXol1nӬ{*= kƯr",-~fC.HmR'[JGw:,gPkq$d1_N??v)Pl<7k%JcI~V ,[DL>ԗVq+})xz +ld:>(QNŔFKԅ/<בMv:d-9fщ^o $t8)u?lpvVi &[uuC*ZxMF񇽔 ڄ:WReX^1 s 9uԃT^pNh*oLqɠwxe݈Rq[VwQ4n)8z}gM)FJkŷe"(ؔ-xXä2;*:k +y4<9$(@3u8E.f!C-k5Js0*%*Q LD |C\ +3َ̂?t8>PP{*" E0/tPp5Wh!Ac{r0 6 E"[tg=Lj؎'נVc`؇-cBZ6gJX(ҞOA%.&X _KtE;[ +=:bA"t,0[r*QVt^#ǫ{OYwɑ*v1e^УqYA/ +endstream endobj 21 0 obj [20 0 R 19 0 R 18 0 R] endobj 33 0 obj <> endobj xref +0 34 +0000000004 65535 f +0000000016 00000 n +0000000180 00000 n +0000024192 00000 n +0000000000 00000 f +0000024243 00000 n +0000000000 00000 f +0000027611 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000027684 00000 n +0000027825 00000 n +0000029478 00000 n +0000000000 00000 f +0000026941 00000 n +0000027012 00000 n +0000027083 00000 n +0000058432 00000 n +0000024644 00000 n +0000027498 00000 n +0000026112 00000 n +0000026379 00000 n +0000026427 00000 n +0000027382 00000 n +0000027413 00000 n +0000027266 00000 n +0000027297 00000 n +0000027150 00000 n +0000027181 00000 n +0000058471 00000 n +trailer +<<6C56B665F3378746A5069184A90378F8>]>> +startxref +58653 +%%EOF diff --git a/icon/icon.ico b/icon/icon.ico new file mode 100644 index 0000000..c4a3e6e Binary files /dev/null and b/icon/icon.ico differ diff --git a/icon/icon.png b/icon/icon.png new file mode 100644 index 0000000..7990a4c Binary files /dev/null and b/icon/icon.png differ diff --git a/icon/tray-icon.rc b/icon/tray-icon.rc new file mode 100644 index 0000000..794ecb8 --- /dev/null +++ b/icon/tray-icon.rc @@ -0,0 +1,2 @@ +id ICON "icon.ico" +drp-icon ICON "icon.ico" \ No newline at end of file diff --git a/processes.txt b/processes.txt new file mode 100644 index 0000000..9839c1c Binary files /dev/null and b/processes.txt differ diff --git a/program icons/Adobe_Illustrator_CC_icon.svg.png b/program icons/Adobe_Illustrator_CC_icon.svg.png new file mode 100644 index 0000000..c016f47 Binary files /dev/null and b/program icons/Adobe_Illustrator_CC_icon.svg.png differ diff --git a/program icons/Adobe_InDesign_CC_icon.svg.png b/program icons/Adobe_InDesign_CC_icon.svg.png new file mode 100644 index 0000000..9426be4 Binary files /dev/null and b/program icons/Adobe_InDesign_CC_icon.svg.png differ diff --git a/program icons/Adobe_Photoshop_CC_icon.svg.png b/program icons/Adobe_Photoshop_CC_icon.svg.png new file mode 100644 index 0000000..363b2ce Binary files /dev/null and b/program icons/Adobe_Photoshop_CC_icon.svg.png differ diff --git a/program icons/DaVinci_Resolve_17_logo.svg.png b/program icons/DaVinci_Resolve_17_logo.svg.png new file mode 100644 index 0000000..ccc1818 Binary files /dev/null and b/program icons/DaVinci_Resolve_17_logo.svg.png differ diff --git a/program icons/Isotropix-Clarisse.png b/program icons/Isotropix-Clarisse.png new file mode 100644 index 0000000..9fc0968 Binary files /dev/null and b/program icons/Isotropix-Clarisse.png differ diff --git a/program icons/ableton.png b/program icons/ableton.png new file mode 100644 index 0000000..a1c2886 Binary files /dev/null and b/program icons/ableton.png differ diff --git a/program icons/ae.png b/program icons/ae.png new file mode 100644 index 0000000..6f80a2b Binary files /dev/null and b/program icons/ae.png differ diff --git a/program icons/autodesk-maya-logo.png b/program icons/autodesk-maya-logo.png new file mode 100644 index 0000000..2ac7a77 Binary files /dev/null and b/program icons/autodesk-maya-logo.png differ diff --git a/program icons/cavalry.png b/program icons/cavalry.png new file mode 100644 index 0000000..954db22 Binary files /dev/null and b/program icons/cavalry.png differ diff --git a/program icons/download (1).png b/program icons/download (1).png new file mode 100644 index 0000000..d345a60 Binary files /dev/null and b/program icons/download (1).png differ diff --git a/program icons/fl logo.png b/program icons/fl logo.png new file mode 100644 index 0000000..8830e3b Binary files /dev/null and b/program icons/fl logo.png differ diff --git a/program icons/kisspng-autodesk-3ds-max-logo-computer-software-autodesk-m-unity-5ab9cc868bb624.1322875015221259585723.png b/program icons/kisspng-autodesk-3ds-max-logo-computer-software-autodesk-m-unity-5ab9cc868bb624.1322875015221259585723.png new file mode 100644 index 0000000..6de7ae3 Binary files /dev/null and b/program icons/kisspng-autodesk-3ds-max-logo-computer-software-autodesk-m-unity-5ab9cc868bb624.1322875015221259585723.png differ diff --git a/program icons/pngwing.com (1).png b/program icons/pngwing.com (1).png new file mode 100644 index 0000000..0d0d36c Binary files /dev/null and b/program icons/pngwing.com (1).png differ diff --git a/program icons/pr.png b/program icons/pr.png new file mode 100644 index 0000000..6b7fd0f Binary files /dev/null and b/program icons/pr.png differ diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..9a1dec0 --- /dev/null +++ b/src/app.rs @@ -0,0 +1,269 @@ +#[derive(Debug)] +pub struct App { + pub kind: AppKind, + pub default_project_name: String, + pub drp_client_id: String, + pub process_search_string: String, + pub config_search_string: String, +} +#[derive(Debug, PartialEq, Eq)] +pub enum AppKind { + C4d, + Maya, + ThreeDsMax, + AfterEffects, + PremierePro, + Illustrator, + Photoshop, + Indesign, + DavinciResolve, + Clarisse, + Marvelous, + Calvary, + Ableton, + FL, +} + +pub struct Apps { + C4d: App, + Maya: App, + ThreeDsMax: App, + AfterEffects: App, + PremierePro: App, + Illustrator: App, + Photoshop: App, + Indesign: App, + DavinciResolve: App, + Clarisse: App, + Marvelous: App, + Calvary: App, + Ableton: App, + FL: App, +} +impl Apps { + pub fn as_iter(&self) -> [&App; 14] { + let APPS: [&App; 14] = [ + &self.C4d, + &self.Maya, + &self.ThreeDsMax, + &self.AfterEffects, + &self.PremierePro, + &self.Illustrator, + &self.Photoshop, + &self.Indesign, + &self.DavinciResolve, + &self.Clarisse, + &self.Marvelous, + &self.Calvary, + &self.Ableton, + &self.FL, + ]; + APPS + } +} +impl AppKind { + pub fn as_iter() -> [AppKind; 14] { + let APPKINDS: [AppKind; 14] = [ + AppKind::C4d, + AppKind::Maya, + AppKind::ThreeDsMax, + AppKind::AfterEffects, + AppKind::PremierePro, + AppKind::Illustrator, + AppKind::Photoshop, + AppKind::Indesign, + AppKind::DavinciResolve, + AppKind::Clarisse, + AppKind::Marvelous, + AppKind::Calvary, + AppKind::Ableton, + AppKind::FL, + ]; + APPKINDS + } +} +impl Apps { + pub fn construct_apps() -> Apps { + Apps { + C4d: App { + default_project_name: "Cinema 4D Project".to_string(), + drp_client_id: "936296341250904065".to_string(), + process_search_string: "Cinema 4D R".to_string(), + config_search_string: "c4d".to_string(), + kind: AppKind::C4d, + }, + Maya: App { + default_project_name: "Autodesk Maya Project".to_string(), + drp_client_id: "1016369550276694106".to_string(), + process_search_string: "Autodesk Maya".to_string(), + config_search_string: "maya".to_string(), + kind: AppKind::Maya, + }, + ThreeDsMax: App { + default_project_name: "3ds Max Project".to_string(), + drp_client_id: "1016395801402036315".to_string(), + process_search_string: " Autodesk 3ds Max".to_string(), + config_search_string: "threedsmax".to_string(), + kind: AppKind::ThreeDsMax, + }, + AfterEffects: App { + default_project_name: "After Effects Project".to_string(), + drp_client_id: "1016395319522623539".to_string(), + process_search_string: "Adobe After Effects".to_string(), + config_search_string: "after_effects".to_string(), + kind: AppKind::AfterEffects, + }, + PremierePro: App { + default_project_name: "Premiere Pro Project".to_string(), + drp_client_id: "1016396017832300555".to_string(), + process_search_string: "Adobe Premiere Pro".to_string(), + config_search_string: "premiere_pro".to_string(), + kind: AppKind::PremierePro, + }, + Illustrator: App { + default_project_name: "Illustrator Project".to_string(), + drp_client_id: "1017491707819991071".to_string(), + process_search_string: "Adobe Illustrator".to_string(), + config_search_string: "illustrator".to_string(), + kind: AppKind::Illustrator, + }, + Photoshop: App { + default_project_name: "Photoshop Project".to_string(), + drp_client_id: "1017493347415371917".to_string(), + process_search_string: "Photoshop".to_string(), + config_search_string: "photoshop".to_string(), + kind: AppKind::Photoshop, + }, + Indesign: App { + default_project_name: "Indesign Project".to_string(), + drp_client_id: "1017493794456862781".to_string(), + process_search_string: "Indesign".to_string(), + config_search_string: "indesign".to_string(), + kind: AppKind::Indesign, + }, + DavinciResolve: App { + default_project_name: "Davinci Resolve Project".to_string(), + drp_client_id: "1016371757722128516".to_string(), + process_search_string: "Davinci Resolve".to_string(), + config_search_string: "davinci_resolve".to_string(), + kind: AppKind::DavinciResolve, + }, + Clarisse: App { + default_project_name: "Isotropix Clarisse Project".to_string(), + drp_client_id: "1016372248128532500".to_string(), + process_search_string: "Isotropix Clarisse".to_string(), + config_search_string: "clarisse".to_string(), + kind: AppKind::Clarisse, + }, + Marvelous: App { + default_project_name: "Marvelous Designer Project".to_string(), + drp_client_id: "1016372646046351423".to_string(), + process_search_string: "Marvelous Designer".to_string(), + config_search_string: "marvelous".to_string(), + kind: AppKind::Marvelous, + }, + Calvary: App { + default_project_name: "Cavalry Project".to_string(), + drp_client_id: "1016374130037243974".to_string(), + process_search_string: "calvary.exe".to_string(), + config_search_string: "calvary".to_string(), + kind: AppKind::Calvary, + }, + Ableton: App { + default_project_name: "Ableton Project".to_string(), + drp_client_id: "1016375030227161150".to_string(), + process_search_string: "Ableton Live".to_string(), + config_search_string: "ableton".to_string(), + kind: AppKind::Ableton, + }, + FL: App { + default_project_name: "FL Studio Project".to_string(), + drp_client_id: "1016393561140375712".to_string(), + process_search_string: "FL Studio".to_string(), + config_search_string: "fl".to_string(), + kind: AppKind::FL, + }, + } + } +} + +impl Apps { + pub fn find_app(&self, str: &String) -> Option<&App> { + for app in self.as_iter() { + if str.contains(&app.process_search_string) { + return Some(&app); + } + } + None + } + pub fn find_config_app(&self, str: &str) -> Option<&App> { + for app in self.as_iter() { + if str == app.config_search_string { + return Some(app); + } + } + return None; + } +} + +impl App { + pub fn parse(&self, window_title: &String) -> String { + match self.kind { + AppKind::C4d => { + let mut end_i: usize = window_title.len(); + let mut start_i: usize = 0; + for (i, char) in window_title.chars().enumerate() { + if char == '[' { + start_i = i; + match window_title.find(".c4d]") { + Some(i) => end_i = i as usize, + None => match window_title.find(" - Main") { + Some(i) => end_i = i as usize - 1, + None => end_i = window_title.len() - 1, + }, + }; + } + } + return window_title[start_i + 1..end_i].to_string(); + } + AppKind::Maya => { + let match_index = match window_title.as_str().find(".mb* - Autodesk Maya") { + Some(i) => i, + None => match window_title.as_str().find(".mb - Autodesk Maya") { + Some(i) => i + 4, + None => { + return String::from("Autodesk Maya Project"); + } + }, + }; + return window_title[..match_index as usize].to_string(); + } + AppKind::AfterEffects => { + let mut proj_name = String::new(); + for i in (0..window_title.len() - 2).rev() { + if window_title.chars().nth(i).unwrap() == '\\' { + for char in window_title.chars().skip(i + 1) { + proj_name.push(char); + } + return proj_name; + } + } + if proj_name == "" { + proj_name = window_title.clone(); + } + proj_name + } + AppKind::ThreeDsMax => self.default_project_name.clone(), + AppKind::PremierePro => self.default_project_name.clone(), + AppKind::Illustrator => self.default_project_name.clone(), + AppKind::Photoshop => self.default_project_name.clone(), + AppKind::Indesign => self.default_project_name.clone(), + AppKind::DavinciResolve => self.default_project_name.clone(), + AppKind::Clarisse => self.default_project_name.clone(), + AppKind::Marvelous => self.default_project_name.clone(), + AppKind::Calvary => self.default_project_name.clone(), + AppKind::Ableton => self.default_project_name.clone(), + AppKind::FL => self.default_project_name.clone(), + } + } +} diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..f1d9d83 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,117 @@ +use std::fs; + +#[derive(Debug)] +pub struct Config { + pub exclude_keywords_list: Vec, + pub should_exclude_be_invisible: bool, + pub portfolio_link: String, +} + +impl Config { + pub fn load() -> Config { + let default_config = use_default_config(); + + //if no config file, parse default config file and try save it, then use it + let config_file: Config = match fs::read_to_string(".drp_config") { + Result::Err(_err) => { + let def_config = parse_config_file(&default_config); + make_config_file(&def_config); + def_config + } + Result::Ok(val) => parse_config_file(&val), + }; + config_file + } +} +impl Config { + pub fn exclude_project(&mut self, project_name: &String) { + if self.exclude_keywords_list.contains(&project_name) { + return; + } + self.exclude_keywords_list.push(project_name.clone()); + make_config_file(&self); + } +} +fn parse_config_file(config_file: &String) -> Config { + let mut exclude_keywords_list: Vec = Vec::new(); + let mut should_exclude_be_invisible = false; + let mut portfolio_link = String::new(); + + for (i, line) in config_file.lines().enumerate() { + if line.contains("SHOULD_EXCLUDE_BE_ANONYMOUS:") { + match config_file + .lines() + .nth(i + 1) + .expect("index out of bounds") + .to_lowercase() + .as_str() + { + "n" => should_exclude_be_invisible = false, + "no" => should_exclude_be_invisible = false, + "y" => should_exclude_be_invisible = true, + "yes" => should_exclude_be_invisible = true, + _ => should_exclude_be_invisible = false, + } + } + if line.contains("EXCLUDE_CHARACTERS_LIST:") { + for arg_line in config_file.lines().skip(i + 1) { + if arg_line.trim().contains("}") { + break; + } + exclude_keywords_list.push(arg_line.to_string()) + } + } + if line.contains("PORTFOLIO_LINK:") { + for arg_line in config_file.lines().skip(i) { + if arg_line.trim().contains("}") { + break; + } + portfolio_link = arg_line.to_string(); + } + } + } + Config { + exclude_keywords_list, + should_exclude_be_invisible, + portfolio_link, + } +} + +fn make_config_file(config: &Config) { + let mut config_file = String::from("SHOULD_EXCLUDE_BE_ANONYMOUS:{"); + config_file = config_file + + match config.should_exclude_be_invisible { + true => "\ny\n}\n", + false => "\nn\n}\n", + }; + + config_file = config_file + "\nPORTFOLIO_LINK:{\ndjkato.net\n}\n"; + + config_file = config_file + "\nEXCLUDE_CHARACTERS_LIST:{"; + for exclusive_word in &config.exclude_keywords_list { + config_file = config_file + format!("\n{}", exclusive_word).as_str(); + } + config_file = config_file + "\n}\n"; + + match fs::write(".drp_config", config_file) { + _ => (), + } +} + +fn use_default_config() -> String { + let str = String::from( + "SHOULD_EXCLUDE_BE_ANONYMOUS:{ +n +} + +PORTFOLIO_LINK:{ +djkato.net +} + +EXCLUDE_CHARACTERS_LIST:{ +no_drp +} +", + ); + str +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..d541493 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,124 @@ +#![windows_subsystem = "windows"] +pub mod app; +pub mod config; +pub mod program_status; +pub mod tray_icon; +use crate::config::Config; +use crate::program_status::*; +use app::{App, Apps}; +use discord_rich_presence::{activity, DiscordIpc, DiscordIpcClient}; +use std::time::{SystemTime, UNIX_EPOCH}; +use std::{thread, time}; +fn main() { + let apps = Apps::construct_apps(); + let mut config = Config::load(); + + let timeout = time::Duration::from_millis(5000); + + let (tray_receiver, _tray) = tray_icon::create_tray(); + + let mut prev_project_name = String::new(); + let mut project_name = String::new(); + let mut start_time = 0; + let mut drp_is_running = false; + let mut discord_client: Option = None; + let mut current_app_option: Option<&App> = None; + 'main: loop { + if let Some(current_app) = current_app_option { + if let Some(real_project_name) = is_program_still_running(¤t_app) { + //if project name includes filtered words, use default project name + for excluded_word in &config.exclude_keywords_list { + if real_project_name.contains(excluded_word.as_str()) { + project_name = current_app.default_project_name.clone(); + } else { + project_name = real_project_name.clone(); + } + } + //If discord client isn't connected create and conenct it + if !drp_is_running { + //make a new client with current_app ID + discord_client = + match DiscordIpcClient::new(¤t_app.drp_client_id.as_str()) { + Ok(ok) => Some(ok), + Err(_err) => None, + }; + if let Some(dc_client) = discord_client.as_mut() { + match dc_client.connect() { + Ok(_ok) => drp_is_running = true, + Err(_err) => drp_is_running = false, + } + } else { + panic!(); + } + //only if new app is made refresh the start time + start_time = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("time went backwards") + .as_secs(); + } + //if project name changed, update it + if prev_project_name != project_name { + prev_project_name = project_name.clone(); + let details = format!("Working on {}", &project_name.clone()); + //update activity + let state = format!("Portfolio: {}", &config.portfolio_link); + let activity = activity::Activity::new() + .state(state.as_str()) + .details(&details.as_str()) + .assets( + activity::Assets::new().large_image(current_app.drp_client_id.as_str()), + ) + .timestamps(activity::Timestamps::new().start(start_time as i64)); + //if discord client exists, update status + if let Some(dc) = discord_client.as_mut() { + match dc.set_activity(activity) { + _ => (), + } + } + } + } + //if program no longer running + else { + current_app_option = None; + prev_project_name = "".to_string(); + } + //respond to tray icon messages + match tray_receiver.try_recv() { + Ok(msg) => match msg { + tray_icon::Message::AnonymiseProject => { + //only exclude project name if it's not the default one + for app in apps.as_iter() { + if app.kind == current_app.kind { + if app.default_project_name != project_name { + config.exclude_project(&project_name); + } + } + } + } + tray_icon::Message::Quit => break 'main, + }, + Err(_err) => (), + } + } else { + //If nothing is running try to find it + if let Some(proj_name) = get_running_program(&apps) { + let temp_curr_app: &App; + (temp_curr_app, project_name) = proj_name; + current_app_option = Some(temp_curr_app); + } else { + current_app_option = None; + } + if drp_is_running { + match discord_client + .as_mut() + .expect("Somehow it dissapeared?") + .close() + { + Ok(_ok) => drp_is_running = false, + Err(_err) => (), + } + } + } + thread::sleep(timeout); + } +} diff --git a/src/program_status.rs b/src/program_status.rs new file mode 100644 index 0000000..f7134fe --- /dev/null +++ b/src/program_status.rs @@ -0,0 +1,70 @@ +use crate::app::{App, Apps}; +use windows::Win32::{ + Foundation::{BOOL, HWND, LPARAM}, + UI::WindowsAndMessaging::{self, GetWindowTextA, GetWindowTextLengthA, WNDENUMPROC}, +}; +pub fn get_running_program(apps: &Apps) -> Option<(&App, String)> { + let running_window_names = unsafe { get_running_windows_titles() }; + + for window_name in running_window_names { + if let Some(app) = apps.find_app(&window_name) { + return Some((&app, app.parse(&window_name))); + } + } + return None; +} +pub fn is_program_still_running(app: &App) -> Option { + let running_window_names = unsafe { get_running_windows_titles() }; + + for window_name in running_window_names { + //dbg!(&window_name); + if window_name.contains(&app.process_search_string) { + return Some(app.parse(&window_name)); + } + } + return None; +} + +unsafe fn get_running_windows_titles() -> Vec { + let mut running_windows_names: Vec = Vec::new(); + unsafe extern "system" fn processhwd(hwnd: HWND, lparam: LPARAM) -> BOOL { + // Get the length of the window text + let window_text_len = GetWindowTextLengthA(hwnd); + if window_text_len < 0 { + panic!("Uh oh, it went wrong."); + } + + // Make a buffer for the window text (+ 1 for terminating NUL byte) + let mut window_text_buffer = vec![0_u8; window_text_len as usize + 1]; + + // Get the window text. For understanding how to deal with the value in + // `result`, see the MSDN documentation. + GetWindowTextA(hwnd, &mut window_text_buffer); + + //turn ascii into characters + let mut window_text: Vec = Vec::new(); + for char in window_text_buffer { + window_text.push(char as char); + } + //turn characters into strings + let window_text = String::from_iter(window_text.iter()); + + //turn vector into pointer and push window_texts to it + let running_windows_names_pointer = lparam.0 as *mut Vec; + + running_windows_names_pointer + .as_mut() + .expect("welp the pointer failed...") + .push(window_text); + + BOOL(1) + } + let lpenumfunc: WNDENUMPROC = + Some(processhwd as unsafe extern "system" fn(hwnd: HWND, lparam: LPARAM) -> BOOL); + + let windows_names_ptr: *mut Vec = &mut running_windows_names; + + WindowsAndMessaging::EnumWindows(lpenumfunc, LPARAM(windows_names_ptr as isize)); + + running_windows_names +} diff --git a/src/tray_icon.rs b/src/tray_icon.rs new file mode 100644 index 0000000..2a8ba81 --- /dev/null +++ b/src/tray_icon.rs @@ -0,0 +1,26 @@ +use std::sync::mpsc::Receiver; + +use {std::sync::mpsc, tray_item::TrayItem}; + +pub enum Message { + Quit, + AnonymiseProject, +} + +pub fn create_tray() -> (Receiver, TrayItem) { + let mut tray = TrayItem::new("DRP Creative", "drp-icon").unwrap(); + let (tx, rx) = mpsc::channel(); + let tx1 = tx.clone(); + tray.add_label("DRP Creative Options").unwrap(); + + tray.add_menu_item("Don't show current project", move || { + tx.send(Message::AnonymiseProject).unwrap(); + }) + .unwrap(); + + tray.add_menu_item("Quit", move || { + tx1.send(Message::Quit).unwrap(); + }) + .unwrap(); + return (rx, tray); +}